MYD-YA157C系列定制板Wifi模块AP6398S(BCM43598)模块适配笔记(草稿,更新中)

MYD-YA157C系列定制板Wifi模块AP6398S(BCM43598)模块适配笔记(草稿,更新中)

王雨硕 2022.11.18

一、模块简介

AP6398SR3是一个完全无缝的Wi-Fi和蓝牙功能模块,提供漫游能力和先进的安全性,也可以与不同供应商的802.11a/b/g/n/ac交互2x2接入点,采用MIMO标准,双流进可达到867Mbps的速度802.11ac连接无线局域网。此外,AP6398SR3还包括Wi-Fi的SDIO接口,UART/蓝牙PCM接口。此外,这个紧凑的模块是一个结合Wi-Fi + BT技术的整体解决方案。模块是专为平板电脑,OTT box和便携式设备开发的。

AP6398S特性:

  • 无铅设计符合ROHS要求。

  • TX和RX低密度奇偶校验(LDPC)支持范围和功率效率的改善。

  • Dual-stream空间多路复用高达867 Mbps的数据率。

  • 20、40、80 MHz可选的SGI的频道(256 QAM调制)

  • IEEE 802.11 ac / n波束形成。

  • 真正同时双频(RSDB)

  • 支持WLAN 3天线有两个端口,一个蓝牙端口。

  • 支持标准的SDIO v3.0,兼容SDIO v2.0主机接口。

  • BT主机数字接口:

  • HCI UART(高达4mbps)

  • PCM为音频数据

  • 符合蓝牙核心规范版本5.0支持规定的未来规范。与蓝牙类1或Class2发射机操作。

  • 支持扩展的同步连接(能源管理公司),通过允许增强语音质量重传丢失的数据包。

  • 自适应跳频(AFH)减少射频干扰。

 

 

 

 二、适配过程

MYD-YA157C系列定制板,此次我们定制采用了AP6398S模块,WiFi蓝牙二合一芯片,本次仅记录WiFi模块适配过程,WiFi部分通过SDIO接口与Soc进行数据交互。

开发板中使用sdmmc3与WiFi模块进行连接

(1)设备树配置WiFi硬件信息(此处根据开发板厂商文档《MYD-YA157C_Wifi与BT移植笔记》进行配置,以下设备树配置信息均未作修改,因为原厂已对AP6212模块进行适配,通过与相关人员查看原理图得知,AP6398S数据管脚与STM32MP157的管脚对应关系并未改变,所以设备树本人暂未发现可以修改的地方,如果后期需要修改,本博文同步更新)

351 /* Wifi */      /* 此次修改的文件位于/MYIR-SIM32-kernel/myir-st-linux/arch/arm/boot/dts/stm32mp15xx-ya157c.dtsi */
352 &sdmmc3 {
353 arm,primecell-periphid = <0x10153180>;
354 pinctrl-names = "default", "opendrain", "sleep";
355 pinctrl-0 = <&sdmmc3_b4_pins_a>;
356 pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
357 pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
358 non-removable;
359 st,neg-edge;
360 bus-width = <4>;
361 vmmc-supply = <&v3v3>;
362 mmc-pwrseq = <&wifi_pwrseq>;
363 #address-cells = <1>;
364 #size-cells = <0>;
365 keep-power-in-suspend;
366 status = "okay";
367
368 brcmf: bcrmf@1 {
369 reg = <1>;
370 compatible = "brcm,bcm4329-fmac";
371 };
372 }; 

 

检查AP6398S的电源配置(保持原样未做修改):  

/* 此次修改的文件位于/MYIR-SIM32-kernel/myir-st-linux/arch/arm/boot/dts/stm32mp15xx-ya157c.dtsi */

wifi_pwrseq: wifi-pwrseq {
compatible = "mmc-pwrseq-simple";
reset-gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;
};

  

检查管脚配置(保持原样未做修改):

/* 此次修改的文件位于/MYIR-SIM32-kernel/myir-st-linux/arch/arm/boot/dts/stm32mp15-pinctrl.dtsi

sdmmc3_b4_pins_a: sdmmc3-b4-0 { pins1 { pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */ <STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */ <STM32_PINMUX('F', 5, AF9)>, /* SDMMC3_D2 */ <STM32_PINMUX('D', 7, AF10)>, /* SDMMC3_D3 */ <STM32_PINMUX('F', 1, AF9)>; /* SDMMC3_CMD */ slew-rate = <1>; drive-push-pull; bias-pull-up; }; pins2 { pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */ slew-rate = <2>; drive-push-pull; bias-pull-up; }; }; sdmmc3_b4_od_pins_a: sdmmc3-b4-od-0 { pins1 { pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */ <STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */ <STM32_PINMUX('F', 5, AF9)>, /* SDMMC3_D2 */ <STM32_PINMUX('D', 7, AF10)>; /* SDMMC3_D3 */ slew-rate = <1>; drive-push-pull; bias-pull-up; }; pins2 { pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */ slew-rate = <2>; drive-push-pull; bias-pull-up; }; pins3 { pinmux = <STM32_PINMUX('F', 1, AF9)>; /* SDMMC2_CMD */ slew-rate = <1>; drive-open-drain; bias-pull-up; }; }; sdmmc3_b4_sleep_pins_a: sdmmc3-b4-sleep-0 { pins { pinmux = <STM32_PINMUX('F', 0, ANALOG)>, /* SDMMC3_D0 */ <STM32_PINMUX('F', 4, ANALOG)>, /* SDMMC3_D1 */ <STM32_PINMUX('F', 5, ANALOG)>, /* SDMMC3_D2 */ <STM32_PINMUX('D', 7, ANALOG)>, /* SDMMC3_D3 */ <STM32_PINMUX('G', 15, ANALOG)>, /* SDMMC3_CK */ <STM32_PINMUX('F', 1, ANALOG)>; /* SDMMC3_CMD */ }; };

  

(2)配置内核

经查询手册得知,开发板厂商使用的Uboot版本为v2020.01,Kernel版本为v5.4.31,该内核中已包含核心板原生芯片AP6212的驱动,也包含了正基部分AP62XX的驱动,但kernel中并没有包含此次我们需要适配的AP6398S芯片的驱动,

 

 

 因缺少驱动,我在github中找到了适用于BCM4359的bcmdhd驱动,其文件目录结构如下图所示:

 

 

 其简略编译过程如下图:

 

 

 完成以上操作步骤之后,在kernel的make menuconfig中打开了如图所示的相关选项(图片来源网络,实际显示文字与图片有出入,仅做示意,但意思一样),

Networking support->Wireless->cfg80211 - wireless configuration API 配置为<M>

 

 

 

Device Drivers->Network device support->Wireless LAN-> <M> Broadcom FullMAC
WLAN driver

 

 

 

接下来在内核目录中运行make menuconfig确认对应的SDIO WIFI信息

Networking support->Wireless-><M> cfg80211 - wireless configuration API->[*]
enable powersave by default

 

 

Device Drivers->Network device support ->Wireless LAN-> [*] SDIO bus interface
support for FullMAC driver

 

 

接下来进行编译内核生成输出文件更新Uimage与设备树更新内核modules,受限于时间原因具体步骤不再赘述。

将编译生成的文件同步到开发板上,执行sync & reboot后,开机输入命令检查:

root@myir:/# lsmod | grep brcm

  发现输出的结果中并没有预期的brcmfmac驱动,本次适配未成功。于是我转换思路,进行第二次适配。通过查阅国外论坛,在kernel官网(kernel.org)的讨论区,我找到了一篇关于该芯片的讨论“brcmfmac:add support for BCM4359 SDIO chipset”发现较新版本的kernel已对AP6398S的芯片做了适配,新旧版本内核主要针对以下文件做了补充:

 

 于是我对/kernel/drivers/net中的文件进行了替换处理,并补齐了缺少的.h库文件,再次进行编译,同步到开发板后,再次执行lsmod,发现开发板已经成功加载brcmfmac、cfg80211、brcmutil等组件,适配成功。但此时通过ifconfig -a命令查看系统中的网卡,仍无法发现该无线网卡,于是接下来我尝试进行替换固件处理,将下载的固件(目录结构如下图)

 

 改名为下图格式:

 

 尝试重启后,仍然不能使用,此时查询启动日志发现存在如下报错信息(该报错信息与修改固件前一致):

 

posted @ 2022-11-18 18:58  划水程序猿阿硕  阅读(1299)  评论(0)    收藏  举报