
本系列圖文教程均以全志H3開發(fā)板為實驗板設(shè)計,字符設(shè)備驅(qū)動開發(fā)是最基礎(chǔ)的驅(qū)動開發(fā)。其本質(zhì)是按字節(jié)進(jìn)行讀寫操作,讀寫數(shù)據(jù)是分先后順序的。LED、按鍵、IIC、SPI、USB等等都是字符設(shè)備,驅(qū)動加載成功以后會在“/dev”目錄下生成相應(yīng)的文件,應(yīng)用程序通過對“/dev/xxx進(jìn)行操作即可實現(xiàn)對硬件的控制”。應(yīng)用程序中的每一個系統(tǒng)調(diào)用,都在驅(qū)動程序中有相應(yīng)的驅(qū)動函數(shù),Linux內(nèi)核文件中存在著一個內(nèi)核驅(qū)動操作函數(shù)集合,以結(jié)構(gòu)體file_operations展現(xiàn)。
編寫驅(qū)動需要注冊兩種操作函數(shù),加載和卸載。module_init 函數(shù)用來向 Linux 內(nèi)核注冊一個模塊加載函數(shù),參數(shù) xxx_init 就是需要注冊的具體函數(shù),當(dāng)使用“insmod”命令加載驅(qū)動的時候,xxx_init 這個函數(shù)就會被調(diào)用。module_exit()函數(shù)用來向 Linux 內(nèi)核注冊一個模塊卸載函數(shù),參數(shù) xxx_exit 就是需要注冊的具體函數(shù),當(dāng)使用“rmmod”命令卸載具體驅(qū)動的時候 xxx_exit 函數(shù)就會被調(diào)用。驅(qū)動編譯完成后是.ko文件,使用insmod和modprobe加載驅(qū)動模塊。
對于字符設(shè)備驅(qū)動而言,當(dāng)驅(qū)動模塊加載成功以后需要注冊字符設(shè)備,同樣,卸載驅(qū)動模塊的時候也需要注銷掉字符設(shè)備。注冊和注銷函數(shù)原型如下所示:
(資料圖片)
static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)static inline void unregister_chrdev(unsigned int major, const char *name)
最后我們需要在驅(qū)動中加入 LICENSE 信息和作者信息,其中 LICENSE 是必須添加的,否則的話編譯的時候會報錯,作者信息非必須。
添加函數(shù)為:
MODULE_LICENSE()MODULE_AUTHOR()
Linux如何判斷當(dāng)下的設(shè)備就是程序想要調(diào)用的那一個呢,通過設(shè)備號對設(shè)備進(jìn)行唯一匹配。有動態(tài)和靜態(tài)兩種分配方式,我們先講解舊的驅(qū)動設(shè)備注冊方式(靜態(tài)),也就是使用register_chrdev函數(shù)注冊設(shè)備。其三個參數(shù)分別是主設(shè)備號(手動分配),設(shè)備名稱(字符串),函數(shù)集合指針結(jié)構(gòu)體。主設(shè)備號的可選范圍是0-4095,所以使用之前先查看開發(fā)板的Linux系統(tǒng)還有哪些設(shè)備號沒有用,使用命令cat /proc/devices查看。
最后就是完整的編寫驅(qū)動和應(yīng)用程序,驅(qū)動程序完成設(shè)備打開,讀寫操作,使用一個虛擬讀寫設(shè)備做一個簡單的例子。借助copy_to_user(將內(nèi)核態(tài)數(shù)據(jù)復(fù)制到用戶態(tài))和printk函數(shù)(內(nèi)核態(tài))完成模擬。
共分以下幾步
?編寫驅(qū)動程序(對printk的解釋內(nèi)核態(tài),設(shè)備注冊等)
?編寫App程序(open等函數(shù))
?編譯驅(qū)動程序成.ko 測試(編寫Makefile文件)
?編譯App
?下載到TF的rootfs分區(qū)下
?找到相應(yīng)文件夾下加載模塊insmod **.ko
?查看系統(tǒng)中的所有設(shè)備cat /proc/devices
?創(chuàng)建設(shè)備節(jié)點(diǎn)文件mknod /dev/chrdevbase c 200 0 然后再執(zhí)行上一步查看設(shè)備是否多了chrdevbase
c表示字符設(shè)備,200是主設(shè)備號,0是次設(shè)備號
?如果App要讀寫chrdevbase設(shè)備,直接操作/dev/chrdevbase就可以
讀操作測試./chrdevbaseApp /dev/chrdevbase 1
標(biāo)簽: