例程代碼路徑:ELF 1開發(fā)板資料包3-例程源碼3-2 驅(qū)動(dòng)例程源碼1_helloworldhello_param
Linux驅(qū)動(dòng)模塊可以接受參數(shù),這些參數(shù)可以在加載模塊時(shí)通過(guò)命令行或配置文件進(jìn)行配置。驅(qū)動(dòng)模塊參數(shù)提供了一種動(dòng)態(tài)配置和調(diào)整驅(qū)動(dòng)行為的方式。
在Linux內(nèi)核中,驅(qū)動(dòng)模塊參數(shù)通常使用module_param宏進(jìn)行定義和注冊(cè)。下面是一些常用的驅(qū)動(dòng)模塊參數(shù)相關(guān)的宏和函數(shù):
module_param:用于定義和注冊(cè)一個(gè)驅(qū)動(dòng)模塊參數(shù)。
module_param(name, type, permissions); |
name:參數(shù)名稱,通常使用駝峰命名法;
type:參數(shù)的數(shù)據(jù)類型,可以是整型、字符型或布爾型等;
permissions:指定參數(shù)的訪問(wèn)權(quán)限;
MODULE_PARM_DESC:用于定義驅(qū)動(dòng)模塊參數(shù)的描述信息。
MODULE_PARM_DESC(name, description); |
name:參數(shù)名稱,與之前使用module_param或module_param_array定義的參數(shù)名稱相同;
description:參數(shù)的描述信息;
通過(guò)使用這些宏和函數(shù),可以定義和注冊(cè)驅(qū)動(dòng)模塊參數(shù)。在加載驅(qū)動(dòng)模塊時(shí),可以通過(guò)命令行或配置文件設(shè)置這些參數(shù)的值;
hello_param.c示例源碼
#include <linux/module.h> ??// 包含模塊相關(guān)函數(shù)的頭文件
#include <linux/kernel.h> ??// 包含內(nèi)核相關(guān)函數(shù)的頭文件 #include <linux/init.h> ????// 包含初始化和清理函數(shù)的頭文件 #include <linux/moduleparam.h> //包含模塊參數(shù)相關(guān)函數(shù)的頭文件 static int my_param = 0; static char *who = "helloworld"; module_param(my_param, int, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(my_param, "An integer parameter"); module_param(who, charp, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(who, "An integer parameter"); static int __init helloworld_init(void) { printk(KERN_INFO "Hello, World! my_param is %dn",my_param); // 打印消息到內(nèi)核日志 printk(KERN_INFO "Hello, World! this is %sn",who); return 0; } static void __exit helloworld_exit(void) { printk(KERN_INFO "Goodbye, World!n"); // 打印消息到內(nèi)核日志 } module_init(helloworld_init); // 指定驅(qū)動(dòng)程序的初始化函數(shù) module_exit(helloworld_exit); // 指定驅(qū)動(dòng)程序的清理函數(shù) MODULE_LICENSE("GPL"); // 指定模塊的許可證信息 MODULE_AUTHOR("Your Name"); // 指定模塊的作者信息 MODULE_DESCRIPTION("A simple Hello World driver"); // 指定模塊的描述信息 |
編譯
復(fù)制helloworld驅(qū)動(dòng)中的Makefile文件,將其中的hello.o修改為hello_param.o,效果如下:
設(shè)置環(huán)境變量,編譯:
?. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
elf@ubuntu:~/work/test/01_helloworld/hello_param$ make |
測(cè)試
將生成的hello_param.ko文件拷貝到開發(fā)板中測(cè)試。在開發(fā)板中執(zhí)行insmod加載驅(qū)動(dòng),rmmod卸載驅(qū)動(dòng):
root@ELF1:~#?insmod hello_param.ko
Hello, World! my_param is 0 Hello, World! this is helloworld root@ELF1:~#?rmmod hello_param.ko Goodbye, World! |
可以看出不輸入?yún)?shù),加載時(shí)打印出的是初始化參數(shù)。下面我們傳入?yún)?shù)看一下效果:
root@ELF1:~#?insmod hello_param.ko my_param=72 who=elfboard
Hello, World! my_param is 72 Hello, World! this is elfboard root@ELF1:~#?rmmod hello_param.ko Goodbye, World! |
可以看到我們寫的參數(shù)傳到了驅(qū)動(dòng)中,并打印了出來(lái)。