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命令查看系统中的网卡,仍无法发现该无线网卡,于是接下来我尝试进行替换固件处理,将下载的固件(目录结构如下图)

改名为下图格式:

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


浙公网安备 33010602011771号