「手把手教你學linux驅動開發」ok6410系列之01---模組程式設計
一、實驗環境
開發機環境
作業系統:ubuntu 9.10
交叉編譯環境:arm-linux-gcc 4.2.2 ,安裝位置 /usr/local/arm/4.3.2/
6410板子核心原始碼路徑:/work/linux-2.6.36.2-v1.05/
目標板環境:ok6410-a linux2.6.36
二、實驗原理
模組時在核心空間執行的,模組中不能使用glibc庫中的函式。
模組可以動態的裝載到核心中。
三、實驗步驟
注意:最好使用root使用者進行以下實驗,否則需要利用sudo
1、驗證交叉編譯工具配置正確。安裝交叉編譯器的步驟見《ok6410-a開發板linux2.6.36使用者手冊.pdf》5-5小節。
#arm-linux-gcc -v
輸入命令後,如果顯示以上資訊,則表示開發環境正確。否則需要將arm-linux-gcc所在的路徑加入到path中。方法如下:
# vi /etc/profile
view plain
copy to clipboard
print?
path=/usr/local/arm/4.3.2/bin:$path
export path
輸入以下命令使配置生效。
#source /etc/profile
2、編寫模組原始檔
#vi test.c
view plain
copy to clipboard
print?
#include
#include
#include
static int __init hello_init(void)
static void __exit hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
module_license("dual bsd/gpl");
**解釋:
static int __init hello_init(void)
static void __exit hello_exit(void)
– static宣告,因為這種函式在特定檔案之外沒有其它意義
– __init標記
表明該函式只在初始化期間使用。
模組裝載後,將該函式占用的記憶體空間釋放
– __exit標記
該**僅用於模組解除安裝。
printk 核心函式,列印資訊,類似於使用者空間glibc庫中的printf,注意在核心中不能使用glibc庫中的函式。
module_init(hello_init);
module_exit(hello_exit);
–巨集:module_init/module_exit
–宣告模組初始化及清除函式所在的位置
–裝載和解除安裝模組時,核心可以自動找到相應的函式
3、編寫makefile檔案
#vi makefile
view plain
copy to clipboard
print?
obj-m := test.o
kdir :=/work/linux-2.6.36.2-v1.05/
all:
make -c $(kdir) m=$(shell pwd) modules
clean:
make -c $(kdir) m=$(shell pwd) clean
注意:
4、編譯模組
在work/lab/test01/目錄下輸入make命令。
#make
成功後會生成 test.ko檔案。這個就是我們需要的模組檔案,其他的都是中間的臨時檔案。
檢視一下test.ko檔案資訊,可以看出是基於arm平台的目標檔案。
#file test.ko
可能出錯原因
注意:由於編譯模組時需要使用核心中的一些依賴檔案,因此需要確保在核心原始碼中那些檔案存在。
如果上面的編譯有錯誤,我們需要在核心原始碼根目錄下(/work/linux-2.6.36.2-v1.05/)執行以下命令
#make oldconfig && make prepare && make scripts
5、測試模組
在開發板上進行模組的裝載與解除安裝操作。
(1)裝載模組
# insmod /lib/modules/2.6.36.2/test.ko
(2)檢視模組列表
#lsmod
(3)解除安裝模組
#rmmod test
執行結果如下圖:
OK6410系列之01 模組程式設計
一 實驗環境 開發機環境 作業系統 ubuntu 9.10 交叉編譯環境 arm linux gcc 4.2.2 安裝位置 usr local arm 4.3.2 6410板子核心原始碼路徑 work linux 2.6.36.2 v1.05 目標板環境 ok6410 a linux2.6.36 二...
Tiny 6410 Led 驅動模組載入(五)
為安卓驅動做準備,先熟悉linux下的驅動。1.重新編譯核心 去掉核心對led驅動的支援,make menuconfig arch arm cross compile arm linux 配置 device drivers characterdevices led support for mini6...
ok6410使用ov7670模組配置方法
需使用ok6410官方的ov9650 cmos模組,去掉ov9650換成ov7670,注意 1.ov7670模組管腳定義必須和ov9650一致 2.飛凌提供的ov9650規格書管腳1和24順序錯誤 開始配置 1.修改ov7670的i2c位址為0x21,i2c board info ov965x 0x...