當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]一 leds的驅(qū)動(dòng)程序位置:linux 2.6.29/drivers/char/mini2440_leds.c#include #include #include #include //具體頭文件位置/opt/FriendlyARM/mini2440/linux-2.6.29/arch/arm/mach-s3c2410/include/mach/*.h#includ

一 leds的驅(qū)動(dòng)程序

位置:linux 2.6.29/drivers/char/mini2440_leds.c

#include
#include

#include
#include //具體頭文件位置/opt/FriendlyARM/mini2440/linux-2.6.29/arch/arm/mach-s3c2410/include/mach/*.h

#include
#include
#include //具體的頭文件位置為/opt/FriendlyARM/mini2440/linux-2.6.29/include/linux/*.h

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#define DEVICE_NAME "leds" //定義驅(qū)動(dòng)程序的名字為leds

static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
}; //定義引腳的寄存器數(shù)組(無(wú)符號(hào)長(zhǎng)整形,對(duì)應(yīng)于引腳的地址)

static unsigned int led_cfg_table [] = {
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
}; //定義引腳功能,為輸出(無(wú)符號(hào)整形)

static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) { //設(shè)備節(jié)點(diǎn),文件描述符,LED燈編號(hào),LED燈狀態(tài)四個(gè)命令參數(shù)
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL; //EINVAL:表示向函數(shù)傳遞了無(wú)效的參數(shù)(errno符號(hào)變量)
}
}

//初始化字符設(shè)備驅(qū)動(dòng)的file_operations 的結(jié)構(gòu)體

static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = sbc2440_leds_ioctl,
};

static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR, /* 動(dòng)態(tài)設(shè)備號(hào) */
.name = DEVICE_NAME, /* 將在/dev目錄生成led設(shè)備 */
.fops = &dev_fops, /* 驅(qū)動(dòng)接口 */

};

static int __init dev_init(void)
{
int ret;

int i;

for (i = 0; i < 4; i++) {

/*設(shè)置GPIO對(duì)應(yīng)的配置寄存器GPIOCON為輸出狀態(tài)*/

s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

/*設(shè)置GPIO對(duì)應(yīng)的數(shù)據(jù)寄存器GPIODAT為低電平,在模塊加載結(jié)束后,四個(gè)LED應(yīng)該是全部都是發(fā)光狀態(tài)*/

s3c2410_gpio_setpin(led_table[i], 0);
}

//注冊(cè)設(shè)備

ret = misc_register(&misc);

printk (DEVICE_NAME"tinitializedn");

return ret;
}

//注銷(xiāo)設(shè)備驅(qū)動(dòng)

static void __exit dev_exit(void)
{
misc_deregister(&misc);
}

module_init(dev_init); /*聲明加載模塊初始化函數(shù)*/
module_exit(dev_exit); /*聲明卸載模塊清除函數(shù)*/
MOUDLE_LICENSE("GPL"); /*許可證聲明*/
MODULE_AUTHOR("FriendlyARM Inc."); /*作者信息*/


1 static 關(guān)鍵字的重要性

全局變量和函數(shù)全部用static 進(jìn)行修飾,則其作用的范圍僅僅限于當(dāng)前的文件,而不是整個(gè)系統(tǒng)。防止編譯器在連接時(shí),會(huì)報(bào)告命名錯(cuò)誤的“名字空間污染”的問(wèn)題。

2 ioctl()函數(shù)

static int sbc2440_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

ioctl函數(shù)是文件結(jié)構(gòu)中的一個(gè)屬性分量。ioctl是設(shè)備驅(qū)動(dòng)程序中對(duì)設(shè)備的I/O通道進(jìn)行管理的函數(shù)。所謂對(duì)I/O通道進(jìn)行管理,就是對(duì)設(shè)備的一些特性進(jìn)行控制,例如串口的傳輸波特率、馬達(dá)的轉(zhuǎn)速等等。
struct inode *inode,是設(shè)備節(jié)點(diǎn)號(hào)。fd就是用戶(hù)程序打開(kāi)設(shè)備時(shí)使用open函數(shù)返回的文件標(biāo)示符,cmd就是用戶(hù)程序?qū)υO(shè)備的控制命令,unsigned long arg是控制命令的個(gè)數(shù)。
驅(qū)動(dòng)程序提供了對(duì)ioctl的支持,用戶(hù)就可以在用戶(hù)程序中使用ioctl函數(shù)控制設(shè)備的I/O通道。如果函數(shù)返回一個(gè)非負(fù)值,那么該值會(huì)被返回給調(diào)用程序,表示成功。韓式一般通過(guò)switch{case}對(duì)設(shè)備的一些特性進(jìn)行控制。switch{case}結(jié)構(gòu),每一個(gè)case對(duì)應(yīng)一個(gè)命令碼,做出一些相應(yīng)的操作。在本例中的cmd有兩個(gè)可選項(xiàng)0和1.0表示燈滅,1表示燈亮。所以case 0,1都要進(jìn)行操作。由于實(shí)際的硬件連接中,是低電平燈亮。所以在對(duì)引腳賦值時(shí)要取反。 s3c2410_gpio_setpin(led_table[arg], !cmd)

3 static int __init dev_init(void)
_init 宏,定義在include/linux/init.h中。對(duì)于非模塊加載的驅(qū)動(dòng)程序,通過(guò)_init 宏,會(huì)把函數(shù)中的代碼放到.text.init段。這個(gè)段在系統(tǒng)啟動(dòng)后會(huì)被釋放。這樣函數(shù)代碼只有在啟動(dòng)時(shí)執(zhí)行一次,所以可以釋放它們以節(jié)省內(nèi)存空間,

3初始化字符設(shè)備驅(qū)動(dòng)的file_operations 的結(jié)構(gòu)體

結(jié)構(gòu)體file_operations在頭文件 linux/fs.h中定義,用來(lái)存儲(chǔ)驅(qū)動(dòng)內(nèi)核模塊提供的對(duì) 設(shè)備進(jìn)行各種操作的函數(shù)的指針。該結(jié)構(gòu)體的每個(gè)域都對(duì)應(yīng)著驅(qū)動(dòng)內(nèi)核模塊用來(lái)處理某個(gè)被請(qǐng)求的 事務(wù)的函數(shù)的地址。

4ret = misc_register(&misc);

misc_register()用主編號(hào)10調(diào)用 register_chrdev(),設(shè)備名稱(chēng)和函數(shù)表指針通過(guò)miscdevice數(shù)據(jù)結(jié)構(gòu)獲得。同樣,miscdevice 數(shù)據(jù)結(jié)構(gòu)還保存設(shè)備驅(qū)動(dòng)程序所使用的次要號(hào)碼。完成設(shè)備的注冊(cè)。

5 printk()

利用 printk可以實(shí)現(xiàn)內(nèi)核到Linux 控制臺(tái)的格式化輸出。其用法與標(biāo)準(zhǔn)C的printf類(lèi)似。在調(diào)用驅(qū)動(dòng)程序時(shí),依靠printk輸出信息跟蹤程序,是很有效的方法。與標(biāo)準(zhǔn)C的printf 不同的是,printk支持分級(jí)輸出。默認(rèn)為第四級(jí)的輸出KERN_ERR。

二 LED測(cè)試程序

/opt/FriendlyARM/mini2440/examples/leds

#include /*下面函數(shù)要用到的頭文件*/
#include
#include
#include

int main(int argc, char **argv) /*運(yùn)行時(shí)參數(shù)傳遞,開(kāi)或關(guān)哪個(gè)LED*/
{
int on; /*定義led狀態(tài)變量,1表示燈亮,2表示燈滅*/
int led_no; /*定義led變量--哪個(gè)led*/
int fd; /*定義led設(shè)備文件描述符的變量*/
if ( argc != 3 || /*判斷命令輸入?yún)?shù)個(gè)數(shù)*/
sscanf(argv[1], "%d", &led_no) != 1 || /* 第一個(gè)字符串參數(shù)表示要操作led*/

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉