第5章 驅動模塊傳參實驗
經過前兩章實驗的實戰操作,我們已經完成最簡單的helloworld驅動實驗和模塊驅動實驗,加載模塊可以使用“insmod”函數,使用“insmod”函數進行模塊加載時也能進行參數的傳遞。運用得當可以極大提升內核測試速度。本節就來學習一下如何進行驅動模塊的傳參。
5.1 驅動模塊傳參簡介
驅動模塊傳參是一種可以隨時向內核模塊傳遞、修改參數的方法。例如可以傳遞串口驅動的波特率、數據位數、校驗位、停止位等參數,進行功能的設置,以此節省編譯模塊的時間,大大提高調試速度。
Linux內核提供了 module_param(name, type, perm)、module_param_array(name, type, nump, perm)宏和module_param_string(name, string, len, perm)宏,分別進行基本類型、數組和字符串參數的傳遞。它們定義在 “內核源碼/include/linux/moduleparam.h”文件中(在module.h文件中已經對export.h進行引用,所以不需要單獨引用moduleparam.h文件),詳細定義如下(圖5-1)所示:
以上宏定義中的 module_param ()函數可以用來進行基本類型參數的傳遞,傳入的三個參數定義如下:
- name:模塊參數的名稱
- type: 模塊參數的數據類型
- perm: 模塊參數的訪問權限
如果要傳遞數組類型參數可以使用 module_param_array ()函數,相較於 module_param ()函數多了n_para參數,用來表示傳遞參數個數;n_para參數值會根據輸入的參數個數而改變,n_para的最終值爲傳遞的數組元素個數。
最後是 module_param_string(name, string, len, perm)函數,用來傳遞字符串類型的變量,四個參數的定義如下所示:
name:外部傳入的參數名,即加載模塊時的傳入值
string:內部的變量名,即程序內定義的參數名
len:以string命名的buffer大小(可以小於buffer的大小,但是沒有意義)
perm:模塊參數的訪問權限
至此,關於驅動模塊傳參所使用的函數就講解完成了,在下一小節中將編寫驅動模塊傳參函數代碼。
5.2 實驗程序的編寫
本實驗對應的網盤路徑爲:iTOP-RK3568開發板【底板V1.7版本】\03_【iTOP-RK3568開發板】指南教程\02_Linux驅動配套資料\04_Linux驅動例程\02。
本章實驗將編寫Linux下的驅動傳參實例代碼,通過“insmod”命令進行參數的傳遞,並將相應的參數打印到串口終端上。
編寫完成的parameter.c代碼如下(圖5-3)所示
以上代碼將傳遞int類型參數number、char類型參數name、int類型的數組para和char類型字符串str1,並在驅動入口函數中,對各個參數進行打印。在下一小節會進行驅動加載測試。
5.3 運行測試
5.3.1 編譯驅動程序
在上一小節中的parameter.c代碼同一目錄下創建 Makefile 文件,Makefile 文件內容如下(圖5-4)所示:
對於Makefile的內容註釋已在上圖添加,保存退出之後,來到存放parameter.c和Makefile文件目錄下,如下圖(圖5-5)所示:
然後使用命令“make”進行驅動的編譯,編譯完成如下圖(圖5-6)所示:
編譯完生成 parameter.ko目標文件,如下圖(圖5-7)所示:
至此我們的驅動模塊就編譯成功了,下面進行驅動的運行測試。
5.3.2 運行測試
在上一章節中已經學習了使用insmod命令加載模塊,而驅動模塊傳參的命令格式爲
insmod 對應的模塊 參數
parameter.ko 驅動加載可以傳遞3個參數,分別爲int類型的參數number,char類型的參數name和int數組類型的參數para。使用以下命令進行驅動的加載,加載完成之後的打印信息如下圖(圖5-8)所示:
可以看到傳遞的參數都分別打印了出來。最後可以輸入以下命令進行驅動的卸載,如下圖(圖5-9)所示:
更多內容可以關注【公衆號】迅爲電子