當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > Linux內(nèi)核驅(qū)動的platform機制
1.模塊(一種特殊的內(nèi)核代碼寫法,一般編譯成ko文件,用于承載用戶想要動態(tài)添加進內(nèi)核的代碼(不限于驅(qū)動))
a.寫法
module_init(模塊構(gòu)造函數(shù) );
module_init(模塊析構(gòu)函數(shù) );
b.編譯
標(biāo)準(zhǔn)的Makefile
c.模塊相關(guān)工具
insmod/rmmod/lsmod/modinfo/modprobe/depmod
為了自動安裝有依賴關(guān)系的模塊,兩個前提: 1.模塊必須都拷貝到/lib/modules/3.14.0; 2.執(zhí)行depmod
2.字符設(shè)備驅(qū)動框架
1.認(rèn)知
a. 無系統(tǒng)編程(裸機編程.bin,hex)--有系統(tǒng)編程(安全,并發(fā),豐富的驅(qū)動。。。elf,exe)
b. OS管理了所有驅(qū)動,而且各個操作系統(tǒng)管理結(jié)構(gòu)(數(shù)據(jù)結(jié)構(gòu))不一定一樣
c. 了解數(shù)據(jù)結(jié)構(gòu)的意義
d. 回掉
e. 計算機喜歡數(shù)字而不是字符串
2.名詞
設(shè)備文件: 一個特殊的文件用于抽象設(shè)備操作入口,用與隱藏設(shè)備號細(xì)節(jié)(域名-IP)
設(shè)備號:設(shè)備驅(qū)動的代號,主設(shè)備號 次設(shè)備號
驅(qū)動:讓硬件工作起來的軟件(裸機驅(qū)動 系統(tǒng)之下的驅(qū)動)
驅(qū)動框架:平臺(操作系統(tǒng))對驅(qū)動編寫的要求
3.涉及的函數(shù)
申請設(shè)備號:
強制申請int register_chrdev_region(dev_t first, unsigned int count, char *name)
動態(tài)申請int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)//name設(shè)備號說明信息(/proc/devices)
釋放設(shè)備號:
void unregister_chrdev_region(dev_t first, unsigned int count);
初始化cdev:
void cdev_init(struct cdev *, const struct file_operations *);
注冊cdev:
int cdev_add(struct cdev *, dev_t, unsigned);
移除cdev:
void cdev_del(struct cdev *);
1.長得像驅(qū)動
struct cdev myled{
.dev = 250
.fops{
.open = led_on;
.release = led_off;
}
};
2.放到內(nèi)核中去
寫到module.c
3.加入內(nèi)核管理驅(qū)動的數(shù)據(jù)結(jié)構(gòu)
cdev_add(&myled, 250, 1);
cdev_del(&myled);
1.內(nèi)核希望你寫驅(qū)動的時候采用總線、設(shè)備、驅(qū)動分離的方式來寫,而為了分離沒有具體(I2C,SPI,USB...)總線的設(shè)備發(fā)明了一個虛擬的platform_bus總線
a.platform_device: 注冊設(shè)備必要的資源(基地址,引腳,中斷號,波特率,ip,精度。。。)信息
b.platform_driver:實現(xiàn)設(shè)備操作做的算法(不包含具體數(shù)據(jù),必須先匹配再獲取);
1. Linux系統(tǒng)中以模塊方式組織設(shè)備驅(qū)動程序,請列舉在一個模塊程序中必不可少的組成部分。 (可以寫個Hello world模塊的程序)__init __exit
2. 請說明一下從零創(chuàng)建一個linux字符設(shè)備驅(qū)動的步驟?
4. 簡述Linux設(shè)備驅(qū)動中使用中斷的步驟。
5. 簡述信號量和自旋鎖的異同和使用時的注意事項。
6. 簡述命令 mknod /dev/zero c 1 5 的做用和命令各個部分的含義,并寫出創(chuàng)建一個塊設(shè)備節(jié)點的命令(把c改成b)。
7. 簡述命令insmod,rmmod,lsmod,depmod,modprobe 的功能。
8. 簡述platform設(shè)備基本原理, platform設(shè)備最大優(yōu)勢是什么?
9. 簡述設(shè)備驅(qū)動程序和普通應(yīng)用程序的異同點。
10. 簡述mmap機制的作用和使用mmap的好處。
1. #include
#include
#include
static int hello_init(void)
{
printk(KERN_ALERT "Hello world enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ ALERT " Hello world exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
2.
使用alloc_...方法動態(tài)注冊設(shè)備號;
為cdev申請內(nèi)存;
初始化設(shè)備并添加該設(shè)備;
完成file_operations中的相應(yīng)函數(shù)功能;
4. request_irq,申請irq;
free_irq,釋放irq。
5. 信號量和自旋鎖都是解決互斥問題的基本手段,信號量的實現(xiàn)依賴于自旋鎖。使用信號量機制時,進程若不能獲得信號量,進程不會如自旋鎖那樣原地打轉(zhuǎn),而是讓進程進入休眠等待狀態(tài)。當(dāng)使用信號量的開銷時間T1大于使用自旋鎖的開銷T2時,宜使用自旋鎖,若T2大于T1,則宜使用信號量。由于信號量所保護的臨界區(qū)可能包含引起阻塞的代碼,而自旋鎖則絕對要避免用來保護這樣的代碼。信號量存在于進程上下文,而如果被保護的資源需要在中斷或者軟中斷情況下使用,則只能選擇自旋鎖。
6. mknod,該命令用于創(chuàng)建設(shè)備節(jié)點。/dev/zero 表示設(shè)備節(jié)點創(chuàng)建的目錄和名字,c 代表創(chuàng)建的設(shè)備節(jié)點為字符設(shè)備節(jié)點,1 代表主設(shè)備號,5 代表此設(shè)備號。
創(chuàng)建塊設(shè)備節(jié)點的命令:mknod /dev/blockdev b 253 0
7.insmod:加載驅(qū)動模塊到內(nèi)核;
Rmmod:從內(nèi)核刪除驅(qū)動模塊;
Lsmod:查看當(dāng)前內(nèi)核包含哪些模塊
8.原理:
第一:定義一個platform_driver結(jié)構(gòu)體,對probe和remove函數(shù)指針進行初始化,對driver里面的成員.owner,.name進行初始化;
第二:在模塊的初始化函數(shù)中調(diào)用platform_drive_registe()初始化這個驅(qū)動,在卸載模塊中調(diào)用platfrom_driver_unregister()注銷這個驅(qū)動;
第三:將驅(qū)動中實用的設(shè)備資源信息通過傳遞進來的platform_device結(jié)構(gòu)體指針獲取。
第四:平臺設(shè)備添加,一種是:用platform_device手動編碼;另一種是在設(shè)備樹中添加一個節(jié)點。
匹配過程:一種是:如果是平臺設(shè)備與平臺驅(qū)動的匹配以名字匹配,平臺總線將會遍歷
對方,如果名字相同,則調(diào)用平臺驅(qū)動的probe函數(shù),并且將匹配上的平臺設(shè)備的結(jié)構(gòu)體指針傳給設(shè)備函數(shù);另一種是:去匹配設(shè)備樹中的設(shè)備節(jié)點里面的兼容屬性的值,配上則調(diào)用平臺驅(qū)動的probe函數(shù),并且將匹配上的平臺設(shè)備的結(jié)構(gòu)體指針傳給設(shè)備函數(shù)。
優(yōu)勢:
platform機制將本身的資源注冊進內(nèi)核,由內(nèi)核統(tǒng)一管理,在驅(qū)動程序中使用這些資源時通過platform_device提供的標(biāo)準(zhǔn)接口進行申請并使用。這樣提高了驅(qū)動和資源管理的獨立性,并且擁有較好的可移植性和安全性
9.異同點:
驅(qū)動運行于內(nèi)核,應(yīng)用程序再用戶空間;應(yīng)用程序能調(diào)用C庫;應(yīng)用程序順序執(zhí)行,驅(qū)動被動的接受調(diào)用;應(yīng)用程序的棧很大,驅(qū)動很小,通常4K;應(yīng)用程序可以做浮點運算,驅(qū)動中很少做浮點運算。
10. 原理:mmap將一個文件或者其它對象映射進內(nèi)存。文件被映射到多個頁上,如果文件的大小不是所有頁的大小之和,最后一個頁不被使用的空間將會清零。
作用:讓用戶程序直接訪問設(shè)備內(nèi)存,在要求高性能的應(yīng)用當(dāng)中比較常用。應(yīng)用程序使用的動態(tài)庫映射到這個區(qū)域;應(yīng)用程序調(diào)用mmap,將設(shè)備物理地址和這個區(qū)域的虛擬內(nèi)存進行映射;