android-AP6212配置

2024-06-01 22:36
文章标签 配置 android ap6212

本文主要是介绍android-AP6212配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、调试背景

硬件平台a33
系统android
wifi:ap6212a
从内核日志看到模块能加载识别到fw_bcm43438a1.bin ,但是nvram加载的配置是nvram_ap6212.txt,虽然能正常工作,但是对比了一下nvram_ap6212.txt 和nvram_ap6212a.txt还是有差异的
内核日志:

[   26.488791] [dhd] sdioh_attach: set sd_f2_blocksize 256
[   26.494959] [dhd] sdioh_attach: sd clock rate = 50000000
[   26.501230] [dhd] dhdsdio_probe : no mutex held
[   26.506381] [dhd] dhdsdio_probe : set mutex lock
[   26.511786] [dhd] F1 signature read @0x18000000=0x1541a9a6
[   26.520666] [dhd] F1 signature OK, socitype:0x1 chip:0xa9a6 rev:0x1 pkg:0x4
[   26.529455] [dhd] DHD: dongle ram size is set to 524288(orig 524288) at 0x0
[   26.538303] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 7, size 26016
[   26.546243] [dhd] dhd_conf_set_chiprev : devid=0xa9a6, chip=0xa9a6, chiprev=1
[   26.554445] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 0, size 10320
[   26.564263] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 5, size 65536
[   26.574767] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 19, size 65652
[   26.582815] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 20, size 262144
[   26.591063] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 22, size 65536
[   26.599175] [dhd] dhd_attach(): thread:dhd_watchdog_thread:8a4 started
[   26.606930] [dhd] dhd_attach(): thread:dhd_dpc:8a5 started
[   26.613481] [dhd] dhd_attach(): thread:dhd_rxf:8aa started
[   26.619645] [dhd] dhd_deferred_work_init: work queue initialized
[   26.626464] [dhd] dhd_tcpack_suppress_set: TCP ACK Suppress mode 0 -> mode 2
[   26.634387] [dhd] dhd_tcpack_suppress_set: TCPACK_INFO_MAXNUM=4, TCPDATA_INFO_MAXNUM=4
[   26.643438] [dhd] sdioh_cis_read: func_cis_ptr[0]=0x1070
[   26.661258] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 1, size 10300
[   26.669071] [dhd] STATIC-MSG) dhd_wlan_mem_prealloc : section 2, size 65536
[   26.677001] [dhd] dhdsdio_probe_init: making DHD_BUS_DOWN
[   26.683472] [dhd] wifi_platform_get_mac_addr
[   26.688517] audit: type=1400 audit(1716882474.400:377): avc:  denied  { read } for  pid=1588 comm="android.hardwar" name="aura_mac.txt" dev="mmcblk0p11" ino=9 scontext=u:r:hal_wifi_default:s0 tcontext=u:object_r:vfat:s0 tclass=file permissive=1
[   26.712797] audit: type=1400 audit(1716882474.423:378): avc:  denied  { open } for  pid=1588 comm="android.hardwar" path="/private/ULI/factory/aura_mac.txt" dev="mmcblk0p11" ino=9 scontext=u:r:hal_wifi_default:s0 tcontext=u:object_r:vfat:s0 tclass=file permissive=1
[   26.739466] [dhd] Dongle Host Driver, version 101.10.361.33 (wlan=r892223-20230607-2)\x0adrivers/net/wireless/bcmdhd compiled on May  9 2024 at 14:10:01\x0a
[   26.761310] [dhd] Register interface [wlan0]  MAC: 04:c2:9b:0b:be:9d\x0a
[   26.772027] [dhd] [wlan0] wl_android_wifi_off : in g_wifi_on=1, on_failure=1
[   26.784655] [dhd] dhd_bus_devreset: == Power OFF ==
[   26.792231] [dhd] dhd_bus_stop: making DHD_BUS_DOWN
[   26.797832] [dhd] dhd_bus_devreset: making dhdpub up FALSE
[   26.804995] [dhd] dhd_txglom_enable: enable 0
[   26.809972] [dhd] dhd_bus_devreset: making DHD_BUS_DOWN
[   26.816260] [dhd] wifi_platform_set_power = 0, delay: 0 msec
[   26.822672] [dhd] ======== PULL WL_REG_ON(-1) LOW! ========
[   26.829514] [dhd] [wlan0] wl_android_wifi_off : out
[   26.835053] [dhd] dhdsdio_probe : mutex is released.
[   26.841396] [dhd] _dhd_module_init: Exit err=0
[   26.852181] [dhd] dhd_pri_open : no mutex held
[   26.857224] [dhd] dhd_pri_open : set mutex lock
[   26.862395] [dhd] [wlan0] dhd_open : Enter
[   26.867128] [dhd] Dongle Host Driver, version 101.10.361.33 (wlan=r892223-20230607-2)\x0adrivers/net/wireless/bcmdhd compiled on May  9 2024 at 14:10:01\x0a
[   26.885342] [dhd] dhd_open: ######### called for ifidx=0 #########
[   26.892307] [dhd] [wlan0] wl_android_wifi_on : in g_wifi_on=0
[   26.898820] [dhd] wifi_platform_set_power = 1, delay: 200 msec
[   26.905426] [dhd] ======== PULL WL_REG_ON(-1) HIGH! ========
[   26.912109] sunxi-wlan soc@1c00000:wlan: check wlan wlan_power voltage: 3300000
[   26.920610] sunxi-wlan soc@1c00000:wlan: check wlan io_regulator voltage: 3300000
[   27.254520] [dhd] sdio_sw_reset: call mmc_hw_reset
[   27.260004] sunxi-mmc sdc1: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12) dt B
[   27.278701] sunxi-mmc sdc1: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt B
[   27.298048] sunxi-mmc sdc1: no vqmmc,Check if there is regulator
[   27.320656] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[   27.347654] sunxi-mmc sdc1: smc 1 p1 err, cmd 52, RTO !!
[   27.355974] sunxi-mmc sdc1: smc 1 p1 err, cmd 52, RTO !!
[   27.362618] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[   27.376225] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[   27.391003] sunxi-mmc sdc1: smc 1 p1 err, cmd 8, RTO !!
[   27.410920] mmc1: queuing unknown CIS tuple 0x80 (2 bytes)
[   27.419102] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[   27.430284] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[   27.442063] mmc1: queuing unknown CIS tuple 0x80 (7 bytes)
[   27.455857] mmc1: queuing unknown CIS tuple 0x81 (9 bytes)
[   27.573243] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing SD-HS(SDR25) dt B
[   27.584573] sunxi-mmc sdc1: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 1 timing SD-HS(SDR25) dt B
[   27.596241] sunxi-mmc sdc1: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 4 timing SD-HS(SDR25) dt B
[   27.608599] [dhd] sdioh_start: set sd_f2_blocksize 256
[   27.615291] [dhd] dhd_bus_devreset: == Power ON ==
[   27.621812] [dhd] F1 signature read @0x18000000=0x1541a9a6
[   27.635071] [dhd] F1 signature OK, socitype:0x1 chip:0xa9a6 rev:0x1 pkg:0x4
[   27.644918] [dhd] DHD: dongle ram size is set to 524288(orig 524288) at 0x0
[   27.654212] [dhd] dhd_bus_devreset: making DHD_BUS_DOWN
[   27.660189] [dhd] dhdsdio_probe_init: making DHD_BUS_DOWN
[   27.666803] [dhd] dhd_conf_set_path_params : Final fw_path=/vendor/modules/fw_bcm43438a1.bin
[   27.676332] [dhd] dhd_conf_set_path_params : Final nv_path=/system/vendor/modules/nvram_ap6212.txt
[   27.685667] audit: type=1400 audit(1716882475.396:379): avc:  denied  { sigchld } for  pid=1657 comm="touch-watcher.s" scontext=u:object_r:zygote_exec:s0 tcontext=u:object_r:zygote_exec:s0 tclass=process permissive=1
[   27.686269] audit: type=1400 audit(1716882475.396:380): avc:  denied  { use } for  pid=1657 comm="touch-watcher.s" path="/dev/null" dev="tmpfs" ino=3878 scontext=u:object_r:zygote_exec:s0 tcontext=u:r:init:s0 tclass=fd permissive=1
[   27.686316] audit: type=1400 audit(1716882475.396:381): avc:  denied  { write } for  pid=1657 comm="touch-watcher.s" path="/dev/null" dev="tmpfs" ino=3878 scontext=u:object_r:zygote_exec:s0 tcontext=u:object_r:null_device:s0 tclass=chr_file permissive=1
[   27.686460] audit: type=1400 audit(1716882475.396:382): avc:  denied  { search } for  pid=1657 comm="touch-watcher.s" name="/" dev="mmcblk0p11" ino=1 scontext=u:object_r:zygote_exec:s0 tcontext=u:object_r:vfat:s0 tclass=dir permissive=1
[   27.783053] [dhd] dhd_conf_set_path_params : Final clm_path=/vendor/modules/clm_bcm43438a1.blob
[   27.793123] [dhd] dhd_conf_set_path_params : Final conf_path=/system/vendor/modules/config_ap6212.txt
[   27.804683] [dhd] dhd_get_download_buffer: Open image file failed /system/vendor/modules/config_ap6212.txt
[   27.816135] [dhd] dhd_conf_read_config : Ignore config file /system/vendor/modules/config_ap6212.txt
[   27.832171] [dhd] dhd_os_open_image1: /vendor/modules/fw_bcm43438a1.bin (422837 bytes) open success
[   27.970379] [dhd] dhd_os_open_image1: /system/vendor/modules/nvram_ap6212.txt (993 bytes) open success
[   27.982570] [dhd] #AP6212_NVRAM_V1.0.2_20191121\x0d
[   27.990595] [dhd] dhdsdio_write_vars: Download, Upload and compare of NVRAM succeeded.
[   28.075452] [dhd] dhd_bus_init: enable 0x06, ready 0x06 (waited 0us)
[   28.092029] [dhd] wlc_ver_major 4, wlc_ver_minor 1
[   28.100655] [dhd] dhd_preinit_ioctls: preinit_status IOVAR not supported, use legacy preinit
[   28.110291] [dhd] dhd_tcpack_suppress_set: TCP ACK Suppress mode 2 -> mode 0
[   28.118166] [dhd] dhd_tcpack_suppress_set: TCPACK_INFO_MAXNUM=4, TCPDATA_INFO_MAXNUM=4
[   28.127626] [dhd] wifi_platform_get_mac_addr
[   28.133226] [dhd] dhd_legacy_preinit_ioctls: use firmware generated mac_address 04:c2:9b:0b:be:9d
[   28.143230] [dhd] dhd_apply_default_clm: Ignore clm file /vendor/modules/clm_bcm43438a1.blob
[   28.157618] [dhd] Firmware up: op_mode=0x0005, MAC=04:c2:9b:0b:be:9d
[   28.165476] [dhd] Disable tdls_auto_op failed. -1
[   28.173637] [dhd] dhd_legacy_preinit_ioctls Set scancache failed -23
[   28.183688] [dhd] dhd_legacy_preinit_ioctls: event_log_max_sets: 31 ret: -23
[   28.194803] [dhd] arp_enable:1 arp_ol:0
[   28.212388] [dhd]   Driver: 101.10.361.33 (wlan=r892223-20230607-2)\x0a[dhd]   Firmware: wl0: Jan 14 2022 15:16:34 version 7.45.96.123 (g0180acf3) FWID 01-457251af es7.c5.n4.a3\x0a[dhd]   CLM: 7.11.15 (2014-05-26 10:53:55) 
[   28.238088] [dhd] dhd_txglom_enable: enable 1
[   28.243193] [dhd] dhd_conf_set_txglom_params : txglom_mode=copy
[   28.249969] [dhd] dhd_conf_set_txglom_params : txglomsize=36, deferred_tx_len=0
[   28.258464] [dhd] dhd_conf_set_txglom_params : txinrx_thres=-1, dhd_txminmax=1
[   28.266500] [dhd] dhd_conf_set_txglom_params : tx_max_offset=0, txctl_tmo_fix=300
[   28.274861] [dhd] dhd_conf_get_disable_proptx : fw_proptx=1, disable_proptx=-1
[   28.284522] [dhd] dhd_wlfc_hostreorder_init(): successful bdcv2 tlv signaling, 64
[   28.295746] [dhd] dhd_pno_init: Support Android Location Service
[   28.304990] [dhd] dhd_wl_ioctl_get_intiovar: get int iovar wnm_bsstrans_resp failed, ERR -23
[   28.316103] [dhd] failed to get wnm_bsstrans_resp
[   28.322874] [dhd] failed to set WNM capabilities
[   28.358690] [dhd] dhd_legacy_preinit_ioctls: Failed to get preserve log # !
[   28.394091] [dhd] dhd_conf_set_country : set country CN, revision 0
[   28.404311] [dhd] dhd_conf_set_country : Country code: CN (CN/0)
[   28.418057] [dhd] CONFIG-ERROR) dhd_conf_set_intiovar : ampdu_mpdu setting failed -29
[   28.427496] [dhd] [wlan0] wl_android_wifi_on : Success
[   28.462432] [dhd] CFG80211-ERROR) __wl_update_wiphybands : error reading vhtmode (-23)
[   28.473781] [dhd] CFG80211-ERROR) __wl_update_wiphybands : error get bw_cap 6g (-13)
[   28.496174] [dhd] CFG80211-ERROR) init_roam_cache : roamscan_mode iovar failed. -23
[   28.505609] [dhd] CFG80211-ERROR) wl_cfg80211_up : Failed to enable RCC.
[   28.514893] [dhd] [wlan0] dhd_open : Exit ret=0
[   28.520644] [dhd] [wlan0] dhd_pri_open : tx queue started
[   28.526727] [dhd] dhd_pri_open : mutex is released.
[   28.591116] init: starting service 'wpa_supplicant'...
[   28.599845] init: Created socket '/dev/socket/wpa_wlan0', mode 660, user 1010, group 1010
[   28.801936] [dhd] P2P interface registered
[   28.817711] [dhd] WLC_E_IF: NO_IF set, event Ignored\x0d
[   28.825435] [dhd] P2P interface started
[   28.862224] [dhd] Random MAC OUI to be used - da:1:19
[   28.885774] [dhd] net_os_enable_packet_filter: val = 0
[   28.893666] [dhd] net_os_rxfilter_add_remove: add_remove = 0, num = 2
[   28.903356] [dhd] net_os_enable_packet_filter: val = 1
[   28.911497] [dhd] net_os_enable_packet_filter: val = 0
[   28.918641] [dhd] net_os_rxfilter_add_remove: add_remove = 0, num = 3
[   28.929275] [dhd] net_os_enable_packet_filter: val = 1

二、排查思路

查看内核代码:
android/longan/kernel/linux-4.9/drivers/net/wireless/bcmdhd/dhd_config.c

typedef struct chip_name_map_t {uint chip;uint chiprev;uint ag_type;char *chip_name;char *module_name;
} chip_name_map_t;/* Map of WLC_E events to connection failure strings */
#define DONT_CARE	9999
const chip_name_map_t chip_name_map[] = {/* ChipID			Chiprev	AG	 	ChipName	ModuleName  */
#ifdef BCMSDIO{BCM43362_CHIP_ID,	0,	DONT_CARE,	"bcm40181a0",		""},{BCM43362_CHIP_ID,	1,	DONT_CARE,	"bcm40181a2",		""},{BCM4330_CHIP_ID,	4,	FW_TYPE_G,	"bcm40183b2",		""},{BCM4330_CHIP_ID,	4,	FW_TYPE_AG,	"bcm40183b2_ag",	""},{BCM43430_CHIP_ID,	0,	DONT_CARE,	"bcm43438a0",		""},{BCM43430_CHIP_ID,	1,	DONT_CARE,	"bcm43438a1",		""},{BCM43430_CHIP_ID,	2,	DONT_CARE,	"bcm43436b0",		""},{BCM43012_CHIP_ID,	1,	FW_TYPE_G,	"bcm43013b0",		""},{BCM43012_CHIP_ID,	1,	FW_TYPE_AG,	"bcm43013c0_ag",	""},{BCM43012_CHIP_ID,	2,	DONT_CARE,	"bcm43013c1_ag",	""},{BCM4334_CHIP_ID,	3,	DONT_CARE,	"bcm4334b1_ag",		""},{BCM43340_CHIP_ID,	2,	DONT_CARE,	"bcm43341b0_ag",	""},{BCM43341_CHIP_ID,	2,	DONT_CARE,	"bcm43341b0_ag",	""},{BCM4324_CHIP_ID,	5,	DONT_CARE,	"bcm43241b4_ag",	""},{BCM4335_CHIP_ID,	2,	DONT_CARE,	"bcm4339a0_ag",		""},{BCM4339_CHIP_ID,	1,	DONT_CARE,	"bcm4339a0_ag",		""},{BCM4345_CHIP_ID,	6,	DONT_CARE,	"bcm43455c0_ag",	""},{BCM43454_CHIP_ID,	6,	DONT_CARE,	"bcm43455c0_ag",	""},{BCM4345_CHIP_ID,	9,	DONT_CARE,	"bcm43456c5_ag",	""},{BCM43454_CHIP_ID,	9,	DONT_CARE,	"bcm43456c5_ag",	""},{BCM4354_CHIP_ID,	1,	DONT_CARE,	"bcm4354a1_ag",		""},{BCM4354_CHIP_ID,	2,	DONT_CARE,	"bcm4356a2_ag",		""},{BCM4356_CHIP_ID,	2,	DONT_CARE,	"bcm4356a2_ag",		""},{BCM4371_CHIP_ID,	2,	DONT_CARE,	"bcm4356a2_ag",		""},{BCM43569_CHIP_ID,	3,	DONT_CARE,	"bcm4358a3_ag",		""},{BCM4359_CHIP_ID,	5,	DONT_CARE,	"bcm4359b1_ag",		""},{BCM4359_CHIP_ID,	9,	DONT_CARE,	"bcm4359c0_ag",		""},{BCM43751_CHIP_ID,	1,	DONT_CARE,	"bcm43751a1_ag",	""},{BCM43751_CHIP_ID,	2,	DONT_CARE,	"bcm43751a2_ag",	""},{BCM43752_CHIP_ID,	1,	DONT_CARE,	"bcm43752a1_ag",	""},{BCM43752_CHIP_ID,	2,	DONT_CARE,	"bcm43752a2_ag",	""},
#endif
#ifdef BCMPCIE{BCM4354_CHIP_ID,	2,	DONT_CARE,	"bcm4356a2_pcie_ag",	""},{BCM4356_CHIP_ID,	2,	DONT_CARE,	"bcm4356a2_pcie_ag",	""},{BCM4359_CHIP_ID,	9,	DONT_CARE,	"bcm4359c0_pcie_ag",	""},{BCM43751_CHIP_ID,	1,	DONT_CARE,	"bcm43751a1_pcie_ag",	""},{BCM43751_CHIP_ID,	2,	DONT_CARE,	"bcm43751a2_pcie_ag",	""},{BCM43752_CHIP_ID,	1,	DONT_CARE,	"bcm43752a1_pcie_ag",	""},{BCM43752_CHIP_ID,	2,	DONT_CARE,	"bcm43752a2_pcie_ag",	""},{BCM4375_CHIP_ID,	5,	DONT_CARE,	"bcm4375b4_pcie_ag",	""},
#endif
#ifdef BCMDBUS{BCM43143_CHIP_ID,	2,	DONT_CARE,	"bcm43143b0",			""},{BCM43242_CHIP_ID,	1,	DONT_CARE,	"bcm43242a1_ag",		""},{BCM43569_CHIP_ID,	2,	DONT_CARE,	"bcm4358u_ag",			""},
#endif
};

有配置bcm43438a0和bcm43438a1

三、根据日志定位

static bool
dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva,uint16 devid)
{
#ifndef BCMSPIint err = 0;uint8 clkctl = 0;
#endif /* !BCMSPI */bus->alp_only = TRUE;bus->sih = NULL;/* Return the window to backplane enumeration space for core access */if (dhdsdio_set_siaddr_window(bus, si_enum_base(devid))) {DHD_ERROR(("%s: FAILED to return to SI_ENUM_BASE\n", __FUNCTION__));}#if defined(DHD_DEBUG) && !defined(CUSTOMER_HW4_DEBUG)DHD_ERROR(("F1 signature read @0x18000000=0x%4x\n",bcmsdh_reg_read(bus->sdh, si_enum_base(devid), 4)));
#endif /* DHD_DEBUG && !CUSTOMER_HW4_DEBUG */#ifndef BCMSPI	/* wake-wlan in gSPI will bring up the htavail/alpavail clocks. *//* Force PLL off until si_attach() programs PLL control regs *//* XXX Ideally should not access F1 power control regs before* reading CIS and confirming device.  But strapping option for* low-power start requires turning on ALP before reading CIS,* and at some point bcmsdh should read the CIS for the ID and* not even tell us if it's some other device.  At this point* (see above) we should know it's us (powered on) or can't read* CIS so we need to power on and try.*//* WAR for PR 39902: must force HT off until PLL programmed. *//* WAR for PR43618, PR44891: don't do ALPReq until ALPAvail set *//* XXX Replace write/read sequence with single bcmsdh_cfg_raw() call */bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, DHD_INIT_CLKCTL1, &err);if (!err)clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err);if (err || ((clkctl & ~SBSDIO_AVBITS) != DHD_INIT_CLKCTL1)) {DHD_ERROR(("dhdsdio_probe: ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n",err, DHD_INIT_CLKCTL1, clkctl));goto fail;}#endif /* !BCMSPI */#ifdef DHD_DEBUGif (DHD_INFO_ON()) {uint fn, numfn;uint8 *cis = NULL;int local_err = 0;#ifndef BCMSPInumfn = bcmsdh_query_iofnum(sdh);ASSERT(numfn <= SDIOD_MAX_IOFUNCS);/* Make sure ALP is available before trying to read CIS */SPINWAIT(((clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1,SBSDIO_FUNC1_CHIPCLKCSR, NULL)),!SBSDIO_ALPAV(clkctl)), PMU_MAX_TRANSITION_DLY);/* Now request ALP be put on the bus */bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR,DHD_INIT_CLKCTL2, &local_err);/* XXX Account for possible delay between ALP available and on active */OSL_DELAY(65);
#elsenumfn = 0; /* internally func is hardcoded to 1 as gSPI has cis on F1 only */
#endif /* !BCMSPI */
#ifndef BCMSDIOLITEif (!(cis = MALLOC(osh, SBSDIO_CIS_SIZE_LIMIT))) {DHD_INFO(("dhdsdio_probe: cis malloc failed\n"));goto fail;}for (fn = 0; fn <= numfn; fn++) {bzero(cis, SBSDIO_CIS_SIZE_LIMIT);if ((err = bcmsdh_cis_read(sdh, fn, cis,SBSDIO_CIS_SIZE_LIMIT))) {DHD_INFO(("dhdsdio_probe: fn %d cis read err %d\n",fn, err));break;}dhd_dump_cis(fn, cis);}MFREE(osh, cis, SBSDIO_CIS_SIZE_LIMIT);
#elseBCM_REFERENCE(cis);BCM_REFERENCE(fn);
#endif /* DHD_DEBUG */if (local_err) {DHD_ERROR(("dhdsdio_probe: failure reading or parsing CIS\n"));goto fail;}}
#endif /* DHD_DEBUG *//* si_attach() will provide an SI handle and scan the backplane */if (!(bus->sih = si_attach((uint)devid, osh, regsva, DHD_BUS, sdh,&bus->vars, &bus->varsz))) {DHD_ERROR(("%s: si_attach failed!\n", __FUNCTION__));goto fail;}
#ifdef DHD_DEBUG   //bus->sih->chip 和bus->sih->chiprev 来表示模块唯一IDDHD_ERROR(("F1 signature OK, socitype:0x%x chip:0x%4x rev:0x%x pkg:0x%x\n",bus->sih->socitype, bus->sih->chip, bus->sih->chiprev, bus->sih->chippkg));
#endif /* DHD_DEBUG *//* XXX Let the layers below dhd know the chipid and chiprev for* controlling sw WARs for hw PRs*/bcmsdh_chipinfo(sdh, bus->sih->chip, bus->sih->chiprev);if (!dhdsdio_chipmatch((uint16)bus->sih->chip)) {DHD_ERROR(("%s: unsupported chip: 0x%04x\n",__FUNCTION__, bus->sih->chip));
#ifdef BCMINTERNALif (dhd_anychip)DHD_ERROR(("Continuing anyway...\n"));else
#endif /* BCMINTERNAL */goto fail;}if (bus->sih->buscorerev >= 12)dhdsdio_clk_kso_init(bus);elsebus->kso = TRUE;si_sdiod_drive_strength_init(bus->sih, osh, dhd_sdiod_drive_strength);#ifdef BCMINTERNAL/* Check if there is a PMU in the chip.  The FPGA does not have a PMU. */if (!(bus->sih->cccaps & CC_CAP_PMU)) {DHD_NOPMU(bus) = 1;}
#endif /* BCMINTERNAL *//* Get info on the ARM and SOCRAM cores... *//* XXX Should really be qualified by device id */if (!DHD_NOPMU(bus)) {if ((si_setcore(bus->sih, ARM7S_CORE_ID, 0)) ||(si_setcore(bus->sih, ARMCM3_CORE_ID, 0)) ||(si_setcore(bus->sih, ARMCR4_CORE_ID, 0))) {bus->armrev = si_corerev(bus->sih);} else {DHD_ERROR(("%s: failed to find ARM core!\n", __FUNCTION__));goto fail;}if (!si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) {if (!(bus->orig_ramsize = si_socram_size(bus->sih))) {DHD_ERROR(("%s: failed to find SOCRAM memory!\n", __FUNCTION__));goto fail;}} else {/* cr4 has a different way to find the RAM size from TCM's */if (!(bus->orig_ramsize = si_tcm_size(bus->sih))) {DHD_ERROR(("%s: failed to find CR4-TCM memory!\n", __FUNCTION__));goto fail;}/* also populate base address */switch ((uint16)bus->sih->chip) {case BCM4335_CHIP_ID:case BCM4339_CHIP_ID:bus->dongle_ram_base = CR4_4335_RAM_BASE;break;case BCM4350_CHIP_ID:case BCM4354_CHIP_ID:case BCM4358_CHIP_ID:case BCM43569_CHIP_ID:case BCM4371_CHIP_ID:bus->dongle_ram_base = CR4_4350_RAM_BASE;break;case BCM4360_CHIP_ID:bus->dongle_ram_base = CR4_4360_RAM_BASE;break;CASE_BCM4345_CHIP:bus->dongle_ram_base = (bus->sih->chiprev < 6)  /* from 4345C0 */? CR4_4345_LT_C0_RAM_BASE : CR4_4345_GE_C0_RAM_BASE;break;case BCM4349_CHIP_GRPID:/* RAM based changed from 4349c0(revid=9) onwards */bus->dongle_ram_base = ((bus->sih->chiprev < 9) ?CR4_4349_RAM_BASE: CR4_4349_RAM_BASE_FROM_REV_9);break;case BCM4364_CHIP_ID:bus->dongle_ram_base = CR4_4364_RAM_BASE;break;
#ifdef UNRELEASEDCHIPcase BCM4347_CHIP_ID:case BCM4357_CHIP_ID:case BCM4361_CHIP_ID:bus->dongle_ram_base = CR4_4347_RAM_BASE;break;
#endifcase BCM4362_CHIP_ID:bus->dongle_ram_base = CR4_4362_RAM_BASE;break;case BCM43751_CHIP_ID:bus->dongle_ram_base = CR4_43751_RAM_BASE;break;case BCM43752_CHIP_ID:bus->dongle_ram_base = CR4_43752_RAM_BASE;break;case BCM4369_CHIP_ID:bus->dongle_ram_base = CR4_4369_RAM_BASE;break;case BCM4378_CHIP_GRPID:bus->dongle_ram_base = CR4_4378_RAM_BASE;break;default:bus->dongle_ram_base = 0;DHD_ERROR(("%s: WARNING: Using default ram base at 0x%x\n",__FUNCTION__, bus->dongle_ram_base));}}/* Set the poll and/or interrupt flags */bus->intr = (bool)dhd_intr;if ((bus->poll = (bool)dhd_poll))bus->pollrate = 1;/* Setting default Glom size */bus->txglomsize = SDPCM_DEFGLOM_SIZE;return TRUE;fail:if (bus->sih != NULL) {si_detach(bus->sih);bus->sih = NULL;}return FALSE;
}

3.1 android hal层配置

查看android hal 代码

3.2查看蓝牙相关的配置

已经添加了ap6212 和ap6212a

static const fw_auto_detection_entry_t fw_auto_detection_table[] = {{"4343A0","BCM43438A0"},     //AP6212{"BCM4350C0","BCM4354A1"},   //AP6354{"BCM4335C0","BCM4339A0"},   //AP6335{"BCM4354A2","BCM4356A2"},   //AP6356{"BCM4359C0","BCM4359C0"},   //AP6359{"BCM4349B1","BCM4359B1"},   //AP6359{"BCM4330B1","BCM40183B2"},  //AP6330{"BCM4324B3","BCM43241B4"},  //AP62X2{"BCM20702A","BCM20710A1"},  //AP6210B{"BCM43430B0","BCM4343B0"},  //AP6236{"BCM43430A1","BCM43438A1"}, //AP6212A{NULL, NULL}
};

3.3hal 解析底层探测到的wifi设备信息,将解析的模块信息写入

property_set(“wlan.hardware.info”, info);

android/hardware/libhardware_legacy/wifi_hardware_info/wifi_hardware_info.cstatic void parse_uevent(char *msg, struct wifi_hardware_info *wifiinfo)
{char sdio_device_id[10] = {0};char device_type[10] = {0};char *subsystem = NULL;char *sdio_id = NULL;char *usb_product = NULL;unsigned long device_id = 0;while (*msg) {if (!strncmp(msg, "SUBSYSTEM=", 10)) {msg += 10;subsystem = msg;} else if (!strncmp(msg, "SDIO_ID=", 8)) {msg += 8;sdio_id = msg;} else if (!strncmp(msg, "PRODUCT=", 8)) {msg += 8;usb_product = msg;}/* advance to after the next \0 */while (*msg++) {/* do nothing */}}if (!strncmp(subsystem, "sdio", 4)) {ALOGI("get uevent, sdio_id = %s", sdio_id);strcpy(device_type, "sdio");char *subid = strrchr(sdio_id, ':');if (subid == NULL) {return;}subid++;strcpy(sdio_device_id, subid);device_id = strtoul(sdio_device_id, NULL, 16);device_id += 0x10000;} else if (!strncmp(subsystem, "usb", 3)) {strcpy(device_type, "usb");char *subid = NULL;strtok(usb_product, "/");subid = strtok( NULL, "/");if (subid == NULL) {return;}device_id = strtoul(subid, NULL, 16);} else {return;}ALOGI("parse_uevent(), device_id: 0x%lx", device_id);if (!get_hardware_info_by_device_id(device_id, wifiinfo)) {FILE *file = fopen(WIFI_HARDWARE_INFO_PATH, "w");char info[PROPERTY_VALUE_MAX] = {0};snprintf(info, sizeof(info), "%s:%s", wifiinfo->vendor_name, wifiinfo->module_name);if (file == NULL){ALOGE("cannot open file %s to write", WIFI_HARDWARE_INFO_PATH);return;}ALOGD("write wifi_hardware_info into file: %s:%s", wifiinfo->vendor_name,wifiinfo->module_name);fprintf(file,"%s\n", info);fflush(file);fsync(fileno(file));fclose(file);chmod(WIFI_HARDWARE_INFO_PATH,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);property_set("wlan.hardware.info", info);thread_state = exiting;}
}

3.4 最后查看到wifi_list 只定义device_id = 0x1a9a6 ,解析出来的模块是ap6212

void get_driver_module_arg(char* arg) 设置nvram_path的时候只识别出ap6212

android/hardware/libhardware_legacy/wifi_hardware_info/wifi_hardware_info.c
struct wifi_hardware_info {unsigned long device_id;char *module_name;char *driver_name;char *driver_module_name;char *vendor_name;char *fw_path_sta;char *fw_path_ap;char *fw_path_p2p;
};static const struct wifi_hardware_info wifi_list[] = {{.device_id   = 0x1a9a6,	//设备ID,通过内核sdio_probe 可以查看到此ID .module_name = "ap6212",  //模块名字.driver_name = "bcmdhd",   //驱动名字.driver_module_name = "bcmdhd",.vendor_name = "broadcom",.fw_path_sta = "/system/vendor/modules/fw_bcm43438a0.bin",  //驱动bin文件.fw_path_ap  = "/system/vendor/modules/fw_bcm43438a0_apsta.bin",.fw_path_p2p = "/system/vendor/modules/fw_bcm43438a0_p2p.bin",}
}void get_driver_module_arg(char* arg)
{char module_arg[256] = {0};#if defined(WIFI_VENDOR_NAME) && defined(WIFI_MODULE_NAME) && defined(WIFI_DRIVER_NAME) && defined(WIFI_DRIVER_MODULE_NAME)#ifdef WIFI_DRIVER_MODULE_ARGconst char *driver_module_arg = WIFI_DRIVER_MODULE_ARG;snprintf(module_arg, sizeof(module_arg), "%s", driver_module_arg);
#endif#elseconst char *vendor_name = get_wifi_vendor_name();if(strcmp(vendor_name, "realtek") == 0) {const char *driver_module_arg = "ifname=wlan0 if2name=p2p0";snprintf(module_arg, sizeof(module_arg), "%s", driver_module_arg);} else if(strcmp(vendor_name, "broadcom") == 0) {const char *nvram_path = "nvram_path=/system/vendor/modules/nvram";const char *config_path = "config_path=/system/vendor/modules/config";snprintf(module_arg, sizeof(module_arg), "%s_%s.txt %s_%s.txt",nvram_path, get_wifi_module_name(), config_path, get_wifi_module_name());}else if(strcmp(get_wifi_vendor_name(), "xradio") == 0) {const char *driver_module_arg = "";snprintf(module_arg, sizeof(module_arg), "%s", driver_module_arg);} else if(strcmp(vendor_name, "atheros") == 0){const char *driver_module_arg = "";snprintf(module_arg, sizeof(module_arg), "%s", driver_module_arg);}
#endifstrcpy(arg, module_arg);
}

解决如下:

android/hardware/libhardware_legacy/wifi_hardware_info/wifi_hardware_info.cstatic const struct wifi_hardware_info wifi_list[] = {{.device_id   = 0x0a9a6,	//设备ID,通过内核sdio_probe 可以查看到此ID .module_name = "ap6212",  //模块名字.driver_name = "bcmdhd",   //驱动名字.driver_module_name = "bcmdhd",.vendor_name = "broadcom",.fw_path_sta = "/system/vendor/modules/fw_bcm43438a0.bin",  //驱动bin文件.fw_path_ap  = "/system/vendor/modules/fw_bcm43438a0_apsta.bin",.fw_path_p2p = "/system/vendor/modules/fw_bcm43438a0_p2p.bin",},   {.device_id   = 0x1a9a6,	//设备ID,通过内核sdio_probe 可以查看到此ID .module_name = "ap6212a",  //模块名字.driver_name = "bcmdhd",   //驱动名字.driver_module_name = "bcmdhd",.vendor_name = "broadcom",.fw_path_sta = "/system/vendor/modules/fw_bcm43438a1.bin",  //驱动bin文件.fw_path_ap  = "/system/vendor/modules/fw_bcm43438a1_apsta.bin",.fw_path_p2p = "/system/vendor/modules/fw_bcm43438a1_p2p.bin",}
}

这样就能正确加载nvram_ap6212a.txt

这篇关于android-AP6212配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022283

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr