一、移植環境:
1、主機:Ubuntu 10.10發行版
2、目標機:FS_S5PC100平台
3、交叉編譯工具:arm-cortex_a8-linux-gnueabi
4、wifi模塊:marvell-8686
5、內核:linux-2.6.35
---------------------------------------------------------------------
二、在linux下的移植
1. 平台代碼修改
$ vim driver/mmc/host/sdhci.c
屏蔽以下代碼
629行:
//printK (KERN_WARING "%s: too large timeout requested!\n", mmc_hostname(host_>mmc));
2. 內核驅動支持
因為S5PC100平台上SDIO功能已經支持,所以只需要內核驅動支持marvell-8686即可。
$ make menuconfig
修改:
[*] Networking support ---> [*] Wireless ---> <*> cfg80211 - wireless configuration API {*} common routines for IEEE 802.11 drivers Device Drivers ---> [*] Network device support ---> Wireless LAN ---> <*>Marvell 8xxx Libertas WLAN driver support <*> Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cards Generic Driver Options ---> (sd8686.bin sd8686_helper.bin) External firmware blobs to build into the kernel (firmware) Firmware blobs root directory
3. 內核的修改
wifi的移植依賴於網卡驅動的移植和nand-flash平台的支持,可以參考linux-2.6.35內核移植—網卡驅動的移植和linux-2.6.35內核移植——Nand flash 驅動的移植,文件arch/arm/mach-s5pc100/mach-smdkc100.c下有內核的分區, 把第2個分區改成8M。因為生成的文件系統太大,大於4M。
修改如下(紅色字體部分):
static struct mtd_partition s5pc100_nand_part[] = { [0] = { .name = "bootloader", .size = SZ_1M, .offset = 0, }, [1] = { .name = "kernel", .size = SZ_1M * 4, .offset = MTDPART_OFS_APPEND, }, [2] = { .name = "rootfs", .size = SZ_8M, .offset = MTDPART_OFS_APPEND, }, [3] = { .name = "usrfs", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, }, };
4. 固件准備
將固件sd8686.bin和sd8686_helper.bin拷貝到linux-2.6.35/firmware下。編譯時會自動編譯進內核。
此處兩個文件sd8686.bin和sd8686_helper.bin,我本來想上傳的,可是發現這里好像不能上傳附件,所以就放到csdn上了,大家可以下載使用。
$ cp sd8686.bin linux-2.6.35/firmware/
$ cp sd8686_helper.bin linux-2.6.35/firmware/
$ make zImage
$ sudo cp zImage /tftpboot
---------------------------------------------------------------------
三、文件系統的制作
1. wpa_suppicant的移植
源碼版本選擇:
wpa_supplicant-0.7.3
openssl-0.9.8e
[ openssl移植 ]:
a、補丁安裝
openssl源碼編譯需要打wpa_supplicant提供的補丁,我們選擇的openssl版本為openssl-0.9.8e所以我們需要將wpa_supplicant-0.7.3/patches/openssl-0.9.8e-tls-extensions.patch拷貝到openssl源碼下。
$ cp wpa_supplicant-0.7.3/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8e/
$ cd openssl-0.9.8e $ patch -p1 < openssl-0.9.8e-tls-extensions.patch
注意:-p1,這里是數字“1”.
b、配置編譯安裝
$ ./Configure linux-elf-arm -DL_ENDIAN linux:'arm-cortex_a8-linux-gnueabi-gcc' shared --prefix=/home/linux/workdir/wifi/openssl
打開openssl-0.9.8e中Makefile
$ vim Makefile
修改如下:
- CC= cc + CC= arm-cortex_a8-linux-gnueabi-gcc - AR= ar $(ARFLAGS) r + AR= arm-cortex_a8-linux-gnueabi-ar $(ARFLAGS) r - RANLIB= /usr/bin/ranlib + RANLIB= arm-cortex_a8-linux-gnueabi-ranlib
編譯:
$ make
$ make install
[ wpa_supplicant移植 ]:
在/wpa_supplicant-0.7.3/wpa_supplicant目錄下
$ cd wpa_supplicant-0.7.3/wpa_supplicant
a、Makefile修改
$ vim Makefile
修改
#ifndef CC CC=gcc #endif
為
CC=arm-cortex_a8-linux-gnueabi-gcc //自己的交叉編譯工具鏈
在 CFLAGS += -I../src CFLAGS += -I../src/utils 下添加: CFLAGS += -I/home/linux/workdir/wifi/openssl/include 修改 LIBS += -lssl 為 LIBS += -lssl -L/home/linux/workdir/wifi/openssl/lib/ 修改 LIBS_p += -lcrypto 為 LIBS_p += -lcrypto -L/home/linux/workdir/wifi/openssl/lib/
b、編譯
$ cp deconfig .config
$ make
此處可能出題以下問題:
/usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libssl.so when searching for -lssl
/usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libssl.a when searching for -lssl
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libcrypto.so when searching for -lcrypto
/usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libcrypto.a when searching for -lcrypto
/usr/bin/ld: cannot find -lcrypto
collect2: ld returned 1 exit status
make: *** [wpa_supplicant] Error 1
解決方法如下:
方法1:可能你在修改wpa_supplicant-0.7.3/wpa_supplicant下Makefile的時候,將CC=gcc直接改為CC=arm-cortex_a8-linux-gnueabi-gcc,而沒有按上面方式去掉#ifndef CC和#endif這兩行。
方法2:需要先編譯安裝openssl庫,確保兩個編譯都使用統一工具arm-cortex_a8-linux-gnueabi-gcc,這樣只要把openssl和wpa_supplicant兩個用同一個編譯工具編譯即可。
方法3:如果已經安裝了openssl庫,還出現如上問題,建議更新源,卸載后再裝,如果有文件信賴關系不對,運行命令:sudo apt-get -f install.
注:方法1,親測可行。方法2和3是我在移植的時候出現上面問題,在網上搜到的結果,好像不管用,在此帖出,以供參考。
最后,編譯
$ make
將生產的wpa_supplicant和wpa_cli拷貝到根文件系統的bin目錄下
$ cp wpa_supplicant /source/rootfs/bin
$ cp wpa_cli /source/rootfs/bin
2. 文件系統的制作
此處可參考 llinux文件系統的移植-根文件系統制作和linux文件系統的移植-制作JFFS2文件系統
$ cd /source/rootfs/
a. 在根文件中添加/etc/resolv.conf,域名解析。
$ vim /etc/resolv.conf
內容為:
# Generated by NetworkManager nameserver 192.168.1.1 //你自己的無線路由的DNS nameserver 8.8.8.8 //此行可不寫
b. 在根文件系統/etc下添加wpa_supplicant配置文件wpa_supplicant.conf
$ vim /etc/wpa_supplicant.conf
內容為:
# WPA-PSK/TKIP ctrl_interface=/var/run/wpa_supplicant network={ ssid="XXXX" #無線路由ssid key_mgmt=WPA-PSK proto=WPA pairwise=TKIP group=TKIP psk="XXXXXXXX" #無線路由密碼 }
c. 創建目錄/var/run/wpa_supplicant
$ mkdir /var/run/wpa_supplicant -p
由於2.6.35的內核不支持yaffs文件系統,而cramfs是只讀文件系統,所以選擇了jffs2文件系統,命令如下:
$ mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x20000 --pad=0x600000 -n $ sudo cp rootfs.jffs2 /tftpboot
考慮到最終生成的文件系統比較大(5M多),所以--pad用的600000
---------------------------------------------------------------------
四、測試
1. 移植u-boot
關閉開發板電源,將撥碼開關SW1調至0001(usb啟動模式)后打開電源
a) 加載運行USB Installer_DDR2.bin
USB Port → Transmit → Transmit,選中image目錄下的USB Installer_DDR2.bin
b) 加載運行u-boot-v45.0.bin
USB Port ? Transmit ? Transmit,選中FS_S5PC100光盤v4.5\Linux-Android\image目錄下的u-boot-v45.0.bin
串口終端下能看到如下內容(如果有倒計時數字,按任意鍵出現提示符)
c)設置並保存環境變量
# printenv // 查看環境變量的值並按如下設置 # setenv baudrate 115200 # setenv ethaddr 11:22:33:44:55:66# setenv gatewayip 192.168.1.1 # setenv serverip 192.168.1.237 // serverip要和虛擬機的ip相同 # setenv ipaddr 192.168.1.223 // ipaddr也可以是192.168.1.x其他值 # setenv netmask 255.255.255.0
# saveenv
d) 燒寫u-boot-v45.0.bin到nand flash起始地址
# tftp 20008000 u-boot-v45.0.bin # nand erase 0 40000; # nand write 20008000 0 40000
2. 移植內核
# tftp 20008000 zImage # nand erase 100000 400000 # nand write 20008000 100000 400000
3. 移植jffs2文件系統
# tftp 20008000 rootfs.jffs2 # nand erase 400000 800000 # nand write 20008000 500000 800000
4. 設置啟動參數
# setenv bootdelay 3 # setenv bootcmd nand read 20008000 100000 400000\; bootm 20008000 # setenv bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=jffs2 rw console=ttySAC0,115200 # boot
---------------------------------------------------------------------
五、 WIFI模塊的測試
啟動開發板完成如下操作:
● 配置無線網卡ip
# ifconfig wlan0 192.168.1.200
# ifconfig -a
● 配置默認網關
# route add default gw 192.168.1.1
● 啟動wpa_supplicant連接無線網絡
# wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf
問題:wifi libertas: problem fetching packet from firmware
解決:網上有好多解決方法,但都不適用我的情況,最后換了一個wifi模塊,就好了。大家也可以看看是不是模塊的問題。
注:這是我們在做的時候,是經過反復的排查,最后確認不是程序問題的情況下,才考慮模塊本身是否會有問題的。這里不保證會因為其他程序問題導致以上問題,所以在出現此問題時,最好先確認程序本身的正確性。
● 查看連接狀態
# wpa_cli status
路由器在設置的時候,也要按照上圖中對應的參數進行設置,不然下面會ping不通的。
ping www.youku.com.cn
完成 !
原文鏈接:http://www.cnblogs.com/lr-ting/archive/2012/07/05/2563326.html