提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
文章目录
前言
刚入职两周不到,接到移植wifi驱动的工作,之前从来没有接触过wifi驱动,看了一周没什么成果,同事没给出太多建设性意见,厂家技术支持也不给力,一个人硬啃效率太低了。
平台:amlogic
soc:a311d
wifi模组:aw3155(sdio接口)
一、Android的wifi框架简介
参考博客:
Android sdio_wifi架构
wifi详解(一)
wifi详解(二)
wifi详解(三)
wifi详解(四)
wifi详解(五)
Wifi模块全总结
1. wifi驱动启动流程
1)wifi芯片上电:
common\drivers\amlogic\wifi\wifi_dt.c中注册的平台驱动会解析DTS中关于上电管脚、中断管脚等资源,然后将管脚拉高,完成wifi芯片上电,我的VDDIO是1.8V;
2)扫描sdio card:
common\drivers\amlogic\mmc\aml_sd_emmc.c中注册的平台驱动会解析DTS中f_min、f_max等资源,然后调用mmc_alloc_host开始扫卡,扫描sdio card成功则创建一个sdio设备,在/sys/bus/sdio/devices/下生成节点;
3)加载aml_sdio.ko:
加载sdio的驱动,这是厂家给的驱动代码,加载的sdio_driver会和扫卡生成的sdio_device匹配,规则是vid、pid能够匹配上,然后进入probe中开始一些初始化工作;
4)加载vlsicomm.ko:
加载wifi驱动,这也是厂家给的驱动代码,
5)加载firmware:
6)启动wpa_supplicant:
二、wifi驱动代码编译进内核
之前都是手动编译,手动加载驱动,现在修改Android的编译脚本,实现编译源码时自动编译wifi驱动,开发板启动后自动加载驱动模块;
wifi_driver.mk:(用于自动编译目标文件下的驱动代码,并将ko文件拷贝出来)
+define aw3155-sdio-wifi
+ @echo "make aw3155 sdio wifi driver"
+ $(MAKE) -C $(shell pwd)/$(PRODUCT_OUT)/obj/KERNEL_OBJ M=$(shell pwd)/hardware/wifi/amlogic/a311d/vmac CONFIG_DHD_USE_STATIC_BUF=n CONFIG_BCMDHD_SDIO=n \
+ ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
+ cp $(shell pwd)/hardware/wifi/amlogic/a311d/vmac/vlsicomm.ko $(TARGET_OUT)/
+endef
multiwifi:
@echo "make wifi module KERNEL_ARCH is $(KERNEL_ARCH)"
mkdir -p $(TARGET_OUT)/
+ $(aw3155-sdio-wifi)
wifi_modules.mk:
######################################################################################## multiwifi
ifeq ($(WIFI_MODULE),multiwifi)
DEFAULT_WIFI_KERNEL_MODULES := \
+ $(PRODUCT_OUT)/obj/lib_vendor/vlsicomm.ko \
init.amlogic.wifi_buildin.rc:(启动脚本里自动加载驱动模块)
on boot
insmod /vendor/lib/modules/vlsicomm.ko
三、DTS配置
DTS配置:
wifi{
compatible = "amlogic, aml_wifi";
dev_name = "aml_wifi";
status = "okay";
interrupt_pin = <&gpio GPIOX_7 GPIO_ACTIVE_HIGH>;
irq_trigger_type = "GPIO_IRQ_LOW";
power_on_pin = <&gpio GPIOX_6 GPIO_ACTIVE_HIGH>;
dhd_static_buf;
pinctrl-names = "default";
pinctrl-0 = <&pwm_e_pins>;
pwm_config = <&wifi_pwm_conf>;
};
wifi_pwm_conf:wifi_pwm_conf{
pwm_channel1_conf {
pwms = <&pwm_ef MESON_PWM_0 30541 0>;
duty-cycle = <15270>;
times = <10>;
};
pwm_channel2_conf {
pwms = <&pwm_ef MESON_PWM_2 30500 0>;
duty-cycle = <15250>;
times = <12>;
};
};
sd_emmc_a:sdio@ffe03000 {
status = "disabled";
compatible = "amlogic, meson-mmc-g12b";
reg = <0xffe03000 0x800>;
interrupts = <0 189 4>;
pinctrl-names = "sdio_all_pins",
"sdio_clk_cmd_pins"