一、實驗環境
開發機環境
作業系統: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之開發環境的搭建
這幾天搭建ok6410開發環境可是耗費心智。在這裡我不得不說一下飛凌公司,有些東西不知他們有沒認真測試過,反正是問題一大堆,論壇上的回答大多有沒有建設性,我並不是想批評誰,只是希望你們能為我這樣的菜鳥稍微找一下想,方便大家,就是方便自己。希望貴公司能聽聽我的心聲。好有了支援tftp的uboot這下可...
OK6410之蜂鳴器buzzer字元驅動
夕陽的謝幕,隨之而出的明月,雖然剛剛回過家,但是還是想念,想念大海,想念媽媽燒的菜,也許真的是乙個人久了吧。雙休日,連個說話的人都沒有,只是自己乙個人,悶悶地看著書,寫著blog,天氣太熱,也懶得出去逛。收拾收拾心情,開始繼續ok6410吧。昨天把led燈實現了,今天就玩個蜂鳴器吧,然後那些小的,簡...
linux之GPIO的使用 OK6410
s3c6410的 gpio 引腳相對來說比較多,而且大部分引腳都具有多重複用功能,如何在 linux 上用最簡單的方式來控制 gpio 這需要我們好好研究一下底層的 了,其實方法有很多種,鑑於在作業系統端控制 gpio 並不像控制傳統的微控制器那樣。這裡我將提及一種方法來講述,這種方法也是我至今看到...