Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之字符設(shè)備驅(qū)動(dòng)編程分析
2017-10-18 |
rar |
0.6 MB |
次下載 |
1積分
資料介紹
1.字符設(shè)備驅(qū)動(dòng)編寫流程
設(shè)備驅(qū)動(dòng)程序可以使用模塊的方式動(dòng)態(tài)加載到內(nèi)核中去。加載模塊的方式與以往的應(yīng)用程序開(kāi)發(fā)有很大的不同。以往在開(kāi)發(fā)應(yīng)用程序時(shí)都有一個(gè)main()函數(shù)作為程序的入口點(diǎn),而在驅(qū)動(dòng)開(kāi)發(fā)時(shí)卻沒(méi)有main()函數(shù),模塊在調(diào)用insmod命令時(shí)被加載,此時(shí)的入口點(diǎn)是init_module()函數(shù),通常在該函數(shù)中完成設(shè)備的注冊(cè)。同樣,模塊在調(diào)用rmmod命令時(shí)被卸載,此時(shí)的入口點(diǎn)是cleanup_module()函數(shù),在該函數(shù)中完成設(shè)備的卸載。在設(shè)備完成注冊(cè)加載之后,用戶的應(yīng)用程序就可以對(duì)該設(shè)備進(jìn)行一定的操作,如open()、read()、write()等,而驅(qū)動(dòng)程序就是用于實(shí)現(xiàn)這些操作,在用戶應(yīng)用程序調(diào)用相應(yīng)入口函數(shù)時(shí)執(zhí)行相關(guān)的操作,init_module()入口點(diǎn)函數(shù)則不需要完成其他如read()、write()之類功能。
上述函數(shù)之間的關(guān)系如圖11.3所示。
圖11.3 設(shè)備驅(qū)動(dòng)程序流程圖
2.重要數(shù)據(jù)結(jié)構(gòu)
用戶應(yīng)用程序調(diào)用設(shè)備的一些功能是在設(shè)備驅(qū)動(dòng)程序中定義的,也就是設(shè)備驅(qū)動(dòng)程序的入口點(diǎn),它是一個(gè)在《linux/fs.h》中定義的struct file_operations結(jié)構(gòu),這是一個(gè)內(nèi)核結(jié)構(gòu),不會(huì)出現(xiàn)在用戶空間的程序中,它定義了常見(jiàn)文件I/O函數(shù)的入口,如下所示:
struct file_operations
{
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *filp,
char *buff, size_t count, loff_t *offp);
ssize_t (*write) (struct file *filp,
const char *buff, size_t count, loff_t *offp);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *,
struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *);
int (*fasync) (int, struct file *, int);
int (*check_media_change) (kdev_t dev);
int (*revalidate) (kdev_t dev);
int (*lock) (struct file *, int, struct file_lock *);
};
這里定義的很多函數(shù)是否跟第6章中的文件I/O系統(tǒng)調(diào)用類似?其實(shí)當(dāng)時(shí)的系統(tǒng)調(diào)用函數(shù)通過(guò)內(nèi)核,最終調(diào)用對(duì)應(yīng)的struct file_operations結(jié)構(gòu)的接口函數(shù)(例如,open()文件操作是通過(guò)調(diào)用對(duì)應(yīng)文件的file_operations結(jié)構(gòu)的open函數(shù)接口而被實(shí)現(xiàn))。當(dāng)然,每個(gè)設(shè)備的驅(qū)動(dòng)程序不一定要實(shí)現(xiàn)其中所有的函數(shù)操作,若不需要定義實(shí)現(xiàn)時(shí),則只需將其設(shè)為NULL即可。
struct inode結(jié)構(gòu)提供了關(guān)于設(shè)備文件/dev/driver(假設(shè)此設(shè)備名為driver)的信息,struct file結(jié)構(gòu)提供關(guān)于被打開(kāi)的文件信息,主要用于與文件系統(tǒng)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序使用。struct file結(jié)構(gòu)較為重要,這里列出了它的定義:
struct file
{
mode_t f_mode;/*標(biāo)識(shí)文件是否可讀或可寫,F(xiàn)MODE_READ或FMODE_WRITE*/
dev_t f_rdev; /* 用于/dev/tty */
off_t f_pos; /* 當(dāng)前文件位移 */
unsigned short f_flags; /* 文件標(biāo)志,如O_RDONLY、O_NONBLOCK和O_SYNC */
unsigned short f_count; /* 打開(kāi)的文件數(shù)目 */
unsigned short f_reada;
struct inode *f_inode; /*指向inode的結(jié)構(gòu)指針 */
struct file_operations *f_op;/* 文件索引指針 */
};
3.設(shè)備驅(qū)動(dòng)程序主要組成
(1)早期版本的字符設(shè)備注冊(cè)。
早期版本的設(shè)備注冊(cè)使用函數(shù)register_chrdev(),調(diào)用該函數(shù)后就可以向系統(tǒng)申請(qǐng)主設(shè)備號(hào),如果register_chrdev()操作成功,設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件里。在關(guān)閉設(shè)備時(shí),通常需要解除原先的設(shè)備注冊(cè),此時(shí)可使用函數(shù)unregister_chrdev(),此后該設(shè)備就會(huì)從/proc/devices里消失。其中主設(shè)備號(hào)和次設(shè)備號(hào)不能大于255。
當(dāng)前不少的字符設(shè)備驅(qū)動(dòng)代碼仍然使用這些早期版本的函數(shù)接口,但在未來(lái)內(nèi)核的代碼中,將不會(huì)出現(xiàn)這種編程接口機(jī)制。因此應(yīng)該盡量使用后面講述的編程機(jī)制。
register_chrdev()函數(shù)格式如表11.1所示。
表11.1 register_chrdev()函數(shù)語(yǔ)法要點(diǎn)
所需頭文件#include 《linux/fs.h》
函數(shù)原型int register_chrdev(unsigned int major, const char *name,struct file_operations *fops)
函數(shù)傳入值major:設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果為0則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)
設(shè)備驅(qū)動(dòng)程序可以使用模塊的方式動(dòng)態(tài)加載到內(nèi)核中去。加載模塊的方式與以往的應(yīng)用程序開(kāi)發(fā)有很大的不同。以往在開(kāi)發(fā)應(yīng)用程序時(shí)都有一個(gè)main()函數(shù)作為程序的入口點(diǎn),而在驅(qū)動(dòng)開(kāi)發(fā)時(shí)卻沒(méi)有main()函數(shù),模塊在調(diào)用insmod命令時(shí)被加載,此時(shí)的入口點(diǎn)是init_module()函數(shù),通常在該函數(shù)中完成設(shè)備的注冊(cè)。同樣,模塊在調(diào)用rmmod命令時(shí)被卸載,此時(shí)的入口點(diǎn)是cleanup_module()函數(shù),在該函數(shù)中完成設(shè)備的卸載。在設(shè)備完成注冊(cè)加載之后,用戶的應(yīng)用程序就可以對(duì)該設(shè)備進(jìn)行一定的操作,如open()、read()、write()等,而驅(qū)動(dòng)程序就是用于實(shí)現(xiàn)這些操作,在用戶應(yīng)用程序調(diào)用相應(yīng)入口函數(shù)時(shí)執(zhí)行相關(guān)的操作,init_module()入口點(diǎn)函數(shù)則不需要完成其他如read()、write()之類功能。
上述函數(shù)之間的關(guān)系如圖11.3所示。
圖11.3 設(shè)備驅(qū)動(dòng)程序流程圖
2.重要數(shù)據(jù)結(jié)構(gòu)
用戶應(yīng)用程序調(diào)用設(shè)備的一些功能是在設(shè)備驅(qū)動(dòng)程序中定義的,也就是設(shè)備驅(qū)動(dòng)程序的入口點(diǎn),它是一個(gè)在《linux/fs.h》中定義的struct file_operations結(jié)構(gòu),這是一個(gè)內(nèi)核結(jié)構(gòu),不會(huì)出現(xiàn)在用戶空間的程序中,它定義了常見(jiàn)文件I/O函數(shù)的入口,如下所示:
struct file_operations
{
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *filp,
char *buff, size_t count, loff_t *offp);
ssize_t (*write) (struct file *filp,
const char *buff, size_t count, loff_t *offp);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *,
struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *);
int (*fasync) (int, struct file *, int);
int (*check_media_change) (kdev_t dev);
int (*revalidate) (kdev_t dev);
int (*lock) (struct file *, int, struct file_lock *);
};
這里定義的很多函數(shù)是否跟第6章中的文件I/O系統(tǒng)調(diào)用類似?其實(shí)當(dāng)時(shí)的系統(tǒng)調(diào)用函數(shù)通過(guò)內(nèi)核,最終調(diào)用對(duì)應(yīng)的struct file_operations結(jié)構(gòu)的接口函數(shù)(例如,open()文件操作是通過(guò)調(diào)用對(duì)應(yīng)文件的file_operations結(jié)構(gòu)的open函數(shù)接口而被實(shí)現(xiàn))。當(dāng)然,每個(gè)設(shè)備的驅(qū)動(dòng)程序不一定要實(shí)現(xiàn)其中所有的函數(shù)操作,若不需要定義實(shí)現(xiàn)時(shí),則只需將其設(shè)為NULL即可。
struct inode結(jié)構(gòu)提供了關(guān)于設(shè)備文件/dev/driver(假設(shè)此設(shè)備名為driver)的信息,struct file結(jié)構(gòu)提供關(guān)于被打開(kāi)的文件信息,主要用于與文件系統(tǒng)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序使用。struct file結(jié)構(gòu)較為重要,這里列出了它的定義:
struct file
{
mode_t f_mode;/*標(biāo)識(shí)文件是否可讀或可寫,F(xiàn)MODE_READ或FMODE_WRITE*/
dev_t f_rdev; /* 用于/dev/tty */
off_t f_pos; /* 當(dāng)前文件位移 */
unsigned short f_flags; /* 文件標(biāo)志,如O_RDONLY、O_NONBLOCK和O_SYNC */
unsigned short f_count; /* 打開(kāi)的文件數(shù)目 */
unsigned short f_reada;
struct inode *f_inode; /*指向inode的結(jié)構(gòu)指針 */
struct file_operations *f_op;/* 文件索引指針 */
};
3.設(shè)備驅(qū)動(dòng)程序主要組成
(1)早期版本的字符設(shè)備注冊(cè)。
早期版本的設(shè)備注冊(cè)使用函數(shù)register_chrdev(),調(diào)用該函數(shù)后就可以向系統(tǒng)申請(qǐng)主設(shè)備號(hào),如果register_chrdev()操作成功,設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件里。在關(guān)閉設(shè)備時(shí),通常需要解除原先的設(shè)備注冊(cè),此時(shí)可使用函數(shù)unregister_chrdev(),此后該設(shè)備就會(huì)從/proc/devices里消失。其中主設(shè)備號(hào)和次設(shè)備號(hào)不能大于255。
當(dāng)前不少的字符設(shè)備驅(qū)動(dòng)代碼仍然使用這些早期版本的函數(shù)接口,但在未來(lái)內(nèi)核的代碼中,將不會(huì)出現(xiàn)這種編程接口機(jī)制。因此應(yīng)該盡量使用后面講述的編程機(jī)制。
register_chrdev()函數(shù)格式如表11.1所示。
表11.1 register_chrdev()函數(shù)語(yǔ)法要點(diǎn)
所需頭文件#include 《linux/fs.h》
函數(shù)原型int register_chrdev(unsigned int major, const char *name,struct file_operations *fops)
函數(shù)傳入值major:設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果為0則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解 51次下載
- 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)基礎(chǔ)知識(shí)總結(jié)免費(fèi)下載 13次下載
- 《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第6章、字符設(shè)備驅(qū)動(dòng) 23次下載
- 《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞IO 9次下載
- 《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO 0次下載
- 《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第13章、Linux塊設(shè)備驅(qū)動(dòng) 18次下載
- VxWorks設(shè)備驅(qū)動(dòng)之字符設(shè)備驅(qū)動(dòng)詳解 7次下載
- Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之設(shè)備驅(qū)動(dòng)簡(jiǎn)述 0次下載
- Linux驅(qū)動(dòng)開(kāi)發(fā)之塊設(shè)備驅(qū)動(dòng) 0次下載
- 深度解析字符設(shè)備驅(qū)動(dòng)模型 0次下載
- 基于linux系統(tǒng)的字符設(shè)備驅(qū)動(dòng)研究與設(shè)計(jì)_王森 1次下載
- Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)入門
- 嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用
- 嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用
- 嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)
- Linux 驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā),你知道多少? 871次閱讀
- Linux內(nèi)核驅(qū)動(dòng)與單個(gè)PCI設(shè)備的綁定和解綁定 1730次閱讀
- i.MX6ULL|字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐 707次閱讀
- i.MX6ULL|字符設(shè)備驅(qū)動(dòng)流程深究 753次閱讀
- 關(guān)于Linux字符設(shè)備基本類型 1627次閱讀
- 如何寫一個(gè)Linux設(shè)備驅(qū)動(dòng)程序 4532次閱讀
- Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的基本知識(shí) 4393次閱讀
- 米爾科技Linux設(shè)備驅(qū)動(dòng)研究淺談 2035次閱讀
- 米爾科技LINUX設(shè)備驅(qū)動(dòng)程序教程 2103次閱讀
- 基于PXA255開(kāi)發(fā)板外圍字符設(shè)備的嵌入式Linux字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)與應(yīng)用 1199次閱讀
- 基于嵌入式Linux內(nèi)核的系統(tǒng)設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)設(shè)計(jì) 1209次閱讀
- 想要駕馭Linux驅(qū)動(dòng)開(kāi)發(fā),必須深刻理解Linux總線設(shè)備驅(qū)動(dòng)框架 1w次閱讀
- 嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)總結(jié)(上篇) 8518次閱讀
- 基于FPGA嵌入式系統(tǒng)的設(shè)備驅(qū)動(dòng)開(kāi)發(fā) 2338次閱讀
- 關(guān)于Linux設(shè)備驅(qū)動(dòng)中input子系統(tǒng)的介紹 2711次閱讀
下載排行
本周
- 1AN158 GD32VW553 Wi-Fi開(kāi)發(fā)指南
- 1.51MB | 2次下載 | 免費(fèi)
- 2嵌入式軟件開(kāi)發(fā)符合ISO 26262 功能安全標(biāo)準(zhǔn)
- 1.61 MB | 1次下載 | 免費(fèi)
- 3AN148 GD32VW553射頻硬件開(kāi)發(fā)指南
- 2.07MB | 1次下載 | 免費(fèi)
- 4PZT驅(qū)動(dòng)開(kāi)關(guān)電路
- 0.09 MB | 1次下載 | 免費(fèi)
- 5模擬電路仿真實(shí)現(xiàn)
- 2.94MB | 1次下載 | 免費(fèi)
- 6PCB繪制基礎(chǔ)知識(shí)
- 2.44MB | 1次下載 | 免費(fèi)
- 7EE-38:ADSP-2181 IDMA端口-周期竊取時(shí)序
- 75.0KB | 次下載 | 免費(fèi)
- 8EE-82:使用ADSP-2181 DSP的IO空間對(duì)另一個(gè)ADSP-2181進(jìn)行IDMA引導(dǎo)
- 86.86KB | 次下載 | 免費(fèi)
本月
- 1ADI高性能電源管理解決方案
- 2.43 MB | 452次下載 | 免費(fèi)
- 2免費(fèi)開(kāi)源CC3D飛控資料(電路圖&PCB源文件、BOM、
- 5.67 MB | 139次下載 | 1 積分
- 3基于STM32單片機(jī)智能手環(huán)心率計(jì)步器體溫顯示設(shè)計(jì)
- 0.10 MB | 132次下載 | 免費(fèi)
- 4美的電磁爐維修手冊(cè)大全
- 1.56 MB | 24次下載 | 5 積分
- 5如何正確測(cè)試電源的紋波
- 0.36 MB | 19次下載 | 免費(fèi)
- 6感應(yīng)筆電路圖
- 0.06 MB | 10次下載 | 免費(fèi)
- 7LZC3106G高性能諧振控制器中文手冊(cè)
- 1.29 MB | 9次下載 | 1 積分
- 8萬(wàn)用表UT58A原理圖
- 0.09 MB | 9次下載 | 5 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935121次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191367次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73810次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評(píng)論
查看更多