嵌入式Linux-驅動程序編寫框架

轉載:https://www.cnblogs.com/han-bing/p/8807602.html

編寫一個最簡單的嵌入式Linux下的驅動程序大致分為以下幾步:

1.編寫驅動函數(shù)drive_xxx_open旷祸,drive_xxx_write搏予,drive_xxx_read等,這個需要根據(jù)實際情況盡心裁剪和添加。

一般情況下压昼,進行設備驅動程序的設計只是比較注重下面的幾個函數(shù):

.llseek =? ***_llseek,  //文件定位

.read =? ***_read,   ? //文件讀取

.write =? ***_write,   //文件寫入

.ioctl =? ***_ioctl,   ? ? //文件控制

.open =? ***_open, ? ? ? ?//文件打開

.release = ***_release, //文件釋放

本次驅動只做框架坑雅,用來打印一些信息即可缸沃,所以只填充open宜咒,write,read三個函數(shù)赘娄。

2.函數(shù)定義完成以后仆潮,對其進行封裝,也就是填入相應的file_operations結構體遣臼。

static struct file_operations first_drv_fops = {

? ? .owner? =? THIS_MODULE,? ? //這個成語并不是操作函數(shù)性置,它是一個指向擁有這個結構的模塊的指針,作用是當被使用時阻止模塊被卸載揍堰,可以簡單的定位為THIS_MODULE鹏浅。

.open = first_drv_open,     //模塊打開

.write = first_drv_write,    //模塊寫

.read? = first_drv_read,? ? ? //模塊度? };

3.驅動模塊加載函數(shù),通過函數(shù) register_chrdev(major, name, &fops) 來

注冊字符設備,定義一個first_drv_init入口 函數(shù)來調用這個它屏歹。

※register_chrdev函數(shù)會把設備添加到Linux系統(tǒng)module結構體的鏈表中隐砸。

1:參數(shù)分析

?* @major: major device number or 0 for dynamic allocation

?主設備號,當用戶設置為0時蝙眶,內核會動態(tài)分配一個設備號季希。

?* @name: name of this range of devices

設備名稱

?* @fops: file operations associated with this devices

文件系統(tǒng)的接口指針

4.通過module_init()來把入口函數(shù)裝入初始化啟動列表中,使內核知道有這個函數(shù)存在。

5.寫驅動的first_drv_exit出口函數(shù)械馆,調用這個unregister_chrdev()函數(shù)卸載模塊,然后通過module_exit()來修飾出口函數(shù)胖眷。

驅動代碼如下:

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/fs.h>

#include <linux/init.h>

#include <linux/delay.h>

#include <asm/irq.h>

#include <asm/arch/regs-gpio.h>

#include <asm/hardware.h>

#include <asm/uaccess.h>

#include <asm/io.h>

/*1寫出驅動程序first_drv_open first_drv_write */

/*? inode結構表示具體的文件,file結構體用來追蹤文件在運行時的狀態(tài)信息霹崎。*/

static int first_drv_open(struct inode *inode, struct file? *file)

{

? ? printk(“first_drv_open\n”);? ? ? //打印珊搀,在內核中打印只能用printk()

? ? return 0;

}

/*參數(shù)filp為目標文件結構體指針,buffer為要寫入文件的信息緩沖區(qū)尾菇,count為要寫入信息的長度境析,ppos為當前的偏移位置,這個值通常是用來判斷寫文件是否越界*/

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

{

? ? printk(“first_drv_write\n”);? ? ? //打印派诬,在內核中打印只能用printk()

? ? return 0;

}

static ssize_t first_drv_read(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

{

? ? printk(“first_drv_read\n”);? ? ? //打印劳淆,在內核中打印只能用printk()

? ? return 0;

}

/*2定義file_operations結構體來封裝驅動函數(shù)first_drv_open first_drv_write */

static struct file_operations first_drv_fops = {

? ? .owner? =? THIS_MODULE,? ? //被使用時阻止模塊被卸載

? ? .open? ? =? first_drv_open,? ? ?

? ? .write? =? first_drv_write,?

? ? .read? ? =? first_drv_read,?

? };

/*4寫first_drv_init入口函數(shù)來調用這個register_chrdev()注冊函數(shù)*/

int first_drv_init(void)

{

? ? /*3 register_chrdev注冊字符設備,并設置major=111*/

? ? /*如果設置major為0,表示由內核動態(tài)分配主設備號默赂,函數(shù)的返回值是主設備號*/

? ? register_chrdev (111, “first_drv”, &first_drv_fops); //111:主設備號,”first_drv”:設備名

  /*

    register_chrdev作用:在VFS虛擬文件系統(tǒng)中找到字符設備沛鸵,然后通過主設備號找到內核數(shù)組里對應的位置,最后將設備名字和fops結構體填進去

  */

? return 0;

}

/*5 module_init修飾入口函數(shù)*/

module_init(first_drv_init);

/*6 寫first_drv_exit出口函數(shù)*/

void first_drv_exit(void)

{

  unregister_chrdev (111, “first_drv”);? //卸載驅動,只需要主設備號和設備名就行

}

/*7 module_exit修飾出口函數(shù)*/

module_exit(first_drv_exit);

/*8許可證聲明, 描述內核模塊的許可權限,如果不聲明LICENSE,模塊被加載時曲掰,將收到內核被污染 (kernel tainted)的警告疾捍。*/

MODULE_LICENSE( "GPL v2" );

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栏妖,隨后出現(xiàn)的幾起案子乱豆,更是在濱河造成了極大的恐慌,老刑警劉巖吊趾,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宛裕,死亡現(xiàn)場離奇詭異,居然都是意外死亡论泛,警方通過查閱死者的電腦和手機揩尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孵奶,“玉大人疲酌,你說我怎么就攤上這事蜡峰×嗽” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵湿颅,是天一觀的道長载绿。 經常有香客問我,道長油航,這世上最難降的妖魔是什么崭庸? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谊囚,結果婚禮上怕享,老公的妹妹穿的比我還像新娘。我一直安慰自己镰踏,他們只是感情好函筋,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奠伪,像睡著了一般跌帐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绊率,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天谨敛,我揣著相機與錄音,去河邊找鬼滤否。 笑死脸狸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的藐俺。 我是一名探鬼主播炊甲,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盯仪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜜葱?” 一聲冷哼從身側響起全景,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牵囤,沒想到半個月后爸黄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡揭鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年炕贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野崇。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡称开,死狀恐怖,靈堂內的尸體忽然破棺而出乓梨,到底是詐尸還是另有隱情鳖轰,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布扶镀,位于F島的核電站蕴侣,受9級特大地震影響,放射性物質發(fā)生泄漏臭觉。R本人自食惡果不足惜昆雀,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝠筑。 院中可真熱鬧狞膘,春花似錦、人聲如沸什乙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳强。三九已至场仲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間退疫,已是汗流浹背渠缕。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒繁,地道東北人亦鳞。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燕差。 傳聞我的和親對象是個殘疾皇子遭笋,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容