From c4a8736d7361706823ce21f414ddf19b0712b5b2 Mon Sep 17 00:00:00 2001 From: Haiwen Xia Date: Fri, 20 Dec 2024 20:47:49 +0800 Subject: [PATCH 1/4] riscv: telink: add dual mode logic . - add analog register proc. - add extra pwm interface as pointer. - fix pwm start ,or it will inflect pulse. - use i2c interface , need raw id . - fix random mac address . Signed-off-by: Haiwen Xia --- .../ble/vendor/controller/b9x/b9x_bt_flash.c | 21 ++++++++++++++++ .../ble/vendor/controller/tlx/tlx_bt_flash.c | 19 +++++++++++++++ tlsr9/drivers/B92/analog.c | 2 ++ tlsr9/drivers/B92/analog.h | 5 ++++ tlsr9/drivers/B92/i2c.c | 4 ++++ tlsr9/drivers/B92/pwm.c | 23 ++++++++++++++++++ tlsr9/drivers/B92/pwm.h | 11 ++++++++- tlsr9/drivers/TL321X/i2c.c | 6 ++++- tlsr9/drivers/TL321X/pwm.c | 24 +++++++++++++++++++ tlsr9/drivers/TL321X/pwm.h | 16 ++++++++++--- 10 files changed, 126 insertions(+), 5 deletions(-) diff --git a/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c b/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c index 76f4d480..7b68a0ac 100644 --- a/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c +++ b/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c @@ -29,6 +29,14 @@ #include #include +#if CONFIG_SOC_RISCV_TELINK_B92 +#define USER_PARA_MAC_OFFSET (0x100) +#define USER_PARTITION user_para_partition +#define USER_PARTITION_DEVICE FIXED_PARTITION_DEVICE(USER_PARTITION) +#define USER_PARTITION_OFFSET FIXED_PARTITION_OFFSET(USER_PARTITION) +#define USER_PARTITION_SIZE FIXED_PARTITION_SIZE(USER_PARTITION) +#endif + #if CONFIG_TL_BLE_CTRL_MAC_TYPE_PUBLIC || CONFIG_TL_BLE_CTRL_MAC_FLASH static const struct device *flash_device = DEVICE_DT_GET(DT_CHOSEN(zephyr_flash_controller)); @@ -111,9 +119,22 @@ _attribute_no_inline_ int b9x_bt_blc_mac_init(uint8_t *bt_mac) err = flash_write(flash_device, FIXED_PARTITION_OFFSET(vendor_partition) + B9X_BT_MAC_ADDR_OFFSET, temp_mac, BLE_ADDR_LEN + 3); #else + #if CONFIG_SOC_RISCV_TELINK_B92 + uint8_t dummy_mac[BLE_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + + /*Get the ramdom mac address from zb which will passed in the user-para sector */ + err = flash_read(USER_PARTITION_DEVICE, USER_PARTITION_OFFSET + + USER_PARA_MAC_OFFSET, bt_mac, BLE_ADDR_LEN ); + if(memcmp(bt_mac, dummy_mac, sizeof(dummy_mac)) == 0){ + // if mac address is empty, use random instead . + generateRandomNum(BLE_ADDR_LEN, bt_mac); + } + bt_mac[5] |= 0xC0; /* random static by default */ + #else generateRandomNum(BLE_ADDR_LEN, bt_mac); /* The random static address will be generated on every reboot */ bt_mac[5] |= 0xC0; /* random static by default */ + #endif #endif #else #error "Other address types are not supported or need to be set via HCI" diff --git a/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c b/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c index 64065cbe..3de7f38f 100644 --- a/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c +++ b/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c @@ -28,6 +28,12 @@ #include #include +#define USER_PARA_MAC_OFFSET (0x100) +#define USER_PARTITION user_para_partition +#define USER_PARTITION_DEVICE FIXED_PARTITION_DEVICE(USER_PARTITION) +#define USER_PARTITION_OFFSET FIXED_PARTITION_OFFSET(USER_PARTITION) +#define USER_PARTITION_SIZE FIXED_PARTITION_SIZE(USER_PARTITION) + #if CONFIG_TL_BLE_CTRL_MAC_TYPE_PUBLIC || CONFIG_TL_BLE_CTRL_MAC_FLASH static const struct device *flash_device = DEVICE_DT_GET(DT_CHOSEN(zephyr_flash_controller)); @@ -110,9 +116,22 @@ _attribute_no_inline_ int tlx_bt_blc_mac_init(uint8_t *bt_mac) err = flash_write(flash_device, FIXED_PARTITION_OFFSET(vendor_partition) + TLX_BT_MAC_ADDR_OFFSET, temp_mac, BLE_ADDR_LEN + 3); #else + #if CONFIG_SOC_RISCV_TELINK_TL321X + uint8_t dummy_mac[BLE_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + + /*Get the ramdom mac address from zb which will passed in the user-para sector */ + err = flash_read(USER_PARTITION_DEVICE, USER_PARTITION_OFFSET + + USER_PARA_MAC_OFFSET, bt_mac, BLE_ADDR_LEN ); + if(memcmp(bt_mac, dummy_mac, sizeof(dummy_mac)) == 0){ + // if mac address is empty, use random instead . + generateRandomNum(BLE_ADDR_LEN, bt_mac); + } + bt_mac[5] |= 0xC0; /* random static by default */ + #else generateRandomNum(BLE_ADDR_LEN, bt_mac); /* The random static address will be generated on every reboot */ bt_mac[5] |= 0xC0; /* random static by default */ + #endif #endif #else #error "Other address types are not supported or need to be set via HCI" diff --git a/tlsr9/drivers/B92/analog.c b/tlsr9/drivers/B92/analog.c index eb0af29d..95c72cab 100644 --- a/tlsr9/drivers/B92/analog.c +++ b/tlsr9/drivers/B92/analog.c @@ -83,6 +83,8 @@ dma_config_t analog_rx_dma_config={ * local function prototype * *********************************************************************************************************************/ +_attribute_data_retention_sec_ analog_write_f analog_write = analog_write_reg8; +_attribute_data_retention_sec_ analog_read_f analog_read = analog_read_reg8; /** * @brief This function serves to judge whether analog write/read is busy . diff --git a/tlsr9/drivers/B92/analog.h b/tlsr9/drivers/B92/analog.h index 166acbc6..71f0a5d9 100644 --- a/tlsr9/drivers/B92/analog.h +++ b/tlsr9/drivers/B92/analog.h @@ -59,6 +59,11 @@ * global function prototype * *********************************************************************************************************************/ +typedef void (*analog_write_f)(unsigned char, unsigned char); +extern _attribute_data_retention_sec_ analog_write_f analog_write; +typedef unsigned char (*analog_read_f)(unsigned char addr); +extern _attribute_data_retention_sec_ analog_read_f analog_read; + /** * @brief This function serves to analog register read by byte. * @param[in] addr - address need to be read. diff --git a/tlsr9/drivers/B92/i2c.c b/tlsr9/drivers/B92/i2c.c index 874bdfcd..86ceeb42 100644 --- a/tlsr9/drivers/B92/i2c.c +++ b/tlsr9/drivers/B92/i2c.c @@ -202,7 +202,11 @@ static inline unsigned char i2c_master_data_nack_detect(void) unsigned char i2c_master_write(unsigned char id, unsigned char *data, unsigned int len) { i2c_clr_irq_status(I2C_TX_BUF_STATUS); +#if CONFIG_I2C_LED + reg_i2c_id = id; //BIT(0):R:High W:Low +#else reg_i2c_id = id & (~FLD_I2C_WRITE_READ_BIT); //BIT(0):R:High W:Low +#endif reg_i2c_sct1 = (FLD_I2C_LS_ID| FLD_I2C_LS_START); while(i2c_master_busy()); if(i2c_master_id_nack_detect()){ diff --git a/tlsr9/drivers/B92/pwm.c b/tlsr9/drivers/B92/pwm.c index 6984e89b..ff084d06 100644 --- a/tlsr9/drivers/B92/pwm.c +++ b/tlsr9/drivers/B92/pwm.c @@ -128,3 +128,26 @@ void pwm_set_tx_dma_add_list_element(dma_chn_e chn,dma_chain_config_t *config_ad config_addr->dma_chain_llp_ptr=(unsigned int)convert_ram_addr_cpu2bus(llpoint); } +/** + * @brief This function servers to start the pwm,can have more than one PWM open at the same time. + * @param[in] en - variable of enum to select the pwm. + * @return none. + */ +void pwm_start_t(pwm_en_e en) +{ + pwm_start(en); +} + +/** +* @brief This function servers to stop the pwm,can have more than one PWM stop at the same time. + * @param[in] en - variable of enum to select the pwm. + * @return none. + */ +void pwm_stop_t(pwm_en_e en) +{ + pwm_stop(en); +} + +pwm_set_pin_t pwm_set_pinctrl = pwm_set_pin; +pwm_set_start_t pwm_set_start = pwm_start_t; +pwm_set_stop_t pwm_set_stop = pwm_stop_t; diff --git a/tlsr9/drivers/B92/pwm.h b/tlsr9/drivers/B92/pwm.h index 05a17df8..60090c9f 100644 --- a/tlsr9/drivers/B92/pwm.h +++ b/tlsr9/drivers/B92/pwm.h @@ -133,7 +133,7 @@ static inline void pwm_set_tmax(pwm_id_e id, unsigned short tmax){ * @return none. */ static inline void pwm_start(pwm_en_e en){ - + if(!(reg_pwm_enable & en)) reg_pwm_enable|=en; } @@ -475,6 +475,15 @@ static inline void pwm_32k_chn_dis(pwm_clk_32k_en_chn_e pwm_32K_en_chn) { BM_CLR(reg_pwm_mode32k, pwm_32K_en_chn); } + +typedef void (*pwm_set_pin_t)(gpio_func_pin_e pin, gpio_func_e func); +typedef void (*pwm_set_start_t)(pwm_en_e en); +typedef void (*pwm_set_stop_t)(pwm_en_e id); + +extern pwm_set_pin_t pwm_set_pinctrl; +extern pwm_set_start_t pwm_set_start; +extern pwm_set_stop_t pwm_set_stop; + #endif diff --git a/tlsr9/drivers/TL321X/i2c.c b/tlsr9/drivers/TL321X/i2c.c index d4532a33..42145c99 100644 --- a/tlsr9/drivers/TL321X/i2c.c +++ b/tlsr9/drivers/TL321X/i2c.c @@ -262,7 +262,11 @@ static unsigned char i2c_master_data_nack_detect(void) unsigned char i2c_master_write(unsigned char id, unsigned char *data, unsigned int len) { i2c_clr_irq_status(I2C_TX_BUF_STATUS); - reg_i2c_id = id & (~FLD_I2C_WRITE_READ_BIT); //BIT(0):R:High W:Low +#if CONFIG_I2C_LED + reg_i2c_id = id; //BIT(0):R:High W:Low +#else + reg_i2c_id = id & (~FLD_I2C_WRITE_READ_BIT); //BIT(0):R:High W:Low +#endif reg_i2c_sct1 = (FLD_I2C_LS_ID | FLD_I2C_LS_START); if (I2C_WAIT(I2C_API_ERROR_TIMEOUT_ID)) { return DRV_API_TIMEOUT; diff --git a/tlsr9/drivers/TL321X/pwm.c b/tlsr9/drivers/TL321X/pwm.c index 946be0c1..13f88c30 100644 --- a/tlsr9/drivers/TL321X/pwm.c +++ b/tlsr9/drivers/TL321X/pwm.c @@ -115,3 +115,27 @@ void pwm_set_tx_dma_add_list_element(dma_chn_e chn, dma_chain_config_t *config_a config_addr->dma_chain_data_len = dma_cal_size(data_len, DMA_WORD_WIDTH); config_addr->dma_chain_llp_ptr = (unsigned int)(llpoint); } + +/** + * @brief This function servers to start the pwm,can have more than one PWM open at the same time. + * @param[in] en - variable of enum to select the pwm. + * @return none. + */ +void pwm_start_t(pwm_en_e en) +{ + pwm_start(en); +} + +/** +* @brief This function servers to stop the pwm,can have more than one PWM stop at the same time. + * @param[in] en - variable of enum to select the pwm. + * @return none. + */ +void pwm_stop_t(pwm_en_e en) +{ + pwm_stop(en); +} + +pwm_set_pin_t pwm_set_pinctrl = pwm_set_pin; +pwm_set_start_t pwm_set_start = pwm_start_t; +pwm_set_stop_t pwm_set_stop = pwm_stop_t; diff --git a/tlsr9/drivers/TL321X/pwm.h b/tlsr9/drivers/TL321X/pwm.h index 92c3a1df..51377e02 100644 --- a/tlsr9/drivers/TL321X/pwm.h +++ b/tlsr9/drivers/TL321X/pwm.h @@ -122,9 +122,9 @@ static inline void pwm_set_tmax(pwm_id_e id, unsigned short tmax) * @param[in] en - variable of enum to select the pwm. * @return none. */ -static inline void pwm_start(pwm_en_e en) -{ - reg_pwm_enable |= en; +static inline void pwm_start(pwm_en_e en){ + if(!(reg_pwm_enable & en)) + reg_pwm_enable |= en; } /** @@ -466,4 +466,14 @@ static inline void pwm_32k_chn_dis(pwm_clk_32k_en_chn_e pwm_32K_en_chn) { BM_CLR(reg_pwm_mode32k, pwm_32K_en_chn); } + + +typedef void (*pwm_set_pin_t)(gpio_func_pin_e pin, gpio_func_e func); +typedef void (*pwm_set_start_t)(pwm_en_e en); +typedef void (*pwm_set_stop_t)(pwm_en_e id); + +extern pwm_set_pin_t pwm_set_pinctrl; +extern pwm_set_start_t pwm_set_start; +extern pwm_set_stop_t pwm_set_stop; + #endif From 0a0463e9a61d202f0cceb92dc7f0543893a8f5bd Mon Sep 17 00:00:00 2001 From: Fengtai Xie Date: Tue, 7 Jan 2025 14:40:30 +0800 Subject: [PATCH 2/4] riscv: telink: adjust analog register, flash protect for tl3218 - update lib . - add read and write pointer of analog register for TL3218X . - add flash 1920KB protect for TL3218X . Signed-off-by: Fengtai Xie --- tlsr9/CMakeLists.txt | 6 +++ tlsr9/drivers/TL321X/analog_user.c | 50 +++++++++++++++++++ tlsr9/drivers/TL321X/analog_user.h | 49 ++++++++++++++++++ tlsr9/drivers/TL321X/flash.c | 12 ++--- tlsr9/drivers/TL321X/lib/include/flash_prot.h | 3 ++ zephyr/module.yml | 2 +- 6 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 tlsr9/drivers/TL321X/analog_user.c create mode 100644 tlsr9/drivers/TL321X/analog_user.h diff --git a/tlsr9/CMakeLists.txt b/tlsr9/CMakeLists.txt index 79883c05..2fc3d237 100644 --- a/tlsr9/CMakeLists.txt +++ b/tlsr9/CMakeLists.txt @@ -66,6 +66,12 @@ endif() # NOT CONFIG_SOC_RISCV_TELINK_B91 # soc.c reference sources for B9X if (NOT (CONFIG_SOC_SERIES_RISCV_TELINK_TLX OR CONFIG_SOC_RISCV_TELINK_TLX)) zephyr_library_sources(drivers/${SOC}/clock.c) +endif() + +# analog reference sources for B9X and TL321X +if (CONFIG_SOC_RISCV_TELINK_TL321X) + zephyr_library_sources(drivers/${SOC}/analog_user.c) +else() zephyr_library_sources(drivers/${SOC}/analog.c) endif() diff --git a/tlsr9/drivers/TL321X/analog_user.c b/tlsr9/drivers/TL321X/analog_user.c new file mode 100644 index 00000000..56e9d27a --- /dev/null +++ b/tlsr9/drivers/TL321X/analog_user.c @@ -0,0 +1,50 @@ +/******************************************************************************************************** + * @file analog_user.c + * + * @brief This is the source file for TL321X + * + * @author Driver Group + * @date 2024 + * + * @par Copyright (c) 2024, Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *******************************************************************************************************/ + +#include "analog_user.h" +#include "lib/include/analog.h" + +/** + * @brief This function serves to analog register read by byte. + * @param[in] addr - address need to be read. + * @return the result of read. + */ +_attribute_ram_code_com_sec_noinline_ unsigned char user_analog_read_reg8(unsigned char addr) +{ + return analog_read_reg8(addr); +} + +/** + * @brief This function serves to analog register write by byte. + * @param[in] addr - address need to be write. + * @param[in] data - the value need to be write. + * @return none. + */ +_attribute_ram_code_com_sec_noinline_ void user_analog_write_reg8(unsigned char addr, unsigned char data) +{ + return analog_write_reg8(addr, data); +} + +_attribute_data_retention_sec_ analog_write_f analog_write = user_analog_write_reg8; +_attribute_data_retention_sec_ analog_read_f analog_read = user_analog_read_reg8; diff --git a/tlsr9/drivers/TL321X/analog_user.h b/tlsr9/drivers/TL321X/analog_user.h new file mode 100644 index 00000000..f65e1161 --- /dev/null +++ b/tlsr9/drivers/TL321X/analog_user.h @@ -0,0 +1,49 @@ +/******************************************************************************************************** + * @file analog_user.h + * + * @brief This is the header file for TL321X + * + * @author Driver Group + * @date 2024 + * + * @par Copyright (c) 2024, Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *******************************************************************************************************/ + +#pragma once + +#include "compiler.h" + +/** + * @brief This function serves to analog register read by byte. + * @param[in] addr - address need to be read. + * @return the result of read. + */ +_attribute_ram_code_com_sec_noinline_ unsigned char user_analog_read_reg8(unsigned char addr); + + +/** + * @brief This function serves to analog register write by byte. + * @param[in] addr - address need to be write. + * @param[in] data - the value need to be write. + * @return none. + */ +_attribute_ram_code_com_sec_noinline_ void user_analog_write_reg8(unsigned char addr, unsigned char data); + + +typedef void (*analog_write_f)(unsigned char, unsigned char); +extern _attribute_data_retention_sec_ analog_write_f analog_write; +typedef unsigned char (*analog_read_f)(unsigned char addr); +extern _attribute_data_retention_sec_ analog_read_f analog_read; diff --git a/tlsr9/drivers/TL321X/flash.c b/tlsr9/drivers/TL321X/flash.c index 44547fa4..b267b0ff 100644 --- a/tlsr9/drivers/TL321X/flash.c +++ b/tlsr9/drivers/TL321X/flash.c @@ -648,22 +648,20 @@ flash_capacity_e flash_get_capacity(unsigned int flash_mid) } /******************************************************************************************************************* - * This function serves to 1m area flash protection + * This function serves to 1920k area flash protection ******************************************************************************************************************/ #define FLASH_1M_ADR_OFFSET 0x100000 -#define FLASH_2M_ADR_OFFSET 0x200000 -#define FLASH_3M_ADR_OFFSET 0x300000 -#define FLASH_3M5_ADR_OFFSET 0x380000 +#define FLASH_1920K_ADR_OFFSET 0x1e0000 -#define FLASH_ADR_OFFSET_SELECT FLASH_1M_ADR_OFFSET +#define FLASH_ADR_OFFSET_SELECT FLASH_1920K_ADR_OFFSET -#define FLASH_PROTECT_BLOCK_SIZE FLASH_LOCK_FW_LOW_1M +#define FLASH_PROTECT_BLOCK_SIZE FLASH_LOCK_FW_LOW_1920K void flash_protection_lock_init(void) { flash_protection_init(); - unsigned int app_lockBlock = FLASH_PROTECT_BLOCK_SIZE; // init is 1M, in the ble lib, actual area will be less than 1m, so we protect 1m. + unsigned int app_lockBlock = FLASH_PROTECT_BLOCK_SIZE; // we will default to protect 1920KB flash for 2M buteo. unsigned int flash_lockBlock_cmd = flash_change_app_lock_block_to_flash_lock_block(app_lockBlock); diff --git a/tlsr9/drivers/TL321X/lib/include/flash_prot.h b/tlsr9/drivers/TL321X/lib/include/flash_prot.h index cdfaf8f4..b49917ce 100755 --- a/tlsr9/drivers/TL321X/lib/include/flash_prot.h +++ b/tlsr9/drivers/TL321X/lib/include/flash_prot.h @@ -75,6 +75,9 @@ typedef enum{ /* lock all Flash area, even system data and user data. * Attention: More conditions need to be considered, such as system data(SMP pairing information or OTA data if OTA used)*/ FLASH_LOCK_ALL_AREA = 4, + + /* User can set 1920KB flash protect. */ + FLASH_LOCK_FW_LOW_1920K = 0x09, }flash_app_lock_e; diff --git a/zephyr/module.yml b/zephyr/module.yml index b931c57d..2a15970c 100644 --- a/zephyr/module.yml +++ b/zephyr/module.yml @@ -24,7 +24,7 @@ blobs: type: lib version: 'V4.0.4.3' license-path: tlsr9/ble/license.txt - url: http://wiki.telink-semi.cn/wiki/protocols/Zephyr/binaries/public/tl321x_lib/lib_zephyr_tl321x_f44642133421864883e67eb8b94193ab71bf956d.a + url: http://wiki.telink-semi.cn/wiki/protocols/Zephyr/binaries/public/tl321x_lib/lib_zephyr_tl321x_e21ff4c6b90ca0e5bc3f9a0c8abe9239679a8f1c.a description: "Binary libraries supporting Telink TL321X series BLE subsystems" - path: lib_zephyr_tl321x_pm.a From a6e91151a62ccff1cc263a2ecae5df2a98e120d8 Mon Sep 17 00:00:00 2001 From: Fengtai Xie Date: Wed, 15 Jan 2025 13:14:12 +0800 Subject: [PATCH 3/4] riscv: telink: adjust analog register interface - add analog_user and adjust pointer of analog register . Signed-off-by: Fengtai Xie --- tlsr9/CMakeLists.txt | 7 ++-- tlsr9/drivers/B92/analog.c | 2 -- tlsr9/drivers/B92/analog.h | 4 --- tlsr9/drivers/B92/analog_user.c | 56 ++++++++++++++++++++++++++++++ tlsr9/drivers/B92/analog_user.h | 53 ++++++++++++++++++++++++++++ tlsr9/drivers/TL321X/analog_user.c | 12 +++++-- tlsr9/drivers/TL321X/analog_user.h | 10 ++++-- 7 files changed, 128 insertions(+), 16 deletions(-) create mode 100644 tlsr9/drivers/B92/analog_user.c create mode 100644 tlsr9/drivers/B92/analog_user.h diff --git a/tlsr9/CMakeLists.txt b/tlsr9/CMakeLists.txt index 2fc3d237..2a36e5b0 100644 --- a/tlsr9/CMakeLists.txt +++ b/tlsr9/CMakeLists.txt @@ -66,13 +66,12 @@ endif() # NOT CONFIG_SOC_RISCV_TELINK_B91 # soc.c reference sources for B9X if (NOT (CONFIG_SOC_SERIES_RISCV_TELINK_TLX OR CONFIG_SOC_RISCV_TELINK_TLX)) zephyr_library_sources(drivers/${SOC}/clock.c) + zephyr_library_sources(drivers/${SOC}/analog.c) endif() -# analog reference sources for B9X and TL321X -if (CONFIG_SOC_RISCV_TELINK_TL321X) +# analog_user.c reference sources for B92 and TL321X +if (CONFIG_SOC_RISCV_TELINK_B92 OR CONFIG_SOC_RISCV_TELINK_TL321X) zephyr_library_sources(drivers/${SOC}/analog_user.c) -else() - zephyr_library_sources(drivers/${SOC}/analog.c) endif() # MbedTLS HW acceleration diff --git a/tlsr9/drivers/B92/analog.c b/tlsr9/drivers/B92/analog.c index 95c72cab..eb0af29d 100644 --- a/tlsr9/drivers/B92/analog.c +++ b/tlsr9/drivers/B92/analog.c @@ -83,8 +83,6 @@ dma_config_t analog_rx_dma_config={ * local function prototype * *********************************************************************************************************************/ -_attribute_data_retention_sec_ analog_write_f analog_write = analog_write_reg8; -_attribute_data_retention_sec_ analog_read_f analog_read = analog_read_reg8; /** * @brief This function serves to judge whether analog write/read is busy . diff --git a/tlsr9/drivers/B92/analog.h b/tlsr9/drivers/B92/analog.h index 71f0a5d9..1135ceec 100644 --- a/tlsr9/drivers/B92/analog.h +++ b/tlsr9/drivers/B92/analog.h @@ -59,10 +59,6 @@ * global function prototype * *********************************************************************************************************************/ -typedef void (*analog_write_f)(unsigned char, unsigned char); -extern _attribute_data_retention_sec_ analog_write_f analog_write; -typedef unsigned char (*analog_read_f)(unsigned char addr); -extern _attribute_data_retention_sec_ analog_read_f analog_read; /** * @brief This function serves to analog register read by byte. diff --git a/tlsr9/drivers/B92/analog_user.c b/tlsr9/drivers/B92/analog_user.c new file mode 100644 index 00000000..21d3b2a7 --- /dev/null +++ b/tlsr9/drivers/B92/analog_user.c @@ -0,0 +1,56 @@ +/******************************************************************************************************** + * @file analog_user.c + * + * @brief This is the source file for TLSR9528 + * + * @author Driver Group + * @date 2024 + * + * @par Copyright (c) 2024, Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *******************************************************************************************************/ + +#include "analog_user.h" +#include "analog.h" + +/** + * @brief This function serves to analog register read by byte. + * @param[in] addr - address need to be read. + * @return the result of read. + */ +_attribute_ram_code_sec_optimize_o2_ unsigned char user_analog_read_reg8(unsigned char addr) +{ + return analog_read_reg8(addr); +} + +/** + * @brief This function serves to analog register write by byte. + * @param[in] addr - address need to be write. + * @param[in] data - the value need to be write. + * @return none. + */ +_attribute_ram_code_sec_optimize_o2_ int user_analog_write_reg8(unsigned char addr, unsigned char data) +{ + if (addr == analog_reg_59 || addr == analog_reg_60) + { + analog_write_reg8(addr, data); + return 0; + } + return -1; +} + + +_attribute_data_retention_sec_ analog_read_f analog_read = user_analog_read_reg8; +_attribute_data_retention_sec_ analog_write_f analog_write = user_analog_write_reg8; diff --git a/tlsr9/drivers/B92/analog_user.h b/tlsr9/drivers/B92/analog_user.h new file mode 100644 index 00000000..f9e4264d --- /dev/null +++ b/tlsr9/drivers/B92/analog_user.h @@ -0,0 +1,53 @@ +/******************************************************************************************************** + * @file analog_user.h + * + * @brief This is the header file for TLSR9528 + * + * @author Driver Group + * @date 2024 + * + * @par Copyright (c) 2024, Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *******************************************************************************************************/ + +#pragma once + +#include "compiler.h" + +#define analog_reg_59 (0x3b) +#define analog_reg_60 (0x3c) + +/** + * @brief This function serves to analog register read by byte. + * @param[in] addr - address need to be read. + * @return the result of read. + */ +_attribute_ram_code_sec_optimize_o2_ unsigned char user_analog_read_reg8(unsigned char addr); + + +/** + * @brief This function serves to analog register write by byte. + * @param[in] addr - address need to be write. + * @param[in] data - the value need to be write. + * @return none. + */ +_attribute_ram_code_sec_optimize_o2_ int user_analog_write_reg8(unsigned char addr, unsigned char data); + + +typedef unsigned char (*analog_read_f)(unsigned char addr); +typedef int (*analog_write_f)(unsigned char addr, unsigned char data); + +extern _attribute_data_retention_sec_ analog_read_f analog_read; +extern _attribute_data_retention_sec_ analog_write_f analog_write; diff --git a/tlsr9/drivers/TL321X/analog_user.c b/tlsr9/drivers/TL321X/analog_user.c index 56e9d27a..92f400b4 100644 --- a/tlsr9/drivers/TL321X/analog_user.c +++ b/tlsr9/drivers/TL321X/analog_user.c @@ -41,10 +41,16 @@ _attribute_ram_code_com_sec_noinline_ unsigned char user_analog_read_reg8(unsign * @param[in] data - the value need to be write. * @return none. */ -_attribute_ram_code_com_sec_noinline_ void user_analog_write_reg8(unsigned char addr, unsigned char data) +_attribute_ram_code_com_sec_noinline_ int user_analog_write_reg8(unsigned char addr, unsigned char data) { - return analog_write_reg8(addr, data); + if (addr == analog_reg_59 || addr == analog_reg_60) + { + analog_write_reg8(addr, data); + return 0; + } + return -1; } -_attribute_data_retention_sec_ analog_write_f analog_write = user_analog_write_reg8; + _attribute_data_retention_sec_ analog_read_f analog_read = user_analog_read_reg8; +_attribute_data_retention_sec_ analog_write_f analog_write = user_analog_write_reg8; diff --git a/tlsr9/drivers/TL321X/analog_user.h b/tlsr9/drivers/TL321X/analog_user.h index f65e1161..54a1ed1a 100644 --- a/tlsr9/drivers/TL321X/analog_user.h +++ b/tlsr9/drivers/TL321X/analog_user.h @@ -26,6 +26,9 @@ #include "compiler.h" +#define analog_reg_59 (0x3b) +#define analog_reg_60 (0x3c) + /** * @brief This function serves to analog register read by byte. * @param[in] addr - address need to be read. @@ -40,10 +43,11 @@ _attribute_ram_code_com_sec_noinline_ unsigned char user_analog_read_reg8(unsign * @param[in] data - the value need to be write. * @return none. */ -_attribute_ram_code_com_sec_noinline_ void user_analog_write_reg8(unsigned char addr, unsigned char data); +_attribute_ram_code_com_sec_noinline_ int user_analog_write_reg8(unsigned char addr, unsigned char data); -typedef void (*analog_write_f)(unsigned char, unsigned char); -extern _attribute_data_retention_sec_ analog_write_f analog_write; typedef unsigned char (*analog_read_f)(unsigned char addr); +typedef int (*analog_write_f)(unsigned char addr, unsigned char data); + extern _attribute_data_retention_sec_ analog_read_f analog_read; +extern _attribute_data_retention_sec_ analog_write_f analog_write; From 4a5928e4f3d20f29cf367d4a840339ffe7ee92d2 Mon Sep 17 00:00:00 2001 From: Fengtai Xie Date: Wed, 5 Mar 2025 19:52:25 +0800 Subject: [PATCH 4/4] riscv: telink: update lib - update tl321x lib . - clean the hal code . Signed-off-by: Fengtai Xie --- tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c | 6 +++--- tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c | 6 +++--- tlsr9/drivers/B92/analog.h | 1 - tlsr9/drivers/B92/i2c.c | 2 +- tlsr9/drivers/B92/pwm.h | 2 ++ tlsr9/drivers/TL321X/pwm.h | 5 ++++- zephyr/module.yml | 2 +- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c b/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c index 7b68a0ac..5cd66d85 100644 --- a/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c +++ b/tlsr9/ble/vendor/controller/b9x/b9x_bt_flash.c @@ -30,7 +30,7 @@ #include #if CONFIG_SOC_RISCV_TELINK_B92 -#define USER_PARA_MAC_OFFSET (0x100) +#define USER_PARA_MAC_OFFSET (0x100) #define USER_PARTITION user_para_partition #define USER_PARTITION_DEVICE FIXED_PARTITION_DEVICE(USER_PARTITION) #define USER_PARTITION_OFFSET FIXED_PARTITION_OFFSET(USER_PARTITION) @@ -120,11 +120,11 @@ _attribute_no_inline_ int b9x_bt_blc_mac_init(uint8_t *bt_mac) + B9X_BT_MAC_ADDR_OFFSET, temp_mac, BLE_ADDR_LEN + 3); #else #if CONFIG_SOC_RISCV_TELINK_B92 - uint8_t dummy_mac[BLE_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + uint8_t dummy_mac[BLE_ADDR_LEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /*Get the ramdom mac address from zb which will passed in the user-para sector */ err = flash_read(USER_PARTITION_DEVICE, USER_PARTITION_OFFSET - + USER_PARA_MAC_OFFSET, bt_mac, BLE_ADDR_LEN ); + + USER_PARA_MAC_OFFSET, bt_mac, BLE_ADDR_LEN); if(memcmp(bt_mac, dummy_mac, sizeof(dummy_mac)) == 0){ // if mac address is empty, use random instead . generateRandomNum(BLE_ADDR_LEN, bt_mac); diff --git a/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c b/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c index 3de7f38f..727fcd05 100644 --- a/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c +++ b/tlsr9/ble/vendor/controller/tlx/tlx_bt_flash.c @@ -28,7 +28,7 @@ #include #include -#define USER_PARA_MAC_OFFSET (0x100) +#define USER_PARA_MAC_OFFSET (0x100) #define USER_PARTITION user_para_partition #define USER_PARTITION_DEVICE FIXED_PARTITION_DEVICE(USER_PARTITION) #define USER_PARTITION_OFFSET FIXED_PARTITION_OFFSET(USER_PARTITION) @@ -117,11 +117,11 @@ _attribute_no_inline_ int tlx_bt_blc_mac_init(uint8_t *bt_mac) + TLX_BT_MAC_ADDR_OFFSET, temp_mac, BLE_ADDR_LEN + 3); #else #if CONFIG_SOC_RISCV_TELINK_TL321X - uint8_t dummy_mac[BLE_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + uint8_t dummy_mac[BLE_ADDR_LEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /*Get the ramdom mac address from zb which will passed in the user-para sector */ err = flash_read(USER_PARTITION_DEVICE, USER_PARTITION_OFFSET - + USER_PARA_MAC_OFFSET, bt_mac, BLE_ADDR_LEN ); + + USER_PARA_MAC_OFFSET, bt_mac, BLE_ADDR_LEN); if(memcmp(bt_mac, dummy_mac, sizeof(dummy_mac)) == 0){ // if mac address is empty, use random instead . generateRandomNum(BLE_ADDR_LEN, bt_mac); diff --git a/tlsr9/drivers/B92/analog.h b/tlsr9/drivers/B92/analog.h index 1135ceec..166acbc6 100644 --- a/tlsr9/drivers/B92/analog.h +++ b/tlsr9/drivers/B92/analog.h @@ -59,7 +59,6 @@ * global function prototype * *********************************************************************************************************************/ - /** * @brief This function serves to analog register read by byte. * @param[in] addr - address need to be read. diff --git a/tlsr9/drivers/B92/i2c.c b/tlsr9/drivers/B92/i2c.c index 86ceeb42..6b14a250 100644 --- a/tlsr9/drivers/B92/i2c.c +++ b/tlsr9/drivers/B92/i2c.c @@ -203,7 +203,7 @@ unsigned char i2c_master_write(unsigned char id, unsigned char *data, unsigned i { i2c_clr_irq_status(I2C_TX_BUF_STATUS); #if CONFIG_I2C_LED - reg_i2c_id = id; //BIT(0):R:High W:Low + reg_i2c_id = id; //BIT(0):R:High W:Low #else reg_i2c_id = id & (~FLD_I2C_WRITE_READ_BIT); //BIT(0):R:High W:Low #endif diff --git a/tlsr9/drivers/B92/pwm.h b/tlsr9/drivers/B92/pwm.h index 60090c9f..d4c46311 100644 --- a/tlsr9/drivers/B92/pwm.h +++ b/tlsr9/drivers/B92/pwm.h @@ -134,7 +134,9 @@ static inline void pwm_set_tmax(pwm_id_e id, unsigned short tmax){ */ static inline void pwm_start(pwm_en_e en){ if(!(reg_pwm_enable & en)) + { reg_pwm_enable|=en; + } } diff --git a/tlsr9/drivers/TL321X/pwm.h b/tlsr9/drivers/TL321X/pwm.h index 51377e02..dd15e399 100644 --- a/tlsr9/drivers/TL321X/pwm.h +++ b/tlsr9/drivers/TL321X/pwm.h @@ -122,9 +122,12 @@ static inline void pwm_set_tmax(pwm_id_e id, unsigned short tmax) * @param[in] en - variable of enum to select the pwm. * @return none. */ -static inline void pwm_start(pwm_en_e en){ +static inline void pwm_start(pwm_en_e en) +{ if(!(reg_pwm_enable & en)) + { reg_pwm_enable |= en; + } } /** diff --git a/zephyr/module.yml b/zephyr/module.yml index 2a15970c..b931c57d 100644 --- a/zephyr/module.yml +++ b/zephyr/module.yml @@ -24,7 +24,7 @@ blobs: type: lib version: 'V4.0.4.3' license-path: tlsr9/ble/license.txt - url: http://wiki.telink-semi.cn/wiki/protocols/Zephyr/binaries/public/tl321x_lib/lib_zephyr_tl321x_e21ff4c6b90ca0e5bc3f9a0c8abe9239679a8f1c.a + url: http://wiki.telink-semi.cn/wiki/protocols/Zephyr/binaries/public/tl321x_lib/lib_zephyr_tl321x_f44642133421864883e67eb8b94193ab71bf956d.a description: "Binary libraries supporting Telink TL321X series BLE subsystems" - path: lib_zephyr_tl321x_pm.a