4124|0

275

帖子

4848

TA的资源

五彩晶圆(初级)

楼主
 

Android移植之WIFI [复制链接]

1. 前言


硬件平台: marvel 310

软件平台: maemo4

内核: 2.6.28 (经过 marvel 的移植)


2. 移植思想

1,

WIFI 模块本身和 cpu 之间的接口;

我们的模块和 cpu 之间的接口是 sdio 的,也就是说必须要先保证 SDIO 本身是工作的;
2,
WIFI 模块本身的上电时序;

模块都有它自己的规律,所以必须要根据 spec 了解它本身的上电过程,严格遵守;
3,
以太网接口的创建;

我们的 WIFI 模块本身是建立在 SDIO 口之上的,而对上都是提供以太网接口的,所以必须要保证这个接口以及创建;
4,
特殊处理;

不同的模块都有它特别的地方,比如我们用的是 8686 compo 也就是说它和蓝牙共用天线,所以需要在初始化的时候做特殊的处理,发送特殊的命令,才能工作;


3. 移植过程

1,
sdio 本身是通过 gpio 口模拟的,所以需要对 gpio 口进行配置


  1.        static mfp_cfg_t littleton_mmc3_pins[] = {
  2.        GPIO7_2_MMC3_DAT0,
  3.        GPIO8_2_MMC3_DAT1,
  4.        GPIO9_2_MMC3_DAT2,
  5.        GPIO10_2_MMC3_DAT3,
  6.        GPIO103_MMC3_CLK,
  7.        GPIO105_MMC3_CMD,
  8.        };
  9.        void pxa3xx_enable_mmc3_pins(void)
  10. {
  11.        pxa3xx_mfp_config(ARRAY_AND_SIZE(littleton_mmc3_pins));
  12. }
  13.        在 littleton_init ()函数里面添加下面这一行:
  14.        pxa3xx_enable_mmc3_pins();
复制代码


2,
wifi 模块本身的初始化

  1. #define MFP_WIFI_V18_ENABLE     (GPIO26_GPIO)
  2. #define MFP_WLAN_RESETN                  (GPIO99_GPIO)
  3. #define WIFI_WAKEUP_HOST          (GPIO104_GPIO) /*error must be changed*/
  4. #define WLAN_ENABLE_PIN          26
  5. #define WLAN_RESET_PIN            99

  6. #define M200_B
  7. #ifdef M200_B
  8. #define BT_RESET_PIN                 EXT1_GPIO(1)
  9. #define BT_RESET_GPIO             (GPIO1_2_GPIO)
  10. #else
  11. #define BT_RESET_GPIO                  (GPIO6_2_GPIO)
  12. #define BT_RESET_PIN                 EXT1_GPIO(6)
  13. #endif

  14. static  mfp_cfg_t lin2008_wifibt_pins[] = {
  15. MFP_WIFI_V18_ENABLE,
  16. MFP_WLAN_RESETN,
  17. WIFI_WAKEUP_HOST,/*wakeup host*/
  18. };
  19. static  mfp_cfg_t lin2008_wifibt_pins2[] = {
  20. MFP_WIFI_V18_ENABLE,
  21. };
  22. static int wifibt_power_status;
  23. int lin2008_poweron_wifibt_board(void)
  24. {
  25.        if (!wifibt_power_status) {
  26.               pxa3xx_mfp_config(ARRAY_AND_SIZE(lin2008_wifibt_pins));
  27.                                 
  28.               gpio_direction_output(WLAN_ENABLE_PIN, 1);
  29.               gpio_direction_output(WLAN_RESET_PIN, 1);
  30.                   gpio_direction_output(BT_RESET_PIN,1);
  31.               mdelay(1);
  32.                   gpio_direction_output(BT_RESET_PIN, 0);
  33.                   gpio_direction_output(WLAN_RESET_PIN, 0);

  34.        // bt need > 5 ms to reset
  35.                   mdelay(5);
  36.                   gpio_direction_output(BT_RESET_PIN, 1);
  37.                   gpio_direction_output(WLAN_RESET_PIN, 1);

  38.               wifibt_power_status++;
  39.               return 0;
  40.        }
  41.        wifibt_power_status++;
  42.        return 1;
  43. }



  44. int lin2008_poweroff_wifibt_board(void)
  45. {
  46.        wifibt_power_status--;
  47.        if (!wifibt_power_status) {
  48.               pxa3xx_mfp_config(ARRAY_AND_SIZE(lin2008_wifibt_pins2));
  49.               gpio_direction_output(WLAN_ENABLE_PIN, 0);
  50.               return 0;
  51.        }
  52.        return 1;
  53. }
复制代码

3,
以太网接口的创建


这里在 android 平台上要做特殊的处理,也就是 firmware 的位置要放好,否则加载 firmware 始终不成功,那么以太网接口就不会被创建了;

需要把 helper_sd.bin 放在 /etc/firmware/ 下面;

sd8686.bin 放在 /etc/firmware/mrvl 下面;
4,
特殊的处理


对于 8686 模块需要做特殊的处理,在注册完以太网接口以后,需要添加下面这段话 :


  1.        {
  2.      #define BCA_CFG_NUM_OF_MODES          4
  3.      #define BCA_CFG_SINGLE_ANT_WITH_COEX      0
  4.      #define BCA_CFG_DUAL_ANT_WITH_COEX    1
  5.      #define BCA_CFG_SINGLE_ANT_FOR_BT_ONLY    2
  6.      #define BCA_CFG_MRVL_DEFAULT          3
  7.   
  8.      #define BCA_CONFIG BCA_CFG_SINGLE_ANT_WITH_COEX
  9.      static u32 BCACfgTbl[BCA_CFG_NUM_OF_MODES][3] = {
  10.        //0xA5F0,     0xA58C,  0xA5A0
  11.        { 0xa027181c, 0x40214, 0xd24d}, //Mode 0: Single ANT with COEX enable
  12.        { 0xa027181c, 0x40211, 0xd24d}, //Mode 1: Dual ANT with COEX enable
  13.        { 0xa027181c, 0x40222, 0xd21c}, //Mode 2: single ANT for BT only
  14.        { 0xa027801d, 0x18000, 0xd21c}, //Mode 3: Marvell default
  15.      };
  16.      
  17.      wlan_offset_value    RegBuffer;     
  18.      
  19.      RegBuffer.offset = (0xA5F0);
  20.      RegBuffer.value  = BCACfgTbl[BCA_CONFIG][0];
  21.       wlan_prepare_cmd(priv,
  22.                      HostCmd_CMD_MAC_REG_ACCESS,
  23.                      HostCmd_ACT_GEN_SET,
  24.                      HostCmd_OPTION_WAITFORRSP,
  25.                      0,&RegBuffer);
  26.   
  27.      RegBuffer.offset =(0xA58C);
  28.      RegBuffer.value  = BCACfgTbl[BCA_CONFIG][1];
  29.      wlan_prepare_cmd(priv,
  30.                      HostCmd_CMD_MAC_REG_ACCESS,
  31.                      HostCmd_ACT_GEN_SET,
  32.                      HostCmd_OPTION_WAITFORRSP,
  33.                      0,&RegBuffer);
  34.   
  35.   
  36.      RegBuffer.offset = (0xA5A0);
  37.      RegBuffer.value  = BCACfgTbl[BCA_CONFIG][2];
  38.      wlan_prepare_cmd(priv,
  39.                      HostCmd_CMD_MAC_REG_ACCESS,
  40.                      HostCmd_ACT_GEN_SET,
  41.                      HostCmd_OPTION_WAITFORRSP,
  42.                      0,&RegBuffer);
复制代码

}
基本上这样就可以工作了;
4.
其它问题



Sdio 口默认是用的 3.2V 这里需要修改相关的地方强制设成是 1.8V ,否则 SDIO 接口将无法工作;

Android 平台上需要移植一些上层软件才能验证,比如 iwconfig iwlist wpa_supplicant 等。

测试步骤:

iwlist mlan0 scan

如果能扫描到 AP 那么证明基本已经 OK 了;

wpa_supplicant -Dwext –imlan0 -c/etc/wpa.conf &

dhcpcd mlan0

这样的话,就可以 ping IP 地址了;

5. 常见问题

1,
WIFI 驱动注册 sdio 驱动的时候出错,也就是 probe 函数未被调用?

需要检查 sdio 设备本身是否被检测到,内核是通过发送特定的命令来检测是 sdio 还是 SD 卡还是 mmc 的,

mmc_rescan 函数里面可以看到 sdio 设备的加载过程,有可能就是你的电压设置不对;
2,
以太网接口一直出不来或者说 firmware 加载失败?

这里需要确保 firmware 是否正确被加载,很可能是它找不到对应的 firmware ,可以通过添加打印信息看看,它的路径到底是在什么地方,对于 wifi 来说 helper_sd.bin 需要放在 /etc/firmware/ 下面,而 sd8686.bin 需要放在 /etc/firmware/mrvl 下面;
3,
一切正常,但是调用 iwlist mlan0 scan 的时候,扫描不到任何结果?

这时候需要做特殊的处理,比如共存代码的设置,是否正常等,通常可以判断有没有中断上来,以此区分到底是模块和 cpu 的连接问题还是模块本身的设置问题;
4,
工作一段时间后不正常

这个有可能是蓝牙模块需要进行初始化,因为它们是共用天线,有时候不起蓝牙模块对应的 40M 时钟就不起来;
6. 后记


作者 :wylhistory

联系方式: wylhistory@gmail.com

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/67984/showart_2113942.html
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表