高通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模块的全部移植步骤。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)