From d4a1bd480003f3e1a0590bc46fbcb24f05652ca7 Mon Sep 17 00:00:00 2001 From: tzh <tanzhtanzh@gmail.com> Date: Thu, 15 Aug 2024 06:56:47 +0000 Subject: [PATCH] feat(wfit/bt): update aic8800 wifi/bt drive and hal --- longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_bsp/aic_bsp_driver.h | 124 ++++++++++++++++++++++++++++++++++------- 1 files changed, 103 insertions(+), 21 deletions(-) diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_bsp/aic_bsp_driver.h b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_bsp/aic_bsp_driver.h old mode 100644 new mode 100755 index 1fc80a9..c644bd4 --- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_bsp/aic_bsp_driver.h +++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_bsp/aic_bsp_driver.h @@ -190,6 +190,13 @@ DBG_MEM_MASK_WRITE_REQ, /// Memory mask write confirm DBG_MEM_MASK_WRITE_CFM, + + DBG_RFTEST_CMD_REQ, + DBG_RFTEST_CMD_CFM, + DBG_BINDING_REQ, + DBG_BINDING_CFM, + DBG_BINDING_IND, + /// Max number of Debug messages DBG_MAX, }; @@ -257,6 +264,14 @@ u32 bootstatus; }; +struct dbg_binding_ind { + u8 enc_data[16]; +}; + +struct dbg_binding_req { + u8 driver_data[16]; +}; + int rwnx_send_dbg_mem_read_req(struct aic_sdio_dev *sdiodev, u32 mem_addr, struct dbg_mem_read_cfm *cfm); int rwnx_send_dbg_mem_block_write_req(struct aic_sdio_dev *sdiodev, u32 mem_addr, @@ -264,23 +279,21 @@ int rwnx_send_dbg_mem_write_req(struct aic_sdio_dev *sdiodev, u32 mem_addr, u32 mem_data); int rwnx_send_dbg_mem_mask_write_req(struct aic_sdio_dev *sdiodev, u32 mem_addr, u32 mem_mask, u32 mem_data); -int rwnx_send_dbg_start_app_req(struct aic_sdio_dev *sdiodev, u32 boot_addr, u32 boot_type); +int rwnx_send_dbg_start_app_req(struct aic_sdio_dev *sdiodev, u32 boot_addr, u32 boot_type, struct dbg_start_app_cfm *start_app_cfm); +int rwnx_send_dbg_binding_req(struct aic_sdio_dev *sdiodev, u8 *dout, u8 *binding_status); void rwnx_rx_handle_msg(struct aic_sdio_dev *sdiodev, struct ipc_e2a_msg *msg); int aicbsp_platform_init(struct aic_sdio_dev *sdiodev); void aicbsp_platform_deinit(struct aic_sdio_dev *sdiodev); -void aicbsp_driver_fw_init(struct aic_sdio_dev *sdiodev); +int aicbsp_driver_fw_init(struct aic_sdio_dev *sdiodev); +int aicbsp_resv_mem_init(void); +int aicbsp_resv_mem_deinit(void); -#define AICBSP_FW_PATH "/vendor/etc/firmware" -#define AICBSP_FW_PATH_MAX 200 - -#define RAM_FW_ADDR 0x00100000 -#define RAM_FMAC_FW_ADDR 0x00110000 +#define RAM_FMAC_FW_ADDR 0x00120000 #define FW_RAM_ADID_BASE_ADDR 0x00161928 -#define FW_RAM_PATCH_BASE_ADDR 0x0016ad64 -#define FW_PATCH_TEST_BASE_ADDR 0x00100000 -#define FW_WIFI_RAM_ADDR 0x00110000 +#define FW_RAM_ADID_BASE_ADDR_U03 0x00161928 +#define FW_RAM_PATCH_BASE_ADDR 0x00100000 #define AICBT_PT_TAG "AICBT_PT_TAG" @@ -290,19 +303,70 @@ AICBT_PT_BTMODE, AICBT_PT_PWRON, AICBT_PT_AF, + AICBT_PT_VER, }; -enum aicbsp_mode_num { - AICBSP_MODE_BT_ONLY_SW = 0x0, // bt only mode with switch - AICBSP_MODE_BT_WIFI_COMBO, // wifi/bt combo mode - AICBSP_MODE_BT_ONLY, // bt only mode without switch - AICBSP_MODE_BT_ONLY_TEST, // bt only test mode - AICBSP_MODE_COMBO_TEST, // wifi/bt combo test mode +enum aicbt_btport_type { + AICBT_BTPORT_NULL, + AICBT_BTPORT_MB, + AICBT_BTPORT_UART, }; -#define AICBSP_MODE_DEFAULT AICBSP_MODE_BT_WIFI_COMBO +/* btmode + * used for force bt mode,if not AICBSP_MODE_NULL + * efuse valid and vendor_info will be invalid, even has beed set valid +*/ +enum aicbt_btmode_type { + AICBT_BTMODE_BT_ONLY_SW = 0x0, // bt only mode with switch + AICBT_BTMODE_BT_WIFI_COMBO, // wifi/bt combo mode + AICBT_BTMODE_BT_ONLY, // bt only mode without switch + AICBT_BTMODE_BT_ONLY_TEST, // bt only test mode + AICBT_BTMODE_BT_WIFI_COMBO_TEST, // wifi/bt combo test mode + AICBT_MODE_NULL = 0xFF, // invalid value +}; -#define FEATURE_5G_SUPPORT 0x01 +/* uart_baud + * used for config uart baud when btport set to uart, + * otherwise meaningless +*/ +enum aicbt_uart_baud_type { + AICBT_UART_BAUD_115200 = 115200, + AICBT_UART_BAUD_921600 = 921600, + AICBT_UART_BAUD_1_5M = 1500000, + AICBT_UART_BAUD_3_25M = 3250000, +}; + +enum aicbt_uart_flowctrl_type { + AICBT_UART_FLOWCTRL_DISABLE = 0x0, // uart without flow ctrl + AICBT_UART_FLOWCTRL_ENABLE, // uart with flow ctrl +}; + +enum aicbsp_cpmode_type { + AICBSP_CPMODE_WORK, + AICBSP_CPMODE_TEST, + AICBSP_CPMODE_MAX, +}; + +enum chip_rev { + CHIP_REV_U02 = 3, + CHIP_REV_U03 = 7, + CHIP_REV_U04 = 7, +}; + +///aic bt tx pwr lvl :lsb->msb: first byte, min pwr lvl; second byte, max pwr lvl; +///pwr lvl:20(min), 30 , 40 , 50 , 60(max) +#define AICBT_TXPWR_LVL 0x00006020 + +#define AICBSP_HWINFO_DEFAULT (-1) +#define AICBSP_CPMODE_DEFAULT AICBSP_CPMODE_WORK + +#define AICBT_BTMODE_DEFAULT AICBT_MODE_NULL +#define AICBT_BTPORT_DEFAULT AICBT_BTPORT_UART +#define AICBT_UART_BAUD_DEFAULT AICBT_UART_BAUD_1_5M +#define AICBT_UART_FC_DEFAULT AICBT_UART_FLOWCTRL_ENABLE +#define AICBT_LPM_ENABLE_DEFAULT 1 +#define AICBT_TXPWR_LVL_DEFAULT AICBT_TXPWR_LVL + #define FEATURE_SDIO_CLOCK 70000000 // 0: default, other: target clock rate #define FEATURE_SDIO_PHASE 2 // 0: default, 2: 180° @@ -314,17 +378,35 @@ struct aicbt_patch_table *next; }; +struct aicbt_info_t { + uint32_t btmode; + uint32_t btport; + uint32_t uart_baud; + uint32_t uart_flowctrl; + uint32_t lpm_enable; + uint32_t txpwr_lvl; +}; + struct aicbsp_firmware { const char *desc; const char *bt_adid; const char *bt_patch; const char *bt_table; - const char *bt_patch_test; const char *wl_fw; }; -extern uint32_t aicbsp_mode_index; +struct aicbsp_info_t { + int hwinfo; + int hwinfo_r; + uint32_t cpmode; + uint32_t chip_rev; + bool fwlog_en; +}; + +extern struct aicbsp_info_t aicbsp_info; extern struct mutex aicbsp_power_lock; -extern const struct aicbsp_firmware aicbsp_firmware_list[]; +extern const struct aicbsp_firmware *aicbsp_firmware_list; +extern const struct aicbsp_firmware fw_u02[]; +extern const struct aicbsp_firmware fw_u03[]; #endif -- Gitblit v1.6.2