基於ubuntu-2.6.35內核的SDIO-WiFi驅動移植使其支持WAP

備註:文件系統中褐紅色的是根據自己文件及編譯器修改的

一、移植環境:
        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.binsd8686_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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章