有些子產品在加載的時候可能需要根據不同的參數來産生不同的功能。這些參數的值可以直接由insmod或者modprobe指令在加載的時候指定。當然,你的代碼在使用子產品參數前,必須定義這些參數,并讓這些參數可用。一個使用了子產品參數的裝置驅動子產品源碼如下,這個代碼是在原來最基礎的hello world的基礎上修改的:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 MODULE_LICENSE("Dual BSD/GPL");
4 static char *whom = "world";
5 static int howmany = 1;
6 module_param(howmany, int, S_IRUGO);
7 module_param(whom, charp, S_IRUGO);
8 static int hello_init(void)
9 {
10 int i;
11 for(i=0;i<=howmany;i++)
12 {
13 printk(KERN_ALERT "Hello %c\n",whom);
14 }
15 return 0;
16 }
17 static void hello_exit(void)
18 {
19 printk(KERN_ALERT "Goodbye, world\n");
20 }
21 module_init(hello_init);
22 module_exit(hello_exit);
将上面的子產品編譯,然後隻需按照insmod (hello.ko的路徑) howmany=X whom=X的格式加載裝置驅動子產品就行了,輸出的效果的話,從代碼中就能很明顯的看出了,跟設定的參數有關,輸出howmany次“hello 'whom'”。
module_param宏相當于把子產品參數聲明,第一個參數是要聲明的參數,第二個是參數類型,第三個是權限。
附帶說一點我自己在實作時遇到的一個問題,如果我想往常一樣寫循環 for(int i=0;i<=howmany;i++)在編譯的時候就會出現loop initial declarations are only allowed in C99 mode的錯誤。把循環标志位拿出來定義之後,問題就解決了。看了下linux的源碼,基本上也是把循環标志的定義拿出來的,看來linux下的c編寫還是要跟通用的c标準分開。
這樣,一個支援子產品參數的helloworld就有了。當然,一個真正的裝置驅動子產品是不可能僅僅這麼簡單的,helloworld執行個體隻包括了最根本的初始化函數和退出函數,其他一些函數如子產品的打開,關閉,讀取,寫入,通信等,以後會慢慢提及的。
轉載于:https://www.cnblogs.com/shadox/archive/2011/07/28/2119950.html