作為一名嵌入式Linux新手,在學(xué)習(xí)的過程中會遇到很多問題。寫了一個驅(qū)動程序怎么編譯?怎么加載進(jìn)內(nèi)核?本文將介紹嵌入式Linux開發(fā)的一些入門基本操作,手把手讓你掌握編譯驅(qū)動、內(nèi)核及應(yīng)用程序。
小王是一名剛接觸Linux的新手,看了一些關(guān)于Linux驅(qū)動的書籍之后,買了一塊Cortex-A9的ARM開發(fā)板,準(zhǔn)備大干一場。編寫了第一個屬于自己的驅(qū)動程序并命名為hellodrv.c,程序源碼如下所示。
這個驅(qū)動程序怎么編譯成可以在板子上跑的程序呢,小王經(jīng)過一番網(wǎng)上查詢,原來需要交叉編譯工具鏈,小王找到了光盤資料里的交叉編譯工具并按說明正確安裝了交叉編譯工具。
一、安裝交叉編譯工具
1編寫Makefile
小王編寫好的驅(qū)動程序為hellodrv.c,要把該驅(qū)動程序編譯為模塊,在同一目錄下新建了一個Makefile文件。編寫的Makefile如下。
2驅(qū)動編譯
小王經(jīng)過查詢,編譯驅(qū)動主要有兩種方式,一種是修改內(nèi)核源碼頂層目錄下的Makefile文件,另外也可以在編譯命令指定架構(gòu)及交叉編譯工具。
1、修改Makefile
例如:Linux內(nèi)核源碼的目錄為/home/vmuser/kernel-imx,打開該目錄下的Makefile文件,找到ARCH及CROSS_COMPILE相關(guān)語句,修改為如下所示語句。
如果交叉編譯工具鏈未設(shè)置環(huán)境變量則CROSS_COMPILE設(shè)置為交叉編譯工具鏈的絕對路徑,設(shè)置如下。
修改完之后,直接執(zhí)行make命令,生成了hellodrv.ko文件。
2、在編譯命令指定
執(zhí)行如下命令進(jìn)行編譯。
這種方式也可以生成hellodrv.ko,可是驅(qū)動要依賴于內(nèi)核才能跑起來,小王于是開始了Linux內(nèi)核的配置及編譯。
二、Linux內(nèi)核配置及編譯
編譯內(nèi)核時指定架構(gòu)和交叉編譯工具的方式同編譯模塊一樣,經(jīng)過上面的操作,小王已經(jīng)輕車熟路了。小王還學(xué)會了首先導(dǎo)環(huán)境變量然后進(jìn)行編譯的方法。
在首次進(jìn)行配置編譯之前,需要清除之前編譯生成的文件,可用如下命令進(jìn)行清除。
接下來進(jìn)行內(nèi)核的配置,內(nèi)核的配置可以使用如下命令中的一個。
這四種方式中,值得推薦的是make menuconfig,它不依賴于QT或GTK+,且非常直觀。使用make menuconfig命令后,會進(jìn)入如圖1所示的界面,在該界面根據(jù)需求對需要編譯進(jìn)內(nèi)核的選項進(jìn)行裁剪。對于bool型選項,按Y或者N決定是否選擇編譯進(jìn)內(nèi)核。[*]表示選中,[]表示未選中。對于tristate型選項,根據(jù)需求可以有Y、M、N三種選擇,<*>表示靜態(tài)編譯,
圖1 內(nèi)核配置界面
配置完成后,選擇保存,然后退出。配置后會生成.config文件,該文件保存了配置信息,供Makefile在編譯內(nèi)核時使用。
在配置界面我們根據(jù)需求把需要的功能以及相應(yīng)設(shè)備驅(qū)動的支持等配置好,然后進(jìn)行內(nèi)核及設(shè)備樹的編譯。內(nèi)核及設(shè)備樹編譯用以下命令。
為了加快編譯速度可以在編譯命令后加“-j”選項,例如PC的CPU為4核,則編譯命令如下。
如果要把某些驅(qū)動編譯為模塊,則使用如下命令。
針對相應(yīng)的開發(fā)板,廠家一般都會有默認(rèn)的配置,這些配置文件位于內(nèi)核源碼arch/arm/configs目錄下。例如:使用如下的默認(rèn)配置。
如果已有.config文件,可以使用如下命令載入既有的.config配置文件。
內(nèi)核及設(shè)備樹編譯完成后將會生成zImage和相應(yīng)的dtb文件,按照廠家提供的燒寫方式將鏡像燒寫到目標(biāo)板。
三、應(yīng)用程序編譯及文件傳輸
1應(yīng)用程序編譯
例如需要編譯的應(yīng)用程序文件為test.c,需要把該程序編譯放到arm開發(fā)板上運行。編譯命令如下。
這是一個非常簡單的程序,并且只有一個文件,所以可以采用直接輸入命令進(jìn)行交叉編譯。如果工程較大,這種方式就不可取了,通常需要編寫Makefile文件,通過make程序來進(jìn)行工程管理。應(yīng)用程序的Makefile范例如下。
編寫完Makefile后執(zhí)行make命令即可生成目標(biāo)文件test。
2文件傳輸
編譯生成的可執(zhí)行文件可以通過TFTP,NFS等方式下載到開發(fā)板,關(guān)于TFTP,NFS服務(wù)器在PC上的搭建可參考網(wǎng)絡(luò)上相關(guān)文章,這里不贅述。
1、NFS文件傳輸
將目標(biāo)板接入局域網(wǎng)或通過交叉網(wǎng)線與PC主機(jī)相連,設(shè)定目標(biāo)板的IP,使之與主機(jī)在同一網(wǎng)段,然后進(jìn)行遠(yuǎn)程mount操作。將需要傳輸?shù)奈募旁赑C機(jī)搭建的NFS服務(wù)器目錄下。在開發(fā)板上執(zhí)行如下操作。
在進(jìn)行遠(yuǎn)程掛載之前,最好先用ping命令檢查網(wǎng)絡(luò)通信是否正常,只有在能ping通的情況下,才能進(jìn)行正常掛載,否則請檢查網(wǎng)絡(luò)。如果在已經(jīng)ping通的情況下,遠(yuǎn)程掛載出現(xiàn)錯誤,請檢查主機(jī)和目標(biāo)機(jī)的其它設(shè)置。
2、TFTP文件傳輸
把需要傳輸?shù)奈募旁赑C機(jī)的tftp服務(wù)器目錄下。TFTP下載命令格式如下。
例如:下載IP為192.168.1.168的tftp服務(wù)器的hellodrv.ko文件,在開發(fā)板的當(dāng)前目錄下執(zhí)行如下命令。
通過以上任一方式將在PC機(jī)上編譯完成的驅(qū)動模塊hellodrv.ko和test應(yīng)用程序拷貝到目標(biāo)板上。
四、驅(qū)動模塊的加載及移除
執(zhí)行如下命令把驅(qū)動模塊動態(tài)加載進(jìn)內(nèi)核。
查看加載的模塊使用如下命令。
如需要移除模塊使用如下命令。
IoT9000A-LI是廣州致遠(yuǎn)電子有限公司開發(fā)的基于M6708-T系列核心板的ARM工控主板,核心板標(biāo)配處理器為i.MX 6U,Cortex?-A9簡單雙核。板上集成了大量的外設(shè)接口,包括千兆以太網(wǎng)、音頻、USB、HDMI、LVDS、LCD、miniPCIE、攝像頭、CAN信號、UART信號等接口,同時整合的多功能HD視頻引擎可提供1080P 60fps視頻解碼、1080P 30fps視頻編碼,并帶有2D、3D圖形引擎,可滿足消費電子、工業(yè)和汽車車載娛樂系統(tǒng)等新一代應(yīng)用,以及醫(yī)療應(yīng)用的豐富圖形和高響應(yīng)需求。
圖2 IoT9000A_LI產(chǎn)品圖
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209323 -
驅(qū)動程序
+關(guān)注
關(guān)注
19文章
831瀏覽量
48022
原文標(biāo)題:【純干貨】五分鐘帶你掌握Linux編譯驅(qū)動、內(nèi)核及應(yīng)用程序
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論