bcm43436 sdio wifi移植高通平台 android11系统
一.先移植android9上OK的driver代码
- 1.1 编译发生错误. wifi_host->mmc->bus_ops->runtime_suspend , bus_ops 结构体未定义. android9 上此结构体在kernel/include/linux/mmc/core.h里,而在android11上 此部分代码移到了kernel\drivers\mmc\core\core.h里.
include 对应的头文件后,编译通过
二.刷入编译生成的dtbo.img和boot.img. 系统开机直接死机
- 2.1 分析串口log,死机位置
[ 7.984516] sdhci-msm: sdhci_msm_set_carddetect @4703 card_present=0
[ 7.984565] Unable to handle kernel NULL pointer dereference at virtual address 00000030
对应代码位置drivers\mmc\host\sdhci-msm.c
void sdhci_msm_set_carddetect**(bool val)
{
bool card_present = val;
pr_info("sdhci-msm: %s @%d card_present=%d\n", __func__, __LINE__, card_present);
if(card_present) {
wifi_host->mmc->rescan_disable = 0;
if (NULL != wifi_host) {
pr_info("card present trigger mmc_detect_change\n");
mmc_detect_change(wifi_host->mmc, 0);
}
}else{
wifi_host->mmc->rescan_disable = 1;
}
}
此处wifi_host 为NULL, 直接调用 引发了死机. 继续跟踪wifi_host变量
在sdhci_msm_probe中完成初始化并赋值的. 结合log中另外一处错误
[ 4.740249] sdhci_msm_vreg_init_reg: devm_regulator_get(vdd-io) failed. ret=-517
[ 4.747156] sdhci_msm 7864900.sdhci: Regulator setup failed (-517)
/* Setup regulators */
ret = sdhci_msm_vreg_init(&pdev->dev, msm_host->pdata, true);
if (ret) {
dev_err(&pdev->dev, "Regulator setup failed (%d)\n", ret);
goto bus_unregister;
}
在probe函数中此处setup regulators fail, 也导致了mmc driver没有成功加载.
修改dts文件,配置vdd-io为L13A后,能正确设置vdd-io.
mmc driver正常加载了.
三. 系统能正常开机,bcm的驱动也已经正常加载了,但是进入设置打开wifi scan依然失败.
- 3.1继续分析log
02-09 08:22:20.769675 0 0 I : wifi_platform_get_mac_addr
02-09 08:22:20.769708 0 0 I : Can not access wifi mac file : /persist/wifi_nv.bin
02-09 08:22:20.769713 0 0 I dhd_preinit_ioctls: can't get custom MAC address, ret=-14
发现wifi get mac 地址失败,读取文件路径为/persist/wifi_nv.bin.
通过adb shell查看发现没有/persist/wifi_nv.bin路径, 只有/mnt/vendor/persist/wifi_nv.bin路径.
对比android9 正常样机,发现在android9 上是有创建一个链接/perisist 链接到/mnt/vendor/persist路径下.
- 3.2 手动修改代码将mac地址bin文件路径改为/mnt/vendor/persist/wifi_nv.bin, wifi功能正常.
剩下解决android11上没有产生链接路径/persist的问题
四.android11上没有产生链接路径/persist的问题
- 4.1 查看配置文件,device\xx\xx\common-sdm429w[AndroidBoardCommon.mk](androidboardcommon.mk/)
里有如下配置
$(PERSIST_MOUNT_POINT):
@echo "Creating $(PERSIST_MOUNT_POINT)"
ifneq ($(TARGET_MOUNT_POINTS_SYMLINKS),false)
@ln -sf /mnt/vendor/persist $(TARGET_ROOT_OUT)/persist
endif
在android11上TARGET_MOUNT_POINTS_SYMLINKS 此宏为false. 故没有生成/persist链接地址.
- 4.2 TARGET_MOUNT_POINTS_SYMLINKS=true,重新编译.出现编译错误有两处坑
坑一. 编译错误提示
Out of space? Out of inodes? The tree size of /data/work/code/copyofwl/luwl_file/out/soong/.temp/tmpPIeTXO is 1570856960 bytes (1498 MB), with reserved space of 0 bytes (0 MB).
The max image size for filesystem files is 1585115136 bytes (1511 MB), out of a total partition size of 1610612736 bytes (1536 MB).
以为是system 分区大小超了. 于是精简system 分区,删除一些app,结果 错误log size并没有减小,一直是1610612736
坑二. 搜索system size 1610612736,发现是在
BoardConfigCommon.mk:147:BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1610612736 #1536M
中定义的. 于是尝试加大此分区大小. 结果编译依然报错, 此处size加大,报错的system size也变大.
根本原因不是system size超了,被编译log误导了.
- 4.3 继续分析编译log. 有如下错误set_selinux_xattr: No such file or directory searching for label "/persist No such file or directory while configuring the file system loaded 3450 fs_config entries
在sepolicy文件夹下 file.te 添加
typeattribute mnt_vendor_file vendor_persist_type;
file_contexts添加
/persist(/.*)? u:object_r:mnt_vendor_file:s0
相关定义后,编译错误解决. wifi功能正常
至此,wifi driver移植完毕