下面以UCLINUX為例,介紹在一個以模組方式出現的驅動程式test.c基礎之上,將其編譯進核心的一系列步驟:
(1) 改動test.c源帶代碼
第一步,將原來的:
#include
#include
char kernel_version[]=UTS_RELEASE;
改動為:
#ifdef MODULE
#include
#include
char kernel_version[]=UTS_RELEASE;
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
第二步,建立函數int init_test(void)
將裝置註冊寫在此處:
result=register_chrdev(254,"test",&test_fops);
(2)將test.c複製到/uclinux/linux/drivers/char目錄下,並且在/uclinux/linux/drivers/char目錄下mem.c中,int chr_dev_init( )函數中增加如下代碼:
#ifdef CONFIG_TESTDRIVE
init_test();
#endif
(3) 在/uclinux/linux/drivers/char目錄下Makefile中增加如下代碼:
ifeq($(CONFIG_TESTDRIVE),y)
L_OBJS+=test.o
Endif
(4)在/uclinux/linux/arch/m68knommu目錄下config.in中字元裝置段裡增加如下代碼:
bool 'support for testdrive' CONFIG_TESTDRIVE y
(5) 運行make menuconfig(在menuconfig的字元裝置選項裡你可以看見我們剛剛添加的'support for testdrive'選項,並且已經被選中);make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。
(6) 在 /uclinux/romdisk/romdisk/dev/目錄下建立裝置:
mknod test c 254 0
並且在/uclinux/appsrc/下運行make,產生新的Romdisk.s19檔案。
到這裡,在UCLINUX中增加裝置驅動程式的工作可以說是完成了,只要將新的linux.bin與Romdisk.s19燒入目標板中,你就可以使用自己的新裝置test了。
當然,還可以使用模組的方法.把新驅動編譯成一個模組.使用make menuconfi類的命令.添進核心裡面.重新編譯或手動載入模組.lsmod rmod insmod溫習溫習一切都快忘了喲
linux核心驅動模組載入方式
2009-02-05 10:37
|
linux核心驅動模組載入方式 在類unix作業系統中,驅動載入方式一般分為:動態載入和靜態載入,下面分別對其詳細論述。 一、動態載入 動態載入是將驅動模組載入到核心中,而不能放入/lib/modules/下。 在2.4核心中,載入驅動命令為:insmod ,刪除模組為:rmmod; 在2.6以上核心中,除了insmod與rmmod外,載入命令還有modprobe; insmod與modprobe不同之處: insmod 絕對路徑/××.o,而modprobe ××即可,不用加.ko或.o尾碼,也不用加路徑;最重要的一點是:modprobe同時會載入當前模組所依賴的其它模組; lsmod查看當前載入到核心中的所有驅動模組,同時提供其它一些資訊,比如其它模組是否在使用另一個模組。 二、靜態載入 (一)概念 在執行make menuconfig命令進行核心配置裁剪時,在視窗中可以選擇是否編譯入核心,還是放入/lib/modules/下相應核心版本目錄中,還是不選。 (二)操作步驟 linux裝置一般分為:字元裝置、塊裝置和網路裝置,每種裝置在核心原始碼分類樹drivers/下都有對應的目錄,其載入方法類似,以下以字元裝置靜態載入為例,假設驅動程式原始碼名為ledc.c,具體操作步驟如下: 第一步:將ledc.c來源程式放入核心源碼drivers/char/下; 第二步:修改drivers/char/Config.in檔案,具體修改如下: 按照開啟檔案中的格式添加即可; 在檔案的適當位置(這個位置隨便都可以,但這個位置決定其在make menuconfig視窗中所在位置)加入以下任一段代碼: tristate 'LedDriver' CONFIG_LEDC if [ "$CONFIG_LEDC" = "y" ];then bool ' Support for led on h9200 board' CONFIG_LEDC_CONSOLE fi 說明:以上代碼使用tristate來定義一個宏,表示此驅動可以直接編譯至核心(用*選擇),也可以編製至/lib/modules/下(用M選擇),或者不編譯(不選)。 bool 'LedDriver' CONFIG_LEDC if [ "$CONFIG_LEDC" = "y" ];then bool ' Support for led on h9200 board' CONFIG_LEDC_CONSOLE fi 說明:以上代碼使用tristate來定義一個宏,表示此驅動只能直接編譯至核心(用*選擇)或者不編譯(不選),不能編製至/lib/modules/下(用M選擇)。 第三步:修改drivers/char/Makefile檔案 在適當位置加入下面一行代碼: obj-$(CONFIG_LEDC) += ledc.o 或者在obj-y一行中加入ledc.o,如: obj-y += ledc.o mem.o 後面不變; OK,經過以上的設定就可以在執行make menuconfig命令後的視窗中的character devices---> 中進行選擇配置了。選擇後重新編譯就ok了。 |
|
|
|
複製搜尋
複製搜尋