【摘要】 Linux驅(qū)動(dòng)安裝時(shí)也支持傳遞參數(shù),和命令行上運(yùn)行的命令原理類(lèi)似。 只不過(guò)在編寫(xiě)驅(qū)動(dòng)的時(shí)候,需要在驅(qū)動(dòng)代碼里提前將相關(guān)信息聲明好才可以使用。 這篇文章就介紹如果在命令安裝驅(qū)動(dòng)時(shí),傳遞參數(shù)給驅(qū)動(dòng)代碼,演示各種類(lèi)型的參數(shù)傳輸情況。
一、簡(jiǎn)介
在Linux下進(jìn)行C語(yǔ)言開(kāi)發(fā)時(shí),經(jīng)常在命令行傳遞參數(shù)給C程序,常見(jiàn)的Linux命令也是需要傳參的,這樣用起來(lái)就很靈活,根據(jù)不同的參數(shù)可以執(zhí)行不同的效果。
Linux驅(qū)動(dòng)安裝時(shí)也支持傳遞參數(shù),和命令行上運(yùn)行的命令原理類(lèi)似。
只不過(guò)在編寫(xiě)驅(qū)動(dòng)的時(shí)候,需要在驅(qū)動(dòng)代碼里提前將相關(guān)信息聲明好才可以使用。
這篇文章就介紹如果在命令安裝驅(qū)動(dòng)時(shí),傳遞參數(shù)給驅(qū)動(dòng)代碼,演示各種類(lèi)型的參數(shù)傳輸情況。
在驅(qū)動(dòng)代碼里聲明傳入?yún)?shù)的類(lèi)型、權(quán)限,接收的變量名稱(chēng)。
module_param(變量的名稱(chēng),類(lèi)型,權(quán)限)
二、在驅(qū)動(dòng)代碼里聲明傳遞參數(shù)的格式
/*傳遞整型類(lèi)型數(shù)據(jù)*/
int int_data = 0;
module_param(int_data, int ,0664);
MODULE_PARM_DESC(int_data, "是一個(gè)整型的參數(shù).");
/*傳遞指針類(lèi)型數(shù)據(jù)*/
char *p_data = NULL;
module_param(p_data, charp, 0664);
MODULE_PARM_DESC(p_data, "是一個(gè)指針類(lèi)型數(shù)據(jù).");
/*
傳遞數(shù)組類(lèi)型數(shù)據(jù)
module_param_array(數(shù)組名, 元素類(lèi)型, 元素個(gè)數(shù)(取地址), 權(quán)限);
*/
int array_data[3] = {};
int num = 3;
module_param_array(array_data, int, &num, 0664);
MODULE_PARM_DESC(array_data, "是一個(gè)數(shù)組類(lèi)型數(shù)據(jù).");
/*
傳遞字符串: module_param_string
(傳遞參數(shù)時(shí)的字符串名稱(chēng), 字符串名稱(chēng), 字符串大小, 權(quán)限);
*/
char str_data[12] = {};
module_param_string(str_data, str_data, sizeof(str_data), 0664);
MODULE_PARM_DESC(str_data, "是一個(gè)字符串類(lèi)型數(shù)據(jù).");
三、完整代碼示例
#include
#include
#include
#include
#include
#include
#include
#include
/*傳遞整型類(lèi)型數(shù)據(jù)*/
int int_data = 0;
module_param(int_data, int ,0664);
MODULE_PARM_DESC(int_data, "是一個(gè)整型的參數(shù).");
/*傳遞指針類(lèi)型數(shù)據(jù)*/
char *p_data = NULL;
module_param(p_data, charp, 0664);
MODULE_PARM_DESC(p_data, "是一個(gè)指針類(lèi)型數(shù)據(jù).");
/*
傳遞數(shù)組類(lèi)型數(shù)據(jù)
module_param_array(數(shù)組名, 元素類(lèi)型, 元素個(gè)數(shù)(取地址), 權(quán)限);
*/
int array_data[3] = {};
int num = 3;
module_param_array(array_data, int, &num, 0664);
MODULE_PARM_DESC(array_data, "是一個(gè)數(shù)組類(lèi)型數(shù)據(jù).");
/*
傳遞字符串: module_param_string
(傳遞參數(shù)時(shí)的字符串名稱(chēng), 字符串名稱(chēng), 字符串大小, 權(quán)限);
*/
char str_data[12] = {};
module_param_string(str_data, str_data, sizeof(str_data), 0664);
MODULE_PARM_DESC(str_data, "是一個(gè)字符串類(lèi)型數(shù)據(jù).");
static int __init tiny4412_param_dev_init(void)
{
printk("安裝驅(qū)動(dòng)成功.\n");
printk("int_data=%d\n",int_data);
printk("p_data=%s\n",p_data);
printk("array_data=%d\n",array_data[0]);
printk("str_data=%s\n",str_data);
return 0;
}
static void __exit tiny4412_param_dev_exit(void)
{
printk("卸載驅(qū)動(dòng)成功.\n");
}
module_init(tiny4412_param_dev_init);
module_exit(tiny4412_param_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wbyq");
四、查看驅(qū)動(dòng)提示信息
[root@wbyq code]#modinfo led_drv.ko
filename: led_drv.ko
license: GPL
author: wbyq
depends:
vermagic: 3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8
parm: str_data:是一個(gè)字符串類(lèi)型數(shù)據(jù).
parm: array_data:是一個(gè)數(shù)組類(lèi)型數(shù)據(jù).
parm: p_data:是一個(gè)指針類(lèi)型數(shù)據(jù).
parm: int_data:是一個(gè)整型的參數(shù).
五、安裝驅(qū)動(dòng)時(shí)傳遞參數(shù)
[root@wbyq code]#insmod led_drv.ko str_data="123" int_data=666 p_data="789" array_data=6,7,8
[ 2692.220000] 安裝驅(qū)動(dòng)成功.
[ 2692.220000] int_data=666
[ 2692.220000] p_data=789
[ 2692.220000] array_data=6
[ 2692.220000] str_data=123
六、驅(qū)動(dòng)安裝成功在sys目錄下查看傳遞的參數(shù)
[root@wbyq code]#cd /sys/module/led_drv/parameters/
[root@wbyq parameters]#ls
array_data int_data p_data str_data
[root@wbyq parameters]#cat array_data
6,7,8
[root@wbyq parameters]#cat int_data
666
[root@wbyq parameters]#cat p_data
789
[root@wbyq parameters]#cat str_data
123
[root@wbyq parameters]#
七、權(quán)限定義
用戶
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
用戶組
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
其他用戶
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
示例代碼:
/*傳遞整型類(lèi)型數(shù)據(jù)*/
int int_data = 0;
module_param(int_data, int ,S_IRUSR|S_IWUSR|S_IXUSR);
MODULE_PARM_DESC(int_data, "是一個(gè)整型的參數(shù).");
/*傳遞指針類(lèi)型數(shù)據(jù)*/
char *p_data = NULL;
module_param(p_data, charp, S_IRUSR|S_IWUSR|S_IXUSR);
MODULE_PARM_DESC(p_data, "是一個(gè)指針類(lèi)型數(shù)據(jù).");
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1838瀏覽量
85262 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論