Linux驱动加载总结
一、Linux系統(tǒng)結(jié)構(gòu)概述
1.1Linux體系結(jié)構(gòu)
1.2內(nèi)核架構(gòu)
二、Linux驅(qū)動(dòng)
2.1Linux系統(tǒng)3大類設(shè)備
1)字符設(shè)備
2)塊設(shè)備
3)網(wǎng)絡(luò)設(shè)備?
字符設(shè)備和塊設(shè)備都是通過(guò)文件系統(tǒng)的系統(tǒng)調(diào)用接口open()、close()、write()、read()等函數(shù)訪問(wèn),應(yīng)用程序可以通過(guò)打開(kāi)設(shè)備文件(如UART0設(shè)備:/dev/ttyS0)來(lái)訪問(wèn)設(shè)備;
主設(shè)備號(hào)、次設(shè)備號(hào);
網(wǎng)絡(luò)設(shè)備是面向數(shù)據(jù)包的接收和發(fā)送而設(shè)計(jì)的,它不對(duì)應(yīng)于文件系統(tǒng)(/dev目錄下)的結(jié)點(diǎn),而是由系統(tǒng)分配一個(gè)唯一的名字(如eth0)。
2.2Linux系統(tǒng)框架圖
Linux驅(qū)動(dòng)的編寫難點(diǎn)不在于對(duì)硬件的具體操作而是需要清除現(xiàn)有驅(qū)動(dòng)程序的框架,并在這個(gè)框架中找到修改的位置。
編寫設(shè)備驅(qū)動(dòng)程序涉及的三個(gè)核心數(shù)據(jù)結(jié)構(gòu):
1)Struct file_operations結(jié)構(gòu)
2)Struct inode結(jié)構(gòu)
3)Struct file結(jié)構(gòu)
2.3加載驅(qū)動(dòng)的方式
1)編譯進(jìn)內(nèi)核(靜態(tài)加載驅(qū)動(dòng));
2)不編譯進(jìn)內(nèi)核以模塊的方式動(dòng)態(tài)加載.
三、靜態(tài)加載驅(qū)動(dòng)
3.1定義?
將驅(qū)動(dòng)直接編譯進(jìn)內(nèi)核,燒寫進(jìn)板子后,系統(tǒng)啟動(dòng)時(shí)由內(nèi)核自動(dòng)加載。
3.2實(shí)現(xiàn)過(guò)程
1).將寫好的驅(qū)動(dòng)程序復(fù)制到相應(yīng)位置(一般為drivers/char)
2).配置Kconfig,添加hello_world選項(xiàng) ?
? ? ? ? ? ? ?- #cd drivers/char
? ? ?- #vim Kconfig
3).查看配置
? ? ?- 進(jìn)入根目錄
? ? ?- # make menuconfig
? ? ?- 在彈出窗口中選擇device drivers/character devices/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hello-world-test [*]保存退出
4).修改Makefile
? ? ? ? ? ? ?- #cd drivers/char
? ? ? ? ? ? ?- # vim Makefile
? ? ? ? ? ? ?-添加“Obj-$(CONFIG_HELLO_WORLD)” ?+=hello.o
5).重新編譯內(nèi)核
? ? ? ? ? ? - #返回根目錄
? ? ? ? ? ? - #make
6).把zImage燒進(jìn)開(kāi)發(fā)板(fastboot燒寫)
? ? ? ? ? - #fastboot.exe flash kernel zImage(只燒寫這一步)
7).重啟開(kāi)發(fā)板,在超級(jí)終端輸出信息中查看驅(qū)動(dòng)輸出信息
3.3靜態(tài)加載缺點(diǎn)
調(diào)用起來(lái)比較麻煩,每修改一個(gè)地方都需要重新編譯和下載內(nèi)核,效率低。若加載的驅(qū)動(dòng)較多時(shí),會(huì)導(dǎo)致內(nèi)核容量很大。
嵌入式產(chǎn)品中可先采用動(dòng)態(tài)加載進(jìn)行調(diào)試,調(diào)試成功之后采用靜態(tài)加載編譯進(jìn)內(nèi)核。
四、以模塊的方式動(dòng)態(tài)加載
4.1所需源文件
1)Makefile文件(Makefile文件修改為如下)
2)驅(qū)動(dòng)程序源代碼(hello.c)
其中Makefile中-C 后為android 對(duì)應(yīng)linux源碼目錄(這里為
/home/lc/iTop4412_Kernel_3.0);M為hello.c所在目錄。如下圖所示:
4.2make編譯
所需工具:Linux操作系統(tǒng)、android 對(duì)應(yīng)的linux內(nèi)核源碼、驅(qū)動(dòng)源代碼及對(duì)應(yīng)的Makefile文件。
1)將Makefile文件與驅(qū)動(dòng)源代碼(hello.c)復(fù)制到Linux系統(tǒng)的任意同一個(gè)文件夾下(本文復(fù)制到/home/lc/hello文件夾下);
2)在命令行終端進(jìn)入驅(qū)動(dòng)程序源代碼與Makefile所在目錄,然后執(zhí)行make命令編譯得到.ko驅(qū)動(dòng)程序。如下圖所示:
4.3將驅(qū)動(dòng)燒寫進(jìn)ARM開(kāi)發(fā)板
所需工具:adb(Android Debug Bridge)工具、數(shù)據(jù)線、cmd命令行終端及iTOP4412開(kāi)發(fā)板。
1)將前面編譯好的.ko驅(qū)動(dòng)文件復(fù)制到adb安裝目錄下(這里是c:\adb);
2)用數(shù)據(jù)線將開(kāi)發(fā)板與PC機(jī)(這里通過(guò)Win7下的360手機(jī)助手)連接;
3)打開(kāi)命令提示符程序,通過(guò)adb工具執(zhí)行adb push 命令進(jìn)行燒寫。
成功燒寫后執(zhí)行adb shell命令以管理員身份進(jìn)入Android系統(tǒng),在/system/bin目錄下執(zhí)行l(wèi)s命令可看到如下圖的結(jié)果:
4.4加載驅(qū)動(dòng)模塊(方法一)
所需工具:adb shell、cmd命令行終端、iTOP4412開(kāi)發(fā)板
1)在cmd命令行終端執(zhí)行adb shell命令以管理員身份進(jìn)入Android系統(tǒng);
2)進(jìn)入已下載好驅(qū)動(dòng)的目錄(這里是/system/bin)并執(zhí)行insmod加載驅(qū)動(dòng)命令即可加載.ko驅(qū)動(dòng)程序。
4.5加載驅(qū)動(dòng)模塊(方法二)
所需工具:串口工具超級(jí)終端、串口線、OTG線(安卓手機(jī)數(shù)據(jù)線)及iTOP4412開(kāi)發(fā)板。
開(kāi)發(fā)板串口、OTG口分別連接PC
1)打開(kāi)設(shè)備管理器→端口→相應(yīng)的端口,設(shè)置好端口后打開(kāi)超級(jí)終端并啟動(dòng)開(kāi)發(fā)板。
2)在超級(jí)終端中以管理員身份進(jìn)入前面已下載好.ko驅(qū)動(dòng)的目錄下執(zhí)行insmod命令加載驅(qū)動(dòng),可以看到成功加載驅(qū)動(dòng)的效果。如下圖所示:
4.6卸載及刪除驅(qū)動(dòng)模塊
1)rmmod命令卸載驅(qū)動(dòng)模塊;
2)rm命令刪除驅(qū)動(dòng)文件。
在Windows命令提示符及adb工具下或者在超級(jí)終端里通過(guò)串口均可直接卸載及刪除驅(qū)動(dòng)模塊。執(zhí)行效果分別如下圖所示:
總結(jié)
以上是生活随笔為你收集整理的Linux驱动加载总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 60usebean创建实例对象
- 下一篇: 东芝笔记本linux系统安装驱动,最详实