bcm43436 sdio wifi移植高通平台 android11系统

513 阅读3分钟

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的问题

里有如下配置

$(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移植完毕