嵌入式linux環境搭建
花了兩天時間,終於搭建好了板子上的linux驅動開發環境,不容易呀,做個筆記。
首先搭建PC上的編譯環境,因為編譯的驅動是在板子上運行的,第一步當然需要安裝交叉編譯器,即arm-none-linux-gnueabi-gcc等或者是arm-linux-gcc等。其實比較簡單,可以從網上下載或者光盤中得到,給出一個網址http://wiki.emsym.com/wiki/%E6%90%AD%E5%BB%BALinux%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83#.E4.BA.A4.E5.8F.89.E7.BC.96.E8.AF.91.E5.B7.A5.E5.85.B7gcc-arm-linux-gnueabi.E5.AE.89.E8.A3.85
對照第一個來就對了,得到編譯器的包后拷貝到/usr/loca/ 解壓縮,關鍵的步驟是設置環境變量,即使其他程序能找到arm gcc,有好幾方式設置環境變量:
(1) 用文本編輯器打開/etc/profile
在最后面加上
ARM_PATH=/usr/local/arm-2009q1/bin/ #(這個是你編譯器的路徑)
PATH=$ARM_PATH/bin:$PATH
export ARM_PATH
需要注銷重新登錄
(2)修改.bashrc文件
這種方法更為安全,它可以把使用這些環境變量的權限控制到用戶級別,如果你需要給某個用戶權限使用這些環境變量,你只需要修改其個人用戶主目錄下的.bashrc文件就可以了。
加的東西和上面一樣
也需要注銷重新登錄,生效。
(3)本人用的是第三種方法
打開/etc/environment 在最后一項添加:/usr/local/arm-2009q1/bin/ 各項間以:分隔,還是注銷重新登錄。
試驗一下,在終端中輸入arm- 然后tab鍵,如果能補全就ok了。
編譯器裝好了,下一步就應該是目標機的庫環境,因為最終驅動是運行在板子上,所以需要有板子的linux內核代碼,構建庫。板子是借同事的TQ2440,從天嵌論壇上下載內核源代碼,放在/usr/src 目錄下解壓后進入代碼目錄,這里需要敲三個命令:
make oldconfig;
make prepare
這個時候可能會提示出錯,找不到arm-linux-gcc, 如果安裝的是arm-none-linux-gnueabi-gcc的話 需要修改內核源碼目錄下的Makefile 中的
CROSS_COMPILE = arm-linux- 改成
CROSS_COMPILE = arm-none-linux-gnueabi 即可。
最后 make scripts/
這樣編譯環境就搭建好了,接下來就是測試一下,把《linux設備驅動程序》中的hello 程序拿來用,修改Makefile
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m := hello.o
else
KERNELDIR ?= /usr/src/linux-2.6.30.4/
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions
紅色標起來的地方就是以前編寫本機驅動需要調庫的路徑,現在改成板上內核源碼路徑。
#make
得到hello.ko
接下來就是要把hello.ko弄到板子上去,有兩種方式一種是通過tftp,另一種是u盤直接拷,我先試的第一種,#ftp 我電腦ip
但是奇怪的是,板子訪問我的win7上的tftp服務器老是被拒絕,搞了一個晚上還沒成功。第二天工作看到vxworks下的wftp32程序,因為vxworks的板子程序是用這個下載的,試着用一下,發現可以,激動了一下,回去就猛上,程序終於下到板子上去了然后 #insmod ./hello.ko 結果老是提示./hello.ko': invalid module,又去網上查了一下,有很多說法,最多的就是編譯環境的版本號可能和板子上運行內核的版本號不一致,但是用uname -a
看了下版本號是一致的呀,找呀找,實在沒辦法,想到看一下日志.在板子上
敲#cat /proc/kmsg 提示Module len 3060 truncated 好像是長度出錯,懷疑ftp傳過來時出錯,查看pc上的文件長度果然比板子上大1,不好辦呀,ftp弄不好,暫時先用u盤拷過去吧,拷到板子上#insmod ./hello.ko 還是有問題提示hello: version magic '2.6.30.4briup mod_unload ARMv4 ' should be '2.6.30.4-EmbedSky mod_unload ARMv4 '
insmod: cannot insert './hello.ko': invalid module format
應該是版本號名字不同,想想應該可以在內核源碼配置中修改,於是又到pc上板子內核源碼目錄下#grep briup ./ -r 果然找到./.config文件中有CONFIG_LOCALVERSION=briup 將其值改成-EmbedSky保存,然后#make oldconfig; #make prepare #make scripts
重新編譯hello.ko,拷到板子上 #insmod ./hello.ko,終於終端顯示
hello: module license 'Dual/GPL' taints kernel.
Disabling lock debugging due to kernel taint
hello,world
Hello,linux
成功了。