最近在做wifi數據采集的東西,需要做rt3070的驅動移植,目標板是AM3517的ARM板(cortex-A8的核心)。
中間遇到很多問題。需要准備的東西。rt3070的驅動,linux內核源碼,還有固件。
arm-none-linux-gnueabi-後空格,識別錯誤,command no found
驅動直接在官網下的最新的,是tar.bzip2格式的。以前碰到的都是tar格式的,直接最常用的tar -zxvf ***.tar就可以解壓。這個格式的解壓搜了好一會也沒解壓了。直接用常用的tar -zxvf 解壓不了。網上有說是先用bzip2 -d 解壓,再用tar解壓。但是第一步就不對,說是非bzip格式。最後直接用的舊版本的。後來偶然發現有人建議用 tar -xvf 解壓。OK解決了。查了一下書,發現z代表的是使用gzip來壓縮/解壓縮文件。
Building modules, stage 2.
MODPOST 1 modules
/bin/sh: scripts/mod/modpost: not found
make[2]: *** [__modpost] Error 127
make[1]: *** [modules] Error 2
make scripts 否則提示:MODPOST 1 modules/bin/sh: scripts/mod/modpost: not found
出現這個錯誤你只需要在內核目錄下 make scripts 一下在編譯驅動就行了。
今天終於編譯的差不多了,現在就是加載是固件有問題。先總結一下前面遇到的問題吧,前面遇到的很多編譯錯誤,比如缺少文件,沒有定義的變量,沒有相關的頭文件等等,基本都是內核配置不對產生的問題。
配置無線usb網卡時,你先要配置網絡參數,之後需要配置設備驅動中的無線設備,即使他裡面沒有包含你需要的驅動你至少也要加載一個上去,不然他不會編譯需要的文件,你在編譯驅動是當然也報錯。最後你還需要配置你用的接口,現在用的是usb的,如果你用的pci的,你還需要配置pci的編譯選項。
下面是今天遇到的問題,之前配置已經通過了,但是這次卻不行。重新配置了幾次還是不行,後來看論壇有人說這是沒有用make clean的問題。因為之前編譯通過的文件不會再編譯了,所以可能裡面當時是錯誤的,雖然後面改過編譯選項了,但是這些文件仍然保留,所以還是會報錯。
所以你在改過編譯選項後,記住最好是make clean 一下。
錯誤信息:
error: unknown field ‘private’ specified in initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2225:2: warning: initialization from incompatible pointer type /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2226:2: error: unknown field ‘num_private’ specified in initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2226:2: warning: excess elements in struct initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2226:2: warning: (near initialization for ‘rt28xx_iw_handler_def’) /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227:2: error: unknown field ‘private_args’ specified in initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227:26: warning: excess elements in struct initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227:26: warning: (near initialization for ‘rt28xx_iw_handler_def’) /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228:2: error: unknown field ‘num_private_args’ specified in initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228:2: warning: excess elements in struct initializer /usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228:2: warning: (near initialization for ‘rt28xx_iw_handler_def’) make[2]: *** [/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.o] Error 1 make[1]: *** [_module_/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux] Error 2 make[1]: Leaving directory `/usr/src/linux-3.0.6-gentoo' make: *** [LINUX] Error 2
另外,在編譯驅動前,先要把內核編譯好,不然驅動會沒有版本信息。www.linuxidc.com有以下錯誤 "no symbol version for module_layout"
固件加載不了的問題。
錯誤信息:
rt2870usb 1-1:1.0: firmware: requesting rt2870.bin
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
或者
[root@utu-Linux]\$ ifconfig wlan0 up
rt73usb 1-1:1.0: firmware: requesting rt73.bin
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
ifconfig: SIOCSIFFLAGS: No such file or directory
通常情況下,load firmware的動作是通過用戶空間的hotplug handler,也就是/proc/sys/kernel/hotplug裡設定的執行檔,來完成。root_qtopia默認會在/etc/init.d/rcS裡將/proc/sys/kernel/hotplug設定為/sbin/mdev,即busybox的mdev模塊。它在收到來自內核的請求加載rt73.bin這個firmware消息後,會從/lib/firmware目錄下去找rt73.bin,如果能找到就加載。
解決方法:
文件系統的/etc/init.d/rcS加:
“echo /sbin/mdev > /proc/sys/kernel/hotplug”
這樣一句。
mdev的hotplug模式
1, busybox 添加mdev支持
2, 在/etc/rc.d/rcS中添加
#mount filesystem
/bin/mount -a
#start mdev
echo /sbin/mdev > /proc/sys/kernel/hotplug #設置系統的hotplug程序為mdev mdev –s
/etc/fstab的內容如下:
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
執行mdev -s :以‘-s’為參數調用位於 /sbin目錄寫的mdev(其實是個鏈接,作用是傳遞參數給/bin目錄下的busybox程序並調用它),mdev掃描 /sys/class 和 /sys/block 中所有的類設備目錄,如果在目錄中含有名為“dev”的文件,且文件中包含的是設備號,則mdev就利用這些信息為這個設備在/dev 下創建設備節點文件。一般只在啟動時才執行一次 “mdev -s”。