碰到一個問我怎麼寫驅動的師弟,其實我也不懂,更不懂怎麼和他說了。要學的還有很多,具體的驅動架構需要他去看了,理解核心機制我也需要抽時間去琢磨。由於前面做過,就整理一下前面做過的文檔,從頭到尾示範一下,步驟而已,簡單的說,就是操作示範,至於調試啊,那是代碼的事情了。直接貼出以前的文檔如下:
********************************************************
由於近段時間還要繼續創新實驗項目,這個不是很喜歡做,哎,一言難盡。還好,我可以搞USB模組。不說了,說說我的開發板吧。今天拿起,啟動不得,一陣子沒摸她,倒是給我發脾氣了。沒有供電,還以為電源壞了。後來一查,按鈕開關壞了。小CASE,換好,今晚,跑跑板。
系統配置:
虛擬機器上,作業系統是Fedora9,核心看看。
#uname -r
2.6.25-14.fc9.i686
開發板FL2440:
# uname -r
2.6.12-h1940
首先,到虛擬機器上確定兩個編譯器,gcc和arm-linux-gcc。
# gcc -v 然後就跟著就出來了,
gcc 版本 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC)
______________________________________________________
| 使用toolchain的開發方式,我當時使用的是別人做好的交叉編譯器,解壓後,直接到配置文
| 件夾下配置
| #cd /etc
| 把編譯器路徑告訴核心,這叫做環境變數設定,即在bashrc中的後面加入
| export PATH=/usr/local/arm/3.4.1/bin:$PATH
_______________________________________________________
所以, 這裡就可以這樣繼續看交叉編譯器了
# arm-linux-gcc
gcc version 3.4.1
其次,目的:寫個流水燈的驅動,其實就是寫個對led的操作罷了。命名led.c
具體板子具體分析,這就不貼出來了,接下來,寫個很簡單的Makefile,貼碼如下:
—————————————————————————————————————
ARCH= arm # 說明平台
MVTOOL_PREFIX = /usr/local/arm/3.4.1/bin/arm-linux- #指定編譯器,本機或者交叉編譯器:絕對路徑
CROSS_COMPILE= $(MVTOOL_PREFIX)
KDIR := /usr/src/linux-2.6.12 #告訴使用的核心編譯
EXEC = led #檔案名稱
obj-m := led.o #-m編譯成模組,注意參數 -y -名稱
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
—————————————————————————————————————
#mkdir led //建個檔案夾,將led.c和makefile這兩個源檔案cp過來,很簡單了。
#make
#ls
led.c led.mod.c led.o led.ko led.mod.o
看見了吧,make給幹了很過工作,結果完成任務是帶給我led.ko和其他的咚咚(中間檔案),
看準了,led.ko是所需模組(2.4核心以前是.o檔案),其他都不用關注。虛擬機器和本機設定了共
享,所以我直接拷貝過來,通過UART發送到FL2440,然後在板子操作
#insmod led.ko //insmod 會調用module_init,這個放心
最後,驅動一切都弄好了,寫個測試程式看看吧!這裡貼出ledshow.c
————————————————————————————————————
#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"
int main(void)
{
int on=1;
int led;
int fd;
fd=open("/dev/led",0);
if(fd<0)
{
perror("open device led");
exit(1);
}
printf("leds test show,press ctrl+c to exit /n");
while(1)
{
for(led=0;led<4;led++)
{
ioctl(fd,on,led);
usleep(50000);
}
on=!on;
}
close(fd);
return 0;
}
——————————————————————————————————————
同樣,我拷貝到led檔案夾下,這個很簡單了,不用寫makefile或用自動產生makefile檔案了。文
件這麼少,我們就省事點吧,花最少的時間完成最多的動作嘛。呵呵
#arm-linux-gcc -o ledshow ledshow.c //交叉編譯器設定好,就是方便
#ls
led.c led.mod.c led.o ledshow.c
led.ko led.mod.o ledshow Makefile
程式出爐了,將測試程式ledshow通過串口傳到開發板上。然後,
#chmod +x ledshow //修改一下檔案許可權,可讀可寫可執行去。
#./ledshow
結果,OK!(開發板只有我看見哈哈)
對了,說明,我的核心源碼樹是在/usr/src/linux-2.6.12,隨便在任意目錄下幹像上面的事情,
得在源碼樹頂層目下配置過核心,編譯一下就好,否則好像會出錯,還沒研究怎麼回事。