16 驅動模組引數(支援外部輸入引數)
阿新 • • 發佈:2018-11-25
驅動模組引數(支援外部輸入引數)
模組引數是用於在載入驅動模組時,指定模組裡面的特定變數的具體值。
實現方法步驟:
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