高通Android wifi驱动移植-SDIO

 

android wifi驱动流程,高通Android wifi驱动移植-SDIO

https://blog.csdn.net/weixin_39727336/article/details/117470153

 

环境用的是android2.3系统,wifi是BCM4329,接口是SDIO,Android4.0在步骤上略有不同。

1.首先了解SDIO的一些相关知识:

SDIO有两端,其中一端是HOST端,另一端是device端.所有的通信都是由HOST端发送命令开始的,Device端只要能解析命令,就可以相互通信。​

CLK信号: HOST给DEVICE 的时钟信号,每个时钟周期传输一个命令 。

CMD信号:双向的信号,用于传送 命令 和

反应 。

DAT0-DAT3 信号:四条用于传送的数据线。​

​2.然后看原理图知道WIFI模块与CPU连接的引脚信息

CLK

----------62

CMD

----------63​

DATA0

---------67

DATA1​ ----------66

DATA2​

--------- 65

DATA3  --------- 64

WL_WAKE_UP​​ -------- GPIO19

WIFI模块的唤醒引脚

​WL_RST

-------- GPIO39

WIFI模块的重置引脚

3.下面进入BCM4329的移植步骤

(1)把驱动目录BCM4329放到kernel/drivers/net/wireless下

(2)修改/device/qcom/msmxxxx_surf/BoardConfig.mk

添加WIFI模块的扳级配置信息:

BOARD_WPA_SUPPLICANT_DRIVER := WEXT

//wpa_supplicant的版本信息

WPA_SUPPLICANT_VERSION := VER_0_6_X//wpa_supplicant的版本信息

BOARD_WLAN_DEVICE := bcm4329//驱动名称,多在android.mk中使用的宏

WIFI_DRIVER_MODULE_PATH :=

"/system/lib/modules/bcm4329.ko"//驱动模块位置

WIFI_DRIVER_MODULE_NAME :=

"bcm4329"//驱动模块名字

WIFI_DRIVER_FW_STA_PATH

:= "/system/etc/firmware/sdio.bin"//STA固件位置

WIFI_DRIVER_FW_AP_PATH

:=

"/system/etc/firmware/sdio_apsta.bin"//AP固件位置,作为WIFI热点时会用到

WIFI_DRIVER_MODULE_ARG

:="firmware_path=/system/etc/firmware/sdio.bin

nvram_path=/etc/wifi/nvram.txt"//insmod的传参,没有的话驱动起不来。

(3)修改kernel/arch/arm/configs/xxxx_defconf

打开或者添加配置文件信息:

CONFIG_BCM4329=m

(4)修改​kernel/arch/arm/mach-msm/board-xxxx.c

配置驱动:

......​

#if defined

(CONFIG_BCM4329) ||defined(CONFIG_BCM4329_MODULE)

#include

#include

#include

#endif

......

#if defined (CONFIG_BCM4329)

||defined(CONFIG_BCM4329_MODULE)

#define   WIFI_PD_RST

39  //重置引脚

#define   GPIO_WIFI_IRQ

19//唤醒引脚

static int wifi_cd =

0;

static int wifi_power_state;

static int wifi_reset_state;

......

static  void

wifi_power_enable(int

enable)//配置wifi引脚并上电

{

......

}

static int wifi_set_carddetect(int

val)//检测wifi状态

{

......

}

static int wifi_power(int on)//给wifi模块上电并检查状态

{

pr_info("%s:wifi  power  down

%d\n", __func__,

on);

wifi_power_enable(on);

mdelay(200);

wifi_power_state= on;

return0;

}

static int wifi_reset(int on)//wifi重置

{

pr_info("%s:do nothing\n", __func__);

wifi_reset_state= on;

return0;

}

......

static struct wifi_platform_data wifi_control =

{//platform_device的数据结构体,被platform_device调用

.set_power

= wifi_power,

.set_reset

=wifi_reset,

.set_carddetect= wifi_set_carddetect,

.mem_prealloc

= wifi_mem_prealloc,

};

static struct resource wifi_resources[] =

{

[0]= {//定义IO端口资源范围

.name

= "bcm4329_wlan_irq",

.start

=MSM_GPIO_TO_INT(GPIO_WIFI_IRQ),

.end

= MSM_GPIO_TO_INT(GPIO_WIFI_IRQ),

.flags

= IORESOURCE_IRQ |IORESOURCE_IRQ_HIGHLEVEL,

},

};

static struct platform_device

msm_wifi_device =

{//platform_device结构起,用来描述

.name

="bcm4329_wlan",

.id

= 1,

.num_resources

=ARRAY_SIZE(wifi_resources),

.resource

=

wifi_resources,

.dev

= {

.platform_data =&wifi_control,

},

};

......​

static void __init wifi_init(void)//初始化和注册设备驱动

{

init_wifi_mem();

platform_device_register(&msm_wifi_device);

}

#endif

......

在初始化结构体中加入wifi_init函数

static void __init

msmxxxx_init(void)

{

......

wifi_init();

}​​

(5)检查CMD、CLK、DATA0-DATA3配置是否正确

在​kernel/arch/arm/configs/xxxx_defconf下找到

static struct msm_gpio

sdc2_cfg_data[] = {

{GPIO_CFG(64, 1, GPIO_CFG_OUTPUT,

GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "sdc2_clk"},

{GPIO_CFG(65, 1, GPIO_CFG_OUTPUT,

GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_cmd"},

{GPIO_CFG(66, 1, GPIO_CFG_OUTPUT,

GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_3"},

{GPIO_CFG(67, 1, GPIO_CFG_OUTPUT,

GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_2"},

{GPIO_CFG(68, 1, GPIO_CFG_OUTPUT,

GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_1"},

{GPIO_CFG(69, 1, GPIO_CFG_OUTPUT,

GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_0"},

是否是SDC2需要配合原理图确定。​

(6)修改libhardware_legacy/wifi/Wifi.c文件

#define

WIFI_DRIVER_MODULE_PATH

"/system/lib/modules/bcm4329.ko"//模块路径

#define

WIFI_DRIVER_MODULE_NAME

"bcm4329"//模块名称

#ifndef WIFI_DRIVER_MODULE_ARG

#define

WIFI_DRIVER_MODULE_ARG

"firmware_path=/etc/firmware/sdio.bin

nvram_path=/etc/wifi/nvram.txt"//模块参数

#define

WIFI_FIRMWARE_LOADER

""

#define

WIFI_TEST_INTERFACE

"wlan0"//接口名称

......​

(7)修改frameworks/base/core/res/res/values/config.xml文件

string-arraytranslatable="false"

name="config_tether_wifi_regexs">

<item>"wl0.*"</item>//修改wlan0为wl0.*

string-array>

(8)修改frameworks/base/services/java/com/android/server/wifiservice.java文件

private static fina String SOFTAP_IFACE =

"wl0.1";//android4.0可能不在这个文件中,但是可以查找SOFTAP_IFACE然后进行修改。

以上为WIFI模块的全部移植步骤。

posted @   blankjyn  阅读(1103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示