Linux設備驅動01

準備: linux

一、英語-是工具 shell

二、電路原理圖-補充「數電」的知識 windows

三、閱讀內核代碼的能力 函數

linux:vi+ctags+cscope 工具

windows:source insight 測試

驅動開發的步驟 ui

I、編輯 .net

模塊的組成: 日誌

一、許可證的聲明,許可證一般使用GPL協議,若是不聲明許可證內核會產生「抱怨」信息,同時內核中的一些遵循GPL協議的功能函數將會沒法使用,形成驅動功能受限。 ip

二、加載函數,初始化模塊,在使用insmod加載驅動模塊時自動調用,該函數必須聲明爲int init_module(void),insmod調用時會自動加載這個函數。

三、卸載函數,恢復函數,在使用rmmod卸載驅動模塊時會自動調用,函數必須聲明爲void cleanup_module(void),rmmod會自動調用這個函數。

完整示例代碼:

hello.c

/**

* 驅動示例程序

* 實現驅動的加載和卸載

*/

//引入相應的頭文件,內核和模塊的頭文件

#include <linux/kernel.h>

#include <linux/module.h>

//聲明許可證信息,也能夠使用這個來聲明許可證

//MODULE_LICENSE("Dual BSD/GPL")

//這表示支持BSD和GPL兩種協議

MOUDLE_LICENSE("GPL");

//insmod自動加載的函數,必須如此聲明

int init_module(void)

{

//內核中打印信息,須要使用printk函數

printk("Hello world!!!");

return 0;

}

//rmmod自動調用的函數,必須如此聲明

void cleanup_module(void)

{

printk("goodbey!!!");

}

保存

II、編譯

使用內核的編譯文件

一、拷貝代碼到內核文件中;

二、修改對應的Kconfig/Makefile文件

三、使用make menuconfig命令選中對應的菜單項,<*>表示編譯進內核,<M>表示編譯成模塊。

四、編譯

make zImage

make modules

前者編譯內核,後者編譯模塊,編譯完成後生成相應的xxx.ko文件。

clip_image002

外部模塊的編譯,上面的方法必需要到內核的源文件中修改Kconfig和Makefile,實際操做中比較複雜,一般咱們會採用這種編譯方法。

使用內核文檔查看編譯的方法,進入Linux內核目錄下的Documentation

使用命令make –C <path-to-kernel> M=`pwd`命令進行編譯,該命令的使用依賴於內核源碼樹,必須針對特定的硬件平臺,而且有編譯過的內核。

clip_image004

其中make -C /lib/modules/3.2.0-29-generic-pae/build M=`pwd`,使用該命令提示錯誤,是由於在當前目錄中缺乏Makefile文件,如今創建Makefile文件輸入如下代碼:

obj-m += hello.o

保存再次編譯

clip_image006

編譯經過。

咱們還能夠經過一個通用的Makefile文件來完成這個步驟

代碼以下:

ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:

$(MAKE) -C $(KERNELDIR) M=$(PWD)

clean:

rm -rvf *.o *.ko *.mod.c module* Module*

.PHONY:modules clean

else

#修改hello.o文件爲本身須要的文件便可

obj-m += hello.o

endif

編譯生成hello.ko模塊

III、測試

一、插入模塊

sudo insmod hello.ko

當前的終端並無顯示輸出的信息,這是由於終端默認會屏蔽掉全部的內核信息,解決方法有:

一、切入物理終端

二、使用dmesg顯示當前的日誌信息

三、vi /var/log/messages顯示日誌信息

clip_image008

二、lsmod列出當前系統動態加載的模塊

三、rmmod hello 卸載模塊,成功卸載的前提是存在/lib/modules/$(shell uname -r)/build目錄

四、modinfo顯示模塊的信息

modinfo hello.ko顯示以下信息:

clip_image010

五、modprobe 模塊名-按依賴關係加載全部的模塊,使用很少。

相關文章
相關標籤/搜索