Android驱动——WiFi驱动移植

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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"
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值