zoukankan      html  css  js  c++  java
  • 基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植


    一、移植环境:
            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!
    ", 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.5Linux-Androidimage目录下的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

    完成 !

  • 相关阅读:
    mysql自定义函数多表更新:update_order_relation()
    mysql自定义函数初始化数据:init_data()
    关于tomcat启动错误:At least one JAR was scanned for TLDs yet contained no TLDs
    intellij debug模式提示 Method breakpoints may dramatically slow down debugging
    Linux开机启动流程详细步骤是什么?
    chkconfig 添加脚本开机自启动
    优化SSH配置(一键完成增加若干参数)
    linux目录整理
    linux命令整理
    buffer和cache有什么区别?
  • 原文地址:https://www.cnblogs.com/muhuacat/p/5708474.html
Copyright © 2011-2022 走看看