linux裝置驅動編寫基礎
Linux裝置驅動編寫基礎
一、linux中的驅動是以模組的形式存在的,這樣就大大提高了驅動的靈活性,linux核心模組的程式結構如下:
l 模組載入函式(必須):module_init()
l 模組解除安裝函式(必須):module_exit()
l 模組許可證宣告(必須):MODULE_LECENSE(“GPL”)
l 模組引數(可選):module_param(a,int,0400)
l 模組到處符號(可選):EXPORT_SYMBOL_GPL(func)
l 模組作者宣告等其他資訊(可選):MODULE_AUTHOR(“name”);
對於模組引數需要使用下面方式進行操作:
module_patam(a,int,04000);
MODULE_PARAM_DESC(a,”description”);
#insmod module.ko a=100
匯出符號的作用:例如一個模組mod1中定義一個函式func1;在另外一個模組mod2中定義一個函式func2,func2呼叫func1。
在模組mod1中,EXPORT_SYMBOL(func1);
在模組mod2中,extern intfunc1();
就可以在mod2中呼叫func1了。
一個例子:
#include<linux/module.h>
#include<linux/moduleparam.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/stat.h>
#defineDRIVER_AUTHOR "Foobar"
#define DRIVER_DESC "A sample driver"
MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_SUPPORTED_DEVICE("TestDevice");
static short intmyshort = 1;
static int myint= 420;
static long intmylong = 9999;
static char*mystring = "blah";
static intarray[2]= {-1, -1};
static intarr_argc = 0;
module_param(myshort, short, 0400);
MODULE_PARM_DESC(myshort, "A short integer");
module_param(myint, int, 0400);
MODULE_PARM_DESC(myint, "An integer");
module_param (mylong,long, 0000);
MODULE_PARM_DESC(mylong, "A long integer");
module_param(mystring, charp, 0000);
MODULE_PARM_DESC(mystring, "A character string");
module_param_array(array, int, &arr_argc, 0000);
//module_param_array(array, int, arr_argc, 0000); //for kernel<2.6.10
MODULE_PARM_DESC(array, "An array of integers");
static int__init hello_2_init (void)
{
int i;
printk (KERN_INFO "myshort is ashort integer: %hd\n", myshort);
printk (KERN_INFO "myint is aninteger: %d\n", myint);
printk (KERN_INFO "mylong is along integer: %ld\n", mylong);
printk (KERN_INFO "mystring is astring: %s\n\n", mystring);
for (i=0; i<arr_argc; i++)
printk (KERN_INFO"array[%d] = %d\n",i, array[i]);
printk (KERN_INFO "Got %darguments in array\n", arr_argc);
return 0;
}
static void__exit hello_2_exit (void)
{
printk (KERN_INFO "hello drivercleaned up\n");
}
module_init(hello_2_init);
module_exit(hello_2_exit);
二、驅動模組的編譯
編譯需注意:核心原始碼路徑必須是配置好的切編譯過的
ifeq($(KERNELRELEASE),)
#KERNELDIR ?=/home/lht/kernel2.6/linux-2.6.14
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shellpwd)
modules:
$(MAKE)-C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE)-C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko*.mod.c .tmp_versions modules* Module*
.PHONY:modules modules_install clean
else
obj-m := hello.o
endif
相關文章
- linux裝置驅動編寫入門Linux
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- Linux驅動之裝置樹的基礎知識Linux
- Linux裝置驅動之字元裝置驅動Linux字元
- 入門文章:教你學會編寫Linux裝置驅動(轉)Linux
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- 深入淺出:Linux裝置驅動之字元裝置驅動Linux字元
- 乾坤合一:Linux裝置驅動之塊裝置驅動Linux
- Windows95的裝置驅動程式的編寫 (轉)Windows
- Linux塊裝置驅動Linux
- 蛻變成蝶:Linux裝置驅動之字元裝置驅動Linux字元
- 蛻變成蝶~Linux裝置驅動之字元裝置驅動Linux字元
- Windows NT 裝置驅動程式開發基礎(1) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(3) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(2) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(4) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(5) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(7) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(6) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(8) (轉)Windows
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- 【linux】驅動-7-平臺裝置驅動Linux
- Linux裝置驅動程式 (轉)Linux
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 乾坤合一:Linux裝置驅動之USB主機和裝置驅動Linux
- Linux驅動開發筆記(一):helloworld驅動原始碼編寫、makefile編寫以及驅動編譯Linux筆記原始碼編譯
- Linux磁碟裝置基礎Linux
- 如何編寫一個簡單的Linux驅動(二)——裝置操作集file_operationsLinux
- 【linux】驅動-6-匯流排-裝置-驅動Linux
- Linux驅動實踐:你知道【字元裝置驅動程式】的兩種寫法嗎?Linux字元
- linux 裝置驅動基本概念Linux
- Linux RN6752 驅動編寫Linux
- Linux裝置驅動探究第1天----spi驅動(1)Linux
- Linux驅動開發筆記(四):裝置驅動介紹、熟悉雜項裝置驅動和ubuntu開發雜項裝置DemoLinux筆記Ubuntu
- Linux 指令碼編寫基礎Linux指令碼
- Linux指令碼編寫基礎Linux指令碼
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux