1. 程式人生 > >16 驅動模組引數(支援外部輸入引數)

16 驅動模組引數(支援外部輸入引數)

驅動模組引數(支援外部輸入引數)


模組引數是用於在載入驅動模組時,指定模組裡面的特定變數的具體值。


實現方法步驟:

1.包含標頭檔案:
    #include <linux/moduleparam.h>

2.在驅動原始碼裡定義變數:
    如:static int num = 0;//當載入模組不指定num的值時則為0

3.宣告指定的變數為驅動模組引數:
    module_param(變數名, 型別, 許可權);
        //型別有:byte, int, uint, short, ushort, long, ulong, bool, charp
//許可權:其它使用者所佔的許可權裡不能有寫的許可權(如:0644) 4.寫完程式後,在載入驅動模組時可指定模組引數的具體值: insmod xxx.ko 變數名1=值1 變數名2=值2

載入驅動模組時通過模組引數決定led燈初始時的狀態(xxx.c):

#include <linux/module.h>
#include <linux/init.h>
#include <mach/gpio.h> //晶片io的巨集定義
#include <linux/gpio.h> //io口的呼叫函式
#include <linux/moduleparam.h>
#define LED_GPIO GPIOA(15) //PA15 static int on = 1;//預設為亮,可以通過外面傳參來改變on的值,從而決定LED的亮和滅 module_param(on, int, 0644);//宣告模組引數 static int __init test_init(void) { int ret; ret = gpio_request(LED_GPIO, "myled");//每個io只能被請求一次,可防止多個驅動來控制同一個IO口;如請求失敗,則表示此io口已被其它驅動使用 if(ret < 0) return ret; gpio_direction_output(LED_GPIO, on);//根據外面的引數來決定LED燈的亮和滅
return 0; } static void __exit test_exit(void) { gpio_set_value(LED_GPIO, 0);//LED滅 gpio_free(LED_GPIO);//釋放已請求的io口 } module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL");

Makefile檔案:

obj-m += xxx.o

KSRC := /目錄路徑/orangepi_sdk/source/linux-3.4.112/
export ARCH := arm
export CROSS_COMPILE := arm-linux-gnueabihf-

all : 
    make -C $(KSRC) modules M=`pwd`

.PHONY : clean
clean : 
    make -C $(KSRC) modules clean M=`pwd`

編譯成ko檔案後,可用modinfo檢視到模組引數的資訊:

modinfo xxx.ko

載入驅動模組:

insmod xxx.ko on=1  或者  insmod xxx.ko on=0  或者  insmod xxx.ko