From a6390dd746f0067b855a6b41293159244f3ca1b4 Mon Sep 17 00:00:00 2001 From: wifi-ci-agent Date: Thu, 10 Oct 2024 15:28:30 +0000 Subject: [PATCH] WiSeConnect 3 SDK release: v3.3.3 --- README.md | 4 +- .../board/silabs/component/brd2605a.slcc | 4 +- .../silabs/component/brd2605a_config.slcc | 42 +- .../board/silabs/component/brd4325a.slcc | 2 + .../silabs/component/brd4325a_config.slcc | 15 +- .../board/silabs/component/brd4325b.slcc | 2 + .../silabs/component/brd4325b_config.slcc | 15 +- .../board/silabs/component/brd4325c.slcc | 2 + .../silabs/component/brd4325c_config.slcc | 15 +- .../board/silabs/component/brd4325e.slcc | 2 + .../silabs/component/brd4325e_config.slcc | 15 +- .../board/silabs/component/brd4325f.slcc | 2 + .../silabs/component/brd4325f_config.slcc | 15 +- .../board/silabs/component/brd4325g.slcc | 2 + .../silabs/component/brd4325g_config.slcc | 15 +- .../board/silabs/component/brd4338a.slcc | 2 + .../silabs/component/brd4338a_config.slcc | 49 +- .../board/silabs/component/brd4339a.slcc | 2 + .../silabs/component/brd4339a_config.slcc | 44 +- .../board/silabs/component/brd4339b.slcc | 2 + .../silabs/component/brd4339b_config.slcc | 49 +- .../board/silabs/component/brd4340a.slcc | 2 + .../silabs/component/brd4340a_config.slcc | 44 +- .../board/silabs/component/brd4340b.slcc | 2 + .../silabs/component/brd4340b_config.slcc | 49 +- .../board/silabs/component/brd4341a.slcc | 2 + .../silabs/component/brd4341a_config.slcc | 49 +- .../board/silabs/component/brd4342a.slcc | 2 + .../silabs/component/brd4342a_config.slcc | 44 +- .../board/silabs/component/brd4343a.slcc | 5 +- .../silabs/component/brd4343a_config.slcc | 49 +- .../board/silabs/component/brd4343b.slcc | 5 +- .../silabs/component/brd4343b_config.slcc | 49 +- .../board/silabs/component/brd4343q.slcc | 5 +- .../silabs/component/brd4343q_config.slcc | 49 +- .../silabs/config/brd2605a/RTE_Device_917.h | 506 +- .../board/silabs/config/brd2605a/pin_config.h | 13 +- .../brd2605a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h} | 70 +- .../sl_si91x_button_init_btn1_config.h | 43 + .../brd2605a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd2605a/sl_si91x_icm40627_config.h | 94 + .../brd2605a/sl_si91x_led_init_ledB_config.h | 28 + .../silabs/config/brd4338a/RTE_Device_917.h | 467 +- .../board/silabs/config/brd4338a/pin_config.h | 13 +- .../brd4338a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4338a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4338a/sl_si91x_led_init_led0_config.h | 28 + .../brd4338a/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4338a/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4339a/RTE_Device_917.h | 469 +- .../board/silabs/config/brd4339a/pin_config.h | 13 +- .../brd4339a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4339a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4339a/sl_si91x_led_init_led0_config.h | 40 + .../brd4339a/sl_si91x_led_init_led1_config.h | 40 + .../config/brd4339a/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4339b/RTE_Device_917.h | 469 +- .../board/silabs/config/brd4339b/pin_config.h | 13 +- .../brd4339b/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4339b/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4339b/sl_si91x_led_init_led0_config.h | 28 + .../brd4339b/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4339b/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4340a/RTE_Device_917.h | 469 +- .../board/silabs/config/brd4340a/pin_config.h | 13 +- .../brd4340a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4340a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4340a/sl_si91x_led_init_led0_config.h | 28 + .../brd4340a/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4340a/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4340b/RTE_Device_917.h | 469 +- .../board/silabs/config/brd4340b/pin_config.h | 13 +- .../brd4340b/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4340b/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4340b/sl_si91x_led_init_led0_config.h | 28 + .../brd4340b/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4340b/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4341a/RTE_Device_917.h | 469 +- .../brd4341a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4341a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4341a/sl_si91x_led_init_led0_config.h | 28 + .../brd4341a/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4341a/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4342a/RTE_Device_917.h | 469 +- .../board/silabs/config/brd4342a/pin_config.h | 13 +- .../brd4342a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4342a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4342a/sl_si91x_led_init_led0_config.h | 28 + .../brd4342a/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4342a/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4343a/RTE_Device_917.h | 594 +-- .../board/silabs/config/brd4343a/pin_config.h | 13 +- .../brd4343a/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4343a/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4343a/sl_si91x_led_init_led0_config.h | 28 + .../brd4343a/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4343a/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4343b/RTE_Device_917.h | 600 +-- .../board/silabs/config/brd4343b/pin_config.h | 13 +- .../brd4343b/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4343b/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4343b/sl_si91x_led_init_led0_config.h | 28 + .../brd4343b/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4343b/sl_si91x_memlcd_config.h | 109 + .../silabs/config/brd4343q/RTE_Device_917.h | 600 +-- .../board/silabs/config/brd4343q/pin_config.h | 13 +- .../brd4343q/sl_iostream_usart_vcom_config.h | 135 + .../sl_si91x_button_init_btn0_config.h | 42 + .../sl_si91x_button_init_btn1_config.h | 43 + .../brd4343q/sl_si91x_i2c_init_i2c2_config.h | 115 + .../brd4343q/sl_si91x_led_init_led0_config.h | 28 + .../brd4343q/sl_si91x_led_init_led1_config.h | 28 + .../config/brd4343q/sl_si91x_memlcd_config.h | 109 + .../sl_si91x_adc_init_channel_10_config.h | 20 +- .../sl_si91x_adc_init_channel_11_config.h | 20 +- .../sl_si91x_adc_init_channel_12_config.h | 20 +- .../sl_si91x_adc_init_channel_13_config.h | 20 +- .../sl_si91x_adc_init_channel_14_config.h | 20 +- .../sl_si91x_adc_init_channel_15_config.h | 20 +- .../sl_si91x_adc_init_channel_16_config.h | 20 +- .../sl_si91x_adc_init_channel_1_config.h | 38 +- .../sl_si91x_adc_init_channel_2_config.h | 38 +- .../sl_si91x_adc_init_channel_3_config.h | 38 +- .../sl_si91x_adc_init_channel_4_config.h | 38 +- .../sl_si91x_adc_init_channel_5_config.h | 38 +- .../sl_si91x_adc_init_channel_6_config.h | 38 +- .../sl_si91x_adc_init_channel_7_config.h | 38 +- .../sl_si91x_adc_init_channel_8_config.h | 38 +- .../sl_si91x_adc_init_channel_9_config.h | 38 +- ...91x_analog_comparator_comparator1_config.h | 4 +- ...91x_analog_comparator_comparator2_config.h | 4 +- .../sl_si91x_i2c_init_i2c0_config.h | 8 +- .../sl_si91x_i2c_init_i2c1_config.h | 8 +- .../sl_si91x_i2c_init_i2c2_config.h | 8 +- .../sl_si91x_pwm_init_channel_0_config.h | 40 +- .../sl_si91x_pwm_init_channel_1_config.h | 40 +- .../sl_si91x_pwm_init_channel_2_config.h | 40 +- .../sl_si91x_pwm_init_channel_3_config.h | 40 +- .../sl_si91x_pwm_init_led1_config.h | 156 + .../component/device_needs_ram_execution.slcc | 4 +- .../core/chip/component/siwg917m100mgtba.slcc | 3 +- .../core/chip/component/siwg917m100xntba.slcc | 2 + .../core/chip/component/siwg917m110lgtba.slcc | 15 +- .../core/chip/component/siwg917m111mgtba.slcc | 4 +- .../core/chip/component/siwg917m111xgtba.slcc | 2 + .../core/chip/component/siwg917m121xgtba.slcc | 2 + .../core/chip/component/siwg917m141xgtba.slcc | 2 + .../core/chip/component/siwg917y110lgaba.slcc | 149 + .../core/chip/component/siwg917y110lgnba.slcc | 149 + .../core/chip/component/siwg917y111mgab.slcc | 6 +- .../core/chip/component/siwg917y111mgaba.slcc | 145 + .../core/chip/component/siwg917y111mgnba.slcc | 6 +- .../core/chip/component/siwg917y111xgaba.slcc | 153 + .../core/chip/component/siwg917y111xgnba.slcc | 153 + .../core/chip/component/siwg917y121mgaba.slcc | 168 + .../core/chip/component/siwg917y121mgnb.slcc | 6 +- .../core/chip/component/siwg917y121mgnba.slcc | 168 + .../sl_si91x_external_oscillator.slcc | 15 + .../mcu/core/chip/config/RTE_Device_917.h | 599 +-- .../si91x/mcu/core/chip/config/pin_config.h | 83 +- .../config/sl_si91x_external_oscillator.h | 49 + .../si91x/mcu/core/chip/inc/system_si91x.h | 1 + .../mcu/core/chip/src/rsi_deepsleep_soc.c | 4 - .../si91x/mcu/core/chip/src/startup_si91x.c | 16 +- .../si91x/mcu/core/chip/src/system_si91x.c | 22 +- .../core/common/component/si91x_debug.slcc | 4 +- .../core/common/component/si91x_debug_uc.slcc | 17 + .../config/sl_si91x_debug_uc_1_config.h} | 63 +- .../config/sl_si91x_debug_uc_2_config.h | 66 + .../si91x/mcu/core/common/inc/rsi_debug.h | 14 +- .../si91x/mcu/core/common/si91x_debug.slcc | 3 +- .../si91x/mcu/core/common/src/rsi_debug.c | 48 +- .../si91x/mcu/drivers/cmsis_driver/CAN.c | 982 ---- .../si91x/mcu/drivers/cmsis_driver/CAN.h | 136 - .../CMSIS/Driver/Include/Driver_CAN.h | 232 - .../CMSIS/Driver/Include/Driver_ETH.h | 85 - .../CMSIS/Driver/Include/Driver_ETH_MAC.h | 301 -- .../CMSIS/Driver/Include/Driver_ETH_PHY.h | 133 - .../CMSIS/Driver/Include/Driver_MCI.h | 350 -- .../CMSIS/Driver/Include/Driver_NAND.h | 403 -- .../CMSIS/Driver/Include/Driver_USB.h | 95 - .../CMSIS/Driver/Include/Driver_USBD.h | 263 - .../CMSIS/Driver/Include/Driver_USBH.h | 406 -- .../Driver/component/cmsis_can_driver.slcc | 16 - .../Driver/component/cmsis_eth_driver.slcc | 16 - .../component/cmsis_eth_mac_driver.slcc | 16 - .../component/cmsis_eth_phy_driver.slcc | 16 - .../Driver/component/cmsis_mci_driver.slcc | 16 - .../Driver/component/cmsis_nand_driver.slcc | 16 - .../Driver/component/cmsis_usb_driver.slcc | 16 - .../Driver/component/cmsis_usbd_driver.slcc | 16 - .../Driver/component/cmsis_usbh_driver.slcc | 16 - .../si91x/mcu/drivers/cmsis_driver/EMAC.c | 1069 ----- .../si91x/mcu/drivers/cmsis_driver/EMAC.h | 445 -- .../si91x/mcu/drivers/cmsis_driver/MCI.c | 1118 ----- .../si91x/mcu/drivers/cmsis_driver/MCI.h | 195 - .../mcu/drivers/cmsis_driver/PHY_LAN8742A.c | 292 -- .../mcu/drivers/cmsis_driver/PHY_LAN8742A.h | 91 - .../si91x/mcu/drivers/cmsis_driver/SAI.c | 4 +- .../si91x/mcu/drivers/cmsis_driver/SPI.c | 20 +- .../si91x/mcu/drivers/cmsis_driver/USB.c | 80 - .../si91x/mcu/drivers/cmsis_driver/USB.h | 210 - .../si91x/mcu/drivers/cmsis_driver/USBD.c | 886 ---- .../si91x/mcu/drivers/cmsis_driver/USBH.c | 244 - .../cmsis_driver/component/cmsis_can.slcc | 18 - .../cmsis_driver/component/cmsis_emac.slcc | 18 - .../cmsis_driver/component/cmsis_mci.slcc | 18 - .../cmsis_driver/component/cmsis_phy_lan.slcc | 18 - .../cmsis_driver/component/cmsis_usb.slcc | 18 - .../cmsis_driver/component/cmsis_usbd.slcc | 14 - .../cmsis_driver/component/cmsis_usbh.slcc | 14 - .../button/component/sl_si91x_button_917.slcc | 3 +- .../sl_si91x_button_init_instance_config.h | 47 + .../config/sl_si91x_button_pin_config.h | 5 + .../inst/sl_si91x_button_instances.c.jinja | 3 - .../inst/sl_si91x_button_instances.h.jinja | 3 + .../button/src/sl_si91x_button.c | 1 + .../icm40627/component/sl_icm40627.slcc | 3 + .../config/sl_si91x_icm40627_config.h | 43 + .../icm40627/src/sl_si91x_icm40627.c | 24 +- .../led/component/sl_si91x_led_917.slcc | 59 +- .../led/config/sl_si91x_led_config.h | 14 +- .../sl_si91x_led_init_instance_config.h | 49 + .../hardware_drivers/led/inc/sl_si91x_led.h | 21 +- .../led/inst/sl_si91x_led_instances.c.jinja | 2 +- .../led/inst/sl_si91x_led_instances.h.jinja | 11 +- .../hardware_drivers/led/src/sl_si91x_led.c | 20 +- .../memlcd/component/memlcd_917.slcc | 3 + .../memlcd/config/sl_si91x_memlcd_config.h | 112 + .../hardware_drivers/memlcd/inc/sl_memlcd.h | 50 +- .../hardware_drivers/memlcd/src/sl_memlcd.c | 56 + .../component/sl_si91x_rgb_led_917.slcc | 17 +- .../rgb_led/config/sl_si91x_rgb_led_config.h | 48 +- .../rgb_led/inc/sl_si91x_rgb_led.h | 242 +- .../inst/sl_si91x_rgb_led_instances.c.jinja | 72 +- .../inst/sl_si91x_rgb_led_instances.h.jinja | 12 +- .../rgb_led/src/sl_si91x_rgb_led.c | 271 +- .../si70xx_sensor/component/sl_si70xx.slcc | 3 + .../config/sl_si91x_i2c_init_i2c2_config.h | 118 + .../config/sl_si91x_joystick_config.h | 23 + .../sl_joystick/src/sl_si91x_joystick.c | 66 +- .../component/rsilib_cci.slcc | 18 - .../component/rsilib_fim.slcc | 18 - .../component/rsilib_ir.slcc | 18 - .../component/rsilib_sdioh.slcc | 18 - .../component/rsilib_sdmem.slcc | 18 - .../component/rsilib_smih.slcc | 18 - .../component/rsilib_vad.slcc | 18 - .../component/rsilib_wurx.slcc | 18 - .../drivers/peripheral_drivers/inc/rsi_cci.h | 104 - .../drivers/peripheral_drivers/inc/rsi_fim.h | 725 --- .../drivers/peripheral_drivers/inc/rsi_ir.h | 227 - .../peripheral_drivers/inc/rsi_sdioh.h | 205 - .../peripheral_drivers/inc/rsi_sdmem.h | 219 - .../drivers/peripheral_drivers/inc/rsi_smih.h | 486 -- .../drivers/peripheral_drivers/inc/rsi_vad.h | 164 - .../drivers/peripheral_drivers/inc/rsi_wurx.h | 143 - .../drivers/peripheral_drivers/src/rsi_adc.c | 67 +- .../drivers/peripheral_drivers/src/rsi_cci.c | 174 - .../drivers/peripheral_drivers/src/rsi_dac.c | 7 +- .../drivers/peripheral_drivers/src/rsi_fim.c | 4223 ----------------- .../drivers/peripheral_drivers/src/rsi_i2s.c | 14 +- .../drivers/peripheral_drivers/src/rsi_ir.c | 59 - .../peripheral_drivers/src/rsi_sdioh.c | 798 ---- .../peripheral_drivers/src/rsi_sdmem.c | 1242 ----- .../drivers/peripheral_drivers/src/rsi_smih.c | 1184 ----- .../drivers/peripheral_drivers/src/rsi_vad.c | 516 -- .../drivers/peripheral_drivers/src/rsi_wurx.c | 716 --- .../service/images/init_deinit_sequence.png | Bin 0 -> 17754 bytes .../nvm3/src/sl_si91x_common_flash_intf.c | 3 +- .../inc/sl_si91x_power_manager.h | 38 +- .../src/sli_si91x_power_manager.c | 45 +- .../src/sli_si91x_power_manager_wakeup_init.c | 24 +- .../service/sensorhub/inc/sensor_hub.h | 48 +- .../service/sensorhub/src/sensor_hub.c | 12 +- .../src/sl_sleeptimer_hal_si91x_sysrtc.c | 9 - .../drivers/systemlevel/inc/rsi_power_save.h | 2 +- .../mcu/drivers/systemlevel/inc/rsi_rtc.h | 4 +- .../mcu/drivers/systemlevel/src/rsi_rtc.c | 9 +- .../drivers/systemlevel/src/rsi_time_period.c | 24 +- .../unified_api/component/i2c_instance.slcc | 1 + .../unified_api/component/sl_calendar.slcc | 2 - .../unified_api/component/sl_ulp_uart.slcc | 1 + .../aps1604m_sqr/sl_si91x_psram_config.h | 8 - .../aps6404l_sqh/sl_si91x_psram_config.h | 8 - .../aps6404l_sqrh/sl_si91x_psram_config.h | 8 - .../unified_api/config/sl_si91x_dac_config.h | 2 +- .../config/sl_si91x_sysrtc_config.h | 33 +- .../config/sl_si91x_ulp_timer_common_config.h | 25 +- .../config/sl_si91x_watchdog_timer_config.h | 13 - .../unified_api/inc/sl_si91x_calendar.h | 130 +- .../drivers/unified_api/inc/sl_si91x_dma.h | 6 +- .../drivers/unified_api/inc/sl_si91x_i2c.h | 48 +- .../drivers/unified_api/inc/sl_si91x_psram.h | 5 - .../unified_api/inc/sl_si91x_psram_handle.h | 18 +- .../drivers/unified_api/inc/sl_si91x_usart.h | 20 +- .../unified_api/inc/sl_si91x_watchdog_timer.h | 49 +- .../drivers/unified_api/src/sl_si91x_adc.c | 6 + .../src/sl_si91x_bjt_temperature_sensor.c | 4 + .../unified_api/src/sl_si91x_calendar.c | 319 +- .../drivers/unified_api/src/sl_si91x_dma.c | 13 +- .../drivers/unified_api/src/sl_si91x_i2c.c | 289 +- .../drivers/unified_api/src/sl_si91x_psram.c | 9 - .../unified_api/src/sl_si91x_watchdog_timer.c | 53 +- .../sl_sdio_secondary_peripheral.slcc | 2 - .../mcu/hal/inc/sl_si91x_hal_soc_soft_reset.h | 58 +- .../mcu/hal/src/sl_si91x_hal_soc_soft_reset.c | 4 +- .../mcu/toolchain/linkerfile_SoC.ld.jinja | 4 +- .../toolchain/linkerfile_psram_SoC.ld.jinja | 35 +- .../wireless/ahb_interface/src/sl_platform.c | 6 + .../asynchronous_socket/inc/sl_si91x_socket.h | 1 + .../asynchronous_socket/src/sl_si91x_socket.c | 7 +- .../si91x/wireless/inc/sl_rsi_utility.h | 5 + .../si91x/wireless/inc/sl_si91x_driver.h | 13 + .../si91x/wireless/inc/sl_si91x_types.h | 1 + .../si91x/wireless/inc/sl_wifi_device.h | 15 +- .../src/sl_net_si91x_integration_handler.c | 25 +- .../socket/inc/sl_si91x_socket_constants.h | 4 + .../socket/inc/sl_si91x_socket_types.h | 41 +- .../socket/inc/sl_si91x_socket_utility.h | 14 +- .../socket/src/sl_si91x_socket_utility.c | 78 +- .../si91x/wireless/src/sl_rsi_utility.c | 437 +- .../si91x/wireless/src/sl_si91x_driver.c | 47 + .../threading/sli_si91x_multithreaded.c | 62 +- components/protocol/wifi/inc/sl_wifi.h | 32 + .../protocol/wifi/inc/sl_wifi_constants.h | 8 +- components/protocol/wifi/inc/sl_wifi_types.h | 91 +- components/protocol/wifi/si91x/sl_wifi.c | 14 + components/service/bsd_socket/inc/socket.h | 1 + .../si91x_socket/sl_si91x_bsd_socket.c | 9 +- .../si91x_socket/sl_si91x_socket_support.h | 2 +- .../service/http_client/inc/sl_http_client.h | 3 +- .../http_client/si91x_socket/sl_http_client.c | 8 +- .../service/mqtt/si91x/sl_mqtt_client.c | 17 +- connectivity_firmware/README.md | 6 +- .../lite/SiWG917-B.2.12.2.1.2.9.rps | Bin 1283600 -> 0 bytes .../lite/SiWG917-B.2.12.3.3.2.3.rps | Bin 0 -> 1289440 bytes .../standard/SiWG917-B.2.12.2.1.0.9.rps | Bin 1688208 -> 0 bytes .../standard/SiWG917-B.2.12.3.3.0.3.rps | Bin 0 -> 1694096 bytes demos/brd2605a/out_of_box_demo.rps | Bin 105532 -> 107220 bytes demos/brd2605a/siwx917_dev_kit.rps | Bin 123916 -> 120244 bytes demos/brd4338a/cli_demo_soc.rps | Bin 129876 -> 132844 bytes demos/brd4338a/out_of_box_demo.rps | Bin 106692 -> 108188 bytes demos/brd4342a/out_of_box_demo.rps | Bin 106676 -> 108380 bytes demos/brd4343a/out_of_box_demo.rps | Bin 0 -> 108108 bytes docs/release-notes/index_ncp.md | 476 ++ docs/release-notes/index_soc.md | 698 +++ .../developer-guides/migrating-from-v3-3-2.md | 57 + .../siwx91x-software-reference-manual.md | 295 +- .../aws_device_shadow_ncp.slcp | 4 +- .../aws_device_shadow_psram.slcp | 4 +- .../aws_device_shadow_soc.slcp | 8 +- .../aws_device_shadow_uart_ncp.slcp | 4 +- examples/featured/aws_device_shadow/readme.md | 85 +- examples/featured/ble_per/ble_per_ncp.slcp | 4 +- examples/featured/ble_per/ble_per_psram.slcp | 4 +- examples/featured/ble_per/ble_per_soc.slcp | 4 +- .../featured/ble_per/ble_per_uart_ncp.slcp | 4 +- .../firmware_update_fg25_ncp.slcp | 4 +- .../firmware_update/firmware_update_ncp.slcp | 4 +- .../firmware_update_psram.slcp | 4 +- .../firmware_update/firmware_update_soc.slcp | 4 +- .../firmware_update_uart_ncp.slcp | 4 +- .../low_power/power_save_deep_sleep/app.c | 53 +- .../power_save_deep_sleep_ncp.slcp | 4 +- .../power_save_deep_sleep_soc.slcp | 4 +- .../power_save_deep_sleep_uart_ncp.slcp | 4 +- .../powersave_standby_associated/app.c | 488 +- .../powersave_standby_associated/app.h | 62 +- .../powersave_standby_associated.uvoptx | 164 +- .../powersave_standby_associated.uvprojx | 164 +- .../powersave_standby_associated/main.c | 116 +- .../powersave_standby_associated_ncp.slcp | 160 +- .../powersave_standby_associated_psram.slcp | 6 +- .../powersave_standby_associated_soc.slcp | 6 +- ...powersave_standby_associated_uart_ncp.slcp | 166 +- .../powersave_standby_associated/readme.md | 408 +- .../readme/alarm_timer_configure.png | Bin .../readme/energy_profiler_step_6.png | Bin .../readme/energy_profiler_step_7.png | Bin .../readme/energy_profiler_step_8.png | Bin .../resources/readme/image185.png | Bin 0 -> 13528 bytes .../resources/readme/image187.png | Bin 0 -> 51661 bytes .../resources/readme/output_soc.png | Bin .../power_meter_avg_current_consumption.png | Bin 0 -> 149352 bytes .../power_save_current_measurement_pins.png | Bin .../resources/readme/setup_soc_ncp.png | Bin 0 -> 106594 bytes .../resources/readme/stm32_setup.png | Bin .../resources/readme/wakeup_configure.png | Bin .../wifi_powersave_standby_associated_soc.png | Bin ...ave_standby_associated_tcp_client_ncp.slcp | 4 +- ...e_standby_associated_tcp_client_psram.slcp | 4 +- ...ave_standby_associated_tcp_client_soc.slcp | 4 +- ...tandby_associated_tcp_client_uart_ncp.slcp | 4 +- .../readme.md | 1 + .../twt_tcp_client/twt_tcp_client_ncp.slcp | 4 +- .../twt_tcp_client/twt_tcp_client_soc.slcp | 4 +- .../resources/readme/image185.png | Bin 93356 -> 0 bytes .../resources/readme/image187.png | Bin 356843 -> 0 bytes .../power_meter_avg_current_consumption.png | Bin 98250 -> 0 bytes .../resources/readme/setup_soc_ncp.png | Bin 139454 -> 0 bytes .../wlan_throughput/wlan_throughput_ncp.slcp | 4 +- .../wlan_throughput_psram.slcp | 4 +- .../wlan_throughput/wlan_throughput_soc.slcp | 4 +- .../wlan_throughput_uart_ncp.slcp | 4 +- .../cmsis-rtos/sl_si91x_msg_queue/readme.md | 3 +- .../sl_si91x_msg_queue.slcp | 4 +- .../sl_si91x_mutex/sl_si91x_mutex.slcp | 4 +- .../crypto/si91x_psa_aes/si91x_psa_aes.slcp | 4 +- .../si91x_psa_asymmetric_key_storage.slcp | 4 +- .../si91x_soc/crypto/si91x_psa_ccm/readme.md | 1 + .../crypto/si91x_psa_ccm/si91x_psa_ccm.slcp | 4 +- .../crypto/si91x_psa_chachapoly/readme.md | 1 + .../si91x_psa_chachapoly.slcp | 4 +- .../si91x_soc/crypto/si91x_psa_cmac/readme.md | 2 +- .../crypto/si91x_psa_cmac/si91x_psa_cmac.slcp | 4 +- .../crypto/si91x_psa_ecdh/si91x_psa_ecdh.slcp | 4 +- .../crypto/si91x_psa_ecdsa/readme.md | 3 +- .../si91x_psa_ecdsa/si91x_psa_ecdsa.slcp | 4 +- .../si91x_soc/crypto/si91x_psa_gcm/readme.md | 1 + .../crypto/si91x_psa_gcm/si91x_psa_gcm.slcp | 4 +- .../crypto/si91x_psa_hmac/si91x_psa_hmac.slcp | 4 +- .../crypto/si91x_psa_multithread/readme.md | 2 +- .../si91x_psa_multithread.slcp | 4 +- .../crypto/si91x_psa_sha/si91x_psa_sha.slcp | 4 +- .../si91x_psa_symmetric_key_storage.slcp | 4 +- .../crypto/test/aead/si91x_test_aead.slcp | 4 +- .../crypto/test/cipher/si91x_test_cipher.slcp | 4 +- .../crypto/test/hash/si91x_test_hash.slcp | 4 +- .../crypto/test/mac/si91x_test_mac.slcp | 4 +- .../hello_world/si91x_hello_world.slcp | 4 +- .../memlcd_baremetal/memlcd_baremetal.slcp | 4 +- .../peripheral/psram_blinky/psram_blinky.slcp | 4 +- .../psram_driver_example.slcp | 4 +- .../peripheral/psram_driver_example/readme.md | 5 +- .../resources/readme/device_config.png | Bin 63030 -> 52295 bytes .../sl_si91x_adc_fifo_mode/readme.md | 4 +- .../sl_si91x_adc_fifo_mode.slcp | 4 +- .../sl_si91x_adc_static_mode/readme.md | 4 +- .../sl_si91x_adc_static_mode.slcp | 4 +- .../sl_si91x_analog_comparator/readme.md | 3 +- .../sl_si91x_analog_comparator.slcp | 4 +- .../sl_si91x_bjt_temperature_sensor/readme.md | 3 +- .../sl_si91x_bjt_temperature_sensor.slcp | 4 +- .../sl_si91x_blinky/sl_si91x_blinky.slcp | 4 +- .../button_baremetal.c | 21 +- .../sl_si91x_button_baremetal.slcp | 6 +- .../sl_si91x_button_baremetal_dev_kit.slcp | 59 - .../sl_si91x_calendar/calendar_example.c | 58 +- .../sl_si91x_calendar/calendar_example.h | 9 +- .../peripheral/sl_si91x_calendar/readme.md | 51 +- .../resources/readme/output.png | Bin 9663 -> 18033 bytes .../uc_screen/calendar_uc_screen.png | Bin 70921 -> 0 bytes .../sl_si91x_calendar/sl_si91x_calendar.slcp | 5 +- .../peripheral/sl_si91x_combo_app/readme.md | 3 +- .../sl_si91x_combo_app.slcp | 4 +- .../sl_si91x_combo_app/src/i2c_app.c | 14 - .../sl_si91x_config_timer/readme.md | 3 +- .../sl_si91x_config_timer.slcp | 4 +- .../peripheral/sl_si91x_crc/sl_si91x_crc.slcp | 4 +- .../peripheral/sl_si91x_dac/readme.md | 3 +- .../peripheral/sl_si91x_dac/sl_si91x_dac.slcp | 4 +- .../peripheral/sl_si91x_dma/readme.md | 3 +- .../peripheral/sl_si91x_dma/sl_si91x_dma.slcp | 4 +- .../peripheral/sl_si91x_efuse/readme.md | 3 +- .../sl_si91x_efuse/sl_si91x_efuse.slcp | 4 +- .../peripheral/sl_si91x_gpio/readme.md | 3 +- .../sl_si91x_gpio/sl_si91x_gpio.slcp | 4 +- .../sl_si91x_gpio_detailed_example.slcp | 4 +- .../sl_si91x_gpio_example/readme.md | 3 +- .../sl_si91x_gpio_example.slcp | 4 +- .../sl_si91x_gpio_group_example/readme.md | 3 +- .../sl_si91x_gpio_group_example.slcp | 4 +- .../sl_si91x_gpio_ulp_example/readme.md | 3 +- .../sl_si91x_gpio_ulp_example.slcp | 4 +- .../sl_si91x_gpio_uulp_example/readme.md | 3 +- .../sl_si91x_gpio_uulp_example.slcp | 4 +- .../peripheral/sl_si91x_gspi/readme.md | 5 +- .../sl_si91x_gspi/sl_si91x_gspi.slcp | 4 +- .../i2c_follower_example.c | 24 +- .../sl_si91x_i2c_driver_follower/readme.md | 3 +- .../sl_si91x_i2c_driver_follower.slcp | 4 +- .../i2c_leader_example.c | 27 +- .../sl_si91x_i2c_driver_leader/readme.md | 3 +- .../sl_si91x_i2c_driver_leader.slcp | 4 +- .../sl_si91x_i2s_loopback/readme.md | 3 +- .../sl_si91x_i2s_loopback.slcp | 4 +- .../peripheral/sl_si91x_i2s_primary/readme.md | 3 +- .../sl_si91x_i2s_primary.slcp | 4 +- .../sl_si91x_i2s_secondary/readme.md | 3 +- .../sl_si91x_i2s_secondary.slcp | 4 +- .../sl_si91x_icm40627/sl_si91x_icm40627.slcp | 4 +- .../peripheral/sl_si91x_joystick/readme.md | 16 +- .../uc_screen/sl_joystick_uc_screen.png | Bin 56472 -> 53944 bytes .../sl_si91x_joystick/sl_si91x_joystick.slcp | 4 +- .../peripheral/sl_si91x_pwm/readme.md | 3 +- .../peripheral/sl_si91x_pwm/sl_si91x_pwm.slcp | 4 +- .../peripheral/sl_si91x_rgb_led/readme.md | 19 +- .../peripheral/sl_si91x_rgb_led/rgb_led.c | 121 +- .../sl_si91x_rgb_led/sl_si91x_rgb_led.slcp | 12 +- .../sl_si91x_sdio_secondary/readme.md | 3 +- .../sl_si91x_sdio_secondary.slcp | 4 +- .../peripheral/sl_si91x_si70xx/readme.md | 3 +- .../sl_si91x_si70xx/sl_si91x_si70xx.slcp | 4 +- .../peripheral/sl_si91x_ssi_master/readme.md | 3 +- .../sl_si91x_ssi_master.slcp | 4 +- .../peripheral/sl_si91x_ssi_slave/readme.md | 18 +- .../sl_si91x_ssi_slave.slcp | 4 +- .../peripheral/sl_si91x_sysrtc/readme.md | 63 +- .../resources/uc_screen/sysrtc_uc_screen.png | Bin 54878 -> 36484 bytes .../sl_si91x_sysrtc/sl_si91x_sysrtc.slcp | 12 +- .../sl_si91x_sysrtc/sysrtc_example.c | 7 +- .../peripheral/sl_si91x_uart/readme.md | 3 +- .../sl_si91x_uart/sl_si91x_uart.slcp | 4 +- .../peripheral/sl_si91x_ulp_adc/readme.md | 7 +- .../sl_si91x_ulp_adc/sl_si91x_ulp_adc.slcp | 4 +- .../sl_si91x_ulp_adc/sl_ulp_adc_example.c | 6 + .../sl_si91x_ulp_calendar/readme.md | 26 +- .../uc_screen/calendar_uc_screen.png | Bin 10750 -> 0 bytes .../sl_si91x_ulp_calendar.slcp | 5 +- .../ulp_calendar_example.c | 33 - .../ulp_calendar_example.h | 9 +- .../peripheral/sl_si91x_ulp_dac/readme.md | 3 +- .../sl_si91x_ulp_dac/sl_si91x_ulp_dac.slcp | 4 +- .../peripheral/sl_si91x_ulp_dma/readme.md | 3 +- .../sl_si91x_ulp_dma/sl_si91x_ulp_dma.slcp | 4 +- .../peripheral/sl_si91x_ulp_gpio/readme.md | 3 +- .../sl_si91x_ulp_gpio/sl_si91x_ulp_gpio.slcp | 4 +- .../sl_si91x_ulp_i2c_driver_leader/readme.md | 3 +- .../sl_si91x_ulp_i2c_driver_leader.slcp | 4 +- .../peripheral/sl_si91x_ulp_i2s/readme.md | 3 +- .../sl_si91x_ulp_i2s/sl_si91x_ulp_i2s.slcp | 4 +- .../sl_si91x_ulp_ssi_master/readme.md | 7 +- .../sl_si91x_ulp_ssi_master.slcp | 4 +- .../ulp_ssi_master_example.c | 8 +- .../peripheral/sl_si91x_ulp_timer/readme.md | 39 +- .../sl_si91x_ulp_timer.slcp | 4 +- .../peripheral/sl_si91x_ulp_uart/readme.md | 11 +- .../sl_si91x_ulp_uart/sl_si91x_ulp_uart.slcp | 4 +- .../peripheral/sl_si91x_usart_async/readme.md | 3 +- .../sl_si91x_usart_async.slcp | 4 +- .../sl_si91x_usart_sync_master/readme.md | 3 +- .../sl_si91x_usart_sync_master.slcp | 4 +- .../sl_si91x_usart_sync_slave/readme.md | 3 +- .../sl_si91x_usart_sync_slave.slcp | 4 +- .../sl_si91x_veml6035/sl_si91x_veml6035.slcp | 4 +- .../sl_si91x_watchdog_timer/readme.md | 42 +- .../uc_screen/watchdog_uc_screen.png | Bin 75716 -> 28988 bytes .../sl_si91x_watchdog_timer.slcp | 4 +- .../watchdog_timer_example.c | 10 - .../iostream_usart_baremetal.slcp | 4 +- .../service/sl_si91x_littlefs/readme.md | 3 +- .../sl_si91x_file_system.slcp | 4 +- .../sl_si91x_nvm3_common_flash/readme.md | 3 +- .../sl_si91x_nvm3_common_flash.slcp | 4 +- .../sl_si91x_nvm3_dual_flash/readme.md | 3 +- .../sl_si91x_nvm3_dual_flash.slcp | 4 +- .../power_manager_m4_wireless_example.c | 7 - .../readme.md | 8 +- .../sl_si91x_power_manager_m4_wireless.slcp | 4 +- .../sl_si91x_power_manager_tickless_idle.slcp | 4 +- .../src/adc_sensor/adc_sensor_driver.c | 1 + .../sl_si91x_sensorhub.slcp | 4 +- .../service/sl_si91x_sleeptimer/readme.md | 5 +- .../sl_si91x_sleeptimer.slcp | 12 +- .../service/sl_si91x_sleeptimer/sleeptimer.c | 12 +- examples/si91x_soc/siwx917_dev_kit/app.c | 1406 +----- examples/si91x_soc/siwx917_dev_kit/app.h | 65 +- examples/si91x_soc/siwx917_dev_kit/ble_app.c | 985 ++++ .../si91x_soc/siwx917_dev_kit/ble_config.h | 196 + examples/si91x_soc/siwx917_dev_kit/readme.md | 58 +- .../resources/readme/browser-ip-address.png | Bin 15283 -> 0 bytes .../resources/readme/connected-prints.png | Bin 31784 -> 15157 bytes .../connecting-to-a-network-connections.png | Bin 163638 -> 0 bytes .../readme/connecting-to-webserver.png | Bin 0 -> 258713 bytes .../resources/readme/entering-password.png | Bin 0 -> 122345 bytes .../resources/readme/provisioning-webpage.png | Bin 31466 -> 0 bytes .../siwx917_dev_kit/resources/readme/scan.png | Bin 22671 -> 0 bytes .../resources/readme/selecting-a-network.png | Bin 28150 -> 138493 bytes .../resources/readme/sensor-webpage.png | Bin 44491 -> 0 bytes .../resources/readme/startup-prints.png | Bin 25137 -> 16828 bytes .../viewing-sensor-data-connections.png | Bin 138867 -> 0 bytes .../readme/wifi-sensor-device-selection.png | Bin 0 -> 190693 bytes .../resources/sensor_webserver.h | 219 - .../resources/sensor_webserver.html | 218 - .../resources/wifi_provisioning.h | 179 - .../resources/wifi_provisioning.html | 177 - .../si91x_soc/siwx917_dev_kit/sensor_app.c | 626 +++ .../si91x_soc/siwx917_dev_kit/sensor_app.h | 31 + .../siwx917_dev_kit/siwx917_dev_kit.slcp | 43 +- examples/si91x_soc/siwx917_dev_kit/wifi_app.c | 634 +++ .../si91x_soc/siwx917_dev_kit/wifi_config.h | 67 + .../ble_accept_list/ble_accept_list_ncp.slcp | 4 +- .../ble_accept_list_psram.slcp | 4 +- .../ble_accept_list/ble_accept_list_soc.slcp | 4 +- .../ble_ae_central/ble_ae_central_ncp.slcp | 4 +- .../ble_ae_central/ble_ae_central_psram.slcp | 8 +- .../ble_ae_central/ble_ae_central_soc.slcp | 4 +- .../ble_ae_central_uart_ncp.slcp | 4 +- .../ble_ae_peripheral_ncp.slcp | 4 +- .../ble_ae_peripheral_psram.slcp | 8 +- .../ble_ae_peripheral_soc.slcp | 4 +- .../ble_ae_peripheral_uart_ncp.slcp | 4 +- .../ble/ble_central/ble_central_ncp.slcp | 4 +- .../ble/ble_central/ble_central_psram.slcp | 4 +- .../ble/ble_central/ble_central_soc.slcp | 4 +- .../ble_datalength/ble_datalength_ncp.slcp | 4 +- .../ble_datalength/ble_datalength_psram.slcp | 4 +- .../ble_datalength/ble_datalength_soc.slcp | 4 +- .../ble_heart_rate_profile_ncp.slcp | 4 +- .../ble_heart_rate_profile_psram.slcp | 4 +- .../ble_heart_rate_profile_soc.slcp | 4 +- .../ble_hid_on_gatt/ble_hid_on_gatt_ncp.slcp | 4 +- .../ble_hid_on_gatt_psram.slcp | 4 +- .../ble_hid_on_gatt/ble_hid_on_gatt_soc.slcp | 4 +- .../ble/ble_ibeacon/ble_ibeacon_ncp.slcp | 4 +- .../ble/ble_ibeacon/ble_ibeacon_psram.slcp | 4 +- .../ble/ble_ibeacon/ble_ibeacon_soc.slcp | 4 +- .../ble_longrange_2mbps_ncp.slcp | 4 +- .../ble_longrange_2mbps_psram.slcp | 4 +- .../ble_longrange_2mbps_soc.slcp | 4 +- .../ble_multiconnection_gatt_test_ncp.slcp | 4 +- .../ble_multiconnection_gatt_test_psram.slcp | 4 +- .../ble_multiconnection_gatt_test_soc.slcp | 4 +- .../ble_power_save/ble_power_save_ncp.slcp | 4 +- .../ble_power_save/ble_power_save_psram.slcp | 4 +- .../ble_power_save/ble_power_save_soc.slcp | 4 +- .../ble_power_save_uart_ncp.slcp | 4 +- .../ble/ble_privacy/ble_privacy_ncp.slcp | 4 +- .../ble/ble_privacy/ble_privacy_psram.slcp | 4 +- .../ble/ble_privacy/ble_privacy_soc.slcp | 4 +- .../ble_secureconnection_ncp.slcp | 4 +- .../ble_secureconnection_psram.slcp | 4 +- .../ble_secureconnection_soc.slcp | 4 +- .../ble/ble_testmodes/ble_testmodes_ncp.slcp | 4 +- .../ble_testmodes/ble_testmodes_psram.slcp | 8 +- .../ble/ble_testmodes/ble_testmodes_soc.slcp | 4 +- .../ble_throughput_app_ncp.slcp | 4 +- .../ble_throughput_app_psram.slcp | 4 +- .../ble_throughput_app_soc.slcp | 4 +- .../ble_throughput_app_uart_ncp.slcp | 4 +- .../ble_unified_ae_coex_app_ncp.slcp | 4 +- .../ble_unified_ae_coex_app_psram.slcp | 8 +- .../ble_unified_ae_coex_app_soc.slcp | 4 +- .../ble_update_gain_table_ncp.slcp | 4 +- .../ble_update_gain_table_psram.slcp | 4 +- .../ble_update_gain_table_soc.slcp | 4 +- .../ble/bt_stack_bypass/bt_stack_bypass.slcp | 4 +- .../gatt_long_read/gatt_long_read_ncp.slcp | 4 +- .../gatt_long_read/gatt_long_read_psram.slcp | 4 +- .../gatt_long_read/gatt_long_read_soc.slcp | 4 +- examples/snippets/cli_demo/cli_demo_ncp.slcp | 4 +- examples/snippets/cli_demo/cli_demo_soc.slcp | 4 +- .../snippets/cli_demo/cli_demo_uart_ncp.slcp | 4 +- examples/snippets/cli_demo/readme.md | 76 +- examples/snippets/cli_demo/wifi_commands.c | 7 +- examples/snippets/crypto/aes/aes.slcp | 4 +- examples/snippets/crypto/aes/readme.md | 1 + .../crypto/attestation/attestation.slcp | 4 +- examples/snippets/crypto/ecdh/ecdh.slcp | 4 +- examples/snippets/crypto/ecdsa/ecdsa.slcp | 4 +- examples/snippets/crypto/ecdsa/readme.md | 3 +- .../snippets/crypto/gcm_cmac/gcm_cmac.slcp | 4 +- examples/snippets/crypto/gcm_cmac/readme.md | 1 + examples/snippets/crypto/hmac/hmac.slcp | 4 +- examples/snippets/crypto/sha/sha.slcp | 4 +- .../flash_read_write/flash_read_write.slcp | 4 +- .../sl_si91x_empty_c_ncp.slcp | 4 +- .../sl_si91x_empty_c_soc.slcp | 4 +- .../sl_si91x_empty_cpp_ncp.slcp | 4 +- .../sl_si91x_empty_cpp_soc.slcp | 4 +- .../wlan/access_point/access_point_ncp.slcp | 4 +- .../wlan/access_point/access_point_soc.slcp | 4 +- .../access_point/access_point_uart_ncp.slcp | 4 +- .../wlan/ap_throughput/ap_throughput_ncp.slcp | 4 +- .../wlan/ap_throughput/ap_throughput_soc.slcp | 4 +- examples/snippets/wlan/calibration_app/app.c | 10 +- .../calibration_app/calibration_app_ncp.slcp | 4 +- .../calibration_app/calibration_app_soc.slcp | 4 +- .../calibration_app_uart_ncp.slcp | 4 +- .../snippets/wlan/calibration_app/readme.md | 4 +- .../cloud_apps/aws/mqtt/aws_mqtt_ncp.slcp | 4 +- .../cloud_apps/aws/mqtt/aws_mqtt_soc.slcp | 4 +- .../wlan/cloud_apps/aws/mqtt/readme.md | 109 +- .../wlan/cloud_apps/azure/azure_iot_ncp.slcp | 4 +- .../wlan/cloud_apps/azure/azure_iot_soc.slcp | 8 +- .../snippets/wlan/cloud_apps/azure/readme.md | 88 +- ...rmware_update_from_host_uart_fg25_ncp.slcp | 4 +- .../concurrent_http_server_ncp.slcp | 4 +- .../concurrent_http_server_soc.slcp | 4 +- ...ent_http_server_provisioning_fg25_ncp.slcp | 4 +- ...ncurrent_http_server_provisioning_ncp.slcp | 4 +- ...ncurrent_http_server_provisioning_soc.slcp | 4 +- examples/snippets/wlan/concurrent_mode/app.c | 11 +- .../concurrent_mode_fg25_ncp.slcp | 4 +- .../concurrent_mode/concurrent_mode_ncp.slcp | 4 +- .../concurrent_mode/concurrent_mode_soc.slcp | 4 +- .../concurrent_mode_uart_ncp.slcp | 4 +- .../concurrent_mode_dual_ip_fg25_ncp.slcp | 4 +- .../concurrent_mode_dual_ip_ncp.slcp | 4 +- .../concurrent_mode_dual_ip_soc.slcp | 4 +- .../wlan/data_transfer/data_transfer_ncp.slcp | 4 +- .../wlan/data_transfer/data_transfer_soc.slcp | 4 +- .../embedded_mqtt_client_ncp.slcp | 4 +- .../embedded_mqtt_client_soc.slcp | 8 +- .../embedded_mqtt_client_twt_ncp.slcp | 4 +- .../embedded_mqtt_client_twt_soc.slcp | 4 +- .../embedded_mqtt_client_twt_uart_ncp.slcp | 4 +- .../enterprise_client_ncp.slcp | 4 +- .../enterprise_client_soc.slcp | 4 +- .../firmware_flashing_ncp.slcp | 4 +- .../firmware_flashing_soc.slcp | 4 +- .../wlan/http_client/http_client_ncp.slcp | 4 +- .../wlan/http_client/http_client_soc.slcp | 7 +- examples/snippets/wlan/http_otaf/app.c | 15 +- .../wlan/http_otaf/http_otaf_ncp.slcp | 4 +- .../wlan/http_otaf/http_otaf_soc.slcp | 4 +- .../wlan/http_otaf/http_otaf_uart_ncp.slcp | 4 +- examples/snippets/wlan/http_otaf/readme.md | 219 +- examples/snippets/wlan/http_otaf_twt/app.c | 17 +- .../wlan/http_otaf_twt/http_otaf_twt_ncp.slcp | 4 +- .../wlan/http_otaf_twt/http_otaf_twt_soc.slcp | 4 +- .../snippets/wlan/http_otaf_twt/readme.md | 279 +- .../wlan/http_server/http_server_soc.slcp | 4 +- .../lwip_tcp_client/lwip_tcp_client_ncp.slcp | 4 +- .../lwip_tcp_client/lwip_tcp_client_soc.slcp | 4 +- .../lwip_tcp_client_uart_ncp.slcp | 4 +- .../m4_firmware_update.slcp | 4 +- .../multithreading_application_ncp.slcp | 4 +- .../multithreading_application_soc.slcp | 4 +- .../wlan/select_app/select_app_ncp.slcp | 4 +- .../wlan/select_app/select_app_soc.slcp | 4 +- .../wlan/sntp_client/sntp_client_ncp.slcp | 4 +- .../wlan/sntp_client/sntp_client_soc.slcp | 4 +- .../sntp_client/sntp_client_uart_ncp.slcp | 4 +- .../wlan/station_ping/station_ping_ncp.slcp | 4 +- .../wlan/station_ping/station_ping_soc.slcp | 4 +- .../station_ping/station_ping_uart_ncp.slcp | 4 +- .../wlan/station_ping_v6/station_ping_v6.slcp | 4 +- .../tcp_tx_on_periodic_wakeup_ncp.slcp | 4 +- .../tcp_tx_on_periodic_wakeup_soc.slcp | 4 +- .../readme.md | 85 +- .../three_ssl_client_sockets_ncp.slcp | 4 +- .../three_ssl_client_sockets_soc.slcp | 8 +- examples/snippets/wlan/tls_client/app.c | 119 +- .../wlan/tls_client/tls_client_ncp.slcp | 4 +- .../wlan/tls_client/tls_client_soc.slcp | 8 +- .../twt_use_case_remote_app_ncp.slcp | 4 +- .../twt_use_case_remote_app_soc.slcp | 4 +- .../user_gain_table/user_gain_table_ncp.slcp | 4 +- .../user_gain_table/user_gain_table_soc.slcp | 4 +- .../user_gain_table_uart_ncp.slcp | 4 +- .../wifi6_twt_use_case_demo_ncp.slcp | 4 +- .../wifi6_twt_use_case_demo_soc.slcp | 4 +- .../wifi6_twt_use_case_demo_uart_ncp.slcp | 4 +- .../wlan/wlan_rf_test/wlan_rf_test_ncp.slcp | 4 +- .../wlan/wlan_rf_test/wlan_rf_test_soc.slcp | 4 +- .../wlan_rf_test/wlan_rf_test_uart_ncp.slcp | 4 +- .../wlan_throughput_v6_ncp.slcp | 4 +- .../wlan_throughput_v6_soc.slcp | 4 +- .../snippets/wlan_ble/out_of_box_demo/app.c | 13 +- .../out_of_box_demo/out_of_box_demo.slcp | 4 +- .../wlan_ble/out_of_box_demo/wifi_app.c | 4 +- .../wifi_https_ble_dual_role_ncp.slcp | 4 +- .../wifi_https_ble_dual_role_soc.slcp | 8 +- .../wifi_station_ble_provisioning_ncp.slcp | 4 +- .../wifi_station_ble_provisioning_soc.slcp | 4 +- .../readme.md | 137 +- .../wifi_app.c | 4 +- ...wifi_station_ble_provisioning_aws_ncp.slcp | 4 +- ...wifi_station_ble_provisioning_aws_soc.slcp | 4 +- ...station_ble_provisioning_aws_uart_ncp.slcp | 4 +- .../wifi_station_ble_throughput_app_ncp.slcp | 4 +- .../wifi_station_ble_throughput_app_soc.slcp | 4 +- .../wifi_throughput_ble_dual_role_ncp.slcp | 4 +- .../wifi_throughput_ble_dual_role_soc.slcp | 4 +- resources/certificates/aws_starfield_ca.pem.h | 219 +- .../silabs/src/network_sl_api_wrapper.c | 47 +- wifi_templates.xml | 425 +- wiseconnect3.slce | 6 +- wiseconnect3.slsdk | 6 +- wiseconnect3_demos.xml | 32 +- wiseconnect3_docs.xml | 23 +- 802 files changed, 19373 insertions(+), 31220 deletions(-) create mode 100644 components/board/silabs/config/brd2605a/sl_iostream_usart_vcom_config.h rename components/{device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_instance_config.h => board/silabs/config/brd2605a/sl_si91x_button_init_btn0_config.h} (61%) create mode 100644 components/board/silabs/config/brd2605a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd2605a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd2605a/sl_si91x_icm40627_config.h create mode 100644 components/board/silabs/config/brd2605a/sl_si91x_led_init_ledB_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4338a/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4339a/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4339b/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4340a/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4340b/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4341a/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4342a/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4343a/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4343b/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_iostream_usart_vcom_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_si91x_button_init_btn0_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_si91x_button_init_btn1_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_si91x_i2c_init_i2c2_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_si91x_led_init_led0_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_si91x_led_init_led1_config.h create mode 100644 components/board/silabs/config/brd4343q/sl_si91x_memlcd_config.h create mode 100644 components/board/silabs/config/common_config/sl_si91x_pwm_init_led1_config.h create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgaba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgnba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgaba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgaba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgnba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgaba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnba.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/component/sl_si91x_external_oscillator.slcc create mode 100644 components/device/silabs/si91x/mcu/core/chip/config/sl_si91x_external_oscillator.h create mode 100644 components/device/silabs/si91x/mcu/core/common/component/si91x_debug_uc.slcc rename components/device/silabs/si91x/mcu/{drivers/unified_api/config/sl_si91x_calendar_config.h => core/common/config/sl_si91x_debug_uc_1_config.h} (54%) create mode 100644 components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_2_config.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_CAN.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_MAC.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_PHY.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_MCI.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_NAND.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USB.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBD.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBH.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_can_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_mac_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_phy_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_mci_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_nand_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usb_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbd_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbh_driver.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBD.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBH.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_can.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_emac.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_mci.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_phy_lan.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usb.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbd.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbh.slcc create mode 100644 components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_init_instance_config.h create mode 100644 components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/config/sl_si91x_icm40627_config.h create mode 100644 components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_init_instance_config.h create mode 100644 components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/config/sl_si91x_memlcd_config.h create mode 100644 components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/config/sl_si91x_i2c_init_i2c2_config.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_cci.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_fim.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_ir.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdioh.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdmem.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_smih.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_vad.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_wurx.slcc delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_cci.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_fim.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_ir.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdioh.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdmem.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_smih.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_vad.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_wurx.h delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_cci.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_fim.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_ir.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdioh.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdmem.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_smih.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_vad.c delete mode 100644 components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_wurx.c create mode 100644 components/device/silabs/si91x/mcu/drivers/service/images/init_deinit_sequence.png delete mode 100644 connectivity_firmware/lite/SiWG917-B.2.12.2.1.2.9.rps create mode 100644 connectivity_firmware/lite/SiWG917-B.2.12.3.3.2.3.rps delete mode 100644 connectivity_firmware/standard/SiWG917-B.2.12.2.1.0.9.rps create mode 100644 connectivity_firmware/standard/SiWG917-B.2.12.3.3.0.3.rps create mode 100644 demos/brd4343a/out_of_box_demo.rps create mode 100644 docs/software-reference/developer-guides/migrating-from-v3-3-2.md rename examples/featured/{ => low_power}/powersave_standby_associated/app.c (97%) rename examples/featured/{ => low_power}/powersave_standby_associated/app.h (97%) rename examples/featured/{ => low_power}/powersave_standby_associated/keil_project/powersave_standby_associated.uvoptx (78%) rename examples/featured/{ => low_power}/powersave_standby_associated/keil_project/powersave_standby_associated.uvprojx (70%) rename examples/featured/{ => low_power}/powersave_standby_associated/main.c (97%) rename examples/featured/{ => low_power}/powersave_standby_associated/powersave_standby_associated_ncp.slcp (94%) rename examples/featured/{ => low_power}/powersave_standby_associated/powersave_standby_associated_psram.slcp (95%) rename examples/featured/{ => low_power}/powersave_standby_associated/powersave_standby_associated_soc.slcp (95%) rename examples/featured/{ => low_power}/powersave_standby_associated/powersave_standby_associated_uart_ncp.slcp (94%) rename examples/featured/{ => low_power}/powersave_standby_associated/readme.md (97%) rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/alarm_timer_configure.png (100%) rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/energy_profiler_step_6.png (100%) rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/energy_profiler_step_7.png (100%) rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/energy_profiler_step_8.png (100%) create mode 100644 examples/featured/low_power/powersave_standby_associated/resources/readme/image185.png create mode 100644 examples/featured/low_power/powersave_standby_associated/resources/readme/image187.png rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/output_soc.png (100%) create mode 100644 examples/featured/low_power/powersave_standby_associated/resources/readme/power_meter_avg_current_consumption.png rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/power_save_current_measurement_pins.png (100%) create mode 100644 examples/featured/low_power/powersave_standby_associated/resources/readme/setup_soc_ncp.png rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/stm32_setup.png (100%) rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/wakeup_configure.png (100%) rename examples/featured/{ => low_power}/powersave_standby_associated/resources/readme/wifi_powersave_standby_associated_soc.png (100%) delete mode 100644 examples/featured/powersave_standby_associated/resources/readme/image185.png delete mode 100644 examples/featured/powersave_standby_associated/resources/readme/image187.png delete mode 100644 examples/featured/powersave_standby_associated/resources/readme/power_meter_avg_current_consumption.png delete mode 100644 examples/featured/powersave_standby_associated/resources/readme/setup_soc_ncp.png delete mode 100644 examples/si91x_soc/peripheral/sl_si91x_button_baremetal/sl_si91x_button_baremetal_dev_kit.slcp delete mode 100644 examples/si91x_soc/peripheral/sl_si91x_calendar/resources/uc_screen/calendar_uc_screen.png delete mode 100644 examples/si91x_soc/peripheral/sl_si91x_ulp_calendar/resources/uc_screen/calendar_uc_screen.png create mode 100644 examples/si91x_soc/siwx917_dev_kit/ble_app.c create mode 100644 examples/si91x_soc/siwx917_dev_kit/ble_config.h delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/browser-ip-address.png delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/connecting-to-a-network-connections.png create mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/connecting-to-webserver.png create mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/entering-password.png delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/provisioning-webpage.png delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/scan.png delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/sensor-webpage.png delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/viewing-sensor-data-connections.png create mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/readme/wifi-sensor-device-selection.png delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/sensor_webserver.h delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/sensor_webserver.html delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/wifi_provisioning.h delete mode 100644 examples/si91x_soc/siwx917_dev_kit/resources/wifi_provisioning.html create mode 100644 examples/si91x_soc/siwx917_dev_kit/sensor_app.c create mode 100644 examples/si91x_soc/siwx917_dev_kit/sensor_app.h create mode 100644 examples/si91x_soc/siwx917_dev_kit/wifi_app.c create mode 100644 examples/si91x_soc/siwx917_dev_kit/wifi_config.h diff --git a/README.md b/README.md index 916f09402..a7d436a66 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The online WiSeConnect 3 SDK documentation is available [here](https://docs.sila - See the [Getting Started](https://docs.silabs.com/wiseconnect/latest/wiseconnect-getting-started) section to run your first example. - See the [Examples](https://docs.silabs.com/wiseconnect/latest/wiseconnect-examples) section to explore all the available examples. - - See our [Migration Guide](docs/software-reference/developer-guides/migrating-from-v3-3-0.md) for information on porting your WiSeConnect v3.3.0 application to WiSeConnect v3.3.1 + - See our [Migration Guide](docs/software-reference/developer-guides/migrating-from-v3-3-2.md) for information on porting your WiSeConnect v3.3.2 application to WiSeConnect v3.3.3 - [API Reference Guide](https://docs.silabs.com/wiseconnect/latest/wiseconnect-api-reference-guide-summary) - [SiWx917 Software Reference Manual](docs/software-reference/manuals/siwx91x-software-reference-manual.md) @@ -36,7 +36,7 @@ The online WiSeConnect 3 SDK documentation is available [here](https://docs.sila - [SiWx917 SoC Datasheet](https://www.silabs.com/documents/public/data-sheets/siwg917-datasheet.pdf) - [SiWx917 NCP Datasheet](https://www.silabs.com/documents/public/data-sheets/siwx917-ncp-datasheet.pdf) - - **SiWx917 Reference Manual:** To access this document, contact the Silicon Labs Sales team by clicking [here](https://www.silabs.com/about-us/contact-sales). + - [SiWx917 Reference Manual](https://www.silabs.com/documents/public/reference-manuals/siw917x-family-rm.pdf) - [SiWx917 RF Matching and Layout Design Guide](https://www.silabs.com/documents/public/application-notes/an1423-siwx917-rf-matching-guide.pdf) - [SiWx917 Gain Offset Calibration](https://www.silabs.com/documents/public/application-notes/an1440-siwx917-gain-offset-calibration.pdf) - [SiWx917 QMS Crystal Calibration App Note](https://www.silabs.com/documents/public/application-notes/an1436-siwx917-qms-crystal-calibration-application-note.pdf) diff --git a/components/board/silabs/component/brd2605a.slcc b/components/board/silabs/component/brd2605a.slcc index 3d409b303..33bad0a5b 100644 --- a/components/board/silabs/component/brd2605a.slcc +++ b/components/board/silabs/component/brd2605a.slcc @@ -16,9 +16,9 @@ - provides: - name: brd2605a - name: hardware_board - - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_dev_board - define: - name: SL_BOARD_NAME value: '"BRD2605A"' @@ -34,7 +34,7 @@ value: '1' - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION value: '1' - + - name: SI917_DEVKIT - template_contribution: # Default Memory configuration - name: device_flash_addr diff --git a/components/board/silabs/component/brd2605a_config.slcc b/components/board/silabs/component/brd2605a_config.slcc index 43eed5b08..25f6b66b3 100644 --- a/components/board/silabs/component/brd2605a_config.slcc +++ b/components/board/silabs/component/brd2605a_config.slcc @@ -15,15 +15,15 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd2605a/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: ledB + path: brd2605a/sl_si91x_led_init_ledB_config.h - override: component: "%extension-wiseconnect3_sdk%psram_core" file_id: psram_pin_config path: brd4340a/sl_si91x_psram_pin_config.h - - override: - component: "%extension-wiseconnect3_sdk%adc_instance" - file_id: adc_config - instance: channel_0 - path: common_config/sl_si91x_adc_init_channel_0_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -100,10 +100,10 @@ instance: channel_15 path: common_config/sl_si91x_adc_init_channel_15_config.h - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h + component: "%extension-wiseconnect3_sdk%adc_instance" + file_id: adc_config + instance: channel_16 + path: common_config/sl_si91x_adc_init_channel_16_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -170,4 +170,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: pin_config - path: brd2605a/pin_config.h \ No newline at end of file + path: brd2605a/pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd2605a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd2605a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd2605a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd2605a/sl_iostream_usart_vcom_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_icm40627" + file_id: icm40627_config + path: brd2605a/sl_si91x_icm40627_config.h \ No newline at end of file diff --git a/components/board/silabs/component/brd4325a.slcc b/components/board/silabs/component/brd4325a.slcc index c83373ede..b11dc9bbd 100644 --- a/components/board/silabs/component/brd4325a.slcc +++ b/components/board/silabs/component/brd4325a.slcc @@ -21,6 +21,8 @@ - name: hardware_board - name: hardware_board_rb - name: si91x_a0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4325a_config.slcc b/components/board/silabs/component/brd4325a_config.slcc index 27e5bc84a..00e405c8c 100644 --- a/components/board/silabs/component/brd4325a_config.slcc +++ b/components/board/silabs/component/brd4325a_config.slcc @@ -90,11 +90,6 @@ file_id: adc_config instance: channel_15 path: common_config/sl_si91x_adc_init_channel_15_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config diff --git a/components/board/silabs/component/brd4325b.slcc b/components/board/silabs/component/brd4325b.slcc index a2bab40ed..13b93db58 100644 --- a/components/board/silabs/component/brd4325b.slcc +++ b/components/board/silabs/component/brd4325b.slcc @@ -21,6 +21,8 @@ - name: hardware_board - name: hardware_board_rb - name: si91x_a0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4325b_config.slcc b/components/board/silabs/component/brd4325b_config.slcc index 38a03d59f..87a900e70 100644 --- a/components/board/silabs/component/brd4325b_config.slcc +++ b/components/board/silabs/component/brd4325b_config.slcc @@ -90,11 +90,6 @@ file_id: adc_config instance: channel_15 path: common_config/sl_si91x_adc_init_channel_15_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config diff --git a/components/board/silabs/component/brd4325c.slcc b/components/board/silabs/component/brd4325c.slcc index fb21d37f9..e08bf4140 100644 --- a/components/board/silabs/component/brd4325c.slcc +++ b/components/board/silabs/component/brd4325c.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4325c_config.slcc b/components/board/silabs/component/brd4325c_config.slcc index 002b0d48e..66b443e00 100644 --- a/components/board/silabs/component/brd4325c_config.slcc +++ b/components/board/silabs/component/brd4325c_config.slcc @@ -95,11 +95,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config diff --git a/components/board/silabs/component/brd4325e.slcc b/components/board/silabs/component/brd4325e.slcc index bc5aa1a00..ad6891559 100644 --- a/components/board/silabs/component/brd4325e.slcc +++ b/components/board/silabs/component/brd4325e.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4325e_config.slcc b/components/board/silabs/component/brd4325e_config.slcc index 99a2203b7..257f37b6d 100644 --- a/components/board/silabs/component/brd4325e_config.slcc +++ b/components/board/silabs/component/brd4325e_config.slcc @@ -95,11 +95,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config diff --git a/components/board/silabs/component/brd4325f.slcc b/components/board/silabs/component/brd4325f.slcc index 610170dc0..b97a39e0b 100644 --- a/components/board/silabs/component/brd4325f.slcc +++ b/components/board/silabs/component/brd4325f.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4325f_config.slcc b/components/board/silabs/component/brd4325f_config.slcc index f99540714..f4d11bd3a 100644 --- a/components/board/silabs/component/brd4325f_config.slcc +++ b/components/board/silabs/component/brd4325f_config.slcc @@ -95,11 +95,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config diff --git a/components/board/silabs/component/brd4325g.slcc b/components/board/silabs/component/brd4325g.slcc index 27bc278a5..41f1882fa 100644 --- a/components/board/silabs/component/brd4325g.slcc +++ b/components/board/silabs/component/brd4325g.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - id: "%extension-wiseconnect3_sdk%psram_aps6404l_sqh" diff --git a/components/board/silabs/component/brd4325g_config.slcc b/components/board/silabs/component/brd4325g_config.slcc index 6e8194723..83a0f704a 100644 --- a/components/board/silabs/component/brd4325g_config.slcc +++ b/components/board/silabs/component/brd4325g_config.slcc @@ -95,11 +95,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config diff --git a/components/board/silabs/component/brd4338a.slcc b/components/board/silabs/component/brd4338a.slcc index 3899fd4b4..3be545725 100644 --- a/components/board/silabs/component/brd4338a.slcc +++ b/components/board/silabs/component/brd4338a.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4338a_config.slcc b/components/board/silabs/component/brd4338a_config.slcc index 5afc9136e..3102163ba 100644 --- a/components/board/silabs/component/brd4338a_config.slcc +++ b/components/board/silabs/component/brd4338a_config.slcc @@ -95,11 +95,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +115,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -176,4 +181,36 @@ component: "%extension-wiseconnect3_sdk%analog_comparator_instance" file_id: analog_comparator_config instance: comparator2 - path: common_config/sl_si91x_analog_comparator_comparator2_config.h \ No newline at end of file + path: common_config/sl_si91x_analog_comparator_comparator2_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4338a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4338a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4338a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4338a/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4338a/sl_iostream_usart_vcom_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4338a/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4338a/sl_si91x_led_init_led1_config.h diff --git a/components/board/silabs/component/brd4339a.slcc b/components/board/silabs/component/brd4339a.slcc index 387b2b534..9e7c8ba7d 100644 --- a/components/board/silabs/component/brd4339a.slcc +++ b/components/board/silabs/component/brd4339a.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a diff --git a/components/board/silabs/component/brd4339a_config.slcc b/components/board/silabs/component/brd4339a_config.slcc index c7c64a313..3e7905a2c 100644 --- a/components/board/silabs/component/brd4339a_config.slcc +++ b/components/board/silabs/component/brd4339a_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%psram_core" file_id: psram_pin_config path: brd4339a/sl_si91x_psram_pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4339a/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4339a/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +125,11 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -170,4 +180,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: pin_config - path: brd4339a/pin_config.h \ No newline at end of file + path: brd4339a/pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4339a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4339a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4339a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4339a/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4339a/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4339b.slcc b/components/board/silabs/component/brd4339b.slcc index 2e78bbbcb..613272ac2 100644 --- a/components/board/silabs/component/brd4339b.slcc +++ b/components/board/silabs/component/brd4339b.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4339b_config.slcc b/components/board/silabs/component/brd4339b_config.slcc index 2a0b82601..36f718e4f 100644 --- a/components/board/silabs/component/brd4339b_config.slcc +++ b/components/board/silabs/component/brd4339b_config.slcc @@ -17,6 +17,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4339b/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4339b/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4339b/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -97,11 +107,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -122,6 +127,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -168,4 +183,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: pin_config - path: brd4339b/pin_config.h \ No newline at end of file + path: brd4339b/pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4339b/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4339b/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4339b/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4339b/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4339b/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4340a.slcc b/components/board/silabs/component/brd4340a.slcc index 9253a679f..b0d3e2964 100644 --- a/components/board/silabs/component/brd4340a.slcc +++ b/components/board/silabs/component/brd4340a.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - id: "%extension-wiseconnect3_sdk%psram_aps6404l_sqh" diff --git a/components/board/silabs/component/brd4340a_config.slcc b/components/board/silabs/component/brd4340a_config.slcc index bcf310f00..e84028f18 100644 --- a/components/board/silabs/component/brd4340a_config.slcc +++ b/components/board/silabs/component/brd4340a_config.slcc @@ -19,6 +19,16 @@ component: "%extension-wiseconnect3_sdk%psram_core" file_id: psram_pin_config path: brd4340a/sl_si91x_psram_pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4340a/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4340a/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -99,11 +109,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -124,6 +129,11 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -180,4 +190,26 @@ component: "%extension-wiseconnect3_sdk%analog_comparator_instance" file_id: analog_comparator_config instance: comparator2 - path: common_config/sl_si91x_analog_comparator_comparator2_config.h \ No newline at end of file + path: common_config/sl_si91x_analog_comparator_comparator2_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4340a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4340a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4340a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4340a/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4340a/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4340b.slcc b/components/board/silabs/component/brd4340b.slcc index 816300724..141b7f810 100644 --- a/components/board/silabs/component/brd4340b.slcc +++ b/components/board/silabs/component/brd4340b.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4340b_config.slcc b/components/board/silabs/component/brd4340b_config.slcc index 6d48eba44..7c27e49e1 100644 --- a/components/board/silabs/component/brd4340b_config.slcc +++ b/components/board/silabs/component/brd4340b_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4340b/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4340b/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4340b/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +125,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -166,4 +181,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: pin_config - path: brd4340b/pin_config.h \ No newline at end of file + path: brd4340b/pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4340b/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4340b/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4340b/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4340b/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4340b/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4341a.slcc b/components/board/silabs/component/brd4341a.slcc index 6bfe6699c..545718c15 100644 --- a/components/board/silabs/component/brd4341a.slcc +++ b/components/board/silabs/component/brd4341a.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4341a_config.slcc b/components/board/silabs/component/brd4341a_config.slcc index 3968fa570..2f28148ae 100644 --- a/components/board/silabs/component/brd4341a_config.slcc +++ b/components/board/silabs/component/brd4341a_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4341a/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4341a/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4341a/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +125,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -162,4 +177,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: sl_board_control - path: brd4341a/sl_board_control.h \ No newline at end of file + path: brd4341a/sl_board_control.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4341a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4341a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4341a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4341a/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4341a/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4342a.slcc b/components/board/silabs/component/brd4342a.slcc index c45ac18e6..5ecd7b49a 100644 --- a/components/board/silabs/component/brd4342a.slcc +++ b/components/board/silabs/component/brd4342a.slcc @@ -22,6 +22,8 @@ - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_radio_board - recommends: - id: brd4002a - define: diff --git a/components/board/silabs/component/brd4342a_config.slcc b/components/board/silabs/component/brd4342a_config.slcc index 3c62d9d83..6f116cdf6 100644 --- a/components/board/silabs/component/brd4342a_config.slcc +++ b/components/board/silabs/component/brd4342a_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4342a/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4342a/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4342a/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%psram_core" file_id: psram_pin_config @@ -124,6 +129,11 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -180,4 +190,26 @@ component: "%extension-wiseconnect3_sdk%analog_comparator_instance" file_id: analog_comparator_config instance: comparator2 - path: common_config/sl_si91x_analog_comparator_comparator2_config.h \ No newline at end of file + path: common_config/sl_si91x_analog_comparator_comparator2_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4342a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4342a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4342a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4342a/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4342a/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4343a.slcc b/components/board/silabs/component/brd4343a.slcc index f9cc2a67b..0e4bd381c 100644 --- a/components/board/silabs/component/brd4343a.slcc +++ b/components/board/silabs/component/brd4343a.slcc @@ -16,12 +16,15 @@ - name: external_psram_none - name: rsilib_board - name: si91x_common_flash + - name: si91x_32kHz_external_oscillator - provides: - name: brd4343a - name: hardware_board - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_module_radio_board - recommends: - id: brd4002a - define: @@ -29,7 +32,7 @@ value: '"BRD4343A"' - name: SL_BOARD_REV value: '"A02"' - - name: SL_SI91X_MODULE_BOARD + - name: SL_SI91X_ACX_MODULE value: '1' - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER value: '1' diff --git a/components/board/silabs/component/brd4343a_config.slcc b/components/board/silabs/component/brd4343a_config.slcc index 1d5287b8f..12ade2a25 100644 --- a/components/board/silabs/component/brd4343a_config.slcc +++ b/components/board/silabs/component/brd4343a_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4343a/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4343a/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4343a/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +125,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -166,4 +181,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: pin_config - path: brd4343a/pin_config.h \ No newline at end of file + path: brd4343a/pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4343a/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4343a/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4343a/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4343a/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4343a/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4343b.slcc b/components/board/silabs/component/brd4343b.slcc index 82ae674ba..b21f39de2 100644 --- a/components/board/silabs/component/brd4343b.slcc +++ b/components/board/silabs/component/brd4343b.slcc @@ -16,12 +16,15 @@ - name: external_psram_none - name: rsilib_board - name: si91x_common_flash + - name: si91x_32kHz_external_oscillator - provides: - name: brd4343b - name: hardware_board - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_module_radio_board - recommends: - id: brd4002a - define: @@ -29,7 +32,7 @@ value: '"BRD4343B"' - name: SL_BOARD_REV value: '"A02"' - - name: SL_SI91X_MODULE_BOARD + - name: SL_SI91X_ACX_MODULE value: '1' - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER value: '1' diff --git a/components/board/silabs/component/brd4343b_config.slcc b/components/board/silabs/component/brd4343b_config.slcc index 199d42521..079cb8fb1 100644 --- a/components/board/silabs/component/brd4343b_config.slcc +++ b/components/board/silabs/component/brd4343b_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4343b/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4343b/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4343b/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +125,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -166,4 +181,26 @@ - override: component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: pin_config - path: brd4343b/pin_config.h \ No newline at end of file + path: brd4343b/pin_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4343b/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4343b/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4343b/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4343b/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4343b/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/component/brd4343q.slcc b/components/board/silabs/component/brd4343q.slcc index dd2d84df9..178a3d29d 100644 --- a/components/board/silabs/component/brd4343q.slcc +++ b/components/board/silabs/component/brd4343q.slcc @@ -16,12 +16,15 @@ - name: external_psram_none - name: rsilib_board - name: si91x_common_flash + - name: si91x_32kHz_external_oscillator - provides: - name: brd4343q - name: hardware_board - name: hardware_board_rb - name: hardware_board_supports_multi_slave - name: si91x_b0_board + - name: si917_prod_board + - name: si917_module_radio_board - recommends: - id: brd4002a - define: @@ -29,7 +32,7 @@ value: '"BRD4343Q"' - name: SL_BOARD_REV value: '"A02"' - - name: SL_SI91X_MODULE_BOARD + - name: SL_SI91X_ACX_MODULE value: '1' - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER value: '1' diff --git a/components/board/silabs/component/brd4343q_config.slcc b/components/board/silabs/component/brd4343q_config.slcc index daf5edac0..4e77d9af0 100644 --- a/components/board/silabs/component/brd4343q_config.slcc +++ b/components/board/silabs/component/brd4343q_config.slcc @@ -15,6 +15,16 @@ component: "%extension-wiseconnect3_sdk%board_configuration_headers" file_id: RTE_Device_917 path: brd4343q/RTE_Device_917.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led0 + path: brd4343q/sl_si91x_led_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_led_917" + file_id: led_config + instance: led1 + path: brd4343q/sl_si91x_led_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%adc_instance" file_id: adc_config @@ -95,11 +105,6 @@ file_id: adc_config instance: channel_16 path: common_config/sl_si91x_adc_init_channel_16_config.h - - override: - component: "%extension-wiseconnect3_sdk%pwm_instance" - file_id: pwm_config - instance: led0 - path: common_config/sl_si91x_pwm_init_led0_config.h - override: component: "%extension-wiseconnect3_sdk%pwm_instance" file_id: pwm_config @@ -120,6 +125,16 @@ file_id: pwm_config instance: channel_3 path: common_config/sl_si91x_pwm_init_channel_3_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led0 + path: common_config/sl_si91x_pwm_init_led0_config.h + - override: + component: "%extension-wiseconnect3_sdk%pwm_instance" + file_id: pwm_config + instance: led1 + path: common_config/sl_si91x_pwm_init_led1_config.h - override: component: "%extension-wiseconnect3_sdk%i2c_instance" file_id: i2c_config @@ -176,4 +191,26 @@ component: "%extension-wiseconnect3_sdk%analog_comparator_instance" file_id: analog_comparator_config instance: comparator2 - path: common_config/sl_si91x_analog_comparator_comparator2_config.h \ No newline at end of file + path: common_config/sl_si91x_analog_comparator_comparator2_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn0 + path: brd4343q/sl_si91x_button_init_btn0_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si91x_button_917" + file_id: button_config + instance: btn1 + path: brd4343q/sl_si91x_button_init_btn1_config.h + - override: + component: "%extension-wiseconnect3_sdk%sl_si70xx" + file_id: si70xx_config + path: brd4343q/sl_si91x_i2c_init_i2c2_config.h + - override: + component: "%extension-wiseconnect3_sdk%memlcd_917" + file_id: memlcd_config + path: brd4343q/sl_si91x_memlcd_config.h + - override: + component: "%extension-wiseconnect3_sdk%iostream_si91x" + file_id: iostream_usart_config + path: brd4343q/sl_iostream_usart_vcom_config.h diff --git a/components/board/silabs/config/brd2605a/RTE_Device_917.h b/components/board/silabs/config/brd2605a/RTE_Device_917.h index 61ade5b1d..f5b2e6a3d 100644 --- a/components/board/silabs/config/brd2605a/RTE_Device_917.h +++ b/components/board/silabs/config/brd2605a/RTE_Device_917.h @@ -38,8 +38,6 @@ #define BUTTON_0_GPIO_PIN 2 -#define SI917_DEVKIT - #define RTE_BUTTON0_PORT 0 #define RTE_BUTTON0_NUMBER 0 #define RTE_BUTTON0_PIN (2U) @@ -49,23 +47,26 @@ #define RTE_BUTTON1_PIN (1U) #define RTE_BUTTON1_PAD 13 -// RED LED -#define RTE_LEDR_PORT 3 -#define RTE_LEDR_NUMBER 0 -#define RTE_LEDR_PIN 2 -#define RTE_LEDR_PAD 14 +// RGB LED Instance 0 +#define RTE_LED0_NUMBER 0 + +// Red LED +#define RTE_LED0_LEDR_PORT 3 +#define RTE_LED0_LEDR_NUMBER RTE_LED0_NUMBER +#define RTE_LED0_LEDR_PIN 2 +#define RTE_LED0_LEDR_PAD 14 -// GREEN LED -#define RTE_LEDG_PORT 3 -#define RTE_LEDG_NUMBER 1 -#define RTE_LEDG_PIN 3 -#define RTE_LEDG_PAD 15 +// Green LED +#define RTE_LED0_LEDG_PORT 3 +#define RTE_LED0_LEDG_NUMBER RTE_LED0_NUMBER +#define RTE_LED0_LEDG_PIN 3 +#define RTE_LED0_LEDG_PAD 15 -//BLUE LED -#define RTE_LEDB_PORT 0 -#define RTE_LEDB_NUMBER 2 -#define RTE_LEDB_PIN 15 -#define RTE_LEDB_PAD 8 +// Blue LED +#define RTE_LED0_LEDB_PORT 0 +#define RTE_LED0_LEDB_NUMBER RTE_LED0_NUMBER +#define RTE_LED0_LEDB_PIN 15 +#define RTE_LED0_LEDB_PAD 8 // USART0 [Driver_USART0] // Configuration settings for Driver_USART0 in component ::CMSIS Driver:USART @@ -120,7 +121,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -178,7 +179,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -246,7 +247,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -305,7 +306,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -354,7 +355,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -406,7 +407,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -458,7 +459,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -502,7 +503,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -541,7 +542,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -560,7 +561,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -577,7 +578,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -649,7 +650,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -713,7 +714,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -777,7 +778,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -850,7 +851,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -925,7 +926,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -952,7 +953,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -975,7 +976,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -992,7 +993,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1035,7 +1036,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1078,7 +1079,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1121,7 +1122,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1169,7 +1170,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1194,7 +1195,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1222,7 +1223,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1244,7 +1245,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1306,7 +1307,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1364,7 +1365,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1418,7 +1419,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1472,7 +1473,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1516,7 +1517,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1534,14 +1535,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1559,14 +1560,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1590,14 +1591,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1615,30 +1616,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1729,7 +1730,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1777,7 +1778,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1825,7 +1826,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1873,7 +1874,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1925,7 +1926,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1973,7 +1974,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2069,7 +2070,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2091,7 +2092,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2113,7 +2114,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2139,7 +2140,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2233,7 +2234,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2286,7 +2287,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2368,7 +2369,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2459,7 +2460,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2537,7 +2538,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2575,8 +2576,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2637,7 +2638,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2692,7 +2693,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2746,7 +2747,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2800,7 +2801,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2853,7 +2854,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2908,7 +2909,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2973,7 +2974,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -3009,7 +3010,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3056,7 +3057,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3098,7 +3099,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3125,7 +3126,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3151,7 +3152,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3165,42 +3166,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3544,7 +3545,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3576,7 +3577,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3611,7 +3612,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3647,7 +3648,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3679,7 +3680,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3706,7 +3707,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3742,7 +3743,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3772,7 +3773,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3805,7 +3806,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3843,7 +3844,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3868,7 +3869,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3904,7 +3905,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3952,7 +3953,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3978,7 +3979,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3998,7 +3999,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4164,270 +4165,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4436,7 +4180,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4445,7 +4189,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4454,7 +4198,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4463,7 +4207,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4472,7 +4216,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4481,7 +4225,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4491,7 +4235,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 @@ -4906,4 +4650,4 @@ #define RTE_MEMLCD_EXTCOMIN_PORT 0 // Memlcd external communication port #define RTE_MEMLCD_ENABLE_DISPLAY_PIN 0 // Memlcd display enable pin -#define RTE_MEMLCD_ENABLE_DISPLAY_PORT 0 // Memlcd display enable port +#define RTE_MEMLCD_ENABLE_DISPLAY_PORT 0 // Memlcd display enable port \ No newline at end of file diff --git a/components/board/silabs/config/brd2605a/pin_config.h b/components/board/silabs/config/brd2605a/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd2605a/pin_config.h +++ b/components/board/silabs/config/brd2605a/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd2605a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd2605a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd2605a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_instance_config.h b/components/board/silabs/config/brd2605a/sl_si91x_button_init_btn0_config.h similarity index 61% rename from components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_instance_config.h rename to components/board/silabs/config/brd2605a/sl_si91x_button_init_btn0_config.h index b1e6564b5..f31924c9a 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_instance_config.h +++ b/components/board/silabs/config/brd2605a/sl_si91x_button_init_btn0_config.h @@ -1,28 +1,42 @@ -/***************************************************************************/ /** - * @file sl_si91x_button_config.h - * @brief Button Driver Configuration - ******************************************************************************* - * # License - * Copyright 2023 Silicon Laboratories Inc. www.silabs.com - *******************************************************************************/ - -#ifndef SL_SI91X_BUTTON_INSTANCE_CONFIG_H -#define SL_SI91X_BUTTON_INSTANCE_CONFIG_H - -#include "sl_si91x_button.h" - -// <<< Use Configuration Wizard in Context Menu >>> - -// Button Interrupt Configuration -// High level interrupt -// Low level interrupt -// High level and low level interrupt -// Rise edge interrupt -// Fall edge interrupt -// Rise edge and fall edge interrupt -// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT -#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT - -// <<< end of configuration section >>> - -#endif // SL_SI91X_BUTTON_INSTANCE_CONFIG_H +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd2605a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd2605a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..83092e7e1 --- /dev/null +++ b/components/board/silabs/config/brd2605a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 1 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd2605a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd2605a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd2605a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd2605a/sl_si91x_icm40627_config.h b/components/board/silabs/config/brd2605a/sl_si91x_icm40627_config.h new file mode 100644 index 000000000..4e89413e1 --- /dev/null +++ b/components/board/silabs/config/brd2605a/sl_si91x_icm40627_config.h @@ -0,0 +1,94 @@ +/***************************************************************************/ /** +* @file sl_si91x_icm40627_config.h +* * @brief SSI Master/Slave API configuration +* ******************************************************************************* +* * # License +* * Copyright 2023 Silicon Laboratories Inc. www.silabs.com +* ******************************************************************************* +* * +* * SPDX-License-Identifier: Zlib +* * +* * The licensor of this software is Silicon Laboratories Inc. +* * +* * This software is provided 'as-is', without any express or implied +* * warranty. In no event will the authors be held liable for any damages +* * arising from the use of this software. +* * +* * Permission is granted to anyone to use this software for any purpose, +* * including commercial applications, and to alter it and redistribute it +* * freely, subject to the following restrictions: +* * +* * 1. The origin of this software must not be misrepresented; you must not +* * claim that you wrote the original software. If you use this software +* * in a product, an acknowledgment in the product documentation would be +* * appreciated but is not required. +* * 2. Altered source versions must be plainly marked as such, and must not be +* * misrepresented as being the original software. +* * 3. This notice may not be removed or altered from any source distribution. +* * +* ******************************************************************************/ + +#ifndef SL_SI91X_ICM40627_CONFIG_H +#define SL_SI91X_ICM40627_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_SI91X_ICM40627 +// $[SSI_SL_SI91X_ICM40627] +#ifndef SL_SI91X_ICM40627_PERIPHERAL +#define SL_SI91X_ICM40627_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_SI91X_ICM40627_MOSI__PORT +#define SL_SI91X_ICM40627_MOSI__PORT ULP +#endif +#ifndef SL_SI91X_ICM40627_MOSI__PIN +#define SL_SI91X_ICM40627_MOSI__PIN 1 +#endif +#ifndef SL_SI91X_ICM40627_MOSI_LOC +#define SL_SI91X_ICM40627_MOSI_LOC 0 +#endif + +// ULP_SSI MISO_ on ULP_GPIO_2/GPIO_66 +#ifndef SL_SI91X_ICM40627_MISO__PORT +#define SL_SI91X_ICM40627_MISO__PORT ULP +#endif +#ifndef SL_SI91X_ICM40627_MISO__PIN +#define SL_SI91X_ICM40627_MISO__PIN 2 +#endif +#ifndef SL_SI91X_ICM40627_MISO_LOC +#define SL_SI91X_ICM40627_MISO_LOC 12 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_SI91X_ICM40627_SCK__PORT +#define SL_SI91X_ICM40627_SCK__PORT ULP +#endif +#ifndef SL_SI91X_ICM40627_SCK__PIN +#define SL_SI91X_ICM40627_SCK__PIN 8 +#endif +#ifndef SL_SI91X_ICM40627_SCK_LOC +#define SL_SI91X_ICM40627_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_SI91X_ICM40627_CS0__PORT +#define SL_SI91X_ICM40627_CS0__PORT ULP +#endif +#ifndef SL_SI91X_ICM40627_CS0__PIN +#define SL_SI91X_ICM40627_CS0__PIN 10 +#endif +#ifndef SL_SI91X_ICM40627_CS0_LOC +#define SL_SI91X_ICM40627_CS0_LOC 9 +#endif +// [SSI_SL_SI91X_ICM40627]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif +#endif /* SL_SI91X_ICM40627_CONFIG_H */ diff --git a/components/board/silabs/config/brd2605a/sl_si91x_led_init_ledB_config.h b/components/board/silabs/config/brd2605a/sl_si91x_led_init_ledB_config.h new file mode 100644 index 000000000..408c0c566 --- /dev/null +++ b/components/board/silabs/config/brd2605a/sl_si91x_led_init_ledB_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_ledb_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LEDB_CONFIG_H +#define SL_SI91X_LED_INIT_LEDB_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_B +// $[GPIO_SL_SI91X_LED_B] +#ifndef SL_SI91X_LED_B_PORT +#define SL_SI91X_LED_B_PORT HP +#endif +#ifndef SL_SI91X_LED_B_PIN +#define SL_SI91X_LED_B_PIN 15 +#endif +// [GPIO_SL_SI91X_LED_B]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LEDB_PIN SL_SI91X_LED_B_PIN +#define SL_LED_LEDB_PORT RTE_LEDB_PORT +#define SL_LED_LEDB_NUMBER RTE_LEDB_NUMBER + +#endif // SL_SI91X_LED_INIT_LEDB_CONFIG_H diff --git a/components/board/silabs/config/brd4338a/RTE_Device_917.h b/components/board/silabs/config/brd4338a/RTE_Device_917.h index 64cb5a563..a23d43e67 100644 --- a/components/board/silabs/config/brd4338a/RTE_Device_917.h +++ b/components/board/silabs/config/brd4338a/RTE_Device_917.h @@ -110,7 +110,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -168,7 +168,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -236,7 +236,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -295,7 +295,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -344,7 +344,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -396,7 +396,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -448,7 +448,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -492,7 +492,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -531,7 +531,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -550,7 +550,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -567,7 +567,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -639,7 +639,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -703,7 +703,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -767,7 +767,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -840,7 +840,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -915,7 +915,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -942,7 +942,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -965,7 +965,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -982,7 +982,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1025,7 +1025,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1068,7 +1068,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1111,7 +1111,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1159,7 +1159,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1184,7 +1184,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1212,7 +1212,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1234,7 +1234,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1296,7 +1296,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1354,7 +1354,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1408,7 +1408,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1462,7 +1462,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1506,7 +1506,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1524,14 +1524,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1549,14 +1549,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1580,14 +1580,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1605,30 +1605,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1719,7 +1719,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1767,7 +1767,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1815,7 +1815,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1863,7 +1863,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1915,7 +1915,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1963,7 +1963,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2059,7 +2059,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2081,7 +2081,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2103,7 +2103,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2129,7 +2129,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2223,7 +2223,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2276,7 +2276,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2358,7 +2358,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2449,7 +2449,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2527,7 +2527,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2565,8 +2565,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2627,7 +2627,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2682,7 +2682,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2736,7 +2736,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2790,7 +2790,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2843,7 +2843,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2898,7 +2898,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2963,7 +2963,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2999,7 +2999,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3046,7 +3046,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3088,7 +3088,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3115,7 +3115,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3141,7 +3141,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3155,42 +3155,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3534,7 +3534,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3566,7 +3566,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3601,7 +3601,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3637,7 +3637,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3669,7 +3669,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3696,7 +3696,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3732,7 +3732,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3762,7 +3762,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3795,7 +3795,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3833,7 +3833,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3858,7 +3858,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3894,7 +3894,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3942,7 +3942,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3968,7 +3968,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3988,7 +3988,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4154,270 +4154,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4426,7 +4169,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4435,7 +4178,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4444,7 +4187,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4453,7 +4196,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4462,7 +4205,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4471,7 +4214,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4481,7 +4224,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4338a/pin_config.h b/components/board/silabs/config/brd4338a/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4338a/pin_config.h +++ b/components/board/silabs/config/brd4338a/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4338a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4338a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4338a/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4338a/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4338a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4338a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4338a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4338a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4338a/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4338a/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..2a41e676d --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4338a/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4338a/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4338a/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4338a/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4338a/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4339a/RTE_Device_917.h b/components/board/silabs/config/brd4339a/RTE_Device_917.h index c061ec27f..5d1cab81f 100644 --- a/components/board/silabs/config/brd4339a/RTE_Device_917.h +++ b/components/board/silabs/config/brd4339a/RTE_Device_917.h @@ -109,7 +109,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -167,7 +167,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -235,7 +235,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -294,7 +294,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -343,7 +343,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -395,7 +395,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -447,7 +447,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -491,7 +491,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -530,7 +530,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -549,7 +549,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -566,7 +566,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -638,7 +638,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -702,7 +702,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -766,7 +766,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -839,7 +839,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -914,7 +914,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -941,7 +941,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -964,7 +964,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -981,7 +981,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1024,7 +1024,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1067,7 +1067,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1110,7 +1110,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1158,7 +1158,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1183,7 +1183,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1211,7 +1211,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1233,7 +1233,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1295,7 +1295,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1353,7 +1353,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1407,7 +1407,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1461,7 +1461,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1505,7 +1505,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1523,14 +1523,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1548,14 +1548,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1579,14 +1579,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1604,30 +1604,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1718,7 +1718,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1766,7 +1766,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1814,7 +1814,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1862,7 +1862,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1914,7 +1914,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1962,7 +1962,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2058,7 +2058,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2080,7 +2080,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2102,7 +2102,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2128,7 +2128,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2222,7 +2222,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2275,7 +2275,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2357,7 +2357,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2448,7 +2448,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2526,7 +2526,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2564,8 +2564,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2626,7 +2626,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2681,7 +2681,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2735,7 +2735,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2789,7 +2789,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2842,7 +2842,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2897,7 +2897,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2962,7 +2962,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2998,7 +2998,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3045,7 +3045,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3087,7 +3087,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3114,7 +3114,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3140,7 +3140,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3154,42 +3154,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3533,7 +3533,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3565,7 +3565,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3600,7 +3600,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3636,7 +3636,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3668,7 +3668,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3695,7 +3695,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3731,7 +3731,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3761,7 +3761,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3794,7 +3794,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3832,7 +3832,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3857,7 +3857,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3893,7 +3893,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3941,7 +3941,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3967,7 +3967,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3987,7 +3987,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4153,270 +4153,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4425,7 +4168,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4434,7 +4177,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4443,7 +4186,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4452,7 +4195,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4461,7 +4204,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4470,7 +4213,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4480,7 +4223,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4339a/pin_config.h b/components/board/silabs/config/brd4339a/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4339a/pin_config.h +++ b/components/board/silabs/config/brd4339a/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4339a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4339a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4339a/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4339a/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4339a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4339a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4339a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4339a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4339a/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4339a/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..08c83e088 --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_si91x_led_init_led0_config.h @@ -0,0 +1,40 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Simple LED configuration +// +// Active low +// Active high +// Default: SL_SIMPLE_LED_POLARITY_ACTIVE_HIGH +#define SL_SIMPLE_LED_LED0_POLARITY SL_SIMPLE_LED_POLARITY_ACTIVE_HIGH +// end led configuration + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4339a/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4339a/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..3c9821184 --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_si91x_led_init_led1_config.h @@ -0,0 +1,40 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Simple LED configuration +// +// Active low +// Active high +// Default: SL_SIMPLE_LED_POLARITY_ACTIVE_HIGH +#define SL_SIMPLE_LED_LED1_POLARITY SL_SIMPLE_LED_POLARITY_ACTIVE_HIGH +// end led configuration + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4339a/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4339a/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4339a/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4339b/RTE_Device_917.h b/components/board/silabs/config/brd4339b/RTE_Device_917.h index da52615dc..3587a592b 100644 --- a/components/board/silabs/config/brd4339b/RTE_Device_917.h +++ b/components/board/silabs/config/brd4339b/RTE_Device_917.h @@ -110,7 +110,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -168,7 +168,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -236,7 +236,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -295,7 +295,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -344,7 +344,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -396,7 +396,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -448,7 +448,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -492,7 +492,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -531,7 +531,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -550,7 +550,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -567,7 +567,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -639,7 +639,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -703,7 +703,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -767,7 +767,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -840,7 +840,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -915,7 +915,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -942,7 +942,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -965,7 +965,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -982,7 +982,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1025,7 +1025,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1068,7 +1068,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1111,7 +1111,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1159,7 +1159,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1184,7 +1184,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1212,7 +1212,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1234,7 +1234,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1296,7 +1296,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1354,7 +1354,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1408,7 +1408,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1462,7 +1462,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1506,7 +1506,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1524,14 +1524,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1549,14 +1549,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1580,14 +1580,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1605,30 +1605,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1719,7 +1719,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1767,7 +1767,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1815,7 +1815,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1863,7 +1863,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1915,7 +1915,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1963,7 +1963,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2059,7 +2059,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2081,7 +2081,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2103,7 +2103,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2129,7 +2129,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2223,7 +2223,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2276,7 +2276,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2358,7 +2358,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2449,7 +2449,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2527,7 +2527,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2565,8 +2565,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2627,7 +2627,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2682,7 +2682,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2736,7 +2736,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2790,7 +2790,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2843,7 +2843,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2898,7 +2898,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2963,7 +2963,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2999,7 +2999,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3046,7 +3046,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3088,7 +3088,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3115,7 +3115,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3141,7 +3141,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3155,42 +3155,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3534,7 +3534,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3566,7 +3566,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3601,7 +3601,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3637,7 +3637,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3669,7 +3669,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3696,7 +3696,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3732,7 +3732,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3762,7 +3762,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3795,7 +3795,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3833,7 +3833,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3858,7 +3858,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3894,7 +3894,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3942,7 +3942,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3968,7 +3968,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3988,7 +3988,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4154,270 +4154,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4426,7 +4169,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4435,7 +4178,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4444,7 +4187,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4453,7 +4196,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4462,7 +4205,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4471,7 +4214,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4481,7 +4224,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4339b/pin_config.h b/components/board/silabs/config/brd4339b/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4339b/pin_config.h +++ b/components/board/silabs/config/brd4339b/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4339b/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4339b/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4339b/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4339b/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4339b/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4339b/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4339b/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4339b/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4339b/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4339b/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..2a41e676d --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4339b/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4339b/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4339b/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4339b/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4339b/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4340a/RTE_Device_917.h b/components/board/silabs/config/brd4340a/RTE_Device_917.h index 120a801bb..cd628d119 100644 --- a/components/board/silabs/config/brd4340a/RTE_Device_917.h +++ b/components/board/silabs/config/brd4340a/RTE_Device_917.h @@ -110,7 +110,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -168,7 +168,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -236,7 +236,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -295,7 +295,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -344,7 +344,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -396,7 +396,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -448,7 +448,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -492,7 +492,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -531,7 +531,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -550,7 +550,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -567,7 +567,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -639,7 +639,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -703,7 +703,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -767,7 +767,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -840,7 +840,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -915,7 +915,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -942,7 +942,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -965,7 +965,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -982,7 +982,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1025,7 +1025,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1068,7 +1068,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1111,7 +1111,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1159,7 +1159,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1184,7 +1184,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1212,7 +1212,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1234,7 +1234,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1296,7 +1296,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1354,7 +1354,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1408,7 +1408,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1462,7 +1462,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1506,7 +1506,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1524,14 +1524,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1549,14 +1549,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1580,14 +1580,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1605,30 +1605,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1719,7 +1719,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1767,7 +1767,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1815,7 +1815,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1863,7 +1863,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1915,7 +1915,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1963,7 +1963,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2059,7 +2059,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2081,7 +2081,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2103,7 +2103,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2129,7 +2129,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2223,7 +2223,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2276,7 +2276,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2358,7 +2358,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2449,7 +2449,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2527,7 +2527,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2565,8 +2565,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2627,7 +2627,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2682,7 +2682,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2736,7 +2736,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2790,7 +2790,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2843,7 +2843,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2898,7 +2898,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2963,7 +2963,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2999,7 +2999,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3046,7 +3046,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3088,7 +3088,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3115,7 +3115,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3141,7 +3141,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3155,42 +3155,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3534,7 +3534,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3566,7 +3566,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3601,7 +3601,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3637,7 +3637,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3669,7 +3669,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3696,7 +3696,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3732,7 +3732,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3762,7 +3762,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3795,7 +3795,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3833,7 +3833,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3858,7 +3858,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3894,7 +3894,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3942,7 +3942,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3968,7 +3968,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3988,7 +3988,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4154,270 +4154,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4426,7 +4169,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4435,7 +4178,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4444,7 +4187,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4453,7 +4196,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4462,7 +4205,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4471,7 +4214,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4481,7 +4224,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4340a/pin_config.h b/components/board/silabs/config/brd4340a/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4340a/pin_config.h +++ b/components/board/silabs/config/brd4340a/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4340a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4340a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4340a/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4340a/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4340a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4340a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4340a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4340a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4340a/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4340a/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..2a41e676d --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4340a/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4340a/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4340a/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4340a/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4340a/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4340b/RTE_Device_917.h b/components/board/silabs/config/brd4340b/RTE_Device_917.h index b3602f10f..3fd9e9d8e 100644 --- a/components/board/silabs/config/brd4340b/RTE_Device_917.h +++ b/components/board/silabs/config/brd4340b/RTE_Device_917.h @@ -110,7 +110,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -168,7 +168,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -236,7 +236,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -295,7 +295,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -344,7 +344,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -396,7 +396,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -448,7 +448,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -492,7 +492,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -531,7 +531,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -550,7 +550,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -567,7 +567,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -639,7 +639,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -703,7 +703,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -767,7 +767,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -840,7 +840,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -915,7 +915,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -942,7 +942,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -965,7 +965,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -982,7 +982,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1025,7 +1025,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1068,7 +1068,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1111,7 +1111,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1159,7 +1159,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1184,7 +1184,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1212,7 +1212,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1234,7 +1234,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1296,7 +1296,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1354,7 +1354,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1408,7 +1408,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1462,7 +1462,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1506,7 +1506,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1524,14 +1524,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1549,14 +1549,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1580,14 +1580,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1605,30 +1605,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1719,7 +1719,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1767,7 +1767,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1815,7 +1815,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1863,7 +1863,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1915,7 +1915,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1963,7 +1963,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2059,7 +2059,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2081,7 +2081,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2103,7 +2103,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2129,7 +2129,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2223,7 +2223,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2276,7 +2276,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2358,7 +2358,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2449,7 +2449,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2527,7 +2527,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2565,8 +2565,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2627,7 +2627,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2682,7 +2682,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2736,7 +2736,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2790,7 +2790,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2843,7 +2843,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2898,7 +2898,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2963,7 +2963,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2999,7 +2999,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3046,7 +3046,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3088,7 +3088,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3115,7 +3115,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3141,7 +3141,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3155,42 +3155,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3534,7 +3534,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3566,7 +3566,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3601,7 +3601,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3637,7 +3637,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3669,7 +3669,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3696,7 +3696,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3732,7 +3732,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3762,7 +3762,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3795,7 +3795,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3833,7 +3833,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3858,7 +3858,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3894,7 +3894,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3942,7 +3942,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3968,7 +3968,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3988,7 +3988,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4154,270 +4154,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4426,7 +4169,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4435,7 +4178,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4444,7 +4187,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4453,7 +4196,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4462,7 +4205,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4471,7 +4214,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4481,7 +4224,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4340b/pin_config.h b/components/board/silabs/config/brd4340b/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4340b/pin_config.h +++ b/components/board/silabs/config/brd4340b/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4340b/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4340b/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4340b/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4340b/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4340b/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4340b/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4340b/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4340b/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4340b/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4340b/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..2a41e676d --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4340b/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4340b/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4340b/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4340b/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4340b/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4341a/RTE_Device_917.h b/components/board/silabs/config/brd4341a/RTE_Device_917.h index e06201447..e7c64296c 100644 --- a/components/board/silabs/config/brd4341a/RTE_Device_917.h +++ b/components/board/silabs/config/brd4341a/RTE_Device_917.h @@ -103,7 +103,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -161,7 +161,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -229,7 +229,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -288,7 +288,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -337,7 +337,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -389,7 +389,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -441,7 +441,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -485,7 +485,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -524,7 +524,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -543,7 +543,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -560,7 +560,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -632,7 +632,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -696,7 +696,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -760,7 +760,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -833,7 +833,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -908,7 +908,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -935,7 +935,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -958,7 +958,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -975,7 +975,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1018,7 +1018,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1061,7 +1061,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1104,7 +1104,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1152,7 +1152,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1177,7 +1177,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1205,7 +1205,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1227,7 +1227,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1289,7 +1289,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1347,7 +1347,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1401,7 +1401,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1455,7 +1455,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1499,7 +1499,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1517,14 +1517,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1542,14 +1542,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1573,14 +1573,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1598,30 +1598,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1712,7 +1712,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1760,7 +1760,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1808,7 +1808,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1856,7 +1856,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1908,7 +1908,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1956,7 +1956,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2052,7 +2052,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2074,7 +2074,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2096,7 +2096,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2122,7 +2122,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2216,7 +2216,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2269,7 +2269,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2351,7 +2351,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2442,7 +2442,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2520,7 +2520,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2558,8 +2558,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2620,7 +2620,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2675,7 +2675,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2729,7 +2729,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2783,7 +2783,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2836,7 +2836,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2891,7 +2891,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2956,7 +2956,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2992,7 +2992,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3039,7 +3039,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3081,7 +3081,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3108,7 +3108,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3134,7 +3134,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3148,42 +3148,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3527,7 +3527,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3559,7 +3559,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3594,7 +3594,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3630,7 +3630,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3662,7 +3662,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3689,7 +3689,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3725,7 +3725,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3755,7 +3755,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3788,7 +3788,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3826,7 +3826,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3851,7 +3851,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3887,7 +3887,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3935,7 +3935,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3961,7 +3961,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3981,7 +3981,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4147,270 +4147,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4419,7 +4162,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4428,7 +4171,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4437,7 +4180,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4446,7 +4189,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4455,7 +4198,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4464,7 +4207,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4474,7 +4217,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4341a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4341a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4341a/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4341a/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4341a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4341a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4341a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4341a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4341a/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4341a/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..2a41e676d --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4341a/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4341a/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4341a/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4341a/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4341a/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4342a/RTE_Device_917.h b/components/board/silabs/config/brd4342a/RTE_Device_917.h index a0dfaad55..7d2e521c4 100644 --- a/components/board/silabs/config/brd4342a/RTE_Device_917.h +++ b/components/board/silabs/config/brd4342a/RTE_Device_917.h @@ -110,7 +110,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -168,7 +168,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -236,7 +236,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -295,7 +295,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -344,7 +344,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -396,7 +396,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -448,7 +448,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -492,7 +492,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -531,7 +531,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -550,7 +550,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -567,7 +567,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -639,7 +639,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -703,7 +703,7 @@ #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -767,7 +767,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -840,7 +840,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -915,7 +915,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -942,7 +942,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -965,7 +965,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -982,7 +982,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1025,7 +1025,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1068,7 +1068,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1111,7 +1111,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1159,7 +1159,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1184,7 +1184,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1212,7 +1212,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1234,7 +1234,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1296,7 +1296,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1354,7 +1354,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1408,7 +1408,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1462,7 +1462,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1506,7 +1506,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1524,14 +1524,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1549,14 +1549,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1580,14 +1580,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1605,30 +1605,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1719,7 +1719,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1767,7 +1767,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1815,7 +1815,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1863,7 +1863,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1915,7 +1915,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1963,7 +1963,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2059,7 +2059,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2081,7 +2081,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2103,7 +2103,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2129,7 +2129,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2223,7 +2223,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2276,7 +2276,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2358,7 +2358,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2449,7 +2449,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2527,7 +2527,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2565,8 +2565,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2627,7 +2627,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2682,7 +2682,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2736,7 +2736,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2790,7 +2790,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2843,7 +2843,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2898,7 +2898,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2963,7 +2963,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2999,7 +2999,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3046,7 +3046,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3088,7 +3088,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3115,7 +3115,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3141,7 +3141,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3155,42 +3155,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3534,7 +3534,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3566,7 +3566,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3601,7 +3601,7 @@ #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3637,7 +3637,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3669,7 +3669,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3696,7 +3696,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3732,7 +3732,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3762,7 +3762,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3795,7 +3795,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3833,7 +3833,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3858,7 +3858,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3894,7 +3894,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3942,7 +3942,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3968,7 +3968,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3988,7 +3988,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4154,270 +4154,13 @@ #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4426,7 +4169,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4435,7 +4178,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4444,7 +4187,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4453,7 +4196,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4462,7 +4205,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4471,7 +4214,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4481,7 +4224,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 diff --git a/components/board/silabs/config/brd4342a/pin_config.h b/components/board/silabs/config/brd4342a/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4342a/pin_config.h +++ b/components/board/silabs/config/brd4342a/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4342a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4342a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4342a/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4342a/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4342a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4342a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4342a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4342a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4342a/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4342a/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..2a41e676d --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4342a/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4342a/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4342a/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4342a/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..adc826da1 --- /dev/null +++ b/components/board/silabs/config/brd4342a/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4343a/RTE_Device_917.h b/components/board/silabs/config/brd4343a/RTE_Device_917.h index 5d9574cd2..fa590fc77 100644 --- a/components/board/silabs/config/brd4343a/RTE_Device_917.h +++ b/components/board/silabs/config/brd4343a/RTE_Device_917.h @@ -20,7 +20,7 @@ * $Date: 1. December 2016 * $Revision: V2.4.4 * - * Project: RTE Device Configuration for Si91x 2.0 B0 BRD4343A + * Project: RTE Device Configuration for Si917 ACx Module BRD4343A * -------------------------------------------------------------------------- */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -109,7 +109,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -167,7 +167,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -235,7 +235,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -294,7 +294,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -343,7 +343,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -395,7 +395,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -447,7 +447,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -491,7 +491,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -530,7 +530,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -549,7 +549,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -566,7 +566,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -595,7 +595,7 @@ #define RTE_UART1_CHNL_UDMA_RX_CH 26 /*UART1 PINS*/ -// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_67 <3=>P0_69 <4=>P0_73 <5=>P0_75 <6=>P0_34 +// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_69 <3=>P0_73 <4=>P0_75 <5=>P0_34 // TX of UART1 #ifndef UART1_TX_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER @@ -620,15 +620,10 @@ #define RTE_UART1_TX_PAD 0 //no pad #elif (RTE_UART1_TX_PORT_ID == 2) #define RTE_UART1_TX_PORT 0 -#define RTE_UART1_TX_PIN 67 -#define RTE_UART1_TX_MUX 9 -#define RTE_UART1_TX_PAD 25 -#elif (RTE_UART1_TX_PORT_ID == 3) -#define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 73 #define RTE_UART1_TX_MUX 6 #define RTE_UART1_TX_PAD 31 -#elif (RTE_UART1_TX_PORT_ID == 4) +#elif (RTE_UART1_TX_PORT_ID == 3) #define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 75 #define RTE_UART1_TX_MUX 9 @@ -638,7 +633,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -667,7 +662,7 @@ //Pintool data #endif -// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_68 <4=>P0_72 <5=>P0_74 <6=>P0_33 +// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_72 // RX of UART1 #ifndef UART1_RX_LOC #define RTE_UART1_RX_PORT_ID 0 @@ -692,17 +687,12 @@ #define RTE_UART1_RX_PIN 72 #define RTE_UART1_RX_MUX 6 #define RTE_UART1_RX_PAD 30 -#elif (RTE_UART1_RX_PORT_ID == 4) -#define RTE_UART1_RX_PORT 0 -#define RTE_UART1_RX_PIN 74 -#define RTE_UART1_RX_MUX 9 -#define RTE_UART1_RX_PAD 32 #else #error "Invalid UART1 RTE_UART1_RX_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -766,7 +756,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -839,7 +829,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -914,7 +904,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -941,7 +931,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -964,7 +954,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -981,7 +971,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1024,7 +1014,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1067,7 +1057,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1110,7 +1100,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1158,7 +1148,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1183,7 +1173,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1211,7 +1201,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1233,7 +1223,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1295,7 +1285,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1353,7 +1343,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1407,7 +1397,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1461,7 +1451,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1500,12 +1490,12 @@ #define RTE_SSI_ULP_MASTER 1 // Enable multiple CSN lines -#define ULP_SSI_CS0 1 -#define ULP_SSI_CS1 0 +#define ULP_SSI_CS0 0 +#define ULP_SSI_CS1 1 #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1523,14 +1513,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1548,14 +1538,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1579,14 +1569,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1604,30 +1594,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1718,7 +1708,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1766,7 +1756,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1814,7 +1804,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1862,7 +1852,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1914,7 +1904,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1962,7 +1952,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2058,7 +2048,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2080,7 +2070,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2102,7 +2092,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2128,7 +2118,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2222,7 +2212,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2244,13 +2234,9 @@ //Pintool data #endif -// I2C0_SCL Pin <0=>P0_6 <1=>P0_64 <2=>P0_67 <3=>P0_74 <4=>P0_31 +// I2C0_SCL Pin <0=>P0_6 #ifndef I2C0_SDA_LOC -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_I2C0_SDA_PORT_ID 2 -#else #define RTE_I2C0_SDA_PORT_ID 0 -#endif #if (RTE_I2C0_SDA_PORT_ID == 0) #define RTE_I2C0_SDA_PORT 0 @@ -2258,24 +2244,12 @@ #define RTE_I2C0_SDA_MUX 4 #define RTE_I2C0_SDA_PAD 1 #define RTE_I2C0_SDA_I2C_REN 6 -#elif (RTE_I2C0_SDA_PORT_ID == 1) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 67 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 25 -#define RTE_I2C0_SDA_I2C_REN 3 -#elif (RTE_I2C0_SDA_PORT_ID == 2) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 74 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 32 -#define RTE_I2C0_SDA_I2C_REN 10 #else #error "Invalid I2C0 RTE_I2C0_SDA Pin Configuration!" #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2357,7 +2331,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2397,7 +2371,7 @@ //Pintool data #endif -// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <4=>P0_67 <4=>P0_71 <7=>P0_34 +// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <5=>P0_71 <6=>P0_34 #ifndef I2C1_SDA_LOC #define RTE_I2C1_SDA_PORT_ID 2 @@ -2433,12 +2407,6 @@ #define RTE_I2C1_SDA_REN 1 #elif (RTE_I2C1_SDA_PORT_ID == 5) #define RTE_I2C1_SDA_PORT 0 -#define RTE_I2C1_SDA_PIN 67 -#define RTE_I2C1_SDA_MUX 5 -#define RTE_I2C1_SDA_PAD 25 -#define RTE_I2C1_SDA_REN 3 -#elif (RTE_I2C1_SDA_PORT_ID == 6) -#define RTE_I2C1_SDA_PORT 0 #define RTE_I2C1_SDA_PIN 71 #define RTE_I2C1_SDA_MUX 5 #define RTE_I2C1_SDA_PAD 29 @@ -2448,7 +2416,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2526,7 +2494,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2564,8 +2532,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2626,7 +2594,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2681,7 +2649,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2735,7 +2703,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2789,7 +2757,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2842,7 +2810,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2897,7 +2865,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2962,7 +2930,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2998,7 +2966,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3045,7 +3013,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3059,7 +3027,7 @@ //Pintool data #endif -//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_67 <2=>GPIO_71 +//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_71 #ifndef SCT_IN3_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SCT_IN_3_PORT_ID 0 @@ -3074,11 +3042,6 @@ #define RTE_SCT_IN_3_PAD 0 //no pad #elif (RTE_SCT_IN_3_PORT_ID == 1) #define RTE_SCT_IN_3_PORT 0 -#define RTE_SCT_IN_3_PIN 67 -#define RTE_SCT_IN_3_MUX 7 -#define RTE_SCT_IN_3_PAD 25 -#elif (RTE_SCT_IN_3_PORT_ID == 2) -#define RTE_SCT_IN_3_PORT 0 #define RTE_SCT_IN_3_PIN 71 #define RTE_SCT_IN_3_MUX 9 #define RTE_SCT_IN_3_PAD 29 @@ -3087,7 +3050,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3114,7 +3077,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3140,7 +3103,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3154,42 +3117,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3296,7 +3259,7 @@ //Pintool data #endif -// SIO_2 <0=>GPIO_8 <1=>GPIO_27 <2=>GPIO_66 <3=>GPIO_74 +// SIO_2 <0=>GPIO_8 <1=>GPIO_27 <2=>GPIO_66 #ifndef SIO_2_LOC #define RTE_SIO_2_PORT_ID 1 @@ -3315,11 +3278,6 @@ #define RTE_SIO_2_PIN 66 #define RTE_SIO_2_MUX 1 #define RTE_SIO_2_PAD 24 -#elif (RTE_SIO_2_PORT_ID == 3) -#define RTE_SIO_2_PORT 0 -#define RTE_SIO_2_PIN 74 -#define RTE_SIO_2_MUX 1 -#define RTE_SIO_2_PAD 32 #else #error "Invalid RTE_SIO_2_PIN Pin Configuration!" #endif @@ -3342,7 +3300,7 @@ //Pintool data #endif -//SIO_3 <0=>GPIO_9 <1=>GPIO_28 <2=>GPIO_67 <3=>GPIO_75 +//SIO_3 <0=>GPIO_9 <1=>GPIO_28 <2=>GPIO_75 #ifndef SIO_3_LOC #define RTE_SIO_3_PORT_ID 1 @@ -3358,11 +3316,6 @@ #define RTE_SIO_3_PAD 0 //no pad #elif (RTE_SIO_3_PORT_ID == 2) #define RTE_SIO_3_PORT 0 -#define RTE_SIO_3_PIN 67 -#define RTE_SIO_3_MUX 1 -#define RTE_SIO_3_PAD 25 -#elif (RTE_SIO_3_PORT_ID == 3) -#define RTE_SIO_3_PORT 0 #define RTE_SIO_3_PIN 75 #define RTE_SIO_3_MUX 1 #define RTE_SIO_3_PAD 33 @@ -3533,7 +3486,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3565,7 +3518,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3578,7 +3531,7 @@ //Pintool data #endif -//PWM_2H <0=>GPIO_9 <1=>GPIO_67 <2=>GPIO_69 +//PWM_2H <0=>GPIO_9 #ifndef PWM_2H_LOC #define RTE_PWM_2H_PORT_ID 0 #if ((RTE_PWM_2H_PORT_ID == 2)) @@ -3590,17 +3543,12 @@ #define RTE_PWM_2H_PIN 9 #define RTE_PWM_2H_MUX 10 #define RTE_PWM_2H_PAD 4 -#elif (RTE_PWM_2H_PORT_ID == 1) -#define RTE_PWM_2H_PORT 0 -#define RTE_PWM_2H_PIN 67 -#define RTE_PWM_2H_MUX 8 -#define RTE_PWM_2H_PAD 25 #else #error "Invalid RTE_PWM_2H_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3636,7 +3584,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3668,7 +3616,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3695,7 +3643,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3731,7 +3679,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3761,7 +3709,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3794,7 +3742,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3813,7 +3761,7 @@ //Pintool data #endif -// PWM_FAULTB <0=>GPIO_26 <1=>GPIO_69 <1=>GPIO_74 +// PWM_FAULTB <0=>GPIO_26 #ifndef PWM_FAULTB_LOC #define RTE_PWM_FAULTB_PORT_ID 0 @@ -3822,17 +3770,12 @@ #define RTE_PWM_FAULTB_PIN 26 #define RTE_PWM_FAULTB_MUX 10 #define RTE_PWM_FAULTB_PAD 0 //no pad -#elif (RTE_PWM_FAULTB_PORT_ID == 2) -#define RTE_PWM_FAULTB_PORT 0 -#define RTE_PWM_FAULTB_PIN 74 -#define RTE_PWM_FAULTB_MUX 8 -#define RTE_PWM_FAULTB_PAD 32 #else #error "Invalid RTE_PWM_FAULTB_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3857,7 +3800,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3893,7 +3836,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3941,7 +3884,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3967,7 +3910,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3987,7 +3930,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4007,9 +3950,9 @@ //<> QEI (Quadrature Encode Interface) -//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_67 <4=>GPIO_71 <5=>GPIO_73 <6=>GPIO_11 <7=>GPIO_34 +//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_71 <4=>GPIO_73 <5=>GPIO_11 <6=>GPIO_34 -#define RTE_QEI_DIR_PORT_ID 4 +#define RTE_QEI_DIR_PORT_ID 3 #if (RTE_QEI_DIR_PORT_ID == 0) #define RTE_QEI_DIR_PORT 0 @@ -4028,15 +3971,10 @@ #define RTE_QEI_DIR_PAD 21 #elif (RTE_QEI_DIR_PORT_ID == 3) #define RTE_QEI_DIR_PORT 0 -#define RTE_QEI_DIR_PIN 67 -#define RTE_QEI_DIR_MUX 3 -#define RTE_QEI_DIR_PAD 25 -#elif (RTE_QEI_DIR_PORT_ID == 4) -#define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 71 #define RTE_QEI_DIR_MUX 3 #define RTE_QEI_DIR_PAD 29 -#elif (RTE_QEI_DIR_PORT_ID == 5) +#elif (RTE_QEI_DIR_PORT_ID == 4) #define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 73 #define RTE_QEI_DIR_MUX 3 @@ -4110,12 +4048,12 @@ #error "Invalid RTE_QEI_PHA_PIN Pin Configuration!" #endif -//QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <1=>GPIO_56 <1=>GPIO_66 <1=>GPIO_70 <1=>GPIO_74 <7=>GPIO_33 +//QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <2=>GPIO_56 <3=>GPIO_66 <4=>GPIO_70 #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_QEI_PHB_PORT_ID 5 -#else #define RTE_QEI_PHB_PORT_ID 4 +#else +#define RTE_QEI_PHB_PORT_ID 3 #endif #if (RTE_QEI_PHB_PORT_ID == 0) @@ -4143,280 +4081,18 @@ #define RTE_QEI_PHB_PIN 70 #define RTE_QEI_PHB_MUX 3 #define RTE_QEI_PHB_PAD 28 -#elif (RTE_QEI_PHB_PORT_ID == 5) -#define RTE_QEI_PHB_PORT 0 -#define RTE_QEI_PHB_PIN 74 -#define RTE_QEI_PHB_MUX 3 -#define RTE_QEI_PHB_PAD 32 #else #error "Invalid RTE_QEI_PHB_PIN Pin Configuration!" #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4425,7 +4101,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4434,7 +4110,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4443,7 +4119,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4452,7 +4128,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4461,7 +4137,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4470,7 +4146,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4480,7 +4156,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 @@ -4688,18 +4364,9 @@ #error "Invalid RTE_ULP_GPIO_2_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_ULP_GPIO_3_PORT_ID 1 -#else -#define RTE_ULP_GPIO_3_PORT_ID 0 -#endif -#if (RTE_ULP_GPIO_3_PORT_ID == 0) -#define RTE_ULP_GPIO_3_PORT 0 -#define RTE_ULP_GPIO_3_PAD 25 -#define RTE_ULP_GPIO_3_PIN 67 -#define RTE_ULP_GPIO_3_MODE 0 -#elif (RTE_ULP_GPIO_3_PORT_ID == 1) +#if (RTE_ULP_GPIO_3_PORT_ID == 1) #define RTE_ULP_GPIO_3_PORT 4 #define RTE_ULP_GPIO_3_PIN 3 #define RTE_ULP_GPIO_3_MODE 0 @@ -4821,19 +4488,10 @@ #error "Invalid RTE_ULP_GPIO_9_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_ULP_GPIO_10_PORT_ID 1 -#else #define RTE_ULP_GPIO_10_PORT_ID 0 -#endif #if (RTE_ULP_GPIO_10_PORT_ID == 0) #define RTE_ULP_GPIO_10_PORT 4 -#define RTE_ULP_GPIO_10_PAD 32 -#define RTE_ULP_GPIO_10_PIN 74 -#define RTE_ULP_GPIO_10_MODE 0 -#elif (RTE_ULP_GPIO_10_PORT_ID == 1) -#define RTE_ULP_GPIO_10_PORT 4 #define RTE_ULP_GPIO_10_PIN 10 #define RTE_ULP_GPIO_10_MODE 0 #else diff --git a/components/board/silabs/config/brd4343a/pin_config.h b/components/board/silabs/config/brd4343a/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4343a/pin_config.h +++ b/components/board/silabs/config/brd4343a/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4343a/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4343a/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4343a/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4343a/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4343a/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4343a/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4343a/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4343a/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4343a/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4343a/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..28169b6c2 --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 0 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4343a/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4343a/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4343a/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4343a/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..de10c3340 --- /dev/null +++ b/components/board/silabs/config/brd4343a/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS1_ on ULP_GPIO_4/GPIO_68 +#ifndef SL_MEMLCD_CS1__PORT +#define SL_MEMLCD_CS1__PORT ULP +#endif +#ifndef SL_MEMLCD_CS1__PIN +#define SL_MEMLCD_CS1__PIN 4 +#endif +#ifndef SL_MEMLCD_CS1_LOC +#define SL_MEMLCD_CS1_LOC 10 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT ULP +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 5 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4343b/RTE_Device_917.h b/components/board/silabs/config/brd4343b/RTE_Device_917.h index c98d6a0e6..fa182e940 100644 --- a/components/board/silabs/config/brd4343b/RTE_Device_917.h +++ b/components/board/silabs/config/brd4343b/RTE_Device_917.h @@ -20,7 +20,7 @@ * $Date: 1. December 2016 * $Revision: V2.4.4 * - * Project: RTE Device Configuration for Si91x 2.0 B0 BRD4343B + * Project: RTE Device Configuration for Si917 ACx Module BRD4343B * -------------------------------------------------------------------------- */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -109,7 +109,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -167,7 +167,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -235,7 +235,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -294,7 +294,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -343,7 +343,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -395,7 +395,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -447,7 +447,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -491,7 +491,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -530,7 +530,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -549,7 +549,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -566,7 +566,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -595,7 +595,7 @@ #define RTE_UART1_CHNL_UDMA_RX_CH 26 /*UART1 PINS*/ -// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_67 <3=>P0_69 <4=>P0_73 <5=>P0_75 <6=>P0_34 +// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_69 <3=>P0_73 <4=>P0_75 <5=>P0_34 // TX of UART1 #ifndef UART1_TX_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER @@ -620,15 +620,10 @@ #define RTE_UART1_TX_PAD 0 //no pad #elif (RTE_UART1_TX_PORT_ID == 2) #define RTE_UART1_TX_PORT 0 -#define RTE_UART1_TX_PIN 67 -#define RTE_UART1_TX_MUX 9 -#define RTE_UART1_TX_PAD 25 -#elif (RTE_UART1_TX_PORT_ID == 3) -#define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 73 #define RTE_UART1_TX_MUX 6 #define RTE_UART1_TX_PAD 31 -#elif (RTE_UART1_TX_PORT_ID == 4) +#elif (RTE_UART1_TX_PORT_ID == 3) #define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 75 #define RTE_UART1_TX_MUX 9 @@ -638,7 +633,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -667,7 +662,7 @@ //Pintool data #endif -// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_68 <4=>P0_72 <5=>P0_74 <6=>P0_33 +// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_72 // RX of UART1 #ifndef UART1_RX_LOC #define RTE_UART1_RX_PORT_ID 0 @@ -692,17 +687,12 @@ #define RTE_UART1_RX_PIN 72 #define RTE_UART1_RX_MUX 6 #define RTE_UART1_RX_PAD 30 -#elif (RTE_UART1_RX_PORT_ID == 4) -#define RTE_UART1_RX_PORT 0 -#define RTE_UART1_RX_PIN 74 -#define RTE_UART1_RX_MUX 9 -#define RTE_UART1_RX_PAD 32 #else #error "Invalid UART1 RTE_UART1_RX_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -766,7 +756,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -839,7 +829,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -914,7 +904,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -941,7 +931,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -964,7 +954,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -981,7 +971,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1024,7 +1014,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1067,7 +1057,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1110,7 +1100,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1158,7 +1148,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1183,7 +1173,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1211,7 +1201,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1233,7 +1223,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1295,7 +1285,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1353,7 +1343,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1407,7 +1397,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1427,7 +1417,7 @@ // SSI_SLAVE_CS Pin <0=>Not Used <1=>GPIO_9 <2=>GPIO_25 <3=>GPIO_46 <4=>GPIO_53 #ifndef SSI_SLAVE_CS0_LOC -#define RTE_SSI_SLAVE_CS_PORT_ID 1 +#define RTE_SSI_SLAVE_CS_PORT_ID 2 #if (RTE_SSI_SLAVE_CS_PORT_ID == 0) #define RTE_SSI_SLAVE_CS 0 @@ -1461,7 +1451,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1500,12 +1490,12 @@ #define RTE_SSI_ULP_MASTER 1 // Enable multiple CSN lines -#define ULP_SSI_CS0 1 -#define ULP_SSI_CS1 0 +#define ULP_SSI_CS0 0 +#define ULP_SSI_CS1 1 #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1523,14 +1513,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1548,14 +1538,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1579,14 +1569,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1604,30 +1594,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1718,7 +1708,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1766,7 +1756,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1814,7 +1804,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1862,7 +1852,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1914,7 +1904,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1962,7 +1952,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2058,7 +2048,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2080,7 +2070,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2102,7 +2092,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2128,7 +2118,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2222,7 +2212,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2244,13 +2234,9 @@ //Pintool data #endif -// I2C0_SCL Pin <0=>P0_6 <1=>P0_64 <2=>P0_67 <3=>P0_74 <4=>P0_31 +// I2C0_SCL Pin <0=>P0_6 #ifndef I2C0_SDA_LOC -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_I2C0_SDA_PORT_ID 2 -#else #define RTE_I2C0_SDA_PORT_ID 0 -#endif #if (RTE_I2C0_SDA_PORT_ID == 0) #define RTE_I2C0_SDA_PORT 0 @@ -2258,24 +2244,12 @@ #define RTE_I2C0_SDA_MUX 4 #define RTE_I2C0_SDA_PAD 1 #define RTE_I2C0_SDA_I2C_REN 6 -#elif (RTE_I2C0_SDA_PORT_ID == 1) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 67 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 25 -#define RTE_I2C0_SDA_I2C_REN 3 -#elif (RTE_I2C0_SDA_PORT_ID == 2) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 74 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 32 -#define RTE_I2C0_SDA_I2C_REN 10 #else #error "Invalid I2C0 RTE_I2C0_SDA Pin Configuration!" #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2357,7 +2331,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2397,7 +2371,7 @@ //Pintool data #endif -// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <4=>P0_67 <4=>P0_71 <7=>P0_34 +// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <5=>P0_71 <6=>P0_34 #ifndef I2C1_SDA_LOC #define RTE_I2C1_SDA_PORT_ID 2 @@ -2433,12 +2407,6 @@ #define RTE_I2C1_SDA_REN 1 #elif (RTE_I2C1_SDA_PORT_ID == 5) #define RTE_I2C1_SDA_PORT 0 -#define RTE_I2C1_SDA_PIN 67 -#define RTE_I2C1_SDA_MUX 5 -#define RTE_I2C1_SDA_PAD 25 -#define RTE_I2C1_SDA_REN 3 -#elif (RTE_I2C1_SDA_PORT_ID == 6) -#define RTE_I2C1_SDA_PORT 0 #define RTE_I2C1_SDA_PIN 71 #define RTE_I2C1_SDA_MUX 5 #define RTE_I2C1_SDA_PAD 29 @@ -2448,7 +2416,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2526,7 +2494,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2564,8 +2532,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2626,7 +2594,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2681,7 +2649,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2735,7 +2703,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2789,7 +2757,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2842,7 +2810,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2897,7 +2865,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2962,7 +2930,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2998,7 +2966,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3045,7 +3013,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3059,7 +3027,7 @@ //Pintool data #endif -//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_67 <2=>GPIO_71 +//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_71 #ifndef SCT_IN3_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SCT_IN_3_PORT_ID 0 @@ -3074,11 +3042,6 @@ #define RTE_SCT_IN_3_PAD 0 //no pad #elif (RTE_SCT_IN_3_PORT_ID == 1) #define RTE_SCT_IN_3_PORT 0 -#define RTE_SCT_IN_3_PIN 67 -#define RTE_SCT_IN_3_MUX 7 -#define RTE_SCT_IN_3_PAD 25 -#elif (RTE_SCT_IN_3_PORT_ID == 2) -#define RTE_SCT_IN_3_PORT 0 #define RTE_SCT_IN_3_PIN 71 #define RTE_SCT_IN_3_MUX 9 #define RTE_SCT_IN_3_PAD 29 @@ -3087,7 +3050,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3114,7 +3077,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3140,7 +3103,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3154,42 +3117,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3296,7 +3259,7 @@ //Pintool data #endif -// SIO_2 <0=>GPIO_8 <1=>GPIO_27 <2=>GPIO_66 <3=>GPIO_74 +// SIO_2 <0=>GPIO_8 <1=>GPIO_27 <2=>GPIO_66 #ifndef SIO_2_LOC #define RTE_SIO_2_PORT_ID 1 @@ -3315,11 +3278,6 @@ #define RTE_SIO_2_PIN 66 #define RTE_SIO_2_MUX 1 #define RTE_SIO_2_PAD 24 -#elif (RTE_SIO_2_PORT_ID == 3) -#define RTE_SIO_2_PORT 0 -#define RTE_SIO_2_PIN 74 -#define RTE_SIO_2_MUX 1 -#define RTE_SIO_2_PAD 32 #else #error "Invalid RTE_SIO_2_PIN Pin Configuration!" #endif @@ -3342,7 +3300,7 @@ //Pintool data #endif -//SIO_3 <0=>GPIO_9 <1=>GPIO_28 <2=>GPIO_67 <3=>GPIO_75 +//SIO_3 <0=>GPIO_9 <1=>GPIO_28 <2=>GPIO_75 #ifndef SIO_3_LOC #define RTE_SIO_3_PORT_ID 1 @@ -3358,11 +3316,6 @@ #define RTE_SIO_3_PAD 0 //no pad #elif (RTE_SIO_3_PORT_ID == 2) #define RTE_SIO_3_PORT 0 -#define RTE_SIO_3_PIN 67 -#define RTE_SIO_3_MUX 1 -#define RTE_SIO_3_PAD 25 -#elif (RTE_SIO_3_PORT_ID == 3) -#define RTE_SIO_3_PORT 0 #define RTE_SIO_3_PIN 75 #define RTE_SIO_3_MUX 1 #define RTE_SIO_3_PAD 33 @@ -3533,7 +3486,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3565,7 +3518,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3578,7 +3531,7 @@ //Pintool data #endif -//PWM_2H <0=>GPIO_9 <1=>GPIO_67 <2=>GPIO_69 +//PWM_2H <0=>GPIO_9 #ifndef PWM_2H_LOC #define RTE_PWM_2H_PORT_ID 0 #if ((RTE_PWM_2H_PORT_ID == 2)) @@ -3590,17 +3543,12 @@ #define RTE_PWM_2H_PIN 9 #define RTE_PWM_2H_MUX 10 #define RTE_PWM_2H_PAD 4 -#elif (RTE_PWM_2H_PORT_ID == 1) -#define RTE_PWM_2H_PORT 0 -#define RTE_PWM_2H_PIN 67 -#define RTE_PWM_2H_MUX 8 -#define RTE_PWM_2H_PAD 25 #else #error "Invalid RTE_PWM_2H_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3636,7 +3584,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3668,7 +3616,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3695,7 +3643,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3731,7 +3679,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3761,7 +3709,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3794,7 +3742,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3813,7 +3761,7 @@ //Pintool data #endif -// PWM_FAULTB <0=>GPIO_26 <1=>GPIO_69 <1=>GPIO_74 +// PWM_FAULTB <0=>GPIO_26 #ifndef PWM_FAULTB_LOC #define RTE_PWM_FAULTB_PORT_ID 0 @@ -3822,17 +3770,12 @@ #define RTE_PWM_FAULTB_PIN 26 #define RTE_PWM_FAULTB_MUX 10 #define RTE_PWM_FAULTB_PAD 0 //no pad -#elif (RTE_PWM_FAULTB_PORT_ID == 2) -#define RTE_PWM_FAULTB_PORT 0 -#define RTE_PWM_FAULTB_PIN 74 -#define RTE_PWM_FAULTB_MUX 8 -#define RTE_PWM_FAULTB_PAD 32 #else #error "Invalid RTE_PWM_FAULTB_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3857,7 +3800,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3893,7 +3836,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3941,7 +3884,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3967,7 +3910,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3987,7 +3930,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4007,9 +3950,9 @@ //<> QEI (Quadrature Encode Interface) -//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_67 <4=>GPIO_71 <5=>GPIO_73 <6=>GPIO_11 <7=>GPIO_34 +//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_71 <4=>GPIO_73 <5=>GPIO_11 <6=>GPIO_34 -#define RTE_QEI_DIR_PORT_ID 4 +#define RTE_QEI_DIR_PORT_ID 3 #if (RTE_QEI_DIR_PORT_ID == 0) #define RTE_QEI_DIR_PORT 0 @@ -4028,15 +3971,10 @@ #define RTE_QEI_DIR_PAD 21 #elif (RTE_QEI_DIR_PORT_ID == 3) #define RTE_QEI_DIR_PORT 0 -#define RTE_QEI_DIR_PIN 67 -#define RTE_QEI_DIR_MUX 3 -#define RTE_QEI_DIR_PAD 25 -#elif (RTE_QEI_DIR_PORT_ID == 4) -#define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 71 #define RTE_QEI_DIR_MUX 3 #define RTE_QEI_DIR_PAD 29 -#elif (RTE_QEI_DIR_PORT_ID == 5) +#elif (RTE_QEI_DIR_PORT_ID == 4) #define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 73 #define RTE_QEI_DIR_MUX 3 @@ -4110,12 +4048,12 @@ #error "Invalid RTE_QEI_PHA_PIN Pin Configuration!" #endif -//QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <1=>GPIO_56 <1=>GPIO_66 <1=>GPIO_70 <1=>GPIO_74 <7=>GPIO_33 +//QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <2=>GPIO_56 <3=>GPIO_66 <4=>GPIO_70 #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_QEI_PHB_PORT_ID 5 -#else #define RTE_QEI_PHB_PORT_ID 4 +#else +#define RTE_QEI_PHB_PORT_ID 3 #endif #if (RTE_QEI_PHB_PORT_ID == 0) @@ -4143,280 +4081,18 @@ #define RTE_QEI_PHB_PIN 70 #define RTE_QEI_PHB_MUX 3 #define RTE_QEI_PHB_PAD 28 -#elif (RTE_QEI_PHB_PORT_ID == 5) -#define RTE_QEI_PHB_PORT 0 -#define RTE_QEI_PHB_PIN 74 -#define RTE_QEI_PHB_MUX 3 -#define RTE_QEI_PHB_PAD 32 #else #error "Invalid RTE_QEI_PHB_PIN Pin Configuration!" #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4425,7 +4101,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4434,7 +4110,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4443,7 +4119,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4452,7 +4128,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4461,7 +4137,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4470,7 +4146,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4480,7 +4156,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 @@ -4688,18 +4364,9 @@ #error "Invalid RTE_ULP_GPIO_2_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_ULP_GPIO_3_PORT_ID 1 -#else -#define RTE_ULP_GPIO_3_PORT_ID 0 -#endif -#if (RTE_ULP_GPIO_3_PORT_ID == 0) -#define RTE_ULP_GPIO_3_PORT 0 -#define RTE_ULP_GPIO_3_PAD 25 -#define RTE_ULP_GPIO_3_PIN 67 -#define RTE_ULP_GPIO_3_MODE 0 -#elif (RTE_ULP_GPIO_3_PORT_ID == 1) +#if (RTE_ULP_GPIO_3_PORT_ID == 1) #define RTE_ULP_GPIO_3_PORT 4 #define RTE_ULP_GPIO_3_PIN 3 #define RTE_ULP_GPIO_3_MODE 0 @@ -4821,19 +4488,10 @@ #error "Invalid RTE_ULP_GPIO_9_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_ULP_GPIO_10_PORT_ID 1 -#else #define RTE_ULP_GPIO_10_PORT_ID 0 -#endif #if (RTE_ULP_GPIO_10_PORT_ID == 0) #define RTE_ULP_GPIO_10_PORT 4 -#define RTE_ULP_GPIO_10_PAD 32 -#define RTE_ULP_GPIO_10_PIN 74 -#define RTE_ULP_GPIO_10_MODE 0 -#elif (RTE_ULP_GPIO_10_PORT_ID == 1) -#define RTE_ULP_GPIO_10_PORT 4 #define RTE_ULP_GPIO_10_PIN 10 #define RTE_ULP_GPIO_10_MODE 0 #else @@ -4885,8 +4543,8 @@ // ULP GPIO as enable pin for sensors #define SENSOR_ENABLE_GPIO_MAPPED_TO_ULP -#define SENSOR_ENABLE_GPIO_PORT RTE_ULP_GPIO_3_PORT -#define SENSOR_ENABLE_GPIO_PIN RTE_ULP_GPIO_3_PIN +#define SENSOR_ENABLE_GPIO_PORT RTE_ULP_GPIO_2_PORT +#define SENSOR_ENABLE_GPIO_PIN RTE_ULP_GPIO_2_PIN // Memlcd GPIOs #define RTE_MEMLCD_CS_PIN 4 // Memlcd SPI CS pin diff --git a/components/board/silabs/config/brd4343b/pin_config.h b/components/board/silabs/config/brd4343b/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4343b/pin_config.h +++ b/components/board/silabs/config/brd4343b/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4343b/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4343b/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4343b/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4343b/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4343b/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4343b/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4343b/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4343b/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4343b/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4343b/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..28169b6c2 --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 0 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4343b/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4343b/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4343b/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4343b/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..de10c3340 --- /dev/null +++ b/components/board/silabs/config/brd4343b/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS1_ on ULP_GPIO_4/GPIO_68 +#ifndef SL_MEMLCD_CS1__PORT +#define SL_MEMLCD_CS1__PORT ULP +#endif +#ifndef SL_MEMLCD_CS1__PIN +#define SL_MEMLCD_CS1__PIN 4 +#endif +#ifndef SL_MEMLCD_CS1_LOC +#define SL_MEMLCD_CS1_LOC 10 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT ULP +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 5 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4343q/RTE_Device_917.h b/components/board/silabs/config/brd4343q/RTE_Device_917.h index 4023f0e17..9fe616f73 100644 --- a/components/board/silabs/config/brd4343q/RTE_Device_917.h +++ b/components/board/silabs/config/brd4343q/RTE_Device_917.h @@ -20,7 +20,7 @@ * $Date: 1. December 2016 * $Revision: V2.4.4 * - * Project: RTE Device Configuration for Si91x 2.0 B0 BRD4343Q + * Project: RTE Device Configuration for Si917 ACx Module BRD4343Q * -------------------------------------------------------------------------- */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -109,7 +109,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -167,7 +167,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -235,7 +235,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -294,7 +294,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -343,7 +343,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -395,7 +395,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -447,7 +447,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -491,7 +491,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -530,7 +530,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -549,7 +549,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -566,7 +566,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -595,7 +595,7 @@ #define RTE_UART1_CHNL_UDMA_RX_CH 26 /*UART1 PINS*/ -// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_67 <3=>P0_69 <4=>P0_73 <5=>P0_75 <6=>P0_34 +// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_69 <3=>P0_73 <4=>P0_75 <5=>P0_34 // TX of UART1 #ifndef UART1_TX_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER @@ -620,15 +620,10 @@ #define RTE_UART1_TX_PAD 0 //no pad #elif (RTE_UART1_TX_PORT_ID == 2) #define RTE_UART1_TX_PORT 0 -#define RTE_UART1_TX_PIN 67 -#define RTE_UART1_TX_MUX 9 -#define RTE_UART1_TX_PAD 25 -#elif (RTE_UART1_TX_PORT_ID == 3) -#define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 73 #define RTE_UART1_TX_MUX 6 #define RTE_UART1_TX_PAD 31 -#elif (RTE_UART1_TX_PORT_ID == 4) +#elif (RTE_UART1_TX_PORT_ID == 3) #define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 75 #define RTE_UART1_TX_MUX 9 @@ -638,7 +633,7 @@ #endif #else //Pintool data -#define RTE_UART1_TX_PORT UART1_TX_PORT +#define RTE_UART1_TX_PORT 0 #if (UART1_TX_LOC == 0) #define RTE_UART1_TX_PIN UART1_TX_PIN #define RTE_UART1_TX_MUX 6 @@ -667,7 +662,7 @@ //Pintool data #endif -// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_68 <4=>P0_72 <5=>P0_74 <6=>P0_33 +// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_72 // RX of UART1 #ifndef UART1_RX_LOC #define RTE_UART1_RX_PORT_ID 0 @@ -692,17 +687,12 @@ #define RTE_UART1_RX_PIN 72 #define RTE_UART1_RX_MUX 6 #define RTE_UART1_RX_PAD 30 -#elif (RTE_UART1_RX_PORT_ID == 4) -#define RTE_UART1_RX_PORT 0 -#define RTE_UART1_RX_PIN 74 -#define RTE_UART1_RX_MUX 9 -#define RTE_UART1_RX_PAD 32 #else #error "Invalid UART1 RTE_UART1_RX_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -766,7 +756,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -839,7 +829,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -914,7 +904,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -941,7 +931,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -964,7 +954,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -981,7 +971,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1024,7 +1014,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA1_LOC == 3) @@ -1067,7 +1057,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1110,7 +1100,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1158,7 +1148,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1183,7 +1173,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1211,7 +1201,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1233,7 +1223,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1295,7 +1285,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1353,7 +1343,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1407,7 +1397,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1427,7 +1417,7 @@ // SSI_SLAVE_CS Pin <0=>Not Used <1=>GPIO_9 <2=>GPIO_25 <3=>GPIO_46 <4=>GPIO_53 #ifndef SSI_SLAVE_CS0_LOC -#define RTE_SSI_SLAVE_CS_PORT_ID 1 +#define RTE_SSI_SLAVE_CS_PORT_ID 2 #if (RTE_SSI_SLAVE_CS_PORT_ID == 0) #define RTE_SSI_SLAVE_CS 0 @@ -1461,7 +1451,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1500,12 +1490,12 @@ #define RTE_SSI_ULP_MASTER 1 // Enable multiple CSN lines -#define ULP_SSI_CS0 1 -#define ULP_SSI_CS1 0 +#define ULP_SSI_CS0 0 +#define ULP_SSI_CS1 1 #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1523,14 +1513,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1548,14 +1538,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1579,14 +1569,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1604,30 +1594,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT -#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 +#define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SSI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1718,7 +1708,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1766,7 +1756,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1814,7 +1804,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1862,7 +1852,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1914,7 +1904,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1962,7 +1952,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2058,7 +2048,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2080,7 +2070,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2102,7 +2092,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2128,7 +2118,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2222,7 +2212,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2244,13 +2234,9 @@ //Pintool data #endif -// I2C0_SCL Pin <0=>P0_6 <1=>P0_64 <2=>P0_67 <3=>P0_74 <4=>P0_31 +// I2C0_SCL Pin <0=>P0_6 #ifndef I2C0_SDA_LOC -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_I2C0_SDA_PORT_ID 2 -#else #define RTE_I2C0_SDA_PORT_ID 0 -#endif #if (RTE_I2C0_SDA_PORT_ID == 0) #define RTE_I2C0_SDA_PORT 0 @@ -2258,24 +2244,12 @@ #define RTE_I2C0_SDA_MUX 4 #define RTE_I2C0_SDA_PAD 1 #define RTE_I2C0_SDA_I2C_REN 6 -#elif (RTE_I2C0_SDA_PORT_ID == 1) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 67 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 25 -#define RTE_I2C0_SDA_I2C_REN 3 -#elif (RTE_I2C0_SDA_PORT_ID == 2) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 74 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 32 -#define RTE_I2C0_SDA_I2C_REN 10 #else #error "Invalid I2C0 RTE_I2C0_SDA Pin Configuration!" #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2357,7 +2331,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2397,7 +2371,7 @@ //Pintool data #endif -// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <4=>P0_67 <4=>P0_71 <7=>P0_34 +// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <5=>P0_71 <6=>P0_34 #ifndef I2C1_SDA_LOC #define RTE_I2C1_SDA_PORT_ID 2 @@ -2433,12 +2407,6 @@ #define RTE_I2C1_SDA_REN 1 #elif (RTE_I2C1_SDA_PORT_ID == 5) #define RTE_I2C1_SDA_PORT 0 -#define RTE_I2C1_SDA_PIN 67 -#define RTE_I2C1_SDA_MUX 5 -#define RTE_I2C1_SDA_PAD 25 -#define RTE_I2C1_SDA_REN 3 -#elif (RTE_I2C1_SDA_PORT_ID == 6) -#define RTE_I2C1_SDA_PORT 0 #define RTE_I2C1_SDA_PIN 71 #define RTE_I2C1_SDA_MUX 5 #define RTE_I2C1_SDA_PAD 29 @@ -2448,7 +2416,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2526,7 +2494,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2564,8 +2532,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2626,7 +2594,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2681,7 +2649,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2735,7 +2703,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2789,7 +2757,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2842,7 +2810,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2897,7 +2865,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -2962,7 +2930,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_0_PORT SCT_IN0_PORT +#define RTE_SCT_IN_0_PORT 0 #if (SCT_IN0_LOC == 0) #define RTE_SCT_IN_0_PIN SCT_IN0_PIN #define RTE_SCT_IN_0_MUX 9 @@ -2998,7 +2966,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_1_PORT SCT_IN1_PORT +#define RTE_SCT_IN_1_PORT 0 #if (SCT_IN1_LOC == 3) #define RTE_SCT_IN_1_PIN SCT_IN1_PIN #define RTE_SCT_IN_1_MUX 9 @@ -3045,7 +3013,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_2_PORT SCT_IN2_PORT +#define RTE_SCT_IN_2_PORT 0 #if (SCT_IN2_LOC == 6) #define RTE_SCT_IN_2_PIN SCT_IN2_PIN #define RTE_SCT_IN_2_MUX 9 @@ -3059,7 +3027,7 @@ //Pintool data #endif -//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_67 <2=>GPIO_71 +//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_71 #ifndef SCT_IN3_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SCT_IN_3_PORT_ID 0 @@ -3074,11 +3042,6 @@ #define RTE_SCT_IN_3_PAD 0 //no pad #elif (RTE_SCT_IN_3_PORT_ID == 1) #define RTE_SCT_IN_3_PORT 0 -#define RTE_SCT_IN_3_PIN 67 -#define RTE_SCT_IN_3_MUX 7 -#define RTE_SCT_IN_3_PAD 25 -#elif (RTE_SCT_IN_3_PORT_ID == 2) -#define RTE_SCT_IN_3_PORT 0 #define RTE_SCT_IN_3_PIN 71 #define RTE_SCT_IN_3_MUX 9 #define RTE_SCT_IN_3_PAD 29 @@ -3087,7 +3050,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3114,7 +3077,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3140,7 +3103,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3154,42 +3117,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3296,7 +3259,7 @@ //Pintool data #endif -// SIO_2 <0=>GPIO_8 <1=>GPIO_27 <2=>GPIO_66 <3=>GPIO_74 +// SIO_2 <0=>GPIO_8 <1=>GPIO_27 <2=>GPIO_66 #ifndef SIO_2_LOC #define RTE_SIO_2_PORT_ID 1 @@ -3315,11 +3278,6 @@ #define RTE_SIO_2_PIN 66 #define RTE_SIO_2_MUX 1 #define RTE_SIO_2_PAD 24 -#elif (RTE_SIO_2_PORT_ID == 3) -#define RTE_SIO_2_PORT 0 -#define RTE_SIO_2_PIN 74 -#define RTE_SIO_2_MUX 1 -#define RTE_SIO_2_PAD 32 #else #error "Invalid RTE_SIO_2_PIN Pin Configuration!" #endif @@ -3342,7 +3300,7 @@ //Pintool data #endif -//SIO_3 <0=>GPIO_9 <1=>GPIO_28 <2=>GPIO_67 <3=>GPIO_75 +//SIO_3 <0=>GPIO_9 <1=>GPIO_28 <2=>GPIO_75 #ifndef SIO_3_LOC #define RTE_SIO_3_PORT_ID 1 @@ -3358,11 +3316,6 @@ #define RTE_SIO_3_PAD 0 //no pad #elif (RTE_SIO_3_PORT_ID == 2) #define RTE_SIO_3_PORT 0 -#define RTE_SIO_3_PIN 67 -#define RTE_SIO_3_MUX 1 -#define RTE_SIO_3_PAD 25 -#elif (RTE_SIO_3_PORT_ID == 3) -#define RTE_SIO_3_PORT 0 #define RTE_SIO_3_PIN 75 #define RTE_SIO_3_MUX 1 #define RTE_SIO_3_PAD 33 @@ -3533,7 +3486,7 @@ #endif #else //Pintool data -#define RTE_PWM_1H_PORT PWM_1H_PORT +#define RTE_PWM_1H_PORT 0 #if (PWM_1H_LOC == 0) #define RTE_PWM_1H_PIN PWM_1H_PIN #define RTE_PWM_1H_MUX 10 @@ -3565,7 +3518,7 @@ #endif #else //Pintool data -#define RTE_PWM_1L_PORT PWM_1L_PORT +#define RTE_PWM_1L_PORT 0 #if (PWM_1L_LOC == 2) #define RTE_PWM_1L_PIN PWM_1L_PIN #define RTE_PWM_1L_MUX 10 @@ -3578,7 +3531,7 @@ //Pintool data #endif -//PWM_2H <0=>GPIO_9 <1=>GPIO_67 <2=>GPIO_69 +//PWM_2H <0=>GPIO_9 #ifndef PWM_2H_LOC #define RTE_PWM_2H_PORT_ID 0 #if ((RTE_PWM_2H_PORT_ID == 2)) @@ -3590,17 +3543,12 @@ #define RTE_PWM_2H_PIN 9 #define RTE_PWM_2H_MUX 10 #define RTE_PWM_2H_PAD 4 -#elif (RTE_PWM_2H_PORT_ID == 1) -#define RTE_PWM_2H_PORT 0 -#define RTE_PWM_2H_PIN 67 -#define RTE_PWM_2H_MUX 8 -#define RTE_PWM_2H_PAD 25 #else #error "Invalid RTE_PWM_2H_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3636,7 +3584,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3668,7 +3616,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3695,7 +3643,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3731,7 +3679,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3761,7 +3709,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3794,7 +3742,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3813,7 +3761,7 @@ //Pintool data #endif -// PWM_FAULTB <0=>GPIO_26 <1=>GPIO_69 <1=>GPIO_74 +// PWM_FAULTB <0=>GPIO_26 #ifndef PWM_FAULTB_LOC #define RTE_PWM_FAULTB_PORT_ID 0 @@ -3822,17 +3770,12 @@ #define RTE_PWM_FAULTB_PIN 26 #define RTE_PWM_FAULTB_MUX 10 #define RTE_PWM_FAULTB_PAD 0 //no pad -#elif (RTE_PWM_FAULTB_PORT_ID == 2) -#define RTE_PWM_FAULTB_PORT 0 -#define RTE_PWM_FAULTB_PIN 74 -#define RTE_PWM_FAULTB_MUX 8 -#define RTE_PWM_FAULTB_PAD 32 #else #error "Invalid RTE_PWM_FAULTB_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3857,7 +3800,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3893,7 +3836,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3941,7 +3884,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3967,7 +3910,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3987,7 +3930,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4007,9 +3950,9 @@ //<> QEI (Quadrature Encode Interface) -//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_67 <4=>GPIO_71 <5=>GPIO_73 <6=>GPIO_11 <7=>GPIO_34 +//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_71 <4=>GPIO_73 <5=>GPIO_11 <6=>GPIO_34 -#define RTE_QEI_DIR_PORT_ID 4 +#define RTE_QEI_DIR_PORT_ID 3 #if (RTE_QEI_DIR_PORT_ID == 0) #define RTE_QEI_DIR_PORT 0 @@ -4028,15 +3971,10 @@ #define RTE_QEI_DIR_PAD 21 #elif (RTE_QEI_DIR_PORT_ID == 3) #define RTE_QEI_DIR_PORT 0 -#define RTE_QEI_DIR_PIN 67 -#define RTE_QEI_DIR_MUX 3 -#define RTE_QEI_DIR_PAD 25 -#elif (RTE_QEI_DIR_PORT_ID == 4) -#define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 71 #define RTE_QEI_DIR_MUX 3 #define RTE_QEI_DIR_PAD 29 -#elif (RTE_QEI_DIR_PORT_ID == 5) +#elif (RTE_QEI_DIR_PORT_ID == 4) #define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 73 #define RTE_QEI_DIR_MUX 3 @@ -4110,12 +4048,12 @@ #error "Invalid RTE_QEI_PHA_PIN Pin Configuration!" #endif -//QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <1=>GPIO_56 <1=>GPIO_66 <1=>GPIO_70 <1=>GPIO_74 <7=>GPIO_33 +//QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <2=>GPIO_56 <3=>GPIO_66 <4=>GPIO_70 #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_QEI_PHB_PORT_ID 5 -#else #define RTE_QEI_PHB_PORT_ID 4 +#else +#define RTE_QEI_PHB_PORT_ID 3 #endif #if (RTE_QEI_PHB_PORT_ID == 0) @@ -4143,280 +4081,18 @@ #define RTE_QEI_PHB_PIN 70 #define RTE_QEI_PHB_MUX 3 #define RTE_QEI_PHB_PAD 28 -#elif (RTE_QEI_PHB_PORT_ID == 5) -#define RTE_QEI_PHB_PORT 0 -#define RTE_QEI_PHB_PIN 74 -#define RTE_QEI_PHB_MUX 3 -#define RTE_QEI_PHB_PAD 32 #else #error "Invalid RTE_QEI_PHB_PIN Pin Configuration!" #endif #endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN -#endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 -#else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN -#endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 - -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN -#endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4425,7 +4101,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4434,7 +4110,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4443,7 +4119,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4452,7 +4128,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4461,7 +4137,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4470,7 +4146,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4480,7 +4156,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 @@ -4688,18 +4364,9 @@ #error "Invalid RTE_ULP_GPIO_2_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_ULP_GPIO_3_PORT_ID 1 -#else -#define RTE_ULP_GPIO_3_PORT_ID 0 -#endif -#if (RTE_ULP_GPIO_3_PORT_ID == 0) -#define RTE_ULP_GPIO_3_PORT 0 -#define RTE_ULP_GPIO_3_PAD 25 -#define RTE_ULP_GPIO_3_PIN 67 -#define RTE_ULP_GPIO_3_MODE 0 -#elif (RTE_ULP_GPIO_3_PORT_ID == 1) +#if (RTE_ULP_GPIO_3_PORT_ID == 1) #define RTE_ULP_GPIO_3_PORT 4 #define RTE_ULP_GPIO_3_PIN 3 #define RTE_ULP_GPIO_3_MODE 0 @@ -4821,19 +4488,10 @@ #error "Invalid RTE_ULP_GPIO_9_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_ULP_GPIO_10_PORT_ID 1 -#else #define RTE_ULP_GPIO_10_PORT_ID 0 -#endif #if (RTE_ULP_GPIO_10_PORT_ID == 0) #define RTE_ULP_GPIO_10_PORT 4 -#define RTE_ULP_GPIO_10_PAD 32 -#define RTE_ULP_GPIO_10_PIN 74 -#define RTE_ULP_GPIO_10_MODE 0 -#elif (RTE_ULP_GPIO_10_PORT_ID == 1) -#define RTE_ULP_GPIO_10_PORT 4 #define RTE_ULP_GPIO_10_PIN 10 #define RTE_ULP_GPIO_10_MODE 0 #else @@ -4885,8 +4543,8 @@ // ULP GPIO as enable pin for sensors #define SENSOR_ENABLE_GPIO_MAPPED_TO_ULP -#define SENSOR_ENABLE_GPIO_PORT RTE_ULP_GPIO_3_PORT -#define SENSOR_ENABLE_GPIO_PIN RTE_ULP_GPIO_3_PIN +#define SENSOR_ENABLE_GPIO_PORT RTE_ULP_GPIO_2_PORT +#define SENSOR_ENABLE_GPIO_PIN RTE_ULP_GPIO_2_PIN // Memlcd GPIOs #define RTE_MEMLCD_CS_PIN 4 // Memlcd SPI CS pin diff --git a/components/board/silabs/config/brd4343q/pin_config.h b/components/board/silabs/config/brd4343q/pin_config.h index 2bbc8c59c..60a6a7d20 100644 --- a/components/board/silabs/config/brd4343q/pin_config.h +++ b/components/board/silabs/config/brd4343q/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -127,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/board/silabs/config/brd4343q/sl_iostream_usart_vcom_config.h b/components/board/silabs/config/brd4343q/sl_iostream_usart_vcom_config.h new file mode 100644 index 000000000..97ff2003b --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_iostream_usart_vcom_config.h @@ -0,0 +1,135 @@ +/***************************************************************************/ /** + * @file + * @brief IOSTREAM_USART Config. + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_IOSTREAM_USART_VCOM_CONFIG_H +#define SL_IOSTREAM_USART_VCOM_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// USART settings + +#define ENABLE 1 +#define DISABLE 0 + +// Baud rate <9600-921600> +// Default: 115200 +#define SL_IOSTREAM_USART_VCOM_BAUDRATE 115200 + +// Parity +// No Parity +// Even parity +// Odd parity +// Default: SL_USART_NO_PARITY +#define SL_IOSTREAM_USART_VCOM_PARITY SL_USART_NO_PARITY + +// Stop bits +// 0.5 stop bits +// 1 stop bits +// 1.5 stop bits +// 2 stop bits +// Default: SL_USART_STOP_BITS_1 +#define SL_IOSTREAM_USART_VCOM_STOP_BITS SL_USART_STOP_BITS_1 + +#define SL_IOSTREAM_USART_VCOM_MODE SL_USART_MODE_ASYNCHRONOUS + +// Data Width +// 5 data bits +// 6 data bits +// 7 data bits +// 8 data bits +// Default: SL_USART_DATA_BITS_8 +#define SL_IOSTREAM_USART_VCOM_DATA_BITS SL_USART_DATA_BITS_8 + +// Flow control +// None +// CTS +// RTS +// CTS/RTS +// Default: SL_USART_FLOW_CONTROL_NONE +#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE SL_USART_FLOW_CONTROL_NONE + +// VCOM enable +// Default: 1 +#define SL_SI91X_VCOM_ENABLE 1 + +#define USART0_MODULE 0 +#define UART1_MODULE 1 +#define ULP_UART_MODULE 2 + +#if SL_SI91X_VCOM_ENABLE +#define SL_USART_MODULE ULP_UART_MODULE +#else +#define SL_USART_MODULE USART0_MODULE +#endif + +// Receive buffer size +// Default: 32 +#define SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE 32 + +// Convert \n to \r\n +// It can be changed at runtime using the C API. +// Default: 0 +#define SL_IOSTREAM_USART_VCOM_CONVERT_BY_DEFAULT_LF_TO_CRLF 0 +// + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_IOSTREAM +// $[USART_SL_SI91X_IOSTREAM] +#ifndef SL_SI91X_IOSTREAM_PERIPHERAL +#define SL_SI91X_IOSTREAM_PERIPHERAL ULP_UART +#endif + +// ULP_UART TX on ULP_GPIO_11/GPIO_75 +#ifndef SL_SI91X_IOSTREAM_TX_PORT +#define SL_SI91X_IOSTREAM_TX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_TX_PIN +#define SL_SI91X_IOSTREAM_TX_PIN 11 +#endif +#ifndef SL_SI91X_IOSTREAM_TX_LOC +#define SL_SI91X_IOSTREAM_TX_LOC 1 +#endif + +// ULP_UART RX on ULP_GPIO_9/GPIO_73 +#ifndef SL_SI91X_IOSTREAM_RX_PORT +#define SL_SI91X_IOSTREAM_RX_PORT ULP +#endif +#ifndef SL_SI91X_IOSTREAM_RX_PIN +#define SL_SI91X_IOSTREAM_RX_PIN 9 +#endif +#ifndef SL_SI91X_IOSTREAM_RX_LOC +#define SL_SI91X_IOSTREAM_RX_LOC 3 +#endif +// [USART_SL_SI91X_IOSTREAM]$ +// <<< sl:end pin_tool >>> + +#endif \ No newline at end of file diff --git a/components/board/silabs/config/brd4343q/sl_si91x_button_init_btn0_config.h b/components/board/silabs/config/brd4343q/sl_si91x_button_init_btn0_config.h new file mode 100644 index 000000000..f31924c9a --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_si91x_button_init_btn0_config.h @@ -0,0 +1,42 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn0_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // SL_SI91X_BUTTON_INIT_BTN0_CONFIG_H diff --git a/components/board/silabs/config/brd4343q/sl_si91x_button_init_btn1_config.h b/components/board/silabs/config/brd4343q/sl_si91x_button_init_btn1_config.h new file mode 100644 index 000000000..31838d62e --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_si91x_button_init_btn1_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_btn1_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H +#define SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_INSTANCE_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_1 +// $[GPIO_SL_SI91X_BUTTON_1] +#ifndef SL_SI91X_BUTTON_1_PORT +#define SL_SI91X_BUTTON_1_PORT HP +#endif +#ifndef SL_SI91X_BUTTON_1_PIN +#define SL_SI91X_BUTTON_1_PIN 11 +#endif +// [GPIO_SL_SI91X_BUTTON_1]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN1_PIN SL_SI91X_BUTTON_1_PIN +#define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT +#define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER +#define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD + +#endif // SL_SI91X_BUTTON_INIT_BTN1_CONFIG_H diff --git a/components/board/silabs/config/brd4343q/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/brd4343q/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..1719bbde9 --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,115 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_I2C2_CONFIG_H +#define SL_SI91X_I2C_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration + +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_I2C_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/brd4343q/sl_si91x_led_init_led0_config.h b/components/board/silabs/config/brd4343q/sl_si91x_led_init_led0_config.h new file mode 100644 index 000000000..28169b6c2 --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_si91x_led_init_led0_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led0_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED0_CONFIG_H +#define SL_SI91X_LED_INIT_LED0_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 0 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER + +#endif // SL_SI91X_LED_INIT_LED0_CONFIG_H diff --git a/components/board/silabs/config/brd4343q/sl_si91x_led_init_led1_config.h b/components/board/silabs/config/brd4343q/sl_si91x_led_init_led1_config.h new file mode 100644 index 000000000..14093b027 --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_si91x_led_init_led1_config.h @@ -0,0 +1,28 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_led1_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_LED1_CONFIG_H +#define SL_SI91X_LED_INIT_LED1_CONFIG_H + +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT HP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 10 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER + +#endif // SL_SI91X_LED_INIT_LED1_CONFIG_H diff --git a/components/board/silabs/config/brd4343q/sl_si91x_memlcd_config.h b/components/board/silabs/config/brd4343q/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..de10c3340 --- /dev/null +++ b/components/board/silabs/config/brd4343q/sl_si91x_memlcd_config.h @@ -0,0 +1,109 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS1_ on ULP_GPIO_4/GPIO_68 +#ifndef SL_MEMLCD_CS1__PORT +#define SL_MEMLCD_CS1__PORT ULP +#endif +#ifndef SL_MEMLCD_CS1__PIN +#define SL_MEMLCD_CS1__PIN 4 +#endif +#ifndef SL_MEMLCD_CS1_LOC +#define SL_MEMLCD_CS1_LOC 10 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT ULP +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 5 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif + +#endif // SL_SI91X_MEMLCD_CONFIG_H \ No newline at end of file diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_10_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_10_config.h index 9c5c6e87d..b7f4a54d6 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_10_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_10_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH10 +// SL_ADC_CH10 // $[ADC_CH10_SL_ADC_CH10] #ifndef SL_ADC_CH10_PERIPHERAL #define SL_ADC_CH10_PERIPHERAL ADC_CH10 #endif -// ADC_CH10 P10 on ULP_GPIO_9/GPIO_73 -#ifndef SL_ADC_CH10_P10_PORT -#define SL_ADC_CH10_P10_PORT 0 +// ADC_CH10 P on ULP_GPIO_9/GPIO_73 +#ifndef SL_ADC_CH10_P_PORT +#define SL_ADC_CH10_P_PORT ULP #endif -#ifndef SL_ADC_CH10_P10_PIN -#define SL_ADC_CH10_P10_PIN 9 +#ifndef SL_ADC_CH10_P_PIN +#define SL_ADC_CH10_P_PIN 9 #endif -#ifndef SL_ADC_CH10_P10_LOC -#define SL_ADC_CH10_P10_LOC 438 +#ifndef SL_ADC_CH10_P_LOC +#define SL_ADC_CH10_P_LOC 438 #endif // [ADC_CH10_SL_ADC_CH10]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH10_P10_LOC -#define SL_ADC_CHANNEL_10_POS_INPUT_CHNL_SEL (SL_ADC_CH10_P10_LOC - P10_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH10_P_LOC +#define SL_ADC_CHANNEL_10_POS_INPUT_CHNL_SEL (SL_ADC_CH10_P_LOC - P10_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_10_POS_INPUT_CHNL_SEL 14 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_11_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_11_config.h index 64a062c89..1e782a930 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_11_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_11_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH11 +// SL_ADC_CH11 // $[ADC_CH11_SL_ADC_CH11] #ifndef SL_ADC_CH11_PERIPHERAL #define SL_ADC_CH11_PERIPHERAL ADC_CH11 #endif -// ADC_CH11 P11 on ULP_GPIO_1/GPIO_65 -#ifndef SL_ADC_CH11_P11_PORT -#define SL_ADC_CH11_P11_PORT 0 +// ADC_CH11 P on ULP_GPIO_1/GPIO_65 +#ifndef SL_ADC_CH11_P_PORT +#define SL_ADC_CH11_P_PORT ULP #endif -#ifndef SL_ADC_CH11_P11_PIN -#define SL_ADC_CH11_P11_PIN 1 +#ifndef SL_ADC_CH11_P_PIN +#define SL_ADC_CH11_P_PIN 1 #endif -#ifndef SL_ADC_CH11_P11_LOC -#define SL_ADC_CH11_P11_LOC 181 +#ifndef SL_ADC_CH11_P_LOC +#define SL_ADC_CH11_P_LOC 181 #endif // [ADC_CH11_SL_ADC_CH11]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH11_P11_LOC -#define SL_ADC_CHANNEL_11_POS_INPUT_CHNL_SEL (SL_ADC_CH11_P11_LOC - P11_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH11_P_LOC +#define SL_ADC_CHANNEL_11_POS_INPUT_CHNL_SEL (SL_ADC_CH11_P_LOC - P11_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_11_POS_INPUT_CHNL_SEL 10 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_12_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_12_config.h index cb6725ac4..591960ea0 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_12_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_12_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH12 +// SL_ADC_CH12 // $[ADC_CH12_SL_ADC_CH12] #ifndef SL_ADC_CH12_PERIPHERAL #define SL_ADC_CH12_PERIPHERAL ADC_CH12 #endif -// ADC_CH12 P12 on ULP_GPIO_1/GPIO_65 -#ifndef SL_ADC_CH12_P12_PORT -#define SL_ADC_CH12_P12_PORT 0 +// ADC_CH12 P on ULP_GPIO_1/GPIO_65 +#ifndef SL_ADC_CH12_P_PORT +#define SL_ADC_CH12_P_PORT ULP #endif -#ifndef SL_ADC_CH12_P12_PIN -#define SL_ADC_CH12_P12_PIN 1 +#ifndef SL_ADC_CH12_P_PIN +#define SL_ADC_CH12_P_PIN 1 #endif -#ifndef SL_ADC_CH12_P12_LOC -#define SL_ADC_CH12_P12_LOC 201 +#ifndef SL_ADC_CH12_P_LOC +#define SL_ADC_CH12_P_LOC 201 #endif // [ADC_CH12_SL_ADC_CH12]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH12_P12_LOC -#define SL_ADC_CHANNEL_12_POS_INPUT_CHNL_SEL (SL_ADC_CH12_P12_LOC - P12_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH12_P_LOC +#define SL_ADC_CHANNEL_12_POS_INPUT_CHNL_SEL (SL_ADC_CH12_P_LOC - P12_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_12_POS_INPUT_CHNL_SEL 10 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_13_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_13_config.h index c30dcabf6..478f8fef5 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_13_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_13_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH13 +// SL_ADC_CH13 // $[ADC_CH13_SL_ADC_CH13] #ifndef SL_ADC_CH13_PERIPHERAL #define SL_ADC_CH13_PERIPHERAL ADC_CH13 #endif -// ADC_CH13 P13 on ULP_GPIO_7/GPIO_71 -#ifndef SL_ADC_CH13_P13_PORT -#define SL_ADC_CH13_P13_PORT 0 +// ADC_CH13 P on ULP_GPIO_7/GPIO_71 +#ifndef SL_ADC_CH13_P_PORT +#define SL_ADC_CH13_P_PORT ULP #endif -#ifndef SL_ADC_CH13_P13_PIN -#define SL_ADC_CH13_P13_PIN 7 +#ifndef SL_ADC_CH13_P_PIN +#define SL_ADC_CH13_P_PIN 7 #endif -#ifndef SL_ADC_CH13_P13_LOC -#define SL_ADC_CH13_P13_LOC 225 +#ifndef SL_ADC_CH13_P_LOC +#define SL_ADC_CH13_P_LOC 225 #endif // [ADC_CH13_SL_ADC_CH13]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH13_P13_LOC -#define SL_ADC_CHANNEL_13_POS_INPUT_CHNL_SEL (SL_ADC_CH13_P13_LOC - P13_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH13_P_LOC +#define SL_ADC_CHANNEL_13_POS_INPUT_CHNL_SEL (SL_ADC_CH13_P_LOC - P13_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_13_POS_INPUT_CHNL_SEL 15 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_14_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_14_config.h index 78c327815..7d8cf38bc 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_14_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_14_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH14 +// SL_ADC_CH14 // $[ADC_CH14_SL_ADC_CH14] #ifndef SL_ADC_CH14_PERIPHERAL #define SL_ADC_CH14_PERIPHERAL ADC_CH14 #endif -// ADC_CH14 P14 on GPIO_26 -#ifndef SL_ADC_CH14_P14_PORT -#define SL_ADC_CH14_P14_PORT 0 +// ADC_CH14 P on GPIO_26 +#ifndef SL_ADC_CH14_P_PORT +#define SL_ADC_CH14_P_PORT HP #endif -#ifndef SL_ADC_CH14_P14_PIN -#define SL_ADC_CH14_P14_PIN 26 +#ifndef SL_ADC_CH14_P_PIN +#define SL_ADC_CH14_P_PIN 26 #endif -#ifndef SL_ADC_CH14_P14_LOC -#define SL_ADC_CH14_P14_LOC 245 +#ifndef SL_ADC_CH14_P_LOC +#define SL_ADC_CH14_P_LOC 245 #endif // [ADC_CH14_SL_ADC_CH14]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH14_P14_LOC -#define SL_ADC_CHANNEL_14_POS_INPUT_CHNL_SEL (SL_ADC_CH14_P14_LOC - P14_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH14_P_LOC +#define SL_ADC_CHANNEL_14_POS_INPUT_CHNL_SEL (SL_ADC_CH14_P_LOC - P14_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_14_POS_INPUT_CHNL_SEL 16 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_15_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_15_config.h index 30870cfbc..95eaf5f3e 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_15_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_15_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH15 +// SL_ADC_CH15 // $[ADC_CH15_SL_ADC_CH15] #ifndef SL_ADC_CH15_PERIPHERAL #define SL_ADC_CH15_PERIPHERAL ADC_CH15 #endif -// ADC_CH15 P15 on GPIO_30 -#ifndef SL_ADC_CH15_P15_PORT -#define SL_ADC_CH15_P15_PORT 0 +// ADC_CH15 P on GPIO_30 +#ifndef SL_ADC_CH15_P_PORT +#define SL_ADC_CH15_P_PORT HP #endif -#ifndef SL_ADC_CH15_P15_PIN -#define SL_ADC_CH15_P15_PIN 30 +#ifndef SL_ADC_CH15_P_PIN +#define SL_ADC_CH15_P_PIN 30 #endif -#ifndef SL_ADC_CH15_P15_LOC -#define SL_ADC_CH15_P15_LOC 266 +#ifndef SL_ADC_CH15_P_LOC +#define SL_ADC_CH15_P_LOC 266 #endif // [ADC_CH15_SL_ADC_CH15]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH15_P15_LOC -#define SL_ADC_CHANNEL_15_POS_INPUT_CHNL_SEL (SL_ADC_CH15_P15_LOC - P15_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH15_P_LOC +#define SL_ADC_CHANNEL_15_POS_INPUT_CHNL_SEL (SL_ADC_CH15_P_LOC - P15_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_15_POS_INPUT_CHNL_SEL 18 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_16_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_16_config.h index df904452e..86199dda9 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_16_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_16_config.h @@ -59,27 +59,27 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH16 +// SL_ADC_CH16 // $[ADC_CH16_SL_ADC_CH16] #ifndef SL_ADC_CH16_PERIPHERAL #define SL_ADC_CH16_PERIPHERAL ADC_CH16 #endif -// ADC_CH16 P16 on GPIO_30 -#ifndef SL_ADC_CH16_P16_PORT -#define SL_ADC_CH16_P16_PORT 0 +// ADC_CH16 P on GPIO_30 +#ifndef SL_ADC_CH16_P_PORT +#define SL_ADC_CH16_P_PORT HP #endif -#ifndef SL_ADC_CH16_P16_PIN -#define SL_ADC_CH16_P16_PIN 30 +#ifndef SL_ADC_CH16_P_PIN +#define SL_ADC_CH16_P_PIN 30 #endif -#ifndef SL_ADC_CH16_P16_LOC -#define SL_ADC_CH16_P16_LOC 285 +#ifndef SL_ADC_CH16_P_LOC +#define SL_ADC_CH16_P_LOC 285 #endif // [ADC_CH16_SL_ADC_CH16]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH16_P16_LOC -#define SL_ADC_CHANNEL_16_POS_INPUT_CHNL_SEL (SL_ADC_CH16_P16_LOC - P16_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH16_P_LOC +#define SL_ADC_CHANNEL_16_POS_INPUT_CHNL_SEL (SL_ADC_CH16_P_LOC - P16_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_16_POS_INPUT_CHNL_SEL 18 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_1_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_1_config.h index 69d4263f2..574f53a73 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_1_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_1_config.h @@ -59,43 +59,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH1 +// SL_ADC_CH1 // $[ADC_CH1_SL_ADC_CH1] #ifndef SL_ADC_CH1_PERIPHERAL #define SL_ADC_CH1_PERIPHERAL ADC_CH1 #endif -// ADC_CH1 P1 on ULP_GPIO_1/GPIO_65 -#ifndef SL_ADC_CH1_P1_PORT -#define SL_ADC_CH1_P1_PORT 0 +// ADC_CH1 P on ULP_GPIO_1/GPIO_65 +#ifndef SL_ADC_CH1_P_PORT +#define SL_ADC_CH1_P_PORT ULP #endif -#ifndef SL_ADC_CH1_P1_PIN -#define SL_ADC_CH1_P1_PIN 1 +#ifndef SL_ADC_CH1_P_PIN +#define SL_ADC_CH1_P_PIN 1 #endif -#ifndef SL_ADC_CH1_P1_LOC -#define SL_ADC_CH1_P1_LOC 10 +#ifndef SL_ADC_CH1_P_LOC +#define SL_ADC_CH1_P_LOC 10 #endif -// ADC_CH1 N1 on GPIO_28 -#ifndef SL_ADC_CH1_N1_PORT -#define SL_ADC_CH1_N1_PORT 0 +// ADC_CH1 N on GPIO_28 +#ifndef SL_ADC_CH1_N_PORT +#define SL_ADC_CH1_N_PORT HP #endif -#ifndef SL_ADC_CH1_N1_PIN -#define SL_ADC_CH1_N1_PIN 28 +#ifndef SL_ADC_CH1_N_PIN +#define SL_ADC_CH1_N_PIN 28 #endif -#ifndef SL_ADC_CH1_N1_LOC -#define SL_ADC_CH1_N1_LOC 350 +#ifndef SL_ADC_CH1_N_LOC +#define SL_ADC_CH1_N_LOC 350 #endif // [ADC_CH1_SL_ADC_CH1]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH1_P1_LOC -#define SL_ADC_CHANNEL_1_POS_INPUT_CHNL_SEL SL_ADC_CH1_P1_LOC +#ifdef SL_ADC_CH1_P_LOC +#define SL_ADC_CHANNEL_1_POS_INPUT_CHNL_SEL SL_ADC_CH1_P_LOC #else #define SL_ADC_CHANNEL_1_POS_INPUT_CHNL_SEL 10 #endif -#ifdef SL_ADC_CH1_N1_LOC -#define SL_ADC_CHANNEL_1_NEG_INPUT_CHNL_SEL (SL_ADC_CH1_N1_LOC - N1_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH1_N_LOC +#define SL_ADC_CHANNEL_1_NEG_INPUT_CHNL_SEL (SL_ADC_CH1_N_LOC - N1_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_1_NEG_INPUT_CHNL_SEL 7 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_2_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_2_config.h index ddc310622..2a5ba845a 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_2_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_2_config.h @@ -60,43 +60,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH2 +// SL_ADC_CH2 // $[ADC_CH2_SL_ADC_CH2] #ifndef SL_ADC_CH2_PERIPHERAL #define SL_ADC_CH2_PERIPHERAL ADC_CH2 #endif -// ADC_CH2 P2 on GPIO_27 -#ifndef SL_ADC_CH2_P2_PORT -#define SL_ADC_CH2_P2_PORT 0 +// ADC_CH2 P on GPIO_27 +#ifndef SL_ADC_CH2_P_PORT +#define SL_ADC_CH2_P_PORT HP #endif -#ifndef SL_ADC_CH2_P2_PIN -#define SL_ADC_CH2_P2_PIN 27 +#ifndef SL_ADC_CH2_P_PIN +#define SL_ADC_CH2_P_PIN 27 #endif -#ifndef SL_ADC_CH2_P2_LOC -#define SL_ADC_CH2_P2_LOC 26 +#ifndef SL_ADC_CH2_P_LOC +#define SL_ADC_CH2_P_LOC 26 #endif -// ADC_CH2 N2 on GPIO_30 -#ifndef SL_ADC_CH2_N2_PORT -#define SL_ADC_CH2_N2_PORT 0 +// ADC_CH2 N on GPIO_30 +#ifndef SL_ADC_CH2_N_PORT +#define SL_ADC_CH2_N_PORT HP #endif -#ifndef SL_ADC_CH2_N2_PIN -#define SL_ADC_CH2_N2_PIN 30 +#ifndef SL_ADC_CH2_N_PIN +#define SL_ADC_CH2_N_PIN 30 #endif -#ifndef SL_ADC_CH2_N2_LOC -#define SL_ADC_CH2_N2_LOC 360 +#ifndef SL_ADC_CH2_N_LOC +#define SL_ADC_CH2_N_LOC 360 #endif // [ADC_CH2_SL_ADC_CH2]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH2_P2_LOC -#define SL_ADC_CHANNEL_2_POS_INPUT_CHNL_SEL (SL_ADC_CH2_P2_LOC - P2_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH2_P_LOC +#define SL_ADC_CHANNEL_2_POS_INPUT_CHNL_SEL (SL_ADC_CH2_P_LOC - P2_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_2_POS_INPUT_CHNL_SEL 7 #endif -#ifdef SL_ADC_CH2_N2_LOC -#define SL_ADC_CHANNEL_2_NEG_INPUT_CHNL_SEL (SL_ADC_CH2_N2_LOC - N2_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH2_N_LOC +#define SL_ADC_CHANNEL_2_NEG_INPUT_CHNL_SEL (SL_ADC_CH2_N_LOC - N2_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_2_NEG_INPUT_CHNL_SEL 8 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_3_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_3_config.h index 49bdd8885..9fdfbb15a 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_3_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_3_config.h @@ -60,42 +60,42 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH3 +// SL_ADC_CH3 // $[ADC_CH3_SL_ADC_CH3] #ifndef SL_ADC_CH3_PERIPHERAL #define SL_ADC_CH3_PERIPHERAL ADC_CH3 #endif -// ADC_CH3 P3 on ULP_GPIO_8/GPIO_72 -#ifndef SL_ADC_CH3_P3_PORT -#define SL_ADC_CH3_P3_PORT 0 +// ADC_CH3 P on ULP_GPIO_8/GPIO_72 +#ifndef SL_ADC_CH3_P_PORT +#define SL_ADC_CH3_P_PORT ULP #endif -#ifndef SL_ADC_CH3_P3_PIN -#define SL_ADC_CH3_P3_PIN 8 +#ifndef SL_ADC_CH3_P_PIN +#define SL_ADC_CH3_P_PIN 8 #endif -#ifndef SL_ADC_CH3_P3_LOC -#define SL_ADC_CH3_P3_LOC 42 +#ifndef SL_ADC_CH3_P_LOC +#define SL_ADC_CH3_P_LOC 42 #endif -// ADC_CH3 N3 on GPIO_26 -#ifndef SL_ADC_CH3_N3_PORT -#define SL_ADC_CH3_N3_PORT 0 +// ADC_CH3 N on GPIO_26 +#ifndef SL_ADC_CH3_N_PORT +#define SL_ADC_CH3_N_PORT HP #endif -#ifndef SL_ADC_CH3_N3_PIN -#define SL_ADC_CH3_N3_PIN 26 +#ifndef SL_ADC_CH3_N_PIN +#define SL_ADC_CH3_N_PIN 26 #endif -#ifndef SL_ADC_CH3_N3_LOC -#define SL_ADC_CH3_N3_LOC 367 +#ifndef SL_ADC_CH3_N_LOC +#define SL_ADC_CH3_N_LOC 367 #endif // [ADC_CH3_SL_ADC_CH3]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH3_P3_LOC -#define SL_ADC_CHANNEL_3_POS_INPUT_CHNL_SEL (SL_ADC_CH3_P3_LOC - P3_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH3_P_LOC +#define SL_ADC_CHANNEL_3_POS_INPUT_CHNL_SEL (SL_ADC_CH3_P_LOC - P3_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_3_POS_INPUT_CHNL_SEL 4 #endif -#ifdef SL_ADC_CH3_N3_LOC -#define SL_ADC_CHANNEL_3_NEG_INPUT_CHNL_SEL (SL_ADC_CH3_N3_LOC - N3_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH3_N_LOC +#define SL_ADC_CHANNEL_3_NEG_INPUT_CHNL_SEL (SL_ADC_CH3_N_LOC - N3_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_3_NEG_INPUT_CHNL_SEL 6 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_4_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_4_config.h index 6fcc2ce25..d7e004ae4 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_4_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_4_config.h @@ -60,42 +60,42 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH4 +// SL_ADC_CH4 // $[ADC_CH4_SL_ADC_CH4] #ifndef SL_ADC_CH4_PERIPHERAL #define SL_ADC_CH4_PERIPHERAL ADC_CH4 #endif -// ADC_CH4 P4 on GPIO_25 -#ifndef SL_ADC_CH4_P4_PORT -#define SL_ADC_CH4_P4_PORT 0 +// ADC_CH4 P on GPIO_25 +#ifndef SL_ADC_CH4_P_PORT +#define SL_ADC_CH4_P_PORT HP #endif -#ifndef SL_ADC_CH4_P4_PIN -#define SL_ADC_CH4_P4_PIN 25 +#ifndef SL_ADC_CH4_P_PIN +#define SL_ADC_CH4_P_PIN 25 #endif -#ifndef SL_ADC_CH4_P4_LOC -#define SL_ADC_CH4_P4_LOC 63 +#ifndef SL_ADC_CH4_P_LOC +#define SL_ADC_CH4_P_LOC 63 #endif -// ADC_CH4 N4 on ULP_GPIO_7/GPIO_71 -#ifndef SL_ADC_CH4_N4_PORT -#define SL_ADC_CH4_N4_PORT 0 +// ADC_CH4 N on ULP_GPIO_7/GPIO_71 +#ifndef SL_ADC_CH4_N_PORT +#define SL_ADC_CH4_N_PORT ULP #endif -#ifndef SL_ADC_CH4_N4_PIN -#define SL_ADC_CH4_N4_PIN 7 +#ifndef SL_ADC_CH4_N_PIN +#define SL_ADC_CH4_N_PIN 7 #endif -#ifndef SL_ADC_CH4_N4_LOC -#define SL_ADC_CH4_N4_LOC 375 +#ifndef SL_ADC_CH4_N_LOC +#define SL_ADC_CH4_N_LOC 375 #endif // [ADC_CH4_SL_ADC_CH4]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH4_P4_LOC -#define SL_ADC_CHANNEL_4_POS_INPUT_CHNL_SEL (SL_ADC_CH4_P4_LOC - P4_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH4_P_LOC +#define SL_ADC_CHANNEL_4_POS_INPUT_CHNL_SEL (SL_ADC_CH4_P_LOC - P4_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_4_POS_INPUT_CHNL_SEL 6 #endif -#ifdef SL_ADC_CH4_N4_LOC -#define SL_ADC_CHANNEL_4_NEG_INPUT_CHNL_SEL (SL_ADC_CH4_N4_LOC - N4_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH4_N_LOC +#define SL_ADC_CHANNEL_4_NEG_INPUT_CHNL_SEL (SL_ADC_CH4_N_LOC - N4_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_4_NEG_INPUT_CHNL_SEL 5 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_5_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_5_config.h index 0f04dfc1f..141a9bd02 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_5_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_5_config.h @@ -60,43 +60,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH5 +// SL_ADC_CH5 // $[ADC_CH5_SL_ADC_CH5] #ifndef SL_ADC_CH5_PERIPHERAL #define SL_ADC_CH5_PERIPHERAL ADC_CH5 #endif -// ADC_CH5 P5 on ULP_GPIO_8/GPIO_72 -#ifndef SL_ADC_CH5_P5_PORT -#define SL_ADC_CH5_P5_PORT 0 +// ADC_CH5 P on ULP_GPIO_8/GPIO_72 +#ifndef SL_ADC_CH5_P_PORT +#define SL_ADC_CH5_P_PORT ULP #endif -#ifndef SL_ADC_CH5_P5_PIN -#define SL_ADC_CH5_P5_PIN 8 +#ifndef SL_ADC_CH5_P_PIN +#define SL_ADC_CH5_P_PIN 8 #endif -#ifndef SL_ADC_CH5_P5_LOC -#define SL_ADC_CH5_P5_LOC 80 +#ifndef SL_ADC_CH5_P_LOC +#define SL_ADC_CH5_P_LOC 80 #endif -// ADC_CH5 N5 on ULP_GPIO_1/GPIO_65 -#ifndef SL_ADC_CH5_N5_PORT -#define SL_ADC_CH5_N5_PORT 0 +// ADC_CH5 N on ULP_GPIO_1/GPIO_65 +#ifndef SL_ADC_CH5_N_PORT +#define SL_ADC_CH5_N_PORT ULP #endif -#ifndef SL_ADC_CH5_N5_PIN -#define SL_ADC_CH5_N5_PIN 1 +#ifndef SL_ADC_CH5_N_PIN +#define SL_ADC_CH5_N_PIN 1 #endif -#ifndef SL_ADC_CH5_N5_LOC -#define SL_ADC_CH5_N5_LOC 379 +#ifndef SL_ADC_CH5_N_LOC +#define SL_ADC_CH5_N_LOC 379 #endif // [ADC_CH5_SL_ADC_CH5]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH5_P5_LOC -#define SL_ADC_CHANNEL_5_POS_INPUT_CHNL_SEL (SL_ADC_CH5_P5_LOC - P5_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH5_P_LOC +#define SL_ADC_CHANNEL_5_POS_INPUT_CHNL_SEL (SL_ADC_CH5_P_LOC - P5_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_5_POS_INPUT_CHNL_SEL 4 #endif -#ifdef SL_ADC_CH5_N5_LOC -#define SL_ADC_CHANNEL_5_NEG_INPUT_CHNL_SEL (SL_ADC_CH5_N5_LOC - N5_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH5_N_LOC +#define SL_ADC_CHANNEL_5_NEG_INPUT_CHNL_SEL (SL_ADC_CH5_N_LOC - N5_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_5_NEG_INPUT_CHNL_SEL 0 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_6_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_6_config.h index 7672a13d9..c18a45205 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_6_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_6_config.h @@ -60,43 +60,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH6 +// SL_ADC_CH6 // $[ADC_CH6_SL_ADC_CH6] #ifndef SL_ADC_CH6_PERIPHERAL #define SL_ADC_CH6_PERIPHERAL ADC_CH6 #endif -// ADC_CH6 P6 on ULP_GPIO_10/GPIO_74 -#ifndef SL_ADC_CH6_P6_PORT -#define SL_ADC_CH6_P6_PORT 0 +// ADC_CH6 P on ULP_GPIO_10/GPIO_74 +#ifndef SL_ADC_CH6_P_PORT +#define SL_ADC_CH6_P_PORT ULP #endif -#ifndef SL_ADC_CH6_P6_PIN -#define SL_ADC_CH6_P6_PIN 10 +#ifndef SL_ADC_CH6_P_PIN +#define SL_ADC_CH6_P_PIN 10 #endif -#ifndef SL_ADC_CH6_P6_LOC -#define SL_ADC_CH6_P6_LOC 100 +#ifndef SL_ADC_CH6_P_LOC +#define SL_ADC_CH6_P_LOC 100 #endif -// ADC_CH6 N6 on ULP_GPIO_7/GPIO_71 -#ifndef SL_ADC_CH6_N6_PORT -#define SL_ADC_CH6_N6_PORT 0 +// ADC_CH6 N on ULP_GPIO_7/GPIO_71 +#ifndef SL_ADC_CH6_N_PORT +#define SL_ADC_CH6_N_PORT ULP #endif -#ifndef SL_ADC_CH6_N6_PIN -#define SL_ADC_CH6_N6_PIN 7 +#ifndef SL_ADC_CH6_N_PIN +#define SL_ADC_CH6_N_PIN 7 #endif -#ifndef SL_ADC_CH6_N6_LOC -#define SL_ADC_CH6_N6_LOC 393 +#ifndef SL_ADC_CH6_N_LOC +#define SL_ADC_CH6_N_LOC 393 #endif // [ADC_CH6_SL_ADC_CH6]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH6_P6_LOC -#define SL_ADC_CHANNEL_6_POS_INPUT_CHNL_SEL (SL_ADC_CH6_P6_LOC - P6_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH6_P_LOC +#define SL_ADC_CHANNEL_6_POS_INPUT_CHNL_SEL (SL_ADC_CH6_P_LOC - P6_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_6_POS_INPUT_CHNL_SEL 5 #endif -#ifdef SL_ADC_CH6_N6_LOC -#define SL_ADC_CHANNEL_6_NEG_INPUT_CHNL_SEL (SL_ADC_CH6_N6_LOC - N6_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH6_N_LOC +#define SL_ADC_CHANNEL_6_NEG_INPUT_CHNL_SEL (SL_ADC_CH6_N_LOC - N6_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_6_NEG_INPUT_CHNL_SEL 5 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_7_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_7_config.h index fe4e522e9..6f6a0bc16 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_7_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_7_config.h @@ -60,43 +60,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH7 +// SL_ADC_CH7 // $[ADC_CH7_SL_ADC_CH7] #ifndef SL_ADC_CH7_PERIPHERAL #define SL_ADC_CH7_PERIPHERAL ADC_CH7 #endif -// ADC_CH7 P7 on GPIO_25 -#ifndef SL_ADC_CH7_P7_PORT -#define SL_ADC_CH7_P7_PORT 0 +// ADC_CH7 P on GPIO_25 +#ifndef SL_ADC_CH7_P_PORT +#define SL_ADC_CH7_P_PORT HP #endif -#ifndef SL_ADC_CH7_P7_PIN -#define SL_ADC_CH7_P7_PIN 25 +#ifndef SL_ADC_CH7_P_PIN +#define SL_ADC_CH7_P_PIN 25 #endif -#ifndef SL_ADC_CH7_P7_LOC -#define SL_ADC_CH7_P7_LOC 120 +#ifndef SL_ADC_CH7_P_LOC +#define SL_ADC_CH7_P_LOC 120 #endif -// ADC_CH7 N7 on GPIO_26 -#ifndef SL_ADC_CH7_N7_PORT -#define SL_ADC_CH7_N7_PORT 0 +// ADC_CH7 N on GPIO_26 +#ifndef SL_ADC_CH7_N_PORT +#define SL_ADC_CH7_N_PORT HP #endif -#ifndef SL_ADC_CH7_N7_PIN -#define SL_ADC_CH7_N7_PIN 26 +#ifndef SL_ADC_CH7_N_PIN +#define SL_ADC_CH7_N_PIN 26 #endif -#ifndef SL_ADC_CH7_N7_LOC -#define SL_ADC_CH7_N7_LOC 403 +#ifndef SL_ADC_CH7_N_LOC +#define SL_ADC_CH7_N_LOC 403 #endif // [ADC_CH7_SL_ADC_CH7]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH7_P7_LOC -#define SL_ADC_CHANNEL_7_POS_INPUT_CHNL_SEL (SL_ADC_CH7_P7_LOC - P7_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH7_P_LOC +#define SL_ADC_CHANNEL_7_POS_INPUT_CHNL_SEL (SL_ADC_CH7_P_LOC - P7_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_7_POS_INPUT_CHNL_SEL 6 #endif -#ifdef SL_ADC_CH7_N7_LOC -#define SL_ADC_CHANNEL_7_NEG_INPUT_CHNL_SEL (SL_ADC_CH7_N7_LOC - N7_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH7_N_LOC +#define SL_ADC_CHANNEL_7_NEG_INPUT_CHNL_SEL (SL_ADC_CH7_N_LOC - N7_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_7_NEG_INPUT_CHNL_SEL 6 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_8_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_8_config.h index fff811862..e8035501c 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_8_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_8_config.h @@ -60,43 +60,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH8 +// SL_ADC_CH8 // $[ADC_CH8_SL_ADC_CH8] #ifndef SL_ADC_CH8_PERIPHERAL #define SL_ADC_CH8_PERIPHERAL ADC_CH8 #endif -// ADC_CH8 P8 on GPIO_27 -#ifndef SL_ADC_CH8_P8_PORT -#define SL_ADC_CH8_P8_PORT 0 +// ADC_CH8 P on GPIO_27 +#ifndef SL_ADC_CH8_P_PORT +#define SL_ADC_CH8_P_PORT HP #endif -#ifndef SL_ADC_CH8_P8_PIN -#define SL_ADC_CH8_P8_PIN 27 +#ifndef SL_ADC_CH8_P_PIN +#define SL_ADC_CH8_P_PIN 27 #endif -#ifndef SL_ADC_CH8_P8_LOC -#define SL_ADC_CH8_P8_LOC 140 +#ifndef SL_ADC_CH8_P_LOC +#define SL_ADC_CH8_P_LOC 140 #endif -// ADC_CH8 N8 on GPIO_28 -#ifndef SL_ADC_CH8_N8_PORT -#define SL_ADC_CH8_N8_PORT 0 +// ADC_CH8 N on GPIO_28 +#ifndef SL_ADC_CH8_N_PORT +#define SL_ADC_CH8_N_PORT HP #endif -#ifndef SL_ADC_CH8_N8_PIN -#define SL_ADC_CH8_N8_PIN 28 +#ifndef SL_ADC_CH8_N_PIN +#define SL_ADC_CH8_N_PIN 28 #endif -#ifndef SL_ADC_CH8_N8_LOC -#define SL_ADC_CH8_N8_LOC 413 +#ifndef SL_ADC_CH8_N_LOC +#define SL_ADC_CH8_N_LOC 413 #endif // [ADC_CH8_SL_ADC_CH8]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH8_P8_LOC -#define SL_ADC_CHANNEL_8_POS_INPUT_CHNL_SEL (SL_ADC_CH8_P8_LOC - P8_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH8_P_LOC +#define SL_ADC_CHANNEL_8_POS_INPUT_CHNL_SEL (SL_ADC_CH8_P_LOC - P8_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_8_POS_INPUT_CHNL_SEL 7 #endif -#ifdef SL_ADC_CH8_N8_LOC -#define SL_ADC_CHANNEL_8_NEG_INPUT_CHNL_SEL (SL_ADC_CH8_N8_LOC - N8_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH8_N_LOC +#define SL_ADC_CHANNEL_8_NEG_INPUT_CHNL_SEL (SL_ADC_CH8_N_LOC - N8_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_8_NEG_INPUT_CHNL_SEL 7 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_9_config.h b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_9_config.h index 3890487e5..f377e5b3f 100644 --- a/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_9_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_adc_init_channel_9_config.h @@ -60,43 +60,43 @@ extern "C" { // <<< end of configuration section >>> // <<< sl:start pin_tool >>> -// SL_ADC_CH9 +// SL_ADC_CH9 // $[ADC_CH9_SL_ADC_CH9] #ifndef SL_ADC_CH9_PERIPHERAL #define SL_ADC_CH9_PERIPHERAL ADC_CH9 #endif -// ADC_CH9 P9 on GPIO_29 -#ifndef SL_ADC_CH9_P9_PORT -#define SL_ADC_CH9_P9_PORT 0 +// ADC_CH9 P on GPIO_29 +#ifndef SL_ADC_CH9_P_PORT +#define SL_ADC_CH9_P_PORT HP #endif -#ifndef SL_ADC_CH9_P9_PIN -#define SL_ADC_CH9_P9_PIN 29 +#ifndef SL_ADC_CH9_P_PIN +#define SL_ADC_CH9_P_PIN 29 #endif -#ifndef SL_ADC_CH9_P9_LOC -#define SL_ADC_CH9_P9_LOC 160 +#ifndef SL_ADC_CH9_P_LOC +#define SL_ADC_CH9_P_LOC 160 #endif -// ADC_CH9 N9 on GPIO_30 -#ifndef SL_ADC_CH9_N9_PORT -#define SL_ADC_CH9_N9_PORT 0 +// ADC_CH9 N on GPIO_30 +#ifndef SL_ADC_CH9_N_PORT +#define SL_ADC_CH9_N_PORT HP #endif -#ifndef SL_ADC_CH9_N9_PIN -#define SL_ADC_CH9_N9_PIN 30 +#ifndef SL_ADC_CH9_N_PIN +#define SL_ADC_CH9_N_PIN 30 #endif -#ifndef SL_ADC_CH9_N9_LOC -#define SL_ADC_CH9_N9_LOC 423 +#ifndef SL_ADC_CH9_N_LOC +#define SL_ADC_CH9_N_LOC 423 #endif // [ADC_CH9_SL_ADC_CH9]$ // <<< sl:end pin_tool >>> -#ifdef SL_ADC_CH9_P9_LOC -#define SL_ADC_CHANNEL_9_POS_INPUT_CHNL_SEL (SL_ADC_CH9_P9_LOC - P9_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH9_P_LOC +#define SL_ADC_CHANNEL_9_POS_INPUT_CHNL_SEL (SL_ADC_CH9_P_LOC - P9_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_9_POS_INPUT_CHNL_SEL 8 #endif -#ifdef SL_ADC_CH9_N9_LOC -#define SL_ADC_CHANNEL_9_NEG_INPUT_CHNL_SEL (SL_ADC_CH9_N9_LOC - N9_START_LOCATION_PINTOOL) +#ifdef SL_ADC_CH9_N_LOC +#define SL_ADC_CHANNEL_9_NEG_INPUT_CHNL_SEL (SL_ADC_CH9_N_LOC - N9_START_LOCATION_PINTOOL) #else #define SL_ADC_CHANNEL_9_NEG_INPUT_CHNL_SEL 8 #endif diff --git a/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator1_config.h b/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator1_config.h index 44238dfa8..e9388b67d 100644 --- a/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator1_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator1_config.h @@ -79,7 +79,7 @@ // COMP1 P1 on GPIO_27 #ifndef SL_COMP1_COMP_P1_PORT -#define SL_COMP1_COMP_P1_PORT 0 +#define SL_COMP1_COMP_P1_PORT HP #endif #ifndef SL_COMP1_COMP_P1_PIN #define SL_COMP1_COMP_P1_PIN 5 @@ -90,7 +90,7 @@ // COMP1 N1 on GPIO_28 #ifndef SL_COMP1_COMP_N1_PORT -#define SL_COMP1_COMP_N1_PORT 0 +#define SL_COMP1_COMP_N1_PORT HP #endif #ifndef SL_COMP1_COMP_N1_PIN #define SL_COMP1_COMP_N1_PIN 4 diff --git a/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator2_config.h b/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator2_config.h index 6abff35df..081c0889a 100644 --- a/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator2_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_analog_comparator_comparator2_config.h @@ -79,7 +79,7 @@ // COMP2 P1 on GPIO_27 #ifndef SL_COMP2_COMP_P1_PORT -#define SL_COMP2_COMP_P1_PORT 0 +#define SL_COMP2_COMP_P1_PORT HP #endif #ifndef SL_COMP2_COMP_P1_PIN #define SL_COMP2_COMP_P1_PIN 27 @@ -90,7 +90,7 @@ // COMP2 N1 on GPIO_28 #ifndef SL_COMP2_COMP_N1_PORT -#define SL_COMP2_COMP_N1_PORT 0 +#define SL_COMP2_COMP_N1_PORT HP #endif #ifndef SL_COMP2_COMP_N1_PIN #define SL_COMP2_COMP_N1_PIN 28 diff --git a/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c0_config.h b/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c0_config.h index 26f69aae3..a5eb30d2f 100644 --- a/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c0_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c0_config.h @@ -74,7 +74,7 @@ extern "C" { // I2C0 SCL on GPIO_7 #ifndef SL_I2C0_SCL_PORT -#define SL_I2C0_SCL_PORT 0 +#define SL_I2C0_SCL_PORT HP #endif #ifndef SL_I2C0_SCL_PIN #define SL_I2C0_SCL_PIN 7 @@ -85,7 +85,7 @@ extern "C" { // I2C0 SDA on GPIO_6 #ifndef SL_I2C0_SDA_PORT -#define SL_I2C0_SDA_PORT 0 +#define SL_I2C0_SDA_PORT HP #endif #ifndef SL_I2C0_SDA_PIN #define SL_I2C0_SDA_PIN 6 @@ -96,13 +96,13 @@ extern "C" { // [I2C_SL_I2C0]$ // <<< sl:end pin_tool >>> -#define SL_I2C_I2C0_SCL_PORT SL_I2C0_SCL_PORT +#define SL_I2C_I2C0_SCL_PORT 0 #define SL_I2C_I2C0_SCL_PIN SL_I2C0_SCL_PIN #define SL_I2C_I2C0_SCL_MUX SL_SI91X_I2C0_SCL_MUX #define SL_I2C_I2C0_SCL_PAD SL_SI91X_I2C0_SCL_PAD #define SL_I2C_I2C0_SCL_REN SL_SI91X_I2C0_SCL_REN -#define SL_I2C_I2C0_SDA_PORT SL_I2C0_SDA_PORT +#define SL_I2C_I2C0_SDA_PORT 0 #define SL_I2C_I2C0_SDA_PIN SL_I2C0_SDA_PIN #define SL_I2C_I2C0_SDA_MUX SL_SI91X_I2C0_SDA_MUX #define SL_I2C_I2C0_SDA_PAD SL_SI91X_I2C0_SDA_PAD diff --git a/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c1_config.h b/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c1_config.h index 62b6ca860..38bbcbd3d 100644 --- a/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c1_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c1_config.h @@ -74,7 +74,7 @@ extern "C" { // I2C1 SCL on GPIO_50 #ifndef SL_I2C1_SCL_PORT -#define SL_I2C1_SCL_PORT 0 +#define SL_I2C1_SCL_PORT HP #endif #ifndef SL_I2C1_SCL_PIN #define SL_I2C1_SCL_PIN 50 @@ -85,7 +85,7 @@ extern "C" { // I2C1 SDA on GPIO_51 #ifndef SL_I2C1_SDA_PORT -#define SL_I2C1_SDA_PORT 0 +#define SL_I2C1_SDA_PORT HP #endif #ifndef SL_I2C1_SDA_PIN #define SL_I2C1_SDA_PIN 51 @@ -96,13 +96,13 @@ extern "C" { // [I2C_SL_I2C1]$ // <<< sl:end pin_tool >>> -#define SL_I2C_I2C1_SCL_PORT SL_I2C1_SCL_PORT +#define SL_I2C_I2C1_SCL_PORT 0 #define SL_I2C_I2C1_SCL_PIN SL_I2C1_SCL_PIN #define SL_I2C_I2C1_SCL_MUX SL_SI91X_I2C1_SCL_MUX #define SL_I2C_I2C1_SCL_PAD SL_SI91X_I2C1_SCL_PAD #define SL_I2C_I2C1_SCL_REN SL_SI91X_I2C1_SCL_REN -#define SL_I2C_I2C1_SDA_PORT SL_I2C1_SDA_PORT +#define SL_I2C_I2C1_SDA_PORT 0 #define SL_I2C_I2C1_SDA_PIN SL_I2C1_SDA_PIN #define SL_I2C_I2C1_SDA_MUX SL_SI91X_I2C1_SDA_MUX #define SL_I2C_I2C1_SDA_PAD SL_SI91X_I2C1_SDA_PAD diff --git a/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c2_config.h b/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c2_config.h index 5dd38d0f5..49efaf50c 100644 --- a/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c2_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_i2c_init_i2c2_config.h @@ -74,7 +74,7 @@ extern "C" { // ULP_I2C SCL on ULP_GPIO_7/GPIO_71 #ifndef SL_ULP_I2C_SCL_PORT -#define SL_ULP_I2C_SCL_PORT 0 +#define SL_ULP_I2C_SCL_PORT ULP #endif #ifndef SL_ULP_I2C_SCL_PIN #define SL_ULP_I2C_SCL_PIN 7 @@ -85,7 +85,7 @@ extern "C" { // ULP_I2C SDA on ULP_GPIO_6/GPIO_70 #ifndef SL_ULP_I2C_SDA_PORT -#define SL_ULP_I2C_SDA_PORT 0 +#define SL_ULP_I2C_SDA_PORT ULP #endif #ifndef SL_ULP_I2C_SDA_PIN #define SL_ULP_I2C_SDA_PIN 6 @@ -96,13 +96,13 @@ extern "C" { // [I2C_SL_ULP_I2C]$ // <<< sl:end pin_tool >>> -#define SL_I2C_I2C2_SCL_PORT SL_ULP_I2C_SCL_PORT +#define SL_I2C_I2C2_SCL_PORT 0 #define SL_I2C_I2C2_SCL_PIN SL_ULP_I2C_SCL_PIN #define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX #define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD #define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN -#define SL_I2C_I2C2_SDA_PORT SL_ULP_I2C_SDA_PORT +#define SL_I2C_I2C2_SDA_PORT 0 #define SL_I2C_I2C2_SDA_PIN SL_ULP_I2C_SDA_PIN #define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX #define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD diff --git a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_0_config.h b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_0_config.h index 6b731eb11..93b1c61aa 100644 --- a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_0_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_0_config.h @@ -101,7 +101,7 @@ extern "C" { // PWM_CH0 0H on GPIO_7 #ifndef SL_PWM_OUT_CHANNEL0_0H_PORT -#define SL_PWM_OUT_CHANNEL0_0H_PORT 0 +#define SL_PWM_OUT_CHANNEL0_0H_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL0_0H_PIN #define SL_PWM_OUT_CHANNEL0_0H_PIN 7 @@ -112,7 +112,7 @@ extern "C" { // PWM_CH0 0L on GPIO_6 #ifndef SL_PWM_OUT_CHANNEL0_0L_PORT -#define SL_PWM_OUT_CHANNEL0_0L_PORT 0 +#define SL_PWM_OUT_CHANNEL0_0L_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL0_0L_PIN #define SL_PWM_OUT_CHANNEL0_0L_PIN 6 @@ -132,7 +132,7 @@ extern "C" { // PWM FAULTA on GPIO_25 #ifndef SL_PWM_CHANNEL0_FAULTA_PORT -#define SL_PWM_CHANNEL0_FAULTA_PORT 0 +#define SL_PWM_CHANNEL0_FAULTA_PORT HP #endif #ifndef SL_PWM_CHANNEL0_FAULTA_PIN #define SL_PWM_CHANNEL0_FAULTA_PIN 25 @@ -143,7 +143,7 @@ extern "C" { // PWM FAULTB on GPIO_26 #ifndef SL_PWM_CHANNEL0_FAULTB_PORT -#define SL_PWM_CHANNEL0_FAULTB_PORT 0 +#define SL_PWM_CHANNEL0_FAULTB_PORT HP #endif #ifndef SL_PWM_CHANNEL0_FAULTB_PIN #define SL_PWM_CHANNEL0_FAULTB_PIN 26 @@ -154,7 +154,7 @@ extern "C" { // PWM TMR_EXT_TRIG_1 on GPIO_27 #ifndef SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PORT -#define SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PORT 0 +#define SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PORT HP #endif #ifndef SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PIN #define SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PIN 27 @@ -165,7 +165,7 @@ extern "C" { // PWM TMR_EXT_TRIG_2 on GPIO_28 #ifndef SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PORT -#define SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PORT 0 +#define SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PORT HP #endif #ifndef SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PIN #define SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PIN 28 @@ -186,10 +186,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_0_PIN_L (SL_PWM_OUT_CHANNEL0_0L_PIN + 64) #endif -#define SL_PWM_CHANNEL_0_PORT_L SL_PWM_OUT_CHANNEL0_0L_PORT +#define SL_PWM_CHANNEL_0_PORT_L 0 #else #define SL_PWM_CHANNEL_0_PIN_L SL_SI91X_PWM_0L_PIN -#define SL_PWM_CHANNEL_0_PORT_L SL_SI91X_PWM_0L_PORT +#define SL_PWM_CHANNEL_0_PORT_L 0 #endif //SL_PWM_OUT_CHANNEL0_0L_LOC #ifdef SL_PWM_OUT_CHANNEL0_0H_LOC #if (SL_PWM_OUT_CHANNEL0_0H_LOC == 0) @@ -197,10 +197,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_0_PIN_H (SL_PWM_OUT_CHANNEL0_0H_PIN + 64) #endif -#define SL_PWM_CHANNEL_0_PORT_H SL_PWM_OUT_CHANNEL0_0H_PORT +#define SL_PWM_CHANNEL_0_PORT_H 0 #else #define SL_PWM_CHANNEL_0_PIN_H SL_SI91X_PWM_0H_PIN -#define SL_PWM_CHANNEL_0_PORT_H SL_SI91X_PWM_0H_PORT +#define SL_PWM_CHANNEL_0_PORT_H 0 #endif //SL_PWM_OUT_CHANNEL0_0H_LOC #define SL_PWM_CHANNEL_0_MUX_L SL_SI91X_PWM_0L_MUX @@ -211,10 +211,10 @@ extern "C" { // PWM Fault Pin set resolution #if (SL_PWM_CHANNEL_0_EVENT == 0) #ifdef SL_PWM_CHANNEL0_FAULTA_LOC -#define SL_PWM_CHANNEL_0_PORT SL_PWM_CHANNEL0_FAULTA_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_PWM_CHANNEL0_FAULTA_PIN #else -#define SL_PWM_CHANNEL_0_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL0_FAULTA_LOC #define SL_PWM_CHANNEL_0_MUX 0 @@ -223,10 +223,10 @@ extern "C" { #if (SL_PWM_CHANNEL_0_EVENT == 1) #ifdef SL_PWM_CHANNEL0_FAULTA_LOC -#define SL_PWM_CHANNEL_0_PORT SL_PWM_CHANNEL0_FAULTA_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_PWM_CHANNEL0_FAULTA_PIN #else -#define SL_PWM_CHANNEL_0_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL0_FAULTA_LOC #define SL_PWM_CHANNEL_0_MUX SL_SI91X_PWM_FAULTA_MUX @@ -235,14 +235,14 @@ extern "C" { #if (SL_PWM_CHANNEL_0_EVENT == 2) #ifdef SL_PWM_CHANNEL0_FAULTB_LOC -#define SL_PWM_CHANNEL_0_PORT SL_PWM_CHANNEL0_FAULTB_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #if (SL_PWM_CHANNEL0_FAULTB_LOC == 19) #define SL_PWM_CHANNEL_0_PIN SL_PWM_CHANNEL0_FAULTB_PIN #else #define SL_PWM_CHANNEL_0_PIN (SL_PWM_CHANNEL0_FAULTB_PIN + 64) #endif #else -#define SL_PWM_CHANNEL_0_PORT SL_SI91X_PWM_FAULTB_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_SI91X_PWM_FAULTB_PIN #endif //SL_PWM_CHANNEL0_FAULTB_LOC #define SL_PWM_CHANNEL_0_MUX SL_SI91X_PWM_FAULTB_MUX @@ -251,14 +251,14 @@ extern "C" { #if (SL_PWM_CHANNEL_0_EVENT == 3) #ifdef SL_PWM_CHANNEL0_EXTTRIG1_LOC -#define SL_PWM_CHANNEL_0_PORT SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #if ((SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_LOC == 24) || (SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_LOC == 25)) #define SL_PWM_CHANNEL_0_PIN (SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PIN + 64) #else #define SL_PWM_CHANNEL_0_PIN SL_PWM_CHANNEL0_TMR_EXT_TRIG_1_PIN #endif #else -#define SL_PWM_CHANNEL_0_PORT SL_SI91X_PWM_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_SI91X_PWM_TMR_EXT_TRIG_1_PIN #endif //SL_PWM_CHANNEL0_EXTTRIG1_LOC #define SL_PWM_CHANNEL_0_MUX SL_SI91X_PWM_TMR_EXT_TRIG_1_MUX @@ -267,14 +267,14 @@ extern "C" { #if (SL_PWM_CHANNEL_0_EVENT == 4) #ifdef SL_PWM_CHANNEL0_EXTTRIG2_LOC -#define SL_PWM_CHANNEL_0_PORT SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #if ((SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 28) || (SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 29)) #define SL_PWM_CHANNEL_0_PIN (SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PIN + 64) #else #define SL_PWM_CHANNEL_0_PIN SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_PIN #endif #else -#define SL_PWM_CHANNEL_0_PORT SL_SI91X_PWM_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_0_PORT 0 #define SL_PWM_CHANNEL_0_PIN SL_SI91X_PWM_TMR_EXT_TRIG_2_PIN #endif //SL_PWM_CHANNEL0_EXTTRIG2_LOC #define SL_PWM_CHANNEL_0_MUX SL_SI91X_PWM_TMR_EXT_TRIG_2_MUX diff --git a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_1_config.h b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_1_config.h index ddf094130..e9ec59c0c 100644 --- a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_1_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_1_config.h @@ -101,7 +101,7 @@ extern "C" { // PWM_CH1 1H on GPIO_9 #ifndef SL_PWM_OUT_CHANNEL1_1H_PORT -#define SL_PWM_OUT_CHANNEL1_1H_PORT 0 +#define SL_PWM_OUT_CHANNEL1_1H_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL1_1H_PIN #define SL_PWM_OUT_CHANNEL1_1H_PIN 9 @@ -112,7 +112,7 @@ extern "C" { // PWM_CH1 1L on GPIO_8 #ifndef SL_PWM_OUT_CHANNEL1_1L_PORT -#define SL_PWM_OUT_CHANNEL1_1L_PORT 0 +#define SL_PWM_OUT_CHANNEL1_1L_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL1_1L_PIN #define SL_PWM_OUT_CHANNEL1_1L_PIN 8 @@ -132,7 +132,7 @@ extern "C" { // PWM FAULTA on GPIO_25 #ifndef SL_PWM_CHANNEL1_FAULTA_PORT -#define SL_PWM_CHANNEL1_FAULTA_PORT 0 +#define SL_PWM_CHANNEL1_FAULTA_PORT HP #endif #ifndef SL_PWM_CHANNEL1_FAULTA_PIN #define SL_PWM_CHANNEL1_FAULTA_PIN 25 @@ -143,7 +143,7 @@ extern "C" { // PWM FAULTB on GPIO_26 #ifndef SL_PWM_CHANNEL1_FAULTB_PORT -#define SL_PWM_CHANNEL1_FAULTB_PORT 0 +#define SL_PWM_CHANNEL1_FAULTB_PORT HP #endif #ifndef SL_PWM_CHANNEL1_FAULTB_PIN #define SL_PWM_CHANNEL1_FAULTB_PIN 26 @@ -154,7 +154,7 @@ extern "C" { // PWM TMR_EXT_TRIG_1 on GPIO_27 #ifndef SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PORT -#define SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PORT 0 +#define SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PORT HP #endif #ifndef SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PIN #define SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PIN 27 @@ -165,7 +165,7 @@ extern "C" { // PWM TMR_EXT_TRIG_2 on GPIO_28 #ifndef SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PORT -#define SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PORT 0 +#define SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PORT HP #endif #ifndef SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PIN #define SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PIN 28 @@ -186,10 +186,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_1_PIN_L (SL_PWM_OUT_CHANNEL1_1L_PIN + 64) #endif -#define SL_PWM_CHANNEL_1_PORT_L SL_PWM_OUT_CHANNEL1_1L_PORT +#define SL_PWM_CHANNEL_1_PORT_L 0 #else #define SL_PWM_CHANNEL_1_PIN_L SL_SI91X_PWM_1L_PIN -#define SL_PWM_CHANNEL_1_PORT_L SL_SI91X_PWM_1L_PORT +#define SL_PWM_CHANNEL_1_PORT_L 0 #endif //SL_PWM_OUT_CHANNEL1_1L_LOC #ifdef SL_PWM_OUT_CHANNEL1_1H_LOC #if (SL_PWM_OUT_CHANNEL1_1H_LOC == 5) @@ -197,10 +197,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_1_PIN_H SL_PWM_OUT_CHANNEL1_1H_PIN #endif -#define SL_PWM_CHANNEL_1_PORT_H SL_PWM_OUT_CHANNEL1_1H_PORT +#define SL_PWM_CHANNEL_1_PORT_H 0 #else #define SL_PWM_CHANNEL_1_PIN_H SL_SI91X_PWM_1H_PIN -#define SL_PWM_CHANNEL_1_PORT_H SL_SI91X_PWM_1H_PORT +#define SL_PWM_CHANNEL_1_PORT_H 0 #endif //SL_PWM_OUT_CHANNEL1_1H_LOC #define SL_PWM_CHANNEL_1_MUX_L SL_SI91X_PWM_1L_MUX @@ -212,10 +212,10 @@ extern "C" { // PWM Fault Pin set resolution #if (SL_PWM_CHANNEL_1_EVENT == 0) #ifdef SL_PWM_CHANNEL1_FAULTA_LOC -#define SL_PWM_CHANNEL_1_PORT SL_PWM_CHANNEL1_FAULTA_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_PWM_CHANNEL1_FAULTA_PIN #else -#define SL_PWM_CHANNEL_1_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL1_FAULTA_LOC #define SL_PWM_CHANNEL_1_MUX 0 @@ -224,10 +224,10 @@ extern "C" { #if (SL_PWM_CHANNEL_1_EVENT == 1) #ifdef SL_PWM_CHANNEL1_FAULTA_LOC -#define SL_PWM_CHANNEL_1_PORT SL_PWM_CHANNEL1_FAULTA_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_PWM_CHANNEL1_FAULTA_PIN #else -#define SL_PWM_CHANNEL_1_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL1_FAULTA_LOC #define SL_PWM_CHANNEL_1_MUX SL_SI91X_PWM_FAULTA_MUX @@ -236,14 +236,14 @@ extern "C" { #if (SL_PWM_CHANNEL_1_EVENT == 2) #ifdef SL_PWM_CHANNEL1_FAULTB_LOC -#define SL_PWM_CHANNEL_1_PORT SL_PWM_CHANNEL1_FAULTB_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #if (SL_PWM_CHANNEL1_FAULTB_LOC == 19) #define SL_PWM_CHANNEL_1_PIN SL_PWM_CHANNEL1_FAULTB_PIN #else #define SL_PWM_CHANNEL_1_PIN (SL_PWM_CHANNEL1_FAULTB_PIN + 64) #endif #else -#define SL_PWM_CHANNEL_1_PORT SL_SI91X_PWM_FAULTB_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_SI91X_PWM_FAULTB_PIN #endif //SL_PWM_CHANNEL1_FAULTB_LOC #define SL_PWM_CHANNEL_1_MUX SL_SI91X_PWM_FAULTB_MUX @@ -252,14 +252,14 @@ extern "C" { #if (SL_PWM_CHANNEL_1_EVENT == 3) #ifdef SL_PWM_CHANNEL1_EXTTRIG1_LOC -#define SL_PWM_CHANNEL_1_PORT SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #if ((SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_LOC == 24) || (SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_LOC == 25)) #define SL_PWM_CHANNEL_1_PIN (SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PIN + 64) #else #define SL_PWM_CHANNEL_1_PIN SL_PWM_CHANNEL1_TMR_EXT_TRIG_1_PIN #endif #else -#define SL_PWM_CHANNEL_1_PORT SL_SI91X_PWM_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_SI91X_PWM_TMR_EXT_TRIG_1_PIN #endif //SL_PWM_CHANNEL1_EXTTRIG1_LOC #define SL_PWM_CHANNEL_1_MUX SL_SI91X_PWM_TMR_EXT_TRIG_1_MUX @@ -268,14 +268,14 @@ extern "C" { #if (SL_PWM_CHANNEL_1_EVENT == 4) #ifdef SL_PWM_CHANNEL1_EXTTRIG2_LOC -#define SL_PWM_CHANNEL_1_PORT SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #if ((SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 28) || (SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 29)) #define SL_PWM_CHANNEL_1_PIN (SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PIN + 64) #else #define SL_PWM_CHANNEL_1_PIN SL_PWM_CHANNEL1_TMR_EXT_TRIG_2_PIN #endif #else -#define SL_PWM_CHANNEL_1_PORT SL_SI91X_PWM_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_1_PORT 0 #define SL_PWM_CHANNEL_1_PIN SL_SI91X_PWM_TMR_EXT_TRIG_2_PIN #endif //SL_PWM_CHANNEL1_EXTTRIG2_LOC #define SL_PWM_CHANNEL_1_MUX SL_SI91X_PWM_TMR_EXT_TRIG_2_MUX diff --git a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_2_config.h b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_2_config.h index d57832f0b..9fbef7e17 100644 --- a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_2_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_2_config.h @@ -101,7 +101,7 @@ extern "C" { // PWM_CH2 2H on GPIO_11 #ifndef SL_PWM_OUT_CHANNEL2_2H_PORT -#define SL_PWM_OUT_CHANNEL2_2H_PORT 0 +#define SL_PWM_OUT_CHANNEL2_2H_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL2_2H_PIN #define SL_PWM_OUT_CHANNEL2_2H_PIN 11 @@ -112,7 +112,7 @@ extern "C" { // PWM_CH2 2L on GPIO_10 #ifndef SL_PWM_OUT_CHANNEL2_2L_PORT -#define SL_PWM_OUT_CHANNEL2_2L_PORT 0 +#define SL_PWM_OUT_CHANNEL2_2L_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL2_2L_PIN #define SL_PWM_OUT_CHANNEL2_2L_PIN 10 @@ -132,7 +132,7 @@ extern "C" { // PWM FAULTA on GPIO_25 #ifndef SL_PWM_CHANNEL2_FAULTA_PORT -#define SL_PWM_CHANNEL2_FAULTA_PORT 0 +#define SL_PWM_CHANNEL2_FAULTA_PORT HP #endif #ifndef SL_PWM_CHANNEL2_FAULTA_PIN #define SL_PWM_CHANNEL2_FAULTA_PIN 25 @@ -143,7 +143,7 @@ extern "C" { // PWM FAULTB on GPIO_26 #ifndef SL_PWM_CHANNEL2_FAULTB_PORT -#define SL_PWM_CHANNEL2_FAULTB_PORT 0 +#define SL_PWM_CHANNEL2_FAULTB_PORT HP #endif #ifndef SL_PWM_CHANNEL2_FAULTB_PIN #define SL_PWM_CHANNEL2_FAULTB_PIN 26 @@ -154,7 +154,7 @@ extern "C" { // PWM TMR_EXT_TRIG_1 on GPIO_27 #ifndef SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PORT -#define SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PORT 0 +#define SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PORT HP #endif #ifndef SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PIN #define SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PIN 27 @@ -165,7 +165,7 @@ extern "C" { // PWM TMR_EXT_TRIG_2 on GPIO_28 #ifndef SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PORT -#define SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PORT 0 +#define SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PORT HP #endif #ifndef SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PIN #define SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PIN 28 @@ -186,10 +186,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_2_PIN_L (SL_PWM_OUT_CHANNEL2_2L_PIN + 64) #endif -#define SL_PWM_CHANNEL_2_PORT_L SL_PWM_OUT_CHANNEL2_2L_PORT +#define SL_PWM_CHANNEL_2_PORT_L 0 #else #define SL_PWM_CHANNEL_2_PIN_L SL_SI91X_PWM_2L_PIN -#define SL_PWM_CHANNEL_2_PORT_L SL_SI91X_PWM_2L_PORT +#define SL_PWM_CHANNEL_2_PORT_L 0 #endif //SL_PWM_OUT_CHANNEL2_2L_LOC #ifdef SL_PWM_OUT_CHANNEL2_2H_LOC #if (SL_PWM_OUT_CHANNEL2_2H_LOC == 9) @@ -197,10 +197,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_2_PIN_H (SL_PWM_OUT_CHANNEL2_2H_PIN + 64) #endif -#define SL_PWM_CHANNEL_2_PORT_H SL_PWM_OUT_CHANNEL2_2H_PORT +#define SL_PWM_CHANNEL_2_PORT_H 0 #else #define SL_PWM_CHANNEL_2_PIN_H SL_SI91X_PWM_2H_PIN -#define SL_PWM_CHANNEL_2_PORT_H SL_SI91X_PWM_2H_PORT +#define SL_PWM_CHANNEL_2_PORT_H 0 #endif //SL_PWM_OUT_CHANNEL2_2H_LOC #define SL_PWM_CHANNEL_2_MUX_L SL_SI91X_PWM_2L_MUX @@ -212,10 +212,10 @@ extern "C" { // PWM Fault Pin set resolution #if (SL_PWM_CHANNEL_2_EVENT == 0) #ifdef SL_PWM_CHANNEL2_FAULTA_LOC -#define SL_PWM_CHANNEL_2_PORT SL_PWM_CHANNEL2_FAULTA_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_PWM_CHANNEL2_FAULTA_PIN #else -#define SL_PWM_CHANNEL_2_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL2_FAULTA_LOC #define SL_PWM_CHANNEL_2_MUX 0 @@ -224,10 +224,10 @@ extern "C" { #if (SL_PWM_CHANNEL_2_EVENT == 1) #ifdef SL_PWM_CHANNEL2_FAULTA_LOC -#define SL_PWM_CHANNEL_2_PORT SL_PWM_CHANNEL2_FAULTA_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_PWM_CHANNEL2_FAULTA_PIN #else -#define SL_PWM_CHANNEL_2_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL2_FAULTA_LOC #define SL_PWM_CHANNEL_2_MUX SL_SI91X_PWM_FAULTA_MUX @@ -236,14 +236,14 @@ extern "C" { #if (SL_PWM_CHANNEL_2_EVENT == 2) #ifdef SL_PWM_CHANNEL2_FAULTB_LOC -#define SL_PWM_CHANNEL_2_PORT SL_PWM_CHANNEL2_FAULTB_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #if (SL_PWM_CHANNEL2_FAULTB_LOC == 19) #define SL_PWM_CHANNEL_2_PIN SL_PWM_CHANNEL2_FAULTB_PIN #else #define SL_PWM_CHANNEL_2_PIN (SL_PWM_CHANNEL2_FAULTB_PIN + 64) #endif #else -#define SL_PWM_CHANNEL_2_PORT SL_SI91X_PWM_FAULTB_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_SI91X_PWM_FAULTB_PIN #endif //SL_PWM_CHANNEL2_FAULTB_LOC #define SL_PWM_CHANNEL_2_MUX SL_SI91X_PWM_FAULTB_MUX @@ -252,14 +252,14 @@ extern "C" { #if (SL_PWM_CHANNEL_2_EVENT == 3) #ifdef SL_PWM_CHANNEL2_EXTTRIG1_LOC -#define SL_PWM_CHANNEL_2_PORT SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #if ((SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_LOC == 24) || (SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_LOC == 25)) #define SL_PWM_CHANNEL_2_PIN (SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PIN + 64) #else #define SL_PWM_CHANNEL_2_PIN SL_PWM_CHANNEL2_TMR_EXT_TRIG_1_PIN #endif #else -#define SL_PWM_CHANNEL_2_PORT SL_SI91X_PWM_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_SI91X_PWM_TMR_EXT_TRIG_1_PIN #endif //SL_PWM_CHANNEL2_EXTTRIG1_LOC #define SL_PWM_CHANNEL_2_MUX SL_SI91X_PWM_TMR_EXT_TRIG_1_MUX @@ -268,14 +268,14 @@ extern "C" { #if (SL_PWM_CHANNEL_2_EVENT == 4) #ifdef SL_PWM_CHANNEL2_EXTTRIG2_LOC -#define SL_PWM_CHANNEL_2_PORT SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #if ((SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 28) || (SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 29)) #define SL_PWM_CHANNEL_2_PIN (SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PIN + 64) #else #define SL_PWM_CHANNEL_2_PIN SL_PWM_CHANNEL2_TMR_EXT_TRIG_2_PIN #endif #else -#define SL_PWM_CHANNEL_2_PORT SL_SI91X_PWM_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_2_PORT 0 #define SL_PWM_CHANNEL_2_PIN SL_SI91X_PWM_TMR_EXT_TRIG_2_PIN #endif //SL_PWM_CHANNEL2_EXTTRIG2_LOC #define SL_PWM_CHANNEL_2_MUX SL_SI91X_PWM_TMR_EXT_TRIG_2_MUX diff --git a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_3_config.h b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_3_config.h index 98ca6c820..70c7300c6 100644 --- a/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_3_config.h +++ b/components/board/silabs/config/common_config/sl_si91x_pwm_init_channel_3_config.h @@ -101,7 +101,7 @@ extern "C" { // PWM_CH3 3H on GPIO_15 #ifndef SL_PWM_OUT_CHANNEL3_3H_PORT -#define SL_PWM_OUT_CHANNEL3_3H_PORT 0 +#define SL_PWM_OUT_CHANNEL3_3H_PORT HP #endif #ifndef SL_PWM_OUT_CHANNEL3_3H_PIN #define SL_PWM_OUT_CHANNEL3_3H_PIN 7 @@ -112,7 +112,7 @@ extern "C" { // PWM_CH3 3L on ULP_GPIO_6/GPIO_70 #ifndef SL_PWM_OUT_CHANNEL3_3L_PORT -#define SL_PWM_OUT_CHANNEL3_3L_PORT 0 +#define SL_PWM_OUT_CHANNEL3_3L_PORT ULP #endif #ifndef SL_PWM_OUT_CHANNEL3_3L_PIN #define SL_PWM_OUT_CHANNEL3_3L_PIN 6 @@ -132,7 +132,7 @@ extern "C" { // PWM FAULTA on GPIO_25 #ifndef SL_PWM_CHANNEL3_FAULTA_PORT -#define SL_PWM_CHANNEL3_FAULTA_PORT 0 +#define SL_PWM_CHANNEL3_FAULTA_PORT HP #endif #ifndef SL_PWM_CHANNEL3_FAULTA_PIN #define SL_PWM_CHANNEL3_FAULTA_PIN 25 @@ -143,7 +143,7 @@ extern "C" { // PWM FAULTB on GPIO_26 #ifndef SL_PWM_CHANNEL3_FAULTB_PORT -#define SL_PWM_CHANNEL3_FAULTB_PORT 0 +#define SL_PWM_CHANNEL3_FAULTB_PORT HP #endif #ifndef SL_PWM_CHANNEL3_FAULTB_PIN #define SL_PWM_CHANNEL3_FAULTB_PIN 26 @@ -154,7 +154,7 @@ extern "C" { // PWM TMR_EXT_TRIG_1 on GPIO_27 #ifndef SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PORT -#define SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PORT 0 +#define SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PORT HP #endif #ifndef SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PIN #define SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PIN 27 @@ -165,7 +165,7 @@ extern "C" { // PWM TMR_EXT_TRIG_2 on GPIO_28 #ifndef SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PORT -#define SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PORT 0 +#define SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PORT HP #endif #ifndef SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PIN #define SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PIN 28 @@ -186,10 +186,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_3_PIN_L SL_PWM_OUT_CHANNEL3_3L_PIN #endif -#define SL_PWM_CHANNEL_3_PORT_L SL_PWM_OUT_CHANNEL3_3L_PORT +#define SL_PWM_CHANNEL_3_PORT_L 0 #else #define SL_PWM_CHANNEL_3_PIN_L SL_SI91X_PWM_3L_PIN -#define SL_PWM_CHANNEL_3_PORT_L SL_SI91X_PWM_3L_PORT +#define SL_PWM_CHANNEL_3_PORT_L 0 #endif //SL_PWM_OUT_CHANNEL3_3L_LOC #ifdef SL_PWM_OUT_CHANNEL3_3L_LOC @@ -198,10 +198,10 @@ extern "C" { #else #define SL_PWM_CHANNEL_3_PIN_H SL_PWM_OUT_CHANNEL3_3H_PIN #endif -#define SL_PWM_CHANNEL_3_PORT_H SL_PWM_OUT_CHANNEL3_3H_PORT +#define SL_PWM_CHANNEL_3_PORT_H 0 #else #define SL_PWM_CHANNEL_3_PIN_H SL_SI91X_PWM_3H_PIN -#define SL_PWM_CHANNEL_3_PORT_H SL_SI91X_PWM_3H_PORT +#define SL_PWM_CHANNEL_3_PORT_H 0 #endif //SL_PWM_OUT_CHANNEL3_3L_LOC #define SL_PWM_CHANNEL_3_MUX_L SL_SI91X_PWM_3L_MUX @@ -213,10 +213,10 @@ extern "C" { // PWM Fault Pin set resolution #if (SL_PWM_CHANNEL_3_EVENT == 0) #ifdef SL_PWM_CHANNEL3_FAULTA_LOC -#define SL_PWM_CHANNEL_3_PORT SL_PWM_CHANNEL3_FAULTA_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_PWM_CHANNEL3_FAULTA_PIN #else -#define SL_PWM_CHANNEL_3_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL3_FAULTA_LOC #define SL_PWM_CHANNEL_3_MUX 0 @@ -225,10 +225,10 @@ extern "C" { #if (SL_PWM_CHANNEL_3_EVENT == 1) #ifdef SL_PWM_CHANNEL3_FAULTA_LOC -#define SL_PWM_CHANNEL_3_PORT SL_PWM_CHANNEL3_FAULTA_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_PWM_CHANNEL3_FAULTA_PIN #else -#define SL_PWM_CHANNEL_3_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_SI91X_PWM_FAULTA_PIN #endif //SL_PWM_CHANNEL3_FAULTA_LOC #define SL_PWM_CHANNEL_3_MUX SL_SI91X_PWM_FAULTA_MUX @@ -237,14 +237,14 @@ extern "C" { #if (SL_PWM_CHANNEL_3_EVENT == 2) #ifdef SL_PWM_CHANNEL3_FAULTB_LOC -#define SL_PWM_CHANNEL_3_PORT SL_PWM_CHANNEL3_FAULTB_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #if (SL_PWM_CHANNEL3_FAULTB_LOC == 19) #define SL_PWM_CHANNEL_3_PIN SL_PWM_CHANNEL3_FAULTB_PIN #else #define SL_PWM_CHANNEL_3_PIN (SL_PWM_CHANNEL3_FAULTB_PIN + 64) #endif #else -#define SL_PWM_CHANNEL_3_PORT SL_SI91X_PWM_FAULTB_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_SI91X_PWM_FAULTB_PIN #endif //SL_PWM_CHANNEL3_FAULTB_LOC #define SL_PWM_CHANNEL_3_MUX SL_SI91X_PWM_FAULTB_MUX @@ -253,14 +253,14 @@ extern "C" { #if (SL_PWM_CHANNEL_3_EVENT == 3) #ifdef SL_PWM_CHANNEL3_EXTTRIG1_LOC -#define SL_PWM_CHANNEL_3_PORT SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #if ((SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_LOC == 24) || (SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_LOC == 25)) #define SL_PWM_CHANNEL_3_PIN (SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PIN + 64) #else #define SL_PWM_CHANNEL_3_PIN SL_PWM_CHANNEL3_TMR_EXT_TRIG_1_PIN #endif #else -#define SL_PWM_CHANNEL_3_PORT SL_SI91X_PWM_TMR_EXT_TRIG_1_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_SI91X_PWM_TMR_EXT_TRIG_1_PIN #endif //SL_PWM_CHANNEL3_EXTTRIG1_LOC #define SL_PWM_CHANNEL_3_MUX SL_SI91X_PWM_TMR_EXT_TRIG_1_MUX @@ -269,14 +269,14 @@ extern "C" { #if (SL_PWM_CHANNEL_3_EVENT == 4) #ifdef SL_PWM_CHANNEL3_EXTTRIG2_LOC -#define SL_PWM_CHANNEL_3_PORT SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #if ((SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 28) || (SL_PWM_CHANNEL0_TMR_EXT_TRIG_2_LOC == 29)) #define SL_PWM_CHANNEL_3_PIN (SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PIN + 64) #else #define SL_PWM_CHANNEL_3_PIN SL_PWM_CHANNEL3_TMR_EXT_TRIG_2_PIN #endif #else -#define SL_PWM_CHANNEL_3_PORT SL_SI91X_PWM_TMR_EXT_TRIG_2_PORT +#define SL_PWM_CHANNEL_3_PORT 0 #define SL_PWM_CHANNEL_3_PIN SL_SI91X_PWM_TMR_EXT_TRIG_2_PIN #endif //SL_PWM_CHANNEL3_EXTTRIG2_LOC #define SL_PWM_CHANNEL_3_MUX SL_SI91X_PWM_TMR_EXT_TRIG_2_MUX diff --git a/components/board/silabs/config/common_config/sl_si91x_pwm_init_led1_config.h b/components/board/silabs/config/common_config/sl_si91x_pwm_init_led1_config.h new file mode 100644 index 000000000..d9356a95f --- /dev/null +++ b/components/board/silabs/config/common_config/sl_si91x_pwm_init_led1_config.h @@ -0,0 +1,156 @@ +/***************************************************************************/ /** +* @file sl_si91x_pwm_init_led1_config.h +* @brief PWM configuration file. +******************************************************************************* +* # License +* Copyright 2024 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_PWM_LED1_CONFIG_H +#define SL_SI91X_PWM_LED1_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif +/******************************************************************************/ +/******************************* PWM Configuration **************************/ +// PWM LED1 Configuration + +// Frequency <500-200000> +// Default: 25000 +#define SL_PWM_LED1_FREQUENCY 25000 + +// Output Polarity Low +// POLARITY_LOW +// POLARITY_HIGH +// Default: SL_POLARITYL_HIGH +#define SL_PWM_LED1_POLARITY_LOW SL_POLARITYL_HIGH + +// Output Polarity High +// POLARITY_LOW +// POLARITY_HIGH +// Default: SL_POLARITYH_HIGH +#define SL_PWM_LED1_POLARITY_HIGH SL_POLARITYH_HIGH + +// PWM Mode +// Independent +// Complementary +// Default: SL_INDEPENDENT +#define SL_PWM_LED1_MODE SL_MODE_INDEPENDENT + +// Timer Counter <0-655365> +// Default: 0 +#define SL_PWM_LED1_TIMER_COUNTER 0 + +// Duty Cycle <0-100> +// Default: 50 +#define SL_PWM_LED1_DUTY_CYCLE 50 + +// Base Timer Mode +// Free Run +// Single Event +// Down Count +// Up_Down +// Up_Down Double +// Default: SL_FREE_RUN_MODE +#define SL_PWM_LED1_TIMER_MODE SL_FREE_RUN_MODE + +// Base Timer Selection +// Timer(Each Channel) +// Timer(All Channels) +// Default: SL_BASE_TIMER_EACH_CHANNEL +#define SL_PWM_LED1_TIMER_SELECTION SL_BASE_TIMER_EACH_CHANNEL + +// Ext Trigger +// <0=> None +// <1=> Fault A +// <2=> Fault B +// <3=> Ext Trigger1 +// <4=> Ext Trigger2 +// Default: 0 +#define SL_PWM_LED1_EVENT 0 + +// +/******************************************************************************/ +// <<< end of configuration section >>> + +// PWM channel number for LED1 instance +#define SL_PWM_LED1_OUTPUT_CHANNEL 2 + +// Pin set for LED1 PWM channel +#define SL_PWM_LED1_PIN_L 10 +#define SL_PWM_LED1_PIN_H 11 + +#define SL_PWM_LED1_PORT_L 0 +#define SL_PWM_LED1_PORT_H 0 + +#define SL_PWM_LED1_MUX_L 10 +#define SL_PWM_LED1_MUX_H 10 + +#define SL_PWM_LED1_PAD_L 5 +#define SL_PWM_LED1_PAD_H 6 + +// PWM Fault Pin set resolution +#if (SL_PWM_LED1_EVENT == 0) +#define SL_PWM_LED1_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_LED1_PIN SL_SI91X_PWM_FAULTA_PIN +#define SL_PWM_LED1_MUX 0 +#define SL_PWM_LED1_PAD SL_SI91X_PWM_FAULTA_PAD +#endif + +#if (SL_PWM_LED1_EVENT == 1) +#define SL_PWM_LED1_PORT SL_SI91X_PWM_FAULTA_PORT +#define SL_PWM_LED1_PIN SL_SI91X_PWM_FAULTA_PIN +#define SL_PWM_LED1_MUX SL_SI91X_PWM_FAULTA_MUX +#define SL_PWM_LED1_PAD SL_SI91X_PWM_FAULTA_PAD +#endif + +#if (SL_PWM_LED1_EVENT == 2) +#define SL_PWM_LED1_PORT SL_SI91X_PWM_FAULTB_PORT +#define SL_PWM_LED1_PIN SL_SI91X_PWM_FAULTB_PIN +#define SL_PWM_LED1_MUX SL_SI91X_PWM_FAULTB_MUX +#define SL_PWM_LED1_PAD SL_SI91X_PWM_FAULTB_PAD +#endif + +#if (SL_PWM_LED1_EVENT == 3) +#define SL_PWM_LED1_PORT SL_SI91X_PWM_TMR_EXT_TRIG_1_PORT +#define SL_PWM_LED1_PIN SL_SI91X_PWM_TMR_EXT_TRIG_1_PIN +#define SL_PWM_LED1_MUX SL_SI91X_PWM_TMR_EXT_TRIG_1_MUX +#define SL_PWM_LED1_PAD SL_SI91X_PWM_TMR_EXT_TRIG_1_PAD +#endif + +#if (SL_PWM_LED1_EVENT == 4) +#define SL_PWM_LED1_PORT SL_SI91X_PWM_TMR_EXT_TRIG_2_PORT +#define SL_PWM_LED1_PIN SL_SI91X_PWM_TMR_EXT_TRIG_2_PIN +#define SL_PWM_LED1_MUX SL_SI91X_PWM_TMR_EXT_TRIG_2_MUX +#define SL_PWM_LED1_PAD SL_SI91X_PWM_TMR_EXT_TRIG_2_PAD +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SL_SI91X_PWM_LED1_CONFIG_H */ \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/core/chip/component/device_needs_ram_execution.slcc b/components/device/silabs/si91x/mcu/core/chip/component/device_needs_ram_execution.slcc index f2586ad14..78c7f559a 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/device_needs_ram_execution.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/device_needs_ram_execution.slcc @@ -10,9 +10,7 @@ quality: production provides: - name: device_needs_ram_execution define: - - name: SLI_SI91X_MCU_ENABLE_RAM_BASED_EXECUTION - - name: SLI_SI91X_MCU_ENABLE_PSRAM_SECTION_FEATURE - condition: [wiseconnect_toolchain_psram_linker] + - name: SLI_SI91X_MCU_ENABLE_RAM_BASED_EXECUTION template_contribution: - name: ram_execution value: true diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100mgtba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100mgtba.slcc index 67512558a..e6127e34a 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100mgtba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100mgtba.slcc @@ -48,6 +48,7 @@ - name: device_has_mvp - name: device_compute_mvp - name: device_has_mpu + - name: device_has_chip - requires: - name: rsilib_chip - name: romdriver_clks @@ -137,7 +138,7 @@ - name: Main Flash page_size: 256 size: 8388608 - start: 136060928 + start: 136323072 # 0x0820 2000 type: non-volatile # TODO: Check these Values - name: RAM diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100xntba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100xntba.slcc index 7b6597fef..b3aa65882 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100xntba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m100xntba.slcc @@ -47,6 +47,8 @@ - name: device_compute_mvp - name: armv7em - name: device_has_mpu + - name: device_has_chip + - name: device_supports_external_flash - requires: - name: rsilib_chip - name: romdriver_clks diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m110lgtba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m110lgtba.slcc index 7baca8a3a..ba10450a6 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m110lgtba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m110lgtba.slcc @@ -46,6 +46,7 @@ - name: device_supports_psram - name: device_has_stacked_flash - name: device_has_mpu + - name: device_has_chip - requires: - name: rsilib_chip - name: romdriver_clks @@ -82,34 +83,34 @@ # Default Memory configuration - name: device_flash_addr - value: 136323072 # 0x0820 2000 + value: 135733248 # 0x0817 2000 priority: 1000 condition: - si917_mem_config_1 - name: device_flash_size - value: 2088960 # 0x001F E000 + value: 1232896 # 0x0012 D000 priority: 1000 condition: - si917_mem_config_1 # Medium Memory configuration - name: device_flash_addr - value: 136323072 # 0x0820 2000 + value: 135733248 # 0x0817 2000 priority: 1000 condition: - si917_mem_config_2 - name: device_flash_size - value: 2088960 # 0x001F E000 + value: 1232896 # 0x0012 D000 priority: 1000 condition: - si917_mem_config_2 # Advanced Memory configuration - name: device_flash_addr - value: 136323072 # 0x0820 2000 + value: 135733248 # 0x0817 2000 priority: 1000 condition: - si917_mem_config_3 - name: device_flash_size - value: 2088960 # 0x001F E000 + value: 1232896 # 0x0012 D000 priority: 1000 condition: - si917_mem_config_3 @@ -135,7 +136,7 @@ - name: Main Flash page_size: 256 size: 4194304 - start: 136060928 + start: 135733248 # 0x0817 2000 type: non-volatile # TODO: Check these Values - name: RAM diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111mgtba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111mgtba.slcc index e9dddce62..5f40f47bc 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111mgtba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111mgtba.slcc @@ -45,6 +45,7 @@ - name: device_supports_psram - name: device_has_stacked_flash - name: device_has_mpu + - name: device_has_chip - requires: - name: rsilib_chip - name: romdriver_clks @@ -75,7 +76,6 @@ value: 7168 - name: nvm3_size value: 65536 - - name: flash_present value: 1 @@ -134,7 +134,7 @@ - name: Main Flash page_size: 256 size: 8388608 - start: 136060928 + start: 136323072 # 0x0820 2000 type: non-volatile # TODO: Check these Values - name: RAM diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111xgtba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111xgtba.slcc index 00d298602..187ab9ea7 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111xgtba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m111xgtba.slcc @@ -50,6 +50,8 @@ - name: device_compute_mvp - name: device_supports_psram - name: device_has_mpu + - name: device_has_chip + - name: device_supports_external_flash - requires: - name: rsilib_chip - name: romdriver_clks diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m121xgtba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m121xgtba.slcc index a35c87c8f..69a0a729f 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m121xgtba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m121xgtba.slcc @@ -52,6 +52,8 @@ - name: device_has_stacked_psram - name: device_supports_psram - name: device_has_mpu + - name: device_has_chip + - name: device_supports_external_flash - requires: - name: rsilib_chip - name: romdriver_clks diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m141xgtba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m141xgtba.slcc index 0a6e7dd8d..94cc9a0ef 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917m141xgtba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917m141xgtba.slcc @@ -52,6 +52,8 @@ - name: device_has_stacked_psram - name: device_supports_psram - name: device_has_mpu + - name: device_has_chip + - name: device_supports_external_flash - requires: - name: rsilib_chip - name: romdriver_clks diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgaba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgaba.slcc new file mode 100644 index 000000000..a50ba9cb2 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgaba.slcc @@ -0,0 +1,149 @@ +!!omap +- id: SIWG917Y110LGABA +- package: platform-internal-cmsis-headers +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y110LGABA. +- category: Device|Si91x|MCU|Device Part|SIWG917 +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y110LGABA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- include: + - file_list: + - path: system_si91x.h + - path: si91x_device.h + path: components/device/silabs/si91x/mcu/core/chip/inc/ +- provides: + - name: siwg917y110lgaba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_supports_psram + - name: device_has_stacked_flash + - name: device_has_mpu + - name: device_is_module +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: lite_image_for_4mb + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- recommends: + - name: si917_mem_config_1 +- template_contribution: + - name: device_opn + value: SIWG917Y110LGABA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917 + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + - name: flash_present + value: 1 + + # Default Memory configuration + - name: device_flash_addr + value: 135733248 # 0x0817 2000 + priority: 1000 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 1232896 # 0x0012 D000 + priority: 1000 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 135733248 # 0x0817 2000 + priority: 1000 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 1232896 # 0x0012 D000 + priority: 1000 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 135733248 # 0x0817 2000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 1232896 # 0x0012 D000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_page_size + value: 256 + - name: device_ram_addr + value: 12 +- tag: + - device:opn:siwg917y110lgaba +- toolchain_settings: + - option: device_opn + value: siwg917y110lgaba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: +# External flash and psram details will be provided by the External Flash and psram components + - name: Main Flash + page_size: 256 + size: 4194304 + start: 135733248 # 0x0817 2000 + type: non-volatile +# TODO: Check these Values + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y110lgaba diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgnba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgnba.slcc new file mode 100644 index 000000000..067aed265 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y110lgnba.slcc @@ -0,0 +1,149 @@ +!!omap +- id: SIWG917Y110LGNBA +- package: platform-internal-cmsis-headers +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y110LGNBA. +- category: Device|Si91x|MCU|Device Part|SIWG917 +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y110LGNBA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- include: + - file_list: + - path: system_si91x.h + - path: si91x_device.h + path: components/device/silabs/si91x/mcu/core/chip/inc/ +- provides: + - name: siwg917y110lgnba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_supports_psram + - name: device_has_stacked_flash + - name: device_has_mpu + - name: device_is_module +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: lite_image_for_4mb + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- recommends: + - name: si917_mem_config_1 +- template_contribution: + - name: device_opn + value: SIWG917Y110LGNBA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917 + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + - name: flash_present + value: 1 + + # Default Memory configuration + - name: device_flash_addr + value: 135733248 # 0x0817 2000 + priority: 1000 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 1232896 # 0x0012 D000 + priority: 1000 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 135733248 # 0x0817 2000 + priority: 1000 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 1232896 # 0x0012 D000 + priority: 1000 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 135733248 # 0x0817 2000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 1232896 # 0x0012 D000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_page_size + value: 256 + - name: device_ram_addr + value: 12 +- tag: + - device:opn:siwg917y110lgnba +- toolchain_settings: + - option: device_opn + value: siwg917y110lgnba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: +# External flash and psram details will be provided by the External Flash and psram components + - name: Main Flash + page_size: 256 + size: 4194304 + start: 135733248 # 0x0817 2000 + type: non-volatile +# TODO: Check these Values + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y110lgnba diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgab.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgab.slcc index 102307aac..c3adfd026 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgab.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgab.slcc @@ -16,7 +16,7 @@ value: '1' - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION value: '1' - - name: SL_SI91X_MODULE_BOARD + - name: SL_SI91X_ACX_MODULE value: '1' - name: SRAM_BASE value: "0x0cUL" @@ -47,6 +47,7 @@ - name: device_has_mpu - name: device_is_module - name: device_has_antenna + - name: device_is_module - requires: - name: rsilib_chip - name: romdriver_clks @@ -56,6 +57,7 @@ - name: wiseconnect_toolchain_plugin - name: freertos_config condition: [freertos] + - name: si91x_32kHz_external_oscillator - template_contribution: - name: device_opn value: SIWG917Y111MGAB @@ -137,7 +139,7 @@ - name: Main Flash page_size: 256 size: 8388608 - start: 136060928 + start: 136323072 # 0x0820 2000 type: non-volatile # TODO: Check these Values - name: RAM diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgaba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgaba.slcc new file mode 100644 index 000000000..4ab185ec3 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgaba.slcc @@ -0,0 +1,145 @@ +!!omap +- id: SIWG917Y111MGABA +- package: platform-si91x +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y111MGABA. +- category: Platform|Device|Si91x|MCU|Family|SIWG917Y +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y111MGABA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- provides: + - name: siwg917y111mgaba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_has_mvp + - name: device_compute_mvp + - name: device_supports_psram + - name: device_has_stacked_flash + - name: device_has_mpu + - name: device_is_module + - name: device_no_antenna + - name: device_is_module +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- template_contribution: + - name: device_opn + value: SIWG917Y111MGABA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917y + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + - name: flash_present + value: 1 + + # Default Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: -1 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: -1 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: -1 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: -1 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: -1 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: -1 + condition: + - si917_mem_config_3 + - name: device_flash_page_size + value: 256 + - name: device_ram_addr + value: 12 +- tag: + - device:opn:siwg917y111mgaba +- toolchain_settings: + - option: device_opn + value: siwg917y111mgaba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: + # External flash details will be provided by the External Flash component + - name: Main Flash + page_size: 256 + size: 8388608 + start: 136323072 # 0x0820 2000 + type: non-volatile + # TODO: Check these Values + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y111mgaba \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgnba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgnba.slcc index 5d7269c9f..105707e72 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgnba.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111mgnba.slcc @@ -16,7 +16,7 @@ value: '1' - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION value: '1' - - name: SL_SI91X_MODULE_BOARD + - name: SL_SI91X_ACX_MODULE value: '1' - name: SRAM_BASE value: "0x0cUL" @@ -47,6 +47,7 @@ - name: device_has_mpu - name: device_is_module - name: device_no_antenna + - name: device_is_module - requires: - name: rsilib_chip - name: romdriver_clks @@ -56,6 +57,7 @@ - name: wiseconnect_toolchain_plugin - name: freertos_config condition: [freertos] + - name: si91x_32kHz_external_oscillator - template_contribution: - name: device_opn value: SIWG917Y111MGNBA @@ -137,7 +139,7 @@ - name: Main Flash page_size: 256 size: 8388608 - start: 136060928 + start: 136323072 # 0x0820 2000 type: non-volatile # TODO: Check these Values - name: RAM diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgaba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgaba.slcc new file mode 100644 index 000000000..766c53eef --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgaba.slcc @@ -0,0 +1,153 @@ +!!omap +- id: SIWG917Y111XGABA +- package: platform-internal-cmsis-headers +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y111XGABA. +- category: Device|Si91x|MCU|Device Part|SIWG917 +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y111XGABA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SLI_SI91X_MCU_INTERNAL_LDO_FOR_PSRAM + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- include: + - file_list: + - path: system_si91x.h + - path: si91x_mvp.h + - path: si91x_device.h + path: components/device/silabs/si91x/mcu/core/chip/inc/ +- provides: + - name: siwg917y111xgaba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_has_mvp + - name: device_compute_mvp + - name: device_supports_psram + - name: device_has_mpu + - name: device_is_module + - name: device_supports_external_flash +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- recommends: + - name: si917_mem_config_1 +- template_contribution: + - name: device_opn + value: SIWG917Y111XGABA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917 + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + +# This OPN has no internal flash +# - name: device_flash_addr +# value: 16777216 +# - name: device_flash_size +# value: 2097152 +# - name: device_flash_page_size +# value: 4096 + + - name: device_ram_addr + value: 12 + + # Default Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_3 + +- tag: + - device:opn:siwg917y111xgaba +- toolchain_settings: + - option: device_opn + value: siwg917y111xgaba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: +# Flash details will be provided by external flash component + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y111xgaba diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgnba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgnba.slcc new file mode 100644 index 000000000..69a6a67ab --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y111xgnba.slcc @@ -0,0 +1,153 @@ +!!omap +- id: SIWG917Y111XGNBA +- package: platform-internal-cmsis-headers +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y111XGNBA. +- category: Device|Si91x|MCU|Device Part|SIWG917 +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y111XGNBA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SLI_SI91X_MCU_INTERNAL_LDO_FOR_PSRAM + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- include: + - file_list: + - path: system_si91x.h + - path: si91x_mvp.h + - path: si91x_device.h + path: components/device/silabs/si91x/mcu/core/chip/inc/ +- provides: + - name: siwg917y111xgnba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_has_mvp + - name: device_compute_mvp + - name: device_supports_psram + - name: device_has_mpu + - name: device_is_module + - name: device_supports_external_flash +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- recommends: + - name: si917_mem_config_1 +- template_contribution: + - name: device_opn + value: SIWG917Y111XGNBA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917 + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + +# This OPN has no internal flash +# - name: device_flash_addr +# value: 16777216 +# - name: device_flash_size +# value: 2097152 +# - name: device_flash_page_size +# value: 4096 + + - name: device_ram_addr + value: 12 + + # Default Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_3 + +- tag: + - device:opn:siwg917y111xgnba +- toolchain_settings: + - option: device_opn + value: siwg917y111xgnba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: +# Flash details will be provided by external flash component + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y111xgnba diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgaba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgaba.slcc new file mode 100644 index 000000000..4bcada551 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgaba.slcc @@ -0,0 +1,168 @@ +!!omap +- id: SIWG917Y121MGABA +- package: platform-internal-cmsis-headers +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y121MGABA. +- category: Device|Si91x|MCU|Device Part|SIWG917 +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y121MGABA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SLI_SI91X_MCU_INTERNAL_LDO_FOR_PSRAM + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] + - name: SLI_SI91X_MCU_PSRAM_PRESENT +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- include: + - file_list: + - path: system_si91x.h + - path: si91x_mvp.h + - path: si91x_device.h + path: components/device/silabs/si91x/mcu/core/chip/inc/ +- provides: + - name: siwg917y121mgaba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_has_mvp + - name: device_compute_mvp + - name: device_has_stacked_psram + - name: device_supports_psram + - name: device_has_mpu + - name: device_is_module +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: psram_configuration_headers + condition: [rsilib_board] + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- recommends: + - name: si917_mem_config_1 +- template_contribution: + - name: device_opn + value: SIWG917Y121MGABA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917 + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + - name: psram_present + value: 1 + - name: flash_present + value: 1 + - name: device_psram_addr + value: 167772160 # 0x0A00_0000 + - name: device_psram_size + value: 2097152 + - name: device_ram_addr + value: 12 + + # Default Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_page_size + value: 256 + - name: device_ram_addr + value: 12 + +- tag: + - device:opn:siwg917y121mgaba +- toolchain_settings: + - option: device_opn + value: siwg917y121mgaba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: + # External flash and psram details will be provided by the External Flash and psram components + - name: Main Flash + page_size: 256 + size: 8388608 + start: 136323072 + type: non-volatile + - name: Stacked PSRAM + size: 2097152 # 2MB + start: 167772160 # 0x0A00_0000 + type: volatile + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y121mgaba diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnb.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnb.slcc index c530c14c6..836e7293b 100644 --- a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnb.slcc +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnb.slcc @@ -18,7 +18,7 @@ value: '1' - name: SLI_SI91X_MCU_INTERNAL_LDO_FOR_PSRAM value: '1' - - name: SL_SI91X_MODULE_BOARD + - name: SL_SI91X_ACX_MODULE value: '1' - name: SRAM_BASE value: "0x0cUL" @@ -49,6 +49,7 @@ - name: device_has_mpu - name: device_is_module - name: device_no_antenna + - name: device_is_module - requires: - name: rsilib_chip - name: romdriver_clks @@ -60,6 +61,7 @@ condition: [rsilib_board] - name: freertos_config condition: [freertos] + - name: si91x_32kHz_external_oscillator - template_contribution: - name: device_opn value: SIWG917Y121MGNB @@ -151,7 +153,7 @@ - name: Main Flash page_size: 256 size: 8388608 - start: 136060928 + start: 136323072 # 0x0820 2000 type: non-volatile # TODO: Check these Values - name: RAM diff --git a/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnba.slcc b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnba.slcc new file mode 100644 index 000000000..b113a17c8 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/siwg917y121mgnba.slcc @@ -0,0 +1,168 @@ +!!omap +- id: SIWG917Y121MGNBA +- package: platform-internal-cmsis-headers +- description: Silicon Labs CMSIS-Device part headers for SIWG917Y121MGNBA. +- category: Device|Si91x|MCU|Device Part|SIWG917 +- ui_hints: + visibility: never +- quality: production +- define: + - name: SIWG917Y121MGNBA + unless: + - device_content_override + - name: SLI_SI917 + value: '1' + - name: SLI_SI917B0 + value: '1' + - name: SL_SI91X_ACX_MODULE + value: '1' + - name: SLI_SI91X_MCU_ENABLE_FLASH_BASED_EXECUTION + value: '1' + - name: SLI_SI91X_MCU_INTERNAL_LDO_FOR_PSRAM + value: '1' + - name: SRAM_BASE + value: "0x0cUL" + unless: [rsilib_board] + - name: SRAM_SIZE + value: "0x2fc00UL" + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER + unless: [rsilib_board] + - name: SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2 + unless: [rsilib_board] + - name: SLI_SI91X_MCU_PSRAM_PRESENT +- source: + - path: components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c + - path: components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c + unless: [siwx917_soc_custom_startup] +- include: + - file_list: + - path: system_si91x.h + - path: si91x_mvp.h + - path: si91x_device.h + path: components/device/silabs/si91x/mcu/core/chip/inc/ +- provides: + - name: siwg917y121mgnba + - name: device_si91x + - name: device_family_siwg917 + - name: si91x_platform + - name: device_arm + - name: cortexm4 + - name: armv7em + - name: device_has_mvp + - name: device_compute_mvp + - name: device_has_stacked_psram + - name: device_supports_psram + - name: device_has_mpu + - name: device_is_module +- requires: + - name: rsilib_chip + - name: romdriver_clks + - name: si917_mem_config + - name: sl_si91x_mcu + - name: board_configuration_headers + - name: wiseconnect_toolchain_plugin + - name: psram_configuration_headers + condition: [rsilib_board] + - name: freertos_config + condition: [freertos] + - name: si91x_32kHz_external_oscillator +- recommends: + - name: si917_mem_config_1 +- template_contribution: + - name: device_opn + value: SIWG917Y121MGNBA + - name: device_arch + value: armv7em + - name: device_cpu + value: cortexm4 + - name: device_family + value: siwg917 + - name: device_fpu + value: true + - name: device_mpu + value: true + - name: default_stack_size + value: 3072 + - name: default_heap_size + value: 7168 + - name: nvm3_size + value: 65536 + - name: psram_present + value: 1 + - name: flash_present + value: 1 + - name: device_psram_addr + value: 167772160 # 0x0A00_0000 + - name: device_psram_size + value: 2097152 + - name: device_ram_addr + value: 12 + + # Default Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_1 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_1 + # Medium Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_2 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_2 + # Advanced Memory configuration + - name: device_flash_addr + value: 136323072 # 0x0820 2000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_size + value: 2088960 # 0x001F E000 + priority: 1000 + condition: + - si917_mem_config_3 + - name: device_flash_page_size + value: 256 + - name: device_ram_addr + value: 12 + +- tag: + - device:opn:siwg917y121mgnba +- toolchain_settings: + - option: device_opn + value: siwg917y121mgnba + - option: architecture + value: armv7e-m + - option: cpu + value: cortex-m4 + - option: fpu + value: fpv4-sp +- metadata: + device: + memory: + # External flash and psram details will be provided by the External Flash and psram components + - name: Main Flash + page_size: 256 + size: 8388608 + start: 136323072 + type: non-volatile + - name: Stacked PSRAM + size: 2097152 # 2MB + start: 167772160 # 0x0A00_0000 + type: volatile + - name: RAM + size: 196608 + start: 12 + type: volatile + opn: siwg917y121mgnba diff --git a/components/device/silabs/si91x/mcu/core/chip/component/sl_si91x_external_oscillator.slcc b/components/device/silabs/si91x/mcu/core/chip/component/sl_si91x_external_oscillator.slcc new file mode 100644 index 000000000..9476ddc3f --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/component/sl_si91x_external_oscillator.slcc @@ -0,0 +1,15 @@ +id: si91x_32kHz_external_oscillator +label: SI91X 32kHz EXTERNAL OSCILLATOR +package: platform +description: > + This component provides the provision to select the UULP GPIO for connecting the external oscillator. +category: Device|Si91x|MCU|Core +quality: production +component_root_path: "components/device/silabs/si91x/mcu/core/chip" +config_file: + - path: config/sl_si91x_external_oscillator.h +define: + - name: SI91X_32kHz_EXTERNAL_OSCILLATOR + value: '1' +provides: + - name: si91x_32kHz_external_oscillator \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/core/chip/config/RTE_Device_917.h b/components/device/silabs/si91x/mcu/core/chip/config/RTE_Device_917.h index 4dda89a60..134a8c96e 100644 --- a/components/device/silabs/si91x/mcu/core/chip/config/RTE_Device_917.h +++ b/components/device/silabs/si91x/mcu/core/chip/config/RTE_Device_917.h @@ -55,13 +55,22 @@ #define RTE_LED0_PORT 4 #define RTE_LED0_NUMBER 0 -#define RTE_LED0_PIN (2U) +#ifdef SL_SI91X_ACX_MODULE +#define RTE_LED0_PIN (0U) +#else +#define RTE_LED0_PIN (2U) +#endif -#define RTE_LED1_PORT 0 -#define RTE_LED1_NUMBER 1 -#define RTE_LED1_PIN (10U) +#define RTE_LED1_PORT 0 +#define RTE_LED1_NUMBER 1 +#define RTE_LED1_PIN (10U) +#ifdef SL_SI91X_ACX_MODULE +#define BOARD_ACTIVITY_LED (0U) // LED0 +#else #define BOARD_ACTIVITY_LED (2U) // LED0 -#define RTE_LED1_PAD 5 +#endif + +#define RTE_LED1_PAD 5 // USART0 [Driver_USART0] // Configuration settings for Driver_USART0 in component ::CMSIS Driver:USART @@ -116,7 +125,7 @@ #endif #else //Pintool data -#define RTE_USART0_CLK_PORT USART0_CLK_PORT +#define RTE_USART0_CLK_PORT 0 #if (USART0_CLK_LOC == 0) #define RTE_USART0_CLK_PIN USART0_CLK_PIN #define RTE_USART0_CLK_MUX 2 @@ -174,7 +183,7 @@ #endif #else //Pintool data -#define RTE_USART0_TX_PORT USART0_TX_PORT +#define RTE_USART0_TX_PORT 0 #if (USART0_TX_LOC == 4) #define RTE_USART0_TX_PIN USART0_TX_PIN #define RTE_USART0_TX_MUX 2 @@ -242,7 +251,7 @@ #endif #else //Pintool data -#define RTE_USART0_RX_PORT USART0_RX_PORT +#define RTE_USART0_RX_PORT 0 #if (USART0_RX_LOC == 9) #define RTE_USART0_RX_PIN USART0_RX_PIN #define RTE_USART0_RX_MUX 2 @@ -261,8 +270,12 @@ #if (USART0_RX_LOC == 12) #define RTE_USART0_RX_PIN (USART0_RX_PIN + GPIO_MAX_PIN) #define RTE_USART0_RX_MUX 2 +#ifdef SL_SI91X_ACX_MODULE +#define RTE_USART0_RX_PAD 23 +#else #define RTE_USART0_RX_PAD 24 #endif +#endif #if (USART0_RX_LOC == 13) #define RTE_USART0_RX_PIN (USART0_RX_PIN + GPIO_MAX_PIN) #define RTE_USART0_RX_MUX 4 @@ -301,7 +314,7 @@ #endif #else //Pintool data -#define RTE_USART0_CTS_PORT USART0_CTS_PORT +#define RTE_USART0_CTS_PORT 0 #if (USART0_CTS_LOC == 14) #define RTE_USART0_CTS_PIN USART0_CTS_PIN #define RTE_USART0_CTS_MUX 2 @@ -350,7 +363,7 @@ #endif #else //Pintool data -#define RTE_USART0_RTS_PORT USART0_RTS_PORT +#define RTE_USART0_RTS_PORT 0 #if (USART0_RTS_LOC == 18) #define RTE_USART0_RTS_PIN USART0_RTS_PIN #define RTE_USART0_RTS_MUX 2 @@ -402,7 +415,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_TX_PORT USART0_IRTX_PORT +#define RTE_USART0_IR_TX_PORT 0 #if (USART0_IRTX_LOC == 22) #define RTE_USART0_IR_TX_PIN USART0_IRTX_PIN #define RTE_USART0_IR_TX_MUX 13 @@ -454,7 +467,7 @@ #endif #else //Pintool data -#define RTE_USART0_IR_RX_PORT USART0_IRRX_PORT +#define RTE_USART0_IR_RX_PORT 0 #if (USART0_IRRX_LOC == 26) #define RTE_USART0_IR_RX_PIN USART0_IRRX_PIN #define RTE_USART0_IR_RX_MUX 13 @@ -498,7 +511,7 @@ #endif #else //Pintool data -#define RTE_USART0_RI_PORT USART0_RI_PORT +#define RTE_USART0_RI_PORT 0 #if (USART0_RI_LOC == 30) #define RTE_USART0_RI_PIN USART0_RI_PIN #define RTE_USART0_RI_MUX 2 @@ -537,7 +550,7 @@ #endif #else //Pintool data -#define RTE_USART0_DSR_PORT USART0_DSR_PORT +#define RTE_USART0_DSR_PORT 0 #define RTE_USART0_DSR_PIN USART0_DSR_PIN #if (USART0_DSR_LOC == 33) #define RTE_USART0_DSR_MUX 2 @@ -556,7 +569,7 @@ #define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN 12 #else -#define RTE_USART0_DCD_PORT USART0_DCD_PORT +#define RTE_USART0_DCD_PORT 0 #define RTE_USART0_DCD_PIN USART0_DCD_PIN #if (USART0_DCD_LOC == 35) #define RTE_USART0_DCD_MUX 2 @@ -573,7 +586,7 @@ #define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN 7 #else -#define RTE_USART0_DTR_PORT USART0_DTR_PORT +#define RTE_USART0_DTR_PORT 0 #define RTE_USART0_DTR_PIN USART0_DTR_PIN #endif #define RTE_USART0_DTR_MUX 2 @@ -602,7 +615,7 @@ #define RTE_UART1_CHNL_UDMA_RX_CH 26 /*UART1 PINS*/ -// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_67 <3=>P0_69 <4=>P0_73 <5=>P0_75 <6=>P0_34 +// UART1_TX <0=>P0_7 <1=>P0_30 <2=>P0_69 <3=>P0_73 <4=>P0_75 <5=>P0_34 // TX of UART1 #ifndef UART1_TX_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER @@ -627,15 +640,10 @@ #define RTE_UART1_TX_PAD 0 //no pad #elif (RTE_UART1_TX_PORT_ID == 2) #define RTE_UART1_TX_PORT 0 -#define RTE_UART1_TX_PIN 67 -#define RTE_UART1_TX_MUX 9 -#define RTE_UART1_TX_PAD 25 -#elif (RTE_UART1_TX_PORT_ID == 3) -#define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 73 #define RTE_UART1_TX_MUX 6 #define RTE_UART1_TX_PAD 31 -#elif (RTE_UART1_TX_PORT_ID == 4) +#elif (RTE_UART1_TX_PORT_ID == 3) #define RTE_UART1_TX_PORT 0 #define RTE_UART1_TX_PIN 75 #define RTE_UART1_TX_MUX 9 @@ -674,7 +682,7 @@ //Pintool data #endif -// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_68 <4=>P0_72 <5=>P0_74 <6=>P0_33 +// UART1_RX <0=>P0_6 <1=>P0_29 <2=>P0_66 <3=>P0_72 // RX of UART1 #ifndef UART1_RX_LOC #define RTE_UART1_RX_PORT_ID 0 @@ -700,16 +708,20 @@ #define RTE_UART1_RX_MUX 6 #define RTE_UART1_RX_PAD 30 #elif (RTE_UART1_RX_PORT_ID == 4) +#ifdef SL_SI91X_ACX_MODULE +#error "ULP_GPIO_10 is not available in module boards/OPNs!" +#else #define RTE_UART1_RX_PORT 0 #define RTE_UART1_RX_PIN 74 #define RTE_UART1_RX_MUX 9 #define RTE_UART1_RX_PAD 32 +#endif #else #error "Invalid UART1 RTE_UART1_RX_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_UART1_RX_PORT UART1_RX_PORT +#define RTE_UART1_RX_PORT 0 #if (UART1_RX_LOC == 5) #define RTE_UART1_RX_PIN UART1_RX_PIN #define RTE_UART1_RX_MUX 6 @@ -773,7 +785,7 @@ #endif #else //Pintool data -#define RTE_UART1_CTS_PORT UART1_CTS_PORT +#define RTE_UART1_CTS_PORT 0 #if (UART1_CTS_LOC == 10) #define RTE_UART1_CTS_PIN UART1_CTS_PIN #define RTE_UART1_CTS_MUX 6 @@ -846,7 +858,7 @@ #endif #else //Pintool data -#define RTE_UART1_RTS_PORT UART1_RTS_PORT +#define RTE_UART1_RTS_PORT 0 #if (UART1_RTS_LOC == 16) #define RTE_UART1_RTS_PIN UART1_RTS_PIN #define RTE_UART1_RTS_MUX 6 @@ -921,7 +933,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_TX_PORT ULP_UART_TX_PORT +#define RTE_ULP_UART_TX_PORT 0 #define RTE_ULP_UART_TX_PIN ULP_UART_TX_PIN #define RTE_ULP_UART_TX_MUX 3 //Pintool data @@ -948,7 +960,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_RX_PORT ULP_UART_RX_PORT +#define RTE_ULP_UART_RX_PORT 0 #define RTE_ULP_UART_RX_PIN ULP_UART_RX_PIN #define RTE_ULP_UART_RX_MUX 3 //Pintool data @@ -971,7 +983,7 @@ #endif #else //Pintool data -#define RTE_ULP_UART_CTS_PORT ULP_UART_CTS_PORT +#define RTE_ULP_UART_CTS_PORT 0 #define RTE_ULP_UART_CTS_PIN ULP_UART_CTS_PIN #define RTE_ULP_UART_CTS_MUX 3 //Pintool data @@ -988,7 +1000,7 @@ #error "Invalid ULPSS UART RTE_ULP_UART_RTS_PIN Pin Configuration!" #endif #else -#define RTE_ULP_UART_RTS_PORT ULP_UART_RTS_PORT +#define RTE_ULP_UART_RTS_PORT 0 #define RTE_ULP_UART_RTS_PIN ULP_UART_RTS_PIN #endif #define RTE_ULP_UART_RTS_MUX 8 @@ -1031,16 +1043,16 @@ #else //Pintool data #define RTE_SSI_MASTER_MISO 1 -#define RTE_SSI_MASTER_MISO_PORT SSI_MASTER_MISO_DATA1_PORT +#define RTE_SSI_MASTER_MISO_PORT 0 #define RTE_SSI_MASTER_MISO_PIN SSI_MASTER_MISO_DATA1_PIN #define RTE_SSI_MASTER_MISO_MODE EGPIO_PIN_MUX_MODE3 -#if (SSI_MASTER_DATA1_LOC == 0) +#if (SSI_MASTER_DATA1_LOC == 3) #define RTE_SSI_MASTER_MISO_PADSEL 7 #endif -#if (SSI_MASTER_DATA1_LOC == 1) +#if (SSI_MASTER_DATA1_LOC == 4) #define RTE_SSI_MASTER_MISO_PADSEL 0 //NO PAD #endif -#if (SSI_MASTER_DATA1_LOC == 2) +#if (SSI_MASTER_DATA1_LOC == 5) #define RTE_SSI_MASTER_MISO_PADSEL 21 #endif //Pintool data @@ -1074,7 +1086,7 @@ #else //Pintool data #define RTE_SSI_MASTER_MOSI 1 -#define RTE_SSI_MASTER_MOSI_PORT SSI_MASTER_MOSI_DATA0_PORT +#define RTE_SSI_MASTER_MOSI_PORT 0 #define RTE_SSI_MASTER_MOSI_PIN SSI_MASTER_MOSI_DATA0_PIN #define RTE_SSI_MASTER_MOSI_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_DATA0_LOC == 0) @@ -1117,7 +1129,7 @@ #else //Pintool data #define RTE_SSI_MASTER_SCK 1 -#define RTE_SSI_MASTER_SCK_PORT SSI_MASTER_SCK__PORT +#define RTE_SSI_MASTER_SCK_PORT 0 #define RTE_SSI_MASTER_SCK_PIN SSI_MASTER_SCK__PIN #define RTE_SSI_MASTER_SCK_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_SCK_LOC == 6) @@ -1165,7 +1177,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS0 M4_SSI_CS0 -#define RTE_SSI_MASTER_CS0_PORT SSI_MASTER_CS0__PORT +#define RTE_SSI_MASTER_CS0_PORT 0 #define RTE_SSI_MASTER_CS0_PIN SSI_MASTER_CS0__PIN #define RTE_SSI_MASTER_CS0_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS0_LOC == 9) @@ -1190,7 +1202,7 @@ #error "Invalid SSI_MASTER_CS1 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS1_PORT SSI_MASTER_CS1__PORT +#define RTE_SSI_MASTER_CS1_PORT 0 #define RTE_SSI_MASTER_CS1_PIN SSI_MASTER_CS1__PIN #endif #define RTE_SSI_MASTER_CS1 M4_SSI_CS1 @@ -1218,7 +1230,7 @@ #else //Pintool data #define RTE_SSI_MASTER_CS2 M4_SSI_CS2 -#define RTE_SSI_MASTER_CS2_PORT SSI_MASTER_CS2__PORT +#define RTE_SSI_MASTER_CS2_PORT 0 #define RTE_SSI_MASTER_CS2_PIN SSI_MASTER_CS2__PIN #define RTE_SSI_MASTER_CS2_MODE EGPIO_PIN_MUX_MODE3 #if (SSI_MASTER_CS2_LOC == 13) @@ -1240,7 +1252,7 @@ #error "Invalid SSI_MASTER_CS3 Pin Configuration!" #endif #else -#define RTE_SSI_MASTER_CS3_PORT SSI_MASTER_CS3__PORT +#define RTE_SSI_MASTER_CS3_PORT 0 #define RTE_SSI_MASTER_CS3_PIN SSI_MASTER_CS3__PIN #endif #define RTE_SSI_MASTER_CS3 M4_SSI_CS3 @@ -1302,7 +1314,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MISO 1 -#define RTE_SSI_SLAVE_MISO_PORT SSI_SLAVE_MISO__PORT +#define RTE_SSI_SLAVE_MISO_PORT 0 #define RTE_SSI_SLAVE_MISO_PIN SSI_SLAVE_MISO__PIN #define RTE_SSI_SLAVE_MISO_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MISO_LOC == 5) @@ -1360,7 +1372,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_MOSI 1 -#define RTE_SSI_SLAVE_MOSI_PORT SSI_SLAVE_MOSI__PORT +#define RTE_SSI_SLAVE_MOSI_PORT 0 #define RTE_SSI_SLAVE_MOSI_PIN SSI_SLAVE_MOSI__PIN #define RTE_SSI_SLAVE_MOSI_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_MOSI_LOC == 1) @@ -1414,7 +1426,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_SCK 1 -#define RTE_SSI_SLAVE_SCK_PORT SSI_SLAVE_SCK__PORT +#define RTE_SSI_SLAVE_SCK_PORT 0 #define RTE_SSI_SLAVE_SCK_PIN SSI_SLAVE_SCK__PIN #define RTE_SSI_SLAVE_SCK_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_SCK_LOC == 9) @@ -1434,7 +1446,11 @@ // SSI_SLAVE_CS Pin <0=>Not Used <1=>GPIO_9 <2=>GPIO_25 <3=>GPIO_46 <4=>GPIO_53 #ifndef SSI_SLAVE_CS0_LOC +#ifdef SL_SI91X_ACX_MODULE #define RTE_SSI_SLAVE_CS_PORT_ID 1 +#else +#define RTE_SSI_SLAVE_CS_PORT_ID 2 +#endif #if (RTE_SSI_SLAVE_CS_PORT_ID == 0) #define RTE_SSI_SLAVE_CS 0 @@ -1468,7 +1484,7 @@ #else //Pintool data #define RTE_SSI_SLAVE_CS 1 -#define RTE_SSI_SLAVE_CS_PORT SSI_SLAVE_CS0__PORT +#define RTE_SSI_SLAVE_CS_PORT 0 #define RTE_SSI_SLAVE_CS_PIN SSI_SLAVE_CS0__PIN #define RTE_SSI_SLAVE_CS_MODE EGPIO_PIN_MUX_MODE8 #if (SSI_SLAVE_CS0_LOC == 13) @@ -1512,7 +1528,7 @@ #define ULP_SSI_CS2 0 // SSI_ULP_MASTER_MISO Pin <0=>Not Used <1=>ULP_GPIO_2 <2=>ULP_GPIO_9 -#ifndef ULP_SPI_MISO_LOC +#if !defined(ULP_SPI_MISO_LOC) && !defined(ULP_SSI_MISO_LOC) #define RTE_SSI_ULP_MASTER_MISO_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MISO_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MISO 1 @@ -1530,14 +1546,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MISO 1 -#define RTE_SSI_ULP_MASTER_MISO_PORT ULP_SPI_MISO__PORT -#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SPI_MISO__PIN +#define RTE_SSI_ULP_MASTER_MISO_PORT 0 +#define RTE_SSI_ULP_MASTER_MISO_PIN ULP_SSI_MISO__PIN #define RTE_SSI_ULP_MASTER_MISO_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_MOSI Pin <0=>Not Used <1=>ULP_GPIO_1 <2=>ULP_GPIO_11 -#ifndef ULP_SPI_MOSI_LOC +#if !defined(ULP_SPI_MOSI_LOC) && !defined(ULP_SSI_MOSI_LOC) #define RTE_SSI_ULP_MASTER_MOSI_PORT_ID 0 #if (RTE_SSI_ULP_MASTER_MOSI_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_MOSI 1 @@ -1555,14 +1571,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_MOSI 1 -#define RTE_SSI_ULP_MASTER_MOSI_PORT ULP_SPI_MOSI__PORT -#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SPI_MOSI__PIN +#define RTE_SSI_ULP_MASTER_MOSI_PORT 0 +#define RTE_SSI_ULP_MASTER_MOSI_PIN ULP_SSI_MOSI__PIN #define RTE_SSI_ULP_MASTER_MOSI_MODE 1 //Pintool data #endif // SSI_ULP_MASTER_SCK Pin <0=>Not Used <1=>ULP_GPIO_0 <2=>ULP_GPIO_8 -#ifndef ULP_SPI_SCK_LOC +#if !defined(ULP_SPI_SCK_LOC) && !defined(ULP_SSI_SCK_LOC) #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SSI_ULP_MASTER_SCK_PORT_ID 2 #else @@ -1586,14 +1602,14 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_SCK 1 -#define RTE_SSI_ULP_MASTER_SCK_PORT ULP_SPI_SCK__PORT -#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SPI_SCK__PIN +#define RTE_SSI_ULP_MASTER_SCK_PORT 0 +#define RTE_SSI_ULP_MASTER_SCK_PIN ULP_SSI_SCK__PIN #define RTE_SSI_ULP_MASTER_SCK_MODE 1 //Pintool data #endif // CS0 -#ifndef ULP_SPI_CS0_LOC +#if !defined(ULP_SPI_CS0_LOC) && !defined(ULP_SSI_CS0_LOC) #define RTE_SSI_ULP_MASTER_CS0_PORT_ID 1 #if (RTE_SSI_ULP_MASTER_CS0_PORT_ID == 0) #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 @@ -1611,30 +1627,30 @@ #else //Pintool data #define RTE_SSI_ULP_MASTER_CS0 ULP_SSI_CS0 -#define RTE_SSI_ULP_MASTER_CS0_PORT ULP_SPI_CS0__PORT -#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SPI_CS0__PIN +#define RTE_SSI_ULP_MASTER_CS0_PORT 0 +#define RTE_SSI_ULP_MASTER_CS0_PIN ULP_SSI_CS0__PIN #define RTE_SSI_ULP_MASTER_CS0_MODE 1 //Pintool data #endif // CS1 -#ifndef ULP_SPI_CS1_LOC +#if !defined(ULP_SPI_CS1_LOC) || !defined(ULP_SSI_CS1_LOC) #define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN 4 #else -#define RTE_SSI_ULP_MASTER_CS1_PORT ULP_SPI_CS1__PORT +#define RTE_SSI_ULP_MASTER_CS1_PORT 0 #define RTE_SSI_ULP_MASTER_CS1_PIN ULP_SPI_CS1__PIN #endif #define RTE_SSI_ULP_MASTER_CS1 ULP_SSI_CS1 #define RTE_SSI_ULP_MASTER_CS1_MODE 1 // CS2 -#ifndef ULP_SPI_CS2_LOC +#if !defined(ULP_SPI_CS2_LOC) && !defined(ULP_SSI_CS2_LOC) #define RTE_SSI_ULP_MASTER_CS2_PORT 0 #define RTE_SSI_ULP_MASTER_CS2_PIN 6 #else -#define RTE_SSI_ULP_MASTER_CS2_PORT ULP_SPI_CS2__PORT -#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SPI_CS2__PIN +#define RTE_SSI_ULP_MASTER_CS2_PORT 0 +#define RTE_SSI_ULP_MASTER_CS2_PIN ULP_SSI_CS2__PIN #endif #define RTE_SSI_ULP_MASTER_CS2 ULP_SSI_CS2 #define RTE_SSI_ULP_MASTER_CS2_MODE 1 @@ -1725,7 +1741,7 @@ #endif #else //Pintool data -#define RTE_I2S0_SCLK_PORT I2S0_SCLK_PORT +#define RTE_I2S0_SCLK_PORT 0 #define RTE_I2S0_SCLK_PIN I2S0_SCLK_PIN #define RTE_I2S0_SCLK_MUX 7 #if (I2S0_SCLK_LOC == 0) @@ -1773,7 +1789,7 @@ #endif #else //Pintool data -#define RTE_I2S0_WSCLK_PORT I2S0_WSCLK_PORT +#define RTE_I2S0_WSCLK_PORT 0 #define RTE_I2S0_WSCLK_PIN I2S0_WSCLK_PIN #define RTE_I2S0_WSCLK_MUX 7 #if (I2S0_WSCLK_LOC == 4) @@ -1821,7 +1837,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT0_PORT I2S0_DOUT0_PORT +#define RTE_I2S0_DOUT0_PORT 0 #define RTE_I2S0_DOUT0_PIN I2S0_DOUT0_PIN #define RTE_I2S0_DOUT0_MUX 7 #if (I2S0_DOUT0_LOC == 8) @@ -1869,7 +1885,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN0_PORT I2S0_DIN0_PORT +#define RTE_I2S0_DIN0_PORT 0 #define RTE_I2S0_DIN0_PIN I2S0_DIN0_PIN #define RTE_I2S0_DIN0_MUX 7 #if (I2S0_DIN0_LOC == 12) @@ -1921,7 +1937,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DOUT1_PORT I2S0_DOUT1_PORT +#define RTE_I2S0_DOUT1_PORT 0 #define RTE_I2S0_DOUT1_PIN I2S0_DOUT1_PIN #define RTE_I2S0_DOUT1_MUX 7 #if (I2S0_DOUT1_LOC == 16) @@ -1969,7 +1985,7 @@ #endif #else //Pintool data -#define RTE_I2S0_DIN1_PORT I2S0_DIN1_PORT +#define RTE_I2S0_DIN1_PORT 0 #define RTE_I2S0_DIN1_PIN I2S0_DIN1_PIN #define RTE_I2S0_DIN1_MUX 7 #if (I2S0_DIN1_LOC == 20) @@ -2065,7 +2081,7 @@ #endif #else //Pintool data -#define RTE_I2S1_SCLK_PORT ULP_I2S_SCLK_PORT +#define RTE_I2S1_SCLK_PORT 0 #define RTE_I2S1_SCLK_PIN ULP_I2S_SCLK_PIN #define RTE_I2S1_SCLK_MUX 2 //Pintool data @@ -2087,7 +2103,7 @@ #endif #else //Pintool data -#define RTE_I2S1_WSCLK_PORT ULP_I2S_WSCLK_PORT +#define RTE_I2S1_WSCLK_PORT 0 #define RTE_I2S1_WSCLK_PIN ULP_I2S_WSCLK_PIN #define RTE_I2S1_WSCLK_MUX 2 //Pintool data @@ -2109,7 +2125,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DOUT0_PORT ULP_I2S_DOUT0_PORT +#define RTE_I2S1_DOUT0_PORT 0 #define RTE_I2S1_DOUT0_PIN ULP_I2S_DOUT0_PIN #define RTE_I2S1_DOUT0_MUX 2 //Pintool data @@ -2135,7 +2151,7 @@ #endif #else //Pintool data -#define RTE_I2S1_DIN0_PORT ULP_I2S_DIN0_PORT +#define RTE_I2S1_DIN0_PORT 0 #define RTE_I2S1_DIN0_PIN ULP_I2S_DIN0_PIN #define RTE_I2S1_DIN0_MUX 2 //Pintool data @@ -2229,7 +2245,7 @@ #endif #else //Pintool data -#define RTE_I2C0_SCL_PORT I2C0_SCL_PORT +#define RTE_I2C0_SCL_PORT 0 #if (I2C0_SCL_LOC == 0) #define RTE_I2C0_SCL_PIN I2C0_SCL_PIN #define RTE_I2C0_SCL_MUX 4 @@ -2251,12 +2267,14 @@ //Pintool data #endif -// I2C0_SCL Pin <0=>P0_6 <1=>P0_64 <2=>P0_67 <3=>P0_74 <4=>P0_31 +// I2C0_SCL Pin <0=>P0_6 <1=>P0_74 #ifndef I2C0_SDA_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_I2C0_SDA_PORT_ID 2 -#else +#ifdef SL_SI91X_ACX_MODULE #define RTE_I2C0_SDA_PORT_ID 0 +#else +#define RTE_I2C0_SDA_PORT_ID 1 +#endif #endif #if (RTE_I2C0_SDA_PORT_ID == 0) @@ -2266,23 +2284,21 @@ #define RTE_I2C0_SDA_PAD 1 #define RTE_I2C0_SDA_I2C_REN 6 #elif (RTE_I2C0_SDA_PORT_ID == 1) -#define RTE_I2C0_SDA_PORT 0 -#define RTE_I2C0_SDA_PIN 67 -#define RTE_I2C0_SDA_MUX 4 -#define RTE_I2C0_SDA_PAD 25 -#define RTE_I2C0_SDA_I2C_REN 3 -#elif (RTE_I2C0_SDA_PORT_ID == 2) +#ifdef SL_SI91X_ACX_MODULE +#error "ULP_GPIO_10 is not available in module boards/OPNs!" +#else #define RTE_I2C0_SDA_PORT 0 #define RTE_I2C0_SDA_PIN 74 #define RTE_I2C0_SDA_MUX 4 #define RTE_I2C0_SDA_PAD 32 #define RTE_I2C0_SDA_I2C_REN 10 +#endif #else #error "Invalid I2C0 RTE_I2C0_SDA Pin Configuration!" #endif #else //Pintool data -#define RTE_I2C0_SDA_PORT I2C0_SDA_PORT +#define RTE_I2C0_SDA_PORT 0 #if (I2C0_SDA_LOC == 3) #define RTE_I2C0_SDA_PIN I2C0_SDA_PIN #define RTE_I2C0_SDA_MUX 4 @@ -2364,7 +2380,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SCL_PORT I2C1_SCL_PORT +#define RTE_I2C1_SCL_PORT 0 #if (I2C1_SCL_LOC == 0) #define RTE_I2C1_SCL_PIN I2C1_SCL_PIN #define RTE_I2C1_SCL_MUX 5 @@ -2404,7 +2420,7 @@ //Pintool data #endif -// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <4=>P0_67 <4=>P0_71 <7=>P0_34 +// I2C1_SCL Pin <0=>P0_7 <1=>P0_30 <2=>P0_51 <3=>P0_55 <4=>P0_65 <5=>P0_71 <6=>P0_34 #ifndef I2C1_SDA_LOC #define RTE_I2C1_SDA_PORT_ID 2 @@ -2440,12 +2456,6 @@ #define RTE_I2C1_SDA_REN 1 #elif (RTE_I2C1_SDA_PORT_ID == 5) #define RTE_I2C1_SDA_PORT 0 -#define RTE_I2C1_SDA_PIN 67 -#define RTE_I2C1_SDA_MUX 5 -#define RTE_I2C1_SDA_PAD 25 -#define RTE_I2C1_SDA_REN 3 -#elif (RTE_I2C1_SDA_PORT_ID == 6) -#define RTE_I2C1_SDA_PORT 0 #define RTE_I2C1_SDA_PIN 71 #define RTE_I2C1_SDA_MUX 5 #define RTE_I2C1_SDA_PAD 29 @@ -2455,7 +2465,7 @@ #endif #else //Pintool data -#define RTE_I2C1_SDA_PORT I2C1_SDA_PORT +#define RTE_I2C1_SDA_PORT 0 #if (I2C1_SDA_LOC == 6) #define RTE_I2C1_SDA_PIN I2C1_SDA_PIN #define RTE_I2C1_SDA_MUX 5 @@ -2533,7 +2543,7 @@ #endif #else //Pintool data -#define RTE_I2C2_SCL_PORT ULP_I2C_SCL_PORT +#define RTE_I2C2_SCL_PORT 0 #define RTE_I2C2_SCL_PIN ULP_I2C_SCL_PIN #define RTE_I2C2_SCL_MUX 4 #if (ULP_I2C_SCL_LOC == 0) @@ -2571,8 +2581,8 @@ #endif #else //Pintool data -#define RTE_I2C2_SDA_PORT I2C2_SDA_PORT -#define RTE_I2C2_SDA_PIN I2C2_SDA_PIN +#define RTE_I2C2_SDA_PORT 0 +#define RTE_I2C2_SDA_PIN ULP_I2C_SDA_PIN #define RTE_I2C2_SDA_MUX 4 #if (ULP_I2C_SDA_LOC == 4) #define RTE_I2C2_SDA_REN 0 @@ -2633,7 +2643,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_CLK_PORT GSPI_MASTER_SCK__PORT +#define RTE_GSPI_MASTER_CLK_PORT 0 #define RTE_GSPI_MASTER_CLK_PIN GSPI_MASTER_SCK__PIN #define RTE_GSPI_MASTER_CLK_MUX 4 #if (GSPI_MASTER_SCK_LOC == 0) @@ -2688,7 +2698,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS0 1 -#define RTE_GSPI_MASTER_CS0_PORT GSPI_MASTER_CS0__PORT +#define RTE_GSPI_MASTER_CS0_PORT 0 #define RTE_GSPI_MASTER_CS0_PIN GSPI_MASTER_CS0__PIN #define RTE_GSPI_MASTER_CS0_MUX 4 #if (GSPI_MASTER_CS0_LOC == 4) @@ -2742,7 +2752,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS1 1 -#define RTE_GSPI_MASTER_CS1_PORT GSPI_MASTER_CS1__PORT +#define RTE_GSPI_MASTER_CS1_PORT 0 #define RTE_GSPI_MASTER_CS1_PIN GSPI_MASTER_CS1__PIN #define RTE_GSPI_MASTER_CS1_MUX 4 #if (GSPI_MASTER_CS1_LOC == 8) @@ -2796,7 +2806,7 @@ #else //Pintool data #define RTE_GSPI_MASTER_CS2 1 -#define RTE_GSPI_MASTER_CS2_PORT GSPI_MASTER_CS2__PORT +#define RTE_GSPI_MASTER_CS2_PORT 0 #define RTE_GSPI_MASTER_CS2_PIN GSPI_MASTER_CS2__PIN #define RTE_GSPI_MASTER_CS2_MUX 4 #if (GSPI_MASTER_CS2_LOC == 12) @@ -2849,7 +2859,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MOSI_PORT GSPI_MASTER_MOSI__PORT +#define RTE_GSPI_MASTER_MOSI_PORT 0 #define RTE_GSPI_MASTER_MOSI_PIN GSPI_MASTER_MOSI__PIN #if (GSPI_MASTER_MOSI_LOC == 16) #define RTE_GSPI_MASTER_MOSI_MUX 4 @@ -2904,7 +2914,7 @@ #endif #else //Pintool data -#define RTE_GSPI_MASTER_MISO_PORT GSPI_MASTER_MISO__PORT +#define RTE_GSPI_MASTER_MISO_PORT 0 #define RTE_GSPI_MASTER_MISO_PIN GSPI_MASTER_MISO__PIN #define RTE_GSPI_MASTER_MISO_MUX 4 #if (GSPI_MASTER_MISO_LOC == 21) @@ -3066,7 +3076,7 @@ //Pintool data #endif -//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_67 <2=>GPIO_71 +//SCT_IN_3 <0=>GPIO_28 <1=>GPIO_71 #ifndef SCT_IN3_LOC #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_SCT_IN_3_PORT_ID 0 @@ -3081,11 +3091,6 @@ #define RTE_SCT_IN_3_PAD 0 //no pad #elif (RTE_SCT_IN_3_PORT_ID == 1) #define RTE_SCT_IN_3_PORT 0 -#define RTE_SCT_IN_3_PIN 67 -#define RTE_SCT_IN_3_MUX 7 -#define RTE_SCT_IN_3_PAD 25 -#elif (RTE_SCT_IN_3_PORT_ID == 2) -#define RTE_SCT_IN_3_PORT 0 #define RTE_SCT_IN_3_PIN 71 #define RTE_SCT_IN_3_MUX 9 #define RTE_SCT_IN_3_PAD 29 @@ -3094,7 +3099,7 @@ #endif #else //Pintool data -#define RTE_SCT_IN_3_PORT SCT_IN3_PORT +#define RTE_SCT_IN_3_PORT 0 #if (SCT_IN3_LOC == 8) #define RTE_SCT_IN_3_PIN SCT_IN3_PIN #define RTE_SCT_IN_3_MUX 9 @@ -3121,7 +3126,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_0_PORT SCT_OUT0_PORT +#define RTE_SCT_OUT_0_PORT 0 #if (SCT_OUT0_LOC == 10) #define RTE_SCT_OUT_0_PIN SCT_OUT0_PIN #define RTE_SCT_OUT_0_MUX 9 @@ -3147,7 +3152,7 @@ #endif #else //Pintool data -#define RTE_SCT_OUT_1_PORT SCT_OUT1_PORT +#define RTE_SCT_OUT_1_PORT 0 #if (SCT_OUT1_LOC == 12) #define RTE_SCT_OUT_1_PIN SCT_OUT1_PIN #define RTE_SCT_OUT_1_MUX 9 @@ -3161,42 +3166,42 @@ #endif //Pintool data -#define RTE_SCT_OUT_2_PORT SCT_OUT2_PORT +#define RTE_SCT_OUT_2_PORT 0 #define RTE_SCT_OUT_2_PIN SCT_OUT2_PIN #define RTE_SCT_OUT_2_MUX 7 #define RTE_SCT_OUT_2_PAD 28 //Pintool data //Pintool data -#define RTE_SCT_OUT_3_PORT SCT_OUT3_PORT +#define RTE_SCT_OUT_3_PORT 0 #define RTE_SCT_OUT_3_PIN SCT_OUT3_PIN #define RTE_SCT_OUT_3_MUX 7 #define RTE_SCT_OUT_3_PAD 29 //Pintool data //Pintool data -#define RTE_SCT_OUT_4_PORT SCT_OUT4_PORT +#define RTE_SCT_OUT_4_PORT 0 #define RTE_SCT_OUT_4_PIN SCT_OUT4_PIN #define RTE_SCT_OUT_4_MUX 7 #define RTE_SCT_OUT_4_PAD 30 //Pintool data //Pintool data -#define RTE_SCT_OUT_5_PORT SCT_OUT5_PORT +#define RTE_SCT_OUT_5_PORT 0 #define RTE_SCT_OUT_5_PIN SCT_OUT5_PIN #define RTE_SCT_OUT_5_MUX 7 #define RTE_SCT_OUT_5_PAD 31 //Pintool data //Pintool data -#define RTE_SCT_OUT_6_PORT SCT_OUT6_PORT +#define RTE_SCT_OUT_6_PORT 0 #define RTE_SCT_OUT_6_PIN SCT_OUT6_PIN #define RTE_SCT_OUT_6_MUX 7 #define RTE_SCT_OUT_6_PAD 32 //Pintool data //Pintool data -#define RTE_SCT_OUT_7_PORT SCT_OUT7_PORT +#define RTE_SCT_OUT_7_PORT 0 #define RTE_SCT_OUT_7_PIN SCT_OUT7_PIN #define RTE_SCT_OUT_7_MUX 7 #define RTE_SCT_OUT_7_PAD 33 @@ -3323,10 +3328,14 @@ #define RTE_SIO_2_MUX 1 #define RTE_SIO_2_PAD 24 #elif (RTE_SIO_2_PORT_ID == 3) +#ifdef SL_SI91X_ACX_MODULE +#error "ULP_GPIO_10 is not available in module boards/OPNs!" +#else #define RTE_SIO_2_PORT 0 #define RTE_SIO_2_PIN 74 #define RTE_SIO_2_MUX 1 #define RTE_SIO_2_PAD 32 +#endif #else #error "Invalid RTE_SIO_2_PIN Pin Configuration!" #endif @@ -3585,7 +3594,7 @@ //Pintool data #endif -//PWM_2H <0=>GPIO_9 <1=>GPIO_67 <2=>GPIO_69 +//PWM_2H <0=>GPIO_9 #ifndef PWM_2H_LOC #define RTE_PWM_2H_PORT_ID 0 #if ((RTE_PWM_2H_PORT_ID == 2)) @@ -3597,17 +3606,12 @@ #define RTE_PWM_2H_PIN 9 #define RTE_PWM_2H_MUX 10 #define RTE_PWM_2H_PAD 4 -#elif (RTE_PWM_2H_PORT_ID == 1) -#define RTE_PWM_2H_PORT 0 -#define RTE_PWM_2H_PIN 67 -#define RTE_PWM_2H_MUX 8 -#define RTE_PWM_2H_PAD 25 #else #error "Invalid RTE_PWM_2H_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_2H_PORT PWM_2H_PORT +#define RTE_PWM_2H_PORT 0 #if (PWM_2H_LOC == 4) #define RTE_PWM_2H_PIN PWM_2H_PIN #define RTE_PWM_2H_MUX 10 @@ -3643,7 +3647,7 @@ #endif #else //Pintool data -#define RTE_PWM_2L_PORT PWM_2L_PORT +#define RTE_PWM_2L_PORT 0 #if (PWM_2L_LOC == 6) #define RTE_PWM_2L_PIN PWM_2L_PIN #define RTE_PWM_2L_MUX 10 @@ -3675,7 +3679,7 @@ #endif #else //Pintool data -#define RTE_PWM_3H_PORT PWM_3H_PORT +#define RTE_PWM_3H_PORT 0 #if (PWM_3H_LOC == 9) #define RTE_PWM_3H_PIN PWM_3H_PIN #define RTE_PWM_3H_MUX 10 @@ -3702,7 +3706,7 @@ #endif #else //Pintool data -#define RTE_PWM_3L_PORT PWM_3L_PORT +#define RTE_PWM_3L_PORT 0 #if (PWM_3L_LOC == 11) #define RTE_PWM_3L_PIN PWM_3L_PIN #define RTE_PWM_3L_MUX 10 @@ -3738,7 +3742,7 @@ #endif #else //Pintool data -#define RTE_PWM_4H_PORT PWM_4H_PORT +#define RTE_PWM_4H_PORT 0 #define RTE_PWM_4H_PIN (PWM_4H_PIN + GPIO_MAX_PIN) #define RTE_PWM_4H_MUX 8 #define RTE_PWM_4H_PAD 29 @@ -3768,7 +3772,7 @@ #endif #else //Pintool data -#define RTE_PWM_4L_PORT PWM_4L_PORT +#define RTE_PWM_4L_PORT 0 #if (PWM_4L_LOC == 14) #define RTE_PWM_4L_PIN PWM_4L_PIN #define RTE_PWM_4L_MUX 10 @@ -3801,7 +3805,7 @@ #endif #else //Pintool data -#define RTE_PWM_FAULTA_PORT PWM_FAULTA_PORT +#define RTE_PWM_FAULTA_PORT 0 #if (PWM_FAULTA_LOC == 16) #define RTE_PWM_FAULTA_PIN PWM_FAULTA_PIN #define RTE_PWM_FAULTA_MUX 10 @@ -3820,7 +3824,7 @@ //Pintool data #endif -// PWM_FAULTB <0=>GPIO_26 <1=>GPIO_69 <1=>GPIO_74 +// PWM_FAULTB <0=>GPIO_26 <1=>GPIO_74 #ifndef PWM_FAULTB_LOC #define RTE_PWM_FAULTB_PORT_ID 0 @@ -3829,17 +3833,21 @@ #define RTE_PWM_FAULTB_PIN 26 #define RTE_PWM_FAULTB_MUX 10 #define RTE_PWM_FAULTB_PAD 0 //no pad -#elif (RTE_PWM_FAULTB_PORT_ID == 2) +#elif (RTE_PWM_FAULTB_PORT_ID == 1) +#ifdef SL_SI91X_ACX_MODULE +#error "ULP_GPIO_10 is not available in module boards/OPNs!" +#else #define RTE_PWM_FAULTB_PORT 0 #define RTE_PWM_FAULTB_PIN 74 #define RTE_PWM_FAULTB_MUX 8 #define RTE_PWM_FAULTB_PAD 32 +#endif #else #error "Invalid RTE_PWM_FAULTB_PIN Pin Configuration!" #endif #else //Pintool data -#define RTE_PWM_FAULTB_PORT PWM_FAULTB_PORT +#define RTE_PWM_FAULTB_PORT 0 #if (PWM_FAULTB_LOC == 19) #define RTE_PWM_FAULTB_PIN PWM_FAULTB_PIN #define RTE_PWM_FAULTB_MUX 10 @@ -3864,7 +3872,7 @@ #define RTE_PWM_SLP_EVENT_TRIG_PIN 72 #else //Pintool data -#define RTE_PWM_SLP_EVENT_TRIG_PORT PWM_SLEEP_EVT_TRIG_PORT +#define RTE_PWM_SLP_EVENT_TRIG_PORT 0 #define RTE_PWM_SLP_EVENT_TRIG_PIN (PWM_SLEEP_EVT_TRIG_PIN + GPIO_MAX_PIN) //Pintool data #endif @@ -3900,7 +3908,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_1_PORT PWM_TMR_EXT_TRIG_1_PORT +#define RTE_PWM_TMR_EXT_TRIG_1_PORT 0 #if (PWM_EXTTRIG1_LOC == 22) #define RTE_PWM_TMR_EXT_TRIG_1_PIN PWM_TMR_EXT_TRIG_1_PIN #define RTE_PWM_TMR_EXT_TRIG_1_MUX 10 @@ -3948,7 +3956,7 @@ #endif #else //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_2_PORT PWM_TMR_EXT_TRIG_2_PORT +#define RTE_PWM_TMR_EXT_TRIG_2_PORT 0 #if (PWM_EXTTRIG2_LOC == 26) #define RTE_PWM_TMR_EXT_TRIG_2_PIN PWM_TMR_EXT_TRIG_2_PIN #define RTE_PWM_TMR_EXT_TRIG_2_MUX 10 @@ -3974,7 +3982,7 @@ //PWM_TMR_EXT_TRIG_3 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_3_PORT PWM_TMR_EXT_TRIG_3_PORT +#define RTE_PWM_TMR_EXT_TRIG_3_PORT 0 #if (PWM_EXTTRIG3_LOC == 30) #define RTE_PWM_TMR_EXT_TRIG_3_PIN PWM_TMR_EXT_TRIG_3_PIN #define RTE_PWM_TMR_EXT_TRIG_3_MUX 10 @@ -3994,7 +4002,7 @@ //PWM_TMR_EXT_TRIG_4 //Pintool data -#define RTE_PWM_TMR_EXT_TRIG_4_PORT PWM_TMR_EXT_TRIG_4_PORT +#define RTE_PWM_TMR_EXT_TRIG_4_PORT 0 #if (PWM_EXTTRIG4_LOC == 33) #define RTE_PWM_TMR_EXT_TRIG_4_PIN PWM_TMR_EXT_TRIG_4_PIN #define RTE_PWM_TMR_EXT_TRIG_4_MUX 10 @@ -4014,9 +4022,9 @@ //<> QEI (Quadrature Encode Interface) -//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_67 <4=>GPIO_71 <5=>GPIO_73 <6=>GPIO_11 <7=>GPIO_34 +//QEI_DIR <0=>GPIO_28 <1=>GPIO_49 <2=>GPIO_57 <3=>GPIO_71 <4=>GPIO_73 <5=>GPIO_11 <6=>GPIO_34 -#define RTE_QEI_DIR_PORT_ID 4 +#define RTE_QEI_DIR_PORT_ID 3 #if (RTE_QEI_DIR_PORT_ID == 0) #define RTE_QEI_DIR_PORT 0 @@ -4035,15 +4043,10 @@ #define RTE_QEI_DIR_PAD 21 #elif (RTE_QEI_DIR_PORT_ID == 3) #define RTE_QEI_DIR_PORT 0 -#define RTE_QEI_DIR_PIN 67 -#define RTE_QEI_DIR_MUX 3 -#define RTE_QEI_DIR_PAD 25 -#elif (RTE_QEI_DIR_PORT_ID == 4) -#define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 71 #define RTE_QEI_DIR_MUX 3 #define RTE_QEI_DIR_PAD 29 -#elif (RTE_QEI_DIR_PORT_ID == 5) +#elif (RTE_QEI_DIR_PORT_ID == 4) #define RTE_QEI_DIR_PORT 0 #define RTE_QEI_DIR_PIN 73 #define RTE_QEI_DIR_MUX 3 @@ -4120,9 +4123,11 @@ //QEI_PHB <0=>GPIO_27 <1=>GPIO_48 <1=>GPIO_56 <1=>GPIO_66 <1=>GPIO_70 <1=>GPIO_74 <7=>GPIO_33 #ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define RTE_QEI_PHB_PORT_ID 5 -#else +#ifdef SL_SI91X_ACX_MODULE #define RTE_QEI_PHB_PORT_ID 4 +#else +#define RTE_QEI_PHB_PORT_ID 5 +#endif #endif #if (RTE_QEI_PHB_PORT_ID == 0) @@ -4151,279 +4156,26 @@ #define RTE_QEI_PHB_MUX 3 #define RTE_QEI_PHB_PAD 28 #elif (RTE_QEI_PHB_PORT_ID == 5) +#ifdef SL_SI91X_ACX_MODULE +#error "ULP_GPIO_10 is not available in module boards/OPNs!" +#else #define RTE_QEI_PHB_PORT 0 #define RTE_QEI_PHB_PIN 74 #define RTE_QEI_PHB_MUX 3 #define RTE_QEI_PHB_PAD 32 -#else -#error "Invalid RTE_QEI_PHB_PIN Pin Configuration!" -#endif - -#endif - -//ADC START - -#ifndef ADC_P0_LOC -#define RTE_ADC_P0_PORT 0 -#define RTE_ADC_P0_PIN 0 -#else -#define RTE_ADC_P0_PORT ADC_P0_PORT -#define RTE_ADC_P0_PIN ADC_P0_PIN -#endif -#define RTE_ADC_P0_MUX 1 - -#ifndef ADC_N0_LOC -#define RTE_ADC_N0_PORT 0 -#define RTE_ADC_N0_PIN 1 -#else -#define RTE_ADC_N0_PORT ADC_N0_PORT -#define RTE_ADC_N0_PIN ADC_N0_PIN -#endif -#define RTE_ADC_N0_MUX 1 - -#ifndef ADC_P1_LOC -#define RTE_ADC_P1_PORT 0 -#define RTE_ADC_P1_PIN 2 -#else -#define RTE_ADC_P1_PORT ADC_P1_PORT -#define RTE_ADC_P1_PIN ADC_P1_PIN -#endif -#define RTE_ADC_P1_MUX 1 - -#ifndef ADC_N1_LOC -#define RTE_ADC_N1_PORT 0 -#define RTE_ADC_N1_PIN 3 -#else -#define RTE_ADC_N1_PORT ADC_N1_PORT -#define RTE_ADC_N1_PIN ADC_N1_PIN -#endif -#define RTE_ADC_N1_MUX 1 - -#ifndef ADC_P2_LOC -#define RTE_ADC_P2_PORT 0 -#define RTE_ADC_P2_PIN 4 -#else -#define RTE_ADC_P2_PORT ADC_P2_PORT -#define RTE_ADC_P2_PIN ADC_P2_PIN -#endif -#define RTE_ADC_P2_MUX 1 - -#ifndef ADC_N2_LOC -#define RTE_ADC_N2_PORT 0 -#define RTE_ADC_N2_PIN 5 -#else -#define RTE_ADC_N2_PORT ADC_N2_PORT -#define RTE_ADC_N2_PIN ADC_N2_PIN -#endif -#define RTE_ADC_N2_MUX 1 - -#ifndef ADC_P3_LOC -#define RTE_ADC_P3_PORT 0 -#define RTE_ADC_P3_PIN 6 -#else -#define RTE_ADC_P3_PORT ADC_P3_PORT -#define RTE_ADC_P3_PIN ADC_P3_PIN #endif -#define RTE_ADC_P3_MUX 1 - -#ifndef ADC_N3_LOC -#define RTE_ADC_N3_PORT 0 -#define RTE_ADC_N3_PIN 11 -#else -#define RTE_ADC_N3_PORT ADC_N3_PORT -#define RTE_ADC_N3_PIN ADC_N3_PIN -#endif -#define RTE_ADC_N3_MUX 1 - -#ifndef ADC_P4_LOC -#define RTE_ADC_P4_PORT 0 -#define RTE_ADC_P4_PIN 8 -#else -#define RTE_ADC_P4_PORT ADC_P4_PORT -#define RTE_ADC_P4_PIN ADC_P4_PIN -#endif -#define RTE_ADC_P4_MUX 1 - -#ifndef ADC_N4_LOC -#define RTE_ADC_N4_PORT 0 -#define RTE_ADC_N4_PIN 9 -#else -#define RTE_ADC_N4_PORT ADC_N4_PORT -#define RTE_ADC_N4_PIN ADC_N4_PIN -#endif -#define RTE_ADC_N4_MUX 1 - -#ifndef ADC_P5_LOC -#define RTE_ADC_P5_PORT 0 -#define RTE_ADC_P5_PIN 10 -#else -#define RTE_ADC_P5_PORT ADC_P5_PORT -#define RTE_ADC_P5_PIN ADC_P5_PIN -#endif -#define RTE_ADC_P5_MUX 1 - -#ifndef ADC_N5_LOC -#define RTE_ADC_N5_PORT 0 -#define RTE_ADC_N5_PIN 7 -#else -#define RTE_ADC_N5_PORT ADC_N5_PORT -#define RTE_ADC_N5_PIN ADC_N5_PIN -#endif -#define RTE_ADC_N5_MUX 1 - -#ifndef ADC_P6_LOC -#define RTE_ADC_P6_PORT 0 -#define RTE_ADC_P6_PIN 25 -#else -#define RTE_ADC_P6_PORT ADC_P6_PORT -#define RTE_ADC_P6_PIN ADC_P6_PIN -#endif -#define RTE_ADC_P6_MUX 1 -#define RTE_ADC_P6_PAD 0 - -#ifndef ADC_N6_LOC -#define RTE_ADC_N6_PORT 0 -#define RTE_ADC_N6_PIN 26 -#else -#define RTE_ADC_N6_PORT ADC_N6_PORT -#define RTE_ADC_N6_PIN ADC_N6_PIN -#endif -#define RTE_ADC_N6_MUX 1 -#define RTE_ADC_N6_PAD 0 - -#ifndef ADC_P7_LOC -#define RTE_ADC_P7_PORT 0 -#define RTE_ADC_P7_PIN 27 -#else -#define RTE_ADC_P7_PORT ADC_P7_PORT -#define RTE_ADC_P7_PIN ADC_P7_PIN -#endif -#define RTE_ADC_P7_MUX 1 -#define RTE_ADC_P7_PAD 0 - -#ifndef ADC_N7_LOC -#define RTE_ADC_N7_PORT 0 -#define RTE_ADC_N7_PIN 28 #else -#define RTE_ADC_N7_PORT ADC_N7_PORT -#define RTE_ADC_N7_PIN ADC_N7_PIN -#endif -#define RTE_ADC_N7_MUX 1 -#define RTE_ADC_N7_PAD 0 - -#ifndef ADC_P8_LOC -#define RTE_ADC_P8_PORT 0 -#define RTE_ADC_P8_PIN 29 -#else -#define RTE_ADC_P8_PORT ADC_P8_PORT -#define RTE_ADC_P8_PIN ADC_P8_PIN -#endif -#define RTE_ADC_P8_MUX 1 -#define RTE_ADC_P8_PAD 0 - -#ifndef ADC_N8_LOC -#define RTE_ADC_N8_PORT 0 -#define RTE_ADC_N8_PIN 30 -#else -#define RTE_ADC_N8_PORT ADC_N8_PORT -#define RTE_ADC_N8_PIN ADC_N8_PIN -#endif -#define RTE_ADC_N8_MUX 1 -#define RTE_ADC_N8_PAD 0 - -#ifndef ADC_P10_LOC -#define RTE_ADC_P10_PORT 0 -#define RTE_ADC_P10_PIN 1 -#else -#define RTE_ADC_P10_PORT ADC_P10_PORT -#define RTE_ADC_P10_PIN ADC_P10_PIN -#endif -#define RTE_ADC_P10_MUX 1 - -#ifndef ADC_P11_LOC -#define RTE_ADC_P11_PORT 0 -#define RTE_ADC_P11_PIN 3 -#else -#define RTE_ADC_P11_PORT ADC_P11_PORT -#define RTE_ADC_P11_PIN ADC_P11_PIN -#endif -#define RTE_ADC_P11_MUX 1 - -#ifndef ADC_P12_LOC -#define RTE_ADC_P12_PORT 0 -#define RTE_ADC_P12_PIN 5 -#else -#define RTE_ADC_P12_PORT ADC_P12_PORT -#define RTE_ADC_P12_PIN ADC_P12_PIN -#endif -#define RTE_ADC_P12_MUX 1 - -#ifndef ADC_P13_LOC -#define RTE_ADC_P13_PORT 0 -#define RTE_ADC_P13_PIN 11 -#else -#define RTE_ADC_P13_PORT ADC_P13_PORT -#define RTE_ADC_P13_PIN ADC_P13_PIN -#endif -#define RTE_ADC_P13_MUX 1 - -#ifndef ADC_P14_LOC -#define RTE_ADC_P14_PORT 0 -#define RTE_ADC_P14_PIN 9 -#else -#define RTE_ADC_P14_PORT ADC_P14_PORT -#define RTE_ADC_P14_PIN ADC_P14_PIN -#endif -#define RTE_ADC_P14_MUX 1 - -#ifndef ADC_P15_LOC -#define RTE_ADC_P15_PORT 0 -#define RTE_ADC_P15_PIN 7 -#else -#define RTE_ADC_P15_PORT ADC_P15_PORT -#define RTE_ADC_P15_PIN ADC_P15_PIN -#endif -#define RTE_ADC_P15_MUX 1 - -#ifndef ADC_P16_LOC -#define RTE_ADC_P16_PORT 0 -#define RTE_ADC_P16_PIN 26 -#else -#define RTE_ADC_P16_PORT ADC_P16_PORT -#define RTE_ADC_P16_PIN ADC_P16_PIN -#endif -#define RTE_ADC_P16_MUX 1 -#define RTE_ADC_P16_PAD 0 - -#ifndef ADC_P17_LOC -#define RTE_ADC_P17_PORT 0 -#define RTE_ADC_P17_PIN 28 -#else -#define RTE_ADC_P17_PORT ADC_P17_PORT -#define RTE_ADC_P17_PIN ADC_P17_PIN +#error "Invalid RTE_QEI_PHB_PIN Pin Configuration!" #endif -#define RTE_ADC_P17_MUX 1 -#define RTE_ADC_P17_PAD 0 -#ifndef ADC_P18_LOC -#define RTE_ADC_P18_PORT 0 -#define RTE_ADC_P18_PIN 30 -#else -#define RTE_ADC_P18_PORT ADC_P18_PORT -#define RTE_ADC_P18_PIN ADC_P18_PIN #endif -#define RTE_ADC_P18_MUX 1 -#define RTE_ADC_P18_PAD 0 - -//ADC END - //COMPARATOR START #ifndef COMP1_P0_LOC #define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN 0 #else -#define RTE_COMP1_P0_PORT COMP1_P0_PORT +#define RTE_COMP1_P0_PORT 0 #define RTE_COMP1_P0_PIN COMP1_P0_PIN #endif #define RTE_COMP1_P0_MUX 0 @@ -4432,7 +4184,7 @@ #define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN 1 #else -#define RTE_COMP1_N0_PORT COMP1_N0_PORT +#define RTE_COMP1_N0_PORT 0 #define RTE_COMP1_N0_PIN COMP1_N0_PIN #endif #define RTE_COMP1_N0_MUX 0 @@ -4441,7 +4193,7 @@ #define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN 5 #else -#define RTE_COMP1_P1_PORT COMP1_P1_PORT +#define RTE_COMP1_P1_PORT 0 #define RTE_COMP1_P1_PIN COMP1_P1_PIN #endif #define RTE_COMP1_P1_MUX 0 @@ -4450,7 +4202,7 @@ #define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN 4 #else -#define RTE_COMP1_N1_PORT COMP1_N1_PORT +#define RTE_COMP1_N1_PORT 0 #define RTE_COMP1_N1_PIN COMP1_N1_PIN #endif #define RTE_COMP1_N1_MUX 0 @@ -4459,7 +4211,7 @@ #define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN 2 #else -#define RTE_COMP2_P0_PORT COMP2_P0_PORT +#define RTE_COMP2_P0_PORT 0 #define RTE_COMP2_P0_PIN COMP2_P0_PIN #endif #define RTE_COMP2_P0_MUX 0 @@ -4468,7 +4220,7 @@ #define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN 3 #else -#define RTE_COMP2_N0_PORT COMP2_N0_PORT +#define RTE_COMP2_N0_PORT 0 #define RTE_COMP2_N0_PIN COMP2_N0_PIN #endif #define RTE_COMP2_N0_MUX 0 @@ -4477,7 +4229,7 @@ #define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN 27 #else -#define RTE_COMP2_P1_PORT COMP2_P1_PORT +#define RTE_COMP2_P1_PORT 0 #define RTE_COMP2_P1_PIN COMP2_P1_PIN #endif #define RTE_COMP2_P1_MUX 0 @@ -4487,7 +4239,7 @@ #define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN 28 #else -#define RTE_COMP2_N1_PORT COMP2_N1_PORT +#define RTE_COMP2_N1_PORT 0 #define RTE_COMP2_N1_PIN COMP2_N1_PIN #endif #define RTE_COMP2_N1_MUX 0 @@ -4695,18 +4447,9 @@ #error "Invalid RTE_ULP_GPIO_2_PIN Pin Configuration!" #endif -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER #define RTE_ULP_GPIO_3_PORT_ID 1 -#else -#define RTE_ULP_GPIO_3_PORT_ID 0 -#endif -#if (RTE_ULP_GPIO_3_PORT_ID == 0) -#define RTE_ULP_GPIO_3_PORT 0 -#define RTE_ULP_GPIO_3_PAD 25 -#define RTE_ULP_GPIO_3_PIN 67 -#define RTE_ULP_GPIO_3_MODE 0 -#elif (RTE_ULP_GPIO_3_PORT_ID == 1) +#if (RTE_ULP_GPIO_3_PORT_ID == 1) #define RTE_ULP_GPIO_3_PORT 4 #define RTE_ULP_GPIO_3_PIN 3 #define RTE_ULP_GPIO_3_MODE 0 @@ -4835,10 +4578,14 @@ #endif #if (RTE_ULP_GPIO_10_PORT_ID == 0) +#ifdef SL_SI91X_ACX_MODULE +#error "ULP_GPIO_10 is not available in module boards/OPNs!" +#else #define RTE_ULP_GPIO_10_PORT 4 #define RTE_ULP_GPIO_10_PAD 32 #define RTE_ULP_GPIO_10_PIN 74 #define RTE_ULP_GPIO_10_MODE 0 +#endif #elif (RTE_ULP_GPIO_10_PORT_ID == 1) #define RTE_ULP_GPIO_10_PORT 4 #define RTE_ULP_GPIO_10_PIN 10 @@ -4891,11 +4638,17 @@ #define RTE_UULP_GPIO_5_MODE 0 // UULP GPIO as enable pin for sensors +#ifdef SL_SI91X_ACX_MODULE +#define SENSOR_ENABLE_GPIO_MAPPED_TO_ULP +#define SENSOR_ENABLE_GPIO_PORT RTE_ULP_GPIO_2_PORT +#define SENSOR_ENABLE_GPIO_PIN RTE_ULP_GPIO_2_PIN +#else #define SENSOR_ENABLE_GPIO_MAPPED_TO_UULP #define SENSOR_ENABLE_GPIO_PIN RTE_UULP_GPIO_1_PIN +#endif // Memlcd GPIOs -#ifdef SL_SI91X_MODULE_BOARD +#ifdef SL_SI91X_ACX_MODULE #define RTE_MEMLCD_CS_PIN 4 // Memlcd SPI CS pin #define RTE_MEMLCD_CS_PORT 0 // Memlcd SPI CS port diff --git a/components/device/silabs/si91x/mcu/core/chip/config/pin_config.h b/components/device/silabs/si91x/mcu/core/chip/config/pin_config.h index ab6a56743..60a6a7d20 100644 --- a/components/device/silabs/si91x/mcu/core/chip/config/pin_config.h +++ b/components/device/silabs/si91x/mcu/core/chip/config/pin_config.h @@ -25,8 +25,8 @@ // $[SSI_SLAVE] // [SSI_SLAVE]$ -// $[ULP_SPI] -// [ULP_SPI]$ +// $[ULP_SSI] +// [ULP_SSI]$ // $[GSPI_MASTER] // [GSPI_MASTER]$ @@ -46,8 +46,74 @@ // $[PWM] // [PWM]$ -// $[ADC] -// [ADC]$ +// $[PWM_CH0] +// [PWM_CH0]$ + +// $[PWM_CH1] +// [PWM_CH1]$ + +// $[PWM_CH2] +// [PWM_CH2]$ + +// $[PWM_CH3] +// [PWM_CH3]$ + +// $[ADC_CH1] +// [ADC_CH1]$ + +// $[ADC_CH2] +// [ADC_CH2]$ + +// $[ADC_CH3] +// [ADC_CH3]$ + +// $[ADC_CH4] +// [ADC_CH4]$ + +// $[ADC_CH5] +// [ADC_CH5]$ + +// $[ADC_CH6] +// [ADC_CH6]$ + +// $[ADC_CH7] +// [ADC_CH7]$ + +// $[ADC_CH8] +// [ADC_CH8]$ + +// $[ADC_CH9] +// [ADC_CH9]$ + +// $[ADC_CH10] +// [ADC_CH10]$ + +// $[ADC_CH11] +// [ADC_CH11]$ + +// $[ADC_CH12] +// [ADC_CH12]$ + +// $[ADC_CH13] +// [ADC_CH13]$ + +// $[ADC_CH14] +// [ADC_CH14]$ + +// $[ADC_CH15] +// [ADC_CH15]$ + +// $[ADC_CH16] +// [ADC_CH16]$ + +// $[ADC_CH17] +// [ADC_CH17]$ + +// $[ADC_CH18] +// [ADC_CH18]$ + +// $[ADC_CH19] +// [ADC_CH19]$ // $[COMP1] // [COMP1]$ @@ -61,6 +127,15 @@ // $[DAC1] // [DAC1]$ +// $[SYSRTC] +// [SYSRTC]$ + +// $[UULP_VBAT_GPIO] +// [UULP_VBAT_GPIO]$ + +// $[GPIO] +// [GPIO]$ + // $[CUSTOM_PIN_NAME] #ifndef _PORT #define _PORT 0 diff --git a/components/device/silabs/si91x/mcu/core/chip/config/sl_si91x_external_oscillator.h b/components/device/silabs/si91x/mcu/core/chip/config/sl_si91x_external_oscillator.h new file mode 100644 index 000000000..df6e23c70 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/chip/config/sl_si91x_external_oscillator.h @@ -0,0 +1,49 @@ +/******************************************************************************* + * @file sl_si91x_external_oscillator.h + * @brief + ******************************************************************************* + * # License + * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * The licensor of this software is Silicon Laboratories Inc. Your use of this + * software is governed by the terms of Silicon Labs Master Software License + * Agreement (MSLA) available at + * www.silabs.com/about-us/legal/master-software-license-agreement. This + * software is distributed to you in Source Code format and is governed by the + * sections of the MSLA applicable to Source Code. + * + ******************************************************************************/ +#ifndef __SL_SI91X_EXTERANAL_OSCILLATOR__ +#define __SL_SI91X_EXTERANAL_OSCILLATOR__ + +// <<< Use Configuration Wizard in Context Menu >>> +// External Oscillator Configuration on UULP GPIOs + +// UULP_GPIO_NUMBER +// 1 +// 2 +// 3 +// 4 +// Default: UULP_GPIO_3 + +#define UULP_GPIO_1 1 +#define UULP_GPIO_2 2 +#define UULP_GPIO_3 3 +#define UULP_GPIO_4 4 +#define OSC_UULP_GPIO UULP_GPIO_3 + +#if (OSC_UULP_GPIO == 1) +#define UULP_GPIO_OSC_MODE 3 +#elif (OSC_UULP_GPIO == 2) +#define UULP_GPIO_OSC_MODE 4 +#elif (OSC_UULP_GPIO == 3) +#define UULP_GPIO_OSC_MODE 5 +#elif (OSC_UULP_GPIO == 4) +#define UULP_GPIO_OSC_MODE 6 +#endif + +// +// <<< end of configuration section >>> + +#endif //__SL_SI91X_EXTERANAL_OSCILLATOR__ diff --git a/components/device/silabs/si91x/mcu/core/chip/inc/system_si91x.h b/components/device/silabs/si91x/mcu/core/chip/inc/system_si91x.h index 7ed339e12..a5fdc7b33 100644 --- a/components/device/silabs/si91x/mcu/core/chip/inc/system_si91x.h +++ b/components/device/silabs/si91x/mcu/core/chip/inc/system_si91x.h @@ -70,6 +70,7 @@ typedef enum SLEEP_TYPE { #define DEFAULT_BYP_RC_CLOCK 32000000 #define DEFAULT_I2S_PLL_CLOCK 0 #define DEFAULT_REF_CLOCK 2 +#define MAX_INTF_PLL_FREQUENCY 180000000 /* Selecting the PLL reference clock */ /* 0 - XTAL_CLK, 1 - Reserved, 2 - RC_32MHZ_CLK, 3 - Reserved */ diff --git a/components/device/silabs/si91x/mcu/core/chip/src/rsi_deepsleep_soc.c b/components/device/silabs/si91x/mcu/core/chip/src/rsi_deepsleep_soc.c index bd92052bc..664536964 100644 --- a/components/device/silabs/si91x/mcu/core/chip/src/rsi_deepsleep_soc.c +++ b/components/device/silabs/si91x/mcu/core/chip/src/rsi_deepsleep_soc.c @@ -56,10 +56,6 @@ extern void set_scdc(uint32_t Deepsleep); #ifdef SLI_SI91X_MCU_ENABLE_PSRAM_FEATURE #include "sl_si91x_psram_config.h" -#if PSRAM_HALF_SLEEP_SUPPORTED != FALSE -extern sl_psram_return_type_t sl_si91x_psram_sleep(void); -extern sl_psram_return_type_t sl_si91x_psram_wakeup(void); -#endif #endif uint32_t nvic_enable[MAX_NVIC_REGS] = { 0 }; diff --git a/components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c b/components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c index a07278a48..72a493470 100644 --- a/components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c +++ b/components/device/silabs/si91x/mcu/core/chip/src/startup_si91x.c @@ -60,7 +60,7 @@ extern unsigned long _edata; /*!< End address for the .data section extern unsigned long __bss_start__; /*!< Start address for the .bss section */ extern unsigned long __bss_end__; /*!< End address for the .bss section */ -#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_ENABLE_PSRAM_SECTION_FEATURE == ENABLE) +#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_PSRAM_PRESENT == ENABLE) extern unsigned long _slpcode; /*!< Start address for the initialization values of the .sleep_psram_driver section. */ extern unsigned long _scode; /*!< Start address for the .sleep_psram_driver section */ @@ -210,7 +210,7 @@ void Copy_Table(void) for (pulDest = &_sdata; pulDest < &_edata;) { *(pulDest++) = *(pulSrc++); } -#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_ENABLE_PSRAM_SECTION_FEATURE == ENABLE) +#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_PSRAM_PRESENT == ENABLE) /* Copy the sleep PSRAM driver segment to SRAM */ pulSrc = &_slpcode; for (pulDest = &_scode; pulDest < &_ecode;) { @@ -244,11 +244,6 @@ void RSI_Default_Reset_Handler(void) /* Zero fill the bss segment */ Zero_Table(); - /*if C++ compilation required */ -#ifdef SUPPORT_CPLUSPLUS - extern void __libc_init_array(void); - __libc_init_array(); -#endif #if defined(SLI_SI91X_MCU_ENABLE_RAM_BASED_EXECUTION) //copying the vector table from flash to ram memcpy(ram_vector, (uint32_t *)SCB->VTOR, sizeof(__VECTOR_TABLE)); @@ -257,6 +252,13 @@ void RSI_Default_Reset_Handler(void) #endif /*Init system level initializations */ SystemInit(); + /* This macro enables support for C++ linkage in the startup code. */ +#ifdef SUPPORT_CPLUSPLUS + /* Initialize global and static C++ objects. This function must be called after SystemInit() to ensure that the hardware is + properly initialized before any global or static constructors are executed. */ + extern void __libc_init_array(void); + __libc_init_array(); +#endif /* Call the application's entry point.*/ main(); } diff --git a/components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c b/components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c index cb310a6bb..cebc31b36 100644 --- a/components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c +++ b/components/device/silabs/si91x/mcu/core/chip/src/system_si91x.c @@ -30,9 +30,15 @@ #include "rsi_ulpss_clk.h" #include "rsi_rom_ulpss_clk.h" #include "rsi_rom_clks.h" -#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_ENABLE_PSRAM_SECTION_FEATURE == ENABLE) +#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_PSRAM_PRESENT == ENABLE) #include "rsi_d_cache.h" #endif + +#if defined(SI91X_32kHz_EXTERNAL_OSCILLATOR) +#include "sl_si91x_external_oscillator.h" +#define MCU_RETENTION_BASE_ADDRESS 0x24048600 +#define NPSS_GPIO_CTRL (MCU_RETENTION_BASE_ADDRESS + 0x1C) +#endif /*---------------------------------------------------------------------------- Define clocks *----------------------------------------------------------------------------*/ @@ -95,7 +101,7 @@ void SystemCoreClockUpdate(void) /* Get Core Clock Frequency */ package_type = PACKAGE_TYPE_WMCU; } #endif -#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_ENABLE_PSRAM_SECTION_FEATURE == ENABLE) +#if defined(NO_DATA_SEGMENT_IN_PSRAM) && (SLI_SI91X_MCU_PSRAM_PRESENT == ENABLE) rsi_d_cache_invalidate_all(); #endif /*Initialize IPMU and MCU FSM blocks */ @@ -116,13 +122,19 @@ void SystemCoreClockUpdate(void) /* Get Core Clock Frequency */ /* Configuring MCU FSM clock for BG_PMU */ RSI_IPMU_ClockMuxSel(2); -#if defined(SL_SI91X_MODULE_BOARD) - /* Configuring RC 32KHz Clock for LF-FSM*/ +#if defined(SI91X_32kHz_EXTERNAL_OSCILLATOR) + + // Configuring the UULP_GPIOs for external oscillator + *(volatile uint32 *)(NPSS_GPIO_CTRL + (4 * OSC_UULP_GPIO)) = (BIT(3) | UULP_GPIO_OSC_MODE); + MCUAON_GEN_CTRLS_REG |= BIT(0); + MCUAON_GEN_CTRLS_REG; + + // Configuring RC 32KHz Clock for LF-FSM RSI_PS_FsmLfClkSel(KHZ_RC_CLK_SEL); #else /* Configuring XTAL 32.768kHz Clock for LF-FSM */ RSI_PS_FsmLfClkSel(KHZ_XTAL_CLK_SEL); -#endif // SL_SI91X_MODULE_BOARD +#endif // SI91X_32kHz_EXTERNAL_OSCILLATOR /* Configuring RC-32MHz Clock for HF-FSM */ RSI_PS_FsmHfClkSel(FSM_32MHZ_RC); diff --git a/components/device/silabs/si91x/mcu/core/common/component/si91x_debug.slcc b/components/device/silabs/si91x/mcu/core/common/component/si91x_debug.slcc index 1e67a65db..305669321 100644 --- a/components/device/silabs/si91x/mcu/core/common/component/si91x_debug.slcc +++ b/components/device/silabs/si91x/mcu/core/common/component/si91x_debug.slcc @@ -21,7 +21,7 @@ define: value: "1" unless: [sl_ulp_uart] - {"name":"ENABLE_DEBUG_MODULE","value":1} -- {"name": "DEBUG_ENABLE","value":1} +- {"name":"DEBUG_ENABLE","value":1} template_contribution: - name: event_handler value: @@ -29,3 +29,5 @@ template_contribution: include: rsi_debug.h handler: DEBUGINIT priority: -9995 +ui_hints: + visibility: never \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/core/common/component/si91x_debug_uc.slcc b/components/device/silabs/si91x/mcu/core/common/component/si91x_debug_uc.slcc new file mode 100644 index 000000000..783d34639 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/common/component/si91x_debug_uc.slcc @@ -0,0 +1,17 @@ +id: si91x_debug_uc +package: wiseconnect3_sdk +description: > + "Provides application prints functionality to the Si91x, configuration options for Debug UART instance and the baudrate" +label: Debug UC +category: Device|Si91x|MCU|Common +quality: production +component_root_path: components/device/silabs/si91x/mcu/core/common +config_file: + - path: config/sl_si91x_debug_uc_1_config.h + unless: [sl_ulp_uart] + - path: config/sl_si91x_debug_uc_2_config.h + condition: [sl_ulp_uart] +provides: +- name: si91x_debug_uc +define: +- name: DEBUG_UART_UC \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_calendar_config.h b/components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_1_config.h similarity index 54% rename from components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_calendar_config.h rename to components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_1_config.h index b689c30b8..24c89383a 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_calendar_config.h +++ b/components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_1_config.h @@ -1,9 +1,9 @@ /***************************************************************************/ /** - * @file sl_si91x_calendar_config.h - * @brief Calendar configuration file. + * @file sl_si91x_debug_uc_1_config.h + * @brief Debug configuration file. ******************************************************************************* * # License - * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com ******************************************************************************* * * SPDX-License-Identifier: Zlib @@ -28,43 +28,40 @@ * ******************************************************************************/ -#ifndef SL_SI91X_CALENDAR_CONFIG_H -#define SL_SI91X_CALENDAR_CONFIG_H +#ifndef SL_SI91X_DEBUG_UC_1_CONFIG_H +#define SL_SI91X_DEBUG_UC_1_CONFIG_H +/******************************* Debug UART Configuration **************************/ // <<< Use Configuration Wizard in Context Menu >>> -// Clock Configuration +// Debug Configuration -#define CALENDAR_RO_CLOCK 1 -#define CALENDAR_RC_CLOCK 2 -#define CALENDAR_XTAL_CLOCK 4 +// Enable/Disable Debug Configuration +// Enable: Enables the Debug logging +// Disable: Disables the Debug logging +#define DEBUG_UART_ENABLE 1 +#if (DEBUG_UART_ENABLE == 1) +#define DEBUG_UART 1 +#else +#undef DEBUG_UART +#endif -// CALENDAR UC Configuration -// Enable: Peripheral configuration is taken straight from the configuration set in the universal configuration (UC). -// Disable: If the application demands it to be modified during runtime, use the sl_si91x_calendar_set_configuration API to modify the peripheral configuration. -// Default: 1 -#define CALENDAR_UC 1 +#define SL_M4_USART0_INSTANCE 1 +#define SL_M4_UART1_INSTANCE 2 +#define SL_ULP_UART_INSTANCE 3 -// Clock Source -// RC Clock -// RO Clock -// XTAL Clock -// Selection of the Calendar CLK Type. -#define CALENDAR_CLOCK_TYPE CALENDAR_RC_CLOCK +// Instance +// UART0/USART0 +// UART1 +// ULP UART +// Default: ULP UART +#define SL_DEBUG_INSTANCE SL_ULP_UART_INSTANCE -// +// Baud Rate (Baud/Second) <300-7372800> +// Default: 115200 +#define SL_DEBUG_BAUD_RATE 115200 +// // // <<< end of configuration section >>> -// Structure to get value of clock config from user -typedef struct config { - uint8_t calendar_clock_type; -} config_t; - -#if (CALENDAR_CLOCK_TYPE) -config_t configuration = { - .calendar_clock_type = CALENDAR_CLOCK_TYPE, -}; -#endif - -#endif /* SL_SI91X_CALENDAR_CONFIG_H */ +#endif /* SL_SI91X_DEBUG_UC_1_CONFIG_H */ diff --git a/components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_2_config.h b/components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_2_config.h new file mode 100644 index 000000000..733405113 --- /dev/null +++ b/components/device/silabs/si91x/mcu/core/common/config/sl_si91x_debug_uc_2_config.h @@ -0,0 +1,66 @@ +/***************************************************************************/ /** + * @file sl_si91x_debug_uc_2_config.h + * @brief Debug configuration file. + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +#ifndef SL_SI91X_DEBUG_UC_2_CONFIG_H +#define SL_SI91X_DEBUG_UC_2_CONFIG_H + +/******************************* Debug UART Configuration **************************/ +// <<< Use Configuration Wizard in Context Menu >>> +// Debug Configuration + +// Enable/Disable Debug Configuration +// Enable: Enables the Debug logging +// Disable: Disables the Debug logging +#define DEBUG_UART_ENABLE 0 +#if (DEBUG_UART_ENABLE == 1) +#define DEBUG_UART 1 +#else +#undef DEBUG_UART +#endif + +#define SL_M4_USART0_INSTANCE 1 +#define SL_M4_UART1_INSTANCE 2 + +// Instance (ULP UART is being used) +// UART0/USART0 +// UART1 +// Default: UART0/USART0 +// Uninstall ULP UART to use it for debug logging +#define SL_DEBUG_INSTANCE SL_M4_USART0_INSTANCE + +// Baud Rate (Baud/Second) <300-7372800> +// Default: 115200 +#define SL_DEBUG_BAUD_RATE 115200 + +// +// +// <<< end of configuration section >>> + +#endif /* SL_SI91X_DEBUG_UC_2_CONFIG_H */ diff --git a/components/device/silabs/si91x/mcu/core/common/inc/rsi_debug.h b/components/device/silabs/si91x/mcu/core/common/inc/rsi_debug.h index 30eeccf7c..b5500a2a6 100644 --- a/components/device/silabs/si91x/mcu/core/common/inc/rsi_debug.h +++ b/components/device/silabs/si91x/mcu/core/common/inc/rsi_debug.h @@ -21,6 +21,13 @@ #include #include #include "rsi_ccp_user_config.h" +#ifdef DEBUG_UART_UC +#ifndef SL_SI91X_ULP_UART +#include "sl_si91x_debug_uc_1_config.h" +#else +#include "sl_si91x_debug_uc_2_config.h" +#endif +#endif #ifdef __cplusplus extern "C" { @@ -31,6 +38,7 @@ void Board_Debug_Init(void); void Board_UARTPutSTR(const uint8_t *ptr); uint8_t Board_UARTGetChar(void); void Board_UARTPutChar(uint8_t ch); +void dummy_printf(const char *fmt, ...); #ifndef IOSTREAM_USART #ifdef DEBUG_UART @@ -40,8 +48,8 @@ void Board_UARTPutChar(uint8_t ch); #define DEBUGIN() Board_UARTGetChar() #else #define DEBUGINIT() -#define DEBUGOUT(...) -#define DEBUGSTR(str) +#define DEBUGOUT(...) dummy_printf(__VA_ARGS__) +#define DEBUGSTR(str) (void)str #define DEBUGIN() #endif #else @@ -53,4 +61,4 @@ void Board_UARTPutChar(uint8_t ch); } #endif -#endif // __RSI_DEBUG_H__ \ No newline at end of file +#endif // __RSI_DEBUG_H__ diff --git a/components/device/silabs/si91x/mcu/core/common/si91x_debug.slcc b/components/device/silabs/si91x/mcu/core/common/si91x_debug.slcc index d5baf5d9c..002cb2254 100644 --- a/components/device/silabs/si91x/mcu/core/common/si91x_debug.slcc +++ b/components/device/silabs/si91x/mcu/core/common/si91x_debug.slcc @@ -11,7 +11,8 @@ provides: source: - path: src/rsi_debug.c include: -- path: {"path":"inc/rsi_debug.h"} +- path: inc +- path: config define: - name: DEBUG_UART - name: ENABLE_DEBUG_MODULE diff --git a/components/device/silabs/si91x/mcu/core/common/src/rsi_debug.c b/components/device/silabs/si91x/mcu/core/common/src/rsi_debug.c index d5c6375d4..6902224ca 100644 --- a/components/device/silabs/si91x/mcu/core/common/src/rsi_debug.c +++ b/components/device/silabs/si91x/mcu/core/common/src/rsi_debug.c @@ -15,6 +15,7 @@ * ******************************************************************************/ +#include #include "rsi_debug.h" #include "USART.h" #include "rsi_ccp_common.h" @@ -27,33 +28,28 @@ osMutexId_t si91x_prints_mutex = NULL; void ARM_UART_SignalEvent(uint32_t event); extern void cache_uart_rx_data(const char character); -#ifdef SLI_SI91X_MCU_CONFIG_RADIO_BOARD_BASE_VER -#define M4_UART1_INSTANCE 0U //!Select m4 uart1 for prints -#if defined(SLI_SI91X_MCU_CONFIG_RADIO_BOARD_VER2) -#define ULP_UART_INSTANCE 1U //!Select m4 uart2 for prints -#else -#define M4_UART2_INSTANCE 1U //!Select ulp uart for prints -#endif -#else -#define M4_UART1_INSTANCE 1U //!Select m4 uart1 for prints -#define M4_UART2_INSTANCE 0U //!Select m4 uart2 for prints -#define ULP_UART_INSTANCE 0U //!Select ulp uart for prints -#endif -#define BOARD_BAUD_VALUE 115200 //UART baud rate -#if defined(M4_UART1_INSTANCE) && (M4_UART1_INSTANCE == 1) +#ifdef DEBUG_UART_UC +#define BOARD_BAUD_VALUE SL_DEBUG_BAUD_RATE //UART baud rate + +#if (SL_DEBUG_INSTANCE == SL_M4_USART0_INSTANCE) +#define M4_UART1_INSTANCE 1U //!Select m4 uart1 for prints. To overcome backward compatibility extern ARM_DRIVER_USART Driver_USART0; static ARM_DRIVER_USART *UARTdrv = &Driver_USART0; -#endif - -#if defined(M4_UART2_INSTANCE) && (M4_UART2_INSTANCE == 1) +#elif (SL_DEBUG_INSTANCE == SL_M4_UART1_INSTANCE) +#define M4_UART2_INSTANCE 1U //!Select m4 uart2 for prints. To overcome backward compatibility extern ARM_DRIVER_USART Driver_UART1; static ARM_DRIVER_USART *UARTdrv = &Driver_UART1; +#elif (SL_DEBUG_INSTANCE == SL_ULP_UART_INSTANCE) +#define ULP_UART_INSTANCE 1U //!Select ULP UART for prints. To overcome backward compatibility +extern ARM_DRIVER_USART Driver_ULP_UART; +static ARM_DRIVER_USART *UARTdrv = &Driver_ULP_UART; #endif - -#if defined(ULP_UART_INSTANCE) && (ULP_UART_INSTANCE == 1) +#else +#define ULP_UART_INSTANCE 1U //!Select ULP UART for prints. To overcome backward compatibility extern ARM_DRIVER_USART Driver_ULP_UART; static ARM_DRIVER_USART *UARTdrv = &Driver_ULP_UART; +#define BOARD_BAUD_VALUE 115200 //UART baud rate #endif ARM_USART_CAPABILITIES drv_ulp_capabilities; @@ -463,3 +459,17 @@ size_t __write(int handle, const unsigned char *buffer, size_t size) #endif #endif /* defined (__ICCARM__) */ + +/** + * @fn void dummy_printf(const char *fmt, ...) + * @brief It does nothing but used when DEBUG_UART is not defined, to avoid compilation errors. + * @param[in] fmt: format string + * @return none + */ +void dummy_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + // Do Nothing + va_end(args); +} diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.c deleted file mode 100644 index 679a2a27d..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.c +++ /dev/null @@ -1,982 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2016 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - * - * $Date: 02. March 2016 - * $Revision: V1.1 - * - * Driver: Driver_CAN1 - * Configured: via RTE_Device.h configuration file - * Project: CAN Driver for Silicon Labs MCU - * -------------------------------------------------------------------------- - * Use the following configuration settings in the middleware component - * to connect to this driver. - * - * Configuration Setting Value CAN Interface - * --------------------- ----- ------------- - * Connect to hardware via Driver_CAN# = 1 use CAN1 - * -------------------------------------------------------------------------- - * Defines used for driver configuration (at compile time): - * - * CAN_CLOCK_TOLERANCE: defines maximum allowed clock tolerance in 1/1024 steps - * - default value: 15 (approx. 1.5 %) - * CAN0_OBJ_NUM: number of message objects used by CAN0 controller - * this value can be reduced to save some RAM space - * - default value: 2 (also this is maximum value) - * CAN1_OBJ_NUM: number of message objects used by CAN1 controller - * this value can be reduced to save some RAM space - * - default value: 2 (also this is maximum value) - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * Initial release - */ -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) -#include "CAN.h" -#if RTE_CAN1 -// Externally overridable configuration definitions - -// Maximum allowed clock tolerance in 1/1024 steps -#ifndef CAN_CLOCK_TOLERANCE -#define CAN_CLOCK_TOLERANCE (15U) ///< 15/1024 approx. 1.5 % -#endif - -// Maximum number of Message Objects used for CAN1 controller -#ifndef CAN1_OBJ_NUM -#define CAN1_OBJ_NUM (2U) ///< Number of CAN objects -#endif -#if (CAN1_OBJ_NUM > 2U) -#error Too many Message Objects defined for CAN1, maximum number of Message Objects is 32 !!! -#endif - -#define CAN_IRQ_NUM (CAN1_IRQn) ///< CAN IRQ number - -// CAN Driver ****************************************************************** - -#define ARM_CAN_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,1) ///< CAN driver version - -// Driver Version -static const ARM_DRIVER_VERSION can_driver_version = { ARM_CAN_API_VERSION, ARM_CAN_DRV_VERSION }; - -// Driver Capabilities -static const ARM_CAN_CAPABILITIES can_driver_capabilities = { - CAN1_OBJ_NUM, ///< Number of CAN Objects available - 1U, // Supports reentrant calls to ARM_CAN_MessageSend, ARM_CAN_MessageRead, ARM_CAN_ObjectConfigure and abort message sending used by ARM_CAN_Control. - 0U, // Does not support CAN with Flexible Data-rate mode (CAN_FD) - 0U, // Does not support restricted operation mode - 1U, // Supports bus monitoring mode - 0U, // Supports internal loopback mode - 0U, // Supports external loopback mode -}; - -// Object Capabilities -static const ARM_CAN_OBJ_CAPABILITIES can_object_capabilities_rx = { - 0U, // Object does not support transmission - 1U, // Object supports reception - 0U, // Object does not support RTR reception and automatic Data transmission - 0U, // Object does not support RTR transmission and automatic Data reception - 0U, // Object allows assignment of multiple filters to it - 1U, // Object supports exact identifier filtering - 1U, // Object supports range identifier filtering - 1U, // Object does not support mask identifier filtering - 5U // Object can buffer 5 messages -}; -static const ARM_CAN_OBJ_CAPABILITIES can_object_capabilities_tx = { - 1U, // Object supports transmission - 0U, // Object does not support reception - 0U, // Object does not support RTR reception and automatic Data transmission - 0U, // Object does not support RTR transmission and automatic Data reception - 0U, // Object does not allow assignment of multiple filters to it - 0U, // Object does not support exact identifier filtering - 0U, // Object does not support range identifier filtering - 0U, // Object does not support mask identifier filtering - 1U // Object can buffer 1 message -}; - -// Local variables and structures -static uint8_t can_driver_powered = 0U; -static uint8_t can_driver_initialized = 0U; -static ARM_CAN_SignalUnitEvent_t CAN_SignalUnitEvent = NULL; -static ARM_CAN_SignalObjectEvent_t CAN_SignalObjectEvent = NULL; -static uint8_t can_obj_cfg_msk = 0U; -static uint8_t can_last_error_code = 0U; -/* CAN PIN configuration structure*/ -static const CAN_PIN can_pins[] = { - { RTE_CAN1_TX_PORT , RTE_CAN1_TX_PIN , RTE_CAN1_TX_MODE , RTE_CAN1_TX_PAD_SEL }, - { RTE_CAN1_RX_PORT , RTE_CAN1_RX_PIN , RTE_CAN1_RX_MODE , RTE_CAN1_TX_PAD_SEL }, -}; - - -// Helper Functions - -/** - @fn void CAN_SetHwModeConfig(CAN_HW_MODE_CONFIG mode) - @brief Configures the CAN hardware mode - @param[in] mode CAN operational mode - - \ref CAN_HW_RESET_MODE_CONFIG : CAN configure in reset mode - - \ref CAN_HW_NORMAL_MODE_CONFIG : CAN configure in normal mode - - \ref CAN_HW_LISTEN_ONLY_MODE_CONFIG : CAN configure in listen only mode - - \ref CAN_HW_DUAL_FILTER_MODE_CONFIG : CAN configure in dual filter mode - - \ref CAN_HW_SINGLE_FILTER_MODE_CONFIG : CAN configure in single filter mode - - \ref CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE : CAN enable configuration in hardware acceptance for single filter mode - - \ref CAN_HW_ACCEPTANCE_DUAL_FILTER_MODE_CONFIG_ENABLE : CAN enable configuration in hardware acceptance for dual filter mode - @return none -*/ -static void CAN_SetHwModeConfig(CAN_HW_MODE_CONFIG mode) -{ - switch(mode){ - case CAN_HW_RESET_MODE_CONFIG: // Keep DCAN in RESET mode - CAN1->CAN_MR = 0x04; - break ; - case CAN_HW_NORMAL_MODE_CONFIG: // Keep DCAN in RESET mode - CAN1->CAN_MR = 0x04; - CAN1->CAN_MR = 0x00; - break ; - case CAN_HW_LISTEN_ONLY_MODE_CONFIG: // Keep CAN in soft RESET operating mode to get the write access to AFM bit - CAN1->CAN_MR = 0x04; - CAN1->CAN_MR = 0x02; // Set standard single filter mode - break ; - case CAN_HW_DUAL_FILTER_MODE_CONFIG: // Dual filter mode configuration set - CAN1->CAN_MR = 0x04; - break ; - case CAN_HW_SINGLE_FILTER_MODE_CONFIG: //Single filter mode configuration set - CAN1->CAN_MR = 0x04; // Set CAN in RESET mode - CAN1->CAN_MR = 0x05; // Set standard single filter mode - break ; - case CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE: // Enable single filter mode configuration for filters - CAN1->CAN_MR = 0x01; - break; - case CAN_HW_ACCEPTANCE_DUAL_FILTER_MODE_CONFIG_ENABLE: // Enable dual filter mode configuration for filters - CAN1->CAN_MR = 0x00; - break; - default : - break ; - } -} - -/** - @fn int32_t CAN_AddHwFilter (CAN_FILTER_TYPE filter_type, uint32_t id, uint32_t mask) { - @brief Add filter for message reception. - @param[in] filter_type Operation on filter - - \ref CAN_FILTER_TYPE_EXACT_ID : add exact id filter - - \ref CAN_FILTER_TYPE_MASKABLE_ID : add maskable id filter - @param[in] id ID or start of ID range (depending on filter type) - @param[in] mask Mask or end of ID range (depending on filter type) - @return execution status -*/ -static int32_t CAN_AddHwFilter (CAN_FILTER_TYPE filter_type, uint32_t id, uint32_t mask) { - if ((id & ARM_CAN_ID_IDE_Msk) == 0U) { // Standard Identifier (11 bit) - switch (filter_type) { - case CAN_FILTER_TYPE_EXACT_ID: - CAN_SetHwModeConfig(CAN_HW_SINGLE_FILTER_MODE_CONFIG); //Keep CAN in filter configuration mode - CAN1->CAN_ACR = 0x00; //Reset defaults - CAN1->CAN_AMR = 0x00; - CAN1->CAN_ACR_b.ACR0 = (( id >> 3) & 0xFF); - CAN1->CAN_ACR_b.ACR1 = ((((id >> 0) & 0x07) << 5) | BIT(4)); - CAN1->CAN_ACR_b.ACR2 = 0x00; - CAN1->CAN_ACR_b.ACR3 = 0x00; - CAN1->CAN_AMR_b.AMR0 = 0x00; - CAN1->CAN_AMR_b.AMR1 = BIT(4); // Mark RTR bit as don't care - CAN1->CAN_AMR_b.AMR2 = 0xFF; - CAN1->CAN_AMR_b.AMR3 = 0xFF; - // Enable hardware filter scheme - CAN_SetHwModeConfig(CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE); - break; - - case CAN_FILTER_TYPE_MASKABLE_ID: // Add code to setup peripheral to receive messages with specified maskable ID - CAN_SetHwModeConfig(CAN_HW_SINGLE_FILTER_MODE_CONFIG); //Keep CAN in filter configuration mode - CAN1->CAN_ACR = 0x00; //Reset defaults - CAN1->CAN_AMR = 0x00; - CAN1->CAN_ACR_b.ACR0 = (( id >> 3) & 0xFF); - CAN1->CAN_ACR_b.ACR1 = ((((id >> 0) & 0x07) << 5) | BIT(4)); - CAN1->CAN_ACR_b.ACR2 = 0x00; - CAN1->CAN_ACR_b.ACR3 = 0x00; - CAN1->CAN_AMR_b.AMR0 = (( mask >> 3) & 0xFF); //Configure the mask bits - CAN1->CAN_AMR_b.AMR1 = ((((mask >> 0) & 0x07) << 5) | BIT(4)); - CAN1->CAN_AMR_b.AMR2 = 0xFF; - CAN1->CAN_AMR_b.AMR3 = 0xFF; - CAN_SetHwModeConfig(CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE); // Enable hardware filter scheme - break; - default: - // Handle unknown operation code - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - }else{ // Extended Identifier (29 bit) - switch (filter_type) { - case CAN_FILTER_TYPE_EXACT_ID: - // Add code to setup peripheral to receive messages with specified exact ID - CAN_SetHwModeConfig(CAN_HW_SINGLE_FILTER_MODE_CONFIG); - //Reset defaults - CAN1->CAN_ACR = 0x00; - CAN1->CAN_AMR = 0x00; - CAN1->CAN_ACR_b.ACR0 = (( id >> 21 ) & 0xFF); - CAN1->CAN_ACR_b.ACR1 = (( id >> 13 ) & 0xFF); - CAN1->CAN_ACR_b.ACR2 = (( id >> 5 ) & 0xFF); - CAN1->CAN_ACR_b.ACR3 = (((id >> 0 ) & 0xFF) << 3) ; - CAN1->CAN_ACR_b.ACR3 |= BIT(2); - CAN1->CAN_AMR_b.AMR3 = BIT(2); - /*Apply filter logic here */ - CAN_SetHwModeConfig(CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE); - break; - - case CAN_FILTER_TYPE_MASKABLE_ID: - // Add code to setup peripheral to receive messages with specified maskable ID - CAN_SetHwModeConfig(CAN_HW_SINGLE_FILTER_MODE_CONFIG); - //Reset defaults - CAN1->CAN_ACR = 0x00; - CAN1->CAN_AMR = 0x00; - CAN1->CAN_ACR_b.ACR0 = (( id >> 21 ) & 0xFF); - CAN1->CAN_ACR_b.ACR1 = (( id >> 13 ) & 0xFF); - CAN1->CAN_ACR_b.ACR2 = (( id >> 5 ) & 0xFF); - CAN1->CAN_ACR_b.ACR3 = (((id >> 0 ) & 0xFF) << 3) ; - CAN1->CAN_ACR_b.ACR3 |= BIT(2); - //Configure the mask bits - CAN1->CAN_AMR_b.AMR0 = (( mask >> 21 ) & 0xFF); - CAN1->CAN_AMR_b.AMR1 = (( mask >> 13 ) & 0xFF); - CAN1->CAN_AMR_b.AMR2 = (( mask >> 5 ) & 0xFF); - CAN1->CAN_AMR_b.AMR3 = ((( mask >> 0 ) & 0xFF) << 3) ; - CAN1->CAN_AMR_b.AMR3 |= BIT(2); - - /*Apply filter logic here */ - CAN_SetHwModeConfig(CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE); - break; - default: - // Handle unknown operation code - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - } - return ARM_DRIVER_OK; -} - -/** - @fn int32_t CAN_RemoveFilter (CAN_FILTER_TYPE filter_type, uint32_t id, uint32_t mask) { - @brief Add filter for message reception. - @param[in] filter_type Operation on filter - - \ref CAN_FILTER_TYPE_EXACT_ID : remove exact id filter - - \ref CAN_FILTER_TYPE_MASKABLE_ID : remove maskable id filter - @param[in] id ID or start of ID range (depending on filter type) - @param[in] mask Mask or end of ID range (depending on filter type) - @return execution status -*/ -static int32_t CAN_RemoveFilter (CAN_FILTER_TYPE filter_type, uint32_t id, uint32_t mask) { - switch (filter_type) { - case CAN_FILTER_TYPE_EXACT_ID: - case CAN_FILTER_TYPE_MASKABLE_ID: - //Keep CAN in filter configuration mode - CAN_SetHwModeConfig(CAN_HW_SINGLE_FILTER_MODE_CONFIG); - CAN1->CAN_ACR = 0xFFFFFFFF; - CAN1->CAN_AMR = 0xFFFFFFFF; - // Enable hardware filter scheme - CAN_SetHwModeConfig(CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE); - break; - default: - // Handle unknown operation code - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - return ARM_DRIVER_OK; -} - - -// CAN Driver Functions - -/** - @fn ARM_DRIVER_VERSION CAN_GetVersion (void) - @brief Get driver version. - @return \ref ARM_DRIVER_VERSION -*/ -static ARM_DRIVER_VERSION CAN_GetVersion (void) { - // Return driver version - return can_driver_version; -} - -/** - @fn ARM_CAN_CAPABILITIES CAN_GetCapabilities (void) - @brief Get driver capabilities. - @return \ref ARM_CAN_CAPABILITIES -*/ -static ARM_CAN_CAPABILITIES CAN_GetCapabilities (void) { - // Return driver capabilities - return can_driver_capabilities; -} - -/** - @fn int32_t CAN_Initialize (ARM_CAN_SignalUnitEvent_t cb_unit_event, - ARM_CAN_SignalObjectEvent_t cb_object_event) - @brief Initialize CAN interface and register signal (callback) functions. - @param[in] cb_unit_event Pointer to \ref ARM_CAN_SignalUnitEvent_t callback function - @param[in] cb_object_event Pointer to \ref ARM_CAN_SignalObjectEvent_t callback function - @return execution status -*/ -static int32_t CAN_Initialize (ARM_CAN_SignalUnitEvent_t cb_unit_event, - ARM_CAN_SignalObjectEvent_t cb_object_event) { - - const CAN_PIN *io; - - if(MCU_RET->CHIP_CONFIG_MCU_READ_b.DISABLE_CAN_INTERFACE == 1U){ - return ARM_DRIVER_ERROR_UNSUPPORTED; // If CAN peripheral is not supported by this chip - } - - if (can_driver_initialized != 0U) { return ARM_DRIVER_OK; } - - for (io = can_pins; io != &can_pins[sizeof(can_pins)/sizeof(CAN_PIN)]; io++) { - if(io->pin > 63){ - RSI_EGPIO_SetPinMux(EGPIO1 ,io->port , (io->pin - 64) , 6); - RSI_EGPIO_UlpPadReceiverEnable((io->pin) - 64); - }else{ - RSI_EGPIO_PadReceiverEnable(io->pin); - } - RSI_EGPIO_SetPinMux(EGPIO,io->port,io->pin , io->mode); - RSI_EGPIO_PadSelectionEnable(io->pad_sel); - } - - CAN_SignalUnitEvent = cb_unit_event; - CAN_SignalObjectEvent = cb_object_event; - - can_driver_initialized = 1U; - - return ARM_DRIVER_OK; -} - -/** - @fn int32_t CAN_Uninitialize (void) - @brief De-initialize CAN interface. - @return execution status -*/ -static int32_t CAN_Uninitialize (void) { - const CAN_PIN *io; - - for (io = can_pins; io != &can_pins[sizeof(can_pins)/sizeof(CAN_PIN)]; io++) { - RSI_EGPIO_SetPinMux(EGPIO,io->port,io->pin , EGPIO_PIN_MUX_MODE0); - RSI_EGPIO_PadReceiverEnable(io->pin); - if(io->pin < 63){ - RSI_EGPIO_PadSelectionEnable(io->pad_sel); - } - else{ - RSI_EGPIO_SetPinMux(EGPIO1,(io->port),(io->pin - 64U),6U); - } - } - can_driver_initialized = 0U; - return ARM_DRIVER_OK; -} - -/** - @fn int32_t CAN_PowerControl (ARM_POWER_STATE state) - @brief Control CAN interface power. - @param[in] state Power state - - \ref ARM_POWER_OFF : power off : no operation possible - - \ref ARM_POWER_LOW : low power mode: retain state, detect and signal wake-up events - - \ref ARM_POWER_FULL : power on : full operation at maximum performance - @return execution status -*/ -static int32_t CAN_PowerControl (ARM_POWER_STATE state) { - switch (state) { - case ARM_POWER_OFF: - can_driver_powered = 0U; - NVIC_DisableIRQ (CAN_IRQ_NUM); // Disable CAN NVIC - CAN1->CAN_IMR = 0U; // Disable all CAN controller interrupts - // Clear bit rate - CAN1->CAN_BTIM0_b.BRP = 0U; - CAN1->CAN_BTIM0_b.SJW = 0U; - CAN1->CAN_BTIM1_b.TSEG1 = 0U; - CAN1->CAN_BTIM1_b.TSEG2 = 0U; - CAN1->CAN_MR = 4U; // Keep CAN in reset mode - case ARM_POWER_FULL: - if (can_driver_initialized == 0U) { return ARM_DRIVER_ERROR; } - if (can_driver_powered != 0U) { return ARM_DRIVER_OK; } - M4CLK->CLK_ENABLE_SET_REG3 = M4_SOC_CLK_FOR_OTHER_ENABLE; // Enable common clock for peripheral on which CAN is also workin - M4CLK->CLK_ENABLE_SET_REG2 = CAN1_CLK_ENABLE ; // Enable CAN clock - CAN1->CAN_IMR = CAN_IMR_DOIM | // Enable interrupts - CAN_IMR_BEIM | - CAN_IMR_TIM | - CAN_IMR_RIM | - CAN_IMR_EPIM | - CAN_IMR_EWIM | - CAN_IMR_ALIM ; - can_driver_powered = 1U; - NVIC_ClearPendingIRQ (CAN_IRQ_NUM); - NVIC_EnableIRQ (CAN_IRQ_NUM); - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; // Other states are not supported - } - return ARM_DRIVER_OK; -} - -/** - @fn uint32_t CAN_GetClock (void) - @brief Retrieve CAN base clock frequency. - @return base clock frequency -*/ -uint32_t CAN_GetClock (void) { - uint32_t can_div_factor = 0; - if ((M4CLK->CLK_ENABLE_SET_REG3 & M4_SOC_CLK_FOR_OTHER_ENABLE) == 0U) { // If clock to peripheral is not enabled - return 0U; - } - can_div_factor = M4CLK->CLK_CONFIG_REG3_b.CAN1_CLK_DIV_FAC; // Get CAN division factor value - if(can_div_factor == 0){ // If divider is 0 , divider is bypassed - return SystemCoreClock; - }else{ - return (SystemCoreClock /(2*can_div_factor)); - } -} - -/** - @fn CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) - @brief Set bitrate for CAN interface. - @param[in] select Bitrate selection - - \ref ARM_CAN_BITRATE_NOMINAL : nominal (flexible data-rate arbitration) bitrate - - \ref ARM_CAN_BITRATE_FD_DATA : flexible data-rate data bitrate - @param[in] bitrate Bitrate - @param[in] bit_segments Bit segments settings - @return execution status -*/ -static int32_t CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) { - float sjw, prop_seg, phase_seg1, phase_seg2, pclk, brp, tq_num ; - - if (select != ARM_CAN_BITRATE_NOMINAL) { return ARM_CAN_INVALID_BITRATE_SELECT; } - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - - prop_seg = (bit_segments & ARM_CAN_BIT_PROP_SEG_Msk ) >> ARM_CAN_BIT_PROP_SEG_Pos; - phase_seg1 = (bit_segments & ARM_CAN_BIT_PHASE_SEG1_Msk) >> ARM_CAN_BIT_PHASE_SEG1_Pos; - phase_seg2 = (bit_segments & ARM_CAN_BIT_PHASE_SEG2_Msk) >> ARM_CAN_BIT_PHASE_SEG2_Pos; - sjw = (bit_segments & ARM_CAN_BIT_SJW_Msk ) >> ARM_CAN_BIT_SJW_Pos; - - if (((prop_seg + phase_seg1) < 1U) || ((prop_seg + phase_seg1) > 16U)) { return ARM_CAN_INVALID_BIT_PROP_SEG; } - if (( phase_seg2 < 1U) || ( phase_seg2 > 8U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; } - if (( sjw < 1U) || ( sjw > 4U)) { return ARM_CAN_INVALID_BIT_SJW; } - - tq_num = 1U + prop_seg + phase_seg1 + phase_seg2; - pclk = CAN_GetClock(); - - if (pclk == 0U) { return ARM_DRIVER_ERROR; } - - brp = (int)((float)(1.0f/bitrate)/(float)(2.0f*(1/pclk)*tq_num)); - - if(brp > 64U) { return ARM_CAN_INVALID_BITRATE; } - - CAN_SetHwModeConfig(CAN_HW_RESET_MODE_CONFIG); // Keep CAN in reset mode - - CAN1->CAN_BTIM0_b.BRP = (brp - 1); - CAN1->CAN_BTIM0_b.SJW = (sjw - 1); - CAN1->CAN_BTIM1_b.TSEG1 = ((prop_seg + phase_seg1)- 1); - CAN1->CAN_BTIM1_b.TSEG2 = (phase_seg2 - 1); - CAN_SetHwModeConfig(CAN_HW_NORMAL_MODE_CONFIG); // Keep CAN in reset mode - - return ARM_DRIVER_OK; -} - -/** - @fn int32_t CAN_SetMode (ARM_CAN_MODE mode) - @brief Set operating mode for CAN interface. - @param[in] mode Operating mode - - \ref ARM_CAN_MODE_INITIALIZATION : initialization mode - - \ref ARM_CAN_MODE_NORMAL : normal operation mode - - \ref ARM_CAN_MODE_RESTRICTED : restricted operation mode - - \ref ARM_CAN_MODE_MONITOR : bus monitoring mode - - \ref ARM_CAN_MODE_LOOPBACK_INTERNAL : loopback internal mode - - \ref ARM_CAN_MODE_LOOPBACK_EXTERNAL : loopback external mode - @return execution status -*/ -static int32_t CAN_SetMode (ARM_CAN_MODE mode) { - - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - - switch (mode) { - case ARM_CAN_MODE_INITIALIZATION: - CAN_RemoveFilter(CAN_FILTER_TYPE_EXACT_ID , 0 ,0); // Remove filters - break; - case ARM_CAN_MODE_NORMAL: - CAN_SetHwModeConfig(CAN_HW_NORMAL_MODE_CONFIG); // Configure CAN in normal mode - break; - case ARM_CAN_MODE_MONITOR: - CAN_SetHwModeConfig(CAN_HW_LISTEN_ONLY_MODE_CONFIG); // Configure the CAN in listen only mode - break; - case ARM_CAN_MODE_LOOPBACK_INTERNAL: // Not supported - case ARM_CAN_MODE_RESTRICTED: // Not supported - case ARM_CAN_MODE_LOOPBACK_EXTERNAL: // Not supported - default: - // Handle unknown mode code - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - @fn ARM_CAN_OBJ_CAPABILITIES CAN_ObjectGetCapabilities (uint32_t obj_idx) - @brief Retrieve capabilities of an object. - @param[in] obj_idx Object index - @return \ref ARM_CAN_OBJ_CAPABILITIES -*/ -ARM_CAN_OBJ_CAPABILITIES CAN_ObjectGetCapabilities (uint32_t obj_idx) { - ARM_CAN_OBJ_CAPABILITIES obj_cap_null; - - if (obj_idx > 1U){ - memset (&obj_cap_null, 0U, sizeof(ARM_CAN_OBJ_CAPABILITIES)); - return obj_cap_null; - } - if (obj_idx == 0U) { - return can_object_capabilities_rx; - }else { - return can_object_capabilities_tx; - } -} - -/** - @fn CAN_ObjectSetFilter (uint32_t obj_idx, ARM_CAN_FILTER_OPERATION operation, uint32_t id, uint32_t arg) - @brief Add or remove filter for message reception. - @param[in] obj_idx Object index of object that filter should be or is assigned to - @param[in] operation Operation on filter - - \ref ARM_CAN_FILTER_ID_EXACT_ADD : add exact id filter - - \ref ARM_CAN_FILTER_ID_EXACT_REMOVE : remove exact id filter - - \ref ARM_CAN_FILTER_ID_RANGE_ADD : add range id filter - - \ref ARM_CAN_FILTER_ID_RANGE_REMOVE : remove range id filter - - \ref ARM_CAN_FILTER_ID_MASKABLE_ADD : add maskable id filter - - \ref ARM_CAN_FILTER_ID_MASKABLE_REMOVE : remove maskable id filter - @param[in] id ID or start of ID range (depending on filter type) - @param[in] arg Mask or end of ID range (depending on filter type) - @return execution status -*/ -static int32_t CAN_ObjectSetFilter (uint32_t obj_idx, ARM_CAN_FILTER_OPERATION operation, uint32_t id, uint32_t arg) { - int32_t status; - - if (obj_idx != 0U) { return ARM_DRIVER_ERROR_PARAMETER; } - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - - switch (operation) { - case ARM_CAN_FILTER_ID_EXACT_ADD: - status = CAN_AddHwFilter (CAN_FILTER_TYPE_EXACT_ID, id, 0U); - break; - case ARM_CAN_FILTER_ID_MASKABLE_ADD: - status = CAN_AddHwFilter (CAN_FILTER_TYPE_MASKABLE_ID, id, arg); - break; - case ARM_CAN_FILTER_ID_EXACT_REMOVE: - status = CAN_RemoveFilter (CAN_FILTER_TYPE_EXACT_ID, id, 0U); - break; - case ARM_CAN_FILTER_ID_MASKABLE_REMOVE: - status = CAN_RemoveFilter (CAN_FILTER_TYPE_MASKABLE_ID, id, 0); - break; - case ARM_CAN_FILTER_ID_RANGE_ADD: // Not supported - case ARM_CAN_FILTER_ID_RANGE_REMOVE: // Not supported - default: - status = ARM_DRIVER_ERROR_UNSUPPORTED; - break; - } - - return status; -} - -/** - @fn int32_t CAN_ObjectConfigure (uint32_t obj_idx, ARM_CAN_OBJ_CONFIG obj_cfg) - @brief Configure object. - @param[in] obj_idx Object index - @param[in] obj_cfg Object configuration state - - \ref ARM_CAN_OBJ_INACTIVE : deactivate object - - \ref ARM_CAN_OBJ_RX : configure object for reception - - \ref ARM_CAN_OBJ_TX : configure object for transmission - - \ref ARM_CAN_OBJ_RX_RTR_TX_DATA : configure object that on RTR reception automatically transmits Data Frame - - \ref ARM_CAN_OBJ_TX_RTR_RX_DATA : configure object that transmits RTR and automatically receives Data Frame - @return execution status -*/ -static int32_t CAN_ObjectConfigure (uint32_t obj_idx, ARM_CAN_OBJ_CONFIG obj_cfg) { - - if (obj_idx > 1U) { return ARM_DRIVER_ERROR_PARAMETER; } - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - - switch (obj_cfg) { - case ARM_CAN_OBJ_INACTIVE: - can_obj_cfg_msk &= ~(1U << obj_idx); - break; - case ARM_CAN_OBJ_RX_RTR_TX_DATA: - case ARM_CAN_OBJ_TX_RTR_RX_DATA: - can_obj_cfg_msk &= ~(1U << obj_idx); - return ARM_DRIVER_ERROR_UNSUPPORTED; - case ARM_CAN_OBJ_TX: - if (obj_idx != 1U) { return ARM_DRIVER_ERROR_PARAMETER; } - can_obj_cfg_msk = 2U; - break; - case ARM_CAN_OBJ_RX: - if (obj_idx != 0U) { return ARM_DRIVER_ERROR_PARAMETER; } - can_obj_cfg_msk = 1U; - break; - default: - return ARM_DRIVER_ERROR; - } - - return ARM_DRIVER_OK; -} - -/** - @fn int32_t CAN_MessageSend (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, const uint8_t *data, uint8_t size) - @brief Send message on CAN bus. - @param[in] obj_idx Object index - @param[in] msg_info Pointer to CAN message information - @param[in] data Pointer to data buffer - @param[in] size Number of data bytes to send - @return value >= 0 number of data bytes accepted to send - @return value < 0 execution status -*/ -static int32_t CAN_MessageSend (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, const uint8_t *data, uint8_t size) { - uint32_t tx_buf_reg1 = 0U; - uint32_t tx_buf_reg2 = 0U; - uint32_t tx_buf_reg3 = 0U; - - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - if (obj_idx != 1U) { return ARM_DRIVER_ERROR_PARAMETER; } - - if(CAN1->CAN_SR_b.TBS !=1U){ // Check for the previous transmission status - return ARM_DRIVER_ERROR_BUSY; - } - if (((msg_info->id) & ARM_CAN_ID_IDE_Msk) == 0U) { // Standard Identifier (11 bit) - tx_buf_reg1 = (msg_info->dlc); - tx_buf_reg1 |= ((msg_info->id >> 3) & 0xFF) << 8U ; - tx_buf_reg1 |= ((msg_info->id >> 0) & 0x07) << 21U; - if(msg_info->rtr == 0U){ // If data frame - tx_buf_reg1 |= (data[0] << 24); - CAN1->CAN_TXBUF = tx_buf_reg1; - tx_buf_reg1 = 0U; - switch(size){ - case 8: - tx_buf_reg2 |= (data[7] << 16U); - case 7: - tx_buf_reg2 |= (data[6] << 8U ); - case 6: - tx_buf_reg2 |= (data[5] << 0U ); - case 5: - tx_buf_reg1 |= (data[4] << 24U); - case 4: - tx_buf_reg1 |= (data[3] << 16U); - case 3: - tx_buf_reg1 |= (data[2] << 8U ); - case 2: - tx_buf_reg1 |= (data[1] << 0U ); - CAN1->CAN_TXBUF = tx_buf_reg1; - CAN1->CAN_TXBUF = tx_buf_reg2; - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - }else{ // Remote frame - size = 0U; - tx_buf_reg1 |= BIT(6); - CAN1->CAN_TXBUF = tx_buf_reg1; - } - }else{ // Extended Identifier (11 bit) - tx_buf_reg1 = BIT(7); - tx_buf_reg1 |= (((msg_info->id >> 21) & 0xFF ) << 8 ); - tx_buf_reg1 |= (((msg_info->id >> 13) & 0xFF ) << 16); - tx_buf_reg1 |= (((msg_info->id >> 5) & 0xFF ) << 24); - if(msg_info->rtr == 0U){ // If Data frame - tx_buf_reg1 |= msg_info->dlc; - CAN1->CAN_TXBUF = tx_buf_reg1; // Update the hardware; - tx_buf_reg1 = 0; - tx_buf_reg1 = ((msg_info->id << 3) & 0xFF); - switch(size){ - case 8: - tx_buf_reg3 |= (data[7] << 0U ); - case 7: - tx_buf_reg2 |= (data[6] << 24U); - case 6: - tx_buf_reg2 |= (data[5] << 16U); - case 5: - tx_buf_reg2 |= (data[4] << 8U ); - case 4: - tx_buf_reg2 |= (data[3] << 0U ); - case 3: - tx_buf_reg1 |= (data[2] << 24U); - case 2: - tx_buf_reg1 |= (data[1] << 16U); - case 1: - tx_buf_reg1 |= (data[0] << 8U ); - CAN1->CAN_TXBUF = tx_buf_reg1; // Update the hardware; - CAN1->CAN_TXBUF = tx_buf_reg2; // Update the hardware; - CAN1->CAN_TXBUF = tx_buf_reg3; // Update the hardware; - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - }else{ // If remote frame - size = 0U; - tx_buf_reg1 |= BIT(6); - CAN1->CAN_TXBUF = tx_buf_reg1; // Update the hardware; - tx_buf_reg1 = 0; - tx_buf_reg1 = ((msg_info->id << 3) & 0xFF); - CAN1->CAN_TXBUF = tx_buf_reg1; // Update the hardware; - } - } - - CAN1->CAN_CMR_b.TR = 1U; // Trigger transfer - - return ((int32_t)size); -} - -/** - @fn int32_t CAN_MessageRead (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, uint8_t *data, uint8_t size) { - @brief Read message received on CAN bus. - @param[in] obj_idx Object index - @param[out] msg_info Pointer to read CAN message information - @param[out] data Pointer to data buffer for read data - @param[in] size Maximum number of data bytes to read - @return value >= 0 number of data bytes read - @return value < 0 execution status -*/ -static int32_t CAN_MessageRead (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, uint8_t *data, uint8_t size) { - uint32_t rx_buf_reg0=0; - uint32_t rx_buf_reg1=0; - uint32_t rx_buf_reg2=0; - uint32_t rx_buf_reg3=0; - - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - if (obj_idx != 0U) { return ARM_DRIVER_ERROR_PARAMETER; } - - rx_buf_reg0 = CAN1->CAN_RXBUF; //Read FIFO - - if(rx_buf_reg0 & (1 << 6)){ - msg_info->rtr = 1U; - }else{ - msg_info->rtr = 0U; - } - msg_info->dlc= (rx_buf_reg0 & 0x0F); - if(rx_buf_reg0 & (1 << 7)){ // If extended ID is received - rx_buf_reg1 = CAN1->CAN_RXBUF; //Read FIFO - rx_buf_reg2 = CAN1->CAN_RXBUF; //Read FIFO - rx_buf_reg3 = CAN1->CAN_RXBUF; //Read FIFO - msg_info->id = (((rx_buf_reg0 >> 8 ) & 0xFF) << 21U); - msg_info->id |= (((rx_buf_reg0 >> 16) & 0xFF) << 13U); - msg_info->id |= (((rx_buf_reg0 >> 24) & 0xFF) << 5U); - msg_info->id |= (((rx_buf_reg1 >> 3 ) & 0x1F) << 0); - if(msg_info->rtr == 0U){ // Data frame is received - switch(size){ - case 8: - data[7] = ((rx_buf_reg3 >> 0) & 0xFF); - case 7: - data[6] = ((rx_buf_reg2 >> 24) & 0xFF); - case 6: - data[5] = ((rx_buf_reg2 >> 16) & 0xFF); - case 5: - data[4] = ((rx_buf_reg2 >> 8 ) & 0xFF); - case 4: - data[3] = ((rx_buf_reg2 >> 0 ) & 0xFF); - case 3: - data[2] = ((rx_buf_reg1 >> 24) & 0xFF); - case 2: - data[1] = ((rx_buf_reg1 >> 16) & 0xFF); - case 1: - data[0] = ((rx_buf_reg1 >> 8 ) & 0xFF); - break ; - case 0: - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - }else{ // If remote frame is received - // Nothing - size=0U; - } - }else{ // If standard ID is received - rx_buf_reg1 = CAN1->CAN_RXBUF; //Read FIFO - rx_buf_reg2 = CAN1->CAN_RXBUF; //Read FIFO - msg_info->id = ((rx_buf_reg0 & 0xFF00) >> 8 ); - msg_info->id = (msg_info->id << 3 ); - msg_info->id |= ((rx_buf_reg0 & 0xE00000) >> 21); - if(msg_info->rtr == 0U){ // If data frame received - switch(size){ - case 8: - data[7] = ((rx_buf_reg2 >> 16) & 0xFF); - case 7: - data[6] = ((rx_buf_reg2 >> 8 ) & 0xFF); - case 6: - data[5] = ((rx_buf_reg2 >> 0 ) & 0xFF); - case 5: - data[4] = ((rx_buf_reg1 >> 24) & 0xFF); - case 4: - data[3] = ((rx_buf_reg1 >> 16) & 0xFF); - case 3: - data[2] = ((rx_buf_reg1 >> 8 ) & 0xFF); - case 2: - data[1] = ((rx_buf_reg1 >> 0 ) & 0xFF); - case 1: - data[0] = ((rx_buf_reg0 >> 24) & 0xFF); - break ; - case 0: - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - }else{ - // If remote frame is received - // Nothing - size = 0U; - } - } - return ((int32_t)size); -} - -/** - @fn int32_t CAN_Control (uint32_t control, uint32_t arg) - @brief Control CAN interface. - @param[in] control Operation - - \ref ARM_CAN_SET_FD_MODE : set FD operation mode - - \ref ARM_CAN_ABORT_MESSAGE_SEND : abort sending of CAN message - - \ref ARM_CAN_CONTROL_RETRANSMISSION : enable/disable automatic retransmission - - \ref ARM_CAN_SET_TRANSCEIVER_DELAY : set transceiver delay - @param[in] arg Argument of operation - @return execution status -*/ -static int32_t CAN_Control (uint32_t control, uint32_t arg) { - - if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } - - switch (control & ARM_CAN_CONTROL_Msk) { - case ARM_CAN_ABORT_MESSAGE_SEND: - if (arg == 1U) { - CAN1->CAN_CMR = CAN_CMR_AT; - } - break; - case ARM_CAN_CONTROL_RETRANSMISSION: - if(arg == 1U){ - CAN1->CAN_CMR = CAN_CMR_TR; - }else{ - CAN1->CAN_CMR = (CAN_CMR_AT | CAN_CMR_TR); - } - break; - case ARM_CAN_SET_FD_MODE: - case ARM_CAN_SET_TRANSCEIVER_DELAY: - default: - // Handle unknown control code - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - @fn ARM_CAN_STATUS CAN_GetStatus (void) - @brief Get CAN status. - @return CAN status \ref ARM_CAN_STATUS -*/ -static ARM_CAN_STATUS CAN_GetStatus (void) { - ARM_CAN_STATUS status; - - memset(&status, 0U, sizeof(ARM_CAN_STATUS)); - - if (can_driver_powered == 0U) { - return status; - } - - status.last_error_code = can_last_error_code; - status.tx_error_count = CAN1->CAN_TXERR; // Update TX error count - status.rx_error_count = CAN1->CAN_RXERR; // Update RX error count - - if ((((CAN1->CAN_TXERR) > 127U) || ((CAN1->CAN_RXERR) > 127U))) { // If Error Passive Interrupt is active - status.unit_state = ARM_CAN_UNIT_STATE_PASSIVE; - } else { - status.unit_state = ARM_CAN_UNIT_STATE_ACTIVE; - } - return status; -} - - -/** - @fn void IRQ066_Handler (void) - @brief CAN1 Interrupt Routine (IRQ). -*/ -void IRQ066_Handler(void){ - uint8_t isr , sr; - - if (can_driver_powered != 0U) { - isr = CAN1->CAN_ISR_IACK; // Read interrupt status register - sr = CAN1->CAN_SR; - if(isr & CAN_ISR_DO){ // Data Over run interrupt is active - CAN_SignalObjectEvent(0U, ARM_CAN_EVENT_RECEIVE_OVERRUN); - CAN1->CAN_ISR_IACK = CAN_ISR_DO; - } - if(isr & CAN_ISR_BEI){ // Bus error interrupt is active - - if(CAN1->CAN_ECC_b.BER){ - can_last_error_code = ARM_CAN_LEC_BIT_ERROR; - } - if (CAN1->CAN_ECC_b.STFER) { - can_last_error_code = ARM_CAN_LEC_STUFF_ERROR; - } - if (CAN1->CAN_ECC_b.CRCER) { - can_last_error_code = ARM_CAN_LEC_CRC_ERROR; - } - if (CAN1->CAN_ECC_b.FRMER) { - can_last_error_code = ARM_CAN_LEC_FORM_ERROR; - } - if (CAN1->CAN_ECC_b.ACKER) { - can_last_error_code = ARM_CAN_LEC_ACK_ERROR; - } - CAN1->CAN_ISR_IACK = CAN_ISR_BEI; - } - if(isr & CAN_ISR_TI){ // Transmit interrupt interrupt is active - CAN_SignalObjectEvent(1U, ARM_CAN_EVENT_SEND_COMPLETE); - CAN1->CAN_ISR_IACK = CAN_ISR_TI; - } - if(isr & CAN_ISR_RI){ // Receive interrupt is triggered - - while(CAN1->CAN_RMC) // Note keep reading messages until FIFO empty - { - CAN_SignalObjectEvent(0U, ARM_CAN_EVENT_RECEIVE); - CAN1->CAN_ISR_IACK = CAN_ISR_RI; //Clear the RX Data over run interrupt - } - } - if(isr & CAN_ISR_EPI){ // Error passive interrupt is active - if ((((CAN1->CAN_TXERR) > 127U) || ((CAN1->CAN_RXERR) > 127U))) { // If Error Passive Interrupt is active - CAN_SignalUnitEvent(ARM_CAN_EVENT_UNIT_PASSIVE); - } else { - CAN_SignalUnitEvent(ARM_CAN_EVENT_UNIT_ACTIVE); - } - CAN1->CAN_ISR_IACK = CAN_ISR_EPI; - } - if(isr & CAN_ISR_EWI){ // Error warning interrupt - if(sr & CAN_SR_ES){ - CAN_SignalUnitEvent(ARM_CAN_EVENT_UNIT_WARNING); - } - CAN1->CAN_ISR_IACK = CAN_ISR_EWI; - } - if(isr & CAN_ISR_ALI){ // Arbitration lost interrupt - //FIXME: Handle this here //Added by me this handle - CAN_SignalUnitEvent(ARM_CAN_ARBITRATION_LOST); - CAN1->CAN_ISR_IACK = CAN_ISR_ALI; - } - } -} - -// CAN driver functions structure -ARM_DRIVER_CAN Driver_CAN1 = { - CAN_GetVersion, - CAN_GetCapabilities, - CAN_Initialize, - CAN_Uninitialize, - CAN_PowerControl, - CAN_GetClock, - CAN_SetBitrate, - CAN_SetMode, - CAN_ObjectGetCapabilities, - CAN_ObjectSetFilter, - CAN_ObjectConfigure, - CAN_MessageSend, - CAN_MessageRead, - CAN_Control, - CAN_GetStatus -}; - -#endif //RTE_CAN1 -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.h deleted file mode 100644 index 21369311c..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CAN.h +++ /dev/null @@ -1,136 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2015 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 9. September 2015 - * $Revision: V1.00 - * - * Project: CAN (Controller Area Network) Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * - Initial CMSIS Driver API V4.5.0 release - * - */ - - - -/** @defgroup CAN CAN Peripheral - * @{ - * -*/ - -#ifndef __CAN_H -#define __CAN_H - -#include "Driver_CAN.h" - -#include "RTE_Device.h" - - -#define ARM_CAN_ARBITRATION_LOST (5U) ///< Unit entered arbitration lost error FIXME: added by me - - -/** @defgroup CANIMRREG Can interrupt mask register bit fields - * @{ - */ -/****** CAN Interrupt mask bits *****/ -#define CAN_IMR_DOIM (1UL << 0) ///< mask for DOI interrupt -#define CAN_IMR_BEIM (1UL << 1) ///< mask for BEI interrupt -#define CAN_IMR_TIM (1UL << 2) ///< mask for TI interrupt -#define CAN_IMR_RIM (1UL << 3) ///< mask for RI interrupt -#define CAN_IMR_EPIM (1UL << 4) ///< mask for EPI interrupt -#define CAN_IMR_EWIM (1UL << 5) ///< mask for EWI interrupt -#define CAN_IMR_ALIM (1UL << 6) ///< mask for ALI interrupt -/* - * @} end of CAN_IMR_REG - * */ - -/** @defgroup CAN_ISR_REG: Can interrupt Status register bit fields - * \addtogroup CAN_ISR_REG - * @{ - */ -/****** CAN Interrupt status bits *****/ -#define CAN_ISR_DO (1UL << 0) ///< DOI interrupt -#define CAN_ISR_BEI (1UL << 1) ///< BEI interrupt -#define CAN_ISR_TI (1UL << 2) ///< TI interrupt -#define CAN_ISR_RI (1UL << 3) ///< RI interrupt -#define CAN_ISR_EPI (1UL << 4) ///< EPI interrupt -#define CAN_ISR_EWI (1UL << 5) ///< EWI interrupt -#define CAN_ISR_ALI (1UL << 6) ///< ALI interrupt -/* - * @} end of CAN_ISR_REG - * */ - -/** @defgroup CAN_SR_REG: Can Status register bit fields - * \addtogroup CAN_SR_REG - * @{ - */ -/****** CAN Interrupt status bits *****/ -#define CAN_SR_BS (1UL << 0) ///< Bus off Status -#define CAN_SR_ES (1UL << 1) ///< Error Status -#define CAN_SR_TS (1UL << 2) ///< Transmit Status -#define CAN_SR_RS (1UL << 3) ///< Receive Status -#define CAN_SR_TBS (1UL << 5) ///< Transmit Buffer Status -#define CAN_SR_DSO (1UL << 6) ///< Data Overrun Status -#define CAN_SR_RBS (1UL << 7) ///< Receive Buffer Status -/* - * @} end of CAN_SR_REG - * */ - -/** @defgroup CAN_MR_REG: Can mode register bit fields - * \addtogroup CAN_MR_REG - * @{ - */ -/****** CAN mode control bits *****/ -#define CAN_CMR_AT (1UL << 1) ///< Transmit Request -#define CAN_CMR_TR (1UL << 2) ///< Abort Transmission -/* - * @} end of CAN_MR_REG - * */ - -/****** CAN mode configuration codes *****/ -typedef enum { - CAN_HW_RESET_MODE_CONFIG, ///< CAN configure in reset mode - CAN_HW_NORMAL_MODE_CONFIG, ///< CAN configure in normal mode - CAN_HW_LISTEN_ONLY_MODE_CONFIG, ///< CAN configure in listen only mode - CAN_HW_DUAL_FILTER_MODE_CONFIG, ///< CAN configure in dual filter mode - CAN_HW_SINGLE_FILTER_MODE_CONFIG, ///< CAN configure in single filter mode - CAN_HW_ACCEPTANCE_SINGLE_FILTER_MODE_CONFIG_ENABLE,///< CAN enable configuration in hardware acceptance for single filter mode - CAN_HW_ACCEPTANCE_DUAL_FILTER_MODE_CONFIG_ENABLE, ///< CAN enable configuration in hardware acceptance for dual filter mode -}CAN_HW_MODE_CONFIG; - -/****** CAN filter type configuration codes *****/ -typedef enum { - CAN_FILTER_TYPE_EXACT_ID = 0U, ///< Add exact id filter - CAN_FILTER_TYPE_MASKABLE_ID = 1U ///< Add maskable id filter -} CAN_FILTER_TYPE; - -/** -\brief CAN Device Driver pin configurations -*/ -typedef struct { - uint8_t port; ///< CAN GPIO port - uint8_t pin; ///< CAN GPIO pin - uint8_t mode; ///< CAN GPIO mode - uint8_t pad_sel; ///< CAN GPIO pad selection -}CAN_PIN; - -#endif /* __CAN_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_CAN.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_CAN.h deleted file mode 100644 index 60a8094e5..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_CAN.h +++ /dev/null @@ -1,232 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2015 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 9. September 2015 - * $Revision: V1.00 - * - * Project: CAN (Controller Area Network) Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_CAN_H -#define __DRIVER_CAN_H - -#include "Driver_Common.h" - -#define ARM_CAN_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)/* API version */ - - -/****** CAN Bitrate selection codes *****/ -typedef enum _ARM_CAN_BITRATE_SELECT { - ARM_CAN_BITRATE_NOMINAL, ///< Select nominal (flexible data-rate arbitration) bitrate - ARM_CAN_BITRATE_FD_DATA ///< Select flexible data-rate data bitrate -} ARM_CAN_BITRATE_SELECT; - -/****** CAN Bit Propagation Segment codes (PROP_SEG) *****/ -#define ARM_CAN_BIT_PROP_SEG_Pos 0UL ///< bits 7..0 -#define ARM_CAN_BIT_PROP_SEG_Msk (0xFFUL << ARM_CAN_BIT_PROP_SEG_Pos) -#define ARM_CAN_BIT_PROP_SEG(x) (((x) << ARM_CAN_BIT_PROP_SEG_Pos) & ARM_CAN_BIT_PROP_SEG_Msk) - -/****** CAN Bit Phase Buffer Segment 1 (PHASE_SEG1) codes *****/ -#define ARM_CAN_BIT_PHASE_SEG1_Pos 8UL ///< bits 15..8 -#define ARM_CAN_BIT_PHASE_SEG1_Msk (0xFFUL << ARM_CAN_BIT_PHASE_SEG1_Pos) -#define ARM_CAN_BIT_PHASE_SEG1(x) (((x) << ARM_CAN_BIT_PHASE_SEG1_Pos) & ARM_CAN_BIT_PHASE_SEG1_Msk) - -/****** CAN Bit Phase Buffer Segment 2 (PHASE_SEG2) codes *****/ -#define ARM_CAN_BIT_PHASE_SEG2_Pos 16UL ///< bits 23..16 -#define ARM_CAN_BIT_PHASE_SEG2_Msk (0xFFUL << ARM_CAN_BIT_PHASE_SEG2_Pos) -#define ARM_CAN_BIT_PHASE_SEG2(x) (((x) << ARM_CAN_BIT_PHASE_SEG2_Pos) & ARM_CAN_BIT_PHASE_SEG2_Msk) - -/****** CAN Bit (Re)Synchronization Jump Width Segment (SJW) *****/ -#define ARM_CAN_BIT_SJW_Pos 24UL ///< bits 28..24 -#define ARM_CAN_BIT_SJW_Msk (0x1FUL << ARM_CAN_BIT_SJW_Pos) -#define ARM_CAN_BIT_SJW(x) (((x) << ARM_CAN_BIT_SJW_Pos) & ARM_CAN_BIT_SJW_Msk) - -/****** CAN Mode codes *****/ -typedef enum _ARM_CAN_MODE { - ARM_CAN_MODE_INITIALIZATION, ///< Initialization mode - ARM_CAN_MODE_NORMAL, ///< Normal operation mode - ARM_CAN_MODE_RESTRICTED, ///< Restricted operation mode - ARM_CAN_MODE_MONITOR, ///< Bus monitoring mode - ARM_CAN_MODE_LOOPBACK_INTERNAL, ///< Loopback internal mode - ARM_CAN_MODE_LOOPBACK_EXTERNAL ///< Loopback external mode -} ARM_CAN_MODE; - -/****** CAN Filter Operation codes *****/ -typedef enum _ARM_CAN_FILTER_OPERATION { - ARM_CAN_FILTER_ID_EXACT_ADD, ///< Add exact id filter - ARM_CAN_FILTER_ID_EXACT_REMOVE, ///< Remove exact id filter - ARM_CAN_FILTER_ID_RANGE_ADD, ///< Add range id filter - ARM_CAN_FILTER_ID_RANGE_REMOVE, ///< Remove range id filter - ARM_CAN_FILTER_ID_MASKABLE_ADD, ///< Add maskable id filter - ARM_CAN_FILTER_ID_MASKABLE_REMOVE ///< Remove maskable id filter -} ARM_CAN_FILTER_OPERATION; - -/****** CAN Object Configuration codes *****/ -typedef enum _ARM_CAN_OBJ_CONFIG { - ARM_CAN_OBJ_INACTIVE, ///< CAN object inactive - ARM_CAN_OBJ_TX, ///< CAN transmit object - ARM_CAN_OBJ_RX, ///< CAN receive object - ARM_CAN_OBJ_RX_RTR_TX_DATA, ///< CAN object that on RTR reception automatically transmits Data Frame - ARM_CAN_OBJ_TX_RTR_RX_DATA ///< CAN object that transmits RTR and automatically receives Data Frame -} ARM_CAN_OBJ_CONFIG; - -/** -\brief CAN Object Capabilities -*/ -typedef struct _ARM_CAN_OBJ_CAPABILITIES { - uint32_t tx : 1; ///< Object supports transmission - uint32_t rx : 1; ///< Object supports reception - uint32_t rx_rtr_tx_data : 1; ///< Object supports RTR reception and automatic Data Frame transmission - uint32_t tx_rtr_rx_data : 1; ///< Object supports RTR transmission and automatic Data Frame reception - uint32_t multiple_filters : 1; ///< Object allows assignment of multiple filters to it - uint32_t exact_filtering : 1; ///< Object supports exact identifier filtering - uint32_t range_filtering : 1; ///< Object supports range identifier filtering - uint32_t mask_filtering : 1; ///< Object supports mask identifier filtering - uint32_t message_depth : 8; ///< Number of messages buffers (FIFO) for that object -} ARM_CAN_OBJ_CAPABILITIES; - -/****** CAN Control Function Operation codes *****/ -#define ARM_CAN_CONTROL_Pos 0UL -#define ARM_CAN_CONTROL_Msk (0xFFUL << ARM_CAN_CONTROL_Pos) -#define ARM_CAN_SET_FD_MODE (1UL << ARM_CAN_CONTROL_Pos) ///< Set FD operation mode; arg: 0 = disable, 1 = enable -#define ARM_CAN_ABORT_MESSAGE_SEND (2UL << ARM_CAN_CONTROL_Pos) ///< Abort sending of CAN message; arg = object -#define ARM_CAN_CONTROL_RETRANSMISSION (3UL << ARM_CAN_CONTROL_Pos) ///< Enable/disable automatic retransmission; arg: 0 = disable, 1 = enable (default state) -#define ARM_CAN_SET_TRANSCEIVER_DELAY (4UL << ARM_CAN_CONTROL_Pos) ///< Set transceiver delay; arg = delay in time quanta - -/****** CAN ID Frame Format codes *****/ -#define ARM_CAN_ID_IDE_Pos 31UL -#define ARM_CAN_ID_IDE_Msk (1UL << ARM_CAN_ID_IDE_Pos) - -/****** CAN Identifier encoding *****/ -#define ARM_CAN_STANDARD_ID(id) (id & 0x000007FFUL) ///< CAN identifier in standard format (11-bits) -#define ARM_CAN_EXTENDED_ID(id) ((id & 0x1FFFFFFFUL) | ARM_CAN_ID_IDE_Msk)///< CAN identifier in extended format (29-bits) - -/** -\brief CAN Message Information -*/ -typedef struct _ARM_CAN_MSG_INFO { - uint32_t id; ///< CAN identifier with frame format specifier (bit 31) - uint32_t rtr : 1; ///< Remote transmission request frame - uint32_t edl : 1; ///< Flexible data-rate format extended data length - uint32_t brs : 1; ///< Flexible data-rate format with bitrate switch - uint32_t esi : 1; ///< Flexible data-rate format error state indicator - uint32_t dlc : 4; ///< Data length code -} ARM_CAN_MSG_INFO; - -/****** CAN specific error code *****/ -#define ARM_CAN_INVALID_BITRATE_SELECT (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Bitrate selection not supported -#define ARM_CAN_INVALID_BITRATE (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Requested bitrate not supported -#define ARM_CAN_INVALID_BIT_PROP_SEG (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Propagation segment value not supported -#define ARM_CAN_INVALID_BIT_PHASE_SEG1 (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Phase segment 1 value not supported -#define ARM_CAN_INVALID_BIT_PHASE_SEG2 (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Phase segment 2 value not supported -#define ARM_CAN_INVALID_BIT_SJW (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< SJW value not supported -#define ARM_CAN_NO_MESSAGE_AVAILABLE (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Message is not available - -/****** CAN Status codes *****/ -#define ARM_CAN_UNIT_STATE_INACTIVE (0U) ///< Unit state: Not active on bus (initialize or error bus off) -#define ARM_CAN_UNIT_STATE_ACTIVE (1U) ///< Unit state: Active on bus (can generate active error frame) -#define ARM_CAN_UNIT_STATE_PASSIVE (2U) ///< Unit state: Error passive (can not generate active error frame) -#define ARM_CAN_LEC_NO_ERROR (0U) ///< Last error code: No error -#define ARM_CAN_LEC_BIT_ERROR (1U) ///< Last error code: Bit error -#define ARM_CAN_LEC_STUFF_ERROR (2U) ///< Last error code: Bit stuffing error -#define ARM_CAN_LEC_CRC_ERROR (3U) ///< Last error code: CRC error -#define ARM_CAN_LEC_FORM_ERROR (4U) ///< Last error code: Illegal fixed-form bit -#define ARM_CAN_LEC_ACK_ERROR (5U) ///< Last error code: Acknowledgement error - -/** -\brief CAN Status -*/ -typedef struct _ARM_CAN_STATUS { - uint32_t unit_state : 4; ///< Unit bus state - uint32_t last_error_code : 4; ///< Last error code - uint32_t tx_error_count : 8; ///< Transmitter error count - uint32_t rx_error_count : 8; ///< Receiver error count -} ARM_CAN_STATUS; - - -/****** CAN Unit Event *****/ -#define ARM_CAN_EVENT_UNIT_ACTIVE (1U) ///< Unit entered Error Active state -#define ARM_CAN_EVENT_UNIT_WARNING (2U) ///< Unit entered Error Warning state (one or both error counters >= 96) -#define ARM_CAN_EVENT_UNIT_PASSIVE (3U) ///< Unit entered Error Passive state -#define ARM_CAN_EVENT_UNIT_BUS_OFF (4U) ///< Unit entered bus off state - -/****** CAN Send/Receive Event *****/ -#define ARM_CAN_EVENT_SEND_COMPLETE (1UL << 0) ///< Send complete -#define ARM_CAN_EVENT_RECEIVE (1UL << 1) ///< Message received -#define ARM_CAN_EVENT_RECEIVE_OVERRUN (1UL << 2) ///< Received message overrun - -typedef void (*ARM_CAN_SignalUnitEvent_t) (uint32_t event); ///< Pointer to \ref ARM_CAN_SignalUnitEvent : Signal CAN Unit Event. -typedef void (*ARM_CAN_SignalObjectEvent_t) (uint32_t obj_idx, uint32_t event); ///< Pointer to \ref ARM_CAN_SignalObjectEvent : Signal CAN Object Event. - -/** -\brief CAN Device Driver Capabilities. -*/ -typedef struct _ARM_CAN_CAPABILITIES { - uint32_t num_objects : 8; ///< Number of \ref can_objects available - uint32_t reentrant_operation : 1; ///< Support for reentrant calls to \ref ARM_CAN_MessageSend, \ref ARM_CAN_MessageRead, \ref ARM_CAN_ObjectConfigure and abort message sending used by \ref ARM_CAN_Control - uint32_t fd_mode : 1; ///< Support for CAN with flexible data-rate mode (CAN_FD) (set by \ref ARM_CAN_Control) - uint32_t restricted_mode : 1; ///< Support for restricted operation mode (set by \ref ARM_CAN_SetMode) - uint32_t monitor_mode : 1; ///< Support for bus monitoring mode (set by \ref ARM_CAN_SetMode) - uint32_t internal_loopback : 1; ///< Support for internal loopback mode (set by \ref ARM_CAN_SetMode) - uint32_t external_loopback : 1; ///< Support for external loopback mode (set by \ref ARM_CAN_SetMode) -} ARM_CAN_CAPABILITIES; - - -/** -\brief Access structure of the CAN Driver. -*/ -typedef struct _ARM_DRIVER_CAN { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_CAN_GetVersion : Get driver version. - ARM_CAN_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_CAN_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_CAN_SignalUnitEvent_t cb_unit_event, - ARM_CAN_SignalObjectEvent_t cb_object_event); ///< Pointer to \ref ARM_CAN_Initialize : Initialize CAN interface. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_CAN_Uninitialize : De-initialize CAN interface. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_CAN_PowerControl : Control CAN interface power. - uint32_t (*GetClock) (void); ///< Pointer to \ref ARM_CAN_GetClock : Retrieve CAN base clock frequency. - int32_t (*SetBitrate) (ARM_CAN_BITRATE_SELECT select, - uint32_t bitrate, - uint32_t bit_segments); ///< Pointer to \ref ARM_CAN_SetBitrate : Set bitrate for CAN interface. - int32_t (*SetMode) (ARM_CAN_MODE mode); ///< Pointer to \ref ARM_CAN_SetMode : Set operating mode for CAN interface. - ARM_CAN_OBJ_CAPABILITIES (*ObjectGetCapabilities) (uint32_t obj_idx); ///< Pointer to \ref ARM_CAN_ObjectGetCapabilities : Retrieve capabilities of an object. - int32_t (*ObjectSetFilter) (uint32_t obj_idx, - ARM_CAN_FILTER_OPERATION operation, - uint32_t id, - uint32_t arg); ///< Pointer to \ref ARM_CAN_ObjectSetFilter : Add or remove filter for message reception. - int32_t (*ObjectConfigure) (uint32_t obj_idx, - ARM_CAN_OBJ_CONFIG obj_cfg); ///< Pointer to \ref ARM_CAN_ObjectConfigure : Configure object. - int32_t (*MessageSend) (uint32_t obj_idx, - ARM_CAN_MSG_INFO *msg_info, - const uint8_t *data, - uint8_t size); ///< Pointer to \ref ARM_CAN_MessageSend : Send message on CAN bus. - int32_t (*MessageRead) (uint32_t obj_idx, - ARM_CAN_MSG_INFO *msg_info, - uint8_t *data, - uint8_t size); ///< Pointer to \ref ARM_CAN_MessageRead : Read message received on CAN bus. - int32_t (*Control) (uint32_t control, - uint32_t arg); ///< Pointer to \ref ARM_CAN_Control : Control CAN interface. - ARM_CAN_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_CAN_GetStatus : Get CAN status. -} const ARM_DRIVER_CAN; - -#endif /* __DRIVER_CAN_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH.h deleted file mode 100644 index 29b9e06e7..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH.h +++ /dev/null @@ -1,85 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 7. Mar 2014 - * $Revision: V2.00 - * - * Project: Ethernet PHY and MAC Driver common definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.00 - * Removed ARM_ETH_STATUS enumerator - * Removed ARM_ETH_MODE enumerator - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_ETH_H -#define __DRIVER_ETH_H - -#include "Driver_Common.h" - -/** -\brief Ethernet Media Interface type -*/ -#define ARM_ETH_INTERFACE_MII 0 ///< Media Independent Interface (MII) -#define ARM_ETH_INTERFACE_RMII 1 ///< Reduced Media Independent Interface (RMII) -#define ARM_ETH_INTERFACE_SMII 2 ///< Serial Media Independent Interface (SMII) - -/** -\brief Ethernet link speed -*/ -#define ARM_ETH_SPEED_10M 0 ///< 10 Mbps link speed -#define ARM_ETH_SPEED_100M 1 ///< 100 Mbps link speed -#define ARM_ETH_SPEED_1G 2 ///< 1 Gpbs link speed - -/** -\brief Ethernet duplex mode -*/ -#define ARM_ETH_DUPLEX_HALF 0 ///< Half duplex link -#define ARM_ETH_DUPLEX_FULL 1 ///< Full duplex link - -/** -\brief Ethernet link state -*/ -typedef enum _ARM_ETH_LINK_STATE { - ARM_ETH_LINK_DOWN, ///< Link is down - ARM_ETH_LINK_UP ///< Link is up -} ARM_ETH_LINK_STATE; - -/** -\brief Ethernet link information -*/ -typedef struct _ARM_ETH_LINK_INFO { - uint32_t speed : 2; ///< Link speed: 0= 10 MBit, 1= 100 MBit, 2= 1 GBit - uint32_t duplex : 1; ///< Duplex mode: 0= Half, 1= Full -} ARM_ETH_LINK_INFO; - -/** -\brief Ethernet MAC Address -*/ -typedef struct _ARM_ETH_MAC_ADDR { - uint8_t b[6]; ///< MAC Address (6 bytes), MSB first -} ARM_ETH_MAC_ADDR; - -#endif /* __DRIVER_ETH_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_MAC.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_MAC.h deleted file mode 100644 index 775fab5d9..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_MAC.h +++ /dev/null @@ -1,301 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 30. May 2014 - * $Revision: V2.01 - * - * Project: Ethernet MAC (Media Access Control) Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.01 - * Added ARM_ETH_MAC_SLEEP Control - * Version 2.00 - * Changed MAC Address handling: - * moved from ARM_ETH_MAC_Initialize - * to new functions ARM_ETH_MAC_GetMacAddress and ARM_ETH_MAC_SetMacAddress - * Replaced ARM_ETH_MAC_SetMulticastAddr function with ARM_ETH_MAC_SetAddressFilter - * Extended ARM_ETH_MAC_SendFrame function with flags - * Added ARM_ETH_MAC_Control function: - * more control options (Broadcast, Multicast, Checksum offload, VLAN, ...) - * replaces ARM_ETH_MAC_SetMode - * replaces ARM_ETH_MAC_EnableTx, ARM_ETH_MAC_EnableRx - * Added optional event on transmitted frame - * Added support for PTP (Precision Time Protocol) through new functions: - * ARM_ETH_MAC_ControlTimer - * ARM_ETH_MAC_GetRxFrameTime - * ARM_ETH_MAC_GetTxFrameTime - * Changed prefix ARM_DRV -> ARM_DRIVER - * Changed return values of some functions to int32_t - * Version 1.10 - * Name space prefix ARM_ added - * Version 1.01 - * Renamed capabilities items for checksum offload - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_ETH_MAC_H -#define __DRIVER_ETH_MAC_H - -#include "Driver_ETH.h" - -#define ARM_ETH_MAC_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ - - -#define _ARM_Driver_ETH_MAC_(n) Driver_ETH_MAC##n -#define ARM_Driver_ETH_MAC_(n) _ARM_Driver_ETH_MAC_(n) - - -/****** Ethernet MAC Control Codes *****/ - -#define ARM_ETH_MAC_CONFIGURE (0x01) ///< Configure MAC; arg = configuration -#define ARM_ETH_MAC_CONTROL_TX (0x02) ///< Transmitter; arg: 0=disabled (default), 1=enabled -#define ARM_ETH_MAC_CONTROL_RX (0x03) ///< Receiver; arg: 0=disabled (default), 1=enabled -#define ARM_ETH_MAC_FLUSH (0x04) ///< Flush buffer; arg = ARM_ETH_MAC_FLUSH_... -#define ARM_ETH_MAC_SLEEP (0x05) ///< Sleep mode; arg: 1=enter and wait for Magic packet, 0=exit -#define ARM_ETH_MAC_VLAN_FILTER (0x06) ///< VLAN Filter for received frames; arg15..0: VLAN Tag; arg16: optional ARM_ETH_MAC_VLAN_FILTER_ID_ONLY; 0=disabled (default) - -/*----- Ethernet MAC Configuration -----*/ -#define ARM_ETH_MAC_SPEED_Pos 0 -#define ARM_ETH_MAC_SPEED_Msk (3UL << ARM_ETH_MAC_SPEED_Pos) -#define ARM_ETH_MAC_SPEED_10M (ARM_ETH_SPEED_10M << ARM_ETH_MAC_SPEED_Pos) ///< 10 Mbps link speed -#define ARM_ETH_MAC_SPEED_100M (ARM_ETH_SPEED_100M << ARM_ETH_MAC_SPEED_Pos) ///< 100 Mbps link speed -#define ARM_ETH_MAC_SPEED_1G (ARM_ETH_SPEED_1G << ARM_ETH_MAC_SPEED_Pos) ///< 1 Gpbs link speed -#define ARM_ETH_MAC_DUPLEX_Pos 2 -#define ARM_ETH_MAC_DUPLEX_Msk (1UL << ARM_ETH_MAC_DUPLEX_Pos) -#define ARM_ETH_MAC_DUPLEX_HALF (ARM_ETH_DUPLEX_HALF << ARM_ETH_MAC_DUPLEX_Pos) ///< Half duplex link -#define ARM_ETH_MAC_DUPLEX_FULL (ARM_ETH_DUPLEX_FULL << ARM_ETH_MAC_DUPLEX_Pos) ///< Full duplex link -#define ARM_ETH_MAC_LOOPBACK (1UL << 4) ///< Loop-back test mode -#define ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX (1UL << 5) ///< Receiver Checksum offload -#define ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX (1UL << 6) ///< Transmitter Checksum offload -#define ARM_ETH_MAC_ADDRESS_BROADCAST (1UL << 7) ///< Accept frames with Broadcast address -#define ARM_ETH_MAC_ADDRESS_MULTICAST (1UL << 8) ///< Accept frames with any Multicast address -#define ARM_ETH_MAC_ADDRESS_ALL (1UL << 9) ///< Accept frames with any address (Promiscuous Mode) - -/*----- Ethernet MAC Flush Flags -----*/ -#define ARM_ETH_MAC_FLUSH_RX (1UL << 0) ///< Flush Receive buffer -#define ARM_ETH_MAC_FLUSH_TX (1UL << 1) ///< Flush Transmit buffer - -/*----- Ethernet MAC VLAN Filter Flag -----*/ -#define ARM_ETH_MAC_VLAN_FILTER_ID_ONLY (1UL << 16) ///< Compare only the VLAN Identifier (12-bit) - - -/****** Ethernet MAC Frame Transmit Flags *****/ -#define ARM_ETH_MAC_TX_FRAME_FRAGMENT (1UL << 0) ///< Indicate frame fragment -#define ARM_ETH_MAC_TX_FRAME_EVENT (1UL << 1) ///< Generate event when frame is transmitted -#define ARM_ETH_MAC_TX_FRAME_TIMESTAMP (1UL << 2) ///< Capture frame time stamp - - -/****** Ethernet MAC Timer Control Codes *****/ -#define ARM_ETH_MAC_TIMER_GET_TIME (0x01) ///< Get current time -#define ARM_ETH_MAC_TIMER_SET_TIME (0x02) ///< Set new time -#define ARM_ETH_MAC_TIMER_INC_TIME (0x03) ///< Increment current time -#define ARM_ETH_MAC_TIMER_DEC_TIME (0x04) ///< Decrement current time -#define ARM_ETH_MAC_TIMER_SET_ALARM (0x05) ///< Set alarm time -#define ARM_ETH_MAC_TIMER_ADJUST_CLOCK (0x06) ///< Adjust clock frequency; time->ns: correction factor * 2^31 - - -/** -\brief Ethernet MAC Time -*/ -typedef struct _ARM_ETH_MAC_TIME { - uint32_t ns; ///< Nano seconds - uint32_t sec; ///< Seconds -} ARM_ETH_MAC_TIME; - - -/****** Ethernet MAC Event *****/ -#define ARM_ETH_MAC_EVENT_RX_FRAME (1UL << 0) ///< Frame Received -#define ARM_ETH_MAC_EVENT_TX_FRAME (1UL << 1) ///< Frame Transmitted -#define ARM_ETH_MAC_EVENT_WAKEUP (1UL << 2) ///< Wake-up (on Magic Packet) -#define ARM_ETH_MAC_EVENT_TIMER_ALARM (1UL << 3) ///< Timer Alarm - - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn ARM_ETH_MAC_CAPABILITIES ARM_ETH_MAC_GetCapabilities (void) - \brief Get driver capabilities. - \return \ref ARM_ETH_MAC_CAPABILITIES -*/ -/** - \fn int32_t ARM_ETH_MAC_Initialize (ARM_ETH_MAC_SignalEvent_t cb_event) - \brief Initialize Ethernet MAC Device. - \param[in] cb_event Pointer to \ref ARM_ETH_MAC_SignalEvent - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_Uninitialize (void) - \brief De-initialize Ethernet MAC Device. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_PowerControl (ARM_POWER_STATE state) - \brief Control Ethernet MAC Device Power. - \param[in] state Power state - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_GetMacAddress (ARM_ETH_MAC_ADDR *ptr_addr) - \brief Get Ethernet MAC Address. - \param[in] ptr_addr Pointer to address - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) - \brief Set Ethernet MAC Address. - \param[in] ptr_addr Pointer to address - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, - uint32_t num_addr) - \brief Configure Address Filter. - \param[in] ptr_addr Pointer to addresses - \param[in] num_addr Number of addresses to configure - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) - \brief Send Ethernet frame. - \param[in] frame Pointer to frame buffer with data to send - \param[in] len Frame buffer length in bytes - \param[in] flags Frame transmit flags (see ARM_ETH_MAC_TX_FRAME_...) - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_ReadFrame (uint8_t *frame, uint32_t len) - \brief Read data of received Ethernet frame. - \param[in] frame Pointer to frame buffer for data to read into - \param[in] len Frame buffer length in bytes - \return number of data bytes read or execution status - - value >= 0: number of data bytes read - - value < 0: error occurred, value is execution status as defined with \ref execution_status -*/ -/** - \fn uint32_t ARM_ETH_MAC_GetRxFrameSize (void) - \brief Get size of received Ethernet frame. - \return number of bytes in received frame -*/ -/** - \fn int32_t ARM_ETH_MAC_GetRxFrameTime (ARM_ETH_MAC_TIME *time) - \brief Get time of received Ethernet frame. - \param[in] time Pointer to time structure for data to read into - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_GetTxFrameTime (ARM_ETH_MAC_TIME *time) - \brief Get time of transmitted Ethernet frame. - \param[in] time Pointer to time structure for data to read into - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_Control (uint32_t control, uint32_t arg) - \brief Control Ethernet Interface. - \param[in] control Operation - \param[in] arg Argument of operation (optional) - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) - \brief Control Precision Timer. - \param[in] control Operation - \param[in] time Pointer to time structure - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) - \brief Read Ethernet PHY Register through Management Interface. - \param[in] phy_addr 5-bit device address - \param[in] reg_addr 5-bit register address - \param[out] data Pointer where the result is written to - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_MAC_PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data) - \brief Write Ethernet PHY Register through Management Interface. - \param[in] phy_addr 5-bit device address - \param[in] reg_addr 5-bit register address - \param[in] data 16-bit data to write - \return \ref execution_status -*/ - -/** - \fn void ARM_ETH_MAC_SignalEvent (uint32_t event) - \brief Callback function that signals a Ethernet Event. - \param[in] event event notification mask - \return none -*/ - -typedef void (*ARM_ETH_MAC_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_ETH_MAC_SignalEvent : Signal Ethernet Event. - - -/** -\brief Ethernet MAC Capabilities -*/ -typedef struct _ARM_ETH_MAC_CAPABILITIES { - uint32_t checksum_offload_rx_ip4 : 1; ///< 1 = IPv4 header checksum verified on receive - uint32_t checksum_offload_rx_ip6 : 1; ///< 1 = IPv6 checksum verification supported on receive - uint32_t checksum_offload_rx_udp : 1; ///< 1 = UDP payload checksum verified on receive - uint32_t checksum_offload_rx_tcp : 1; ///< 1 = TCP payload checksum verified on receive - uint32_t checksum_offload_rx_icmp : 1; ///< 1 = ICMP payload checksum verified on receive - uint32_t checksum_offload_tx_ip4 : 1; ///< 1 = IPv4 header checksum generated on transmit - uint32_t checksum_offload_tx_ip6 : 1; ///< 1 = IPv6 checksum generation supported on transmit - uint32_t checksum_offload_tx_udp : 1; ///< 1 = UDP payload checksum generated on transmit - uint32_t checksum_offload_tx_tcp : 1; ///< 1 = TCP payload checksum generated on transmit - uint32_t checksum_offload_tx_icmp : 1; ///< 1 = ICMP payload checksum generated on transmit - uint32_t media_interface : 2; ///< Ethernet Media Interface type - uint32_t mac_address : 1; ///< 1 = driver provides initial valid MAC address - uint32_t event_rx_frame : 1; ///< 1 = callback event \ref ARM_ETH_MAC_EVENT_RX_FRAME generated - uint32_t event_tx_frame : 1; ///< 1 = callback event \ref ARM_ETH_MAC_EVENT_TX_FRAME generated - uint32_t event_wakeup : 1; ///< 1 = wakeup event \ref ARM_ETH_MAC_EVENT_WAKEUP generated - uint32_t precision_timer : 1; ///< 1 = Precision Timer supported -} ARM_ETH_MAC_CAPABILITIES; - - -/** -\brief Access structure of the Ethernet MAC Driver -*/ -typedef struct _ARM_DRIVER_ETH_MAC { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_ETH_MAC_GetVersion : Get driver version. - ARM_ETH_MAC_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_ETH_MAC_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_ETH_MAC_SignalEvent_t cb_event); ///< Pointer to \ref ARM_ETH_MAC_Initialize : Initialize Ethernet MAC Device. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_ETH_MAC_Uninitialize : De-initialize Ethernet MAC Device. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_ETH_MAC_PowerControl : Control Ethernet MAC Device Power. - int32_t (*GetMacAddress) ( ARM_ETH_MAC_ADDR *ptr_addr); ///< Pointer to \ref ARM_ETH_MAC_GetMacAddress : Get Ethernet MAC Address. - int32_t (*SetMacAddress) (const ARM_ETH_MAC_ADDR *ptr_addr); ///< Pointer to \ref ARM_ETH_MAC_SetMacAddress : Set Ethernet MAC Address. - int32_t (*SetAddressFilter)(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr); ///< Pointer to \ref ARM_ETH_MAC_SetAddressFilter : Configure Address Filter. - int32_t (*SendFrame) (const uint8_t *frame, uint32_t len, uint32_t flags); ///< Pointer to \ref ARM_ETH_MAC_SendFrame : Send Ethernet frame. - int32_t (*ReadFrame) ( uint8_t *frame, uint32_t len); ///< Pointer to \ref ARM_ETH_MAC_ReadFrame : Read data of received Ethernet frame. - uint32_t (*GetRxFrameSize) (void); ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameSize : Get size of received Ethernet frame. - int32_t (*GetRxFrameTime) (ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameTime : Get time of received Ethernet frame. - int32_t (*GetTxFrameTime) (ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_GetTxFrameTime : Get time of transmitted Ethernet frame. - int32_t (*ControlTimer) (uint32_t control, ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_ControlTimer : Control Precision Timer. - int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_ETH_MAC_Control : Control Ethernet Interface. - int32_t (*PHY_Read) (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register through Management Interface. - int32_t (*PHY_Write) (uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register through Management Interface. -} const ARM_DRIVER_ETH_MAC; - -#endif /* __DRIVER_ETH_MAC_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_PHY.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_PHY.h deleted file mode 100644 index d647a5d7e..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_ETH_PHY.h +++ /dev/null @@ -1,133 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 7. Mar 2014 - * $Revision: V2.00 - * - * Project: Ethernet PHY (Physical Transceiver) Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.00 - * changed parameter "mode" in function ARM_ETH_PHY_SetMode - * Changed prefix ARM_DRV -> ARM_DRIVER - * Changed return values of some functions to int32_t - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_ETH_PHY_H -#define __DRIVER_ETH_PHY_H - -#include "Driver_ETH.h" - -#define ARM_ETH_PHY_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,00) /* API version */ - - -#define _ARM_Driver_ETH_PHY_(n) Driver_ETH_PHY##n -#define ARM_Driver_ETH_PHY_(n) _ARM_Driver_ETH_PHY_(n) - - -/****** Ethernet PHY Mode *****/ -#define ARM_ETH_PHY_SPEED_Pos 0 -#define ARM_ETH_PHY_SPEED_Msk (3UL << ARM_ETH_PHY_SPEED_Pos) -#define ARM_ETH_PHY_SPEED_10M (ARM_ETH_SPEED_10M << ARM_ETH_PHY_SPEED_Pos) ///< 10 Mbps link speed -#define ARM_ETH_PHY_SPEED_100M (ARM_ETH_SPEED_100M << ARM_ETH_PHY_SPEED_Pos) ///< 100 Mbps link speed -#define ARM_ETH_PHY_SPEED_1G (ARM_ETH_SPEED_1G << ARM_ETH_PHY_SPEED_Pos) ///< 1 Gpbs link speed -#define ARM_ETH_PHY_DUPLEX_Pos 2 -#define ARM_ETH_PHY_DUPLEX_Msk (1UL << ARM_ETH_PHY_DUPLEX_Pos) -#define ARM_ETH_PHY_DUPLEX_HALF (ARM_ETH_DUPLEX_HALF << ARM_ETH_PHY_DUPLEX_Pos) ///< Half duplex link -#define ARM_ETH_PHY_DUPLEX_FULL (ARM_ETH_DUPLEX_FULL << ARM_ETH_PHY_DUPLEX_Pos) ///< Full duplex link -#define ARM_ETH_PHY_AUTO_NEGOTIATE (1UL << 3) ///< Auto Negotiation mode -#define ARM_ETH_PHY_LOOPBACK (1UL << 4) ///< Loop-back test mode -#define ARM_ETH_PHY_ISOLATE (1UL << 5) ///< Isolate PHY from MII/RMII interface - - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_ETH_PHY_GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn int32_t ARM_ETH_PHY_Initialize (ARM_ETH_PHY_Read_t fn_read, - ARM_ETH_PHY_Write_t fn_write) - \brief Initialize Ethernet PHY Device. - \param[in] fn_read Pointer to \ref ARM_ETH_MAC_PHY_Read - \param[in] fn_write Pointer to \ref ARM_ETH_MAC_PHY_Write - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_PHY_Uninitialize (void) - \brief De-initialize Ethernet PHY Device. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_PHY_PowerControl (ARM_POWER_STATE state) - \brief Control Ethernet PHY Device Power. - \param[in] state Power state - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_PHY_SetInterface (uint32_t interface) - \brief Set Ethernet Media Interface. - \param[in] interface Media Interface type - \return \ref execution_status -*/ -/** - \fn int32_t ARM_ETH_PHY_SetMode (uint32_t mode) - \brief Set Ethernet PHY Device Operation mode. - \param[in] mode Operation Mode - \return \ref execution_status -*/ -/** - \fn ARM_ETH_LINK_STATE ARM_ETH_PHY_GetLinkState (void) - \brief Get Ethernet PHY Device Link state. - \return current link status \ref ARM_ETH_LINK_STATE -*/ -/** - \fn ARM_ETH_LINK_INFO ARM_ETH_PHY_GetLinkInfo (void) - \brief Get Ethernet PHY Device Link information. - \return current link parameters \ref ARM_ETH_LINK_INFO -*/ - - -typedef int32_t (*ARM_ETH_PHY_Read_t) (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register. -typedef int32_t (*ARM_ETH_PHY_Write_t) (uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register. - - -/** -\brief Access structure of the Ethernet PHY Driver -*/ -typedef struct _ARM_DRIVER_ETH_PHY { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_ETH_PHY_GetVersion : Get driver version. - int32_t (*Initialize) (ARM_ETH_PHY_Read_t fn_read, - ARM_ETH_PHY_Write_t fn_write); ///< Pointer to \ref ARM_ETH_PHY_Initialize : Initialize PHY Device. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_ETH_PHY_Uninitialize : De-initialize PHY Device. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_ETH_PHY_PowerControl : Control PHY Device Power. - int32_t (*SetInterface) (uint32_t interface); ///< Pointer to \ref ARM_ETH_PHY_SetInterface : Set Ethernet Media Interface. - int32_t (*SetMode) (uint32_t mode); ///< Pointer to \ref ARM_ETH_PHY_SetMode : Set Ethernet PHY Device Operation mode. - ARM_ETH_LINK_STATE (*GetLinkState) (void); ///< Pointer to \ref ARM_ETH_PHY_GetLinkState : Get Ethernet PHY Device Link state. - ARM_ETH_LINK_INFO (*GetLinkInfo) (void); ///< Pointer to \ref ARM_ETH_PHY_GetLinkInfo : Get Ethernet PHY Device Link information. -} const ARM_DRIVER_ETH_PHY; - -#endif /* __DRIVER_ETH_PHY_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_MCI.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_MCI.h deleted file mode 100644 index 9565af669..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_MCI.h +++ /dev/null @@ -1,350 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 16. May 2014 - * $Revision: V2.02 - * - * Project: MCI (Memory Card Interface) Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.02 - * Added timeout and error flags to ARM_MCI_STATUS - * Added support for controlling optional RST_n pin (eMMC) - * Removed explicit Clock Control (ARM_MCI_CONTROL_CLOCK) - * Removed event ARM_MCI_EVENT_BOOT_ACK_TIMEOUT - * Version 2.01 - * Decoupled SPI mode from MCI driver - * Replaced function ARM_MCI_CardSwitchRead with ARM_MCI_ReadCD and ARM_MCI_ReadWP - * Version 2.00 - * Added support for: - * SD UHS-I (Ultra High Speed) - * SD I/O Interrupt - * Read Wait (SD I/O) - * Suspend/Resume (SD I/O) - * MMC Interrupt - * MMC Boot - * Stream Data transfer (MMC) - * VCCQ Power Supply Control (eMMC) - * Command Completion Signal (CCS) for CE-ATA - * Added ARM_MCI_Control function - * Added ARM_MCI_GetStatus function - * Removed ARM_MCI_BusMode, ARM_MCI_BusDataWidth, ARM_MCI_BusSingaling functions - * (replaced by ARM_MCI_Control) - * Changed ARM_MCI_CardPower function (voltage parameter) - * Changed ARM_MCI_SendCommnad function (flags parameter) - * Changed ARM_MCI_SetupTransfer function (mode parameter) - * Removed ARM_MCI_ReadTransfer and ARM_MCI_WriteTransfer functions - * Changed prefix ARM_DRV -> ARM_DRIVER - * Changed return values of some functions to int32_t - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_MCI_H -#define __DRIVER_MCI_H - -#include "Driver_Common.h" - -#define ARM_MCI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,02) /* API version */ - - -/****** MCI Send Command Flags *****/ -#define ARM_MCI_RESPONSE_Pos 0 -#define ARM_MCI_RESPONSE_Msk (3UL << ARM_MCI_RESPONSE_Pos) -#define ARM_MCI_RESPONSE_NONE (0UL << ARM_MCI_RESPONSE_Pos) ///< No response expected (default) -#define ARM_MCI_RESPONSE_SHORT (1UL << ARM_MCI_RESPONSE_Pos) ///< Short response (48-bit) -#define ARM_MCI_RESPONSE_SHORT_BUSY (2UL << ARM_MCI_RESPONSE_Pos) ///< Short response with busy signal (48-bit) -#define ARM_MCI_RESPONSE_LONG (3UL << ARM_MCI_RESPONSE_Pos) ///< Long response (136-bit) - -#define ARM_MCI_RESPONSE_INDEX (1UL << 2) ///< Check command index in response -#define ARM_MCI_RESPONSE_CRC (1UL << 3) ///< Check CRC in response - -#define ARM_MCI_WAIT_BUSY (1UL << 4) ///< Wait until busy before sending the command - -#define ARM_MCI_TRANSFER_DATA (1UL << 5) ///< Activate Data transfer - -#define ARM_MCI_CARD_INITIALIZE (1UL << 6) ///< Execute Memory Card initialization sequence - -#define ARM_MCI_INTERRUPT_COMMAND (1UL << 7) ///< Send Interrupt command (CMD40 - MMC only) -#define ARM_MCI_INTERRUPT_RESPONSE (1UL << 8) ///< Send Interrupt response (CMD40 - MMC only) - -#define ARM_MCI_BOOT_OPERATION (1UL << 9) ///< Execute Boot operation (MMC only) -#define ARM_MCI_BOOT_ALTERNATIVE (1UL << 10) ///< Execute Alternative Boot operation (MMC only) -#define ARM_MCI_BOOT_ACK (1UL << 11) ///< Expect Boot Acknowledge (MMC only) - -#define ARM_MCI_CCSD (1UL << 12) ///< Send Command Completion Signal Disable (CCSD) for CE-ATA device -#define ARM_MCI_CCS (1UL << 13) ///< Expect Command Completion Signal (CCS) for CE-ATA device - - -/****** MCI Setup Transfer Mode *****/ -#define ARM_MCI_TRANSFER_READ (0UL << 0) ///< Data Read Transfer (from MCI) -#define ARM_MCI_TRANSFER_WRITE (1UL << 0) ///< Data Write Transfer (to MCI) -#define ARM_MCI_TRANSFER_BLOCK (0UL << 1) ///< Block Data transfer (default) -#define ARM_MCI_TRANSFER_STREAM (1UL << 1) ///< Stream Data transfer (MMC only) - - -/****** MCI Control Codes *****/ -#define ARM_MCI_BUS_SPEED (0x01) ///< Set Bus Speed; arg = requested speed in bits/s; returns configured speed in bits/s -#define ARM_MCI_BUS_SPEED_MODE (0x02) ///< Set Bus Speed Mode as specified with arg -#define ARM_MCI_BUS_CMD_MODE (0x03) ///< Set CMD Line Mode as specified with arg -#define ARM_MCI_BUS_DATA_WIDTH (0x04) ///< Set Bus Data Width as specified with arg -#define ARM_MCI_DRIVER_STRENGTH (0x05) ///< Set SD UHS-I Driver Strength as specified with arg -#define ARM_MCI_CONTROL_RESET (0x06) ///< Control optional RST_n Pin (eMMC); arg: 0=inactive, 1=active -#define ARM_MCI_CONTROL_CLOCK_IDLE (0x07) ///< Control Clock generation on CLK Pin when idle; arg: 0=disabled, 1=enabled -#define ARM_MCI_UHS_TUNING_OPERATION (0x08) ///< Sampling clock Tuning operation (SD UHS-I); arg: 0=reset, 1=execute -#define ARM_MCI_UHS_TUNING_RESULT (0x09) ///< Sampling clock Tuning result (SD UHS-I); returns: 0=done, 1=in progress, -1=error -#define ARM_MCI_DATA_TIMEOUT (0x0A) ///< Set Data timeout; arg = timeout in bus cycles -#define ARM_MCI_CSS_TIMEOUT (0x0B) ///< Set Command Completion Signal (CCS) timeout; arg = timeout in bus cycles -#define ARM_MCI_MONITOR_SDIO_INTERRUPT (0x0C) ///< Monitor SD I/O interrupt: arg: 0=disabled, 1=enabled -#define ARM_MCI_CONTROL_READ_WAIT (0x0D) ///< Control Read/Wait for SD I/O; arg: 0=disabled, 1=enabled -#define ARM_MCI_SUSPEND_TRANSFER (0x0E) ///< Suspend Data transfer (SD I/O); returns number of remaining bytes to transfer -#define ARM_MCI_RESUME_TRANSFER (0x0F) ///< Resume Data transfer (SD I/O) - -/*----- MCI Bus Speed Mode -----*/ -#define ARM_MCI_BUS_DEFAULT_SPEED (0x00) ///< SD/MMC: Default Speed mode up to 25/26MHz -#define ARM_MCI_BUS_HIGH_SPEED (0x01) ///< SD/MMC: High Speed mode up to 50/52MHz -#define ARM_MCI_BUS_UHS_SDR12 (0x02) ///< SD: SDR12 (Single Data Rate) up to 25MHz, 12.5MB/s: UHS-I (Ultra High Speed) 1.8V signaling -#define ARM_MCI_BUS_UHS_SDR25 (0x03) ///< SD: SDR25 (Single Data Rate) up to 50MHz, 25 MB/s: UHS-I (Ultra High Speed) 1.8V signaling -#define ARM_MCI_BUS_UHS_SDR50 (0x04) ///< SD: SDR50 (Single Data Rate) up to 100MHz, 50 MB/s: UHS-I (Ultra High Speed) 1.8V signaling -#define ARM_MCI_BUS_UHS_SDR104 (0x05) ///< SD: SDR104 (Single Data Rate) up to 208MHz, 104 MB/s: UHS-I (Ultra High Speed) 1.8V signaling -#define ARM_MCI_BUS_UHS_DDR50 (0x06) ///< SD: DDR50 (Dual Data Rate) up to 50MHz, 50 MB/s: UHS-I (Ultra High Speed) 1.8V signaling - -/*----- MCI CMD Line Mode -----*/ -#define ARM_MCI_BUS_CMD_PUSH_PULL (0x00) ///< Push-Pull CMD line (default) -#define ARM_MCI_BUS_CMD_OPEN_DRAIN (0x01) ///< Open Drain CMD line (MMC only) - -/*----- MCI Bus Data Width -----*/ -#define ARM_MCI_BUS_DATA_WIDTH_1 (0x00) ///< Bus data width: 1 bit (default) -#define ARM_MCI_BUS_DATA_WIDTH_4 (0x01) ///< Bus data width: 4 bits -#define ARM_MCI_BUS_DATA_WIDTH_8 (0x02) ///< Bus data width: 8 bits -#define ARM_MCI_BUS_DATA_WIDTH_4_DDR (0x03) ///< Bus data width: 4 bits, DDR (Dual Data Rate) - MMC only -#define ARM_MCI_BUS_DATA_WIDTH_8_DDR (0x04) ///< Bus data width: 8 bits, DDR (Dual Data Rate) - MMC only - -/*----- MCI Driver Strength -----*/ -#define ARM_MCI_DRIVER_TYPE_A (0x01) ///< SD UHS-I Driver Type A -#define ARM_MCI_DRIVER_TYPE_B (0x00) ///< SD UHS-I Driver Type B (default) -#define ARM_MCI_DRIVER_TYPE_C (0x02) ///< SD UHS-I Driver Type C -#define ARM_MCI_DRIVER_TYPE_D (0x03) ///< SD UHS-I Driver Type D - - -/****** MCI Card Power *****/ -#define ARM_MCI_POWER_VDD_Pos 0 -#define ARM_MCI_POWER_VDD_Msk (0x0FUL << ARM_MCI_POWER_VDD_Pos) -#define ARM_MCI_POWER_VDD_OFF (0x01UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) turned off -#define ARM_MCI_POWER_VDD_3V3 (0x02UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) = 3.3V -#define ARM_MCI_POWER_VDD_1V8 (0x03UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) = 1.8V -#define ARM_MCI_POWER_VCCQ_Pos 4 -#define ARM_MCI_POWER_VCCQ_Msk (0x0FUL << ARM_MCI_POWER_VCCQ_Pos) -#define ARM_MCI_POWER_VCCQ_OFF (0x01UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ turned off -#define ARM_MCI_POWER_VCCQ_3V3 (0x02UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 3.3V -#define ARM_MCI_POWER_VCCQ_1V8 (0x03UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 1.8V -#define ARM_MCI_POWER_VCCQ_1V2 (0x04UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 1.2V - - -/** -\brief MCI Status -*/ -typedef struct _ARM_MCI_STATUS { - uint32_t command_active : 1; ///< Command active flag - uint32_t command_timeout : 1; ///< Command timeout flag (cleared on start of next command) - uint32_t command_error : 1; ///< Command error flag (cleared on start of next command) - uint32_t transfer_active : 1; ///< Transfer active flag - uint32_t transfer_timeout : 1; ///< Transfer timeout flag (cleared on start of next command) - uint32_t transfer_error : 1; ///< Transfer error flag (cleared on start of next command) - uint32_t sdio_interrupt : 1; ///< SD I/O Interrupt flag (cleared on start of monitoring) - uint32_t ccs : 1; ///< CCS flag (cleared on start of next command) -} ARM_MCI_STATUS; - - -/****** MCI Card Event *****/ -#define ARM_MCI_EVENT_CARD_INSERTED (1UL << 0) ///< Memory Card inserted -#define ARM_MCI_EVENT_CARD_REMOVED (1UL << 1) ///< Memory Card removed -#define ARM_MCI_EVENT_COMMAND_COMPLETE (1UL << 2) ///< Command completed -#define ARM_MCI_EVENT_COMMAND_TIMEOUT (1UL << 3) ///< Command timeout -#define ARM_MCI_EVENT_COMMAND_ERROR (1UL << 4) ///< Command response error (CRC error or invalid response) -#define ARM_MCI_EVENT_TRANSFER_COMPLETE (1UL << 5) ///< Data transfer completed -#define ARM_MCI_EVENT_TRANSFER_TIMEOUT (1UL << 6) ///< Data transfer timeout -#define ARM_MCI_EVENT_TRANSFER_ERROR (1UL << 7) ///< Data transfer CRC failed -#define ARM_MCI_EVENT_SDIO_INTERRUPT (1UL << 8) ///< SD I/O Interrupt -#define ARM_MCI_EVENT_CCS (1UL << 9) ///< Command Completion Signal (CCS) -#define ARM_MCI_EVENT_CCS_TIMEOUT (1UL << 10) ///< Command Completion Signal (CCS) Timeout - - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_MCI_GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn ARM_MCI_CAPABILITIES ARM_MCI_GetCapabilities (void) - \brief Get driver capabilities. - \return \ref ARM_MCI_CAPABILITIES -*/ -/** - \fn int32_t ARM_MCI_Initialize (ARM_MCI_SignalEvent_t cb_event) - \brief Initialize the Memory Card Interface - \param[in] cb_event Pointer to \ref ARM_MCI_SignalEvent - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_Uninitialize (void) - \brief De-initialize Memory Card Interface. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_PowerControl (ARM_POWER_STATE state) - \brief Control Memory Card Interface Power. - \param[in] state Power state \ref ARM_POWER_STATE - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_CardPower (uint32_t voltage) - \brief Set Memory Card Power supply voltage. - \param[in] voltage Memory Card Power supply voltage - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_ReadCD (void) - \brief Read Card Detect (CD) state. - \return 1:card detected, 0:card not detected, or error -*/ -/** - \fn int32_t ARM_MCI_ReadWP (void) - \brief Read Write Protect (WP) state. - \return 1:write protected, 0:not write protected, or error -*/ -/** - \fn int32_t ARM_MCI_SendCommand (uint32_t cmd, - uint32_t arg, - uint32_t flags, - uint32_t *response) - \brief Send Command to card and get the response. - \param[in] cmd Memory Card command - \param[in] arg Command argument - \param[in] flags Command flags - \param[out] response Pointer to buffer for response - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_SetupTransfer (uint8_t *data, - uint32_t block_count, - uint32_t block_size, - uint32_t mode) - \brief Setup read or write transfer operation. - \param[in,out] data Pointer to data block(s) to be written or read - \param[in] block_count Number of blocks - \param[in] block_size Size of a block in bytes - \param[in] mode Transfer mode - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_AbortTransfer (void) - \brief Abort current read/write data transfer. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_MCI_Control (uint32_t control, uint32_t arg) - \brief Control MCI Interface. - \param[in] control Operation - \param[in] arg Argument of operation (optional) - \return \ref execution_status -*/ -/** - \fn ARM_MCI_STATUS ARM_MCI_GetStatus (void) - \brief Get MCI status. - \return MCI status \ref ARM_MCI_STATUS -*/ - -/** - \fn void ARM_MCI_SignalEvent (uint32_t event) - \brief Callback function that signals a MCI Card Event. - \param[in] event \ref mci_event_gr - \return none -*/ - -typedef void (*ARM_MCI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_MCI_SignalEvent : Signal MCI Card Event. - - -/** -\brief MCI Driver Capabilities. -*/ -typedef struct _ARM_MCI_CAPABILITIES { - uint32_t cd_state : 1; ///< Card Detect State available - uint32_t cd_event : 1; ///< Signal Card Detect change event - uint32_t wp_state : 1; ///< Write Protect State available - uint32_t vdd : 1; ///< Supports VDD Card Power Supply Control - uint32_t vdd_1v8 : 1; ///< Supports 1.8 VDD Card Power Supply - uint32_t vccq : 1; ///< Supports VCCQ Card Power Supply Control (eMMC) - uint32_t vccq_1v8 : 1; ///< Supports 1.8 VCCQ Card Power Supply (eMMC) - uint32_t vccq_1v2 : 1; ///< Supports 1.2 VCCQ Card Power Supply (eMMC) - uint32_t data_width_4 : 1; ///< Supports 4-bit data - uint32_t data_width_8 : 1; ///< Supports 8-bit data - uint32_t data_width_4_ddr : 1; ///< Supports 4-bit data, DDR (Dual Data Rate) - MMC only - uint32_t data_width_8_ddr : 1; ///< Supports 8-bit data, DDR (Dual Data Rate) - MMC only - uint32_t high_speed : 1; ///< Supports SD/MMC High Speed Mode - uint32_t uhs_signaling : 1; ///< Supports SD UHS-I (Ultra High Speed) 1.8V signaling - uint32_t uhs_tuning : 1; ///< Supports SD UHS-I tuning - uint32_t uhs_sdr50 : 1; ///< Supports SD UHS-I SDR50 (Single Data Rate) up to 50MB/s - uint32_t uhs_sdr104 : 1; ///< Supports SD UHS-I SDR104 (Single Data Rate) up to 104MB/s - uint32_t uhs_ddr50 : 1; ///< Supports SD UHS-I DDR50 (Dual Data Rate) up to 50MB/s - uint32_t uhs_driver_type_a : 1; ///< Supports SD UHS-I Driver Type A - uint32_t uhs_driver_type_c : 1; ///< Supports SD UHS-I Driver Type C - uint32_t uhs_driver_type_d : 1; ///< Supports SD UHS-I Driver Type D - uint32_t sdio_interrupt : 1; ///< Supports SD I/O Interrupt - uint32_t read_wait : 1; ///< Supports Read Wait (SD I/O) - uint32_t suspend_resume : 1; ///< Supports Suspend/Resume (SD I/O) - uint32_t mmc_interrupt : 1; ///< Supports MMC Interrupt - uint32_t mmc_boot : 1; ///< Supports MMC Boot - uint32_t rst_n : 1; ///< Supports RST_n Pin Control (eMMC) - uint32_t ccs : 1; ///< Supports Command Completion Signal (CCS) for CE-ATA - uint32_t ccs_timeout : 1; ///< Supports Command Completion Signal (CCS) timeout for CE-ATA -} ARM_MCI_CAPABILITIES; - - -/** -\brief Access structure of the MCI Driver. -*/ -typedef struct _ARM_DRIVER_MCI { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_MCI_GetVersion : Get driver version. - ARM_MCI_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_MCI_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_MCI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_MCI_Initialize : Initialize MCI Interface. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_MCI_Uninitialize : De-initialize MCI Interface. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_MCI_PowerControl : Control MCI Interface Power. - int32_t (*CardPower) (uint32_t voltage); ///< Pointer to \ref ARM_MCI_CardPower : Set card power supply voltage. - int32_t (*ReadCD) (void); ///< Pointer to \ref ARM_MCI_ReadCD : Read Card Detect (CD) state. - int32_t (*ReadWP) (void); ///< Pointer to \ref ARM_MCI_ReadWP : Read Write Protect (WP) state. - int32_t (*SendCommand) (uint32_t cmd, - uint32_t arg, - uint32_t flags, - uint32_t *response); ///< Pointer to \ref ARM_MCI_SendCommand : Send Command to card and get the response. - int32_t (*SetupTransfer) (uint8_t *data, - uint32_t block_count, - uint32_t block_size, - uint32_t mode); ///< Pointer to \ref ARM_MCI_SetupTransfer : Setup data transfer operation. - int32_t (*AbortTransfer) (void); ///< Pointer to \ref ARM_MCI_AbortTransfer : Abort current data transfer. - int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_MCI_Control : Control MCI Interface. - ARM_MCI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_MCI_GetStatus : Get MCI status. -} const ARM_DRIVER_MCI; - -#endif /* __DRIVER_MCI_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_NAND.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_NAND.h deleted file mode 100644 index fb41cc9f7..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_NAND.h +++ /dev/null @@ -1,403 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 30. May 2014 - * $Revision: V2.01 - * - * Project: NAND Flash Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.01 - * Updated ARM_NAND_ECC_INFO structure and ARM_NAND_ECC_xxx definitions - * Version 2.00 - * New simplified driver: - * complexity moved to upper layer (command agnostic) - * Added support for: - * NV-DDR & NV-DDR2 Interface (ONFI specification) - * VCC, VCCQ and VPP Power Supply Control - * WP (Write Protect) Control - * Version 1.11 - * Changed prefix ARM_DRV -> ARM_DRIVER - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_NAND_H -#define __DRIVER_NAND_H - -#include "Driver_Common.h" - -#define ARM_NAND_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ - - -/****** NAND Device Power *****/ -#define ARM_NAND_POWER_VCC_Pos 0 -#define ARM_NAND_POWER_VCC_Msk (0x07UL << ARM_NAND_POWER_VCC_Pos) -#define ARM_NAND_POWER_VCC_OFF (0x01UL << ARM_NAND_POWER_VCC_Pos) ///< VCC Power off -#define ARM_NAND_POWER_VCC_3V3 (0x02UL << ARM_NAND_POWER_VCC_Pos) ///< VCC = 3.3V -#define ARM_NAND_POWER_VCC_1V8 (0x03UL << ARM_NAND_POWER_VCC_Pos) ///< VCC = 1.8V -#define ARM_NAND_POWER_VCCQ_Pos 3 -#define ARM_NAND_POWER_VCCQ_Msk (0x07UL << ARM_NAND_POWER_VCCQ_Pos) -#define ARM_NAND_POWER_VCCQ_OFF (0x01UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ I/O Power off -#define ARM_NAND_POWER_VCCQ_3V3 (0x02UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 3.3V -#define ARM_NAND_POWER_VCCQ_1V8 (0x03UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 1.8V -#define ARM_NAND_POWER_VPP_OFF (1UL << 6) ///< VPP off -#define ARM_NAND_POWER_VPP_ON (1Ul << 7) ///< VPP on - - -/****** NAND Control Codes *****/ -#define ARM_NAND_BUS_MODE (0x01) ///< Set Bus Mode as specified with arg -#define ARM_NAND_BUS_DATA_WIDTH (0x02) ///< Set Bus Data Width as specified with arg -#define ARM_NAND_DRIVER_STRENGTH (0x03) ///< Set Driver Strength as specified with arg -#define ARM_NAND_DEVICE_READY_EVENT (0x04) ///< Generate \ref ARM_NAND_EVENT_DEVICE_READY; arg: 0=disabled (default), 1=enabled -#define ARM_NAND_DRIVER_READY_EVENT (0x05) ///< Generate \ref ARM_NAND_EVENT_DRIVER_READY; arg: 0=disabled (default), 1=enabled - -/*----- NAND Bus Mode (ONFI - Open NAND Flash Interface) -----*/ -#define ARM_NAND_BUS_INTERFACE_Pos 4 -#define ARM_NAND_BUS_INTERFACE_Msk (0x03UL << ARM_NAND_BUS_INTERFACE_Pos) -#define ARM_NAND_BUS_SDR (0x00UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: SDR (Single Data Rate) - Traditional interface (default) -#define ARM_NAND_BUS_DDR (0x01UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: NV-DDR (Double Data Rate) -#define ARM_NAND_BUS_DDR2 (0x02UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: NV-DDR2 (Double Data Rate) -#define ARM_NAND_BUS_TIMING_MODE_Pos 0 -#define ARM_NAND_BUS_TIMING_MODE_Msk (0x0FUL << ARM_NAND_BUS_TIMING_MODE_Pos) -#define ARM_NAND_BUS_TIMING_MODE_0 (0x00UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 0 (default) -#define ARM_NAND_BUS_TIMING_MODE_1 (0x01UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 1 -#define ARM_NAND_BUS_TIMING_MODE_2 (0x02UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 2 -#define ARM_NAND_BUS_TIMING_MODE_3 (0x03UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 3 -#define ARM_NAND_BUS_TIMING_MODE_4 (0x04UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 4 (SDR EDO capable) -#define ARM_NAND_BUS_TIMING_MODE_5 (0x05UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 5 (SDR EDO capable) -#define ARM_NAND_BUS_TIMING_MODE_6 (0x06UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 6 (NV-DDR2 only) -#define ARM_NAND_BUS_TIMING_MODE_7 (0x07UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 7 (NV-DDR2 only) -#define ARM_NAND_BUS_DDR2_DO_WCYC_Pos 8 -#define ARM_NAND_BUS_DDR2_DO_WCYC_Msk (0x0FUL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) -#define ARM_NAND_BUS_DDR2_DO_WCYC_0 (0x00UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 0 (default) -#define ARM_NAND_BUS_DDR2_DO_WCYC_1 (0x01UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 1 -#define ARM_NAND_BUS_DDR2_DO_WCYC_2 (0x02UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 2 -#define ARM_NAND_BUS_DDR2_DO_WCYC_4 (0x03UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 4 -#define ARM_NAND_BUS_DDR2_DI_WCYC_Pos 12 -#define ARM_NAND_BUS_DDR2_DI_WCYC_Msk (0x0FUL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) -#define ARM_NAND_BUS_DDR2_DI_WCYC_0 (0x00UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 0 (default) -#define ARM_NAND_BUS_DDR2_DI_WCYC_1 (0x01UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 1 -#define ARM_NAND_BUS_DDR2_DI_WCYC_2 (0x02UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 2 -#define ARM_NAND_BUS_DDR2_DI_WCYC_4 (0x03UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 4 -#define ARM_NAND_BUS_DDR2_VEN (1UL << 16) ///< DDR2 Enable external VREFQ as reference -#define ARM_NAND_BUS_DDR2_CMPD (1UL << 17) ///< DDR2 Enable complementary DQS (DQS_c) signal -#define ARM_NAND_BUS_DDR2_CMPR (1UL << 18) ///< DDR2 Enable complementary RE_n (RE_c) signal - -/*----- NAND Data Bus Width -----*/ -#define ARM_NAND_BUS_DATA_WIDTH_8 (0x00) ///< Bus Data Width: 8 bit (default) -#define ARM_NAND_BUS_DATA_WIDTH_16 (0x01) ///< Bus Data Width: 16 bit - -/*----- NAND Driver Strength (ONFI - Open NAND Flash Interface) -----*/ -#define ARM_NAND_DRIVER_STRENGTH_18 (0x00) ///< Driver Strength 2.0x = 18 Ohms -#define ARM_NAND_DRIVER_STRENGTH_25 (0x01) ///< Driver Strength 1.4x = 25 Ohms -#define ARM_NAND_DRIVER_STRENGTH_35 (0x02) ///< Driver Strength 1.0x = 35 Ohms (default) -#define ARM_NAND_DRIVER_STRENGTH_50 (0x03) ///< Driver Strength 0.7x = 50 Ohms - - -/****** NAND ECC for Read/Write Data Mode and Sequence Execution Code *****/ -#define ARM_NAND_ECC_INDEX_Pos 0 -#define ARM_NAND_ECC_INDEX_Msk (0xFFUL << ARM_NAND_ECC_INDEX_Pos) -#define ARM_NAND_ECC(n) ((n) & ARM_NAND_ECC_INDEX_Msk) ///< Select ECC -#define ARM_NAND_ECC0 (1UL << 8) ///< Use ECC0 of selected ECC -#define ARM_NAND_ECC1 (1UL << 9) ///< Use ECC1 of selected ECC - -/****** NAND Flag for Read/Write Data Mode and Sequence Execution Code *****/ -#define ARM_NAND_DRIVER_DONE_EVENT (1UL << 16) ///< Generate \ref ARM_NAND_EVENT_DRIVER_DONE - -/****** NAND Sequence Execution Code *****/ -#define ARM_NAND_CODE_SEND_CMD1 (1UL << 17) ///< Send Command 1 -#define ARM_NAND_CODE_SEND_ADDR_COL1 (1UL << 18) ///< Send Column Address 1 -#define ARM_NAND_CODE_SEND_ADDR_COL2 (1UL << 19) ///< Send Column Address 2 -#define ARM_NAND_CODE_SEND_ADDR_ROW1 (1UL << 20) ///< Send Row Address 1 -#define ARM_NAND_CODE_SEND_ADDR_ROW2 (1UL << 21) ///< Send Row Address 2 -#define ARM_NAND_CODE_SEND_ADDR_ROW3 (1UL << 22) ///< Send Row Address 3 -#define ARM_NAND_CODE_INC_ADDR_ROW (1UL << 23) ///< Auto-increment Row Address -#define ARM_NAND_CODE_WRITE_DATA (1UL << 24) ///< Write Data -#define ARM_NAND_CODE_SEND_CMD2 (1UL << 25) ///< Send Command 2 -#define ARM_NAND_CODE_WAIT_BUSY (1UL << 26) ///< Wait while R/Bn busy -#define ARM_NAND_CODE_READ_DATA (1UL << 27) ///< Read Data -#define ARM_NAND_CODE_SEND_CMD3 (1UL << 28) ///< Send Command 3 -#define ARM_NAND_CODE_READ_STATUS (1UL << 29) ///< Read Status byte and check FAIL bit (bit 0) - -/*----- NAND Sequence Execution Code: Command -----*/ -#define ARM_NAND_CODE_CMD1_Pos 0 -#define ARM_NAND_CODE_CMD1_Msk (0xFFUL << ARM_NAND_CODE_CMD1_Pos) -#define ARM_NAND_CODE_CMD2_Pos 8 -#define ARM_NAND_CODE_CMD2_Msk (0xFFUL << ARM_NAND_CODE_CMD2_Pos) -#define ARM_NAND_CODE_CMD3_Pos 16 -#define ARM_NAND_CODE_CMD3_Msk (0xFFUL << ARM_NAND_CODE_CMD3_Pos) - -/*----- NAND Sequence Execution Code: Column Address -----*/ -#define ARM_NAND_CODE_ADDR_COL1_Pos 0 -#define ARM_NAND_CODE_ADDR_COL1_Msk (0xFFUL << ARM_NAND_CODE_ADDR_COL1_Pos) -#define ARM_NAND_CODE_ADDR_COL2_Pos 8 -#define ARM_NAND_CODE_ADDR_COL2_Msk (0xFFUL << ARM_NAND_CODE_ADDR_COL2_Pos) - -/*----- NAND Sequence Execution Code: Row Address -----*/ -#define ARM_NAND_CODE_ADDR_ROW1_Pos 0 -#define ARM_NAND_CODE_ADDR_ROW1_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW1_Pos) -#define ARM_NAND_CODE_ADDR_ROW2_Pos 8 -#define ARM_NAND_CODE_ADDR_ROW2_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW2_Pos) -#define ARM_NAND_CODE_ADDR_ROW3_Pos 16 -#define ARM_NAND_CODE_ADDR_ROW3_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW3_Pos) - - -/****** NAND specific error codes *****/ -#define ARM_NAND_ERROR_ECC (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< ECC generation/correction failed - - -/** -\brief NAND ECC (Error Correction Code) Information -*/ -typedef struct _ARM_NAND_ECC_INFO { - uint32_t type : 2; ///< Type: 1=ECC0 over Data, 2=ECC0 over Data+Spare, 3=ECC0 over Data and ECC1 over Spare - uint32_t page_layout : 1; ///< Page layout: 0=|Data0|Spare0|...|DataN-1|SpareN-1|, 1=|Data0|...|DataN-1|Spare0|...|SpareN-1| - uint32_t page_count : 3; ///< Number of virtual pages: N = 2 ^ page_count - uint32_t page_size : 4; ///< Virtual Page size (Data+Spare): 0=512+16, 1=1k+32, 2=2k+64, 3=4k+128, 4=8k+256, 8=512+28, 9=1k+56, 10=2k+112, 11=4k+224, 12=8k+448 - uint32_t reserved : 14; ///< Reserved (must be zero) - uint32_t correctable_bits : 8; ///< Number of correctable bits (based on 512 byte codeword size) - uint16_t codeword_size [2]; ///< Number of bytes over which ECC is calculated - uint16_t ecc_size [2]; ///< ECC size in bytes (rounded up) - uint16_t ecc_offset [2]; ///< ECC offset in bytes (where ECC starts in Spare area) -} ARM_NAND_ECC_INFO; - - -/** -\brief NAND Status -*/ -typedef struct _ARM_NAND_STATUS { - uint32_t busy : 1; ///< Driver busy flag - uint32_t ecc_error : 1; ///< ECC error detected (cleared on next Read/WriteData or ExecuteSequence) -} ARM_NAND_STATUS; - - -/****** NAND Event *****/ -#define ARM_NAND_EVENT_DEVICE_READY (1UL << 0) ///< Device Ready: R/Bn rising edge -#define ARM_NAND_EVENT_DRIVER_READY (1UL << 1) ///< Driver Ready -#define ARM_NAND_EVENT_DRIVER_DONE (1UL << 2) ///< Driver operation done -#define ARM_NAND_EVENT_ECC_ERROR (1UL << 3) ///< ECC could not correct data - - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_NAND_GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void) - \brief Get driver capabilities. - \return \ref ARM_NAND_CAPABILITIES -*/ -/** - \fn int32_t ARM_NAND_Initialize (ARM_NAND_SignalEvent_t cb_event) - \brief Initialize the NAND Interface. - \param[in] cb_event Pointer to \ref ARM_NAND_SignalEvent - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_Uninitialize (void) - \brief De-initialize the NAND Interface. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_PowerControl (ARM_POWER_STATE state) - \brief Control the NAND interface power. - \param[in] state Power state - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_DevicePower (uint32_t voltage) - \brief Set device power supply voltage. - \param[in] voltage NAND Device supply voltage - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_WriteProtect (uint32_t dev_num, bool enable) - \brief Control WPn (Write Protect). - \param[in] dev_num Device number - \param[in] enable - - \b false Write Protect off - - \b true Write Protect on - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_ChipEnable (uint32_t dev_num, bool enable) - \brief Control CEn (Chip Enable). - \param[in] dev_num Device number - \param[in] enable - - \b false Chip Enable off - - \b true Chip Enable on - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_GetDeviceBusy (uint32_t dev_num) - \brief Get Device Busy pin state. - \param[in] dev_num Device number - \return 1=busy, 0=not busy, or error -*/ -/** - \fn int32_t ARM_NAND_SendCommand (uint32_t dev_num, uint8_t cmd) - \brief Send command to NAND device. - \param[in] dev_num Device number - \param[in] cmd Command - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_SendAddress (uint32_t dev_num, uint8_t addr) - \brief Send address to NAND device. - \param[in] dev_num Device number - \param[in] addr Address - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_ReadData (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode) - \brief Read data from NAND device. - \param[in] dev_num Device number - \param[out] data Pointer to buffer for data to read from NAND device - \param[in] cnt Number of data items to read - \param[in] mode Operation mode - \return number of data items read or \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_WriteData (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode) - \brief Write data to NAND device. - \param[in] dev_num Device number - \param[out] data Pointer to buffer with data to write to NAND device - \param[in] cnt Number of data items to write - \param[in] mode Operation mode - \return number of data items written or \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_ExecuteSequence (uint32_t dev_num, uint32_t code, uint32_t cmd, - uint32_t addr_col, uint32_t addr_row, - void *data, uint32_t data_cnt, - uint8_t *status, uint32_t *count) - \brief Execute sequence of operations. - \param[in] dev_num Device number - \param[in] code Sequence code - \param[in] cmd Command(s) - \param[in] addr_col Column address - \param[in] addr_row Row address - \param[in,out] data Pointer to data to be written or read - \param[in] data_cnt Number of data items in one iteration - \param[out] status Pointer to status read - \param[in,out] count Number of iterations - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_AbortSequence (uint32_t dev_num) - \brief Abort sequence execution. - \param[in] dev_num Device number - \return \ref execution_status -*/ -/** - \fn int32_t ARM_NAND_Control (uint32_t dev_num, uint32_t control, uint32_t arg) - \brief Control NAND Interface. - \param[in] dev_num Device number - \param[in] control Operation - \param[in] arg Argument of operation - \return \ref execution_status -*/ -/** - \fn ARM_NAND_STATUS ARM_NAND_GetStatus (uint32_t dev_num) - \brief Get NAND status. - \param[in] dev_num Device number - \return NAND status \ref ARM_NAND_STATUS -*/ -/** - \fn int32_t ARM_NAND_InquireECC (int32_t index, ARM_NAND_ECC_INFO *info) - \brief Inquire about available ECC. - \param[in] index Device number - \param[out] info Pointer to ECC information \ref ARM_NAND_ECC_INFO retrieved - \return \ref execution_status -*/ - -/** - \fn void ARM_NAND_SignalEvent (uint32_t dev_num, uint32_t event) - \brief Signal NAND event. - \param[in] dev_num Device number - \param[in] event Event notification mask - \return none -*/ - -typedef void (*ARM_NAND_SignalEvent_t) (uint32_t dev_num, uint32_t event); ///< Pointer to \ref ARM_NAND_SignalEvent : Signal NAND Event. - - -/** -\brief NAND Driver Capabilities. -*/ -typedef struct _ARM_NAND_CAPABILITIES { - uint32_t event_device_ready : 1; ///< Signal Device Ready event (R/Bn rising edge) - uint32_t reentrant_operation : 1; ///< Supports re-entrant operation (SendCommand/Address, Read/WriteData) - uint32_t sequence_operation : 1; ///< Supports Sequence operation (ExecuteSequence, AbortSequence) - uint32_t vcc : 1; ///< Supports VCC Power Supply Control - uint32_t vcc_1v8 : 1; ///< Supports 1.8 VCC Power Supply - uint32_t vccq : 1; ///< Supports VCCQ I/O Power Supply Control - uint32_t vccq_1v8 : 1; ///< Supports 1.8 VCCQ I/O Power Supply - uint32_t vpp : 1; ///< Supports VPP High Voltage Power Supply Control - uint32_t wp : 1; ///< Supports WPn (Write Protect) Control - uint32_t ce_lines : 4; ///< Number of CEn (Chip Enable) lines: ce_lines + 1 - uint32_t ce_manual : 1; ///< Supports manual CEn (Chip Enable) Control - uint32_t rb_monitor : 1; ///< Supports R/Bn (Ready/Busy) Monitoring - uint32_t data_width_16 : 1; ///< Supports 16-bit data - uint32_t ddr : 1; ///< Supports NV-DDR Data Interface (ONFI) - uint32_t ddr2 : 1; ///< Supports NV-DDR2 Data Interface (ONFI) - uint32_t sdr_timing_mode : 3; ///< Fastest (highest) SDR Timing Mode supported (ONFI) - uint32_t ddr_timing_mode : 3; ///< Fastest (highest) NV_DDR Timing Mode supported (ONFI) - uint32_t ddr2_timing_mode : 3; ///< Fastest (highest) NV_DDR2 Timing Mode supported (ONFI) - uint32_t driver_strength_18 : 1; ///< Supports Driver Strength 2.0x = 18 Ohms - uint32_t driver_strength_25 : 1; ///< Supports Driver Strength 1.4x = 25 Ohms - uint32_t driver_strength_50 : 1; ///< Supports Driver Strength 0.7x = 50 Ohms -} ARM_NAND_CAPABILITIES; - - -/** -\brief Access structure of the NAND Driver. -*/ -typedef struct _ARM_DRIVER_NAND { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_NAND_GetVersion : Get driver version. - ARM_NAND_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_NAND_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_NAND_SignalEvent_t cb_event); ///< Pointer to \ref ARM_NAND_Initialize : Initialize NAND Interface. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_NAND_Uninitialize : De-initialize NAND Interface. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_NAND_PowerControl : Control NAND Interface Power. - int32_t (*DevicePower) (uint32_t voltage); ///< Pointer to \ref ARM_NAND_DevicePower : Set device power supply voltage. - int32_t (*WriteProtect) (uint32_t dev_num, bool enable); ///< Pointer to \ref ARM_NAND_WriteProtect : Control WPn (Write Protect). - int32_t (*ChipEnable) (uint32_t dev_num, bool enable); ///< Pointer to \ref ARM_NAND_ChipEnable : Control CEn (Chip Enable). - int32_t (*GetDeviceBusy) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_GetDeviceBusy : Get Device Busy pin state. - int32_t (*SendCommand) (uint32_t dev_num, uint8_t cmd); ///< Pointer to \ref ARM_NAND_SendCommand : Send command to NAND device. - int32_t (*SendAddress) (uint32_t dev_num, uint8_t addr); ///< Pointer to \ref ARM_NAND_SendAddress : Send address to NAND device. - int32_t (*ReadData) (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode); ///< Pointer to \ref ARM_NAND_ReadData : Read data from NAND device. - int32_t (*WriteData) (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode); ///< Pointer to \ref ARM_NAND_WriteData : Write data to NAND device. - int32_t (*ExecuteSequence)(uint32_t dev_num, uint32_t code, uint32_t cmd, - uint32_t addr_col, uint32_t addr_row, - void *data, uint32_t data_cnt, - uint8_t *status, uint32_t *count); ///< Pointer to \ref ARM_NAND_ExecuteSequence : Execute sequence of operations. - int32_t (*AbortSequence) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_AbortSequence : Abort sequence execution. - int32_t (*Control) (uint32_t dev_num, uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_NAND_Control : Control NAND Interface. - ARM_NAND_STATUS (*GetStatus) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_GetStatus : Get NAND status. - int32_t (*InquireECC) ( int32_t index, ARM_NAND_ECC_INFO *info); ///< Pointer to \ref ARM_NAND_InquireECC : Inquire about available ECC. -} const ARM_DRIVER_NAND; - -#endif /* __DRIVER_NAND_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USB.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USB.h deleted file mode 100644 index 7f51a2ad2..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USB.h +++ /dev/null @@ -1,95 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 20. May 2014 - * $Revision: V2.00 - * - * Project: USB Driver common definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.00 - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.01 - * Added PID Types - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_USB_H -#define __DRIVER_USB_H - -#include "Driver_Common.h" - -/* USB Role */ -#define ARM_USB_ROLE_NONE 0 -#define ARM_USB_ROLE_HOST 1 -#define ARM_USB_ROLE_DEVICE 2 - -/* USB Pins */ -#define ARM_USB_PIN_DP (1 << 0) ///< USB D+ pin -#define ARM_USB_PIN_DM (1 << 1) ///< USB D- pin -#define ARM_USB_PIN_VBUS (1 << 2) ///< USB VBUS pin -#define ARM_USB_PIN_OC (1 << 3) ///< USB OverCurrent pin -#define ARM_USB_PIN_ID (1 << 4) ///< USB ID pin - -/* USB Speed */ -#define ARM_USB_SPEED_LOW 0 ///< Low-speed USB -#define ARM_USB_SPEED_FULL 1 ///< Full-speed USB -#define ARM_USB_SPEED_HIGH 2 ///< High-speed USB - -/* USB PID Types */ -#define ARM_USB_PID_OUT 1 -#define ARM_USB_PID_IN 9 -#define ARM_USB_PID_SOF 5 -#define ARM_USB_PID_SETUP 13 -#define ARM_USB_PID_DATA0 3 -#define ARM_USB_PID_DATA1 11 -#define ARM_USB_PID_DATA2 7 -#define ARM_USB_PID_MDATA 15 -#define ARM_USB_PID_ACK 2 -#define ARM_USB_PID_NAK 10 -#define ARM_USB_PID_STALL 14 -#define ARM_USB_PID_NYET 6 -#define ARM_USB_PID_PRE 12 -#define ARM_USB_PID_ERR 12 -#define ARM_USB_PID_SPLIT 8 -#define ARM_USB_PID_PING 4 -#define ARM_USB_PID_RESERVED 0 - -/* USB Endpoint Address (bEndpointAddress) */ -#define ARM_USB_ENDPOINT_NUMBER_MASK 0x0F -#define ARM_USB_ENDPOINT_DIRECTION_MASK 0x80 - -/* USB Endpoint Type */ -#define ARM_USB_ENDPOINT_CONTROL 0 ///< Control Endpoint -#define ARM_USB_ENDPOINT_ISOCHRONOUS 1 ///< Isochronous Endpoint -#define ARM_USB_ENDPOINT_BULK 2 ///< Bulk Endpoint -#define ARM_USB_ENDPOINT_INTERRUPT 3 ///< Interrupt Endpoint - -/* USB Endpoint Maximum Packet Size (wMaxPacketSize) */ -#define ARM_USB_ENDPOINT_MAX_PACKET_SIZE_MASK 0x07FF -#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_MASK 0x1800 -#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_1 0x0000 -#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_2 0x0800 -#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_3 0x1000 - -#endif /* __DRIVER_USB_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBD.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBD.h deleted file mode 100644 index c470bb57b..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBD.h +++ /dev/null @@ -1,263 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 3. Jun 2014 - * $Revision: V2.01 - * - * Project: USB Device Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.01 - * Added ARM_USBD_ReadSetupPacket function - * Version 2.00 - * Removed ARM_USBD_DeviceConfigure function - * Removed ARM_USBD_SET_ADDRESS_STAGE parameter from ARM_USBD_DeviceSetAddress function - * Removed ARM_USBD_EndpointReadStart function - * Replaced ARM_USBD_EndpointRead and ARM_USBD_EndpointWrite functions with ARM_USBD_EndpointTransfer - * Added ARM_USBD_EndpointTransferGetResult function - * Renamed ARM_USBD_EndpointAbort function to ARM_USBD_EndpointTransferAbort - * Changed prefix ARM_DRV -> ARM_DRIVER - * Changed return values of some functions to int32_t - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_USBD_H -#define __DRIVER_USBD_H - -#include "Driver_USB.h" - -#define ARM_USBD_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ - - -/** -\brief USB Device State -*/ -typedef struct _ARM_USBD_STATE { - uint32_t vbus : 1; ///< USB Device VBUS flag - uint32_t speed : 2; ///< USB Device speed setting (ARM_USB_SPEED_xxx) - uint32_t active : 1; ///< USB Device active flag -} ARM_USBD_STATE; - - -/****** USB Device Event *****/ -#define ARM_USBD_EVENT_VBUS_ON (1UL << 0) ///< USB Device VBUS On -#define ARM_USBD_EVENT_VBUS_OFF (1UL << 1) ///< USB Device VBUS Off -#define ARM_USBD_EVENT_RESET (1UL << 2) ///< USB Reset occurred -#define ARM_USBD_EVENT_HIGH_SPEED (1UL << 3) ///< USB switch to High Speed occurred -#define ARM_USBD_EVENT_SUSPEND (1UL << 4) ///< USB Suspend occurred -#define ARM_USBD_EVENT_RESUME (1UL << 5) ///< USB Resume occurred - -/****** USB Endpoint Event *****/ -#define ARM_USBD_EVENT_SETUP (1UL << 0) ///< SETUP Packet -#define ARM_USBD_EVENT_OUT (1UL << 1) ///< OUT Packet(s) -#define ARM_USBD_EVENT_IN (1UL << 2) ///< IN Packet(s) - - -#ifndef __DOXYGEN_MW__ // exclude from middleware documentation - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_USBD_GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn ARM_USBD_CAPABILITIES ARM_USBD_GetCapabilities (void) - \brief Get driver capabilities. - \return \ref ARM_USBD_CAPABILITIES -*/ -/** - \fn int32_t ARM_USBD_Initialize (ARM_USBD_SignalDeviceEvent_t cb_device_event, - ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) - \brief Initialize USB Device Interface. - \param[in] cb_device_event Pointer to \ref ARM_USBD_SignalDeviceEvent - \param[in] cb_endpoint_event Pointer to \ref ARM_USBD_SignalEndpointEvent - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_Uninitialize (void) - \brief De-initialize USB Device Interface. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_PowerControl (ARM_POWER_STATE state) - \brief Control USB Device Interface Power. - \param[in] state Power state - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_DeviceConnect (void) - \brief Connect USB Device. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_DeviceDisconnect (void) - \brief Disconnect USB Device. - \return \ref execution_status -*/ -/** - \fn ARM_USBD_STATE ARM_USBD_DeviceGetState (void) - \brief Get current USB Device State. - \return Device State \ref ARM_USBD_STATE -*/ -/** - \fn int32_t ARM_USBD_DeviceRemoteWakeup (void) - \brief Trigger USB Remote Wakeup. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_DeviceSetAddress (uint8_t dev_addr) - \brief Set USB Device Address. - \param[in] dev_addr Device Address - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_ReadSetupPacket (uint8_t *setup) - \brief Read setup packet received over Control Endpoint. - \param[out] setup Pointer to buffer for setup packet - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_EndpointConfigure (uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_max_packet_size) - \brief Configure USB Endpoint. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \param[in] ep_type Endpoint Type (ARM_USB_ENDPOINT_xxx) - \param[in] ep_max_packet_size Endpoint Maximum Packet Size - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_EndpointUnconfigure (uint8_t ep_addr) - \brief Unconfigure USB Endpoint. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_EndpointStall (uint8_t ep_addr, bool stall) - \brief Set/Clear Stall for USB Endpoint. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \param[in] stall Operation - - \b false Clear - - \b true Set - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBD_EndpointTransfer (uint8_t ep_addr, uint8_t *data, uint32_t num) - \brief Read data from or Write data to USB Endpoint. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \param[out] data Pointer to buffer for data to read or with data to write - \param[in] num Number of data bytes to transfer - \return \ref execution_status -*/ -/** - \fn uint32_t ARM_USBD_EndpointTransferGetResult (uint8_t ep_addr) - \brief Get result of USB Endpoint transfer. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \return number of successfully transferred data bytes -*/ -/** - \fn int32_t ARM_USBD_EndpointTransferAbort (uint8_t ep_addr) - \brief Abort current USB Endpoint transfer. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \return \ref execution_status -*/ -/** - \fn uint16_t ARM_USBD_GetFrameNumber (void) - \brief Get current USB Frame Number. - \return Frame Number -*/ - -/** - \fn void ARM_USBD_SignalDeviceEvent (uint32_t event) - \brief Signal USB Device Event. - \param[in] event \ref USBD_dev_events - \return none -*/ -/** - \fn void ARM_USBD_SignalEndpointEvent (uint8_t ep_addr, uint32_t event) - \brief Signal USB Endpoint Event. - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \param[in] event \ref USBD_ep_events - \return none -*/ - -typedef void (*ARM_USBD_SignalDeviceEvent_t) (uint32_t event); ///< Pointer to \ref ARM_USBD_SignalDeviceEvent : Signal USB Device Event. -typedef void (*ARM_USBD_SignalEndpointEvent_t) (uint8_t ep_addr, uint32_t event); ///< Pointer to \ref ARM_USBD_SignalEndpointEvent : Signal USB Endpoint Event. - - -/** -\brief USB Device Driver Capabilities. -*/ -typedef struct _ARM_USBD_CAPABILITIES { - uint32_t vbus_detection : 1; ///< VBUS detection - uint32_t event_vbus_on : 1; ///< Signal VBUS On event - uint32_t event_vbus_off : 1; ///< Signal VBUS Off event -} ARM_USBD_CAPABILITIES; - - -/** -\brief Access structure of the USB Device Driver. -*/ -typedef struct _ARM_DRIVER_USBD { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBD_GetVersion : Get driver version. - ARM_USBD_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBD_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_USBD_SignalDeviceEvent_t cb_device_event, - ARM_USBD_SignalEndpointEvent_t cb_endpoint_event); ///< Pointer to \ref ARM_USBD_Initialize : Initialize USB Device Interface. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBD_Uninitialize : De-initialize USB Device Interface. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBD_PowerControl : Control USB Device Interface Power. - int32_t (*DeviceConnect) (void); ///< Pointer to \ref ARM_USBD_DeviceConnect : Connect USB Device. - int32_t (*DeviceDisconnect) (void); ///< Pointer to \ref ARM_USBD_DeviceDisconnect : Disconnect USB Device. - ARM_USBD_STATE (*DeviceGetState) (void); ///< Pointer to \ref ARM_USBD_DeviceGetState : Get current USB Device State. - int32_t (*DeviceRemoteWakeup) (void); ///< Pointer to \ref ARM_USBD_DeviceRemoteWakeup : Trigger USB Remote Wakeup. - int32_t (*DeviceSetAddress) (uint8_t dev_addr); ///< Pointer to \ref ARM_USBD_DeviceSetAddress : Set USB Device Address. - int32_t (*ReadSetupPacket) (uint8_t *setup); ///< Pointer to \ref ARM_USBD_ReadSetupPacket : Read setup packet received over Control Endpoint. - int32_t (*EndpointConfigure) (uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_max_packet_size); ///< Pointer to \ref ARM_USBD_EndpointConfigure : Configure USB Endpoint. - int32_t (*EndpointUnconfigure) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointUnconfigure : Unconfigure USB Endpoint. - int32_t (*EndpointStall) (uint8_t ep_addr, bool stall); ///< Pointer to \ref ARM_USBD_EndpointStall : Set/Clear Stall for USB Endpoint. - int32_t (*EndpointTransfer) (uint8_t ep_addr, uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_USBD_EndpointTransfer : Read data from or Write data to USB Endpoint. - uint32_t (*EndpointTransferGetResult) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointTransferGetResult : Get result of USB Endpoint transfer. - int32_t (*EndpointTransferAbort) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointTransferAbort : Abort current USB Endpoint transfer. - uint16_t (*GetFrameNumber) (void); ///< Pointer to \ref ARM_USBD_GetFrameNumber : Get current USB Frame Number. -} const ARM_DRIVER_USBD; - -#endif /* __DOXYGEN_MW__ */ - -#endif /* __DRIVER_USBD_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBH.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBH.h deleted file mode 100644 index 4e02d8c54..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/Include/Driver_USBH.h +++ /dev/null @@ -1,406 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 3. September 2014 - * $Revision: V2.01 - * - * Project: USB Host Driver definitions - * -------------------------------------------------------------------------- */ - -/* History: - * Version 2.01 - * Renamed structure ARM_USBH_EP_HANDLE to ARM_USBH_PIPE_HANDLE - * Renamed functions ARM_USBH_Endpoint... to ARM_USBH_Pipe... - * Renamed function ARM_USBH_SignalEndpointEvent to ARM_USBH_SignalPipeEvent - * Version 2.00 - * Replaced function ARM_USBH_PortPowerOnOff with ARM_USBH_PortVbusOnOff - * Changed function ARM_USBH_EndpointCreate parameters - * Replaced function ARM_USBH_EndpointConfigure with ARM_USBH_EndpointModify - * Replaced function ARM_USBH_EndpointClearHalt with ARM_USBH_EndpointReset - * Replaced function ARM_USBH_URB_Submit with ARM_USBH_EndpointTransfer - * Replaced function ARM_USBH_URB_Abort with ARM_USBH_EndpointTransferAbort - * Added function ARM_USBH_EndpointTransferGetResult - * Added function ARM_USBH_GetFrameNumber - * Changed prefix ARM_DRV -> ARM_DRIVER - * Version 1.20 - * Added API for OHCI/EHCI Host Controller Interface (HCI) - * Version 1.10 - * Namespace prefix ARM_ added - * Version 1.00 - * Initial release - */ - -#ifndef __DRIVER_USBH_H -#define __DRIVER_USBH_H - -#include "Driver_USB.h" - -#define ARM_USBH_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ - - -/** -\brief USB Host Port State -*/ -typedef struct _ARM_USBH_PORT_STATE { - uint32_t connected : 1; ///< USB Host Port connected flag - uint32_t overcurrent : 1; ///< USB Host Port overcurrent flag - uint32_t speed : 2; ///< USB Host Port speed setting (ARM_USB_SPEED_xxx) -} ARM_USBH_PORT_STATE; - -/** -\brief USB Host Pipe Handle -*/ -typedef uint32_t ARM_USBH_PIPE_HANDLE; -#define ARM_USBH_EP_HANDLE ARM_USBH_PIPE_HANDLE /* Legacy name */ - - -/****** USB Host Packet Information *****/ -#define ARM_USBH_PACKET_TOKEN_Pos 0 -#define ARM_USBH_PACKET_TOKEN_Msk (0x0FUL << ARM_USBH_PACKET_TOKEN_Pos) -#define ARM_USBH_PACKET_SETUP (0x01UL << ARM_USBH_PACKET_TOKEN_Pos) ///< SETUP Packet -#define ARM_USBH_PACKET_OUT (0x02UL << ARM_USBH_PACKET_TOKEN_Pos) ///< OUT Packet -#define ARM_USBH_PACKET_IN (0x03UL << ARM_USBH_PACKET_TOKEN_Pos) ///< IN Packet -#define ARM_USBH_PACKET_PING (0x04UL << ARM_USBH_PACKET_TOKEN_Pos) ///< PING Packet - -#define ARM_USBH_PACKET_DATA_Pos 4 -#define ARM_USBH_PACKET_DATA_Msk (0x0FUL << ARM_USBH_PACKET_DATA_Pos) -#define ARM_USBH_PACKET_DATA0 (0x01UL << ARM_USBH_PACKET_DATA_Pos) ///< DATA0 PID -#define ARM_USBH_PACKET_DATA1 (0x02UL << ARM_USBH_PACKET_DATA_Pos) ///< DATA1 PID - -#define ARM_USBH_PACKET_SPLIT_Pos 8 -#define ARM_USBH_PACKET_SPLIT_Msk (0x0FUL << ARM_USBH_PACKET_SPLIT_Pos) -#define ARM_USBH_PACKET_SSPLIT (0x08UL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet -#define ARM_USBH_PACKET_SSPLIT_S (0x09UL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data Start -#define ARM_USBH_PACKET_SSPLIT_E (0x0AUL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data End -#define ARM_USBH_PACKET_SSPLIT_S_E (0x0BUL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data All -#define ARM_USBH_PACKET_CSPLIT (0x0CUL << ARM_USBH_PACKET_SPLIT_Pos) ///< CSPLIT Packet - -#define ARM_USBH_PACKET_PRE (1UL << 12) ///< PRE Token - - -/****** USB Host Port Event *****/ -#define ARM_USBH_EVENT_CONNECT (1UL << 0) ///< USB Device Connected to Port -#define ARM_USBH_EVENT_DISCONNECT (1UL << 1) ///< USB Device Disconnected from Port -#define ARM_USBH_EVENT_OVERCURRENT (1UL << 2) ///< USB Device caused Overcurrent -#define ARM_USBH_EVENT_RESET (1UL << 3) ///< USB Reset completed -#define ARM_USBH_EVENT_SUSPEND (1UL << 4) ///< USB Suspend occurred -#define ARM_USBH_EVENT_RESUME (1UL << 5) ///< USB Resume occurred -#define ARM_USBH_EVENT_REMOTE_WAKEUP (1UL << 6) ///< USB Device activated Remote Wakeup - -/****** USB Host Pipe Event *****/ -#define ARM_USBH_EVENT_TRANSFER_COMPLETE (1UL << 0) ///< Transfer completed -#define ARM_USBH_EVENT_HANDSHAKE_NAK (1UL << 1) ///< NAK Handshake received -#define ARM_USBH_EVENT_HANDSHAKE_NYET (1UL << 2) ///< NYET Handshake received -#define ARM_USBH_EVENT_HANDSHAKE_MDATA (1UL << 3) ///< MDATA Handshake received -#define ARM_USBH_EVENT_HANDSHAKE_STALL (1UL << 4) ///< STALL Handshake received -#define ARM_USBH_EVENT_HANDSHAKE_ERR (1UL << 5) ///< ERR Handshake received -#define ARM_USBH_EVENT_BUS_ERROR (1UL << 6) ///< Bus Error detected - - -#ifndef __DOXYGEN_MW__ // exclude from middleware documentation - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_USBH_GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn ARM_USBH_CAPABILITIES ARM_USBH_GetCapabilities (void) - \brief Get driver capabilities. - \return \ref ARM_USBH_CAPABILITIES -*/ -/** - \fn int32_t ARM_USBH_Initialize (ARM_USBH_SignalPortEvent_t cb_port_event, - ARM_USBH_SignalPipeEvent_t cb_pipe_event) - \brief Initialize USB Host Interface. - \param[in] cb_port_event Pointer to \ref ARM_USBH_SignalPortEvent - \param[in] cb_pipe_event Pointer to \ref ARM_USBH_SignalPipeEvent - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_Uninitialize (void) - \brief De-initialize USB Host Interface. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PowerControl (ARM_POWER_STATE state) - \brief Control USB Host Interface Power. - \param[in] state Power state - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PortVbusOnOff (uint8_t port, bool vbus) - \brief Root HUB Port VBUS on/off. - \param[in] port Root HUB Port Number - \param[in] vbus - - \b false VBUS off - - \b true VBUS on - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PortReset (uint8_t port) - \brief Do Root HUB Port Reset. - \param[in] port Root HUB Port Number - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PortSuspend (uint8_t port) - \brief Suspend Root HUB Port (stop generating SOFs). - \param[in] port Root HUB Port Number - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PortResume (uint8_t port) - \brief Resume Root HUB Port (start generating SOFs). - \param[in] port Root HUB Port Number - \return \ref execution_status -*/ -/** - \fn ARM_USBH_PORT_STATE ARM_USBH_PortGetState (uint8_t port) - \brief Get current Root HUB Port State. - \param[in] port Root HUB Port Number - \return Port State \ref ARM_USBH_PORT_STATE -*/ -/** - \fn ARM_USBH_PIPE_HANDLE ARM_USBH_PipeCreate (uint8_t dev_addr, - uint8_t dev_speed, - uint8_t hub_addr, - uint8_t hub_port, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_max_packet_size, - uint8_t ep_interval) - \brief Create Pipe in System. - \param[in] dev_addr Device Address - \param[in] dev_speed Device Speed - \param[in] hub_addr Hub Address - \param[in] hub_port Hub Port - \param[in] ep_addr Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - \param[in] ep_type Endpoint Type (ARM_USB_ENDPOINT_xxx) - \param[in] ep_max_packet_size Endpoint Maximum Packet Size - \param[in] ep_interval Endpoint Polling Interval - \return Pipe Handle \ref ARM_USBH_PIPE_HANDLE -*/ -/** - \fn int32_t ARM_USBH_PipeModify (ARM_USBH_PIPE_HANDLE pipe_hndl, - uint8_t dev_addr, - uint8_t dev_speed, - uint8_t hub_addr, - uint8_t hub_port, - uint16_t ep_max_packet_size) - \brief Modify Pipe in System. - \param[in] pipe_hndl Pipe Handle - \param[in] dev_addr Device Address - \param[in] dev_speed Device Speed - \param[in] hub_addr Hub Address - \param[in] hub_port Hub Port - \param[in] ep_max_packet_size Endpoint Maximum Packet Size - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PipeDelete (ARM_USBH_PIPE_HANDLE pipe_hndl) - \brief Delete Pipe from System. - \param[in] pipe_hndl Pipe Handle - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PipeReset (ARM_USBH_PIPE_HANDLE pipe_hndl) - \brief Reset Pipe. - \param[in] pipe_hndl Pipe Handle - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_PipeTransfer (ARM_USBH_PIPE_HANDLE pipe_hndl, - uint32_t packet, - uint8_t *data, - uint32_t num) - \brief Transfer packets through USB Pipe. - \param[in] pipe_hndl Pipe Handle - \param[in] packet Packet information - \param[in] data Pointer to buffer with data to send or for data to receive - \param[in] num Number of data bytes to transfer - \return \ref execution_status -*/ -/** - \fn uint32_t ARM_USBH_PipeTransferGetResult (ARM_USBH_PIPE_HANDLE pipe_hndl) - \brief Get result of USB Pipe transfer. - \param[in] pipe_hndl Pipe Handle - \return number of successfully transferred data bytes -*/ -/** - \fn int32_t ARM_USBH_PipeTransferAbort (ARM_USBH_PIPE_HANDLE pipe_hndl) - \brief Abort current USB Pipe transfer. - \param[in] pipe_hndl Pipe Handle - \return \ref execution_status -*/ -/** - \fn uint16_t ARM_USBH_GetFrameNumber (void) - \brief Get current USB Frame Number. - \return Frame Number -*/ - -/** - \fn void ARM_USBH_SignalPortEvent (uint8_t port, uint32_t event) - \brief Signal Root HUB Port Event. - \param[in] port Root HUB Port Number - \param[in] event \ref USBH_port_events - \return none -*/ -/** - \fn void ARM_USBH_SignalPipeEvent (ARM_USBH_PIPE_HANDLE pipe_hndl, uint32_t event) - \brief Signal Pipe Event. - \param[in] pipe_hndl Pipe Handle - \param[in] event \ref USBH_pipe_events - \return none -*/ - -typedef void (*ARM_USBH_SignalPortEvent_t) (uint8_t port, uint32_t event); ///< Pointer to \ref ARM_USBH_SignalPortEvent : Signal Root HUB Port Event. -typedef void (*ARM_USBH_SignalPipeEvent_t) (ARM_USBH_PIPE_HANDLE pipe_hndl, uint32_t event); ///< Pointer to \ref ARM_USBH_SignalPipeEvent : Signal Pipe Event. -#define ARM_USBH_SignalEndpointEvent_t ARM_USBH_SignalPipeEvent_t /* Legacy name */ - - -/** -\brief USB Host Driver Capabilities. -*/ -typedef struct _ARM_USBH_CAPABILITIES { - uint32_t port_mask : 15; ///< Root HUB available Ports Mask - uint32_t auto_split : 1; ///< Automatic SPLIT packet handling - uint32_t event_connect : 1; ///< Signal Connect event - uint32_t event_disconnect : 1; ///< Signal Disconnect event - uint32_t event_overcurrent : 1; ///< Signal Overcurrent event -} ARM_USBH_CAPABILITIES; - - -/** -\brief Access structure of USB Host Driver. -*/ -typedef struct _ARM_DRIVER_USBH { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBH_GetVersion : Get driver version. - ARM_USBH_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBH_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_USBH_SignalPortEvent_t cb_port_event, - ARM_USBH_SignalPipeEvent_t cb_pipe_event); ///< Pointer to \ref ARM_USBH_Initialize : Initialize USB Host Interface. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBH_Uninitialize : De-initialize USB Host Interface. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBH_PowerControl : Control USB Host Interface Power. - int32_t (*PortVbusOnOff) (uint8_t port, bool vbus); ///< Pointer to \ref ARM_USBH_PortVbusOnOff : Root HUB Port VBUS on/off. - int32_t (*PortReset) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortReset : Do Root HUB Port Reset. - int32_t (*PortSuspend) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortSuspend : Suspend Root HUB Port (stop generating SOFs). - int32_t (*PortResume) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortResume : Resume Root HUB Port (start generating SOFs). - ARM_USBH_PORT_STATE (*PortGetState) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortGetState : Get current Root HUB Port State. - ARM_USBH_PIPE_HANDLE (*PipeCreate) (uint8_t dev_addr, - uint8_t dev_speed, - uint8_t hub_addr, - uint8_t hub_port, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_max_packet_size, - uint8_t ep_interval); ///< Pointer to \ref ARM_USBH_PipeCreate : Create Pipe in System. - int32_t (*PipeModify) (ARM_USBH_PIPE_HANDLE pipe_hndl, - uint8_t dev_addr, - uint8_t dev_speed, - uint8_t hub_addr, - uint8_t hub_port, - uint16_t ep_max_packet_size); ///< Pointer to \ref ARM_USBH_PipeModify : Modify Pipe in System. - int32_t (*PipeDelete) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeDelete : Delete Pipe from System. - int32_t (*PipeReset) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeReset : Reset Pipe. - int32_t (*PipeTransfer) (ARM_USBH_PIPE_HANDLE pipe_hndl, - uint32_t packet, - uint8_t *data, - uint32_t num); ///< Pointer to \ref ARM_USBH_PipeTransfer : Transfer packets through USB Pipe. - uint32_t (*PipeTransferGetResult) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeTransferGetResult : Get result of USB Pipe transfer. - int32_t (*PipeTransferAbort) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeTransferAbort : Abort current USB Pipe transfer. - uint16_t (*GetFrameNumber) (void); ///< Pointer to \ref ARM_USBH_GetFrameNumber : Get current USB Frame Number. -} const ARM_DRIVER_USBH; - - -// HCI (OHCI/EHCI) - -// Function documentation -/** - \fn ARM_DRIVER_VERSION ARM_USBH_HCI_GetVersion (void) - \brief Get USB Host HCI (OHCI/EHCI) driver version. - \return \ref ARM_DRIVER_VERSION -*/ -/** - \fn ARM_USBH_HCI_CAPABILITIES ARM_USBH_HCI_GetCapabilities (void) - \brief Get driver capabilities. - \return \ref ARM_USBH_HCI_CAPABILITIES -*/ -/** - \fn int32_t ARM_USBH_HCI_Initialize (ARM_USBH_HCI_Interrupt_t *cb_interrupt) - \brief Initialize USB Host HCI (OHCI/EHCI) Interface. - \param[in] cb_interrupt Pointer to Interrupt Handler Routine - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_HCI_Uninitialize (void) - \brief De-initialize USB Host HCI (OHCI/EHCI) Interface. - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_HCI_PowerControl (ARM_POWER_STATE state) - \brief Control USB Host HCI (OHCI/EHCI) Interface Power. - \param[in] state Power state - \return \ref execution_status -*/ -/** - \fn int32_t ARM_USBH_HCI_PortVbusOnOff (uint8_t port, bool vbus) - \brief USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. - \param[in] port Root HUB Port Number - \param[in] vbus - - \b false VBUS off - - \b true VBUS on - \return \ref execution_status -*/ - -/** - \fn void ARM_USBH_HCI_Interrupt (void) - \brief USB Host HCI Interrupt Handler. - \return none -*/ - -typedef void (*ARM_USBH_HCI_Interrupt_t) (void); ///< Pointer to Interrupt Handler Routine. - - -/** -\brief USB Host HCI (OHCI/EHCI) Driver Capabilities. -*/ -typedef struct _ARM_USBH_HCI_CAPABILITIES { - uint32_t port_mask : 15; ///< Root HUB available Ports Mask -} ARM_USBH_HCI_CAPABILITIES; - - -/** - \brief Access structure of USB Host HCI (OHCI/EHCI) Driver. -*/ -typedef struct _ARM_DRIVER_USBH_HCI { - ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBH_HCI_GetVersion : Get USB Host HCI (OHCI/EHCI) driver version. - ARM_USBH_HCI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBH_HCI_GetCapabilities : Get driver capabilities. - int32_t (*Initialize) (ARM_USBH_HCI_Interrupt_t cb_interrupt); ///< Pointer to \ref ARM_USBH_HCI_Initialize : Initialize USB Host HCI (OHCI/EHCI) Interface. - int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBH_HCI_Uninitialize : De-initialize USB Host HCI (OHCI/EHCI) Interface. - int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBH_HCI_PowerControl : Control USB Host HCI (OHCI/EHCI) Interface Power. - int32_t (*PortVbusOnOff) (uint8_t port, bool vbus); ///< Pointer to \ref ARM_USBH_HCI_PortVbusOnOff : USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. -} const ARM_DRIVER_USBH_HCI; - -#endif /* __DOXYGEN_MW__ */ - -#endif /* __DRIVER_USBH_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_can_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_can_driver.slcc deleted file mode 100644 index d84d60526..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_can_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_can_driver -label: CMSIS CAN DRIVER -package: platform -description: > - CMSIS CAN Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_CAN.h" -provides: - - name: cmsis_can_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_driver.slcc deleted file mode 100644 index 0c4fc0a12..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_eth_driver -label: CMSIS ETH DRIVER -package: platform -description: > - CMSIS ETH Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_ETH.h" -provides: - - name: cmsis_eth_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_mac_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_mac_driver.slcc deleted file mode 100644 index de5ce6a44..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_mac_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_eth_mac_driver -label: CMSIS ETH MAC DRIVER -package: platform -description: > - CMSIS ETH MAC Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_ETH_MAC.h" -provides: - - name: cmsis_eth_mac_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_phy_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_phy_driver.slcc deleted file mode 100644 index 7465db3bc..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_eth_phy_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_eth_phy_driver -label: CMSIS ETH PHY DRIVER -package: platform -description: > - CMSIS ETH PHY Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_ETH_PHY.h" -provides: - - name: cmsis_eth_phy_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_mci_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_mci_driver.slcc deleted file mode 100644 index d39861fd6..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_mci_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_mci_driver -label: CMSIS MCI DRIVER -package: platform -description: > - CMSIS MCI Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_MCI.h" -provides: - - name: cmsis_mci_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_nand_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_nand_driver.slcc deleted file mode 100644 index ba5df4110..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_nand_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_nand_driver -label: CMSIS NAND DRIVER -package: platform -description: > - CMSIS NAND Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_NAND.h" -provides: - - name: cmsis_nand_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usb_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usb_driver.slcc deleted file mode 100644 index bcad1b8f0..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usb_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_usb_driver -label: CMSIS USB DRIVER -package: platform -description: > - CMSIS USB Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_USB.h" -provides: - - name: cmsis_usb_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbd_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbd_driver.slcc deleted file mode 100644 index 13ddfda69..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbd_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_usbd_driver -label: CMSIS USBD DRIVER -package: platform -description: > - CMSIS USBD Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_USBD.h" -provides: - - name: cmsis_usbd_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbh_driver.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbh_driver.slcc deleted file mode 100644 index 92756ade4..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver/component/cmsis_usbh_driver.slcc +++ /dev/null @@ -1,16 +0,0 @@ -id: cmsis_usbh_driver -label: CMSIS USBH DRIVER -package: platform -description: > - CMSIS USBH Driver include path -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/cmsis_driver/CMSIS/Driver" -include: - - path: "Include" - file_list: - - path: "Driver_USBH.h" -provides: - - name: cmsis_usbh_driver \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.c deleted file mode 100644 index 93f0691b0..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.c +++ /dev/null @@ -1,1069 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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 - * - * 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. - * - * $Date: 25. Dec 2018 - * $Revision: V1.0 - * - * Driver: Driver_ETH_MAC0 - * Configured: via RTE_Device.h configuration file - * Project: Ethernet Media Access (MAC) Driver for Silicon Labs MCU - * -------------------------------------------------------------------------- - * Use the following configuration settings in the middleware component - * to connect to this driver. - * - * Configuration Setting Value - * --------------------- ----- - * Connect to hardware via Driver_ETH_MAC# = 0 - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * Initial release - */ -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) -/* Receive/transmit Checksum offload enable */ -#ifndef EMAC_CHECKSUM_OFFLOAD -#define EMAC_CHECKSUM_OFFLOAD 1 -#endif - -/* IEEE 1588 time stamping enable (PTP) */ -#ifndef EMAC_TIME_STAMP -#define EMAC_TIME_STAMP 0 -#endif - -#include "EMAC.h" - -#include "clock_update.h" -#include "RTE_Device.h" -#include "PHY_LAN8742A.h" -#define ARM_ETH_MAC_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) /* driver version */ - -/* Timeouts */ -#define PHY_TIMEOUT 2U /* PHY Register access timeout in ms */ - -/* ETH Memory Buffer configuration */ -#define NUM_RX_BUF 4U /* 0x1800 for Rx (4*1536=6K) */ -#define NUM_TX_BUF 2U /* 0x0C00 for Tx (2*1536=3K) */ -#define ETH_BUF_SIZE 1536U /* ETH Receive/Transmit buffer size */ -#define CLK_BIT (*(volatile uint32_t *)0x46000000) /* ETH clock enable register*/ -#define ETH_SPEED (*(volatile uint32_t *)0x46008040) /* ETH SPEED SELECTION*/ - -/* Interrupt Handler Prototype */ -void ETH_IRQHandler (void); - - -/* DMA RX Descriptor */ -typedef struct rx_desc { - uint32_t volatile Stat; - uint32_t Ctrl; - uint8_t const *Addr; - struct rx_desc *Next; -#if ((EMAC_CHECKSUM_OFFLOAD != 0) || (EMAC_TIME_STAMP != 0)) - uint32_t ExtStat; - uint32_t Reserved[1]; - uint32_t TimeLo; - uint32_t TimeHi; -#endif -} RX_Desc; - -/* DMA TX Descriptor */ -typedef struct tx_desc { - uint32_t volatile CtrlStat; - uint32_t Size; - uint8_t const *Addr; - struct tx_desc *Next; -#if ((EMAC_CHECKSUM_OFFLOAD != 0) || (EMAC_TIME_STAMP != 0)) - uint32_t Reserved[2]; - uint32_t TimeLo; - uint32_t TimeHi; -#endif -} TX_Desc; - -/*Ethernet pin definations for RMII interface*/ -static const ETH_PIN_Config eth_pins[] = { - { RTE_ETH_RMII_TXD0_PORT , RTE_ETH_RMII_TXD0_PIN , RTE_ETH_RMII_TXD0_MODE , RTE_ETH_RMII_TXD0_PAD_SEL }, - { RTE_ETH_RMII_TXD1_PORT , RTE_ETH_RMII_TXD1_PIN , RTE_ETH_RMII_TXD1_MODE , RTE_ETH_RMII_TXD1_PAD_SEL }, - { RTE_ETH_RMII_TX_EN_PORT , RTE_ETH_RMII_TX_EN_PIN , RTE_ETH_RMII_TX_EN_MODE , RTE_ETH_RMII_TX_EN_PAD_SEL }, - { RTE_ETH_RMII_RXD0_PORT , RTE_ETH_RMII_RXD0_PIN , RTE_ETH_RMII_RXD0_MODE , RTE_ETH_RMII_RXD0_PAD_SEL }, - { RTE_ETH_RMII_RXD1_PORT , RTE_ETH_RMII_RXD1_PIN , RTE_ETH_RMII_RXD1_MODE , RTE_ETH_RMII_RXD1_PAD_SEL }, - { RTE_ETH_RMII_REF_CLK_PORT , RTE_ETH_RMII_REF_CLK_PIN , RTE_ETH_RMII_REF_CLK_MODE , RTE_ETH_RMII_REF_CLK_PAD_SEL}, - { RTE_ETH_RMII_CRS_DV_PORT , RTE_ETH_RMII_CRS_DV_PIN , RTE_ETH_RMII_CRS_DV_MODE , RTE_ETH_RMII_CRS_DV_PAD_SEL }, - { RTE_ETH_MDI_MDC_PORT , RTE_ETH_MDI_MDC_PIN , RTE_ETH_MDI_MDC_MODE , RTE_ETH_MDI_MDC_PAD_SEL }, - { RTE_ETH_MDI_MDIO_PORT , RTE_ETH_MDI_MDIO_PIN , RTE_ETH_MDI_MDIO_MODE , RTE_ETH_MDI_MDIO_PAD_SEL }, -}; - -/* Driver Version */ -static const ARM_DRIVER_VERSION DriverVersion = { - ARM_ETH_MAC_API_VERSION, - ARM_ETH_MAC_DRV_VERSION -}; - -/* Driver Capabilities */ -static const ARM_ETH_MAC_CAPABILITIES DriverCapabilities = { - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_ip4 */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_ip6 */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_udp */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_tcp */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_icmp */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_ip4 */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_ip6 */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_udp */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_tcp */ - (EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_icmp */ - (ETH_MII != 0) ? - ARM_ETH_INTERFACE_MII : - ARM_ETH_INTERFACE_RMII, /* media_interface */ - 0U, /* mac_address */ - 1U, /* event_rx_frame */ - 1U, /* event_tx_frame */ - 1U, /* event_wakeup */ - (EMAC_TIME_STAMP != 0) ? 1U : 0U /* precision_timer */ -}; - -/* Local variables */ -static EMAC_CTRL Emac; - -static RX_Desc rx_desc[NUM_RX_BUF]; -static TX_Desc tx_desc[NUM_TX_BUF]; -static uint32_t rx_buf [NUM_RX_BUF][ETH_BUF_SIZE>>2]; -static uint32_t tx_buf [NUM_TX_BUF][ETH_BUF_SIZE>>2]; - - -/** - * @fn void init_rx_desc (void) - * @brief Initialize Rx DMA descriptors. - * @return none - */ -static void init_rx_desc (void) { - uint32_t i=0,next; - - for (i = 0U; i < NUM_RX_BUF; i++) { - rx_desc[i].Stat = DMA_RX_OWN; - rx_desc[i].Ctrl = DMA_RX_RCH | ETH_BUF_SIZE ; - rx_desc[i].Addr = (uint8_t *)&rx_buf[i]; - next = i + 1U; - if (next == NUM_RX_BUF) { next = 0U; } - rx_desc[i].Next = &rx_desc[next]; - } - ETH->DMA_RX_DESC_LIST_ADDR_REG = (uint32_t)&rx_desc[0]; - Emac.rx_index = 0U; -} - -/** - * @fn void init_tx_desc (void) - * @brief Initialize Tx DMA descriptors. - * @return none - */ -static void init_tx_desc (void) { - uint32_t i,next; - - for(i=0;i < NUM_TX_BUF;i++){ - tx_desc[i].Size= DMA_TX_TCH | DMA_TX_LS | DMA_TX_FS; - tx_desc[i].Addr=(uint8_t *)&tx_buf[i]; - next = i + 1U; - if(next == NUM_TX_BUF) { next = 0U; } - tx_desc[i].Next=&tx_desc[next]; - } - ETH->DMA_TX_DESC_LIST_ADDR_REG = (uint32_t)&tx_desc[0]; - Emac.tx_index = 0U; -} - -/** - * @fn void Init(void) - * @brief MDIO iniitialization. - * @param[in] dir : 1=input,0=output. - * @return None - */ -void MDIO_Init(void) -{ - /*Enable the clock*/ - RSI_CLK_PeripheralClkEnable(M4CLK,EGPIO_CLK,ENABLE_STATIC_CLK); - /*MDC*/ - RSI_EGPIO_PadSelectionEnable(RTE_ETH_MDI_MDC_PAD_SEL); - RSI_EGPIO_PadReceiverEnable(RTE_ETH_MDI_MDC_PIN); - RSI_EGPIO_SetPinMux(EGPIO,RTE_ETH_MDI_MDC_PORT,RTE_ETH_MDI_MDC_PIN,EGPIO_PIN_MUX_MODE0); - RSI_EGPIO_SetDir(EGPIO,RTE_ETH_MDI_MDC_PORT,RTE_ETH_MDI_MDC_PIN,EGPIO_PIN_MUX_MODE0); - - /*MDIO*/ - RSI_EGPIO_PadSelectionEnable(RTE_ETH_MDI_MDIO_PAD_SEL); - RSI_EGPIO_PadReceiverEnable(RTE_ETH_MDI_MDIO_PIN); - RSI_EGPIO_SetPinMux(EGPIO,RTE_ETH_MDI_MDC_PORT,RTE_ETH_MDI_MDIO_PIN,EGPIO_PIN_MUX_MODE0); -} - -/** - * @fn void MDIO_Dir(uint8_t dir) - * @brief Set MDIO dir. - * @param[in] dir : 1=input,0=output. - * @return None - */ -void MDIO_Dir(uint8_t dir) -{ - if(dir) - { - RSI_EGPIO_SetDir(EGPIO,RTE_ETH_MDI_MDC_PORT,RTE_ETH_MDI_MDIO_PIN,EGPIO_CONFIG_DIR_INPUT); - } - else - { - RSI_EGPIO_SetDir(EGPIO,RTE_ETH_MDI_MDC_PORT,RTE_ETH_MDI_MDIO_PIN,EGPIO_CONFIG_DIR_OUTPUT); - } -} - -/** - * @fn void MDIO_Write(uint32_t data,uint32_t length) - * @brief Write's the data to phy register. - * @param[in] data : Data to be written. - * @param[in] length : Length of the data. - * @return Returns data - */ -void MDIO_Write(uint32_t data,uint32_t length) -{ - volatile int x=0; - uint32_t i; - - data = data << (32-length); - for(i=0;iport,i->pin , i->mode); - RSI_EGPIO_PadReceiverEnable(i->pin); - RSI_EGPIO_PadSelectionEnable(i->pad_sel); - } - memset (&Emac, 0, sizeof (EMAC_CTRL)); - - Emac.cb_event = cb_event; - Emac.flags = EMAC_FLAG_INIT; - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t Uninitialize (void) - * @brief De-initialize Ethernet MAC Device. - * @return \ref execution_status -*/ -static int32_t Uninitialize (void) { - const ETH_PIN_Config *i; - /* Ethernet ping Unconfigure */ - for (i = eth_pins; i != ð_pins[sizeof(eth_pins)/sizeof(ETH_PIN_Config)]; i++) { - RSI_EGPIO_SetPinMux(EGPIO,i->port,i->pin , EGPIO_PIN_MUX_MODE0); - RSI_EGPIO_PadReceiverDisable(i->pin); - RSI_EGPIO_PadSelectionDisable(i->pad_sel); - } - - Emac.flags &= ~EMAC_FLAG_INIT; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t PowerControl (ARM_POWER_STATE state) - * @brief Control Ethernet MAC Device Power. - * @param[in] state : Power state - * @return \ref execution_status -*/ -static int32_t PowerControl (ARM_POWER_STATE state) { - volatile uint32_t systemclk, clkdiv; - - switch (state) { - case ARM_POWER_OFF: - - /* Disable ethernet interrupts */ - NVIC_DisableIRQ(ETHERNET_IRQn); - ETH->DMA_INTR_EN_REG = 0U; - - Emac.flags &= ~EMAC_FLAG_POWER; - break; - - case ARM_POWER_LOW: - return ARM_DRIVER_ERROR_UNSUPPORTED; - - case ARM_POWER_FULL: - /* Clock to Ethernet peripheral */ - RSI_CLK_PeripheralClkEnable1(M4CLK , ETH_HCLK_ENABLE); - - if ((Emac.flags & EMAC_FLAG_INIT) == 0U) { - /* Driver not initialized */ - return ARM_DRIVER_ERROR; - } - if ((Emac.flags & EMAC_FLAG_POWER) != 0U) { - /* Driver already powered */ - break; - } - - /* set Software reset */ - ETH->DMA_BUS_MODE_REG |= ETH_DMABMR_SR; - while (ETH->DMA_BUS_MODE_REG & ETH_DMABMR_SR) { - ; /* Wait until software reset completed */ - } - - /* MDC clock range selection */ - - systemclk=RSI_CLK_GetBaseClock(M4_ETHERNET); - - if (systemclk >= 150000000U) { - clkdiv = ETH_MACMIIAR_CR_Div102; - } else if (systemclk >= 100000000U) { - clkdiv = ETH_MACMIIAR_CR_Div62; - } else if (systemclk >= 60000000U) { - clkdiv = ETH_MACMIIAR_CR_Div42; - } else if (systemclk >= 35000000U) { - clkdiv = ETH_MACMIIAR_CR_Div26; - } else if (systemclk >= 25000000U) { - clkdiv = ETH_MACMIIAR_CR_Div16; - } else { - /* systemclock is too slow for Ethernet */ - return (ARM_DRIVER_ERROR); - } - ETH->MAC_GMII_ADDR_REG = clkdiv; - - /* Initialize MAC configuration */ - ETH->MAC_CONFIG_REG = ETH_MACCR_DO | ETH_MACCR_PS; - - /* Initialize Filter registers */ - ETH->MAC_FRAME_FILTER_REG = ETH_MACFFR_DBF; - ETH->MAC_FLOW_CTRL_REG = ETH_MACFCR_DZPQ; - - /* Initialize Address registers */ - ETH->MAC_ADDR0_HIGH_REG = 0U; ETH->MAC_ADDR0_LOW_REG = 0U; - ETH->MAC_ADDR1_HIGH_REG = 0U; ETH->MAC_ADDR1_LOW_REG = 0U; - ETH->MAC_ADDR2_HIGH_REG = 0U; ETH->MAC_ADDR2_LOW_REG = 0U; - ETH->MAC_ADDR3_HIGH_REG = 0U; ETH->MAC_ADDR3_LOW_REG = 0U; - - /* Mask pmt interrupt */ - ETH->MAC_INTR_MASK_REG |= ETH_MACIMR_PMTIM; - - /* Initialize DMA Descriptors */ - init_rx_desc (); - init_tx_desc (); - - /* Enable Rx interrupts */ - ETH->DMA_STATUS_REG = 0xFFFFFFFFU; - ETH->DMA_INTR_EN_REG = ETH_DMAIER_NIE | ETH_DMAIER_RIE | ETH_DMAIER_TIE; - - - /* Disable MMC interrupts */ - ETH->MMC_INTR_MASK_TX_REG = ETH_MMCTIMR_TGFM | ETH_MMCTIMR_TGFSCM; - ETH->MMC_INTR_MASK_RX_REG = ETH_MMCRIMR_RFCEM; - - /*Enable ETHERNET interrupt */ - NVIC_ClearPendingIRQ (ETHERNET_IRQn); - NVIC_EnableIRQ (ETHERNET_IRQn); - - Emac.frame_end = NULL; - Emac.flags |= EMAC_FLAG_POWER; - break; - - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t GetMacAddress (ARM_ETH_MAC_ADDR *ptr_addr) - * @brief Get Ethernet MAC Address. - * @param[in] ptr_addr : Pointer to address - * @return \ref execution_status -*/ -static int32_t GetMacAddress (ARM_ETH_MAC_ADDR *ptr_addr) { - uint32_t val; - - if (ptr_addr == NULL) { - return ARM_DRIVER_ERROR_PARAMETER; - } - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return ARM_DRIVER_ERROR; - } - - val = ETH->MAC_ADDR0_HIGH_REG; - ptr_addr->b[5] = (uint8_t)(val >> 8); - ptr_addr->b[4] = (uint8_t)(val); - val = ETH->MAC_ADDR0_LOW_REG; - ptr_addr->b[3] = (uint8_t)(val >> 24); - ptr_addr->b[2] = (uint8_t)(val >> 16); - ptr_addr->b[1] = (uint8_t)(val >> 8); - ptr_addr->b[0] = (uint8_t)(val); - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) - * @brief Set Ethernet MAC Address. - * @param[in] ptr_addr : Pointer to address - * @return \ref execution_status -*/ -static int32_t SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) { - - if (ptr_addr == NULL) { - return ARM_DRIVER_ERROR_PARAMETER; - } - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return ARM_DRIVER_ERROR; - } - - /* Set Ethernet MAC Address registers */ - ETH->MAC_ADDR0_HIGH_REG = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4]; - ETH->MAC_ADDR0_LOW_REG = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) | - ((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0]; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, - uint32_t num_addr) - * @brief Configure Address Filter. - * @param[in] ptr_addr : Pointer to addresses - * @param[in] num_addr : Number of addresses to configure - * @return \ref execution_status -*/ -static int32_t SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr) { - uint32_t crc; - - if ((ptr_addr == NULL) && (num_addr != 0)) { - return ARM_DRIVER_ERROR_PARAMETER; - } - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return ARM_DRIVER_ERROR; - } - - /* Use unicast address filtering for first 3 MAC addresses */ - ETH->MAC_FRAME_FILTER_REG &= ~(ETH_MACFFR_HPF | ETH_MACFFR_HMC); - ETH->MAC_HASH_TABLE_HIGH_REG = 0U; ETH->MAC_HASH_TABLE_LOW_REG = 0U; - - if (num_addr == 0U) { - ETH->MAC_ADDR1_HIGH_REG = 0U; ETH->MAC_ADDR1_LOW_REG = 0U; - ETH->MAC_ADDR2_HIGH_REG = 0U; ETH->MAC_ADDR2_LOW_REG = 0U; - ETH->MAC_ADDR3_HIGH_REG = 0U; ETH->MAC_ADDR3_LOW_REG = 0U; - return ARM_DRIVER_OK; - } - - ETH->MAC_ADDR1_HIGH_REG = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4] | ETH_MACA1HR_AE; - ETH->MAC_ADDR1_LOW_REG = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) | - ((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0]; - num_addr--; - if (num_addr == 0U) { - ETH->MAC_ADDR2_HIGH_REG = 0U; ETH->MAC_ADDR2_LOW_REG = 0U; - ETH->MAC_ADDR3_HIGH_REG = 0U; ETH->MAC_ADDR3_LOW_REG = 0U; - return ARM_DRIVER_OK; - } - ptr_addr++; - - ETH->MAC_ADDR2_HIGH_REG = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4] | ETH_MACA2HR_AE; - ETH->MAC_ADDR2_LOW_REG = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) | - ((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0]; - num_addr--; - if (num_addr == 0U) { - ETH->MAC_ADDR3_HIGH_REG = 0U; ETH->MAC_ADDR3_LOW_REG = 0U; - return ARM_DRIVER_OK; - } - ptr_addr++; - - ETH->MAC_ADDR3_HIGH_REG = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4] | ETH_MACA3HR_AE; - ETH->MAC_ADDR3_LOW_REG = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) | - ((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0]; - num_addr--; - if (num_addr == 0U) { - return ARM_DRIVER_OK; - } - ptr_addr++; - - /* Calculate 64-bit Hash table for remaining MAC addresses */ - for ( ; num_addr; ptr_addr++, num_addr--) { - crc = crc32_data (&ptr_addr->b[0], 6U) >> 26; - if (crc & 0x20U) { - ETH->MAC_HASH_TABLE_HIGH_REG |= (1U << (crc & 0x1FU)); - } - else { - ETH->MAC_HASH_TABLE_LOW_REG |= (1U << crc); - } - } - /* Enable both, unicast and hash address filtering */ - ETH->MAC_FRAME_FILTER_REG |= ETH_MACFFR_HPF | ETH_MACFFR_HMC; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) - * @brief Send Ethernet frame. - * @param[in] frame : Pointer to frame buffer with data to send - * @param[in] len : Frame buffer length in bytes - * @param[in] flags : Frame transmit flags (see ARM_ETH_MAC_TX_FRAME_...) - * @return \ref execution_status -*/ -static int32_t SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) { - uint8_t *dst = Emac.frame_end; - uint32_t ctrl; - uint32_t dummy =0; - - if ((frame == NULL) || (len == 0U)) { - return ARM_DRIVER_ERROR_PARAMETER; - } - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return ARM_DRIVER_ERROR; - } - - if (dst == NULL) { - /* New TX frame start */ - if (tx_desc[Emac.tx_index].CtrlStat & DMA_TX_OWN) { - /* wait upto transmitter is busy */ - return ARM_DRIVER_ERROR_BUSY; - } - dst = (uint8_t *)tx_desc[Emac.tx_index].Addr; - dummy = tx_desc[Emac.tx_index].Size; - dummy = (dummy & 0xFF800000); - tx_desc[Emac.tx_index].Size = (len | dummy); - } - else { - /* Sending data fragments in progress */ - tx_desc[Emac.tx_index].Size += len; - } - /* Fast-copy data fragments to ETH-DMA buffer */ - for ( ; len > 7U; dst += 8, frame += 8, len -= 8U) { - ((__packed uint32_t *)dst)[0] = ((__packed uint32_t *)frame)[0]; - ((__packed uint32_t *)dst)[1] = ((__packed uint32_t *)frame)[1]; - } - /* Copy remaining 7 bytes */ - for ( ; len > 1U; dst += 2, frame += 2, len -= 2U) { - ((__packed uint16_t *)dst)[0] = ((__packed uint16_t *)frame)[0]; - } - if (len > 0U) { dst++[0] = frame++[0]; } - - if (flags & ARM_ETH_MAC_TX_FRAME_FRAGMENT) { - /* If more data is there copy current write position */ - Emac.frame_end = dst; - return ARM_DRIVER_OK; - } - - /* Send the frame to DMA */ - ctrl = tx_desc[Emac.tx_index].Size & ~DMA_TX_CIC; -#if (EMAC_CHECKSUM_OFFLOAD != 0) - if (Emac.tx_cks_offload) { - - uint16_t prot = (*((const __packed uint16_t *)(&tx_desc[Emac.tx_index].Addr[12]))); - uint16_t frag = (*((const __packed uint16_t *)(&tx_desc[Emac.tx_index].Addr[20])));; - if ((prot == 0x0008) && (frag & 0xFF3F)) { - /* Insert only IP header checksum in fragmented frame */ - ctrl |= DMA_TX_CIC_IP; - } - else { - /* Insert IP header and payload checksums (TCP,UDP,ICMP) */ - ctrl |= DMA_TX_CIC; - } - } -#endif - ctrl &= ~(DMA_TX_IC); - if (flags & ARM_ETH_MAC_TX_FRAME_EVENT) { ctrl |= DMA_TX_IC; } - - tx_desc[Emac.tx_index].Size = ctrl; - tx_desc[Emac.tx_index].CtrlStat = DMA_TX_OWN; - - Emac.tx_index++; - if (Emac.tx_index == NUM_TX_BUF) { Emac.tx_index = 0U; } - Emac.frame_end = NULL; - - /* Start frame transmission */ - ETH->DMA_STATUS_REG = ETH_DMASR_TPSS; - - ETH->DMA_TX_POLL_DEMAND_REG = 0U; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t ReadFrame (uint8_t *frame, uint32_t len) - * @brief Read data of received Ethernet frame. - * @param[in] frame : Pointer to frame buffer for data to read into - * @param[in] len : Frame buffer length in bytes - * @return number of data bytes read or execution status - - value >= 0: number of data bytes read - - value < 0: error occurred, value is execution status as defined with \ref execution_status -*/ -static int32_t ReadFrame (uint8_t *frame, uint32_t len) { - uint8_t const *src = rx_desc[Emac.rx_index].Addr; - int32_t cnt = (int32_t)len; - - if ((frame == NULL) && (len != 0U)) { - return ARM_DRIVER_ERROR_PARAMETER; - } - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return ARM_DRIVER_ERROR; - } - - /* Fast-copy data to frame buffer */ - for ( ; len > 7U; frame += 8, src += 8, len -= 8U) { - ((__packed uint32_t *)frame)[0] = ((uint32_t *)src)[0]; - ((__packed uint32_t *)frame)[1] = ((uint32_t *)src)[1]; - } - /* Copy remaining 7 bytes */ - for ( ; len > 1U; frame += 2, src += 2, len -= 2U) { - ((__packed uint16_t *)frame)[0] = ((uint16_t *)src)[0]; - } - if (len > 0U) { frame[0] = src[0]; } - - /* Return this block back to ETH-DMA */ - rx_desc[Emac.rx_index].Stat = DMA_RX_OWN; - - Emac.rx_index++; - if (Emac.rx_index == NUM_RX_BUF) { Emac.rx_index = 0; } - - if (ETH->DMA_STATUS_REG & ETH_DMASR_RBU) { - /* Receive buffer unavailable, resume DMA */ - ETH->DMA_STATUS_REG = ETH_DMASR_RBU; - ETH->DMA_RX_POLL_DEMAND_REG = 0; - } - - return (cnt); -} - -/** - * @fn uint32_t GetRxFrameSize (void) - * @brief Get size of received Ethernet frame. - * @return number of bytes in received frame -*/ -static uint32_t GetRxFrameSize (void) { - - uint32_t stat = rx_desc[Emac.rx_index].Stat; - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return (0U); - } - - if (stat & DMA_RX_OWN) { - /* Owned by DMA */ - return (0U); - } - if (((stat & DMA_RX_ES) != 0) || - ((stat & DMA_RX_FS) == 0) || - ((stat & DMA_RX_LS) == 0)) { - /* Error, this block is invalid */ - return (0xFFFFFFFFU); - } - - return (((stat & DMA_RX_FL) >> 16) - 4U); -} - -/** - * @fn int32_t GetRxFrameTime (ARM_ETH_MAC_TIME *time) - * @brief Get time of received Ethernet frame. - * @param[in] time : Pointer to time structure for data to read into - * @return \ref execution_status -*/ -static int32_t GetRxFrameTime (ARM_ETH_MAC_TIME *time) { - return ARM_DRIVER_ERROR_UNSUPPORTED; -} - -/** - * @fn int32_t GetTxFrameTime (ARM_ETH_MAC_TIME *time) - * @brief Get time of transmitted Ethernet frame. - * @param[in] time : Pointer to time structure for data to read into - * @return \ref execution_status -*/ -static int32_t GetTxFrameTime (ARM_ETH_MAC_TIME *time) { - return ARM_DRIVER_ERROR_UNSUPPORTED; -} - -/** - * @fn int32_t ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) - * @brief Control Precision Timer. - * @param[in] control : operation - * @param[in] time : Pointer to time structure - * @return \ref execution_status -*/ -static int32_t ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) { - return ARM_DRIVER_ERROR_UNSUPPORTED; -} - -/** - * @fn int32_t Control (uint32_t control, uint32_t arg) - * @brief Control Ethernet Interface. - * @param[in] control : operation - * @param[in] arg : argument of operation (optional) - * @return \ref execution_status -*/ -static int32_t Control (uint32_t control, uint32_t arg) { - uint32_t maccr; - uint32_t dmaomr; - uint32_t macffr; - - if ((Emac.flags & EMAC_FLAG_POWER) == 0U) { - return ARM_DRIVER_ERROR; - } - - switch (control) { - case ARM_ETH_MAC_CONFIGURE: - maccr = ETH->MAC_CONFIG_REG & ~( ETH_MACCR_DM | - ETH_MACCR_LM | ETH_MACCR_IPC); - - - /* Configure the speed of operation(10/100 mbps) */ - switch (arg & ARM_ETH_MAC_SPEED_Msk) { - case ARM_ETH_MAC_SPEED_10M: - ETH_SPEED &= ~ETH_MACCR_FES; - break; - case ARM_ETH_SPEED_100M: - ETH_SPEED |= ETH_MACCR_FES; - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - /* Confige the mode (Half/Full duplex) */ - switch (arg & ARM_ETH_MAC_DUPLEX_Msk) { - case ARM_ETH_MAC_DUPLEX_FULL: - maccr |= ETH_MACCR_DM; - break; - case ARM_ETH_MAC_DUPLEX_HALF: - maccr &= ~ETH_MACCR_DM; - break; - default: - return ARM_DRIVER_ERROR; - } - - /* Configurration of mac level loopback opearation */ - if (arg & ARM_ETH_MAC_LOOPBACK) { - maccr |= ETH_MACCR_LM; - } - - dmaomr = ETH->DMA_OPER_MODE_REG & ~(ETH_DMAOMR_RSF| ETH_DMAOMR_TSF); -#if (EMAC_CHECKSUM_OFFLOAD != 0) - /* Enable rx checksum verification */ - if (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX) { - maccr |= ETH_MACCR_IPC; - } - - /* Enable tx checksum generation */ - if (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX) { - dmaomr |= ETH_DMAOMR_TSF; - Emac.tx_cks_offload = true; - } - else { - Emac.tx_cks_offload = false; - } -#else - if ((arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX) || - (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX)) { - /* Checksum offload is disabled in the driver */ - return ARM_DRIVER_ERROR; - } -#endif - ETH->DMA_OPER_MODE_REG = dmaomr; - ETH->MAC_CONFIG_REG = maccr; - - macffr = ETH->MAC_FRAME_FILTER_REG & ~(ETH_MACFFR_PR | ETH_MACFFR_PM | ETH_MACFFR_DBF); - /* Enable broadcast frame receive */ - if ((arg & ARM_ETH_MAC_ADDRESS_BROADCAST) == 0) { - macffr |= ETH_MACFFR_DBF; - } - - /* Enable all multicast frame receive */ - if (arg & ARM_ETH_MAC_ADDRESS_MULTICAST) { - macffr |= ETH_MACFFR_PM; - } - - /* Enable promiscuous mode (no filtering) */ - if (arg & ARM_ETH_MAC_ADDRESS_ALL) { - macffr |= ETH_MACFFR_PR; - } - ETH->MAC_FRAME_FILTER_REG = macffr; - break; - - case ARM_ETH_MAC_CONTROL_TX: - /* Enable/disable MAC transmitter */ - maccr = ETH->MAC_CONFIG_REG & ~ETH_MACCR_TE; - dmaomr = ETH->DMA_OPER_MODE_REG & ~ETH_DMAOMR_ST; - if (arg != 0) { - maccr |= ETH_MACCR_TE; - dmaomr |= ETH_DMAOMR_ST; - } - ETH->MAC_CONFIG_REG = maccr; - ETH->DMA_OPER_MODE_REG = dmaomr; - break; - - case ARM_ETH_MAC_CONTROL_RX: - /* Enable/disable MAC receiver */ - maccr = ETH->MAC_CONFIG_REG & ~ETH_MACCR_RE; - dmaomr = ETH->DMA_OPER_MODE_REG & ~ETH_DMAOMR_SR; - if (arg != 0) { - maccr |= ETH_MACCR_RE; - dmaomr |= ETH_DMAOMR_SR; - } - ETH->MAC_CONFIG_REG = maccr; - ETH->DMA_OPER_MODE_REG = dmaomr; - break; - - case ARM_ETH_MAC_FLUSH: - /* Flush tx and rx buffers */ - if (arg & ARM_ETH_MAC_FLUSH_RX) { - } - if (arg & ARM_ETH_MAC_FLUSH_TX) { - ETH->DMA_OPER_MODE_REG |= ETH_DMAOMR_FTF; - } - break; - - case ARM_ETH_MAC_VLAN_FILTER: - /* Configure VLAN filter */ - ETH->MAC_VLAN_TAG_REG = arg; - break; - - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - - -/** - * @fn int32_t PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) - * @brief Read Ethernet PHY Register through Management Interface. - * @param[in] phy_addr : 5-bit device address - * @param[in] reg_addr : 5-bit register address - * @param[out] data : Pointer where the result is written to - * @return \ref execution_status -*/ -static int32_t PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) { - - /*Initialize the mdio*/ - MDIO_Init(); - /*Set the MDIO Direction*/ - MDIO_Dir(EGPIO_CONFIG_DIR_OUTPUT); - /*32 continuous 1's*/ - MDIO_Write(0xFFFFFFFF,32); - /*Start of frame(01) and read command(10) */ - MDIO_Write(0x6,4); - /*PHY address*/ - MDIO_Write(phy_addr,5); - /*reg address*/ - MDIO_Write(reg_addr,5); - - MDIO_Dir(EGPIO_CONFIG_DIR_INPUT); - /*Turn around time*/ - MDIO_Write(0x0,2); - - *data=MDIO_Read(); - - MDIO_Dir(EGPIO_CONFIG_DIR_OUTPUT); - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data) - * @brief Write Ethernet PHY Register through Management Interface. - * @param[in] phy_addr : 5-bit device address - * @param[in] reg_addr : 5-bit register address - * @param[in] data : 16-bit data to write - * @return \ref execution_status -*/ -static int32_t PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data) { - - /*Initialize the mdio*/ - MDIO_Init(); - /*Set the MDIO Direction*/ - MDIO_Dir(EGPIO_CONFIG_DIR_OUTPUT); - /*32 continuous 1's*/ - MDIO_Write(0xFFFFFFFF,32); - /*start of frame(01) and write command(01) */ - MDIO_Write(0x5,4); - /*phy address*/ - MDIO_Write(phy_addr,5); - /*reg address*/ - MDIO_Write(reg_addr,5); - /*Turn around time*/ - MDIO_Write(0x2,2); - /*write the data*/ - MDIO_Write(data,16); - - return ARM_DRIVER_OK; -} - - -/* Ethernet IRQ Handler */ -void IRQ062_Handler (void) { - uint32_t dmasr, macsr, event = 0; - - dmasr = ETH->DMA_STATUS_REG; - ETH->DMA_STATUS_REG = dmasr & (ETH_DMASR_NIS | ETH_DMASR_RI | ETH_DMASR_TI); - - if (dmasr & ETH_DMASR_TI) { - /* Frame sent */ - event |= ARM_ETH_MAC_EVENT_TX_FRAME; - } - if (dmasr & ETH_DMASR_RI) { - /* Frame received */ - event |= ARM_ETH_MAC_EVENT_RX_FRAME; - } - macsr = ETH->MAC_STATUS_REG; - - - if (macsr & ETH_MACSR_PMTS) { - ETH->MAC_PMT_CTRL_STATUS_REG; - event |= ARM_ETH_MAC_EVENT_WAKEUP; - } - - /* Callback event notification */ - if (event && Emac.cb_event) { - Emac.cb_event (event); - } -} - - -/* MAC Driver Control Block */ -ARM_DRIVER_ETH_MAC Driver_ETH_MAC0 = { - GetVersion, - GetCapabilities, - Initialize, - Uninitialize, - PowerControl, - GetMacAddress, - SetMacAddress, - SetAddressFilter, - SendFrame, - ReadFrame, - GetRxFrameSize, - GetRxFrameTime, - GetTxFrameTime, - ControlTimer, - Control, - PHY_Read, - PHY_Write -}; -#endif - - diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.h deleted file mode 100644 index 1d4aa6c23..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/EMAC.h +++ /dev/null @@ -1,445 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2018 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - * - * $Date: 25. Dec 2018 - * $Revision: V2.8 - * - * Project: Ethernet Media Access (MAC) Definitions - * -------------------------------------------------------------------------- */ - - -#include - -#include "Driver_ETH_MAC.h" - -#define ETH_MII 0 -/* EMAC Driver state flags */ -#define EMAC_FLAG_INIT (1 << 0) // Driver initialized -#define EMAC_FLAG_POWER (1 << 1) // Driver power on - -/* TDES0 - DMA Descriptor TX Packet Control/Status */ -#define DMA_TX_OWN 0x80000000U // Own bit 1=DMA,0=CPU - -/* TDES1 - DMA Descriptor TX Packet Control/Status */ -#define DMA_TX_IC 0x80000000U // Interrupt on completition -#define DMA_TX_LS 0x40000000U // Last segment -#define DMA_TX_FS 0x20000000U // First segment -#define DMA_TX_DC 0x04000000U // Disable CRC -#define DMA_TX_DP 0x00800000U // Disable pad -#define DMA_TX_CIC 0x18000000U // Checksum insertion control -#define DMA_TX_CIC_IP 0x08000000U //Checksum insertion control for IP header only -#define DMA_TX_CIC_BYPASS 0x00000000U -#define DMA_TX_TER 0x02000000U // Transmit end of ring -#define DMA_TX_TCH 0x01000000U // Second address chained -#define DMA_TX_TTSS 0x00020000U // Transmit time stamp status -#define DMA_TX_IHE 0x00010000U // IP header error status -#define DMA_TX_ES 0x00008000U // Error summary -#define DMA_TX_JT 0x00004000U // Jabber timeout -#define DMA_TX_FF 0x00002000U // Frame flushed -#define DMA_TX_IPE 0x00001000U // IP payload error -#define DMA_TX_LC 0x00000800U // Loss of carrier -#define DMA_TX_NC 0x00000400U // No carrier -#define DMA_TX_LCOL 0x00000200U // Late collision -#define DMA_TX_EC 0x00000100U // Excessive collision -#define DMA_TX_VF 0x00000080U // VLAN frame -#define DMA_TX_CC 0x00000078U // Collision count -#define DMA_TX_ED 0x00000004U // Excessive deferral -#define DMA_TX_UF 0x00000002U // Underflow error -#define DMA_TX_DB 0x00000001U // Deferred bit - -/* TDES1 - DMA Descriptor TX Packet Control */ -#define DMA_TX_TBS2 0x1FFF0000U // Transmit buffer 2 size -#define DMA_TX_TBS1 0x00001FFFU // Transmit buffer 1 size - -/* RDES0 - DMA Descriptor RX Packet Status */ -#define DMA_RX_OWN 0x80000000U // Own bit 1=DMA,0=CPU -#define DMA_RX_AFM 0x40000000U // Destination address filter fail -#define DMA_RX_FL 0x3FFF0000U // Frame length mask -#define DMA_RX_ES 0x00008000U // Error summary -#define DMA_RX_DE 0x00004000U // Descriptor error -#define DMA_RX_SAF 0x00002000U // Source address filter fail -#define DMA_RX_LE 0x00001000U // Length error -#define DMA_RX_OE 0x00000800U // Overflow error -#define DMA_RX_VLAN 0x00000400U // VLAN tag -#define DMA_RX_FS 0x00000200U // First descriptor -#define DMA_RX_LS 0x00000100U // Last descriptor -#define DMA_RX_IPHCE 0x00000080U // IPv4 header checksum error -#define DMA_RX_LC 0x00000040U // late collision -#define DMA_RX_FT 0x00000020U // Frame type -#define DMA_RX_RWT 0x00000010U // Receive watchdog timeout -#define DMA_RX_RE 0x00000008U // Receive error -#define DMA_RX_DRE 0x00000004U // Dribble bit error -#define DMA_RX_CE 0x00000002U // CRC error -#define DMA_RX_RMAM 0x00000001U // Rx MAC adr.match/payload cks.error - -/* RDES1 - DMA Descriptor RX Packet Control */ -#define DMA_RX_DIC 0x80000000U // Disable interrupt on completion -#define DMA_RX_RBS2 0x1FFF0000U // Receive buffer 2 size -#define DMA_RX_RER 0x02000000U // Receive end of ring -#define DMA_RX_RCH 0x01000000U // Second address chained -#define DMA_RX_RBS1 0x00001FFFU // Receive buffer 1 size - -/* Ethernet MAC configuration register */ -#define ETH_MACCR_WD 0x00800000U /* Watchdog disable */ -#define ETH_MACCR_JD 0x00400000U /* Jabber disable */ -#define ETH_MACCR_IFG 0x000E0000U /* Inter-frame gap mask*/ -#define ETH_MACCR_IFG_96Bit 0x00000000U /* Minimum IFG between frames during transmission is 96Bit */ -#define ETH_MACCR_IFG_88Bit 0x00020000U /* Minimum IFG between frames during transmission is 88Bit */ -#define ETH_MACCR_IFG_80Bit 0x00040000U /* Minimum IFG between frames during transmission is 80Bit */ -#define ETH_MACCR_IFG_72Bit 0x00060000U /* Minimum IFG between frames during transmission is 72Bit */ -#define ETH_MACCR_IFG_64Bit 0x00080000U /* Minimum IFG between frames during transmission is 64Bit */ -#define ETH_MACCR_IFG_56Bit 0x000A0000U /* Minimum IFG between frames during transmission is 56Bit */ -#define ETH_MACCR_IFG_48Bit 0x000C0000U /* Minimum IFG between frames during transmission is 48Bit */ -#define ETH_MACCR_IFG_40Bit 0x000E0000U /* Minimum IFG between frames during transmission is 40Bit */ -#define ETH_MACCR_DCRS 0x00010000U /* Disable Carrier sense during transmission */ -#define ETH_MACCR_PS 0x00008000U /* PORT Select */ -#define ETH_MACCR_FES 0x00000010U /* Fast ethernet speed */ -#define ETH_MACCR_DO 0x00002000U /* Disable Receive own */ -#define ETH_MACCR_LM 0x00001000U /* loopback mode */ -#define ETH_MACCR_DM 0x00000800U /* Duplex mode */ -#define ETH_MACCR_IPC 0x00000400U /* IP Checksum offload */ -#define ETH_MACCR_DR 0x00000200U /* Disable Retry */ -#define ETH_MACCR_APCS 0x00000080U /* Automatic Pad/CRC stripping */ -#define ETH_MACCR_BL 0x00000060U /* Back-off limit mask The random integer (r) of slot time delays where r takes the value in the range 0 = r < 2k*/ - -#define ETH_MACCR_BL_10 0x00000000U /* k = min (n, 10) */ -#define ETH_MACCR_BL_8 0x00000020U /* k = min (n, 8) */ -#define ETH_MACCR_BL_4 0x00000040U /* k = min (n, 4) */ -#define ETH_MACCR_BL_1 0x00000060U /* k = min (n, 1) */ -#define ETH_MACCR_DC 0x00000010U /* Defferal check */ -#define ETH_MACCR_TE 0x00000008U /* Transmitter enable */ -#define ETH_MACCR_RE 0x00000004U /* Receiver enable */ - - -/* Ethernet MAC Frame Filter Register */ -#define ETH_MACFFR_RA 0x80000000U /* Receive all */ -#define ETH_MACFFR_HPF 0x00000400U /* Hash or perfect filter */ -#define ETH_MACFFR_SAF 0x00000200U /* Source address filter enable */ -#define ETH_MACFFR_SAIF 0x00000100U /* SA inverse filtering */ -#define ETH_MACFFR_PCF 0x000000C0U /* Pass control frames: 3 cases */ -#define ETH_MACFFR_PCF_BlockAll 0x00000040U /* MAC filters all control frames from reaching the application */ -#define ETH_MACFFR_PCF_ForwardAll 0x00000080U /* MAC forwards all control frames to application even if they fail the Address Filter */ -#define ETH_MACFFR_PCF_ForwardPassedAddrFilter 0x000000C0U /* MAC forwards control frames that pass the Address Filter. */ -#define ETH_MACFFR_DBF 0x00000020U /* Disable Broadcast Frames */ -#define ETH_MACFFR_PM 0x00000010U /* Pass all mutlicast */ -#define ETH_MACFFR_DAIF 0x00000008U /* DA Inverse filtering */ -#define ETH_MACFFR_HMC 0x00000004U /* Hash multicast */ -#define ETH_MACFFR_HUC 0x00000002U /* Hash unicast */ -#define ETH_MACFFR_PR 0x00000001U /* Promiscuous mode */ - -/*Ethernet MAC Hash Table High Register */ -#define ETH_MACHTHR_HTH 0xFFFFFFFFU /* Hash table high */ - - -/*Ethernet MAC Hash Table Low Register */ -#define ETH_MACHTLR_HTL 0xFFFFFFFFU /* Hash table low */ - -/*Ethernet MAC MII Address Register */ -#define ETH_MACMIIAR_PA 0x0000F800U /* Physical layer address */ -#define ETH_MACMIIAR_MR 0x000007C0U /* MII register in the selected PHY */ -#define ETH_MACMIIAR_CR 0x0000001CU /* CR clock range: 6 cases */ -#define ETH_MACMIIAR_CR_Div42 0x00000000U /* HCLK:60-100 MHz; MDC clock= HCLK/42 */ -#define ETH_MACMIIAR_CR_Div62 0x00000004U /* HCLK:100-150 MHz; MDC clock= HCLK/62 */ -#define ETH_MACMIIAR_CR_Div16 0x00000008U /* HCLK:20-35 MHz; MDC clock= HCLK/16 */ -#define ETH_MACMIIAR_CR_Div26 0x0000000CU /* HCLK:35-60 MHz; MDC clock= HCLK/26 */ -#define ETH_MACMIIAR_CR_Div102 0x00000010U /* HCLK:150-180 MHz; MDC clock= HCLK/102 */ -#define ETH_MACMIIAR_MW 0x00000002U /* MII write */ -#define ETH_MACMIIAR_MB 0x00000002U /* MII busy */ - -/*Ethernet MAC MII Data Register */ -#define ETH_MACMIIDR_GD 0x0000FFFFU /* MII data: read/write data from/to PHY */ - -/*Ethernet MAC Flow Control Register */ -#define ETH_MACFCR_PT 0xFFFF0000U /* Pause time */ -#define ETH_MACFCR_DZPQ 0x00000080U /* Disable Zero-Quanta Pause */ -#define ETH_MACFCR_PLT 0x00000030U /* Pause low threshold */ -#define ETH_MACFCR_PLT_Minus4 0x00000000U /* Pause time minus 4 slot times */ -#define ETH_MACFCR_PLT_Minus28 0x00000010U /* Pause time minus 28 slot times */ -#define ETH_MACFCR_PLT_Minus144 0x00000020U /* Pause time minus 144 slot times */ -#define ETH_MACFCR_PLT_Minus256 0x00000030U /* Pause time minus 256 slot times */ -#define ETH_MACFCR_UP 0x00000008U /* Unicast pause frame detect */ -#define ETH_MACFCR_RFE 0x00000004U /* Receive flow control enable */ -#define ETH_MACFCR_TFE 0x00000002U /* Transmit flow control enable */ -#define ETH_MACFCR_FCBBPA 0x00000001U /* Flow control busy/backpressure activate */ - -/*Ethernet MAC VLAN Tag Register */ -#define ETH_MACVLANTR_VLANTI 0x0000FFFFU /* VLAN tag identifier (for receive frames) */ - -/*Ethernet MAC Remote Wake-UpFrame Filter Register */ -#define ETH_MACRWUFFR_D 0xFFFFFFFF /* Wake-up frame filter register data */ - -/*Ethernet MAC PMT Control and Status Register */ -#define ETH_MACPMTCSR_WFFRPR 0x80000000 /* Wake-Up Frame Filter Register Pointer Reset */ -#define ETH_MACPMTCSR_GU 0x00000200 /* Global Unicast */ -#define ETH_MACPMTCSR_WFR 0x00000040 /* Wake-Up Frame Received */ -#define ETH_MACPMTCSR_MPR 0x00000020 /* Magic Packet Received */ -#define ETH_MACPMTCSR_WFE 0x00000004 /* Wake-Up Frame Enable */ -#define ETH_MACPMTCSR_MPE 0x00000002 /* Magic Packet Enable */ -#define ETH_MACPMTCSR_PD 0x00000001 /* Power Down */ - -/*Ethernet MAC Status Register */ -#define ETH_MACSR_MMCTS 0x00000040U /* MMC transmit status */ -#define ETH_MACSR_MMCRS 0x00000020U /* MMC receive status */ -#define ETH_MACSR_MMCS 0x00000010U /* MMC status */ -#define ETH_MACSR_PMTS 0x00000008U /* PMT status */ - -/* Ethernet MAC Interrupt Mask Register */ -#define ETH_MACIMR_PMTIM 0x00000008U /* PMT interrupt mask */ - -/* Ethernet MAC Address0 High Register */ -#define ETH_MACA0HR_MACA0H 0x0000FFFFU /* MAC address0 high */ - -/* Ethernet MAC Address0 Low Register */ -#define ETH_MACA0LR_MACA0L 0xFFFFFFFFU /* MAC address0 low */ - -/* Ethernet MAC Address1 High Register */ -#define ETH_MACA1HR_AE 0x80000000U /* Address enable */ -#define ETH_MACA1HR_SA 0x40000000U /* Source address */ -#define ETH_MACA1HR_MBC 0x3F000000U /* Mask byte control: bits to mask for comparison of the MAC Address bytes */ -#define ETH_MACA1HR_MBC_HBits15_8 0x20000000U /* Mask MAC Address high reg bits [15:8] */ -#define ETH_MACA1HR_MBC_HBits7_0 0x10000000U /* Mask MAC Address high reg bits [7:0] */ -#define ETH_MACA1HR_MBC_LBits31_24 0x08000000U /* Mask MAC Address low reg bits [31:24] */ -#define ETH_MACA1HR_MBC_LBits23_16 0x04000000U /* Mask MAC Address low reg bits [23:16] */ -#define ETH_MACA1HR_MBC_LBits15_8 0x02000000U /* Mask MAC Address low reg bits [15:8] */ -#define ETH_MACA1HR_MBC_LBits7_0 0x01000000U /* Mask MAC Address low reg bits [7:0] */ -#define ETH_MACA1HR_MACA1H 0x0000FFFFU /* MAC address1 high */ - -/* Ethernet MAC Address1 Low Register */ -#define ETH_MACA1LR_MACA1L 0xFFFFFFFFU /* MAC address1 low */ - -/* Ethernet MAC Address2 High Register */ -#define ETH_MACA2HR_AE 0x80000000U /* Address enable */ -#define ETH_MACA2HR_SA 0x40000000U /* Source address */ -#define ETH_MACA2HR_MBC 0x3F000000U /* Mask byte control */ -#define ETH_MACA2HR_MBC_HBits15_8 0x20000000U /* Mask MAC Address high reg bits [15:8] */ -#define ETH_MACA2HR_MBC_HBits7_0 0x10000000U /* Mask MAC Address high reg bits [7:0] */ -#define ETH_MACA2HR_MBC_LBits31_24 0x08000000U /* Mask MAC Address low reg bits [31:24] */ -#define ETH_MACA2HR_MBC_LBits23_16 0x04000000U /* Mask MAC Address low reg bits [23:16] */ -#define ETH_MACA2HR_MBC_LBits15_8 0x02000000U /* Mask MAC Address low reg bits [15:8] */ -#define ETH_MACA2HR_MBC_LBits7_0 0x01000000U /* Mask MAC Address low reg bits [70] */ -#define ETH_MACA2HR_MACA2H 0x0000FFFFU /* MAC address1 high */ - -/*Ethernet MAC Address2 Low Register */ -#define ETH_MACA2LR_MACA2L 0xFFFFFFFFU /* MAC address2 low */ - -/* Ethernet MAC Address3 High Register */ -#define ETH_MACA3HR_AE 0x80000000U /* Address enable */ -#define ETH_MACA3HR_SA 0x40000000U /* Source address */ -#define ETH_MACA3HR_MBC 0x3F000000U /* Mask byte control */ -#define ETH_MACA3HR_MBC_HBits15_8 0x20000000U /* Mask MAC Address high reg bits [15:8] */ -#define ETH_MACA3HR_MBC_HBits7_0 0x10000000U /* Mask MAC Address high reg bits [7:0] */ -#define ETH_MACA3HR_MBC_LBits31_24 0x08000000U /* Mask MAC Address low reg bits [31:24] */ -#define ETH_MACA3HR_MBC_LBits23_16 0x04000000U /* Mask MAC Address low reg bits [23:16] */ -#define ETH_MACA3HR_MBC_LBits15_8 0x02000000U /* Mask MAC Address low reg bits [15:8] */ -#define ETH_MACA3HR_MBC_LBits7_0 0x01000000U /* Mask MAC Address low reg bits [70] */ -#define ETH_MACA3HR_MACA3H 0x0000FFFFU /* MAC address3 high */ - -/* Ethernet MAC Address3 Low Register */ -#define ETH_MACA3LR_MACA3L 0xFFFFFFFFU /* MAC address3 low */ - -/* Ethernet MMC Contol Register */ -#define ETH_MMCCR_MCF 0x00000008U /* MMC Counter Freeze */ -#define ETH_MMCCR_ROR 0x00000004U /* Reset on Read */ -#define ETH_MMCCR_CSR 0x00000002U /* Counter Stop Rollover */ -#define ETH_MMCCR_CR 0x00000001U /* Counters Reset */ - -/* Ethernet MMC Receive Interrupt Register */ -#define ETH_MMCRIR_RFCES 0x00000020U /* Set when Rx crc error counter reaches half the maximum value */ - -/* MMC Transmit Interrupt Register */ -#define ETH_MMCTIR_TGFS 0x00200000U /* Set when Tx good frame count counter reaches half the maximum value */ -#define ETH_MMCTIR_TGFSCS 0x00004000U /* Set when Tx good single col counter reaches half the maximum value */ - -/*Ethernet MMC Receive Interrupt Mask Register */ -#define ETH_MMCRIMR_RFCEM 0x00000020U /* Mask the interrupt when Rx crc error counter reaches half the maximum value */ - -/*Ethernet MMC Transmit Interrupt Mask Register */ -#define ETH_MMCTIMR_TGFM 0x00200000U /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */ -#define ETH_MMCTIMR_TGFSCM 0x00004000U /* Mask the interrupt when Tx good single col counter reaches half the maximum value */ - -/* DMA Bus Mode Register */ -#define ETH_DMABMR_AAB 0x02000000U /* Address-Aligned beats */ -#define ETH_DMABMR_FPM 0x01000000U /* 4xPBL mode */ -#define ETH_DMABMR_USP 0x00800000U /* Use separate PBL */ -#define ETH_DMABMR_RDP 0x007E0000U /* RxDMA PBL */ -#define ETH_DMABMR_RDP_1Beat 0x00020000U /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ -#define ETH_DMABMR_RDP_2Beat 0x00040000U /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ -#define ETH_DMABMR_RDP_4Beat 0x00080000U /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ -#define ETH_DMABMR_RDP_8Beat 0x00100000U /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ -#define ETH_DMABMR_RDP_16Beat 0x00200000U /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ -#define ETH_DMABMR_RDP_32Beat 0x00400000U /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ -#define ETH_DMABMR_RDP_4xPBL_4Beat 0x01020000U /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ -#define ETH_DMABMR_RDP_4xPBL_8Beat 0x01040000U /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ -#define ETH_DMABMR_RDP_4xPBL_16Beat 0x01080000U /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ -#define ETH_DMABMR_RDP_4xPBL_32Beat 0x01100000U /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ -#define ETH_DMABMR_RDP_4xPBL_64Beat 0x01200000U /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ -#define ETH_DMABMR_RDP_4xPBL_128Beat 0x01400000U /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ -#define ETH_DMABMR_FB 0x00010000U /* Fixed Burst */ -#define ETH_DMABMR_RTPR 0x0000C000U /* Rx Tx priority ratio */ -#define ETH_DMABMR_RTPR_1_1 0x00000000U /* Rx Tx priority ratio */ -#define ETH_DMABMR_RTPR_2_1 0x00004000U /* Rx Tx priority ratio */ -#define ETH_DMABMR_RTPR_3_1 0x00008000U /* Rx Tx priority ratio */ -#define ETH_DMABMR_RTPR_4_1 0x0000C000U /* Rx Tx priority ratio */ -#define ETH_DMABMR_PBL 0x00003F00U /* Programmable burst length */ -#define ETH_DMABMR_PBL_1Beat 0x00000100U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ -#define ETH_DMABMR_PBL_2Beat 0x00000200U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ -#define ETH_DMABMR_PBL_4Beat 0x00000400U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ -#define ETH_DMABMR_PBL_8Beat 0x00000800U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ -#define ETH_DMABMR_PBL_16Beat 0x00001000U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ -#define ETH_DMABMR_PBL_32Beat 0x00002000U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ -#define ETH_DMABMR_PBL_4xPBL_4Beat 0x01000100U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ -#define ETH_DMABMR_PBL_4xPBL_8Beat 0x01000200U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ -#define ETH_DMABMR_PBL_4xPBL_16Beat 0x01000400U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ -#define ETH_DMABMR_PBL_4xPBL_32Beat 0x01000800U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ -#define ETH_DMABMR_PBL_4xPBL_64Beat 0x01001000U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ -#define ETH_DMABMR_PBL_4xPBL_128Beat 0x01002000U /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ -#define ETH_DMABMR_DSL 0x0000007CU /* Descriptor Skip Length */ -#define ETH_DMABMR_DA 0x00000002U /* DMA arbitration scheme */ -#define ETH_DMABMR_SR 0x00000001U /* Software reset */ - -/* DMA Transmit Poll Demand Register */ -#define ETH_DMATPDR_TPD 0xFFFFFFFFU /* Transmit poll demand */ - -/* DMA Receive Poll Demand Register */ -#define ETH_DMARPDR_RPD 0xFFFFFFFFU - -/* DMA Receive Descriptor List Address Register */ -#define ETH_DMARDLAR_SRL 0xFFFFFFFFU /* Start of receive list */ - -/* DMA Transmit Descriptor List Address Register */ -#define ETH_DMATDLAR_STL 0xFFFFFFFFU /* Start of transmit list */ - -/* DMA Status Register */ -#define ETH_DMASR_PMTS 0x10000000U /* PMT status */ -#define ETH_DMASR_MMCS 0x08000000U /* MMC status */ -#define ETH_DMASR_EBS 0x03800000U /* Error bits status */ -#define ETH_DMASR_EBS_DescAccess 0x02000000U /* Error bits 0-data buffer, 1-desc. access */ -#define ETH_DMASR_EBS_ReadTransf 0x01000000U /* Error bits 0-write trnsfer, 1-read transfer */ -#define ETH_DMASR_EBS_DataTransfTx 0x00800000U /* Error bits 0-Data transfer by Rx DMA, 1-Tx DMA */ -#define ETH_DMASR_TPS 0x00700000U /* Transmit process state */ -#define ETH_DMASR_TPS_Stopped 0x00000000U /* Stopped - Reset or Stop Tx Command issued */ -#define ETH_DMASR_TPS_Fetching 0x00100000U /* Running - fetching the Tx descriptor */ -#define ETH_DMASR_TPS_Waiting 0x00200000U /* Running - waiting for status */ -#define ETH_DMASR_TPS_Reading 0x00300000U /* Running - reading the data from host memory */ -#define ETH_DMASR_TPS_Suspended 0x00600000U /* Suspended - Tx Descriptor unavailabe */ -#define ETH_DMASR_TPS_Closing 0x00700000U /* Running - closing Rx descriptor */ -#define ETH_DMASR_RPS 0x000E0000U /* Receive process state */ -#define ETH_DMASR_RPS_Stopped 0x00000000U /* Stopped - Reset or Stop Rx Command issued */ -#define ETH_DMASR_RPS_Fetching 0x00020000U /* Running - fetching the Rx descriptor */ -#define ETH_DMASR_RPS_Waiting 0x00060000U /* Running - waiting for packet */ -#define ETH_DMASR_RPS_Suspended 0x00080000U /* Suspended - Rx Descriptor unavailable */ -#define ETH_DMASR_RPS_Closing 0x000A0000U /* Running - closing descriptor */ -#define ETH_DMASR_RPS_Queuing 0x000E0000U /* Running - queuing the recieve frame into host memory */ -#define ETH_DMASR_NIS 0x00010000U /* Normal interrupt summary */ -#define ETH_DMASR_AIS 0x00008000U /* Abnormal interrupt summary */ -#define ETH_DMASR_ERI 0x00004000U /* Early receive interrupt */ -#define ETH_DMASR_FBEI 0x00002000U /* Fatal bus error Interrupt */ -#define ETH_DMASR_ETI 0x00000400U /* Early transmit Interrupt */ -#define ETH_DMASR_RWT 0x00000200U /* Receive watchdog timeout status */ -#define ETH_DMASR_RPSS 0x00000100U /* Receive process stopped status */ -#define ETH_DMASR_RBU 0x00000080U /* Receive buffer unavailable status */ -#define ETH_DMASR_RI 0x00000040U /* Receive interrupt status */ -#define ETH_DMASR_TUNF 0x00000020U /* Transmit underflow status */ -#define ETH_DMASR_ROVF 0x00000010U /* Receive overflow status */ -#define ETH_DMASR_TJT 0x00000008U /* Transmit jabber timeout status */ -#define ETH_DMASR_TBU 0x00000004U /* Transmit buffer unavailable status */ -#define ETH_DMASR_TPSS 0x00000002U /* Transmit process stopped status */ -#define ETH_DMASR_TI 0x00000001U /* Transmit interrupt status */ - -/* DMA Operation Mode Register */ -#define ETH_DMAOMR_DT 0x04000000U /* Disable Dropping of TCP/IP checksum error frames */ -#define ETH_DMAOMR_RSF 0x02000000U /* Receive store and forward */ -#define ETH_DMAOMR_DFF 0x01000000U /* Disable flushing of received frames */ -#define ETH_DMAOMR_TSF 0x00200000U /* Transmit store and forward */ -#define ETH_DMAOMR_FTF 0x00100000U /* Flush transmit FIFO */ -#define ETH_DMAOMR_TTC 0x0001C000U /* Transmit threshold control */ -#define ETH_DMAOMR_TTC_64Bytes 0x00000000U /* threshold level of the MTL Transmit FIFO is 64 Bytes */ -#define ETH_DMAOMR_TTC_128Bytes 0x00004000U /* threshold level of the MTL Transmit FIFO is 128 Bytes */ -#define ETH_DMAOMR_TTC_192Bytes 0x00008000U /* threshold level of the MTL Transmit FIFO is 192 Bytes */ -#define ETH_DMAOMR_TTC_256Bytes 0x0000C000U /* threshold level of the MTL Transmit FIFO is 256 Bytes */ -#define ETH_DMAOMR_TTC_40Bytes 0x00010000U /* threshold level of the MTL Transmit FIFO is 40 Bytes */ -#define ETH_DMAOMR_TTC_32Bytes 0x00014000U /* threshold level of the MTL Transmit FIFO is 32 Bytes */ -#define ETH_DMAOMR_TTC_24Bytes 0x00018000U /* threshold level of the MTL Transmit FIFO is 24 Bytes */ -#define ETH_DMAOMR_TTC_16Bytes 0x0001C000U /* threshold level of the MTL Transmit FIFO is 16 Bytes */ -#define ETH_DMAOMR_ST 0x00002000U /* Start/stop transmission command */ -#define ETH_DMAOMR_FEF 0x00000080U /* Forward error frames */ -#define ETH_DMAOMR_FUF 0x00000040U /* Forward undersized good frames */ -#define ETH_DMAOMR_RTC 0x00000018U /* receive threshold control */ -#define ETH_DMAOMR_RTC_64Bytes 0x00000000U /* threshold level of the MTL Receive FIFO is 64 Bytes */ -#define ETH_DMAOMR_RTC_32Bytes 0x00000008U /* threshold level of the MTL Receive FIFO is 32 Bytes */ -#define ETH_DMAOMR_RTC_96Bytes 0x00000010U /* threshold level of the MTL Receive FIFO is 96 Bytes */ -#define ETH_DMAOMR_RTC_128Bytes 0x00000018U /* threshold level of the MTL Receive FIFO is 128 Bytes */ -#define ETH_DMAOMR_OSF 0x00000004U /* operate on second frame */ -#define ETH_DMAOMR_SR 0x00000002U /* Start/stop receive */ - -/* DMA Interrupt Enable Register */ -#define ETH_DMAIER_NIE 0x00010000U /* Normal interrupt summary enable */ -#define ETH_DMAIER_AIE 0x00008000U /* Abnormal interrupt summary enable */ -#define ETH_DMAIER_ERIE 0x00004000U /* Early receive interrupt enable */ -#define ETH_DMAIER_FBIE 0x00002000U /* Fatal bus error interrupt enable */ -#define ETH_DMAIER_ETIE 0x00000400U /* Early transmit interrupt enable */ -#define ETH_DMAIER_RWIE 0x00000200U /* Receive watchdog timeout interrupt enable */ -#define ETH_DMAIER_RSIE 0x00000100U /* Receive process stopped interrupt enable */ -#define ETH_DMAIER_RUIE 0x00000080U /* Receive buffer unavailable interrupt enable */ -#define ETH_DMAIER_RIE 0x00000040U /* Receive interrupt enable */ -#define ETH_DMAIER_TUIE 0x00000020U /* Transmit Underflow interrupt enable */ -#define ETH_DMAIER_ROIE 0x00000010U /* Receive Overflow interrupt enable */ -#define ETH_DMAIER_TJIE 0x00000008U /* Transmit jabber timeout interrupt enable */ -#define ETH_DMAIER_TBUIE 0x00000004U /* Transmit buffer unavailable interrupt enable */ -#define ETH_DMAIER_TSIE 0x00000002U /* Transmit process stopped interrupt enable */ -#define ETH_DMAIER_TIE 0x00000001U /* Transmit interrupt enable */ - -/* DMA Missed Frame and Buffer Overflow Counter Register */ -#define ETH_DMAMFBOCR_OFOC 0x10000000U /* Overflow bit for FIFO overflow counter */ -#define ETH_DMAMFBOCR_MFA 0x0FFE0000U /* Number of frames missed by the application */ -#define ETH_DMAMFBOCR_OMFC 0x00010000U /* Overflow bit for missed frame counter */ -#define ETH_DMAMFBOCR_MFC 0x0000FFFFU /* Number of frames missed by the controller */ - -/* DMA Current Host Transmit Descriptor Register */ -#define ETH_DMACHTDR_HTDAP 0xFFFFFFFFU /* Host transmit descriptor address pointer */ - -/* DMA Current Host Receive Descriptor Register */ -#define ETH_DMACHRDR_HRDAP 0xFFFFFFFFU /* Host receive descriptor address pointer */ - -/* DMA Current Host Transmit Buffer Address Register */ -#define ETH_DMACHTBAR_HTBAP 0xFFFFFFFFU /* Host transmit buffer address pointer */ - -/* DMA Current Host Receive Buffer Address Register */ -#define ETH_DMACHRBAR_HRBAP 0xFFFFFFFFU /* Host receive buffer address pointer */ - -typedef struct _ETH_PIN_config { - uint8_t port; - uint8_t pin; - uint8_t mode; - uint8_t pad_sel; -} ETH_PIN_Config; - -/* EMAC Driver Control Information */ -typedef struct { - ARM_ETH_MAC_SignalEvent_t cb_event; // Event callback - uint8_t flags; // Control and state flags - uint8_t tx_index; // Transmit descriptor index - uint8_t rx_index; // Receive descriptor index -#if (EMAC_CHECKSUM_OFFLOAD) - bool tx_cks_offload; // Checksum offload enabled/disabled -#endif -#if (EMAC_TIME_STAMP) - uint8_t tx_ts_index; // Transmit Timestamp descriptor index -#endif - uint8_t *frame_end; // End of assembled frame fragments -} EMAC_CTRL; - diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.c deleted file mode 100644 index a5069308d..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.c +++ /dev/null @@ -1,1118 +0,0 @@ - /* -------------------------------------------------------------------------- - * Copyright (c) 2013-2016 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - * - * $Date: 02. March 2016 - * $Revision: V1.1 - * - * Driver: Driver_MCI0 - * Configured: via RTE_Device.h configuration file - * Project: MCI Driver for RS1xxxx - */ - -/* History: - * Version 1.0 - * Initial release - */ -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) -#include "MCI.h" - - - -#define SDHC_IRQHandler IRQ068_Handler -#define ARM_MCI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,2) /* driver version */ -static MCI_CTRL MCI; - -/* Driver Version */ -static const ARM_DRIVER_VERSION DriverVersion = { - ARM_MCI_API_VERSION, - ARM_MCI_DRV_VERSION -}; - -/* Driver Capabilities */ -static const ARM_MCI_CAPABILITIES DriverCapabilities = { - RTE_MCI_CD_PIN, /* cd_state */ - 0, /* cd_event */ - RTE_MCI_WP_PIN, /* wp_state */ - 0, /* vdd */ - 0, /* vdd_1v8 */ - 0, /* vccq */ - 0, /* vccq_1v8 */ - 0, /* vccq_1v2 */ - RTE_MCI_BUS_WIDTH_4, /* data_width_4 */ - RTE_MCI_BUS_WIDTH_8, /* data_width_8 */ - 0, /* data_width_4_ddr */ - 0, /* data_width_8_ddr */ - 1, /* high_speed */ - 0, /* uhs_signaling */ - 0, /* uhs_tuning */ - 0, /* uhs_sdr50 */ - 0, /* uhs_sdr104 */ - 0, /* uhs_ddr50 */ - 0, /* uhs_driver_type_a */ - 0, /* uhs_driver_type_c */ - 0, /* uhs_driver_type_d */ - 0, /* sdio_interrupt */ - 0, /* read_wait */ - 0, /* suspend_resume */ - 0, /* mmc_interrupt */ - 0, /* mmc_boot */ - 0, /* rst_n */ - 0, /* ccs */ - 0 /* ccs_timeout */ -}; - -/*********functions************/ -static MCI_ADMA_DESC_TABLE_T Adma2DescriptorTable[2] = { 0 }; - -/** - * @fn ARM_DRIVER_VERSION MCI_GetVersion(void) - * @brief Get Driver Version. - * @param[in] none - * @return ARM DRIVER VERSION - */ -static ARM_DRIVER_VERSION MCI_GetVersion(void) -{ - return DriverVersion; -} - -/** - * @fn ARM_MCI_CAPABILITIES MCI_GetCapabilities(void) - * @brief Get Driver capabilities. - * @param[in] none - * @return ARM_MCI_CAPABILITIES - */ -static ARM_MCI_CAPABILITIES MCI_GetCapabilities(void) -{ - return DriverCapabilities; -} - -/** - * @fn int32_t MCI_Initialize(ARM_MCI_SignalEvent_t cb_event) - * @brief Initialize the Memory Card Interface. - * @param[in] cb_event Pointer to the ARM_MCI_SignalEvent - * @return excecution status - */ -static int32_t MCI_Initialize(ARM_MCI_SignalEvent_t cb_event) -{ - if (MCI.flags & MCI_INIT) - { - return ARM_DRIVER_OK; - } - - MCI.cb_event = cb_event; - - /* Clear status */ - MCI.status.command_active = 0U; - MCI.status.command_timeout = 0U; - MCI.status.command_error = 0U; - MCI.status.transfer_active = 0U; - MCI.status.transfer_timeout = 0U; - MCI.status.transfer_error = 0U; - MCI.status.sdio_interrupt = 0U; - MCI.status.ccs = 0U; - - /*Configure clock gpio pin*/ - if(RTE_MCI_CLK_PIN == 25) - { - RSI_EGPIO_HostPadsGpioModeEnable(25); - } - RSI_EGPIO_PadSelectionEnable(RTE_MCI_CLOCK_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_CLK_PIN); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_CLOCK_PORT,RTE_MCI_CLK_PIN,EGPIO_PIN_MUX_MODE8); - - if(RTE_MCI_CD_PIN) - { - /*Configure cd gpio pin*/ - RSI_EGPIO_PadSelectionEnable(RTE_MCI_CDD_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_CDD_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_CDD_PIN,Pulldown); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_CD_PORT,RTE_MCI_CDD_PIN,EGPIO_PIN_MUX_MODE8); - } - if(RTE_MCI_WP_PIN) - { - /*Configure write protect gpio pin*/ - RSI_EGPIO_PadSelectionEnable(RTE_MCI_WPP_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_WPP_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_WPP_PIN,Pulldown); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_WP_PORT,RTE_MCI_WPP_PIN,EGPIO_PIN_MUX_MODE8); - } - - /*Configure command gpio pin*/ - if(RTE_MCI_CMD_PIN == 26) - { - RSI_EGPIO_HostPadsGpioModeEnable(26); - } - RSI_EGPIO_PadSelectionEnable(RTE_MCI_CMD_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_CMD_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_CMD_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_CMD_PORT,RTE_MCI_CMD_PIN,EGPIO_PIN_MUX_MODE8); - - /*Configure data0 gpio pin*/ - if(RTE_MCI_DATA0_PIN == 27) - { - RSI_EGPIO_HostPadsGpioModeEnable(27); - } - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA0_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA0_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA0_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA0_PORT,RTE_MCI_DATA0_PIN,EGPIO_PIN_MUX_MODE8); - -#if(RTE_SDMMC_BUS_WIDTH_4) /* SD_DAT[3..1] */ - /*Configure data1 gpio pin*/ - if(RTE_MCI_DATA1_PIN == 28) - { - RSI_EGPIO_HostPadsGpioModeEnable(28); - } - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA1_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA1_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA1_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA1_PORT,RTE_MCI_DATA1_PIN,EGPIO_PIN_MUX_MODE8); - - /*Configure data2 gpio pin*/ - if(RTE_MCI_DATA2_PIN == 29) - { - RSI_EGPIO_HostPadsGpioModeEnable(29); - } - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA2_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA2_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA2_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA2_PORT,RTE_MCI_DATA2_PIN,EGPIO_PIN_MUX_MODE8); - - /*Configure data3 gpio pin*/ - if(RTE_MCI_DATA3_PIN == 30) - { - RSI_EGPIO_HostPadsGpioModeEnable(30); - } - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA3_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA3_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA3_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA3_PORT,RTE_MCI_DATA3_PIN,EGPIO_PIN_MUX_MODE8); - -#if(RTE_SDMMC_BUS_WIDTH_8) /* RTE_SDMMC_BUS_WIDTH_8 */ - - /*Configure data4 gpio pin*/ - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA4_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA4_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA4_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA4_PORT,RTE_MCI_DATA4_PIN,RTE_MCI_DATA6_MODE); - - /*Configure data5 gpio pin*/ - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA5_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA5_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA5_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA5_PORT,RTE_MCI_DATA5_PIN,RTE_MCI_DATA5_MODE); - - /*Configure data6 gpio pin*/ - RSI_EGPIO_PadSelectionEnable(RTE_MCI_DATA6_PAD); - RSI_EGPIO_PadReceiverEnable(RTE_MCI_DATA6_PIN); - RSI_EGPIO_PadDriverDisableState(RTE_MCI_DATA6_PIN,Pullup); - RSI_EGPIO_SetPinMux(EGPIO,RTE_MCI_DATA6_PORT,RTE_MCI_DATA6_PIN,RTE_MCI_DATA6_MODE); - -#endif /* RTE_SDMMC_BUS_WIDTH_8 */ -#endif /* RTE_SDMMC_BUS_WIDTH_4 */ - - MCI.flags = MCI_INIT; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t MCI_UnInitialize(ARM_MCI_SignalEvent_t cb_event) - * @brief DeInitialize the Memory Card Interface. - * @param[in] none - * @return excecution status - */ -int32_t MCI_Uninitialize(void) -{ - MCI.flags = 0; - - /*Disable sdmem clock */ - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SD_CLOCK_ENABLE = 0u; - - return ARM_DRIVER_OK; -} -boolean_t sdioh_wait_for_card_insert( ) -{ - /* Wait until card is stable */ - while(SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1); - return (boolean_t)SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED; -} - -/** - * @fn int32_t MCI_PowerControl(ARM_POWER_STATE state) - * @brief Control Memory Card Interface Power. - * @param[in] state Power state - * @return excecution status - */ -int32_t MCI_PowerControl(ARM_POWER_STATE state) -{ - switch (state) - { - case ARM_POWER_OFF: - /* Disable SDHC interrupt in NVIC */ - NVIC_DisableIRQ(SDMEM_IRQn); - - /* Clear flags */ - MCI.flags = MCI_POWER; - - /* Clear status */ - MCI.status.command_active = 0U; - MCI.status.command_timeout = 0U; - MCI.status.command_error = 0U; - MCI.status.transfer_active = 0U; - MCI.status.transfer_timeout = 0U; - MCI.status.transfer_error = 0U; - MCI.status.sdio_interrupt = 0U; - MCI.status.ccs = 0U; - break; - - case ARM_POWER_FULL: - if ((MCI.flags & MCI_POWER) == 0) - { - /* Clear response variable */ - MCI.response = NULL; - - /* sleepclock prog */ - *(volatile uint32_t *) (0x46000024) = (0x0<<21); - - /* wait for clock switch */ - while((M4CLK->PLL_STAT_REG_b.SLEEP_CLK_SWITCHED) != 1); - - /* Wait for card insert */ - while (sdioh_wait_for_card_insert()==0); - - /* enable adma*/ - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DMA_SELECT = 0x2; - - /* Enable normal interrupts*/ - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_ENABLE_REGISTER = ( - COMMAND_COMPLETE_STATUS_ENABLE | - TRANSFER_COMPLETE_STATUS_ENABLE | - BLOCK_GAP_EVENT_STATUS_ENABLE | - DMA_INTERRUPT_STATUS_ENABLE | - BUFFER_WRITE_READY_STATUS_ENABLE| - BUFFER_READ_READY_STATUS_ENABLE | - CARD_INSERTION_STATUS_ENABLE | - CARD_REMOVAL_STATUS_ENABLE | - CARD_INTERRUPT_STATUS_ENABLE | - INT_A_STATUS_ENABLE | - INT_B_STATUS_ENABLE | - INT_C_STATUS_ENABLE | - RE_TUNING_EVENT_STATUS_ENABLE ); - - /* Enable error interrupts*/ - SMIH->SMIH_ERROR_INTERRUPT_STATUS_ENABLE_REGISTER = ( - COMMAND_TIMEOUT_ERROR_STATUS_ENABLE | - COMMAND_CRC_ERROR_STATUS_ENABLE | - COMMAND_END_BIT_ERROR_STATUS_ENABLE | - COMMAND_INDEX_ERROR_STATUS_ENABLE | - DATA_TIMEOUT_ERROR_STATUS_ENABLE | - DATA_CRC_ERROR_STATUS_ENABLE | - DATA_END_BIT_ERROR_STATUS_ENABLE | - CURRENT_LIMIT_ERROR_STATUS_ENABLE | - AUTO_CMD_ERROR_STATUS_ENABLE | - ADMA_ERROR_STATUS_ENABLE | - TUNING_ERROR_STATUS_ENABLE ); - - /* Enable normal interrupts signals*/ - SMIH->SMIH_NORMAL_INTERRUPT_SIGNAL_ENABLE_REGISTER = (COMMAND_COMPLETE_SIGNAL_ENABLE | - TRANSFER_COMPLETE_SIGNAL_ENABLE | - BUFFER_WRITE_READY_SIGNAL_ENABLE | - BUFFER_READ_READY_SIGNAL_ENABLE | - CARD_REMOVAL_SIGNAL_ENABLE ); - - SMIH->SMIH_ERROR_INTERRUPT_SIGNAL_ENABLE_REGISTER = 0x1; - - /* select voltage to 3.3v*/ - SMIH->SMIH_POWER_CONTROL_REGISTER_b.SD_BUS_VOLTAGE_SELECT = 7U; - - /*power on bus*/ - SMIH->SMIH_POWER_CONTROL_REGISTER_b.SD_BUS_POWER = 0x1; - - /*configure data timeout counter value*/ - SMIH->SMIH_TIMEOUT_CONTROL_REGISTER_b.DATA_TIMEOUT_COUNTER_VALUE = 0xE; - - /* NVIC Enable*/ - NVIC_ClearPendingIRQ (SDMEM_IRQn); - NVIC_EnableIRQ (SDMEM_IRQn); - - MCI.flags |= MCI_POWER; - } - break; - case ARM_POWER_LOW: - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t MCI_CardPower(uint32_t voltage) - * @brief Set Memory Card Power supply voltage. - * @param[in] voltage : Memory Card Power supply voltage - * @return excecution status - */ -int32_t MCI_CardPower(uint32_t voltage) -{ - if ((MCI.flags & MCI_POWER) == 0U) - { - return ARM_DRIVER_ERROR; - } - return ARM_DRIVER_ERROR_UNSUPPORTED; -} - -/** - * @fn int32_t MCI_ReadCD(void) - * @brief Read Card Detect (CD) state. - * @param[in] none - * @return excecution status - */ -int32_t MCI_ReadCD(void) -{ - if(RTE_MCI_CD_PIN != 0) - { - if (MCI.flags & MCI_POWER) { - if((RSI_EGPIO_GetPin(EGPIO,RTE_MCI_CD_PORT,RTE_MCI_CDD_PIN) == 0)) - { - return (1); - } - } - } - return (0); -} - -/** - * @fn int32_t MCI_ReadWP(void) - * @brief Read Write Protect (WP) state. - * @param[in] none - * @return excecution status - */ -int32_t MCI_ReadWP(void) -{ - if(RTE_MCI_WP_PIN != 0) - { - if (MCI.flags & MCI_POWER) { - if((RSI_EGPIO_GetPin(EGPIO,RTE_MCI_WP_PORT,RTE_MCI_WPP_PIN) == 0)) - { - return (1); - } - } - } - return (0); -} - -/** - * @fn int32_t MCI_SendCommand(uint32_t cmd, uint32_t arg, uint32_t flags, uint32_t *response) - * @brief Send Command to card and get the response. - * @param[in] cmd : Memory Card command - * @param[in] arg : Command argument - * @param[in] flags : Command flags - * @param[in] response : Pointer to buffer for response - * @return excecution status - */ -int32_t MCI_SendCommand(uint32_t cmd, uint32_t arg, uint32_t flags, uint32_t *response) -{ - MCI_COMMAND_FRAME_CONFIG_T CommandCfg = { 0 }; - MCI_DATA_CONFIG_T DataCfg = { 0 }; - uint32_t i=0; - if (((flags & MCI_RESPONSE_EXPECTED) != 0U) && (response == NULL)) - { - return ARM_DRIVER_ERROR_PARAMETER; - } - if ((MCI.flags & MCI_SETUP) == 0U) - { - return ARM_DRIVER_ERROR; - } - if (MCI.status.command_active) - { - return ARM_DRIVER_ERROR_BUSY; - } - /* wait for data line free */ - if (flags & ARM_MCI_TRANSFER_DATA) { - - while( SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_DAT == 1); - } - while(SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_CMD == 1); - - MCI.status.command_active = 1U; - MCI.status.command_timeout = 0U; - MCI.status.command_error = 0U; - MCI.status.transfer_timeout = 0U; - MCI.status.transfer_error = 0U; - MCI.status.ccs = 0U; - - if (flags & ARM_MCI_CARD_INITIALIZE) - { - /* Configure sdmem internal clock */ - RSI_MCI_ClockCnfig(400000); - - /*wait for some time*/ - for(i=0;i<20000;i++); - } - CommandCfg.argument =arg; - CommandCfg.cmdIndex = cmd & 0xFF; - DataCfg.blockSize = MCI.bl_sz; - DataCfg.blockCount = MCI.bl_cnt; - - if (CommandCfg.cmdIndex == 0x0C) - { - //abort command - CommandCfg.cmdType = 3; - } - MCI.response = response; - MCI.flags &= ~MCI_RESP_LONG; - - switch (flags & ARM_MCI_RESPONSE_Msk) - { - case ARM_MCI_RESPONSE_NONE: - /* No response expected */ - break; - case ARM_MCI_RESPONSE_SHORT: - /* Short response expected */ - CommandCfg.responseType = MCI_RESPONSE_48BIT; - break; - case ARM_MCI_RESPONSE_SHORT_BUSY: - /* Short response with busy expected */ - CommandCfg.responseType = MCI_RESPONSE_48BIT_BUSY_CHECK; - break; - case ARM_MCI_RESPONSE_LONG: - MCI.flags |= MCI_RESP_LONG; - /* Long response expected */ - CommandCfg.responseType = MCI_RESPONSE_136BIT; - break; - default: - return ARM_DRIVER_ERROR; - } - if (flags & ARM_MCI_RESPONSE_INDEX) - { - /* Check for command index error */ - CommandCfg.checkCmdIndex = 1; - } - if (flags & ARM_MCI_RESPONSE_CRC) - { - /* Check for CRC error */ - CommandCfg.checkCmdCrc = 1; - } - - DataCfg.admaDespTableAddress = (uint32_t)&Adma2DescriptorTable[0]; - if (flags & ARM_MCI_TRANSFER_DATA) - { - /* Enable data transfer */ - CommandCfg.dataPresent = 1; - if (MCI.flags & MCI_DATA_READ) - { - /* Read transfer */ - DataCfg.dataTransferDirection = MCI_READ_DIRECTION; - } - if(MCI.flags & MCI_DATA_MULB) - { - /* Multiple block transfer */ - DataCfg.blockCountEnable = 1; - DataCfg.multiBlock = 1; - } - MCI.status.transfer_active = 1U; - } - /* initialize data transfer */ - RSI_MCI_DataTransferInitialization(&DataCfg); - - /* send command */ - RSI_MCI_SendCommand(&CommandCfg); - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t MCI_SetupTransfer(uint8_t *data, uint32_t block_count, uint32_t block_size, uint32_t mode) - * @brief Setup read or write transfer operation. - * @param[in] data : Pointer to data block(s) to be written or read - * @param[in] block_count : Number of blocks - * @param[in] block_size : Size of a block in bytes - * @param[in] mode : Transfer mode - * @return excecution status - */ -int32_t MCI_SetupTransfer(uint8_t *data, uint32_t block_count, uint32_t block_size, uint32_t mode) -{ - if ((data == NULL) || (block_count == 0U) || (block_size == 0U)) - { - return ARM_DRIVER_ERROR_PARAMETER; - } - if ((MCI.flags & MCI_SETUP) == 0U) - { - return ARM_DRIVER_ERROR; - } - if (MCI.status.transfer_active) - { - return ARM_DRIVER_ERROR_BUSY; - } - if (mode & ARM_MCI_TRANSFER_STREAM) - { - /* Stream or SDIO multibyte data transfer not supported by peripheral */ - return ARM_DRIVER_ERROR; - } - - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE=0x1; - - memset(Adma2DescriptorTable, 0x0, sizeof(Adma2DescriptorTable)); - - /*Fill adma descriptor table*/ - Adma2DescriptorTable[0].attributeValid = 1; - Adma2DescriptorTable[0].attributeEnd = 1; - Adma2DescriptorTable[0].attributeInt = 0; - Adma2DescriptorTable[0].attributeAct = 2; - Adma2DescriptorTable[0].length = (block_size * block_count); - Adma2DescriptorTable[0]._32BIT_Adress = (uint32_t)data; - - /* Set transfer block count and size */ - MCI.bl_cnt = block_count; - MCI.bl_sz = block_size; - - if (block_count == 1) - { - /* Single block transfer */ - MCI.flags &= ~MCI_DATA_MULB; - } - else - { - /* Multiple block transfer */ - MCI.flags |= MCI_DATA_MULB; - } - - if (mode & ARM_MCI_TRANSFER_WRITE) - { - /* Direction: From controller to card */ - MCI.flags &= ~MCI_DATA_READ; - } - else - { - /* Direction: From card to controller */ - MCI.flags |= MCI_DATA_READ; - } - while( SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_DAT == 0x1); - return (ARM_DRIVER_OK); -} - -/** - * @fn int32_t MCI_AbortTransfer(void) - * @brief Abort current read/write data transfer. - * @param[in] none - * @return excecution status - */ -int32_t MCI_AbortTransfer(void) -{ - int32_t status; - if ((MCI.flags & MCI_SETUP) == 0U) - { - return ARM_DRIVER_ERROR; - } - status = ARM_DRIVER_OK; - - /* Disable normal interrupts*/ - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_ENABLE_REGISTER &= ~( - COMMAND_COMPLETE_STATUS_ENABLE | - TRANSFER_COMPLETE_STATUS_ENABLE | - BLOCK_GAP_EVENT_STATUS_ENABLE | - DMA_INTERRUPT_STATUS_ENABLE | - BUFFER_WRITE_READY_STATUS_ENABLE| - BUFFER_READ_READY_STATUS_ENABLE | - CARD_INSERTION_STATUS_ENABLE | - CARD_REMOVAL_STATUS_ENABLE | - CARD_INTERRUPT_STATUS_ENABLE | - INT_A_STATUS_ENABLE | - INT_B_STATUS_ENABLE | - INT_C_STATUS_ENABLE | - RE_TUNING_EVENT_STATUS_ENABLE ); - - /* Disable error interrupts*/ - SMIH->SMIH_ERROR_INTERRUPT_STATUS_ENABLE_REGISTER &= ~ ( - COMMAND_TIMEOUT_ERROR_STATUS_ENABLE | - COMMAND_CRC_ERROR_STATUS_ENABLE | - COMMAND_END_BIT_ERROR_STATUS_ENABLE | - COMMAND_INDEX_ERROR_STATUS_ENABLE | - DATA_TIMEOUT_ERROR_STATUS_ENABLE | - DATA_CRC_ERROR_STATUS_ENABLE | - DATA_END_BIT_ERROR_STATUS_ENABLE | - CURRENT_LIMIT_ERROR_STATUS_ENABLE | - AUTO_CMD_ERROR_STATUS_ENABLE | - ADMA_ERROR_STATUS_ENABLE | - TUNING_ERROR_STATUS_ENABLE ); - - /* Disable normal interrupts signals*/ - SMIH->SMIH_NORMAL_INTERRUPT_SIGNAL_ENABLE_REGISTER &= ~ (COMMAND_COMPLETE_SIGNAL_ENABLE | - TRANSFER_COMPLETE_SIGNAL_ENABLE | - BUFFER_WRITE_READY_SIGNAL_ENABLE | - BUFFER_READ_READY_SIGNAL_ENABLE | - CARD_REMOVAL_SIGNAL_ENABLE ); - SMIH->SMIH_ERROR_INTERRUPT_SIGNAL_ENABLE_REGISTER = 0x0; - - MCI.status.command_active = 0U; - MCI.status.transfer_active = 0U; - MCI.status.sdio_interrupt = 0U; - MCI.status.ccs = 0U; - - return status; -} - -/** - * @fn int32_t MCI_Control(uint32_t control, uint32_t arg) - * @brief Control MCI Interface. - * @param[in] control : Operation - * @param[in] arg : Argument of operation (optional) - * @return excecution status - */ -int32_t MCI_Control(uint32_t control, uint32_t arg) -{ - if ((MCI.flags & MCI_POWER) == 0U) - { - return ARM_DRIVER_ERROR; - } - switch (control) - { - case ARM_MCI_BUS_SPEED: - /* Bus speed configured */ - MCI.flags |= MCI_SETUP; - break; - case ARM_MCI_BUS_SPEED_MODE: - switch (arg) - { - case ARM_MCI_BUS_DEFAULT_SPEED: - /* Speed mode up to 25MHz */ - RSI_MCI_ClockCnfig(25000000); - break; - case ARM_MCI_BUS_HIGH_SPEED: - /* Speed mode up to 50MHz */ - break; - default: return ARM_DRIVER_ERROR_UNSUPPORTED; - } - break; - - case ARM_MCI_BUS_CMD_MODE: - switch (arg) - { - - case ARM_MCI_BUS_CMD_OPEN_DRAIN: - /* Configure command line in open-drain mode */ - break; - - case ARM_MCI_BUS_CMD_PUSH_PULL: - /* Configure command line in push-pull mode */ - break; - - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - break; - - case ARM_MCI_BUS_DATA_WIDTH: - switch (arg) - { - case ARM_MCI_BUS_DATA_WIDTH_1: - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DATA_TRANSFER_WIDTH =0x0; - break; - case ARM_MCI_BUS_DATA_WIDTH_4: - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DATA_TRANSFER_WIDTH =0x1; - break; - case ARM_MCI_BUS_DATA_WIDTH_8: - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - break; - case ARM_MCI_CONTROL_CLOCK_IDLE: - if (arg) - { - - } - else - { - - } - break; - - case ARM_MCI_DATA_TIMEOUT: - SMIH->SMIH_TIMEOUT_CONTROL_REGISTER_b.DATA_TIMEOUT_COUNTER_VALUE=0xE; - break; - - case ARM_MCI_MONITOR_SDIO_INTERRUPT: - MCI.status.sdio_interrupt = 0U; - - /* Enable card interrupt*/ - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_ENABLE_REGISTER |= CARD_INTERRUPT_STATUS_ENABLE; - - break; - - default: return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - * @fn ARM_MCI_STATUS MCI_GetStatus(void) - * @brief Get MCI status. - * @param[in] none - * @return ARM_MCI_STATUS - */ -ARM_MCI_STATUS MCI_GetStatus(void) -{ - return MCI.status; -} - -/*SDHC IRQ Handler*/ -void SDHC_IRQHandler (void) -{ - uint32_t msk, event; - uint16_t normal_intr_status; - uint16_t error_intr_status; - uint32_t int_status; - - event = 0U; - /*read normal interrupt status reg*/ - normal_intr_status = SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER; - - /*read error interrupt status reg*/ - error_intr_status = SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER; - - int_status = error_intr_status << 16; - int_status |= normal_intr_status; - - if (int_status & COMMANDS_INTERRUPTS) - { - int_status &= COMMANDS_INTERRUPTS; - - /* Command interrupts status */ - MCI.status.command_active = 0U; - - if ((int_status & ((COMMAND_TIMEOUT_ERROR_STATUS_ENABLE |COMMAND_CRC_ERROR_STATUS_ENABLE)<<16)) == (COMMAND_TIMEOUT_ERROR_STATUS_ENABLE <<16)) - { - /* command timeout error */ - MCI.status.command_timeout = 1U; - event = ARM_MCI_EVENT_COMMAND_TIMEOUT; - } - else if ((int_status & ((COMMAND_TIMEOUT_ERROR_STATUS_ENABLE | COMMAND_CRC_ERROR_STATUS_ENABLE) <<16)) == (COMMAND_CRC_ERROR_STATUS_ENABLE << 16)) - { - /* cmd crc error */ - MCI.status.command_error = 1U; - event = ARM_MCI_EVENT_COMMAND_ERROR; - } - else if (int_status & (COMMAND_INDEX_ERROR_STATUS_ENABLE << 16)) - { - /* Command index error */ - MCI.status.command_error = 1U; - event = ARM_MCI_EVENT_COMMAND_ERROR; - } - else if (int_status & (COMMAND_END_BIT_ERROR_STATUS_ENABLE << 16)) - { - /* Command end bit error */ - event = ARM_MCI_EVENT_COMMAND_ERROR; - } - else - { - msk = COMMAND_COMPLETE_STATUS_ENABLE | (( COMMAND_TIMEOUT_ERROR_STATUS_ENABLE | COMMAND_CRC_ERROR_STATUS_ENABLE ) << 16); - if ((int_status & msk) == COMMAND_COMPLETE_STATUS_ENABLE) - { - /* Command complete */ - if (MCI.response) - { - if (MCI.flags & MCI_RESP_LONG) - { - /* read response registers */ - MCI.response[3] = ((SMIH->SMIH_RESPONSE_REGISTER7 | SMIH->SMIH_RESPONSE_REGISTER6) << 8) | ((SMIH->SMIH_RESPONSE_REGISTER5 | SMIH->SMIH_RESPONSE_REGISTER4) >> 24); - MCI.response[2] = ((SMIH->SMIH_RESPONSE_REGISTER5 | SMIH->SMIH_RESPONSE_REGISTER4) << 8) | ((SMIH->SMIH_RESPONSE_REGISTER3 | SMIH->SMIH_RESPONSE_REGISTER2) >> 24); - MCI.response[1] = ((SMIH->SMIH_RESPONSE_REGISTER3 | SMIH->SMIH_RESPONSE_REGISTER2) << 8) | ((SMIH->SMIH_RESPONSE_REGISTER1 | SMIH->SMIH_RESPONSE_REGISTER0) >> 24); - MCI.response[0] = ((SMIH->SMIH_RESPONSE_REGISTER1 |SMIH->SMIH_RESPONSE_REGISTER0) << 8); - } - else - { - MCI.response[0] = SDMEM_RESPONSE_REG; - } - } - event = ARM_MCI_EVENT_COMMAND_COMPLETE; - } - } - } - if (int_status & DATA_INTERRUPTS) - { - int_status &= DATA_INTERRUPTS; - /* Data interrupts status */ - MCI.status.transfer_active = 0U; - - msk = ((DATA_CRC_ERROR_STATUS_ENABLE | DATA_END_BIT_ERROR_STATUS_ENABLE | ADMA_ERROR_STATUS_ENABLE) << 16); - if (int_status & msk) { - /* data crc or data end bit or DMA errors */ - MCI.status.transfer_error = 1U; - event = ARM_MCI_EVENT_TRANSFER_ERROR; - } - else if (int_status & (DATA_TIMEOUT_ERROR_STATUS_ENABLE << 16)) { - /* Data transfer timeout error */ - MCI.status.transfer_timeout = 1U; - event = ARM_MCI_EVENT_TRANSFER_TIMEOUT; - } - else { - if (int_status & TRANSFER_COMPLETE_STATUS_ENABLE) { - /* transfer complete interrupt */ - event = ARM_MCI_EVENT_TRANSFER_COMPLETE; - } - } - } - else { - if (int_status & CARD_INTERRUPT_STATUS_ENABLE) { - /* SDIO interrupt */ - MCI.status.sdio_interrupt = 1U; - event = ARM_MCI_EVENT_SDIO_INTERRUPT; - - /* Disable SDIO Interrupt */ - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_ENABLE_REGISTER = CARD_INTERRUPT_STATUS_ENABLE; - } - } - /*clear interrupts*/ - SDMEM_INTR_STATUS_REG = int_status; - - /*send events*/ - if (event && (MCI.cb_event != NULL)) { - MCI.cb_event (event); - } -} - -/** - * @fn void RSI_MCI_ClockCnfig(uint32_t freq) - * @brief This API is used to configure the MCI clock - */ -void RSI_MCI_ClockCnfig(uint32_t freq) -{ - uint16_t u16Div = 0; - - uint32_t u32ClockInput = RTE_INPUT_CLOCK; - - u16Div = u32ClockInput /2/ (freq); - - /*Disable sdmem clock */ - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SD_CLOCK_ENABLE = 0u; - - /*set division value to the card*/ - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SDCLK_FREQUENCY_SELECT = (u16Div & 0xFFu); - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.UPPER_BITS_OF_SDCLK_FREQUENCY_SELECT = ((u16Div >> 8u) & 0x03u); - - /*Enable Smih internal clock*/ - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.INTERNAL_CLOCK_ENABLE = 0x1; - while(0x1 != SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.INTERNAL_CLOCK_STABLE); - - /*enables SDMEM clock*/ - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SD_CLOCK_ENABLE = 0x1; -} - -/** - * @fn rsi_error_t RSI_MCI_SendCommand( MCI_COMMAND_FRAME_CONFIG_T* pConfig ) - * @brief This API is used to send the command. - * @param[in] pConfig pointer to the command structure - * @return RSI_OK If command sent properly. - * INVALID_PARAMETERS If pConfig==NULL - */ -rsi_error_t RSI_MCI_SendCommand(MCI_COMMAND_FRAME_CONFIG_T* pConfig ) -{ - MCI_COMMAND_REG_T CmdData; - - memset(&CmdData, 0, sizeof(CmdData)); - - if (pConfig == NULL) - { - return INVALID_PARAMETERS ; - } - /* Set command CRC check */ - if(pConfig->checkCmdCrc) - { - CmdData.cmdCrcCheckEnable = 0x1; - } - else - { - CmdData.cmdCrcCheckEnable = 0x0; - } - /* Set command index check */ - if(pConfig->checkCmdIndex) - { - CmdData.cmdIndexCheckEnable = 0x1; - } - else - { - CmdData.cmdIndexCheckEnable = 0x0; - } - - /* Set data present or not when sending the command */ - if(pConfig->dataPresent) - { - CmdData.dataPresentSelect = 0x1; - } - else - { - CmdData.dataPresentSelect = 0x0; - } - /* Configure command type */ - switch (pConfig->cmdType) - { - case MCI_NORMAL_CMD: - CmdData.cmdType = 0u; - break; - case MCI_SUSPEND_CMD: - CmdData.cmdType = 1u; - break; - case MCI_RESUME_CMD: - CmdData.cmdType = 2u; - break; - case MCI_ABORT_CMD: - CmdData.cmdType = 3u; - break; - default: - return INVALID_PARAMETERS ; - } - /* Set command response type */ - switch (pConfig->responseType) - { - case MCI_RESPONSE_NONE: - CmdData.respType = 0u; - break; - case MCI_RESPONSE_136BIT: - CmdData.respType = 1u; - break; - case MCI_RESPONSE_48BIT: - CmdData.respType = 2u; - break; - case MCI_RESPONSE_48BIT_BUSY_CHECK: - CmdData.respType = 3u; - break; - default: - return INVALID_PARAMETERS ; - } - - /* Set command index */ - CmdData.cmdIndex = pConfig->cmdIndex; - - /* Auto command setting */ - switch (pConfig->autoCmdType) - { - case MCI_DISABLE_AUTO_CMD : - SMIH->TRANSFER_MODE_REGISTER_b.AUTO_CMD_ENABLE = 0u; - break; - case MCI_ENABLE_AUTO_CMD12 : - SMIH->TRANSFER_MODE_REGISTER_b.AUTO_CMD_ENABLE = 1u; - break; - case MCI_ENABLE_AUTO_CMD23 : - SMIH->TRANSFER_MODE_REGISTER_b.AUTO_CMD_ENABLE = 2u; - break; - default: - return INVALID_PARAMETERS ; - } - /* Configure argument register */ - SMIH->SMIH_ARGUMENT1_REGISTER = pConfig->argument; - - if(pConfig->cmdIndex == 5) - { - if((pConfig->argument & (1 << 24))) - { - SMIH->SMIH_HOST_CONTROL_2_REGISTER = (1 << 3); - } - } - /* assign fiiled data to the command register */ - SMIH->SMIH_COMMAND_REGISTER = *((uint16_t *)&CmdData); - return RSI_OK; -} -/** - * @fn rsi_error_t RSI_MCI_DataTransferInitialization(MCI_DATA_CONFIG_T* pDataConfig) - * @brief This API is used to initialize the data transfer(this must be called before data transfer). - * @param[in] pDataConfig pointer to the data transfer configuration - * @return RSI_OK data initialized properly. - * INVALID_PARAMETERS If pDataConfig==NULL - */ -rsi_error_t RSI_MCI_DataTransferInitialization(MCI_DATA_CONFIG_T* pDataConfig) -{ - if (pDataConfig == 0) - { - return INVALID_PARAMETERS ; - } - /* Configure multiple block or single block transfer */ - if(pDataConfig->multiBlock) - { - SMIH->TRANSFER_MODE_REGISTER_b.MULTI_OR_SINGLE_BLOCK_SELECT = 0x1; - } - else - { - SMIH->TRANSFER_MODE_REGISTER_b.MULTI_OR_SINGLE_BLOCK_SELECT = 0x0; - } - /* Confgure data transfer direction */ - if(pDataConfig->dataTransferDirection) - { - SMIH->TRANSFER_MODE_REGISTER_b.DATA_TRANSFER_DIRECTION_SELECT = 0x1; - } - else - { - SMIH->TRANSFER_MODE_REGISTER_b.DATA_TRANSFER_DIRECTION_SELECT = 0x0; - } - /* Configure block size */ - SMIH->SMIH_BLOCK_SIZE_REGISTER_b.TRANSFER_BLOCK_SIZE = pDataConfig->blockSize; - - /* Configure block count */ - if(pDataConfig->blockCount == 0) - { - SMIH->SMIH_BLOCK_COUNT_REGISTER = 1; - } - else - { - SMIH->SMIH_BLOCK_COUNT_REGISTER = pDataConfig->blockCount; - } - /*enable block count*/ - if(pDataConfig->blockCountEnable) - { - SMIH->TRANSFER_MODE_REGISTER_b.BLOCK_COUNT_ENABLE = 0x1; - } - else - { - SMIH->TRANSFER_MODE_REGISTER_b.BLOCK_COUNT_ENABLE = 0x0; - } - /* Enable DMA mode */ - if(pDataConfig->dmaEnable) - { - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE = 0x1; - } - else - { - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE = 0x1; - } - - /* Configure descriptor table for ADMA */ - SMIH->SMIH_ADMA_SYSTEM_ADDRESS0_REGISTER = (uint16_t) pDataConfig->admaDespTableAddress; - SMIH->SMIH_ADMA_SYSTEM_ADDRESS1_REGISTER = (uint16_t)(pDataConfig->admaDespTableAddress >> 16u); - - return RSI_OK; -} -// End MCI Interface -ARM_DRIVER_MCI Driver_MCI0 = -{ - MCI_GetVersion, - MCI_GetCapabilities, - MCI_Initialize, - MCI_Uninitialize, - MCI_PowerControl, - MCI_CardPower, - MCI_ReadCD, - MCI_ReadWP, - MCI_SendCommand, - MCI_SetupTransfer, - MCI_AbortTransfer, - MCI_Control, - MCI_GetStatus -}; -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.h deleted file mode 100644 index bf841d135..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/MCI.h +++ /dev/null @@ -1,195 +0,0 @@ - /* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2014 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 24. Nov 2014 - * $Revision: V2.02 - * - * Project: MCI (Memory Card Interface) - * Driver definitions - * -------------------------------------------------------------------------- */ -/* - * Version 1.00 - * Initial release - */ - - -#include "Driver_MCI.h" - -#include "RTE_Device.h" - - -typedef void (*ARM_MCI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_MCI_SignalEvent : Signal MCI Event. - - - -/* MCI Driver State Definition */ -typedef struct MCI_Ctrl { - ARM_MCI_SignalEvent_t cb_event; /* Driver event callback function */ - ARM_MCI_STATUS status; /* Driver status */ - uint32_t *response; /* Pointer to response buffer */ - uint32_t bl_sz; - uint32_t bl_cnt; - uint8_t volatile flags; /* Driver state flags */ -} MCI_CTRL; - -/* Driver flag definitions */ -#define MCI_INIT ((uint8_t)0x01 ) /* MCI initialized */ -#define MCI_POWER ((uint8_t)0x02 ) /* MCI powered on */ -#define MCI_SETUP ((uint8_t)0x04 ) /* MCI configured */ -#define MCI_RESP_LONG ((uint8_t)0x08 ) /* Long response expected */ - - - -#define MCI_DATA_READ ((uint8_t)0x10) /* Read transfer */ -#define MCI_DATA_MULB ((uint8_t)0x20) /* Multiple block transfer */ - -/* Normal interrupt status enable reg */ -#define COMMAND_COMPLETE_STATUS_ENABLE BIT(0) -#define TRANSFER_COMPLETE_STATUS_ENABLE BIT(1) -#define BLOCK_GAP_EVENT_STATUS_ENABLE BIT(2) -#define DMA_INTERRUPT_STATUS_ENABLE BIT(3) -#define BUFFER_WRITE_READY_STATUS_ENABLE BIT(4) -#define BUFFER_READ_READY_STATUS_ENABLE BIT(5) -#define CARD_INSERTION_STATUS_ENABLE BIT(6) -#define CARD_REMOVAL_STATUS_ENABLE BIT(7) -#define CARD_INTERRUPT_STATUS_ENABLE BIT(8) -#define INT_A_STATUS_ENABLE BIT(9) -#define INT_B_STATUS_ENABLE BIT(10) -#define INT_C_STATUS_ENABLE BIT(11) -#define RE_TUNING_EVENT_STATUS_ENABLE BIT(12) - -/* Error interrupt status enables */ -#define COMMAND_TIMEOUT_ERROR_STATUS_ENABLE BIT(0) -#define COMMAND_CRC_ERROR_STATUS_ENABLE BIT(1) -#define COMMAND_END_BIT_ERROR_STATUS_ENABLE BIT(2) -#define COMMAND_INDEX_ERROR_STATUS_ENABLE BIT(3) -#define DATA_TIMEOUT_ERROR_STATUS_ENABLE BIT(4) -#define DATA_CRC_ERROR_STATUS_ENABLE BIT(5) -#define DATA_END_BIT_ERROR_STATUS_ENABLE BIT(6) -#define CURRENT_LIMIT_ERROR_STATUS_ENABLE BIT(7) -#define AUTO_CMD_ERROR_STATUS_ENABLE BIT(8) -#define ADMA_ERROR_STATUS_ENABLE BIT(9) -#define TUNING_ERROR_STATUS_ENABLE BIT(10) - -/* Normal interrupt status enable reg */ -#define COMMAND_COMPLETE_SIGNAL_ENABLE BIT(0) -#define TRANSFER_COMPLETE_SIGNAL_ENABLE BIT(1) -#define BLOCK_GAP_EVENT_SIGNAL_ENABLE BIT(2) -#define DMA_INTERRUPT_SIGNAL_ENABLE BIT(3) -#define BUFFER_WRITE_READY_SIGNAL_ENABLE BIT(4) -#define BUFFER_READ_READY_SIGNAL_ENABLE BIT(5) -#define CARD_INSERTION_SIGNAL_ENABLE BIT(6) -#define CARD_REMOVAL_SIGNAL_ENABLE BIT(7) -#define CARD_INTERRUPT_SIGNAL_ENABLE BIT(8) -#define INT_A_SIGNAL_ENABLE BIT(9) -#define INT_B_SIGNAL_ENABLE BIT(10) -#define INT_C_SIGNALS_ENABLE BIT(11) -#define RE_TUNING_EVENT_SIGNAL_ENABLE BIT(12) - -typedef struct MCI_COMMAND_FRAME_CONFIG -{ - uint8_t cmdIndex; - uint32_t argument; - uint8_t cmdType; - boolean_t dataPresent; - boolean_t checkCmdIndex; - boolean_t checkCmdCrc; - uint8_t responseType; - uint8_t autoCmdType; -}MCI_COMMAND_FRAME_CONFIG_T; -typedef struct MCI_ADMA_DESC_TABLE -{ - uint16_t attributeValid :1; - uint16_t attributeEnd :1; - uint16_t attributeInt :1; - uint16_t reserved1 :1; - uint16_t attributeAct :2; - uint16_t reserved2 :10; - uint16_t length; - uint32_t _32BIT_Adress; -} MCI_ADMA_DESC_TABLE_T; - -/*Command type defines */ -#define MCI_ABORT_CMD 3 -#define MCI_RESUME_CMD 2 -#define MCI_SUSPEND_CMD 1 -#define MCI_NORMAL_CMD 0 - -#define MCI_DISABLE_AUTO_CMD 0 -#define MCI_ENABLE_AUTO_CMD12 1 -#define MCI_ENABLE_AUTO_CMD23 2 - -/*response type defines*/ -#define MCI_RESPONSE_NONE 0 -#define MCI_RESPONSE_136BIT 1 -#define MCI_RESPONSE_48BIT 2 -#define MCI_RESPONSE_48BIT_BUSY_CHECK 3 - -/*data direction defines*/ -#define MCI_WRITE_DIRECTION 0x0 -#define MCI_READ_DIRECTION 0x1 - -#define MCI_RESPONSE_EXPECTED (ARM_MCI_RESPONSE_SHORT | \ - ARM_MCI_RESPONSE_SHORT_BUSY | \ - ARM_MCI_RESPONSE_LONG) - - -/* MCI data configuration structure*/ -typedef struct MCI_DATA_CONFIG -{ - boolean_t multiBlock; - boolean_t dataTransferDirection; - uint16_t blockSize; - uint16_t blockCount; - boolean_t blockCountEnable; - boolean_t dmaEnable; - uint32_t admaDespTableAddress; - uint8_t dataTimeout; -}MCI_DATA_CONFIG_T; - -/* MCI command reg structure*/ -typedef struct MCI_COMMAND_REG -{ - uint16_t respType : 2; - uint16_t resrvd : 1; - uint16_t cmdCrcCheckEnable : 1; - uint16_t cmdIndexCheckEnable : 1; - uint16_t dataPresentSelect : 1; - uint16_t cmdType : 2; - uint16_t cmdIndex : 6; -} MCI_COMMAND_REG_T; - - -#define COMMANDS_INTERRUPTS (((COMMAND_TIMEOUT_ERROR_STATUS_ENABLE | COMMAND_CRC_ERROR_STATUS_ENABLE | COMMAND_END_BIT_ERROR_STATUS_ENABLE |COMMAND_INDEX_ERROR_STATUS_ENABLE | AUTO_CMD_ERROR_STATUS_ENABLE) << 16) | \ - COMMAND_COMPLETE_STATUS_ENABLE ) - -#define DATA_INTERRUPTS (((DATA_TIMEOUT_ERROR_STATUS_ENABLE |DATA_CRC_ERROR_STATUS_ENABLE |DATA_END_BIT_ERROR_STATUS_ENABLE ) << 16) | TRANSFER_COMPLETE_STATUS_ENABLE | \ - BUFFER_READ_READY_STATUS_ENABLE | \ - BUFFER_WRITE_READY_STATUS_ENABLE | \ - DMA_INTERRUPT_STATUS_ENABLE) - -#define SDMEM_INTR_STATUS_REG (*(uint32_t *)(0x20220000 + 0x30)) -#define SDMEM_RESPONSE_REG ((*(uint32_t *)(0x20220000 + 0x10)) ) - -/* Function Prototypes */ -void RSI_MCI_ClockCnfig(uint32_t freq); -rsi_error_t RSI_MCI_SendCommand(MCI_COMMAND_FRAME_CONFIG_T* pConfig ); -rsi_error_t RSI_MCI_DataTransferInitialization(MCI_DATA_CONFIG_T* pDataConfig); - diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.c deleted file mode 100644 index c3ce23dff..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.c +++ /dev/null @@ -1,292 +0,0 @@ - -/* ----------------------------------------------------------------------------- - * Copyright (c) 2013-2016 ARM Ltd. - * - * This software is provided 'as-is', without any express or implied warranty. - * In no event will the authors be held liable for any damages arising from - * the use of this software. Permission is granted to anyone to use this - * software for any purpose, including commercial applications, and to alter - * it and redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software in - * a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - * - * $Date: 1 AUG 2017 - * $Revision: V1.0 - * - * Driver: Driver_ETH_PHYn (default: Driver_ETH_PHY0) - * Project: Ethernet Physical Layer Transceiver (PHY) - * Driver for LAN8742A - * ---------------------------------------------------------------------- - * Use the following configuration settings in the middleware component - * to connect to this driver. - * - * Configuration Setting Value - * --------------------- ----- - * Connect to hardware via Driver_ETH_PHY# = n (default: 0) - * -------------------------------------------------------------------- - * - */ - -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) -#include "PHY_LAN8742A.h" -/* driver version */ - - -#define ARM_ETH_PHY_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,1) -#ifndef ETH_PHY_NUM -#define ETH_PHY_NUM 0 /* Default driver number */ -#endif - -#ifndef ETH_PHY_ADDR -#define ETH_PHY_ADDR 0x00 /* Default device address */ -#endif - - -/* Driver Version */ -static const ARM_DRIVER_VERSION DriverVersion = { - ARM_ETH_PHY_API_VERSION, - ARM_ETH_PHY_DRV_VERSION -}; - -/* Ethernet PHY control structure */ -static PHY_CTRL PHY = { NULL, NULL, 0, 0 }; - - -/** - \fn ARM_DRIVER_VERSION GetVersion (void) - \brief Get driver version. - \return \ref ARM_DRIVER_VERSION - */ -static ARM_DRIVER_VERSION GetVersion (void) { - return DriverVersion; -} - - -/** - \fn int32_t Initialize (ARM_ETH_PHY_Read_t fn_read, - ARM_ETH_PHY_Write_t fn_write) - \brief Initialize Ethernet PHY Device. - \param[in] fn_read : Pointer to \ref ARM_ETH_MAC_PHY_Read - \param[in] fn_write : Pointer to \ref ARM_ETH_MAC_PHY_Write - \return \ref execution_status - */ -static int32_t Initialize (ARM_ETH_PHY_Read_t fn_read, ARM_ETH_PHY_Write_t fn_write) { - - if ((fn_read == NULL) || (fn_write == NULL)) { return ARM_DRIVER_ERROR_PARAMETER; } - - if ((PHY.flags & PHY_INIT) == 0U) { - /* Register PHY read/write functions. */ - PHY.reg_rd = fn_read; - PHY.reg_wr = fn_write; - - PHY.bcr = 0U; - PHY.flags = PHY_INIT; - } - - return ARM_DRIVER_OK; -} - -/** - \fn int32_t Uninitialize (void) - \brief De-initialize Ethernet PHY Device. - \return \ref execution_status - */ -static int32_t Uninitialize (void) { - - PHY.reg_rd = NULL; - PHY.reg_wr = NULL; - PHY.bcr = 0U; - PHY.flags = 0U; - - return ARM_DRIVER_OK; -} - -/** - \fn int32_t PowerControl (ARM_POWER_STATE state) - \brief Control Ethernet PHY Device Power. - \param[in] state : Power state - \return \ref execution_status - */ -static int32_t PowerControl (ARM_POWER_STATE state) { - uint16_t val; - - switch (state) { - case ARM_POWER_OFF: - if ((PHY.flags & PHY_INIT) == 0U) { - /* Initialize must provide register access function pointers */ - return ARM_DRIVER_ERROR; - } - - PHY.flags &= ~PHY_POWER; - PHY.bcr = BCR_POWER_DOWN; - - return (PHY.reg_wr(ETH_PHY_ADDR, REG_BCR, PHY.bcr)); - - case ARM_POWER_FULL: - if ((PHY.flags & PHY_INIT) == 0U) { - return ARM_DRIVER_ERROR; - } - if (PHY.flags & PHY_POWER) { - return ARM_DRIVER_OK; - } - - /* Check Device Identification. */ - PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR1, &val); - - if (val != PHY_ID1) { - /* Invalid PHY ID */ - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR2, &val); - - if ((val & 0xFFF0) != PHY_ID2) { - /* Invalid PHY ID */ - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - PHY.bcr = 0U; - - if (PHY.reg_wr(ETH_PHY_ADDR, REG_BCR, PHY.bcr) != ARM_DRIVER_OK) { - return ARM_DRIVER_ERROR; - } - - PHY.flags |= PHY_POWER; - - return ARM_DRIVER_OK; - - case ARM_POWER_LOW: - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } -} - -/** - \fn int32_t SetInterface (uint32_t interface) - \brief Set Ethernet Media Interface. - \param[in] interface : Media Interface type - \return \ref execution_status - */ -static int32_t SetInterface (uint32_t interface) { - - if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; } - - switch (interface) { - case ARM_ETH_INTERFACE_RMII: - break; - case ARM_ETH_INTERFACE_MII: - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - return(0); -} - -/** - \fn int32_t SetMode (uint32_t mode) - \brief Set Ethernet PHY Device Operation mode. - \param[in] mode : Operation Mode - \return \ref execution_status - */ -static int32_t SetMode (uint32_t mode) { - uint16_t val; - - if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; } - - val = PHY.bcr & BCR_POWER_DOWN; - - switch (mode & ARM_ETH_PHY_SPEED_Msk) { - case ARM_ETH_PHY_SPEED_10M: - break; - case ARM_ETH_PHY_SPEED_100M: - val |= BCR_SPEED_SEL; - break; - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - switch (mode & ARM_ETH_PHY_DUPLEX_Msk) { - case ARM_ETH_PHY_DUPLEX_HALF: - break; - case ARM_ETH_PHY_DUPLEX_FULL: - val |= BCR_DUPLEX; - break; - } - - if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) { - val |= BCR_ANEG_EN; - } - - if (mode & ARM_ETH_PHY_LOOPBACK) { - val |= BCR_LOOPBACK; - } - - if (mode & ARM_ETH_PHY_ISOLATE) { - val |= BCR_ISOLATE; - } - - PHY.bcr = val; - - return (PHY.reg_wr(ETH_PHY_ADDR, REG_BCR, PHY.bcr)); -} - -/** - \fn ARM_ETH_LINK_STATE GetLinkState (void) - \brief Get Ethernet PHY Device Link state. - \return current link status \ref ARM_ETH_LINK_STATE - */ -static ARM_ETH_LINK_STATE GetLinkState (void) { - ARM_ETH_LINK_STATE state; - uint16_t val = 0U; - - if (PHY.flags & PHY_POWER) { - PHY.reg_rd(ETH_PHY_ADDR, REG_BSR, &val); - } - state = (val & BSR_LINK_STAT) ? ARM_ETH_LINK_UP : ARM_ETH_LINK_DOWN; - - return (state); -} - -/** - \fn ARM_ETH_LINK_INFO GetLinkInfo (void) - \brief Get Ethernet PHY Device Link information. - \return current link parameters \ref ARM_ETH_LINK_INFO - */ -static ARM_ETH_LINK_INFO GetLinkInfo (void) { - ARM_ETH_LINK_INFO info; - uint16_t val = 0U; - - if (PHY.flags & PHY_POWER) { - PHY.reg_rd(ETH_PHY_ADDR, REG_PSCS, &val); - } - - info.speed = (val & PSCS_SPEED) ? ARM_ETH_SPEED_10M : ARM_ETH_SPEED_100M; - info.duplex = (val & PSCS_DUPLEX) ? ARM_ETH_DUPLEX_FULL : ARM_ETH_DUPLEX_HALF; - - return (info); -} - - -/* PHY Driver Control Block */ -extern -ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY0; -ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY0= { - GetVersion, - Initialize, - Uninitialize, - PowerControl, - SetInterface, - SetMode, - GetLinkState, - GetLinkInfo -}; -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.h deleted file mode 100644 index ca9f44204..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/PHY_LAN8742A.h +++ /dev/null @@ -1,91 +0,0 @@ -/* --------------------------------------------------------------------------- - * Copyright (C) 2013-2016 ARM Limited. All rights reserved. - * - * $Date: 28. June 2016 - * $Revision: V1.2 - * - * Project: Ethernet Physical Layer Transceiver (PHY) - * Definitions for LAN8742A - * --------------------------------------------------------------------------*/ - -#ifndef __PHY_LAN8742A_H -#define __PHY_LAN8742A_H - -#include "Driver_ETH_PHY.h" - -/* Basic Registers */ -#define REG_BCR 0 /* Basic Control Register */ -#define REG_BSR 1 /* Basic Status Register */ - -/* Extended Registers */ -#define REG_PHYIDR1 2 /* PHY Identifier 1 */ -#define REG_PHYIDR2 3 /* PHY Identifier 2 */ -#define REG_ANAR 4 /* Auto-Negotiation Advertisement */ -#define REG_ANLPAR 5 /* Auto-Neg. Link Partner Ability */ -#define REG_ANER 6 /* Auto-Neg. Expansion Register */ -#define REG_ANEG_NP_TX 7 /* Auto-Neg. Next Page Tx */ -#define REG_ANEG_NP_RX 8 /* Auto-Neg. Next Page Rx */ -#define REG_MMD_ACCES_CTRL 13 /* MMD Access Control */ -#define REG_MMD_ACCES_AD 14 /* MMD Access Address/Data */ - -/* Vendor-specific Registers */ -#define REG_MCSR 17 /* Mode Control/Status Register */ -#define REG_SPEC_MODE 18 /* Special Modes Register */ -#define REG_TDR_PAT_DEL 24 /* TDR Patterns/Delay Control Reg. */ -#define REG_TDR_CTRL_STAT 25 /* TDR Control/Status Register */ -#define REG_SEC 26 /* System Error Counter Register */ -#define REG_SC_SI 27 /* Specifal Control/Status Indication*/ -#define REG_CABLE_LEN 28 /* Cable Length Register */ -#define REG_ISF 29 /* Interrupt Source Flag Register */ -#define REG_IM 30 /* Interrupt Mask Register */ -#define REG_PSCS 31 /* PHY Special Ctrl/Status Register */ - -/* Basic Control Register */ -#define BCR_RESET 0x8000 /* Software Reset */ -#define BCR_LOOPBACK 0x4000 /* Loopback mode */ -#define BCR_SPEED_SEL 0x2000 /* Speed Select (1=100Mb/s) */ -#define BCR_ANEG_EN 0x1000 /* Auto Negotiation Enable */ -#define BCR_POWER_DOWN 0x8000 /* Power Down (1=power down mode) */ -#define BCR_ISOLATE 0x0400 /* Isolate Media interface */ -#define BCR_REST_ANEG 0x0200 /* Restart Auto Negotiation */ -#define BCR_DUPLEX 0x0100 /* Duplex Mode (1=Full duplex) */ -#define BCR_COL_TEST 0x0080 /* Enable Collision Test */ - -/* Basic Status Register */ -#define BSR_100B_T4 0x8000 /* 100BASE-T4 Capable */ -#define BSR_100B_TX_FD 0x4000 /* 100BASE-TX Full Duplex Capable */ -#define BSR_100B_TX_HD 0x2000 /* 100BASE-TX Half Duplex Capable */ -#define BSR_10B_T_FD 0x1000 /* 10BASE-T Full Duplex Capable */ -#define BSR_10B_T_HD 0x0800 /* 10BASE-T Half Duplex Capable */ -#define BSR_100B_T2_FD 0x0400 /* 1000BASE-T2 Full Duplex Capable */ -#define BSR_100B_T2_HD 0x0200 /* 1000BASE-T2 Half Duplex Capable */ -#define BSR_EXTENDED_STAT 0x0100 /* Extended Status in register 15 */ -#define BSR_ANEG_COMPL 0x0020 /* Auto Negotiation Complete */ -#define BSR_REM_FAULT 0x0010 /* Remote Fault */ -#define BSR_ANEG_ABIL 0x0008 /* Auto Negotiation Ability */ -#define BSR_LINK_STAT 0x0004 /* Link Status (1=link us up) */ -#define BSR_JABBER_DET 0x0002 /* Jabber Detect */ -#define BSR_EXT_CAPAB 0x0001 /* Extended Capabilities */ - -/* PHY Identifier Registers */ -#define PHY_ID1 0x0007 /* LAN8742A Device Identifier MSB */ -#define PHY_ID2 0xC130 /* LAN8742A Device Identifier LSB */ - -/* PHY Special Control/Status Register */ -#define PSCS_AUTODONE 0x1000 /* Auto-negotiation is done */ -#define PSCS_DUPLEX 0x0010 /* Duplex Status (1=Full duplex) */ -#define PSCS_SPEED 0x0004 /* Speed10 Status (1=10MBit/s) */ - -/* PHY Driver State Flags */ -#define PHY_INIT 0x01U /* Driver initialized */ -#define PHY_POWER 0x02U /* Driver power is on */ - -/* PHY Driver Control Structure */ -typedef struct phy_ctrl { - ARM_ETH_PHY_Read_t reg_rd; /* PHY register read function */ - ARM_ETH_PHY_Write_t reg_wr; /* PHY register write function */ - uint16_t bcr; /* BCR register value */ - uint8_t flags; /* Control flags */ -} PHY_CTRL; - -#endif /* __PHY_LAN8742A_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SAI.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SAI.c index 2edee17a6..473e07e50 100644 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SAI.c +++ b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SAI.c @@ -34,9 +34,9 @@ extern uint32_t dma_rom_buff0[30], dma_rom_buff1[30]; //we can keep wrapeers #define RESOLUTION_16_BIT 16 #define I2S0_CHANNEL1_CHANNEL_OFFSET 2 -#define I2S0_CLK_SRC ULP_I2S_REF_CLK +#define I2S0_CLK_SRC ULP_I2S_PLL_CLK #define I2S0_CLK_DIV_FACT 0 -#define I2S1_CLK_SRC ULP_I2S_ULP_32MHZ_RC_CLK +#define I2S1_CLK_SRC ULP_I2S_REF_CLK #define I2S1_CLK_DIV_FACT 0 /* IAR support */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SPI.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SPI.c index 55384c467..86885bda5 100644 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SPI.c +++ b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/SPI.c @@ -364,7 +364,15 @@ static SPI_PIN SSI_ULP_MASTER_miso = {SSI_ULP_MASTER_MISO_PORT, SSI_ULP_MASTER_M static SPI_PIN SSI_ULP_MASTER_sck = {SSI_ULP_MASTER_SCK_PORT, SSI_ULP_MASTER_SCK_PIN, SSI_ULP_MASTER_SCK_MODE, 0}; #endif #ifdef SSI_ULP_MASTER_CS0_SEL -static SPI_PIN SSI_ULP_MASTER_cs = {SSI_ULP_MASTER_CS0_PORT, SSI_ULP_MASTER_CS0_PIN, SSI_ULP_MASTER_CS0_MODE, 0}; +static SPI_PIN SSI_ULP_MASTER_cs0 = {SSI_ULP_MASTER_CS0_PORT, SSI_ULP_MASTER_CS0_PIN, SSI_ULP_MASTER_CS0_MODE, 0}; +#endif +#ifdef SPI_MULTI_SLAVE +#ifdef SSI_ULP_MASTER_CS1_SEL +static SPI_PIN SSI_ULP_MASTER_cs1 = {SSI_ULP_MASTER_CS1_PORT, SSI_ULP_MASTER_CS1_PIN, SSI_ULP_MASTER_CS1_MODE, 0}; +#endif +#ifdef SSI_ULP_MASTER_CS2_SEL +static SPI_PIN SSI_ULP_MASTER_cs2 = {SSI_ULP_MASTER_CS2_PORT, SSI_ULP_MASTER_CS2_PIN, SSI_ULP_MASTER_CS2_MODE, 0}; +#endif #endif #if defined(SSI_ULP_MASTER_TX_DMA_Instance) && (SSI_ULP_MASTER_TX_DMA_Instance == 1) @@ -421,18 +429,18 @@ static const SPI_RESOURCES SSI_ULP_MASTER_Resources = { NULL, #endif #ifdef SSI_ULP_MASTER_CS0_SEL - &SSI_ULP_MASTER_cs, + &SSI_ULP_MASTER_cs0, #else NULL, #endif #ifdef SPI_MULTI_SLAVE -#ifdef SSI_SLAVE_CS1_SEL - &SSI_SLAVE_cs, +#ifdef SSI_ULP_MASTER_CS1_SEL + &SSI_ULP_MASTER_cs1, #else NULL, #endif -#ifdef SSI_SLAVE_CS2_SEL - &SSI_SLAVE_cs, +#ifdef SSI_ULP_MASTER_CS2_SEL + &SSI_ULP_MASTER_cs2, #else NULL, #endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.c deleted file mode 100644 index c29fb928e..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.c +++ /dev/null @@ -1,80 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2018 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - * - * $Date: 01. Oct 2018 - * $Revision: V1.0 - * - * Project: Common file for both USB(Device and Host) - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * Initial release - */ - -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) - - - -#include "Driver_USB.h" -#include "USB.h" -#include "RTE_Device.h" - - -volatile uint8_t USB_role = ARM_USB_ROLE_NONE; -volatile uint8_t USB_state = 0U; - -#ifdef RTE_Drivers_USBH -extern void USBH0_IRQ (void); -#endif -#ifdef RTE_Drivers_USBD -extern void USBD0_IRQ (void); -#endif - - -// Common IRQ Routine ********************************************************** - -/** - \fn void IRQ073_Handler (void) - \brief USB Interrupt Routine (IRQ). -*/ -void IRQ073_Handler (void) { -#if(defined(RTE_Drivers_USBH) && defined(RTE_Drivers_USBD)) - switch (USB_role) { -#ifdef RTE_Drivers_USBH - case ARM_USB_ROLE_HOST: - USBH_IRQ (); - break; -#endif -#ifdef RTE_Drivers_USBD - case ARM_USB_ROLE_DEVICE: - USBD_IRQ (); - break; -#endif - default: - break; - } -#else -#ifdef RTE_Drivers_USBH - USBH_IRQ (); -#else - USBD_IRQ (); -#endif -#endif -} -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.h b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.h deleted file mode 100644 index 96a6f4a40..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USB.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2018 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - * - * $Date: 12. Dec 2018 - * $Revision: V1.0 - * - * Project: USB Driver Definitions for Silicon Labs MCU - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * - Initial release - */ - -#ifndef __USB_H -#define __USB_H - -#include - -#ifndef USB_ENDPT_MSK -#define USB_ENDPT_MSK (0x3FU) -#endif - -// USB Device Command Register -#define USB_USBCMD_D_RS (1U ) -#define USB_USBCMD_D_RST (1U << 1U) -#define USB_USBCMD_D_SUTW (1U << 13U) -#define USB_USBCMD_D_ATDTW (1U << 14U) -#define USB_USBCMD_D_ITC_POS ( 16U) -#define USB_USBCMD_D_ITC_MSK (0xFFU << USB_USBCMD_D_ITC_POS) -#define USB_USBCMD_D_ITC(n) (((n) << USB_USBCMD_D_ITC_POS) & USB_USBCMD_D_ITC_MSK) - -// USB Device Status Register -#define USB_USBSTS_D_UI (1U ) -#define USB_USBSTS_D_UEI (1U << 1U) -#define USB_USBSTS_D_PCI (1U << 2U) -#define USB_USBSTS_D_URI (1U << 6U) -#define USB_USBSTS_D_SRI (1U << 7U) -#define USB_USBSTS_D_SLI (1U << 8U) -#define USB_USBSTS_D_NAKI (1U << 16U) - -// USB Device Interrupt Register -#define USB_USBINTR_D_UE (1U ) -#define USB_USBINTR_D_UEE (1U << 1U) -#define USB_USBINTR_D_PCE (1U << 2U) -#define USB_USBINTR_D_URE (1U << 6U) -#define USB_USBINTR_D_SRE (1U << 7U) -#define USB_USBINTR_D_SLE (1U << 8U) -#define USB_USBINTR_D_NAKE (1U << 16U) - -// USB Device Frame Index Register -#define USB_FRINDEX_D_FRINDEX2_0_POS ( 0U) -#define USB_FRINDEX_D_FRINDEX2_0_MSK (7U ) -#define USB_FRINDEX_D_FRINDEX13_3_POS ( 3U) -#define USB_FRINDEX_D_FRINDEX13_3_MSK (0x7FFU << USB_FRINDEX_D_FRINDEX13_3_POS) - -// USB Device Address Register -#define USB_DEVICEADDR_USBADRA (1U << 24U) -#define USB_DEVICEADDR_USBADR_POS ( 25U) -#define USB_DEVICEADDR_USBADR_MSK (0x7FUL << USB_DEVICEADDR_USBADR_POS) - -// USB Endpoint List Address Register -#define USB_ENDPOINTLISTADDR_EPBASE31_11_POS ( 11U) -#define USB_ENDPOINTLISTADDR_EPBASE_MSK (0x1FFFFFUL << USB_ENDPOINTLISTADDR_EPBASE31_11_POS) - -// USB Burst Size Register -#define USB_BURSTSIZE_RXPBURST_POS ( 0U) -#define USB_BURSTSIZE_RXPBURST_MSK (0xFFU ) -#define USB_BURSTSIZE_TXPBURST_POS ( 8U) -#define USB_BURSTSIZE_TXPBURST_MSK (0xFFU << USB_BURSTSIZE_TXPBURST_POS) - -// USB BInterval Register -#define USB_BINTERVAL_BINT_POS ( 0U) -#define USB_BINTERVAL_BINT_MSK (0x0FU << USB_BINTERVAL_BINT_POS) - -// USB Endpoint NAK Register -#define USB_ENDPTNAK_EPRN_POS ( 0U) -#define USB_ENDPTNAK_EPRN_MSK (USB_ENDPT_MSK) -#define USB_ENDPTNAK_EPTN_POS ( 16U) -#define USB_ENDPTNAK_EPTN_MSK (USB_ENDPT_MSK << USB_ENDPTNAK_EPTN_POS) - -// USB Endpoint NAK Enable Register -#define USB_ENDPTNAKEN_EPRNE_POS ( 0U) -#define USB_ENDPTNAKEN_EPRNE_MSK (USB_ENDPT_MSK) -#define USB_ENDPTNAKEN_EPTNE_POS ( 16U) -#define USB_ENDPTNAKEN_EPTNE_MSK (USB_ENDPT_MSK << USB_ENDPTNAKEN_EPTNE_POS) - -// USB Device Port Status and Control Register -#define USB_PORTSC1_D_CCS (1U ) -#define USB_PORTSC1_D_PE (1U << 2U) -#define USB_PORTSC1_D_PEC (1U << 3U) -#define USB_PORTSC1_D_FPR (1U << 6U) -#define USB_PORTSC1_D_SUSP (1U << 7U) -#define USB_PORTSC1_D_PR (1U << 8U) -#define USB_PORTSC1_D_HSP (1U << 9U) -#define USB_PORTSC1_D_PIC15_14_POS ( 14U) -#define USB_PORTSC1_D_PIC15_14_MSK (3U << USB_PORTSC1_D_PIC15_14_POS) -#define USB_PORTSC1_D_PIC15_14(n) (((n) << USB_PORTSC1_D_PIC15_14_POS) & USB_PORTSC1_D_PIC15_14_MSK) -#define USB_PORTSC1_D_PTC19_16_POS ( 16U) -#define USB_PORTSC1_D_PTC19_16_MSK (0x0FU << USB_PORTSC1_D_PTC19_16_POS) -#define USB_PORTSC1_D_PHCD (1U << 23U) -#define USB_PORTSC1_D_PFSC (1U << 24U) -#define USB_PORTSC1_D_PSPD_POS ( 26U) -#define USB_PORTSC1_D_PSPD_MSK (3U << USB_PORTSC1_D_PSPD_POS) -#define USB_PORTSC1_D_PTS_POS ( 30U) -#define USB_PORTSC1_D_PTS_MSK (3UL << USB_PORTSC1_D_PTS_POS) -#define USB_PORTSC1_D_PTS(n) (((n) << USB_PORTSC1_D_PTS_POS) & USB_PORTSC1_D_PTS_MSK) - -// USB Device Mode Register -#define USB_USBMODE_D_CM1_0_POS ( 0U) -#define USB_USBMODE_D_CM1_0_MSK (3U ) -#define USB_USBMODE_D_CM1_0(n) ((n) & USB_USBMODE_D_CM1_0_MSK) -#define USB_USBMODE_D_ES (1U << 2U) -#define USB_USBMODE_D_SLOM (1U << 3U) -#define USB_USBMODE_D_SDIS (1U << 4U) - -// USB Endpoint Setup Status Register -#define USB_ENDPTSETUPSTAT_POS ( 0U) -#define USB_ENDPTSETUPSTAT_MSK (USB_ENDPT_MSK << USB_ENDPTSETUPSTAT_POS) - -// USB Endpoint Prime Register -#define USB_ENDPTRPRIME_PERB_POS ( 0U) -#define USB_ENDPTRPRIME_PERB_MSK (USB_ENDPT_MSK) -#define USB_ENDPTRPRIME_PETB_POS ( 16U) -#define USB_ENDPTRPRIME_PETB_MSK (USB_ENDPT_MSK << USB_ENDPTRPRIME_PETB_POS) - -// USB Endpoint Flush Register -#define USB_ENDPTFLUSH_FERB_POS ( 0U) -#define USB_ENDPTFLUSH_FERB_MSK (USB_ENDPT_MSK) -#define USB_ENDPTFLUSH_FETB_POS ( 16U) -#define USB_ENDPTFLUSH_FETB_MSK (USB_ENDPT_MSK << USB_ENDPTFLUSH_FETB_POS) - -// USB Endpoint Status Register -#define USB_ENDPTSTAT_ERBR_POS ( 0U) -#define USB_ENDPTSTAT_ERBR_MSK (USB_ENDPT_MSK) -#define USB_ENDPTSTAT_ETBR_POS ( 16U) -#define USB_ENDPTSTAT_ETBR_MSK (USB_ENDPT_MSK << USB_ENDPTSTAT_ETBR_POS) - -// USB Endpoint Complete Register -#define USB_ENDPTCOMPLETE_ERCE_POS ( 0U) -#define USB_ENDPTCOMPLETE_ERCE_MSK (USB_ENDPT_MSK) -#define USB_ENDPTCOMPLETE_ETCE_POS ( 16U) -#define USB_ENDPTCOMPLETE_ETCE_MSK (USB_ENDPT_MSK << USB_ENDPTCOMPLETE_ETCE_POS) - -// USB Endpoint Control Register -#define USB_ENDPTCTRL_RXS (1U ) -#define USB_ENDPTCTRL_RXT_POS ( 2U) -#define USB_ENDPTCTRL_RXT_MSK (3U << USB_ENDPTCTRL_RXT_POS) -#define USB_ENDPTCTRL_RXT(n) (((n) << USB_ENDPTCTRL_RXT_POS) & USB_ENDPTCTRL_RXT_MSK) -#define USB_ENDPTCTRL_RXI (1U << 5U) -#define USB_ENDPTCTRL_RXR (1U << 6U) -#define USB_ENDPTCTRL_RXE (1U << 7U) -#define USB_ENDPTCTRL_TXS (1U << 16U) -#define USB_ENDPTCTRL_TXT_POS ( 18U) -#define USB_ENDPTCTRL_TXT_MSK (3U << USB_ENDPTCTRL_TXT_POS) -#define USB_ENDPTCTRL_TXT(n) (((n) << USB_ENDPTCTRL_TXT_POS) & USB_ENDPTCTRL_TXT_MSK) -#define USB_ENDPTCTRL_TXI (1U << 21U) -#define USB_ENDPTCTRL_TXR (1U << 22U) -#define USB_ENDPTCTRL_TXE (1U << 23U) - -// Endpoint Queue Head Capabilities and Characteristics -#define USB_EPQH_CAP_IOS (1U << 15U) -#define USB_EPQH_CAP_MAX_PACKET_LEN_POS ( 16U) -#define USB_EPQH_CAP_MAX_PACKET_LEN_MSK (0x7FFU << USB_EPQH_CAP_MAX_PACKET_LEN_POS) -#define USB_EPQH_CAP_MAX_PACKET_LEN(n) (((n) << USB_EPQH_CAP_MAX_PACKET_LEN_POS) & USB_EPQH_CAP_MAX_PACKET_LEN_MSK) -#define USB_EPQH_CAP_ZLT (1U << 29U) -#define USB_EPQH_CAP_MULT_POS ( 30U) -#define USB_EPQH_CAP_MULT_MSK (3UL << USB_EPQH_CAP_MULT_POS) - -// Transfer Descriptor Token -#define USB_dTD_TOKEN_STATUS_POS ( 0U) -#define USB_dTD_TOKEN_STATUS_MSK (0xFFU ) -#define USB_dTD_TOKEN_STATUS(n) (n & USB_dTD_TOKEN_STATUS_MSK) -#define USB_dTD_TOKEN_STATUS_TRAN_ERROR (0x08U & USB_dTD_TOKEN_STATUS_MSK) -#define USB_dTD_TOKEN_STATUS_BUFFER_ERROR (0x20U & USB_dTD_TOKEN_STATUS_MSK) -#define USB_dTD_TOKEN_STATUS_HALTED (0x40U & USB_dTD_TOKEN_STATUS_MSK) -#define USB_dTD_TOKEN_STATUS_ACTIVE (0x80U & USB_dTD_TOKEN_STATUS_MSK) -#define USB_dTD_TOKEN_MULTO_POS ( 10U) -#define USB_dTD_TOKEN_MULTO_MSK (3U << USB_dTD_TOKEN_MULTO_POS) -#define USB_dTD_TOKEN_MULTO(n) (((n) << USB_dTD_TOKEN_MULTO_POS) & USB_dTD_TOKEN_MULTO_MSK) -#define USB_dTD_TOKEN_IOC (1U << 15U) -#define USB_dTD_TOKEN_TOTAL_BYTES_POS ( 16U) -#define USB_dTD_TOKEN_TOTAL_BYTES_MSK (0x7FFFU<< USB_dTD_TOKEN_TOTAL_BYTES_POS) -#define USB_dTD_TOKEN_TOTAL_BYTES(n) (((n) << USB_dTD_TOKEN_TOTAL_BYTES_POS) & USB_dTD_TOKEN_TOTAL_BYTES_MSK) - -// USB Host and Device Driver status flags -#define USBD_DRIVER_INITIALIZED (1U ) -#define USBD_DRIVER_POWERED (1U << 1U) - -#define USBH_DRIVER_INITIALIZED (1U << 4U) -#define USBH_DRIVER_POWERED (1U << 5U) - -//USB Host and Device function declaration -void USBH_IRQ (void); -void USBD_IRQ (void); -#endif /* __USB_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBD.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBD.c deleted file mode 100644 index a7d7574fd..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBD.c +++ /dev/null @@ -1,886 +0,0 @@ -/* - * Copyright (c) 2013-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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 - * - * 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. - * - * - * $Date: 12. Dec 2018 - * $Revision: V1.0 - * - * Driver: Driver_USBD0 - * Configured: via RTE_Device.h configuration file - * Project: USB High-Speed Device Driver for Silicon Labs RS1xxxx - * -------------------------------------------------------------------------- - * Use the following configuration settings in the middleware component - * to connect to this driver. - * - * Configuration Setting Value - * --------------------- ----- - * Connect to hardware via Driver_USBD# = 0 - * -------------------------------------------------------------------------- - * Defines used for driver configuration (at compile time): - * - * USBD_MAX_ENDPOINT_NUM: defines maximum number of IN/OUT Endpoint pairs - * that driver will support with Control Endpoint 0 - * not included, this value impacts driver memory - * requirements - * - default value: 5 - * - maximum value: 5 - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * Initial release - */ - -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) - -#include -#include - -#include "Driver_USBD.h" - - -#include "USB.h" -#include "RTE_Device.h" - - -#ifndef USBD_MAX_ENDPOINT_NUM -#define USBD_MAX_ENDPOINT_NUM 5U -#endif -#if (USBD_MAX_ENDPOINT_NUM > 6) -#error Too many Endpoints, maximum IN/OUT Endpoint pairs that this driver supports is 5 !!! -#endif - - -extern uint8_t USB_role; -extern uint8_t USB_state; - - -// USBD Driver ***************************************************************** - -#define ARM_USBD_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR (1,0) - -// Driver Version -static const ARM_DRIVER_VERSION usbd_driver_version = { ARM_USBD_API_VERSION, ARM_USBD_DRV_VERSION }; - -// Driver Capabilities -static const ARM_USBD_CAPABILITIES usbd_driver_capabilities = { - 1U, // VBUS Detection - 1U, // Event VBUS On - 1U // Event VBUS Off -}; - -#define ENDPTCTRL(ep_num) (*(volatile uint32_t *)((uint32_t)(&USB->USB_ENDPTCTRL0) + 4U * ep_num)) - -#define EP_NUM(ep_addr) (ep_addr & ARM_USB_ENDPOINT_NUMBER_MASK) -#define EP_DIR(ep_addr) ((ep_addr >> 7) & 1U) -#define EP_SLL(ep_addr) (EP_DIR(ep_addr) * 16U) -#define EP_QHNUM(ep_addr) ((EP_NUM(ep_addr) * 2U) + EP_DIR(ep_addr)) -#define EP_MSK(ep_addr) (1UL << (EP_NUM(ep_addr) + EP_SLL(ep_addr))) - -/*USB Device endpoint Queue Head*/ -typedef struct { - uint32_t cap; - uint32_t curr_dTD; - uint32_t next_dTD; - uint32_t dTD_token; - uint32_t buf[5]; - uint32_t reserved; - uint32_t setup[2]; - uint8_t *data; - uint32_t num; - uint32_t num_transferred_total; - uint16_t num_transferring; - uint8_t ep_type; - uint8_t ep_active; -} dQH_t; - -/*USB Device Endpoint transfer descriptor*/ -typedef struct { - uint32_t next_dTD; - uint32_t dTD_token; - uint32_t buf[5]; - uint32_t reserved; -} dTD_t; - -static dQH_t __align(2048) dQH[(USBD_MAX_ENDPOINT_NUM + 1U) * 2U]; /* Queue Heads aligned to 2k boundary */ -static dTD_t __align( 32) dTD[(USBD_MAX_ENDPOINT_NUM + 1U) * 2U]; /* Transfer Descriptors */ - -static ARM_USBD_SignalDeviceEvent_t SignalDeviceEvent; -static ARM_USBD_SignalEndpointEvent_t SignalEndpointEvent; - -static ARM_USBD_STATE usbd_state; -/* Setup packet data buffer */ -static uint32_t setup_packet[2]; -/* Setup packet received */ -static volatile uint8_t setup_packet_recv; - -// Function prototypes -static int32_t USBD_EndpointConfigure (uint8_t ep_addr, uint8_t ep_type, uint16_t ep_max_packet_size); - -#define M4SS_CLK_PWR_CTRL_BASE_ADDR 0x46000000 -#define USB_SYSCLK_CLKCLNR_ON (1 << 23) -#define M4SS_CLOCK_CONFIG_REG4 *(volatile uint32_t *)(M4SS_CLK_PWR_CTRL_BASE_ADDR + 0x24) -#define M4SS_CLOCK_CONFIG_REG5 *(volatile uint32_t *)(M4SS_CLK_PWR_CTRL_BASE_ADDR + 0x28) - -#define M4SS_MISC_REG_BASE 0x46008000 - -#define MISC_USB_CONFIG_REG *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0x1C)) -#define NWPAON_ACCESS_CTRL_CLEAR *((volatile uint32_t *)(NWPAON_MEM_HOST_ACCESS_CTRL_CLEAR)) -#define MISC_CFG_RST_LATCH_STATUS *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0x10)) -#define MISC_CFG_HOST_CTRL *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0x0C)) - -#define MISC_USB_SET_REG1 *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0xF0)) -#define MISC_USB_CLEAR_REG1 *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0xF4)) - -// Auxiliary functions - -/** - * @fn void USBD_HW_EndpointFlush (uint8_t ep_addr) - * @brief Flush Endpoint. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction - * -*/ -static void USBD_HW_EndpointFlush (uint8_t ep_addr) { - uint32_t ep_msk=0; - - ep_msk = EP_MSK(ep_addr); - /*USB endpoint flush*/ - USB->USB_ENDPTFLUSH = ep_msk; - while (USB->USB_ENDPTFLUSH & ep_msk); -} - -/** - * @fn void USBD_Reset (void) - * @brief Reset USB Endpoint settings and variables. -*/ -static void USBD_Reset (void) { - uint8_t i; - - setup_packet[0] = 0U; - setup_packet[1] = 0U; - setup_packet_recv = 0U; - memset((void *)dQH, 0, sizeof(dQH)); - memset((void *)dTD, 0, sizeof(dTD)); - - /*Disable all the supported endpoint for tx and rx*/ - for (i = 1U; i <= USBD_MAX_ENDPOINT_NUM; i++) { - ENDPTCTRL(i) &= ~(USB_ENDPTCTRL_RXE | USB_ENDPTCTRL_TXE); - } - - /* Clear interrupts*/ - USB->USB_ENDPTNAK = 0xFFFFFFFFUL; - USB->USB_ENDPTNAKEN = 0U; - USB->USBSTS_D = 0xFFFFFFFFUL; - /*Clearing all setup tokens*/ - USB->USB_ENDPTSETUPSTAT = USB->USB_ENDPTSETUPSTAT; - /*Clearing all endpoint complete status bits*/ - USB->USB_ENDPTCOMPLETE = USB->USB_ENDPTCOMPLETE; - - /*Clear all prime status*/ - while (USB->USB_ENDPTPRIME); - /*Clear all primed buffers*/ - USB->USB_ENDPTFLUSH = 0xFFFFFFFFUL; - while (USB->USB_ENDPTFLUSH); - - /*Interupt threshold control to isusue an interrupt*/ - USB->USBCMD_D &= ~(USB_USBCMD_D_ITC(0xFFUL)); - - /* Initialization of an control Endpoint0*/ - if (usbd_state.speed == ARM_USB_SPEED_HIGH) { - USBD_EndpointConfigure (0x00U, ARM_USB_ENDPOINT_CONTROL, 64U); - USBD_EndpointConfigure (0x80U, ARM_USB_ENDPOINT_CONTROL, 64U); - } else { - /*for full/low speed*/ - USBD_EndpointConfigure (0x00U, ARM_USB_ENDPOINT_CONTROL, 8U); - USBD_EndpointConfigure (0x80U, ARM_USB_ENDPOINT_CONTROL, 8U); - } - - /*Assign the start of endpoint list address register*/ - USB->USB_ENDPOINTLISTADDR = (uint32_t)dQH; - - /*setup lockout mode off*/ - USB->USBMODE_D |= USB_USBMODE_D_SLOM; -} - -/** - * @fn void USBD_HW_ReadSetupPacket (void) - * @brief Read Setup Packet to buffer. -*/ -static void USBD_HW_ReadSetupPacket (void) { - - do { - /*Setup tripwire*/ - USB->USBCMD_D |= USB_USBCMD_D_SUTW; - /*Copy the setup packet data received to buffer */ - setup_packet[0] = dQH[0].setup[0]; - setup_packet[1] = dQH[0].setup[1]; - } while (!(USB->USBCMD_D & USB->USBCMD_D)); - /*Clear the setup tripwire*/ - USB->USBCMD_D &= ~USB_USBCMD_D_SUTW; - /*clear the setup endpoint status bit*/ - USB->USB_ENDPTSETUPSTAT = 1U; - -} - -/** - * @fn void USBD_HW_EndpointTransfer (uint8_t ep_addr) - * @brief Start transfer on Endpoint. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction -*/ -static void USBD_HW_EndpointTransfer (uint8_t ep_addr) { - dQH_t *ptr_dqh; - dTD_t *ptr_dtd; - uint8_t *data; - uint32_t ep_msk=0, num=0; - uint8_t ep_qhnum=0; - - ep_qhnum = EP_QHNUM(ep_addr); - ep_msk = EP_MSK(ep_addr); - ptr_dqh = &dQH[ep_qhnum]; - ptr_dtd = &dTD[ep_qhnum]; - - data = ptr_dqh->data + ptr_dqh->num_transferred_total; - num = ptr_dqh->num - ptr_dqh->num_transferred_total; - /* max transfer length is 16k*/ - if (num > 0x4000U) { num = 0x4000U; } - - while (USB->USB_ENDPTSTAT & ep_msk); - - memset (ptr_dtd, 0, sizeof(dTD_t)); - - /* Driver does not support linked endpoint descriptors next address is invalid*/ - ptr_dtd->next_dTD = 1U; - - /* Configure Transfer Descriptor */ - ptr_dtd->dTD_token |= USB_dTD_TOKEN_TOTAL_BYTES(num) | - USB_dTD_TOKEN_IOC | - USB_dTD_TOKEN_STATUS_ACTIVE ; - - /* Set Buffer Addresses */ - ptr_dtd->buf[0] = (uint32_t)(data ); - ptr_dtd->buf[1] = (uint32_t)(data + 0x1000U); - ptr_dtd->buf[2] = (uint32_t)(data + 0x2000U); - ptr_dtd->buf[3] = (uint32_t)(data + 0x3000U); - ptr_dtd->buf[4] = (uint32_t)(data + 0x4000U); - /*clear status*/ - ptr_dqh->dTD_token &= ~USB_dTD_TOKEN_STATUS_MSK; - /* Save Transfer Descriptor address to overlay area of queue heads*/ - ptr_dqh->next_dTD = (uint32_t)(ptr_dtd); - - ptr_dqh->num_transferring = num; - /*start the endpoint transfer*/ - USB->USB_ENDPTPRIME |= ep_msk; -} - - -// USBD Driver functions - -/** - * @fn ARM_DRIVER_VERSION USBD_GetVersion (void) - * @brief Get driver version. - * @return \ref ARM_DRIVER_VERSION -*/ -static ARM_DRIVER_VERSION USBD_GetVersion (void) { return usbd_driver_version; } - -/** - * @fn ARM_USBD_CAPABILITIES USBD_GetCapabilities (void) - * @brief Get driver capabilities. - * @return \ref ARM_USBD_CAPABILITIES -*/ -static ARM_USBD_CAPABILITIES USBD_GetCapabilities (void) { return usbd_driver_capabilities; } - -/** - * @fn int32_t USBD_Initialize (ARM_USBD_SignalDeviceEvent_t cb_device_event, - ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) - * @brief Initialize USB Device Interface. - * @param[in] cb_device_event : Pointer to \ref ARM_USBD_SignalDeviceEvent - * @param[in] cb_endpoint_event : Pointer to \ref ARM_USBD_SignalEndpointEvent - * @return \ref execution_status -*/ -static int32_t USBD_Initialize (ARM_USBD_SignalDeviceEvent_t cb_device_event, - ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) { - - if(MCU_RET->CHIP_CONFIG_MCU_READ_b.DISABLE_USB == 1U){ - /* If USB peripheral is not supported by this chip*/ - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - if ((USB_state & USBD_DRIVER_INITIALIZED) != 0U) { return ARM_DRIVER_OK; } - - SignalDeviceEvent = cb_device_event; - SignalEndpointEvent = cb_endpoint_event; - - USB_role = ARM_USB_ROLE_DEVICE; - - USB_state = USBD_DRIVER_INITIALIZED; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_Uninitialize (void) - * @brief De-initialize USB Device Interface. - * @return \ref execution_status -*/ -static int32_t USBD_Uninitialize (void) { - - USB_role = ARM_USB_ROLE_NONE; - USB_state &= ~USBD_DRIVER_INITIALIZED; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_PowerControl (ARM_POWER_STATE state) - * @brief Control USB Device Interface Power. - * @param[in] state : Power state - * @return \ref execution_status -*/ -static int32_t USBD_PowerControl (ARM_POWER_STATE state) { - - switch (state) { - case ARM_POWER_OFF: - /*Disable interrupt*/ - NVIC_DisableIRQ (USB_IRQn); - NVIC_ClearPendingIRQ (USB_IRQn); - USB_state &= ~USBD_DRIVER_POWERED; - - setup_packet_recv = 0U; - memset((void *)&usbd_state, 0, sizeof(usbd_state)); - memset((void *)dQH, 0, sizeof(dQH)); - memset((void *)dTD, 0, sizeof(dTD)); - break; - - case ARM_POWER_FULL: - if ((USB_state & USBD_DRIVER_INITIALIZED) == 0U) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBD_DRIVER_POWERED) != 0U) { return ARM_DRIVER_OK; } - - /*USB Config*/ - MISC_USB_CONFIG_REG =0x11; - /*Enable M4 USB*/ - NWPAON_ACCESS_CTRL_CLEAR = BIT(4); - - // Reset USB Controller - USB->USBCMD_D = USB_USBCMD_D_RST; - - while ((USB->USBCMD_D & (USB_USBCMD_D_RS | USB_USBCMD_D_RST)) != 0U); - - /*Set the usb in device mode and setup lockout mode*/ - USB->USBMODE_D = USB_USBMODE_D_CM1_0(2U) | USB_USBMODE_D_SLOM; - /* USB device reset*/ - USBD_Reset (); - -#if (RTE_USB_USB0_HS_EN) - USB->USB_PORTSC1_D &= ~USB_PORTSC1_D_PFSC; -#else - USB->USB_PORTSC1_D |= USB_PORTSC1_D_PFSC; -#endif - - /* Set all the usb interrupts*/ - USB->USBINTR_D = (USB_USBINTR_D_UE | - USB_USBINTR_D_PCE | - USB_USBINTR_D_SLE | - USB_USBINTR_D_URE); - - /*Set power flag*/ - USB_state |= USBD_DRIVER_POWERED; - /*Enable the usb interrupt */ - NVIC_EnableIRQ (USB_IRQn); - break; - - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_DeviceConnect (void) - * @brief Connect USB Device. - * @return \ref execution_status -*/ -static int32_t USBD_DeviceConnect (void) { - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - USB->USBCMD_D |= USB_USBCMD_D_RS; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_DeviceDisconnect (void) - * @brief Disconnect USB Device. - * @return \ref execution_status -*/ -static int32_t USBD_DeviceDisconnect (void) { - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - USB->USBCMD_D &= ~USB_USBCMD_D_RS; - -#if (RTE_USB0_IND0_PIN_EN) - USB->PORTSC1_D &= ~USB_PORTSC1_D_PIC1_0(1); // Clear indicator LED0 :FIXME :led indication dedicated pin not there -#endif - - return ARM_DRIVER_OK; -} - -/** - * @fn ARM_USBD_STATE USBD_DeviceGetState (void) - * @brief Get current USB Device State. - * @return Device State \ref ARM_USBD_STATE -*/ -static ARM_USBD_STATE USBD_DeviceGetState (void) { - ARM_USBD_STATE dev_state = { 0U, 0U, 0U }; - uint32_t portsc1_d=0; - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return dev_state; } - - portsc1_d = USB->USB_PORTSC1_D; - dev_state = usbd_state; - /*Current status of usb device connection and usb device bus status*/ - dev_state.active = ((portsc1_d & USB_PORTSC1_D_CCS) != 0U) && - ((portsc1_d & USB_USBSTS_D_SLI) == 0U) ; - - return dev_state; -} - -/** - * @fn int32_t USBD_DeviceRemoteWakeup (void) - * @brief Trigger USB Remote Wakeup. - * @return \ref execution_status -*/ -static int32_t USBD_DeviceRemoteWakeup (void) { - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - /*Enable the phy clock*/ - USB->USB_PORTSC1_D &= ~USB_PORTSC1_D_PHCD; - /* Force Port Resume*/ - USB->USB_PORTSC1_D |= USB_PORTSC1_D_FPR; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_DeviceSetAddress (uint8_t dev_addr) - * @brief Set USB Device Address. - * @param[in] dev_addr : Device Address - * @return \ref execution_status -*/ -static int32_t USBD_DeviceSetAddress (uint8_t dev_addr) { - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - USB->USB_DEVICEADDR = (dev_addr << USB_DEVICEADDR_USBADR_POS) & USB_DEVICEADDR_USBADR_MSK; - USB->USB_DEVICEADDR |= USB_DEVICEADDR_USBADRA; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_ReadSetupPacket (uint8_t *setup) - * @brief Read setup packet received over Control Endpoint. - * @param[out] setup : Pointer to buffer for setup packet - * @return \ref execution_status -*/ -static int32_t USBD_ReadSetupPacket (uint8_t *setup) { - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - if (setup_packet_recv == 0U) { return ARM_DRIVER_ERROR; } - - setup_packet_recv = 0U; - memcpy(setup, setup_packet, 8); - /* If new setup packet was received while this was being read*/ - if (setup_packet_recv != 0U) { - return ARM_DRIVER_ERROR; - } - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_EndpointConfigure (uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_max_packet_size) - * @brief Configure USB Endpoint. - * @param[in] ep_addr : Endpoint Address - - ep_addr.0..3: Address - - ep_addr.7: Direction - * @param[in] ep_type : Endpoint Type (ARM_USB_ENDPOINT_xxx) - * @param[in] ep_max_packet_size : Endpoint Maximum Packet Size - * @return \ref execution_status -*/ -static int32_t USBD_EndpointConfigure (uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_max_packet_size) { - dQH_t *ptr_dqh; - uint32_t ep_mult=0; - uint32_t ep_packet_size=0; - uint8_t ep_num=0,ep_sll=0; - - ep_num = EP_NUM(ep_addr); - if (ep_num > USBD_MAX_ENDPOINT_NUM) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - ptr_dqh = &dQH[EP_QHNUM(ep_addr)]; - if (ptr_dqh->ep_active != 0U) { return ARM_DRIVER_ERROR_BUSY; } - - ep_num = EP_NUM(ep_addr); - ep_sll = EP_SLL(ep_addr); - ep_mult = (ep_max_packet_size & ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_MASK) >> 11; - ep_packet_size = ep_max_packet_size & ARM_USB_ENDPOINT_MAX_PACKET_SIZE_MASK; - - memset((void *)ptr_dqh, 0, sizeof(dQH_t)); - - ptr_dqh->ep_type = ep_type; - if (ep_type == ARM_USB_ENDPOINT_ISOCHRONOUS) { - /* For isochronous endpoints number of transactions per microframe in high-speed (or frame in full-speed)*/ - /* has to be 1 more than additional transactions per microframe for high-speed (or 1 for full-speed)*/ - ep_mult++; - } - - if ((ep_mult > 1U) && (usbd_state.speed == ARM_USB_SPEED_FULL)) { ep_mult = 1U; } - - ptr_dqh->cap = ((ep_mult << USB_EPQH_CAP_MULT_POS) & USB_EPQH_CAP_MULT_MSK) | - (USB_EPQH_CAP_MAX_PACKET_LEN(ep_packet_size)) | - (USB_EPQH_CAP_ZLT) | - ((ep_addr == 0U) * USB_EPQH_CAP_IOS); - ptr_dqh->next_dTD = 1U; - ptr_dqh->dTD_token = 0U; - - USBD_HW_EndpointFlush(ep_addr); - - /*clear all the enpoint settings*/ - ENDPTCTRL(ep_num) &= ~((USB_ENDPTCTRL_RXS | - USB_ENDPTCTRL_RXT_MSK | - USB_ENDPTCTRL_RXI | - USB_ENDPTCTRL_RXR | - USB_ENDPTCTRL_RXE ) - << ep_sll); - - /*set the enpoint setting*/ - ENDPTCTRL(ep_num) |= (USB_ENDPTCTRL_RXT(ep_type) | - USB_ENDPTCTRL_RXR | - USB_ENDPTCTRL_RXE ) - << ep_sll; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_EndpointUnconfigure (uint8_t ep_addr) - * @brief Unconfigure USB Endpoint. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction - * @return \ref execution_status -*/ -static int32_t USBD_EndpointUnconfigure (uint8_t ep_addr) { - dQH_t *ptr_dqh; - dTD_t *ptr_dtd; - uint8_t ep_qhnum=0, ep_num=0, ep_sll=0; - - ep_num = EP_NUM(ep_addr); - if (ep_num > USBD_MAX_ENDPOINT_NUM) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - ep_qhnum = EP_QHNUM(ep_addr); - ptr_dqh = &dQH[ep_qhnum]; - if (ptr_dqh->ep_active != 0U) { return ARM_DRIVER_ERROR_BUSY; } - - ptr_dtd = &dTD[ep_qhnum]; - ep_sll = EP_SLL(ep_addr); - - /*clear all the enpoint settings*/ - ENDPTCTRL(ep_num) &= ~((USB_ENDPTCTRL_RXS | - USB_ENDPTCTRL_RXT_MSK | - USB_ENDPTCTRL_RXI | - USB_ENDPTCTRL_RXR | - USB_ENDPTCTRL_RXE ) - << ep_sll); - - ENDPTCTRL(ep_num) |= (USB_ENDPTCTRL_RXR << ep_sll); - - memset((void *)ptr_dqh, 0, sizeof(dQH_t)); - memset((void *)ptr_dtd, 0, sizeof(dTD_t)); - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_EndpointStall (uint8_t ep_addr, bool stall) - * @brief Set/Clear Stall for USB Endpoint. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction - * @param[in] stall : Operation - * - \b false Clear - * - \b true Set - * @return \ref execution_status -*/ -static int32_t USBD_EndpointStall (uint8_t ep_addr, bool stall) { - dQH_t *ptr_dqh; - uint8_t ep_num=0, ep_sll=0; - - ep_num = EP_NUM(ep_addr); - if (ep_num > USBD_MAX_ENDPOINT_NUM) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - ptr_dqh = &dQH[EP_QHNUM(ep_addr)]; - if (ptr_dqh->ep_active != 0U) { return ARM_DRIVER_ERROR_BUSY; } - /*check the endppoint is IN packet or OUT packet*/ - ep_sll = EP_SLL(ep_addr); - - if (stall != 0U) { - /*Set endpoint stall for IN or OUT packet*/ - ENDPTCTRL(ep_num) |= (USB_ENDPTCTRL_RXS << ep_sll); - } else { - /*Clear the endpoint stalling*/ - ENDPTCTRL(ep_num) &= ~(USB_ENDPTCTRL_RXS << ep_sll); - - ptr_dqh->dTD_token = 0U; - - USBD_HW_EndpointFlush(ep_addr); - /*Set data toggle reset */ - ENDPTCTRL(ep_num) |= (USB_ENDPTCTRL_RXR << ep_sll); - } - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBD_EndpointTransfer (uint8_t ep_addr, uint8_t *data, uint32_t num) - * @brief Read data from or Write data to USB Endpoint. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction - * @param[out] data : Pointer to buffer for data to read or with data to write - * @param[in] num : Number of data bytes to transfer - * @return \ref execution_status -*/ -static int32_t USBD_EndpointTransfer (uint8_t ep_addr, uint8_t *data, uint32_t num) { - dQH_t *ptr_dqh; - - if (EP_NUM(ep_addr) > USBD_MAX_ENDPOINT_NUM) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - ptr_dqh = &dQH[EP_QHNUM(ep_addr)]; - if (ptr_dqh->ep_active != 0U) { return ARM_DRIVER_ERROR_BUSY; } - - ptr_dqh->ep_active = 1U; - - ptr_dqh->data = data; - ptr_dqh->num = num; - ptr_dqh->num_transferred_total = 0U; - ptr_dqh->num_transferring = 0U; - /* Start transfer*/ - USBD_HW_EndpointTransfer(ep_addr); - - return ARM_DRIVER_OK; -} - -/** - * @fn uint32_t USBD_EndpointTransferGetResult (uint8_t ep_addr) - * @brief Get result of USB Endpoint transfer. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction - * @return number of successfully transferred data bytes -*/ -static uint32_t USBD_EndpointTransferGetResult (uint8_t ep_addr) { - - if (EP_NUM(ep_addr) > USBD_MAX_ENDPOINT_NUM) { return 0U; } - - return (dQH[EP_QHNUM(ep_addr)].num_transferred_total); -} - -/** - * @fn int32_t USBD_EndpointTransferAbort (uint8_t ep_addr) - * @brief Abort current USB Endpoint transfer. - * @param[in] ep_addr : Endpoint Address - * - ep_addr.0..3: Address - * - ep_addr.7: Direction - * @return \ref execution_status -*/ -static int32_t USBD_EndpointTransferAbort (uint8_t ep_addr) { - dQH_t *ptr_dqh; - uint32_t ep_msk=0; - uint8_t ep_num=0, ep_sll=0; - - ep_num = EP_NUM(ep_addr); - if (ep_num > USBD_MAX_ENDPOINT_NUM) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return ARM_DRIVER_ERROR; } - - ptr_dqh = &dQH[EP_QHNUM(ep_addr)]; - ep_msk = EP_MSK(ep_addr); - ep_sll = EP_SLL(ep_addr); - - USBD_HW_EndpointFlush(ep_addr); - /*Clear completed Flag*/ - USB->USB_ENDPTCOMPLETE = ep_msk; - ENDPTCTRL(ep_num) |= (USB_ENDPTCTRL_RXR << ep_sll); - - ptr_dqh->dTD_token &= ~0xFFU; - - ptr_dqh->ep_active = 0U; - - return ARM_DRIVER_OK; -} - -/** - * @fn uint16_t USBD_GetFrameNumber (void) - * @brief Get current USB Frame Number. - * @return Frame Number -*/ -static uint16_t USBD_GetFrameNumber (void) { - - if ((USB_state & USBD_DRIVER_POWERED) == 0U) { return 0U; } - - return ((USB->USB_FRINDEX_D & USB_FRINDEX_D_FRINDEX13_3_MSK) >> USB_FRINDEX_D_FRINDEX13_3_POS); -} - -/** - * @fn void USBD0_IRQ (void) - * @brief USB0 Device Interrupt Routine (IRQ). -*/ -void USBD_IRQ (void) { - dQH_t *ptr_dqh; - uint32_t status=0 , complete=0; - uint16_t ep_packet_size=0, received_data=0; - uint8_t ep_num=0, ep_addr=0; - - status = USB->USBSTS_D & USB->USBINTR_D; - /*Read the enpoint complete status*/ - complete = USB->USB_ENDPTCOMPLETE; - - /*Clear all active interrupts*/ - USB->USBSTS_D = status; - /*Endpoint complete status clear*/ - USB->USB_ENDPTCOMPLETE = complete; - - /*Reset interrupt*/ - if ((status & USB_USBSTS_D_URI) != 0U) { - USBD_Reset(); - usbd_state.speed = ARM_USB_SPEED_FULL; - SignalDeviceEvent(ARM_USBD_EVENT_RESET); - } - - /* Suspend interrupt */ - if ((status & USB_USBSTS_D_SLI) != 0U) { - SignalDeviceEvent(ARM_USBD_EVENT_SUSPEND); - -#if (RTE_USB0_IND0_PIN_EN) - USB->USB_PORTSC1_D &= ~USB_PORTSC1_D_PIC15_14(1); // Clear indicator LED0 -#endif - } - /* Port change detect interrupt*/ - if ((status & USB_USBSTS_D_PCI) != 0U) { - if ((( USB->USB_PORTSC1_D & USB_PORTSC1_D_PSPD_MSK) >> USB_PORTSC1_D_PSPD_POS) == 2U) { - usbd_state.speed = ARM_USB_SPEED_HIGH; - SignalDeviceEvent(ARM_USBD_EVENT_HIGH_SPEED); - } else { - usbd_state.speed = ARM_USB_SPEED_FULL; - } - -#if (RTE_USB0_IND0_PIN_EN) - USB->USB_PORTSC1_D |= USB_PORTSC1_D_PIC15_14(1); // Set indicator LED0 -#endif - SignalDeviceEvent(ARM_USBD_EVENT_RESUME); - } - - if ((status & USB_USBSTS_D_UI) != 0U) { /* USB interrupt on short packet rx*/ - if (( USB->USB_ENDPTSETUPSTAT) != 0U) { /* Setup Packet Received*/ - USBD_HW_ReadSetupPacket(); - setup_packet_recv = 1U; - SignalEndpointEvent(0, ARM_USBD_EVENT_SETUP); - } - - if ((complete & USB_ENDPTCOMPLETE_ETCE_MSK) != 0U) { - /*IN packet data sent*/ - for (ep_num = 0U; ep_num <= USBD_MAX_ENDPOINT_NUM; ep_num++) { - if ((complete & USB_ENDPTCOMPLETE_ETCE_MSK) & (1U << (ep_num + USB_ENDPTCOMPLETE_ETCE_POS))) { - ep_addr = ep_num | ARM_USB_ENDPOINT_DIRECTION_MASK; - ptr_dqh = &dQH[EP_QHNUM(ep_addr)]; - - ptr_dqh->num_transferred_total += ptr_dqh->num_transferring; - - /*Max packet data sent ot not*/ - if (ptr_dqh->num == ptr_dqh->num_transferred_total) { - ptr_dqh->ep_active = 0U; - SignalEndpointEvent(ep_addr, ARM_USBD_EVENT_IN); - } else if (ptr_dqh->ep_active != 0U) { - /*Transfer remaining data if max packet data is not transmitted*/ - USBD_HW_EndpointTransfer (ep_addr); - } - } - } - } - /*OUT packet data received*/ - if ((complete & USB_ENDPTCOMPLETE_ERCE_MSK) != 0U) { - for (ep_num = 0U; ep_num <= USBD_MAX_ENDPOINT_NUM; ep_num++) { - if ((complete & USB_ENDPTCOMPLETE_ERCE_MSK) & (1 << ep_num)) { - ep_addr = ep_num; - ptr_dqh = &dQH[EP_QHNUM(ep_addr)]; - ep_packet_size = (ptr_dqh->cap & USB_EPQH_CAP_MAX_PACKET_LEN_MSK) >> USB_EPQH_CAP_MAX_PACKET_LEN_POS; - - received_data = ptr_dqh->num_transferring - - ((ptr_dqh->dTD_token & USB_dTD_TOKEN_TOTAL_BYTES_MSK) >> USB_dTD_TOKEN_TOTAL_BYTES_POS); - ptr_dqh->num_transferred_total += received_data; - - /* check for the All data received and data terminated with zero length packet*/ - if (((received_data % ep_packet_size) != 0U) || (ptr_dqh->num == ptr_dqh->num_transferred_total)) { - ptr_dqh->ep_active = 0U; - SignalEndpointEvent(ep_addr, ARM_USBD_EVENT_OUT); - } else if (ptr_dqh->ep_active != 0U) { - /*if all data is not received receive next*/ - USBD_HW_EndpointTransfer (ep_addr); - } - } - } - } - } -} - - -ARM_DRIVER_USBD Driver_USBD0 = { - USBD_GetVersion, - USBD_GetCapabilities, - USBD_Initialize, - USBD_Uninitialize, - USBD_PowerControl, - USBD_DeviceConnect, - USBD_DeviceDisconnect, - USBD_DeviceGetState, - USBD_DeviceRemoteWakeup, - USBD_DeviceSetAddress, - USBD_ReadSetupPacket, - USBD_EndpointConfigure, - USBD_EndpointUnconfigure, - USBD_EndpointStall, - USBD_EndpointTransfer, - USBD_EndpointTransferGetResult, - USBD_EndpointTransferAbort, - USBD_GetFrameNumber -}; -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBH.c b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBH.c deleted file mode 100644 index d1b946312..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/USBH.c +++ /dev/null @@ -1,244 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2016 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - * - * $Date: 01. Oct 2018 - * $Revision: V1.0 - * - * Driver: Driver_USBH0_HCI - * Configured: via RTE_Device.h configuration file - * Project: USB Host 0 HCI Controller (EHCI) Driver for Silicon Labs MCU - * -------------------------------------------------------------------------- - * Use the following configuration settings in the middleware component - * to connect to this driver. - * - * Configuration Setting Value - * --------------------- ----- - * Connect to hardware via Driver_USBH# = 0 - * USB Host controller interface = EHCI - * -------------------------------------------------------------------------- */ - -/* History: - * Version 1.0 - * - Initial CMSIS Driver API V5.4.0 release - */ -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) -#include "Driver_USBH.h" - - -#include "USB.h" -#include "RTE_Device.h" - - -extern uint8_t USB_role; -extern uint8_t USB_state; - -#define M4SS_CLK_PWR_CTRL_BASE_ADDR 0x46000000 -#define USB_SYSCLK_CLKCLNR_ON (1 << 23) -#define M4SS_CLOCK_CONFIG_REG4 *(volatile uint32_t *)(M4SS_CLK_PWR_CTRL_BASE_ADDR + 0x24) -#define M4SS_CLOCK_CONFIG_REG5 *(volatile uint32_t *)(M4SS_CLK_PWR_CTRL_BASE_ADDR + 0x28) - -#define M4SS_MISC_REG_BASE 0x46008000 - -#define MISC_USB_CONFIG_REG *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0x1C)) -#define NWPAON_ACCESS_CTRL_CLEAR *((volatile uint32_t *)(NWPAON_MEM_HOST_ACCESS_CTRL_CLEAR)) -#define MISC_CFG_RST_LATCH_STATUS *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0x10)) -#define MISC_CFG_HOST_CTRL *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0x0C)) - -#define MISC_USB_SET_REG1 *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0xF0)) -#define MISC_USB_CLEAR_REG1 *((volatile uint32_t *)(M4SS_MISC_REG_BASE + 0xF4)) - -// USBH EHCI Driver ************************************************************ - -#define ARM_USBH_EHCI_DRIVER_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) - -// Driver Version -static const ARM_DRIVER_VERSION usbh_ehci_driver_version = { ARM_USBH_API_VERSION, ARM_USBH_EHCI_DRIVER_VERSION }; - -// Driver Capabilities -static const ARM_USBH_HCI_CAPABILITIES usbh_ehci_driver_capabilities = { - 0x0001U // Root HUB available Ports Mask -}; - -static ARM_USBH_HCI_Interrupt_t EHCI_IRQ; - -/** - * @fn void RSI_TimerDelayUs(uint32_t delay_ms) - * @brief This API is used create delay in micro seconds. - * @param[in] delay_ms : timer delay in micro seconds - * @return None - */ -void RSI_DelayUs(uint32_t delay_us) -{ - /**/ - RSI_ULPSS_TimerClkConfig( ULPCLK ,ENABLE_STATIC_CLK,0,ULP_TIMER_32MHZ_RC_CLK,0); - - /* Sets periodic mode */ - RSI_TIMERS_SetTimerMode(TIMERS, ONESHOT_TIMER, TIMER_0); - - /* Sets timer in 1 Micro second mode */ - RSI_TIMERS_SetTimerType(TIMERS, MICRO_SEC_MODE, TIMER_0); - - /* 1 Micro second timer configuration */ - RSI_TIMERS_MicroSecTimerConfig(TIMERS, TIMER_0, 32, 0 ,MICRO_SEC_MODE); - - RSI_TIMERS_SetMatch(TIMERS, TIMER_0,delay_us); - - RSI_TIMERS_TimerStart(TIMERS, TIMER_0); - - while(!RSI_TIMERS_InterruptStatus(TIMERS,TIMER_0 )); -} - - -// USBH EHCI Driver functions - -/** - * @fn ARM_DRIVER_VERSION USBH_HCI_GetVersion (void) - * @brief Get USB Host HCI (OHCI/EHCI) driver version. - * @return \ref ARM_DRIVER_VERSION -*/ -static ARM_DRIVER_VERSION USBH_HCI_GetVersion (void) { return usbh_ehci_driver_version; } - -/** - * @fn ARM_USBH_HCI_CAPABILITIES USBH_HCI_GetCapabilities (void) - * @brief Get driver capabilities. - * @return \ref ARM_USBH_HCI_CAPABILITIES -*/ -static ARM_USBH_HCI_CAPABILITIES USBH_HCI_GetCapabilities (void) { return usbh_ehci_driver_capabilities; } - -/** - * @fn int32_t USBH_HCI_Initialize (ARM_USBH_HCI_Interrupt_t cb_interrupt) - * @brief Initialize USB Host HCI (OHCI/EHCI) Interface. - * @param[in] cb_interrupt : Pointer to Interrupt Handler Routine - * @return \ref execution_status -*/ -static int32_t USBH_HCI_Initialize (ARM_USBH_HCI_Interrupt_t cb_interrupt) { - - if ((USB_state & USBH_DRIVER_INITIALIZED) != 0U) { return ARM_DRIVER_OK; } - - EHCI_IRQ = cb_interrupt; - - USB_role = ARM_USB_ROLE_HOST; - - /*USB_PinsConfigure*/ - RSI_EGPIO_SetPinMux(EGPIO,RTE_USB_OTG_PORT,RTE_USB_OTG_PIN,EGPIO_PIN_MUX_MODE0); - - RSI_EGPIO_SetDir(EGPIO,RTE_USB_OTG_PORT,RTE_USB_OTG_PIN,EGPIO_CONFIG_DIR_OUTPUT); - - RSI_EGPIO_SetPin(EGPIO,RTE_USB_OTG_PORT,RTE_USB_OTG_PIN,RTE_USB_OTG_STATUS_HIGH); - - USB_state = USBH_DRIVER_INITIALIZED; - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBH_HCI_Uninitialize (void) - * @brief De-initialize USB Host HCI (OHCI/EHCI) Interface. - * @return \ref execution_status -*/ -static int32_t USBH_HCI_Uninitialize (void) { - - - USB_role = ARM_USB_ROLE_NONE; - USB_state &= ~USBH_DRIVER_INITIALIZED; - - /*Uninitialize the USB pin configuration*/ - RSI_EGPIO_SetPin(EGPIO,RTE_USB_OTG_MODE,RTE_USB_OTG_PIN,RTE_USB_OTG_STATUS_LOW); - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBH_HCI_PowerControl (ARM_POWER_STATE state) - * @brief Control USB Host HCI (OHCI/EHCI) Interface Power. - * @param[in] state : Power state - * @return \ref execution_status -*/ -static int32_t USBH_HCI_PowerControl (ARM_POWER_STATE state) { - - switch (state) { - case ARM_POWER_OFF: - NVIC_DisableIRQ (USB_IRQn); // Disable interrupt - NVIC_ClearPendingIRQ (USB_IRQn); // Clear pending interrupt - /*USB Host detection disable through software */ - MISC_CFG_HOST_CTRL |=(BIT(14) & (~BIT(12))); - USB_state &= ~USBH_DRIVER_POWERED; // Clear powered flag - break; - - case ARM_POWER_FULL: - if ((USB_state & USBH_DRIVER_INITIALIZED) == 0U) { return ARM_DRIVER_ERROR; } - if ((USB_state & USBH_DRIVER_POWERED) != 0U) { return ARM_DRIVER_OK; } - - /*USB configuration*/ - MISC_USB_CONFIG_REG =0x11; - /*USB Host detection through software */ - MISC_CFG_HOST_CTRL |=(BIT(14) | BIT(12)); - /*USB in m4*/ - NWPAON_ACCESS_CTRL_CLEAR = BIT(4); - /*USB is in soft reset*/ - MISC_USB_SET_REG1 =BIT(0); - /*100ms delay*/ - RSI_DelayUs(100000); - /*USB soft reset release after 100ms*/ - MISC_USB_CLEAR_REG1 =BIT(0); - - USB_state |= USBH_DRIVER_POWERED; // Set powered flag - NVIC_EnableIRQ (USB_IRQn); - - break; - - default: - return ARM_DRIVER_ERROR_UNSUPPORTED; - } - - return ARM_DRIVER_OK; -} - -/** - * @fn int32_t USBH_HCI_PortVbusOnOff (uint8_t port, bool vbus) - * @brief USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. - * @param[in] port : Root HUB Port Number - * @param[in] vbus : - - \b false VBUS off - - \b true VBUS on - \return \ref execution_status -*/ -static int32_t USBH_HCI_PortVbusOnOff (uint8_t port, bool power) { - - /*VBUS signal is controlled by ehci only*/ - if (((1U << port) & usbh_ehci_driver_capabilities.port_mask) == 0U) { return ARM_DRIVER_ERROR; } - return ARM_DRIVER_OK; -} - -/** - * @fn void USBH0_IRQ (void) - * @brief USB0 Host Interrupt Routine (IRQ). -*/ -void USBH_IRQ (void) { - EHCI_IRQ(); -} - -ARM_DRIVER_USBH_HCI Driver_USBH0_HCI = { - USBH_HCI_GetVersion, - USBH_HCI_GetCapabilities, - USBH_HCI_Initialize, - USBH_HCI_Uninitialize, - USBH_HCI_PowerControl, - USBH_HCI_PortVbusOnOff -}; -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_can.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_can.slcc deleted file mode 100644 index b86d70a87..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_can.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: cmsis_can -label: CMSIS CAN -package: platform -description: > - Controller Area Network Driver API's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -component_root_path: "components/device/silabs/si91x/mcu/drivers" -ui_hints: - visibility: never -source: - - path: "cmsis_driver/CAN.c" -include: - - path: "cmsis_driver" - file_list: - - path: "CAN.h" -provides: - - name: cmsis_can \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_emac.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_emac.slcc deleted file mode 100644 index 4f9388f2b..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_emac.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: cmsis_emac -label: CMSIS EMAC -package: platform -description: > - EMAC Driver API's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers" -source: - - path: "cmsis_driver/EMAC.c" -include: - - path: "cmsis_driver" - file_list: - - path: "EMAC.h" -provides: - - name: cmsis_emac \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_mci.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_mci.slcc deleted file mode 100644 index 09b9c868b..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_mci.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: cmsis_mci -label: CMSIS MCI -package: platform -description: > - MCI Driver API's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers" -source: - - path: "cmsis_driver/MCI.c" -include: - - path: "cmsis_driver" - file_list: - - path: "MCI.h" -provides: - - name: cmsis_mci \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_phy_lan.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_phy_lan.slcc deleted file mode 100644 index 3cbcc29fc..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_phy_lan.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: cmsis_phy_lan -label: CMSIS PHY LAN 8742A -package: platform -description: > - CMSIS PHY LAN 8742A Driver API's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers" -source: - - path: "cmsis_driver/PHY_LAN8742A.c" -include: - - path: "cmsis_driver" - file_list: - - path: "PHY_LAN8742A.h" -provides: - - name: cmsis_phy_lan \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usb.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usb.slcc deleted file mode 100644 index 83c3da890..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usb.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: cmsis_usb -label: CMSIS USB -package: platform -description: > - Universal Serial Bus Driver API's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers" -source: - - path: "cmsis_driver/USB.c" -include: - - path: "cmsis_driver" - file_list: - - path: "USB.h" -provides: - - name: cmsis_usb \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbd.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbd.slcc deleted file mode 100644 index 58230c6ba..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbd.slcc +++ /dev/null @@ -1,14 +0,0 @@ -id: cmsis_usbd -label: CMSIS USBD -package: platform -description: > - USBD Driver APIs's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers" -source: - - path: "cmsis_driver/USBD.c" -provides: - - name: cmsis_usbd \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbh.slcc b/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbh.slcc deleted file mode 100644 index 222e0c6f8..000000000 --- a/components/device/silabs/si91x/mcu/drivers/cmsis_driver/component/cmsis_usbh.slcc +++ /dev/null @@ -1,14 +0,0 @@ -id: cmsis_usbh -label: CMSIS USBH -package: platform -description: > - USBH Driver API's -category: Device|Si91x|MCU|Internal|CMSIS Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers" -source: - - path: "cmsis_driver/USBH.c" -provides: - - name: cmsis_usbh \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/component/sl_si91x_button_917.slcc b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/component/sl_si91x_button_917.slcc index 2da60fb7a..3bb447e42 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/component/sl_si91x_button_917.slcc +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/component/sl_si91x_button_917.slcc @@ -14,7 +14,8 @@ instantiable: prefix: instance config_file: - path: "config/sl_si91x_button_pin_config.h" - - path: "config/sl_si91x_button_{{instance}}_config.h" + - path: "config/sl_si91x_button_init_{{instance}}_config.h" + file_id: button_config include: - path: "inc" file_list: diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_init_instance_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_init_instance_config.h new file mode 100644 index 000000000..e2457c339 --- /dev/null +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_init_instance_config.h @@ -0,0 +1,47 @@ +/***************************************************************************/ /** + * @file sl_si91x_button_init_inst_config.h + * @brief Button Driver Configuration + ******************************************************************************* + * # License + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_BUTTON_INIT_INST_CONFIG_H +#define SL_SI91X_BUTTON_INIT_INST_CONFIG_H + +#warning \ + "For an OPN or SoC project, button instance not defined. Installing the [ENABLE USER CONFIGURATION] component or defining USER_CONFIGURATION_ENABLE MACRO to 1 is the first step towards configuring the board macros. Then, define the macros in the header file in accordance with the board connections.." + +#if USER_CONFIGURATION_ENABLE +// <<< Use Configuration Wizard in Context Menu >>> + +// Button Interrupt Configuration +// High level interrupt +// Low level interrupt +// High level and low level interrupt +// Rise edge interrupt +// Fall edge interrupt +// Rise edge and fall edge interrupt +// Default: RISE_EDGE_AND_FALL_EDGE_INTERRUPT +#define SL_BUTTON_CONFIG_BTN0_INTR RISE_EDGE_AND_FALL_EDGE_INTERRUPT + +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> +// SL_SI91X_BUTTON_0 +// $[GPIO_SL_SI91X_BUTTON_0] +#ifndef SL_SI91X_BUTTON_0_PORT +#define SL_SI91X_BUTTON_0_PORT UULP_VBAT +#endif +#ifndef SL_SI91X_BUTTON_0_PIN +#define SL_SI91X_BUTTON_0_PIN 2 +#endif +// [GPIO_SL_SI91X_BUTTON_0]$ +// <<< sl:end pin_tool >>> + +#define SL_BUTTON_BTN0_PIN SL_SI91X_BUTTON_0_PIN +#define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT +#define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER + +#endif // USER_CONFIGURATION_ENABLE +#endif // SL_SI91X_BUTTON_INIT_INST_CONFIG_H diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_pin_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_pin_config.h index b9e2c6548..d51c4cfc8 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_pin_config.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/config/sl_si91x_button_pin_config.h @@ -10,16 +10,21 @@ #define SL_SI91X_BUTTON_PIN_CONFIG_H #include "RTE_Device_917.h" +#include "sl_si91x_button_instances.h" #define SL_SI91x_BUTTON_COUNT (2) +#ifndef SL_SI91X_BUTTON_0_PORT #define SL_BUTTON_BTN0_PIN RTE_BUTTON0_PIN #define SL_BUTTON_BTN0_PORT RTE_BUTTON0_PORT #define SL_BUTTON_BTN0_NUMBER RTE_BUTTON0_NUMBER +#endif +#ifndef SL_SI91X_BUTTON_1_PORT #define SL_BUTTON_BTN1_PIN RTE_BUTTON1_PIN #define SL_BUTTON_BTN1_PORT RTE_BUTTON1_PORT #define SL_BUTTON_BTN1_NUMBER RTE_BUTTON1_NUMBER #define SL_BUTTON_BTN1_PAD RTE_BUTTON1_PAD +#endif #endif // SL_SI91X_BUTTON_PIN_CONFIG_H \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.c.jinja b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.c.jinja index 307cceff8..3c6802205 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.c.jinja +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.c.jinja @@ -30,9 +30,6 @@ #include "sl_si91x_button_pin_config.h" #include "sl_si91x_button_instances.h" -{% for inst in simple_button_instance -%} -#include "sl_si91x_button_{{ inst | lower }}_config.h" -{% endfor %} {%- for inst in simple_button_instance | sort %} sl_button_t const button_{{ inst | lower }} = { diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.h.jinja b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.h.jinja index a18fdcac2..b8b89eaed 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.h.jinja +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inst/sl_si91x_button_instances.h.jinja @@ -32,6 +32,9 @@ #define SL_SI91X_BUTTON_INSTANCES_H #include "sl_si91x_button.h" +{% for inst in simple_button_instance -%} +#include "sl_si91x_button_init_{{ inst | lower }}_config.h" +{% endfor %} {% for inst in simple_button_instance -%} extern const sl_button_t button_{{ inst | lower }}; diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/src/sl_si91x_button.c b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/src/sl_si91x_button.c index 7dc7817e9..557e7adcd 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/src/sl_si91x_button.c +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/src/sl_si91x_button.c @@ -22,6 +22,7 @@ #include "sl_common.h" #include "sl_si91x_button.h" #include "sl_si91x_button_pin_config.h" +#include "sl_si91x_button_instances.h" #include "si91x_device.h" #include "sl_driver_gpio.h" #include "sl_si91x_driver_gpio.h" diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/component/sl_icm40627.slcc b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/component/sl_icm40627.slcc index 67bfb2dfc..634d2b912 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/component/sl_icm40627.slcc +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/component/sl_icm40627.slcc @@ -6,6 +6,9 @@ description: > category: Device|Si91x|MCU|Hardware quality: production component_root_path: "components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627" +config_file: + - path: config/sl_si91x_icm40627_config.h + file_id: icm40627_config source: - path: "src/sl_si91x_icm40627.c" include: diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/config/sl_si91x_icm40627_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/config/sl_si91x_icm40627_config.h new file mode 100644 index 000000000..ffc294c69 --- /dev/null +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/config/sl_si91x_icm40627_config.h @@ -0,0 +1,43 @@ +/***************************************************************************/ /** +* @file sl_si91x_icm40627_config.h +* * @brief SSI Master/Slave API configuration +* ******************************************************************************* +* * # License +* * Copyright 2023 Silicon Laboratories Inc. www.silabs.com +* ******************************************************************************* +* * +* * SPDX-License-Identifier: Zlib +* * +* * The licensor of this software is Silicon Laboratories Inc. +* * +* * This software is provided 'as-is', without any express or implied +* * warranty. In no event will the authors be held liable for any damages +* * arising from the use of this software. +* * +* * Permission is granted to anyone to use this software for any purpose, +* * including commercial applications, and to alter it and redistribute it +* * freely, subject to the following restrictions: +* * +* * 1. The origin of this software must not be misrepresented; you must not +* * claim that you wrote the original software. If you use this software +* * in a product, an acknowledgment in the product documentation would be +* * appreciated but is not required. +* * 2. Altered source versions must be plainly marked as such, and must not be +* * misrepresented as being the original software. +* * 3. This notice may not be removed or altered from any source distribution. +* * +* ******************************************************************************/ + +#ifndef SL_SI91X_ICM40627_CONFIG_H +#define SL_SI91X_ICM40627_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#warning "ICM40267 is not supported on this board" + +#ifdef __cplusplus +} +#endif +#endif /* SL_SI91X_ICM40627_CONFIG_H */ diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/src/sl_si91x_icm40627.c b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/src/sl_si91x_icm40627.c index a1c0d7646..e3f230ec9 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/src/sl_si91x_icm40627.c +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/icm40627/src/sl_si91x_icm40627.c @@ -691,7 +691,7 @@ sl_status_t sl_si91x_icm40627_calibrate_accel_and_gyro(sl_ssi_handle_t ssi_drive icm40627_read_register(ssi_driver_handle, SL_ICM40627_REG_OFFSET_USER1, data, sizeof(data)); uint8_t temp = data[1]; gyro_bias_stored[0] |= (int16_t)((temp & 0x0F) << 8); - gyro_bias_stored[1] = (int16_t)((temp & 0xF0) << 8); + gyro_bias_stored[1] = (int16_t)((temp & 0xF0) << 4); icm40627_read_register(ssi_driver_handle, SL_ICM40627_REG_OFFSET_USER2, data, sizeof(data)); gyro_bias_stored[1] |= (int16_t)data[1]; @@ -721,7 +721,7 @@ sl_status_t sl_si91x_icm40627_calibrate_accel_and_gyro(sl_ssi_handle_t ssi_drive /* Subtract from the factory calibration value */ /* Read factory accelerometer trim values */ - accel_bias_factory[0] = (int16_t)((temp & 0xF0) << 8); + accel_bias_factory[0] = (int16_t)((temp & 0xF0) << 4); icm40627_read_register(ssi_driver_handle, SL_ICM40627_REG_OFFSET_USER5, data, sizeof(data)); accel_bias_factory[0] |= (int16_t)data[1]; @@ -731,7 +731,7 @@ sl_status_t sl_si91x_icm40627_calibrate_accel_and_gyro(sl_ssi_handle_t ssi_drive icm40627_read_register(ssi_driver_handle, SL_ICM40627_REG_OFFSET_USER7, data, sizeof(data)); temp = data[1]; accel_bias_factory[1] |= (int16_t)((temp & 0x0F) << 8); - accel_bias_factory[2] = (int16_t)((temp & 0xF0) << 8); + accel_bias_factory[2] = (int16_t)((temp & 0xF0) << 4); icm40627_read_register(ssi_driver_handle, SL_ICM40627_REG_OFFSET_USER8, data, sizeof(data)); accel_bias_factory[2] |= (int16_t)data[1]; @@ -741,15 +741,15 @@ sl_status_t sl_si91x_icm40627_calibrate_accel_and_gyro(sl_ssi_handle_t ssi_drive accel_bias_factory[2] -= ((accel_bias[2] / 8) & ~1); /* Split the values into two bytes */ - data[0] = gyro_bias_stored[0] >> 8; - data[1] = (((gyro_bias_stored[0]) & 0xF0) >> 8) | ((gyro_bias_stored[1]) & 0xF0); - data[2] = gyro_bias_stored[1] >> 8; - data[3] = gyro_bias_stored[2] >> 8; - data[4] = (((gyro_bias_stored[2]) & 0xF0) >> 8) | ((accel_bias_factory[0]) & 0xF0); - data[5] = accel_bias_factory[0] >> 8; - data[6] = accel_bias_factory[1] >> 8; - data[7] = (((accel_bias_factory[2]) & 0xF0) >> 8) | ((accel_bias_factory[1]) & 0xF0); - data[8] = accel_bias_factory[2] >> 8; + data[0] = gyro_bias_stored[0] & 0xFF; + data[1] = ((gyro_bias_stored[0]) >> 8) | ((gyro_bias_stored[1] >> 4) & 0xF0); + data[2] = gyro_bias_stored[1] & 0xFF; + data[3] = gyro_bias_stored[2] & 0xFF; + data[4] = ((gyro_bias_stored[2]) >> 8) | ((accel_bias_factory[0] >> 4) & 0xF0); + data[5] = accel_bias_factory[0] & 0xFF; + data[6] = accel_bias_factory[1] & 0xFF; + data[7] = (((accel_bias_factory[1])) >> 8) | ((accel_bias_factory[2] >> 4) & 0xF0); + data[8] = accel_bias_factory[2] & 0xFF; /* Write the gyro and accel bias values to the chip */ icm40627_write_register(ssi_driver_handle, SL_ICM40627_REG_OFFSET_USER0, &data[0], 1); diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/component/sl_si91x_led_917.slcc b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/component/sl_si91x_led_917.slcc index aeb5a51bf..86c43f882 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/component/sl_si91x_led_917.slcc +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/component/sl_si91x_led_917.slcc @@ -9,35 +9,80 @@ description: > Instances should be named as 'led0' or 'led1'. category: Device|Si91x|MCU|Hardware quality: production -component_root_path: "components/device/silabs/si91x/mcu/drivers/hardware_drivers/led" +component_root_path: "components/device/silabs/si91x/mcu/drivers/hardware_drivers" instantiable: prefix: instance config_file: - - path: "config/sl_si91x_led_config.h" + - path: "led/config/sl_si91x_led_init_{{instance}}_config.h" + file_id: led_config + unless: [si917_dev_board] + - path: "led/config/sl_si91x_led_config.h" + unless: [si917_dev_board] + - path: "rgb_led/config/sl_si91x_rgb_led_config.h" + condition: [si917_dev_board] include: - - path: inc + - path: led/inc file_list: - path: sl_si91x_led.h + unless: [si917_dev_board] + - path: rgb_led/inc + file_list: + - path: sl_si91x_rgb_led.h + condition: [si917_dev_board] source: - - path: src/sl_si91x_led.c + - path: led/src/sl_si91x_led.c + unless: [si917_dev_board] + - path: rgb_led/src/sl_si91x_rgb_led.c + condition: [si917_dev_board] requires: - name: sl_gpio + - name: sleeptimer + condition: [si917_dev_board] provides: - name: sl_si91x_led_917 template_file: - - path: "inst/sl_si91x_led_instances.c.jinja" - - path: "inst/sl_si91x_led_instances.h.jinja" + - path: "led/inst/sl_si91x_led_instances.c.jinja" + unless: [si917_dev_board] + - path: "led/inst/sl_si91x_led_instances.h.jinja" + unless: [si917_dev_board] + - path: "rgb_led/inst/sl_si91x_rgb_led_instances.c.jinja" + condition: [si917_dev_board] + - path: "rgb_led/inst/sl_si91x_rgb_led_instances.h.jinja" + condition: [si917_dev_board] template_contribution: - name: simple_led_instance value: "{{instance}}" + unless: [si917_dev_board] - name: component_catalog value: "{{instance}}" + unless: [si917_dev_board] - name: component_catalog value: simple_led + unless: [si917_dev_board] - name: component_catalog value: "simple_led_{{instance}}" + unless: [si917_dev_board] - name: event_handler value: event: driver_init include: sl_si91x_led_instances.h - handler: led_init_instances \ No newline at end of file + handler: led_init_instances + unless: [si917_dev_board] + - name: event_handler + value: + event: driver_init + include: sl_si91x_rgb_led_instances.h + handler: rgb_led_init_instances + condition: [si917_dev_board] + - name: led_instance + value: "{{instance}}" + condition: [si917_dev_board] + - name: component_catalog + value: "{{instance}}" + condition: [si917_dev_board] + - name: component_catalog + value: led + condition: [si917_dev_board] + - name: component_catalog + value: "led_{{instance}}" + condition: [si917_dev_board] diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_config.h index 8f1427463..419ec7fb3 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_config.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_config.h @@ -10,27 +10,21 @@ #define SL_SI91X_LED_CONFIG_H #include "RTE_Device_917.h" +#include "sl_si91x_led_instances.h" #define SL_SI91x_LED_COUNT 2 -#ifndef SI917_DEVKIT - +#ifndef SL_SI91X_LED_0_PORT #define SL_LED_LED0_PIN RTE_LED0_PIN #define SL_LED_LED0_PORT RTE_LED0_PORT #define SL_LED_LED0_NUMBER RTE_LED0_NUMBER +#endif +#ifndef SL_SI91X_LED_1_PORT #define SL_LED_LED1_PIN RTE_LED1_PIN #define SL_LED_LED1_PORT RTE_LED1_PORT #define SL_LED_LED1_NUMBER RTE_LED1_NUMBER #define SL_LED_LED1_PAD RTE_LED1_PAD - -#else - -#define SL_LED_LEDB_PIN RTE_LEDB_PIN -#define SL_LED_LEDB_PORT RTE_LEDB_PORT -#define SL_LED_LEDB_NUMBER RTE_LEDB_NUMBER -#define SL_LED_LEDB_PAD RTE_LEDB_PAD - #endif #endif // SL_SI91X_LED_CONFIG_H diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_init_instance_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_init_instance_config.h new file mode 100644 index 000000000..761178a31 --- /dev/null +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/config/sl_si91x_led_init_instance_config.h @@ -0,0 +1,49 @@ +/***************************************************************************/ /** + * @file sl_si91x_led_init_inst_config.h + * @brief Led Driver Configuration + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + *******************************************************************************/ + +#ifndef SL_SI91X_LED_INIT_INST_CONFIG_H +#define SL_SI91X_LED_INIT_INST_CONFIG_H + +#warning "Simple LED Driver GPIO pins not configured-Appropriate pins should be selected for OPN" + +#if USER_CONFIGURATION_ENABLE +#ifdef SL_SI91X_ACX_MODULE +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_0 +// $[GPIO_SL_SI91X_LED_0] +#ifndef SL_SI91X_LED_0_PORT +#define SL_SI91X_LED_0_PORT ULP +#endif +#ifndef SL_SI91X_LED_0_PIN +#define SL_SI91X_LED_0_PIN 0 +#endif +// [GPIO_SL_SI91X_LED_0]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED0_PIN SL_SI91X_LED_0_PIN +#define SL_LED_LED0_PORT RTE_LED0_PORT +#define SL_LED_LED0_NUMBER RTE_LED0_NUMBER +#else +// <<< sl:start pin_tool >>> +// SL_SI91X_LED_1 +// $[GPIO_SL_SI91X_LED_1] +#ifndef SL_SI91X_LED_1_PORT +#define SL_SI91X_LED_1_PORT ULP +#endif +#ifndef SL_SI91X_LED_1_PIN +#define SL_SI91X_LED_1_PIN 2 +#endif +// [GPIO_SL_SI91X_LED_1]$ +// <<< sl:end pin_tool >>> + +#define SL_LED_LED1_PIN SL_SI91X_LED_1_PIN +#define SL_LED_LED1_PORT RTE_LED1_PORT +#define SL_LED_LED1_NUMBER RTE_LED1_NUMBER +#endif // SL_SI91X_ACX_MODULE +#endif // USER_CONFIGURATION_ENABLE +#endif // SL_SI91X_LED_INIT_INST_CONFIG_H \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inc/sl_si91x_led.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inc/sl_si91x_led.h index afe566d69..22c09385c 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inc/sl_si91x_led.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inc/sl_si91x_led.h @@ -18,9 +18,9 @@ #ifndef __SL_SI91X_LED_H__ #define __SL_SI91X_LED_H__ -#include "sl_si91x_led_config.h" #include #include +#include "sl_si91x_led_instances.h" /** * @addtogroup LED LED @@ -28,19 +28,6 @@ * @{ */ -/** - * @brief Structure representing an LED configuration. - * - * This structure contains the configuration parameters for an LED, including - * the port and pin numbers, as well as an identifier for the LED. It is used - * to initialize and control the LED hardware. - */ -typedef struct { - uint8_t pin; ///< Pin number of the LED. - uint8_t port; ///< Port number of the LED. - uint8_t led_number; ///< LED number for identification. -} sl_led_t; - /***************************************************************************/ /** * @brief To configure GPIOs pertaining to the control of LEDs and initializes the selected LED GPIO and mode. @@ -48,7 +35,7 @@ typedef struct { * @details This API initializes the selected GPIOs, sets their operation modes, and configures them for controlling the LEDs. * It ensures that the GPIOs are properly configured to drive the LEDs as per the specified settings in the handle. * - * @param[in] handle The pointer to an @ref sl_led_t structure that contains the specific LED information. + * @param[in] handle The pointer to an sl_led_t structure that contains the specific LED information. * * @pre The GPIO peripheral must be enabled and clocked before calling this function. * @post The specified GPIO pin will be configured and set to the initial state as defined in the handle. @@ -127,8 +114,8 @@ void sl_si91x_led_StackIndicateActivity(bool turnOn); * * @section led_config Configuration * -* All LED instances are configured with an @ref sl_led_t struct. This struct along with a function definition for initializing LED is automatically generated when an LED is set up using Simplicity Studio's wizard. -* This struct @ref sl_led_t struct is automatically generated into the following files sl_si91x_led_instances.h and sl_si91x_led_instances.c. +* All LED instances are configured with an sl_led_t struct. This struct along with a function definition for initializing LED is automatically generated when an LED is set up using Simplicity Studio's wizard. +* This struct sl_led_t struct is automatically generated into the following files sl_si91x_led_instances.h and sl_si91x_led_instances.c. * The samples below are for a single instance called "led0". * * @code{.c} diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.c.jinja b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.c.jinja index 44551fe01..8ee560663 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.c.jinja +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.c.jinja @@ -28,9 +28,9 @@ * ******************************************************************************/ -#include "sl_si91x_led.h" #include "sl_si91x_led_config.h" #include "sl_si91x_led_instances.h" +#include "sl_si91x_led.h" {%- for inst in simple_led_instance | sort %} sl_led_t const led_{{ inst | lower }} = { diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.h.jinja b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.h.jinja index fb94da953..391f8dd16 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.h.jinja +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/inst/sl_si91x_led_instances.h.jinja @@ -31,7 +31,16 @@ #ifndef SL_SI91x_LED_INSTANCES_H #define SL_SI91x_LED_INSTANCES_H -#include "sl_si91x_led.h" +#include +{% for inst in simple_led_instance | sort -%} +#include "sl_si91x_led_init_{{ inst }}_config.h" +{% endfor %} + +typedef struct { + uint8_t pin; ///< Pin number of the LED. + uint8_t port; ///< Port number of the LED. + uint8_t led_number; ///< LED number for identification. +} sl_led_t; {% for inst in simple_led_instance -%} extern const sl_led_t led_{{ inst | lower }}; diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/src/sl_si91x_led.c b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/src/sl_si91x_led.c index fd5ac2559..76c6c96e9 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/src/sl_si91x_led.c +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/src/sl_si91x_led.c @@ -18,10 +18,10 @@ #include "si91x_device.h" #include "sl_driver_gpio.h" #include "sl_si91x_driver_gpio.h" +#include "sl_si91x_led_config.h" void sl_si91x_led_init(const sl_led_t *handle) { -#ifndef SI917_DEVKIT if (handle->led_number == 0U) { /*Enable clock*/ sl_si91x_gpio_driver_enable_clock((sl_si91x_gpio_select_clock_t)ULPCLK_GPIO); @@ -29,10 +29,6 @@ void sl_si91x_led_init(const sl_led_t *handle) /*Enable clock*/ sl_si91x_gpio_driver_enable_clock((sl_si91x_gpio_select_clock_t)M4CLK_GPIO); } -#else - /*Enable clock*/ - sl_si91x_gpio_driver_enable_clock((sl_si91x_gpio_select_clock_t)M4CLK_GPIO); -#endif sl_si91x_gpio_pin_config_t sl_gpio_pin_config = { { handle->port, handle->pin }, GPIO_OUTPUT }; sl_gpio_set_configuration(sl_gpio_pin_config); } @@ -41,48 +37,34 @@ void sl_si91x_led_set(uint8_t pin) { sl_gpio_t led_gpio_port_pin; led_gpio_port_pin.pin = pin; -#ifndef SI917_DEVKIT if (pin == SL_LED_LED0_PIN) { led_gpio_port_pin.port = SL_LED_LED0_PORT; } else { led_gpio_port_pin.port = SL_LED_LED1_PORT; } sl_gpio_driver_set_pin(&led_gpio_port_pin); -#else - led_gpio_port_pin.port = SL_LED_LEDB_PORT; - sl_gpio_driver_clear_pin(&led_gpio_port_pin); -#endif } void sl_si91x_led_clear(uint8_t pin) { sl_gpio_t led_gpio_port_pin; led_gpio_port_pin.pin = pin; -#ifndef SI917_DEVKIT if (pin == SL_LED_LED0_PIN) { led_gpio_port_pin.port = SL_LED_LED0_PORT; } else { led_gpio_port_pin.port = SL_LED_LED1_PORT; } sl_gpio_driver_clear_pin(&led_gpio_port_pin); -#else - led_gpio_port_pin.port = SL_LED_LEDB_PORT; - sl_gpio_driver_set_pin(&led_gpio_port_pin); -#endif } void sl_si91x_led_toggle(uint8_t pin) { sl_gpio_t led_gpio_port_pin; led_gpio_port_pin.pin = pin; -#ifndef SI917_DEVKIT if (pin == SL_LED_LED0_PIN) { led_gpio_port_pin.port = SL_LED_LED0_PORT; } else { led_gpio_port_pin.port = SL_LED_LED1_PORT; } -#else - led_gpio_port_pin.port = SL_LED_LEDB_PORT; -#endif sl_gpio_driver_toggle_pin(&led_gpio_port_pin); } diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/component/memlcd_917.slcc b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/component/memlcd_917.slcc index 110215522..e39048b43 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/component/memlcd_917.slcc +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/component/memlcd_917.slcc @@ -6,6 +6,9 @@ description: > category: Device|Si91x|MCU|Hardware quality: production component_root_path: "components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd" +config_file: + - path: config/sl_si91x_memlcd_config.h + file_id: memlcd_config include: - path: inc file_list: diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/config/sl_si91x_memlcd_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/config/sl_si91x_memlcd_config.h new file mode 100644 index 000000000..4a6c8c29f --- /dev/null +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/config/sl_si91x_memlcd_config.h @@ -0,0 +1,112 @@ +/***************************************************************************/ /** +* @file sl_si91x_memlcd_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_MEMLCD_CONFIG_H +#define SL_SI91X_MEMLCD_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif +#warning \ + "For an OPN or SoC project, memlcd instances not defined. Installing the [ENABLE USER CONFIGURATION] component or defining USER_CONFIGURATION_ENABLE MACRO to 1 is the first step towards configuring the board macros. Then, define the macros in the header file in accordance with the board connections.." + +#if USER_CONFIGURATION_ENABLE +// <<< sl:start pin_tool >>> +// SL_MEMLCD +// $[SSI_SL_MEMLCD] +#ifndef SL_MEMLCD_PERIPHERAL +#define SL_MEMLCD_PERIPHERAL ULP_SSI +#endif + +// ULP_SSI MOSI_ on ULP_GPIO_1/GPIO_65 +#ifndef SL_MEMLCD_MOSI__PORT +#define SL_MEMLCD_MOSI__PORT ULP +#endif +#ifndef SL_MEMLCD_MOSI__PIN +#define SL_MEMLCD_MOSI__PIN 1 +#endif +#ifndef SL_MEMLCD_MOSI_LOC +#define SL_MEMLCD_MOSI_LOC 0 +#endif + +// ULP_SSI SCK_ on ULP_GPIO_8/GPIO_72 +#ifndef SL_MEMLCD_SCK__PORT +#define SL_MEMLCD_SCK__PORT ULP +#endif +#ifndef SL_MEMLCD_SCK__PIN +#define SL_MEMLCD_SCK__PIN 8 +#endif +#ifndef SL_MEMLCD_SCK_LOC +#define SL_MEMLCD_SCK_LOC 7 +#endif + +// ULP_SSI CS0_ on ULP_GPIO_10/GPIO_74 +#ifndef SL_MEMLCD_CS0__PORT +#define SL_MEMLCD_CS0__PORT ULP +#endif +#ifndef SL_MEMLCD_CS0__PIN +#define SL_MEMLCD_CS0__PIN 10 +#endif +#ifndef SL_MEMLCD_CS0_LOC +#define SL_MEMLCD_CS0_LOC 9 +#endif +// [SSI_SL_MEMLCD]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_ENABLE +// $[GPIO_SL_MEMLCD_DISP_ENABLE] +#ifndef SL_MEMLCD_DISP_ENABLE_PORT +#define SL_MEMLCD_DISP_ENABLE_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_ENABLE_PIN +#define SL_MEMLCD_DISP_ENABLE_PIN 0 +#endif +// [GPIO_SL_MEMLCD_DISP_ENABLE]$ +// <<< sl:end pin_tool >>> + +// <<< sl:start pin_tool >>> +// SL_MEMLCD_DISP_EXT_COMIN +// $[GPIO_SL_MEMLCD_DISP_EXT_COMIN] +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PORT +#define SL_MEMLCD_DISP_EXT_COMIN_PORT UULP_VBAT +#endif +#ifndef SL_MEMLCD_DISP_EXT_COMIN_PIN +#define SL_MEMLCD_DISP_EXT_COMIN_PIN 3 +#endif +// [GPIO_SL_MEMLCD_DISP_EXT_COMIN]$ +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif +#endif // SL_SI91X_MEMLCD_CONFIG_H +#endif // USER_CONFIGURATION_ENABLE \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/inc/sl_memlcd.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/inc/sl_memlcd.h index 697b9ac27..a7a8891a6 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/inc/sl_memlcd.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/inc/sl_memlcd.h @@ -75,30 +75,37 @@ typedef struct sl_memlcd_t { * - SL_STATUS_FAIL (0x0001) - Failure. ******************************************************************************/ sl_status_t sl_memlcd_configure(struct sl_memlcd_t *device); - /***************************************************************************/ /** - * @brief Enables the memory LCD display. - * - * @details This API enables the memory LCD display. It must be called to enable the MEMLCD display. - ******************************************************************************/ + * @brief To enable the memory LCD display. + * + * @details This API must be called to enable MEMLCD display. +******************************************************************************/ void sl_memlcd_display_enable(void); /***************************************************************************/ /** - * @brief Enables or disables the display. - * + * @brief To disable the memory LCD display. + * + * @details This API must be called to disable MEMLCD display. +******************************************************************************/ +void sl_memlcd_display_disable(void); + +/***************************************************************************/ +/** + * @brief To enable or disable the display. + * * @details This API enables or disables the display. Disabling the display * does not result in data loss. Note that this API does not control the * DISP pin on the display. This pin is managed by board-specific code. - * - * @param[in] device Memory LCD Display device pointer. - * @param[in] on Boolean value to enable (true) or disable (false) the display. - * - * @return Status code of the operation: - * - SL_STATUS_OK (0x0000) - Success. - * - SL_STATUS_FAIL (0x0001) - Failure. - ******************************************************************************/ + * + * @param[in] device Display device pointer. + * + * @param[in] on Set this parameter to 'true' to enable the display. Set to 'false' in + * order to disable the display. + * + * @return status code of the operation. +******************************************************************************/ sl_status_t sl_memlcd_power_on(const struct sl_memlcd_t *device, bool on); @@ -182,20 +189,20 @@ const sl_memlcd_t *sl_memlcd_get(void); * * @details * -* @section MEMLCD_Custom Custom-Memory-LCD +* @n @section MEMLCD_Custom Custom-Memory-LCD * -* - The custom memory LCD module provides a way to add support for an LCD driver -* - that is incompatible with existing interfaces. -* - To accomplish this, the following conditions must be fulfilled. +* The custom memory LCD module enables the implementation of an +* LCD driver that is incompatible with existing interfaces. To +* accomplish this, the following conditions must be fulfilled. * * The LCD driver and the communication needs to be implemented manually. * However, some APIs must be implemented and the @ref sl_memlcd_t * structure must be initialized for the GLIB library to work properly. -* The APIs to implement are [sl_memlcd_init](https://docs.silabs.com/gecko-platform/latest/platform-hardware-driver/memlcd#sl-memlcd-init), @ref sl_memlcd_power_on, +* The APIs to implement are [sl_memlcd_init](https://docs.silabs.com/gecko-platform/5.0.1/platform-hardware-driver/memlcd#sl-memlcd-init), @ref sl_memlcd_power_on, * @ref sl_memlcd_draw and @ref sl_memlcd_get and they must follow the same * declaration as shown in the documentation. * -* In the [sl_memlcd_init](https://docs.silabs.com/gecko-platform/latest/platform-hardware-driver/memlcd#sl-memlcd-init) API, it is important to initialize a +* In the [sl_memlcd_init](https://docs.silabs.com/gecko-platform/5.0.1/platform-hardware-driver/memlcd#sl-memlcd-init) API, it is important to initialize a * @ref sl_memlcd_t type variable and fill in the "height" and "width" fields * with the real specifications of the LCD display. This same variable must be * accessible from the @ref sl_memlcd_get API as the GLIB library will @@ -205,7 +212,6 @@ const sl_memlcd_t *sl_memlcd_get(void); * custom structure needed for the implementation of the driver. * * @} end group MEMLCD ********************************************************/ - #ifdef __cplusplus } #endif diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/src/sl_memlcd.c b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/src/sl_memlcd.c index 1ad80eb71..6359e8176 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/src/sl_memlcd.c +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/memlcd/src/sl_memlcd.c @@ -115,11 +115,20 @@ sl_status_t sl_memlcd_configure(struct sl_memlcd_t *device) sl_gpio_clear_pin_output(EGPIO_ULP_PORT, SL_MEMLCD_SPI_CS_PIN); #if defined(SL_MEMLCD_EXTCOMIN_PORT) +#if (SL_SI91X_ACX_MODULE == 1) + /* Setup GPIOs */ + sl_gpio_set_pin_mode(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN, SL_GPIO_MODE_0, 0); + // Set output direction + sl_si91x_gpio_set_pin_direction(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN, GPIO_OUTPUT); + //clearing the GPIO pin + sl_gpio_clear_pin_output(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN); +#else // NPSS GPIO sl_si91x_gpio_select_uulp_npss_receiver(SL_MEMLCD_EXTCOMIN_PIN, GPIO_RECEIVER_EN); sl_si91x_gpio_set_uulp_npss_pin_mux(SL_MEMLCD_EXTCOMIN_PIN, NPSS_GPIO_PIN_MUX_MODE0); sl_si91x_gpio_set_uulp_npss_direction(SL_MEMLCD_EXTCOMIN_PIN, GPIO_OUTPUT); sl_si91x_gpio_set_uulp_npss_pin_value(SL_MEMLCD_EXTCOMIN_PIN, GPIO_PIN_CLEAR); +#endif #endif memlcd_instance = *device; @@ -139,12 +148,35 @@ sl_status_t sl_memlcd_refresh(const struct sl_memlcd_t *device) void sl_memlcd_display_enable(void) { // Enabling LCD display + //enable the display pin in reciever mode sl_si91x_gpio_select_uulp_npss_receiver(SL_BOARD_ENABLE_DISPLAY_PIN, GPIO_RECEIVER_EN); + + //set the pin mux mode sl_si91x_gpio_set_uulp_npss_pin_mux(SL_BOARD_ENABLE_DISPLAY_PIN, NPSS_GPIO_PIN_MUX_MODE0); + + // set the direction of the display pin in UULP GPIO instance sl_si91x_gpio_set_uulp_npss_direction(SL_BOARD_ENABLE_DISPLAY_PIN, GPIO_OUTPUT); + + //set the display pin in UULP GPIO instance sl_si91x_gpio_set_uulp_npss_pin_value(SL_BOARD_ENABLE_DISPLAY_PIN, GPIO_PIN_SET); } +void sl_memlcd_display_disable(void) +{ + // Disabling LCD display + //enable the display pin in reciever mode + sl_si91x_gpio_select_uulp_npss_receiver(SL_BOARD_ENABLE_DISPLAY_PIN, GPIO_RECEIVER_EN); + + //set the pin mux mode + sl_si91x_gpio_set_uulp_npss_pin_mux(SL_BOARD_ENABLE_DISPLAY_PIN, NPSS_GPIO_PIN_MUX_MODE0); + + // set the direction of the display pin in UULP GPIO instance + sl_si91x_gpio_set_uulp_npss_direction(SL_BOARD_ENABLE_DISPLAY_PIN, GPIO_OUTPUT); + + //clear the display pin in UULP GPIO instance + sl_si91x_gpio_set_uulp_npss_pin_value(SL_BOARD_ENABLE_DISPLAY_PIN, GPIO_PIN_CLEAR); +} + sl_status_t sl_memlcd_power_on(const struct sl_memlcd_t *device, bool on) { (void)device; @@ -301,11 +333,20 @@ sl_status_t sl_memlcd_post_wakeup_init(void) sl_gpio_clear_pin_output(EGPIO_ULP_PORT, SL_MEMLCD_SPI_CS_PIN); #if defined(SL_MEMLCD_EXTCOMIN_PORT) +#if (SL_SI91X_ACX_MODULE == 1) + /* Setup GPIOs */ + sl_gpio_set_pin_mode(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN, SL_GPIO_MODE_0, 0); + // Set output direction + sl_si91x_gpio_set_pin_direction(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN, GPIO_OUTPUT); + //clearing the GPIO pin + sl_gpio_clear_pin_output(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN); +#else // NPSS GPIO sl_si91x_gpio_select_uulp_npss_receiver(SL_MEMLCD_EXTCOMIN_PIN, GPIO_RECEIVER_EN); sl_si91x_gpio_set_uulp_npss_pin_mux(SL_MEMLCD_EXTCOMIN_PIN, NPSS_GPIO_PIN_MUX_MODE0); sl_si91x_gpio_set_uulp_npss_direction(SL_MEMLCD_EXTCOMIN_PIN, GPIO_OUTPUT); sl_si91x_gpio_set_uulp_npss_pin_value(SL_MEMLCD_EXTCOMIN_PIN, GPIO_PIN_CLEAR); +#endif #endif status = sl_memlcd_power_on(memlcd_post_wakeup_handle, true); @@ -337,10 +378,25 @@ static void extcomin_toggle(sl_sleeptimer_timer_handle_t *handle, void *data) { (void)handle; (void)data; + +#if (SL_SI91X_ACX_MODULE == 1) + /* Setup GPIOs */ + sl_gpio_set_pin_mode(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN, SL_GPIO_MODE_0, 0); + // Set output direction + sl_si91x_gpio_set_pin_direction(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN, GPIO_OUTPUT); + if (sl_gpio_get_pin_input(SL_GPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN) == true) { + //clearing the GPIO pin + sl_gpio_clear_pin_output(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN); + } else { + //clearing the GPIO pin + sl_gpio_set_pin_output(EGPIO_ULP_PORT, SL_MEMLCD_EXTCOMIN_PIN); + } +#else if (sl_si91x_gpio_get_uulp_npss_pin(SL_MEMLCD_EXTCOMIN_PIN) == true) { sl_si91x_gpio_set_uulp_npss_pin_value(SL_MEMLCD_EXTCOMIN_PIN, GPIO_PIN_CLEAR); } else { sl_si91x_gpio_set_uulp_npss_pin_value(SL_MEMLCD_EXTCOMIN_PIN, GPIO_PIN_SET); } +#endif } #endif \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/component/sl_si91x_rgb_led_917.slcc b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/component/sl_si91x_rgb_led_917.slcc index 34d92a52f..d4a85dfb6 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/component/sl_si91x_rgb_led_917.slcc +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/component/sl_si91x_rgb_led_917.slcc @@ -6,6 +6,9 @@ description: > This driver supports controlling GPIO-based on/off type RGB LEDs. This component is instantiable, meaning that several named instances can be created. For each instance a configuration is generated along with an initialization struct set according to this configuration. + This driver file is now deprecated. + To ensure future-proofing and compatibility with upcoming features, + users are encouraged to migrate to the LED driver by taking reference from the sl_si91x_rgb_led application. category: Device|Si91x|MCU|Hardware quality: production component_root_path: "components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led" @@ -13,6 +16,7 @@ instantiable: prefix: instance config_file: - path: "config/sl_si91x_rgb_led_config.h" + unless: [sl_si91x_led_917] include: - path: inc file_list: @@ -21,22 +25,33 @@ source: - path: src/sl_si91x_rgb_led.c requires: - name: sl_gpio + - name: sleeptimer provides: - name: sl_si91x_rgb_led_917 +define: + - name: SI917_RGB_DRIVER_OLD + value: '1' template_file: - path: "inst/sl_si91x_rgb_led_instances.c.jinja" + unless: [sl_si91x_led_917] - path: "inst/sl_si91x_rgb_led_instances.h.jinja" + unless: [sl_si91x_led_917] template_contribution: - name: led_instance value: "{{instance}}" + unless: [sl_si91x_led_917] - name: component_catalog value: "{{instance}}" + unless: [sl_si91x_led_917] - name: component_catalog value: led + unless: [sl_si91x_led_917] - name: component_catalog value: "led_{{instance}}" + unless: [sl_si91x_led_917] - name: event_handler value: event: driver_init include: sl_si91x_rgb_led_instances.h - handler: rgb_led_init_instances \ No newline at end of file + handler: rgb_led_init_instances + unless: [sl_si91x_led_917] diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/config/sl_si91x_rgb_led_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/config/sl_si91x_rgb_led_config.h index c334057d4..be7f19e9c 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/config/sl_si91x_rgb_led_config.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/config/sl_si91x_rgb_led_config.h @@ -11,21 +11,37 @@ #include "RTE_Device_917.h" -#define SL_SI91x_LED_COUNT 2 - -#define SL_LED_RED_PIN RTE_LEDR_PIN -#define SL_LED_RED_PORT RTE_LEDR_PORT -#define SL_LED_RED_NUMBER RTE_LEDR_NUMBER -#define SL_LED_RED_PAD RTE_LEDR_PAD - -#define SL_LED_GREEN_PIN RTE_LEDG_PIN -#define SL_LED_GREEN_PORT RTE_LEDG_PORT -#define SL_LED_GREEN_NUMBER RTE_LEDG_NUMBER -#define SL_LED_GREEN_PAD RTE_LEDG_PAD - -#define SL_LED_BLUE_PIN RTE_LEDB_PIN -#define SL_LED_BLUE_PORT RTE_LEDB_PORT -#define SL_LED_BLUE_NUMBER RTE_LEDB_NUMBER -#define SL_LED_BLUE_PAD RTE_LEDB_PAD +#define SL_SI91X_RGB_LED_COUNT 1 // Define the number of RGB LEDs + +#define SL_LED_LED0_RED_PIN RTE_LED0_LEDR_PIN +#define SL_LED_LED0_RED_PORT RTE_LED0_LEDR_PORT +#define SL_LED_LED0_RED_NUMBER RTE_LED0_LEDR_NUMBER +#define SL_LED_LED0_RED_PAD RTE_LED0_LEDR_PAD + +#define SL_LED_LED0_GREEN_PIN RTE_LED0_LEDG_PIN +#define SL_LED_LED0_GREEN_PORT RTE_LED0_LEDG_PORT +#define SL_LED_LED0_GREEN_NUMBER RTE_LED0_LEDG_NUMBER +#define SL_LED_LED0_GREEN_PAD RTE_LED0_LEDG_PAD + +#define SL_LED_LED0_BLUE_PIN RTE_LED0_LEDB_PIN +#define SL_LED_LED0_BLUE_PORT RTE_LED0_LEDB_PORT +#define SL_LED_LED0_BLUE_NUMBER RTE_LED0_LEDB_NUMBER +#define SL_LED_LED0_BLUE_PAD RTE_LED0_LEDB_PAD + +// To support exisiting RGB LED instances. +#define SL_LED_RED_PIN RTE_LED0_LEDR_PIN +#define SL_LED_RED_PORT RTE_LED0_LEDR_PORT +#define SL_LED_RED_NUMBER RTE_LED0_LEDR_NUMBER +#define SL_LED_RED_PAD RTE_LED0_LEDR_PAD + +#define SL_LED_GREEN_PIN RTE_LED0_LEDG_PIN +#define SL_LED_GREEN_PORT RTE_LED0_LEDG_PORT +#define SL_LED_GREEN_NUMBER RTE_LED0_LEDG_NUMBER +#define SL_LED_GREEN_PAD RTE_LED0_LEDG_PAD + +#define SL_LED_BLUE_PIN RTE_LED0_LEDB_PIN +#define SL_LED_BLUE_PORT RTE_LED0_LEDB_PORT +#define SL_LED_BLUE_NUMBER RTE_LED0_LEDB_NUMBER +#define SL_LED_BLUE_PAD RTE_LED0_LEDB_PAD #endif // SL_SI91X_LED_CONFIG_H diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inc/sl_si91x_rgb_led.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inc/sl_si91x_rgb_led.h index 58ca9179c..f0417f6fe 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inc/sl_si91x_rgb_led.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inc/sl_si91x_rgb_led.h @@ -1,4 +1,5 @@ -/***************************************************************************/ /** +/***************************************************************************/ +/** * @file sl_si91x_rgb_led.h * @brief See @ref led for documentation. ******************************************************************************* @@ -18,7 +19,6 @@ #define __SL_SI91X_RGB_LED_H__ #include "sl_si91x_rgb_led_config.h" -#include #include typedef struct { @@ -28,50 +28,232 @@ typedef struct { uint8_t pad; } sl_led_t; -#define LED_ON 0 -#define LED_OFF 1 - -#define RGB_LED_PORT 0 +typedef struct { + sl_led_t *red; + sl_led_t *green; + sl_led_t *blue; +} sl_rgb_led_t; /** @addtogroup RGB LED * @ingroup SI91X_HARDWARE_DRIVER_APIS - * @brief Sample API funtions for controlling RGB LEDs. + * @brief Sample API functions for controlling RGB LEDs. * * See sl_si91x_led.c for source code. *@{ */ -/** @brief Configures GPIOs pertaining to the control of RGB LEDs. - * - * @param[in] handle The pointer to RGB LED structure that has the specific led information. - */ +/***************************************************************************/ +/** + * @brief Configures GPIOs pertaining to the control of RGB LEDs. + * + * @details This function initializes the GPIOs required to control the RGB LEDs. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @note This function must be called before any other RGB LED control functions. + ******************************************************************************/ +void sl_si91x_simple_rgb_led_init(const sl_rgb_led_t *handle); + +/***************************************************************************/ +/** + * @brief Turns on the RGB LED. + * + * @details This function sets the GPIO pins connected to the specified RGB LED + * and starts the sleeptimer, turning it on. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note Ensure that the GPIO pin is configured correctly before using this function. + ******************************************************************************/ +void sl_si91x_simple_rgb_led_on(const sl_rgb_led_t *handle); + +/***************************************************************************/ +/** + * @brief Turns off (clears) the RGB LED. + * + * @details This function clears the GPIO pins connected to the specified RGB LED + * and stops the sleeptimer, turning it off. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific RGB LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note Ensure that the GPIO pin is configured correctly before using this function. + ******************************************************************************/ +void sl_si91x_simple_rgb_led_off(const sl_rgb_led_t *handle); + +/***************************************************************************/ +/** + * @brief Atomically wraps an XOR or similar operation for the RGB LED. + * + * @details This function performs an atomic XOR operation on the RGB LED, toggling its state. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note Ensure that the GPIO pin is configured correctly before using this function. + ******************************************************************************/ +void sl_si91x_simple_rgb_led_toggle(const sl_rgb_led_t *handle); + +/***************************************************************************/ +/** + * @brief Displays the user-defined color hex code on the RGB LED. + * + * @details This function sets the RGB LED to display the specified color hex code. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @param[in] rgb_colour + * The color hex code to be displayed. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note Ensure that the color hex code is valid and within the acceptable range. + ******************************************************************************/ +void sl_si91x_simple_rgb_led_set_colour(const sl_rgb_led_t *handle, int rgb_colour); + +/***************************************************************************/ +/** + * @brief Returns the current state of the RGB LED. + * + * @details This function retrieves the current state of the specified RGB LED. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific RGB LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @return uint8_t + * The current state of the RGB LED. + * + * @note The returned state indicates whether the RGB LED is on or off. + ******************************************************************************/ +uint8_t sl_si91x_simple_rgb_led_get_current_state(const sl_rgb_led_t *handle); + +/***************************************************************************/ +/** + * @brief Returns the current colour of the RGB LED. + * + * @details This function retrieves the current color values of the specified RGB LED. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific RGB LED information. + * + * @param[out] red + * The pointer to the variable to store the red LED color value. + * + * @param[out] green + * The pointer to the variable to store the green LED color value. + * + * @param[out] blue + * The pointer to the variable to store the blue LED color value. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note Ensure that the pointers for red, green, and blue are valid and not null. + ******************************************************************************/ +void sl_si91x_simple_rgb_led_get_colour(const sl_rgb_led_t *handle, uint16_t *red, uint16_t *green, uint16_t *blue); + +/***************************************************************************/ +/** + * @brief Older API - Not recommended to use. + * + * @details This API is deprecated in favor of the new `sl_si91x_simple_` series of APIs. + * Consider using `sl_si91x_simple_rgb_led_init`. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note This function is deprecated and should be replaced with `sl_si91x_simple_rgb_led_init`. + ******************************************************************************/ void sl_si91x_rgb_led_init(const sl_led_t *handle); -/** @brief Turns on (sets) a GPIO pin connected to an LED so that the RGB LED - * turns on. - * - * @param[in] handle The pointer to RGB LED structure that has the specific led information. - */ +/***************************************************************************/ +/** + * @brief Older API - Not recommended to use. + * + * @details This API is deprecated in favor of the new `sl_si91x_simple_` series of APIs. + * Consider using `sl_si91x_simple_rgb_led_on`. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note This function is deprecated and should be replaced with `sl_si91x_simple_rgb_led_on`. + ******************************************************************************/ void sl_si91x_rgb_led_on(const sl_led_t *handle); -/** @brief Turns off (clears) a GPIO pin connected to an RGB LED, which turns - * off the RGB LED. - * - * @param[in] handle The pointer to RGB LED structure that has the specific RGB led information. - */ +/***************************************************************************/ +/** + * @brief Older API - Not recommended to use. + * + * @details This API is deprecated in favor of the new `sl_si91x_simple_` series of APIs. + * Consider using `sl_si91x_simple_rgb_led_off`. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific RGB LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note This function is deprecated and should be replaced with `sl_si91x_simple_rgb_led_off`. + ******************************************************************************/ void sl_si91x_rgb_led_off(const sl_led_t *handle); -/** @brief Gets the current status of the RGB LED i.e. On or OFF - * - * @param[in] handle The pointer to RGB LED structure that has the specific RGB led information. - */ +/***************************************************************************/ +/** + * @brief Older API - Not recommended to use. + * + * @details This API is deprecated in favor of the new `sl_si91x_simple_` series of APIs. + * Consider using `sl_si91x_simple_rgb_led_get_current_state`. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @return uint8_t + * The current state of the RGB LED. + * + * @note This function is deprecated and should be replaced with `sl_si91x_simple_rgb_led_get_current_state`. + ******************************************************************************/ uint8_t sl_si91x_rgb_led_get_current_state(const sl_led_t *handle); -/** @brief Atomically wraps an XOR or similar operation for a single GPIO - * pin attached to an RGB LED. - * - * @param[in] handle The pointer to RGB LED structure that has the specific led information. - */ +/***************************************************************************/ +/** + * @brief Older API - Not recommended to use. + * + * @details This API is deprecated in favor of the new `sl_si91x_simple_` series of APIs. + * Consider using `sl_si91x_simple_rgb_led_toggle`. + * + * @param[in] handle + * The pointer to the RGB LED structure that contains the specific LED information. + * + * @pre Pre-conditions: + * - The RGB LED structure must be properly initialized before calling this function. + * + * @note This function is deprecated and should be replaced with `sl_si91x_simple_rgb_led_toggle`. + ******************************************************************************/ void sl_si91x_rgb_led_toggle(const sl_led_t *handle); #endif // __SL_SI91X_RGB_LED_H__ diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.c.jinja b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.c.jinja index 8fb7bb781..a3444509b 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.c.jinja +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.c.jinja @@ -1,4 +1,5 @@ -/***************************************************************************/ /** +/***************************************************************************/ +/** * @file sl_si91x_rgb_led_instances.c.jinja * @brief RGB LED Instances ******************************************************************************* @@ -31,18 +32,67 @@ #include "sl_si91x_rgb_led.h" #include "sl_si91x_rgb_led_config.h" -{%- for inst in led_instance | sort %} -sl_led_t led_{{ inst | lower }} = { - .port = SL_LED_{{ inst | upper }}_PORT, - .pin = SL_LED_{{ inst | upper }}_PIN, - .led_number = SL_LED_{{ inst | upper }}_NUMBER, - .pad = SL_LED_{{ inst | upper }}_PAD, +#ifdef SI917_RGB_DRIVER_OLD +sl_led_t led_red = { + .port = SL_LED_RED_PORT, + .pin = SL_LED_RED_PIN, + .led_number = SL_LED_RED_NUMBER, + .pad = SL_LED_RED_PAD, +}; + +sl_led_t led_green = { + .port = SL_LED_GREEN_PORT, + .pin = SL_LED_GREEN_PIN, + .led_number = SL_LED_GREEN_NUMBER, + .pad = SL_LED_GREEN_PAD, +}; + +sl_led_t led_blue = { + .port = SL_LED_BLUE_PORT, + .pin = SL_LED_BLUE_PIN, + .led_number = SL_LED_BLUE_NUMBER, + .pad = SL_LED_BLUE_PAD, }; +#else +{%- for inst in led_instance | sort %} + sl_led_t led_{{ inst | lower }}_red = { + .port = SL_LED_{{ inst | upper }}_RED_PORT, + .pin = SL_LED_{{ inst | upper }}_RED_PIN, + .led_number = SL_LED_{{ inst | upper }}_RED_NUMBER, + .pad = SL_LED_{{ inst | upper }}_RED_PAD, + }; + + sl_led_t led_{{ inst | lower }}_green = { + .port = SL_LED_{{ inst | upper }}_GREEN_PORT, + .pin = SL_LED_{{ inst | upper }}_GREEN_PIN, + .led_number = SL_LED_{{ inst | upper }}_GREEN_NUMBER, + .pad = SL_LED_{{ inst | upper }}_GREEN_PAD, + }; + + sl_led_t led_{{ inst | lower }}_blue = { + .port = SL_LED_{{ inst | upper }}_BLUE_PORT, + .pin = SL_LED_{{ inst | upper }}_BLUE_PIN, + .led_number = SL_LED_{{ inst | upper }}_BLUE_NUMBER, + .pad = SL_LED_{{ inst | upper }}_BLUE_PAD, + }; + + const sl_rgb_led_t led_{{ inst | lower }} = { + .red = &led_{{ inst | lower }}_red, + .green = &led_{{ inst | lower }}_green, + .blue = &led_{{ inst | lower }}_blue, + }; {%- endfor %} +#endif void rgb_led_init_instances(void) { - {%- for inst in led_instance %} - sl_si91x_rgb_led_init(&led_{{ inst | lower }}); - {%- endfor %} -} \ No newline at end of file +#ifdef SI917_RGB_DRIVER_OLD +sl_si91x_rgb_led_init(&led_red); +sl_si91x_rgb_led_init(&led_green); +sl_si91x_rgb_led_init(&led_blue); +#else +{%- for inst in led_instance %} +sl_si91x_simple_rgb_led_init(&led_{{ inst | lower }}); +{%- endfor %} +#endif +} diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.h.jinja b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.h.jinja index 11eb13c17..82dab05e5 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.h.jinja +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/inst/sl_si91x_rgb_led_instances.h.jinja @@ -33,9 +33,15 @@ #include "sl_si91x_rgb_led.h" -{% for inst in led_instance -%} -extern const sl_led_t led_{{ inst | lower }}; -{% endfor %} +#ifdef SI917_RGB_DRIVER_OLD +extern const sl_led_t led_red; +extern const sl_led_t led_green; +extern const sl_led_t led_blue; +#else +{%- for inst in led_instance %} + extern const sl_rgb_led_t led_{{ inst | lower }}; +{%- endfor %} +#endif void rgb_led_init_instances(void); diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/src/sl_si91x_rgb_led.c b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/src/sl_si91x_rgb_led.c index c6ea71d0d..4440840c1 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/src/sl_si91x_rgb_led.c +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/src/sl_si91x_rgb_led.c @@ -15,11 +15,276 @@ * ******************************************************************************/ #include "sl_si91x_rgb_led.h" +#include "sl_si91x_rgb_led_instances.h" #include "si91x_device.h" #include "sl_driver_gpio.h" #include "sl_si91x_driver_gpio.h" +#include "sl_sleeptimer.h" -sl_status_t status; +/******************************************************************************* + ******************************* DEFINES *********************************** + ******************************************************************************/ +/*Delay for PWM simulation*/ +#ifndef TICK_DELAY +#define TICK_DELAY 2 +#endif + +/*Total delay for each PWM cycle*/ +#ifndef PULSE_PERIOD +#define PULSE_PERIOD (TICK_DELAY * 0xFF) +#endif + +typedef enum { COLOUR_RED, COLOUR_GREEN, COLOUR_BLUE } rgb_colour_t; + +#define LED_ON 0 +#define LED_OFF 1 + +/*Default colour white*/ +#define RGB_DEFAULT_COLOUR 0xFFFFFF + +#define INVALID_HANDLE -1 + +/******************************************************************************* + *************************** LOCAL VARIABLES ******************************** + ******************************************************************************/ +typedef struct { + int32_t red; + int32_t blue; + int32_t green; +} rgb_values_t; // Represents both duty cycle and timer counter for software PWM + +typedef struct { + rgb_values_t timer_counter; // Timer counter for each color + rgb_values_t duty_cycle; // Duty cycle for each color + bool on_state; // ON state of each LED + sl_sleeptimer_timer_handle_t pwm_timer; // Sleeptimer handle for each LED +} rgb_led_params_t; + +rgb_led_params_t rgb_led_params[SL_SI91X_RGB_LED_COUNT]; + +/******************************************************************************* + ********************* LOCAL FUNCTION PROTOTYPES *************************** + ******************************************************************************/ +static void rgb_led_callback(sl_sleeptimer_timer_handle_t *timer, void *data); + +/******************************************************************************* + ************************** GLOBAL FUNCTIONS ******************************* + ******************************************************************************/ + +void sl_si91x_simple_rgb_led_init(const sl_rgb_led_t *handle) +{ + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + /*Enable clock*/ + sl_si91x_gpio_driver_enable_clock((sl_si91x_gpio_select_clock_t)M4CLK_GPIO); + + sl_si91x_gpio_pin_config_t sl_gpio_red_pin_config = { { handle->red->port, handle->red->pin }, GPIO_OUTPUT }; + sl_gpio_set_configuration(sl_gpio_red_pin_config); + + sl_si91x_gpio_pin_config_t sl_gpio_green_pin_config = { { handle->green->port, handle->green->pin }, GPIO_OUTPUT }; + sl_gpio_set_configuration(sl_gpio_green_pin_config); + + sl_si91x_gpio_pin_config_t sl_gpio_blue_pin_config = { { handle->blue->port, handle->blue->pin }, GPIO_OUTPUT }; + sl_gpio_set_configuration(sl_gpio_blue_pin_config); + + // Set default color white color + sl_si91x_simple_rgb_led_set_colour(handle, RGB_DEFAULT_COLOUR); +} + +void sl_si91x_simple_rgb_led_on(const sl_rgb_led_t *handle) +{ + sl_status_t status; + + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + // Timer associated with the RGB LED instance + uint8_t led_instance = handle->red->led_number; + + /*Start Sleeptimer*/ + status = sl_sleeptimer_start_periodic_timer(&rgb_led_params[led_instance].pwm_timer, + TICK_DELAY, + rgb_led_callback, + (void *)handle, + 0, + SL_SLEEPTIMER_NO_HIGH_PRECISION_HF_CLOCKS_REQUIRED_FLAG); + + /*change the on_state of LED*/ + if (status == SL_STATUS_OK) { + rgb_led_params[led_instance].on_state = true; + } +} + +static void led_colour_on_off(const sl_rgb_led_t *handle, rgb_colour_t colour, int operation) +{ + sl_gpio_t gpio_port_pin; + + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + switch (colour) { + case COLOUR_RED: + gpio_port_pin.port = handle->red->port; + gpio_port_pin.pin = handle->red->pin; + break; + + case COLOUR_GREEN: + gpio_port_pin.port = handle->green->port; + gpio_port_pin.pin = handle->green->pin; + break; + + case COLOUR_BLUE: + gpio_port_pin.port = handle->blue->port; + gpio_port_pin.pin = handle->blue->pin; + break; + + default: + break; + } + + if (operation == LED_ON) { + sl_gpio_driver_clear_pin(&gpio_port_pin); + } else { + sl_gpio_driver_set_pin(&gpio_port_pin); + } +} + +void sl_si91x_simple_rgb_led_off(const sl_rgb_led_t *handle) +{ + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + // Timer associated with the RGB LED instance + uint8_t led_instance = handle->red->led_number; + + sl_gpio_t red_gpio_port_pin = { handle->red->port, handle->red->pin }; + sl_gpio_t green_gpio_port_pin = { handle->green->port, handle->green->pin }; + sl_gpio_t blue_gpio_port_pin = { handle->blue->port, handle->blue->pin }; + + sl_gpio_driver_set_pin(&red_gpio_port_pin); + sl_gpio_driver_set_pin(&green_gpio_port_pin); + sl_gpio_driver_set_pin(&blue_gpio_port_pin); + + /*Stop Sleeptimer*/ + sl_sleeptimer_stop_timer(&rgb_led_params[led_instance].pwm_timer); + + /*Change the on_state of LED*/ + rgb_led_params[led_instance].on_state = false; +} + +void sl_si91x_simple_rgb_led_toggle(const sl_rgb_led_t *handle) +{ + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + // Timer associated with the RGB LED instance + uint8_t led_instance = handle->red->led_number; + + if (rgb_led_params[led_instance].on_state == true) { + sl_si91x_simple_rgb_led_off(handle); + } else { + sl_si91x_simple_rgb_led_on(handle); + } +} + +void sl_si91x_simple_rgb_led_set_colour(const sl_rgb_led_t *handle, int rgb_colour) +{ + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + /*Extract duty cycle values from the colour hex code*/ + rgb_led_params[handle->red->led_number].duty_cycle.red = ((rgb_colour >> 16) & 0xFF) * TICK_DELAY; + rgb_led_params[handle->green->led_number].duty_cycle.green = ((rgb_colour >> 8) & 0xFF) * TICK_DELAY; + rgb_led_params[handle->blue->led_number].duty_cycle.blue = (rgb_colour & 0xFF) * TICK_DELAY; +} + +uint8_t sl_si91x_simple_rgb_led_get_current_state(const sl_rgb_led_t *handle) +{ + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return INVALID_HANDLE; // Exit if any handle is null + } + + // Timer associated with the RGB LED instance + uint8_t led_instance = handle->red->led_number; + + return (uint8_t)rgb_led_params[led_instance].on_state; +} + +void sl_si91x_simple_rgb_led_get_colour(const sl_rgb_led_t *handle, uint16_t *red, uint16_t *green, uint16_t *blue) +{ + /* Check for null pointer */ + if (handle == NULL || handle->red == NULL || handle->green == NULL || handle->blue == NULL) { + return; // Exit if any handle is null + } + + // Retrieve the current duty cycle (intensity) values for each color + *red = (uint16_t)(rgb_led_params[handle->red->led_number].duty_cycle.red); + *green = (uint16_t)(rgb_led_params[handle->green->led_number].duty_cycle.green); + *blue = (uint16_t)(rgb_led_params[handle->blue->led_number].duty_cycle.blue); +} + +/** + * This function simulates a software-based PWM to pulse RGB LEDs based on their + * respective duty cycle levels. + */ +static void rgb_led_callback(sl_sleeptimer_timer_handle_t *timer_handle, void *data) +{ + sl_rgb_led_t *handle = (sl_rgb_led_t *)data; + + uint8_t led_instance = handle->red->led_number; + + if (timer_handle == &rgb_led_params[led_instance].pwm_timer) { + /*Pulse drive for red*/ + if (rgb_led_params[led_instance].timer_counter.red == rgb_led_params[led_instance].duty_cycle.red) { + led_colour_on_off(handle, COLOUR_RED, LED_OFF); + } else { + if (rgb_led_params[led_instance].timer_counter.red > PULSE_PERIOD) { + led_colour_on_off(handle, COLOUR_RED, LED_ON); + rgb_led_params[led_instance].timer_counter.red = -1; + } + } + + /*Pulse drive for green*/ + if (rgb_led_params[led_instance].timer_counter.green == rgb_led_params[led_instance].duty_cycle.green) { + led_colour_on_off(handle, COLOUR_GREEN, LED_OFF); + } else { + if (rgb_led_params[led_instance].timer_counter.green > PULSE_PERIOD) { + led_colour_on_off(handle, COLOUR_GREEN, LED_ON); + rgb_led_params[led_instance].timer_counter.green = -1; + } + } + + /*Pulse drive for blue*/ + if (rgb_led_params[led_instance].timer_counter.blue == rgb_led_params[led_instance].duty_cycle.blue) { + led_colour_on_off(handle, COLOUR_BLUE, LED_OFF); + } else { + if (rgb_led_params[led_instance].timer_counter.blue > PULSE_PERIOD) { + led_colour_on_off(handle, COLOUR_BLUE, LED_ON); + rgb_led_params[led_instance].timer_counter.blue = -1; + } + } + + rgb_led_params[led_instance].timer_counter.red++; + rgb_led_params[led_instance].timer_counter.green++; + rgb_led_params[led_instance].timer_counter.blue++; + } +} + +/*Older version APIs (Not recommended to use)*/ void sl_si91x_rgb_led_init(const sl_led_t *handle) { @@ -28,7 +293,7 @@ void sl_si91x_rgb_led_init(const sl_led_t *handle) /*Set the GPIO pin MUX */ sl_gpio_t rgb_gpio_port_pin = { handle->port, handle->pin }; - status = sl_gpio_driver_set_pin_mode(&rgb_gpio_port_pin, 0, 1); + sl_gpio_driver_set_pin_mode(&rgb_gpio_port_pin, 0, 1); /*PAD selection*/ sl_si91x_gpio_driver_enable_pad_selection(handle->pad); @@ -62,4 +327,4 @@ void sl_si91x_rgb_led_toggle(const sl_led_t *handle) { sl_gpio_t rgb_gpio_port_pin = { handle->port, handle->pin }; sl_gpio_driver_toggle_pin(&rgb_gpio_port_pin); -} +} \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/component/sl_si70xx.slcc b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/component/sl_si70xx.slcc index 3dcbeb41a..a8867d907 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/component/sl_si70xx.slcc +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/component/sl_si70xx.slcc @@ -6,6 +6,9 @@ description: > category: Device|Si91x|MCU|Hardware quality: production component_root_path: "components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor" +config_file: + - path: config/sl_si91x_i2c_init_i2c2_config.h + file_id: si70xx_config source: - path: "src/sl_si91x_si70xx.c" include: diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/config/sl_si91x_i2c_init_i2c2_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/config/sl_si91x_i2c_init_i2c2_config.h new file mode 100644 index 000000000..6d15bfb86 --- /dev/null +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/si70xx_sensor/config/sl_si91x_i2c_init_i2c2_config.h @@ -0,0 +1,118 @@ +/***************************************************************************/ /** +* @file sl_si91x_i2c_init_i2c2_config.h +* @brief I2c driver instance configuration file. +******************************************************************************* +* # License +* Copyright 2023 Silicon Laboratories Inc. www.silabs.com +******************************************************************************* +* +* SPDX-License-Identifier: Zlib +* +* The licensor of this software is Silicon Laboratories Inc. +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +* +******************************************************************************/ + +#ifndef SL_SI91X_I2C_INIT_I2C2_CONFIG_H +#define SL_SI91X_I2C_INIT_I2C2_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> +#ifdef __cplusplus +extern "C" { +#endif + +#warning \ + "For an OPN or SoC project, I2C instances not defined. Installing the [ENABLE USER CONFIGURATION] component or defining USER_CONFIGURATION_ENABLE MACRO to 1 is the first step towards configuring the board macros. Then, define the macros in the header file in accordance with the board connections.." + +#if USER_CONFIGURATION_ENABLE +#include "sl_si91x_i2c.h" +/******************************************************************************/ +/******************************* I2C Configuration **************************/ +// I2C2 Configuration +// Mode +// Leader mode +// Follower mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_MODE SL_I2C_LEADER_MODE + +// Operating Mode +// Standard mode +// Fast mode +// Fast plus mode +// High speed mode +// Selection of the I2C Mode. +#define SL_I2C_I2C2_OPERATING_MODE SL_I2C_STANDARD_MODE + +// Transfer Type +// Using Interrupt +// Using DMA +// Selection of the I2C Mode. +#define SL_I2C_I2C2_TRANSFER_TYPE SL_I2C_USING_INTERRUPT + +// End I2C2 Configuration +/******************************************************************************/ +// <<< end of configuration section >>> +// <<< sl:start pin_tool >>> +// SL_SI70XX +// $[I2C_SL_SI70XX] +#ifndef SL_SI70XX_PERIPHERAL +#define SL_SI70XX_PERIPHERAL ULP_I2C +#endif + +// ULP_I2C SCL on ULP_GPIO_7/GPIO_71 +#ifndef SL_SI70XX_SCL_PORT +#define SL_SI70XX_SCL_PORT ULP +#endif +#ifndef SL_SI70XX_SCL_PIN +#define SL_SI70XX_SCL_PIN 7 +#endif +#ifndef SL_SI70XX_SCL_LOC +#define SL_SI70XX_SCL_LOC 2 +#endif + +// ULP_I2C SDA on ULP_GPIO_6/GPIO_70 +#ifndef SL_SI70XX_SDA_PORT +#define SL_SI70XX_SDA_PORT ULP +#endif +#ifndef SL_SI70XX_SDA_PIN +#define SL_SI70XX_SDA_PIN 6 +#endif +#ifndef SL_SI70XX_SDA_LOC +#define SL_SI70XX_SDA_LOC 6 +#endif +// [I2C_SL_SI70XX]$ +// <<< sl:end pin_tool >>> + +#define SL_I2C_I2C2_SCL_PORT 0 +#define SL_I2C_I2C2_SCL_PIN SL_SI70XX_SCL_PIN +#define SL_I2C_I2C2_SCL_MUX SL_SI91X_I2C2_SCL_MUX +#define SL_I2C_I2C2_SCL_PAD SL_SI91X_I2C2_SCL_PAD +#define SL_I2C_I2C2_SCL_REN SL_SI91X_I2C2_SCL_REN + +#define SL_I2C_I2C2_SDA_PORT 0 +#define SL_I2C_I2C2_SDA_PIN SL_SI70XX_SDA_PIN +#define SL_I2C_I2C2_SDA_MUX SL_SI91X_I2C2_SDA_MUX +#define SL_I2C_I2C2_SDA_PAD SL_SI91X_I2C2_SDA_PAD +#define SL_I2C_I2C2_SDA_REN SL_SI91X_I2C2_SDA_REN + +#ifdef __cplusplus +} +#endif + +#endif // USER_CONFIGURATION_ENABLE +#endif // SL_SI91X_I2C_INIT_I2C2_CONFIG_H \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/config/sl_si91x_joystick_config.h b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/config/sl_si91x_joystick_config.h index bb9a48b1a..1bfa8536b 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/config/sl_si91x_joystick_config.h +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/config/sl_si91x_joystick_config.h @@ -33,6 +33,29 @@ // <<< Use Configuration Wizard in Context Menu >>> +// Channel selection + +// Joystick ADC channel (make sure to install selected ADC channel/instance) +// channel_1 +// channel_2 +// channel_3 +// channel_4 +// channel_5 +// channel_6 +// channel_7 +// channel_8 +// channel_9 +// channel_10 +// channel_11 +// channel_12 +// channel_13 +// channel_14 +// channel_15 +// channel_16 +#define JOYSTICK_ADC_CHANNEL SL_ADC_CHANNEL_1 + +// + // Joystick Voltage value Configuration // Reference voltage diff --git a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/src/sl_si91x_joystick.c b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/src/sl_si91x_joystick.c index 72a91f69b..1b04c6427 100644 --- a/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/src/sl_si91x_joystick.c +++ b/components/device/silabs/si91x/mcu/drivers/hardware_drivers/sl_joystick/src/sl_si91x_joystick.c @@ -62,6 +62,7 @@ static void callback_event(uint8_t channel_no, uint8_t event); sl_status_t sl_si91x_joystick_init(void) { sl_status_t status = 0; + sl_adc_channel_config.channel = JOYSTICK_ADC_CHANNEL; uint8_t adc_channel = sl_adc_channel_config.channel; sl_adc_config.num_of_channel_enable = 1; sl_adc_config.operation_mode = SL_ADC_STATIC_MODE; @@ -106,38 +107,41 @@ sl_status_t sl_si91x_joystick_get_position(sl_joystick_state_t state, sl_joystic status = SL_STATUS_NOT_READY; break; } - //Read the ADC sampling data. - status = sl_si91x_adc_read_data_static(sl_adc_channel_config, sl_adc_config, &adc_value); - if (status != SL_STATUS_OK) { - break; - } - if (adc_value & AUXADC_DATA_TWELFTH) { - adc_value = (int16_t)(adc_value & (ADC_MASK_VALUE)); - } else { - adc_value = adc_value | AUXADC_DATA_TWELFTH; - } - sample_data = (((float)adc_value / (float)ADC_MAX_OP_VALUE) * vref_value); - sample_data = (sample_data * DIVISION_MULTIPLIER); - // determine which direction pad was pressed - if ((sample_data >= JOYSTICK_MV_C - JOYSTICK_MV_ERROR) && (sample_data <= JOYSTICK_MV_C + JOYSTICK_MV_ERROR)) { - joystick_direction = SL_JOYSTICK_C; - } else if ((sample_data >= JOYSTICK_MV_N - JOYSTICK_MV_ERROR) - && (sample_data <= JOYSTICK_MV_N + JOYSTICK_MV_ERROR)) { - joystick_direction = SL_JOYSTICK_N; - } else if ((sample_data >= JOYSTICK_MV_E - JOYSTICK_MV_ERROR) - && (sample_data <= JOYSTICK_MV_E + JOYSTICK_MV_ERROR)) { - joystick_direction = SL_JOYSTICK_E; - } else if ((sample_data >= JOYSTICK_MV_S - JOYSTICK_MV_ERROR) - && (sample_data <= JOYSTICK_MV_S + JOYSTICK_MV_ERROR)) { - joystick_direction = SL_JOYSTICK_S; - } else if ((sample_data >= JOYSTICK_MV_W - JOYSTICK_MV_ERROR) - && (sample_data <= JOYSTICK_MV_W + JOYSTICK_MV_ERROR)) { - joystick_direction = SL_JOYSTICK_W; - } else { - joystick_direction = SL_JOYSTICK_NONE; + // Check ADC start. + if (AUX_ADC_DAC_COMP->AUXADC_CTRL_1_b.ADC_ENABLE == ENABLE) { + //Read the ADC sampling data. + status = sl_si91x_adc_read_data_static(sl_adc_channel_config, sl_adc_config, &adc_value); + if (status != SL_STATUS_OK) { + break; + } + if (adc_value & AUXADC_DATA_TWELFTH) { + adc_value = (int16_t)(adc_value & (ADC_MASK_VALUE)); + } else { + adc_value = adc_value | AUXADC_DATA_TWELFTH; + } + sample_data = (((float)adc_value / (float)ADC_MAX_OP_VALUE) * vref_value); + sample_data = (sample_data * DIVISION_MULTIPLIER); + // determine which direction pad was pressed + if ((sample_data >= JOYSTICK_MV_C - JOYSTICK_MV_ERROR) && (sample_data <= JOYSTICK_MV_C + JOYSTICK_MV_ERROR)) { + joystick_direction = SL_JOYSTICK_C; + } else if ((sample_data >= JOYSTICK_MV_N - JOYSTICK_MV_ERROR) + && (sample_data <= JOYSTICK_MV_N + JOYSTICK_MV_ERROR)) { + joystick_direction = SL_JOYSTICK_N; + } else if ((sample_data >= JOYSTICK_MV_E - JOYSTICK_MV_ERROR) + && (sample_data <= JOYSTICK_MV_E + JOYSTICK_MV_ERROR)) { + joystick_direction = SL_JOYSTICK_E; + } else if ((sample_data >= JOYSTICK_MV_S - JOYSTICK_MV_ERROR) + && (sample_data <= JOYSTICK_MV_S + JOYSTICK_MV_ERROR)) { + joystick_direction = SL_JOYSTICK_S; + } else if ((sample_data >= JOYSTICK_MV_W - JOYSTICK_MV_ERROR) + && (sample_data <= JOYSTICK_MV_W + JOYSTICK_MV_ERROR)) { + joystick_direction = SL_JOYSTICK_W; + } else { + joystick_direction = SL_JOYSTICK_NONE; + } + //Update direction on pointer variable. + *pos = joystick_direction; } - //Update direction on pointer variable. - *pos = joystick_direction; } while (false); return status; } diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_cci.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_cci.slcc deleted file mode 100644 index e066a598c..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_cci.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_cci -label: CCI -package: platform -description: > - Companion Chip Interface Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_cci.c" -include: - - path: "inc" - file_list: - - path: "rsi_cci.h" -provides: - - name: rsilib_cci \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_fim.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_fim.slcc deleted file mode 100644 index cde564b4f..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_fim.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_fim -label: FIM -package: platform -description: > - Filter Interpolation Matrix Multiplication Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_fim.c" -include: - - path: "inc" - file_list: - - path: "rsi_fim.h" -provides: - - name: rsilib_fim diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_ir.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_ir.slcc deleted file mode 100644 index 78d6e7ad1..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_ir.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_ir -label: IR -package: platform -description: > - Infrared Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_ir.c" -include: - - path: "inc" - file_list: - - path: "rsi_ir.h" -provides: - - name: rsilib_ir diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdioh.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdioh.slcc deleted file mode 100644 index bbd342d98..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdioh.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_sdioh -label: SDIOH -package: platform -description: > - SDIOH Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_sdioh.c" -include: - - path: "inc" - file_list: - - path: "rsi_sdioh.h" -provides: - - name: rsilib_sdioh diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdmem.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdmem.slcc deleted file mode 100644 index 12fbc8268..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_sdmem.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_sdmem -label: SDMEM -package: platform -description: > - SDMEM Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_sdmem.c" -include: - - path: "inc" - file_list: - - path: "rsi_sdmem.h" -provides: - - name: rsilib_sdmem diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_smih.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_smih.slcc deleted file mode 100644 index 081f4762b..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_smih.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_smih -label: SMIH -package: platform -description: > - SMIH Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_smih.c" -include: - - path: "inc" - file_list: - - path: "rsi_smih.h" -provides: - - name: rsilib_smih \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_vad.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_vad.slcc deleted file mode 100644 index 8619fad02..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_vad.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_vad -label: VAD -package: platform -description: > - Voice Activity Detection API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_vad.c" -include: - - path: "inc" - file_list: - - path: "rsi_vad.h" -provides: - - name: rsilib_vad \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_wurx.slcc b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_wurx.slcc deleted file mode 100644 index 5332277cf..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/component/rsilib_wurx.slcc +++ /dev/null @@ -1,18 +0,0 @@ -id: rsilib_wurx -label: WURX -package: platform -description: > - WURX Peripheral API's -category: Device|Si91x|MCU|Internal|RSI Peripheral Drivers -quality: production -ui_hints: - visibility: never -component_root_path: "components/device/silabs/si91x/mcu/drivers/peripheral_drivers" -source: - - path: "src/rsi_wurx.c" -include: - - path: "inc" - file_list: - - path: "rsi_wurx.h" -provides: - - name: rsilib_wurx \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_cci.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_cci.h deleted file mode 100644 index 04d9bd2d4..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_cci.h +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************* -* @file rsi_cci.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Includes Files - -#include "RS1xxxx.h" -#include "rsi_error.h" - -#ifndef RSI_CCI_H -#define RSI_CCI_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define AMS_EN *(volatile uint32_t *)(0x46008000 + 0x14) - -#define CCI_AHB_SLAVE0_ADDRESS 0x80000000 -#define CCI_AHB_SLAVE1_ADDRESS 0x60000000 - -#define CCI_LSB_ADDRESS_S0 0x00000000 -#define CCI_MSB_ADDRESS_S0 0x0001FFFF - -#define CCI_LSB_ADDRESS_S1 0x00000000 -#define CCI_MSB_ADDRESS_S1 0x00000004 // 0x0001FFFF FIXME: Out of RANGE INDEX COMPARISION - -#define CCI_LSB_ADDRESS_S2 0x00000000 -#define CCI_MSB_ADDRESS_S2 0x00000004 // 0x0001FFFF FIXME: Out of RANGE INDEX COMPARISION - -#define CCI_LSB_ADDRESS_S3 0x00000000 -#define CCI_MSB_ADDRESS_S3 0x00000004 // 0x0001FFFF FIXME: Out of RANGE INDEX COMPARISION - -// CCI configuration structure -typedef struct RSI_CCI_Init_s { - - uint8_t slave_enable; // number of CCI Slaves to be supported 1,2,3 - uint8_t early_bus_termination; // Support early bus termination - // 0 - disable - // 1 - enable - uint8_t address_width_config; // Address width configuration - // b'11 -> 40 bit width (32 bit address and 8 bit command) - // b'10 -> 32 bit width (24 bit address and 8 bit command) - // b'01 -> 24 bit width (16 bit address and 8 bit command) - // b'00 -> 16 bit width (8 bit address and 8 bit command) - uint8_t translation_enable; // Enable/Disable translation - // 0 - Disable - // 1 - Enable - uint32_t translation_address; // load translation address - uint8_t mode; // Mode of the interface - // 0 - SDR mode - // 1 - DDR mode - uint8_t prog_calib; - uint8_t interface_width; // Width of the interface - // 0 - quad mode - // 1 - octa mode - // 2 - Word mode - uint8_t slave_priority; // This bits will represents priority of the slaves - // 1 : slave 0 has highest priority - // 4 : slave 1 has highest priority - // 8 : slave 2 has highest priority - uint16_t slave_timeout; // configurable time out value for response - uint32_t slave_lsb_address[3]; // Slave lower and higher address range for the each slave by programming - uint32_t slave_msb_address[3]; // Slave lower and higher address range for the each slave by programming - uint8_t cci_cntrl_en; -} RSI_CCI_Init_t; - -void RSI_CCI_AmsEnable(void); - -rsi_error_t RSI_CCI_AMS_Initialise(RSI_CCI_Init_t *p_cci_config); - -uint32_t RSI_CCI_SetFifoThreshlod(volatile CCI_Type *pstcCCI, uint8_t val); - -uint32_t RSI_CCI_PrefetchEnable(volatile CCI_Type *pstcCCI); - -uint32_t RSI_CCI_MessageInterruptEnable(volatile CCI_Type *pstcCCI); - -void RSI_CCI_CalibMode(volatile CCI_Type *pstcCCI); - -void RSI_CCI_LowPowerMode(volatile CCI_Type *pstcCCI); - -uint32_t RSI_CCI_IntStat(volatile CCI_Type *pstcCCI); - -uint32_t RSI_CCI_IntClear(volatile CCI_Type *pstcCCI, uint8_t interrupt); - -uint32_t RSI_CCI_SlaveResetMode(volatile CCI_Type *pstcCCI); -#ifdef __cplusplus -} -#endif - -#endif // RSI_CCI_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_fim.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_fim.h deleted file mode 100644 index ab47a2c01..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_fim.h +++ /dev/null @@ -1,725 +0,0 @@ -/******************************************************************************* -* @file rsi_fim.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Includes Files - -#include "base_types.h" -#include "rsi_error.h" -#include "rsi_ccp_common.h" - -#ifdef ARM_MATH_DEF -#include "arm_math.h" -#endif - -#ifndef RSI_FIM_H -#define RSI_FIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef float float32_t; - -// brief 8-bit fractional data type in 1.7 format. - -typedef int8_t q7_t; - -// brief 16-bit fractional data type in 1.15 format. - -typedef int16_t q15_t; - -// brief 32-bit fractional data type in 1.31 format. -typedef int32_t q31_t; - -typedef enum { - ULP_FIM_COP_DATA_REAL_REAL = 0, - ULP_FIM_COP_DATA_CPLX_REAL, - ULP_FIM_COP_DATA_REAL_CPLX, - ULP_FIM_COP_DATA_CPLX_CPLX -} typ_data_t; - -#define ULP_FIM_COP_START_TRIG 0x01 -#define XMAX(x, y) (((x) > (y)) ? (x) : (y)) -#define MEM_BANK 0x24060000 - -// For 9117 FIM -#define ENHANCED_FIM_BANK0 0x24060000 -#define ENHANCED_FIM_BANK1 0x24060800 -#define ENHANCED_FIM_BANK2 0x24061000 -#define ENHANCED_FIM_BANK3 0x24061800 - -#define ULPSS_RAM_ADDR_SRC ENHANCED_FIM_BANK0 -#define ULPSS_RAM_ADDR_DST ENHANCED_FIM_BANK2 - -#define ULPSS_RAM_ADDR_SRC1 ENHANCED_FIM_BANK0 -#define ULPSS_RAM_ADDR_SRC2 ENHANCED_FIM_BANK1 -#define ULP_MEMORY_ADDR 0x24060000 - -// For 9116 FIM -#define BANK0 0x00 -#define BANK1 (0x0800 >> 2) -#define BANK2 (0x1000 >> 2) -#define BANK3 (0x1800 >> 2) -#define BANK4 (0x2000 >> 2) -#define BANK5 (0x2800 >> 2) -#define BANK6 (0x3000 >> 2) -#define BANK7 (0x3800 >> 2) -#define STRS(sat, trunc, round, shift) ((round << 16) | (shift << 10) | (trunc << 5) | sat) - -typedef enum mode { - FIR = 0x01, - IIR = 0x02, - INTERPOLATE = 0x63, - ADD_SCALAR = 0x44, - SUB_SCALAR = 0x45, - MUL_SCALAR = 0x46, - ADD_VECTOR = 0x47, - SUB_VECTOR = 0x49, - MUL_VECTOR = 0x4A, - NORM_SQUARE = 0xAB, - MUL_MAT = 0x4C, -#ifdef ENHANCED_FIM - CORRELATION = 0x3, - DECIMATION = 0x4, - FFT = 0x8, - ADD_MAT = 0x4D, - SUB_MAT = 0x4E, - MAT_HADAMARD = 0x4F, - MAT_TRANSPOSE = 0x50, - COR_SINE = 0x51, - COR_COSINE = 0x52, - COR_INV_TAN = 0x54, - COR_SINH = 0x55, - COR_COSH = 0x56, - COR_INV_TANH = 0x57, - SQ_ROOT = 0x58, - NAT_LOG = 0x59, -#endif -} present_mode; - -#define FORMAT_Q7 2 -#define FORMAT_Q15 3 -#define FORMAT_Q31 1 -#define FORMAT_F32 0 - -#define NOT_MATRIX 0 -#define M4SS_ADDR_SHIFT_VAL 2 - -// list of variables for matrix multiplication -typedef struct { - int16_t nRows; - int16_t nColumns; - int32_t *pData; -} arm_matrix_instance_f32_opt; - -typedef struct { - uint16_t nRows; - uint16_t nColumns; - q31_t *pData; -} arm_matrix_instance_q31_opt; - -typedef struct { - int16_t nRows; - int16_t nColumns; - q15_t *pData; -} arm_matrix_instance_q15_opt; - -// list of variables for fir filter -typedef struct { - uint16_t numTaps; - int32_t *pState; - int32_t *pCoeffs; -} arm_fir_instance_f32_opt; - -typedef struct { - uint16_t numTaps; - q31_t *pState; - q31_t *pCoeffs; -} arm_fir_instance_q31_opt; - -typedef struct { - uint16_t numTaps; - q15_t *pState; - q15_t *pCoeffs; -} arm_fir_instance_q15_opt; - -typedef struct { - uint16_t numTaps; - q7_t *pState; - q7_t *pCoeffs; -} arm_fir_instance_q7_opt; - -// list of variables for Iir filter -typedef struct { - uint16_t numStages; - int32_t *pState; - int32_t *pkCoeffs; - int32_t *pvCoeffs; -} fim_iir_instance_f32; - -typedef struct { - uint16_t numStages; - q31_t *pState; - q31_t *pkCoeffs; - q31_t *pvCoeffs; -} fim_iir_instance_q31; - -typedef struct { - uint16_t numStages; - q15_t *pState; - q15_t *pkCoeffs; - q15_t *pvCoeffs; -} fim_iir_instance_q15; - -typedef struct { - uint8_t L; // upsample factor. - uint16_t phaseLength; // length of each polyphase filter component. - int32_t *pCoeffs; // points to the coefficient array. The array is of length L*phaseLength. - int32_t *pState; // points to the state variable array. The array is of length phaseLength+numTaps-1. -} arm_fir_interpolate_instance_f32_opt; - -#ifndef ARM_MATH_DEF -typedef enum { - ARM_MATH_SUCCESS = 0, // No error - ARM_MATH_ARGUMENT_ERROR = -1, // One or more arguments are incorrect - ARM_MATH_LENGTH_ERROR = -2, // Length of data buffer is incorrect - ARM_MATH_SIZE_MISMATCH = -3, // Size of matrices is not compatible with the operation. - ARM_MATH_NANINF = -4, // Not-a-number (NaN) or infinity is generated - ARM_MATH_SINGULAR = -5, // Generated by matrix inversion if the input matrix is singular and cannot be inverted. - ARM_MATH_TEST_FAILURE = -6 // Test Failed -} arm_status; -#endif - -// brief Instance structure for the Q15 FIR interpolator. -typedef struct { - uint8_t L; // upsample factor. - uint16_t phaseLength; // length of each polyphase filter component - q15_t *pCoeffs; // points to the coefficient array. The array is of length L*phaseLength. - q15_t *pState; // points to the state variable array. The array is of length blockSize+phaseLength-1. -} arm_fir_interpolate_instance_q15_opt; - -// brief Instance structure for the Q31 FIR interpolator. -typedef struct { - uint8_t L; // upsample factor. - uint16_t phaseLength; // length of each polyphase filter component. - q31_t *pCoeffs; // points to the coefficient array. The array is of length L*phaseLength. - q31_t *pState; // points to the state variable array. The array is of length blockSize+phaseLength-1. -} arm_fir_interpolate_instance_q31_opt; - -#ifdef ENHANCED_FIM - -// brief Instance structure for the Q15 FIR decimate. -typedef struct { - uint8_t M; // decimation factor.. - uint16_t numTaps; // number of coefficients in the filter. - const q15_t *pCoeffs; // points to the coefficient array. The array is of length numTaps. - q15_t *pState; // points to the state variable array. The array is of length numTaps+blockSize-1. -} arm_fir_decimate_instance_q15; - -typedef struct { - uint8_t M; // decimation factor. - uint16_t numTaps; // number of coefficients in the filter. - const q31_t *pCoeffs; // points to the coefficient array. The array is of length numTaps. - q31_t *pState; // points to the state variable array. The array is of length numTaps+blockSize-1. -} arm_fir_decimate_instance_q31; - -typedef struct { - uint16_t fftLen; // length of the FFT. - const q15_t *pTwiddle; // points to the Twiddle factor table. - const uint16_t *pBitRevTable; // points to the bit reversal table. - uint16_t bitRevLength; // bit reversal table length. -} arm_cfft_radix2_instance_q15; -#endif - -// FIM Function Prototypes -void rsi_arm_offset_f32_opt(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t length, - uint16_t inBank, - uint16_t outBank); - -void rsi_arm_offset_q7_opt(q7_t *pSrc, q7_t scale, q7_t *pDst, uint32_t length, uint16_t inBank, uint16_t outBank); - -void rsi_arm_offset_q15_opt(q15_t *pSrc, q15_t scale, q15_t *pDst, uint32_t length, uint16_t inBank, uint16_t outBank); - -void rsi_arm_offset_q31_opt(q31_t *pSrc, q31_t scale, q31_t *pDst, uint32_t length, uint16_t inBank, uint16_t outBank); - -void rsi_fim_scalar_add_q15(q15_t *pSrc, - q15_t *scale, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank, - uint16_t outBank); - -void rsi_fim_scalar_sub_q7(q7_t *pSrc, q7_t scale, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank); - -void rsi_fim_scalar_sub_q15(q15_t *pSrc, - q15_t *scale, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank, - uint16_t outBank); - -void rsi_fim_scalar_sub_q31(q31_t *pSrc, - q31_t scale, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank); - -void rsi_fim_scalar_sub_f32(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t length, - uint16_t inBank, - uint16_t outBank); - -void rsi_arm_scale_f32_opt(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t length, - uint16_t inBank, - uint16_t outBank); - -void rsi_arm_scale_q7_opt(q7_t *pSrc, - q7_t scaleFract, - int8_t shift, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank); - -void rsi_arm_scale_q15_opt(q15_t *pSrc, - q15_t scaleFract, - int8_t shift, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank); - -void rsi_arm_scale_q31_opt(q31_t *pSrc, - q31_t scaleFract, - int8_t shift, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank); - -void rsi_fim_scalar_mul_q15(q15_t *pSrc, - q15_t *scale, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank, - uint16_t outBank); - -void rsi_fim_interrupt_handler(volatile FIM_Type *ptFim); - -void rsi_arm_add_f32_opt(int32_t *pSrcA, - int32_t *pSrcB, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_add_q7_opt(q7_t *pSrcA, - q7_t *pSrcB, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_add_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_add_q31_opt(q31_t *pSrcA, - q31_t *pSrcB, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_vector_add_q15(q15_t *pIn1, - q15_t *pIn2, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_sub_f32_opt(int32_t *pSrcA, - int32_t *pSrcB, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_sub_q7_opt(q7_t *pSrcA, - q7_t *pSrcB, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_sub_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_sub_q31_opt(q31_t *pSrcA, - q31_t *pSrcB, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_read_data(uint32_t bank, uint32_t length, volatile void *pDst, uint8_t data_type, typ_data_t type_data); - -void rsi_fim_vector_sub_q15(q15_t *pIn1, - q15_t *pIn2, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_mult_f32_opt(int32_t *pIn1, - int32_t *pIn2, - int32_t *pDst, - uint32_t SatTruncRound, - uint32_t length, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_mult_q7_opt(q7_t *pSrcA, - q7_t *pSrcB, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_mult_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_mult_q31_opt(q31_t *pSrcA, - q31_t *pSrcB, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_vector_mul_q15(q15_t *pIn1, - q15_t *pIn2, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_cmplx_mult_real_q15_opt(q15_t *pSrcCmplx, - q15_t *pSrcReal, - q15_t *pDst, - uint32_t numSamples, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_cmplx_mult_cmplx_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t numSamples, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_cmplx_mag_squared_q15_opt(q15_t *pSrc, - q15_t *pDst, - uint32_t numSamples, - uint16_t inBank, - uint16_t outBank); - -void rsi_fim_absSqr_q7(q7_t *pSrc, q7_t *pDst1, uint32_t blockSize, uint16_t inBank, uint16_t outBank); -void rsi_fim_absSqr_q15(q15_t *pSrc, q15_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank); -void rsi_fim_absSqr_q31(q31_t *pSrc, q31_t *pDst, uint32_t length, uint16_t inBank, uint16_t outBank); -void rsi_fim_absSqr_f32(int32_t *pSrc, int32_t *pDst, uint32_t length, uint16_t inBank, uint16_t outBank); - -rsi_error_t rsi_arm_mat_mult_f32_opt(const arm_matrix_instance_f32_opt *pSrcA, - const arm_matrix_instance_f32_opt *pSrcB, - arm_matrix_instance_f32_opt *pDst, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -rsi_error_t rsi_arm_mat_mult_q31_opt(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -rsi_error_t rsi_arm_mat_mult_q15_opt(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst, - q15_t *pState, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_fir_init_f32_opt(arm_fir_instance_f32_opt *S, - uint16_t numTaps, - int32_t *pCoeffs, - int32_t *pState, - uint32_t blockSize); - -void rsi_arm_fir_f32_opt(arm_fir_instance_f32_opt *S, - int32_t *pSrc, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_fir_init_q31_opt(arm_fir_instance_q31_opt *S, - uint16_t numTaps, - q31_t *pCoeffs, - q31_t *pState, - uint32_t blockSize); - -void rsi_arm_fir_q31_opt(arm_fir_instance_q31_opt *S, - q31_t *pSrc, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_fir_init_q15_opt(arm_fir_instance_q15_opt *S, - uint16_t numTaps, - q15_t *pCoeffs, - q15_t *pState, - uint32_t blockSize); - -void rsi_arm_fir_q15_opt(arm_fir_instance_q15_opt *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_fir_q15(arm_fir_instance_q15_opt *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_fir_init_q7_opt(arm_fir_instance_q7_opt *S, - uint16_t numTaps, - q7_t *pCoeffs, - q7_t *pState, - uint32_t blockSize); - -void rsi_arm_fir_q7_opt(arm_fir_instance_q7_opt *S, - q7_t *pSrc, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_Iir_init_f32(fim_iir_instance_f32 *S, - uint16_t numStages, - int32_t *pCoeffs, - int32_t *pvCoeffs, - int32_t *pState); - -void rsi_fim_Iir_init_q31(fim_iir_instance_q31 *S, - uint16_t numStages, - q31_t *pCoeffs, - q31_t *pvCoeffs, - uint32_t *pState); - -void rsi_fim_Iir_q31(fim_iir_instance_q31 *S, - int32_t *pSrc, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_Iir_init_q15(fim_iir_instance_q15 *S, uint16_t numStages, q15_t *pCoeffs, q15_t *pvCoeffs, q15_t *pState); - -void rsi_fim_Iir_q15(fim_iir_instance_q15 *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_Iir_f32(fim_iir_instance_f32 *S, - int32_t *pSrc, - int32_t *pDst, - uint32_t length, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_fir_interpolate_f32_opt(const arm_fir_interpolate_instance_f32_opt *S, - int32_t *pSrc, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -arm_status rsi_arm_fir_interpolate_init_f32_opt(arm_fir_interpolate_instance_f32_opt *S, - uint8_t L, - uint16_t numTaps, - int32_t *pCoeffs, - int32_t *pState, - uint32_t blockSize); - -arm_status rsi_arm_fir_interpolate_init_q15_opt(arm_fir_interpolate_instance_q15_opt *S, - uint8_t L, - uint16_t numTaps, - q15_t *pCoeffs, - q15_t *pState, - uint32_t blockSize); - -arm_status rsi_arm_fir_interpolate_init_q31_opt(arm_fir_interpolate_instance_q31_opt *S, - uint8_t L, - uint16_t numTaps, - q31_t *pCoeffs, - q31_t *pState, - uint32_t blockSize); - -void rsi_arm_fir_interpolate_q15_opt(arm_fir_interpolate_instance_q15_opt *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_fim_fir_interpolate_q15(arm_fir_interpolate_instance_q15_opt *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void rsi_arm_fir_interpolate_q31_opt(const arm_fir_interpolate_instance_q31_opt *S, - q31_t *pSrc, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank); - -void RSI_FIM_EnableSaturation(void); -void RSI_FIM_SetSatTruncRound(uint32_t SatTruncRoundShift); - -// New feature -#ifdef ENHANCED_FIM -void rsi_arm_correlate_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst); -void rsi_arm_correlate_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, uint32_t srcBLen, q31_t *pDst); -void rsi_arm_correlate_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, q7_t *pDst); -arm_status arm_fir_decimate_init_q31(arm_fir_decimate_instance_q31 *S, - uint16_t numTaps, - uint8_t M, - q31_t *pCoeffs, - q31_t *pState, - uint32_t blockSize); -arm_status arm_fir_decimate_init_q15(arm_fir_decimate_instance_q15 *S, - uint16_t numTaps, - uint8_t M, - q15_t *pCoeffs, - q15_t *pState, - uint32_t blockSize); -void arm_fir_decimate_q15(const arm_fir_decimate_instance_q15 *S, q15_t *pSrc, q15_t *pDst, uint32_t blockSize); -void arm_fir_decimate_q31(const arm_fir_decimate_instance_q31 *S, q31_t *pSrc, q31_t *pDst, uint32_t blockSize); -void rsi_arm_cfft_radix2(q31_t *pSrc); -void rsi_arm_sin_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize); -void rsi_arm_cos_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize); -void rsi_arm_Inverse_Tan_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize); -void rsi_arm_Sinh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize); -void rsi_arm_cosh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize); -void rsi_arm_Inverse_Tanh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize); -rsi_error_t rsi_arm_mat_add_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst); -rsi_error_t arm_mat_add_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst); -rsi_error_t arm_mat_sub_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst); -rsi_error_t arm_mat_sub_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst); -rsi_error_t arm_mat_trans_q15(const arm_matrix_instance_q15_opt *pSrc, arm_matrix_instance_q15_opt *pDst); -rsi_error_t rsi_arm_mat_trans_q31(const arm_matrix_instance_q31_opt *pSrc, arm_matrix_instance_q31_opt *pDst); -rsi_error_t rsi_arm_mat_Hadamard_prod_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst); -rsi_error_t arm_mat_Hadamard_prod_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst); -void rsi_arm_VSqrt_q15(q15_t *pSrc, q15_t *pDst, uint32_t blockSize); -void rsi_arm_log_q15(q15_t *pSrc, q15_t *pDst, uint16_t blockSize); -void rsi_enable_inst_buff(void); -void RSI_FIM_InputData(void *pSrcA, uint32_t bank, uint32_t blockSize, uint8_t data_type); -void rsi_fim_copy_fim_reg_to_ulp_memory(void); -#endif - -#ifdef __cplusplus -} -#endif -#endif // RSI_FIM_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_ir.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_ir.h deleted file mode 100644 index e43d27703..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_ir.h +++ /dev/null @@ -1,227 +0,0 @@ -/******************************************************************************* -* @file rsi_ir.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Includes Files - -#include "rsi_ccp_common.h" - -#ifndef RSI_IR_H -#define RSI_IR_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define CONFIG_SREST_IR_CORE (1U << 16) // Soft reset IR core block -#define CONFIG_EN_CONT_IR_DET (1U << 8) // Continuous IR detection enable -#define CONFIG_EN_CLK_IR_CORE (1U << 2) // Enable 32KHz clock to IR Core -#define CONFIG_EN_IR_DET_RSTART (1U << 1) // Enable IR detection Re-start Logic -#define CONFIG_EN_IR_DET (1U << 0) // Enable IR detection Logic -#define MAX_MEMORY_ADDRESS 128 -#define MAX_OFF_DURATION 131072 -#define MAX_ON_DURATION 4096 -#define MAX_FRAMEDONE_THRESHOLD 32768 -#define MAX_DETECTION_THRESHOLD 128 -/** @addtogroup SOC23 -* @{ -*/ -/*===================================================*/ -/** - * @fn rsi_error_t RSI_IR_OffDuration(IR_Type* pIr , uint32_t off_duration) - * @brief This API is used to configure the off duration of IR decoder - * @param[in] pIr : IR type pointer - * @param[in] off_duration : IR Sleep duration timer value. Programmable value for OFF duration - for power cycling on External IR Sensor. - Count to be programmed write to clock ticks of 32KHz clock. - Programmed value is (1/32K)*off_duration - * @return return zero \ref RSI_OK on success and return error code on failure. - * - * @b Example - * - RSI_IR_OffDuration(IR , 20); \n - * - In the above parameter we get off time of (1/32K)*20 = 0.625ms - */ -STATIC INLINE rsi_error_t RSI_IR_OffDuration(IR_Type *pIr, uint32_t off_duration) -{ - if (off_duration > MAX_OFF_DURATION) { - return INVALID_PARAMETERS; - } - pIr->IR_OFF_TIME_DURATION_b.IR_OFF_TIME_DURATION = (unsigned int)(off_duration & 0x1FFFF); - return RSI_OK; -} - -/*===================================================*/ -/** - * @fn rsi_error_t RSI_IR_OnDuration(IR_Type* pIr , uint16_t on_duration) - * @brief This API is used to configure the off duration of IR decoder - * @param[in] pIr : IR type pointer - * @param[in] on_duration : IR Sleep duration timer value. Programmable value for ON duration - * for power cycling on External IR Sensor. - * Count to be programmed write to clock ticks of 32KHz clock. - * Programmed value is (1/32K)*on_duration - * @return return zero \ref RSI_OK on success and return error code on failure. - * - * @b Example - * - RSI_IR_OnDuration(IR , 20); \n - * - In the above parameter we get off time of (1/32K)*20 = 0.625ms - */ -STATIC INLINE rsi_error_t RSI_IR_OnDuration(IR_Type *pIr, uint16_t on_duration) -{ - if (on_duration > MAX_ON_DURATION) { - return INVALID_PARAMETERS; - } - pIr->IR_ON_TIME_DURATION_b.IR_ON_TIME_DURATION = (unsigned int)(on_duration & 0x0FFF); - return RSI_OK; -} - -/*===================================================*/ -/** - * @fn void RSI_IR_SetConfiguration(IR_Type* pIr , uint32_t flags) - * @brief This API is used set the configure the IR modes - * @param[in] pIr : IR type pointer - * @param[in] flags : Ored values of IR configuration flags - * - \ref CONFIG_SREST_IR_CORE - * - \ref CONFIG_EN_CONT_IR_DET - * - \ref CONFIG_EN_CONT_IR_DET - * - \ref CONFIG_EN_CONT_IR_DET - * - \ref CONFIG_EN_CONT_IR_DET - * @return none - * - * @b Example - * - RSI_IR_SetConfiguration(IR , (CONFIG_SREST_IR_CORE | CONFIG_EN_CONT_IR_DET)); - */ -STATIC INLINE void RSI_IR_SetConfiguration(IR_Type *pIr, uint32_t flags) -{ - pIr->IR_CONFIG |= flags; -} - -/*===================================================*/ -/** - * @fn void RSI_IR_ClrConfiguration(IR_Type* pIr , uint32_t flags) - * @brief This API is used clear configure the IR modes - * @param[in] pIr : IR type pointer - * @param[in] flags : Ored values of IR configuration flags - * - \ref CONFIG_SREST_IR_CORE - * - \ref CONFIG_EN_CONT_IR_DET - * - \ref CONFIG_EN_CONT_IR_DET - * - \ref CONFIG_EN_CONT_IR_DET - * - \ref CONFIG_EN_CONT_IR_DET - * @return none - * - * @b Example - * - RSI_IR_SetConfiguration(IR , (CONFIG_SREST_IR_CORE | CONFIG_EN_CONT_IR_DET)); - */ -STATIC INLINE void RSI_IR_ClrConfiguration(IR_Type *pIr, uint32_t flags) -{ - pIr->IR_CONFIG &= ~flags; -} - -/*===================================================*/ -/** - * @fn void RSI_IR_Restart(IR_Type* pIr) - * @brief This API is used clear configure the IR modes - * @param[in] pIr : IR type pointer - * @return none - * - * @b Example - * - RSI_IR_SetConfiguration(IR); - */ -STATIC INLINE void RSI_IR_Restart(IR_Type *pIr) -{ - pIr->IR_CONFIG_b.IR_DET_RSTART = 1U; -} - -/*===================================================*/ -/** - * @fn rsi_error_t RSI_IR_Framedonethreshold(IR_Type* pIr,uint16_t frame_threshold) - * @brief This API is used count with respect to 32KHz clock after not more toggle are expected to a - * given pattern. - * @param[in] pIr : IR type pointer - * @param[in] frame_threshold : frame done threshold value. - * @return return zero \ref RSI_OK on success and return error code on failure. - * - * @b Example - * - RSI_IR_Framedonethreshold(IR,20); - */ -STATIC INLINE rsi_error_t RSI_IR_Framedonethreshold(IR_Type *pIr, uint16_t frame_threshold) -{ - if (frame_threshold > MAX_FRAMEDONE_THRESHOLD) { - return INVALID_PARAMETERS; - } - pIr->IR_FRAME_DONE_THRESHOLD_b.IR_FRAME_DONE_THRESHOLD = (unsigned int)(frame_threshold & 0x7FFF); - return RSI_OK; -} - -/*===================================================*/ -/** - * @fn rsi_error_t RSI_IR_Detectionthreshold(IR_Type* pIr,uint16_t detection_threshold) - * @brief This API is used minimum number of edges to detected during on-time failing which - * IR detection is re-stated. - * @param[in] pIr : IR type pointer - * @param[in] detection_threshold : detection threshold value. - * @return return zero \ref RSI_OK on success and return error code on failure. - * - * @b Example - * - RSI_IR_Detectionthreshold(IR,20); - */ -STATIC INLINE rsi_error_t RSI_IR_Detectionthreshold(IR_Type *pIr, uint16_t detection_threshold) -{ - if (detection_threshold > MAX_DETECTION_THRESHOLD) { - return INVALID_PARAMETERS; - } - pIr->IR_DET_THRESHOLD_b.IR_DET_THRESHOLD = (unsigned int)(detection_threshold & 0x7F); - return RSI_OK; -} - -/*===================================================*/ -/** - * @fn void RSI_IR_MemoryReadEnable(IR_Type* pIr) - * @brief This API is used enable the memory read option. - * @param[in] pIr : IR type pointer - * @return return zero \ref RSI_OK on success and return error code on failure. - * - * @b Example - * - RSI_IR_MemoryReadEnable(IR); - */ -STATIC INLINE void RSI_IR_MemoryReadEnable(IR_Type *pIr) -{ - pIr->IR_MEM_ADDR_ACCESS_b.IR_MEM_RD_EN = 1U; -} - -/*===================================================*/ -/** - * @fn uint32_t RSI_IR_GetMemoryDepth(IR_Type* pIr) - * @brief This API returns the IR data samples depth - * @param[in] pIr : IR type pointer - * @return number samples received - * - * @b Example - * - memory_depth = RSI_IR_GetMemoryDepth(IR); - */ -STATIC INLINE uint32_t RSI_IR_GetMemoryDepth(IR_Type *pIr) -{ - return pIr->IR_MEM_READ_b.IR_DATA_MEM_DEPTH; -} - -uint16_t RSI_IR_ReadData(IR_Type *pIr, uint16_t memory_address); -void RSI_IR_SoftwareRestart(IR_Type *pIr); -void IRQ015_Handler(void); -#ifdef __cplusplus -} -#endif - -#endif //RSI_IR_H -/** @} */ diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdioh.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdioh.h deleted file mode 100644 index ed810fbfb..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdioh.h +++ /dev/null @@ -1,205 +0,0 @@ -/******************************************************************************* -* @file rsi_sdioh.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "RS1xxxx.h" -#include "base_types.h" -#include "rsi_smih.h" - -#ifndef RSI_SDIOH_H -#define RSI_SDIOH_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(__CC_ARM) -#pragma push -#pragma anon_unions -#elif defined(__ICCARM__) -#pragma language = extended -#elif defined(__GNUC__) -// anonymous unions are enabled by default -#elif defined(__TMS470__) -// anonymous unions are enabled by default -#elif defined(__TASKING__) -#pragma warning 586 -#else -#warning Not supported compiler type -#endif - -#define MAX_SD_RETRY_TIME (500) -#define BIT4_BUS_WIDTH_ARG (0x80000E82) -#define BIT4_BUS_WIDTH_SET_ARG (0x00000E00) -#define LOW_SPEED_CHECK_ARG (0x00001000) -#define IO_BLOCKSIZE_ARG (0x80022000) -#define IO_BLOCKSIZE_ARG_1 (0x80022201) -#define HIGH_SPEED_SPRT_ARG (0x00002600) -#define SELECT_FUNC_ARG (0x00001A00) -#define RESET_ARG (0x80000C08) -#define CCCR_BYTE_READ (0x04000016) -#define CD_DISABLE_ARG (0x80000E80) -// Function1 argument -#define FUCNTION1_CHECK_ARG (0x00000400) -#define FUCNTION1_ENB_ARG (0x80000402) -#define FUCNTION1_READY_ARG (0x00000600) -#define FUNCTION1_INTR_ENB_ARG (0x80000803) -#define FUNCTION1_INTR_CHECK_ARG (0x00000800) -#define FUNCTION1_READY (1 << 1) -#define FUNCTION1_ENABLE (1 << 1) -#define CSA_SUPPORT_ARG (0x00020000) -#define CSA_ENABLE_ARG (0x80020080) - -// Function2 argument -#define FUCNTION2_CHECK_ARG (0x00000400) -#define FUCNTION2_ENB_ARG (0x80000404) -#define FUCNTION2_READY_ARG (0x00000600) -#define FUNCTION2_INTR_ENB_ARG (0x80000805) -#define FUNCTION2_READY (1 << 2) -#define FUNCTION2_ENABLE (1 << 2) -#define LOW_SPEED_CHECK (1 << 6) -#define BIT4_MODE_CHECK (1 << 7) -#define BUS_BIT (1 << 1) - -#define SD_ACMD_OFFSET (0x40) -#define MMC_CMD_TAG (0x80) -#define ARG_ACMD41_BUSY (0x80000000) -#define OCR_CAPACITY_MASK (0x40000000) - -#define CHECK_HIGH_SPEED_SUPPORT (0x00002600) -#define ENABLE_HIGH_SPEED_MODE_ARG \ - (0x80002602) // SDIO_CMD52 ARG(CCR REG OFFSET IS 0X13 IE:13 LEFT SHIF BY 9,HERE 9 MEANS 8 BITS DATA AND 1 BIT STUFF IN CMD 52(SETTING BIT 1 IN 13TH PFFSET)) - -#define CHECK_UHS_SUPPORT_MODES \ - (0x00002800) // SDIO_CMD52 ARG(CCR REG OFFSET IS 0X14 IE:14 LEFT SHIF BY 9,HERE 9 MEANS 8 BITS DATA AND 1 BIT STUFF IN CMD 52) (CHECK ARGMENT) -#define UHS_1_SDR25_MODE_ARG \ - (0x80002602) // SDIO_CMD52 ARG(CCR REG OFFSET IS 0X13 IE:13 LEFT SHIF BY 9,HERE 9 MEANS 8 BITS DATA AND 1 BIT STUFF IN CMD 52(SETTING BIT 1 IN 13TH PFFSET)) -#define UHS_1_SDR50_MODE_ARG (0x80002604) // BIT 2 SETTING IN 13TH OFFSET -#define UHS_1_SDR104_MODE_ARG (0x80002606) // SETTING BIT 1 AND 2 IN 13TH OFFSET (CCCR REG) -#define UHS_1_DDR50_MODE_ARG (0x80002608) // SETTING BIT 3 IN 13TH OFFSET - -#define HIGH_SPEED_BIT BIT(0) -#define UHS_SUPPORT_BITS 0x7 // bit 0,1,2 - -#define SDIO_SET1 1 - -#if SDIO_SET1 -#define SDIO_CLK_PIN 46 -#define SDIO_CLK_PAD 11 -#define SDIO_CLK_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_CMD_PIN 47 -#define SDIO_CMD_PAD 11 -#define SDIO_CMD_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D0_PIN 48 -#define SDIO_D0_PAD 11 -#define SDIO_D0_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D1_PIN 49 -#define SDIO_D1_PAD 12 -#define SDIO_D1_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D2_PIN 50 -#define SDIO_D2_PAD 12 -#define SDIO_D2_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D3_PIN 51 -#define SDIO_D3_PAD 12 -#define SDIO_D3_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_CD_PIN 53 -#define SDIO_CD_PAD 13 -#define SDIO_CD_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_WP_PIN 52 -#define SDIO_WP_PAD 13 -#define SDIO_WP_MUX EGPIO_PIN_MUX_MODE8 -#else -#define SDIO_CLK_PIN 25 -#define SDIO_CLK_PAD 0 // no pad -#define SDIO_CLK_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_CMD_PIN 26 -#define SDIO_CMD_PAD 0 // no pad -#define SDIO_CMD_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D0_PIN 27 -#define SDIO_D0_PAD 0 // no pad -#define SDIO_D0_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D1_PIN 28 -#define SDIO_D1_PAD 0 // no pad -#define SDIO_D1_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D2_PIN 29 -#define SDIO_D2_PAD 0 // no pad -#define SDIO_D2_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_D3_PIN 30 -#define SDIO_D3_PAD 0 // no pad -#define SDIO_D3_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_CD_PIN 53 -#define SDIO_CD_PAD 13 -#define SDIO_CD_MUX EGPIO_PIN_MUX_MODE8 - -#define SDIO_WP_PIN 52 -#define SDIO_WP_PAD 13 -#define SDIO_WP_MUX EGPIO_PIN_MUX_MODE8 -#endif - -// COMMMANDS VALUE -#define CMD_53 53 -#define CMD_52 52 -#define CMD_5 5 - -#if defined(__CC_ARM) -#pragma pop -#elif defined(__ICCARM__) -// leave anonymous unions enabled -#elif defined(__GNUC__) -// anonymous unions are enabled by default -#elif defined(__TMS470__) -// anonymous unions are enabled by default -#elif defined(__TASKING__) -#pragma warning restore -#else -#warning Not supported compiler type -#endif -void RSI_SDIOH_PinMux(void); -rsi_error_t RSI_SDIOH_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event); -rsi_error_t RSI_SDIOH_RegisterInfo(SMIH_CARD_CONFIG_T *pSmihConfig, SMIH_CCCR_REG_INFO_T *pRegInfo); -rsi_error_t RSI_SDIOH_WriteCommandCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument); -rsi_error_t RSI_SDIOH_ReadCommandCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument); -rsi_error_t RSI_SDIOH_SetBusWidthCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg); -rsi_error_t RSI_SDIOH_BusWidthConfig(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t BusWidth); -rsi_error_t RSI_SDIOH_GoIdleStateCmd0(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDIOH_SendRelativeCardAddressCmd3(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg); -rsi_error_t RSI_SDIOH_SwitchVoltageCmd11(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg); -rsi_error_t RSI_SDIOH_SelectCardCmd7(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDIOH_ByteBlockWriteCmd53(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t *pData, uint32_t Addr); -rsi_error_t RSI_SDIOH_ByteBlockReadCmd53(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t *pData, uint32_t Addr); -rsi_error_t RSI_SDIOH_ReInitializationCmd5(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDIOH_InitializationCmd5(SMIH_CARD_CONFIG_T *pSmihConfig); - -#ifdef __cplusplus -} -#endif - -#endif // RSI_SDIOH_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdmem.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdmem.h deleted file mode 100644 index 985705257..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_sdmem.h +++ /dev/null @@ -1,219 +0,0 @@ -/******************************************************************************* -* @file rsi_sdmem.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "RS1xxxx.h" -#include "base_types.h" -#include "rsi_smih.h" - -#ifndef RSI_SDMEM_H -#define RSI_SDMEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define MMC_CARDS 0 // Enable this if MMC card is using -#define _8BIT_MODE 0 -#define _1BIT_MODE 0 -#define GPIO_SET1 1 -#define CD_WPP_SET1 0 - -#define HIGH_SPEED_EN 0 -#define ADMA_ENABLE 0 -#define SD_CLOCK 25000000 -#define __1P8_VOLTAGE_EN 0 - -#if GPIO_SET1 -#define SD_CLK_PIN 46 -#define SD_CLK_PAD 11 -#define SD_CLK_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_CMD_PIN 47 -#define SD_CMD_PAD 11 -#define SD_CMD_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D0_PIN 48 -#define SD_D0_PAD 11 -#define SD_D0_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D1_PIN 49 -#define SD_D1_PAD 12 -#define SD_D1_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D2_PIN 50 -#define SD_D2_PAD 12 -#define SD_D2_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D3_PIN 51 -#define SD_D3_PAD 12 -#define SD_D3_MUX EGPIO_PIN_MUX_MODE8 - -#if CD_WPP_SET1 -#define SD_CD_PIN 6 -#define SD_CD_PAD 1 -#define SD_CD_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_WP_PIN 7 -#define SD_WP_PAD 1 -#define SD_WP_MUX EGPIO_PIN_MUX_MODE8 -#else -#define SD_CD_PIN 53 -#define SD_CD_PAD 13 -#define SD_CD_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_WP_PIN 52 -#define SD_WP_PAD 13 -#define SD_WP_MUX EGPIO_PIN_MUX_MODE8 -#endif - -#else -#define SD_CLK_PIN 25 -#define SD_CLK_PAD 0 // no pad -#define SD_CLK_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_CMD_PIN 26 -#define SD_CMD_PAD 0 // no pad -#define SD_CMD_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D0_PIN 27 -#define SD_D0_PAD 0 // no pad -#define SD_D0_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D1_PIN 28 -#define SD_D1_PAD 0 // no pad -#define SD_D1_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D2_PIN 29 -#define SD_D2_PAD 0 // no pad -#define SD_D2_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D3_PIN 30 -#define SD_D3_PAD 0 // no pad -#define SD_D3_MUX EGPIO_PIN_MUX_MODE8 -#if CD_WPP_SET1 -#define SD_CD_PIN 6 -#define SD_CD_PAD 1 -#define SD_CD_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_WP_PIN 7 -#define SD_WP_PAD 1 -#define SD_WP_MUX EGPIO_PIN_MUX_MODE8 -#else -#define SD_CD_PIN 53 -#define SD_CD_PAD 13 -#define SD_CD_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_WP_PIN 52 -#define SD_WP_PAD 13 -#define SD_WP_MUX EGPIO_PIN_MUX_MODE8 -#endif - -#endif - -#if _8BIT_MODE -#if (PACKAGE_TYPE == CC0) || (PACKAGE_TYPE == SB0N_B00) || (PACKAGE_TYPE == SB00_B00) -#define SD_D4_PIN 54 -#define SD_D4_PAD 13 -#define SD_D4_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D5_PIN 55 -#define SD_D5_PAD 13 -#define SD_D5_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D6_PIN 56 -#define SD_D6_PAD 14 -#define SD_D6_MUX EGPIO_PIN_MUX_MODE8 - -#define SD_D7_PIN 57 -#define SD_D7_PAD 14 -#define SD_D7_MUX EGPIO_PIN_MUX_MODE8 -#else -#error "8BIT mode not supported in this package" -#endif -#endif - -#define ACMD41_VOLTAGE (0x00FF8000) -#define ACMD41_UHS_REQ (0x41FF8000) -#define ACMD41_HCS (1 << 30) - -#define SD_ACMD_OFFSET (0x40) -#define MMC_CMD_TAG (0x80) -#define ACMD41_BUSY_BIT BIT(31) -#define ACMD41_OCR_BIT BIT(30) - -// COMMMANDS VALUE -#define CMD_8 8 -#define CMD_55 55 -#define CMD_11 11 -#define CMD_1 1 -#define CMD_2 2 -#define CMD_3 3 -#define CMD_9 9 -#define CMD_7 7 -#define CMD_6 6 -#define CMD_24 24 -#define CMD_25 25 -#define CMD_18 18 -#define CMD_17 17 -#define CMD_80_hex 0x80 -#define CMD_40_hex 0x40 -#define CMD_8 8 -#define CMD_41 41 - -// POSITION VALUE -#define BLOCK_SIZE_512 512 - -// SDMEM related function prototypes -void RSI_SDMEM_PinMux(void); -rsi_error_t RSI_SDMEM_GoIdleStateCmd0(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDMEM_SendCardInterfaceConditionCmd8(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMEM_SendApplicationCommandCmd55(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMEM_SetCardOperationConditionAcmd41(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMEM_SwitchVoltageCmd11(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg); -rsi_error_t RSI_SDMEM_SendCidCmd2(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDIOH_SendRelativeAddressCmd3(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg); -rsi_error_t RSI_SDMEM_SendCsdCmd9(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDMEM_SelectCardCmd7(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDMEM_SetBusWidthAcmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMEM_OperationSwitchFunctionReadCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument); -rsi_error_t RSI_SDMEM_GetCardOperationConditionAcmd41(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMEM_CardBusWidthConfig(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t BusWidth); -rsi_error_t RSI_SDMEM_OperationSwitchFunctionWriteCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument); -rsi_error_t RSI_SDMEM_BlocksWrite(SMIH_CARD_CONFIG_T *pSmihConfig, - const uint8_t *DataIn, - uint32_t BlockIndex, - uint32_t BlockCount); -rsi_error_t RSI_SDMEM_BlocksRead(SMIH_CARD_CONFIG_T *pSmihConfig, - uint8_t *DataOut, - uint32_t BlockIndex, - uint32_t BlockCount); -rsi_error_t RSI_SDMEM_EnableHighSpeed(SMIH_CARD_CONFIG_T *pSmihConfig, boolean_t HighSpeed, uint32_t Clock); -rsi_error_t RSI_SDMEM_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event); -rsi_error_t RSI_SDMMC_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event); -rsi_error_t RSI_SDMMC_SendOperationConditionCmd1(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMMC_SendExtentCsdCmd(SMIH_CARD_CONFIG_T *pSmihConfig); -rsi_error_t RSI_SDMMC_ChangeBusWidthMode(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t bus_wdith); -rsi_error_t RSI_SDMMC_SwitchFunctionCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg); -rsi_error_t RSI_SDMMC_HighSpeedMode(SMIH_CARD_CONFIG_T *pSmihConfig, boolean_t HighSpeed, uint32_t Clock); - -#ifdef __cplusplus -} -#endif - -#endif // RSI_SDMEM_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_smih.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_smih.h deleted file mode 100644 index 6309cf662..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_smih.h +++ /dev/null @@ -1,486 +0,0 @@ -/******************************************************************************* -* @file rsi_smih.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "RS1xxxx.h" -#include "base_types.h" - -#ifndef RSI_SMIH_H -#define RSI_SMIH_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(__CC_ARM) -#pragma push -#pragma anon_unions -#elif defined(__ICCARM__) -#pragma language = extended -#elif defined(__GNUC__) -// anonymous unions are enabled by default -#elif defined(__TMS470__) -// anonymous unions are enabled by default -#elif defined(__TASKING__) -#pragma warning 586 -#else -#warning Not supported compiler type -#endif - -#define ACMD41_VOLTAGE (0x00FF8000) -#define ACMD41_UHS_REQ (0x41FF8000) -#define ACMD41_HCS (1 << 30) - -// SMIH Controller related defines and structures -typedef void (*ARM_SMIH_SignalEvent_t)(uint32_t event); // Pointer to \ref ARM_USART_SignalEvent : Signal USART Event. - -#define LOOP_COUNT_TIME (500) - -// Normal interrupt status enable reg -#define COMMAND_COMPLETE_STATUS_ENABLE BIT(0) -#define TRANSFER_COMPLETE_STATUS_ENABLE BIT(1) -#define BLOCK_GAP_EVENT_STATUS_ENABLE BIT(2) -#define DMA_INTERRUPT_STATUS_ENABLE BIT(3) -#define BUFFER_WRITE_READY_STATUS_ENABLE BIT(4) -#define BUFFER_READ_READY_STATUS_ENABLE BIT(5) -#define CARD_INSERTION_STATUS_ENABLE BIT(6) -#define CARD_REMOVAL_STATUS_ENABLE BIT(7) -#define CARD_INTERRUPT_STATUS_ENABLE BIT(8) -#define INT_A_STATUS_ENABLE BIT(9) -#define INT_B_STATUS_ENABLE BIT(10) -#define INT_C_STATUS_ENABLE BIT(11) -#define RE_TUNING_EVENT_STATUS_ENABLE BIT(12) - -// Error interrupt status enables -#define COMMAND_TIMEOUT_ERROR_STATUS_ENABLE BIT(0) -#define COMMAND_CRC_ERROR_STATUS_ENABLE BIT(1) -#define COMMAND_END_BIT_ERROR_STATUS_ENABLE BIT(2) -#define COMMAND_INDEX_ERROR_STATUS_ENABLE BIT(3) -#define DATA_TIMEOUT_ERROR_STATUS_ENABLE BIT(4) -#define DATA_CRC_ERROR_STATUS_ENABLE BIT(5) -#define DATA_END_BIT_ERROR_STATUS_ENABLE BIT(6) -#define CURRENT_LIMIT_ERROR_STATUS_ENABLE BIT(7) -#define AUTO_CMD_ERROR_STATUS_ENABLE BIT(8) -#define ADMA_ERROR_STATUS_ENABLE BIT(9) -#define TUNING_ERROR_STATUS_ENABLE BIT(10) - -// Normal interrupt status enable reg -#define COMMAND_COMPLETE_SIGNAL_ENABLE BIT(0) -#define TRANSFER_COMPLETE_SIGNAL_ENABLE BIT(1) -#define BLOCK_GAP_EVENT_SIGNAL_ENABLE BIT(2) -#define DMA_INTERRUPT_SIGNAL_ENABLE BIT(3) -#define BUFFER_WRITE_READY_SIGNAL_ENABLE BIT(4) -#define BUFFER_READ_READY_SIGNAL_ENABLE BIT(5) -#define CARD_INSERTION_SIGNAL_ENABLE BIT(6) -#define CARD_REMOVAL_SIGNAL_ENABLE BIT(7) -#define CARD_INTERRUPT_SIGNAL_ENABLE BIT(8) -#define INT_A_SIGNAL_ENABLE BIT(9) -#define INT_B_SIGNAL_ENABLE BIT(10) -#define INT_C_SIGNALS_ENABLE BIT(11) -#define RE_TUNING_EVENT_SIGNAL_ENABLE BIT(12) - -#define DISABLE_AUTO_CMD 0 -#define ENABLE_AUTO_CMD12 1 -#define ENABLE_AUTO_CMD23 2 - -// Command type defines -#define ABORT_CMD 0 -#define RESUME_CMD 1 -#define SUSPEND_CMD 2 -#define NORMAL_CMD 3 - -// response type defines -#define SMIH_NO_RESPONSE 0 -#define SMIH_RESPONSE_LENGTH_136 1 -#define SMIH_RESPONSE_LENGTH_48 2 -#define SMIH_RESPONSE_LENGTH_48BIT_BUSY_CHECK 3 - -// ultra high speed mode defines -#define UHS_NONE 0x0 -#define UHS_SDR12 0x1 -#define UHS_SDR25 0x2 -#define UHS_SDR50 0x3 -#define UHS_SDR104 0x4 -#define UHS_DDR50 0x5 - -// response types to the commands -#define SMIH_RESPONSE_NONE 0x0 -#define SMIH_RESPONSE_R2 0x1 -#define SMIH_RESPONSE_R3R4 0x2 -#define SMIH_RESPONSE_R1R5R6R7 0x3 -#define SMIH_RESPONSE_R1BR5B 0x5 - -// smih volatge level defines -#define VOLTAGE_18V 0x0 -#define VOLTAGE_30V 0x1 -#define VOLTAGE_33V 0x2 - -// reset defines -#define SMIH_DATA_LINE_RESET 0x0 -#define SMIH_COMMAND_LINE_RESET 0x1 -#define SMIH_ALL_RESET 0x2 - -#define SMIH_CARD_STANDARD 0x0 -#define SMIH_CARD_HIGH_CAPACITY 0x1 - -// data direction defines -#define SMIH_WRITE_DIRECTION 0x0 -#define SMIH_READ_DIRECTION 0x1 - -// command events defines -#define SMIH_CMD_COMPLETE_EVENT 0x1 -#define SMIH_TRANSFER_COMPLETE_EVENT 0x2 -#define SMIH_BUFFER_READ_READY_EVENT 0x3 -#define SMIH_BUFFER_WRITE_READY_EVENT 0x4 - -// bus width mode defines -#define SMIH_BUS_WIDTH1 0x0 -#define SMIH_BUS_WIDTH4 0x1 -#define SMIH_BUS_WIDTH8 0x2 -typedef struct SMIH_COMMAND_REG { - uint16_t respType : 2; - uint16_t resrvd : 1; - uint16_t cmdCrcCheckEnable : 1; - uint16_t cmdIndexCheckEnable : 1; - uint16_t dataPresentSelect : 1; - uint16_t cmdType : 2; - uint16_t cmdIndex : 6; -} SMIH_COMMAND_REG_T; - -typedef struct SMIH_COMMAND_FRAME_CONFIG { - uint8_t cmdIndex; - uint32_t cmdArgument; - uint8_t cmdType; - boolean_t dataPresentSelect; - boolean_t cmdIndexCheckEn; - boolean_t cmdCrcCheckEn; - uint8_t responseTypeSelect; - uint8_t autoCmdType; -} SMIH_COMMAND_FRAME_CONFIG_T; - -typedef struct SMIH_EVENT { - uint8_t commandComplete; - uint8_t transferComplete; - uint8_t dmaInterrupt; - uint8_t bufferWriteReady; - uint8_t bufferReadReady; - uint8_t cardInsertion; - uint8_t cardRemoval; - uint8_t cardInterrupt; - uint8_t commandTimeoutError; - uint8_t commandCrcError; - uint8_t commandEndBitError; - uint8_t commandIndexError; - uint8_t dataTimeoutError; - uint8_t dataEndbitError; - uint8_t dataCrcError; - uint8_t currentLimitError; - uint8_t autoCommandError; - uint8_t admaError; - uint8_t tuningError; - ARM_SMIH_SignalEvent_t callb_event; -} SMIH_EVENT_T; - -#define COMMAND_COMPLETE 0 -#define TRANSFER_COMPLETE 1 -#define DMA_INTR 2 -#define BUFFER_WRITE_READY 3 -#define BUFFER_READ_READY 4 -#define CARD_INSERTION 5 -#define CARD_REMOVAL 6 -#define CARD_INTERRUPT 7 -#define CMD_TIMEOUT_ERROR 8 -#define CMD_CRC_ERROR 9 -#define CMD_END_BIT_ERROR 10 -#define CMD_INDEX_ERROR 11 -#define DATA_TIMEOUT_ERROR 12 -#define DATA_END_BIT_ERROR 13 -#define DATA_CRC_ERROR 14 -#define CURRENT_LIMIT_ERROR 15 -#define AUTO_CMD_ERROR 16 -#define ADMA_ERROR 17 -#define TUNING_ERROR 18 - -typedef struct SMIH_CMD_FEILD { - uint32_t cmdIdx; - uint32_t cmdArg; - uint8_t responseTypeSelect; - uint32_t response[4]; - SMIH_EVENT_T event; -} SMIH_CMD_FEILD_T; - -typedef struct SMIH_DATA_FEILD { - const uint8_t *data; - uint32_t blockSize; - uint32_t blockCount; - uint8_t direction; -} SMIH_DATA_FEILD_T; - -typedef struct SMIH_TRANSFER { - SMIH_CMD_FEILD_T *command; - SMIH_DATA_FEILD_T *data; - -} SMIH_TRANSFER_T; - -typedef struct SMIH_DATA_CONFIG { - boolean_t multiBlock; - boolean_t dataTransferDirection; - uint16_t blockSize; - uint16_t blockCount; - boolean_t blockCountEnable; - boolean_t dmaEnable; - uint32_t admaDespTableAddress; - uint8_t dataTimeout; -} SMIH_DATA_CONFIG_T; - -typedef struct SMIH_CONFIG_MODES { - uint8_t busWidthMode; - uint32_t clock; - boolean_t highSpeedEnable; - boolean_t admaMode; -} SMIH_CONFIG_MODES_T; - -typedef struct SMIH_ADMA_DESC_TABLE { - uint16_t attributeValid : 1; - uint16_t attributeEnd : 1; - uint16_t attributeInt : 1; - uint16_t reserved1 : 1; - uint16_t attributeAct : 2; - uint16_t reserved2 : 10; - uint16_t length; - uint32_t _32BIT_Adress; -} SMIH_ADMA_DESC_TABLE_T; - -typedef struct SMIH_CMD_OCR { - uint32_t reserved1 : 8; - uint32_t v20_21 : 1; - uint32_t v21_22 : 1; - uint32_t v22_23 : 1; - uint32_t v23_24 : 1; - uint32_t v24_25 : 1; - uint32_t v25_26 : 1; - uint32_t v26_27 : 1; - uint32_t v27_28 : 1; - uint32_t v28_29 : 1; - uint32_t v29_30 : 1; - uint32_t v30_31 : 1; - uint32_t v31_32 : 1; - uint32_t v32_33 : 1; - uint32_t v33_34 : 1; - uint32_t v34_35 : 1; - uint32_t v35_36 : 1; - uint32_t s18A : 1; - uint32_t reserved2 : 2; - uint32_t memPresent : 1; - uint32_t ioNum : 3; - uint32_t cardReady : 1; -} SMIH_CMD_OCR_T; -// command transfer function. -typedef rsi_error_t (*cmd_transfer_function_t)(SMIH_TRANSFER_T *Transfer); - -typedef struct SMIH_CARD_CONFIG { - uint8_t busWidthMode; - uint32_t clock; - boolean_t highSpeedEnable; - uint8_t uhsModeSelect; - uint32_t voltage; - boolean_t admaMode; - uint16_t byteBlockSize; - uint16_t numberOfBlocks; - uint8_t funcNum : 3; - uint8_t blockModeEnable : 1; - uint8_t opCode : 1; - SMIH_CMD_OCR_T ocr; - uint8_t cardType; - uint32_t maxSectorNum; - uint8_t cid[16]; - uint8_t csd[16]; - uint16_t rca; - uint8_t response[4]; - cmd_transfer_function_t cmd_transfer; - -} SMIH_CARD_CONFIG_T; - -typedef struct SMIH_CCCR_REG_INFO { - __IO uint8_t ccidSdioRevReg; - __IO uint8_t sdSpecRevReg; - __IO uint8_t ioEnableReg; - __IO uint8_t ioReady; - __IO uint8_t intEnable; - __IO uint8_t intrPending; - __IO uint8_t ioAbort; - __IO uint8_t busControl; - __IO uint8_t cardCapacity; - __IO uint8_t commonCisPointer; - __IO uint8_t commonCisPointer1; - __IO uint8_t commonCisPointer2; - __IO uint8_t busSped; - __IO uint8_t funcSelect; - __IO uint8_t execFlags; - __IO uint8_t redayFlags; - __IO uint16_t funcoBlockSize; - __IO uint8_t powerControl; - __IO uint8_t busSpeddSelect; - __IO uint8_t uhs1Support; - __IO uint8_t driverStrength; - __IO uint8_t intrExtension; -} SMIH_CCCR_REG_INFO_T; - -typedef struct SD_CARD_STATUS_REG { - uint32_t reserved1 : 3; - uint32_t sequenceEerror : 1; - uint32_t reserved2 : 1; - uint32_t applicationCmd : 1; - uint32_t reserved3 : 2; - uint32_t readyForData : 1; - uint32_t currentStatus : 4; - uint32_t eraseReset : 1; - uint32_t cardEccDisable : 1; - uint32_t wpEraseSkip : 1; - uint32_t csdOverwrite : 1; - uint32_t reserved4 : 2; - uint32_t error : 1; - uint32_t ccError : 1; - uint32_t cardEccFail : 1; - uint32_t illegalCmd : 1; - uint32_t commandCrcError : 1; - uint32_t lockUnlockFail : 1; - uint32_t cradIsLOcked : 1; - uint32_t wpViolation : 1; - uint32_t erasePram : 1; - uint32_t eraseSeqError : 1; - uint32_t blockLenghtError : 1; - uint32_t addressError : 1; - uint32_t outOfRange : 1; -} SD_CARD_STATUS_REG_T; - -typedef struct CSD_REG_VERSION1 { - uint8_t reserved1 : 2; - uint8_t fileFormat : 2; - uint8_t temporaryWriteProtect : 1; - uint8_t permanantWriteProtect : 1; - uint8_t copy : 1; - uint8_t fileFormatGroup : 1; - uint8_t reserved2 : 5; - uint8_t writeBlockLengthPartial : 1; - uint8_t writeBlockLength : 4; - uint8_t R2WFactor : 3; - uint8_t reserved3 : 2; - uint8_t wpGrpEnable : 1; - uint8_t wpGrpSize : 7; - uint8_t sectorSize : 7; - uint8_t eraseBlockEn : 1; - uint8_t deviceSizeMultiplier1 : 1; - uint8_t deviceSizeMultiplier2 : 2; - uint8_t vddWCrrMax : 3; - uint8_t vddWcurrMin : 3; - uint8_t vddRcurrMax : 3; - uint8_t vddRcurrmin : 3; - uint8_t deviceSize1 : 2; - uint8_t deviceSize2 : 8; - uint8_t deviceSize3 : 2; - uint8_t reserved4 : 2; - uint8_t dsrIMP : 1; - uint8_t readBlockMisallign : 1; - uint8_t writeBlockMisallign : 1; - uint8_t readBlockPartial : 1; - uint8_t readBlockLength : 4; - uint8_t ccc1 : 4; - uint8_t ccc2 : 8; - uint8_t transferSpeed : 8; - uint8_t nsac : 8; - uint8_t taac : 8; - uint8_t RESERVE5 : 6; - uint8_t csdStructure : 2; -} CSD_REG_VERSION1_T; - -typedef struct CSD_REG_VERSION2 { - uint8_t RESERVED1 : 2; - uint8_t fileFormat : 2; - uint8_t temporaryWriteProtect : 1; - uint8_t permanantWriteProtect : 1; - uint8_t copy : 1; - uint8_t fileFormatGroup : 1; - uint8_t reserved2 : 5; - uint8_t writeBlockLengthPartial : 1; - uint8_t writeBlockLength : 4; - uint8_t R2WFactor : 3; - uint8_t reserved3 : 2; - uint8_t wpGrpEnable : 1; - uint8_t wpGrpSize : 7; - uint8_t sectorSize : 7; - uint8_t eraseBlockEnable : 1; - uint8_t reserved4 : 1; - uint8_t deviceSize1 : 8; - uint8_t deviceSize2 : 8; - uint8_t deviceSize3 : 6; - uint8_t reserved5 : 2; - uint8_t reserved6 : 4; - uint8_t dsrIMP : 1; - uint8_t readBlockMisallign : 1; - uint8_t writeBlockMisallign : 1; - uint8_t readBlockPartial : 1; - uint8_t readBlockLength : 4; - uint8_t ccc1 : 4; - uint8_t ccc2 : 8; - uint8_t transferSpeed : 8; - uint8_t nsac : 8; - uint8_t taac : 8; - uint8_t reserved7 : 6; - uint8_t csdStructure : 2; -} CSD_REG_VERSION2_T; - -#if defined(__CC_ARM) -#pragma pop -#elif defined(__ICCARM__) -// leave anonymous unions enabled -#elif defined(__GNUC__) -// anonymous unions are enabled by default -#elif defined(__TMS470__) -// anonymous unions are enabled by default -#elif defined(__TASKING__) -#pragma warning restore -#else -#warning Not supported compiler type -#endif - -rsi_error_t RSI_SD_HostInit(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event, uint8_t MemType); -rsi_error_t Smih_DeInitialization(void); -rsi_error_t smih_bus_width_set(uint8_t BusWidthMode); -rsi_error_t smih_bus_voltage_select(uint8_t enVoltage); -rsi_error_t smih_send_command(SMIH_COMMAND_FRAME_CONFIG_T *pConfig); -rsi_error_t smih_get_response(uint16_t *pResponseData, uint8_t ResponseRegCount); -rsi_error_t smih_stop_at_block_gap(void); -rsi_error_t smih_transfer_restart(void); -void smih_18v_signal_enable(void); -rsi_error_t smih_uhs_mode_select(uint8_t UhsMode); -void smih_irq_handler(void); -rsi_error_t smih_modes_configuration(SMIH_CONFIG_MODES_T *pSmihConfig); -rsi_error_t smih_clock_config(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t freq); -rsi_error_t smih_check_for_error_interrupt(void); -rsi_error_t smih_send_data(SMIH_TRANSFER_T *pTransfer); -rsi_error_t smih_receive_data(SMIH_TRANSFER_T *pTransfer); -rsi_error_t smih_memory_command_transfer(SMIH_TRANSFER_T *pTransfer); -rsi_error_t smih_io_command_transfer(SMIH_TRANSFER_T *pTransfer); -void RegisterCallBack(ARM_SMIH_SignalEvent_t Event); - -#ifdef __cplusplus -} -#endif - -#endif // RSI_SMIH_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_vad.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_vad.h deleted file mode 100644 index 87fcd3bbc..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_vad.h +++ /dev/null @@ -1,164 +0,0 @@ -/******************************************************************************* -* @file rsi_vad.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -//Include Files - -#include "rsi_ccp_common.h" -#include "rsi_error.h" - -#ifndef RSI_VAD_H -#define RSI_VAD_H - -#ifdef __cplusplus -extern "C" { -#endif - -// VAD algorithm select enum -typedef enum VAD_ALGORITHM_SELECT { - ZCR, // select the ZCR algorithm for VAD detection - ACF, // select the ACF algorithm for VAD detection - AMDF, // select the AMDF algorithm for VAD detection - WACF, // select the WACF algorithm for VAD detection - ZCR_ACF_AMDF_WACF, // select the ZCR,ACF,AMDF and WACF algorithm for VAD detection - ZCR_ACF, // select the ZCR and ACF algorithm for VAD detection - ZCR_AMDF, // select the ZCR and ACF algorithm for VAD detection - ZCR_WACF // select the ZCR and WACF algorithm for VAD detection -} VAD_ALGORITHM_SELECT_T; - -// AMDF threshold configuration structure (Future usage) -typedef struct { - uint32_t null_threshold : 12; - uint32_t null_threshold_count : 10; - uint32_t peak_threshold : 10; - uint32_t peak_threshold_count : 10; -} VAD_AMDF_THRESHOLD_T; - -typedef VAD_Type RSI_VAD_T; - -#define VAD_PING_IRQHandler IRQ000_Handler // VAD ping interrupt -#define VAD_1SMPLS_PER_ADDR 0x2 -#define VAD_2SMPLS_PER_ADDR 0x1 -#define VAD_4SMPLS_PER_ADDR 0x0 -#define VAD_INTREG_SOURCE 0x0 // Feed voice data to VAD through VAD input register -#define VAD_AUXADC_SOURCE 0x3 // Directly feed ADC data to VAD (This feature not available) -#define VAD_METHOD_ZCR 0x0 -#define VAD_METHOD_ACF 0x1 -#define VAD_METHOD_AMDF 0x2 -#define VAD_METHOD_WACF 0x3 -#define VAD_METHOD_ZCR_ACF_AMDF_WACF 0x4 -#define VAD_METHOD_ZCR_ACF 0x5 -#define VAD_METHOD_ZCR_AMDF 0x6 -#define VAD_METHOD_ZCR_WACF 0x7 - -// Algorithm level threshold -#define VAD_ACF_START 0x05 -#define VAD_ACF_END 0x50 -#define VAD_ACF_THRSHOLD 1000 -#define VAD_ZCR_THRSHOLD 0x190 - -// Energy detection threshold -#define VAD_ENERGY_THRSHOLD 0x32 - -#define MAXIMUM_VALUE_1024 1024 -#define MAXIMUM_VALUE_4096 4096 -#define MAXIMUM_VALUE_4 4 -#define MAXIMUM_VALUE_8 8 - -#define VAD_DIGITAL_GAIN_FAC \ - 4 /*Digital multiplication value,if this value is 5 then each ADC sample will multiply by 32. - data = data << VAD_DIGITAL_GAIN_FAC */ -#define ULP_MEMORY_BASE 0x24060000 -#define TEST_SAMPL_VAL 32 -#define VAD_MASK_VALUE 0xFC00 - -#define DATA_FROM_INTER_ADC \ - 1 /* For feeding voice data to VAD from Si917 ADC then make this macro as 1, - This macro will enable the conversion of 12 bit ADC data to 16 bit data, - VAD is required 16 bit 2s complement data so if input to VAD not using - Si917 ADC output then make this macro as 0 and give proper input data to VAD */ -#define VAD_INTR 0 // VAD interrupt event -#define VAD_ENERGY_DETECT 1 // energy detection event -#define NUMBER_OF_SAMPLE_IN_FRAME 1023 // Maximum number of samples can process in VAD block -#define VAD_SCRT_PAD 0x1800 // Configure the BANK3 for VAD data processing - -typedef void (*VAD_SignalEvent_t)(uint32_t event); // Pointer to VAD Event. - -typedef struct VAD_EVENT { - uint8_t vad_intr; - uint8_t energy_detect; - uint8_t clk_config; - VAD_SignalEvent_t callb_event; -} VAD_EVENT_T; - -// User APIs -rsi_error_t VAD_Init(VAD_SignalEvent_t Event); - -int32_t VAD_Process(int16_t *wr_buf, int32_t dc_est); - -rsi_error_t VAD_Deinit(void); - -// Internal APIs -void RSI_VAD_PingPongMemoryAddrConfig(RSI_VAD_T *pVAD, - uint32_t ping_addr, - uint32_t pong_addr, - uint8_t ping_enable, - uint8_t pong_enable); - -rsi_error_t RSI_VAD_Config(RSI_VAD_T *ptrvad, - uint16_t samples_per_frame, - uint16_t samples_per_address, - bool fullwidth, - uint8_t datasourceselect); - -void RSI_VAD_Enable(RSI_VAD_T *ptrvad); - -void RSI_VAD_InterruptClr(RSI_VAD_T *ptrvad, uint16_t ping_interrupt); - -rsi_error_t RSI_VAD_SetAlgorithmThreshold(RSI_VAD_T *ptrvad, - uint16_t algorithm_type, - uint32_t zcr_threshold, - uint32_t acf_threshold, - uint32_t wacf_threshold, - VAD_AMDF_THRESHOLD_T *config); - -rsi_error_t RSI_VAD_Set_Delay(RSI_VAD_T *ptrvad, uint16_t startdelayval, uint16_t enddelayval); - -rsi_error_t RSI_VAD_Input(RSI_VAD_T *ptrVad, int16_t data); - -rsi_error_t RSI_VAD_FrameEnergyConfig(RSI_VAD_T *ptrvad, - uint32_t threshold_frame_energy, - uint32_t threshold_smpl_collect, - uint32_t prog_smpls_for_energy_check); - -void RSI_VAD_Stop(RSI_VAD_T *pVAD); - -uint8_t RSI_VAD_ProccessDone(RSI_VAD_T *pVAD); - -void RSI_VAD_FastClkEnable(uint16_t fast_clk_sel, uint16_t clk_div_factor); - -int32_t RSI_VAD_ProcessData(RSI_VAD_T *pVAD, - uint32_t vad_addr, - uint32_t adc_data_addr, - int32_t dc_est, - uint32_t dig_scale, - uint32_t sample_len); - -#ifdef __cplusplus -} -#endif - -#endif // RSI_VAD_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_wurx.h b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_wurx.h deleted file mode 100644 index 3ed64f256..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/inc/rsi_wurx.h +++ /dev/null @@ -1,143 +0,0 @@ -/******************************************************************************* -* @file rsi_wurx.h -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -//Include Files - -#ifndef RSI_WURX_H -#define RSI_WURX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define PMU_SPI_BASE_ADDR 0x24050000 - -#define WURX_COMP_OFFSET_CALIB_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x080) * 4) -#define WURX_LCO_FREQ_CALIB_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x081) * 4) -#define WURX_AAC_MODE_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x082) * 4) -#define WURX_CLK_GEN_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x083) * 4) -#define WURX_LNA_IF_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x084) * 4) -#define WURX_ENABLE_AND_AAC_DET_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x085) * 4) -#define WURX_TEST_MUX_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x086) * 4) -#define WURX_TEST_MODE_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x087) * 4) - -#define WURX_PATTERN1_REG_MSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x089) * 4) -#define WURX_PATTERN1_REG_MID *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x08A) * 4) -#define WURX_PATTERN1_REG_LSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x08B) * 4) -#define WURX_PATTERN2_REG_MSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x08C) * 4) -#define WURX_PATTERN2_REG_MID *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x08D) * 4) -#define WURX_PATTERN2_REG_LSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x08E) * 4) -#define WURX_CORR_DET_READ_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x08F) * 4) -#define WURX_ODD_PATTERN1_REG_LSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x090) * 4) -#define WURX_ODD_PATTERN1_REG_MID *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x091) * 4) -#define WURX_ODD_PATTERN1_REG_MSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x092) * 4) -#define WURX_EVEN_PATTERN1_REG_LSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x093) * 4) -#define WURX_EVEN_PATTERN1_REG_MID *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x094) * 4) -#define WURX_EVEN_PATTERN1_REG_MSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x095) * 4) -#define WURX_ODD_PATTERN2_REG_LSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x096) * 4) -#define WURX_ODD_PATTERN2_REG_MID *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x097) * 4) -#define WURX_ODD_PATTERN2_REG_MSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x098) * 4) -#define WURX_EVEN_PATTERN2_REG_LSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x099) * 4) -#define WURX_EVEN_PATTERN2_REG_MID *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x09A) * 4) -#define WURX_EVEN_PATTERN2_REG_MSB *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x09B) * 4) -#define WURX_LEVEL1_PATTERN_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x09C) * 4) -#define WURX_BYPASS_LEVEL1_AND_FREQ *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x09D) * 4) -#define WURX_MANUAL_CALIB_MODE_REG1 *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x09E) * 4) -#define WURX_MANUAL_CALIB_MODE_REG2 *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x09F) * 4) -#define WURX_CORR_CALIB_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x088) * 4) -#define ULPCLKS_REFCLK_REG *(volatile uint32_t *)(PMU_SPI_BASE_ADDR + 0xa000 + (0x106) * 4) - -#define BG_SAMPLING_ADDR 0x41300140 -#define BG_SAMPLING_VALUE 0x3 -#define TAIL_DATA_VALUE_CHECK 0x3 -#define SYNC_32KHZ_RESET_VALUE 0x000001 -#define RESET_CALB_CLOCK 0x000002 -#define LCO_CALB_STATUS 0x000002 - -#define VAL0 0 -#define VAL1 1 -#define VAL2 2 -#define VAL3 3 -#define VAL4 4 -#define VAL5 5 -#define VAL6 6 -#define VAL7 7 -#define VAL10 10 -#define VAL100 100 - -#define POS1 1 -#define POS3 3 -#define POS4 4 -#define POS7 7 -#define POS9 9 -#define POS10 10 -#define POS9 9 -#define POS11 11 -#define POS12 12 -#define POS13 13 -#define POS16 16 -#define POS15 15 -#define POS17 17 -#define POS18 18 -#define POS19 19 -#define POS20 20 -#define POS21 21 -#define POS22 22 - -#define IPMU_SPARE_REG2 0x141 -#define DC_OFFSET_VALUE 0x40 -#define REF_CLOCK_FREQ 0x400 -#define DETECTION_REF_SHIFT 0x1FC1FF -#define TAIL_DATA_DECODE_64BIT 0x0 -#define TAIL_DATA_DECODE_128BIT 0x1 -#define TAIL_DATA_DECODE_192BIT 0x2 -#define TAIL_DATA_DECODE_256BIT 0x3 -#define LDO_ON_MODE 0xA8000020 -#define PATTERN_LEN_MASK 0x38000 -#define PATTERN_LEN_CLR_MASK 0x7 -#define THRESH_CLR_MASK_VAL 0x3F - -uint8_t RSI_WURX_GetPatternDetectedType(void); -void RSI_WURX_ConfigL2Patttern(uint8_t freq_div); -void RSI_IPMU_DCCalib(void); -uint16_t RSI_WURX_ReadPatternLength(void); -void RSI_WURX_AnalogOff(void); -void RSI_WURX_DigitalOff(void); -void RSI_WURX_Init(uint16_t bypass_l1_enable, uint16_t l1_freq_div, uint16_t l2_freq_div); -void RSI_WURX_ReadPattern2Even(uint32_t *tail_data); -void RSI_WURX_ReadPattern1Even(uint32_t *tail_data); -void RSI_WURX_ReadPattern1Odd(uint32_t *tail_data); -void RSI_WURX_ReadPattern2Odd(uint32_t *tail_data); -void RSI_WURX_Pattern1MatchValue(uint32_t *match_value); -void RSI_WURX_Pattern2MatchValue(uint32_t *match_value); -uint16_t RSI_WURX_TaildataPresent(void); -void RSI_WURX_CorrEnable(uint16_t wurx_enable); -void RSI_WURX_SetPatternLength(uint16_t enable, uint16_t l1_len, uint16_t l2_len); -void RSI_WURX_SetWakeUpThreshold(uint16_t threshold_1, uint16_t threshold_2); -void RSI_WURX_TailDataDecodeEnable(uint16_t enable, uint16_t data_len); -rsi_error_t RSI_WURX_GetTailData(uint32_t *tail_data, uint16_t tail_data_len); -void RSI_IPMU_40MhzClkCalib(uint16_t clk_enable, uint32_t channel_selection_value); -uint32_t RSI_WURX_CalThershValue(uint32_t bit_length, uint32_t percentage); -void RSI_WURX_SoftwareRestart(void); -int32_t RSI_WURX_GetPatternType(void); -void RSI_WURX_BGSamplingEnable(void); - -#ifdef __cplusplus -} -#endif - -#endif // RSI_WURX_H diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_adc.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_adc.c index a5086b38c..def3add5d 100644 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_adc.c +++ b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_adc.c @@ -27,10 +27,10 @@ #include #include #include "sl_si91x_dma.h" +#include "clock_update.h" //---------------------- Macros -----------------// #define ADC_CLK_SOURCE_32KHZ 32000 #define ADC_CLK_SOURCE_20MHZ 20000000 -#define ADC_CLK_SOURCE_32MHZ 32000000 #define ADC_CLK_SOURCE_40MHZ 40000000 #define MAXIMUM_ADC_SAMPLE_LEN 1023 #define MINIMUM_ADC_SAMPLE_LEN 1 @@ -173,25 +173,17 @@ rsi_error_t ADC_Init(adc_ch_config_t adcChConfig, adc_config_t adcConfig, adccal } // Configure 32MHz RC clock to ADC else if (clk_sel >= SAMPLE_RATE_32KSPS && clk_sel <= SAMPLE_RATE_800KSPS) { - // Select 32MHz RC clock for ADC + // Select MHz RC clock for ADC RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - - adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_32MHZ; + /* Update the ADC clock source variable */ + adc_commn_config.adc_clk_src = RSI_CLK_GetBaseClock(ULPSS_AUX); } else { // Configure the 32MHz RC clock to ADC if (!(M4_ULP_SLP_STATUS_REG & ULP_MODE_SWITCHED_NPSS)) { -#ifdef SIMULATION - RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_32MHZ; -#else - // Select 32MHz RC ULP reference clock - RSI_ULPSS_RefClkConfig(ULPSS_ULP_32MHZ_RC_CLK); - // Select 40MHz XTAL clock for ADC RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_REF_CLK); - - adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_40MHZ; -#endif + /* Update the ADC clock source variable */ + adc_commn_config.adc_clk_src = RSI_CLK_GetBaseClock(ULPSS_AUX); } else { adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_20MHZ; } @@ -210,13 +202,13 @@ rsi_error_t ADC_Init(adc_ch_config_t adcChConfig, adc_config_t adcConfig, adccal // Single ended gain integer_val = RSI_IPMU_Auxadcgain_SeEfuse(); - frac = (float)((integer_val) & (0x3FFF)); + frac = (float)((integer_val) & (0x3FFF)); frac /= 1000; adc_commn_config.adc_sing_gain = ((float)(integer_val >> 14) + frac); // Differential ended gain integer_val = RSI_IPMU_Auxadcgain_DiffEfuse(); - frac = (float)((integer_val) & (0x3FFF)); + frac = (float)((integer_val) & (0x3FFF)); frac /= 1000; adc_commn_config.adc_diff_gain = (((float)(integer_val >> 14)) + frac); #endif @@ -292,22 +284,14 @@ rsi_error_t ADC_Per_Channel_Init(adc_ch_config_t adcChConfig, adc_config_t adcCo // Select 32MHz RC clock for ADC RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_32MHZ; + adc_commn_config.adc_clk_src = RSI_CLK_GetBaseClock(ULPSS_AUX); } else { // Configure the 32MHz RC clock to ADC if (!(M4_ULP_SLP_STATUS_REG & ULP_MODE_SWITCHED_NPSS)) { -#ifdef SIMULATION - RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_32MHZ; -#else - // Select 32MHz RC ULP reference clock - RSI_ULPSS_RefClkConfig(ULPSS_ULP_32MHZ_RC_CLK); - - // Select 32MHz RC clock for ADC - RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - - adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_32MHZ; -#endif + // Select 40MHz XTAL clock for ADC + RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_REF_CLK); + /* Update the ADC clock source variable */ + adc_commn_config.adc_clk_src = RSI_CLK_GetBaseClock(ULPSS_AUX); } else { adc_commn_config.adc_clk_src = ADC_CLK_SOURCE_20MHZ; } @@ -325,13 +309,13 @@ rsi_error_t ADC_Per_Channel_Init(adc_ch_config_t adcChConfig, adc_config_t adcCo // Single ended gain integer_val = RSI_IPMU_Auxadcgain_SeEfuse(); - frac = (float)((integer_val) & (0x3FFF)); + frac = (float)((integer_val) & (0x3FFF)); frac /= 1000; adc_commn_config.adc_sing_gain = ((float)(integer_val >> 14) + frac); // Differential ended gain integer_val = RSI_IPMU_Auxadcgain_DiffEfuse(); - frac = (float)((integer_val) & (0x3FFF)); + frac = (float)((integer_val) & (0x3FFF)); frac /= 1000; adc_commn_config.adc_diff_gain = (((float)(integer_val >> 14)) + frac); #endif @@ -888,19 +872,19 @@ rsi_error_t ADC_Deinit(void) rsi_error_t ADC_Deinit(adc_config_t adcConfig) #endif { - // Power down the ADC block - RSI_ADC_PowerControl(ADC_POWER_OFF); - + (void)adcConfig; #ifdef CHIP_9118 // Stop ADC operation RSI_ADC_Stop(AUX_ADC_DAC_COMP); #endif -#ifdef SLI_SI917 - RSI_ADC_Stop(AUX_ADC_DAC_COMP, adcConfig.operation_mode); -#endif + // Disable IRQ + NVIC_DisableIRQ(ADC_IRQn); + if (sl_si91x_dma_unregister_callbacks(DMA_INSTANCE, DMA_CHANNEL, SL_DMA_TRANSFER_DONE_CB | SL_DMA_ERROR_CB)) { return ARM_DRIVER_ERROR; } + // Power down the ADC block + RSI_ADC_PowerControl(ADC_POWER_OFF); return RSI_OK; } @@ -932,9 +916,9 @@ rsi_error_t ADC_Stop(void) */ rsi_error_t ADC_Stop(adc_config_t adcConfig) { - - RSI_ADC_Stop(AUX_ADC_DAC_COMP, adcConfig.operation_mode); - return RSI_OK; + rsi_error_t error_status; + error_status = RSI_ADC_Stop(AUX_ADC_DAC_COMP, adcConfig.operation_mode); + return error_status; } #endif @@ -1937,6 +1921,9 @@ rsi_error_t RSI_ADC_Stop(AUX_ADC_DAC_COMP_Type *pstcADC) pstcADC->AUXADC_CONFIG_2_b.AUXADC_DYN_ENABLE = 0; } #endif + if (AUX_ADC_DAC_COMP->AUXADC_CTRL_1_b.ADC_ENABLE != 1U) { + return RSI_FAIL; + } pstcADC->AUXADC_CTRL_1_b.ADC_ENABLE = 0; return RSI_OK; } diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_cci.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_cci.c deleted file mode 100644 index 69bcb979d..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_cci.c +++ /dev/null @@ -1,174 +0,0 @@ -/******************************************************************************* -* @file rsi_cci.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#if defined(CHIP_9118) - -/*==============================================*/ -/** - * @fn void RSI_CCI_AmsEnable() - * @brief This API enables the CCI in the master mode - * @return None - */ -void RSI_CCI_AmsEnable() -{ - AMS_EN |= (1 << 15); -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_CCI_AMS_Initialise(RSI_CCI_Init_t *p_cci_config) - * @brief This API configures the CCI peripheral - * @param[in] p_cci_config CCI configuration structure pointer - * \n - * \ref RSI_CCI_Init_t - * \ref CCI_CONTROL_REG_b - * \ref CCI_LSB_A_S1_REG - * @return \ref RSI_OK if success full or - * else error code - */ -rsi_error_t RSI_CCI_AMS_Initialise(RSI_CCI_Init_t *p_cci_config) -{ - CCI_Type *pcci = CCI; - - //Choose the SDR or DDR mode, Address translation enable, address width config and number of slaves by programming the CCI_CONTROL register. - pcci->CCI_CONTROL_b.MODE = (p_cci_config->mode << 2); - pcci->CCI_CONTROL_b.TRANSLATE_ENABLE = p_cci_config->translation_enable; - pcci->CCI_CONTROL_b.ADDR_WIDTH_CONFIG = p_cci_config->address_width_config; - pcci->CCI_CONTROL_b.MODE = (p_cci_config->interface_width << 0); - pcci->CCI_CONTROL_b.ENABLED_SLAVES = p_cci_config->slave_enable; - pcci->CCI_CONTROL_b.SLAVE_PRIORITY = p_cci_config->slave_priority; - pcci->CCI_CONTROL_b.TIME_OUT_PRG = p_cci_config->slave_timeout; - pcci->CCI_CONTROL_b.CCI_CTRL_ENABLE = p_cci_config->cci_cntrl_en; - - if (p_cci_config->mode == 1) // if mode is ddr then load 2x clock enable - { - // 2x clock enable for ddr mode - pcci->CCI_PREFETCH_CTRL_b.CCI_2X_CLK_ENABLE_FOR_DDR_MODE = 1; - } - - // Allocate the lower and higher address range for the each slave by programming in the following registers - switch (p_cci_config->slave_enable) { - case 0: { - if (p_cci_config->slave_lsb_address[0] < p_cci_config->slave_msb_address[0]) { - // Load LSB address supportes and MSB address supported - pcci->CCI_LSB_A_S1 = p_cci_config->slave_lsb_address[0]; - pcci->CCI_MSB_A_S1 = p_cci_config->slave_msb_address[0]; - } else { - return ERROR_CCI_ADDRESS_ERR; - } - break; - } - case 1: { - if (p_cci_config->slave_lsb_address[0] < p_cci_config->slave_msb_address[0]) { - // Load LSB address supportes and MSB address supported - pcci->CCI_LSB_A_S1 = p_cci_config->slave_lsb_address[0]; - pcci->CCI_MSB_A_S1 = p_cci_config->slave_msb_address[0]; - } else { - return ERROR_CCI_ADDRESS_ERR; - } - break; - } - case 2: { - if (p_cci_config->slave_lsb_address[1] < p_cci_config->slave_msb_address[1]) { - // Load LSB address supportes and MSB address supported - pcci->CCI_LSB_A_S2 = p_cci_config->slave_lsb_address[1]; - pcci->CCI_MSB_A_S2 = p_cci_config->slave_msb_address[1]; - } else { - return ERROR_CCI_ADDRESS_ERR; - } - break; - } - - case 3: { - if (p_cci_config->slave_lsb_address[0] < p_cci_config->slave_msb_address[0]) { - // Load LSB address supportes and MSB address supported - pcci->CCI_LSB_A_S1 = p_cci_config->slave_lsb_address[0]; - pcci->CCI_MSB_A_S1 = p_cci_config->slave_msb_address[0]; - } else { - return ERROR_CCI_ADDRESS_ERR; - } - - if (p_cci_config->slave_lsb_address[1] < p_cci_config->slave_msb_address[1]) { - // Load LSB address supportes and MSB address supported - pcci->CCI_LSB_A_S2 = p_cci_config->slave_lsb_address[1]; - pcci->CCI_MSB_A_S2 = p_cci_config->slave_msb_address[1]; - } else { - return ERROR_CCI_ADDRESS_ERR; - } - break; - } - } - - // Load the translation address if address translation feature is enabled by programming the - // cci_translation_address. - if ((p_cci_config->translation_enable) == 1) { - pcci->CCI_TRANS_ADDRESS = p_cci_config->translation_address; - } - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn uint32_t RSI_CCI_SetFifoThreshlod(volatile CCI_Type *pstcCCI,uint8_t val) - * @brief This API sets the CCI threshhold fifo value - * @param[in] pstcCCI CCI configuration structure pointer \ref CCI_Type - * \ref CCI_FIFO_THRESHOLD_REG - * @param[in] val Threshold value - * @return \ref RSI_OK if success full or - * \n else error code - */ -uint32_t RSI_CCI_SetFifoThreshlod(volatile CCI_Type *pstcCCI, uint8_t val) -{ - pstcCCI->CCI_FIFO_THRESHOLD_REG |= val; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn uint32_t RSI_CCI_PrefetchEnable(volatile CCI_Type *pstcCCI) - * @brief This API is used for prefetct enable - * @param[in] pstcCCI CCI configuration structure pointer - * \ref CCI_Type - * @return \ref RSI_OK if success full or - * \n else error code - */ - -uint32_t RSI_CCI_PrefetchEnable(volatile CCI_Type *pstcCCI) -{ - pstcCCI->CCI_PREFETCH_CTRL_b.CCI_PREFETCH_EN = 0x1; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn uint32_t RSI_CCI_IntClear(volatile CCI_Type *pstcCCI,uint8_t interrupt) - * @brief This API is used to clear the interrupts - * @param[in] pstcCCI CCI configuration structure pointer - * \ref CCI_Type - * @param[in] interrupt 0-2 for interrupt from peer chips - * \n 3 for message interrupt from slave - * @return \ref RSI_OK if success full or - * \n else error code - */ -uint32_t RSI_CCI_IntClear(volatile CCI_Type *pstcCCI, uint8_t interrupt) -{ - return pstcCCI->CCI_MODE_INTR_STATUS_b.INTR_CLEAR = (0x1 << interrupt); -} -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_dac.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_dac.c index 6f4d6c105..2abc216da 100644 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_dac.c +++ b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_dac.c @@ -255,7 +255,7 @@ uint32_t dac_set_clock(uint32_t sampl_rate) // Program in PS2 state Need to integrate // Configured DAC clock as 32Mhz RC RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - clk_div_fac = (uint16_t)ceil((2 * DAC_CLK_SRC_32MHZ) / sampl_rate); + clk_div_fac = (uint16_t)ceil((2 * RSI_CLK_GetBaseClock(ULPSS_AUX)) / sampl_rate); // Configure the DAC division factor for required sampling rate RSI_DAC_ClkDivFactor(AUX_ADC_DAC_COMP, clk_div_fac); return (uint32_t)((clk_div_fac * sampl_rate) / 2); @@ -263,7 +263,7 @@ uint32_t dac_set_clock(uint32_t sampl_rate) if (sampl_rate > DAC_SAMPLE_RATE_32KSPS && sampl_rate < DAC_SAMPLE_RATE_80KSPS) { // Configured DAC clock as 32Mhz RC RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - clk_div_fac = (uint16_t)ceil((2 * DAC_CLK_SRC_32MHZ) / sampl_rate); + clk_div_fac = (uint16_t)ceil((2 * RSI_CLK_GetBaseClock(ULPSS_AUX)) / sampl_rate); if (clk_div_fac > 0x03FF) { clk_div_fac = 0x03FF; } @@ -271,10 +271,9 @@ uint32_t dac_set_clock(uint32_t sampl_rate) RSI_DAC_ClkDivFactor(AUX_ADC_DAC_COMP, clk_div_fac); return (uint32_t)((clk_div_fac * sampl_rate) / 2); } else { - RSI_ULPSS_RefClkConfig(ULPSS_ULP_32MHZ_RC_CLK); // Configured DAC clock as 32Mhz RC RSI_ULPSS_AuxClkConfig(ULPCLK, ENABLE_STATIC_CLK, ULP_AUX_32MHZ_RC_CLK); - clk_div_fac = (uint16_t)ceil((2 * DAC_CLK_SRC_32MHZ) / sampl_rate); + clk_div_fac = (uint16_t)ceil((2 * RSI_CLK_GetBaseClock(ULPSS_AUX)) / sampl_rate); // Configure the DAC division factor for required sampling rate RSI_DAC_ClkDivFactor(AUX_ADC_DAC_COMP, clk_div_fac); return (uint32_t)((clk_div_fac * sampl_rate) / 2); diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_fim.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_fim.c deleted file mode 100644 index 189b37e45..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_fim.c +++ /dev/null @@ -1,4223 +0,0 @@ -/******************************************************************************* -* @file rsi_fim.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include files - -#ifdef ENHANCED_FIM -#include "rsi_enhanced_fim.h" -#endif - -#ifdef ENHANCED_FIM -/*==============================================*/ -/** - *@fn void RSI_FIM_EnableSaturation(void) - *@brief This API is used to enable saturation . - *@return none - */ -void RSI_FIM_EnableSaturation(void) -{ - FIM->FIM_SAT_SHIFT_b.SAT_EN = ENABLE; -} -#endif -/*==============================================*/ -/** - *@fn static void RSI_FIM_InputData(void *pSrcA,uint32_t bank,uint32_t blockSize,uint8_t data_type) - *@brief This API is used to store data in ulp memories - *@param[in] :pSrcA is input vector - *@param[in] :bank is in which memory data samples are stored - *@param[in] :data_type specifies q7,q15 , q31 formats - * \ref FORMAT_F32 - * \ref FORMAT_Q31 - * \ref FORMAT_Q7 - * \ref FORMAT_Q15 - *@param[in] :blockSize is size of the input array - *@return none -*/ -void RSI_FIM_InputData(void *pSrcA, uint32_t bank, uint32_t blockSize, uint8_t data_type) -{ - uint32_t var; - q31_t *pSrcA32; - q15_t *pSrcA16; - q7_t *pSrcA8; - - switch (data_type) { - case FORMAT_F32: - case FORMAT_Q31: - pSrcA32 = (q31_t *)pSrcA; - for (var = 0; var < blockSize; var++) { -#ifdef ENHANCED_FIM - *(volatile uint32_t *)(bank + (var * 4)) = *pSrcA32; -#else - *(volatile uint32_t *)((MEM_BANK + (bank << 2)) + (var * 4)) = *pSrcA32; -#endif - pSrcA32++; - } - break; - - case FORMAT_Q7: - pSrcA8 = (q7_t *)pSrcA; - for (var = 0; var < blockSize; var++) { -#ifdef ENHANCED_FIM - *(volatile uint32_t *)(bank + (var * 4)) = *pSrcA8; -#else - *(volatile uint32_t *)((MEM_BANK + (bank << 2)) + (var * 4)) = *pSrcA8; -#endif - pSrcA8++; - } - break; - - case FORMAT_Q15: - pSrcA16 = (q15_t *)pSrcA; - - for (var = 0; var < blockSize; var++) { -#ifdef ENHANCED_FIM - *(volatile uint32_t *)(bank + (var * 4)) = *pSrcA16; -#else - *(volatile uint32_t *)((MEM_BANK + (bank << 2)) + (var * 4)) = *pSrcA16; -#endif - pSrcA16++; - } - break; - } -} -/*==============================================*/ -/** - *@fn static void RSI_FIM_InputDataCmplx(volatile q15_t *pReal,uint32_t bank,volatile uint32_t var,uint8_t flag) - *@brief This API is used to store data in ulp memories - *@param[in] :pReal is input vector - *@param[in] :bank is in which memory data samples are stored - *@param[in] :flag is set depending on complex-real and real-complex values - *@param[in] :var is for address increment -**/ -static void RSI_FIM_InputDataCmplx(volatile q15_t *pReal, uint32_t bank, volatile uint32_t var, uint8_t flag) -{ - - if (flag) { -#ifdef ENHANCED_FIM - *(volatile uint16_t *)((bank) + ((var + 1) * 2)) = *pReal; -#else - *(volatile uint16_t *)((MEM_BANK + (bank << 2)) + ((var + 1) * 2)) = *pReal; -#endif - pReal++; -#ifdef ENHANCED_FIM - *(volatile uint16_t *)((bank) + (var)*2) = *pReal; -#else - *(volatile uint16_t *)((MEM_BANK + (bank << 2)) + (var)*2) = *pReal; -#endif - pReal++; - } else { -#ifdef ENHANCED_FIM - *(volatile uint16_t *)((bank) + ((var + 1) * 2)) = *pReal; - *(volatile uint16_t *)((bank) + (var)*2) = 0x0000; -#else - *(volatile uint16_t *)((MEM_BANK + (bank << 2)) + ((var + 1) * 2)) = *pReal; - *(volatile uint16_t *)((MEM_BANK + (bank << 2)) + (var)*2) = 0x0000; -#endif - } -} -/*==============================================*/ -/** - *@fn static void RSI_FIM_ComplxOutputConvert(uint32_t blockSize, uint32_t bank,volatile q15_t *pDst) - *@brief This API is used to set the FIM to convert the complex output - *@param[in] :bank is output bank address - *@param[out] :pDst is required output array - *@param[in] :blockSize is size of the input array - *@return :none - */ -static void RSI_FIM_ComplxOutputConvert(uint32_t blockSize, uint32_t bank, volatile q15_t *pDst) -{ - volatile uint32_t i, a; - - for (i = 0; i < blockSize; i++) { - a = i * 2; -#ifdef ENHANCED_FIM - *pDst = *(volatile uint16_t *)((bank) + ((a + 1)) * 2); -#else - *pDst = *(volatile uint16_t *)((MEM_BANK + (bank << 2)) + ((a + 1)) * 2); -#endif - pDst++; -#ifdef ENHANCED_FIM - *pDst = *(volatile uint16_t *)((bank) + (a)*2); -#else - *pDst = *(volatile uint16_t *)((MEM_BANK + (bank << 2)) + (a)*2); -#endif - *pDst++; - } -} -/*==============================================*/ -/** - *@fn void rsi_fim_read_data(uint32_t bank, uint32_t blockSize, volatile void *pDst, uint8_t data_type, typ_data_t type_data) - *@brief This API is used to set the FIM to read the output - *@param[in] bank : is output bank address - *@param[out] pDst : is required output array - *@param[in] data_type : specifies q7,q15 , q31 formats - *@param[in] type_data : is to specify real-complex , complex-real or complex-complex data - *@param[in] length : is size of the input array - *@return none - */ - -void rsi_fim_read_data(uint32_t bank, uint32_t blockSize, volatile void *pDst, uint8_t data_type, typ_data_t type_data) -{ - volatile uint32_t var; - - if ((data_type == FORMAT_F32) || (data_type == FORMAT_Q31)) { - for (var = 0; var < blockSize; var++) { -#ifdef ENHANCED_FIM - ((q31_t *)pDst)[var] = *(volatile uint32_t *)(bank + (var * 4)); -#else - ((q31_t *)pDst)[var] = *(volatile uint32_t *)((MEM_BANK + (bank << 2)) + (var * 4)); -#endif - } - } - - if (data_type == FORMAT_Q7) { - for (var = 0; var < blockSize; var++) { -#ifdef ENHANCED_FIM - ((q7_t *)pDst)[var] = *(volatile uint32_t *)(bank + (var * 4)); -#else - ((q7_t *)pDst)[var] = *(volatile uint32_t *)((MEM_BANK + (bank << 2)) + (var * 4)); -#endif - } - } - if (data_type == FORMAT_Q15) { - if (type_data) { - RSI_FIM_ComplxOutputConvert(blockSize, bank, (q15_t *)pDst); - } else { - for (var = 0; var < blockSize; var++) { -#ifdef ENHANCED_FIM - ((q15_t *)pDst)[var] = *(volatile uint32_t *)(bank) + (var * 4); -#else - ((q15_t *)pDst)[var] = *(volatile uint32_t *)((MEM_BANK + (bank << 2)) + (var * 4)); -#endif - } - } - } -} - -/*==============================================*/ -/** - *@fn static void RSI_FIM_SetDataLen(uint32_t ColAorfilterLen,uint32_t bufferLen1,uint32_t bufferLen2) - *@brief RSI_FIM_SetDataLen API is used to set data blockSize of buffers in the FIM module - *@param[in] :ColAorfilterLen is used for configuring number of columns of first matrix or - * \n filter coefficients for fir , iir and fir interpolator filters. - *@param[in] :bufferLen1 is the blockSize of data used for input1 - * \n for scalar only bufferLen1 need to be configured. - * \n for filter - *@param[in] :bufferLen2 is the blockSize of data used for input2 i.e. only for vector operations this is used. - *@return none - * - */ -static void RSI_FIM_SetDataLen(uint32_t ColAorfilterLen, uint32_t bufferLen1, uint32_t bufferLen2) -{ - FIM->FIM_CONFIG_REG1_b.INP1_LEN = bufferLen1; - FIM->FIM_CONFIG_REG1_b.INP2_LEN = bufferLen2; - FIM->FIM_CONFIG_REG1_b.MAT_LEN = ColAorfilterLen; -} - -/*==============================================*/ -/** - *@fn static void RSI_FIM_SetSatTruncRound(uint32_t SatTruncRoundShift) - *@brief RSI_FIM_SetSatTruncRound API is used to set sat trunc values to FIM module for corresponding inputs - *@param[in] :SatTruncRoundShift is saturate truncation and round value that need to be to get appropriate output - * saturate - to confine msb to limited value - * truncate - to confine lsb to limited value - * - * round - approximating to near value - *@return none - */ -void RSI_FIM_SetSatTruncRound(uint32_t SatTruncRoundShift) -{ - // Shift truncate saturate and round - FIM->FIM_SAT_SHIFT |= SatTruncRoundShift; -} - -/*==============================================*/ -/** - *@fn :static void RSI_FIM_DatTypTrig(uint32_t numRow1, uint32_t numCol2, typ_data_t typData) - *@brief :RSI_FIM_DatTypTrig API is used to trigger the FIM module - *@param[in] :numRow1 is number of rows of first matrix - *@param[in] :numCol2 is number of columns of second matrix - *@param[in] :typData is to select which type of data is given as input i.e. real-real , real-complex , complex-real and complex-complex - * In case of vectors, for real-complx, data in second memory is considered as real and 1st as cmplx. - * for complx-real, data in 1st memory is considered as real and second as cmplx. - * In case of scalar, for real-complx, data in memory is taken as complex and scalar as real. - *@return none -*/ -static void RSI_FIM_DatTypTrig(uint32_t numRow1, uint32_t numCol2, typ_data_t typData) -{ - uint32_t x; - x = 0x0FC00000 & FIM->FIM_CONFIG_REG2; - switch (typData) { - case ULP_FIM_COP_DATA_REAL_REAL: - FIM->FIM_CONFIG_REG2 = x | (numRow1 << 16) | (numCol2 << 10) | typData << 8 | ULP_FIM_COP_START_TRIG; - break; - case ULP_FIM_COP_DATA_CPLX_REAL: - FIM->FIM_CONFIG_REG2 = x | (numRow1 << 16) | (numCol2 << 10) | typData << 8 | ULP_FIM_COP_START_TRIG; - break; - case ULP_FIM_COP_DATA_REAL_CPLX: - FIM->FIM_CONFIG_REG2 = x | (numRow1 << 16) | (numCol2 << 10) | typData << 8 | ULP_FIM_COP_START_TRIG; - break; - case ULP_FIM_COP_DATA_CPLX_CPLX: - FIM->FIM_CONFIG_REG2 = x | (numRow1 << 16) | (numCol2 << 10) | typData << 8 | ULP_FIM_COP_START_TRIG; - break; - } -} - -/*==============================================*/ -/** - *@fn void rsi_arm_offset_f32_opt(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication for real data - *@param[in] *pSrc : points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be addedd for each elements of vector array. - *@param[in] length : is size of the input array - *@return none - * - */ -void rsi_arm_offset_f32_opt(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_offset_q7_opt(q7_t *pSrc, q7_t scale, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication for real data - *@param[in] *pSrc : points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be addedd for each elements of vector array. - *@param[in] length : is size of the input array - *@return none - * - */ -void rsi_arm_offset_q7_opt(q7_t *pSrc, q7_t scale, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} -/*==============================================*/ - -/** - *@fn void rsi_arm_offset_q15_opt(q15_t *pSrc, - * q15_t scale, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication for real data - *@param[in] *pSrc : points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be addedd for each elements of vector array. - *@param[in] length : is size of the input array - *@return none - * - */ - -void rsi_arm_offset_q15_opt(q15_t *pSrc, - q15_t scale, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_offset_q31_opt(q31_t *pSrc, - * q31_t scale, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication for real data - *@param[in] *pSrc : points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be addedd for each elements of vector array. - *@param[in] length : is size of the input array - *return none - * - */ -void rsi_arm_offset_q31_opt(q31_t *pSrc, - q31_t scale, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_scalar_sub_f32(int32_t *pSrc, - * int32_t scale, - * int32_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Subtraction - *@param[in] *pSrc :points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be subtracted from each elements of vector array. - *@param[in] length :is size of the input array - *@return none - */ -void rsi_fim_scalar_sub_f32(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ - -/** - *@fn void rsi_fim_scalar_sub_q7(q7_t *pSrc, q7_t scale, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Scalar Subtraction - *@param[in] *pSrc :points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be subtracted from each elements of vector array. - *@param[in] length :is size of the input array - *@return none - */ - -void rsi_fim_scalar_sub_q7(q7_t *pSrc, q7_t scale, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_scalar_sub_q31(q31_t *pSrc, - * q31_t scale, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Subtraction - *@param[in] *pSrc :points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be subtracted from each elements of vector array. - *@param[in] length :is size of the input array - *@return none - */ -void rsi_fim_scalar_sub_q31(q31_t *pSrc, - q31_t scale, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_scale_f32_opt(int32_t *pSrc, - * int32_t scale, - * int32_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication for real data - *@param[in] *pSrc : points to input vector - *@param[out] *pDst : points to output vector - *@param[in] scale : is constant value that need to be multiplied for each elements of vector array. - *@param[in] length : is size of the input array - *@return none - * - */ -void rsi_arm_scale_f32_opt(int32_t *pSrc, - int32_t scale, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(STRS(0x9, 0, 0, 0)); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scale; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_scale_q7_opt(q7_t *pSrc, - * q7_t scaleFract, - * int8_t shift, - * q7_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication - *@param[in] pSrc : is input vector A - *@param[in] scale : is constant value that need to be multiplied for each elements of vector array. - *@param[in] blockSize : is size of the input array - *@param[in] typ_data : is to select which type of data is given as input - * \n i.e. real complex , complex real and complex complex - * \n real complex real vector, complex scalar - * \n complex real real scalar, complex vector - *@return none - */ -void rsi_arm_scale_q7_opt(q7_t *pSrc, - q7_t scaleFract, - int8_t shift, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(shift + 0x19); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scaleFract; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_scale_q15_opt(q15_t *pSrc, - * q15_t scaleFract, - * int8_t shift, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication - *@param[in] pSrc : is input vector A - *@param[in] scale : is constant value that need to be multiplied for each elements of vector array. - *@param[in] blockSize : is size of the input array - *@param[in] typ_data : is to select which type of data is given as input - * \n i.e. real complex , complex real and complex complex - * \n real complex real vector, complex scalar - * \n complex real real scalar, complex vector - *@return none - */ -void rsi_arm_scale_q15_opt(q15_t *pSrc, - q15_t scaleFract, - int8_t shift, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(shift + 0x11); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scaleFract; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_scale_q31_opt(q31_t *pSrc, - * q31_t scaleFract, - * int8_t shift, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication - *@param[in] pSrc : is input vector A - *@param[in] scale : is constant value that need to be multiplied for each elements of vector array. - *@param[in] blockSize : is size of the input array - *@param[in] typ_data : is to select which type of data is given as input - * \n i.e. real complex , complex real and complex complex - * \n real complex real vector, complex scalar - * \n complex real real scalar, complex vector - *@return none - */ - -void rsi_arm_scale_q31_opt(q31_t *pSrc, - q31_t scaleFract, - int8_t shift, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, 0); - RSI_FIM_SetSatTruncRound(shift + 0x1); - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = scaleFract; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_scalar_mul_q15(q15_t *pSrc, - * q15_t *scale, - * q15_t *pDst, - * uint32_t blockSize, - * typ_data_t typ_data, - * uint16_t inBank, - * uint16_t outBank) - *@brief This API is used to set the FIM Scalar Multiplication - *@param[in] pSrc : is input vector A - *@param[in] scale : is constant value that need to be multiplied for each elements of vector array. - *@param[in] blockSize : is size of the input array - *@param[in] typ_data : is to select which type of data is given as input - * \n i.e. real complex , complex real and complex complex - * \n real complex real vector, complex scalar - * \n complex real real scalar, complex vector - *@return none - */ -void rsi_fim_scalar_mul_q15(q15_t *pSrc, - q15_t *scale, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank, - uint16_t outBank) -{ - uint32_t i; - q15_t scalarReal; - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize / 2, 0); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); - - switch (typ_data) { - case ULP_FIM_COP_DATA_CPLX_REAL: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputDataCmplx(pSrc, ULPSS_RAM_ADDR_SRC, i * 2, 1); -#endif -#else - // For 9116 - RSI_FIM_InputDataCmplx(pSrc, inBank, i * 2, 1); -#endif - pSrc++; - pSrc++; - } - scalarReal = *scale; - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = (scalarReal << 16) | 0x0000; - break; - - case ULP_FIM_COP_DATA_REAL_CPLX: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrc, ULPSS_RAM_ADDR_SRC, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pSrc, inBank, i * 2, 0); -#endif - pSrc++; - } - scalarReal = *scale; - scale++; - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = (scalarReal << 16) | *scale; - break; - - case ULP_FIM_COP_DATA_CPLX_CPLX: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrc, ULPSS_RAM_ADDR_SRC, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pSrc, inBank, i * 2, 1); -#endif - pSrc++; - pSrc++; - } - scalarReal = *scale; - scale++; - FIM->FIM_SCALAR_POLE_DATA1_b.SCALAR_POLE_DATA1 = (scalarReal << 16) | *scale; - - break; - - default: - break; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_SCALAR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, typ_data); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_add_f32_opt(int32_t *pSrcA, - * int32_t *pSrcB, - * int32_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Addition for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_add_f32_opt(int32_t *pSrcA, - int32_t *pSrcB, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_F32); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_F32); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_add_q7_opt(q7_t *pSrcA, - * q7_t *pSrcB, - * q7_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Addition for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_add_q7_opt(q7_t *pSrcA, - q7_t *pSrcB, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_add_q15_opt(q15_t *pSrcA, - * q15_t *pSrcB, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Addition for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_add_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_add_q31_opt(q31_t *pSrcA, - * q31_t *pSrcB, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Addition for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_add_q31_opt(q31_t *pSrcA, - q31_t *pSrcB, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_vector_add_q15(q15_t *pIn1, - * q15_t *pIn2, - * q15_t *pDst, - * uint32_t blockSize, - * typ_data_t typ_data, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Addition - *@param[in] pIn1 : points to input vector A - *@param[in] pIn2 : points to input vector B - *@param[in] blockSize : is size of the input array - *@param[out] pDst : points to output vector - *@param[in] typ_data : is to select which type of data is given as input - * \n i.e. real complex , complex real and complex complex - * \n real complex 1st vector is real vector i.e pIn1, 2nd vector is complex i.e pIn2 - * \n complex real 1st vector is complex vector i.e pIn1, 2nd vector is real i.e pIn2 - *@return none - */ -void rsi_fim_vector_add_q15(q15_t *pIn1, - q15_t *pIn2, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - uint32_t i; - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize / 2, blockSize / 2); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - - switch (typ_data) { - case ULP_FIM_COP_DATA_CPLX_REAL: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn2, ULPSS_RAM_ADDR_SRC2, i * 2, 0); -#endif -#else - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 0); -#endif - pIn2++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 1); -#endif - pIn1++; - pIn1++; - } - break; - - case ULP_FIM_COP_DATA_REAL_CPLX: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 0); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 0); -#endif - pIn1++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn2, ULPSS_RAM_ADDR_SRC2, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 1); -#endif - pIn2++; - pIn2++; - } - break; - - case ULP_FIM_COP_DATA_CPLX_CPLX: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 1); -#endif - pIn1++; - pIn1++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC2, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 1); -#endif - pIn2++; - pIn2++; - } - - break; - - default: - break; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pIn1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pIn2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((ADD_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, typ_data); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_sub_f32_opt(int32_t *pSrcA, - * int32_t *pSrcB, - * int32_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Subtraction for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - * - */ -void rsi_arm_sub_f32_opt(int32_t *pSrcA, - int32_t *pSrcB, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_F32); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_F32); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_sub_q7_opt(q7_t *pSrcA, - * q7_t *pSrcB, - * q7_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Subtraction for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_sub_q7_opt(q7_t *pSrcA, - q7_t *pSrcB, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_sub_q15_opt(q15_t *pSrcA, - * q15_t *pSrcB, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Subtraction for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - * - */ -void rsi_arm_sub_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_sub_q31_opt(q31_t *pSrcA, - * q31_t *pSrcB, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Subtraction for real data - *@param[in] pSrcA : points to input vector A - *@param[in] pSrcB : points to input vector B - *@param[out] pDst : points to output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_sub_q31_opt(q31_t *pSrcA, - q31_t *pSrcB, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_vector_sub_q15(q15_t *pIn1, - * q15_t *pIn2, - * q15_t *pDst, - * uint32_t blockSize, - * typ_data_t typ_data, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Subtraction - *@param[in] pIn1 : is input vector A - *@param[in] pIn2 : is input vector B - *@param[out] pDst : is required output array - *@param[in] typ_data : is to specify real-complex , complex-real or complex-complex data - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_fim_vector_sub_q15(q15_t *pIn1, - q15_t *pIn2, - q15_t *pDst, - uint32_t blockSize, - typ_data_t typ_data, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - uint32_t i; - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize / 2, blockSize / 2); - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); - - switch (typ_data) { - case ULP_FIM_COP_DATA_CPLX_REAL: - - for (i = 0; i < (blockSize / 2); i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn2, ULPSS_RAM_ADDR_SRC2, i * 2, 0); -#endif -#else - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 0); -#endif - pIn2++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 1); -#endif - pIn1++; - pIn1++; - } - break; - - case ULP_FIM_COP_DATA_REAL_CPLX: - for (i = 0; i < (blockSize / 2); i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 0); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 0); -#endif - pIn1++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn2, ULPSS_RAM_ADDR_SRC2, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 1); -#endif - pIn2++; - pIn2++; - } - break; - - case ULP_FIM_COP_DATA_CPLX_CPLX: - for (i = 0; i < blockSize / 2; i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 1); -#endif - pIn1++; - pIn1++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn2, ULPSS_RAM_ADDR_SRC2, i * 2, 1); -#endif - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 1); -#endif - pIn2++; - pIn2++; - } - - break; - - default: - break; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pIn1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pIn2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((SUB_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, typ_data); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_mult_f32_opt(int32_t *pIn1, - * int32_t *pIn2, - * int32_t *pDst, - * uint32_t SatTruncRound, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Multiplication for real data - *@param[in] pIn1 : is input vector A - *@param[in] pIn2 : is input vector B - *@param[in] length : is size of the input array - *@param[in] SatTruncRound : is used to limit the output as required - *@return none - */ -void rsi_arm_mult_f32_opt(int32_t *pIn1, - int32_t *pIn2, - int32_t *pDst, - uint32_t SatTruncRound, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(SatTruncRound); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pIn1, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_F32); - RSI_FIM_InputData(pIn2, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pIn1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pIn2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pIn1, inBank1, blockSize, FORMAT_F32); - RSI_FIM_InputData(pIn2, inBank2, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_mult_q7_opt(q7_t *pSrcA, - * q7_t *pSrcB, - * q7_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used for Q7 vector multiplication - *@param[in] *pSrcA : points to the first input vector - *@param[in] *pSrcB : points to the second input vector - *@param[out] *pDst : points to the output vector - *@param[in] blockSize : number of samples in each vector - *@return none - */ -void rsi_arm_mult_q7_opt(q7_t *pSrcA, - q7_t *pSrcB, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x19, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_mult_q15_opt(q15_t *pSrcA, - * q15_t *pSrcB, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used for Q15 vector multiplication - *@param[in] *pSrcA : points to the first input vector - *@param[in] *pSrcB : points to the second input vector - *@param[out] *pDst : points to the output vector - *@param[in] blockSize : number of samples in each vector - *@return none - */ - -void rsi_arm_mult_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_mult_q31_opt(q31_t *pSrcA, - * q31_t *pSrcB, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used for Vector Multiplication for complex-real data - *@param[in] pIn1 : is input vector A - *@param[in] pIn2 : is input vector B - *@param[out] *pDst : points to the output vector - *@param[in] blockSize : is size of the input array - *@return none - */ -void rsi_arm_mult_q31_opt(q31_t *pSrcA, - q31_t *pSrcB, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrcA, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(pSrcB, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrcA, inBank1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(pSrcB, inBank2, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_cmplx_mult_real_q15_opt(q15_t *pSrcCmplx, - * q15_t *pSrcReal, - * q15_t *pDst, - * uint32_t numSamples, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Multiplication for complex-real data - *@param[in] pSrcCmplx : is input vector A - *@param[in] pSrcReal : is input vector B - *@param *pDst : points to the real output vector - *@param numSamples : number of complex samples in the input vector - *@return none - */ -void rsi_fim_vector_mul_q15(q15_t *pIn1, - q15_t *pIn2, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - uint32_t i; - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize / 2, blockSize / 2); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); - for (i = 0; i < (blockSize / 2); i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn2, ULPSS_RAM_ADDR_SRC2, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pIn2, inBank2, i * 2, 1); -#endif - pIn2++; - pIn2++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pIn1, ULPSS_RAM_ADDR_SRC1, i * 2, 0); -#endif -#else - RSI_FIM_InputDataCmplx(pIn1, inBank1, i * 2, 0); -#endif - pIn1++; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pIn2; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pIn2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_CPLX); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_cmplx_mult_real_q15_opt(q15_t *pSrcCmplx, - * q15_t *pSrcReal, - * q15_t *pDst, - * uint32_t numSamples, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Vector Multiplication for complex-real data - *@param[in] pSrcCmplx : is input vector A - *@param[in] pSrcReal : is input vector B - *@param *pDst : points to the real output vector - *@param numSamples : number of complex samples in the input vector - *@return none - */ - -void rsi_arm_cmplx_mult_real_q15_opt(q15_t *pSrcCmplx, - q15_t *pSrcReal, - q15_t *pDst, - uint32_t numSamples, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - uint32_t i; - RSI_FIM_SetDataLen(NOT_MATRIX, numSamples / 2, numSamples / 2); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); - for (i = 0; i < (numSamples / 2); i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrcCmplx, ULPSS_RAM_ADDR_SRC1, i * 2, 1); -#endif -#else - RSI_FIM_InputDataCmplx(pSrcCmplx, inBank1, i * 2, 1); -#endif - pSrcCmplx++; - pSrcCmplx++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrcReal, ULPSS_RAM_ADDR_SRC2, i * 2, 0); -#endif -#else - RSI_FIM_InputDataCmplx(pSrcReal, inBank2, i * 2, 0); -#endif - pSrcReal++; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcCmplx; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcReal; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_CPLX_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_cmplx_mult_cmplx_q15_opt(q15_t *pSrcA, - * q15_t *pSrcB, - * q15_t *pDst, - * uint32_t numSamples, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used for Q15 complex-by-complex multiplication - *@param[in] *pSrcA : points to the first input vector - *@param[in] *pSrcB : points to the second input vector - *@param[out] *pDst : points to the output vector - *@param[in] numSamples : number of complex samples in each vector - *@return none - */ -void rsi_arm_cmplx_mult_cmplx_q15_opt(q15_t *pSrcA, - q15_t *pSrcB, - q15_t *pDst, - uint32_t numSamples, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - uint32_t i; - RSI_FIM_SetDataLen(NOT_MATRIX, numSamples / 2, numSamples / 2); - RSI_FIM_SetSatTruncRound(STRS(0x10, 0, 0, 1)); - for (i = 0; i < (numSamples / 2); i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrcA, ULPSS_RAM_ADDR_SRC1, i * 2, ULP_FIM_COP_DATA_CPLX_CPLX); -#endif -#else - RSI_FIM_InputDataCmplx(pSrcA, inBank1, i * 2, ULP_FIM_COP_DATA_CPLX_CPLX); -#endif - pSrcA++; - pSrcA++; -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrcB, ULPSS_RAM_ADDR_SRC2, i * 2, ULP_FIM_COP_DATA_CPLX_CPLX); -#endif -#else - RSI_FIM_InputDataCmplx(pSrcB, inBank2, i * 2, ULP_FIM_COP_DATA_CPLX_CPLX); -#endif - pSrcB++; - pSrcB++; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_VECTOR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_CPLX_CPLX); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_cmplx_mag_squared_q15_opt(q15_t *pSrc, q15_t *pDst, uint32_t numSamples, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Absolute Squaring for real number - *@param[in] pSrc : is input for squaring a number - *@param[in] length : is size of the input array - *@return none - */ - -void rsi_arm_cmplx_mag_squared_q15_opt(q15_t *pSrc, q15_t *pDst, uint32_t numSamples, uint16_t inBank, uint16_t outBank) -{ - uint32_t i; - RSI_FIM_SetDataLen(NOT_MATRIX, numSamples / 2, numSamples / 2); - RSI_FIM_SetSatTruncRound(STRS(0x10, 0, 0, 1)); - for (i = 0; i < (numSamples / 2); i++) { -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputDataCmplx(pSrc, ULPSS_RAM_ADDR_SRC, i * 2, ULP_FIM_COP_DATA_CPLX_CPLX); -#endif -#else - RSI_FIM_InputDataCmplx(pSrc, inBank, i * 2, ULP_FIM_COP_DATA_CPLX_CPLX); -#endif - pSrc++; - pSrc++; - } -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((NORM_SQUARE << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_CPLX_CPLX); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_absSqr_q7(q7_t *pSrc, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Absolute Squaring for real number - *@param[in] pSrc : is input for squaring a number - *@param[in] length : is size of the input array - *@return none - */ - -void rsi_fim_absSqr_q7(q7_t *pSrc, q7_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x19, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q7); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((NORM_SQUARE << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_absSqr_q15(q15_t *pSrc, q15_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Absolute Squaring for real number - *@param[in] pSrc : is input for squaring a number - *@param[in] length : is size of the input array - *@return none - */ -void rsi_fim_absSqr_q15(q15_t *pSrc, q15_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((NORM_SQUARE << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_absSqr_q31(q31_t *pSrc, q31_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Absolute Squaring for real number - *@param[in] pSrc : is input for squaring a number - *@param[in] length : is size of the input array - *@return none - */ -void rsi_fim_absSqr_q31(q31_t *pSrc, q31_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((NORM_SQUARE << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_absSqr_f32(int32_t *pSrc, int32_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) - *@brief This API is used to set the FIM Absolute Squaring for real number - *@param[in] pSrc : is input for squaring a number - *@param[in] length : is size of the input array - *@return none - */ -void rsi_fim_absSqr_f32(int32_t *pSrc, int32_t *pDst, uint32_t blockSize, uint16_t inBank, uint16_t outBank) -{ - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, blockSize); - RSI_FIM_SetSatTruncRound(STRS(0x9, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank, blockSize, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((NORM_SQUARE << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn rsi_error_t rsi_arm_mat_mult_q31_opt(const arm_matrix_instance_q31_opt *pSrcA, - * const arm_matrix_instance_q31_opt *pSrcB, - * arm_matrix_instance_q31_opt *pDst, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Matrix Multiplication for real numbers - *@param[in] *pSrcA : points to the first input matrix structure - *@param[in] *pSrcB : points to the second input matrix structure - *@param[out] *pDst : points to output matrix structure - *@return none - */ - -rsi_error_t rsi_arm_mat_mult_f32_opt(const arm_matrix_instance_f32_opt *pSrcA, - const arm_matrix_instance_f32_opt *pSrcB, - arm_matrix_instance_f32_opt *pDst, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if (pSrcA->nColumns == pSrcB->nRows) { - RSI_FIM_SetDataLen(numColsA, 0, 0); - RSI_FIM_SetSatTruncRound(STRS(0x9, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q31); - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif -#else - // For 9116 - RSI_FIM_InputData((pSrcA->pData), inBank1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_F32); - RSI_FIM_InputData((pSrcB->pData), inBank2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_MAT << 1) | 1); - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - *@fn rsi_error_t rsi_arm_mat_mult_q31_opt(const arm_matrix_instance_q31_opt *pSrcA, - * const arm_matrix_instance_q31_opt *pSrcB, - * arm_matrix_instance_q31_opt *pDst, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Matrix Multiplication for real numbers - *@param[in] *pSrcA : points to the first input matrix structure - *@param[in] *pSrcB : points to the second input matrix structure - *@param[out] *pDst : points to output matrix structure - *@return none - */ -rsi_error_t rsi_arm_mat_mult_q31_opt(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if (pSrcA->nColumns == pSrcB->nRows) { - RSI_FIM_SetDataLen(numColsA, 0, 0); - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q31); - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif -#else - // For 9116 - RSI_FIM_InputData((pSrcA->pData), inBank1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q31); - RSI_FIM_InputData((pSrcB->pData), inBank2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((MUL_MAT << 1) | 1); - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - *@fn rsi_error_t rsi_arm_mat_mult_q15_opt(const arm_matrix_instance_q15_opt *pSrcA, - * const arm_matrix_instance_q15_opt *pSrcB, - * arm_matrix_instance_q15_opt *pDst, - * q15_t *pState, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM Matrix Multiplication for real numbers - *@param[in] *pSrcA : points to the first input matrix structure - *@param[in] *pSrcB : points to the second input matrix structure - *@param[out] *pDst : points to output matrix structure - *@param[in] *pState : points to the array for storing intermediate results (Unused) - *@return none - */ -rsi_error_t rsi_arm_mat_mult_q15_opt(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst, - q15_t *pState, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if (pSrcA->nColumns == pSrcB->nRows) { - RSI_FIM_SetDataLen(numColsA, 0, 0); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q15); - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif -#else - // For 9116 - RSI_FIM_InputData((pSrcA->pData), inBank1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q15); - RSI_FIM_InputData((pSrcB->pData), inBank2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - - FIM->FIM_MODE_INTERRUPT = ((MUL_MAT << 1) | 1); - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_init_f32_opt(arm_fir_instance_f32_opt *S, - * uint16_t numTaps, - * int32_t *pCoeffs, - * int32_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialize the FIM filters - *@param[in,out] *S : points to an instance of the floating-point FIR filter structure. - *@param[in] numTaps : Number of filter coefficients in the filter. - *@param[in] *pCoeffs : points to the filter coefficients buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : number of samples that are processed per call. - *@return none - */ -void rsi_arm_fir_init_f32_opt(arm_fir_instance_f32_opt *S, - uint16_t numTaps, - int32_t *pCoeffs, - int32_t *pState, - uint32_t blockSize) -{ - // Assign filter taps - S->numTaps = numTaps; - - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - // Assign state pointer - S->pState = pState; -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_f32_opt(arm_fir_instance_f32_opt *S, - * int32_t *pSrc, - * int32_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM FIR Filter - *@param[in] *S : points to an instance of the floating-point FIR filter structure. - *@param[in] *pSrc : points to the block of input data. - *@param[out] *pDst : points to the block of output data. - *@param[in] blockSize : number of samples to process per call. - *@return none - */ -void rsi_arm_fir_f32_opt(arm_fir_instance_f32_opt *S, - int32_t *pSrc, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - if (S->numTaps > blockSize) { - RSI_FIM_SetDataLen(blockSize, blockSize, (S->numTaps)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_F32); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, S->numTaps, FORMAT_F32); -#endif -#else - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_F32); - RSI_FIM_InputData(S->pCoeffs, inBank2, S->numTaps, FORMAT_F32); -#endif - } else { - RSI_FIM_SetDataLen((S->numTaps), (S->numTaps), blockSize); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_F32); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC1, S->numTaps, FORMAT_F32); -#endif -#else - RSI_FIM_InputData(pSrc, inBank2, blockSize, FORMAT_F32); - RSI_FIM_InputData(S->pCoeffs, inBank1, S->numTaps, FORMAT_F32); -#endif - } - RSI_FIM_SetSatTruncRound(STRS(0x9, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((FIR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_init_q31_opt(arm_fir_instance_q31_opt *S, - * uint16_t numTaps, - * q31_t *pCoeffs, - * q31_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialize the FIM filters - *@param[in,out] *S : points to an instance of the Q31 FIR filter structure. - *@param[in] numTaps : Number of filter coefficients in the filter. - *@param[in] *pCoeffs : points to the filter coefficients buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : number of samples that are processed per call. - *@return none - */ - -void rsi_arm_fir_init_q31_opt(arm_fir_instance_q31_opt *S, - uint16_t numTaps, - q31_t *pCoeffs, - q31_t *pState, - uint32_t blockSize) -{ - // Assign filter taps - S->numTaps = numTaps; - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - // Assign state pointer - S->pState = pState; -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_q31_opt(arm_fir_instance_q31_opt *S, - * q31_t *pSrc, - * q31_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM FIR Filter - *@param[in] *S : points to an instance of the Q31 FIR filter structure. - *@param[in] *pSrc : points to the block of input data. - *@param[out] *pDst : points to the block of output data. - *@param[in] blockSize : number of samples to process per call - *@return none - */ -void rsi_arm_fir_q31_opt(arm_fir_instance_q31_opt *S, - q31_t *pSrc, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - if (S->numTaps > blockSize) { - RSI_FIM_SetDataLen(blockSize, blockSize, (S->numTaps)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, S->numTaps, FORMAT_Q31); -#endif -#else - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(S->pCoeffs, inBank2, S->numTaps, FORMAT_Q31); -#endif - } else { - RSI_FIM_SetDataLen((S->numTaps), (S->numTaps), blockSize); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q31); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC1, S->numTaps, FORMAT_Q31); -#endif -#else - RSI_FIM_InputData(pSrc, inBank2, blockSize, FORMAT_Q31); - RSI_FIM_InputData(S->pCoeffs, inBank1, S->numTaps, FORMAT_Q31); -#endif - } - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((FIR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *fn void rsi_arm_fir_init_q15_opt(arm_fir_instance_q15_opt *S, - * uint16_t numTaps, - * q15_t *pCoeffs, - * q15_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialise the FIM filters - *@param[in,out] *S : points to an instance of the Q15 FIR filter structure. - *@param[in] numTaps : Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - *@param[in] *pCoeffs : points to the filter coefficients buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : is number of samples processed per call. - *@return none - * - */ -void rsi_arm_fir_init_q15_opt(arm_fir_instance_q15_opt *S, - uint16_t numTaps, - q15_t *pCoeffs, - q15_t *pState, - uint32_t blockSize) -{ - // Assign filter taps - S->numTaps = numTaps; - - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - // Assign state pointer - S->pState = pState; -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_q15_opt(arm_fir_instance_q15_opt *S, - * q15_t *pSrc, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM FIR Filter - *@param[in] *S : points to an instance of the Q15 FIR structure. - *@param[in] *pSrc : points to the block of input data. - *@param[out] *pDst : points to the block of output data. - *@param[in] blockSize : number of samples to process per call. - *@return none - */ - -void rsi_arm_fir_q15_opt(arm_fir_instance_q15_opt *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - - if (S->numTaps > blockSize) { - RSI_FIM_SetDataLen(blockSize, blockSize, (S->numTaps)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, S->numTaps, FORMAT_Q15); -#endif -#else - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(S->pCoeffs, inBank2, S->numTaps, FORMAT_Q15); -#endif - } else { - RSI_FIM_SetDataLen((S->numTaps), (S->numTaps), blockSize); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q15); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC1, S->numTaps, FORMAT_Q15); -#endif -#else - RSI_FIM_InputData(pSrc, inBank2, blockSize, FORMAT_Q15); - RSI_FIM_InputData(S->pCoeffs, inBank1, S->numTaps, FORMAT_Q15); -#endif - } - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((FIR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_init_q7_opt(arm_fir_instance_q7_opt *S, - * uint16_t numTaps, - * q7_t *pCoeffs, - * q7_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialise the FIM filters - *@param[in,out] *S : points to an instance of the Q7 FIR filter structure. - *@param[in] numTaps : Number of filter coefficients in the filter. - *@param[in] *pCoeffs : points to the filter coefficients buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : number of samples that are processed per call. - *@return none - */ -void rsi_arm_fir_init_q7_opt(arm_fir_instance_q7_opt *S, - uint16_t numTaps, - q7_t *pCoeffs, - q7_t *pState, - uint32_t blockSize) -{ - // Assign filter taps - S->numTaps = numTaps; - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - // Assign state pointer - S->pState = pState; -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_q7_opt(arm_fir_instance_q7_opt *S, - * q7_t *pSrc, - * q7_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to set the FIM FIR Filter - *@param[in] *S : points to an instance of the Q7 FIR filter structure. - *@param[in] *pSrc : points to the block of input data. - *@param[out] *pDst : points to the block of output data. - *@param[in] blockSize : number of samples to process per call. - *@return none - */ -void rsi_arm_fir_q7_opt(arm_fir_instance_q7_opt *S, - q7_t *pSrc, - q7_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - if (S->numTaps > blockSize) { - RSI_FIM_SetDataLen(blockSize, blockSize, (S->numTaps)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, S->numTaps, FORMAT_Q7); -#endif -#else - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_Q7); - RSI_FIM_InputData(S->pCoeffs, inBank2, S->numTaps, FORMAT_Q7); -#endif - } else { - RSI_FIM_SetDataLen((S->numTaps), (S->numTaps), blockSize); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC2, blockSize, FORMAT_Q7); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC1, S->numTaps, FORMAT_Q7); -#endif -#else - RSI_FIM_InputData(pSrc, inBank2, blockSize, FORMAT_Q7); - RSI_FIM_InputData(S->pCoeffs, inBank1, S->numTaps, FORMAT_Q7); -#endif - } - RSI_FIM_SetSatTruncRound(STRS(0x19, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((FIR << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn arm_status rsi_arm_fir_interpolate_init_f32_opt(arm_fir_interpolate_instance_f32_opt *S, - * uint8_t L, - * uint16_t numTaps, - * int32_t *pCoeffs, - * int32_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialization function for the floating-point FIR interpolator. - *@param[in,out] *S : points to an instance of the floating-point FIR interpolator structure. - *@param[in] L :upsample factor. - *@param[in] numTaps : number of filter coefficients in the filter. - *@param[in] *pCoeffs : points to the filter coefficient buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : number of input samples to process per call. - * - *@return The function returns \ref ARM_MATH_SUCCESS if initialization was successful or \ref ARM_MATH_LENGTH_ERROR if the filter length numTaps is not a multiple of the interpolation factor L. - */ -arm_status rsi_arm_fir_interpolate_init_f32_opt(arm_fir_interpolate_instance_f32_opt *S, - uint8_t L, - uint16_t numTaps, - int32_t *pCoeffs, - int32_t *pState, - uint32_t blockSize) -{ - arm_status status; - - // The filter length must be a multiple of the interpolation factor - if ((numTaps % L) != 0u) { - // Set status as ARM_MATH_LENGTH_ERROR - status = ARM_MATH_LENGTH_ERROR; - } else { - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - // Assign Interpolation factor - S->L = L; - // Assign polyPhaseLength - S->phaseLength = numTaps / L; - // Assign state pointer - S->pState = pState; - status = ARM_MATH_SUCCESS; - } - return (status); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_interpolate_f32_opt(const arm_fir_interpolate_instance_f32_opt *S, - * int32_t *pSrc, - * int32_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used Processing function for the floating-point FIR interpolator. - *@param[in] *S : points to an instance of the floating-point FIR interpolator structure. - *@param[in] *pSrc : points to the block of input data. - *@param[out] *pDst : points to the block of output data. - *@param[in] blockSize : number of input samples to process per call. - *@return none - */ -void rsi_arm_fir_interpolate_f32_opt(const arm_fir_interpolate_instance_f32_opt *S, - int32_t *pSrc, - int32_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - - uint32_t numTaps; - numTaps = (S->phaseLength) * (S->L); - - RSI_FIM_SetDataLen(numTaps, blockSize, numTaps); - RSI_FIM_SetSatTruncRound(STRS(0x9, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_F32); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, numTaps, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_F32); - RSI_FIM_InputData(S->pCoeffs, inBank2, numTaps, FORMAT_F32); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_CONFIG_REG2 |= (S->L) << 22; - FIM->FIM_MODE_INTERRUPT = ((INTERPOLATE << 1) | 1); - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn arm_status rsi_arm_fir_interpolate_init_q15_opt(arm_fir_interpolate_instance_q15_opt *S, - * uint8_t L, - * uint16_t numTaps, - * q15_t *pCoeffs, - * q15_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialization function for the Q31 FIR interpolator. - *@param[in,out] *S : points to an instance of the Q31 FIR interpolator structure. - *@param[in] L : upsample factor. - *@param[in] numTaps : number of filter coefficients in the filter. - *@param[in] *pCoeffs : points to the filter coefficient buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : number of input samples to process per call. - *@return The function returns \ref ARM_MATH_SUCCESS if initialization was successful or \ref ARM_MATH_LENGTH_ERROR if the filter length numTaps is not a multiple of the interpolation factor L. - * - */ -arm_status rsi_arm_fir_interpolate_init_q15_opt(arm_fir_interpolate_instance_q15_opt *S, - uint8_t L, - uint16_t numTaps, - q15_t *pCoeffs, - q15_t *pState, - uint32_t blockSize) -{ - arm_status status; - - // The filter length must be a multiple of the interpolation factor - if ((numTaps % L) != 0u) { - // Set status as ARM_MATH_LENGTH_ERROR - status = ARM_MATH_LENGTH_ERROR; - } else { - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - - // Assign Interpolation factor - S->L = L; - - // Assign polyPhaseLength - S->phaseLength = numTaps / L; - - // Assign state pointer - S->pState = pState; - status = ARM_MATH_SUCCESS; - } - return (status); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_fir_interpolate_q15_opt(arm_fir_interpolate_instance_q15_opt *S, - * q15_t *pSrc, - * q15_t *pDst, - * uint32_t blockSize, - * uint16_t inBank1, - * uint16_t inBank2, - * uint16_t outBank) - *@brief This API is used to Processing function for the Q15 FIR interpolator - *@param[in] *S : points to an instance of the Q15 FIR interpolator structure. - *@param[in] *pSrc : points to the block of input data. - *@param[out] *pDst : points to the block of output data. - *@param[in] blockSize : number of input samples to process per call. - *@return none - */ -void rsi_arm_fir_interpolate_q15_opt(arm_fir_interpolate_instance_q15_opt *S, - q15_t *pSrc, - q15_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - - uint32_t numTaps; - numTaps = (S->phaseLength) * (S->L); - - RSI_FIM_SetDataLen(numTaps, blockSize, numTaps); - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, numTaps, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_Q15); - RSI_FIM_InputData(S->pCoeffs, inBank2, numTaps, FORMAT_Q15); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((INTERPOLATE << 1) | 1); - FIM->FIM_CONFIG_REG2 |= (S->L) << 22; - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn arm_status rsi_arm_fir_interpolate_init_q31_opt(arm_fir_interpolate_instance_q31_opt *S, - * uint8_t L, - * uint16_t numTaps, - * q31_t *pCoeffs, - * q31_t *pState, - * uint32_t blockSize) - *@brief This API is used to initialization function for the Q31 FIR interpolator. - *@param[in,out] *S : points to an instance of the Q31 FIR interpolator structure. - *@param[in] L : upsample factor. - *@param[in] numTaps : number of filter coefficients in the filter. - *@param[in] *pCoeffs : points to the filter coefficient buffer. - *@param[in] *pState : points to the state buffer. - *@param[in] blockSize : number of input samples to process per call. - *@return The function returns \ref ARM_MATH_SUCCESS if initialization was successful or \ref ARM_MATH_LENGTH_ERROR if the filter length numTaps is not a multiple of the interpolation factor L. - * - */ -arm_status rsi_arm_fir_interpolate_init_q31_opt(arm_fir_interpolate_instance_q31_opt *S, - uint8_t L, - uint16_t numTaps, - q31_t *pCoeffs, - q31_t *pState, - uint32_t blockSize) -{ - arm_status status; - // The filter length must be a multiple of the interpolation factor - if ((numTaps % L) != 0u) { - // Set status as ARM_MATH_LENGTH_ERROR - status = ARM_MATH_LENGTH_ERROR; - } else { - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - - // Assign Interpolation factor - S->L = L; - - // Assign polyPhaseLength - S->phaseLength = numTaps / L; - - // Assign state pointer - S->pState = pState; - - status = ARM_MATH_SUCCESS; - } - - return (status); -} - -/*==============================================*/ -/** - *@fn rsi_arm_fir_interpolate_q31_opt(const arm_fir_interpolate_instance_q31_opt *S, - q31_t *pSrc, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) - *@brief This API is used for Q31 FIR interpolator. - *@param[in,out] *S : points to an instance of the Q31 FIR interpolator structure. - *@param[in] *pSrc : Source Pointer. - *@param[in] *pDst : Destination pointer - *@param[in] blockSize : number of input samples to process per call - *@param[in] inBank1 - *@param[in] inBank2 - *@param[in] outBank - *@return None - * - */ -void rsi_arm_fir_interpolate_q31_opt(const arm_fir_interpolate_instance_q31_opt *S, - q31_t *pSrc, - q31_t *pDst, - uint32_t blockSize, - uint16_t inBank1, - uint16_t inBank2, - uint16_t outBank) -{ - uint32_t numTaps; - numTaps = (S->phaseLength) * (S->L); - - RSI_FIM_SetDataLen(numTaps, blockSize, numTaps); - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#ifdef ENHANCED_FIM -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(S->pCoeffs, ULPSS_RAM_ADDR_SRC2, numTaps, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif -#else - // For 9116 - RSI_FIM_InputData(pSrc, inBank1, blockSize, FORMAT_Q31); - RSI_FIM_InputData(S->pCoeffs, inBank2, numTaps, FORMAT_Q31); - FIM->FIM_INP1_ADDR_b.INP1_ADDR = inBank1; - FIM->FIM_INP2_ADDR_b.INP2_ADDR = inBank2; - FIM->FIM_OUT_ADDR_b.OUT_ADDR = outBank; -#endif - FIM->FIM_MODE_INTERRUPT = ((INTERPOLATE << 1) | 1); - FIM->FIM_CONFIG_REG2 |= (S->L) << 22; - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_fim_interrupt_handler(volatile FIM_Type *ptFim) - *@brief This API Clears interrupt status of fim - *@param[in] ptFim is pointer to the FIM register instance - *@return none - */ -void rsi_fim_interrupt_handler(volatile FIM_Type *ptFim) -{ - ptFim->FIM_MODE_INTERRUPT_b.INTR_CLEAR = 0x1; -} - -#ifdef ENHANCED_FIM - -/*==============================================*/ -/** - * @fn void rsi_arm_correlate_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst) - * @brief This API is used to set FIM Correlation Operation of Q15 sequence. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ -void rsi_arm_correlate_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, srcALen, srcBLen); - // Set saturation,trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x01, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store Input data1 in ulp memories - RSI_FIM_InputData((void *)pSrcA, ULPSS_RAM_ADDR_SRC1, srcALen, FORMAT_Q15); - // Store Input data2 in ulp memories - RSI_FIM_InputData((void *)pSrcB, ULPSS_RAM_ADDR_SRC2, srcBLen, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed.Enable latch mode - FIM->FIM_MODE_INTERRUPT = ((CORRELATION << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_correlate_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, uint32_t srcBLen, q31_t *pDst) - * @brief This API is used to set FIM Correlation Operation of Q31 sequence. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ -void rsi_arm_correlate_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, uint32_t srcBLen, q31_t *pDst) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, srcALen, srcBLen); - // Set saturation,trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x01, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store Input data1 in ulp memories - RSI_FIM_InputData((void *)pSrcA, ULPSS_RAM_ADDR_SRC1, srcALen, FORMAT_Q31); - // Store Input data1 in ulp memories - RSI_FIM_InputData((void *)pSrcB, ULPSS_RAM_ADDR_SRC2, srcBLen, FORMAT_Q31); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed.Enable latch mode - FIM->FIM_MODE_INTERRUPT = ((CORRELATION << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_correlate_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, q7_t *pDst) - * @brief This API is used to set FIM Correlation Operation of Q7 sequence. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ -void rsi_arm_correlate_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, q7_t *pDst) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, srcALen, srcBLen); - // Set saturation,trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x01, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store Input data1 in ulp memories - RSI_FIM_InputData((void *)pSrcA, ULPSS_RAM_ADDR_SRC1, srcALen, FORMAT_Q7); - // Store Input data2 in ulp memories - RSI_FIM_InputData((void *)pSrcB, ULPSS_RAM_ADDR_SRC2, srcBLen, FORMAT_Q7); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrcA; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)pSrcB; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed.Enable latch mode - FIM->FIM_MODE_INTERRUPT = ((CORRELATION << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn arm_status arm_fir_decimate_init_q31(arm_fir_decimate_instance_q31 *S, - * uint16_t numTaps, - * uint8_t M, - * q31_t *pCoeffs, - * q31_t *pState, - * uint32_t blockSize) - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ -arm_status arm_fir_decimate_init_q31(arm_fir_decimate_instance_q31 *S, - uint16_t numTaps, - uint8_t M, - q31_t *pCoeffs, - q31_t *pState, - uint32_t blockSize) -{ - arm_status status; - - // The size of the input block must be a multiple of the decimation factor - if ((blockSize % M) != 0u) { - // Set status as ARM_MATH_LENGTH_ERROR - status = ARM_MATH_LENGTH_ERROR; - } else { - // Assign filter taps - S->numTaps = numTaps; - - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - - // Clear the state buffer. The size is always (blockSize + numTaps - 1) - memset(pState, 0, (numTaps + (blockSize - 1)) * sizeof(q31_t)); - - // Assign state pointer - S->pState = pState; - - // Assign Decimation factor - S->M = M; - - status = ARM_MATH_SUCCESS; - } - return (status); -} - -/*==============================================*/ -/** - * @fn arm_status arm_fir_decimate_init_q15(arm_fir_decimate_instance_q15 *S, - * uint16_t numTaps, - * uint8_t M, - * q15_t *pCoeffs, - * q15_t *pState, - * uint32_t blockSize) - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ -arm_status arm_fir_decimate_init_q15(arm_fir_decimate_instance_q15 *S, - uint16_t numTaps, - uint8_t M, - q15_t *pCoeffs, - q15_t *pState, - uint32_t blockSize) -{ - - arm_status status; - - // The size of the input block must be a multiple of the decimation factor - if ((blockSize % M) != 0u) { - // Set status as ARM_MATH_LENGTH_ERROR - status = ARM_MATH_LENGTH_ERROR; - } else { - // Assign filter taps - S->numTaps = numTaps; - - // Assign coefficient pointer - S->pCoeffs = pCoeffs; - - // Clear the state buffer. The size of buffer is always (blockSize + numTaps - 1) - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q15_t)); - - // Assign state pointer - S->pState = pState; - - // Assign Decimation factor - S->M = M; - - status = ARM_MATH_SUCCESS; - } - return (status); -} - -/*==============================================*/ -/** - * @fn void arm_fir_decimate_q15(const arm_fir_decimate_instance_q15 *S, q15_t *pSrc, q15_t *pDst, uint32_t blockSize) - * @brief Processing function for the Q15 FIR decimator. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ -void arm_fir_decimate_q15(const arm_fir_decimate_instance_q15 *S, q15_t *pSrc, q15_t *pDst, uint32_t blockSize) -{ - uint32_t numTaps; - numTaps = (S->numTaps); - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, numTaps); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - RSI_FIM_InputData((void *)S->pCoeffs, ULPSS_RAM_ADDR_SRC2, numTaps, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of 1st coefficient for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((DECIMATION << 1) | 1); - /* Set Decimation Factor */ - FIM->FIM_CONFIG_REG1_b.DECIM_FAC = S->M; - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void arm_fir_decimate_q31(const arm_fir_decimate_instance_q31 *S, q31_t *pSrc, q31_t *pDst, uint32_t blockSize) - * @brief Processing function for the Q31 FIR decimator. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void arm_fir_decimate_q31(const arm_fir_decimate_instance_q31 *S, q31_t *pSrc, q31_t *pDst, uint32_t blockSize) -{ - uint32_t numTaps; - numTaps = (S->numTaps); - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, numTaps); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q31); - /* Store pCoeffs in ulp memories */ - RSI_FIM_InputData((void *)S->pCoeffs, ULPSS_RAM_ADDR_SRC2, numTaps, FORMAT_Q31); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 1st coefficients for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of 1st coefficients for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)S->pCoeffs; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((DECIMATION << 1) | 1); - // Set Decimation Factor - FIM->FIM_CONFIG_REG1_b.DECIM_FAC = S->M; - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** -* @details -* @fn void rsi_arm_cfft_radix2(q31_t *pSrc) -* @brief Processing function for complex FFT. -* @param[in] *S points to an instance of the CFFT structure. -* @param[in, out] *pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return none. -*/ -void rsi_arm_cfft_radix2(q31_t *pSrc) -{ - uint32_t i = 0; - q31_t pSrc_even[LOOKUP_LENGTH]; - q31_t pSrc_odd[LOOKUP_LENGTH]; - uint32_t pSrc_even_len = LOOKUP_LENGTH; -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - uint32_t pSrc_odd_len = LOOKUP_LENGTH; -#endif - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, FFT_LENGTH, NO_OF_STAGES); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1, 0, 0, 0)); - for (i = 0; i < pSrc_even_len; i++) { - pSrc_even[i] = (pSrc[LOOKUP_TABLE_EVEN_BANK[i]]); - pSrc_odd[i] = (pSrc[LOOKUP_TABLE_ODD_BANK[i]]); - } -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store even address data in ulp memories - RSI_FIM_InputData(pSrc_even, ULPSS_RAM_ADDR_SRC1, pSrc_even_len, FORMAT_Q31); - // Store odd address data in ulp memories - RSI_FIM_InputData((void *)pSrc_odd, ULPSS_RAM_ADDR_SRC2, pSrc_odd_len, FORMAT_Q31); - // Twiddle factor - RSI_FIM_InputData((void *)TWIDDLE_FACTOR_TABLE, ULPSS_RAM_ADDR_DST, TWIDDLE_FACTOR_LEN, FORMAT_Q31); - // Start Address of even address Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of odd address for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of twiddle factor Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; //twiddle -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((FFT << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_CPLX_CPLX); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_sin_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] *pSrc Scaled input value in radians. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void rsi_arm_sin_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blocksize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blocksize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut1, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut1; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; - -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((COR_SINE << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_cos_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) - * @brief Fast approximation to the trigonometric Cosine function for Q15 data. - * @param[in] *pSrc Scaled input value in radians. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void rsi_arm_cos_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blocksize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blocksize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut1, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut1; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((COR_COSINE << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_Inverse_Tan_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) - * @brief Fast approximation to the trigonometric Inverse Tan function for Q15 data. - * @param[in] *pSrc Scaled input value in radians. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void rsi_arm_Inverse_Tan_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blocksize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blocksize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut1, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut1; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((COR_INV_TAN << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_Sinh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) - * @brief Fast approximation to the trigonometric Sinh function for Q15 data. - * @param[in] *pSrc Scaled input value in radians. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void rsi_arm_Sinh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blocksize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blocksize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut2, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; - -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((COR_SINH << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_cosh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) - * @brief Fast approximation to the trigonometric cosh function for Q15 data. - * @param[in] *pSrc Scaled input value in radians. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void rsi_arm_cosh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blocksize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blocksize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut2, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((COR_COSH << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn void rsi_arm_Inverse_Tanh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) - * @brief Fast approximation to the trigonometric Inverse Tanh function for Q15 data. - * @param[in] *pSrc Scaled input value in radians. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ -void rsi_arm_Inverse_Tanh_q15(q15_t *pSrc, q15_t *pDst, uint32_t blocksize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blocksize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blocksize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut2, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((COR_INV_TANH << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - * @fn rsi_error_t rsi_arm_mat_add_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst) - * @brief Q15 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ERROR_FIM_MATRIX_INVALID_ARG or RSI_OK based on the outcome of size checking. - * - */ -rsi_error_t rsi_arm_mat_add_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst) -{ - - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if ((pSrcA->nColumns == pSrcB->nColumns) && (pSrcA->nRows == pSrcB->nRows)) { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numColsA, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((ADD_MAT << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t arm_mat_add_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst) - * @brief Q31 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ERROR_FIM_MATRIX_INVALID_ARG or RSI_OK based on the outcome of size checking. - */ -rsi_error_t arm_mat_add_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst) -{ - - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if ((pSrcA->nColumns == pSrcB->nColumns) && (pSrcA->nRows == pSrcB->nRows)) { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numColsA, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q31); - // Store data in ulp memories - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q31); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((ADD_MAT << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t arm_mat_sub_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst) - * @brief Q15 matrix subtraction. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ERROR_FIM_MATRIX_INVALID_ARG or RSI_OK based on the outcome of size checking. - */ -rsi_error_t arm_mat_sub_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst) -{ - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if ((pSrcA->nColumns == pSrcB->nColumns) && (pSrcA->nRows == pSrcB->nRows)) { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numColsA, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((SUB_MAT << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t arm_mat_sub_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst) - * @brief Q31 matrix subtraction. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ERROR_FIM_MATRIX_INVALID_ARG or RSI_OK based on the outcome of size checking. - */ -rsi_error_t arm_mat_sub_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst) -{ - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if ((pSrcA->nColumns == pSrcB->nColumns) && (pSrcA->nRows == pSrcB->nRows)) { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numColsA, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q31); - // Store data in ulp memories - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q31); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - /* ULPSS buffers from application */ - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((SUB_MAT << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t arm_mat_trans_q15(const arm_matrix_instance_q15_opt *pSrc, arm_matrix_instance_q15_opt *pDst) - * @brief Q15 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ERROR_FIM_MATRIX_INVALID_ARG - * or RSI_OK based on the outcome of size checking. - */ -rsi_error_t arm_mat_trans_q15(const arm_matrix_instance_q15_opt *pSrc, arm_matrix_instance_q15_opt *pDst) -{ - // Number of rows of input matrix A - uint16_t numRows = pSrc->nRows; - // Number of columns of input matrix B - uint16_t numCols = pSrc->nColumns; - if (pSrc == NULL) { - return ERROR_FIM_MATRIX_INVALID_ARG; - } else { - // Set column size of buffers in the FIM module - RSI_FIM_SetDataLen(numCols, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrc->pData), ULPSS_RAM_ADDR_SRC1, ((pSrc->nRows) * (pSrc->nColumns)), FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // ULPSS buffers from application - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrc->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); - -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((MAT_TRANSPOSE << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRows, numCols, ULP_FIM_COP_DATA_REAL_REAL); - return RSI_OK; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t rsi_arm_mat_trans_q31(const arm_matrix_instance_q31_opt *pSrc, arm_matrix_instance_q31_opt *pDst) - * @brief Q31 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ERROR_FIM_MATRIX_INVALID_ARG - * or RSI_OK based on the outcome of size checking. - */ - -rsi_error_t rsi_arm_mat_trans_q31(const arm_matrix_instance_q31_opt *pSrc, arm_matrix_instance_q31_opt *pDst) -{ - // Number of rows of input matrix A - uint16_t numRows = pSrc->nRows; - // Number of columns of input matrix B - uint16_t numCols = pSrc->nColumns; - if (pSrc == NULL) { - return ERROR_FIM_MATRIX_INVALID_ARG; - } else { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numCols, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrc->pData), ULPSS_RAM_ADDR_SRC1, ((pSrc->nRows) * (pSrc->nColumns)), FORMAT_Q31); - /* Start Address of 1st Input Data for FIM Operations */ - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - /* ULPSS buffers from application */ - /* Start Address of 1st Input Data for FIM Operations */ - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrc->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((MAT_TRANSPOSE << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRows, numCols, ULP_FIM_COP_DATA_REAL_REAL); - return RSI_OK; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t rsi_arm_mat_Hadamard_prod_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst) - * @brief Q15 matrix Hadamard product. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ERROR_FIM_MATRIX_INVALID_ARG or RSI_OK based on the outcome of size checking. - */ -rsi_error_t rsi_arm_mat_Hadamard_prod_q15(const arm_matrix_instance_q15_opt *pSrcA, - const arm_matrix_instance_q15_opt *pSrcB, - arm_matrix_instance_q15_opt *pDst) -{ - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if ((pSrcA->nColumns == pSrcB->nColumns) && (pSrcA->nRows == pSrcB->nRows)) { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numColsA, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - // Start Address of 2nd Input Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((MAT_HADAMARD << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t arm_mat_Hadamard_prod_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst) - * @brief Q31 matrix Hadamard product. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ERROR_FIM_MATRIX_INVALID_ARG or RSI_OK based on the outcome of size checking. - */ -rsi_error_t arm_mat_Hadamard_prod_q31(const arm_matrix_instance_q31_opt *pSrcA, - const arm_matrix_instance_q31_opt *pSrcB, - arm_matrix_instance_q31_opt *pDst) -{ - - // Number of rows of input matrix A - uint16_t numRowsA = pSrcA->nRows; - // Number of columns of input matrix B - uint16_t numColsB = pSrcB->nColumns; - // Number of columns of input matrix A - uint16_t numColsA = pSrcA->nColumns; - if ((pSrcA != NULL) && (pSrcB != NULL)) { - if ((pSrcA->nColumns == pSrcB->nColumns) && (pSrcA->nRows == pSrcB->nRows)) { - /* Set column size of buffers in the FIM module */ - RSI_FIM_SetDataLen(numColsA, 0, 0); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x11, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData((pSrcA->pData), ULPSS_RAM_ADDR_SRC1, ((pSrcA->nRows) * (pSrcA->nColumns)), FORMAT_Q31); - // Store data in ulp memories - RSI_FIM_InputData((pSrcB->pData), ULPSS_RAM_ADDR_SRC2, ((pSrcB->nRows) * (pSrcB->nColumns)), FORMAT_Q31); - /* Start Address of 1st Input Data for FIM Operations */ - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - /* Start Address of 2nd Input Data for FIM Operations */ - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - /* Start Address of 1st Input Data for FIM Operations */ - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ((uint32_t)pSrcA->pData); - /* Start Address of 2nd Input Data for FIM Operations */ - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ((uint32_t)pSrcB->pData); - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ((uint32_t)pDst->pData); -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((MAT_HADAMARD << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(numRowsA, numColsB, ULP_FIM_COP_DATA_REAL_REAL); - } else { - return ERROR_FIM_MATRIX_INVALID_ARG; - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - *@fn void rsi_arm_VSqrt_q15(q15_t *pSrc, q15_t *pDst, uint32_t blockSize) - *@brief This API is used to set the FIM Q15 Square root for real number - *@param[in] *pSrc points input for squaring a number - *@param[in] *pDst points to the block of output data - *@param[in] blockSize is size of the input array - *@return none - */ -void rsi_arm_VSqrt_q15(q15_t *pSrc, q15_t *pDst, uint32_t blockSize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut2, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - /* Start Address of lookup table Data for FIM Operations */ - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((SQ_ROOT << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_arm_log_q15(q15_t *pSrc, q15_t *pDst, uint16_t blockSize) - *@brief This API is used to set the FIM Q15 Natural Log Operation for real number - *@param[in] *pSrc points input for squaring a number - *@param[in] *pDst points to the block of output data - *@param[in] blockSize is size of the input array - *@return none - */ -void rsi_arm_log_q15(q15_t *pSrc, q15_t *pDst, uint16_t blockSize) -{ - // Set data blockSize of buffers in the FIM module - RSI_FIM_SetDataLen(NOT_MATRIX, blockSize, TRIG_LUT_LEN); - // Set sat trunc values to FIM module for corresponding inputs - RSI_FIM_SetSatTruncRound(STRS(0x1F, 0, 0, 0)); -#if ULPSS_MEMORY_WITH_M4_MEM_BUFFRS - // Use application buffer which are in M4 RAM and copy them to ulpss RAM ,point ulpss RAM address to FIM - // Store data in ulp memories - RSI_FIM_InputData(pSrc, ULPSS_RAM_ADDR_SRC1, blockSize, FORMAT_Q15); - // Store data in ulp memories - RSI_FIM_InputData(Trig_lut2, ULPSS_RAM_ADDR_SRC2, TRIG_LUT_LEN, FORMAT_Q15); - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = ULPSS_RAM_ADDR_SRC1; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = ULPSS_RAM_ADDR_SRC2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = ULPSS_RAM_ADDR_DST; -#else - // Start Address of 1st Input Data for FIM Operations - FIM->FIM_INP1_ADDR_b.INP1_ADDR = (uint32_t)pSrc; - // Start Address of lookup table Data for FIM Operations - FIM->FIM_INP2_ADDR_b.INP2_ADDR = (uint32_t)Trig_lut2; - // Start Address of Output Data for FIM Operations - FIM->FIM_OUT_ADDR_b.OUT_ADDR = (uint32_t)pDst; -#endif - // Set the Mode of Operation to be performed. - FIM->FIM_MODE_INTERRUPT = ((NAT_LOG << 1) | 1); - // Set the data type and Trigger the FIM module - RSI_FIM_DatTypTrig(NOT_MATRIX, NOT_MATRIX, ULP_FIM_COP_DATA_REAL_REAL); -} - -/*==============================================*/ -/** - *@fn void rsi_enable_inst_buff(void) - *@brief This API is used to select instruction buffer for performing more than one operations at a time. - *@return none - */ -void rsi_enable_inst_buff(void) -{ - // Instruction buffer enable - FIM->FIM_CONFIG_REG2_b.INSTR_BUFF_ENABLE = ENABLE; -} - -#ifdef INST_BUFF_ENABLE -/*==============================================*/ -/** - *@fn void rsi_fim_copy_fim_reg_to_ulp_memory(void) - *@brief This API is used to copy FIM configuration to ulpss memory when instruction buffer is enabled . - *@return none - */ -void rsi_fim_copy_fim_reg_to_ulp_memory(void) -{ - static int reg_copy_count; - memcpy((void *)(ULP_MEMORY_ADDR + (reg_copy_count * 9 * 4)), (const char *)FIM_BASE, 36); - memset((void *)(ULP_MEMORY_ADDR + (((reg_copy_count + 1) * 0x24))), 0xFFFFFFFF, sizeof(int)); - reg_copy_count++; -} -#endif -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_i2s.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_i2s.c index 13b767601..0250afe60 100644 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_i2s.c +++ b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_i2s.c @@ -374,23 +374,13 @@ int32_t I2S_Control(uint32_t control, } if (i2s->reg == I2S1) { if (i2s->clk->clk_src == ULP_I2S_REF_CLK) { - val = 32000000 / bit_freq; + val = system_clocks.ulpss_ref_clk / bit_freq; RSI_ULPSS_UlpI2sClkConfig(ULPCLK, ULP_I2S_REF_CLK, (uint16_t)val / 2); } if (i2s->clk->clk_src == ULP_I2S_ULP_32MHZ_RC_CLK) { - val = 32000000 / bit_freq; + val = system_clocks.rc_32mhz_clock / bit_freq; RSI_ULPSS_UlpI2sClkConfig(ULPCLK, ULP_I2S_ULP_32MHZ_RC_CLK, (uint16_t)val / 2); } - if (i2s->clk->clk_src == ULP_I2S_ULP_20MHZ_RO_CLK) { - val = 20000000 / bit_freq; - RSI_ULPSS_UlpI2sClkConfig(ULPCLK, ULP_I2S_ULP_20MHZ_RO_CLK, (uint16_t)val); - } - if (i2s->clk->clk_src == ULP_I2S_SOC_CLK) { - // TODO: This source is not working - //freq = GetSOCClockFreq(); - val = 32000000 / bit_freq; - //RSI_ULPSS_UlpI2sClkConfig(ULPCLK ,RTE_I2S1_CLK_SRC,val/2); - } if (i2s->clk->clk_src == ULP_I2S_PLL_CLK) { val = 6250000 / bit_freq; RSI_ULPSS_UlpI2sClkConfig(ULPCLK, ULP_I2S_PLL_CLK, (uint16_t)val / 2); diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_ir.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_ir.c deleted file mode 100644 index 8c4668c6e..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_ir.c +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* -* @file rsi_ir.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include files - -#include "rsi_ir.h" - -/** @addtogroup SOC23 -* @{ -*/ -/*==============================================*/ -/** - * @fn uint16_t RSI_IR_ReadData(IR_Type* pIr,uint16_t memory_address) - * @brief This API is used read IR address. - * @param[in] pIr : IR type pointer - * @param[in] memory_address : memory address value (0 .. 128). - * @return 16-Bit IR data received (BIT[15] in received data will indicate the polarity of pulse) - * \n remaining bit will contain the incremented counter value of the pulse. - */ -uint16_t RSI_IR_ReadData(IR_Type *pIr, uint16_t memory_address) -{ - if (memory_address > MAX_MEMORY_ADDRESS) { - return INVALID_PARAMETERS; - } - pIr->IR_MEM_ADDR_ACCESS_b.IR_MEM_ADDR = (unsigned int)(memory_address & 0x007F); - pIr->IR_MEM_ADDR_ACCESS_b.IR_MEM_RD_EN = 1U; - return pIr->IR_MEM_READ_b.IR_MEM_DATA_OUT; -} - -/*==============================================*/ -/** - * @fn void RSI_IR_SoftwareRestart(IR_Type* pIr) - * @brief This API restart the IR operation. - * @param[in] pIr : IR type pointer - */ -void RSI_IR_SoftwareRestart(IR_Type *pIr) -{ - uint8_t i; - pIr->IR_CONFIG_b.SREST_IR_CORE = 1U; - for (i = 0; i < 10; i++) { - __ASM("nop"); - } - pIr->IR_CONFIG_b.SREST_IR_CORE = 0U; -} -/** @} */ \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdioh.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdioh.c deleted file mode 100644 index 93e3a9f0c..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdioh.c +++ /dev/null @@ -1,798 +0,0 @@ -/******************************************************************************* -* @file rsi_sdioh.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) - -#include "clock_update.h" - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_RegisterInfo(SMIH_CARD_CONFIG_T *pSmihConfig, SMIH_CCCR_REG_INFO_T *pRegInfo) - * @brief This API is used to know the register info of the card. - * @param[in] pSmihConfig : Pointer to the card command information structure - * @param[in] pRegInfo : Pointer to the Command info structure - * @return RSI_OK : command sent succesfully - * ERROR_SMIH : If Parameter is invalid. - */ -rsi_error_t RSI_SDIOH_RegisterInfo(SMIH_CARD_CONFIG_T *pSmihConfig, SMIH_CCCR_REG_INFO_T *pRegInfo) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - uint8_t cccr[22] = { 0 }; - - cmd.cmdIdx = CMD_53; - cmd.cmdArg = CCCR_BYTE_READ; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = cccr; - data.blockSize = 0x16; - data.blockCount = 1; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.direction = SMIH_READ_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer command to the slave - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - memset((void *)pRegInfo, 0x0, 22); - memcpy((void *)pRegInfo, &transfer.data->data, 22); - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_WriteCommandCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) - * @brief This API is used to send the SDIO_CMD52 to the card. - * @param[in] pSmihConfig : Pointer to the card command information structure - * @param[in] Argument : Argument to the command - * @return RSI_OK : command sent succesfully - * ERROR_SMIH : If Parameter is invalid. - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_WriteCommandCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_52; - cmd.cmdArg = Argument; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = 0; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - memset((void *)&pSmihConfig->response[0], 0x0, sizeof(pSmihConfig->response)); - - // transfer command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } else { - memcpy((void *)&pSmihConfig->response[0], &transfer.command->response[0], sizeof(pSmihConfig->response)); - return RSI_OK; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_ReadCommandCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) - * @brief This API is used to send the SDIO_CMD52 to the card. - * @param[in] pcmdInfo : Pointer to the card information strut - * @param[in] Argument : Argument to the command - * @return RSI_OK : In case of command sent succesfully - * ERROR_SMIH : If Parameter is invalid. - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_ReadCommandCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_52; - cmd.cmdArg = Argument; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = 0; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_READ_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } else { - memset((void *)&pSmihConfig->response[0], 0x0, sizeof(pSmihConfig->response)); - memcpy((void *)&pSmihConfig->response[0], &transfer.command->response[0], sizeof(pSmihConfig->response)); - return RSI_OK; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_SetBusWidthCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) - * @brief This API is used to send the SDIO_CMD52 to set bus width to the IO card. - * @param[in] pSmihConfig : Pointer to the card info struct - * @param[in] CmdArg : Command Argument - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_SetBusWidthCmd52(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_52; - cmd.cmdArg = CmdArg; - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_BusWidthConfig(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t BusWidth) - * @brief This API is used to change the bus width. - * @param[in] pcmdInfo : Pointer to the card information strut - * @param[in] BusWidth : Width of the bus - * \n possible values are - * \n SMIH_BUS_WIDTH1 = 0u, - * \n SMIH_BUS_WIDTH4 = 1u, - * \n SMIH_BUS_WIDTH8 = 2u, - * @return RSI_OK : If bus width set properly - * ERROR_SMIH : If Parameter is invalid. - */ -rsi_error_t RSI_SDIOH_BusWidthConfig(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t BusWidth) -{ - uint32_t cmdArg = 0; - boolean_t host4BitMode = FALSE; - - if (BusWidth == SMIH_BUS_WIDTH4) { - cmdArg = BIT4_BUS_WIDTH_ARG; - host4BitMode = TRUE; - } else { - cmdArg = 0; - host4BitMode = FALSE; - } - if (RSI_OK != RSI_SDIOH_SetBusWidthCmd52(pSmihConfig, cmdArg)) { - return ERROR_SMIH; - } else { - // host side setting - smih_bus_width_set(host4BitMode); - return RSI_OK; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_GoIdleStateCmd0(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send the cmd0 to the io card. - * @param[in] pSmihConfig : Pointer to the Command info structure - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDIOH_GoIdleStateCmd0(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = 0; - cmd.cmdArg = 0x0; - cmd.responseTypeSelect = SMIH_NO_RESPONSE; - data.data = NULL; - data.blockSize = 0x0; - data.blockCount = 0x0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_SendRelativeCardAddressCmd3(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) - * @brief This API is used to send the SDIO_CMD3(Get relative card address) to the IO card. - * @param[in] pSmihConfig : Pointer to the card info struct - * @param[in] CmdArg : Command argument to send - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDIOH_SendRelativeCardAddressCmd3(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_3; - cmd.cmdArg = CmdArg; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - if (CmdArg == 0x0) { - pSmihConfig->rca = transfer.command->response[0] >> 16; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_SwitchVoltageCmd11(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) - * @brief This API is used to send the SDIO_CMD11(Voltage switch command in case of uhs modes) to the io card. - * @param[in] pSmihConfig : Pointer to the card info struct - * @param[in] CmdArg : Command argument to send - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_SwitchVoltageCmd11(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_11; - cmd.cmdArg = 0; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_SelectCardCmd7(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send the cmd 7(select the cards) to the IO card. - * @param[in] pSmihConfig : Pointer to the Command info structure - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_SelectCardCmd7(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_7; - cmd.cmdArg = pSmihConfig->rca << 16; - cmd.responseTypeSelect = SMIH_RESPONSE_R1BR5B; - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_ByteBlockWriteCmd53(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t *pData, uint32_t Addr) - * @brief This API is used to send the SDIO_CMD53 to write data to the IO card. - * @param[in] pSmihConfig : Pointer to the smih config struct - * @param[in] pData : Pointer to the buffer data to write - * @param[in] Addr : Address to write the data - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occured. - */ -rsi_error_t RSI_SDIOH_ByteBlockWriteCmd53(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t *pData, uint32_t Addr) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - if ((NULL == pData)) { - return INVALID_PARAMETERS; - } - cmd.cmdIdx = CMD_53; - if (pSmihConfig->blockModeEnable) { - cmd.cmdArg = (pSmihConfig->numberOfBlocks); - } else { - cmd.cmdArg = (pSmihConfig->byteBlockSize); - } - cmd.cmdArg |= (((Addr)&0x0001FFFF) << 9); - cmd.cmdArg |= (pSmihConfig->opCode << 26); - cmd.cmdArg |= (pSmihConfig->blockModeEnable << 27); - cmd.cmdArg |= (pSmihConfig->funcNum << 28); - cmd.cmdArg |= BIT(31); - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = pData; - data.blockSize = pSmihConfig->byteBlockSize; - data.blockCount = pSmihConfig->numberOfBlocks; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_ByteBlockReadCmd53(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t *pData, uint32_t Addr) - * @brief This API is used to send the SDIO_CMD53 to read data from the IO card. - * @param[in] pSmihConfig : Pointer to the smih config struct - * @param[in] pData : Pointer to the buffer data to read - * @param[in] Addr : Address to read the data - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_ByteBlockReadCmd53(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t *pData, uint32_t Addr) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_53; - if (pSmihConfig->blockModeEnable == 1) { - cmd.cmdArg = (pSmihConfig->numberOfBlocks); - } else { - cmd.cmdArg = (pSmihConfig->byteBlockSize); - } - cmd.cmdArg |= (((Addr)&0x0001FFFF) << 9); - cmd.cmdArg |= (pSmihConfig->opCode << 26); - cmd.cmdArg |= (pSmihConfig->blockModeEnable << 27); - cmd.cmdArg |= (pSmihConfig->funcNum << 28); - cmd.cmdArg |= (((0 << 0)) << 31); - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - data.data = pData; - data.blockSize = pSmihConfig->byteBlockSize; - data.blockCount = pSmihConfig->numberOfBlocks; - data.direction = SMIH_READ_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_ReInitializationCmd5(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send the SDIO_CMD5 to reinitialize the SDIO card. - * @param[in] pSmihConfig : Pointer to the smih config struct - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_ReInitializationCmd5(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_5; - cmd.cmdArg = *(uint32_t *)(&pSmihConfig->ocr); - if (pSmihConfig->voltage == 1) { - cmd.cmdArg |= 0x01100000; - } else { - cmd.cmdArg |= 0x00100000; - } - cmd.responseTypeSelect = SMIH_RESPONSE_R3R4; - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // gtransfer Command - if (RSI_OK == pSmihConfig->cmd_transfer(&transfer)) { - memcpy((void *)&pSmihConfig->ocr, &transfer.command->response[0], sizeof(pSmihConfig->ocr)); - return RSI_OK; - } - return ERROR_SMIH; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_InitializationCmd5(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send the SDIO_CMD5 to initialize the SDIO card. - * @param[in] pSmihConfig : Pointer to the smih card information struct - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDIOH_InitializationCmd5(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - cmd.cmdIdx = CMD_5; - cmd.cmdArg = *(uint32_t *)&pSmihConfig->ocr; - cmd.cmdArg = (cmd.cmdArg & 0x00000000); - cmd.responseTypeSelect = SMIH_RESPONSE_R3R4; - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK == pSmihConfig->cmd_transfer(&transfer)) { - memcpy((void *)&pSmihConfig->ocr, &transfer.command->response[0], sizeof(pSmihConfig->ocr)); - return RSI_OK; - } - return ERROR_SMIH; -} - -/*==============================================*/ -/** - * @fn void RSI_SDIOH_PinMux(void) - * @brief This API is used to configure GPIOs for SDIOH operations. - * @return none - */ -void RSI_SDIOH_PinMux(void) -{ - // enable pads for pins -#if SDIO_SET1 - RSI_EGPIO_PadSelectionEnable(SDIO_CLK_PAD); - RSI_EGPIO_PadSelectionEnable(SDIO_CMD_PAD); - RSI_EGPIO_PadSelectionEnable(SDIO_D0_PAD); - RSI_EGPIO_PadSelectionEnable(SDIO_D1_PAD); - RSI_EGPIO_PadSelectionEnable(SDIO_D2_PAD); - RSI_EGPIO_PadSelectionEnable(SDIO_D3_PAD); -#else - // Enable Host Pad Gpio modes - // SDIO Connected to Tass - (*(volatile uint32_t *)(0x41300004)) = (0x1 << 5); - RSI_EGPIO_HostPadsGpioModeEnable(SDIO_CLK_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SDIO_CMD_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SDIO_D0_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SDIO_D1_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SDIO_D2_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SDIO_D3_PIN); -#endif - - RSI_EGPIO_PadSelectionEnable(SDIO_WP_PAD); - RSI_EGPIO_PadSelectionEnable(SDIO_CD_PAD); - - // Ren enables for Gpios - RSI_EGPIO_PadReceiverEnable(SDIO_CLK_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_CMD_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_D0_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_D1_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_D2_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_D3_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_CD_PIN); - RSI_EGPIO_PadReceiverEnable(SDIO_WP_PIN); - - // Configure software pull ups for cmd ,d0,d1,d2,d3 - RSI_EGPIO_PadDriverDisableState(SDIO_CMD_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SDIO_D0_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SDIO_D1_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SDIO_D2_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SDIO_D3_PIN, Pullup); - - RSI_EGPIO_PadDriverDisableState(SDIO_WP_PIN, Pulldown); - RSI_EGPIO_PadDriverDisableState(SDIO_CD_PIN, Pulldown); - - // Configure Mux - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_CLK_PIN, SDIO_CLK_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_CMD_PIN, SDIO_CMD_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_D0_PIN, SDIO_D0_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_D1_PIN, SDIO_D1_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_D2_PIN, SDIO_D2_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_D3_PIN, SDIO_D3_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_CD_PIN, SDIO_CD_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SDIO_WP_PIN, SDIO_WP_MUX); -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event) - * @brief This API is used to initialize the IO card - * @param[in] pSmihConfig : Pointer to the smih card configuration - * Event : event handler to be register - * @return RSI_OK : IO card initialized successfully - * INVALID_PARAMETERS : if pSmihConfig == NULL - */ -rsi_error_t RSI_SDIOH_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event) -{ - if (pSmihConfig == 0) { - return INVALID_PARAMETERS; - } - - // Configure gpios in smih mode - RSI_SDIOH_PinMux(); - - // initialize the host - if (RSI_OK != RSI_SD_HostInit(pSmihConfig, Event, 0)) { - return ERROR_SMIH; - } else { - // Commands for sdio enumeration - - rsi_delay_ms(5); - -init: - // Reset Card - if (RSI_OK != RSI_SDIOH_GoIdleStateCmd0(pSmihConfig)) { - goto init; - } - // Get Operational voltage - if (RSI_OK != RSI_SDIOH_InitializationCmd5(pSmihConfig)) { - goto init; - } - // Set Operational voltage and get ocr - if (RSI_OK != RSI_SDIOH_ReInitializationCmd5(pSmihConfig)) { - return ERROR_SMIH; - } - if (!(pSmihConfig->ocr.cardReady)) { - goto init; - } - if ((pSmihConfig->ocr.memPresent)) { - return CARD_TYPE_MEMCARD; - } - if (!(pSmihConfig->ocr.ioNum)) { - return ERROR_INAVLID_MODE; - } - if (pSmihConfig->highSpeedEnable == 1) { - // disable clock to the sd - M4CLK->SD_MEM_CLOCK_REG_b.SD_MEM_INTF_CLK_SEL = 0x7; - - // wait for some time - rsi_delay_ms(5); - - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.HIGH_SPEED_ENABLE = 0x1; - - // enable clock - RSI_CLK_SdMemClkConfig(M4CLK, 1, SDMEM_SOCPLLCLK, 1); - - // wait for some time - rsi_delay_ms(2); - } - if (pSmihConfig->uhsModeSelect != 0) { - // works only with 1.8 volatge level - if (!(pSmihConfig->ocr.s18A)) { - return ERROR_INAVLID_MODE; - } - // send volatge switching command in case of uhs modes - if (RSI_OK != RSI_SDIOH_SwitchVoltageCmd11(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - //disable clock to the sd - M4CLK->SD_MEM_CLOCK_REG_b.SD_MEM_INTF_CLK_SEL = 0x7; - - // wait for some time - rsi_delay_ms(5); - - // enable 1.8 volt bit in controller - smih_18v_signal_enable(); - - // select uhs mode - smih_uhs_mode_select(pSmihConfig->uhsModeSelect); - - // enable clock - RSI_CLK_SdMemClkConfig(M4CLK, 1, SDMEM_SOCPLLCLK, 1); - - // wait for some time - rsi_delay_ms(2); - } - - // Get relative card address - if (RSI_OK != RSI_SDIOH_SendRelativeCardAddressCmd3(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - - // Select Card (send cmd7) :send rca as argument - if (RSI_OK != RSI_SDIOH_SelectCardCmd7(pSmihConfig)) { - return ERROR_SMIH; - } - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, CD_DISABLE_ARG)) { - return ERROR_SMIH; - } -bus_send_again: - - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, LOW_SPEED_CHECK_ARG)) { - return ERROR_SMIH; - } - if (pSmihConfig->response[0] & LOW_SPEED_CHECK) { - if (pSmihConfig->response[0] & BIT4_MODE_CHECK) { - if (SMIH_BUS_WIDTH4 == pSmihConfig->busWidthMode) { - // configure 4bit mode - RSI_SDIOH_BusWidthConfig(pSmihConfig, SMIH_BUS_WIDTH4); - } - } else { - } - } else { - if (SMIH_BUS_WIDTH4 == pSmihConfig->busWidthMode) { - if (RSI_OK != RSI_SDIOH_BusWidthConfig(pSmihConfig, SMIH_BUS_WIDTH4)) { - return ERROR_SMIH; - } - } - } - while (1) { - // Enable function1 - if (RSI_OK == RSI_SDIOH_WriteCommandCmd52(pSmihConfig, FUCNTION1_CHECK_ARG)) { - if (!((pSmihConfig->response[0]) & FUNCTION1_ENABLE)) { - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, FUCNTION1_ENB_ARG)) { - return ERROR_SMIH; - } else { - break; - } - } else - break; - } - } - while (1) { - // Check for function ready - if (RSI_OK == RSI_SDIOH_WriteCommandCmd52(pSmihConfig, FUCNTION1_READY_ARG)) { - if (pSmihConfig->response[0] & FUNCTION1_READY) { - break; - } - } - } - // Interrupt Enable - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, FUNCTION1_INTR_ENB_ARG)) { - return ERROR_SMIH; - ; - } - // Check interrupts are enabled or not - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, FUNCTION1_INTR_CHECK_ARG)) { - return ERROR_SMIH; - } - // Check for 1bit or 4bit mode of I/O - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, BIT4_BUS_WIDTH_SET_ARG)) { - return ERROR_SMIH; - } - if (SMIH_BUS_WIDTH4 == pSmihConfig->busWidthMode) { - if (!(pSmihConfig->response[0] & BUS_BIT)) { - goto bus_send_again; - } - } - // Check for CD Disable - if (!(pSmihConfig->response[0] & (1 << 7))) { - return RSI_OK; - } - if (RSI_OK == RSI_SDIOH_WriteCommandCmd52(pSmihConfig, CSA_SUPPORT_ARG)) { - if (pSmihConfig->response[0] & (1 << 6)) { - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, CSA_ENABLE_ARG)) { - return ERROR_SMIH; - } - } - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, IO_BLOCKSIZE_ARG)) { - return ERROR_SMIH; - } - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, IO_BLOCKSIZE_ARG_1)) { - return ERROR_SMIH; - } - } - // High speed mode configuration - if (pSmihConfig->highSpeedEnable) { - while (1) { - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, CHECK_HIGH_SPEED_SUPPORT)) { - return ERROR_SMIH; - } - - if ((pSmihConfig->response[0] & HIGH_SPEED_BIT)) { - break; - } - } - // high speed mode switching command - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, ENABLE_HIGH_SPEED_MODE_ARG)) { - return ERROR_SMIH; - } - } - // uhs mode configuration - if (pSmihConfig->uhsModeSelect != 0) { - while (1) { - // ask card about uhs support modes capability - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, CHECK_UHS_SUPPORT_MODES)) { - return ERROR_SMIH; - } - if ((pSmihConfig->response[0] & UHS_SUPPORT_BITS)) { - // card supports uhs modes - break; - } - } - // Send UHS mode to the slave - switch (pSmihConfig->uhsModeSelect) { - // configure uhs modes - case UHS_SDR12: - break; - case UHS_SDR25: - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, UHS_1_SDR25_MODE_ARG)) { - return ERROR_SMIH; - } - break; - case UHS_SDR50: - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, UHS_1_SDR50_MODE_ARG)) { - return ERROR_SMIH; - } - break; - case UHS_SDR104: - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, UHS_1_SDR104_MODE_ARG)) { - return ERROR_SMIH; - } - break; - case UHS_DDR50: - if (RSI_OK != RSI_SDIOH_WriteCommandCmd52(pSmihConfig, UHS_1_DDR50_MODE_ARG)) { - return ERROR_SMIH; - } - break; - default: - return INVALID_PARAMETERS; - } - } - } - return RSI_OK; -} -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdmem.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdmem.c deleted file mode 100644 index 621253722..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_sdmem.c +++ /dev/null @@ -1,1242 +0,0 @@ -/******************************************************************************* -* @file rsi_sdmem.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) - -#include "clock_update.h" - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_GoIdleStateCmd0(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send the CMD0 to the memory card. - * @param[in] pSmihConfig : Pointer to the smih config structure. - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_GoIdleStateCmd0(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.blockSize = 0x0; - data.blockCount = 0x0; - data.data = NULL; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = 0; - cmd.cmdArg = 0x0; - cmd.responseTypeSelect = SMIH_NO_RESPONSE; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SendCardInterfaceConditionCmd8(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send interface condition command(Cmd8). - * @param[in] pSmihConfig : Pointer to the smih config structure. - * @param[in] Arg : Command argument to send - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SendCardInterfaceConditionCmd8(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.blockSize = 0x0; - data.blockCount = 0x0; - data.data = NULL; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdArg = Arg; - cmd.cmdIdx = CMD_8; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SendApplicationCommandCmd55(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send the application command(CMD55) to the memory card. - * @param[in] pSmihConfig : Pointer to the smih config structure. - * @param[in] Arg : Argument to the command - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SendApplicationCommandCmd55(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0x0; - data.blockCount = 0x0; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = CMD_55; - cmd.cmdArg = Arg << 16; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SetCardOperationConditionAcmd41(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send operation condition command(Acmd41). - * @param[in] Arg : Command argument to send - * @param[in] pSmihConfig : Pointer to the Command info structure - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SetCardOperationConditionAcmd41(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0x0; - data.blockCount = 0x0; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = (CMD_40_hex + CMD_41); - cmd.cmdArg = Arg; - cmd.responseTypeSelect = SMIH_RESPONSE_R3R4; - - transfer.command = &cmd; - transfer.data = &data; - - if (RSI_OK == RSI_SDMEM_SendApplicationCommandCmd55(pSmihConfig, pSmihConfig->rca)) { - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - } else { - return ERROR_SMIH; - } - memcpy((void *)&pSmihConfig->ocr, &transfer.command->response[0], sizeof(pSmihConfig->ocr)); - if (0 == (transfer.command->response[0] & ACMD41_BUSY_BIT)) { - return ERROR_SMIH; //operation is in progress - } - pSmihConfig->cardType = SMIH_CARD_STANDARD; - if (0 != (transfer.command->response[0] & ACMD41_OCR_BIT)) { - pSmihConfig->cardType = SMIH_CARD_HIGH_CAPACITY; - } else { - pSmihConfig->cardType = SMIH_CARD_STANDARD; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SwitchVoltageCmd11(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) - * @brief This API is used to send voltage switch command(SDIO_CMD11). - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] Arg : Command argument to send - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SwitchVoltageCmd11(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = CMD_11; - cmd.cmdArg = 0; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } else { - // set Relative Card Address - pSmihConfig->rca = transfer.command->response[0] >> 16; - return RSI_OK; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SendCidCmd2(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send CMD2(to get CID of the card). - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] Arg : Command argument to send - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SendCidCmd2(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - uint32_t i = 0; - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0x0; - data.blockCount = 0x0; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = CMD_2; - cmd.cmdArg = 0; - cmd.responseTypeSelect = SMIH_RESPONSE_R2; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK == pSmihConfig->cmd_transfer(&transfer)) { - for (i = 0; i < 15; i++) { - pSmihConfig->cid[i] = *((uint8_t *)(transfer.command->response) + (14 - i)); - } - return RSI_OK; - } - return ERROR_SMIH; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDIOH_SendRelativeAddressCmd3(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) - * @brief This API is used to send CMD3(send card relative address). - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] CmdArg : Command argument to send - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDIOH_SendRelativeAddressCmd3(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t CmdArg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = CMD_3; - cmd.cmdArg = 0; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK == pSmihConfig->cmd_transfer(&transfer)) { - // set Relative card address - pSmihConfig->rca = (transfer.command->response[0] >> 16); - return RSI_OK; - } else { - return ERROR_SMIH; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SendCsdCmd9(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send CMD9(CSD) to the sd card - * @param[in] pSmihConfig : Pointer to the Command info structure - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SendCsdCmd9(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - CSD_REG_VERSION1_T *pSdCsd = NULL; - CSD_REG_VERSION2_T *pSdhcCsd = NULL; - uint32_t u32NumSector = 0; - uint32_t u32Csize = 0; - uint32_t u32CsizeMulti = 0; - - data.data = NULL; - data.blockSize = 0x0; - data.blockCount = 0x0; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = CMD_9; - cmd.cmdArg = pSmihConfig->rca << 16; - cmd.responseTypeSelect = SMIH_RESPONSE_R2; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - memcpy(pSmihConfig->csd, transfer.command->response, sizeof(transfer.command->response)); - - pSdCsd = (CSD_REG_VERSION1_T *)&pSmihConfig->csd[0]; - pSdhcCsd = (CSD_REG_VERSION2_T *)&pSmihConfig->csd[0]; - - if (pSmihConfig->cardType == SMIH_CARD_STANDARD) { - // Standard Capacity card - u32Csize = - ((unsigned int)pSdCsd->deviceSize3 << 10) + ((unsigned int)pSdCsd->deviceSize2 << 2) + pSdCsd->deviceSize1; - u32CsizeMulti = (pSdCsd->deviceSizeMultiplier2 << 1) + pSdCsd->deviceSizeMultiplier1; - u32NumSector = (u32Csize + 1) << (u32CsizeMulti + 2); - if (pSdCsd->readBlockLength == 0x0A) { - u32NumSector *= 2; - } else if (pSdCsd->readBlockLength == 0x0B) { - u32NumSector *= 4; - } - } else { - // high capacity card - u32Csize = - ((unsigned int)pSdhcCsd->deviceSize3 << 16) + ((unsigned int)pSdhcCsd->deviceSize2 << 8) + pSdhcCsd->deviceSize1; - u32NumSector = (u32Csize + 1) * 1024; - } - pSmihConfig->maxSectorNum = u32NumSector; - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SelectCardCmd7(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send SDIO_CMD7(to select the card). - * @param[in] pSmihConfig : Pointer to the Command info structure - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SelectCardCmd7(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = CMD_7; - cmd.cmdArg = pSmihConfig->rca << 16; - cmd.responseTypeSelect = SMIH_RESPONSE_R1BR5B; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_SetBusWidthAcmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send ACMD6(set bus width command to the card). - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] Arg : Command argument to send - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDMEM_SetBusWidthAcmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = (CMD_40_hex + CMD_6); - cmd.cmdArg = Arg; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != RSI_SDMEM_SendApplicationCommandCmd55(pSmihConfig, pSmihConfig->rca)) { - return ERROR_SMIH; - } - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_OperationSwitchFunctionReadCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) - * @brief This API is used to send the switch function read command(asks card about its capability). - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] Argument : Argument to the command - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_OperationSwitchFunctionReadCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = 0; - data.blockSize = 1; - data.blockCount = 1; - data.direction = SMIH_READ_DIRECTION; - - cmd.cmdIdx = CMD_6; - cmd.cmdArg = Argument; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_GetCardOperationConditionAcmd41(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send operation condition command(ACMD41). - * @param[in] pSmihConfig : Pointer to the smih command info structure - * @param[in] Arg : Command argument to send - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDMEM_GetCardOperationConditionAcmd41(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = NULL; - data.blockSize = 0x0; - data.blockCount = 0x0; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = (CMD_40_hex + CMD_41); - cmd.cmdArg = Arg; - cmd.responseTypeSelect = SMIH_RESPONSE_R3R4; - - // transfer Command - if (RSI_OK != RSI_SDMEM_SendApplicationCommandCmd55(pSmihConfig, pSmihConfig->rca)) { - return ERROR_SMIH; - } - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - - memcpy((void *)&pSmihConfig->ocr, &transfer.command->response[0], sizeof(pSmihConfig->ocr)); - if (0 == Arg) { - - } else if ((transfer.command->response[0] & ACMD41_BUSY_BIT) == 0) { - // set mode - return ERROR_SMIH; //operation is in progress - } - pSmihConfig->cardType = SMIH_CARD_STANDARD; - if ((transfer.command->response[0] & ACMD41_OCR_BIT) != 0) { - pSmihConfig->cardType = SMIH_CARD_HIGH_CAPACITY; - } else { - pSmihConfig->cardType = SMIH_CARD_STANDARD; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_CardBusWidthConfig(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t BusWidth) - * @brief This API is used to configure the bus width. - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] BusWidth : bus width mode - * possible values are 0-1bit - * 1-4bit - * 2-8bit - * @return RSI_OK : If command sent successfully - * ERROR_TIMEOUT : If command error timeout occures. - */ -rsi_error_t RSI_SDMEM_CardBusWidthConfig(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t BusWidth) -{ - uint32_t cmdArg = 0; - boolean_t hostMode; - if (BusWidth == SMIH_BUS_WIDTH1) { - cmdArg = 0; - hostMode = FALSE; - } else if (BusWidth == SMIH_BUS_WIDTH4) { - cmdArg = 0x2; //Need to talk with spandana - hostMode = TRUE; - } else if (BusWidth == SMIH_BUS_WIDTH8) { - cmdArg = 0x2; - hostMode = TRUE; - } - // Ask card about its capability - if (RSI_OK != RSI_SDMEM_SetBusWidthAcmd6(pSmihConfig, cmdArg)) { - return ERROR_SMIH; - } else { - // set bus width mode in controller - smih_bus_width_set(hostMode); - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_OperationSwitchFunctionWriteCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) - * @brief This API is used to send the switch function command. - * @param[in] pSmihConfig : Pointer to the Command info structure - * @param[in] Argument : Argument to the command - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_OperationSwitchFunctionWriteCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Argument) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.data = 0; - data.blockSize = 0; - data.blockCount = 0; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = CMD_6; - cmd.cmdArg = Argument; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_BlocksWrite(SMIH_CARD_CONFIG_T *pSmihConfig, - const uint8_t *DataIn, - uint32_t BlockIndex, - uint32_t BlockCount) - * @brief This API is used to write multiple blocks of data to the sd card. - * @param[in] pSmihConfig : Pointer to the sd card config structure - * @param[in] DataIn : Data buffer to send - * @param[in] BlockIndex : block index value - * @param[in] BlockCount : blocks count value - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_BlocksWrite(SMIH_CARD_CONFIG_T *pSmihConfig, - const uint8_t *DataIn, - uint32_t BlockIndex, - uint32_t BlockCount) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - if (pSmihConfig == NULL || DataIn == NULL) { - return INVALID_PARAMETERS; - } - if (SMIH_CARD_STANDARD == pSmihConfig->cardType) { - BlockIndex = BlockIndex << 9; - } - if (BlockCount == 1) { - // single block write - if (pSmihConfig->maxSectorNum < BlockIndex) { - return INVALID_PARAMETERS; - } - data.data = DataIn; - data.blockSize = BLOCK_SIZE_512; - data.blockCount = 1; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = CMD_24; - cmd.cmdArg = BlockIndex; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - } else { - // multiple block write - if (((pSmihConfig->maxSectorNum - BlockIndex) < BlockCount) - || (pSmihConfig->maxSectorNum < (BlockIndex + BlockCount))) { - return INVALID_PARAMETERS; - } - data.data = DataIn; - data.blockSize = BLOCK_SIZE_512; - data.blockCount = BlockCount; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = CMD_25; - cmd.cmdArg = BlockIndex; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - } - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_BlocksRead(SMIH_CARD_CONFIG_T *pSmihConfig, - uint8_t *DataOut, - uint32_t BlockIndex, - uint32_t BlockCount) - * @brief This API is used to read multiple blocks of data from the sd card. - * @param[in] pSmihConfig : Pointer to the sd card config structure - * @param[in] DataIn : Data buffer to send - * @param[in] BlockIndex : block index value - * @param[in] BlockCount : blocks count value - * @return RSI_OK : Command sent successfully - * ERROR_TIMEOUT : Command error timeout occured. - */ -rsi_error_t RSI_SDMEM_BlocksRead(SMIH_CARD_CONFIG_T *pSmihConfig, - uint8_t *DataOut, - uint32_t BlockIndex, - uint32_t BlockCount) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - if (NULL == pSmihConfig || NULL == DataOut) { - return INVALID_PARAMETERS; - } - if (SMIH_CARD_STANDARD == pSmihConfig->cardType) { - BlockIndex = BlockIndex << 9; - } - if (BlockCount == 1) { - // single block read - if (pSmihConfig->maxSectorNum < BlockIndex) { - return INVALID_PARAMETERS; - } - cmd.cmdIdx = CMD_17; - cmd.cmdArg = BlockIndex; - data.data = DataOut; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - data.blockSize = BLOCK_SIZE_512; - data.blockCount = 1; - data.direction = SMIH_READ_DIRECTION; - } else { - // multiple block read - if (((pSmihConfig->maxSectorNum - BlockIndex) < BlockCount) - || (pSmihConfig->maxSectorNum < (BlockIndex + BlockCount))) { - return INVALID_PARAMETERS; - } - data.data = DataOut; - data.blockSize = BLOCK_SIZE_512; - data.blockCount = BlockCount; - data.direction = SMIH_READ_DIRECTION; - cmd.cmdIdx = CMD_18; - cmd.cmdArg = BlockIndex; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - } - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_EnableHighSpeed(SMIH_CARD_CONFIG_T *pSmihConfig, boolean_t HighSpeed, uint32_t Clock) - * @brief This API is used to enable high speed mode - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] HighSpeed : High speed enable bit - * 1- for high speed enable. - * 0- for high speed disable. - * @param[in] Clock : Clock frequency - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMEM_EnableHighSpeed(SMIH_CARD_CONFIG_T *pSmihConfig, boolean_t HighSpeed, uint32_t Clock) -{ - uint32_t actualClock = 0; - uint32_t highSpeedValue = 0; - uint32_t arg = 0; - - if (HighSpeed == 0) { - actualClock = 400000; - } else { - actualClock = Clock; - highSpeedValue = 1; - } - arg = (BIT(31) | 0xFFF0); - arg |= (highSpeedValue)&0xF; - - // Send switch command - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionWriteCmd6(pSmihConfig, arg)) { - return ERROR_SMIH; - } else { - smih_clock_config(pSmihConfig, actualClock); - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.HIGH_SPEED_ENABLE = 0x1; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void RSI_SDMEM_PinMux(void) - * @brief This API is used to configure GPIOs for SDMEM operations. - * @return none - */ -void RSI_SDMEM_PinMux(void) -{ - // If GPIO_SET1 is equals to 0 then set2 gpios of sdmem will be used -#if (GPIO_SET1 == 0) - RSI_EGPIO_HostPadsGpioModeEnable(SD_CLK_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SD_CMD_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SD_D0_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SD_D1_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SD_D2_PIN); - RSI_EGPIO_HostPadsGpioModeEnable(SD_D3_PIN); -#endif - RSI_EGPIO_PadSelectionEnable(SD_CLK_PAD); - RSI_EGPIO_PadSelectionEnable(SD_CMD_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D0_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D1_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D2_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D3_PAD); - - RSI_EGPIO_PadReceiverEnable(SD_CLK_PIN); - RSI_EGPIO_PadReceiverEnable(SD_CMD_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D0_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D1_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D2_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D3_PIN); - - RSI_EGPIO_PadDriverDisableState(SD_CMD_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D0_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D1_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D2_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D3_PIN, Pullup); - - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_CLK_PIN, SD_CLK_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_CMD_PIN, SD_CMD_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D0_PIN, SD_D0_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D1_PIN, SD_D1_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D2_PIN, SD_D2_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D3_PIN, SD_D3_MUX); - -#if _8BIT_MODE - RSI_EGPIO_PadSelectionEnable(SD_D4_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D5_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D6_PAD); - RSI_EGPIO_PadSelectionEnable(SD_D7_PAD); - - RSI_EGPIO_PadReceiverEnable(SD_D4_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D5_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D6_PIN); - RSI_EGPIO_PadReceiverEnable(SD_D7_PIN); - - RSI_EGPIO_PadDriverDisableState(SD_D4_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D5_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D6_PIN, Pullup); - RSI_EGPIO_PadDriverDisableState(SD_D7_PIN, Pullup); - - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D4_PIN, SD_D4_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D5_PIN, SD_D5_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D6_PIN, SD_D6_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_D7_PIN, SD_D7_MUX); -#endif - RSI_EGPIO_PadSelectionEnable(SD_WP_PAD); - RSI_EGPIO_PadSelectionEnable(SD_CD_PAD); - - RSI_EGPIO_PadReceiverEnable(SD_CD_PIN); - RSI_EGPIO_PadReceiverEnable(SD_WP_PIN); - - RSI_EGPIO_PadDriverDisableState(SD_WP_PIN, Pulldown); - RSI_EGPIO_PadDriverDisableState(SD_CD_PIN, Pulldown); - - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_CD_PIN, SD_CD_MUX); - RSI_EGPIO_SetPinMux(EGPIO, 0, SD_WP_PIN, SD_WP_MUX); -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMEM_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event) - * @brief This API is used for SD memory enumeration process - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] Event : event handler to be register - * @return RSI_OK : If commands sent successfully in enumeration process. - * ERROR_TIMEOUT : If commands error timeout occures. - */ -rsi_error_t RSI_SDMEM_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event) -{ - uint8_t val = 0; - uint32_t arg = 0; - uint32_t i; - SMIH_CARD_CONFIG_T *SmihInfo = NULL; - if (pSmihConfig == 0) { - return INVALID_PARAMETERS; - } - // Configure gpios in smih mode - RSI_SDMEM_PinMux(); - - if (RSI_OK != RSI_SD_HostInit(pSmihConfig, Event, 1)) { - return ERROR_SMIH; - } else { - // Commands for sdio enumeration - rsi_delay_ms(5); - - // Reset card(send command 0) - if (RSI_OK != RSI_SDMEM_GoIdleStateCmd0(pSmihConfig)) { - return ERROR_SMIH; - } - - // send interface condition - if (RSI_OK != RSI_SDMEM_SendCardInterfaceConditionCmd8(pSmihConfig, 0x1AA)) { - val = 0; - } else { - val = 1; - } - // send ACMD41 - if (RSI_OK != RSI_SDMEM_GetCardOperationConditionAcmd41(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - if (pSmihConfig->uhsModeSelect == 0) { - arg = ACMD41_VOLTAGE; - if (1 == val) { - arg |= ACMD41_HCS; - } - } else { - arg = ACMD41_UHS_REQ; - if (1 == val) { - arg |= ACMD41_HCS; - } - } - // send operation condition - i = 5000; - while (i != 0) { - if (RSI_SDMEM_SetCardOperationConditionAcmd41(pSmihConfig, arg) == RSI_OK) { - break; - } - i--; - } - // configure uhs mode if enabled - if (pSmihConfig->uhsModeSelect != 0) { - rsi_delay_ms(5); - RSI_SDMEM_SwitchVoltageCmd11(SmihInfo, 0x0); - M4CLK->SD_MEM_CLOCK_REG_b.SD_MEM_INTF_CLK_SEL = 0x7; - // wait for some time - rsi_delay_ms(5); - switch (pSmihConfig->uhsModeSelect) { - case UHS_NONE: - break; - case UHS_SDR12: - break; - case UHS_SDR25: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x1; - break; - case UHS_SDR50: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x2; - break; - case UHS_SDR104: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x3; - break; - case UHS_DDR50: - break; - default: - return INVALID_PARAMETERS; - } - // enable 1.8v signalling bit - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b._1_8V_SIGNALING_ENABLE = 0x1; - RSI_CLK_SdMemClkConfig(M4CLK, 1, SDMEM_SOCPLLCLK, 1); - - // wait for some - rsi_delay_ms(5); - } - // send cmd2 - if (RSI_OK != RSI_SDMEM_SendCidCmd2(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - // send cmd3 - if (RSI_OK != RSI_SDIOH_SendRelativeAddressCmd3(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - // send cmd9 - if (RSI_OK != RSI_SDMEM_SendCsdCmd9(pSmihConfig)) { - return ERROR_SMIH; - } - // select card :send rca as argument - if (RSI_OK != RSI_SDMEM_SelectCardCmd7(pSmihConfig)) { - return ERROR_SMIH; - } - // bus width configuration - if (pSmihConfig->busWidthMode == 1) { - if (RSI_OK != RSI_SDMEM_CardBusWidthConfig(pSmihConfig, SMIH_BUS_WIDTH4)) { - return ERROR_SMIH; - } - } - // enable high speed mode - if (TRUE == pSmihConfig->highSpeedEnable) { - rsi_delay_ms(1); - if (RSI_OK != RSI_SDMEM_EnableHighSpeed(pSmihConfig, TRUE, 20000000)) { - return ERROR_SMIH; - } - rsi_delay_ms(10); - } - if (pSmihConfig->uhsModeSelect != 0) { - switch (pSmihConfig->uhsModeSelect) { - case UHS_SDR12: - break; - case UHS_SDR25: - // uhs support asking to card - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionReadCmd6(pSmihConfig, 0x00000001)) { - return ERROR_SMIH; - } - // switching mode - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionWriteCmd6(pSmihConfig, 0x00000001)) { - return ERROR_SMIH; - } - break; - case UHS_SDR50: - // uhs support asking to card - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionReadCmd6(pSmihConfig, 0x00000002)) { - return ERROR_SMIH; - } - // switching mode - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionWriteCmd6(pSmihConfig, 0x00000002)) { - return ERROR_SMIH; - } - break; - case UHS_SDR104: - // uhs support asking to card - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionReadCmd6(pSmihConfig, 0x00000003)) { - return ERROR_SMIH; - } - // switching mode - if (RSI_OK != RSI_SDMEM_OperationSwitchFunctionWriteCmd6(pSmihConfig, 0x00000003)) { - return ERROR_SMIH; - } - break; - default: - return INVALID_PARAMETERS; - } - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMMC_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event) - * @brief This API is used for SD MMC card enumeration process - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] Event : event handler to be register - * @return RSI_OK : If MMC card enumeration successfully done - * ERROR_TIMEOUT : If the commands error timeout occures. - */ -rsi_error_t RSI_SDMMC_Enumeration(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event) -{ - if (pSmihConfig == 0) { - return INVALID_PARAMETERS; - } - // Configure gpios in smih mode - RSI_SDMEM_PinMux(); - - if (RSI_OK != RSI_SD_HostInit(pSmihConfig, Event, 1)) { - return ERROR_SMIH; - } else { - // Commands for sdio enumeration - rsi_delay_ms(5); - - // Reset card(send command 0) - if (RSI_OK != RSI_SDMEM_GoIdleStateCmd0(pSmihConfig)) { - return ERROR_SMIH; - } - while (1) { - if (RSI_OK == RSI_SDMMC_SendOperationConditionCmd1(pSmihConfig, 0x40FF8000)) { - break; - } - } - // send cmd2 - if (RSI_OK != RSI_SDMEM_SendCidCmd2(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - // send cmd3 - if (RSI_OK != RSI_SDIOH_SendRelativeAddressCmd3(pSmihConfig, 0x0)) { - return ERROR_SMIH; - } - // select card :send rca as argument - if (RSI_OK != RSI_SDMEM_SelectCardCmd7(pSmihConfig)) { - return ERROR_SMIH; - } - // send csd command to card - if (RSI_OK != RSI_SDMMC_SendExtentCsdCmd(pSmihConfig)) { - return ERROR_SMIH; - } - // bus width configuration - if (pSmihConfig->busWidthMode == 1) { - if (RSI_OK != RSI_SDMMC_ChangeBusWidthMode(pSmihConfig, SMIH_BUS_WIDTH4)) { - return ERROR_SMIH; - } - rsi_delay_ms(5); - } else if (pSmihConfig->busWidthMode == 2) { - if (RSI_OK != RSI_SDMMC_ChangeBusWidthMode(pSmihConfig, SMIH_BUS_WIDTH8)) { - return ERROR_SMIH; - } - rsi_delay_ms(5); - } - // enable high speed mode - if (TRUE == pSmihConfig->highSpeedEnable) { - rsi_delay_ms(1); - if (RSI_OK != RSI_SDMMC_HighSpeedMode(pSmihConfig, TRUE, pSmihConfig->clock)) { - return ERROR_SMIH; - } - rsi_delay_ms(1); - } - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMMC_SendOperationConditionCmd1(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send MMC operation condition command. - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] Arg : Argument to the command - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMMC_SendOperationConditionCmd1(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.blockSize = 0x0; - data.blockCount = 0x0; - data.data = NULL; - data.direction = SMIH_WRITE_DIRECTION; - - cmd.cmdIdx = CMD_1; - cmd.cmdArg = Arg; - cmd.responseTypeSelect = SMIH_RESPONSE_R3R4; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - if (transfer.command->response[0] & BIT(31)) { - pSmihConfig->cardType = SMIH_CARD_STANDARD; - if (transfer.command->response[0] & BIT(30)) { - pSmihConfig->cardType = SMIH_CARD_HIGH_CAPACITY; - } - } else { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMMC_SendExtentCsdCmd(SMIH_CARD_CONFIG_T *pSmihConfig) - * @brief This API is used to send csd command to the MMC card. - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMMC_SendExtentCsdCmd(SMIH_CARD_CONFIG_T *pSmihConfig) -{ - uint8_t ext_csd[BLOCK_SIZE_512] = { 0 }; - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - uint32_t *preadVal = NULL; - - data.blockSize = BLOCK_SIZE_512; - data.blockCount = 1; - data.data = ext_csd; - data.direction = SMIH_READ_DIRECTION; - - cmd.cmdIdx = (CMD_80_hex | CMD_8); //mmc cmd 8 - cmd.cmdArg = pSmihConfig->rca << 16; - cmd.responseTypeSelect = SMIH_RESPONSE_R1R5R6R7; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - rsi_delay_ms(10); - - preadVal = (uint32_t *)&ext_csd[212]; - pSmihConfig->maxSectorNum = *preadVal; - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMMC_ChangeBusWidthMode(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t bus_wdith) - * @brief This API is used to change bus width mode to MMC card. - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] bus_wdith : bus width mode to be configured - * possible values are SMIH_BUS_WIDTH1 : 1 bit width - * SMIH_BUS_WIDTH4 : 4 bit width - * SMIH_BUS_WIDTH8 : 8 bit width - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMMC_ChangeBusWidthMode(SMIH_CARD_CONFIG_T *pSmihConfig, uint8_t bus_wdith) -{ - uint32_t argument = 0; - switch (bus_wdith) { - case SMIH_BUS_WIDTH1: - argument = (0x3 << 24) | (0xB7 << 16) | (0x0 << 8) | (0x0 << 0); - break; - case SMIH_BUS_WIDTH4: - argument = (0x3 << 24) | (0xB7 << 16) | (0x1 << 8) | (0x0 << 0); - break; - case SMIH_BUS_WIDTH8: - argument = (0x3 << 24) | (0xB7 << 16) | (0x2 << 8) | (0x0 << 0); - break; - default: - return INVALID_PARAMETERS; - } - // send switch command - if (RSI_OK != RSI_SDMMC_SwitchFunctionCmd6(pSmihConfig, argument)) { - return ERROR_SMIH; - } - // set bus width - smih_bus_width_set(bus_wdith); - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMMC_SwitchFunctionCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) - * @brief This API is used to send switch mode function command to MMC card. - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] Arg : Command argument to send - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMMC_SwitchFunctionCmd6(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t Arg) -{ - SMIH_TRANSFER_T transfer = { 0 }; - SMIH_CMD_FEILD_T cmd = { 0 }; - SMIH_DATA_FEILD_T data = { 0 }; - - data.blockSize = 0; - data.blockCount = 0; - data.data = NULL; - data.direction = SMIH_WRITE_DIRECTION; - cmd.cmdIdx = CMD_6; - cmd.cmdArg = Arg; - cmd.responseTypeSelect = SMIH_RESPONSE_R1BR5B; - - transfer.command = &cmd; - transfer.data = &data; - - // transfer Command - if (RSI_OK != pSmihConfig->cmd_transfer(&transfer)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SDMMC_HighSpeedMode(SMIH_CARD_CONFIG_T *pSmihConfig, boolean_t HighSpeed, uint32_t Clock) - * @brief This API is used to enable high speed mode to MMC card. - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] HighSpeed : high speed value : 1 for enbale - * 0 for disable - * @param[in] Clock : Clock frequency - * @return RSI_OK : If the command sent successfully - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t RSI_SDMMC_HighSpeedMode(SMIH_CARD_CONFIG_T *pSmihConfig, boolean_t HighSpeed, uint32_t Clock) -{ - uint32_t clk = 0; - uint32_t arg = 0; - uint32_t highspeed = 0; - if (HighSpeed == 1) { - highspeed = 1; - clk = Clock; - arg = (0x3 << 24) | (0xB9 << 16) | (0x0 << 8) | (0x0 << 0); - } else { - highspeed = 0; - clk = 400 * 1000; - arg = (0x3 << 24) | (0xB9 << 16) | (0x0 << 8) | (0x0 << 0); - } - // Send switch mode command to card - if (RSI_OK != RSI_SDMMC_SwitchFunctionCmd6(pSmihConfig, arg)) { - return ERROR_SMIH; - } - // Configure clock - smih_clock_config(pSmihConfig, clk); - - // Enable or disable high speed mode - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.HIGH_SPEED_ENABLE = highspeed; - - return RSI_OK; -} -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_smih.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_smih.c deleted file mode 100644 index 42fa7bba3..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_smih.c +++ /dev/null @@ -1,1184 +0,0 @@ -/******************************************************************************* -* @file rsi_smih.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "rsi_ccp_user_config.h" -#if defined(CHIP_9118) - -static SMIH_TRANSFER_T *CommandInProgress = 0; -static SMIH_CONFIG_MODES_T *modesConfig = 0; -static SMIH_CONFIG_MODES_T modeConfig; -static SMIH_ADMA_DESC_TABLE_T Adma2DescriptorTable[2] = { 0 }; -volatile static SMIH_EVENT_T event; - -#define SD_IRQHandler IRQ068_Handler - -// SMIH CONTROLLER RELATED FUNCTIONS -/*==============================================*/ -/** - * @fn rsi_error_t RSI_SD_HostInit(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event, uint8_t MemType) - * @brief This API is used to initialize the smih host configuration - * @param[in] pSmihConfig : Pointer to the smih card configuration structure - * @param[in] Event : event handler to be register - * @param[in] MemType : type of operation to be pragram - * 1 for memory operations , - * 0 for IO operations - * @return RSI_OK : If host initialized successfully - */ -rsi_error_t RSI_SD_HostInit(SMIH_CARD_CONFIG_T *pSmihConfig, ARM_SMIH_SignalEvent_t Event, uint8_t MemType) -{ - SMIH_CONFIG_MODES_T commandCfg; - if (pSmihConfig == 0) { - return INVALID_PARAMETERS; - } - // sleepclock prog - *(volatile uint32_t *)(0x46000024) = (0x0 << 21); - - // wait for clock switch - while ((M4CLK->PLL_STAT_REG_b.SLEEP_CLK_SWITCHED) != 1) - ; - - // Wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - - // Register callbacks - event.callb_event = Event; - - if (MemType) { - pSmihConfig->cmd_transfer = smih_memory_command_transfer; - } else { - pSmihConfig->cmd_transfer = smih_io_command_transfer; - } - - // Set bus violtage - if (pSmihConfig->voltage) { - smih_bus_voltage_select(VOLTAGE_18V); - } else { - smih_bus_voltage_select(VOLTAGE_33V); - } - - SMIH->SMIH_POWER_CONTROL_REGISTER_b.SD_BUS_POWER = 0x1; - - if (pSmihConfig->busWidthMode) { - // SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DATA_TRANSFER_WIDTH = 0x1; //fix for MMC - } else { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DATA_TRANSFER_WIDTH = 0x0; - } - - // Configure ADMA or IO mode - if (pSmihConfig->admaMode) { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DMA_SELECT = 0x2; - } else { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DMA_SELECT = 0x0; - } - - // Configure high speed mode - if (pSmihConfig->highSpeedEnable) { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.HIGH_SPEED_ENABLE = 0x1; - } else { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.HIGH_SPEED_ENABLE = 0x0; - } - - smih_clock_config(pSmihConfig, 400000); - - // Enable normal interrupts - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_ENABLE_REGISTER = - (COMMAND_COMPLETE_STATUS_ENABLE | TRANSFER_COMPLETE_STATUS_ENABLE | BLOCK_GAP_EVENT_STATUS_ENABLE - | DMA_INTERRUPT_STATUS_ENABLE | BUFFER_WRITE_READY_STATUS_ENABLE | BUFFER_READ_READY_STATUS_ENABLE - | CARD_INSERTION_STATUS_ENABLE | CARD_REMOVAL_STATUS_ENABLE | CARD_INTERRUPT_STATUS_ENABLE | INT_A_STATUS_ENABLE - | INT_B_STATUS_ENABLE | INT_C_STATUS_ENABLE | RE_TUNING_EVENT_STATUS_ENABLE); - - // Enable error interrupts - SMIH->SMIH_ERROR_INTERRUPT_STATUS_ENABLE_REGISTER = - (COMMAND_TIMEOUT_ERROR_STATUS_ENABLE | COMMAND_CRC_ERROR_STATUS_ENABLE | COMMAND_END_BIT_ERROR_STATUS_ENABLE - | COMMAND_INDEX_ERROR_STATUS_ENABLE | DATA_TIMEOUT_ERROR_STATUS_ENABLE | DATA_CRC_ERROR_STATUS_ENABLE - | DATA_END_BIT_ERROR_STATUS_ENABLE | CURRENT_LIMIT_ERROR_STATUS_ENABLE | AUTO_CMD_ERROR_STATUS_ENABLE - | ADMA_ERROR_STATUS_ENABLE | TUNING_ERROR_STATUS_ENABLE); - - // Enable normal interrupts signals - SMIH->SMIH_NORMAL_INTERRUPT_SIGNAL_ENABLE_REGISTER = - (COMMAND_COMPLETE_SIGNAL_ENABLE | TRANSFER_COMPLETE_SIGNAL_ENABLE | BUFFER_WRITE_READY_SIGNAL_ENABLE - | BUFFER_READ_READY_SIGNAL_ENABLE | CARD_REMOVAL_SIGNAL_ENABLE | CARD_INTERRUPT_SIGNAL_ENABLE); - SMIH->SMIH_ERROR_INTERRUPT_SIGNAL_ENABLE_REGISTER = 0x1; - - // Enable Irq - NVIC_EnableIRQ(SDMEM_IRQn); - - memset(&commandCfg, 0, sizeof(commandCfg)); - commandCfg.highSpeedEnable = pSmihConfig->highSpeedEnable; - commandCfg.admaMode = pSmihConfig->admaMode; - commandCfg.busWidthMode = pSmihConfig->busWidthMode; - commandCfg.clock = pSmihConfig->clock; - - if (RSI_OK != smih_modes_configuration(&commandCfg)) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t Smih_DeInitialization(void) - * @brief This API is used to Deinitialize the host controller. * - * @return RSI_OK : If host deinitialized successfully. - */ -rsi_error_t Smih_DeInitialization(void) -{ - // Clear clock control and power control registers - SMIH->SMIH_CLOCK_CONTROL_REGISTER = 0x0000; - SMIH->SMIH_POWER_CONTROL_REGISTER = 0x00; - - SMIH->SMIH_NORMAL_INTERRUPT_SIGNAL_ENABLE_REGISTER = 0x0000; - SMIH->SMIH_ERROR_INTERRUPT_SIGNAL_ENABLE_REGISTER = 0x0000; - - // disable nvic - NVIC_DisableIRQ(SDMEM_IRQn); - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_bus_width_set(uint8_t BusWidthMode) - * @brief This API is used to set the smih bus width. - * @param[in] BusWidthMode : bus width mode - * possible values are 0 for 1bit mode - * 1 for 4bit mode - * 2 for 8bit mode - * @return RSI_OK : If bus width set successfully. - */ -rsi_error_t smih_bus_width_set(uint8_t BusWidthMode) -{ - // Configure bus width - if (BusWidthMode == 0) { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DATA_TRANSFER_WIDTH = 0x0; - } else if (BusWidthMode == 1) { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.DATA_TRANSFER_WIDTH = 0x1; - } else if (BusWidthMode == 2) { - SMIH->SMIH_HOST_CONTROL_1_REGISTER_b.EXTENDED_DATA_TRANSFER_WIDTH = 0x1; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_bus_voltage_select(uint8_t enVoltage) - * @brief This API is used to select the smih voltage. - * @param[in] enVoltage : voltage selection - * possbile selections are - * VOLTAGE_18V 1.8v voltage selection for sdio interface - * VOLTAGE_30V 3.0v voltage selection for sdio interface - * VOLTAGE_33V 3.3v voltage selection for sdio interface - * @return RSI_OK : If voltage configured Successfully. - */ -rsi_error_t smih_bus_voltage_select(uint8_t enVoltage) -{ - if (enVoltage == VOLTAGE_18V) { - SMIH->SMIH_POWER_CONTROL_REGISTER_b.SD_BUS_VOLTAGE_SELECT = 0x5; - } else if (enVoltage == VOLTAGE_30V) { - SMIH->SMIH_POWER_CONTROL_REGISTER_b.SD_BUS_VOLTAGE_SELECT = 0x6; - } else if (enVoltage == VOLTAGE_33V) { - SMIH->SMIH_POWER_CONTROL_REGISTER_b.SD_BUS_VOLTAGE_SELECT = 0x7; - } else { - return INVALID_PARAMETERS; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_command_xfer(SMIH_COMMAND_FRAME_CONFIG_T *pConfig) - * @brief This API is used to send the command. - * @param[in] pConfig : pointer to the command structure - * @return RSI_OK : If command sent properly. - * INVALID_PARAMETERS : If pConfig == NULL - */ -rsi_error_t smih_command_xfer(SMIH_COMMAND_FRAME_CONFIG_T *pConfig) -{ - SMIH_COMMAND_REG_T cmdData; - - memset(&cmdData, 0, sizeof(cmdData)); - - if (pConfig == NULL) { - return INVALID_PARAMETERS; - } - - // Set command response type - switch (pConfig->responseTypeSelect) { - case SMIH_NO_RESPONSE: - cmdData.respType = 0x0; - break; - case SMIH_RESPONSE_LENGTH_136: - cmdData.respType = 0x1; - break; - case SMIH_RESPONSE_LENGTH_48: - cmdData.respType = 0x2; - break; - case SMIH_RESPONSE_LENGTH_48BIT_BUSY_CHECK: - cmdData.respType = 0x3; - break; - default: - return INVALID_PARAMETERS; - } - - // Set command CRC check - if (pConfig->cmdCrcCheckEn) { - cmdData.cmdCrcCheckEnable = 0x1; - } else { - cmdData.cmdCrcCheckEnable = 0x0; - } - - // Set command index check - if (pConfig->cmdIndexCheckEn) { - cmdData.cmdIndexCheckEnable = 0x1; - } else { - cmdData.cmdIndexCheckEnable = 0x0; - } - - // Set data present or not when sending the command - if (pConfig->dataPresentSelect) { - cmdData.dataPresentSelect = 0x1; - } else { - cmdData.dataPresentSelect = 0x0; - } - - // Configure command type - switch (pConfig->cmdType) { - case NORMAL_CMD: - cmdData.cmdType = 0x0; - break; - case SUSPEND_CMD: - cmdData.cmdType = 0x1; - break; - case RESUME_CMD: - cmdData.cmdType = 0x2; - break; - case ABORT_CMD: - cmdData.cmdType = 0x3; - break; - default: - return INVALID_PARAMETERS; - } - - // Set command index - cmdData.cmdIndex = pConfig->cmdIndex; - - // Auto command setting - switch (pConfig->autoCmdType) { - case DISABLE_AUTO_CMD: - SMIH->TRANSFER_MODE_REGISTER_b.AUTO_CMD_ENABLE = 0x0; - break; - case ENABLE_AUTO_CMD12: - SMIH->TRANSFER_MODE_REGISTER_b.AUTO_CMD_ENABLE = 0x1; - break; - case ENABLE_AUTO_CMD23: - SMIH->TRANSFER_MODE_REGISTER_b.AUTO_CMD_ENABLE = 0x2; - break; - default: - return INVALID_PARAMETERS; - } - // Configure argument register - SMIH->SMIH_ARGUMENT1_REGISTER = pConfig->cmdArgument; - - if (pConfig->cmdIndex == 5) { - if ((pConfig->cmdArgument & (1 << 24))) { - SMIH->SMIH_HOST_CONTROL_2_REGISTER = (1 << 3); - } - } - // assign fiiled data to the command register - SMIH->SMIH_COMMAND_REGISTER = *((uint16_t *)&cmdData); - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_get_response(uint16_t *pResponseData, uint8_t ResponseRegCount) - * @brief This API is used to receive response on cmd line. - * @param[in] pResponseData : pointer to the response data - * @return RSI_OK : If command sent properly. - * INVALID_PARAMETERS : If pConfig==NULL or ResponseRegCount >8 - */ -rsi_error_t smih_get_response(uint16_t *pResponseData, uint8_t ResponseRegCount) -{ - uint16_t *pResponseBaseAddr; - uint8_t i; - - if ((pResponseData == 0) || (ResponseRegCount > 8u)) { - return INVALID_PARAMETERS; - } - pResponseBaseAddr = (uint16_t *)&SMIH->SMIH_RESPONSE_REGISTER0; - - for (i = 0; i < ResponseRegCount; i++) { - *pResponseData++ = *pResponseBaseAddr++; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_stop_at_block_gap(void) - * @brief This API is used to stop multiple block transfer. - * @return RSI_OK : Stops data transfer. - */ -rsi_error_t smih_stop_at_block_gap(void) -{ - SMIH->SMIH_BLOCK_GAP_CONTROL_REGISTER_b.STOP_AT_BLOCK_GAP_REQUEST = 0x1; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_transfer_restart(void) - * @brief This API is used to restart the transfer when the transfer is pending. - * @return RSI_OK : If data restarts transfer successfully. - */ -rsi_error_t smih_transfer_restart(void) -{ - SMIH->SMIH_BLOCK_GAP_CONTROL_REGISTER_b.CONTINUE_REQUEST = 0x1; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void smih_18v_signal_enable(void) - * @brief This API is used to enable 1.8v signal enable bit. - * @return void - */ -void smih_18v_signal_enable(void) -{ - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b._1_8V_SIGNALING_ENABLE = 0x1; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_uhs_mode_select(uint8_t UhsMode) - * @brief This API is used to select the smih UHS(ULTRA HIGH SPEED) mode. - * @param[in] UhsMode : Uhs mode selection - * possbile selections are - * UHS_NONE no uhs mode - * UHS_SDR12 in case of SDR12 mode requirement - * UHS_SDR25 in case of SDR25 mode requirement - * UHS_SDR50 in case of SDR50 mode requirement - * UHS_SDR104 in case of SDR104 mode requirement - * UHS_DDR50 in case of DDR50 mode requirement - * @return RSI_OK : If uhs mode configured properly. - */ -rsi_error_t smih_uhs_mode_select(uint8_t UhsMode) -{ - switch (UhsMode) { - case UHS_SDR12: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x0; - break; - case UHS_SDR25: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x1; - break; - case UHS_SDR50: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x2; - break; - case UHS_SDR104: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x3; - break; - case UHS_DDR50: - SMIH->SMIH_HOST_CONTROL_2_REGISTER_b.UHS_MODE_SELECT = 0x4; - break; - default: - return INVALID_PARAMETERS; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void smih_irq_handler(void) - * @brief This is smih Irq Handler - * @return none -*/ -void smih_irq_handler(void) -{ - uint32_t normal_intr_status; - uint32_t error_intr_status; - - // read normal interrupt status reg - normal_intr_status = SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER; - - // read error interrupt status reg - error_intr_status = SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER; - - // Command complete - if (normal_intr_status & BIT(0)) { - event.commandComplete = 1; - if (event.callb_event != NULL) { - event.callb_event(COMMAND_COMPLETE); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(0); - } - // Transfer complete - if (normal_intr_status & BIT(1)) { - event.transferComplete = 1; - if (event.callb_event != NULL) { - event.callb_event(TRANSFER_COMPLETE); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(1); - } - // block gap event - if (normal_intr_status & BIT(2)) { - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(2); - } - // DMA event - if (normal_intr_status & BIT(3)) { - if (event.callb_event != NULL) { - event.callb_event(DMA_INTR); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(3); - } - // Buffer write ready - if (normal_intr_status & BIT(4)) { - event.bufferWriteReady = 1; - if (event.callb_event != NULL) { - event.callb_event(BUFFER_WRITE_READY); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(4); - } - // Buffer read ready - if (normal_intr_status & BIT(5)) { - event.bufferReadReady = 1; - if (event.callb_event != NULL) { - event.callb_event(BUFFER_READ_READY); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(5); - } - // Card insetion - if (normal_intr_status & BIT(6)) { - if (event.callb_event != NULL) { - event.callb_event(CARD_INSERTION); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(6); - } - // Card removal - if (normal_intr_status & BIT(7)) { - event.cardRemoval = 1; - if (event.callb_event != NULL) { - event.callb_event(CARD_REMOVAL); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(7); - } - // Card interrupt - if (normal_intr_status & BIT(8)) { - event.cardInterrupt = 1; - if (event.callb_event != NULL) { - event.callb_event(CARD_INTERRUPT); - } - SMIH->SMIH_NORMAL_INTERRUPT_STATUS_REGISTER = BIT(8); - } - // Command timeout error - if (error_intr_status & BIT(0)) { - event.commandTimeoutError = 1; - if (event.callb_event != NULL) { - event.callb_event(CMD_TIMEOUT_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(0); - } - // Command CRC error - if (error_intr_status & BIT(1)) { - event.commandCrcError = 1; - if (event.callb_event != NULL) { - event.callb_event(CMD_CRC_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(1); - } - // Command end bit error - if (error_intr_status & BIT(2)) { - event.commandEndBitError = 1; - if (event.callb_event != NULL) { - event.callb_event(CMD_END_BIT_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(2); - } - // Command index error - if (error_intr_status & BIT(3)) { - event.commandIndexError = 1; - if (event.callb_event != NULL) { - event.callb_event(CMD_INDEX_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(3); - } - // data timeout error - if (error_intr_status & BIT(4)) { - event.dataTimeoutError = 1; - if (event.callb_event != NULL) { - event.callb_event(DATA_TIMEOUT_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(4); - } - // data end bit error - if (error_intr_status & BIT(5)) { - event.dataEndbitError = 1; - if (event.callb_event != NULL) { - event.callb_event(DATA_END_BIT_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(5); - } - // data CRC error - if (error_intr_status & BIT(6)) { - event.dataCrcError = 1; - if (event.callb_event != NULL) { - event.callb_event(DATA_CRC_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(6); - } - // Current limitation error - if (error_intr_status & BIT(7)) { - event.currentLimitError = 1; - if (event.callb_event != NULL) { - event.callb_event(CURRENT_LIMIT_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(7); - } - // Auto CMD12 error - if (error_intr_status & BIT(8)) { - event.autoCommandError = 1; - if (event.callb_event != NULL) { - event.callb_event(AUTO_CMD_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(8); - } - // ADMA error - if (error_intr_status & BIT(9)) { - event.admaError = 1; - if (event.callb_event != NULL) { - event.callb_event(ADMA_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(9); - } - // Tuning error - if (error_intr_status & BIT(10)) { - event.tuningError = 1; - if (event.callb_event != NULL) { - event.callb_event(TUNING_ERROR); - } - SMIH->SMIH_ERROR_INTERRUPT_STATUS_REGISTER = BIT(10); - } - return; -} - -/*==============================================*/ -/** - * @fn void SD_IRQHandler(void) - * @brief SMIH Interrupt Handler - * @return none -*/ -void SD_IRQHandler(void) -{ - smih_irq_handler(); -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_modes_configuration(SMIH_CONFIG_MODES_T *pSmihConfig) - * @brief This API is used to configure modes to SMIH - * @param[in] pSmihConfig : Pointer to the IO card configuration - * @return RSI_OK : IO command configuration structure initialized successfully - * INVALID_PARAMETERS : In case of Invalid parameter - */ -rsi_error_t smih_modes_configuration(SMIH_CONFIG_MODES_T *pSmihConfig) -{ - if (modesConfig == NULL) { - modesConfig = &modeConfig; - } - if (pSmihConfig != NULL) { - memcpy(modesConfig, pSmihConfig, sizeof(SMIH_CONFIG_MODES_T)); - return RSI_OK; - } - return ERROR_SMIH; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_clock_config(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t freq) - * @brief This API is used to configure the host controller clock - * @param[in] freq : clock frequency to the host - * @return RSI_OK : If new frequency is set - */ -rsi_error_t smih_clock_config(SMIH_CARD_CONFIG_T *pSmihConfig, uint32_t freq) -{ - uint16_t Div = 0; - uint32_t clockInput = pSmihConfig->clock; - Div = clockInput / 2 / (freq); - - // disables smih clock - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SD_CLOCK_ENABLE = 0u; - - // set division value to the clock - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SDCLK_FREQUENCY_SELECT = (Div & 0xFF); - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.UPPER_BITS_OF_SDCLK_FREQUENCY_SELECT = ((Div >> 8) & 0x03); - - // Enable Smih internal clock - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.INTERNAL_CLOCK_ENABLE = 0x1; - - // wait for inter clock to be stable - while (0x1 != SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.INTERNAL_CLOCK_STABLE) - ; - - // enables smih clock - SMIH->SMIH_CLOCK_CONTROL_REGISTER_b.SD_CLOCK_ENABLE = 0x1; - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_check_for_error_interrupt(void) - * @brief This API is used to check perticular error event happend or not. - * @return RSI_OK : If error event not occured. - * ERROR_TIMEOUT : If event occured - */ -rsi_error_t smih_check_for_error_interrupt(void) -{ - if (event.cardRemoval) { - event.cardRemoval = 0; - return ERROR_ACCESS_RIGHTS; - } - if (event.commandTimeoutError || event.commandCrcError || event.commandEndBitError || event.commandIndexError - || event.dataTimeoutError || event.dataEndbitError || event.dataCrcError) { - return ERROR_TIMEOUT; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_send_data(SMIH_TRANSFER_T *pTransfer) - * @brief This API is used to write the data to the SMIH FIFO - * @param[in] pTransfer : Pointer to the command and data structure - * @return RSI_OK : If the data sent properly. - * ERROR_TIMEOUT : If the write data time out occurs. - */ -rsi_error_t smih_send_data(SMIH_TRANSFER_T *pTransfer) -{ - uint32_t blocksize = 0; - uint32_t blockcnt = 0; - uint32_t i = 0; - uint32_t *pBuffer = NULL; - - if (modesConfig->admaMode != 1) // IO mode - { - while (1) { - if (event.bufferWriteReady) { - event.bufferWriteReady = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_TIMEOUT; - } - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - } - blockcnt = pTransfer->data->blockCount; - blocksize = pTransfer->data->blockSize; - pBuffer = (uint32_t *)pTransfer->data->data; - - while (blockcnt > 0) { - while (0x0 == SMIH->SMIH_PRESENT_STATE_REGISTER_b.BUFFER_WRITE_ENABLE) - ; - if (0x0 == SMIH->SMIH_PRESENT_STATE_REGISTER_b.BUFFER_WRITE_ENABLE) { - return ERROR_TIMEOUT; - } - // write data to the fifo - for (i = 0; i < (blocksize >> 2); i++) { - SMIH->SMIH_BUFFER_DATA_PORT_REGISTER = (*pBuffer++); - } - blockcnt--; - } - // wait for transfer completion event to be occur - while (1) { - if (event.transferComplete) { - event.transferComplete = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_TIMEOUT; - } - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - } - } else //adm2 mode - { - // wait for transfer done - while (1) { - if (event.transferComplete) { - event.transferComplete = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_TIMEOUT; - } - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - } - } - // Wait for data line to be free - while ((SMIH->SMIH_PRESENT_STATE_REGISTER_b.DAT_LINE_ACTIVE) != 0) - ; - - if ((SMIH->SMIH_PRESENT_STATE_REGISTER_b.DAT_LINE_ACTIVE) == 0x1) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_receive_data(SMIH_TRANSFER_T *pTransfer) - * @brief This API is used to read the data from SMIH FIFO - * @param[in] pTransfer : Pointer to the command and data structure - * @return RSI_OK : If the data read properly. - * ERROR_TIMEOUT : If data timeout occurs. - */ -rsi_error_t smih_receive_data(SMIH_TRANSFER_T *pTransfer) -{ - uint32_t blocksize = 0; - static uint32_t blockcnt = 0; - uint32_t i = 0; - uint32_t *pBuffer = NULL; - - if (modesConfig->admaMode != 1) // IO mode - { - // wait for read ready event - while (1) { - if (event.bufferReadReady) { - event.bufferReadReady = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_TIMEOUT; - } - - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - } - pBuffer = (uint32_t *)pTransfer->data->data; - blockcnt = pTransfer->data->blockCount; - blocksize = pTransfer->data->blockSize; - - // read data from fifo - while (blockcnt > 0) { - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.BUFFER_READ_ENABLE == 0) - ; - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.BUFFER_READ_ENABLE == 0) { - break; - } - for (i = 0; i < (blocksize >> 2); i++) { - *pBuffer++ = SMIH->SMIH_BUFFER_DATA_PORT_REGISTER; - } - blockcnt--; - } - - // wait until data transfer done - while (1) { - if (event.transferComplete) { - event.transferComplete = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_TIMEOUT; - } - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - } - } else // adma2 mode - { - while (1) { - if (event.transferComplete) { - event.transferComplete = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_TIMEOUT; - } - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_SMIH; - } - } - } - // Wait for data line to be free - while ((SMIH->SMIH_PRESENT_STATE_REGISTER_b.DAT_LINE_ACTIVE) != 0) - ; - - if ((SMIH->SMIH_PRESENT_STATE_REGISTER_b.DAT_LINE_ACTIVE) == 0x1) { - return ERROR_SMIH; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_memory_command_transfer(SMIH_TRANSFER_T *pTransfer) - * @brief This API is used to send memory command. - * @param[in] pTransfer : Pointer to the command and data structure - * @return ERROR_SMIH : If Parameter is invalid. - * ERROR_TIMEOUT : If the command error timeout occures. - * RSI_OK : If command sent succesfully. - */ -rsi_error_t smih_memory_command_transfer(SMIH_TRANSFER_T *pTransfer) -{ - uint32_t admaDespTableAddress; - SMIH_COMMAND_FRAME_CONFIG_T commandCfg = { 0 }; - - if (NULL == modesConfig) { - return INVALID_PARAMETERS; - } - // wait for command line to be stable - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_CMD != 0) - ; - - // wait for data line to be stable - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_DAT != 0) - ; - - // cnfigure adma2 descriptor table - if ((modesConfig->admaMode) && (pTransfer->data->data != NULL)) { - memset(Adma2DescriptorTable, 0x0, sizeof(Adma2DescriptorTable)); - - Adma2DescriptorTable[0].attributeValid = 1; - Adma2DescriptorTable[0].attributeEnd = 1; - Adma2DescriptorTable[0].attributeInt = 0; - Adma2DescriptorTable[0].attributeAct = 2; - Adma2DescriptorTable[0].length = (pTransfer->data->blockSize * pTransfer->data->blockCount); - Adma2DescriptorTable[0]._32BIT_Adress = (uint32_t)pTransfer->data->data; - admaDespTableAddress = (uint32_t)&Adma2DescriptorTable[0]; - SMIH->SMIH_ADMA_SYSTEM_ADDRESS0_REGISTER = (uint16_t)admaDespTableAddress; - SMIH->SMIH_ADMA_SYSTEM_ADDRESS1_REGISTER = (uint16_t)(admaDespTableAddress >> 16u); - } - SMIH->SMIH_BLOCK_SIZE_REGISTER_b.TRANSFER_BLOCK_SIZE = pTransfer->data->blockSize; - SMIH->TRANSFER_MODE_REGISTER_b.DATA_TRANSFER_DIRECTION_SELECT = pTransfer->data->direction; - commandCfg.cmdArgument = pTransfer->command->cmdArg; - - // Configure the CMD register to send the command. - if (pTransfer->data->data == NULL) { - commandCfg.dataPresentSelect = 0; - } else { - commandCfg.dataPresentSelect = 1; - } - if ((modesConfig->admaMode) && (pTransfer->data->data != NULL)) { - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE = 1; - } else { - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE = 0; - } - commandCfg.cmdIndex = pTransfer->command->cmdIdx & 0x3F; - if ((commandCfg.cmdIndex == 18) || (commandCfg.cmdIndex == 25)) { - // multiple block mode - commandCfg.autoCmdType = ENABLE_AUTO_CMD12; - SMIH->TRANSFER_MODE_REGISTER_b.BLOCK_COUNT_ENABLE = 0x1; - SMIH->TRANSFER_MODE_REGISTER_b.MULTI_OR_SINGLE_BLOCK_SELECT = 0x1; - SMIH->SMIH_BLOCK_COUNT_REGISTER = pTransfer->data->blockCount; - } else { - // single block mode - commandCfg.autoCmdType = DISABLE_AUTO_CMD; - SMIH->TRANSFER_MODE_REGISTER_b.BLOCK_COUNT_ENABLE = 0x0; - SMIH->TRANSFER_MODE_REGISTER_b.MULTI_OR_SINGLE_BLOCK_SELECT = 0x0; - SMIH->SMIH_BLOCK_COUNT_REGISTER = pTransfer->data->blockCount; - } - switch (pTransfer->command->responseTypeSelect) { - case SMIH_NO_RESPONSE: - commandCfg.responseTypeSelect = SMIH_NO_RESPONSE; - commandCfg.cmdIndexCheckEn = 0; - commandCfg.cmdCrcCheckEn = 0; - break; - case SMIH_RESPONSE_R2: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_136; - commandCfg.cmdIndexCheckEn = 0; - commandCfg.cmdCrcCheckEn = 1; - break; - case SMIH_RESPONSE_R3R4: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_48; - commandCfg.cmdIndexCheckEn = 0; - commandCfg.cmdCrcCheckEn = 0; - break; - case SMIH_RESPONSE_R1R5R6R7: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_48; - commandCfg.cmdIndexCheckEn = 1; - commandCfg.cmdCrcCheckEn = 1; - break; - case SMIH_RESPONSE_R1BR5B: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_48BIT_BUSY_CHECK; - commandCfg.cmdIndexCheckEn = 1; - commandCfg.cmdCrcCheckEn = 1; - break; - default: - return INVALID_PARAMETERS; - } - - if (CommandInProgress != NULL) { - return ERROR_OPERATION_INPROGRESS; - } - - SMIH->SMIH_TIMEOUT_CONTROL_REGISTER_b.DATA_TIMEOUT_COUNTER_VALUE = 0xC; - - commandCfg.cmdType = NORMAL_CMD; - - // set current command to global value for callback - CommandInProgress = pTransfer; - - // send command - smih_command_xfer(&commandCfg); - - // wait command line to be stable - while (1) { - if (event.commandComplete) { - event.commandComplete = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_SMIH; - } - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_TIMEOUT; - } - } - - // get response data - if (RSI_OK != smih_get_response((uint16_t *)pTransfer->command->response, sizeof(pTransfer->command->response) / 2)) { - return ERROR_SMIH; - } - if (pTransfer->data->data != 0) { - if ((pTransfer->command->cmdIdx == 24) || (pTransfer->command->cmdIdx == 25)) { - // send data to card - if (RSI_OK != smih_send_data(pTransfer)) { - return ERROR_SMIH; - } - } - if ((pTransfer->command->cmdIdx == 17) || (pTransfer->command->cmdIdx == 18) - || (pTransfer->command->cmdIdx == (0x80 | 8) /*mmc command 8*/) - || (pTransfer->command->cmdIdx == (0x40 + 51) /*sd ACMD51*/)) { - /* read data from card */ - if (RSI_OK != smih_receive_data(pTransfer)) { - return ERROR_SMIH; - } - } - } - CommandInProgress = NULL; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t smih_io_command_transfer(SMIH_TRANSFER_T *pTransfer) - * @brief This API is used to transfer SMIH command. - * @param[in] pTransfer : Pointer to the command and data structure - * @return ERROR_SMIH : If Parameter is invalid. - * ERROR_TIMEOUT : If the command error timeout occures. - */ -rsi_error_t smih_io_command_transfer(SMIH_TRANSFER_T *pTransfer) -{ - SMIH_COMMAND_FRAME_CONFIG_T commandCfg = { 0 }; - uint32_t admaDespTableAddress; - if (NULL == modesConfig) { - return INVALID_PARAMETERS; - } - // wait for command line to be stable - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_CMD != 0) - ; - - // wait for data line to be stable - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.COMMAND_INHIBIT_DAT != 0) - ; - - // cnfigure adma2 descriptor table - if ((modesConfig->admaMode) && (pTransfer->data->data != NULL)) { - memset(Adma2DescriptorTable, 0x0, sizeof(Adma2DescriptorTable)); - Adma2DescriptorTable[0].attributeValid = 1; - Adma2DescriptorTable[0].attributeEnd = 1; - Adma2DescriptorTable[0].attributeInt = 0; - Adma2DescriptorTable[0].attributeAct = 2; - Adma2DescriptorTable[0].length = pTransfer->data->blockSize * pTransfer->data->blockCount; - Adma2DescriptorTable[0]._32BIT_Adress = (uint32_t)pTransfer->data->data; - admaDespTableAddress = (uint32_t)&Adma2DescriptorTable[0]; - // Update descriptor address - SMIH->SMIH_ADMA_SYSTEM_ADDRESS0_REGISTER = (uint16_t)admaDespTableAddress; - SMIH->SMIH_ADMA_SYSTEM_ADDRESS1_REGISTER = (uint16_t)(admaDespTableAddress >> 16u); - } - // Configure block size - SMIH->SMIH_BLOCK_SIZE_REGISTER_b.TRANSFER_BLOCK_SIZE = pTransfer->data->blockSize; - SMIH->TRANSFER_MODE_REGISTER_b.DATA_TRANSFER_DIRECTION_SELECT = pTransfer->data->direction; - - if ((modesConfig->admaMode) && (pTransfer->data->data != NULL)) { - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE = 1; - } else { - SMIH->TRANSFER_MODE_REGISTER_b.DMA_ENABLE = 0; - } - - SMIH->SMIH_TIMEOUT_CONTROL_REGISTER_b.DATA_TIMEOUT_COUNTER_VALUE = 0xC; - - // Configure the CMD register to send the command. - if (pTransfer->data->data == NULL) { - commandCfg.dataPresentSelect = 0; - } else { - commandCfg.dataPresentSelect = 1; - } - commandCfg.cmdArgument = pTransfer->command->cmdArg; - commandCfg.cmdIndex = pTransfer->command->cmdIdx & 0x3F; - - if ((commandCfg.cmdIndex == 53) && (pTransfer->command->cmdArg & BIT(27))) { - // multiple block mode - SMIH->TRANSFER_MODE_REGISTER_b.BLOCK_COUNT_ENABLE = 0x1; - SMIH->TRANSFER_MODE_REGISTER_b.MULTI_OR_SINGLE_BLOCK_SELECT = 0x1; - SMIH->SMIH_BLOCK_COUNT_REGISTER = pTransfer->data->blockCount; - } else { - // single block mode - SMIH->TRANSFER_MODE_REGISTER_b.BLOCK_COUNT_ENABLE = 0x0; - SMIH->TRANSFER_MODE_REGISTER_b.MULTI_OR_SINGLE_BLOCK_SELECT = 0x0; - SMIH->SMIH_BLOCK_COUNT_REGISTER = pTransfer->data->blockCount; - } - - switch (pTransfer->command->responseTypeSelect) { - case SMIH_NO_RESPONSE: - commandCfg.responseTypeSelect = SMIH_NO_RESPONSE; - commandCfg.cmdIndexCheckEn = 0; - commandCfg.cmdCrcCheckEn = 0; - break; - case SMIH_RESPONSE_R2: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_136; - commandCfg.cmdIndexCheckEn = 0; - commandCfg.cmdCrcCheckEn = 1; - break; - case SMIH_RESPONSE_R3R4: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_48; - commandCfg.cmdIndexCheckEn = 0; - commandCfg.cmdCrcCheckEn = 0; - break; - case SMIH_RESPONSE_R1R5R6R7: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_48; - commandCfg.cmdIndexCheckEn = 1; - commandCfg.cmdCrcCheckEn = 1; - break; - case SMIH_RESPONSE_R1BR5B: - commandCfg.responseTypeSelect = SMIH_RESPONSE_LENGTH_48BIT_BUSY_CHECK; - commandCfg.cmdIndexCheckEn = 1; - commandCfg.cmdCrcCheckEn = 1; - break; - default: - return INVALID_PARAMETERS; - } - - commandCfg.autoCmdType = DISABLE_AUTO_CMD; - - if (CommandInProgress != NULL) { - return ERROR_OPERATION_INPROGRESS; - } - commandCfg.cmdType = NORMAL_CMD; - - // set current command to global value for callback - CommandInProgress = pTransfer; - - // send command - smih_command_xfer(&commandCfg); - - // wait command line to be stable - while (1) { - if (event.commandComplete) { - event.commandComplete = 0; - break; - } - // check for error interrupt - if (RSI_OK != smih_check_for_error_interrupt()) { - return ERROR_SMIH; - } - - // wait until card inserts - while (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_STATE_STABLE != 0x1) - ; - if (SMIH->SMIH_PRESENT_STATE_REGISTER_b.CARD_INSERTED == 0) { - return ERROR_TIMEOUT; - } - } - // get response data - if (RSI_OK != smih_get_response((uint16_t *)pTransfer->command->response, sizeof(pTransfer->command->response) / 2)) { - return ERROR_SMIH; - } - if (pTransfer->data->data != 0) { - if (pTransfer->command->cmdIdx == 53) { - if ((pTransfer->command->cmdArg) & BIT(31)) { - // send data to card - if (RSI_OK != smih_send_data(pTransfer)) { - return ERROR_SMIH; - } - } else { - // read data from card - if (RSI_OK != smih_receive_data(pTransfer)) { - return ERROR_SMIH; - } - } - } - } - CommandInProgress = NULL; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void RegisterCallBack(ARM_SMIH_SignalEvent_t Event) - * @brief This API is used to register the call back handler - * @param[in] Event : Call back handler to register - * @return none - */ -void RegisterCallBack(ARM_SMIH_SignalEvent_t Event) -{ - event.callb_event = Event; -} -#endif diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_vad.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_vad.c deleted file mode 100644 index 16a9b4eb0..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_vad.c +++ /dev/null @@ -1,516 +0,0 @@ -/******************************************************************************* -* @file rsi_vad.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -#include "rsi_ccp_user_config.h" - -volatile static VAD_EVENT_T event; -#if 1 - -/*==============================================*/ -/** - * @fn VAD_PING_IRQHandler() - * @brief VAD IRQ handler , clear the VAD interrupt. - * @return none - */ -void VAD_PING_IRQHandler() -{ - RSI_VAD_InterruptClr(VAD, 1); - event.callb_event(VAD_INTR); -} -#endif - -/*==============================================*/ -/** - * @fn rsi_error_t VAD_Init(VAD_SignalEvent_t Event) - * @brief This API is used to configure the VAD related parameters. - * @param[in] Event : Register callback event. - * @return Execution status - If success - */ -rsi_error_t VAD_Init(VAD_SignalEvent_t Event) -{ - // Register callback event - event.callb_event = Event; -#if defined(CHIP_9118) - RSI_PS_UlpssPeriPowerUp(ULPSS_PWRGATE_ULP_VAD); -#endif - - if (!(event.clk_config)) { - // Configure the fast and slow clock for VAD - RSI_ULPSS_VadClkConfig(ULPCLK, ULP_VAD_32KHZ_RC_CLK, ULP_VAD_32MHZ_RC_CLK, 4); - event.clk_config = 1U; - } - - // Select the algorithm and algorithm threshold for VAD - RSI_VAD_SetAlgorithmThreshold(VAD, VAD_METHOD_ZCR_ACF, VAD_ZCR_THRSHOLD, VAD_ACF_THRSHOLD, 0, 0); - - // Configure the sample per frame and sample per address for VAD - RSI_VAD_Config(VAD, NUMBER_OF_SAMPLE_IN_FRAME, VAD_2SMPLS_PER_ADDR, 1, VAD_INTREG_SOURCE); - - // Set the start delay and end delay for ACF algorithm - RSI_VAD_Set_Delay(VAD, VAD_ACF_START, VAD_ACF_END); - - // Set energy threshold value */ - RSI_VAD_FrameEnergyConfig(VAD, VAD_ENERGY_THRSHOLD, 1, 1); - - RSI_VAD_PingPongMemoryAddrConfig(VAD, VAD_SCRT_PAD, 0, 1, 0); - - // Enable Nvic - NVIC_EnableIRQ(VAD_INTR_PING_IRQn); - - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn int32_t VAD_Process(int16_t *wr_buf, int32_t dc_est) - * @brief This API is used to process VAD data. - * @param[in] wr_buf : Input data buffer - * @param[in] dc_est : dc estimation value of previous 1023 samples. - * @return The dc estimation value of current 1023 samples - If success - */ -int32_t VAD_Process(int16_t *wr_buf, int32_t dc_est) -{ - uint8_t energy_status = 0; - uint16_t index; - int32_t dc_est1 = 0; - int16_t temp_data = 0, data_in1 = 0; - static uint8_t flag = 1; - RSI_VAD_Stop(VAD); - dc_est = dc_est >> 10; - - for (index = 0; index < (NUMBER_OF_SAMPLE_IN_FRAME); index++) { - data_in1 = wr_buf[index]; -#if DATA_FROM_INTER_ADC - if (data_in1 & BIT(11)) { - data_in1 = data_in1 | (VAD_MASK_VALUE); - } else { - data_in1 = data_in1; - } -#else - data_in1 = data_in1; -#endif - dc_est1 = dc_est1 + data_in1; - temp_data = data_in1 - dc_est; - temp_data = temp_data << VAD_DIGITAL_GAIN_FAC; - // fill data in VAD ping memory - ((*(volatile uint16_t *)(ULP_MEMORY_BASE + VAD_SCRT_PAD + index * 2))) = temp_data; - } - - if ((dc_est == 0) && (flag == 1)) { - RSI_VAD_Stop(VAD); - flag = 0; - } else { - for (index = 0; index < (32); index++) { - // fill data in VAD register - VAD->VAD_CONF_REG8 = ((*(volatile uint16_t *)(ULP_MEMORY_BASE + VAD_SCRT_PAD + index * 2))) | BIT(10); - } - for (index = 0; index < (NUMBER_OF_SAMPLE_IN_FRAME); index++) { - // fill data in VAD register - VAD->VAD_CONF_REG8 = ((*(volatile uint16_t *)(ULP_MEMORY_BASE + VAD_SCRT_PAD + index * 2))) | BIT(10); - } - } - - energy_status = RSI_VAD_ProccessDone(VAD); - - if (energy_status) { - // Enable Fast clock for VAD for fast post processing - RSI_VAD_FastClkEnable(ULP_VAD_32MHZ_RC_CLK, 0); - event.callb_event(VAD_ENERGY_DETECT); - } - return dc_est1; -} - -/*==============================================*/ -/** - * @fn rsi_error_t VAD_Deinit(void) - * @brief This API is used to deinitialize the VAD related parameters. - * @return Execution status - If success - */ -rsi_error_t VAD_Deinit(void) -{ - RSI_ULPSS_PeripheralDisable(ULPCLK, ULP_VAD_CLK); -#if defined(CHIP_9118) - RSI_PS_UlpssPeriPowerDown(ULPSS_PWRGATE_ULP_VAD); -#endif - event.clk_config = 0U; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void RSI_VAD_PingPongMemoryAddrConfig(RSI_VAD_T *pVAD, - * uint32_t ping_addr, - * uint32_t pong_addr, - * uint8_t ping_enable, - * uint8_t pong_enable) - * @brief This API is used to write the ulp mem address for pong buffer and ping buffer - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] ping_addr : 13 bit ulp mem address offset for ping buffer - * @param[in] pong_addr : 13 bit ulp mem address offset for pong buffer - * @param[in] ping_enable : This parameter enable the ping address configuration. - * @param[in] pong_enable : This parameter enable the pong address configuration. - * @return none - */ -void RSI_VAD_PingPongMemoryAddrConfig(RSI_VAD_T *pVAD, - uint32_t ping_addr, - uint32_t pong_addr, - uint8_t ping_enable, - uint8_t pong_enable) -{ - if (ping_enable) { - pVAD->VAD_CONF_REG9_b.PING_ADDR = (ping_addr >> 2); - } - if (pong_enable) { - pVAD->VAD_CONF_REG9_b.PONG_ADDR = (pong_addr >> 2); - } -} - -/*==============================================*/ -/** - * @fn RSI_VAD_Config() - * @brief This API is used to configure the VAD parameter - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] samples_per_frame : Number of samples in one processing frame, maximum value is 1023 and - * default is 512 - * @param[in] samples_per_address : Number of samples for address \n - * 0 - 4 samples per address - * 1 - 2 Samples per address - * 2 - 1 Sample per address - * @param[in] fullwidth : 0 - 12/24 when VAD_REG1_ADDR[21:20] - * 1 - 2 Samples per address - * @param[in] datasourceselect : Source of Data for VAD processing - * 00/10: Internal Register - * 11: ADC as source - * 01: Reserved - * @return RSI_OK - If success - */ -rsi_error_t RSI_VAD_Config(RSI_VAD_T *pVAD, - uint16_t samples_per_frame, - uint16_t samples_per_address, - bool fullwidth, - uint8_t datasourceselect) -{ - if ((samples_per_frame > MAXIMUM_VALUE_1024) || (samples_per_address > MAXIMUM_VALUE_4) - || (datasourceselect > MAXIMUM_VALUE_4)) { - return INVALID_PARAMETERS; - } - // Set the samples_per_frame and samples per address for VAD - pVAD->VAD_CONF_REG1_b.SAMPLS_PER_FRAME = samples_per_frame; - pVAD->VAD_CONF_REG1_b.SMPLS_PER_ADDR = samples_per_address; - pVAD->VAD_CONF_REG1_b.FULL_WIDTH = fullwidth; //need to be review this parameter - // selecting the Source of Data for VAD processing - pVAD->VAD_CONF_REG7_b.DATA_SOURCE_SELECT = datasourceselect; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void RSI_VAD_Enable(RSI_VAD_T *pVAD) - * @brief This API is used to Enable Processing of VAD - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @return none - */ -void RSI_VAD_Enable(RSI_VAD_T *pVAD) -{ - pVAD->VAD_CONF_REG8_b.EN_VAD_PROCESS = 1U; -} - -/*==============================================*/ -/** - * @fn RSI_VAD_InterruptClr() - * @brief This API is used to clear the interrupt of VAD - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] ping_interrupt : This parameter define which interrupt want to be clear. - * ping_interrupt = 1 , To clear the VAD ping interrupt. - * ping_interrupt = 0 , To clear the VAD pong interrupt. - * @return none - */ -void RSI_VAD_InterruptClr(RSI_VAD_T *pVAD, uint16_t ping_interrupt) -{ - if (ping_interrupt) { - // clear the ping interrupt in VAD_CONF_REG9 register - pVAD->VAD_CONF_REG9_b.PING_INT_CLEAR = 1U; - } else { - // clear the pong interrupt in VAD_CONF_REG9 register - pVAD->VAD_CONF_REG9_b.PONG_INT_CLEAR = 1U; - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_VAD_SetAlgorithmThreshold(RSI_VAD_T *pVAD, - * uint16_t algorithm_type, - * uint32_t zcr_threshold, - * uint32_t acf_threshold, - * uint32_t wacf_threshold, - * VAD_AMDF_THRESHOLD_T *config) - * @brief This API is used to set algorithm and threshold value for that algorithm. - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] algorithm_type : Select the algorithm type here refer this #VAD_ALGORITHM_SELECT_T enum. - * pass the specific value for selection of algorithm - * @param[in] zcr_threshold : This parameter define threshold value for zcr algorithm maximum value is 1023 - * and default value is 50. - * @param[in] acf_threshold : This parameter define threshold value for acf algorithm maximum value is 4095 - * and default value is 1024. - * @param[in] admf_threshold : This parameter define threshold value for acf algorithm maximum value is 4095 - * and default value is 1024. - * @param[in] wacf_threshold : This parameter define threshold value for wacf_threshold algorithm maximum value is 4095 - * and default value is 51. - * @param[in] config : VAD_AMDF_THRESHOLD_T structure veriable, configure this structure - * for AMDF algorithm delay. - * @return RSI_OK - If success - */ -rsi_error_t RSI_VAD_SetAlgorithmThreshold(RSI_VAD_T *pVAD, - uint16_t algorithm_type, - uint32_t zcr_threshold, - uint32_t acf_threshold, - uint32_t wacf_threshold, - VAD_AMDF_THRESHOLD_T *config) -{ - if ((algorithm_type > MAXIMUM_VALUE_8) || (zcr_threshold > MAXIMUM_VALUE_1024) || (acf_threshold > MAXIMUM_VALUE_4096) - || (wacf_threshold > MAXIMUM_VALUE_4096)) { - return INVALID_PARAMETERS; - } - // set the required the algorithm for detection purpose - pVAD->VAD_CONF_REG7_b.CHOOSE_VAD_METHOD = algorithm_type; - - switch (algorithm_type) { - case ZCR: - // write the threshold value to smpls_zero_cross bits - pVAD->VAD_CONF_REG2_b.SMPLS_ZERO_CROSS = zcr_threshold; - break; - case ACF: - // To clear the threshold_acf bits - pVAD->VAD_CONF_REG4_b.THRESHOLD_ACF = acf_threshold; - break; - case AMDF: - pVAD->VAD_CONF_REG5_b.THRESHOLD_NULL = config->null_threshold; - pVAD->VAD_CONF_REG5_b.THRESHOLD_NULL_COUNT = config->null_threshold_count; - pVAD->VAD_CONF_REG6_b.THRESHOLD_PEAK = config->peak_threshold; - pVAD->VAD_CONF_REG6_b.THRESHOLD_PEAK = config->peak_threshold_count; - break; - case WACF: - // write the threshold value to smpls_zero_cross bits - pVAD->VAD_CONF_REG4_b.THRESHOLD_WACF = wacf_threshold; - break; - case ZCR_ACF_AMDF_WACF: - pVAD->VAD_CONF_REG2_b.SMPLS_ZERO_CROSS = zcr_threshold; - pVAD->VAD_CONF_REG4_b.THRESHOLD_ACF = acf_threshold; - pVAD->VAD_CONF_REG5_b.THRESHOLD_NULL = config->null_threshold; - pVAD->VAD_CONF_REG5_b.THRESHOLD_NULL_COUNT = config->null_threshold_count; - pVAD->VAD_CONF_REG6_b.THRESHOLD_PEAK = config->peak_threshold; - pVAD->VAD_CONF_REG6_b.THRESHOLD_PEAK = config->peak_threshold_count; - pVAD->VAD_CONF_REG4_b.THRESHOLD_WACF = wacf_threshold; - break; - case ZCR_ACF: - pVAD->VAD_CONF_REG2_b.SMPLS_ZERO_CROSS = zcr_threshold; - pVAD->VAD_CONF_REG4_b.THRESHOLD_ACF = acf_threshold; - break; - case ZCR_AMDF: - pVAD->VAD_CONF_REG2_b.SMPLS_ZERO_CROSS = zcr_threshold; - pVAD->VAD_CONF_REG5_b.THRESHOLD_NULL = config->null_threshold; - pVAD->VAD_CONF_REG5_b.THRESHOLD_NULL_COUNT = config->null_threshold_count; - pVAD->VAD_CONF_REG6_b.THRESHOLD_PEAK = config->peak_threshold; - pVAD->VAD_CONF_REG6_b.THRESHOLD_PEAK = config->peak_threshold_count; - break; - case ZCR_WACF: - pVAD->VAD_CONF_REG2_b.SMPLS_ZERO_CROSS = zcr_threshold; - pVAD->VAD_CONF_REG4_b.THRESHOLD_WACF = wacf_threshold; - break; - default: - return INVALID_PARAMETERS; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_VAD_Set_Delay(RSI_VAD_T *pVAD, uint16_t startdelayval, uint16_t enddelayval) - * @brief This API is used to set start the end delay value for ACF,WACF,AMDF algorithm . - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] startdelayval : This parameter define the start delay value for ACF,WACF,AMDF algorithm. - * maximum value is 1023 and default value is 2 - * @param[in] enddelayval : This parameter define the end delay value for ACF,WACF,AMDF algorithm. - * maximum value is 1023 and default value is 16 - * @return RSI_OK - If success - */ -rsi_error_t RSI_VAD_Set_Delay(RSI_VAD_T *pVAD, uint16_t startdelayval, uint16_t enddelayval) -{ - if ((startdelayval > MAXIMUM_VALUE_1024) || (enddelayval > MAXIMUM_VALUE_1024)) { - return INVALID_PARAMETERS; - } - // start delay - pVAD->VAD_CONF_REG7_b.START_DELAY_VAL = startdelayval; - // End delay - pVAD->VAD_CONF_REG7_b.END_DELAY_VAL = enddelayval; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_VAD_Input(RSI_VAD_T *pVAD, int16_t data) - * @brief This API is used to give the input for VAD. - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] data : This parameter input for VAD block input is 1023 and default value is 16 - * @return RSI_OK - If success - */ -rsi_error_t RSI_VAD_Input(RSI_VAD_T *pVAD, int16_t data) -{ - if (data > MAXIMUM_VALUE_1024) { - return INVALID_PARAMETERS; - } - pVAD->VAD_CONF_REG8_b.EN_VAD_PROCESS = 1U; - /* Writing the data used as source for VAD */ - pVAD->VAD_CONF_REG8_b.INP_DATA = data; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_VAD_FrameEnergyConfig(RSI_VAD_T *pVAD, - * uint32_t threshold_frame_energy, - * uint32_t threshold_smpl_collect, - * uint32_t prog_smpls_for_energy_check) - * @brief This API is used to configure the frame energy. - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] threshold_frame_energy : This parameter give the threshold frame energy, - * maximum value is 1023 and default value is 0. - * @param[in] threshold_smpl_collect : This parameter give the number of threshold sample collect, - * maximum value is 1023 and default value is 1. - * @param[in] prog_smpls_for_energy_check : This parameter define the sample for energy check, - * maximum value is 3 and default value is 1. - * @return RSI_OK - If success - */ -rsi_error_t RSI_VAD_FrameEnergyConfig(RSI_VAD_T *pVAD, - uint32_t threshold_frame_energy, - uint32_t threshold_smpl_collect, - uint32_t prog_smpls_for_energy_check) -{ - if ((threshold_frame_energy > MAXIMUM_VALUE_1024) || (threshold_smpl_collect > MAXIMUM_VALUE_1024) - || (prog_smpls_for_energy_check > MAXIMUM_VALUE_4)) { - return INVALID_PARAMETERS; - } - pVAD->VAD_CONF_REG3_b.THRESHOLD_FRAME_ENERGY = threshold_frame_energy; - pVAD->VAD_CONF_REG3_b.THRESHOLD_SMPL_COLLECT = threshold_smpl_collect; - pVAD->VAD_CONF_REG3_b.PROG_SMPLS_FOR_ENERGY_CHECK = prog_smpls_for_energy_check; - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn void RSI_VAD_Stop(RSI_VAD_T *pVAD) - * @brief This API is used to disable VAD functionality. - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @return none - */ -void RSI_VAD_Stop(RSI_VAD_T *pVAD) -{ - pVAD->VAD_CONF_REG8_b.EN_VAD_PROCESS = 0; -} - -/*==============================================*/ -/** - * @fn uint8_t RSI_VAD_ProccessDone(RSI_VAD_T *pVAD) - * @brief This API is used show the VAD energy detect. - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @return The VAD energy detection status. - * If 1 - Energy detect. - * If 0 - No energy detect. - */ -uint8_t RSI_VAD_ProccessDone(RSI_VAD_T *pVAD) -{ - return pVAD->VAD_CONF_REG8_b.VAD_PROC_DONE; -} - -/*==============================================*/ -/** - * @fn void RSI_VAD_FastClkEnable(uint16_t fast_clk_sel, uint16_t clk_div_factor) - * @brief This API is used enable fast clock for VAD peripheral. - * @param[in] fast_clk_sel : fast clock select for VAD peripheral - * @param[in] clk_div_factor : Select the clock division factor for VAD peripheral - * @return none - */ -void RSI_VAD_FastClkEnable(uint16_t fast_clk_sel, uint16_t clk_div_factor) -{ - ULPCLK->ULP_VAD_CLK_GEN_REG_b.ULP_VAD_FCLK_EN = 1U; - ULPCLK->ULP_VAD_CLK_GEN_REG_b.ULP_VAD_FCLK_SEL = fast_clk_sel; - ULPCLK->ULP_VAD_CLK_GEN_REG_b.ULP_VAD_CLKDIV_FACTOR = clk_div_factor; -} - -/*==============================================*/ -/** - * @fn int32_t RSI_VAD_ProcessData(RSI_VAD_T *pVAD, - * uint32_t vad_addr, - * uint32_t adc_data_addr, - * int32_t dc_est, - * uint32_t dig_scale, - * uint32_t sample_len) - * @brief This API is used process data for input to VAD. - * @param[in] pVAD : Pointer to the VAD_Type structure. - * @param[in] vad_addr : VAD ULPSS memory address - * @param[in] adc_data_addr : ADC output data address - * @param[in] dc_est : dc estimation value. - * @param[in] dig_scale : Scaling the ADC output. - * @param[in] sample_len : Number of samples to process in VAD engine. - * @return dc estimation value - If success - */ -int32_t RSI_VAD_ProcessData(RSI_VAD_T *pVAD, - uint32_t vad_addr, - uint32_t adc_data_addr, - int32_t dc_est, - uint32_t dig_scale, - uint32_t sample_len) -{ - uint32_t index; - int32_t dc_est1 = 0; - int16_t temp_data = 0, data_in1 = 0; - static uint8_t flag = 1; - RSI_VAD_Stop(VAD); - - // processing the adc sample - for (index = 0; index < (sample_len); index++) { - data_in1 = ((*(volatile uint16_t *)(adc_data_addr + index * 2))); - - if (data_in1 & BIT(11)) { - data_in1 = data_in1 | (VAD_MASK_VALUE); - } else { - data_in1 = data_in1; - } - dc_est1 = dc_est1 + data_in1; - temp_data = data_in1 - dc_est; - temp_data = temp_data << dig_scale; - // fill data in VAD ping memory - ((*(volatile uint16_t *)(ULP_MEMORY_BASE + vad_addr + index * 2))) = temp_data; - } - - if ((dc_est == 0) && (flag == 1)) { - RSI_VAD_Stop(VAD); - flag = 0; - } else { - for (index = 0; index < (32); index++) { - /* fill data in VAD register */ - pVAD->VAD_CONF_REG8 = ((*(volatile uint16_t *)(ULP_MEMORY_BASE + vad_addr + index * 2))) | BIT(10); - } - for (index = 0; index < (sample_len); index++) { - // fill data in VAD register - pVAD->VAD_CONF_REG8 = ((*(volatile uint16_t *)(ULP_MEMORY_BASE + vad_addr + index * 2))) | BIT(10); - } - } - return dc_est1; -} diff --git a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_wurx.c b/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_wurx.c deleted file mode 100644 index cb1e44ba1..000000000 --- a/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/rsi_wurx.c +++ /dev/null @@ -1,716 +0,0 @@ -/******************************************************************************* -* @file rsi_wurx.c -* @brief -******************************************************************************* -* # License -* Copyright 2022 Silicon Laboratories Inc. www.silabs.com -******************************************************************************* -* -* The licensor of this software is Silicon Laboratories Inc. Your use of this -* software is governed by the terms of Silicon Labs Master Software License -* Agreement (MSLA) available at -* www.silabs.com/about-us/legal/master-software-license-agreement. This -* software is distributed to you in Source Code format and is governed by the -* sections of the MSLA applicable to Source Code. -* -******************************************************************************/ - -// Include Files - -/*==============================================*/ -/** - * @fn void RSI_WURX_Init(uint16_t bypass_l1_enable, uint16_t l1_freq_div, uint16_t l2_freq_div) - * @brief This API is used to initialization of l1 and l2 frequency as well as enable wurx. - * @param[in] bypass_l1_enable : Enable or disable the bypass functionality of level1 - * @param[in] l1_freq_div : Set the level1 frequency by using division factor ,This parameter define frequency. - * Ranges : 32 khz incoming clock then following option - * 0 : 0.125 khz, 1: 0.250 Khz, 2: 0.5 khz ,3: 1 khz, default : 2 khz - * Ranges : 64 khz incoming clock then following option - * 0 : 0.25 khz, 1: 0.5 Khz, 2: 1 khz ,3: 2 khz - * @param[in] l2_freq_div : Set the level2 frequency by using division factor ,This parameter define frequency. - * Ranges : 32 khz incoming clock then following option - * 0 : 4 khz, 1: 8 Khz, 2: 16 khz ,3: 32 khz - * Ranges : 64 khz incoming clock then following option - * 0 : 8 khz, 1: 16 Khz, 2: 32 khz ,3: 64 khz - * @return none - */ -void RSI_WURX_Init(uint16_t bypass_l1_enable, uint16_t l1_freq_div, uint16_t l2_freq_div) -{ - // Wait for Out of reset - while (!(WURX_MANUAL_CALIB_MODE_REG2 & 0x000001)) - ; - while (!(WURX_CORR_DET_READ_REG & 0x000002)) - ; - - // Bypass L1 pattern - WURX_BYPASS_LEVEL1_AND_FREQ |= (bypass_l1_enable << POS21); - - if (bypass_l1_enable) { - // Do nothing here - } else { - // Clear the frequency for L1 level pattern - WURX_BYPASS_LEVEL1_AND_FREQ &= ~(0x7 << POS18); - // Freq L1 pattern (3 : 32Khz, 2 : 16Khz, 1 : 8Khz, 0 : 4Khz) for 32KHz Clock - WURX_BYPASS_LEVEL1_AND_FREQ |= (l1_freq_div << POS18); - } - // Configure L2 pattern - // Clear the frequency for L2 pattern - WURX_BYPASS_LEVEL1_AND_FREQ &= ~(0x3 << POS16); - // Freq L2 pattern (3 : 32Khz, 2 : 16Khz, 1 : 8Khz, 0 : 4Khz) for 32KHz Clock - WURX_BYPASS_LEVEL1_AND_FREQ |= (l2_freq_div << POS16); - - WURX_ENABLE_AND_AAC_DET_REG |= (BIT(1) | BIT(0)); -} - -/*==============================================*/ -/** - * @fn void RSI_IPMU_40MhzClkCalib(uint16_t clk_enable, uint32_t channel_selection_value) - * @brief This API is used to calculate the 40MHZ VCO calibration. - * @param[in] clk_enable : Clock enable - * @param[in] channel_selection_value : This parameter define on which channel frequency use for transmission. - * E.g. If channel 11 use for transmission the channel_11 = 2475. - * channel_selection_value = (((channel_11)/(cal_clock*2)) * 2^6) - * So [channel_selection_value =(((2475)/(40*2)) * 2^6) - * Note : Refer RSI_WURX_CalVCOCalFreq() API ,its return calculated value. - * @return none - */ -void RSI_IPMU_40MhzClkCalib(uint16_t clk_enable, uint32_t channel_selection_value) -{ - volatile uint32_t cntr = 0, lco_coarse = 0, lco_fine = 0, chnl_freq = 0, coarse_word = 0, fine_word = 0; - - if (clk_enable) { - chnl_freq = channel_selection_value; - // vco manual - WURX_MANUAL_CALIB_MODE_REG1 &= ~(BIT(21)); - // NPSS REF Clock Cleaner OFF = 1 - ULPCLKS_REFCLK_REG |= (BIT(17)); - // NPSS REF Clock Cleaner ON = 0 by default is one - ULPCLKS_REFCLK_REG &= ~(BIT(18)); - // NPSS REF CLOCK Mux to SPI - ULPCLKS_REFCLK_REG &= ~(BIT(16)); - // Ulp_clk 32Mhz clock for Calibration - ULPCLKS_REFCLK_REG |= (BIT(21)); - // wait - for (cntr = 0; cntr < (10 * 4); cntr++) { - __ASM("nop"); - } - // NPSS REF Clock Cleaner ON = 1 - ULPCLKS_REFCLK_REG |= (BIT(18)); - // NPSS REF Clock Cleaner OFF = 0 - ULPCLKS_REFCLK_REG &= ~(BIT(17)); - - // Configure the frequency of reference clock as 0x400 - WURX_AAC_MODE_REG |= ((0x1 << POS20) | (REF_CLOCK_FREQ << POS7)); - - // Configure the receive channel frequency - WURX_LCO_FREQ_CALIB_REG |= ((BIT(13) | channel_selection_value)); - - // Checking the calibration done - while (!(WURX_TEST_MODE_REG & 0x000002)) - ; - while ((WURX_TEST_MODE_REG & 0x000002)) - ; - - // Read the LCO coarse and fine word - lco_coarse = ((WURX_MANUAL_CALIB_MODE_REG2) & (0x3E00)); - lco_fine = ((WURX_MANUAL_CALIB_MODE_REG2) & (0x3FC000)); - coarse_word = lco_coarse >> 9; - fine_word = lco_fine >> 14; - - // Calculating proper LCO fine word - while (fine_word == 255) { - chnl_freq = (chnl_freq - 4); - - WURX_MANUAL_CALIB_MODE_REG1 &= ~(BIT(21)); - // NPSS REF Clock Cleaner OFF = 1 - ULPCLKS_REFCLK_REG |= (BIT(17)); - // NPSS REF Clock Cleaner ON = 0 by default is one - ULPCLKS_REFCLK_REG &= ~(BIT(18)); - // NPSS REF CLOCK Mux to SPI - ULPCLKS_REFCLK_REG &= ~(BIT(16)); - // Ulp_clk 32Mhz clock for Calibration - ULPCLKS_REFCLK_REG |= (BIT(21)); - // wait - for (cntr = 0; cntr < (10 * 4); cntr++) { - __ASM("nop"); - } - // NPSS REF Clock Cleaner ON = 1 - ULPCLKS_REFCLK_REG |= (BIT(18)); - // NPSS REF Clock Cleaner OFF = 0 - ULPCLKS_REFCLK_REG &= ~(BIT(17)); - - // Configure the frequency of reference clock as 0x400 - WURX_AAC_MODE_REG |= ((0x1 << POS20) | (REF_CLOCK_FREQ << POS7)); - WURX_LCO_FREQ_CALIB_REG &= ~(0x000fff); - - // Configure new receive channel frequency - WURX_LCO_FREQ_CALIB_REG |= ((BIT(13) | (chnl_freq))); - - // Checking the calibration done - while (!(WURX_TEST_MODE_REG & 0x000002)) - ; - while ((WURX_TEST_MODE_REG & 0x000002)) - ; - - fine_word = ((WURX_MANUAL_CALIB_MODE_REG2) & (0x3FC000)) >> 14; - - if (fine_word < 255) { - coarse_word = (coarse_word + 1); - fine_word = (fine_word - 7 * (channel_selection_value - chnl_freq)); - } - } - // Modified the LCO fine and coarse word - lco_fine = fine_word - 6; - lco_coarse = coarse_word; - - // Write the LCO fine and coarse word manual calibration register - ULP_SPI_MEM_MAP(0x87) = 0x3F8000; - WURX_MANUAL_CALIB_MODE_REG1 = BIT(21) | lco_fine << POS13 | lco_coarse << POS8; - ULP_SPI_MEM_MAP(0x87) = 0x000000; - - for (cntr = 0; cntr < 4000 * 4; cntr++) { - __ASM("nop"); - } - - // Disable the calibration clock - WURX_AAC_MODE_REG &= ~(BIT(19) | BIT(20)); - ULPCLKS_REFCLK_REG |= (BIT(17)); - ULPCLKS_REFCLK_REG &= ~(BIT(18)); - } else { - WURX_AAC_MODE_REG &= ~(BIT(19) | BIT(20)); - /* NPSS Ref Clock CLeaner OFF */ - ULPCLKS_REFCLK_REG |= (BIT(17)); - ULPCLKS_REFCLK_REG &= ~(BIT(18)); - } - return; -} - -/*==============================================*/ -/** - * @fn void RSI_IPMU_DCCalib() - * @brief This API is used to calculate the manual DC calibration as well as enable periodic detection enable - * @return none - */ -void RSI_IPMU_DCCalib() -{ - uint16_t j, cal_val_ref = 0, det_ref = 0, cal_val = 0, i; - uint32_t cntr = 0; - - // Set manual dc calibration mode - WURX_COMP_OFFSET_CALIB_REG |= ((VAL1 << POS10) | (DC_OFFSET_VALUE << POS3) | (VAL2 << POS1)); - - // Enable the continuous calibration mode - WURX_ENABLE_AND_AAC_DET_REG |= BIT(2); - - // Calculate the appropriate detection reference shift value - for (i = 0; i <= 15; i++) { - WURX_LNA_IF_REG = (DETECTION_REF_SHIFT - i); - for (cntr = 0; cntr < 120000; cntr++) { - __ASM("nop"); - } - cal_val_ref = ((WURX_MANUAL_CALIB_MODE_REG1 & 0xFE) >> 1); - - if (cal_val_ref <= 100 && cal_val_ref >= 50) { - det_ref = 0; - for (j = 0; j <= 5; j++) { - for (cntr = 0; cntr < 120000; cntr++) { - __ASM("nop"); - } - cal_val = ((WURX_MANUAL_CALIB_MODE_REG1 & 0xFE) >> 1); - if (cal_val >= cal_val_ref - 3 && cal_val <= cal_val_ref + 3) { - det_ref++; - } - } - if (j == det_ref) { - break; - } - } - } -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_CorrEnable(uint16_t wurx_enable) - * @brief This API is used enable wurx correlation. - * @param[in] wurx_enable : Enable wurx correlation - * @return none - */ -void RSI_WURX_CorrEnable(uint16_t wurx_enable) -{ - if (wurx_enable) { - // Correlation Enable - MCU_FSM->MCU_FSM_CRTL_PDM_AND_ENABLES |= (BIT(1)); - } else { - // Disable wurx and clk_en - MCU_FSM->MCU_FSM_CRTL_PDM_AND_ENABLES &= ~(BIT(1)); - } -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_SetWakeUpThreshold(uint16_t threshold_1, uint16_t threshold_2) - * @brief This API is used set up threshold value for operation. - * @param[in] threshold_1 : Threshold value for pattern1. - * @param[in] threshold_2 : Threshold value for pattern2. - * @return none - */ -void RSI_WURX_SetWakeUpThreshold(uint16_t threshold_1, uint16_t threshold_2) -{ - // clear bit9 to 14 - WURX_CORR_CALIB_REG &= ~(THRESH_CLR_MASK_VAL << POS9); - // Set threshold value for pattern1 - WURX_CORR_CALIB_REG |= (threshold_1 << POS9); - - // clear bit3 to 8 - WURX_CORR_CALIB_REG &= ~(THRESH_CLR_MASK_VAL << POS3); - // Set threshold value for pattern2 - WURX_CORR_CALIB_REG |= (threshold_2 << POS3); -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_Pattern2DetectionEnable(uint16_t enable) - * @brief This API is used enable pattern2. - * @param[in] enable : Enable the pattern2 detection bit . - * @return none - */ -void RSI_WURX_Pattern2DetectionEnable(uint16_t enable) -{ - if (enable) { - // Pattern2 detection enable - WURX_CORR_CALIB_REG |= BIT(18); - } else { - // Pattern2 detection disable - WURX_CORR_CALIB_REG &= ~BIT(18); - } -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_TailDataDecodeEnable(uint16_t enable, uint16_t data_len) - * @brief This API is used to enable the Tail data decode. - * @param[in] enable : Enable the tail data decode bit. - * @param[in] data_len : Set the detection bit length. - * - 0 for 64 bit - * - 1 for 128 bit - * - 2 for 192 bit - * - 3 for 256 bit - * @return none - */ -void RSI_WURX_TailDataDecodeEnable(uint16_t enable, uint16_t data_len) -{ - if (enable) { - WURX_CORR_CALIB_REG &= ~VAL3; - // WURX Decode Tail bits - WURX_CORR_CALIB_REG |= BIT(2) | data_len; - } else { - WURX_CORR_CALIB_REG &= ~BIT(2); - } -} - -/*==============================================*/ -/** - * @fn rsi_error_t RSI_WURX_GetTailData(uint32_t *tail_data, uint16_t tail_data_len) - * @brief This API is used get the tail data - * @param[in] tail_data : Pointer to store the tail data. - * @param[in] tail_data_len : This parameter define number of bit read in tail data. - * - 0 for 64 bit - * - 1 for 128 bit - * - 2 for 192 bit - * - 3 for 256 bit - * @return Receive pattern tail data - If Success - */ -rsi_error_t RSI_WURX_GetTailData(uint32_t *tail_data, uint16_t tail_data_len) -{ - if (tail_data_len == TAIL_DATA_DECODE_64BIT) { - // get 64 bit tail data - while (!(WURX_CORR_DET_READ_REG & BIT(16))) - ; - RSI_WURX_ReadPattern1Odd(tail_data); - } else if (tail_data_len == TAIL_DATA_DECODE_128BIT) { - // get 128 bit tail data - while (!(WURX_CORR_DET_READ_REG & BIT(17))) - ; - RSI_WURX_ReadPattern1Odd(tail_data); - while (!(WURX_CORR_DET_READ_REG & BIT(16))) - ; - RSI_WURX_ReadPattern1Even(tail_data); - } else if (tail_data_len == TAIL_DATA_DECODE_192BIT) { - // get 192 bit tail data - while (!(WURX_CORR_DET_READ_REG & BIT(17))) - ; - RSI_WURX_ReadPattern1Odd(tail_data); - while (!(WURX_CORR_DET_READ_REG & BIT(16))) - ; - RSI_WURX_ReadPattern1Even(tail_data); - while (!(WURX_CORR_DET_READ_REG & BIT(15))) - ; - RSI_WURX_ReadPattern2Odd(tail_data); - } else if (tail_data_len == TAIL_DATA_DECODE_256BIT) { - // get 256 bit tail data - while (!(WURX_CORR_DET_READ_REG & BIT(17))) - ; - RSI_WURX_ReadPattern1Odd(tail_data); - while (!(WURX_CORR_DET_READ_REG & BIT(16))) - ; - RSI_WURX_ReadPattern1Even(tail_data); - while (!(WURX_CORR_DET_READ_REG & BIT(15))) - ; - RSI_WURX_ReadPattern2Odd(tail_data); - while (!(WURX_CORR_DET_READ_REG & BIT(14))) - ; - RSI_WURX_ReadPattern2Even(tail_data); - } else { - return INVALID_PARAMETERS; - } - return RSI_OK; -} - -/*==============================================*/ -/** - * @fn uint32_t RSI_WURX_CalThershValue(uint32_t bit_length, uint32_t percentage) - * @brief This API is used to calculate the threshold value. - * @param[in] bit_length : Bit length 64 or 32 bit. - * @param[in] percentage : Percentage the calculate the threshold value. - * @return If success - the threshold value. - */ -uint32_t RSI_WURX_CalThershValue(uint32_t bit_length, uint32_t percentage) -{ - return ((percentage * bit_length) / VAL100); -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_Pattern1MatchValue(uint32_t *match_value) - * @brief This API is used set the match value for detection pattern1 purpose. - * @param[in] match_value : Pointer to the Match value. - * @return none - */ -void RSI_WURX_Pattern1MatchValue(uint32_t *match_value) -{ - // Configure MSB match value for pattern1 - WURX_PATTERN1_REG_MSB = match_value[VAL0]; - - // Configure MID match value for pattern1 - WURX_PATTERN1_REG_MID = match_value[VAL1]; - - // Configure LSB match value for pattern1 - WURX_PATTERN1_REG_LSB = match_value[VAL2]; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_Pattern2MatchValue(uint32_t *match_value) - * @brief This API is used set the match value for detection pattern2 purpose. - * @param[in] match_value : Pointer to the Match value. - * @return none - */ -void RSI_WURX_Pattern2MatchValue(uint32_t *match_value) -{ - // Configure MSB match value for pattern2 - WURX_PATTERN2_REG_MSB = match_value[VAL0]; - - // Configure MID match value for pattern2 - WURX_PATTERN2_REG_MID = match_value[VAL1]; - - // Configure LSB match value for pattern2 - WURX_PATTERN2_REG_LSB = match_value[VAL2]; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_SetPatternLength(uint16_t enable, uint16_t l1_len, uint16_t l2_len) - * @brief This API is used set pattern length for wakeup - * @param[in] enable : Enable the set pattern length API. - * @param[in] l1_len : value to decide the l1 pattern length. - * Ranges 0: 2 bits , 1: 4 bits , 2:8 bits 3: 16 bits - * @param[in] l2_len : value to decide the l2 pattern length . - * Ranges 1 : 1 bits, 2: 2 bits, 3: 4 bits - * 4 : 8 bits, 5: 16 bits, 6: 32 bits - * 0,7: 64 bits - * @return none - */ -void RSI_WURX_SetPatternLength(uint16_t enable, uint16_t l1_len, uint16_t l2_len) -{ - if (enable) { - // clear pattern length - WURX_CORR_CALIB_REG &= ~(PATTERN_LEN_CLR_MASK << POS15); - // pattern length - WURX_CORR_CALIB_REG |= l2_len << POS15; - // set pattern length for l1 - WURX_LEVEL1_PATTERN_REG |= (l1_len << POS20); //2 bits pass 1 for 4 bit - } else { - // disable - WURX_CORR_CALIB_REG &= ~(l2_len << POS15); - } -} - -/*==============================================*/ -/** - * @fn uint16_t RSI_WURX_ReadPatternLength() - * @brief This API is used read pattern length - * @return If success - pattern length value - */ -uint16_t RSI_WURX_ReadPatternLength() -{ - uint16_t value; - - // pattern length - value = (WURX_CORR_CALIB_REG & (PATTERN_LEN_MASK)) >> POS15; - - return value; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_AnalogOff() - * @brief This API is used to off the wurx analog block. - * @return none - */ -void RSI_WURX_AnalogOff() -{ - volatile uint32_t spareReg = 0; - - WURX_ENABLE_AND_AAC_DET_REG &= ~(BIT(0)); - spareReg = ULP_SPI_MEM_MAP(IPMU_SPARE_REG2); - spareReg &= ~BIT(20); - ULP_SPI_MEM_MAP(IPMU_SPARE_REG2) = spareReg; - ULP_SPI_MEM_MAP(IPMU_SPARE_REG2) &= ~BIT(21); - WURX_TEST_MODE_REG |= BIT(19); -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_DigitalOff() - * @brief This API is used to off the digital block. - * @return none - */ -void RSI_WURX_DigitalOff() -{ - RSI_IPMU_PowerGateClr(WURX_CORR_PG_ENB | WURX_PG_ENB); -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_ReadPattern1Odd(uint32_t *tail_data) - * @brief This API is used read odd 64 bit in pattern1. - * @param[in] tail_data : Its data where we store the tail data. - * @return none - */ -void RSI_WURX_ReadPattern1Odd(uint32_t *tail_data) -{ - uint32_t read_tail_data = 0; - - // Read 22 LSB bits of odd pattern1 - tail_data[VAL0] = WURX_ODD_PATTERN1_REG_LSB; - - // Read 22 MID bits of odd pattern1 - read_tail_data = WURX_ODD_PATTERN1_REG_MID; - read_tail_data = (read_tail_data << POS22); - - // Write first 10 bits of odd pattern1 MID register in output buffer - tail_data[VAL0] = tail_data[VAL0] | read_tail_data; - read_tail_data = 0; - - // Read MID bits of odd pattern1 - read_tail_data = WURX_ODD_PATTERN1_REG_MID; - read_tail_data = (read_tail_data >> POS10); - - // Write last 12 bits of odd pattern1 MID register in output buffer - tail_data[VAL1] = read_tail_data; - read_tail_data = 0; - - // Read 20 MSB bits of odd pattern1 - read_tail_data = WURX_ODD_PATTERN1_REG_MSB; - read_tail_data = read_tail_data << POS12; - tail_data[VAL1] = tail_data[VAL1] | read_tail_data; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_ReadPattern1Even(uint32_t *tail_data) - * @brief This API is used read even 64 bit in pattern1. - * @param[in] tail_data : Its data where we store the tail data. - * @return none - */ -void RSI_WURX_ReadPattern1Even(uint32_t *tail_data) -{ - uint32_t read_tail_data = 0; - - // Read 22 LSB bits of even pattern1 - tail_data[VAL2] = WURX_EVEN_PATTERN1_REG_LSB; - - // Read 22 MID bits of even pattern1 - read_tail_data = WURX_EVEN_PATTERN1_REG_MID; - read_tail_data = (read_tail_data << POS22); - - // Write first 10 bits of even pattern1 MID register in output buffer - tail_data[VAL2] = tail_data[VAL2] | read_tail_data; - read_tail_data = 0; - - // Read MID bits of even pattern1 - read_tail_data = WURX_EVEN_PATTERN1_REG_MID; - read_tail_data = (read_tail_data >> POS10); - - // Write last 12 bits of even pattern1 MID register in output buffer - tail_data[VAL3] = read_tail_data; - read_tail_data = 0; - - // Read 20 MSB bits of even pattern1 - read_tail_data = WURX_EVEN_PATTERN1_REG_MSB; - read_tail_data = read_tail_data << POS12; - tail_data[VAL3] = tail_data[VAL3] | read_tail_data; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_ReadPattern2Odd(uint32_t *tail_data) - * @brief This API is used read odd 64 bit in pattern2. - * @param[in] tail_data : Its data where we store the tail data. - * @return none - */ -void RSI_WURX_ReadPattern2Odd(uint32_t *tail_data) -{ - uint32_t read_tail_data = 0; - - // Read 22 LSB bits of odd pattern2 - tail_data[VAL4] = WURX_ODD_PATTERN2_REG_LSB; - - // Read 22 MID bits of odd pattern2 - read_tail_data = WURX_ODD_PATTERN2_REG_MID; - read_tail_data = (read_tail_data << POS22); - - // Write first 10 bits of odd pattern1 MID register in output buffer - tail_data[VAL4] = tail_data[VAL4] | read_tail_data; - read_tail_data = 0; - - // Read MID bits of odd pattern2 - read_tail_data = WURX_ODD_PATTERN2_REG_MID; - read_tail_data = (read_tail_data >> POS10); - - // Write last 12 bits of odd pattern2 MID register in output buffer - tail_data[VAL5] = read_tail_data; - read_tail_data = 0; - - // Read 20 MSB bits of odd pattern2 - read_tail_data = WURX_ODD_PATTERN2_REG_MSB; - read_tail_data = read_tail_data << POS12; - tail_data[VAL5] = tail_data[VAL5] | read_tail_data; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_ReadPattern2Even(uint32_t *tail_data) - * @brief This API is used read even 64 bit in pattern2. - * @param[in] tail_data : Its data where we store the tail data. - * @return none - */ -void RSI_WURX_ReadPattern2Even(uint32_t *tail_data) -{ - uint32_t read_tail_data = 0; - - // Read 22 LSB bits of even pattern2 - tail_data[VAL6] = WURX_ODD_PATTERN2_REG_LSB; - - // Read 22 MID bits of even pattern2 - read_tail_data = WURX_ODD_PATTERN2_REG_MID; - read_tail_data = (read_tail_data << POS22); - - // Write first 10 bits of even pattern2 MID register in output buffer - tail_data[VAL6] = tail_data[VAL6] | read_tail_data; - read_tail_data = 0; - - // Read MID bits of even pattern2 - read_tail_data = WURX_ODD_PATTERN2_REG_MID; - - // Write last 12 bits of even pattern2 MID register in output buffer - read_tail_data = (read_tail_data >> POS10); - tail_data[VAL7] = read_tail_data; - read_tail_data = 0; - - // Read 20 MSB bits of even pattern2 - read_tail_data = WURX_ODD_PATTERN2_REG_MSB; - read_tail_data = read_tail_data << POS12; - tail_data[VAL7] = tail_data[VAL7] | read_tail_data; -} - -/*==============================================*/ -/** - * @fn uint16_t RSI_WURX_TaildataPresent() - * @brief This API is used to verify the tail data detection is present or not. - * @return the number which contain how much data we want to read in tail data e.g if return 0 then 64bit , if 1 then 128 bit and so on. - */ -uint16_t RSI_WURX_TaildataPresent() -{ - uint16_t read; - read = WURX_CORR_CALIB_REG; - read = read & TAIL_DATA_VALUE_CHECK; - return read; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_SoftwareRestart(void) - * @brief This API is used to do software restart. - * @return none - */ -void RSI_WURX_SoftwareRestart(void) -{ - uint32_t i; - // soft_reset_corr set - WURX_CORR_CALIB_REG |= BIT(21); - while (GSPI_CTRL_REG1 & SPI_ACTIVE) - ; - for (i = 0; i < 400; i++) { - __ASM("nop"); - } - // soft_reset_corr clear - WURX_CORR_CALIB_REG &= ~BIT(21); - while (GSPI_CTRL_REG1 & SPI_ACTIVE) - ; -} - -/*==============================================*/ -/** - * @fn int32_t RSI_WURX_GetPatternType(void) - * @brief This API is use to get pattern type . e.g pattern1 or pattern2 or false wakeup. - * @return If success - Pattern type - * If fails - -1 - */ -int32_t RSI_WURX_GetPatternType(void) -{ - if ((WURX_CORR_DET_READ_REG & BIT(20)) | (WURX_CORR_DET_READ_REG & BIT(21))) { - return 1; - } else if ((WURX_CORR_DET_READ_REG & BIT(19)) | (WURX_CORR_DET_READ_REG & BIT(18))) { - return 2; - } else { - return -1; - } -} - -/*==============================================*/ -/** - * @fn uint32_t RSI_WURX_CalVCOCalFreq(uint32_t frequncy_value) - * @brief This API is use VCO calibration frequency value. - * @param[in] frequncy_value : Transmission channel frequency value. - * @return If success - the VCO calibration frequency value. - */ -uint32_t RSI_WURX_CalVCOCalFreq(uint32_t frequncy_value) -{ - frequncy_value = (((float)frequncy_value / (80)) * 64); - return frequncy_value; -} - -/*==============================================*/ -/** - * @fn void RSI_WURX_BGSamplingEnable() - * @brief This API is use enable BG sampling mode. - * @return none - */ -void RSI_WURX_BGSamplingEnable() -{ - *(volatile uint32_t *)BG_SAMPLING_ADDR = BG_SAMPLING_VALUE; - - // Moving to BG sampling mode - *(volatile uint32_t *)0x24048140 = 0x3; -} diff --git a/components/device/silabs/si91x/mcu/drivers/service/images/init_deinit_sequence.png b/components/device/silabs/si91x/mcu/drivers/service/images/init_deinit_sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..4e97e961bc4655f077258a4fe8a734b39fd4652d GIT binary patch literal 17754 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 L^)>pHq2K=k<7LSW literal 0 HcmV?d00001 diff --git a/components/device/silabs/si91x/mcu/drivers/service/nvm3/src/sl_si91x_common_flash_intf.c b/components/device/silabs/si91x/mcu/drivers/service/nvm3/src/sl_si91x_common_flash_intf.c index 531fecd9f..c280dbdb4 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/nvm3/src/sl_si91x_common_flash_intf.c +++ b/components/device/silabs/si91x/mcu/drivers/service/nvm3/src/sl_si91x_common_flash_intf.c @@ -36,8 +36,9 @@ /****************************************************** * Variable Definitions ******************************************************/ +#ifndef NVM3_LOCK_OVERRIDE static osSemaphoreId_t nvm3_Sem; - +#endif // NVM3_LOCK_OVERRIDE /******************************************************************************* ***************************  Local VARIABLES  ******************************** ******************************************************************************/ diff --git a/components/device/silabs/si91x/mcu/drivers/service/power_manager/inc/sl_si91x_power_manager.h b/components/device/silabs/si91x/mcu/drivers/service/power_manager/inc/sl_si91x_power_manager.h index 184c32aae..1874ef474 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/power_manager/inc/sl_si91x_power_manager.h +++ b/components/device/silabs/si91x/mcu/drivers/service/power_manager/inc/sl_si91x_power_manager.h @@ -247,6 +247,9 @@ typedef struct { * @return Status code indicating the result: * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_ALREADY_INITIALIZED (0x0012) - Power Manager is already initialized. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sli_si91x_power_manager_update_ps_requirement(sl_power_state_t state, boolean_t add); @@ -273,6 +276,9 @@ void sli_si91x_power_manager_debug_log_ps_requirement(sl_power_state_t ps, bool * @return Status code indicating the result: * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_ALREADY_INITIALIZED (0x0012) - Power Manager is already initialized. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_init(void); /***************************************************************************/ @@ -322,6 +328,9 @@ __STATIC_INLINE void sl_si91x_power_manager_core_exitcritical(void) * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ __STATIC_INLINE sl_status_t sl_si91x_power_manager_add_ps_requirement(sl_power_state_t state) { @@ -368,6 +377,9 @@ __STATIC_INLINE sl_status_t sl_si91x_power_manager_add_ps_requirement(sl_power_s * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - The Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ __STATIC_INLINE sl_status_t sl_si91x_power_manager_remove_ps_requirement(sl_power_state_t state) { @@ -411,6 +423,9 @@ __STATIC_INLINE sl_status_t sl_si91x_power_manager_remove_ps_requirement(sl_powe * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. * - SL_STATUS_INVALID_CONFIGURATION (0x0023) - Invalid configuration of mode. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_set_clock_scaling(sl_clock_scaling_t mode); @@ -436,6 +451,9 @@ sl_status_t sl_si91x_power_manager_set_clock_scaling(sl_clock_scaling_t mode); * - SL_STATUS_INVALID_STATE (0x0002) - Not a valid transition. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_add_peripheral_requirement(sl_power_peripheral_t *peripheral); @@ -460,6 +478,9 @@ sl_status_t sl_si91x_power_manager_add_peripheral_requirement(sl_power_periphera * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_remove_peripheral_requirement(sl_power_peripheral_t *peripheral); @@ -480,7 +501,9 @@ sl_status_t sl_si91x_power_manager_remove_peripheral_requirement(sl_power_periph * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_NULL_POINTER (0x0022) - Null pointer is passed. - * + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). * @note Adding and removing power state transition requirement(s) from a callback on a transition event * is not supported. * @note The parameters passed must be persistent, meaning that they need to survive @@ -544,6 +567,8 @@ sl_status_t sl_si91x_power_manager_subscribe_ps_transition_event( * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_NULL_POINTER (0x0022) - Null pointer is passed. + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). * * @note An ASSERT is thrown if the handle is not found. ******************************************************************************/ @@ -587,6 +612,9 @@ sl_status_t sl_si91x_power_manager_unsubscribe_ps_transition_event( * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. * - SL_STATUS_INVALID_STATE (0x0002) - Not a valid transition. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_sleep(void); @@ -625,6 +653,9 @@ void sl_si91x_power_manager_standby(void); * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter is passed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_set_wakeup_sources(uint32_t source, boolean_t add); @@ -658,6 +689,9 @@ sl_status_t sl_si91x_power_manager_set_wakeup_sources(uint32_t source, boolean_t * - SL_STATUS_OK (0x0000) - Success. * - SL_STATUS_NOT_INITIALIZED (0x0011) - Power Manager is not initialized. * - SL_STATUS_NULL_POINTER (0x0022) - Null pointer is passed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_power_manager_configure_ram_retention(sl_power_ram_retention_config_t *config); @@ -807,6 +841,8 @@ boolean_t sl_si91x_power_manager_is_ok_to_sleep(void); * If any software module returned SL_SI91X_POWER_MANAGER_ISR_SLEEP and none returned SL_SI91X_POWER_MANAGER_ISR_WAKEUP, * the system will go back to sleep. Any other combination will cause the system not to go back to sleep. * +* @image html init_deinit_sequence.png "Peripheral init/deinit sequence for sleep/wakeup" +* * ***Debugging feature*** * * By installing the Power Manager debug component and setting the configuration define SL_SI91X_POWER_MANAGER_DEBUG to 1, it is possible diff --git a/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager.c b/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager.c index 054fdd365..af3df7779 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager.c +++ b/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager.c @@ -46,6 +46,11 @@ #ifdef SL_SI91X_POWER_MANAGER_UC_AVAILABLE #include "sl_si91x_power_manager_wakeup_handler.h" #endif +#ifdef SLI_SI91X_MCU_ENABLE_PSRAM_FEATURE +#include "sl_si91x_psram_config.h" +#include "rsi_d_cache.h" +#endif +#include "rsi_debug.h" /******************************************************************************* *************************** DEFINES / MACROS ******************************** @@ -61,8 +66,9 @@ #endif #define MAX_ULPSS_RAM_SIZE 8 // Maximum ulpss RAM size #define SOC_PLL_REF_FREQUENCY 40000000 // SOC Pll reference frequency -#define PS4_HP_FREQUENCY 100000000 // PS4 high power clock frequency -#define PS4_LP_FREQUENCY 32000000 // PS4 low power clock frequency +#define INTF_PLL_REF_FREQUENCY 40000000 // INTF Pll reference frequency +#define PS4_HP_FREQUENCY 180000000 // PS4 high power clock frequency +#define PS4_LP_FREQUENCY 100000000 // PS4 low power clock frequency #define PS3_HP_FREQUENCY 80000000 // PS3 high power clock frequency #define PS3_LP_FREQUENCY 32000000 // PS3 low power clock frequency #define DIVISION_FACTOR 0 // Division Factor for clock @@ -260,7 +266,12 @@ sl_status_t sli_si91x_power_manager_set_sleep_configuration(sl_power_state_t sta if (state != SL_SI91X_POWER_MANAGER_PS2) { //Changing the Core-Clock to ULP_REF clock before entering Sleep mode. RSI_CLK_M4SocClkConfig(M4CLK, M4_ULPREFCLK, 0); +#ifdef SLI_SI91X_MCU_ENABLE_PSRAM_FEATURE + /* Configuring clock for PSRAM to ULP_REF before entering Sleep mode. */ + RSI_CLK_Qspi2ClkConfig(M4CLK, QSPI_ULPREFCLK, 0, 0, 0); +#endif } + // If any error code, it returns it otherwise goes to sleep with retention. status = trigger_sleep(&config, SLEEP_WITH_RETENTION); if (status != SL_STATUS_OK) { @@ -509,6 +520,9 @@ sl_status_t sli_si91x_power_manager_configure_clock(sl_power_state_t state, bool ******************************************************************************/ void sli_si91x_power_manager_init_hardware(void) { + // Power-Down the deep-sleep timer + RSI_PS_PowerSupplyDisable(POWER_ENABLE_DEEPSLEEP_TIMER); + // Sets PS4 Power save mode, 100 MHz. sli_si91x_power_manager_configure_clock(SL_SI91X_POWER_MANAGER_PS4, false); } @@ -540,17 +554,19 @@ static void low_power_hardware_configuration(boolean_t is_sleep) RSI_PS_SocPllSpiDisable(); // Power-Down QSPI-DLL Domain RSI_PS_QspiDllDomainDisable(); + // Enable first boot up RSI_PS_EnableFirstBootUp(1); - /* Configure PMU Start-up Time to be used on Wake-up*/ + // Configure PMU Start-up Time to be used on Wake-up RSI_PS_PmuGoodTimeDurationConfig(PMU_GOOD_TIME); - /* Configure XTAL Start-up Time to be used on Wake-up*/ + // Configure XTAL Start-up Time to be used on Wake-up RSI_PS_XtalGoodTimeDurationConfig(XTAL_GOOD_TIME); - // by using this API we programmed the RTC timer clock in SOC - // MSB 8 bits for the Integer part & - // LSB 17bits for the Fractional part - // Ex: 32Khz clock = 31.25us ==> 31.25*2^17 = 4096000 = 0x3E8000 - /* Time Period Programming */ + + // The API allows configuring the time period for the sleep clock. + // MSB 8-bits for the Integer part &c + // LSB 17-bits for the Fractional part + // Ex: 32kHz clock = 31.25us ==> 31.25*2^17 = 4096000 = 0x3E8000 + // Ex: 32.768kHz clock = 30.51us ==> 30.51*2^17 = 4000000 = 0x3D0900 RSI_TIMEPERIOD_TimerClkSel(TIME_PERIOD, 0x003E7FFF); } @@ -757,11 +773,13 @@ static sl_status_t trigger_sleep(sli_power_sleep_config_t *config, uint8_t sleep config->vector_offset, config->mode); #if SL_WIFI_COMPONENT_INCLUDED + /* Check's if SOC is in PS2 state. If so, skip writing to PLL registers as they are unavailable in this state. */ if (!(M4_ULP_SLP_STATUS_REG & ULP_MODE_SWITCHED_NPSS)) { if (sl_si91x_is_device_initialized()) { /* Check whether M4 is using XTAL */ if (sli_si91x_is_xtal_in_use_by_m4() == true) { + /* To prevent an open-loop PLL clock condition, ensure the PLL's are turned off before turning off the XTAL (PLL source). */ if (system_clocks.soc_pll_clock != DEFAULT_SOC_PLL_CLOCK) { /* TurnOff the SOC_PLL */ RSI_CLK_SocPllTurnOff(); @@ -787,8 +805,9 @@ static sl_status_t trigger_sleep(sli_power_sleep_config_t *config, uint8_t sleep error_code = RSI_PS_EnterDeepSleep(sleep_type, config->low_freq_clock); #if SL_WIFI_COMPONENT_INCLUDED + /* Check's if SOC is in PS2 state. If so, skip writing to PLL registers as they are unavailable in this state. */ if (!(M4_ULP_SLP_STATUS_REG & ULP_MODE_SWITCHED_NPSS)) { - + /* To avoid an open-loop PLL clock configuration, the PLLs are turned OFF before sleep. Therefore,it's necessary to turnON them upon waking up */ if (system_clocks.soc_pll_clock != DEFAULT_SOC_PLL_CLOCK) { /* TurnON the SOC_PLL */ RSI_CLK_SocPllTurnOn(); @@ -804,6 +823,12 @@ static sl_status_t trigger_sleep(sli_power_sleep_config_t *config, uint8_t sleep RSI_CLK_I2sPllTurnOn(); } } +#endif +#ifdef SLI_SI91X_MCU_ENABLE_PSRAM_FEATURE + rsi_d_cache_invalidate_all(); + /* Configuring clock for PSRAM operation based on selected configs */ + RSI_CLK_SetIntfPllFreq(M4CLK, PS4_HP_FREQUENCY, INTF_PLL_REF_FREQUENCY); + RSI_CLK_Qspi2ClkConfig(M4CLK, QSPI_INTFPLLCLK, 0, 0, PSRAM_FREQ_CLK_DIV_FACTOR); #endif // If error is encountered, it is converted to sl error code. status = convert_rsi_to_sl_error_code(error_code); diff --git a/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager_wakeup_init.c b/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager_wakeup_init.c index 6545278e6..cd568de91 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager_wakeup_init.c +++ b/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager_wakeup_init.c @@ -103,11 +103,6 @@ sl_status_t sli_si91x_power_manager_calendar_init(void) { sl_status_t status = SL_STATUS_OK; #if defined(SL_ENABLE_CALENDAR_WAKEUP_SOURCE) && (SL_ENABLE_CALENDAR_WAKEUP_SOURCE == ENABLE) - // Calendar configuration is set, i.e. clock is set to RC clock. - status = sl_si91x_calendar_set_configuration(CALENDAR_RC_CLOCK); - if (status != SL_STATUS_OK) { - return status; - } // Calendar is initialized. sl_si91x_calendar_init(); #if defined(ENABLE_SECOND) && (ENABLE_SECOND == ENABLE) @@ -222,12 +217,7 @@ sl_status_t sli_si91x_power_manager_wdt_init(void) sl_status_t status = SL_STATUS_OK; #if defined(SL_ENABLE_WDT_WAKEUP_SOURCE) && (SL_ENABLE_WDT_WAKEUP_SOURCE == ENABLE) watchdog_timer_config_t wdt_config; - watchdog_timer_clock_config_t wdt_clock_config; sl_si91x_watchdog_init_timer(); - status = sl_si91x_watchdog_configure_clock(&wdt_clock_config); - if (status != SL_STATUS_OK) { - return status; - } // Configuring watchdog-timer status = sl_si91x_watchdog_set_configuration(&wdt_config); if (status != SL_STATUS_OK) { @@ -252,6 +242,20 @@ sl_status_t sli_si91x_power_manager_dst_init(void) { sl_status_t status = SL_STATUS_OK; #if defined(SL_ENABLE_DST_WAKEUP_SOURCE) && (SL_ENABLE_DST_WAKEUP_SOURCE == ENABLE) + + // Power-up the RTC and Time period block + RSI_PS_NpssPeriPowerUp(SLPSS_PWRGATE_ULP_MCURTC | SLPSS_PWRGATE_ULP_TIMEPERIOD); + + // Power-up the Deep-sleep timer + RSI_PS_PowerSupplyEnable(POWER_ENABLE_DEEPSLEEP_TIMER); + + // by using this API we programmed the RTC timer clock in SOC + // MSB 8-bits for the Integer part & + // LSB 17-bits for the Fractional part + // Eg:- 32KHz = 31.25µs ==> 31.25*2^17 = 4096000 = 0x3E8000 + /* Time Period Programming */ + RSI_TIMEPERIOD_TimerClkSel(TIME_PERIOD, 0x003E7FFF); + RSI_DST_DurationSet(DST_WAKEUP_TIME); status = sl_si91x_power_manager_set_wakeup_sources(SL_SI91X_POWER_MANAGER_DST_WAKEUP, true); if (status != SL_STATUS_OK) { diff --git a/components/device/silabs/si91x/mcu/drivers/service/sensorhub/inc/sensor_hub.h b/components/device/silabs/si91x/mcu/drivers/service/sensorhub/inc/sensor_hub.h index 6cf59682c..2070f5eec 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/sensorhub/inc/sensor_hub.h +++ b/components/device/silabs/si91x/mcu/drivers/service/sensorhub/inc/sensor_hub.h @@ -363,7 +363,9 @@ typedef struct { * @return Status code indicating the result: * SL_STATUS_OK (0X000)- Success, peripherals initialization was done properly. * SL_STATUS_FAIL (0x0001) - Failed, peripherals initialization failed. -* SL_ALL_PERIPHERALS_INIT_FAILED (0x001C), All peripherals initializaion failed +* SL_ALL_PERIPHERALS_INIT_FAILED (0x001C), All peripherals initializaion failed. +* +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensorhub_init(); @@ -375,7 +377,7 @@ sl_status_t sl_si91x_sensorhub_init(); * @param[in] num_of_sensors - Number of sensors given by user. * @return Number of sensors scanned, if successful. * SL_STATUS_FAIL (0x0001) - No sensors found. -* +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensorhub_detect_sensors(sl_sensor_id_t sensor_id_info[], uint8_t num_of_sensors); @@ -395,6 +397,7 @@ sl_status_t sl_si91x_sensorhub_detect_sensors(sl_sensor_id_t sensor_id_info[], u * SL_SH_HAL_SENSOR_DELETION_FAILED (0X0016) - Sensor deletion failed at HAL layer. * SL_SH_SENSOR_INDEX_NOT_FOUND (0x00FF) - Given sensor index not found. * +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensorhub_delete_sensor(sl_sensor_id_t sensor_id); @@ -418,8 +421,8 @@ sl_status_t sl_si91x_sensorhub_delete_sensor(sl_sensor_id_t sensor_id); * SL_SH_CONFIG_NOT_FOUND (0x0010) - Configuration of the sensor not found. * SL_SH_INVALID_MODE (0x0013) - Invalid mode. * SL_SH_HAL_SENSOR_CREATION_FAILED (0x0015) - Sensor creation failed at HAL. -* -******************************************************************************/ +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). +*******************************************************************************/ sl_status_t sl_si91x_sensorhub_create_sensor(sl_sensor_id_t sensor_id); /***************************************************************************/ /** @@ -439,6 +442,7 @@ sl_status_t sl_si91x_sensorhub_create_sensor(sl_sensor_id_t sensor_id); * SL_SH_SENSOR_CREATE_FAIL (0x0007) - Given sensor not created. * SL_SH_INVALID_MODE (0x0013) - Invaild mode given. * +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensorhub_start_sensor(sl_sensor_id_t sensor_id); @@ -458,6 +462,7 @@ sl_status_t sl_si91x_sensorhub_start_sensor(sl_sensor_id_t sensor_id); * SL_SH_TIMER_STOP_FAIL (0x0004) - Failed to stop timer. * SL_SH_SENSOR_CREATE_FAIL (0x0007) - Given sensor not created. * +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensorhub_stop_sensor(sl_sensor_id_t sensor_id); @@ -625,6 +630,8 @@ sl_sensor_info_t *sli_si91x_get_sensor_info(sl_sensor_id_t sensor_id); * @return Status code indicating the result: * SL_STATUS_OK (0X000) - Success, callback registered. * SL_SH_INVALID_PARAMETERS (0x000B) - Invalid parameters. +* +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensorhub_notify_cb_register(sl_sensor_signalEvent_t cb_event, sl_sensor_id_t *cb_ack); @@ -650,7 +657,9 @@ void sl_si91x_sensors_timer_cb(TimerHandle_t xTimer); * @param[in] intr_type - NPSS GPIO interrupt type. * @return Status code indicating the result: * SL_STATUS_OK (0X000) - Success, interrupt configured. -* SL_SH_INTERRUPT_TYPE_CONFIG_FAIL (0x000E) - Invaild interrupt type. +* SL_SH_INTERRUPT_TYPE_CONFIG_FAIL (0x000E) - Invalid interrupt type. +* +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_gpio_interrupt_config(uint16_t gpio_pin, sl_gpio_intr_type_t intr_type); @@ -688,6 +697,8 @@ void sl_si91x_gpio_interrupt_stop(uint16_t gpio_pin); * SL_SH_POWER_TASK_CREATION_FAILED (0x0019) - Failed to create power task. * SL_SH_SENSOR_TASK_CREATION_FAILED (0x001A) - Failed to create sensor task. * SL_SH_EM_TASK_CREATION_FAILED (0x001B) - Failed to create EM task. +* +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_sensor_hub_start(void); @@ -763,8 +774,9 @@ void sli_si91x_sensorhub_ps2tops4_state(void); * * @return Status code indicating the result: * SL_STATUS_OK (0X000)- Success, ADC initialized. -* SL_STATUS_FAIL (0x0001)- Failed to initialize ADC . +* SL_STATUS_FAIL (0x0001)- Failed to initialize ADC. * +* For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sli_si91x_adc_init(void); @@ -777,23 +789,23 @@ sl_status_t sli_si91x_adc_init(void); ******************************************************************************/ void vPortSetupTimerInterrupt(void); -/*=============================================================================*/ +/**************************************************************************/ /** * @brief I2C event handler * @param[in] event - I2C transmit and receive events. */ -/*=============================================================================*/ +/**************************************************************************/ void ARM_I2C_SignalEvent(uint32_t event); -/*=============================================================================*/ +/**************************************************************************/ /** * @brief To fetch ADC bus interface information. This can be used by lower level layers. * @return Pointer to ADC configuration structure. */ -/*=============================================================================*/ +/**************************************************************************/ sl_adc_cfg_t *sl_si91x_fetch_adc_bus_intf_info(void); -/*=============================================================================*/ +/**************************************************************************/ /** * @brief ADC callback to set event flag * @details This callback function is called when ADC event occured and it sets event flag corresponding to that event @@ -801,18 +813,18 @@ sl_adc_cfg_t *sl_si91x_fetch_adc_bus_intf_info(void); * @param[in] event - Callback event (ADC_STATIC_MODE_CALLBACK, * ADC_THRSHOLD_CALLBACK, INTERNAL_DMA, FIFO_MODE_EVENT). */ -/*=============================================================================*/ +/**************************************************************************/ void sl_si91x_adc_callback(uint8_t channel_no, uint8_t event); -/*=============================================================================*/ -/** +/**************************************************************************/ /** * @brief To initialize sdc Interface based on the configuration. * @return Returns status 0 if successful. * Otherwise, it returns an error code. * SL_STATUS_FAIL (0x0001) - Fail. * SL_STATUS_OK (0X000) - Success. - */ -/*=============================================================================*/ + * + * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). + ***************************************************************************/ sl_status_t sli_si91x_sdc_init(void); /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ @@ -820,10 +832,6 @@ sl_status_t sli_si91x_sdc_init(void); * @fn void sli_config_sdc_params(sl_sdc_config_t * sdc_config) * @brief Initialize the sdc Interface based on the configuration. * @param[in] sdc_config_st_p - Configuration parameters for SDC Driver - * @return Returns status 0 if successful. - * Otherwise, it returns an error code. - * SL_STATUS_FAIL (0x0001) - Fail. - * SL_STATUS_OK (0X000) - Success. *******************************************************************************/ void sli_config_sdc_params(sl_drv_sdc_config_t *sdc_config_st_p); /** @endcond */ diff --git a/components/device/silabs/si91x/mcu/drivers/service/sensorhub/src/sensor_hub.c b/components/device/silabs/si91x/mcu/drivers/service/sensorhub/src/sensor_hub.c index eac2643ab..3034a1d55 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/sensorhub/src/sensor_hub.c +++ b/components/device/silabs/si91x/mcu/drivers/service/sensorhub/src/sensor_hub.c @@ -417,6 +417,10 @@ void sli_si91x_sleep_wakeup(uint16_t sh_sleep_time) M4ULP_RAM16K_RETENTION_MODE_EN | ULPSS_RAM_RETENTION_MODE_EN | /* TA_RAM_RETENTION_MODE_EN |*/ M4ULP_RAM_RETENTION_MODE_EN /*| M4SS_RAM_RETENTION_MODE_EN | HPSRAM_RET_ULP_MODE_EN*/); /* Enable SRAM Retention of 16KB during Sleep */ + // by using this API we programmed the RTC timer clock in SOC + // MSB 8-bits for the Integer part & + // LSB 17-bits for the Fractional part + // Eg:- 32KHz = 31.25µs ==> 31.25*2^17 = 4096000 = 0x3E8000 /* Time Period Programming */ RSI_TIMEPERIOD_TimerClkSel(TIME_PERIOD, 0x003E7FFF); @@ -480,10 +484,10 @@ void sli_si91x_sensorhub_ps4tops2_state(void) RSI_PS_EnableFirstBootUp(1); /* Enable first boot up */ - /* by using this API we programmed the RTC timer clock in SOC - MSB 8 bits for the Integer part & - LSB 17bits for the Fractional part - Ex: 32Khz clock = 31.25us ==> 31.25*2^17 = 4096000 = 0x3E8000*/ + // by using this API we programmed the RTC timer clock in SOC + // MSB 8-bits for the Integer part & + // LSB 17-bits for the Fractional part + // Eg:- 32KHz = 31.25µs ==> 31.25*2^17 = 4096000 = 0x3E8000 /* Time Period Programming */ RSI_TIMEPERIOD_TimerClkSel(TIME_PERIOD, 0x003E7FFF); /* tass_ref_clk_mux_ctr in NWP Control */ diff --git a/components/device/silabs/si91x/mcu/drivers/service/sleeptimer/src/sl_sleeptimer_hal_si91x_sysrtc.c b/components/device/silabs/si91x/mcu/drivers/service/sleeptimer/src/sl_sleeptimer_hal_si91x_sysrtc.c index 44fa1294e..6a5fabcab 100644 --- a/components/device/silabs/si91x/mcu/drivers/service/sleeptimer/src/sl_sleeptimer_hal_si91x_sysrtc.c +++ b/components/device/silabs/si91x/mcu/drivers/service/sleeptimer/src/sl_sleeptimer_hal_si91x_sysrtc.c @@ -83,13 +83,8 @@ void sleeptimer_hal_init_timer(void) const rsi_sysrtc_group_channel_compare_config_t group_compare_channel_config = SYSRTC_GROUP_CHANNEL_COMPARE_CONFIG_DEFAULT_REGMODE; -#if defined(SL_SI91X_MODULE_BOARD) - // Enable 32kHz RC clock to SYSRTC peripheral - rsi_sysrtc_clk_set(RSI_SYSRTC_CLK_32kHz_RC, 0u); -#else // Enable 32kHz XTAL clock to SYSRTC peripheral rsi_sysrtc_clk_set(RSI_SYSRTC_CLK_32kHz_Xtal, 0u); -#endif // SL_SI91X_MODULE_BOARD // Initialize SYSRTC module rsi_sysrtc_init(&sysrtc_config); @@ -304,11 +299,7 @@ void SLEEPTIMER_SI91X_INTERRUPT_HANDLER(void) uint32_t sleeptimer_hal_get_timer_frequency(void) { // There is currently no call for in Si91x library to obtain peripheral frequency of SYSRTC. -#if defined(SL_SI91X_MODULE_BOARD) - return DEFAULT_32KHZ_RC_CLOCK; -#else return DEFAULT_32KHZ_XTAL_CLOCK; -#endif // SL_SI91X_MODULE_BOARD } /******************************************************************************* diff --git a/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_power_save.h b/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_power_save.h index 25074ee06..3a5e2ee12 100644 --- a/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_power_save.h +++ b/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_power_save.h @@ -1108,7 +1108,7 @@ STATIC INLINE void RSI_PS_FsmHfFreqConfig(uint32_t freq) /** * @fn STATIC INLINE void RSI_PS_FsmLfClkSel(AON_CLK_T fsmLfClk) - * @brief This API is used to configure the FSM low frequency clock + * @brief This API is used to configure the FSM low frequency clock * @param[in] fsmLfClk enum value of the low frequency clock sources * \ref MCUAON_KHZ_CLK_SEL_POR_RESET_STATUS_b * @return none diff --git a/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_rtc.h b/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_rtc.h index 21305ff57..6dfd09096 100644 --- a/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_rtc.h +++ b/components/device/silabs/si91x/mcu/drivers/systemlevel/inc/rsi_rtc.h @@ -84,8 +84,8 @@ typedef struct RTC_TIME_CONFIG { uint8_t Day; ///< Day (Format 1...31) RTC_DAY_OF_WEEK_T DayOfWeek; ///< Day of the week (Format 0...6) RTC_MONTH_T Month; ///< Month (Format 1...12) - uint8_t Year; ///< Year (Format 1...99) + 2000 - uint8_t Century; ///< Century + uint8_t Year; ///< Year (Format 0...99) + 2000 + uint8_t Century; ///< Century (Format 0...3) } RTC_TIME_CONFIG_T; /** diff --git a/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_rtc.c b/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_rtc.c index a65357277..932eb7a88 100644 --- a/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_rtc.c +++ b/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_rtc.c @@ -64,12 +64,15 @@ void RSI_RTC_Init(RTC_Type *Cal) /* Power-Up RTC Domain */ RSI_PS_NpssPeriPowerUp(SLPSS_PWRGATE_ULP_MCURTC | SLPSS_PWRGATE_ULP_TIMEPERIOD); - /*Wait for RTC-ON pluse synchronization*/ + /*Wait for RTC-ON pulse synchronization*/ do { RTC->MCU_CAL_ALARM_PROG_1 = 6U; } while (RTC->MCU_CAL_ALARM_PROG_1 != 6U); - //TODO: Update the RTC clock INIT code here + // by using this API we programmed the RTC timer clock in SOC + // MSB 8-bits for the Integer part & + // LSB 17-bits for the Fractional part + // Eg:- 32KHz = 31.25µs ==> 31.25*2^17 = 4096000 = 0x3E8000 /* Time Period Programming */ RSI_TIMEPERIOD_TimerClkSel(TIME_PERIOD, 0x003E7FFF); /*Enable power gates*/ @@ -327,7 +330,7 @@ void RSI_RTC_IntrClear(uint32_t intr) /*==============================================*/ /** * @fn void RSI_RTC_CalibInitialization(void) - * @brief This API is used to initilization RTC CALIBRATION + * @brief This API is used to initialize RTC CALIBRATION * @return none */ diff --git a/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_time_period.c b/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_time_period.c index 11fd02196..556761a74 100644 --- a/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_time_period.c +++ b/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_time_period.c @@ -20,6 +20,15 @@ */ #include "rsi_time_period.h" +#include "rsi_power_save.h" + +// by using these macros, we program the RTC timer clock in SOC +// MSB 8-bits for the Integer part &c +// LSB 17-bits for the Fractional part +// Ex: 32kHz clock = 31.25us ==> 31.25*2^17 = 4096000 = 0x3E8000 +// Ex: 32.768kHz clock = 30.51us ==> 30.51*2^17 = 4000000 = 0x3D0900 +#define RTC_TIME_PERIOD_32000HZ (0x003E7FFFUL) // Time period value for 32kHz +#define RTC_TIME_PERIOD_32768HZ (0x003D08FFUL) // Time period value for 32.768kHz #ifndef UNUSED_PARAMETER #define UNUSED_PARAMETER(x) (void)(x) @@ -315,13 +324,24 @@ rsi_error_t RSI_TIMEPERIOD_ROCalibration(TIME_PERIOD_Type *pstcTimePeriod, rsi_error_t RSI_TIMEPERIOD_TimerClkSel(TIME_PERIOD_Type *pstcTimePeriod, uint32_t u32TimePeriod) { + uint32_t rtc_time_period = 0, clock_type = 0; + + UNUSED_PARAMETER(u32TimePeriod); /*Check for the NULL parameter*/ if (pstcTimePeriod == NULL) { return ERROR_TIME_PERIOD_PARAMETERS; } - /*Update the timer period */ - pstcTimePeriod->MCU_CAL_TIMER_CLOCK_PERIOD_b.RTC_TIMER_CLK_PERIOD = (unsigned int)(u32TimePeriod & 0x01FFFFFF); + // read the currently configured FSM low frequency clock + clock_type = MCU_AON->MCUAON_KHZ_CLK_SEL_POR_RESET_STATUS_b.AON_KHZ_CLK_SEL; + if (clock_type == KHZ_XTAL_CLK_SEL) { + rtc_time_period = RTC_TIME_PERIOD_32768HZ; + } else if (clock_type == KHZ_RC_CLK_SEL) { + rtc_time_period = RTC_TIME_PERIOD_32000HZ; + } + + /*Update the timer period */ + pstcTimePeriod->MCU_CAL_TIMER_CLOCK_PERIOD_b.RTC_TIMER_CLK_PERIOD = (unsigned int)(rtc_time_period & 0x01FFFFFF); /*Indicated SOC programmed rtc_timer clock period is applied at KHz clock domain*/ while (!pstcTimePeriod->MCU_CAL_TIMER_CLOCK_PERIOD_b.SPI_RTC_TIMER_CLK_PERIOD_APPLIED_b) ; diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/component/i2c_instance.slcc b/components/device/silabs/si91x/mcu/drivers/unified_api/component/i2c_instance.slcc index 7d80cb814..e00202bab 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/component/i2c_instance.slcc +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/component/i2c_instance.slcc @@ -29,6 +29,7 @@ root_path: "components/device/silabs/si91x/mcu/drivers/unified_api" config_file: - path: config/sl_si91x_i2c_init_{{instance}}_config.h file_id: i2c_config + unless: [sl_si70xx] provides: - name: i2c_instance allow_multiple: true diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_calendar.slcc b/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_calendar.slcc index 46628f484..4907a732d 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_calendar.slcc +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_calendar.slcc @@ -11,8 +11,6 @@ description: > category: Device|Si91x|MCU|Peripheral quality: production component_root_path: "components/device/silabs/si91x/mcu/drivers/unified_api" -config_file: - - path: "config/sl_si91x_calendar_config.h" source: - path: "src/sl_si91x_calendar.c" include: diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_ulp_uart.slcc b/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_ulp_uart.slcc index d28761675..36bcfcff6 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_ulp_uart.slcc +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/component/sl_ulp_uart.slcc @@ -30,6 +30,7 @@ define: - name: SL_SI91X_USART_DMA - name: SL_SI91X_DMA - name: ULP_UART_MODULE + - name: SL_SI91X_ULP_UART requires: - name: udma_linker_config - name: sl_dma diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps1604m_sqr/sl_si91x_psram_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps1604m_sqr/sl_si91x_psram_config.h index 73da97b2a..35c4f1d6a 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps1604m_sqr/sl_si91x_psram_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps1604m_sqr/sl_si91x_psram_config.h @@ -30,14 +30,6 @@ // 1 #define PSRAM_FREQ_CLK_DIV_FACTOR 1 -// PSRAM clock source selection -// <0=> QSPI_ULPREFCLK -// <2=> QSPI_INTFPLLCLK -// <3=> QSPI_SOCPLLCLK -// <4=> M4_SOCCLKNOSWLSYNCCLKTREEGATED -// 2 -#define PSRAM_CLK_SOURCE_SEL 2 - // PSRAM Read-Write Type // Normal Read-Write // Fast Read-Write diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqh/sl_si91x_psram_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqh/sl_si91x_psram_config.h index caa3c82fc..bc065b5aa 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqh/sl_si91x_psram_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqh/sl_si91x_psram_config.h @@ -30,14 +30,6 @@ // 1 #define PSRAM_FREQ_CLK_DIV_FACTOR 1 -// PSRAM clock source selection -// <0=> QSPI_ULPREFCLK -// <2=> QSPI_INTFPLLCLK -// <3=> QSPI_SOCPLLCLK -// <4=> M4_SOCCLKNOSWLSYNCCLKTREEGATED -// 2 -#define PSRAM_CLK_SOURCE_SEL 2 - // PSRAM Read-Write Type // Normal Read-Write // Fast Read-Write diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqrh/sl_si91x_psram_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqrh/sl_si91x_psram_config.h index 84d7a0472..c5e5833ed 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqrh/sl_si91x_psram_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/psram_device_config/aps6404l_sqrh/sl_si91x_psram_config.h @@ -30,14 +30,6 @@ // 1 #define PSRAM_FREQ_CLK_DIV_FACTOR 1 -// PSRAM clock source selection -// <0=> QSPI_ULPREFCLK -// <2=> QSPI_INTFPLLCLK -// <3=> QSPI_SOCPLLCLK -// <4=> M4_SOCCLKNOSWLSYNCCLKTREEGATED -// 2 -#define PSRAM_CLK_SOURCE_SEL 2 - // PSRAM Read-Write Type // Normal Read-Write // Fast Read-Write diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_dac_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_dac_config.h index b4202400a..636706f68 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_dac_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_dac_config.h @@ -67,7 +67,7 @@ extern "C" { // DAC0 OUT on ULP_GPIO_4/GPIO_68 #ifndef SL_DAC0_OUT_PORT -#define SL_DAC0_OUT_PORT 0 +#define SL_DAC0_OUT_PORT ULP #endif #ifndef SL_DAC0_OUT_PIN #define SL_DAC0_OUT_PIN 4 diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_sysrtc_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_sysrtc_config.h index a6bcee88f..4c8505d16 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_sysrtc_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_sysrtc_config.h @@ -34,18 +34,14 @@ #include "sl_si91x_sysrtc.h" // <<< Use Configuration Wizard in Context Menu >>> -// Clock Configuration -#define CLK_RO_1KHZ 1 -#define CLK_RO_32KHZ 2 +// Clock Configuration #define CLK_RC_32KHZ 4 #define CLK_32KHZ_XTAL 8 -// SYSRTC Clock -// 1Khz RO CLK -// 32khz RO CLK -// 32khz RC CLK -// 32khz XTAL CLK -// Selection of SYSRTC CLK -#define SL_SYSRTC_CLK_SRC CLK_RC_32KHZ +// SL_SYSRTC_CLK_SRC> SYSRTC Clock +// CLK_RC_32KHZ=> 32khz RC CLK +// CLK_32KHZ_XTAL=> 32khz XTAL CLK +// Selection of SYSRTC CLK +#define SL_SYSRTC_CLK_SRC CLK_32KHZ_XTAL #define DIVISION_FACTOR_0 0 #define DIVISION_FACTOR_2 2 @@ -53,16 +49,15 @@ #define DIVISION_FACTOR_8 8 #define DIVISION_FACTOR_16 16 #define DIVISION_FACTOR_32 32 -// Clock division factor -// 0 -// 2 -// 4 -// 8 -// 16 -// 32 -// Selection of SYSRTC CLK DIVISION FACTOR +// SL_SYSRTC_CLOCK_DIVISION_FACTOR> Clock division factor +// DIVISION_FACTOR_0=> 0 +// DIVISION_FACTOR_2=> 2 +// DIVISION_FACTOR_4=> 4 +// DIVISION_FACTOR_8=> 8 +// DIVISION_FACTOR_16=> 16 +// DIVISION_FACTOR_32=> 32 +// Selection of SYSRTC CLK DIVISION FACTOR #define SL_SYSRTC_CLOCK_DIVISION_FACTOR DIVISION_FACTOR_0 -// // SYSRTC Configuration // Counter0 : Enable SYSRTC run during debug diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_ulp_timer_common_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_ulp_timer_common_config.h index 761d50ed9..728efc259 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_ulp_timer_common_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_ulp_timer_common_config.h @@ -40,22 +40,22 @@ extern "C" { /******************** ADC Peripheral CommonConfiguration **********************/ // <<< Use Configuration Wizard in Context Menu >>> -// ULP Timer Clock Configuration +// ULP Timer Clock Configuration -// Clock Type -// Static (auto select) -// Dynamic -// Selection of the Timer CLK Type. +// SL_ULP_TIMER_CLK_TYPE> Clock Type +// SL_ULP_TIMER_CLK_TYPE_STATIC=> Static (auto select) +// SL_ULP_TIMER_CLK_TYPE_DYNAMIC=> Dynamic +// Selection of the Timer CLK Type. #define SL_ULP_TIMER_CLK_TYPE SL_ULP_TIMER_CLK_TYPE_STATIC -// Sync to ULPSS PCLK -// Enable or disable sync to ULPSS pclock. -// Default: 0 +// SL_ULP_TIMER_SYNC_TO_ULPSS_PCLK> Sync to ULPSS PCLK +// Enable or disable sync to ULPSS pclock. +// Default: 0 #define SL_ULP_TIMER_SYNC_TO_ULPSS_PCLK 0 -// Wait for switching timer clock -// 1 : Enable waiting for switching timer clk & 0 : Skip waiting for switching timer clk. -// Default: 0 +// SL_ULP_TIMER_SKIP_SWITCH_TIME> Wait for switching timer clock +// 1 : Enable waiting for switching timer clk & 0 : Skip waiting for switching timer clk. +// Default: 0 #define SL_ULP_TIMER_SKIP_SWITCH_TIME 0 // clock source @@ -68,7 +68,6 @@ extern "C" { // Selection of the Clock source #define SL_ULP_TIMER_CLK_INPUT_SOURCE ULP_TIMER_32MHZ_RC_CLK_SRC //default timer clock input source is ref clock -// // <<< end of configuration section >>> ulp_timer_clk_src_config_t sl_timer_clk_handle = { @@ -81,4 +80,4 @@ ulp_timer_clk_src_config_t sl_timer_clk_handle = { #ifdef __cplusplus } #endif // SL_ULP_TIMER -#endif /* SL_SI91X_ULP_TIMER_COMMON_CONFIG_H */ +#endif /* SL_SI91X_ULP_TIMER_COMMON_CONFIG_H */ \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_watchdog_timer_config.h b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_watchdog_timer_config.h index 53e59fa03..d4020ba5a 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_watchdog_timer_config.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/config/sl_si91x_watchdog_timer_config.h @@ -43,19 +43,6 @@ // Default: 1 #define WDT_TIMER_UC 1 -// Clock Configuration -#define KHZ_RO_CLK_SEL 1 -#define KHZ_RC_CLK_SEL 2 -#define KHZ_XTAL_CLK_SEL 4 -// Low Frequency Clock -// RO CLK -// RC CLK -// XTAL CLK -// Selection of Low Frequency FSM CLK -#define SL_LOW_FREQ_FSM_CLK_SRC KHZ_RC_CLK_SEL -#define FSM_32MHZ_RC 2 -// - // Watchdog Timer Configuration // System-reset time diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_calendar.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_calendar.h index 836b19c68..0d26ee33b 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_calendar.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_calendar.h @@ -56,6 +56,7 @@ extern "C" { // ----------------------------------------------------------------------------- // Data Types + #define TIME_CONVERSION_ENUM(name) \ typedef uint8_t name; \ enum name##_enum ///< Time Conversion format enum declaration @@ -136,20 +137,12 @@ typedef struct { /** * @brief To configure and initialize Calendar (i.e., the RTC clock). * - * @details It takes input of clock type enum \ref sl_calendar_clock_t. - * The clock type (that is, clock source) can be set to RC or XTAL. It configures the clock type and - * then initializes the RTC clock accordingly. + * @details This API is no longer supported due to the restriction on peripheral drivers to configure clock. * - * @pre Pre-conditions: - * - The system clock must be initialized before calling this function. - * - The necessary hardware resources must be available and configured. - * - * @param[in] clock_type (sl_calendar_clock_t) Enum for RTC Clock Type (RO, RC or XTAL). + * @param[in] clock_type (sl_calendar_clock_t) Enum for RTC Clock Type (RC or XTAL) * - * @return Status code indicating the result: - * - SL_STATUS_OK (0x0000) - Success - * - SL_STATUS_FAIL (0x0001) - The function failed. - * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid. + * @return status, error code as follows: + * - SL_STATUS_OK (0x0000) - return ok to support backward compatibility. * * For more information on the status documentation, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ @@ -162,8 +155,8 @@ sl_status_t sl_si91x_calendar_set_configuration(sl_calendar_clock_t clock_type); * @details Sets the date and time of the Calendar RTC. * The input parameters include a date-time structure, with the following members: * - date Pointer to the Date Configuration Structure - * - Century (uint8_t) Century (0-4) - * - Year (uint8_t) Year (1-99) + (Century * 1000) + * - Century (uint8_t) Century (0-3) + * - Year (uint8_t) Year (0-99) * - Month (enum) Month from the sl_calendar_month_t enum * - DayOfWeek (enum) Day of Week from the sl_calendar_days_of_week_t enum * - Day (uint8_t) Day (1-31) @@ -193,8 +186,8 @@ sl_status_t sl_si91x_calendar_set_date_time(sl_calendar_datetime_config_t *confi * @details The input parameter consists of a date-time structure. The structure is updated with the current date-time parameters. * The members of the structure are listed below: * - date Pointer to the Date Configuration Structure - * - Century (uint8_t) Century (0-4) - * - Year (uint8_t) Year (1-99) + (Century * 1000) + * - Century (uint8_t) Century (0-3) + * - Year (uint8_t) Year (0-99) * - Month (enum) Month from the sl_calendar_month_t enum * - DayOfWeek (enum) Day of Week from the sl_calendar_days_of_week_t enum * - Day (uint8_t) Day (1-31) @@ -222,26 +215,14 @@ sl_status_t sl_si91x_calendar_get_date_time(sl_calendar_datetime_config_t *confi /** * @brief To calibrate the RC clock. * - * @details If the RC clock is selected as the input clock to the calendar, it is recommended - * to calibrate it after the power sequence. It expects the clock calibration structure - * \ref clock_calibration_config_t as input. The members are listed below: - * - rc_enable_calibration: true to enable and false to disable RC calibration - * - rc_enable_periodic_calibration: true to enable and false to disable RC periodic calibration - * - rc_trigger_time: The interval at which the RC clock calibration is triggered. Expected values - 5 sec, 10 sec, 15 sec, 30 sec, 1 min, 2 min. \ref RC_CLOCK_CALIBRATION_ENUM - * - * @pre Pre-condition: - * - \ref sl_si91x_calendar_calibration_init - * + * @details This API is no longer supported due to the restriction on peripheral drivers to configure clock. + * * @param[in] clock_calibration_config Pointer to the clock calibration structure (\ref clock_calibration_config_t). - * - * @return Status code indicating the result: - * - SL_STATUS_OK (0x0000) - Success. - * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid. - * - SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer. - * - * @note Only RC parameters are utilized in this function. - * - * For more information on the status documentation, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). + * + * @return status, error code as follows: + * - SL_STATUS_OK (0x0000) - return ok to support backward compatibility. + * + * For more information on the status documentation, please refer to [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_calendar_rcclk_calibration(clock_calibration_config_t *clock_calibration_config); @@ -249,30 +230,14 @@ sl_status_t sl_si91x_calendar_rcclk_calibration(clock_calibration_config_t *cloc /** * @brief To calibrate the RO clock. * - * @details If the RO clock is selected as the input clock to the calendar, it is recommended - * to calibrate it after the power sequence. This function internally calibrates the RC clock as well. - * It expects the clock calibration structure \ref clock_calibration_config_t as input. - * The members are listed below: - * - rc_enable_calibration: true to enable and false to disable RC calibration - * - rc_enable_periodic_calibration: true to enable and false to disable RC periodic calibration - * - rc_trigger_time: Expected values - 5 sec, 10 sec, 15 sec, 30 sec, 1 min, 2 min \ref RC_CLOCK_CALIBRATION_ENUM - * - ro_enable_calibration: true to enable and false to disable RO calibration - * - ro_enable_periodic_calibration: true to enable and false to disable periodic calibration - * - ro_trigger_time: Expected values - 1 sec, 2 sec, 4 sec, 8 sec \ref RO_CLOCK_CALIBRATION_ENUM - * - * @pre Pre-condition: - * - \ref sl_si91x_calendar_calibration_init - * + * @details This API is no longer supported due to the restriction on peripheral drivers to configure clock. + * * @param[in] clock_calibration_config Pointer to the clock calibration structure (\ref clock_calibration_config_t). - * - * @return Status code indicating the result: - * - SL_STATUS_OK (0x0000) - Success. - * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid. - * - SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer. - * - * @note Both RC and RO parameters are utilized in this function, so it is mandatory to update all the parameters. - * - * For more information on the status documentation, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). + * + * @return status, error code as follows: + * - SL_STATUS_OK (0x0000) - return ok to support backward compatibility. + * + * For more information on the status documentation, please refer to [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_calendar_roclk_calibration(clock_calibration_config_t *clock_calibration_config); @@ -400,8 +365,8 @@ sl_status_t sl_si91x_calendar_unregister_alarm_trigger_callback(void); * @details It is a one-shot alarm; after triggering the alarm, it elapses. * The input parameters consist of a date-time structure. The members of the structure are listed below: * - date Pointer to the Date Configuration Structure - * - Century (uint8_t) Century (0-4) - * - Year (uint8_t) Year (1-99) + (Century * 1000) + * - Century (uint8_t) Century (0-3) + * - Year (uint8_t) Year (0-99) * - Month (enum) Month from the sl_calendar_month_t enum * - DayOfWeek (enum) Day of Week from the sl_calendar_days_of_week_t enum * - Day (uint8_t) Day (1-31) @@ -432,8 +397,8 @@ sl_status_t sl_si91x_calendar_set_alarm(sl_calendar_datetime_config_t *alarm); * The structure is updated with the current date-time parameters. * The members of the structure are listed below: * - date Pointer to the Date Configuration Structure - * - Century (uint8_t) Century (0-4) - * - Year (uint8_t) Year (1-99) + (Century * 1000) + * - Century (uint8_t) Century (0-3) + * - Year (uint8_t) Year (0-99) * - Month (enum) Month from the sl_calendar_month_t enum * - DayOfWeek (enum) Day of Week from the sl_calendar_days_of_week_t enum * - Day (uint8_t) Day (1-31) @@ -465,8 +430,8 @@ sl_status_t sl_si91x_calendar_get_alarm(sl_calendar_datetime_config_t *alarm); * date-time configuration structure with the respective values. * * @param[in] date Pointer to the Date Configuration Structure (\ref sl_calendar_datetime_config_t) - * @param[in] Century (uint8_t) Century (0-4) - * @param[in] Year (uint8_t) Year (1-99) + (Century * 1000) + * @param[in] Century (uint8_t) Century (0-3) + * @param[in] Year (uint8_t) Year (0-99) * @param[in] Month (enum) Month from the sl_calendar_month_t enum * @param[in] DayOfWeek (enum) Day of Week from the sl_calendar_days_of_week_t enum * @param[in] Day (uint8_t) Day (1-31) @@ -573,12 +538,39 @@ boolean_t sl_si91x_calendar_is_sec_trigger_enabled(void); ******************************************************************************/ boolean_t sl_si91x_calendar_is_alarm_trigger_enabled(void); -/***************************************************************************/ -/** - * @brief To start the Calendar RTC. +/***************************************************************************/ /** + * Convert Unix timestamp to Calendar RTC timestamp. + * Timezone is not part of Calendar, assumes and converts in GMT format + * + * @param[in] unix_time (uint32_t) Unix timestamp + * @param[in] cal_date_time (sl_calendar_datetime_config_t *) Pointer to the Date Configuration Structure + * @return status 0 if successful, else error code as follows: + * - SL_STATUS_OK (0x0000) - Success + * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid + * + * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). + ******************************************************************************/ +sl_status_t sl_si91x_calendar_convert_unix_time_to_calendar_datetime(uint32_t unix_time, + sl_calendar_datetime_config_t *cal_date_time); + +/***************************************************************************/ /** + * Convert Calendar RTC timestamp to Unix timestamp. + * Timezone is not part of Calendar, converts in GMT format * - * @details This function starts the RTC clock. + * @param[in] cal_date_time (sl_calendar_datetime_config_t *) Pointer to the Date Configuration Structure + * @param[in] unix_time (uint32_t *) Pointer to the Unix timestamp variable + * @return status 0 if successful, else error code as follows: + * - SL_STATUS_OK (0x0000) - Success + * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid + * - SL_STATUS_INVALID_RANGE (0x0028) - Parameters are invalid * + * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). + ******************************************************************************/ +sl_status_t sl_si91x_calendar_convert_calendar_datetime_to_unix_time(sl_calendar_datetime_config_t *cal_date_time, + uint32_t *unix_time); + +/***************************************************************************/ /** + * Starts the Calendar RTC. * @pre Pre-conditions: * - \ref sl_si91x_calendar_set_configuration * - \ref sl_si91x_calendar_init @@ -668,8 +660,6 @@ __STATIC_INLINE void sl_si91x_calendar_clear_alarm_trigger(void) * * @details This function powers up the RTC domain and starts the calendar clock. * - * @pre Pre-conditions: - * - \ref sl_si91x_calendar_set_configuration ******************************************************************************/ __STATIC_INLINE void sl_si91x_calendar_init(void) { diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h index 43002f962..3ec4ddd34 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h @@ -281,9 +281,9 @@ sl_status_t sl_si91x_dma_init(sl_dma_init_t *dma_init); * @param[in] dma_number 0 for UDMA0, 1 for ULP_DMA. * * @return sl_status_t De-initialization status: -* - SL_STATUS_OK (0x0000) - De-initialization success. -* - SL_STATUS_BUSY (0x0002) - Cannot de-initialize the peripheral due to an ongoing transfer. -* - SL_STATUS_NOT_INITIALIZED (0x0003) - DMA peripheral not initialized. + * - SL_STATUS_OK (0x0000) - De-initialization success. + * - SL_STATUS_BUSY (0x0002) - Cannot de-initialize the peripheral due to an ongoing transfer. + * - SL_STATUS_NOT_INITIALIZED (0x0003) - DMA peripheral not initialized. * * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_i2c.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_i2c.h index 8d2580558..fb815f0a0 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_i2c.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_i2c.h @@ -345,24 +345,20 @@ sl_i2c_status_t sl_i2c_driver_send_data_blocking(sl_i2c_instance_t i2c_instance, * is updated after data transfer completion. * * @pre Pre-conditions: - * - \ref sl_i2c_driver_init must be called prior. - * - Transfer type must be set to 'using DMA'. - * - \ref sl_i2c_driver_set_follower_address (if sending from follower). - * - * @param[in] i2c_instance The I2C instance to be used. See \ref sl_i2c_instance_t. - * @param[in] address Follower address (7-bit: 0-127, 10-bit: 0-1023). - * @param[in] tx_buffer Pointer to the transmit data buffer. - * @param[in] tx_len Data length in bytes (range: 1-30,000). - * @param[in] p_dma_config Pointer to the DMA configuration structure. See \ref sl_i2c_dma_config_t. - * - * @note It is recommended to use up to 30,000 bytes maximum transfer length, - * but this limit may vary depending on the available RAM size. - * - * @return sl_i2c_status_t Status code indicating the result: - * - \ref SL_I2C_SUCCESS (0x0000) - Operation was successful. - * - \ref SL_I2C_INVALID_PARAMETER (0x000F) - Invalid parameters were provided. - * - SL_DMA_TRANSFER_ERROR - DMA parameters are invalid. - * + * - \ref sl_i2c_driver_init + * - Here transfer-type should be set as DMA-type + * - \ref sl_i2c_driver_set_follower_address, if used in salve application + * @param[in] i2c_instance I2C Instance. + * @param[in] address Follower address can be provided in 7-bit length (0-127) + * or in 10-bit length(0-1023). + * @param[in] tx_buffer A pointer to transmit data buffer + * @param[in] tx_len Data length in number of bytes in the range of 1-30000 bytes. + * @param[in] p_dma_config A pointer to DMA configuration structure \ref sl_i2c_dma_config_t. + * @note Maximum tx_len values can be 30000 (receives back in around 4 seconds) + * @return status 0 if successful, else error code as follow + * - \ref SL_I2C_SUCCESS (0x0000) - Success + * - \ref SL_I2C_INVALID_PARAMETER (0x000F) - Parameters are invalid + * - \ref SL_I2C_DMA_TRANSFER_ERROR (0x000E) - DMA parameters are invalid ******************************************************************************/ sl_i2c_status_t sl_i2c_driver_send_data_non_blocking(sl_i2c_instance_t i2c_instance, uint16_t address, @@ -422,15 +418,13 @@ sl_i2c_status_t sl_i2c_driver_receive_data_blocking(sl_i2c_instance_t i2c_instan * @param[in] p_dma_config Pointer to the DMA configuration structure. See \ref sl_i2c_dma_config_t. * * @note - * - It is recommended to use up to 30,000 bytes maximum transfer length, - * but this limit may vary depending on the available RAM size. - * - The default values cannot be any of the reserved address locations: 0x00 to 0x07, or 0x78 to 0x7f. - * - * @return sl_i2c_status_t Status code indicating the result: - * - \ref SL_I2C_SUCCESS (0x0000) - Operation was successful. - * - \ref SL_I2C_INVALID_PARAMETER (0x000F) - Invalid parameters were provided. - * - SL_DMA_TRANSFER_ERROR - DMA parameters are invalid. - * + * - Maximum rx_len values can be 30000 (receives back in around 4 seconds). + * - The default values cannot be any of the reserved address locations: that is, 0x00 to 0x07, + * or 0x78 to 0x7f. + * @return status 0 if successful, else error code as follow + * - \ref SL_I2C_SUCCESS (0x0000) - Success + * - \ref SL_I2C_INVALID_PARAMETER (0x000F) - Parameters are invalid + * - \ref SL_I2C_DMA_TRANSFER_ERROR (0x000E) - DMA parameters are invalid ******************************************************************************/ sl_i2c_status_t sl_i2c_driver_receive_data_non_blocking(sl_i2c_instance_t i2c_instance, uint16_t address, diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram.h index cfd1e5397..ba5efe3fb 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram.h @@ -486,11 +486,6 @@ sl_psram_return_type_t sl_si91x_psram_enable_encry_decry(uint16_t keySize); * - Interface mode * - SPI Mode (Serial IO) * - QPI Mode (Quad IO) - * - Operation frequency source - * - Interface PLL Clock - * - ULP Reference Clock - * - SoC PLL Clock - * - M4_SOCCLKNOSWLSYNCCLKTREEGATED Clock * * ### Linker configurations * diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram_handle.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram_handle.h index f9969aa68..ee22deed5 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram_handle.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_psram_handle.h @@ -32,7 +32,9 @@ */ extern struct sl_psram_info_type_t PSRAM_Device; -/** @defgroup PSRAM_GPIO_PIN_SET PSRAM GPIO Pin Sets +/** + * @addtogroup PSRAM_GPIO_PIN_SET PSRAM GPIO Pin Sets + * @ingroup PSRAM * @{ */ #define PSRAM_GPIO_PIN_SET_52_TO_57 1 /**< GPIO Pin Set 52 to 57 */ @@ -41,9 +43,11 @@ extern struct sl_psram_info_type_t PSRAM_Device; #define PSRAM_GPIO_PIN_SET_46_TO_51_CS_1 4 /**< GPIO Pin Set 46 to 51 with Chip Select 1 */ #define PSRAM_GPIO_PIN_SET_46_TO_57_CS_0 5 /**< GPIO Pin Set 46 to 57 with Chip Select 0 */ #define PSRAM_GPIO_PIN_SET_46_TO_57_CS_1 6 /**< GPIO Pin Set 46 to 57 with Chip Select 1 */ -/** @} */ +/// @} end group PSRAM_GPIO_PIN_SET -/** @defgroup PSRAM_CHIP_SELECT PSRAM Chip Select and Base Address +/** + * @addtogroup PSRAM_CHIP_SELECT PSRAM Chip Select and Base Address + * @ingroup PSRAM * @{ */ #if (PSRAM_GPIO_PIN_SET_SEL == PSRAM_GPIO_PIN_SET_52_TO_57) @@ -65,9 +69,11 @@ extern struct sl_psram_info_type_t PSRAM_Device; #define PSRAM_CHIP_SELECT (CHIP_ONE) /**< Chip Select for GPIO Pin Set 46 to 57 with CS 1 */ #define PSRAM_BASE_ADDRESS (0x0B000000) /**< Base Address for GPIO Pin Set 46 to 57 with CS 1 */ #endif -/** @} */ +/// @} end group PSRAM_CHIP_SELECT -/** @defgroup PSRAM_PIN_CONFIG PSRAM Pin Configuration +/** + * @addtogroup PSRAM_PIN_CONFIG PSRAM Pin Configuration + * @ingroup PSRAM * @{ */ #if (PSRAM_GPIO_PIN_SET_SEL == PSRAM_GPIO_PIN_SET_0_TO_5) @@ -215,6 +221,6 @@ extern struct sl_psram_info_type_t PSRAM_Device; #define NUM_OF_PSRAM_PINS (6) /**< Number of PSRAM Pins for GPIO Pin Set 52 to 57 */ #endif -/** @} */ +/// @} end group PSRAM_PIN_CONFIG #endif //__SL_SI91X_PSRAM_HANDLE_H_ \ No newline at end of file diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_usart.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_usart.h index 7b34ff40b..e723b8501 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_usart.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_usart.h @@ -269,8 +269,10 @@ sl_status_t sl_si91x_usart_init(usart_peripheral_t usart_instance, sl_usart_hand * @param[in] usart_handle Pointer to the USART/UART driver. * * @return sl_status_t Status code indicating the result: -* - SL_STATUS_OK (0x0000) - Success, UART/USART deinitialization done properly. -* - SL_STATUS_FAIL (0x0001) - Fail, UART/USART deinitialization failed. + * - SL_STATUS_OK (0x0000) - Success, UART/USART deinitialization done properly. + * - SL_STATUS_FAIL (0x0001) - Fail, UART/USART deinitialization failed. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). * * @note * When the USART/UART module is used in combination with other peripherals, while deinitializing in the application, see the notes below: @@ -284,7 +286,6 @@ sl_status_t sl_si91x_usart_init(usart_peripheral_t usart_instance, sl_usart_hand * 2. A few peripherals (ULP Peripherals, UULP Peripherals, GPDMA, and SDIO-SPI) have separate domains; those can be powered down independently. For additional details, see the Power architecture section in the Hardware Reference Manual. * Here, ULP_UART has a separate power domain ULPSS_PWRGATE_ULP_UART, which can be powered down independently. See the rsi_power_save.h file for all power gate definitions. * - * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_usart_deinit(sl_usart_handle_t usart_handle); @@ -472,15 +473,16 @@ sl_status_t sl_si91x_usart_async_receive_data(sl_usart_handle_t usart_handle, vo * @param[in] data_length Length of the data to be received. * * @return sl_status_t Status code indicating the result: -* - SL_STATUS_OK (0x0000) - Success, data transfer completed. -* - SL_STATUS_FAIL (0x0001) - Function failed, data transfer failed. -* - SL_STATUS_BUSY (0x0004) - Busy, data transfer is already in progress. -* - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter. + * - SL_STATUS_OK (0x0000) - Success, data transfer completed. + * - SL_STATUS_FAIL (0x0001) - Function failed, data transfer failed. + * - SL_STATUS_BUSY (0x0004) - Busy, data transfer is already in progress. + * - SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter. + * + * For more information on status codes, see [SL STATUS DOCUMENTATION]( + * https://docs.silabs.com/gecko-platform/latest/platform-common/status). * * @note This function is to be used in USART mode only (i.e., synchronous mode). In asynchronous * mode, use \ref sl_si91x_usart_receive_data() and \ref sl_si91x_usart_send_data(). - * - * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). ******************************************************************************/ sl_status_t sl_si91x_usart_transfer_data(sl_usart_handle_t usart_handle, const void *data_out, diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_watchdog_timer.h b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_watchdog_timer.h index 71d7b7db6..5acdea37e 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_watchdog_timer.h +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_watchdog_timer.h @@ -40,6 +40,12 @@ extern "C" { #include "rsi_power_save.h" #include "rsi_wwdt.h" +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ +#ifndef UNUSED_VARIABLE +#define UNUSED_VARIABLE(x) (void)(x) +#endif // UNUSED_VARIABLE +/** @endcond */ + /***************************************************************************/ /** * @addtogroup WATCHDOG-TIMER Watchdog Timer @@ -59,17 +65,6 @@ typedef void (*watchdog_timer_callback_t)(void); typedef FSM_CLK_T high_freq_fsm_clock_t; ///< Renaming high frequency fsm-clock type enum typedef AON_CLK_T low_freq_fsm_clock_t; ///< Renaming low frequency fsm-clock type enum -/***************************************************************************/ -/** - * @brief To represent BG-PMU clock sources. - * - * @details This enumeration defines the possible clock sources for the BG-PMU (Background Power Management Unit). - */ -typedef enum { - RO_32KHZ_CLOCK = 1, ///< RO 32KHz clock - MCU_FSM__CLOCK = 2, ///< MCU FSM clock -} bg_pmu_clock_t; - /***************************************************************************/ /** * @brief Enumeration to represent possible time delay values for WDT interrupt time and system reset time with a 32 KHz clock frequency. @@ -121,7 +116,7 @@ typedef enum { typedef struct { uint8_t low_freq_fsm_clock_src; ///< Low frequency FSM clock source, see \ref low_freq_fsm_clock_t uint8_t high_freq_fsm_clock_src; ///< High frequency FSM clock source, see \ref high_freq_fsm_clock_t - uint8_t bg_pmu_clock_source; ///< BG-PMU clock source, see \ref bg_pmu_clock_t + uint8_t bg_pmu_clock_source; ///< BG-PMU clock source } watchdog_timer_clock_config_t; /***************************************************************************/ @@ -167,7 +162,7 @@ void sl_si91x_watchdog_init_timer(void); /***************************************************************************/ /** - * @brief To enable and configure the Watchdog Timer clock sources. + * @brief This API is no longer supported due to the restriction on peripheral drivers to configuring clocks. * * @details This API configures the Watchdog Timer's low frequency and BG-PMU clock sources. * @@ -177,9 +172,7 @@ void sl_si91x_watchdog_init_timer(void); * @param[in] timer_clk_config_ptr Pointer to the timer clock configuration structure. * * @return sl_status_t Status code indicating the result: - * - SL_STATUS_OK (0x0000) - Success, timer clock-source parameters configured properly. - * - SL_STATUS_INVALID_PARAMETER (0x0021) - Timer configuration structure members have invalid values. - * - SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer. + * - SL_STATUS_OK (0x0000) - return ok to support backward compatibility. * * For more information on status codes, see [SL STATUS DOCUMENTATION](https://docs.silabs.com/gecko-platform/latest/platform-common/status). *******************************************************************************/ @@ -195,7 +188,6 @@ sl_status_t sl_si91x_watchdog_configure_clock(watchdog_timer_clock_config_t *tim * * @pre Pre-conditions: * - \ref sl_si91x_watchdog_init_timer - * - \ref sl_si91x_watchdog_configure_clock * * @param[in] timer_config_ptr Pointer to the timer configuration structure \ref watchdog_timer_config_t. * @@ -240,7 +232,6 @@ sl_status_t sl_si91x_watchdog_register_timeout_callback(watchdog_timer_callback_ * * @pre Pre-conditions: * - \ref sl_si91x_watchdog_init_timer - * - \ref sl_si91x_watchdog_configure_clock * - \ref sl_si91x_watchdog_set_system_reset_time * * @param[in] interrupt_time Timer timeout interrupt duration, represented as \ref time_delays_t. @@ -276,7 +267,6 @@ uint8_t sl_si91x_watchdog_get_interrupt_time(void); * * @pre Pre-conditions: * - \ref sl_si91x_watchdog_init_timer - * - \ref sl_si91x_watchdog_configure_clock * * @param[in] system_reset_time Timer system reset duration, represented as \ref time_delays_t. * Number of clock pulses = 2^(system_reset_time). @@ -313,7 +303,6 @@ uint8_t sl_si91x_watchdog_get_system_reset_time(void); * * @pre Pre-conditions: * - \ref sl_si91x_watchdog_init_timer - * - \ref sl_si91x_watchdog_configure_clock * - \ref sl_si91x_watchdog_set_system_reset_time * - \ref sl_si91x_watchdog_set_interrupt_time * @@ -409,7 +398,6 @@ sl_watchdog_timer_version_t sl_si91x_watchdog_get_version(void); * * @pre Pre-conditions: * - \ref sl_si91x_watchdog_init_timer - * - \ref sl_si91x_watchdog_configure_clock * - \ref sl_si91x_watchdog_register_timeout_callback *******************************************************************************/ __STATIC_INLINE void sl_si91x_watchdog_start_timer(void) @@ -441,7 +429,6 @@ __STATIC_INLINE void sl_si91x_watchdog_stop_timer(void) * * @pre Pre-conditions: * - \ref sl_si91x_watchdog_init_timer - * - \ref sl_si91x_watchdog_configure_clock * - \ref sl_si91x_watchdog_start_timer *******************************************************************************/ __STATIC_INLINE void sl_si91x_watchdog_restart_timer(void) @@ -506,8 +493,7 @@ __STATIC_INLINE void sl_si91x_watchdog_disable_system_reset_on_processor_lockup( * * The Watchdog Timer can be configured using several parameters: * 1. *Initialize the Watchdog Timer:* @ref sl_si91x_watchdog_init_timer -* 2. *Configure the Clocks:* @ref sl_si91x_watchdog_configure_clock -* 3. *Set Watchdog Parameters:* Configure interrupt time, system reset time, and window time using @ref sl_si91x_watchdog_set_configuration. +* 2. *Set Watchdog Parameters:* Configure interrupt time, system reset time, and window time using @ref sl_si91x_watchdog_set_configuration * * @li For more information on configuring available parameters, see the respective peripheral example readme document. * @@ -515,14 +501,13 @@ __STATIC_INLINE void sl_si91x_watchdog_disable_system_reset_on_processor_lockup( * * @li The following functions will initiate and configure the Watchdog Timer, representing the general flow for implementation: * 1. *Initialize the Watchdog Timer:* @ref sl_si91x_watchdog_init_timer -* 2. *Configure the timer clock:* @ref sl_si91x_watchdog_configure_clock -* 3. *System reset status:* @ref sl_si91x_watchdog_get_timer_system_reset_status (Optional, if required to check whether it is a power-on reset or WDT system reset.) -* 4. *Configure the Watchdog Timer:* @ref sl_si91x_watchdog_set_configuration -* 5. *Register Watchdog Timer timeout callback:* @ref sl_si91x_watchdog_register_timeout_callback -* 6. *Start Watchdog Timer:* @ref sl_si91x_watchdog_start_timer -* 7. *Restart Watchdog Timer (To kick the Watchdog Timer):* @ref sl_si91x_watchdog_restart_timer -* 8. *Stop Watchdog Timer:* @ref sl_si91x_watchdog_stop_timer -* 9. *De-initialize Watchdog Timer:* @ref sl_si91x_watchdog_deinit_timer +* 2. *System reset status:* @ref sl_si91x_watchdog_get_timer_system_reset_status (Optional, if required to check whether it is a power-on reset or WDT system reset.) +* 3. *Configure the Watchdog Timer:* @ref sl_si91x_watchdog_set_configuration +* 4. *Register Watchdog Timer timeout callback:* @ref sl_si91x_watchdog_register_timeout_callback +* 5. *Start Watchdog Timer:* @ref sl_si91x_watchdog_start_timer +* 6. *Restart Watchdog Timer (To kick the Watchdog Timer):* @ref sl_si91x_watchdog_restart_timer +* 7. *Stop Watchdog Timer:* @ref sl_si91x_watchdog_stop_timer +* 8. *De-initialize Watchdog Timer:* @ref sl_si91x_watchdog_deinit_timer * * @li To read time values, use the following APIs: * diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_adc.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_adc.c index 52e94c3d7..c5dbf0b32 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_adc.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_adc.c @@ -45,6 +45,7 @@ #define MISC_CONFIG_MISC_CTRL1 *(volatile uint32_t *)(0x46008000 + 0x44) #endif // MISC_CONFIG_MISC_CTRL1 #define MAX_SAMPLE_RATE 2500000 // Maximum sampling rate 2.5 Msps. +#define INVALID_SAMPLE_RATE 0 // Invalid sample rate. #define MINIMUM_NUMBER_OF_CHANNEL 1 // Minimum number of channel enable #define MAXIMUM_NUMBER_OF_CHANNEL 16 // Maximum number of channel enable #define MAXIMUM_CHANNEL_ID 16 // Maximum adc dma support channel id. @@ -980,6 +981,11 @@ static sl_status_t validate_adc_channel_parameters(sl_adc_channel_config_t *adc_ status = SL_STATUS_INVALID_PARAMETER; break; } + // Invalid sample rate validation. + if (adc_channel_config->sampling_rate[channel] == INVALID_SAMPLE_RATE) { + status = SL_STATUS_NOT_FOUND; + break; + } // Verify the user given sampling rate is proper or not if (adc_channel_config->sampling_rate[channel] > MAX_SAMPLE_RATE) { status = SL_STATUS_INVALID_RANGE; diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_bjt_temperature_sensor.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_bjt_temperature_sensor.c index 28d83c28c..1df41e844 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_bjt_temperature_sensor.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_bjt_temperature_sensor.c @@ -385,6 +385,10 @@ sl_status_t sl_si91x_bjt_temperature_sensor_deinit(adc_config_t sl_bjt_temperatu if (status != SL_STATUS_OK) { break; } + status = sl_si91x_adc_stop(sl_bjt_temperature_sensor_config); + if (status != SL_STATUS_OK) { + break; + } status = sl_si91x_adc_deinit(sl_bjt_temperature_sensor_config); if (status != SL_STATUS_OK) { break; diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_calendar.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_calendar.c index 0b00052d3..c6cd44dcc 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_calendar.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_calendar.c @@ -28,30 +28,35 @@ * ******************************************************************************/ #include "sl_si91x_calendar.h" -#include "sl_si91x_calendar_config.h" #include +#include "rsi_time_period.h" /******************************************************************************* *************************** DEFINES / MACROS ******************************** ******************************************************************************/ -#define TIME_UNIX_EPOCH (1970u) // Unix Epoch Year Macro -#define TIME_NTP_EPOCH (1900u) // NTP Epoch Year Macro -#define TIME_SEC_PER_DAY (60u * 60u * 24u) // Seconds in one day -#define TIME_NTP_UNIX_EPOCH_DIFF (TIME_UNIX_EPOCH - TIME_NTP_EPOCH) // NTP and Unix Time difference -#define TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH (TIME_NTP_UNIX_EPOCH_DIFF * 365u + 17u) // Day Count wrt to difference -#define TIME_NTP_EPOCH_OFFSET_SEC (TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH * TIME_SEC_PER_DAY) // NTP offset in seconds -#define TIME_UNIX_TO_NTP_MAX (0xFFFFFFFF - TIME_NTP_EPOCH_OFFSET_SEC) // NTP Maximum timestamp -#define TIME_UNIX_TIMESTAMP_MAX (0x7FFFFFFF) // Unix Maximum timestamp -#define TIME_UNIX_YEAR_MAX (2038u - TIME_NTP_EPOCH) // Maximum unix year -#define TIME_ZONE_DEFAULT (0u) // Default time zone - -#define MINIMUM_DAY (0u) // Minimum day in a week -#define MAXIMUM_HOUR (23u) // Maximum hour in a day -#define MAXIMUM_MINUTE (59u) // Maximum minute in an hour -#define MAXIMUM_SECOND (59u) // Maximum second in a minute -#define MAXIMUM_MILLISECONDS (999u) // Maximum milliseconds in second -#define MAXIMUM_CENTURY (4u) // Maximum supported century -#define MAXIMUM_YEAR (99u) // Maximum year in a century +#define TIME_UNIX_EPOCH (1970u) // Unix Epoch Year Macro +#define TIME_FIRST_LEAP_YEAR_FROM_UNIX_EPOCH (1972u) // 1972 is the first leap year since 1970 +#define TIME_NTP_EPOCH (1900u) // NTP Epoch Year Macro +#define TIME_SEC_PER_DAY (60u * 60u * 24u) // Seconds in one day +#define TIME_DAY_PER_YEAR (365u) +#define TIME_SEC_PER_YEAR (TIME_SEC_PER_DAY * TIME_DAY_PER_YEAR) +#define TIME_NTP_UNIX_EPOCH_DIFF (TIME_UNIX_EPOCH - TIME_NTP_EPOCH) // NTP and Unix Time difference +#define TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH (TIME_NTP_UNIX_EPOCH_DIFF * 365u + 17u) // Day Count wrt to difference +#define TIME_NTP_EPOCH_OFFSET_SEC (TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH * TIME_SEC_PER_DAY) // NTP offset in seconds +#define TIME_UNIX_TO_NTP_MAX (0xFFFFFFFF - TIME_NTP_EPOCH_OFFSET_SEC) // NTP Maximum timestamp +#define TIME_UNIX_TIMESTAMP_MAX (0x7FFFFFFF) // Unix Maximum timestamp +#define TIME_UNIX_YEAR_MAX (2038u) // Maximum unix year +#define TIME_ZONE_DEFAULT (0u) // Default time zone + +#define MINIMUM_DAY (0u) // Minimum day in a week +#define MAXIMUM_DAYS_IN_A_WEEK (7u) // Maximum days in a week +#define MAXIMUM_HOUR (23u) // Maximum hour in a day +#define MAXIMUM_MINUTE (59u) // Maximum minute in an hour +#define MAXIMUM_SECOND (59u) // Maximum second in a minute +#define MAXIMUM_SECONDS_IN_AN_HOUR (3600u) // Maximum seconds in an hour +#define MAXIMUM_MILLISECONDS (999u) // Maximum milliseconds in second +#define MAXIMUM_CENTURY (3u) // Maximum supported century +#define MAXIMUM_YEAR (99u) // Maximum year in a century #define MAXIMUM_EPOCH_DAY (19u) // Maximum day in epoch time #define MAXIMUM_EPOCH_HOUR (3u) // Maximum hour in epoch time @@ -62,12 +67,19 @@ #define CALENDAR_SQA_VERSION (0u) // CALENDAR SQA version #define CALENDAR_DEV_VERSION (2u) // CALENDAR Developer version +#define FUNCTIONALITY_SUPPORTED false + +#ifndef UNUSED_VARIABLE +#define UNUSED_VARIABLE(x) (void)(x) +#endif // UNUSED_VARIABLE + /******************************************************************************* *************************** LOCAL VARIABLES ******************************* ******************************************************************************/ -static const uint8_t days_in_month[12] = { +static const uint8_t days_in_month[2][12] = { /* Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec */ - 31u, 28u, 31u, 30u, 31u, 30u, 31u, 31u, 30u, 31u, 30u, 31u + { 31u, 28u, 31u, 30u, 31u, 30u, 31u, 31u, 30u, 31u, 30u, 31u }, + { 31u, 29u, 31u, 30u, 31u, 30u, 31u, 31u, 30u, 31u, 30u, 31u } }; static calendar_callback_t msec_callback = NULL; @@ -83,9 +95,9 @@ static calendar_callback_t alarm_callback = NULL; ******************************************************************************/ static bool is_valid_time(uint32_t time, time_conversion_enum format, int32_t time_zone); static bool is_valid_date(sl_calendar_datetime_config_t *date); -static bool is_leap_year(uint16_t year); +static bool is_leap_year(uint8_t year, uint8_t century); static bool is_valid_alarm(sl_calendar_datetime_config_t *alarm); - +static uint16_t number_of_leap_days(uint32_t base_year, uint32_t current_year); /******************************************************************************* *********************** Global function Prototypes ************************* ******************************************************************************/ @@ -102,38 +114,16 @@ void SLI_MSEC_SEC_IRQHandler(void); /******************************************************************************* * Calendar Clock Configuration and Initialization - * It should be called before starting the RTC as it sets the clock for RTC - * RC, RO and XTAL clock is supported, by default, RC clock is enabled. + * This API is no longer supported due to the restriction on peripheral drivers to configure clocks ******************************************************************************/ sl_status_t sl_si91x_calendar_set_configuration(sl_calendar_clock_t clock_type) { - sl_status_t status; - /* CALENDAR_UC is defined by default. when this macro (CALENDAR_UC) is defined, peripheral - * configuration is directly taken from the configuration set in the universal configuration (UC). - * if the application requires the configuration to be changed in run-time, undefined this macro - * and change the peripheral configuration through the sl_si91x_calendar_set_configuration API. - */ -#if (CALENDAR_UC == 1) - clock_type = configuration.calendar_clock_type; -#endif - do { - // To validate the input parameters, if the parameters are not in range, it - // returns an error code - if ((clock_type != KHZ_RO_CLK_SEL) && (clock_type != KHZ_RC_CLK_SEL) && (clock_type != KHZ_XTAL_CLK_SEL)) { - status = SL_STATUS_INVALID_PARAMETER; - break; - } - RSI_PS_FsmLfClkSel(clock_type); - // To validate the register with the appropriate values, if the values are - // incorrect, it returns an error code - if (MCU_AON->MCUAON_KHZ_CLK_SEL_POR_RESET_STATUS_b.AON_KHZ_CLK_SEL != clock_type) { - status = SL_STATUS_FAIL; - break; - } - // If everything is as required, and clock is successfully configured and rtc is started then, - // it returns SL_STATUS_OK - status = SL_STATUS_OK; - } while (false); + sl_status_t status = SL_STATUS_OK; // return ok to support backward compatibility + + // FSM LF Clock has already been configured in sl_system_init, + // This API is no longer supported due to the restriction on peripheral drivers to configure clocks + UNUSED_VARIABLE(clock_type); + return status; } @@ -217,6 +207,8 @@ sl_status_t sl_si91x_calendar_get_date_time(sl_calendar_datetime_config_t *confi sl_status_t sl_si91x_calendar_rcclk_calibration(clock_calibration_config_t *clock_calibration_config) { sl_status_t status; + +#if (FUNCTIONALITY_SUPPORTED) do { // To validate the structure pointer, if the parameters is NULL, it // returns an error code @@ -245,6 +237,13 @@ sl_status_t sl_si91x_calendar_rcclk_calibration(clock_calibration_config_t *cloc // it returns SL_STATUS_OK status = SL_STATUS_OK; } while (false); +#else + // FSM LF Clock has already been configured in sl_system_init, + // This API is no longer supported due to the restriction on peripheral drivers to configure/calibrate clocks + UNUSED_VARIABLE(clock_calibration_config); + status = SL_STATUS_OK; // return ok to support backward compatibility +#endif + return status; } @@ -260,6 +259,8 @@ sl_status_t sl_si91x_calendar_rcclk_calibration(clock_calibration_config_t *cloc sl_status_t sl_si91x_calendar_roclk_calibration(clock_calibration_config_t *clock_calibration_config) { sl_status_t status; + +#if (FUNCTIONALITY_SUPPORTED) do { // To validate the structure pointer, if the parameters is NULL, it // returns an error code @@ -294,6 +295,13 @@ sl_status_t sl_si91x_calendar_roclk_calibration(clock_calibration_config_t *cloc // it returns SL_STATUS_OK status = SL_STATUS_OK; } while (false); +#else + // FSM LF Clock has already been configured in sl_system_init, + // This API is no longer supported due to the restriction on peripheral drivers to configure/calibrate clocks + UNUSED_VARIABLE(clock_calibration_config); + status = SL_STATUS_OK; // return ok to support backward compatibility +#endif + return status; } @@ -760,6 +768,176 @@ sl_status_t sl_si91x_calendar_convert_ntp_time_to_unix_time(uint32_t ntp_time, u return status; } +/***************************************************************************/ /** + * Convert Unix timestamp to Calendar RTC timestamp. + * Timezone is not part of Calendar, assumes and converts in GMT format + * + * @param[in] unix_time (uint32_t) Unix timestamp + * @param[in] cal_date_time (sl_calendar_datetime_config_t *) Pointer to the Date Configuration Structure + * @return status 0 if successful, else error code as follows: + * - SL_STATUS_OK (0x0000) - Success + * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid + ******************************************************************************/ +sl_status_t sl_si91x_calendar_convert_unix_time_to_calendar_datetime(uint32_t unix_time, + sl_calendar_datetime_config_t *cal_date_time) +{ + sl_status_t status = SL_STATUS_OK; + uint16_t full_year = 0; + uint32_t base_year = TIME_UNIX_EPOCH; + uint32_t current_year = 0; + uint16_t leap_day = 0; + uint8_t leap_year_flag = 0; + uint8_t current_month = 0; + uint32_t years_since_1900 = 0; + + do { + if (!is_valid_time(unix_time, TIME_FORMAT_UNIX, TIME_ZONE_DEFAULT)) { + status = SL_STATUS_INVALID_PARAMETER; + break; + } + + cal_date_time->MilliSeconds = 0; + cal_date_time->Second = unix_time % (MAXIMUM_SECOND + 1); + unix_time /= (MAXIMUM_SECOND + 1); + cal_date_time->Minute = unix_time % (MAXIMUM_MINUTE + 1); + unix_time /= (MAXIMUM_MINUTE + 1); + cal_date_time->Hour = unix_time % (MAXIMUM_HOUR + 1); + unix_time /= (MAXIMUM_HOUR + 1); // time is now the number of days since TIME_UNIX_EPOCH + + cal_date_time->DayOfWeek = + ((unix_time + Thursday) % MAXIMUM_DAYS_IN_A_WEEK); // January 1st was a Thursday(4) in 1970 + + full_year = unix_time / TIME_DAY_PER_YEAR; // Approximates the number of full years + current_year = full_year + base_year; + + // calculate number of leap days since TIME_UNIX_EPOCH + if (full_year > (TIME_FIRST_LEAP_YEAR_FROM_UNIX_EPOCH - TIME_UNIX_EPOCH)) { + leap_day = number_of_leap_days(base_year, current_year); // Approximates the number of leap days + full_year = (unix_time - leap_day) / TIME_DAY_PER_YEAR; // Computes the number of year integrating the leap days + current_year = full_year + base_year; + leap_day = + number_of_leap_days(base_year, current_year); // Computes the actual number of leap days of the previous years + } + + // no. of years since 1900 to calculate Century + years_since_1900 = current_year - TIME_NTP_EPOCH; + cal_date_time->Century = ((years_since_1900 / (MAXIMUM_YEAR + 1)) % (MAXIMUM_CENTURY + 1)) + 1; + + // Year in date struct must be based on a 1970 epoch + // 1st Century contains only 30 years (1970-1999) in Unix timestamp + cal_date_time->Year = current_year % (MAXIMUM_YEAR + 1); + + if (is_leap_year(cal_date_time->Year, cal_date_time->Century)) { + leap_year_flag = 1; + } + + unix_time = (unix_time - leap_day) - (TIME_DAY_PER_YEAR * full_year); // Subtracts days of previous year + + while (unix_time >= days_in_month[leap_year_flag][current_month]) { + unix_time -= days_in_month[leap_year_flag][current_month]; // Subtracts the number of days of the passed month + current_month++; + } + cal_date_time->Month = (RTC_MONTH_T)(current_month + 1); + cal_date_time->Day = unix_time + 1; + } while (false); + + return status; +} + +/***************************************************************************/ /** + * Convert Calendar RTC timestamp to Unix timestamp. + * Timezone is not part of Calendar, converts in GMT format + * + * @param[in] cal_date_time (sl_calendar_datetime_config_t *) Pointer to the Date Configuration Structure + * @param[in] unix_time (uint32_t *) Pointer to the Unix timestamp variable + * @return status 0 if successful, else error code as follows: + * - SL_STATUS_OK (0x0000) - Success + * - SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid + * - SL_STATUS_INVALID_RANGE (0x0028) - Parameters are invalid + ******************************************************************************/ +sl_status_t sl_si91x_calendar_convert_calendar_datetime_to_unix_time(sl_calendar_datetime_config_t *cal_date_time, + uint32_t *unix_time) +{ + sl_status_t status = SL_STATUS_OK; + uint16_t month_days = 0; + uint16_t full_year = 0; + uint8_t leap_year_flag = 0; + uint16_t leap_days = 0; + uint32_t base_year = TIME_UNIX_EPOCH; // base year 1970 (for 32 bits) + uint32_t current_year = 0; + + do { + if (!is_valid_date(cal_date_time)) { + status = SL_STATUS_INVALID_PARAMETER; + break; + } + + // current calendar year + current_year = TIME_NTP_EPOCH + ((cal_date_time->Century - 1) * (MAXIMUM_YEAR + 1)) + cal_date_time->Year; + if (current_year < TIME_UNIX_EPOCH) { + status = SL_STATUS_INVALID_RANGE; // Unix timestamp range starts from 01/Jan/1970 + break; + } + + // years since base year TIME_UNIX_EPOCH + full_year = current_year - base_year; + + // convert number of years into seconds for Unix calculation + *unix_time = (full_year * (uint64_t)TIME_SEC_PER_YEAR); + + // calculate number of leap days since TIME_UNIX_EPOCH + if (full_year > (TIME_FIRST_LEAP_YEAR_FROM_UNIX_EPOCH - TIME_UNIX_EPOCH)) { + leap_days = number_of_leap_days(base_year, current_year); + month_days = leap_days; + } + + if (is_leap_year(cal_date_time->Year, cal_date_time->Century)) { + leap_year_flag = 1; + } + + for (int i = 0; i < (cal_date_time->Month - 1); i++) { + month_days += days_in_month[leap_year_flag][i]; // Add the number of days of the month of the year + } + + month_days += (cal_date_time->Day - 1); // Add full days of the current month + // convert number of days into seconds to add up to Unix calculation + *unix_time += month_days * TIME_SEC_PER_DAY; + // convert time into seconds to add up to Unix calculation + *unix_time += (MAXIMUM_SECONDS_IN_AN_HOUR * cal_date_time->Hour) + ((MAXIMUM_SECOND + 1) * cal_date_time->Minute) + + cal_date_time->Second; + } while (false); + + return status; +} + +/******************************************************************************* + * Checks if the time stamp, format and time zone are + * within the supported range. + * + * @param base_year Year to start from to compute leap days. + * @param current_year Year end at for computing leap days. + * + * @return leap_days Days number of leap days between base_year and current_year. + ******************************************************************************/ +static uint16_t number_of_leap_days(uint32_t base_year, uint32_t current_year) +{ + // Regular leap years + uint16_t lo_reg = (base_year - 0) / 4; + uint16_t hi_reg = (current_year - 1) / 4; + uint16_t leap_days = hi_reg - lo_reg; + + // Account for non leap years + uint16_t lo_century = (base_year - 0) / 100; + uint16_t hi_century = (current_year - 1) / 100; + leap_days -= hi_century - lo_century; + + // Account for quad century leap years + uint16_t lo_quad = (base_year - 0) / 400; + uint16_t hi_quad = (current_year - 1) / 400; + leap_days += hi_quad - lo_quad; + + return (leap_days); +} /******************************************************************************* * Alarm IRQ Handler * @@ -836,6 +1014,7 @@ static bool is_valid_date(sl_calendar_datetime_config_t *date) { bool valid_date = true; uint8_t maximum_days = 0; + uint16_t current_year; do { if (date == NULL) { @@ -843,12 +1022,12 @@ static bool is_valid_date(sl_calendar_datetime_config_t *date) break; } // Updates the days in month for the month entered by user - // If the month is february and the leap year is there, then the days are 29 + // If the month is February and the leap year is there, then the days are 29 // else it is as stored in the (days_in_month) array - if (is_leap_year(date->Year) && date->Month == February) { - maximum_days = days_in_month[(date->Month) - 1] + 1; + if (is_leap_year(date->Year, date->Century) && date->Month == February) { + maximum_days = days_in_month[1][(date->Month) - 1] + 1; } else { - maximum_days = days_in_month[(date->Month) - 1]; + maximum_days = days_in_month[0][(date->Month) - 1]; } // If the year, month, day, hour, minute, second, millisecond is greater than the maximum // then it returns false, else true @@ -859,10 +1038,14 @@ static bool is_valid_date(sl_calendar_datetime_config_t *date) valid_date = false; break; } + + // calculate current calendar year from inputs year, century + current_year = TIME_NTP_EPOCH + ((date->Century - 1) * (MAXIMUM_YEAR + 1)) + date->Year; + // If the year, month, day, hour, minute, second is greater than the unix date supports, // then it returns false, else true // Unix date is valid until the 19th of January 2038 at 03:14:07 - if (date->Year == TIME_UNIX_YEAR_MAX) { + if (current_year == TIME_UNIX_YEAR_MAX) { if (((uint8_t)date->Month > (uint8_t)January) || (date->Day > MAXIMUM_EPOCH_DAY) || (date->Hour > MAXIMUM_EPOCH_HOUR) || (date->Minute > MAXIMUM_EPOCH_MINUTE) || (date->Second > MAXIMUM_EPOCH_SECOND)) { @@ -877,18 +1060,22 @@ static bool is_valid_date(sl_calendar_datetime_config_t *date) /******************************************************************************* * Internal function to validate the leap year * - * @param year the year which needs to be validated - * @return leap_year (0 or 1)the entered date is valid or not + * @param year the year which needs to be validated (Format 0...99) + * @param century the century which needs to be validated (Format 0...3) + * @return leap_year (true/false) the entered year is leap or not ******************************************************************************/ -static bool is_leap_year(uint16_t year) +static bool is_leap_year(uint8_t year, uint8_t century) { // 1900 is not a leap year but 0 % anything is 0. - bool leap_year = false; - if (year == 0) { - leap_year = false; - } else { - leap_year = (((year % 4u) == 0u) && (((year % 100u) != 0u) || ((year % 400u) == 0u))) ? true : false; - } + bool leap_year; + uint16_t current_year; + + // calculate current calendar year from inputs year, century + current_year = TIME_NTP_EPOCH + ((century - 1) * (MAXIMUM_YEAR + 1)) + year; + + leap_year = (((current_year % 4u) == 0u) && (((current_year % 100u) != 0u) || ((current_year % 400u) == 0u))) ? true + : false; + return (leap_year); } diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_dma.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_dma.c index 2960f50e8..bdc3ba583 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_dma.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_dma.c @@ -248,9 +248,12 @@ __STATIC_INLINE void process_dma_irq(uint32_t dma_number, uint32_t channel, uint sl_status_t sl_si91x_dma_init(sl_dma_init_t *dma_init) { - sl_status_t status = SL_STATUS_OK; + sl_status_t status = SL_STATUS_OK; + RSI_UDMA_DATACONTEXT_T *udma_driver_handle = (RSI_UDMA_HANDLE_T)udmaHandle[dma_init->dma_number]; if (dma_init->dma_number <= ULP_DMA_INSTANCE) { - if (udmaHandle[dma_init->dma_number] == NULL) { + // If the handle is NULL, it is the first time initialization, if the handle is already present, it means it is sleep-wakeup scenario which needs dma initialization. + if ((udmaHandle[dma_init->dma_number] == NULL) + || (udma_driver_handle->base == UDMA0 || udma_driver_handle->base == UDMA1)) { // Initialize dma peripheral udmaHandle[dma_init->dma_number] = UDMAx_Initialize(UDMA_driver_resources[dma_init->dma_number], udma_driver_table[dma_init->dma_number], @@ -264,6 +267,8 @@ sl_status_t sl_si91x_dma_init(sl_dma_init_t *dma_init) //DMA init pass status = SL_STATUS_OK; } + } else { + status = SL_STATUS_NOT_INITIALIZED; } } else { status = SL_STATUS_INVALID_PARAMETER; @@ -314,6 +319,10 @@ sl_status_t sl_si91x_dma_deinit(uint32_t dma_number) } // Uninitialize DMA status = (sl_status_t)UDMAx_Uninitialize(UDMA_driver_resources[dma_number]); + if (status == SL_STATUS_OK) { + // Clearing the udmaHandle for udma0 or udma1 as per the dma number. + udmaHandle[dma_number] = NULL; + } } } while (false); return status; diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_i2c.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_i2c.c index 2731b75d6..160b5fb20 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_i2c.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_i2c.c @@ -37,6 +37,7 @@ #include "sl_si91x_peripheral_i2c.h" #include "rsi_power_save.h" #include "sl_si91x_clock_manager.h" + /******************************************************************************* *************************** DEFINES / MACROS ******************************** ******************************************************************************/ @@ -121,12 +122,11 @@ static void i2c_clock_deinit(I2C_TypeDef *i2c); static void i2c_dma_transfer_complete_callback(uint32_t channel, void *data); static void i2c_dma_error_callback(uint32_t channel, void *data); static void *i2c_addr(sl_i2c_instance_t i2c_instance); -static void i2c_handler(I2C_TypeDef *i2c); static void wait_for_i2c_follower_ready(I2C_TypeDef *i2c); static void wait_till_i2c_gets_idle(I2C_TypeDef *i2c); static void i2c_dma_rx_config(I2C_TypeDef *i2c); static void i2c_dma_tx_config(I2C_TypeDef *i2c); - +static void i2c_handler(I2C_TypeDef *i2c); /******************************************************************************* ***********************  Global function Definitions ************************* ******************************************************************************/ @@ -331,21 +331,55 @@ sl_i2c_status_t sl_i2c_driver_send_data_blocking(sl_i2c_instance_t i2c_instance, i2c_instance_state[i2c_instance].write_buffer_length = tx_len; // Enables the I2C peripheral. sl_si91x_i2c_enable(i2c); - // Clearing all interrupts - uint32_t clear = i2c->IC_CLR_INTR; - // Configures the transmit empty interrupt. - sl_si91x_i2c_set_interrupts(i2c, SL_I2C_EVENT_TRANSMIT_EMPTY); - // Enabling read request interrupt for follower mode - if (i2c_instance_state[i2c_instance].mode == SL_I2C_FOLLOWER_MODE) { - sl_si91x_i2c_set_interrupts(i2c, SL_I2C_EVENT_READ_REQ); + uint32_t transfer_length = i2c_instance_state[i2c_instance].write_buffer_length; + // Blocking here until all the bytes are sent + while (i2c_instance_state[i2c_instance].write_buffer_current_index < transfer_length) { + // For follower mode + if (i2c_instance_state[i2c_instance].mode == SL_I2C_FOLLOWER_MODE) { + // Checking for abort transfer, if occurred clearing it + while (i2c->IC_RAW_INTR_STAT_b.TX_ABRT) { + int clear = i2c->IC_CLR_TX_ABRT; + (void)clear; + } + // Checking for read request if occurred sending the data byte & clearing it + while (i2c->IC_RAW_INTR_STAT_b.RD_REQ) { + if (i2c->IC_RAW_INTR_STAT_b.RD_REQ) { + i2c->IC_DATA_CMD = i2c_instance_state[i2c_instance] + .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]; + // clearing read request bit + int clear = i2c->IC_CLR_RD_REQ; + (void)clear; + } + } + // For leader mode + } else { + // Sending last byte by adding stop bit, if repeated start is enabled + if (i2c_instance_state[i2c_instance].write_buffer_current_index == (transfer_length - 1)) { + if (!(i2c_instance_state[i2c_instance].repeated_start_enable)) { + i2c->IC_DATA_CMD = (BIT_SET << STOP_BIT) + | i2c_instance_state[i2c_instance] + .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]; + } else { + // Sending last data byte without stop bit, if repeated start is not enabled + i2c->IC_DATA_CMD = i2c_instance_state[i2c_instance] + .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]; + } + } else { + // Sending data byte except last byte + i2c->IC_DATA_CMD = i2c_instance_state[i2c_instance] + .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]; + } + // Waiting until transmit fifo is empty + while (!(i2c->IC_STATUS_b.TFE)) + ; + // Breaking the loop, if abort occurred due to NACK from Slave + if (i2c->IC_RAW_INTR_STAT_b.TX_ABRT) { + (void)i2c->IC_CLR_TX_ABRT; + i2c_status = SL_I2C_NACK; + break; + } + } } - // Enables the interrupt. - sl_si91x_i2c_enable_interrupts(i2c, ZERO_FLAG); - // blocking here until all the bytes are sent - while (i2c_instance_state[i2c_instance].write_buffer_current_index - < i2c_instance_state[i2c_instance].write_buffer_length) - ; - (void)clear; } while (false); return i2c_status; } @@ -392,20 +426,66 @@ sl_i2c_status_t sl_i2c_driver_receive_data_blocking(sl_i2c_instance_t i2c_instan } // Enables the I2C peripheral. sl_si91x_i2c_enable(i2c); - // Sets the control direction to read. Also sets stop bit, if data length is one byte. + uint32_t transfer_length = i2c_instance_state[i2c_instance].read_buffer_length; + // Setting read control direction and stop bit together for one byte data length if ((rx_len == ONE) && (i2c_instance_state[i2c_instance].mode == SL_I2C_LEADER_MODE)) { sl_si91x_i2c_set_read_direction_and_stop_bit(i2c); } else { + // Setting only read control direction sl_si91x_i2c_control_direction(i2c, SL_I2C_READ_MASK); } - // Enabling the receive full and read request interrupt. - sl_si91x_i2c_set_interrupts(i2c, SL_I2C_EVENT_RECEIVE_FULL); - // Enables the interrupt. - sl_si91x_i2c_enable_interrupts(i2c, ZERO_FLAG); - // blocking here until all the bytes are received - while (i2c_instance_state[i2c_instance].read_buffer_current_index - < i2c_instance_state[i2c_instance].read_buffer_length) - ; + uint32_t temp_data_cmd = 0; + // Blocking here until receiving all bytes + while (i2c_instance_state[i2c_instance].read_buffer_current_index < transfer_length) { + // For follower mode + if (i2c_instance_state[i2c_instance].mode == SL_I2C_FOLLOWER_MODE) { + // Reading bytes as long as RFNE is set + while (!i2c->IC_STATUS_b.RFNE) + ; + // Receiving byte in follower mode + i2c_instance_state[i2c_instance].read_buffer[(i2c_instance_state[i2c_instance].read_buffer_current_index++)] = + i2c->IC_DATA_CMD_b.DAT; + // For leader mode + } else { + // Wait until receive FIFO is not empty + while (!i2c->IC_STATUS_b.RFNE) { + // Breaking the loop, if abort occurred due to NACK from Slave + if (i2c->IC_RAW_INTR_STAT_b.TX_ABRT) { + int clear = i2c->IC_CLR_TX_ABRT; + (void)clear; + i2c_status = SL_I2C_NACK; + break; + } + } + // Checking I2C status + if (i2c_status) { + break; + } + // Receiving byte in leader mode + i2c_instance_state[i2c_instance].read_buffer[(i2c_instance_state[i2c_instance].read_buffer_current_index++)] = + i2c->IC_DATA_CMD_b.DAT; + // Updating 'temp_data_cmd' variable to set read bit + temp_data_cmd = (BIT_SET << MASK_READ_BIT); + // Setting read bit till last byte + if (i2c_instance_state[i2c_instance].read_buffer_current_index < (transfer_length - 1)) { + i2c->IC_DATA_CMD = temp_data_cmd; + } + // Receiving last byte by adding stop bit, if repeated start is not enabled + if (i2c_instance_state[i2c_instance].read_buffer_current_index == (transfer_length - 1)) { + if (!(i2c_instance_state[i2c_instance].repeated_start_enable)) { + temp_data_cmd |= (BIT_SET << SL_STOP_BIT); + } + i2c->IC_DATA_CMD = temp_data_cmd; + } + // Breaking the loop, if abort occurred due to NACK from Slave + if (i2c->IC_RAW_INTR_STAT_b.TX_ABRT) { + int clear = i2c->IC_CLR_TX_ABRT; + (void)clear; + i2c_status = SL_I2C_NACK; + break; + } + } + } } while (false); return i2c_status; } @@ -464,6 +544,12 @@ sl_i2c_status_t sl_i2c_driver_send_data_non_blocking(sl_i2c_instance_t i2c_insta i2c_dma_tx_config(i2c); // Enables the I2C peripheral. sl_si91x_i2c_enable(i2c); + if (i2c_instance_state[i2c_instance].mode == SL_I2C_LEADER_MODE) { + // Unmasking I2C abort interrupt + sl_si91x_i2c_set_interrupts(i2c, SL_I2C_EVENT_TRANSMIT_ABORT); + // Enabling I2C interrupt for checking NACK from slave + sl_si91x_i2c_enable_interrupts(i2c, ZERO_FLAG); + } sl_dma_xfer_t dma_transfer_tx = { ZERO }; channel = p_dma_config->dma_tx_channel + ONE; channel_priority = ONE; @@ -554,6 +640,12 @@ sl_i2c_status_t sl_i2c_driver_receive_data_non_blocking(sl_i2c_instance_t i2c_in i2c_dma_rx_config(i2c); // Enables the I2C peripheral. sl_si91x_i2c_enable(i2c); + if (i2c_instance_state[i2c_instance].mode == SL_I2C_LEADER_MODE) { + // Unmasking I2C abort interrupt + sl_si91x_i2c_set_interrupts(i2c, SL_I2C_EVENT_TRANSMIT_ABORT); + // Enabling I2C interrupt for checking NACK from slave + sl_si91x_i2c_enable_interrupts(i2c, ZERO_FLAG); + } sl_dma_xfer_t dma_transfer_rx = { ZERO }; channel = p_dma_config->dma_rx_channel + ONE; channel_priority = ONE; @@ -594,7 +686,6 @@ sl_i2c_status_t sl_i2c_driver_receive_data_non_blocking(sl_i2c_instance_t i2c_in sl_si91x_dma_channel_enable(dma_number, p_dma_config->dma_rx_channel + ONE); sl_si91x_dma_enable(dma_number); if (leader_mode) { - // Enabling transmit FIFO DMA channel and setting transmit data Level i2c_dma_tx_config(i2c); sl_dma_xfer_t dma_transfer_tx = { ZERO }; channel = p_dma_config->dma_tx_channel + ONE; @@ -965,119 +1056,6 @@ static void wait_for_i2c_follower_ready(I2C_TypeDef *i2c) while (!i2c->IC_STATUS_b.SLV_HOLD_TX_FIFO_EMPTY) ; } - -/******************************************************************************* - * I2C handler function. - ******************************************************************************/ -static void i2c_handler(I2C_TypeDef *i2c) -{ - uint32_t status = 0; - uint32_t clear = 0; - sl_i2c_instance_t i2c_instance; - if (i2c == I2C0) { - i2c_instance = SL_I2C0; - } - if (i2c == I2C1) { - i2c_instance = SL_I2C1; - } - if (i2c == I2C2) { - i2c_instance = SL_I2C2; - } - // Checking interrupt status - status = i2c->IC_INTR_STAT; - if (status & (SL_I2C_EVENT_READ_REQ)) { - if (i2c_instance_state[i2c_instance].mode == SL_I2C_FOLLOWER_MODE) { - // waiting until the Tx FIFO has data to Transmit for the read request - while (!i2c->IC_STATUS_b.SLV_HOLD_TX_FIFO_EMPTY) - ; - // Clearing interrupt by reading the respective bit - clear = i2c->IC_CLR_RD_REQ_b.CLR_RD_REQ; - return; - } - } - if (status & SL_I2C_EVENT_RECEIVE_FULL) { - // For leader receive - if (i2c_instance_state[i2c_instance].mode == SL_I2C_LEADER_MODE) { - uint32_t temp_data_cmd; - if (i2c_instance_state[i2c_instance].read_buffer_current_index - < i2c_instance_state[i2c_instance].read_buffer_length) { - i2c_instance_state[i2c_instance].read_buffer[(i2c_instance_state[i2c_instance].read_buffer_current_index++)] = - i2c->IC_DATA_CMD_b.DAT; - if (i2c_instance_state[i2c_instance].read_buffer_current_index - == i2c_instance_state[i2c_instance].read_buffer_length) { - // After last data byte reception clearing and disabling interrupts - sl_si91x_i2c_clear_interrupts(i2c, SL_I2C_EVENT_RECEIVE_FULL); - } else { - temp_data_cmd = (BIT_SET << MASK_READ_BIT); - // Checking for last data byte and repeated start enable - if (!(i2c_instance_state[i2c_instance].repeated_start_enable)) { - if (i2c_instance_state[i2c_instance].read_buffer_current_index - == (i2c_instance_state[i2c_instance].read_buffer_length) - 1) { - // If the last byte is there to receive, and in leader mode, it needs - // tosend the stop byte. - temp_data_cmd |= (BIT_SET << STOP_BIT); - } - } - i2c->IC_DATA_CMD = temp_data_cmd; - } - } - } else { - // For follower receive - if (i2c_instance_state[i2c_instance].read_buffer_current_index - < i2c_instance_state[i2c_instance].read_buffer_length) { - i2c_instance_state[i2c_instance].read_buffer[(i2c_instance_state[i2c_instance].read_buffer_current_index++)] = - i2c->IC_DATA_CMD_b.DAT; - if (i2c_instance_state[i2c_instance].read_buffer_current_index - == i2c_instance_state[i2c_instance].read_buffer_length) { - // After last data byte reception clearing and disabling interrupts - sl_si91x_i2c_clear_interrupts(i2c, SL_I2C_EVENT_RECEIVE_FULL); - } - } - } - return; - } - // For leader transmit - if (status & SL_I2C_EVENT_TRANSMIT_EMPTY) { - if (i2c_instance_state[i2c_instance].mode == SL_I2C_LEADER_MODE) { - if (i2c_instance_state[i2c_instance].write_buffer_current_index - < i2c_instance_state[i2c_instance].write_buffer_length) { - // Checking for last data byte and repeated start enable - if ((i2c_instance_state[i2c_instance].write_buffer_current_index - == (i2c_instance_state[i2c_instance].write_buffer_length) - 1) - && (!(i2c_instance_state[i2c_instance].repeated_start_enable))) { - i2c->IC_DATA_CMD = (BIT_SET << STOP_BIT) - | i2c_instance_state[i2c_instance] - .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]; - } else { - sl_si91x_i2c_tx(i2c, - i2c_instance_state[i2c_instance] - .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]); - } - if (i2c_instance_state[i2c_instance].write_buffer_current_index - == i2c_instance_state[i2c_instance].write_buffer_length) { - // After last data byte reception clearing interrupts - sl_si91x_i2c_clear_interrupts(i2c, SL_I2C_EVENT_TRANSMIT_EMPTY); - } - } - } else { - // For follower transmit - if (i2c_instance_state[i2c_instance].write_buffer_current_index - < i2c_instance_state[i2c_instance].write_buffer_length) { - sl_si91x_i2c_tx(i2c, - i2c_instance_state[i2c_instance] - .write_buffer[(i2c_instance_state[i2c_instance].write_buffer_current_index++)]); - if (i2c_instance_state[i2c_instance].write_buffer_current_index - == i2c_instance_state[i2c_instance].write_buffer_length) { - // After last data byte reception clearing interrupts - sl_si91x_i2c_clear_interrupts(i2c, SL_I2C_EVENT_TRANSMIT_EMPTY); - } - } - } - return; - } - // to avoid unused variable warning - (void)clear; -} /******************************************************************************* * IRQ handler for I2C 0. ******************************************************************************/ @@ -1101,7 +1079,38 @@ void I2C2_IRQHandler(void) { i2c_handler(I2C2); } +/******************************************************************************* + * I2C handler function. + ******************************************************************************/ +static void i2c_handler(I2C_TypeDef *i2c) +{ + uint32_t status = 0; + uint32_t driver_status = 0; + sl_i2c_instance_t i2c_instance = 0; + if (i2c == I2C0) { + i2c_instance = SL_I2C0; + } else if (i2c == I2C1) { + i2c_instance = SL_I2C1; + } else if (i2c == I2C2) { + i2c_instance = SL_I2C2; + } + // Checking interrupt status + status = i2c->IC_INTR_STAT; + // Checking for abort interrupt + if (status & SL_I2C_EVENT_TRANSMIT_ABORT) { + // Checking if abort hits due to Nack from slave + if (i2c->IC_TX_ABRT_SOURCE & (0x7)) { + driver_status = SL_I2C_NACK; + i2c_callback_function_ptr[i2c_instance](i2c_instance, driver_status); + } + // clearing interrupt + int clear = i2c->IC_CLR_TX_ABRT; + (void)clear; + sl_si91x_i2c_disable_interrupts(i2c, SL_I2C_EVENT_TRANSMIT_ABORT); + return; + } +} /******************************************************************************* I2C DMA transfer callback function ******************************************************************************/ @@ -1186,6 +1195,6 @@ static void i2c_dma_error_callback(uint32_t channel, void *data) } else if (channel == 3) { i2c_callback_function_ptr[ONE](SL_I2C1, driver_status); } else if (channel == 5) { - i2c_callback_function_ptr[TWO](SL_I2C2, driver_status); + sl_si91x_i2c_disable_interrupts(I2C2, SL_I2C_EVENT_TRANSMIT_ABORT); } } diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_psram.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_psram.c index 7f4ab3c93..7663a541f 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_psram.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_psram.c @@ -979,15 +979,6 @@ sl_psram_return_type_t sl_si91x_psram_init() if ((psram_id.MFID == PSRAM_Device.deviceID.MFID) && (psram_id.KGD == PSRAM_Device.deviceID.KGD)) { - /* Configuring clock for PSRAM operation based on selected configs */ - QSPI_CLK_SRC_SEL_T clk_src = PSRAM_CLK_SOURCE_SEL; - - clkStatus = RSI_CLK_Qspi2ClkConfig(M4CLK, clk_src, 0, 0, PSRAM_FREQ_CLK_DIV_FACTOR); - - if (RSI_OK != clkStatus) { - return PSRAM_CLOCK_INIT_FAILURE; - } - if (PSRAM_INTERFACE_MODE == QUAD_MODE) { /*Set the PSRAM device to QPI mode*/ psram_enter_qpi_mode(); diff --git a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_watchdog_timer.c b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_watchdog_timer.c index 6711c8532..acc76d5ff 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_watchdog_timer.c +++ b/components/device/silabs/si91x/mcu/drivers/unified_api/src/sl_si91x_watchdog_timer.c @@ -81,55 +81,16 @@ void sl_si91x_watchdog_init_timer(void) } /******************************************************************************* -* @brief: Configures watchdog-timer clock sources -* -* @details: -* Configures the watchdog-timer low frequency and high frequency clock sources -* Also configures bg_pmu clock source +* @brief: This API is no longer supported due to the restriction on peripheral drivers to configuring clock *******************************************************************************/ sl_status_t sl_si91x_watchdog_configure_clock(watchdog_timer_clock_config_t *timer_clk_config_ptr) { - sl_status_t status = SL_STATUS_OK; - /* WDT_TIMER_UC is defined by default. when this macro (WDT_TIMER_UC) is defined, peripheral - * configuration is directly taken from the configuration set in the universal configuration (UC). - * if the application requires the configuration to be changed in run-time, undefined this macro - * and change the peripheral configuration through the sl_si91x_watchdog_configure_clock API. - */ -#if (WDT_TIMER_UC == 1) - timer_clk_config_ptr = &sl_watchdog_timer_clk_config_handle; -#endif - do { - // To validate the structure pointer, if the parameters is NULL, it - // will return an error code - if (timer_clk_config_ptr == NULL) { - status = SL_STATUS_NULL_POINTER; - break; - } - // Validating bg-pmu clock source value - if ((timer_clk_config_ptr->bg_pmu_clock_source != RO_32KHZ_CLOCK) - && (timer_clk_config_ptr->bg_pmu_clock_source != MCU_FSM__CLOCK)) { - status = SL_STATUS_INVALID_PARAMETER; - break; - } - // Validating low frequency FSM clock source value - if ((timer_clk_config_ptr->low_freq_fsm_clock_src != KHZ_RO_CLK_SEL) - && (timer_clk_config_ptr->low_freq_fsm_clock_src != KHZ_RC_CLK_SEL) - && (timer_clk_config_ptr->low_freq_fsm_clock_src != KHZ_XTAL_CLK_SEL)) { - status = SL_STATUS_INVALID_PARAMETER; - break; - } - // Validating high frequency FSM clock source value - if ((timer_clk_config_ptr->high_freq_fsm_clock_src != FSM_20MHZ_RO) - && (timer_clk_config_ptr->high_freq_fsm_clock_src != FSM_32MHZ_RC) - && (timer_clk_config_ptr->high_freq_fsm_clock_src != FSM_40MHZ_XTAL)) { - status = SL_STATUS_INVALID_PARAMETER; - break; - } - // FSM clock enable for WDT to be functional - // Enable clock sources - RSI_IPMU_ClockMuxSel(RO_32KHZ_CLOCK); - RSI_PS_FsmLfClkSel(timer_clk_config_ptr->low_freq_fsm_clock_src); - } while (false); + sl_status_t status = SL_STATUS_OK; // return ok to support backward compatibility + + // FSM LF Clock has already been configured in sl_system_init, + // This API is no longer supported due to the restriction on peripheral drivers to configure clocks + UNUSED_VARIABLE(timer_clk_config_ptr); + return status; } diff --git a/components/device/silabs/si91x/mcu/drivers/unified_peripheral_drivers/component/sl_sdio_secondary_peripheral.slcc b/components/device/silabs/si91x/mcu/drivers/unified_peripheral_drivers/component/sl_sdio_secondary_peripheral.slcc index 7813640be..9df934c70 100644 --- a/components/device/silabs/si91x/mcu/drivers/unified_peripheral_drivers/component/sl_sdio_secondary_peripheral.slcc +++ b/components/device/silabs/si91x/mcu/drivers/unified_peripheral_drivers/component/sl_sdio_secondary_peripheral.slcc @@ -19,5 +19,3 @@ include: - path: inc file_list: - path: sl_si91x_peripheral_sdio_secondary.h -define: - - name: __SYSTICK diff --git a/components/device/silabs/si91x/mcu/hal/inc/sl_si91x_hal_soc_soft_reset.h b/components/device/silabs/si91x/mcu/hal/inc/sl_si91x_hal_soc_soft_reset.h index 75083e14c..7812e0e73 100644 --- a/components/device/silabs/si91x/mcu/hal/inc/sl_si91x_hal_soc_soft_reset.h +++ b/components/device/silabs/si91x/mcu/hal/inc/sl_si91x_hal_soc_soft_reset.h @@ -31,48 +31,42 @@ #ifndef __SL_SI91X_HAL_SOC_SOFT_RESET__ #define __SL_SI91X_HAL_SOC_SOFT_RESET__ -/** @cond DOXYGEN_IGNORE */ - -#define M4_BBFF_STORAGE1 *(volatile uint32 *)0x24048580 -#define M4_QSPI_AES_CONFIG *(volatile uint32 *)0x120000C8 -#define AES_QSPI_KEY_SIZE BIT(16) -#define KEY_LENGTH BIT(11) +#include "rsi_qspi.h" +/** @cond DOXYGEN_IGNORE */ +#define M4_QSPI_AES_CONFIG *(volatile uint32 *)0x120000C8 +#define AES_QSPI_KEY_SIZE BIT(16) +#define AES_QSPI_KEY_LENGTH BIT(11) /** @endcond */ -/** - * @brief - * This API initializes and starts the Watchdog Timer (WDT) to perform a software reset of the Si91X SoC. - * - * @details - * This API triggers a software reset of the Si91X SoC, resetting the system to its initial state. - * The system will reset to its initial state once the WDT expires. - * This function also ensures that necessary configurations are applied before the system reset occurs, including setting the power for the WDT and configuring the NVIC to handle WDT interrupts. - * - * @note - * Ensure that all necessary data is saved before calling this function, as it will reset the entire system. - * This function is intended for use in situations where a full system reset is required. - */ -void sl_si91x_soc_soft_reset(void); - /** * \addtogroup SOFT_RESET_FUNCTIONS Soft Reset * \ingroup COMMON_SECTION_FUNCTIONS * @{ */ /** -* @brief -* Performs a Nested Vectored Interrupt Controller (NVIC) soft reset to the Si91X SoC. -* -* @details -* The function initiates a system reset request to reset the SoC. -* It resets the M4 core and the Network Processor (NWP) of the Si91X SoC, bringing the system back to its initial state. -* -* @note -* Ensure that all necessary data is saved before calling this function, as it will reset the NVIC and potentially disrupt ongoing processes. -*/ + * @brief To trigger a software reset of the Si91X SoC. + * + * @details This API triggers a software reset of the Si91X SoC, resetting the system to its initial state. + * The system will reset to its initial state once the WDT expires. + * This function also ensures that necessary configurations are applied before the system reset occurs, + * including setting the power for the WDT and configuring the NVIC to handle WDT interrupts. + * + * @note Ensure that all necessary data is saved before calling this function because it will reset the entire system. + * This function is intended for use in situations where a full system reset is required. + */ +void sl_si91x_soc_soft_reset(void); + +/** + * @brief To perform a Nested Vectored Interrupt Controller (NVIC) soft reset on the Si91X SoC. + * + * @details This function initiates a system reset request to reset the SoC. + * It resets the M4 core and the Network Processor (NWP) of the Si91X SoC, bringing the system back to its initial state. + * + * @note Ensure that all necessary data is saved before calling this function because it will reset the NVIC and potentially disrupt ongoing processes. + */ void sl_si91x_soc_nvic_reset(void); /** @} */ -#endif \ No newline at end of file +#endif diff --git a/components/device/silabs/si91x/mcu/hal/src/sl_si91x_hal_soc_soft_reset.c b/components/device/silabs/si91x/mcu/hal/src/sl_si91x_hal_soc_soft_reset.c index df1630aa1..eb8068e3a 100644 --- a/components/device/silabs/si91x/mcu/hal/src/sl_si91x_hal_soc_soft_reset.c +++ b/components/device/silabs/si91x/mcu/hal/src/sl_si91x_hal_soc_soft_reset.c @@ -68,7 +68,7 @@ void sl_si91x_soc_soft_reset(void) /*Upon Reset key size is 16 by default in case of inline encryption */ /*Store key length bit (32 Bytes) in BBFF if device security is with 32 Bytes key*/ if (M4_QSPI_AES_CONFIG & AES_QSPI_KEY_SIZE) { - M4_BBFF_STORAGE1 |= KEY_LENGTH; + M4_BBFF_STORAGE1 |= AES_QSPI_KEY_LENGTH; } while (1) ; @@ -84,7 +84,7 @@ void sl_si91x_soc_nvic_reset(void) /*Upon Reset key size is 16 by default in case of inline encryption */ /*Store key length bit (32 Bytes) in BBFF if device security is with 32 Bytes key*/ if (M4_QSPI_AES_CONFIG & AES_QSPI_KEY_SIZE) { - M4_BBFF_STORAGE1 |= KEY_LENGTH; + M4_BBFF_STORAGE1 |= AES_QSPI_KEY_LENGTH; } __asm volatile("cpsid i" ::: "memory"); /*Data Synchronization Barrier */ diff --git a/components/device/silabs/si91x/mcu/toolchain/linkerfile_SoC.ld.jinja b/components/device/silabs/si91x/mcu/toolchain/linkerfile_SoC.ld.jinja index cd3091c9e..b431eec75 100644 --- a/components/device/silabs/si91x/mcu/toolchain/linkerfile_SoC.ld.jinja +++ b/components/device/silabs/si91x/mcu/toolchain/linkerfile_SoC.ld.jinja @@ -121,7 +121,7 @@ SECTIONS {% endif %} {% if power_manager_ps2 %} - *(EXCLUDE_FILE( *cmsis_gcc.o *cmsis_os2.o *port.o *queue.o *sl_rsi_utility.o *tasks.o *clock_update.o *rsi_deepsleep_soc.o *rsi_egpio.o *rsi_ipmu.o *ipmu_apis.o *rsi_pll.o *rsi_power_save.o *rsi_ps_ram_func.o *rsi_system_config.o *rsi_time_period.o *rsi_ulpss_clk.o *system_si91x.o *sl_slist.o *strcmp.o *sl_si91x_power_manager.o *sli_si91x_power_manager.o *sl_si91x_power_manager_handler.o *sl_si91x_power_manager_debug.o *sli_si91x_power_manager_wakeup_init.o *sl_si91x_power_manager_wakeup_handler.o *sl_sleeptimer.o *sl_sleeptimer_hal_si91x_sysrtc.o *rsi_sysrtc.o *sl_si91x_low_power_tickless_mode.o *sl_core_cortexm.o *UDMA.o {% for c in debug_ps2 %}*{{c}} {% endfor %}{% for c in calendar_ps2 %}*{{c}} {% endfor %}{% for c in ulp_timer_ps2 %}*{{c}} {% endfor %}{% for c in wdt_ps2 %}*{{c}} {% endfor %}{% for c in adc_ps2 %}*{{c}} {% endfor %}{% for c in bod_ps2 %}*{{c}} {% endfor %}{% for c in comparator_ps2 %}*{{c}} {% endfor %}{% for c in cts_ps2 %}*{{c}} {% endfor %}{% for c in dac_ps2 %}*{{c}} {% endfor %}{% for c in dma_ps2 %}*{{c}} {% endfor %}{% for c in gpio_ps2 %}*{{c}} {% endfor %}{% for c in i2c_ps2 %}*{{c}} {% endfor %}{% for c in i2s_ps2 %}*{{c}} {% endfor %}{% for c in ir_ps2 %}*{{c}} {% endfor %}{% for c in ssi_ps2 %}*{{c}} {% endfor %}{% for c in sysrtc_ps2 %}*{{c}} {% endfor %}{% for c in usart_ps2 %}*{{c}} {% endfor %}{% for c in user_files_ps2 %}*{{c}} {% endfor %}) .text*) + *(EXCLUDE_FILE( *cmsis_gcc.o *cmsis_os2.o *port.o *queue.o *sl_rsi_utility.o *tasks.o *rsi_hal_mcu_m4_rom.o *rsi_hal_mcu_m4_ram.o *clock_update.o *rsi_deepsleep_soc.o *rsi_egpio.o *rsi_ipmu.o *ipmu_apis.o *rsi_pll.o *rsi_power_save.o *rsi_ps_ram_func.o *rsi_system_config.o *rsi_time_period.o *rsi_ulpss_clk.o *system_si91x.o *sl_slist.o *strcmp.o *sl_si91x_power_manager.o *sli_si91x_power_manager.o *sl_si91x_power_manager_handler.o *sl_si91x_power_manager_debug.o *sli_si91x_power_manager_wakeup_init.o *sl_si91x_power_manager_wakeup_handler.o *sl_sleeptimer.o *sl_sleeptimer_hal_si91x_sysrtc.o *rsi_sysrtc.o *sl_si91x_low_power_tickless_mode.o *sl_core_cortexm.o *UDMA.o {% for c in debug_ps2 %}*{{c}} {% endfor %}{% for c in calendar_ps2 %}*{{c}} {% endfor %}{% for c in ulp_timer_ps2 %}*{{c}} {% endfor %}{% for c in wdt_ps2 %}*{{c}} {% endfor %}{% for c in adc_ps2 %}*{{c}} {% endfor %}{% for c in bod_ps2 %}*{{c}} {% endfor %}{% for c in comparator_ps2 %}*{{c}} {% endfor %}{% for c in cts_ps2 %}*{{c}} {% endfor %}{% for c in dac_ps2 %}*{{c}} {% endfor %}{% for c in dma_ps2 %}*{{c}} {% endfor %}{% for c in gpio_ps2 %}*{{c}} {% endfor %}{% for c in i2c_ps2 %}*{{c}} {% endfor %}{% for c in i2s_ps2 %}*{{c}} {% endfor %}{% for c in ir_ps2 %}*{{c}} {% endfor %}{% for c in ssi_ps2 %}*{{c}} {% endfor %}{% for c in sysrtc_ps2 %}*{{c}} {% endfor %}{% for c in usart_ps2 %}*{{c}} {% endfor %}{% for c in user_files_ps2 %}*{{c}} {% endfor %}) .text*) {%- endif %} @@ -240,6 +240,8 @@ SECTIONS *tasks.o(.text*) *clock_update.o(.text*) *rsi_deepsleep_soc.o(.text*) + *rsi_hal_mcu_m4_ram.o(.text*) + *rsi_hal_mcu_m4_rom.o(.text*) *rsi_egpio.o(.text*) *rsi_ipmu.o(.text*) *ipmu_apis.o(.text*) diff --git a/components/device/silabs/si91x/mcu/toolchain/linkerfile_psram_SoC.ld.jinja b/components/device/silabs/si91x/mcu/toolchain/linkerfile_psram_SoC.ld.jinja index 28313d982..36f736adf 100644 --- a/components/device/silabs/si91x/mcu/toolchain/linkerfile_psram_SoC.ld.jinja +++ b/components/device/silabs/si91x/mcu/toolchain/linkerfile_psram_SoC.ld.jinja @@ -132,9 +132,9 @@ SECTIONS KEEP(*(.isr_vector)) {% if (psram_present and psram_linker_config_enabled and ram_execution) %} KEEP(*(.reset_handler)) - *(EXCLUDE_FILE(*sl_si91x_bus.o *sl_si91x_driver.o *sli_si91x_multithreaded.o *rsi_deepsleep_soc.o *rsi_hal_mcu_m4_ram.o *rsi_hal_mcu_m4_rom.o *sl_sleeptimer.o *sl_sleeptimer_hal_si91x_sysrtc.o *rsi_sysrtc.o *sl_si91x_low_power_tickless_mode.o *croutine.o *event_groups.o *list.o *queue.o *stream_buffer.o *tasks.o *timers.o *cmsis_os2.o *freertos_umm_malloc_host.o *malloc_buffers.o *port.o *heap_*.o *sl_si91x_psram.o *rsi_qspi.o *rsi_pll.o *rsi_egpio.o *UDMA.o *sl_rsi_utility.o *ipmu_apis.o *rsi_d_cache.o) .text*) + *(EXCLUDE_FILE(*sl_si91x_bus.o *sl_si91x_driver.o *sli_si91x_multithreaded.o *rsi_deepsleep_soc.o *rsi_hal_mcu_m4_ram.o *rsi_hal_mcu_m4_rom.o *sl_sleeptimer.o *sl_sleeptimer_hal_si91x_sysrtc.o *rsi_sysrtc.o *sl_si91x_low_power_tickless_mode.o *croutine.o *event_groups.o *list.o *queue.o *stream_buffer.o *tasks.o *timers.o *cmsis_os2.o *freertos_umm_malloc_host.o *malloc_buffers.o *port.o *heap_*.o *sl_si91x_psram.o *rsi_qspi.o *rsi_pll.o *rsi_egpio.o *UDMA.o *sl_rsi_utility.o *ipmu_apis.o *rsi_d_cache.o *sli_si91x_power_manager.o *sl_si91x_power_manager.o *sl_platform.o) .text*) {%- else %} - *(EXCLUDE_FILE(*UDMA.o).text*) + *(EXCLUDE_FILE(*UDMA.o *rsi_d_cache.o).text*) KEEP(*(.init)) KEEP(*(.fini)) {% endif %} @@ -193,7 +193,7 @@ SECTIONS __etext = .; {% if data_segment_in_psram %} - {% if psram_present and psram_linker_config_enabled and ram_execution %} + {% if psram_present and psram_linker_config_enabled %} _slpcode = __etext; . = _last_ram_location; @@ -205,6 +205,7 @@ SECTIONS /* _scode is used in code startup code */ _scode = __sleep_code_start__; . = ALIGN(4); + {% if ram_execution %} KEEP(*(.ramVector)) *rsi_deepsleep_soc.o(.text*) *sl_si91x_psram.o(.text*) @@ -221,8 +222,7 @@ SECTIONS *rsi_hal_mcu_m4_ram.o(.text*) *rsi_hal_mcu_m4_rom.o(.text*) *sl_si91x_driver.o(.text*) - *sl_si91x_bus.o(.text*) - *UDMA.o(.text*) + *sl_si91x_bus.o(.text*) *sl_sleeptimer.o(.text*) *sl_sleeptimer_hal_si91x_sysrtc.o(.text*) *rsi_sysrtc.o(.text*) @@ -243,6 +243,16 @@ SECTIONS *heap_*.o(.text*) *ipmu_apis.o(.text*) *rsi_d_cache.o(.text*) + *sl_si91x_power_manager.o(.text*) + *sli_si91x_power_manager.o(.text*) + *sl_si91x_power_manager.o(.data*) + *sli_si91x_power_manager.o(.data*) + *sl_platform.o(.text*) + *UDMA.o(.text*) + {% else %} + *UDMA.o(.text*) + *rsi_d_cache.o(.text*) + {% endif %} __sleep_code_end__ = .; /* _ecode is used in code startup code */ _ecode = __sleep_code_end__; @@ -333,11 +343,16 @@ SECTIONS *sl_rsi_utility.o(.text*) *port.o(.text*) *heap_*.o(.text*) + *rsi_d_cache.o(.text*) + *sl_platform.o(.text*) *(.data*) - {%- else %} - *(.data*) - *UDMA.o(.text*) - {% endif %} + {% elif (not data_segment_in_psram and not ram_execution) %} + *UDMA.o(.text*) + *rsi_d_cache.o(.text*) + *(.data*) + {%- else %} + *(.data*) + {% endif %} . = ALIGN(4); /* preinit data */ @@ -486,4 +501,4 @@ SECTIONS {%- endif %} {%- endif %} {% endif %} -} +} \ No newline at end of file diff --git a/components/device/silabs/si91x/wireless/ahb_interface/src/sl_platform.c b/components/device/silabs/si91x/wireless/ahb_interface/src/sl_platform.c index 0e06d9094..a9fd48d14 100644 --- a/components/device/silabs/si91x/wireless/ahb_interface/src/sl_platform.c +++ b/components/device/silabs/si91x/wireless/ahb_interface/src/sl_platform.c @@ -24,11 +24,13 @@ #include #include "sl_component_catalog.h" #include "sl_board_configuration.h" +#include "rsi_rom_clks.h" #if defined(SL_CATALOG_KERNEL_PRESENT) #include "cmsis_os2.h" #include "FreeRTOSConfig.h" #endif + sl_status_t sli_si91x_submit_rx_pkt(void); void sl_board_enable_vcom(void); sl_status_t si91x_bootup_firmware(const uint8_t select_option); @@ -49,6 +51,10 @@ void sli_si91x_platform_init(void) SysTick_Config(SystemCoreClock / configTICK_RATE_HZ); // Set P2P Intr priority NVIC_SetPriority(SysTick_IRQn, SYSTICK_INTR_PRI); +#endif +#ifdef SLI_SI91X_MCU_PSRAM_PRESENT + RSI_CLK_SetIntfPllFreq(M4CLK, MAX_INTF_PLL_FREQUENCY, XTAL_CLK_FREQ); + RSI_CLK_Qspi2ClkConfig(M4CLK, QSPI_INTFPLLCLK, 0, 0, 1); #endif //On boot-up, verify the M4_wakeup_TA bit in the P2P status register and clearing the bit if it is set. if ((P2P_STATUS_REG & M4_wakeup_TA)) { diff --git a/components/device/silabs/si91x/wireless/asynchronous_socket/inc/sl_si91x_socket.h b/components/device/silabs/si91x/wireless/asynchronous_socket/inc/sl_si91x_socket.h index d3bae61fd..785f122ef 100644 --- a/components/device/silabs/si91x/wireless/asynchronous_socket/inc/sl_si91x_socket.h +++ b/components/device/silabs/si91x/wireless/asynchronous_socket/inc/sl_si91x_socket.h @@ -101,6 +101,7 @@ int sl_si91x_socket_async(int family, int type, int protocol, receive_data_callb * - @ref SL_SI91X_SO_SSL_V_1_3_ENABLE * - @ref SL_SI91X_SO_CERT_INDEX * - @ref SL_SI91X_SO_TLS_SNI + * - @ref SL_SI91X_SO_TLS_ALPN * - @ref SL_SI91X_SO_MAX_RETRANSMISSION_TIMEOUT_VALUE * * @param[in] option_value diff --git a/components/device/silabs/si91x/wireless/asynchronous_socket/src/sl_si91x_socket.c b/components/device/silabs/si91x/wireless/asynchronous_socket/src/sl_si91x_socket.c index 4f4d17a11..19aa6cc8b 100644 --- a/components/device/silabs/si91x/wireless/asynchronous_socket/src/sl_si91x_socket.c +++ b/components/device/silabs/si91x/wireless/asynchronous_socket/src/sl_si91x_socket.c @@ -321,9 +321,10 @@ int sl_si91x_setsockopt_async(int32_t sockID, break; } - case SL_SI91X_SO_TLS_SNI: { - sl_status_t status = add_server_name_indication_extension(&si91x_socket->sni_extensions, - (const si91x_socket_type_length_value_t *)option_value); + case SL_SI91X_SO_TLS_SNI: + case SL_SI91X_SO_TLS_ALPN: { + sl_status_t status = sli_si91x_add_tls_extension(&si91x_socket->tls_extensions, + (const sl_si91x_socket_type_length_value_t *)option_value); if (status != SL_STATUS_OK) { SET_ERROR_AND_RETURN(ENOMEM); diff --git a/components/device/silabs/si91x/wireless/inc/sl_rsi_utility.h b/components/device/silabs/si91x/wireless/inc/sl_rsi_utility.h index a468bd125..b4bc01417 100644 --- a/components/device/silabs/si91x/wireless/inc/sl_rsi_utility.h +++ b/components/device/silabs/si91x/wireless/inc/sl_rsi_utility.h @@ -87,6 +87,11 @@ typedef struct { uint32_t queued_packet_count; } si91x_packet_queue_t; +void sli_handle_wifi_beacon(sl_si91x_packet_t *packet); +sl_status_t sli_wifi_get_stored_scan_results(sl_wifi_interface_t interface, + sl_wifi_extended_scan_result_parameters_t *extended_scan_parameters); +void sli_wifi_flush_scan_results_database(void); + typedef uint32_t sl_si91x_host_timestamp_t; typedef void (*sl_si91x_host_atomic_action_function_t)(void *user_data); diff --git a/components/device/silabs/si91x/wireless/inc/sl_si91x_driver.h b/components/device/silabs/si91x/wireless/inc/sl_si91x_driver.h index e887baada..2801169ea 100644 --- a/components/device/silabs/si91x/wireless/inc/sl_si91x_driver.h +++ b/components/device/silabs/si91x/wireless/inc/sl_si91x_driver.h @@ -735,6 +735,12 @@ sl_status_t sl_si91x_frequency_offset(const sl_si91x_freq_offset_t *frequency_ca * * @return * sl_status_t. See [Status Codes](https://docs.silabs.com/gecko-platform/latest/platform-common/status) and [Additional Status Codes](../wiseconnect-api-reference-guide-err-codes/sl-additional-status-errors) for details. + * @note + * In FCC-certifed module the behavior is as follows + * 1. Region configuration is not supported and if triggered will return error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE. + * 2. STA mode channels 1 to 11 are actively scanned and 12,13,14 are passively scanned. + * 3. AP mode and Concurrent mode supports only 1 to 11 channels. + * 4. The AP will not broadcast the Country Information Element (IE). ******************************************************************************/ sl_status_t sl_si91x_set_device_region(sl_si91x_operation_mode_t operation_mode, sl_si91x_band_mode_t band, @@ -760,6 +766,7 @@ sl_status_t sl_si91x_set_device_region(sl_si91x_operation_mode_t operation_mode, * * @note * Executing this API will overwrite calibration values in certified modules. + * In FCC-certified modules, this API will trigger an error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE if used, except when in SL_SI91X_TRANSMIT_TEST_MODE mode. ******************************************************************************/ sl_status_t sl_si91x_calibration_write(sl_si91x_calibration_write_t calib_write); @@ -808,6 +815,8 @@ sl_status_t sl_si91x_calibration_read(sl_si91x_calibration_read_t target, * * @return * sl_status_t. See [Status Codes](https://docs.silabs.com/gecko-platform/latest/platform-common/status) and [Additional Status Codes](../wiseconnect-api-reference-guide-err-codes/sl-additional-status-errors) for details. + * @note + * In FCC-certified modules, this API will trigger an error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE if used, except when in SL_SI91X_TRANSMIT_TEST_MODE mode. ******************************************************************************/ sl_status_t sl_si91x_evm_offset(const sl_si91x_evm_offset_t *evm_offset); @@ -829,6 +838,8 @@ sl_status_t sl_si91x_evm_offset(const sl_si91x_evm_offset_t *evm_offset); * * @return * sl_status_t. See [Status Codes](https://docs.silabs.com/gecko-platform/latest/platform-common/status) and [Additional Status Codes](../wiseconnect-api-reference-guide-err-codes/sl-additional-status-errors) for details. + * @note + * In FCC-certified modules, this API will trigger an error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE if used, except when in SL_SI91X_TRANSMIT_TEST_MODE mode. ******************************************************************************/ sl_status_t sl_si91x_evm_write(const sl_si91x_evm_write_t *evm_write); @@ -872,6 +883,8 @@ sl_status_t sl_si91x_efuse_read(const sl_si91x_efuse_read_t *efuse_read, uint8_t * * @return * sl_status_t. See [Status Codes](https://docs.silabs.com/gecko-platform/latest/platform-common/status) and [Additional Status Codes](../wiseconnect-api-reference-guide-err-codes/sl-additional-status-errors) for details. + * @note + * In FCC-certified modules, this API will trigger an errorSL_STATUS_SI91X_FEATURE_NOT_AVAILABLE if used, except when in SL_SI91X_TRANSMIT_TEST_MODE mode. ******************************************************************************/ sl_status_t sl_si91x_dpd_calibration(const sl_si91x_get_dpd_calib_data_t *dpd_calib_data); diff --git a/components/device/silabs/si91x/wireless/inc/sl_si91x_types.h b/components/device/silabs/si91x/wireless/inc/sl_si91x_types.h index f588b1ca6..dd49dc0a4 100644 --- a/components/device/silabs/si91x/wireless/inc/sl_si91x_types.h +++ b/components/device/silabs/si91x/wireless/inc/sl_si91x_types.h @@ -109,6 +109,7 @@ typedef enum { WORLD_DOMAIN, ///< Worldwide domain KR, ///< Korea SG, ///< Singapore (not currently supported) + CN, ///< China IGNORE_REGION ///< Do not update region code during initialization } sl_si91x_region_code_t; diff --git a/components/device/silabs/si91x/wireless/inc/sl_wifi_device.h b/components/device/silabs/si91x/wireless/inc/sl_wifi_device.h index 9947bc396..12e8ef1c2 100644 --- a/components/device/silabs/si91x/wireless/inc/sl_wifi_device.h +++ b/components/device/silabs/si91x/wireless/inc/sl_wifi_device.h @@ -822,14 +822,23 @@ */ #define SL_SI91X_EXT_FEAT_WOWLAN_DISABLE BIT(17) +/** + * @def SL_SI91X_EXT_FEAT_DISABLE_XTAL_CORRECTION + * @brief To disable auto correction of XTAL (40MHz crystal) + * @details Enabling this bit will disable the automatic compensation for frequency offsets, ensuring error-free calibration. + * + * @note This bit should be enabled in the following cases: + * @note 1. Always enable it in the Calibration application. + * @note 2. Enable it for all applications for the customer hardware with an XTAL part number other than 8Y40070013. + */ +#define SL_SI91X_EXT_FEAT_DISABLE_XTAL_CORRECTION BIT(18) + /** * @def SL_SI91X_EXT_FEAT_LOW_POWER_MODE * @brief To enable low power mode in WLAN. * @details Enabling this bit activates low power mode for WLAN, Active current will also be reduced. * As most of the code which is needed to maintain connection is kept in RAM. * There will be minimal execution of code from Flash which in turn results in low average current. - * - * @note Bit 18 is reserved. */ #define SL_SI91X_EXT_FEAT_LOW_POWER_MODE BIT(19) @@ -1053,7 +1062,7 @@ * @note For 917 radio boards, set `SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE` to 1. For other variants, a value of 2 is recommended. */ -#ifdef SL_SI91X_MODULE_BOARD +#ifdef SI91X_32kHz_EXTERNAL_OSCILLATOR #define SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(xtal_clk_enable) (xtal_clk_enable << 23) #else #define SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(xtal_clk_enable) (xtal_clk_enable << 22) diff --git a/components/device/silabs/si91x/wireless/sl_net/src/sl_net_si91x_integration_handler.c b/components/device/silabs/si91x/wireless/sl_net/src/sl_net_si91x_integration_handler.c index 8deb40ba0..36e51d47d 100644 --- a/components/device/silabs/si91x/wireless/sl_net/src/sl_net_si91x_integration_handler.c +++ b/components/device/silabs/si91x/wireless/sl_net/src/sl_net_si91x_integration_handler.c @@ -180,13 +180,32 @@ void sl_net_si91x_event_dispatch_handler(sli_si91x_queue_packet_t *data, sl_si91 if (packet->command == RSI_WLAN_RSP_JOIN || packet->command == RSI_WLAN_RSP_IPV4_CHANGE || packet->command == RSI_WLAN_RSP_IPCONFV4 || ((packet->command == RSI_WLAN_RSP_IPCONFV6) && (data->frame_status))) { + // free all TX queues except BT - for (int queue_id = 0; queue_id < SI91X_BT_CMD; queue_id++) { + for (int queue_id = 0; queue_id < SI91X_SOCKET_CMD; queue_id++) { sli_si91x_flush_queue_based_on_type(queue_id, si91x_node_free_function); } #if defined(SLI_SI91X_OFFLOAD_NETWORK_STACK) && defined(SLI_SI91X_SOCKETS) - // Free all allocated sockets - sl_si91x_vap_shutdown(SL_SI91X_WIFI_CLIENT_VAP_ID); + uint8_t vap_id = packet->desc[7]; // Get vap id from firmware response packet + + // Reset all the sockets that match the vap id + for (uint8_t index = 0; index < NUMBER_OF_SOCKETS; index++) { + si91x_socket_t *socket = get_si91x_socket(index); + // Check if socket exists + if ((socket != NULL) && (socket->vap_id == vap_id)) { + socket->state = DISCONNECTED; + + /* Flush the pending tx request packets from the socket command queue */ + sl_si91x_host_flush_nodes_from_queue( + SI91X_SOCKET_CMD_QUEUE, + &socket->id, + (sl_si91x_compare_function_t)sli_si91x_socket_identification_function_based_on_socketid, + si91x_node_free_function); + } + } + + // Free all the allocated sockets for the given vap id + sl_si91x_vap_shutdown(vap_id); // ToDo: Need to discuss on this... #endif } diff --git a/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_constants.h b/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_constants.h index aad57b70c..1f039f66c 100644 --- a/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_constants.h +++ b/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_constants.h @@ -50,6 +50,9 @@ #define SI91X_CERT_INDEX_1 1 #define SI91X_CERT_INDEX_2 2 +#define SL_SI91X_TLS_EXTENSION_SNI_TYPE 1 ///< TLS extension for SNI +#define SL_SI91X_TLS_EXTENSION_ALPN_TYPE 2 ///< TLS extension for ALPN + #define SI91X_SOCKET_TCP_CLIENT 0x0000 #define SI91X_SOCKET_UDP_CLIENT 0x0001 #define SI91X_SOCKET_TCP_SERVER 0x0002 @@ -86,6 +89,7 @@ #define SL_SI91X_SO_MSS 40 ///< To configure the TCP MSS #define SL_SI91X_SO_SOCK_VAP_ID 25 ///< To configure the socket VAP ID #define SL_SI91X_SO_TLS_SNI 47 ///< To configure the TLS SNI extension +#define SL_SI91X_SO_TLS_ALPN 50 ///< To configure the TLS ALPN extension /** @} */ #define SHUTDOWN_BY_ID 0 diff --git a/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_types.h b/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_types.h index ee1b0979c..fae2f4716 100644 --- a/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_types.h +++ b/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_types.h @@ -178,13 +178,6 @@ typedef void (*select_callback)(fd_set *fd_read, fd_set *fd_write, fd_set *fd_ex */ typedef void (*remote_socket_termination_callback)(int socket, uint16_t port, uint32_t bytes_sent); -/// Si91x specific socket type length value -typedef struct { - uint16_t type; ///< Socket type - uint16_t length; ///< Data length - uint8_t value[]; ///< Data -} si91x_socket_type_length_value_t; - /** @} */ /// Internal si91x BSD socket status @@ -201,32 +194,32 @@ typedef enum { #define SI91X_MAX_SIZE_OF_EXTENSION_DATA 256 #pragma pack() -/// Internal si91x server name indication extensions +/// Internal si91x TLS extensions typedef struct { uint8_t buffer[SI91X_MAX_SIZE_OF_EXTENSION_DATA]; ///< Buffer uint16_t total_extensions; ///< Total extensions uint16_t current_size_of_extensions; ///< Current size of extensions -} si91x_server_name_indication_extensions_t; +} sli_si91x_tls_extensions_t; #pragma pack() /// Internal si91x socket handle typedef struct { - int32_t id; ///< Socket ID - int32_t type; ///< Socket type - int role; ///< Socket role - int32_t protocol; ///< Protocol - uint16_t tcp_keepalive_initial_time; ///< TCP keepalive intial time - uint8_t max_tcp_retries; ///< MAX TCOP retries - uint16_t read_timeout; ///< Read timeout - uint8_t certificate_index; ///< Certificate Index - uint8_t vap_id; ///< Virtual AP ID - uint16_t mss; ///< Maximum segment size (MSS) value - struct sockaddr_in6 local_address; ///< Using sockaddr_in6 to hold either IPV4 or IPV6. - struct sockaddr_in6 remote_address; ///< Using sockaddr_in6 to hold either IPV4 or IPV6. - si91x_bsd_socket_state_t state; ///< BSD socket state (used for internal tracking) - si91x_server_name_indication_extensions_t sni_extensions; ///< SNI Extension - bool is_waiting_on_ack; ///< Boolean flag to check if socket is waiting for an ack. + int32_t id; ///< Socket ID + int32_t type; ///< Socket type + int role; ///< Socket role + int32_t protocol; ///< Protocol + uint16_t tcp_keepalive_initial_time; ///< TCP keepalive intial time + uint8_t max_tcp_retries; ///< MAX TCOP retries + uint16_t read_timeout; ///< Read timeout + uint8_t certificate_index; ///< Certificate Index + uint8_t vap_id; ///< Virtual AP ID + uint16_t mss; ///< Maximum segment size (MSS) value + struct sockaddr_in6 local_address; ///< Using sockaddr_in6 to hold either IPV4 or IPV6. + struct sockaddr_in6 remote_address; ///< Using sockaddr_in6 to hold either IPV4 or IPV6. + si91x_bsd_socket_state_t state; ///< BSD socket state (used for internal tracking) + sli_si91x_tls_extensions_t tls_extensions; ///< TLS Extension + bool is_waiting_on_ack; ///< Boolean flag to check if socket is waiting for an ack. #ifdef SLI_SI917 uint32_t ssl_bitmap; ///< SSL bitmap uint32_t max_retransmission_timeout_value; ///< Max retransmission timeout value diff --git a/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_utility.h b/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_utility.h index dbd785844..6e8b8c3af 100644 --- a/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_utility.h +++ b/components/device/silabs/si91x/wireless/socket/inc/sl_si91x_socket_utility.h @@ -103,6 +103,14 @@ typedef struct { uint8_t tcp_rx_window_div_factor; ///< TCP RX window division factor, increases ACK frequency for asynchronous sockets } sl_si91x_socket_config_t; + +/// SiWx91x specific socket type length value +typedef struct { + uint16_t type; ///< Socket type + uint16_t length; ///< Data length + uint8_t value[]; ///< Data +} sl_si91x_socket_type_length_value_t; + /** @} */ /** @@ -166,8 +174,8 @@ si91x_socket_t *get_si91x_socket(int socket_id); */ bool is_port_available(uint16_t port_number); -sl_status_t add_server_name_indication_extension(si91x_server_name_indication_extensions_t *socket_sni_extensions, - const si91x_socket_type_length_value_t *sni_extension); +sl_status_t sli_si91x_add_tls_extension(sli_si91x_tls_extensions_t *socket_tls_extensions, + const sl_si91x_socket_type_length_value_t *tls_extension); sl_status_t create_and_send_socket_request(int socketIdIndex, int type, const int *backlog); @@ -183,6 +191,8 @@ int handle_select_response(const sl_si91x_socket_select_rsp_t *response, fd_set *writefds, fd_set *exception_fd); +uint8_t sli_si91x_socket_identification_function_based_on_socketid(sl_wifi_buffer_t *buffer, void *user_data); + void set_select_callback(select_callback callback); void sli_si91x_set_accept_callback(si91x_socket_t *server_socket, accept_callback callback, int32_t client_socket_id); diff --git a/components/device/silabs/si91x/wireless/socket/src/sl_si91x_socket_utility.c b/components/device/silabs/si91x/wireless/socket/src/sl_si91x_socket_utility.c index db9893660..e1980d373 100644 --- a/components/device/silabs/si91x/wireless/socket/src/sl_si91x_socket_utility.c +++ b/components/device/silabs/si91x/wireless/socket/src/sl_si91x_socket_utility.c @@ -256,27 +256,29 @@ bool is_port_available(uint16_t port_number) } /** - * @brief This function is responsible to copy the SNI information provided by application into socket structure. + * @brief This function is responsible to copy the TLS extension information provided by application into socket structure. * - * @param socket_sni_extensions pointer to SNI extension in socket structure - * @param sni_extension pointer to the SNI information provided by application + * @param socket_tls_extensions pointer to TLS extension in socket structure + * @param tls_extension pointer to the TLS information provided by application * @return sl_status_t possible return values are SL_STATUS_OK and SL_STATUS_SI91X_MEMORY_ERROR */ -sl_status_t add_server_name_indication_extension(si91x_server_name_indication_extensions_t *socket_sni_extensions, - const si91x_socket_type_length_value_t *sni_extension) +sl_status_t sli_si91x_add_tls_extension(sli_si91x_tls_extensions_t *socket_tls_extensions, + const sl_si91x_socket_type_length_value_t *tls_extension) { - // To check if memory available for new extension in SNI buffer of socket, max 256 Bytes only - if (SI91X_MAX_SIZE_OF_EXTENSION_DATA - socket_sni_extensions->current_size_of_extensions - < (int)(sizeof(si91x_socket_type_length_value_t) + sni_extension->length)) { + // To check if memory available for new extension in buffer of socket, max 256 Bytes only + if (SI91X_MAX_SIZE_OF_EXTENSION_DATA - socket_tls_extensions->current_size_of_extensions + < (int)(sizeof(sl_si91x_socket_type_length_value_t) + tls_extension->length)) { return SL_STATUS_SI91X_MEMORY_ERROR; } - uint8_t sni_size = (uint8_t)(sizeof(si91x_socket_type_length_value_t) + sni_extension->length); + uint8_t extension_size = (uint8_t)(sizeof(sl_si91x_socket_type_length_value_t) + tls_extension->length); - // copies SNI provided by app into SDK socket struct - memcpy(&socket_sni_extensions->buffer[socket_sni_extensions->current_size_of_extensions], sni_extension, sni_size); - socket_sni_extensions->current_size_of_extensions += sni_size; - socket_sni_extensions->total_extensions++; + // copies TLS extension provided by app into SDK socket struct + memcpy(&socket_tls_extensions->buffer[socket_tls_extensions->current_size_of_extensions], + tls_extension, + extension_size); + socket_tls_extensions->current_size_of_extensions += extension_size; + socket_tls_extensions->total_extensions++; return SL_STATUS_OK; } @@ -308,6 +310,46 @@ static void si91x_socket_node_free_function(sl_wifi_buffer_t *buffer) sl_si91x_host_free_buffer(buffer); } +uint8_t sli_si91x_socket_identification_function_based_on_socketid(sl_wifi_buffer_t *buffer, void *user_data) +{ + sl_status_t status; + sl_si91x_packet_t *packet = NULL; + sli_si91x_queue_packet_t *node = NULL; + sli_si91x_queue_packet_t *response_node = NULL; + sl_wifi_buffer_t *response_buffer = NULL; + int32_t socket_id = 0xFF; + int32_t socket_index = *(int32_t *)user_data; + + node = (sli_si91x_queue_packet_t *)sl_si91x_host_get_buffer_data(buffer, 0, NULL); + packet = sl_si91x_host_get_buffer_data(node->host_packet, 0, NULL); + + socket_id = get_socket_id_from_socket_command(packet); + + if (socket_id == socket_index) { + /* Send response if asked */ + if ((node->flags & SI91X_PACKET_RESPONSE_STATUS) == SI91X_PACKET_RESPONSE_STATUS) { + status = + sl_si91x_host_allocate_buffer(&response_buffer, SL_WIFI_CONTROL_BUFFER, sizeof(sli_si91x_queue_packet_t), 1000); + if (status == SL_STATUS_OK) { + response_node = sl_si91x_host_get_buffer_data(response_buffer, 0, NULL); + + memcpy(response_node, node, sizeof(sli_si91x_queue_packet_t)); + response_node->frame_status = ENOTCONN; + response_node->host_packet = NULL; + response_node->flags = 0; + + sl_si91x_host_add_to_queue(SI91X_SOCKET_RESPONSE_QUEUE, response_buffer); + sl_si91x_host_set_event(NCP_HOST_SOCKET_RESPONSE_EVENT); + } else { + SL_DEBUG_LOG("\r\n HEAP EXHAUSTED DURING ALLOCATION \r\n"); + BREAKPOINT(); + } + } + return true; + } + return false; +} + static uint8_t si91x_socket_identification_function(sl_wifi_buffer_t *buffer, void *user_data) { sl_status_t status; @@ -435,13 +477,13 @@ sl_status_t create_and_send_socket_request(int socketIdIndex, int type, const in socket_create_request.socket_cert_inx = si91x_bsd_socket->certificate_index; // Check if extension is provided my application and memcopy until the provided size of extensions - if (si91x_bsd_socket->sni_extensions.total_extensions > 0) { + if (si91x_bsd_socket->tls_extensions.total_extensions > 0) { memcpy(socket_create_request.tls_extension_data, - si91x_bsd_socket->sni_extensions.buffer, - si91x_bsd_socket->sni_extensions.current_size_of_extensions); + si91x_bsd_socket->tls_extensions.buffer, + si91x_bsd_socket->tls_extensions.current_size_of_extensions); - socket_create_request.total_extension_length = si91x_bsd_socket->sni_extensions.current_size_of_extensions; - socket_create_request.no_of_tls_extensions = si91x_bsd_socket->sni_extensions.total_extensions; + socket_create_request.total_extension_length = si91x_bsd_socket->tls_extensions.current_size_of_extensions; + socket_create_request.no_of_tls_extensions = si91x_bsd_socket->tls_extensions.total_extensions; } wait_period = SL_SI91X_WAIT_FOR_RESPONSE(150000); // timeout is 15 sec } diff --git a/components/device/silabs/si91x/wireless/src/sl_rsi_utility.c b/components/device/silabs/si91x/wireless/src/sl_rsi_utility.c index da432bec1..9ac936d09 100644 --- a/components/device/silabs/si91x/wireless/src/sl_rsi_utility.c +++ b/components/device/silabs/si91x/wireless/src/sl_rsi_utility.c @@ -40,6 +40,9 @@ #include "cmsis_os2.h" // CMSIS RTOS2 #include "sl_si91x_types.h" +/****************************************************** + * Macro Declarations + ******************************************************/ // Macro to check the status and return it if it's not SL_STATUS_OK #define VERIFY_STATUS(s) \ do { \ @@ -47,6 +50,99 @@ return s; \ } while (0) +// WLAN Management Frame Sub-Type +#define SLI_WIFI_FRAME_SUBTYPE_MASK 0xf0 // WLAN Management Frame Sub-Type Mask +#define SLI_WIFI_FRAME_SUBTYPE_PROBE_RESP 0x50 // WLAN Management Frame Sub-Type Probe Response Frame +#define SLI_WIFI_FRAME_SUBTYPE_BEACON 0x80 // WLAN Management Frame Sub-Type Beacon Frame +#define SLI_WIFI_MINIMUM_FRAME_LENGTH 36 // Minimum Frame Length of WLAN Management Frame +#define SLI_WIFI_HARDWARE_ADDRESS_LENGTH 6 // Hardware Address Length + +// WLAN Information Element Type +#define SLI_WLAN_TAG_SSID 0 // WLAN Information Element Type SSID +#define SLI_WLAN_TAG_RSN 48 // WLAN Robust Security Network Information Element +#define SLI_WLAN_TAG_VENDOR_SPECIFIC 221 // WLAN Vendor Specific Information Element + +// Authentication key Management Type +#define SLI_AUTH_KEY_MGMT_UNSPEC_802_1X 0x000FAC01 // Unspecified Authentication key Management Type +#define SLI_AUTH_KEY_MGMT_PSK_OVER_802_1X 0x000FAC02 // PSK Authentication key Management Type +#define SLI_AUTH_KEY_MGMT_802_1X_SHA256 0x000FAC05 // SHA256 Authentication key Management Type +#define SLI_AUTH_KEY_MGMT_PSK_SHA256 0x000FAC06 // PSK SHA256 Authentication key Management Type +#define SLI_AUTH_KEY_MGMT_SAE 0x000FAC08 // SAE Authentication key Management Type +#define SLI_AUTH_KEY_MGMT_FT_SAE 0x000FAC09 // FT_SAE Authentication key Management Type + +// Authentication key Management Type Flags +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA 0x00000001 // WPA AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA2 0x00000002 // WPA2 AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA_PSK 0x00000004 // WPA_PSK AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA2_PSK 0x00000008 // WPA2_PSK AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_SAE 0x00010000 // SAE AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_FT_SAE 0x00100000 // FT_SAE AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_802_1X_SHA256 0x00020000 // SHA256 AKM Type +#define SLI_WLAN_AUTH_KEY_MGMT_TYPE_PSK_SHA256 0x00040000 // PSK_SHA256 AKM Type + +/****************************************************** + * Local Type Declarations + ******************************************************/ +// WLAN Frame +typedef struct { + uint8_t fc[2]; // Frame Control + uint8_t duration[2]; // Duration + uint8_t da[SLI_WIFI_HARDWARE_ADDRESS_LENGTH]; // Destination Address + uint8_t sa[SLI_WIFI_HARDWARE_ADDRESS_LENGTH]; // Source Address + uint8_t bssid[SLI_WIFI_HARDWARE_ADDRESS_LENGTH]; // BSS Id + uint8_t sc[2]; // Sequence Control Id + uint8_t timestamp[8]; // Time Stamp + uint8_t bi[2]; // Beacon Interval + uint8_t ci[2]; // Capability Information + uint8_t tagged_info[]; // Variable Information Elememt +} sli_wifi_data_frame_t; + +// WLAN Information Element +typedef struct { + uint8_t tag; // Information Element Tag Id + uint8_t data_length; // Information Element Data Length + uint8_t data[]; // Information Element Data +} sli_wifi_data_tagged_info_t; + +// Cipher suite +typedef struct { + uint8_t cs_oui[3]; // Cipher Suite OUI + uint8_t cs_type; // Cipher Suite Type +} sli_wlan_cipher_suite_t; + +// WLAN Robust Security Network Information Element +typedef struct { + uint8_t version[2]; // RSN Version + sli_wlan_cipher_suite_t gcs; // Group cipher suite + uint8_t pcsc[2]; // Pairwise cipher suite count + uint8_t pcsl[]; // Pairwise cipher suite list +} sli_wlan_rsn_element_t; + +// WLAN Vendor Specific Information Element +typedef struct { + uint8_t oui[3]; // Vendor OUI + uint8_t vs_oui; // Vendor specific OUI + uint8_t type; // WPA Information Element + uint8_t wpa_version[2]; // WPA Version + sli_wlan_cipher_suite_t mcs; // Multicast Cipher Suite + uint8_t ucsc; // Unicast Cipher Suite List Count + uint8_t ucsl[]; // Unicast Cipher Suite List +} sli_wlan_vendor_specific_element_t; + +// Scan Information +typedef struct sli_scan_info_s { + struct sli_scan_info_s *next; + uint8_t channel; ///< Channel number of the AP + uint8_t security_mode; ///< Security mode of the AP + uint8_t rssi; ///< RSSI value of the AP + uint8_t network_type; ///< AP network type + uint8_t ssid[34]; ///< SSID of the AP + uint8_t bssid[SLI_WIFI_HARDWARE_ADDRESS_LENGTH]; ///< BSSID of the AP +} sli_scan_info_t; + +/****************************************************** + * Variable Declarations + ******************************************************/ osThreadId_t si91x_thread = 0; osThreadId_t si91x_event_thread = 0; osEventFlagsId_t si91x_events = 0; @@ -100,6 +196,333 @@ static sl_si91x_boot_configuration_t saved_boot_configuration = { 0 }; static sl_si91x_coex_mode_t coex_mode = 0; +static sli_scan_info_t *scan_info_database = NULL; + +/****************************************************** + * Internal Function Declarations + ******************************************************/ +// Function to update a existing entry or create new entry for scan results database +static sli_scan_info_t *sli_update_or_create_scan_info_element(sli_scan_info_t *info) +{ + sli_scan_info_t *element = NULL; + + element = scan_info_database; + while (NULL != element) { + if (0 == memcmp(info->bssid, element->bssid, SLI_WIFI_HARDWARE_ADDRESS_LENGTH)) { + element->channel = element->channel; + element->security_mode = element->security_mode; + element->rssi = element->rssi; + element->network_type = element->network_type; + memcpy(element->ssid, info->ssid, 34); + break; + } + element = element->next; + } + + if (NULL == element) { + element = malloc(sizeof(sli_scan_info_t)); + memcpy(element, info, sizeof(sli_scan_info_t)); + element->next = NULL; + return element; + } + + return NULL; +} + +// Function to store a given scan info element in scan results database +static void sli_store_scan_info_element(sli_scan_info_t *info) +{ + sli_scan_info_t *element = NULL; + sli_scan_info_t *head = NULL; + sli_scan_info_t *tail = NULL; + + if (NULL == info) { + return; + } + + element = sli_update_or_create_scan_info_element(info); + if (NULL == element) { + return; + } + + if (NULL == scan_info_database) { + scan_info_database = element; + return; + } + + tail = scan_info_database; + while (NULL != tail) { + if (element->rssi < tail->rssi) { + element->next = tail; + if (NULL == head) { + scan_info_database = element; + } else { + head->next = element; + } + break; + } + + head = tail; + tail = tail->next; + + if (NULL == tail) { + head->next = element; + } + } + + return; +} + +// Function to identify Authentication Key Management Type +static uint32_t sli_get_key_management_info(const sli_wlan_cipher_suite_t *akms, const uint16_t akmsc) +{ + int i; + uint32_t key_mgmt = 0; + uint32_t oui_type; + + if (NULL == akms) { + return 0; + } + + for (i = 0; i < akmsc; i++) { + oui_type = ((akms[i].cs_oui[0] << 24) | (akms[i].cs_oui[1] << 16) | (akms[i].cs_oui[2] << 8) | akms[0].cs_type); + + switch (oui_type) { + case SLI_AUTH_KEY_MGMT_UNSPEC_802_1X: + key_mgmt |= SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA | SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA2; + break; + case SLI_AUTH_KEY_MGMT_PSK_OVER_802_1X: + key_mgmt |= SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA_PSK | SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA2_PSK; + break; + case SLI_AUTH_KEY_MGMT_802_1X_SHA256: + key_mgmt |= SLI_WLAN_AUTH_KEY_MGMT_TYPE_802_1X_SHA256; + break; + case SLI_AUTH_KEY_MGMT_PSK_SHA256: + key_mgmt |= SLI_WLAN_AUTH_KEY_MGMT_TYPE_PSK_SHA256; + break; + case SLI_AUTH_KEY_MGMT_SAE: + key_mgmt |= SLI_WLAN_AUTH_KEY_MGMT_TYPE_SAE; + break; + case SLI_AUTH_KEY_MGMT_FT_SAE: + key_mgmt |= SLI_WLAN_AUTH_KEY_MGMT_TYPE_FT_SAE; + break; + } + } + return key_mgmt; +} + +// Function to parse Information elements in WiFi Beacon or Probe response frames +static void sli_process_tag_info(sli_wifi_data_tagged_info_t *info, sli_scan_info_t *scan_info) +{ + uint8_t wlan_oui[3] = { 0x00, 0x50, 0xF2 }; + uint8_t wlan_gcs_oui[3] = { 0x00, 0x0F, 0xAC }; + uint16_t akmsc = 0; + sli_wlan_cipher_suite_t *akms = NULL; + sli_wlan_vendor_specific_element_t *vendor = NULL; + + switch (info->tag) { + case SLI_WLAN_TAG_SSID: + memcpy(scan_info->ssid, info->data, info->data_length); + scan_info->ssid[info->data_length] = 0; + break; + case SLI_WLAN_TAG_RSN: + scan_info->security_mode = SL_WIFI_WPA2_ENTERPRISE; + sli_wlan_rsn_element_t *rsn = (sli_wlan_rsn_element_t *)info->data; + uint16_t pcsc = (rsn->pcsc[0] | (rsn->pcsc[1] << 8)); + uint8_t *akmslc = (rsn->pcsl + (pcsc * sizeof(sli_wlan_cipher_suite_t))); + akmsc = (akmslc[0] | (akmslc[1] << 8)); + akms = (sli_wlan_cipher_suite_t *)(akmslc + 2); + SL_DEBUG_LOG("RSN OUI %02x:%02x:%02x.\n", rsn->gcs.cs_oui[0], rsn->gcs.cs_oui[1], rsn->gcs.cs_oui[2]); + SL_DEBUG_LOG("Pairwise cipher suite count : %u.\n", pcsc); + + if (!memcmp(rsn->gcs.cs_oui, wlan_gcs_oui, 3)) { + scan_info->security_mode = SL_WIFI_WPA2; + uint32_t key = sli_get_key_management_info((const sli_wlan_cipher_suite_t *)akms, (const uint16_t)akmsc); + + if (akms[0].cs_type == 1) { + scan_info->security_mode = SL_WIFI_WPA2_ENTERPRISE; + } + + if (key & SLI_WLAN_AUTH_KEY_MGMT_TYPE_SAE) { + scan_info->security_mode = SL_WIFI_WPA3; + if ((key & SLI_WLAN_AUTH_KEY_MGMT_TYPE_PSK_SHA256) || (key & SLI_WLAN_AUTH_KEY_MGMT_TYPE_WPA2_PSK)) { + scan_info->security_mode = SL_WIFI_WPA3_TRANSITION; + } + } + } + break; + case SLI_WLAN_TAG_VENDOR_SPECIFIC: + vendor = (sli_wlan_vendor_specific_element_t *)info->data; + + if ((!memcmp(vendor->oui, wlan_oui, 3)) && (vendor->vs_oui == 0x01) + && ((scan_info->security_mode == SL_WIFI_OPEN) || (scan_info->security_mode == SL_WIFI_WEP))) { + uint8_t *list_count = NULL; + scan_info->security_mode = SL_WIFI_WPA; + list_count = + (vendor->ucsl + (sizeof(sli_wlan_cipher_suite_t) * vendor->ucsc)); // Get Pointer to AKM Suite Count + akmsc = (list_count[0] | (list_count[1] << 8)); + akms = (sli_wlan_cipher_suite_t *)(list_count + 2); + + if (0 != akmsc) { + if (akms[akmsc - 1].cs_type == 1) { + scan_info->security_mode = SL_WIFI_WPA_ENTERPRISE; + } + } + } + break; + } + + return; +} + +// Function to identify expected scan result based on filter +static bool sli_filter_scan_info(sli_scan_info_t *scan_info, + sl_wifi_extended_scan_result_parameters_t *extended_scan_parameters) +{ + if (NULL == scan_info) { + return false; + } + + if ((NULL != extended_scan_parameters->channel_filter) + && (*(extended_scan_parameters->channel_filter) != scan_info->channel)) { + return false; + } + + if ((NULL != extended_scan_parameters->security_mode_filter) + && (*(extended_scan_parameters->security_mode_filter) != scan_info->security_mode)) { + return false; + } + + if ((NULL != extended_scan_parameters->rssi_filter) + && (*(extended_scan_parameters->rssi_filter) <= scan_info->rssi)) { + return false; + } + + if ((NULL != extended_scan_parameters->network_type_filter) + && (*(extended_scan_parameters->network_type_filter) != scan_info->network_type)) { + return false; + } + + return true; +} + +/****************************************************** + * Internal Function Declarations + ******************************************************/ +// Function to Parse the Beacon and Probe response Frames +void sli_handle_wifi_beacon(sl_si91x_packet_t *packet) +{ + uint8_t subtype = 0; + uint16_t recv_freq = 0; + sli_wifi_data_frame_t *wifi_frame = (sli_wifi_data_frame_t *)packet->data; + sli_scan_info_t scan_info = { 0 }; + uint16_t ies_length = 0; + + recv_freq = packet->desc[9]; + recv_freq = (recv_freq << 8) | packet->desc[8]; + scan_info.rssi = (~packet->desc[10]); + scan_info.channel = packet->desc[11]; + + // Check for ESS bit and TBSS status bit in capability info + // 1 in ESS bit indicates that the transmitter is an AP + if (1 == (wifi_frame->ci[0] & 0x03)) { + scan_info.network_type = 1; + } else { + scan_info.network_type = 0; + } + + if (wifi_frame->ci[0] & 0x08) { + scan_info.security_mode = SL_WIFI_WEP; + } else { + scan_info.security_mode = SL_WIFI_OPEN; + } + + subtype = wifi_frame->fc[0] & SLI_WIFI_FRAME_SUBTYPE_MASK; + switch (subtype) { + case SLI_WIFI_FRAME_SUBTYPE_PROBE_RESP: + case SLI_WIFI_FRAME_SUBTYPE_BEACON: { + if (packet->length <= SLI_WIFI_MINIMUM_FRAME_LENGTH) { + return; + } + ies_length = packet->length - SLI_WIFI_MINIMUM_FRAME_LENGTH; + + memcpy(scan_info.bssid, wifi_frame->bssid, SLI_WIFI_HARDWARE_ADDRESS_LENGTH); + + sli_wifi_data_tagged_info_t *info = (sli_wifi_data_tagged_info_t *)wifi_frame->tagged_info; + while (0 != ies_length) { + sli_process_tag_info(info, &scan_info); + ies_length -= (sizeof(sli_wifi_data_tagged_info_t) + info->data_length); + info = (sli_wifi_data_tagged_info_t *)&(info->data[info->data_length]); + + if (ies_length <= sizeof(sli_wifi_data_tagged_info_t)) { + ies_length = 0; + } + } + + sli_store_scan_info_element(&scan_info); + } break; + default: + return; + } + + return; +} + +// Function to get all or filtered scan results from scan result database +sl_status_t sli_wifi_get_stored_scan_results(sl_wifi_interface_t interface, + sl_wifi_extended_scan_result_parameters_t *extended_scan_parameters) +{ + UNUSED_PARAMETER(interface); + if (NULL == extended_scan_parameters) { + return SL_STATUS_INVALID_PARAMETER; + } + + sl_wifi_extended_scan_result_t *scan_results = extended_scan_parameters->scan_results; + uint16_t *result_count = extended_scan_parameters->result_count; + uint16_t length = extended_scan_parameters->array_length; + sli_scan_info_t *scan_info = scan_info_database; + + if ((NULL == scan_results) || (NULL == result_count) || (0 == length)) { + return SL_STATUS_INVALID_PARAMETER; + } + *result_count = 0; + + while ((0 != length) && (NULL != scan_info)) { + if (true == sli_filter_scan_info(scan_info, extended_scan_parameters)) { + scan_results[*result_count].rf_channel = scan_info->channel; + scan_results[*result_count].security_mode = scan_info->security_mode; + scan_results[*result_count].rssi = scan_info->rssi; + scan_results[*result_count].network_type = scan_info->network_type; + memcpy(scan_results[*result_count].bssid, scan_info->bssid, SLI_WIFI_HARDWARE_ADDRESS_LENGTH); + memcpy(scan_results[*result_count].ssid, scan_info->ssid, 34); + (*result_count)++; + length--; + } + scan_info = scan_info->next; + } + + return SL_STATUS_OK; +} + +// Function to Clean up all the scan results in scan result database +void sli_wifi_flush_scan_results_database(void) +{ + sli_scan_info_t *scan_info = scan_info_database; + sli_scan_info_t *node = NULL; + + while (NULL != scan_info) { + node = scan_info; + scan_info = scan_info->next; + free(node); + } + scan_info_database = NULL; + + return; +} + +/****************************************************** + * Function Declarations + ******************************************************/ void save_wifi_current_performance_profile(const sl_wifi_performance_profile_t *profile) { SL_ASSERT(profile != NULL); @@ -1232,6 +1655,8 @@ uint8_t sli_multicast_mac_hash(const uint8_t *mac) return crc; } +/* Function to get the current status of the NVM command progress +Returns true if an NVM command is in progress, false otherwise*/ bool sli_si91x_get_flash_command_status() { return sli_si91x_packet_status; @@ -1242,17 +1667,11 @@ void sli_si91x_update_flash_command_status(bool flag) sli_si91x_packet_status = flag; } -// This function is used to update the power manager to see whether the device is ready for sleep or not. -// True indicates ready for sleep, and false indicates not ready for sleep. +/* This function is used to update the power manager to see whether the device is ready for sleep or not. + True indicates ready for sleep, and false indicates not ready for sleep.*/ bool sli_si91x_is_sdk_ok_to_sleep() { - bool tx_queues_empty = (sl_si91x_host_get_queue_packet_count((sl_si91x_queue_type_t)SI91X_COMMON_CMD) - || sl_si91x_host_get_queue_packet_count((sl_si91x_queue_type_t)SI91X_WLAN_CMD) - || sl_si91x_host_get_queue_packet_count((sl_si91x_queue_type_t)SI91X_NETWORK_CMD) - || sl_si91x_host_get_queue_packet_count((sl_si91x_queue_type_t)SI91X_SOCKET_CMD) - || sl_si91x_host_get_queue_packet_count((sl_si91x_queue_type_t)SI91X_BT_CMD) - || sl_si91x_host_get_queue_packet_count((sl_si91x_queue_type_t)SI91X_SOCKET_DATA)); - return ((!sli_si91x_get_flash_command_status()) && (!tx_queues_empty) && (sl_si91x_is_device_initialized())); + return ((!sli_si91x_get_flash_command_status()) && (sl_si91x_is_device_initialized())); } bool sl_si91x_is_device_initialized(void) diff --git a/components/device/silabs/si91x/wireless/src/sl_si91x_driver.c b/components/device/silabs/si91x/wireless/src/sl_si91x_driver.c index 68b150fa3..dd6b3fe40 100644 --- a/components/device/silabs/si91x/wireless/src/sl_si91x_driver.c +++ b/components/device/silabs/si91x/wireless/src/sl_si91x_driver.c @@ -317,6 +317,22 @@ const sl_si91x_set_region_ap_request_t default_SG_region_5GHZ_configurations = { .channel_info[4] = { .first_channel = 149, .no_of_channels = 4, .max_tx_power = 29 } }; +// Define default configurations for the China region for 2.4GHz and 5GHz bands +const sl_si91x_set_region_ap_request_t default_CN_region_2_4GHZ_configurations = { + .set_region_code_from_user_cmd = SET_REGION_CODE_FROM_USER, + .country_code = "CN ", + .no_of_rules = 1, + .channel_info[0] = { .first_channel = 1, .no_of_channels = 13, .max_tx_power = 20 } +}; + +const sl_si91x_set_region_ap_request_t default_CN_region_5GHZ_configurations = { + .set_region_code_from_user_cmd = SET_REGION_CODE_FROM_USER, + .country_code = "CN ", + .no_of_rules = 2, + .channel_info[0] = { .first_channel = 36, .no_of_channels = 9, .max_tx_power = 20 }, + .channel_info[4] = { .first_channel = 149, .no_of_channels = 5, .max_tx_power = 33 } +}; + // clang-format off static uint8_t firmware_queue_id[SI91X_CMD_MAX] = { [SI91X_COMMON_CMD] = RSI_WLAN_MGMT_Q, [SI91X_WLAN_CMD] = RSI_WLAN_MGMT_Q, @@ -1276,6 +1292,29 @@ sl_status_t sl_si91x_driver_send_command_packet(uint32_t command, context.packet_id, wait_time, &response); + // Check if the status is SL_STATUS_TIMEOUT, indicating a timeout has occurred + if (status == SL_STATUS_TIMEOUT) { + + // Declare a temporary packet pointer to hold the packet to be removed + sl_wifi_buffer_t *temp_packet; + + sl_status_t status = + sl_si91x_host_remove_node_from_queue(queue_type, &temp_packet, &context, si91x_packet_identification_function); + + // Check if the packet removal was successful + if (status == SL_STATUS_OK) { + + // Retrieve the actual packet node data from the removed buffer + sli_si91x_queue_packet_t *node = sl_si91x_host_get_buffer_data(temp_packet, 0, NULL); + + // Free the host packet memory associated with the node (TX packet memory) + sl_si91x_host_free_buffer(node->host_packet); + + // Free the temporary buffer memory that held the packet + sl_si91x_host_free_buffer(temp_packet); + } + } + VERIFY_STATUS_AND_RETURN(status); // Process the response packet and return the firmware status @@ -1847,6 +1886,14 @@ sl_status_t sl_si91x_set_device_region(sl_si91x_operation_mode_t operation_mode, } break; } + case CN: { + if (band == SL_SI91X_WIFI_BAND_2_4GHZ) { + request = default_CN_region_2_4GHZ_configurations; + } else { + request = default_CN_region_5GHZ_configurations; + } + break; + } default: return SL_STATUS_NOT_SUPPORTED; } diff --git a/components/device/silabs/si91x/wireless/threading/sli_si91x_multithreaded.c b/components/device/silabs/si91x/wireless/threading/sli_si91x_multithreaded.c index eb273b5d5..04838f4c9 100644 --- a/components/device/silabs/si91x/wireless/threading/sli_si91x_multithreaded.c +++ b/components/device/silabs/si91x/wireless/threading/sli_si91x_multithreaded.c @@ -55,6 +55,12 @@ #include "rsi_bt_common.h" #endif +#if defined(SLI_SI91X_OFFLOAD_NETWORK_STACK) && defined(SLI_SI91X_SOCKETS) +#include "sl_si91x_socket_constants.h" +#include "sl_si91x_socket_types.h" +#include "sl_si91x_socket_utility.h" +#endif + #define BUS_THREAD_EVENTS \ (SL_SI91X_ALL_TX_PENDING_COMMAND_EVENTS | SL_SI91X_SOCKET_DATA_TX_PENDING_EVENT | SL_SI91X_NCP_HOST_BUS_RX_EVENT) @@ -111,7 +117,7 @@ extern sl_status_t sl_create_generic_rx_packet_from_params(sli_si91x_queue_packe void sli_submit_rx_buffer(void); void si91x_bus_thread(const void *args); void sli_handle_dhcp_and_rejoin_failure(sli_si91x_queue_packet_t *node, - sl_wifi_buffer_t *temp_buffer, + sl_wifi_buffer_t *response_buffer, sl_si91x_command_trace_t *command_trace, uint16_t frame_status); void si91x_event_handler_thread(const void *args); @@ -171,13 +177,21 @@ sl_status_t sl_create_generic_rx_packet_from_params(sli_si91x_queue_packet_t **q } void sli_handle_dhcp_and_rejoin_failure(sli_si91x_queue_packet_t *node, - sl_wifi_buffer_t *temp_buffer, + sl_wifi_buffer_t *response_buffer, sl_si91x_command_trace_t *command_trace, uint16_t frame_status) { - sl_status_t status = SL_STATUS_OK; - uint32_t response_event = 0; - uint32_t response_queue = 0; + sl_status_t status = SL_STATUS_OK; + uint32_t response_event = 0; + uint32_t response_queue = 0; + sl_wifi_buffer_t *temp_buffer = NULL; + uint16_t length; + + sl_si91x_packet_t *packet = sl_si91x_host_get_buffer_data(response_buffer, 0, &length); + // Remote Wi-Fi client triggered disconnect + if (packet->command == RSI_WLAN_RSP_CLIENT_DISCONNECTED && (get_opermode() == SL_SI91X_CONCURRENT_MODE)) { + packet->desc[7] = SL_SI91X_WIFI_AP_VAP_ID; + } for (int queue_id = 0; queue_id < SI91X_BT_CMD; queue_id++) { if (command_trace[queue_id].command_in_flight != true) { @@ -210,10 +224,25 @@ void sli_handle_dhcp_and_rejoin_failure(sli_si91x_queue_packet_t *node, response_event = NCP_HOST_NETWORK_RESPONSE_EVENT; response_queue = SI91X_NETWORK_RESPONSE_QUEUE; } else if (queue_id == SI91X_SOCKET_CMD) { +#if defined(SLI_SI91X_OFFLOAD_NETWORK_STACK) && defined(SLI_SI91X_SOCKETS) + for (uint8_t index = 0; index < NUMBER_OF_SOCKETS; index++) { + si91x_socket_t *socket = get_si91x_socket(index); + // Send response to specific socket TX packet + if ((socket != NULL) && (socket->id == command_trace[queue_id].sl_si91x_socket_id)) { + if (socket->vap_id != packet->desc[7]) { + continue; + } + } + } +#endif response_event = NCP_HOST_SOCKET_RESPONSE_EVENT; response_queue = SI91X_SOCKET_RESPONSE_QUEUE; } + // Update the frame status in error response packet + sli_si91x_queue_packet_t *queue_packet = sl_si91x_host_get_buffer_data(temp_buffer, 0, NULL); + queue_packet->frame_status = frame_status; + sl_si91x_host_add_to_queue(response_queue, temp_buffer); sl_si91x_host_set_event(response_event); // TODO: additonal checks for async queue, async event } @@ -238,8 +267,7 @@ void sli_handle_dhcp_and_rejoin_failure(sli_si91x_queue_packet_t *node, } mqtt_remote_terminate_packet = sl_si91x_host_get_buffer_data(mqtt_remote_terminate_packet_buffer, 0, NULL); - - memset(mqtt_remote_terminate_packet->desc, 0, sizeof(mqtt_remote_terminate_packet->desc)); + memcpy(mqtt_remote_terminate_packet->desc, packet->desc, sizeof(packet->desc)); node->frame_status = frame_status; node->host_packet = mqtt_remote_terminate_packet_buffer; @@ -285,6 +313,11 @@ void si91x_event_handler_thread(const void *args) // Call event handler if (si91x_event_handler != NULL) { wifi_event = convert_si91x_event_to_sl_wifi_event(packet->command, frame_status); + + if (RSI_WLAN_RSP_SCAN_RESULTS == packet->command) { + sli_handle_wifi_beacon(packet); + } + if (wifi_event != SL_WIFI_INVALID_EVENT) { si91x_event_handler(wifi_event, buffer); } @@ -346,7 +379,6 @@ void si91x_bus_thread(const void *args) sli_si91x_queue_packet_t *error_node = NULL; sl_wifi_buffer_t *packet; sl_wifi_buffer_t *error_packet = NULL; - sl_wifi_buffer_t *temp_buffer = NULL; sl_wifi_buffer_t *buffer; uint8_t tx_queues_empty = 0; uint32_t event = 0; @@ -438,11 +470,12 @@ void si91x_bus_thread(const void *args) } #endif + sl_si91x_packet_t *response = (sl_si91x_packet_t *)data; SL_DEBUG_LOG("><<<< Rx -> queueId : %u, frameId : 0x%x, frameStatus: 0x%x, length : %u\n", queue_id, frame_type, frame_status, - length); + (response->length & (~(0xF000)))); switch (queue_id) { case RSI_WLAN_MGMT_Q: { @@ -599,12 +632,12 @@ void si91x_bus_thread(const void *args) // Check if the frame type indicates a failed join operation or a disconnect if (((RSI_WLAN_RSP_JOIN == frame_type) && (frame_status != SL_STATUS_OK)) - || (RSI_WLAN_RSP_DISCONNECT == frame_type)) { + || (RSI_WLAN_RSP_DISCONNECT == frame_type) || (RSI_WLAN_RSP_CLIENT_DISCONNECTED == frame_type)) { // Reset current performance profile and set it to high performance reset_coex_current_performance_profile(); current_performance_profile = HIGH_PERFORMANCE; // check for command in flight and create dummy packets for respective queues to be cleared - sli_handle_dhcp_and_rejoin_failure(node, temp_buffer, command_trace, frame_status); + sli_handle_dhcp_and_rejoin_failure(node, buffer, command_trace, frame_status); } // check if the frame type is valid @@ -929,7 +962,7 @@ void si91x_bus_thread(const void *args) reset_coex_current_performance_profile(); current_performance_profile = HIGH_PERFORMANCE; // check for command in flight and create dummy packets for respective queues to be cleared - sli_handle_dhcp_and_rejoin_failure(node, temp_buffer, command_trace, frame_status); + sli_handle_dhcp_and_rejoin_failure(node, buffer, command_trace, frame_status); SL_NET_EVENT_DISPATCH_HANDLER(node, (sl_si91x_packet_t *)data); } break; @@ -1379,6 +1412,11 @@ static sl_status_t bus_write_frame(sl_si91x_queue_type_t queue_type, } status = sl_si91x_host_remove_from_queue(queue_type, &buffer); + if (status != SL_STATUS_OK) { + if (current_performance_profile != HIGH_PERFORMANCE) { + sl_si91x_host_clear_sleep_indicator(); + } + } VERIFY_STATUS_AND_RETURN(status); node = sl_si91x_host_get_buffer_data(buffer, 0, NULL); diff --git a/components/protocol/wifi/inc/sl_wifi.h b/components/protocol/wifi/inc/sl_wifi.h index f63de5068..9dc333e7a 100644 --- a/components/protocol/wifi/inc/sl_wifi.h +++ b/components/protocol/wifi/inc/sl_wifi.h @@ -395,6 +395,7 @@ sl_status_t sl_wifi_get_listen_interval(sl_wifi_interface_t interface, sl_wifi_l * 5. For Worldwide region, the firmware uses the Worldwide table for Tx. For other regions (FCC/ETSI/TELEC/KCC), the firmware uses the min value out of the Worldwide & Region-based table for Tx. Also, there will be part to part variation across the chips. Offsets that are estimated during the flow of manufacture will be applied as correction factor during normal mode of operation. * 6. In a 2.4 GHz band, 40 MHz is not supported. * 7. Executing this API will overwrite calibration values in certified modules. + * 8. In FCC-certified modules, this API will trigger an error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE if used, except when in SL_SI91X_TRANSMIT_TEST_MODE mode. ******************************************************************************/ sl_status_t sl_wifi_update_gain_table(uint8_t band, uint8_t bandwidth, uint8_t *payload, uint16_t payload_len); @@ -439,12 +440,33 @@ sl_status_t sl_wifi_set_11ax_config(uint8_t guard_interval); * the time is for foreground scan. Otherwise, it is used for background scanning. * If the user needs to enable Passive Scanning, user should set the scan_type to SL_WIFI_SCAN_TYPE_PASSIVE. * If the user needs to enable Low Power (LP) mode in Passive Scan, user needs to enable lp_mode in sl_wifi_scan_configuration_t. + * Use the SL_WIFI_SCAN_TYPE_EXTENDED to obtain the scan results that exceed the SL_WIFI_MAX_SCANNED_AP. In this scan type, the number of scan results is not restricted; it is only limited by the amount of dynamic memory that the host can provide. * Default Passive Scan Channel time is 400 milliseconds. If the user needs to modify the time, sl_si91x_set_timeout can be called. + * In case of SL_WIFI_SCAN_TYPE_EXTENDED scan type, use @ref sl_wifi_get_stored_scan_results() API to get the scan results; after the scan status callback is received. ******************************************************************************/ sl_status_t sl_wifi_start_scan(sl_wifi_interface_t interface, const sl_wifi_ssid_t *optional_ssid, const sl_wifi_scan_configuration_t *configuration); +/***************************************************************************/ /** + * @brief + * Returns the stored scan results of a detailed scan in the user provided scan results array. + * @pre Pre-conditions: + * - + * @ref sl_wifi_init should be called before this API. + * @param[in] interface + * Wi-Fi interface as identified by @ref sl_wifi_interface_t + * @param[in out] extended_scan_parameters + * A pointer to a structure of type @ref sl_wifi_extended_scan_result_parameters_t, where the scan results will be stored. + * @return + * sl_status_t. See https://docs.silabs.com/gecko-platform/4.1/common/api/group-status for details. + * @note + * This API will only hold scan results if sl_wifi_start_scan is called with scan type as SL_WIFI_SCAN_TYPE_EXTENDED. + * These results are stored until another call to sl_wifi_start_scan is made with scan type as SL_WIFI_SCAN_TYPE_EXTENDED. + ******************************************************************************/ +sl_status_t sl_wifi_get_stored_scan_results(sl_wifi_interface_t interface, + sl_wifi_extended_scan_result_parameters_t *extended_scan_parameters); + /***************************************************************************/ /** * @brief * Stops an ongoing Wi-Fi scan operation on the specified interface, including background scanning. @@ -539,6 +561,11 @@ sl_status_t sl_wifi_wait_for_scan_results(sl_wifi_scan_result_t **scan_result_ar * Default Active Channel time is 100 milliseconds. If the user needs to modify the time, sl_wifi_set_advanced_scan_configuration can be called. * Default Authentication timeout and Association timeout is 300 milliseconds. If the user needs to modify the time, sl_wifi_set_advanced_client_configuration can be called. * Default Keep Alive timeout is 30 milliseconds. If the user needs to modify the time, sl_wifi_set_advanced_client_configuration can be called. + * @note + * In FCC certified module the behavior is as follows + * 1. Region configuration is not supported and if triggered will return error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE. + * 2. STA mode channels 1 to 11 are actively scanned and 12,13,14 are passively scanned. + * 3. Concurrent mode supports only 1 to 11 channels. ******************************************************************************/ sl_status_t sl_wifi_connect(sl_wifi_interface_t interface, const sl_wifi_client_configuration_t *access_point, @@ -861,6 +888,11 @@ sl_status_t sl_wifi_configure_multicast_filter(sl_wifi_multicast_filter_info_t * * For AP mode with WPA3 security, only SAE-H2E method is supported. SAE hunting and pecking method is not supported. * TKIP encryption mode is not supported. Encryption mode is automatically configured to RSI_CCMP. * PMKSA is not supported in WPA3 AP mode. + * @note + * In FCC-certified modules, + * 1. Region configuration is not supported and if triggered will return error SL_STATUS_SI91X_FEATURE_NOT_AVAILABLE. + * 2. AP supports only 1 to 11 channels. + * 3. AP will not advertise the Country IE. ******************************************************************************/ sl_status_t sl_wifi_start_ap(sl_wifi_interface_t interface, const sl_wifi_ap_configuration_t *configuration); diff --git a/components/protocol/wifi/inc/sl_wifi_constants.h b/components/protocol/wifi/inc/sl_wifi_constants.h index e890dd0c2..82331ed5c 100644 --- a/components/protocol/wifi/inc/sl_wifi_constants.h +++ b/components/protocol/wifi/inc/sl_wifi_constants.h @@ -14,7 +14,8 @@ /** \addtogroup SL_WIFI_CONSTANTS Constants * @{ */ -/// Maximum number of Access Points that can be scanned during a Wi-Fi scan operation. +/// Maximum number of Access Points are scanned in response to a normal scan request. +/// @note This is not a configurable value. #define SL_WIFI_MAX_SCANNED_AP 11 /// Maximum number of clients supported when module is running in Access Point mode. @@ -78,6 +79,7 @@ typedef enum { * @brief Enumeration for Wi-Fi encryption methods. * * @note Some encryption types are not currently supported in station (STA) mode. + * @note If encryption type is configured anything other than SL_WIFI_DEFAULT_ENCRYPTION, then make sure the AP (third party) supports the configured encryption type. If not, there might be a possibility of getting join failure due to the encryption type mismatch between AP (third party) and STA. */ typedef enum { SL_WIFI_DEFAULT_ENCRYPTION, ///< Default Wi-Fi encryption @@ -220,7 +222,9 @@ typedef enum { typedef enum { SL_WIFI_SCAN_TYPE_ACTIVE = 0x00, ///< Active scan: Transmit probe requests and listen for responses SL_WIFI_SCAN_TYPE_PASSIVE = - 0x01, ///< Passive scan: No active transmissions, listen for AP beacons and probe responses + 0x01, ///< Passive scan. No active transmissions, listen for AP beacons and probe responses + SL_WIFI_SCAN_TYPE_EXTENDED = + 0x02, ///< Extended Active scan. Transmit probe requests and listen for responses to get more than SL_WIFI_MAX_SCANNED_AP number of results SL_WIFI_SCAN_TYPE_PROHIBITED_CHANNELS = 0x04, ///< Scan channels prohibited by regulatory region SL_WIFI_SCAN_TYPE_ADV_SCAN = 0X08 ///< Advanced scan: Scan for Access Points while the module is in connected state } sl_wifi_scan_type_t; diff --git a/components/protocol/wifi/inc/sl_wifi_types.h b/components/protocol/wifi/inc/sl_wifi_types.h index 9875cfff5..e137cc4f8 100644 --- a/components/protocol/wifi/inc/sl_wifi_types.h +++ b/components/protocol/wifi/inc/sl_wifi_types.h @@ -92,13 +92,13 @@ * @param event * Wi-Fi event of type @ref sl_wifi_event_t. * @param buffer - * Pointer to a Wi-Fi buffer which containing information related to the event, of type @ref sl_wifi_buffer_t + * Pointer to a Wi-Fi buffer contains information related to the event, of type @ref sl_wifi_buffer_t * @return * sl_status_t. See [Status Codes](https://docs.silabs.com/gecko-platform/latest/platform-common/status) * and [Additional Status Codes](../wiseconnect-api-reference-guide-err-codes/sl-additional-status-errors) for details. * @note * In case of event failure, SL_WIFI_FAIL_EVENT_STATUS_INDICATION bit is set in the event. - * The data will be of type sl_status_t and data_length can be ignored. + * The data would be of type sl_status_t, and data_length can be ignored. */ typedef sl_status_t (*sl_wifi_event_handler_t)(sl_wifi_event_t event, sl_wifi_buffer_t *buffer); @@ -173,17 +173,39 @@ typedef struct { } scan_info[]; ///< Array of scan result data } sl_wifi_scan_result_t; +/// Extended Wi-Fi scan result +typedef struct { + uint8_t rf_channel; ///< Channel number of the AP + uint8_t security_mode; ///< Security mode of the AP + uint8_t rssi; ///< RSSI value of the AP + uint8_t network_type; ///< Network type of the AP + uint8_t ssid[34]; ///< SSID of the AP + uint8_t bssid[6]; ///< BSSID of the AP +} sl_wifi_extended_scan_result_t; + +/// Extended Wi-Fi scan result parameters +typedef struct { + sl_wifi_extended_scan_result_t + *scan_results; ///< Pointer to an array containing scan results of type @ref sl_wifi_extended_scan_result_t + uint16_t array_length; ///< Length of the scan results array provided by the user. + uint16_t *result_count; ///< Pointer to store the total count of scan results returned. + uint8_t *channel_filter; ///< Pointer to Channel number (Filter based on Channel number of the AP). + uint8_t *security_mode_filter; ///< Pointer to Security mode (Filter based on the Security mode of the AP). + uint8_t *rssi_filter; ///< Pointer to RSSI (Filter for APs with an RSSI greater than or equal to given RSSI value). + uint8_t *network_type_filter; ///< Pointer to Network type (Filter based on APs network type). +} sl_wifi_extended_scan_result_parameters_t; + /** * @struct sl_wifi_scan_configuration_t * @brief Wi-Fi scan configuration structure. * * Indicates the configuration parameters for a Wi-Fi scan operation. * - * @note The Quick Scan Feature is enabled if a specific channel and SSID to scan is given. + * @note The Quick Scan feature is enabled when a specific channel and SSID are given for scanning. * SiWx91x scans for the AP given in the scan API and posts the scan results immediately * after finding the access point. * @note The `channel_bitmap_2g4` uses the lower 14 bits to represent channels from 1 to 14, - * where channel 1 = (1 << 0), channel 2 = (1 << 1), etc. + * where channel 1 = (1 << 0), channel 2 = (1 << 1), and so on. * @note 5GHz is not supported. * * | Channel Number 2.4 GHz | channel_bitmap_2g4 | @@ -225,7 +247,7 @@ typedef struct { uint16_t passive_channel_time; ///< Time spent on each channel during passive scan (milliseconds) uint8_t enable_instant_scan; ///< Flag to start advanced scan immediately uint8_t - enable_multi_probe; ///< Flag to send multiple probes to AP. If set to 1, a probe request would be sent to all access points in addition to connected SSID. + enable_multi_probe; ///< Flag to send multiple probes to AP. If the value is set to 1, a probe request would be sent to all access points in addition to the connected SSID. } sl_wifi_advanced_scan_configuration_t; /** @@ -279,12 +301,13 @@ typedef struct { * @struct sl_wifi_channel_bitmap_t * @brief Channel bitmap for scanning in a set of selective channels. * - * @note A 2.4GHz channel is enabled by setting the bit of the corresponding channel number minus 1. - * For example, for channel 1, set bit 0; for channel 2, set bit 1, and so on. @ref sl_wifi_scan_configuration_t - * @note 5GHz chnannels are not supported. + * @note A 2.4 GHz channel is enabled by setting the bit of the corresponding channel number minus 1. + * For example, for channel 1, set bit 0; + for channel 2, set bit 1, and so on. @ref sl_wifi_scan_configuration_t + * @note 5 GHz chnannels are not supported. */ typedef struct { - uint16_t channel_bitmap_2_4; ///< Channel bitmap for scanning in a set of selective channels in 2.4 GHz + uint16_t channel_bitmap_2_4; ///< Channel bitmap for scanning in a set of selective channels in 2.4 GHz. uint32_t channel_bitmap_5; ///< Channel bitmap for scanning in a set of selective channels in 5 GHz. (Currently not supported.) } sl_wifi_channel_bitmap_t; @@ -477,10 +500,10 @@ typedef struct { typedef struct { uint8_t flow_id; ///< TWT session flow ID sl_wifi_reschedule_twt_action_t - twt_action; ///< Specifies the action to be taken for rescheduling the TWT session. This determines how and when the TWT session will be suspended or adjusted. Refer to @ref sl_wifi_reschedule_twt_action_t for the possible actions. + twt_action; ///< Specifies the action need to be taken for rescheduling the TWT session. This determines how and when the TWT session would be suspended or adjusted. See @ref sl_wifi_reschedule_twt_action_t for the possible actions. uint16_t reserved1; ///< Reserved uint8_t reserved2; ///< Reserved - uint64_t suspend_duration; ///< Duration to suspend the respective TWT session, in microseconds + uint64_t suspend_duration; ///< Duration to suspend the respective TWT session, in microseconds. } sl_wifi_reschedule_twt_config_t; /** @@ -527,7 +550,7 @@ typedef struct { uint8_t ideal_beacon_info[2]; ///< Idle beacon information uint8_t busy_beacon_info[2]; ///< Busy beacon information uint8_t beacon_interval - [2]; ///< Beacon Interval. Indicates the time interval between successive beacons, in time units (TUs). + [2]; ///< Beacon Interval. Indicates the time interval between successive beacons, in Time Units (TUs). } sl_wifi_operational_statistics_t; /** @@ -565,7 +588,7 @@ typedef struct { * @brief Wi-Fi Listen interval structure. * * Specifies the Wi-Fi Listen interval in milliseconds. - * The listen interval is the time interval between two consecutive target beacon transmission (TBTT) events. + * The listen interval is the time interval between two consecutive Target Beacon Transmission (TBTT) events. */ typedef struct { uint32_t listen_interval; ///< Wi-Fi Listen interval in millisecs @@ -575,10 +598,10 @@ typedef struct { * @struct sl_wifi_client_info_t * @brief Wi-Fi client information structure. * - * Indicates the MAC address and IP address information related to a Wi-Fi client connected to the network. + * Indicates the MAC and IP address information related to a Wi-Fi client connected to the network. */ typedef struct { - sl_mac_address_t mac_adddress; ///< MAC Address of the client + sl_mac_address_t mac_adddress; ///< MAC address of the client sl_ip_address_t ip_address; ///< IP address of client } sl_wifi_client_info_t; @@ -599,12 +622,12 @@ typedef struct { * * @note * The effective transmit power is subject to regional and device limitations. If the specified transmit power exceeds the - * maximum supported value for that region or if the specified transmit power exceeds the maximum supported value of the device, - * the transmission will occur at the maximum supported transmit power. + * maximum supported value for that region, or if the specified transmit power exceeds the maximum supported value of the device, + * the transmission would occur at the maximum supported transmit power. */ typedef struct { - uint8_t scan_tx_power; ///< Transmit power during scan. Valid input range: 1dBm to 31dBm - uint8_t join_tx_power; ///< Transmit power during join. Valid input range: 1dBm to 31dBm + uint8_t scan_tx_power; ///< Transmit power during scan. Valid input range: 1 dBm to 31 dBm + uint8_t join_tx_power; ///< Transmit power during join. Valid input range: 1 dBm to 31 dBm } sl_wifi_max_tx_power_t; /** @@ -613,7 +636,7 @@ typedef struct { */ typedef struct { sl_wifi_multicast_filter_command_t - command_type; ///< Command type for multicast filter operation. Specifies the action to be taken (e.g., add or remove a multicast filter). See @ref sl_wifi_multicast_filter_command_t for possible values + command_type; ///< Command type for multicast filter operation. Specifies the action to be taken (for example, add or remove a multicast filter). See @ref sl_wifi_multicast_filter_command_t for possible values. sl_mac_address_t mac_address; ///< MAC address to which the filter has to be applied. } sl_wifi_multicast_filter_info_t; @@ -639,14 +662,14 @@ typedef struct { /// Control flags bit description: /// | Bit position | ctrl_flags bit description | /// |--------------|------------------------------------------------------------------------------------------------------------------------------------------------| - /// | 0 | Shall be set for 4-address packet or unset for 3-address packet. addr4 is ignored if set to 0. | - /// | 1 | Shall be set for QoS packet. QoS control field shall not be present in the MAC header for non-QoS packet. priority is ignored if set to 0. | - /// | 2 | Shall be set to use the fixed data rate provided in the rate field. If set to 0, rate field is ignored and auto rate shall be used. | - /// | 3 | Shall be set to enable ToDS bit in Frame Control. Valid only for 3-addr packet (bit 0 is unset). | - /// | 4 | Shall be set to enable FromDS bit in Frame Control. Valid only for 3-addr packet (bit 0 is unset). | - /// | 5 | Shall be set if host requires TX data status report. Token is used for synchronization between data packets sent and reports received. | + /// | 0 | Should be set for 4-address packet or unset for 3-address packet. addr4 is ignored if set to 0. | + /// | 1 | Should be set for QoS packet. QoS control field shall not be present in the MAC header for non-QoS packet. priority is ignored if set to 0. | + /// | 2 | Should be set to use the fixed data rate provided in the rate field. If set to 0, rate field is ignored and auto rate shall be used. | + /// | 3 | Should be set to enable To DS bit in Frame Control. Valid only for 3-addr packet (bit 0 is unset). | + /// | 4 | Should be set to enable From DS bit in Frame Control. Valid only for 3-addr packet (bit 0 is unset). | + /// | 5 | Should be set if host requires TX data status report. Token is used for synchronization between data packets sent and reports received. | /// | 6:7 | Reserved. | - /// @note If addr1 is multicast/broadcast, ctrl_flags bit 1 is ignored and the frame is sent as a non-QoS frame, i.e. QoS control field shall not be present in the MAC header. + /// @note If addr1 is multicast/broadcast, ctrl_flags bit 1 is ignored, and the frame is sent as a non-QoS frame, that is, QoS control field should not be present in the MAC header. uint8_t ctrl_flags; uint8_t reserved1; ///< Reserved uint8_t reserved2; ///< Reserved @@ -655,7 +678,7 @@ typedef struct { sl_wifi_data_rate_t rate; ///< Rates shall be provided as per @ref sl_wifi_data_rate_t. Only 11b/g rates shall be supported uint32_t - token; ///< Used for synchronization between data packets sent and reports received. Application shall provide token/identifier per PPDU. MAC layer shall send the same token/identifier in status report along with the status of the transmitted packet + token; ///< Used for synchronization between data packets sent and reports received. Application shall provide token/identifier as per PPDU. MAC layer sends the same token/identifier in status report along with the status of the transmitted packet uint8_t addr1[6]; ///< Receiver MAC address uint8_t addr2[6]; ///< Transmitter MAC address uint8_t addr3[6]; ///< Destination MAC address @@ -670,9 +693,9 @@ typedef struct { */ typedef struct { uint8_t - cwmin; ///< Minimum contention window size. Value is calculated from 2^N - 1 where exponent shall be provided as the input. Valid values for exponent N are 0 - 15 + cwmin; ///< Minimum contention window size. Value is calculated from 2^N - 1 where exponent is provided as the input. Valid values for exponent N are 0 - 15 uint8_t - cwmax; ///< Maximum contention window size. Value is calculated from 2^N - 1 where exponent shall be provided as the input. Valid values for exponent N are 0 - 15 + cwmax; ///< Maximum contention window size. Value is calculated from 2^N - 1 where exponent is provided as the input. Valid values for exponent N are 0 - 15 uint8_t aifsn; ///< Arbitration Inter-Frame Space Number (AIFSN). Valid range is 0 to 15 uint8_t reserved; ///< Reserved } sl_wifi_transceiver_cw_config_t; @@ -685,7 +708,7 @@ typedef struct { */ typedef struct { uint8_t - set; ///< Shall be set to 1 to configure the transceiver config params in MAC layer. Shall be set to 0 to query the transceiver config params from MAC layer + set; ///< Set to 1 to configure the transceiver config params in MAC layer. Sets to 0 to query the transceiver config params from MAC layer uint8_t retransmit_count; ///< Retransmit count. Common across all peers and access categories and valid only for unicast data frames. Valid range is 1 to 15 uint16_t flags; ///< Reserved @@ -748,8 +771,8 @@ typedef struct { uint8_t flags; ///< Bit 0 is set to 1 to enable filtering for the specified MAC addresses, else set to 0 to disable filtering uint8_t - num_of_mcast_addr; ///< Number of multicast addresses. Valid values are 1, 2. This field is ignored when disabling filtering - uint8_t mac[2][6]; ///< List of multicast addresses. This field is ignored when disabling filtering + num_of_mcast_addr; ///< Number of multicast addresses. Valid values are 1, and 2. This field is ignored when filtering is disabled + uint8_t mac[2][6]; ///< List of multicast addresses. This field is ignored when filtering is disabled } sl_wifi_transceiver_mcast_filter_t; /** @@ -791,7 +814,7 @@ typedef struct { * @struct sl_wifi_transceiver_rx_data_t * @brief Structure for handling received Wi-Fi transceiver data. * - * Contains information about the received Wi-Fi transceiver data, including status, RSSI, data rate, length, and the actual data buffer. + * Contains information about the received Wi-Fi transceiver data, which includes status, RSSI, data rate, length, and the actual data buffer. */ typedef struct { /// Status code for the received RX packet. diff --git a/components/protocol/wifi/si91x/sl_wifi.c b/components/protocol/wifi/si91x/sl_wifi.c index 61a5e35eb..374786881 100644 --- a/components/protocol/wifi/si91x/sl_wifi.c +++ b/components/protocol/wifi/si91x/sl_wifi.c @@ -107,6 +107,7 @@ extern rsi_m4ta_desc_t crypto_desc[2]; #define PASSIVE_SCAN_ENABLE BIT(7) #define LP_CHAIN_ENABLE BIT(6) #define QUICK_SCAN_ENABLE 1 +#define SCAN_RESULTS_TO_HOST 2 #define MAX_2_4G_CHANNEL 14 /*========================================================================*/ @@ -417,6 +418,12 @@ sl_status_t sl_wifi_start_scan(sl_wifi_interface_t interface, advanced_scan_configuration.active_channel_time); VERIFY_STATUS_AND_RETURN(status); } + + if (SL_WIFI_SCAN_TYPE_EXTENDED == configuration->type) { + scan_request.scan_feature_bitmap |= SCAN_RESULTS_TO_HOST; + } + sli_wifi_flush_scan_results_database(); + status = sl_si91x_driver_send_command(RSI_WLAN_REQ_SCAN, SI91X_WLAN_CMD_QUEUE, &scan_request, @@ -449,6 +456,12 @@ sl_status_t sl_wifi_start_scan(sl_wifi_interface_t interface, return status; } +sl_status_t sl_wifi_get_stored_scan_results(sl_wifi_interface_t interface, + sl_wifi_extended_scan_result_parameters_t *extended_scan_parameters) +{ + return sli_wifi_get_stored_scan_results(interface, extended_scan_parameters); +} + sl_status_t sl_wifi_connect(sl_wifi_interface_t interface, const sl_wifi_client_configuration_t *ap, uint32_t timeout_ms) @@ -1535,6 +1548,7 @@ sl_status_t sl_wifi_deinit(void) reset_sl_wifi_rate(); memset(&advanced_scan_configuration, 0, sizeof(sl_wifi_advanced_scan_configuration_t)); status = sl_si91x_driver_deinit(); + sli_wifi_flush_scan_results_database(); SLI_NETWORK_CLEANUP_HANDLER(); diff --git a/components/service/bsd_socket/inc/socket.h b/components/service/bsd_socket/inc/socket.h index e2af81ee6..145f91602 100644 --- a/components/service/bsd_socket/inc/socket.h +++ b/components/service/bsd_socket/inc/socket.h @@ -129,6 +129,7 @@ typedef long off_t; #define SO_CERT_INDEX 0x1026 ///< Sets certificate index for SSL socket. #define SO_HIGH_PERFORMANCE_SOCKET 0x1027 ///< Enables high-performance socket. #define SO_TLS_SNI 0x1028 ///< Passes SNI extension for SSL socket. +#define SO_TLS_ALPN 0x1029 ///< Passes ALPN extension for SSL socket. /** @} */ // From Linux include/uapi/linux/tcp.h diff --git a/components/service/bsd_socket/si91x_socket/sl_si91x_bsd_socket.c b/components/service/bsd_socket/si91x_socket/sl_si91x_bsd_socket.c index 73a042507..d56b18053 100644 --- a/components/service/bsd_socket/si91x_socket/sl_si91x_bsd_socket.c +++ b/components/service/bsd_socket/si91x_socket/sl_si91x_bsd_socket.c @@ -697,10 +697,11 @@ int sl_si91x_set_custom_sync_sockopt(int socket_id, break; } - case SO_TLS_SNI: { - // Call a function to add a Server Name Indication (SNI) extension to si91x_socket - sl_status_t status = add_server_name_indication_extension(&si91x_socket->sni_extensions, - (const si91x_socket_type_length_value_t *)option_value); + case SO_TLS_SNI: + case SO_TLS_ALPN: { + // Call a function to add a TLS extension to si91x_socket + sl_status_t status = sli_si91x_add_tls_extension(&si91x_socket->tls_extensions, + (const sl_si91x_socket_type_length_value_t *)option_value); // Check if the operation was successful if (status != SL_STATUS_OK) { SET_ERROR_AND_RETURN(ENOMEM); diff --git a/components/service/bsd_socket/si91x_socket/sl_si91x_socket_support.h b/components/service/bsd_socket/si91x_socket/sl_si91x_socket_support.h index c39078885..59aa213c4 100644 --- a/components/service/bsd_socket/si91x_socket/sl_si91x_socket_support.h +++ b/components/service/bsd_socket/si91x_socket/sl_si91x_socket_support.h @@ -88,7 +88,7 @@ typedef struct { * @param[in] option_level * Level at which the option is defined. One of the values from @ref BSD_SOCKET_OPTION_LEVEL. * @param[in] option_name - * Name of the option to be set. Currently, ONLY @ref SO_CERT_INDEX, @ref SO_HIGH_PERFORMANCE_SOCKET, @ref SO_TLS_SNI are supported. + * Name of the option to be set. Currently, @ref SO_CERT_INDEX, @ref SO_HIGH_PERFORMANCE_SOCKET, @ref SO_TLS_SNI, and @ref SO_TLS_ALPN only are supported. * @param[in] option_value * Pointer to the value for the option. * @param[in] option_length diff --git a/components/service/http_client/inc/sl_http_client.h b/components/service/http_client/inc/sl_http_client.h index 21a6616f8..8c24b3a24 100644 --- a/components/service/http_client/inc/sl_http_client.h +++ b/components/service/http_client/inc/sl_http_client.h @@ -19,6 +19,7 @@ #include "sl_net_constants.h" #include "cmsis_os2.h" #include "sl_si91x_socket_types.h" +#include "sl_si91x_socket_utility.h" #include /****************************************************** @@ -250,7 +251,7 @@ typedef struct { uint8_t * resource; ///< Full URL string for the requested resource, including the scheme (for example, http, https), domain, port, path, query parameters, and fragment. The maximum supported HTTP URL is 2048 bytes when the SL_SI91X_FEAT_LONG_HTTP_URL bit is enabled in the feature_bit_map. If the SL_SI91X_FEAT_LONG_HTTP_URL bit is disabled, then the maximum supported length for the HTTP URL is (872 - (length of username + length of password) - length of hostname - length of IP address) bytes, excludes the delimiters. uint16_t port; ///< Port number of the HTTP server. - si91x_socket_type_length_value_t * + sl_si91x_socket_type_length_value_t * sni_extension; ///< SNI (Server Name Indication) extension to specify the hostname for servers hosting multiple domains on the same IP address of type [si91x_socket_type_length_value_t](../wiseconnect-api-reference-guide-sockets/si91x-socket-type-length-value-t). uint8_t *body; ///< HTTP body to be sent to the server. Setting this to NULL will process the request in chunked encoding. diff --git a/components/service/http_client/si91x_socket/sl_http_client.c b/components/service/http_client/si91x_socket/sl_http_client.c index 429911fa7..fc6fd82c9 100644 --- a/components/service/http_client/si91x_socket/sl_http_client.c +++ b/components/service/http_client/si91x_socket/sl_http_client.c @@ -102,7 +102,7 @@ static sl_status_t sli_si91x_send_http_client_request(sl_http_client_method_type static sl_status_t sli_si91x_http_client_abort(void); // Send SNI parameters for the embedded socket -static sl_status_t sli_si91x_set_sni_for_embedded_socket(const si91x_socket_type_length_value_t *sni_extension); +static sl_status_t sli_si91x_set_sni_for_embedded_socket(const sl_si91x_socket_type_length_value_t *sni_extension); /****************************************************** * Function Definitions @@ -399,12 +399,12 @@ sl_status_t sl_http_client_delete_all_headers(sl_http_client_request_t *request) return SL_STATUS_OK; } -static sl_status_t sli_si91x_set_sni_for_embedded_socket(const si91x_socket_type_length_value_t *sni_extension) +static sl_status_t sli_si91x_set_sni_for_embedded_socket(const sl_si91x_socket_type_length_value_t *sni_extension) { sl_status_t status = SL_STATUS_OK; uint32_t packet_length = 0; - if (sizeof(si91x_socket_type_length_value_t) + sni_extension->length > SI91X_MAX_SIZE_OF_EXTENSION_DATA) { + if (sizeof(sl_si91x_socket_type_length_value_t) + sni_extension->length > SI91X_MAX_SIZE_OF_EXTENSION_DATA) { return SL_STATUS_SI91X_MEMORY_ERROR; } @@ -415,7 +415,7 @@ static sl_status_t sli_si91x_set_sni_for_embedded_socket(const si91x_socket_type memset(request, 0, sizeof(si91x_sni_for_embedded_socket_request_t) + SI91X_MAX_SIZE_OF_EXTENSION_DATA); request->protocol = SI91X_SNI_FOR_HTTPS; - request->offset = sizeof(si91x_socket_type_length_value_t); + request->offset = sizeof(sl_si91x_socket_type_length_value_t); memcpy(&request->tls_extension_data, sni_extension, SI91X_MAX_SIZE_OF_EXTENSION_DATA); request->offset += sni_extension->length; packet_length = sizeof(si91x_sni_for_embedded_socket_request_t) + SI91X_MAX_SIZE_OF_EXTENSION_DATA; diff --git a/components/service/mqtt/si91x/sl_mqtt_client.c b/components/service/mqtt/si91x/sl_mqtt_client.c index 8f2c8e541..0983d2039 100644 --- a/components/service/mqtt/si91x/sl_mqtt_client.c +++ b/components/service/mqtt/si91x/sl_mqtt_client.c @@ -481,11 +481,15 @@ sl_status_t sl_mqtt_client_connect(sl_mqtt_client_t *client, if (status == SL_STATUS_IN_PROGRESS) { return status; } else if (status != SL_STATUS_OK) { + if (client->state == SL_MQTT_CLIENT_DISCONNECTED || status == SL_STATUS_SI91X_COMMAND_ISSUED_IN_REJOIN_STATE) { + SL_DEBUG_LOG("\r\nWLAN disconnected. No need to call the disconnect again.\r\n"); + return status; + } client->state = SL_MQTT_CLIENT_CONNECTION_FAILED; status = sl_mqtt_client_disconnect(client, SI91X_MQTT_CLIENT_DISCONNECT_TIMEOUT); if (status != SL_STATUS_OK) { SL_DEBUG_LOG( - "Failed to disconnect the client after failed connection attempt. User need to call disconnect explicitly"); + "Failed to disconnect the client after failed connection attempt. User needs to call disconnect explicitly."); } SL_CLEANUP_MALLOC(sdk_context); return status; @@ -839,6 +843,15 @@ sl_status_t sli_si91x_mqtt_event_handler(sl_status_t status, break; } + if (rx_packet->command == RSI_WLAN_RSP_JOIN) { + reason = SL_MQTT_CLIENT_WLAN_DISCONNECTION; + event_data = &reason; + sdk_context->client->state = SL_MQTT_CLIENT_DISCONNECTED; + // Free all subscriptions as we have disconnected from MQTT broker + sli_si91x_remove_and_free_all_subscriptions(sdk_context->client); + break; + } + is_error_event = true; // This state updates is necessary as we need to send NWP disconnect even in case of connection failure. sdk_context->client->state = SL_MQTT_CLIENT_CONNECTION_FAILED; @@ -847,7 +860,7 @@ sl_status_t sli_si91x_mqtt_event_handler(sl_status_t status, if (status != SL_STATUS_OK) { SL_DEBUG_LOG( - "Failed to disconnect the client after failed connection attempt. User need to call disconnect explicitly"); + "Failed to disconnect the client after failed connection attempt. User needs to call disconnect explicitly."); } else { sdk_context->client->state = SL_MQTT_CLIENT_DISCONNECTED; } diff --git a/connectivity_firmware/README.md b/connectivity_firmware/README.md index 898572148..f0df257b8 100644 --- a/connectivity_firmware/README.md +++ b/connectivity_firmware/README.md @@ -4,10 +4,10 @@ The **connectivity_firmware** folder contains 2 sub folders, namely **lite** and Top level directory layout of **connectivity_firmware**: - ├── lite # A sub folder containing a binary file named 'SiWG917-B.2.x.1.0.2.x.rps'. This firmware image supports SiWG917M110LGTBA IC OPN and it is valid only for SoC mode. - ├── standard # A sub folder containing a binary file named 'SiWG917-B.2.x.1.0.0.x.rps'. This firmware image supports all other IC OPNs and is valid for both NCP and SoC modes. + ├── lite # A sub folder containing a binary file named 'SiWG917-B.2.x.3.3.2.x.rps'. This firmware image supports SiWG917M110LGTBA IC OPN and it is valid only for SoC mode. + ├── standard # A sub folder containing a binary file named 'SiWG917-B.2.x.3.3.0.x.rps'. This firmware image supports all other IC OPNs and is valid for both NCP and SoC modes. ├── README.md # A file carrying basic details about the directory contents. > Note : > Please refer to release notes for the features supported by the Standard vs. Lite firmware images. - \ No newline at end of file + diff --git a/connectivity_firmware/lite/SiWG917-B.2.12.2.1.2.9.rps b/connectivity_firmware/lite/SiWG917-B.2.12.2.1.2.9.rps deleted file mode 100644 index 5ab662fab4639b4ab1242b7fdbf918b66c83a1ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1283600 zcmeEv3w%`7x$oMK*)vIYW+urH0&HL>nLL0|CU4ZSOduoy1_=-W?QWe3LkKWH2;rfP zGMEt1#u_0-YH1slLaM1kp+{_|HoB=$rAh~Sv^`X@#z%WnO9NI^B=^7e-jf7h^_+Xp zz4zSfkH0)|7lJ?WVc4XR!vkr) zAKo0+f_fM|=8{MVpFqg&$C&Wp{^6n>M&6NtG!(aI44z#^d2QDZ~9|3n@C7I zbZ8yW2)KYLfCBU)PHG5f-R*>X{E-0J3q10tgvz`RIE1q+XynUe6FEj?!Vr^|_RFs? zDexr)z90oyLRK$r+;mI*nl&M0p|h&xX941QDnQQR^94)MlJTd4r0aC>Ka%Ckv|m!- zOA7pdK!MJ06GGR>Z*Q+5zSG5#F@jADw!pomjXnB zOF#Z`Eb+asFS@-5dl`AF-$lO3HAGxhLn7O1h&{W8>`kp9z5V-0HP4dBc$Dp6NszFl zWpoW8vW}y0F91F7?;}$(kT0`_)aRg_f9xYc_}_NckWR$Ai)zRelyw;S&-@@joDxgA zMzJK6$dXHA^mfIDZSUXq5#`|kNdq=9EZO@vhNS(4A@aol>3c6gTAn>f>W}Orn|>W2 zb;kq5{i}WCX%aU_nL-+)iq}{}j@SGZQ0N9TBDx|d_Tw2W#Khl+{2Z?eV zZ3!~OwGv@B)R1s>4cU#bmW3#@tcEyd)sV`H8j=Qt@l4=`-epLr6?Fgyo<2xiJqOA5 zUmheUpE^i-vp~B#(EY15#DlQTa;YfLKBu?VkZ#b~5B|N_hk8MWN{m<6JNt+@7c~7d!V&KU zT7WY^+g;$l_c87vjDxL)v?roG3ut!;^aUSzr+~I+_L25GYY30>FM$4jv^`AQ^}~at z$pYT}8T#@2eWc8dypzD^pyBTK(AS?FBxf)tdwTYfu4!FlPc7;O4ZJAlDA`Zi!CS6B zVeU;u8$Mt(bb|K}oM#CC^L^xuc|WnEb96t(VnBk6tuWFAa?o%YZ~!!{5}@h!B97*x zVQD}i5X*PQ2&d0}AQzAUnvbTZ@B(#!3!r7wxa}zOBwSi<46%A?9v?u{Eyl8dmVFqY z@zn1&Aj75g({^u~sMmXv)$5^YXnLBTmjA<>2|0^8hkw$3_tr!rr-@hq)lNVJXOhE= zoo5)ru-6Sw_&I)B?(3gct{deNQoGzJmz8;jB@F*X%Z(K&(EI?ZA=SYEzIE4AiTQ?S zc?M+eqmVH`6X3rdatvsi7a$jE^z>RL<14tJiyYYf7%3}fNe}W?OI_q>Ru{2kV|5pR zi*m!aARqFIOHc;jp2-psSd27#D_A0*z+40_BCR{8Yk2XRe@b0|Y+nZa1Txfud}{;5 zg*lMBn;}ih@f?CYUJ1Pb|H<1};@SZDv6dlw*P~4cI}X2Z9R||)9J!An+d*W?)3Hw@ z81@3v(of6%L*bSk$ot~KSTfB$axX&;->Ihww(4%%9SFO9DBp3Ttm@J(5(HxNXLvzf zL6#K0%8)vvzTUM%ZEXDAP+74&)sW45zJc~E#T*BEFo&BiGNcQ2Z3hiHFkZeFkfuC9 zx-k}Ipx0UWt8a$^T_oc`T{(2FS|`AgfC;#%Py2xrUIc04c%skn+iT#z>-{)6Y4%lUOostfVP!^pL&0Dkn~MsNcBzN z%W24i`s7)V<3M3Kbk%I61JY(d5Bg9KTnX-Jv^|8j%8#O5=aCU=os%M zn1#32kj8sZ4)~CME(jtK)7V%}m7(7Dl61|FK( zMcRSIv$_Ul_>Cyb3G@O%KnA=3mH$*GQ=v%ZI(4aht_Q+sB9-AZy$7H=hRSRz`(iRb zmdAy#?%5cFD$LV4aAC)sd*UD|Jc79bGy$E!QGkCE_6u+TxJdm!J4o7qBY^aC*i*n^ z-~!-`93)kM?-xh|M1aOa0dfXqAE=}b70Rb6@Meq-ZU}_f1|a( zG0;(Cv6D6)eNQJD_{#)EoFof>+1g(Y$$_4ve-pI7iP&+YeJ6~K8PB+x>C8fA1+$si z#XQCwXI{r%+c@?stee4^`Q(G&L6DLGcP{5Jzd?(HbrQ=Hf z2g~jcM($>(%U9m?4%9JD;TQ%hdwAxPV*8kEw7uF3IAa1kdH`J;IA|j zOUnS2NIa5Kf^|Ol(8GIwxcv{K!G`)bA?e>cbm?~=t?7IEr}sJ250x}*Jo(yRu9-hO zJAaF}x%ct2zg+R)y7+(l#@e{s#96H6;p|%B2d#_G{Uh|6d^Z1~@i}J`i8n?Ct+Ek0 zf9fqbv^g-bKE=Bwa??f6J86^Ef7H)8KZ`A#bkq8KovypKhd11R`&>tY#kcxU%ZK7I@G?u_Lbi~k>}WCUO7H|tv?u^cH$N>`2C+YJa_q< z>DNm;um3ma2G->ncho=b-Je-aTmP}EZHC!u|M#B-j=B5(#%BKQtgmp&ky#~+zIoTH z-&^s}AHLae`g?bG{bbEs@BH)|^6nkSUwPrVZ0|MGGxnZ7vCo@1uX z9Q&^uzi&D96!YRc124W&_J?KvQt_vm-+k$DvWUq{sbVKR(whZ~}N9cnEsY2lbnfN z%rb3dW|~@ejaVY-tkH*H~Nn8Hk%X)`n3bO$rdbURaOYGS;mZ!r0$+n7Alt&H2W ziODc+WYSF=7}>O*Nj5byNv3s--PFLarnL-Xf+#oX7A`b~>%O)M26UYzAbtI`}Hd%7ZQ)FP^8N%6B z;3zqAX@IaiV?0!LVp8@Ml-n@=3v(`Pfd_;x4vqmnF+{H>hh z$Sm&M59V^6*U#tV39C6`zYS;wh;1ejm`B8TjHi`xkR+z{N6F0gDJjfxzk^AbGJ@%4 zQW;*77)ct-h-4hYlkrR{ks0UcbjCz7kSCj&NOGAvG8s~IHuJBHk6|n~;Jb>sJxO6+ zF@KHWEnjEsBW_{RtNh@P8YY8T!n{nDGV+*O<|bwhgTo99Z{aL|Us| zR|tO={$mK=m**w>^9o5<9$|iz7jJqbkB~?6SkjH~ALkX5#}NKF!Ve()Ai}kNFmN$; zpYTKDLF1dycMHazrDKJqmfJ~s$7B5ds?%Tt)!+4TTMdnfWbZFtZo&Y(>T_`VYiGE;^mfqB4T2CXfSjaJCKBqp4f!c z3lrB@!+16Ms>{|%WI9ahN-_8GnWBZv!lJ+j%mHoy7KrhrT72Y@8{sY#6UZWQ99ax} zT_o+xF|}48jm|6cVRQS&#)*(ZrX&kQ|6#$ftUtR2={6G%=l2 ziMLwjiOCuBMcds=MN+>~oZ$_Lzj$l4xSwAmrjU9uiL3=SiZafJX{kH&s3qWRp@IK`f3yCSkpNtGah#q>?ggi4DD+&9mA!}$?>IPW$!d`E&58x zJOF)t0DaxCQZ!eE#NVT@gscJTfwjO!U=uLZRyr=j+j{QP+WJq%O2YQ$HLqhXKI(nBb|(N>3GgCk@N{jGZB~sxB#6dw4TOXy`E>j8E5(d>Urk*1h^vV zOGJG`^)O^4>KbFZkozC5hp~`SvE%f7(R}v`kz+X17`=Wi{0Fa6o~84LLtAyeqv^l% zdp-T|a29F4YNVn5So(2DKkk*KB459TxsLJ<0WWV$VS?Z%w|h9Rv6yee=bS~1Z`bRj zWsHB7&Yd;PB#r;*e4w(3^8E0*8Jjb)c}wM+UPe5X8{tyXUWGp0MP&(ON`f8-U5q}` zJ`IIw=~3_ZU!gQG(pzI?!Tvl+ZBN*sRjV=Il8O5{Jq~MhE_caNuI5NBw={VfS9iRQ zE53d?_b0M~D-W*Zo_aFGB|BDe6Q6D3ZutG}-22<_;F@08%nf9Qx%RJY;r`6r$z3?p z%>8y-3peA$R_-gAYsje4LuFrhVkwvXy;{!x&NA+)k~;2^XF0dXw1PX)vy#iaKg4<7 zUd64P(!{N5znz

<-T1+{~@d3v&xl_H(8?x%6Glock9oT%x>{Q;XJ+xcH&6U)r;j z`(DLRyZ55(&i7Vux9?xceWyCajZRp_J+C%#Z*RYyyFL33?xDQR+{80s?)~exa8us9 zlUsjpGk3bUg_Ew@%6<3r8X}m7%1)?U%Kg4(sNDsi$@ea=;Hqb>UovagSfy z#AP45oeQtIgNr}2nQMF@%-w@_|NNsnxsvCbxt6sp+{)i?<$n6Y8j?D4sO<57Sjx?5 ztmPg(xr}T1V;wgdWtU!B!BxJtlH0l=#MPZx#fh&raR(o`ox5Y^9o#_jX6`q?3Udu8 z`^blPa)0|lGdH8Eg_~>J%H5!@A!4Flc08f$3}c+_`Z$y4U{m5+F;+A-;)VCW`s4jC zuHe6U`CfKL(tr6l{5Pl3m-P83bLh+Q{d@v_NuSTBk74)BB3mu6Be0*+4EZ5ujmL??!sS31kDg zz(fFXtPErT$j2fd%L4*n0pfSFECE=62L!+ZAe=`yk8mF0Ji>W|^E6!Ci#UJxq0QEaA!Ud?C21x(6 z(`gTA0`PzUP?~%Oomln=(gC0c3)&3v3;dK%2Kfbk$|G0s%vn4G76A0(K`$Qk;vGO5 z@c$5<;z6f)&?y=8NCurm%qtN*|5_Q2_(wB7lFQQXy{i@4!7Bc;F0eR16 z1CaMD{&qCg_koPR)JzEGAZ$}vb{&qCg_koT;s4Kf;lyk{ZrS;%`9@}7mf z*W#{*e4=t2@}7mfXQ@nwyk{ZrS;%`9@}7mfXD0$KfX2Cj{M{@Mm(PbhjOhxLMG!Wq zBVw}AiZJ_L$V&ixMZkjuvYLRuNb*TsJp3X+9|gby!~-G#InP4Qvyk(w1AQd`y;7IL12oM$2DS;%=7a-OvUG%gu%p#Ny^r|B$RRwK^d^#$e7 z5lx1(B3vr~narZ!Ec(q-8AAXT-~lRs;sGju>}Od4u8@3=73@GNkoH9ZS`Yvy^(+s3 zF3k`R-T0rQSqJI?SbzrvzyeSm{;7Js6a55)PFA!4@m;JHvfK)tXNAtQLjI&e7NtTK zrBc5of*S__4+sGC`#2t;E@(IoIxZFTOmzUMXW>7~j)S}&2YLO)fWCi8r!PROFX{Bf z_$emSEhH)8|1G^v^9L~oxJpLo70cy=KYk}l` zM7w20?^#`DCvlUwuj21p_&bWfkMK9Vtp8{`K3@Ltvi?`KOCU>gWr8;<$eTE+TY--2 zeHTauH`<=TU2CUzF5-uM>~?YRW5W40{lurlYp#ID*!>-bp(XWY&~My9)BNWi{JN}_ zPs+#`&_)7A0i%Jjz&M~8$8s&eR-hHw25blJ0`3OB3A6$C0N(=c1=@l8fE~b2pab|e zunV{!*bRIKcmVh=um|`a@O?mU4?ozR|5u-5^o{lJ%4cz~{~sTZaTqxnREopfzqtEm zeCYX<{#VMx{-!bXk8*h#{$?=cOa=aC;cqrGhncJWY1zmAG46HCpUrOPfAFO{LdB=W!yUQUXTBC z+}|wkT0S%rK@bv64$~NJ7`^qey0qv+<-@>-wI8hfp#J^!@2|i3f1KXp>j{63|6AO< zaUWWUMKC7{gY6!o_vQJQ7kvai`4D_E)NbjIw9hoJ1$oVaDUo*!AFIpYG0LBpz+<$} zgLxS?kr_8SEtMTNZd@uyzj*p(qF)02GSe>${feVs@$@TU+&C#!94DovCXP!>O$FWl z(;tSlGEy4qmn76rzi?j;_0unbewpc)g?`1+uXy^EAW5iSqV-Fusj1fN|8(^v5o)At zp8jr0Q9Kc_$Ro({u6S>f`FfK#9iHeWc8ZWOKEMi(-&3*Adz%= z{$l!%8{c>!ko45pHg??7BlkV?P*Un`KX3cG`TKEyI^I>VCzg(CB?dYy4EKNL!{f#} z1-*cNWD+f%5cz7{dk0dn4aO!$q5FF#*W;J-Ho z_U_f^5#{e$pVO7ki;HF3giC7_VFTOYQnVY`4VR+RKo?w!0|t)3rRXtm94^I4124m+ zIBVc-xD@9MT!c$O+&V09DeMN);8Ms2a^X_A4NQSc;WbbRm!itRVz?B319fmI>J4my zOA$7(9WF(?f!%N^It_Her8r>V2waLD1IOV~oHXz-iAwY&cH>u6eLfF1uli% zKpI>M*+4E_3b%nNa4Eb7D&bO88CVRL!f&7sE=9e8O>il~2DZbcXg9DME=8w-F1Qp2 z3><+=(PQ8^T#AzhUWQ9?*1+3vDb5+V2$zE7>#)G3up3B&OCcM`g-hW!Fa<7!*FYs) ziYfz(;Zpbw)WM~wH?RpVMcBZ0xD@RMcEhFUG|&Z?;(&o8a4C8W9EVGB(!k4bDb5;r z8!p8;0~g^^kOCbRxD<8+X>ciI1G#W1+yW5*KjX`jXWasTW?-;bM; ziyhj(@6(d*Ud&>TsD|XOt{Hr? zZXfARK%H=#E-<7U@4r`G43MMn=dKHoDS!g(2F|Vzkg5#<;@*UJ8G*7}@!JKr1xWkt zc&9TQ(ArTs4P(K$bq&1IsPr=|1R>qg}MNDgPu;=i8LK37dQ%ZqAcgG07*l> z@cr=b4v@XT9^`c(j(#rTz2e5qE)vIx*q2TkDY=jDmh!N75K;<)Hii3bLX^!WyhU;! zNTA_LW|@`L#aZ{qb#Mwh0q1`Rb0cNJZxwMNP_l_rFwLN6l~c$tm~ zlDmV@FcD!e#E~WvO=kqZl;XR#8B%MDGOMd z`}5LAdea%&Hp#6#skNI+(w^UB1Ud3hi<`!!o-5{d{X_MiOIPZHHnI6wxMPmwKKp`} zzF^B$$@PLPCAmp+o|-A(R<%qx`HfrhZ=s=f!sWfO*^|2MKE zGzBQ|-dk8=Hsjgst+pGz)pFZhYNl96OSO|`ck~-6Y;^KayiA7TWi4K5-76@?y$PUP zC@0(z-?m8%sY0+=a#yobo-AA2#GiYL&JE=F505U_sqYJBHh8VRoX(DTrPwJbne#v~ zJ@qM~Q2CkvTNNLBWO5f0_};i@C}z0#R5n66Al z-h1}RLaE>nmPeEfru)|J)wEZ>O(#O0%(hC&9VSwqx76m_TKndBn<(Dehh7U=>V#mi zQZh3U9A}o?El3mg3P>e>PMXF(yf^BofNN{cHNIMdXm0 zHaRGkkyTm#xxrM%X?>G*+7^cUZq>(TSNw*ag*M)jYFA~obdbIUWmXSI7&TdSMpm>f z_P7%hz)4)&#f5lZNg{Xk_6x6xj3_u+op1KAZR ze90~0mr?c5leXcZb#^^;x7OQO+9N4?XzvxFeMTs83@-ssT5ZEaF|Pa!t~Ds-G2U$1 z>KdA9BN$1RWhtHU#?=M$D^_;!inGFco=A4WOG$)R92Hiju*|AtKFLUS%+Dmq5bj5e z!k8FOe$Qp_Fb^KfLpjFmMP1ypqCg_y2S`prb$rCLhxD5xg?k8c`JZLY1$BpI_8 zs~xndn@nvW&3N<&s-wv}fNAuO_Pu>8CCTE&vDXX?>o2-X5*< zWXv9|7QLC)?Dov>9yK)M32Spn`SpD5G@H*;#5*KN%`-i{`Ueem5!|GTrL$XVvF8yh19@|bRm_IbH@f- zomkhf5$yv7n~ANiwOnr}=o60KF1b_fl$#QK4V6}(ySNVX+bX%mFmjiRJ}HZsZ9ZBDLu`!;xC(zqk|ZNG9kF#g*3ec+ zMMOY5AY+lHFa;bG%iS=`=A&9+ouoLQI6b8WnSVD)q-VCocv&1228B$Fojcq^ z?H0%bBd4v+vy8W!d#Y10OEj4z)@5muV`#os-zE*ojRgy=kv~8}4yU#^HdAu^9pbaH ztw3@YUZnh04k;6PC!N_zJSESk+17#IG`SzyV5yGmdU^2`rO+|ET5?ymXqFY`_@x2O zGO-U(u5*i8xFlaVFQr#N(rsOujWmc8Q3~cA@09Ep%}AMli3nbd8`40&XmXCuCJFD) zQd&{zffs*8&y;fmtw_faD#d9I7QJfJ(xBCj3uiQ%cMI!G*NGfS`_2(tpLEr2KV4 zLqN&jAVA`L>jBceHndvhgT*^B4q?!kWC#|U*uAz5q3TF#9qQU$viDh~q%Lj5-_|9M ze8eiHBg7}Ub2ZCeBHdPrK?tPQ-b7vBw`nn=OYo}sk;)c#3fUE>+cc6q;cfa>tpP>EmHXJJ?#Xvx1SsG2*QlH)zlB6=8tl-sGTh`7 zOEGT}8#tv9`JAO(w8FJoDy%2wx@xw8r`7PshQc)$DYEzyhJR;JIgK2%Xtsb!i2uPOBh?`Ch(5EMV2Fef!k%?4E6;I`P>V zYWaRr9VZajja5kNUq_zxs?#*fL=M+^)`=GCzrhZFif9+S!RelgHH;W+2zv51vsvC_ z-j0jQNYN-d|LihZ@0mWBqfyTRE1UE1AJ0Qu2ph@n3rp@j+Sn)f)O@K>B+(#GA`dKL z1k9g%7|bEyd%zE4c2&JPPYkz}&8&NCNk@F-oleXYAGpvn0`CqNuOpHCF84w!T}N)m z+|{jhS{JxaleMjoC{q60Og38l2)L5QwJxPIk;Z5%%*@|2(Q*M{vRA;mhPSBcK`xjv zoIkL-NSTu;;Co@>U`^n;*cyTQjQV6M(_Ut5VmMTu0c$Ui4T_>>SF{p#lwr?NImcUC z{aQPa!?2w+J-W3L)`op*PjepCA%>19Xc3fxGIOw4qoaG*2WpjCs>oEj&3{^qIgC9!f>r`gl{zE~QkGs~D?qhX2iJuoX3_22D(L4oVh%J7#G52lj2u zs`+eJa>MpTi3uUhJ2xE(=(Jd`QKxTduz0BFiu1P&<#nF)FY8|GDR^Ga@tX1E zGPxSRDnR2@`AW`JQhv{v<&HEZ*C`t^onIFO|+E{*nH-Hh07gr=u3?#jF$NYB@fw zz0lHfM@kf9q}Py*xgwGITqNyDH??H+wr7LaXnm<}#f!BT6JcL=Q_Zf~l9E)#bFc%L zTB11V`W(Ob!c`seVd86O@Xu{PDdNj+o&V^#ezN51>!rc9 zecP&9NT6&jKjko83rRAciT*Q?ErqB#G-OjW=S7!7f;etW*hyeXTs}{-y^8b31ZtmA zd5T3gb^)Y)gFV^N$*iP1{B zzSrgL48PTfa-tbbAKFH(4wc7>{xn^`2;RuqeR$WO>bGL^u8%M#{-CYOE54?L_X?q#uNPOTCMrz~tG!JvlnSR1bD+cIT2JND zus9dB@ex$4tX`&!{%$+}XV9L5-=k z*+QbVMyi`jtHD9pSsdtEd=-b1z`fwC?RUFfO&%N7kCCb;-D;)HzKBe=4{@$p}OpFFIU8NZt*pqSY`Hi*u{+%{*E|ENn?)zD`b<+*LHh3%G9{G6SBZq zf%vcjnOoO(E0u83CDOEZ#^dan1Szahz~*z^p_)Aw#<+JG5OBJ?C)Ev!g=OIhy9t(@6N`9=htWwdwR! z9Su3KK^;mlWJw*BU04x;|FEmmhPJr|ca^8Fy-MYk>9=0xak{(;x8*92?AoGCzl%OU zt>#l}7W>U^npY+&-|Mb6BNR{AB`zE+SxaRT)$|7MU`u>-|53m%>MRWNj`IV%xD97@ zdlPyu5IXDgD=F&)I%Bjo)%fm!2)RIMOIIqO#jDmj)r7qOPM^!ZYHh9Ir)v%Pll8nG z4bbPln>_gmqr^R`$&-4LlbkjZEFaRWROg#&1gxKEc_d8bL$)R#`oMdb7j@uzp$F>| zC7a`d#VZ#_XTaV_jlAiEgyOwYUM}{4uG8|_Tqhc_!ojRpvVYC=8`7v8yN!@WF5180 z)}Mz9k8YKN;fv-%1= z+dp?L)hHsk;DklWv&)#p-mQMx-&8xbI*pb zg>u+By$&(7V_p7|EWamH%#9r1<~H<}UG)3J6I&Fn#Stvm!$iNhMzK42$RTQvXO>fa zAzOW?7{y)2_vTf{(@@D>j=s=v#a_YF`C%$8*KByL&*zG#ssVL}nyJ*cIGk6jzjeM_ zrKs0VYE$eFI+dy)Im3;;(+f?C{dHccI?soiltTqXjU!9Qs<94ti)YF`HQ^cf-Vy$( zI!0cqs(XJWHYJE^`y_F1yQ?YT#3WIkqQ)l>`5BcBa#qo$bo#HZQ?r7ZVw2S;deoWn zimQV@k2+hfmseSXKBc$SVNxY|+0}I^So2&Bo}JVtFKBUH?eko(>+%hkKF)uAtDz}E zD_x?`!+vkfN|&0Rb9%eV~Ub(}Ol$3qg+* zX5oUbW(8sVQ|W%9rq{48#Yvo2L${%^I#fP-x2N#jfSMW1TwN_TdZv$^Xy_o`uoce5 z@{4`S5|prrAE8vVIP?<4`bj=$Mj?ky?XOz1Rv17#9s6)2)Y%6y(W;J6W2xBS|S~F?EZoy*K@^2|EallN-;I6Z$hp zpN+oK^|O2UNlMVB(cI{(=h&vk6`6rk>k%d9buh z&@~@aJ0Tts9UE~zfuDSGmB`d}wK?C3l`nX2s9p^{>d<%0#iQ~_IqZJ}`wS)CUZ*2o zuiI0?dqK;qoafh>t1+#!BnLe$tYkb$HnuT=wY{T3z=;Rygzzj#- z24^CTXM||iQ>h8+D0O1wwjaTs-*9fQ4cxHNLGSt+Vq??SAo{T9)8OiJu2!34BQsJS ztW7-X_N1R1AeGHnc~Kq85_L!KHATFd-@ERx1-2&thA}_anL3*=KAH6VSDp5W@u?GS`>+Y-5pgU ztGmb$J+WK0CDszLTPfm4xLsnSQc%jNOQN-@ygGU7bhT!oOu60H=xU?83~H`g94uE% z{0Nu7_nPWBmtP`}auR+uR85J@8dps@opR(*e~WGE7UvD>Pn_>+B~DWtuyaT2g1$AV zump3hsKrs`Qm>g5iZ1hMyBlgwu(*IRq?HAA=R}Tn5!GuZ9it5SW>u#|v4)_l0BAFl znuatt&@}z=Mi~g97BbQ;p?x>#GhtFL*23VsB%VFndanC}Y>o#+rFVcD1tze=euOIGYHNur|LhE#K7^lqH#ERl2M zj(HyJfZ}@nh^b2d(dx% z{F}Ir+7d$8+J@aS&2Md^YZ)c=Bc|;pH9tBHJ6~AA_ro&M#<6tG|Ubbi%ktpwx;gJHf?pci`fv?7ed2*g# z>`Cpl^`<)nPhQVJ%Qd~3MVufXVmj;8G*}ZQjU=0R?1}E>bJsrE7+H@%h;!ao!M)euqwx2o#Ux-KpR9(7cy<@eOk}E3%fBov!~${ z*hz0k2;Pm}zOAZhpPcOtmba}BX{n+|MMuO{%=E37>^=wG`{E|X`ZGR=}u!3ID-$46wAN^SY1_*RP!6wMITf1cdWAo6?bnUR;6xdqIOyq#C~zT zE!fH`j;GTjWUIELlIq@d3G;ZKfU}AB{Hje&j@&sd&tt>-bA&oMLcYF$u2t{%hnZcP z^+4~?sD7nAI5PCw0Y>qbC5u(4TQJvkNT_?QtzIEz_C8N5Y*c+Vw1pz)wz^Sks$MHi ze}TLe=z#RxQE#iKW8^31P{;b=X~5~=+%V;kC2IbH1kZfrd9YeQUW-%^CLIN8ZrgIY zD-jj77FeQnC=d0YXrebtPQ{7!T5E()Yt3LAu0z|?qyoZV{-?EJ-v#AyV*PnwNBtoV z_hcr<>JjVBq&ij2^kj_@ZM4sra~)%FQj^EW)3%zlS=NyZDxg=Vn9r_#m~5Mh9pi)Q zGwK56@pM)R2SPBZj(9eBq0`ink<_m*ppvY* zFf^qk9b8rFnTs1HSYxTq$jkrY&h~o_B_8nXB1{3NUK?G867zWL!`CT!W~*vOstGhz zXmLrYfRm`9d{Pggg66D<3lsHdum?`liCPj~_&Y|^g+~RqbFrFWTiB@}@ zDxr38%uYtD!$tk@jWF^gY4v1jp}acEsN>%ckrRt2FYenkcau6AD|v@%9w{4fBeMOO z*S(IBR+4!uZe^htX6ph5^r&=gvNigqOfFpHoxFJ7kzImrom2g|>wWNNRdA$4j$;pK z8$BHukz-Yg=cTC}X2?px`vhiTN$GpuCqT6x?26oR2`x+2_^QOW`{*Q@PkHa(B%g`2}rjU}|o3zLu%2ks{5aZlU9= z{ID$1RrrLg$YrVTd8KB^ggB*$$~rUo)#e=knO_$Y&y)=oPl0ydDzoh(&Z^(b@fV5x zv!&+kICrCYuwUPN7wK4Dz(i+IdLBzWl%R#&tQ7U4f1dR{W3eC8&X58VtPWfMrky5b zglbjuremj)?rK*{*zKdO7E}jDu!N2vR%}I}SCQG~xh4^%_9i}@sbsyC_A5VZ<8^~z5BrZ=U3cXS0`;4nVil zw3&@0$9rae624D!(V6FOtni*mP9w{_XZB7c3%p9|yfm|X=FW*^Q7KMJ@;BqQVNsfz zzs+AgLQR%3TS;{ic9>G=8K#;k6@aF3G#pelNhx=cGrU#f(PfF09#BBh{w zVMtfdQJZ5`XF-Dn)>-aP_e@H(tNF@^qluc;GZ7Le0r9f}~;dmwMNo#*a0i#m^T+0jom%R5Z*Xp}&j5hAd zFZYuLe;VQy(A?0&CtQ@~s<7zeTr)nMXgoF#{?+~Wfa{^t={$(6E<$Q&VuQy0 zQuCdpI$0I4#qmGg#*_{Dph+(p z+^tz5v35|sZ;Wgfm6HE#jAG>ur*Oy87+pc_Th2qbLVmgRwztBDNjaqVsTrpZLp--2 z4xxEceiM~kHYw$9(g7){jo-vA%c<3d@uO>_Nt%Q!Xum!NyWC81y zZM>4&k{k~Cu8QX9(n)nT+!8F#3U3Q{{9S8Nfi8Vp<&Ej*e*|i3ob{qc%|!vT|4jAi zfn5nPTLrg0?ORFYxyNuq47+;ju8V4w-K)kcJvcx69oAKaPo(>9e6O^9y|Ny5{ZCrLMFfl2*wsp0&We%vdsV02vD!V)`S`@m(UMU>xWV_FAX+?(?PTrCiKDj)mjJ}6sxMB-agv8 zP?_p$tC#W@kHLy^hEg;kGrCmrZt5c|)&zCBsu(00bj8VD-e>kB1^vi#J$-P z5mH906ZG{x`12u=+`q-Qj`sCa`#m%+S?K31y?@aBDMh@Lzo~Cc9c}Twk}~38h9_@Z z8stSXS*6>D(KX79f-&@b*G_OUF=B6K*pJ=iK=AfAxKY96g+)zlQHTk z81+&m1*4wsnx;(0s5^0j#(`RHjapKhvoqADkX6WWjn9XDw-m8SyU|sr&UDoaI6K4s zhdZiswM#ASbr!N~d>9j1Z+(pGW1L!@l#O#KW9_QxOv&v`qWjGB9hqKG=Cej+BW}(- zc*U$xVXH?DJOhsW^w|NKF)q3sZM;%PYjdWb2ahex$=hX#$qUE`2D=dTVvkZD9O}%={m3wpihuM8ztgFT-g|C?~M@EKjm54p3 z&(-RU)ru9m(&|>6ubHR?v(c~EU;*%Nm=+|!`gFWu5*x9uZloFsvnL-mf8knFfAG!m z3SUd(8g|@f(^>(EagCCFbVPSubjcf=AIH9m7^G`)C3`|9Ex80GGei-t%2Y-|Cdk#} zhbRjf7E-v(8LFJ+4Q48t*)x=amRY@-Bl!6NoWRq&F~%62ScCmw%x%=X($#jw%=8rAzw_|7SNTapeWDb>M|NKJP@PPVv}!l1T#(IjG;YcpN{ zLsng|z#>YIhostTAwDfM6pM3MAT@l;7uYDRdy^vVKX9w=9DntC>>mWRTN2uA(r$az ztGFMeg^ix++$an3BCnc{9m6EptcATvzBTA0j}hV(*kEe9hfT%14caY&Yp^q`oeqQI z?&uQGY8EVTI~gY>rRe(%)AX{cO$rZ5N~*6_3enRL)oFM^4LS{X8u%dIy+BW4!9;ni zQnIj;C^~43)~dM45!N)1uH*C-6Kwm@GlS?$yc#F^!B^h?6>VC-`vo=4r|piMA_nzb zTiu|wapsIY+N%11wj0z#cQMplcO~AjN>++-4-?wS&^hK40o-f+?0n{7U9A zGkE<#P9DPS?Te}HrlcG*E7{2H8K`c?xC+ zDr!%|MwpO^af*X}$Vf6lri_uMEgn-KR16PGlBU^n&hyLs9X35(v=VEv5Y9rb#h8vh z&q~v}0_WLn*df-#y8;NeO0xeibPZI%Z1WdcXbfxNR1i6?3nc zqu52$cZP8$hPysx$)SKqZ`U{>Yx5y%okOw~Gci*sgs$~hj~A;w`PhLDVqfYTbiOpK z)@G~RU+1eA*HG?6*eY!fQC`8ja>fW7JA_zw8}(ria%i?B7^$vEZ`A43>SWAV$>0{> zC+gp^W(Vr~Vzq1gjce8U>U1R&dpcqKVpr#3v(j9Kv!Ek*HHP@f>JN=-?yCqpNWX7vCE$FB~vxTs%B?WWyCtUynVd5Zbz7bP6w5qZc+v3PT~oXXBS8>_>9cF%7I26n~od0}7xH5oYt+_;d2 z=W|JJf3ju)z`p3f`TlWT7x{Ww+zcH|S#@?{Sf}<-7~Yo{%vsI9=%r-~#K!M&O~~6b zaY7!>^So+JcW3ufPs;PMnuqu20*9x=b!VSdM`osY@(TU^wI1yFV>XRCCBPDfO|k0g zK1j+iOC=?}(@N!e2i~=VWW(u;rZxZ6*oL}{|dc~i$o9I zF$XJt}^60W0 ze}}h~wC3*HE>u?ZRFA9Zaq!!E4i}&2g&rwjm+`}U0jo&XY2Pc80|K#%=FaMDPm%0T z@JY_`1D+h$1gq~5XQZcTSmZ!H0r!Du&Qr{=IOHEHQ^?S73(~VKbken|L zJe+S0((@`pK6( zxw}~Xj?FIcupMt@bGXS&Z*frh4T&`Zx3H44OG{wWRVU%DvZ)qtDnvsCOe?}F{MF_+ z@x07m&0%fsAG|BRiuNz@2HHPbZk2ZLJRyXAL7E4=tlva;t%_R>`;4xMw6`%N8T|mg zq9)ykzUPOhe`5N^CCU$+-2JUV+@^}X z`J?=lo>ag63T|QX%ENJ(YmT4O8I|NShdUt4PuxkVmJsqZJBZqdRe*M;){&sDqqm@G zETsmG70%}8da4qVJ^l-}Ma|JW^D_i;|8&i+au1#ebG@ct`+JKztc#{cE6PpkHJA_S z`%LG#Y?JwHhxDvz0rw*spMd!CT26~kI>fxmN8ee%pwzAVaQ`w|c?$naEBXfB#^4r^ zTGF4HE$<}zCl|5%CVNV8!=^A;Ab9uJ9L7DzBOlS;crw2?!;{y3IaqKkba;Q>c4Y^fA)v9pVjJC$Nag1meVoYe6~7s*|fu^iq12qE6RxXV1-FrL+e5tLIsI>X*o!n zPD`7qmuAK@gVKt=s+aW^QKr5|P}TyJHSfGd9R8Pkzrw8xfXH(556$e$@y1jI5}kWtEW!rF3I}dX2`cSP3&JQNX#>KZr2!ksGA*^Ih;QObkGtfgvHc{=7FdfH|aJIZr z#;+WBv%P9j}cV6$(EL;OKzq$mdlZ+kgiJQYjq!1fvvi)UT+)uCG8bT;8DWGJ83I%o+BlB zy;^z0!?D^$i=MhNy<|WBRVnF}uNa|mu~Iy_=LR-<=?dOxA<93*4bnsFqbJ)=O1#P% z$a;-V|AV=A0gtM>_lDP=`y`XhE92HI#3JqK$PJ%=g+$LOh=@AqGO z&m>&z;k@tjz0b$K2n41%pl5M|#{&Z)y>@{0@Es#yn zo39a)^R~6UW}=UZ%&|WEnHjc4US{c@pXjK9wV(+--PT~aKe1>32Fk)Oal46HGSMGKA)j9Gb8w~1J_JDaXMbx9Z`*H z?H#w^gn!Av!~ucrG0Vd^}&y?S30OMXp=$fK-T0Sy&&!S?g0z1hI~L`q+9MaqbHT>qReZo?qVmt z5`nFK*`Qa>9NJ4-B(iRmJrbyjnKz7u`cVwZ=5F<}%=f|jxE&`4^C&uo#K_V!Co;J| z?P%>eJ$OH!dZ3+l;QdZ1!AY}M;ncey^lO<;hx2D+*&R<=*n{EZP-L}I5)^(u8QDNQ zKo#4DRhD{I<9Ad^^!(GC8ZD|CMbl@~d48O^UWpB&f6=@|SZdSvfZ;>10BfI28j75R zMCy=nhO6p14#>HO?&VlO>@2iEe#%Uw!|b!2#3>-UY!)iLN8mX&o@3W?vaQi}bi0o0 zcfF@RU+RX?P_<4%nabpJfxaha)z^MTra9)G^ z*%dPnMR6$S-?o&KXJ{^XJJI9eDI~W{EKswEj}zGVy_TSQwc`D?!7`xUDf*eG*Dm`U zkRbs2f=gm8ItN8*E<=PcS%lI6%ZVVQfbL>*2LDa9^LL>*fxinryZQ|!WsgC9M0^y| z$lhNY)MPPb+6YNqGW!g64F3;FE7(Si{4n|>Aqo=ZWwOsA!y=pW8Ujb47fQq&;?j)I;vmIkXAQ^;uP9@MUqjUZj z3(cP}3HFR2!wt&*9QLQ{JU$`=s)~af~UNoy*a9d>ieSOE( zc}n3PTIYsI&+vTJ0(t=RCmJ6Xj?N)VN_tcM{gA9r8joTw^%SX}?ek1lY_d#BM@<$6 zO@bkp?YexnE=6rs>qYj1x!W@X@Ya3JVa*|LU9$X0W%E*7ix82@Myo8cL-y=!6Q$Q2 za?;LBIqTJUZ)?OZyI+l$3wt7wW;wFcE6>?kj+M7rUX8zK3A97ILiVMyNOSV~NGNf$ zoP%1$RO`mg^dSA4s-usPp zpzqySdx&EtGOPjYq;Bs+SN*g@Ov{K~puf=OvDnb7v zVMjwAq2Y)zR%C=7ifblS^j$xl*t8!JyPy|{3>Joq_8^u_w9c$t-}Dyp+CrPNYQw*` zc#Hw>Wd5UpM^0)!VnX{F=eMBc0}pu-u=N>-8^45Bw+O)OB7YYmWF+)sVRTV@5`eyP1x?+2CVN(NmS zBC1sM{ED}LSV5^8ToLO75(=_X%!3qaJiIj6m)UL@ZF-3v!6~~-AGhLrADX`_^;M(z zK8-sgP#GorU8H}+XAeGR*=OQJuk1{$*7--5DyZc+tMyhm<(mBHmE-W7b$-^F)pmpI zIctj09R{7a9 z#oePclm5kU5$xfzZ<{`Cl(WonszEe8Hx1dD!AvwUFGKqQ`*lA2V)k-+g5BCF58J`FE*@qBN8!#bKX8)`s(S3Og#g2cy3vLp-X< zCaVkJLm($Vm;$dR$QYHZ?<49Ol_QyUxV+k05I*$W(8`|I6mN*+KesAvs|B@`qKiOs zBq~xNEWmaD)U><^_P8F`NOTQ3i2gZZok@9-r|hvPt*C`IxaFk>wbBaK%U14eu+Yo=zH*Gw@gcfQGM!usI$ncO~}i(M4^_B}jh)bK4Hzh&1~1;Im3=!i^t zh})qQt`_iHph$0;WNvZam)lkeej73y#q&GUOe_1e{u*XV29h4F1lLV7CCx5rOQ5mR z_jVz=W_l}R$=DeM14F+%R9fAsnB1lgmd7YIoMOs1l``n3E8}PeZ`b|J5s^qKAqm^? zwTO=97u^dG;Y>vIR8g>g)#+*5F>Bx^OjHl?!W@r9Va$%hCz|3L6f-B`zkgyJ z|1}&jeNCzPvr5&s1M6M1tyn41cLuAd;7$cL_9q&SHp6E|NL~;6Yz)1FZX2-|;msuZ zapsmCu_%SvR*GN1_2B}KwREu&A##8y{WdlR`oh=uL;JQhd=|d%3;1_LY10B{b-M|3 z;r{x1+FWS;SKJNeWW?Khk=J)t|NG?%tl39z_*=k?w0qjw3u#+WU0q|uig`#W$~Nu( znAVGu{Wf&O#~!yaHTjwEcBYiNmHAtllKMvzY>bfmrs+h8qEwkXf?T%><#O&$$a%qoeDRxI=Fkr{ZwFAoy z;8f0GW9{_+@o0HqjyZ}u-<0QvWmMp8lUgj6K$lqbpsiQ11W(_fChMubzaaWjE;Lnx z9@q>0DIT`NeF@#@)gNcAerUzeYpSXEW~YC_(`l_2rK-t~W=;Wfgn-R47pd5tSfQ{Z zU!RNCW{*+RRnZt}#+C;Ad^Bsaw~J=vnzo7&?5Z-fGP{nb%?rL19U*Z7+Kj{}UD}M$ z*Dz;Z#fQG(gq~uW9o@NK`hsiHXiOJ==|R_}eF;{PX``ln+#U@ufJK4w&DBEb0HoIz z9^DeNm?Bu7R04lA!R{YcIe#?mGRNq&Q)GVu|H}JRcvOcG;z)UFGD#T@XAF&<+zdTJ zE-)(B4z?Rb*J1ty8v|3WGZs=>rrR~NViXnOtf4XORDhozX&u*NKJ2HL9oj6i#}KCsQp?nE3B5&} z(YI*-^u6dISuNyiH-&47)3ZhbH{jgm=QVmMfgbr<`PsJHNs=Z?r}~L%(YWJhZlD^7 zlt6rt1bTQD9ff&#fao7l@)CFJ>E>K2c%!IfZAkR~OGY=RfiBZHScw@Dt3k2M^vF!@ z8!X_1c{vj=*L@q8=^=t<)q2G1`!Thy^~bV;%14Zlsl|FD`o1D880(G4MCEnqUJvzw zc<9+Zh@Mq|03aKE1NAHsFBg5+a-(v5#5DR5QA47uOBl`mdk;8nzvw|4QGh+$S`vHA z`k%-iKuk<38PQ65@Xkv`OVF>#;+{IU6y7gV>Vc=vErs_BO6jy;tLmp%G(!VQdbSxf zylM1-1FRQzg(g_K(EqR@O|K;TM*b|iHo0ld&%B$m&V8SA-uu4u-j!^v{Gm-E+muZ! zlC0CX%?FR|aKW7E^M#rACl+AN3NRD=@9X9aYZmJQrDA_yH*Z>-(e~&UZC-TlE^Jfr zJq2#p2|RiRJA4=`I8lQIBrr<0(Tdf0hmx8Cx}V;&@Gg44D=4W&dP;>}qE>%z(BIqj z_fEVY0sVU;G|*Tr)M}~`d7}3UoPubVr(_`o-^oU+{JlbdN2~n3fokYIQ?k)EPwhmi z4u8+CkKi#2ys`Ug$j#@;t0KS`mSv-d7738Oq>kpk!$e8`ElF=Cf^tfH6>vJJw*6Qb>84(jo=z}%>FY=Y--wE)m5B>r+ z<)g=5;ZlCk1Rm})TBanuNpUPi9>v%+N>PkK>)!ta#orZOtyj|eAqq5_aw?xv5OIu+ z9$f^y`g|H$%ps;SqLFDZ0(_t`{veZV*(mPB(|)WyH^+u4$z@utuFGS!($M=tyR$KL zY|_DG)A0l``CS1zxbOYFryXZ1a*IAsK~EMZ&o6@@S`S_G}&R{b01DZNMwy-*3aRwB&SI>*(})=eB(rY@n!Z( zCHp_(^TQZh{Bk^-9nDWEfdt16q@+1^<9VLrU|1~rIiwaJB0tAr4~D(`JyZ6$n7u{u zUG0!P5`QYjlZQWj15bYbRE4J+{-?L$NfJ)J-p??K)@CV7tkIrC>3cD&7?P%n zp4<7^L$ZWzL6QTrb+XYhhvao6BP2cO9`NUAk@m1-=F3`~bWuW|F5VNIakN9#LPQ$$ zZU+})4FwWFNkH;enM*7840ga#jz4Shgs87b10}-3{Asl58=SY);@^QHu!#EVEE3+o zjci$2_A)uEjQ>xe5V4cWcGI=E~c`jjH#ug@BfzDUSvRyF`2bVw6}GHcsr4)NVJ_Pzuv;C zCmBw@Eg^WY@)lO11s}Db+?8*FP0XTbv^bn0X9&k`(s?B|M|3+FMR{z}Qv6KRBCVN# zqrkbjQz@c0@no4}h!5)xo&IjDY%9ucL{zquD62=KL;Ig379gG^w=aW*5F551a0lR( zUx)S@aoHiQd%A-H@)0NC-KGxqzeE^a>3v&}%YMw{?o-pC>Ha3aQZ}4rfX(8*tL2+| zq$&wgyRl-6J*+%rWzWK@R(a0K?Op8Q48QuT$vr+xFN6Jq(H<@hVt)hE!?xU#8=NS2 zHbvgsV?b@=HmR094VkEw_5Gn%K#B<#U#@nhLpA5UAJ=}SS`pKLM;1XJuZJDNRz$Wq zV)X~=5R;~gcv-~tdkHaEBPy(4Zw4O~wM#u>?SfUY?44(M%8tl?Rmt^Y5HwUMwTx|W zoCLQPDGfd=!HfJVR@ULKg0HeA*sqf2u5L^%$q8nR^;gLC^GZ_;>Xj@+(&hdJwsOQD z|B6~7!bT*+Kj`frOWYi(N4d6nrBAa-A@x94PfjE8REHdJQ`o^h5YO?j`8Dr7^vqt+H*mq3ASHJ&~SW38jd)>v?j0NEO@aR zc7zQy;TgKJ=OHJqWr-5BBwx`v8`pGV!&&3gkUEO4v8}KjD2orr@|KA{;}^hcNzlcG zqi4A4S8sx3QHyb8B%4FB2iqRx5?Mq7rxhos$CE(er1P*pkmk_@Q4*Z zwf9x^;!NBJ`5mH`x<1=MyCfA{MM@c$ae7CA!?nGm&D{H-+S+k8U9`qZqMx)HDZoW~ z8R@6HksfVzAyG#tBeB0ws@CdS2^c6=zUkns@>j>opP4C7){>)l9m3uk_>?8RADWly z@yIDGj_iO$4=5R|R%ZdyeI9TDNwB?zemH9lwqd$Om?8JLX#5{E`<@8@mKZcH z5krV{dI*xGnY5R+wDAwkYaP{MaQaMVE=BjpIUzkCg)pU-00()h%VGbQ+IoSh<#(CeT zEClQVeyyHA4d*YRS@jLvDc6o&C&Q|VFgTx&%VgzYldKq^}T=YB5?MBi}S$Hfsz^p=E{XBMhw12<;n*L#qjknp4eNHx< zEt*{ge0Sum2XB&-Pkn_*Ibk{Z_;gXc8WHdN;iqD!2{EtbHq~}NZ zGv!96i)^B?%?>|ur1v1*!D}6!-eVDs_u2bU=K1L}X3D)M*5OnxgfkQnAsN-qa4DFvQlCwt`KPeiA>;c?_^Gkal&M~C6AnG=D z{s4zH)+__JAYlDTvb$h4!5llv?PRQ2l!o{UcK#Gph_>H)oC{(;Oade#ZEC|%gj-&B zcA@o3HohTtmcoc4vHDP}$QJxh;wIE|SbvvRLN12&5j}5t8SEwvZ%Oy}Xf^i5YN(4G z-y?g3Wj`b=iZlI59^ndcn)H5vj{!a4CT`;(xQ#VL)xg5+Wl625HOSddz%seZX%2}s z*6Ge1*m?NoA&!Z}H2OU3nsjaYC`Qkcjc%I8x5(~iK{ti7ovT@{3u_ z(D#vk#+)KqttC=_t=CPKona5`8H9EN(!d9FAkB?5YcS0LSvX3;jvW*gF9oiu7xX5TgVl^_+PKRYJKNDR ztc74ZcNi9u;aXUqrqVOYNnXy4B>t3i5U_#%0=Ly@DK?(s>HC78J1)@k{{M|W==Sya zl5v{+zYOdP;%qpdg$cG);M%FBn`_81{{rKSMQI20u5L! zT_>QCLXL~eD7l?wnhRf;u^$DzY4*q(KwuFb)8N8f8h6+zd*I1MtHyTjs$u%7;d%%o z>{GW|z6WcJHSI=qk!*aTYV?LT!6{IT8E!KfR2R=mB^y?k1ilgsnB{D8vLN12o7p%L)T72^@&9YPbW-RX3 z7qE#d2j^BBz6l(VFh$aS&>h=cr@KX$(K$XSy3EegE4#~J!P9=?c;Jc&NC)2AG7==M zz!?MSCti-`xhU^x@^J+(RU}LtS4&~XRKZr3qE*m6K8GuEr(9$;M%J)j$goDkeu)rA z%XX5-HD)UPO{|PW7td=oL^!^9NVSk21F^I8T*S&Eyl~+j#{S%T?aaQ-*7q&n!; z>-+i8UTvRm3t^xCOxwMrN!ND!PGAJu;hKDaJWs;j>a09SD4+O3KmkEfVs= zeX~qwi`A0MJai1y-}gHp?Zh>Bx4BJ6t4-l z5BdK@H^L!WA9&)hF;6H?Z8Q`oKWi*@oiGi9hQEUIW_t`)=dkra!mxR}W7xPfz8LZl zEoX@zl(PP8jVm_h`k^TVZ$fi)vG&BTZBNV5+S8uTZ;!{5b2o*nf^-MTNQBM}*%kQ` zQr1;CE&Sb*Yy@>E+}AYeJ8F|xgGv}6DIREqsYug;mZ>0l8^DJl8mpG#8fO5TJ|ULj zhR?N1MR2+?a~LvM_yc-JfiI6R?fFF(vA+_Ou7RzWYm*~JWx$X6y)CMMm{SH-KZ8hy zgk9qeXOb@!EC6DDs<&S0ZI+{E$hrYqrymfdH9G0jY#lsk4Y(h) z4kG+3#UBb8e#il`t--!3>|OoN2)Zpo^kcP_f%k2NtZZFkYqx=9aq)=9F+Fw8+sBEm zxk07)&qA-s8VqFql~!72>Y>d$X5P@|zb3YFTZ5cG(_MHtJ^0x$AAGeR8Y@spYu6(7 zBdb=4k4N0W{j_&RPrZR%Qxr*TT_RBLAPr7G%$A_!tLdZH;B@qZracJxDRVmhT}ugy zo~QH_#hhi}r6QnZV`)WNTC3<8ilx1qz{@=kD8B=eCFO zz7;L!P({6*8T#9E%b|bAqUGZ7HO*In^t|+>^$(VpQM(&%3-td3*sMs4LS{_w{T*5g z;IdCoQOxgZFa=y*iKU&<(lG8r(Q*G@hRgBjcmE5xOh(IH8eD|`-94kvr61>%{zZK* zv4$>~%g9CM5^M63<`Q!r8~a~d9zO##Ev)}VSHUtd z3G%k^_!gXA2RaMo@}XOCf-mE8BWQ3x;5WcP-lL7NNA!4jo}*{{$D+qL-B|%z$s?Bx zB@I?Y^PIEl1!DD<&D3*EL(BTbbZ42I=cuW}javm9skT;PcI{jA+T2dwGx`~@71wcq z_R{q7uA(GJ#U#XQ1r^{rq$x-Z=`M*}P`EZO3)Ju(`o}dJz_|<-F)=H16NCJ^ z1}(0JMjKaLCvMWe;wsvj2&*a+i`K8;XQv%pvX}`gXs^QsnP8MFEa2}Fs79hF*Twgc z$0Y0qHi4re>{|oxL;v55RUg^cj`siVNGbLNq>2BB z@YBYGxl9{<>y4RvYyJ}!;N@z=^Pnhkb`O$tg=~rfu9)nE%X8HQhhR@P=dqZC#Yd%% zB_}Yo@hnG;aQaW+Pn#an;)!1*FaLW%x>%jjpyERwq0_|of^-9MBRNM8qCb2m+z$G?| zaa-NyLx=+Ae>~b(ku8eRE0i<9-$+g*O2fMB^wHZvo#=8X(e;jr?#a<)Q5Hx`A!9fs zw!X7Z+z1-{gC!QOLBw5^`w-VNwM=%_2=e^nY<7Pgt#W(MV;#qp4Q}S%i`MVLf zLs|F_h(M$^b~cQRiJmIH*GLzZa1xx`GS&h+ci<*jlcQB5Dy$Zt26xrXrsuiLI#tP1 z9ajIbqw&z}^w{JE$UbM}#eT?(;o;rsBd#}2(-ugO7i*da|MaO&ANYnu%$w&GO^V`T zuL951LUWKcOQP$aPS)Dduz+1}2{Kl_B>~?Mi+9nzss7gviDifh7d&J<;}B~H{tsHx zWx>I>jkSyW3uzW{F9DXZ6^H9!Iq*7`v188ve_2z;73f z%!QGGxB4}Wtaiu->1b^`rc z7!>CDTppFA;@}iCsdye@B#8dCYemSKmeL(s{>Qm|yb(6SqW_RK)3YV-r@;B~eGr39 zvH_7=#p0X!2(n4OTl-vW1dt1iiEb-ni=#Wo`AT%xI3dC1_CKCkV{u_c@p+|tuV#(H zg|$RHD6J(UR?lTKu;4chO6T{7uaz3CmDN}){zJwi@uKlZ_C9f@9?ogBNniQvb>A|k zK66pEZ*5lN_iVf1fIg{Oa>4t_c6*m%0$1TV&g8>=@uT2|q0!^ZC0$sz))!sg_W%wX6mHG(&%@ICF3(8T8KCqx;^}sUFob`ixJ&|Nn&l&7;yk!+zqhm7gn7%H}-( zIh6YJ4^isnd~OhD?`qlzMGe4-Sk6bg3H+{D9DizuG` z_3=aDT09>LH$c;=<(&+-R|S<$BirAk^crD3p$r*96Ey>?8hy1)oz}cQ)O} zB|G8ktv`(!wWo#%GbO-bC!F8eZB`lAcmC0ncojzs6wSm7=RsrM+*5@BIGTw5Tmph!OG*j1{p=IN{RW4}p^W~`KSOS-MaNQ?qE8enVGL_oQKMv8zmzjp8I+V0e~}lv80>}S zKgsC+4A{ruE}MYKGN%6e$S3jw4=XJr3nUfsGPXs;PCHr1ZHdIGkDd8azAa+QjnIt9 zi_rc;wBPJVRZ_CQ(&9*@8PqP)C1|p|Z3B5*`%V(HCooeqj+wc|zS1CaZfYxUm-_v* zQf2xQbUW8CU=7m~U&Dw_`WL)$tpe6DJ@IucUyE6RU0@kgpA7#b1CW>;Ja+iQ=~#;P97L#^^`f95fSoc`7s% zJOqCg(G$)g?Ts>63twSSv%1$Kd=B=6_eAvoj+WATU_4D0+|q&PZ2frz&kOYDDLgOJ zpGzCW8c3^&9|&}SS9~#A9+*?p-r);J!bk8uO%mRss$n%3>x;p=(Qa0+8~vA;*{J_8 zdUW4X@-}sD((D@{H$UNDY11KrY8mgTs(F;b>B=7j^+wZW+ddS`goa5!-4M7Yt{d`e)VveJub+lX}JoO#y8j3;lhvxOJ zmal~);0Gz0pERL>V;bOSQWr<}ZfwW8uw%iEI%OSth~Y+B<4Ac&aD>B+pf_eD=q-ss z&%!dYNxz5wdQ_x0kD)e?0L87CPWnpOQHuhD2PorGzYO<3g<1A)Bk!YxfErx zCD!5B^iz{nn}AJ+c#ky8dKG6gzMmv8-Ll^Qu$$~(@2DY7vWm!yS}xgQlI8u1LbcEw zx^W|{E5|e&SJ)r_hgwD)3%Cl+`n;tv)CaxbR^1joxjbrlnOI$9P$XE=dj+(tX*5yR zq|jA40= zx4iiGzE<6E12W>@6d3Yh11)J)slBOi?S(syn2Y}tCHf$Rk8N&$C19&8) zCE@PUDzah%eXA6cUxFYshKJ)6Gum_QzaHz3{B(23t0AiUEy$u(dWS=mxb7D+!p&OB zAvO1D_+P*;2=+^A)c?YBk2bDq8n2^CF2uNSLsfo}H(SoSk)oM%J221+$q9u!Kr? z&6K``w)F)UCA58Xrt~GWJvmeQ652jHQ~DCxHs!`f zc?oT&&Xm4{wzFqSUqaiynbMcgHoPvP(D^Uh-T~}J7^L}4;FXH2?1P?bns*d>Gk5dv z0522`dG0{!`sUqO(+6jN9jU);K8Q8_p|(m7VwE;4rnv&Gdn5c_k_6QDU-jF;l51{P zQs)ZZOnATZT)o{Z2MgCD$1QlXm2kd5_(tCWacKK?#g{L5*TUBwCq8xo+WF{q#Z(q+ zf3ep7t7spdY-POt<+Izr3hg6jId31a3TE1mNBeh>Zw0k~tJXf+`RESC)EsL+#M@Wu zQw)P8iZ>lm=9~F9HqQEnl3ZjMEL6NDh8=uvFq27`Nk7HXp!Ay!=g+2MXg3VP%jzz) zw~_bk?pZxk481&emqGE}&3m_%_fDzb!+Y^-gJOCl*25io50CJ?-=oDxcn=>xr-x^F zPd+s$VZer;7mA5sL%mEfQZLhuI())_k9Hma?uwzvNIfkg+pYnl%hc{4xc>H3b#$Bts{wUvT}}o}sZB{aW^g*30nZuGz))RhPqh*_TbawVSfQ zvEoj4^0eUIuf(ZDb!L-xOWBOZ3_dpBA}ScVwp#KEAB(l6YvR)A-uqHNZjHzmCCP~B zGHi6oZ`io~#MS_h6+6Xkj%vR+vGv%#E7F&Odm&N!`I&QTk)9EB$6~}4#}lGVe1lpVKPbAPpOo?J z5finxEM~5|3#$2`M6M?N!1$}NQZ)r!&VYF3?`m=a(eL3rshH_&bi%?wd|hiL+7C#u zX7|g}`p9rz_>qMPz$42ol=axooKE7yc$N$@PE(%kJ*y+SAbn+rD1%mx2Vr<^G z=L0basD&{9SSRp>*euonqN@SXWr+c*am)mPC9RQb5A9T;S0%WURu&M)-P{c85Rk^& zx)9Rl{TINvL6iVv==U(g9>BN|FqXjI>nVUSS|b>AS7>vBd9s}|8y>*;oLXAHsSZ5> z#sobNU|a|o7Z4-?V-5`+#<09~R`ZqM0gR)iqA->KW3mVj#9-_Nj9byl>wg_efU#E3 z0~n)+yw0~{qxhF|Mj@TQLIC6cW*xp4&)>IE7%zbQl2h;`qXdlgovG~yTKD>{MFa)) zT6j1BuFLv0efhotzR#`;FWF_9B@_A!$5(?ozAEanl!j!)T)V*E0xLo6;~48Q!dR(< zu`+Ws%z>{=+H?J*S6l@zR&BiiL;WrF3K;4p!cfo0>dwMYgx}5|sfMAlAxQ;y8e$wn zrMk71%2#PF_<#PT=vXg~p>zop{0IJCbmR7cb8*&TtWCmE=i{z1;I6$$e;&B&h4XRO z3XZ!pTyrT{>s5}msJsRrTAzg3ImRL^B|Wg1{7lvB2yz$0SR}9DYu)p}bz&h(UWIiZ zThVUbKkq}{Yh^kbdFo)fsNM#E+B?&Rm4=*q=P)K*9?Y(-;d)-9rkYGWn9E@c)@ zJ8vZbx1GNR&cSV11L%Q!m8Khq?vf#_<9 zt^p6$0G%nA5&h(num;Fq<`PaXtO2dAgf$SYbIGR{*1&(W&VO}!bp*M$H%>3CfeSDj z)<7Y4Cg0DRug?sw%Lr+>ZqfHOT=$rU>#hZ^GwZmn71}XqjuptVaqAZD)j7wax~yG* z{1n#Ju&7?XJrlAg&mer19&CE$6-%TsSe%#}*$#_}C6Q;z&jt5oy|)Gaj-SEPaVO$F znC035&@{S_SG8QZ6Sn}X#iN^x1=cPX&%0L5B8fBEzUq75AjMqjo4f(r$?)JYX3c`Mu)aYgF8?8SC12th18M zhlgzh4Wo%Nak{oRPREx49WNF8(z;`>8oE1UVhZdD7Ie3OD;%!=9--m8vr2C-MBpkzb1Zt)>y=??ry;T}st*{# zPtrG=Fly7(D)C|Xt^D|eOhK|^a^?%hj+pF!JgP!R*akri7Tg<{h)*Vo;6y4)g7gfRLhv}5WxTz4}; z<5*=Xn|OrP9|#>Ak7ox$!}CuB1I;Ib!|~gL$I27g_F!riaK_35!9KY+ZfPiR_tMa? z1(7O3d7-|d+PT|9$1-gU|C{ZsH}To}V_rMM?JCK6^~Y{Pl$b3-zT=G zHzGfgHP#Qeoyo8^9Qzg08{q#^f9y{-cA~y7z9?mB1N8&{2jf^{!!ZMHqmHOuDjZGD z%u{8h6BZ9EY^T)QZEsDD)qQ`DsJ1BGF3=UrK2Wb+22YfU@3&vBRx4dNo$grhnR?}d zWmEnlfodXU#RAk^fSUc^Pnlb{L6qQY1MQQ28CyBE6nn`S#!01gqP;toq3$x&?M+t; zl>1Qkx&^1d2q=vVRbsSJuJ!w25^snL)@J8IhVLW2c@}^z}y+}R4_t4gLO()gco8D?qq_R&3 zN7gE<$|x7#M($Nj_;ypv5j%Z(c7Ib&=_6RN3}an}v7Y&eT11)amSF_TFoGk0u3IGr zG4>F~{uX<+17CI<_rUi{pO5=hUrw;@jmX`l_^P1yNpAsd7MVfqsf2$gR@rgy=hPa^ zok8oHgudO6zTJ;`Ibw*Gv-ePo6KHV+W%p89^a*9JyC0*xAH8g3!*TG$iQm`Iv0vHn zq#+y}Ia&lg#a`n+Z|NFXH5h;?Hv!A#Hu{IH>LOs&Fy_l}MxZon*|3HEXrv2sWH^Et zQS5sicy{AE%9_K*kuk!i2SS1Px`1>?-C=2iw7xV9ZGi!JCD4Bt&Y*$`XwuQLsjkgd zU1Y5LJtQ$D0^3*Qg->E**|53prh(=K)x834ma){0_xq*0msRg!+EY_?U1*>H7~NBM zbTa*{VdOAu8Enx#IcA&+WUN;k^2Yk+^wLb)?VjR3v*f{%^eNEfx;PMU9IAMTbQ`1F&MZEt>CVAcu`4pn2-F+_NU&@HjP{-Z73ixe!+utSd!(TLobIZ(7Ez{!Q^2-&DO5wUgdW*7t6k zD#zI-0PFt_aEj|+{aRDT-ho9UnW!z4!v1%wP09JAG2_n2nvQz3jglR2qIb6b!arB) zGvlb+=-pCR2p{|ghrRSA(os>a=&6Lvfw9b%{x`q38MBx4iEF$-P3XU7VxyYXm7npt zS~9x+-&lX)29ugU@g}=N?sYM-_i}dZ?xWNCd6O`)Qw=X+2lfUmH2;+r+4x}k=+9t- zQ#*8feyw;+@BSG`EPg+HC4h-Cb!7Edqor#-Mhdxh6Hgqubwh9u&hA$nlc22G2Ail~ci z;dW(Jg`h0#6zZ~+LPUT>OiS694qDN>1#*_O{)*%^#JQ4RF|~l3elCZFT86yP4==Pa zrYs~0;Q9#Ba?ouqtbk1*{WdVs`xt3E7k2U#+%d%C2$BEPu20D7jU+zs$AgD_V34@{ zp8E@$T-6U2UgN3$cTbag-Qk7L@2vjW=+C48-7ri&gO|2{s$4BEt=Ka^qh2*4E_ob9 zsQ~30-fF;_4nJZj5~3+P4DAe(WP?(QxJkidzROtm8c4p%9Mx^r&g%E~T7*&~mBlTp z`HJ^*(=#to3cg}^d9RW)X1i}wYf%oq@)x+@5M&%+IHxc z9(2hme#D;z2jO{&TlvGMmPb1NM2oGl!&yCaC;Ts9>!?dy;D4dPG+=%?qGm1iBgTJ3 zABTnRcgeQ)z=DfgDR^HnQQVI05yTrQJOwXRxzNR)jRedGB7N`;!5M>?6R3?fvXu3u zPrx!|X%MlRgwf1Du$Q^VByN9=+Omhp!wCKxO(}+4rZ{o40BM|8En&)YjclSGRvKpT z=0EtD(aqBbg%JVkZY8yewNjR0P+fUapHIE2pqZkCjnrGiXXo_8`p~R&lqt?98O~;7 z4y=5aNQk-syDPNS^&;Z;i7wL*h%;%2-o8vw9g2%et-YYsVeUIJdiHOHBd`taM*dzF zZKcRYYbQi&$E~%i_orCBQpr3hj91YNZfAX0tCtt7;r-($2~J{fjvy}{iz^Mn$L(2y ztx{15ALi&9*h_pTZedfiZRJ&CIJiWP` zLyKy+3Q{i~la6i_)T7$Xx8Kzf;_XDE+Ew(}rXtl^3uL{DQzjIRi#NLkPig4=t<=hi zinG@4?u?L{@@&pg!^@rG!)uxNh_y_NT*Jhz*0Scia5^QbbK}E^+dn71GMrVgSV}mU zO*e~#g(HGe`i>bT%$n6ziU2G3lG?(saFZ};I{K%Kt!k<@`z$06O&so!QHfkuSB>Zm zenihJL-f3!6wt4FKEK5qvb+L{?m*G?xI{J@t;Y`^GDt2Yz7j}M0{^Q8Q3;UfhX+_0 zbP+umS0OM$DQu1Ip%}+Y4a1ORXmTOkeEXx$?6wM=+cPPD(}^1nv@eUJMSU5Z~Zfq-M*8Ri+VE-BubbXtgj=Fd;U4N3h^&dS)&z z4^5GM5kvT9$7aVbv{Z}Ka#K%R_-4eG;W5~|*TNQ#Y(N>Tu1#c%i1}rrTQUKw04qmW zZjhvmU5w7_C6coMJB{o^@6~c0O^9Xl6~#5fJ_u4IZItB^BrtCd(R07{EF~0(o@y7- zk_9asH=OG9(y2#MP04RD(H&{{pjXlRlv!7&2I_@_|RQhz@Ry-mVh(0EurNz;* z4%`)t@jE*uS_#aII0jOmxuu25jo+@6u8vo0c@E-gB9b9)L4xgC3iS-PbKx%eo*r$c zp!x6-W)LOx8(b=Ggjk|vY>gk!#$FyeLpvE%RJuoW!OArWk_tDCUGJAet-)<10&eF` zD+oK*=SoV-({YYFTGoe4(uM3q(QIVd&YL6T1#4oX@q`^rRdJ5RA1 z@e@QX_|92IwY2r6BK~t_vgnGy-^z+RD~*NF60~t`pFc6+XoI~j#nK2SZtC7Z)FmXK zzGp9g|2E4ydc#WLo;*%i{fg3-Y0(W|Veg|&&dsxAl%J}>8gTaf2Jlv#Fsv(SN36l^N3Z+X1qKIQk7$v9ukPdFX-%2~d*z#U-kEkJC#33qe$_?1KVioVUv zx*=fJPrw$OR(azs6gAys#wp>M!`H@80iv)kiP@|c!CSTBP4oDJpt{&6JWh{Gir|(X zicqfJp!l-Q@KVX3$n7oPQ7qXREepvj13j@MnDNaRSD}_o`i>>1vF3Y3crmMc#&2)F zM@|`bmco8-D_f_)`LY#J;d#!$s%?1dED;8l-$Z>#0$LxxS|AemvT_B;-(#Sf#Q9^$f>C~ z2dv4_$3QOn@4yT}Mv>K4H8Xdhaudea(iwUm8~yDsVJ)l_g08+1bkP!gvon{iOjJtn z71}2@?58VK+}vTZP%ja;1|DPC38D{?K_M@03S7dW~;5T{f5MzH2REE3nIAy zr)`tA`9=Q+cG3f>K45}VmWWcd9dQ*+urT!?8mZ`$*m%p(y>bf1nYAJtG^amIs{}gG zS^Zl}w?IHH?uS+A4UUabI2-|uszasn;xM5Z?m~Ov65M!)v+KAKejea%B7$m~^iYhI z7lCzYw-LrY9fr5o>wf?SymgLM3b+XRCX13gnbgzLV`Duu=1ITLlSS5$ANl?h)-aP9OxRea85Z}c`IFVIsdg+%XJp{0v@@2l>)8(0IJ zD&!a?du&QNR=N}@(^vX8ASq%Kp@g0~LqU-Gpw4rI`>|U7*+G`9cbm~-DwR>H?lspL zs)M;aP9Nm{apMa>i^WmdZ$Z*-h16HB~s-oKvY4y|^YUvNWCr^6yC>1*d!Z|+%7{n1AHzPsIkJF9RW@;C_myr16Q z37=YUDc^NA4e^ynT)pUVz$*_})`%WrhNK&n^rfydI6aQ{Qlv~JcPThcQyjq;=d^FU zna@=Wd$(l);CE#$d4u{6Fkki@lJ$XC6wT+}tQLEobr`M6`db-WQLQtP%_{GYlF zXWN8uwPf)tx!c`qv0C=JM_=sn?24PEvqv;#-1?Y=yF8PDwOYH9YW^<&u^MCRlPbqV+ev{@^`%&|#?}VGi}mY8!dP<7ST-0S+8XSh@@U3%B=U`_hg^eSNS$*i%=h!{Dk2lK1>b1uxwD`}#hnJV@k%kr!irX>?-r$4 z!-KF1Z&A`3=7QHRMvVVrtd31s9jKH4Lu;h3GS{D=sPhWKl%if;-2{&+*iB`)9f(-Q z3`8etep?1cp0$0M-LuE^`)wZJ)j3K|C8AxNdJ8dvQzwnZX6zx!mB+4bxlN z+{idMdzza^gKvb16UE*zuLa-4T;Y=Dd$6zOMo(F4QAiul6Fr~|uxoPtiPb}!u*Wg_ zXd1=MwMGK-EdC9*G;fwujwXyq6j5&7E%v+H>Y<-SJgbDqn>UBOZ4Iy>n;&B97C8ck zng9s{ttQ9aGbfixKlRlDN3$A7XB(Z(fG3^xGC%9V*+tKKIzNDGmMf|6r6@k^GvHI~ zGw(R8e_$nIekM29Py0xXgY4{VSM7y#L7f}YO*7SVNo)=1f=FV|66rOWW+mGUAJud^ zTX8#2G2d6TW@%qpqVh`6P|{OLif3OEtcXCt!0Nyyt_DW%h0SY%-MCG*pwcoHdM!SX zSZN7f6V72~x8nQ6IB87%Sf`V4m&**cksDw|vk#{}&MLwhz(B2dZq4Of0^s-E&zYmO z4JjJ+mFtHO(Hdv<`2KB;kgMTMDc%Pxvap&UNTTsStJhlsGCQ4EP4dk|mp zO%^cbnfh=7YZ9*N4N8&8bd@79I zPs(IcewUnm08*6fG z#0fg+R?_#lBST0{8C~`zd)E_LujCH8=lP^g+%^l0jFL!KO2TdlwCjm%b+Mzxd5@Z> z+6$O$_^v@opUjRRMX^j~tFFmHpUKgbgH@o~V0jhwk2zIhrJL&2M-Umstwbu*af3@T z_^%A|N&{xkQast04LEQUeNN?NXajL|5O+UROFpW_VfX1q;HZa*=T>qW-G~R^KD{;< zC+IVH{A zActuBPo@s!(vDlU`;qY->Vh3Rz^8f>;<*evsFY470H-KQsVNb^z_j^Uz}x|4=|3a_ zqt?J{n4}vS;RHF4UCw9NglJ;v->wC&EK}BCJ`meS&8Hm2+LbtN?+>1CwI-8aB`82VFRsl4_T6ANN2N z-U|ns*+adEMlY7tF!mj(=ZIB}3mcUTA#S_?x`u2e2YvVV6)9<$E6>j4J>&_=9JhcY z^<#F*FgresEiE@Vp8Me9(^M za1p*O7n%&G!;T>0^970j#m!j(>^dLnLa)}BrudAI@dwDNgkx~5vxp|!L4*rn1frxK ztp^2Ff3k(RN+oACC|z4C;V9@Ra+Z@M0KaAMu%q8w9s9#LX<9*fqBL>2qnEVc)kl>8(IH=!%18E0t7QJ_EjBgPojEws5fklfx;bMMgK{sxX zL0TA89ipkIk{as%8F9ZU2FE55Tpmsw6XDx#zcZltDl>C}if?IVt{*$W$NYfupY!~E zxFuWx>u`|ml?I1K+s z@JpH;%BA3fY@8WR2UEQ7kTeCl&2jkFJ#RV!+U6-sJO2NX^`X|DX6{jkoGVfvY8`#$ z3wGMn)4Ht%IsAVO*K*kd#gxA3bfxo_g}3Z6IVLfWX6NyO@WS8`V?h`@wPIeXRJ1V2 zB{mT}7bYWm%Fgn6sc@*a&-2wp-+g#*Mru(c1i1s(Z>jG0w;;+*k(}aU1wq>Na^X%d zep4L$EwTpBMywsW>qJt^)R3J1H@HzRCn(oCYJk6!NAD{y%#iAUA8I&GVG%qP$=;n_ z@?4~^YNaa&H62x<^iuP2;Qa8hyUP{N(E>=&Z{3&!aJ z*y^!UomooS9)nzXc6!k3Y#lYJfQ18`EY=sO*e9*e__u>=+%7?T?;Zzbxm4=2r3f$k zt?q#NeZMs`U|8$Vl{*W?Z1^!`4nfbV)dn45HadWRf$=sPAajSGs?@5jYDCa%NQ7)W zgs2qY+6;2mkRNhaeJ^)kt?epEA}VluEOb!?JHXv>zD3T8#}{t+JL(_p@;wIJa@DTA z^^}ZX{UCJDA8)UH%bk^6E`R<*1nGYK3S>^V6_KNjcR=uO1?aMQ;n)08rSN=7`&eqp6 z6Y}TauK<63`~~pWgui?6_b~pR!rzPdJA}W@;~_TIjLzVn>&0i-aiq2WEW|wjDX?W| zkN^8S1Kaf#=@As%GJGO5Y$LiAR&&t(kwS8FJale2X4u^vqGUIJKurj5MQ)fR*jBCMc=d z$&r&v7jP;hdyW!13C9}>N{%?#?+_=Bc;pS$-;fLA({P3=)v#Je{3_v%X}V8#)#mm% zCFesy_5#P6uzRZ&LxYLV3g+)5YXi{WyFq^|X`cucpid$1X;hLIJAfOg-L*<`g((u0 zjj*n8JqYZ}&)8(yBbm|fVk*V_VQPi{QK&-X^duoc=8iANqzI)g81cCu^UIuqtVK{w<7#xRZ@)G#x{W?!ESHK_d{WuA0BuLN$!AYbJ2n%fVE^kG%yQn+>2houOmX@&jK{}7_bIij&xiMf zQ${2?IX+2#bw#}V;H$VhMT^0KGoT`zu~Z5aER|BNjZ$DG`2MHVK<^xIZr}|}wj~3n z>(>sb)#KZ-v+1rqX4!gr9b%OJgIE~CEvtx1pD!NRFwU-l?Q4r|>gw%{#pbmG)}~_USmZf=>@>7RI}MR0aK@HDQ7n7nFUOPN ziMgP24f0^b(d$%v`)soDtW(LJw4Ju$&T#(yfMWJ|Vj5J8qD8^|WecN_$mSj0)YXCm7& zw!whG29ty&o7g~TO-ZlB+ZmG z)TSl9B>tYYw`814=bQ68-ydM@+k1c4yDraKOD(fy!AiT)oN+D(>v^tZe+$?fyep{h zdKN59ysOn8Ua+!BC;G;jy4uZ%{ohg?2wCbzrWoH?G%l8nvyje?csCvbCGIIJ!)vsA_y5vgE>nzs!Q_tkrtn&N7drIB|<}!gYoeeXo{Mxit#@ROyGTs`g z2v_?s^D8piQ3BEQC!*|7eyMc1!(YW#`{@*0sd!(vNfL%!|ry6(eI#P8| zi7x@41bMWvl<;-R;X{gFcTkc3W^F2;r&1zh0weoAotoSid;F)Kc$#(JuGY+bKzSI& zM+L?khFPIYYpSD>}!viB;JsgUZH?+0=2m7vm(%Q0YmlLoZ@h(sy-aONAg~0BBH{p z$Q|%-lJ7dpYGvD!rvM_%2C+WpejE2trd5XXm*&)gId$l% z)sqF>^X+g}>sh_zqW9?(VeCTS+&oFJ&P6P3VDDR4!FLV?qI%qMQ2R{5N%)zJGt8_< zYX_p$-=m=oARATk)<~<|XvkXf?p7nDp{;4{x3zC?U$R+^nJ@kdaXD0uyeQ%z<%i}fyJh>Jc_b`40WGOi;j6BYn=n>Vd=ZO?=~Iv<(vs$c5?1-41fYtu`1 z0h4$8Pa1D4{Z-?xz^@x6?;vE1sJGW313frKa-ulf zp_XEwDP`_Y8q-Q=movEoG`;oLJ-xzAStdj>Da+V-+s^GfRk;cLGFA-w!-a^RV$4fz zIC1?ragR!U4B0Zz8aN`g;beioaj%-A`jcrndyheOy@NYbh6!i35qdCW1*ChI4A5{F zSQu&{UdvF=u1vyCVnA;Y6BK>+)U6&6WCPyy4Im34^11lR4Ctd?b{#a(d*m^UIo*N$ ztm-?kG$FHQ8_Lc#s&*>FA+u~~!+RuEZdTuseaG?l2Zpk_a`s78BB2qIUC-gJ9i?A+ zHx<7BdLxxHk)MsWxY%TyoL!BpzHHftzs|liIs2>uG&+KJT?44^2L^k##b67+bk8M0G&EP)?%$pP_yy{vA|XN3AqrES@u* zO;3!Eh1StDMwi~)Y$&rL-z=yhG?~z8APduG?mgB@BRia`w%>>Lm-=s!yebARSI$OT zvN2}hXFi=)XW;YoflGMKFl>e%*7qFxq?L|&ScH;skLKaCE!6s^jE&1#c=~6DoIzuow18L%!K`LGI@%Bn|~jC3b2mp z&3SF!&i+>D=7psvEOPqYCHt1{X?SYg@h*AW-G}!b*>mQp?;L+se*Nwb_If*ZO{NIrL9qyhS`6;gE%1GN@l`Lj9gWBC&0nc37I z;NZpomb9=rPp^^mqXAG4P~(LH;_fIo9lU=l;H(|52%l)-`n>Q-{g^;ebR^@`cb-6; z)wHVq{e%Q;R?=-;#F-+Q}TA zlII+O#B+W6{rYnmdBxsZ;_QlW(xiK&`USTR_+X>8HL)VnC0OGrmkX}8U)=_oEtk6@ z<*=w0{a!$+`PK(WtH=ac0Xr}2uC}sUv+fF+3kTqzc$Db-HkO3A`RKsFN$iVkQyUYq5hw$5YCXZeEBmau* zcUdulw!DCM4ectG<7g0_pD@2(bbQLB6nEvNRB#e{-Zwd53T%E07RQzv3&!vXoNYE> zuyyY)GAYuEbe!2LhFg)!k1*wXV$&z=oJm5&>C;Ly1^kHPv?Kby*!U^itmNVA>c@-5 z(OT$Lkl`~tV2>B@TvfNR+zN_3%}zR{3Lj2%cRs&g=|C)PYLVwt8gIJ0QSzxzD<%K+ zOsuFUvNlWl-@@Zf?j@Z|S`X=KhzkH_x|g&e#5sT;PpU}J4)seZH{*ys~oF_=ZGK&md=~HUA8$L z@#3p3R^XX%KK3nueVg7yDO-SZ|EVB35b;jn=m+u8xiT&dZD7mG-7`1 z%A>ci#}^>yEV6CcMy(IyY%P&ip{91(j9tQ_1 z8_S-#-48a`%2mjb2qfI0JFISKdjqfsRx&o!Lt`bq?qY~n&O%voxgk%^`@Jw(oL9rP z1%riw4Z&Vr-XPoV#_wgpvjV-5XJA3i(jphR@)ExYTSWFp2TIOoY;-YMqxo8J|5(>o zj-|qeUso8rwWEnQVkELsK@Ygilzq}x;e_9vknXDsEDfnPYTdd%ld>(ExB0O3NcI`` zcYLn~Uk`mS^kI~zSXsXTeq_3Il8CBqfP%INOP`c%X*FYr7gi~(+teKK?(J7;^tLC7 zYZx;iGMDa1&Iy;4pH@{-MIIa9*>oZT3RiOj6zy&H`jaON-npQDi(X7I3aw(U8x=R12|-}B*~BmLj$f4%?1e%WsnWPdvT<>21}VO{gKX1U&}>sP6z zY%CPKk5%kPk6=SwiZ}d%T>N|Z2dxsW-VZt7B-a9;?1J~8AZ5ENBjulw`sYoNdrEZeHdLxYn;}mYy$t&eM8NGoVWP^GFGGJdA#^?B=&$o;0n&DwR}EKc57|B zT-sqBPQe|UcrulR%yLDGZe71z-=*7jf~P@GOYe9(5H~qqNMi(w@4b5eDDs_AiF{S0 z?!*DvS7XWppAjjyiE??39h_fzy%x&bjQ2KfL4;bMRHRh~2QruLwZA5wOk=Q*p0u#24QI*D$!%AAkcrSldUGHQf#@4b zpvp|__`HP8TGbcA9-cDFuI_ZhzC!k-gr1K0nm^zi`v=}cR@DmO@mhD0tjCCYWCL_m zprJIX(Gu&fU0s>Gq^~HjtP^fvpfuh!TACU$hx?2uu`qV=QwD6FGXhQ@w6IrUu+yi? zwt6EtwjEO0l9d=OqxEs#PP1-bKsqMwtO%2ghaNeRG4i%V9r@Rx(|+*>B>hPG1-CX& ztlbyiA~}wDMbAj)f^1L0gwC(yI@y0opS6Ym6nF|9za$%??=Nrcq z(>OoKkN1z4rC4{7jR>vw#$Hq8bcS9cD0@b!5}roMo2 zOyTXkiJw6IiBZD}%^fX;<-n^-w-$8-(~~1;7w9@i8_{ITmZYt5wBKx5pPt`8W!@T6 z`LIQjGr*)D2N=J&j()qz$k>4xaV;jcN2~@#GrQ zTbS+MADB#v9qqwP_dI8kl^>YI0Ri!l-FtWKShlxU0LI9R6|ww(r^((9V=qJAMZ_#l zqA3zOttp&u-y<6qxa%dhuSshIY;1q<3@rAGjti#n_O7cf!EMk|xIrOmt93UNcW#Bw zTCUD0vWU>GhCZW2&cQB+ZHqrXILs}N>-ge$yn6>uu5Xk}~n zX0kLYc0oSqf(MzL^PwOg$B792ZGRQo{U4RJE;}xH4a(Jf;~f{bfEtK=Nu+$LYUsDpX(e^&Fz)0? zg_v!`EU=byobAvV1O_}k#y~rGh9)k*YFDYE!n2)rUOM2J+$wo5 zAkq%-TTXa~_}g@l=2yOhC*1N;8)>Jd{0oe=$kkJ3e3{w(6-5|YLhYvV)o(2dp8gIV z=bHS3tHL&&?0m(1N!J_(0(8p4|;DWjG3f&u^Yl!LF5*8E`{z;HpM#S z#{S7R6Q0Pq`OvmS=UlEd2SN=e9(DH&(HW7$C7?@J4-32C9duk6He2^XbDJ52eStj& zYVsKAf(R87U8bG9?sC!-Yv=7a%Ze!Xudxn;D~X-I1X}@ON&v&YHImhWOfRiuw*U~d zEClJ6PEBZ(UEXSNywfM0uZfb^t?Ynqa!5J458iNe;%-%2g81vl!6BVmOy|_;#Uf8- z(fPn68`{jcIbgoULt!-bh{8cSVgB+ErrL}ut2jzmLz6CPH^W*;BAi!h)K^J``~}4 zgeil;x3SLa6fIUzz`!p;^gzU*M2=R;mw|-z0q7b*=h{|Y56a*_XD9BK5EMKJRX->jdAd&L21k(4Y-&UD9Lz(=u=Sx-9^x=tV*?~ zt28A=-Lctn@%IYgFAhr`@LKF2W~|woM(Z^2cd~00V#5yWNdKjy^|5BC4_1O~$?c6uAQC(Dq1K& zD{)MWnpH{?y_F*5syUvai{j~!*GsH6+2_iH^#OK*qOj8|`(DYg%%zbDv%A`XxXu@$ zqkBI?E|pj>^mF*-GiP$dt2(Tq_0zi?)K&wHV}-Q*+O#w<^f6z;cJtJNpk+Bd3&XxX zDw=c^?1TeIeDgtvw0yKBQa1%nq$LM52H5CiDe)bc-!;;T^N`0W4ozLyu?`${4lj@W z_5DrwCBn00MeJt_N@rqyCG6_%NW9BB+p0bSD>L~|U*oDx9og@`V0q^iF~&l5A?}=|j6k<`#zBrrFXx z(CI*ms6ItBmNRzz;G)u`?Hv4glWa3&6$hfJs!UxAucR{B`vY)Mzf-fn!amwaI~wt@ zvt-}-G*E2cg*5WnQoTClp%z#IZIS#s>=sdPEB2?$Km&^2Yd@dR`&6y!1(WRSFik;I z9x+X>gPd!^nk$ighfLs0vO8egykH_t_8@+pG7-)tWJFD-)3ChKU$sV*f#=zHPRQp} z*%!fmWH6)FsO8h0`fxOx=mhS#P_Ft#jY)xTQ9Wq;i)nr%xcxM`O7tIoa5OTPU#b|- z`*Htx^N+{IW8MGZS<rK_! zPV*P|e*R;OryiIZ54gjVa*iQu@ELhGY`-y}(&knKF)I-^Fe#s1In*<1^2K60nwh{(ybtF+LyGX3#0V+_9c_#n{WmM<^f{w`Brt@t|@)*Ozp2d#!`Jxj%MwHM|4{=X{`^xvETS z1Apx~tIO(<^V%|{($Pv_ZT>RpHv;62TF%Q4Dl6oQ{h8?zx&CnG(m{T^)ON?GypC^? zO?E2}!y=fJZ5` z0>eV5kPV)Wn3vUrp9r%7Cr+UiubGIRDl}hZkO%)(EQLoOtf&t4SDFzLW3lKs^|z$O zf!AWEUvGl1uzFtkPGyR=z*=!mkSX1e8uhZ_bf)M)8S1-*VTuY1FUXm%35{z~vj`DB z3-%@jxRPCJM&r98dDg}5P)Q4@h~5M%AYZffpSkJl|IF*4+g4l}b3u#+M30X;NnEXfhiZr0rt08M# ziPF^)Ts6^^3z-I2!FsffuQ-f*Ew~po^A%_C`+od}$JL6p_)SvEmGc&MqF&4H!1M$5 zen+!@RKZ%#<4aYKE&opJSFDb?eBPNF`kwUGR36DEeBSyRRhp;wm*DK{c^H^uibp2h zex4l)M|ViKU(Y-giEbsyHR-_;jhrY@;5Ra}LLd6oZA#}@n`H~vi-?aZWsM7`fohks z6hZ#+6YPEV=Gs@3Vs^c_ZvXp0)IFy(87vXlNq~P-rFK|PF1K)JUMu=`OFfHbogvhg zZy~#@1=LbsnBOFHgrl2YMI!F3)_227VH0CTC)&7kA}jk!nT6<72@uxNxo05(h_j-eb)td0V7S-q42F1N(&=VeRaeH=usf4X!R^VseH0-8`V6Os9YjtIo+7*ilvgVEsM;N2pcLz_k(bjIXct{I@VTtr-R<2@ zo*~vowp1#?c~wsoO<@E2xOEEq2OM}{vV&Sl9Q2iJ>r6&` zz1Bmb@W5QGG#Dn^mF_TNZ80l}a&M9e5YoJG|?i-1cR2VhS9omA{4c z^gOb-K#Hwnc_#R9ye2 zjyySX4>+}OB#%xa@NTAhjKlW|_$_Mr7Lk2-rhNJC)2Y&Ob(R*&zNC*DMgyzdV8CCy z6{bPe?<{L_X|M;95#%l6^oUE2N4SA_9m{Xz>*2%Vac}oa5RnfkOf=;Jx48Audq!TV#hqCICE_9&A?q~skh6n zjdKzACoz&NWwL!}r{7g<4>87IuSoMQXf*%3qbL%`9d#C-zUbmC7#Y zJp-XRayC36Z<7rg#oOOSJ2}2N2#n@=GocGH`Whw|b88)u+tE|VKiHY%1#SbXa}LcM zX;X9z-if8rTDhD&bEEJXx1@sqSS9Cz#;I>$L}7o4`oyFkY&CrFFb@GXPz~Gp;)XSl zS%7a`pZsZ;t2_zl6k)dk55etF%Hh#s?l&f^ghkz9^)FpoxL0hWC5_{F!w2HAlq z5Nkz`3(_0bEM!8&ZcyavqT1M<=YXG2^q)LIZs6Wqmf<&t>!->#@B%h zsYS{#qrYbnd+mFmkZZ6)V|OkL&6XjOzwspX%_fb)JtxF;Klj8;H$3=d{kcZlJnGyB z&Le;P?-6(7J2Mn_s0Xu}O1nhm^FM(l&=Fc*0u-3v&zD<9-~YRiuM5704#wIWu1+{| zZj~Y)raU;I?<h&&f1P$DrOp+^lti`{LR<~TM&9&D<%U4K)isqkLx|>Xv<7aLOEf_)dq;0>jhdvY zk*#u8+nw>E(=Ac)DsVtyon&MJ&weh!0Y&GWxf}ji-z9n?+n+H^WJOad*qI(^H%xS1 z(F|0m-Z_|oB;C|xzq=xK^u2`#OmA^zaDQ*=s6W0K6nT3tX{Sg|t+Vvhw}%Sq+s~O! zM?!_>_UNi%qgeK@u!lj1&7$RYgS!uN;O!XqdnAJcTFz^)i*xLT&4Ji^-}gia58+xC zZ8BKttwrYX(1Ofpul^!k&3z+!NvBf&7juO&UB_GJGNob%L)7S7C%0S}kETeqPcM;* zv7!Rxvb> zp&`<-1u=k_ro)8I`%}tiAphc&z>zi58a|_*`5oZBVf8h~?#R||rPDDaAkhJ5OD{#l*Fun8bfc8A(DRE#nmNqc->{jwhKSNPM3cqy4SMXI> zcRqf%v}OF05_L`Sr7_rX6Ll1!R;q(`ZN3!nuuGq)E5pWyXdG+9iPiA}jWSlpw`i5% z$whvOb?f;Q<#F2uEN?skQq_}%GfK{m! z#=^<-guc-vR3rXY;vce#BR->=`_~D6Ch%<2abuDfBu;Qfm;1j?&iG_~=6=?xnoobrfuP*nN^^`mD`8?1h;HCIXG zbc;Vf(Gm-MZ7pn0yW_b^+OKDIvae-5dB9|{E*0gh?sFieX1`T5j{Q3x+>Lh1uXa~J z2HUUNM*1=ljV)hvt!87DvhVlnaUP};Qc2GKWc@JKlI;3qebG489NdIam@9kdGcV-e zX+3bo8-hTkF9Bz-$)?d|Gi?XOc+xOs=<4*gCFIup9Z+LqBbv?C~GdwhjGKu z?lV{Az6JREs#P}RY#7En!iHw_550ml@fjxjj2nu^yEkFQIuhTDC7qxG^STyGr4;=L zKJp$(e{H%S^OleImu`?sUz?k}o8bDh{Tr^*S#M9aVfIRhca}stAn(hdP>45e$ z&)8f*&*9$%EY0Cj<<7%hV%b3;?9SjX==#D}fghHfeRM*U&Lg@pf7b3RJ7tvb6R^HD zDUxK9JlLNH;88wBJXh7jUXm_B)!_j+>uiLqHf!Dg=^vBpTfIMfC(+r}Tp9cBkJL9* z-Oe9*80cmWy$*CbdYyceqjbH=wso9O(BwtpZLvuJwPSNMt# zmWrNJ@PBOwhx~LQ{1lq)bdCax_rbcZ2Ozs|;3Xe4R8-34JF_rPYw(@5YbBw;3C}AR zowukMG3gRkO>{-q1Kj!UeX8v)_mqWX&ge3^s7%kZ_hDv&WDn~S+7bgHW1=b4{wwi?*o#-5UC7klAeybP7IWGt z`-zXaVpz!3Z*xYrCcZV&w^wR_zsz~&PTCKur8VoIAlg7H=fMA!V&@d%8TR=nlwEvL z3*PY-$bzXVG&J zF_P$Q(jFTjhb8zX=VAB1qj40O;o$TGHM+a9xDd&ig7SJt5V zrs^OkRzqtN&BLyoBNtBT)iIie<{LQR_0Y0UwYoFJ0QCJOWU~ggZqoa(OYL) zTF7s|Naf~Rpq2gEoh6{Lqm}fl0oU){Ni>(P-@EfLu77(c%^I!ZWDA05XAxGn-Iy4e zTfVf`Otn_)ne1W)zL!C}fqnzObkBSDOs0vBQPp~shG;W|;S5-d;1|G>*<@6m!y<9= z@BYXi=lhpLhFr>!bl*5)4r8AIMG|}9`yMHCywX%m$SPi9TZ8qt`UeGv5p@*4k<$&0 z5^S2vZ!Ays?}trV9Z6(1VCh5kfsplPPvo+Q0Z~Hc^1|U;B#-jxh??u3PA1W*FvO56 z<(1~Ig{<)?6PCSGeA=T37~^me|+@$lNxk#^G3m+XYzs#KB`fzXLpjIhgW zKzj|amK3Sn`v^bRtC##8h%Bhoa<62+BZXH1p^&yDC}oW*lIxCCdN0kR?4|OEO9wY_ z-+so|lU|ZDPDW*&9o@Sf(IWGIDcQLX&7gJudLYVeqUtZN^&oEoUOdn!Ir< zS!7f>uTY(*TW(Uv6YyEb%9tk^u={eyKS7k5O5%d;I>^)c<}FdHs;B%y={H+p-V(}F zTXL(s1G=_1fFDMS#xNT%;iPV7>gX1O=PQ^`r;BU$$wpsDtHZVZpt^W_QSHsQ|L}Cv zCEyK{D{f|<;3pChrgZX#vjrvwz1ggjB-kB<$KWa0#1kI9Rz4TL$_8=r9z!A)@n_H6 z<>Q|@b7y$a=l+nq-vd6k4Vu%YQw>F7sX9IE?o+jOIdwPB55y^xa_jYkFH`zVwT?Bi z6ZmJQ^vTs7)-UC8NB)>BU)6)o^wR1M40#$Nan+u|u3;TDMy=McwY$W~8xLEh#!+v@ z2w6Cnwv)w!T?6ebF{%0*M2<<*INlmFG;Q8`v+Nx-11nwCVFp%uC^;r_^&$B2X1;*0 zpfh-mqCX}gglRg1UXzCE4|YzrEqjc<-0&DM*0$vLRx9ajwc54z&1h#kWYX3~WN%Go zyd5ZtZA2kv`i8l|>aar>{48RECG`UycpBcP2uh({CkK8%4gd7%iE5wzy+yskyNljk zJy8u^I6KSUz0VxTxds^&+LVYcYjIYin9Zh7+Q`yF$l;S&@N*hhV?KL{GsS+YRCV&# zfQRrbaVX=2t#keM@HbhVv5KW1wXQwFUB{rjeb&|B!5S*m?fgvx|hI;`5Ta!}3(i(PN9S z;@?c^-b>u;eAkY>V}T}Nbl;G?LEf>?1cV%9LS;-LuA0N2H^GZi+^R|NcTZGQ51q0G zEJ9qL=bUu%T}{mWvHb0P=sv&=fOC;6KQIusP_+?<^4OUaaA;X_6;7C=a?vyTc!ON| zgdu)V&OdC3*KiNc+;CRpyM1{Bk`MX=k#);TV$G@RY8(8n}!{#_+UK5EUK68|m=c zvemAJ1st-XsOagQo~){8FvcnefK`~NCkWp&U`LINFIVH?Rk?ta#=Ur=>60mpp1NG$cJ);N&)?H z9yoYMs8lYttilPnRL(oq&{b0snQ;1w^AIuQKxGokyAL0gH$c|SEMmbU;AX;+y6!${`FvM1#(I9?jy^eazwluW)g5=e*0-zs zCw-D1r^B6Wy=(^O$3ivmKrDNVMFS=H`wbSA4muEr*Y+=hweKLU9%m+IXRi z3r4J^|0Vb%v2~l85P?@6rS*x{+?i+%q68<`!RP8hmKBN+fRhS7f=i$L|7f*B87H?z z(HcEkLy;Sjtx1)OFn_HLn@+ZljT3LTZns?DuzvEe`mPD@GN3#W3Fl@@+*py|me}!( zq-{=%7X5$qKcsx$$EwXFVLuxnyGp?*q-2{QBI+&0jY|HeeKVj&*JA8orI;T;lzpN} zB4T|Y6DwJFDk&oP!D4Yvpb~tGLNq$F##DRr-G%DAc!qeG2+CbUbc^gcEahMaeUGmb zC2M}})4xZwlm{|9|0}&TB}$+&|4Z+yEk+D4^zjt|njp|>O{e`QE5@Wii<)Rq;{YPQ z7^8^inV`vtK{4z1i29psLJDvxB2(a9V};!zJcp3kbq;XEt>+OHMY}e+v}?7VS;)v( zO?pVHJ6nx5Y^uu)9)SIx5U6w?*eBZ$K?|Y_tkuPVP-=Z3I=8M(L>xu<(CE`FO*#`I zx6>6Da8^zeJtL~g5uG|};5yObIakD2@q>8iq33C} zAp+}>c=0Q(XmNnzZ8r(p?+o`@=qd({vHvJY#9xes$26M^baOLb2jkVTPGq_cVY`kH8mRR2mr&Z7K0o${37HGo7^RQiYSHy@L6u|K?q+ zXWYelrj>24ObbZaJvvkSf@}{o0ix>~qG`cbGb|1?BJT@XG_xzyf}(4DS}ZJKWx{9g z%w-ut$p`Eoa-JLnrZu|~vEIrD87Q> zFy>~oB55-M4sRpypPAtLs$tb`Llj^q?7pQD6WUl{3d^M(CU~jiWC5O9S zPn&-_9JPKqM`UfaEFbNL*9>8SRX!A0(TvzN#3=0r2M(Vqo)de)j$DN|qwSB*@;IaX zOV&22ZellE>PBSmePPIHS9^ zLJHPaGg+<%vx7lv_Y&)pe`0Ni!q9T_g7Ri)-#*LLT6-^qk@G&e*C6>u7Xf`_ z>I!3|ZaK^*zY{lW`_1&@jEiMD?RUoLun;#Teglz{cte+=a`m7;i1TNOU}Wcywo8Zs zV$Khl%s^7e@Y{liAMh3ik=l){d(TU8>Qvx?42@IF8MV#&a7j#49YhV9Pf?< zT?6)^7pSE8vRHN@WW5R?-_g>l|`ku?3iIBh~Vettjxu#zeVIa&fW6z4NL^ zMJnsfBhg>asw0#40P~U=9I@q=)D#DR_wl#|IwwK@%LPU;dV2-act;?LQzH39YO7&4 zuQU!ex(M$;nv1eT-YcB6vg>eKeEr2e6xGY>qtj@LU43Y1J5W1Dk}is{y6a7Z#zss% zwbmk>w&2xJ2F~JcY4|*1I>0aadyJhgm)hVF@JyKrQR2}@9#F@!aKTDT3Gw*kIS^g6 zR{gEl#oK@>*#7krLQ}@PE3EzSNSoD%J=atW`?c~+aQPd9Z`oSqkw~WNHvWX`x1d?zi}8KLy-9RV zv(VCDUo|)^6=7B^c`^HW3s!dT#;S814DZ+tv~fs#9`8_}Vr>kq`)HFJIwl$+YoDa| zFsl?pBy3=y0_O0Qe@J1jDf^td&wM@ENpE75B^u>2t6Ek)%G#Z%8#xLLriL9CTB0eV zJ4K%vQFp$%vN#;l1#>R$9bJm^Jt0SSt5M{o!Es$(cv+v?(&eVW8=F4b1cY>{%Yv4t zboUhnUh_Ni-zgYy?g$Nqio&=m#n^d|_E9UzYJIh@ww=!hp4mh_jug4R;rgwqa>pjb z;%@(vzWJzcp#`p~UVU9)$0if%p6NTz?wQ{}BF*#^zmv7i%!wIuQc3e+od}L#PWIEB zSbc{;*Cn%!5g#BeSH}^a?5?RxcIku%T8r2kHCnmN-Glz6)0Iom+d2ugvs3uxV8|EMxM&qoJgdJ~6pm)z%DSFG%o$#SdjBh?=pI6K$Zr@4?8x_vvEeMGuhR`O&nXZ-?*V-k=)Cf6}1s zEUl%Xa@W)_a$3M{QC=vxORqL^FJcgxxJ7%bSEr(TX%@}hjnMY1v$g|uVn$1~89mwv zk3*bvh^!rw>JdYSYCt>Gzcl6;6PjU-Yll6<3~PEgIPz16tbijL5!fa3=pL@ucIkT= zgnJmhTY3Pyt75?W{2tta?n3fmFVrqrS<=|mlb|3Ax_S^dJ%OFu=ArxWXzKz_$)IeK zveqx>6(>tGJFjlCc(7M(C%qr-9_=d(Ki|hou6C)K*YJ^^QH)mfr6!~Mb1iU}OBHB= zlY0kBm+k4^!?OnLJIaUDzemd{TZq9j;FR;tmYeP4^RCkR&7t+%#ERZ>Q`v6;+<_kY`J!>pj(oe~CDf zTdg%%$$mtIjc}jjTwh)Y38(}aunLhyiuyAIFFTx^Thwyzr7=|B#|WA-Y22+}p=+XF znGfI&Mp`=|F~54=0w2O&IwKpIM&q^dv_R)nh-h`nPPwVrLLO@0j!1n^uhwQNF@i3G zrD(*mT=LUu1p+v+wqS8tY+anB1PQcHf^N>lKPQX|xF;ZIGlSu+F4?}>Bp1F44`jkm zl203~nb0M2r|if{FY&?u+Yk)E_ciBLLAGx*l!R#C1Rd~-D11qfo$ZFvmQh4A0Xov& zW}0-#t~u#IW3$-elfa+Ef+tz9X9zsCYF~riNK9~Z@osBRovQi!YM$r)MR@X|ZC`jo zNg9HXZGq* zFUcz2Z>P@A#(bXD zDkZ0tZUQYz$OL-W!VtNc4_tnGv<2F)xvHFtI1Y$&qRGG2$*&OW-XAIz11VKvC2~LZ zAd6lPs778l%u%Vlh7s=psp8n{|4A-Wsr(eZH;*&{ zh=7Nv{jv9c&W2I`f1U$%Hmw6fm1OoZ$m;DUb+0V0aENURyD|^42<>m%Czl{re7DFt zN67aE(kA<fbP*(^DTzK->N)kjToZA8MR5ynEl|SIfvR z6%;PMHJ1JLdqmsY4~TOHSH~V6@W#3y^*Z1eaE!fg?<*5+@MOyATPE5bXYc3rEfH-; z*@bz1#iH#9J3YV8NfC-W7W6G5@8#k}ee*@zA$EaX&m+&k4&8OTXgk0T8Lz|VZjcq5 zucwh;(xH^=@OFNb6=z&WJ^Pu&>P?hOQgYY~6#>yX!mb-d#|SVgQ!Fpc?S~w1>XG#{ z@If!hfLU#*TLYAm^ER)jtrRs`>A*E;!EXE~unsv+O@VMQ5YkhH0sE9V{HCrY;Uhk^QtIN-C*^NTCbEffO< zoNyNwaJg4bA&Z+)S~Ma^%M>B@hkr%6eTC$&EN5O~-?hq%IQz9*jfUMgeA@|lZoo>n zNDMf&5Y*%TNNW5hwxW5p!Vg$Hva-KP&}(I!7r3?{!9CEDVO?j$n7tH?5)i#^eR_EcYfjfH^0!2 zf6?|$4EkSSU)BHJNpyXz63_z@ZZf+;klFE?VjC;*n=>1!7wtTSe3-4c7-)~Bz zmR?xw$J$w?hi|_db*u_gUX)BYf#WdIHa-Sx>aF zEPH^SAkOuyC)yYdBS((bDs}cve&}$tzMn2(V8oU3UxJ$WnX9hLeb%a{+G@*k!2zxxabe7zR8BSo9<+X6ptVc7J4Q`@ecRL^*#9@O_| z>QRIY=;{uteJ6hV>_%D%q8@WN2mZDNv zMsH+0`s-jA^I83MW31KwqF&4A#u|9Lnc6>F>VIwY3}5!W)_Nf^3;*Y%(;I;7qte;U zi<$(r|5fLpQ`PPrL|>ZH>F()je~HCw=p1A>?;c##bUoQpdin|zoky7eo12{(ZeY{*Tm)itTu(UEU#9i93?Ty^$(UCn zSxh{e!JfiP4Q&!P|H;6{s z@CNNMjWbA1GvduhGP>5Pf7f?4rKYvh)q2ZW3$?6xonO3JI&8vUQu?gi=r-hA2aQpL zOIUx&8u8W58nZuN(!~FX(8J?cA@Q@de;t5 zaa;rKv{${3Jp~>OK0Ey_R7;}t#1}Pc>1R`GA1-daS^A)Qw`ryg&L$Huj z8xk!`lz36Sd$SEG>bL({8{RBRmNUBz*~xMUwT^LURIiie0J~5=u7}?W#eqUL*I%YJ zS8_yg2S$XVdFH;XCv=2d^kJIH-!8zJv%gr0&V#oL`As-v#IG6MMzYvKU})m4$iKGy z)pguD+QQSj6`a#$YpZ}=5#+p=^gRFF`!v0aT=BYIHX_0qi`HDei88taKK|}~lLfKIvk@Rh8~)9M;;x$?tbOi%qNd4583q4GJsSY^p`KB{p(h#{1`b4uf# zgqwHHsdxU~`rVXYxqrR*(&6LgnOGzgg8+U${SMwLD-*^S9HhVEbI%mQThxO%99uQt zVja9+C)>fLFO7}<58xUb+M7wbD7|tFC?ao1Yv?OHtD_3}MoJ;^&gafUE$0mNf#~8( z`esNd7xF{P-*1WLUotmiZ=J3Rt>dMq3$kmuv%W3Vc)B{8eJNFJWZx7w>JU}2Yz!RN-kf`!-n6IOyz{3g>CTi%Y#jM(?VaU+ zO?NIC#m4K2J8!CY&KktV$JO$&9~v*Jzozgj`Q1J0TTQt0@l#q!J!&gp_iPlO*6xg| zcSawAgl^`!v@Vc;1u{B(@kvL6SO=5c z`KBs~lkSeLB2SWBPFEs((IpC?&580aS!cd=-0?<6klsH3nQ!|}(6_zFmi75M9M2?6 zrLX#)N?yUPys-c~NF*V2jJ(lFnK6(R+eFDhDwC0ckmD zVWMpx^t{tF0IRM+nA~F78E=iB?%vAHSeNFQZHZvn_)hCUSNs%Teyp1haQ_F5C%wSs zLTdf6hnHJ6o+J+z=!?^L#?PAqOE<3DSUiH3kC0tAG475#KAHmWK68cH;{KCb9;6Q1 z3y7JvJofSXjMts4m3%IWPm#Pk@-93tv9503sd@u<24~;7b{ToRlIvWy{l*Y4nbArF zk3mlc-J}CrihRUg=oD?AB96fg@QuJqL4W%B_bLBt@2vNWus2gwKArFiR%J9ix(#{9 zdq!u_2++laDWfClVz~zt&i=9knW9Rkrn6cp1|g_XCGdQu?@VWOzPqUD(*(|eYygeW zOzFR;=N_?KhbZl|w)>#z91HOE@D;Z{Vs@`^6tcgv*+Y9;w2?j0Fdj1MK~Yb9&y}bVD0; z;7ij*$8E*5=Ib4y6wy(#P|OFO(-G2{0;bI*#URISi|EKtA+4pl7D-cD$&bOdmxp{& z=~5|nlQ+hcx1~}w8fVKIE8o~FX!jBSda?3>v{9L+=$zaUafhK8rPGm< zO(|00f?VWRE`$AJyX5`)I?O%;r4X_!88nQPi)J-D3p-0%?H8W_Ws4E2bxh35{@01R zka6&n)6=r!X{3ond@P^7oM^I|8Q_TnBZbPu8lT?e zxb#O2)lTb?)@u+pSJ_9r2*%)3;!OvYwvRY28yy8O) zsHbY7(|<|8GXr0-YcHZ^mZK%>=)?n8lwbE2onN5vhpIK+i(C^gm)60%;Lih+RBjWLS;(KRZJl zFtKR%lz{Jz-j1{Q>q2%<2jVFq>k>EL%rVNfwUxfGdw zr$uu9F7teWq#OF!Jv%kD*7}>fyJ`&YhOn9haCmU|{N47)@b{(lNI?6Ct;!2Ma?gZO9>hBKU=4?`mWKyThnJE4iK3ETae)g0w;Fr= zTOQKhrZd@9J^Y(-y7nQB6y?y)_r|4WI&8AfksK8 z^Mw$AZ{Qpo?deABXnc{4`tY_M;}0va3cGMeg;OvT#(j~WA?Hp7y^Y9hdddFvg|V<-X!uG3NtC5N z+a%|l%8>Q13X{g*7RjXOh8g}^#=+fP!f9Uv%Om10!zR8_H(5xYj+=mgj%V;Y-SA%J zW|(G^EmoVjH&TMS66|$hoiHe>tG$8-Z8oKj~%v zxE>TVt=TbIav0yiCpZ24V()$M8BRODoTotsHX~=~$3(eKz&GJCi~Z@pGx7v@{jXH* z0{k3a7r46{bg^p%a37B#Lcy2JZOq2mal%*cyKl2Q|c3S^rar`7mzaKC#;8 zf=e&0eI!x_6c*^VTv~&;FC^cXTY%cd^&n6wXR%vHI|-lC@E~#Z=sRLt?s!16kxyq1 zR1!5<_f>H719U=VTe5E&UnOzSQ z1G)7|1PI=MsUX7*RIBzI`d1aVxKGZ*Dk_4$olYrW(xkzmx8$Ss7?}i(%l#oFPK-+j zx1Mms9({@Npj-o9RSD%;`w$tXcybx=R9k5*a9#aOF%K1vz;A64>|yqA7jr9Y?f44X z@JChJ7wr0L?o05+`k{|seGxus*?M;7o45;llNEt4>KxGpEU9*EKivmq9+e>_4nNIR-FmR^{mU(FU3%%7^4EKy03DMhciyR;?(#OR7 zkAA`0Cw$reftW!bC*)_s&9ox2MU`}yg1GP%BgXu?09o;+q7ir;h6>4JRiln+_Yw`B z)~ESSmS*%JeyQsYvvk*W#D|q^cOVYC=wsvHT2s6`B>$+z^x{Avatrt1!-86l z-@`IG)6|R?x63$R_Qv`2b*=q*Tsbk3&?lv3U?@foII zpPxjoAuBknBA}e|?*KOu%BMBOfp&M>2uGL^NrR7bBp+>m#2o0e9C$=@?EL{{9%V$H1qK>S8j zkq<7T^OZEB+TyY4X}$t$`0x0d_y9j_zkb{@i>|Cb{vo0dw#r!(#tPTyFQu###9@&9xh0sesDu?YWP z;+xDSt*l}FtOwf#N9f``m3c>gRVl~?An!oqd;2eVq>jm z^V9mI;pRKP7bqaT!?w6g;vl)LoGu}o%th#T@iHBMB4&)m}7hH)sQIHd6% zYMce+*{v~_fzO65AHN5Uz3^FV(uo|`bJRD~_`EpT!FOx#oHCY82lvr=O%XYnWAt8( zijQWb8TDYsS6EXnL%&+=IG2ssimm-&lWq*BN`*jkjy|`1cGi0_>z8%?%v3PuxZ$YC z-;DeqCN?I_y!E+xr&h0c&RSFW zd^56=HPZ;RCCB6c-;o%-moGpa;;d1)-I}8Hz77$~kO>1lqs%8``C7k#Imyqiq}5!e zS6A}_P|$rmo#QWQoOyv9kFlq?=BkCpKxOK zT^~)KFvRs^uBQJjtyE99`6Ab|=-lMYM~ox`U{*25r$E7bzf?nV+@6pLR32+GbvAW+ zFN1a%@kB|V(8!CxKJ*Cp^*>t^s*>pq9SQr}79uWUR}hs^0O=ZhZT;vgev zC_5%hMq+<*gr-=o;K~r;gYU|`TY+4fpA|uD>U5$3EdBpw@7?30s?NRfwfEd|nOw*O z0_j%vWO9W;W^y55cV!YnLUe#Y2BCJVlVl(X3?z`0L`5A0xio_!OwsnJ4T>NV1q4ey zot_4_MLnj911&v0^ljQkt#4zYfgWtN$BE+ z*0Y|g-I41udc*TJJ77_)+ItBXnOpc1FkH;K#2nuDHBO&?X_$1$U~$61PY8JZ;aq3T z<_naiJvg<3s3Jtj$&`yZ4(n*bNC_<}Pt~{uBW5Tg3mZ^f*#`BD9BBwYo$s0Ik&FL> z^5VP*-9XpjMNwaqsVEt;gGduf*CM^^;N!ncc2EtT+vw>B$d^8Aq^^ZhVK3%-iP2c6 z))q((!UigEz!fqj&LMqI;vB$k)GIsCg4B~-#1?)o-*Za!C?`1lza$9CwsFQtd2Rqt z!HJH1>+h{-qWmm%%tvhH?`$iK(a_MpYH>qDl=x?Y3p#>j40{gkPa-p_I+EaorVjra zyD9AdsI-`#9-jV9drEmp(?4831=`D+2BcQ+kwPAWM`QH#d(_@RQ10N|zDHwY%pxxk zTD@j)|Ir)0FChZ`sm~sv6FgRyqh`c27T{3an4s1l^Tlb4Pl(JD94HMXZ>LjUvc$ID zcK!TXJtzYOf=g#PgWL zH@C5^q@8+=txp^LRF1ARVZ`RE?{R_s3Q{%&xYAcCIIxN_Mjy?7AKr^%kV9!n|0oA~ zhxsgw>D_sKB9jZh1REP*18+ZCiBZ_VUpk!~1;<$xerEds2fiEl##l3H)QVJdH_o5G z*WHxvNR#rb0Eg1;g0qa>RO~41HkjD>1Zel^RP8r$=61n~LBrUOq;Uye^EjanbV=tH z`%USo*@5PiPN6kn9Qhwe+z@DnUF8O$26ZjMN{VAmDebC z^LsbsfZeK>Q`DAvy%gq7a9cXf?f7ngG?=&{2l0ZEH#7!IFeY!RJNVNky_rMy9W6DnF&mlV_iq^k>lYwbIxgpm)ANfG8(p5I*PqXA@%C2C zxp@LZt4Z>6{WiDayahY_=uC4*s>jSU*yPnhj|TGx?HgP@I^!G`t7$|V)#dUrG{sfrl>q60ex z**$(Ke|`*Ngh69v6*T9;icl{8fI9$QaBRK4Gfm+>nI<{yuA$Z2o2%g6KKx4;+OA=# zL+0??w?%D&RXueVo@0U)I7`JmF;qCF6e~(uWG^#yhw{eOzI`pqL~UB1(GSOY>k&ZEktX>#=Up@C$TajIgAi z2~DqcKIk09XaTbV&jO$Y=5O~!R%o~=`5ODps0_z7wp|MRU*8|IO}&W7gD&W#!utz( zHLuzhii;fBo*ve}xHO^@T<^mAZ4_65)*&zECE+a(c%o;>YxhX=PLH-n#^%2<%c$;w zYCFhBNt;^RB3~`}6eTYiC%j{8$fzgTTNzXRD5~5hr8GS7ZO@*V&k)C+FO04$t`nGT zv6*cS#$YR3nvEtgG~eA?3a+H2bFG55EV$m`Ti%yr50X8x)HY}q`p;S#lri6`Y+CJ@?M57@ltPxSKtw8$O7*{Oe?j5B+IE!dWY5w zy*#E(@4A{ly(%H;5?6&&ioQ|Qadg4LoAzd3%fa;Nzh1It4HJ0_9U{0U4*1z(|%tUZFh zcfn(Z6?^vZaADK)Ho@`MHiE7)XCOP29GmlYzkQ8ttFsb^L4+0CFEWZz2N;gd5!H(md@7m+Djzt8 z;yqmiN3{mgC=0J#vo5Blv&%uxClYa5NGHrwDtO_&2Q6&w1a5Q0tDG8@R+%D|!h6r% zs`nmv?YWzM*@F+sRKf{A^E^KB@Jz|bIBA0F!)MFSJn-RT@^8p>sXlx*T+;P)2A3^d z)&l)iP|ny12AdIg)NEggldmxX9-utEj${Gd-@!Qq|7PQ#C4AfRLP#^M@c*cf;t1>w zzByx8Ip*;B|5Py$aB394z{_bmxW(B6%7ZzBRW~-5xitch zKPj#7K8@e$t#0*qVXI&LZNYOhv<2L_{J0`(N&~r|*l^+khYj+zlCU@zYic|=qK~(t zmy6dg*7lC@UzaRaaUf`m*lhL(`&u!QUxCeV&0uS!{z8qh+rmrZ&0wmM|?#s>T4w98>ZTlb9^$gr=cA0&-@XFhs2u{B(6lY}iR(l0;tj7bhXnmjH zfM>0J-H)YgvwQ7&5j(g^9FLe`7l*Nv)VRupMJX(>VtSK?BlaK?+DHor%?|>*75X;} z`Rp5j1E+<96`UV;p4`z?a*@xVr1)l#y_o;Jk^*TPu!U5jooRq!QhPdEHUvA}6a6zu z&JinJF50IjP717N@7|+EJHy%Ye1&QsgtLQ5A-kjJl-)uNax4Nh*4}EC5rxgD0}sUY z(Zkp!?*QKwwUZx8))DHo92w;; zHBZzSy@y+siT;71KV+}T{&UM_%xgXRHaYu}QhH36y+GNO{byyVv6s&H)Tbe1PrI@l z7W1{2t`7a=@I_^2OAsE>XC8JOekx{P4QZk-YVV7^YNWSr|2Fel!15+Pjd`YAxLJjn ze<$FTPGu`%Bo6gVrX4GMs)DnOSf3g5=@hB$97Dh#vBMaDKpZ1fhX+LpQ7AuA%Ge-f|Bt92Lmq&tr#`nV)!%flx^>D z<_+eVeQRWnJThba;9D!QMk;v=6#T`92)97b!&1f#W!r16l(livc=*E?<$JA=0my}a zF$|Ox{|XUY7QGA~8PV3-euYy=v{$u%G32_=^@0Q7{T=+Up3zB86EwRoc4{RnqSUY; zcT;YPTXK%AQGKr0p2G*BmpJzW<4b;P6jL129Y)trQJYqS*$?kT$wr&eB_T>>_-q-6 zs4%J)5_A%-rGf4-ERC)^(ogy`X7M7(xHie(tKdud6MK8ccko8gF9*FQ@A)^zu|C&e z;N#gI#Ln1M2!B1PzspkZ3PXuo`cL$0S{4la!;fZnSZj0S+5Z&|x4>U0?Mv(;__ol`Vf}bl8Up8Jo60pZlLvgAlUH1_ZWb?z_Hubn882nqH_C0* zyi{dBX@ti%sj!NZ*YBGZfPEQxyU%eAAnJe-(fWek2xuhms=3lK!3E8avWMBGbYnk8 z_@3u8I;?r#^KT}xV-uxWLD%M4h;50odacrgn{HLgE-~}kfmt47&rZ-blZL))(b?e( z-uxq|3-u(QX!F9jw=$BKh?5F17+FWsH)#FDc#0WrM zo=QD7K1Wmv2i-$=U+BRsx7?vGF$BjA_CNlo3oc4W)~Jw|KNnAQ`N&DIBEymOWr&-N8rDznSJ##Tb|c$<%t_x%-qj_!&v)vyaP}{^-I-uYrBr6C8X=w|$3`^6VIc zy&T2>us_I2rS_B4eG51DjBhbq2#x7OaNQ%N0rJ!T)4|7IkY{Y32dToOo+aQy#H%B{ zkuBFoVwllbmq7oGW=3eDG0^b{C?N~2KJx~w>In+0e*(OmtDi=kg&`B37FCQ_j8A6y zW-P78Cge z_`80x5hPw+?4(9zjNztf`#1G!guZxVD7w~P|0QFs?^*QCKeOmp;`hue2=;uMjond}D3{8(jLY#Kj2Qr?*mc&NuKzi%i$c1do_*Gmu0PVLUFNmv z`gC0M-?KYi|8^){zwF@^toNyO{fFoSwdcqqDEA@kXSf$09Q}k{(C+8O(GW7Y+t*V-4-^&D$@2TPAZj(d=Pr?G8M zd-2P9_4o=f2iSEFIrhA0Cfy?!-ELvrFyx zy6u9-C7z1=zTunbIUHSLG;VjP-(~+N_bb)BEB`L<*ym&KUsBV*MCqFdE@-*hJC}~` z*+g7@!*Td_FcUrK=kTRooQ;_;CW_sC*i$x75jP*XO?2&;Cr)`omk(p@{I3LR@@Lii z@^8DEnqTw9)cpPINdBRhUdrF!dn}*e@vW~uEi$%Or2Ejo>*5yY`(nkzr|~S++WXR< z#m_I@V%?}Owc@qy;%oPakCd(y%U|6f>Yr-0vcO>0FuRDA>51tF3 zRa^H^8CR=ePl4gPIu9$H+7XX$mW{sP5^*_jb)%g}aP?Aqak-*x#w*6GzM2;)Z!>%89-N5iJ9Q36XS+7@vqn?L<_OPd3<=&ETryFDNJC*Yiz#CFw=j2J z$rc&A747^`?IrQdNt4^P&GAJpaEl zA0{zhK%EQMg%iPmU_~$@coCeat<7;eKDnz6oP<4EHk8@mJ~Ol9-1mIK+eo~evhR*f>yDNg&P zIxaf3`=8MLxN2+c|CTTP?|06#Qu;5@?r!vn`tlb4q&Pk?4G)n*aH_ z#(JNswL6PZU$i;z645$bz+bFCi`qUFbN$P3RN({|(by6k+w)%>ffvDvV21LnnZ16j zDTj&^-gMT8j}!wxuGt{6-p9rMKWXD0gCUK%)*f|*+GtGGeqs($Ki_!wdusmn{O81O z{pl$t){Qovj;`6i&(ogYEo%9m6gQz>5HMEeIB%uABlBvfx({me3N|SCsCWeULz{P^ zx?3I}lZuU|Quk;zowm0|_guA1m%9JP`a@$yaH9SYE+KgR*h6z_k~I@!$5_3M@BzVf zq-|QOv=)wO+uxPB^2=prS~I;*TvMi&2i})xFZ}lj7@NH!tDyZ*5?x)R`(Y;b!AB1qt>>`$o7xd4%HD`J9K}|`Z*b0Q-9KaPtm$rbnUZ8uk(!NAFZc$ zM+{&5zu6C|z0rM;;Q2p*Wej#yXAE|QM)ij9-@o^@jL9gREHhlGOUwr=8zkGJ( zzy5sr($JqSUijmugP4mWA3Hu%aOF>>JG*^qL4I!RrJf~nS()S0`7A-m)a7SoiTeEP z>?{MmvW@g*qOZ8ztn93KeBGRob@R;=60;^wNaw~45TLiW;Wa%`~s%ObDlRC zOx!=K<$wM@jf>+GbZL4O6%(E?phjR7`pV%D{VkW*8@W7Pnlaiyt!NAV-oy)BV_|_>20l^Az=8=PByH&eOlEpGKDBct&{lLEzzk^q+Cv zq6@S^>^-eVIu~gFX)upurK+VLi~jyF`upQ+{%h$8p9HLo?ZkBiS1+!9Tq1DfPF&r% zPUCzKqs9NHX{jCmJT1~h`}sd>2V^8Mc`vL&MtrUDg8ng_sysHSOrJXRI5-tgklm5l z9R4o+dqKCLU9~p}yC*@KJ=QZBxMr}JBQNQ>47}&|ufvz|SiLq?Z#1f509`KIr+PbN zrDc5NAywB*4-y8tW}4nvgL*%ve8h1>`7VzI`U}rfd+e*@SC7?6i?xgRjiYUjJyi-x zTP-R}zu5W%(p8g(^(?% zzQ7gx=wIO37yEeNyx196$7+teB)*LVgwr~wHmFI9U*nnn`#kI3Q_sv*``Pag*0WUn zPk+9iF)97QJll-&_U)=?t|yQVb^c&qJp-pwCEDohKk@QWb~e6&eU{L`p8BGm31)GkA zG_Vc0yptN(yb$_i(%?;fZTbbzc4joNBYTdr?oWC4;_jnt;F+WBBI^0Y&!AhW=QvKM zXNCj=pUFlS?p>4_pVMfAa2R#q%05!h0{Hy}ekUHSXC7Rw{{|T0YRCPHxb&~qv(31g zevC1Ve)i%2kp&H`XXq#keGBmE+Rt7*hQ1!JXP0r&=jqpQAKcISzK^^=!ZW%~)U%5< z4Q%2924gav7{a}8BdgUXnANQZ3t_?f(vzd?WXa3jgnS^qs z$M>sg=5epG;FY873*D>i2-@Sqec-Q0S?A}NQy&4&myWVN{135LnKXEm*>Q#bi08QI z)Ay&NtRGh@(za82T%M1QvLE~b`Ea%3ofns#(%{;O>j0qfI3mWfU?YJ z6ZMhuIa&dCa8(g9LmltnG{9!pQ6`x1AaIPo0tCm2(^sr>|7f;08?$ger}<{x=B z^Y^IdW9;f!*PYvrGIw4B%YPSZ>_2&RzRGy+YvS3mZ*$DIf@i4@HLw?bs26$PZsu9< ze2%$sKM(EO_d3rclqLT!;DtkV?D%i7JEN~b^pDnK>djaeZ4Jz|4r`*NfmQqjxZ>Ss?n()2?V|aD~`esMk zxee@X{61CLz{1%L>`jcvOw@yzzh97qhh&N?63OH7(DT`UwlKG2U{Sik->TRK7MJMg zNq75H2Q*o29WIhzU4iVaa5*&2n3R4~f&hPQxrniv1Sumd?iwil?{Fs-Ka&_&Q{Ye# zPXsy}YB{43-hJW;7wNtwwX(Gon=@&8Tx*{9vL1RQ_N-d8M)jK#^_8oS`un}8%Gv6& z{}^j;T#d=qt}kefmCx43PnVp*e5n>~)8BNLWWCIdw9OGw+olvg??BtWF%_`{cVxL8 z0e?zoJTy%{d{~o-`%*O<-=vy6@hr7R7->&wv^`P%4d^coD|LMVYR?wcpLu*uqynue zJZ{YXvlf{LC!w{nWh3|Bv}(m@+F0A}_y=uEa-bf9Ospj_U)egeq*ZxBS?sHo9!<2m zH_@0@s$(k6?AN8$2cD3MZ{s2>KYTd370;v49csM9Mr(&Ah)J0g{$dIAS%NOmb;(l6 zWd_oU;rp(&ij;FLgV*+wZ8kDP6Q+Odu(};vJoLWOw?d zxi==1b`~N!H0bm%PLPI(*$H z$E`@kDy+sy#VV|lWG6=3rcZgkT&lgyU?Djja$4)79Hh*d;hlGKM9)V@rWn>-x_+JH zFsBB-E*0L!<#@^3J~>~S@l5=HGu_n2jlyX3E;@cuog>I`(W3BQ?~LgZaY_JsUS81S zb)bzNkS+Jcp>C<~v#E$Ez+Q%50@bd9bVRozZt}aB`-X>hvqb#PeW-6)b3USF+I;Yc zzixGMyWkiee@i>1UC{n$Ii9VPOFka<*`^)|tc2D7c&Vg!IIwnM>m7pRaIo$*1BK&_ zlEcNcGTy6E;&AE;-QfhUL5({#qDO*r-eT<(p?Z*3_59LfrwF^t+|;bvBSco(w;yc7 z95k8>!nxma8eK1|5zFbE7(El&?HfnRLUb?H_PxRGt!2;zGdFulzb5xE<|<7?|WBWOWo_7B?GlqB7n zIIh&YRD>Sy1e~SP(YhJGGK@{5kjJnzRZGC8%nCxvJmBsJXF7-av_Q%>MMd$}{O1`_A ztqz)@>vL<+(ddPaE^_(`an4Ia8EK8Sl)r` zGr*=eeA^vPqy$cfUS#O4Ww5=C#zQbd>vu#)8hWL1Y>b{XJfx3mE|87TM`qfI5V_!a zvhfM7kbI=e5*i;XL9@NSGF++ZS|c@Z*+-L2y`B}>mk?pn+_PnBYubw69@XAN-pIZr zc)$1)tp(_mq)R!Mhr|5%T1A8oO98FLXnoNWd~nTBy&nE}P`eei17AMAvS+2;e|Y6k z{rfAmGGpiI*lbnO(U$Ic&fR)JhuALGJowt6U9gIUzCt~MCeH-)V4UFiP@VDc9c%w` zZ%FGcW*G$yW);T>VtzNZ;!sneZ;a0wySqu#l!AV)BgOZJFTM4{ODA-e)X0x1KEhRk zIP?EXIly?B%cWkQ1@pB)V0QJy4{sFvi2ER_QKLv_PGEpH$Ad3%K2C7zu6d(z31S?O zs4nr8f?DE_Xk3iJ7S#_LwEgw~qlG=cT&7v<5idlwu5fMUg)$wpr-tvWsHG7!sx!vi zs*N1pT6NGjhh}S&y~*sK-ZWId5PS_hM_Yi^n`5v)HCvlQ$WQxW6rXDPY-49-_}OJD zZXNq9Rz|KkW-gPCE%pRzleWjj_(FYVtdH>qppU!8&ejqBg zb-+FoUF4~ZER!;~p!H?Rb{fxE8p-woVEo^w`R~e6_pwy8*)_`1DfL!)Lx}c-al)9| z{qRpg`CvC5k+Z1o<`JjPLMK+T$M%PRE_b z|Fq|-|6auIBb%5#!>cw^yUBL|Y-eDht7%a&wn}fX=DNsE8R=U0e6CoP8sB1HRt%Ev z6uZA~dTh@k-|NOeUN@`)1G1w)59|K9gl|92gzLbSuf;qDY z9Bc*mu@HVGCSzBbhW+rVgNW#>;*T->zK}^jhGHa$j?yK17EWG|9I-x|{kfvs9o|;! z#5zuXU5&AzaL}QDb1|MUaAb{QIPf|khH=Kcar5E6=V4nKcAs3P%@KElTy(}{1l{?u z_jsC}_06%@RZovh4c2X6a{wMMXg7Z?f!?>VT#QR>Eoox~4e+F%`CU^b>sy?A2V3d( zZ@1@(A@jTLF8_cn9Z@xq!?95}w4CxA1JFQ3-<6RuRcSnz-PP0Fg;NE}I2cIwi}5}q z{9fdFL&dB1HSQ~!ZtiujgUWhSfqSqnYOeslJ(~9#x8EL(of1k_;}vm|gBi{0v!O=N zNzwa=|FL~r_O00`q`rNa{3g9WD;KK*eTsV6P}`)@orGgj?SY=PU9b;En~nz7*xl8z zG&`L3K3$-|H_pF0{cGiW5fk8*HdsCWt22gY)V^Vc#`anJ=ALn8 z_!^UJjO+6?_pzy6bJX%bU@c~IdfD~159#58=73{9|Yh^>(NI?)STfXg)8;U&amBEK^B{+?e2AKbnMSOk8Trg2^0pk6A^yT7)1uX1auzwenE+v&-8#`|vz zxDTmO>|bdL+uw!FM>uUg_em?fd-B%EOCfh06 zXC({IsC7z?J357;W31#apE%?R%ei2C(7fFt=Pp87;a^-}!DqB|k5N30|MEF4nN)5m z1aP5wTFHKttj$dF(<#qb#8r8Z7r{#Prn{wFy8S^vi9-IZZz;fw!1lJ;}>iGu#Qx&vXq&QGzU zedUMMamP45NH*{^uJA`OE3#!23n0~=!%m_<8@-+qP>|yBIEqH^vB8t57^*wN=-mNW zkRCHA33k^tbN9hdlF5g{r?;S#f5+T?knq)~3(mx8|7+taLE$dvPU*IY;VpM@fZS6{ zoEM%t1D`qSEJ_RSdewQ!fYjgpz7yU8=j>BGYbjqjmwX*AqJRrlL2wToTQz<#Q?fijr6DP zO;>T^PP4o0T+jBdGtvyK$9J$^-1a{7G_&CL4%a*E-J&X2Njzjr#ZPcHn>Lr*VDo2X ziY~y%4%$}b_XXqyP+|7?55?AnuKiG46>tF|+ zYa*-UlHc%{izX!jp3k1EcPgo{6ce?#Ca=du@2k8aNolfoN?hIo_k1>Q;ry*)NtzOu z>)PTCKT^lx)KKzmUh&H_DhzhN62D)}b-@ovTF+YMKfG3%WuC9BvOk5B;IQBvPAP?- zw~NE_Y{=7KGvR0zz;RLv;FIxc_~#v5Zm+!jC%lqrU;fkgi;`i*aF?9>HSl0wzP}G% zgb-&=wdsm9$+>emoDI{kXa2m|8STwVt+gdab9?+WX>HyDcu9;8Ph92fX}9~OHgg=U z8k*T=_>p~^e27XY(};6gxr>jkw$g6K7SNgt#A~AoudLs|tU(V6%F3##Pr5vLa8?M~RG#H;lDo^NpBz#=E=KfRudwy&Am*N8K74BD^-jQST+ zplAKQByh#dXYpl)Z@n3I!ZA#QoxcTpwSg?T)V=Pay|?d&gAbTtY3XTyDTui3oO@Ql zZRQKS19QeNF$LOdgH2|8Vuk7U;}c}vCY{{&yso=JvhB!P!R{EiDV>!L*e*{;bh2VO zXOrRiLb+s%!D3KT7CoE9=+x_1;j?C8m`k z@Vyns46%F1xJ!Cdws2V`S3OqN`}Ht+vaPSV8pNP}@P+1rMz#$dc2RaFyO#4(EL*)_7dJ`h;j4xo|mG zjemDzWldZ8iI_CSFGg-T&>u3`+wCu3c(I7<>s-~Nl+3LUEWglH%P!;}tVan+wwb>x z^4D%EY-t->BYUtK5h?HL@EInjYb*0_!*cO@9+taYj8CJ{X668`9dV~AaF)*vXdWJ1 zF51%r*wa1W#l+4A?$sYb)|fH=+U=+ycIZBLnnslzU=T>1o8LkX*+S7 zQk+9R3z`raLuXW_(RhP%NFwIbTTG}Ke4c!92Og9359_7EQYP6_8R9TbrPigSs=P+c zK8adepH|oX?MhYZU+Xjl#*d*?wKLv?i;7EWAfBn+1?w!%9nbtdgOam%SoI3$RQudu zUK}5%h#%fd9=`?_!(XXmo~{;Fx7}F1W6KnZextt}ClpTpd~qGcTqQ5B=5_JlNP+)d z3!GsTQs?R5rPOGb!l%648LTmS5^k>rcZ^m=`07h4T}<|X!2e$53A=ajf?TWDo1Z?N zBEN7SgLTpUhiVFlde!&r9Qy7ViXXgqJMDC~O@>3oQsItN+82ga9%`LqlVCR$SxzU2 zf%tT*`Drcfz|QnZ*vZncr#TOK<^Y>wA8B~EW@v$w**#neJ}bvSN1EWR^0|ZRZjTv` zQ)iFQ ziA?G6DtGz6f1+DS=)>vgNUG|i$#3*#bSnnXQF@hnaw=`Ub$C)D%+Qg2G%Uu4eg~bB zWy(yuU8vb+39LA`FR*4{ckx0&OwD7!%y+3u8_?W1C zUCFo46TkW864rR{xNZq+;8!(o!Ta|aU1vTwc1vHoI4rfH^#h72&lT$2@`$i|c-Ui7 z;_Ti+M0)u}d>}}3m+`{xl)MsShFA49o)URQ*sTYD9{+1`_S6Y{YMwGnD17SH00+qO zPr3rz?|4-yf%lnp{`*tR{`>nTO*dz7{#&=W!h7mC|NUnBpibJ-rlH9p-gC;_6A>@W1pJy9N9 zex+WU5m)LiZdC-cPu^V%PdJcjJnQA8S(rUjh~L@KVD7W~OX~?ritF_2!C9p?#cl?t z$im3eqDilq&0_feI;5Ag^!h7v3hq160B@2L%`4D@S-`XRNw&oJ6LZv_m?Ma4>*a(a zj6FGr=-!f>pR_5?M>X$~MomAHF8>Or*Sv*d@34C9E^ zm%~m3LM7!k7TaZysBa)G|aCzGVs;?uU)i{^Qzix!>Bjr@< z+F!@PPBA@!CEoR9)?-!j z-`Z?uZ%cQI%)CzFs;5cQTRDt$=*u0<*;I&QeC0J!vM{7^{*8-5#Sxxy1ID{bIQA z_FDB!MSWds_jbJ{RZQ{w^MeNYp~qW zsM zPIi5@BU_b0DejG%-&D-O?$hb8cFy$Yp2$|FoIa#Tc6;B3=Acq+s87Wen5WhAb;*rlI9cl15|-6t!&`c^UsZEgUhZ| z0Pn0zXUMO5pl$S?hhlW~JgM;X@D+IH`3(oWZK^8s7^K&FxyG`PPI}FygEuVKU}rVx zPiPfbT6w7u8U+EVI0>8qL=4E>R4A1^^A)7pJp92XW)&-CAfB$Bjeb+6&&{34|7JR22%sOEk$_1Y1;7y#r z6nBs>H4^<&RTui&8J0mjj9HC!Aww?Cvv_aZ>J2&J&pGuz9%tYR;GO_*8fHfuzpg

oIctDad(iL3Aef2ggiR(W;bG5Po@u4{33^JD9}+As(6i36pbIXKp{D6+gDPI0{O z@NQP1a@+#Vhu02v675XBf;$>|7GW)bGrgBf$_H1}o77}vucZBoGBRs;4T0zt_#b~ zjNy+f^JG1GiE=?>uRfPukR6#K#W8*Ovd4K0J8K&M=+X-hYQbHG2Tf6l5{b6ln67*+1c&3nh0 zXSM(%rYtL(AeB|JD;wpM-!R$m8m~-B^vO9N=nr^3ZP?ch-_}PeXs-TD5AIaX7JY6& znI+HpkW-T6)LC)stQy53i(iWy?T0F-&+WNiD0UGp`HB=*qxOb4KC*42%AHBYsROe{ z2xmfCT%CxhDvv_zNu^X{W#jo90& z^T9`(fVtuV6tQaI)xQ3eSkMG-M2Wztdd%{YJiU2h%S3pwm|0{}Oj4%HpcI7Xt#;NL zAx+7U%HdlB5ZKF3VE&v0Tz`f*Dx36qh?G{vm6$+l8h)nF!Cc*%SJaXHsl0)%ZHVZ$rRuN0l^Rngg_p zWABlTioGjQQTYJaVL9fnu`315FDi-A-F5@*wnkS+xl*1dLO&o8mR+6F9Fc)bUJp-Q zcDZmGsEF3G6>VQT_ z(wUv5n78zfQ&h!j9)I`ULT;Wm2-7s-)QdU@Kzl|(u9 zpvrCKn3N*wq_1D3c{5R}#NMB-rXbw`q(ol}e%dUjfWwz+OnpA}ib#54@?^9?FI9?k zj;HdXspFT?XrPBUl|!mUS_jA-KT+$qJb4jxaC+jfFF{|8;3h5X<`wBe5M08}C7`o{ zUhx01tC@R9pW#$luGe?xo@8w_)qQG6sVTK0xG`KyT`5y$9ogajRPlHHi`%EtNM7Z+ z=DyAQl_~LWE3;aYFn)9TS~}`d>lLYMA>wWvD`NvwL+QlX3p``LDCcGCPn650W%?`i za^6v0=^Vx01J6?M0M>ZSIZ6>qzZBWII&~erDjat)Wh&-yj*_pAwDnShIRPZKW%u?js2*ePo)?10x(_7>tZTG*K!rP+N~ zVgX^_wWjdu3HMcJ()snKJLt+O!6gUZ2clUp%KEKGkHl)qDQqBxb5V|9wOQnSBy`jq}Y( z?A%FtLT!{24e3>2x8A&d=|(v_-cSwBO6arQ6KUL(N#HZ|nLFX<#Ny>*{To^t>>O+{ zLh_P|I6SEDxA5l=svn-^=a|=nGgEy0w|@r_cpN>KrC66{4Oq|n;?>@U;xjhNKCBEi zj@E|{Z#sthRus6E@|?hl0Qn@E*4O+H_%M2ck>>$|P)Nu?%VVp_1iK5&Kb4x%MzZ-q zw0?zT>SZ|3MJ04db@w@|?5yS2)yd8~`K4uYVZ1?^lN0C&5JzVzN=!1C*MCABHehS_ z6Ksvy-@FF3B`U&WRp=Ai^x^kP(I!X{`!KgM!;v*k&01g zlDqN`Dj)EVO-8Iy#h)@0eXyF>cYPy%HToxHC_{Zq(Ib`1V5o#2OYA!Ek#~thUuI;R z>@DP*1svKLUGb&$7@=Js5AW^+-ypiW83U&ZQWu{?)pa0kwJ#)HSKt!x1V| z9B_fgD^}czxJ#v+a`7pBW5aR%iUztH<+W0Mq;;lBoZnZaNddb}5l7_zKh_A1CsPT->+#FdUr@hV(*-~0B@&4+eiXN}J(q|%a!bXan3C-M9 zkvS~crE4e@dK$I{X6Q;-g7+i%Aw+s|2q8N4-7zj&LhW|a0GHF zDBUYb@sB8RU9(lridVTwmGIrH6a<^xtFdk-DVZk7mdW!Q&YU=%Kso>|H1P1#RUZB? zEZo)rxViPc6>UtYcZ_?|B^Pc+M6fDvNxU%t4&QQFw^0YmkXKwve9)_ws#B&6&8L`7 zO2WIC1%%OtmY;J4n^2=^;QJ+pA)H5Ez6aU_-j^Rj?=sN0tX%Iqdgw>9c!SOHyzO^| z8P=FYacKD=PZzYKLptQ;BV9(<>U)*19b8lD#ro5Oo?|<1{t~~7Vx#QUBG8;boQ0Dd zB-+o^{78ON;c9Gszm_-uoLjw4)?*i)82;-jr>uwHYD6=!>QUkn*;%0Pz|08E(YU#) zJh@nvCs$opp4|R-^5mO@RLGOZL7uD^^eiROr%II(dBRsDiNQET!hlcqm=xJpw5}n! zNj6R}TmsJuPocw(zb!)vTKEuZjBr7JuHUW(|;vVSv|O*0qi zn%5z3%BkflU&ZdT7#b7(zM^;HB(ZTg&^%x{n|N)$$U^XmlH3m+G%Kk&QLX2f-I#+H z*Kvqb53hH5%#%QR1lYxp*JwqZF^QppB!KyW{iN;&|1uJX5U3M>!$`~0#EG_QJ^iZoGdnG!@J>m7zvX_G2_99rb`FO}1r zDsANg|3ES1iU+I1VlQc4exdo-gdE{7N;hc zF7~`2KdNxjOklpbw3`Kkt+{<~;Y2z6`#5dNCDRb=%gOnhO6!JJ2bZg3h4{38;`2bm zNR#0sFB{xlQ-(GC$SN+Q?h4^vC#aY7Z|mjk59pKy-}E?T;mH<#hV@XT$rT#klcP~# z>PaWQz*hwwXW))I!NqC6(59B=Ud`>sSu>paBd0tACo(TqJYXhI_*z_>5v|3_4$M90 zz0gi2;~a@J&@)cIO5Oy4@#Gm_i(93hr`I$Q^l1zZVhq-K56+-bkYCQkrmO=6tbPujtxBkK^rI_Sh zw3`#xJF?2|iKQ_6?b!FoTdVt<{va^M1cC)l4wWPJ7-ccJDRiKE;XN@Gdeyf76>yjN zw*ha8ij7k5aYbR1y611w>|Rje_k2z%qHlHdmd=yWGo?=P+P!@jdR}%Uz58TvwY+<; zra1>~DcSU?VO7UKaj^x`y5g`?*iBeR*sX(Bl3c3kBw6&8SU;~N?A9U8y08;k&=Voq zDhvmYsAmJrJ44UE3Ffznn`sdUZ)9axT2!cDR> zz(H<%)6%R@h`&1Nm~c?lZR=&GCOSn!QiC(qCF1a?C+64*Dz_J@b+r?Xz0wbZGtZTg zMpLL-nj3(=BAtX|^fqE>>qn_?XkxPyWswHLXwXp4B;72~?Pj zwM>t$(Hpv1J@o=sB0J?GXla;PJ1vyD)IQR=FIzqL;T#FPtMTm@C_+417D_%>7ioBl zEP(9WDRzVkA)_m-Z{pCOo1<{Z9Mk@E<*Vq~IHT*Fm{ftC&-Nh~Up%dNzbnZ@Bl~-U zTr!(GqXP}(Y>q<>i3IZ~CO>^gEpq80H5q+Y>37mIa5b}#H)l3?&KnQOdnipYEd_1* z=#(h8hm)p)-Y=)V;zXD>G`#z_x#E+UWk#@*w_xnEW%8*3t8cD1v)ogA| z^9dzMETwS;=PwK+RtQQn9|7(@nt-0_vC5VoUjNAkz!A~G!&e)ewIGmu-F{^*Hb!xJ=NpU7&P= zH|IZ5hq}QFQiN2WRCs4pdS1$U*3;U8<%{ls%L6TXS@{BEpf(#{9 z-H)t9CrsA@#Cwjur&!U%enRySbt=!Bg( znZm~FxK=N`V5_}?R^!mL3|Hh1Gvcqpdn%`7Bo0b>c?-f{0J_?&GtmAjr|;Kglq-dp zN$Zpc4qi3&ht^~;NHSO9oMTYz_IVxU@{Ec&$>w76H&1dyzg29id=@%*Q|;hEWf5&* z0!F#xXIFX=n>MrgoT)dIffLsFrEdhm!wrpduN`WkogMq*DrHurS#m-*r(;K<+)~Gq z-o}YYOv;aMLQkE_s)Ao$ISI|k(yHDP%o=$)G$Ut#wjnN_Z8wu!e#4a9sBYxb$^-t} zs*S+tQw9@Ni9Bp6j4n-cQPpy&U;4(v`^IwJLGR7}I+q7|3XP`#Uua~V13qrL5(lot z+g(oLapHY~k{@iMbtmU6;wsg32WmkNNP~ihcUP5)R`t44K=}lqb^Sqb?e;&`td;kx zr>$e)L7OO^I55~an_i93;i6}%#x8#QR;!vP9Q1cJtzGAsQ&uX@vE!h%>r}ON3qZ^3 zwJ`^b5P9J5wRYw47HIGN_ZqulX>pX}7aF5iaIIc4R`-l)Tx0)nM^%65Ch1nJ`>zBH z@YGv)R5!HR?DemyzGbL@`VkDu@Gp(HT0UPTJVf6`&&+-$u2MXs({yhe`$Jd}gELi| zw(_MMd=t+Ep7A$8%kblV_-poF=qv*DjItI{&h1l3w-h{&5gl6SWP5vd1Xpi=?-UE~ z0!>p~Kx32K*n8Zpow(fVdk|lu0$iQ&ckklBxif^{(DaajITNd}D~(x)hVcI5Dpg41 z2Fl50-#((hUl8z{2ZINrJYZv3SmiXg5zbCzDQ(-=SE-SjjvFGYP`{&=-wOH0R&RRR z0dJ_F78YGGi{8;YP*go(CunqI_)Me_!yHe>kKA37mhy$2S7#&G^UM8zA!GmknC zK7>=CS})PlDt!li{@C7QZ|yq_*roL?!~QcL(NXkRU#SI&#M4%FeW9VLIJy$&X#YV~ zyywGP6~mT-;>Rwv3cD1%yr^>)aVBG0TF}V+sr!~v@$~c_#O>I{H2nhNSqi5`CVUWZ zDbERkiA>lC-TL0|GT|hCkKD${LJ z<0DS%uuL^SK$-(74}g~yP&$*Pk<`z&al0P36sR@2P$M)AnM=t}Zp!GdmPnFwrA&VK zH?T39KS*VyJg@@#JpL)PGe_H&qkM%p7%B}gd8AylPMeE@18qckf7iwS+5B57abDi!1m0A0ldeSHO}f6;q5q&qS>x9ZCXMbz*Xb(8@SPN**MBPlds}I##}K z#;#4rCa6#nkq_FMOr&1z+L6)!jtZv^z-cew^wYtjbTyqYc5jo4^+b=uZWYun>LH7v z3~%$Gk^$ZbcJ_@d!?n7JAh2s|Q7TgFBQ3^!>T8B;dy~?Z(|@I(PM8_uj*4AdEXh)F zHnkrXgwav|`464SeRAp1gk2l4n!Tf=Wb6k8+4fq(NB64zi>0So(xJ2o?HGZ6IuTDR z1s6XKHK(H7Tn#QJg0KS+K~GWQ{r=l%+>I`x!Cy;=j_-9!gfDgQ#iy0-+SaB+iQJbU z!GGz$NUI{+kA2IXyS9T~*!u(&;QhZB?j;^5v>7ejsd<7G zRy4q`S7C2Mwo{N5@V+bwu^*+P9X$C1P@vl}JX^}z!JmR{q6zkqB!AL!&4%=;2Qme+ z)dAkdTi8Kfgw8dBOG{S7Uso-XlHJ5pz?(qK5{RsO$P#E>J=Kc+0`rqR*kdL`-`Wj( z1(jor$Z`8r%TtwWi&*n=HaN>Tf2w+JX|b8_w?(qwX{>@ZVC;!99*{~voP+4v0M~uu zPvDcIo0rmEdL<{kz6rePuX6>3QnptY{Fy$eA8nMQZd=|=aIe&ct}Z*E>wDxe8%2a-pCbKmtcR6=|R^7H?Ls+8HAP0t#bM? zU7{J59aixF8ZWd-h5gXQKcI*8#zfLamUKI^ViwY7`wEvfL!)rg;t#;W)d%|`im9UU z=ae+E`~$3auEL2HdJ*3&pEAVY3Vm1?V$QMsBsw)oKjN4liNC`OfX& zIFOYt(Xv-W!sI)aR4GWCWB~6})tgzpM2(@O!RDeC7Ye%Mg=1O;3m{-~Q@H;9Wr_TmVr?^NCBe#r0lo*Zq&J>ubLQ+-gH7qSWV~K)bO|ERsOP#jjN?IWbQ1qTKFd zTzr{SC^C#NH|iNAX_2wpjl7KOx?iy^SNSKA7r>cNJsqgg&D51o9(rzkZb0A$1a3g! z1_W+E;06S4K;Q-hZb0A$1a3g!1_W+E;06S4K;Q-hZb0A$1a3g!1_W+E;Qw0?n9xcx z7&Gj&p(nsL48ym1%5(79+cJCr`ZJ{C^V}kVtr;Gw$nmDME1LhZkvxuAp7iHhArVQD zU^SJs7Iz6!A?2hzZx)g#7T930_F+vnBIuHN&pq^gcD$gA<2}{%eKt8rU zrwG1w&Ag{f&?WJq`L%fWIPb}&Z%Vg~_e>CU+xd_Sb_cqhyys>?_XHoBbx9|%!CHZ{ z=r2K1HK5+r;_fr`?wCPfsUCW3!Ck(3*QOVkOT9aTyvx+PBHXpAce|mvutB}M1W8v= zy{pCD)9M{;RalRDM{*_TC(p^K6W9a8DRKLIQ%*xGluI$geloKPS{{v}#|S&l=_&bJ ztQH-<%Tj6}%bsF9nbLPjkN>dM!T&6yHN{T7STTH{J0u*ihV-Wpzx@o4{Q4?uD8&K| zoRs{?8Y8^MDqI^^*_-lqq>*acjn+Ic4BckcyKrQVu`Z=a&^^m}Ceim<{eiep9NMls z#d(qiU63bP-UGuH9v-OJ3U7+fST{7!!fnC7{rHFc^(nBzR%M6Kr<4jW4sUXHH^UOj zZ1e`$F=$V7Y;RePHzS~A4-~flCBqvqM|CJMKQi_Tb5PS{VGe2QST7RuhwQXr+= zSu0pA`jiT^y$>xUHhY<&fQf{Ljj= zN6U)4ZdoHw$CQPUApLx=RQS+Uc!{xSp6sDL1?FbQFI*$@tZigx69mV1IM};d-k3-qZN8EB*kM0}-?RBxk&f@_OgfLv zq@(ozqI-*{m{iZ`KITIcEjq#Rysk%D5k>_6NN&A6g-J_W8xg6&7 z9M!VxFAS)qWo%xaD?kmVYFSEa+I~Rl+vvk_F2%_VWsfUE3KnJB;P5 zT+QgS_94oW!T(X*P=LtJ!TeEH?ki`5h$JidGF0nUyj|;`iLb@mtwD>@p38n&7kDva zKh+T)2z)pEB4S?!w!S1EGO}C7GakO*c3?$L0u9)0X*p9UQr_ooff(zyn9E&pS5SKQ z6~yWLmA-yb{wNev?qeRn%lxuq0 zh~~L{(&lCPuKFS0vU*oNFanW+tOR&Eelut@$o}U3~w~O`Ez^5W}3f?wy{Xsoy z@48WVC)s-B-2OIsF=}#6xdK~<)as{r70YsM5R_;MJ1ME<;rO4_o8qnc|IF)6jY?fk z_PYmb52EiXFDz;0X5tJwXHS`RuPwrKg6g(|PIusr4u9LokJ)RgT(fSwPNOMh1XS~C zTH5=CQ8RZ&hQHonD@y*7Yf!^ly5*y7glO}7Y59e(6V3l2jFnFcj~Z-+lgxGmbu4|Q zgPW&|73rW6?S906J2k#^zIS0<8>?9~C%txRT~(rW?-xWDrN84#dNKEji5%Dy-h~9j2?#&*YAL8kjjo!rO-uQsP z6i=Pm^rrAZS|g%1oK5S*(^w|Gd1UTQt6Z~RJUKGx&C7Fd*27a(JPk_p=BIOSa5jA? zo+i!WI}fG4vs|vJ7f*F2dec7lCQq*E7f+)GdhW`R^p(iDxb>SlJ7|b@7=brb|S&d>WLslaNY~ zEb^ZJ7(8nYUyev)EOOFZXJ!5s+Q#*4OIPqNr%y;74F$z#)+5gA5{mfAcE%g7BPw{O z!8Wj>NU5tbm z+0{8aCfN`ZC|B>{y33zhad;?T?d%XK{el#vTY&H0B?6d{h7kH7qXR0~6Dde;F+5DjZdkQ=@IFwVV`(1#k`<=3F zf=OY;^ZX|vAnS%)KuLZ5bcf>l0MY8t=JAs4j~_va)EXc!_9jr*9m<*seGPm>qjf1U z|3IQ{e3V^-7XZ%keBx*kMHKBtTkomifi#20JPqcQLTEnj8As_rd zmn8DkpQb!Gjs12)>uCi$iz)BEos?6;eFuY(4RGHE!(0gT8u&rt3w)T3GZaM+YZxc` zb4)piHaXE_(IUiMJey7T=cK1NvYGNYGlYCf!}A|0uY5r73lOPM>?3e_UTx#E`si&B z`4COZmntu2GUmu+A>RzMI90wuE43~Ssq9%qNvyqz{4`hNKB^VtSjr_tDZ%Y}=uNU8@J^)KPqSeDAFX|5 zsxCENR$rcI!$;JHdG!_Q^_^is#~-V&0GbECkk?bZ4}3+SjajR;UvX;eoKwjUtl?{D z#egS7Ud;MZt^SHLyvXTeh)FVun2PY~ufOJecez$}#W`K%^sO1t>d!f8|2SQNK6(e4 zoN%w?3qQ+G3cT$Rq9x!ER_nDVs6>T40C^IpknO<8m(Z&s#P(g+(<-~ViH0~SRgr+u zOr%R{+*klfagO6YXXg^4!6HAXhau%xY$Do>8=S(PHhgnSbuZR@OaH^shuSKl)%{DO zS*{GMrcW!D36t>cH94&BEwBEX@)Z@)Qse+mMN9u@M%GsE4FAe{Bj{=?IO?K&D6gU$fQNtLy`v20m;T|w-7@t1+dS1T zx2K`*T*a1U(4u6*ht^cK zta_c^BhPcZu>WZE&-!z#*R?&8NE@`By!DCgr(^&5eyoC_ZT->>evMD@aUSC5=e4s9 z?Oa#=?dZjd8)J8DE1y6+FFUN%&gexx`3G`cqFiI-qiZZ%2F~NIv=$d8+ZuH6s{Sv^ zVIY#f7CkZ7Vx@*S{_O{koVA^t{t9_I+I|Y%$c5-Hxf0#OmqknYs_1>n23;;VGOA=Q z5t1=hP|`mSF$USg^CFkN(ZPKzAC#|*JgC{y1l_Cw)!eSEVFoFnG(Z0_ognVO z)S;mOoqO01R&EKorUYtOV1@NPMt6{4{qXJt<=+M>tDkS{Xdh#3j21AW`myZ=@E8T< z?$sK1El0%5ljy;Vj15+Wd}ltZY|3Th0g8D)b&Ik36ZPt?JDbaJ(mfpt zhjD`n$#;LS-otk29@fCyhVnRlBugy({@#3ie|r|Zhqie_zQDasF9IGyy{w0pKSjh8pj}RmrGyc3w!B66!1Isuo^vF z^8=l08p0_^XJH*82BwcTxGG=B6=?H@1N&$_jjMEHVeIPvnw1#zX*hYtSg+u?AD;zR zC_Fn!&xEy3JZdwd z5iwt&L*QrlsB$6zKOy<>$Frm#Qho+`;B9ymT*63xhq197e7BJHIQTxX{{6eXU1z?U z;ANKa>LfpS`?E^fZ8oI7`#7QnfYU}aD2o@-XOFAFE$|^TMt7qoJ-=ShX1;sx0u&kR6Ev^_Cr+c0Ou_ckW_U#+~#OgMQ>{BoW7%s0x3f791W zf`%s9z04np9S#OQLc@ z>fKh*OS18HhUo4o;A-TJ)V5G4X znww;;z3p`tZOOSJt>TJaBmRH;GZ&tbTqUbH;@5eKxP7GY>f@2iw=e?mR!Zq?ZBKE# zQZQkXntK|jP11_Jjoco2Xu3m4SmvaCfYvM8mOJ8$KGpUmcntpCY%Ome+0W$a)roUy z39a2e=3+ALZmmX^jguBkc_n2^F?Eb z-2ocAXT~?il#Af9U#US#ygq*-wFWF{v6&2rPeE(3S$TZIh&Vds&wqmZX4f#Iz8X_J z@2*fYdk(%*#ZFL*YsLJi^0;brWV@Odp@;g_vH-h zZjWr;eYxajUr=!vZ|?T2mFq%?pL1<@uzu96)gLO}=bP!$*8H4xTEtV=IG)~QgZjJf zAv~RCqbBhVaq+b^hv-&5D%S(ODEy=*;mwYxo#S|FVz-!h>K(#U3De4s7HjqK;&S*Y z-YgDvV=tTsr;weTbMWIdhcCka?TGW2$~M&?B-D?<(d;LlVS?#YDK!pvyKi7l@_7Zg z0Q8vB2S_HkE2PFN>z&F*?2^*wKSUnLBQ-?RNZ*l7^LCzYkfO4ck?7YtrY)E|A-N*< zoQV7co@hYq$R^%Rat%c_dj1nP=sMLEAX({osgCDPFPc(U6ll`ti$lIGsFOXj5^*IF zS)lRr#n50R?@orkfVXQk=bV}vcUB<28c`c=LQJ1EbG2cgwzT{TAq|%0e8HSEc-O{B1gbmMB#Vpik-nd9-}VkSUwf{%$aY!&84KLMKMFus49F;M5e1ubyvX$#s=ok~q_MG3Sm;Z)t21@r)M zL8(rZPivbWHYUFQ#6x`hm{D%;obAM4|LiS;+}=GqYEa(5dZJS{)xv_WJ3iqS$ezjb zoZ>s41n>G5@5I>V!2{G4`-Ppx_I3RA#lZ1VpA#dz$<8pUI6YBsL*#YR>c!3?-b$gZ zC*Bb2z^|e+&^Pl!d(UyzBVAKH=9?--S`nHDl*BkE&imLeZHU?3!erlpS$V9P#ZKk0 zIc~=`!n3(@q55izToX=eLf`3qhj>dwlV1<}>sIK3RuQGAuM-8bBZ_Y>i1bQmK#t?s!_TTx880gZ46d@@*V9Ts&#!RO#Osp+j)##ubbCTL~6NE zHLsro)K3q%TiguSA6N-r&w0J%m1*+#+g7GstYq4zcoxqAe}~BY+y@)ujdW`Y-YghP zvZ#QPF8J~-qwMRP9mQY&Y#si3W=DT3hq0P5!iljxIWsGT`7^wHa)wLED3(GOOWLOG z(7Iu@==$F|O(}N?O@@lwA)x^lx;KY@N34AS>oXrZ2e-bO{FyfYE?)ys3WKwQ4E#;H zUe=V*%Wel9aC!U~qkYhH59s;~?2xButqZ;4x*rgq%hEHg=_cGU_zI ztEZ9A>fDa^x200kcV$y5HGKy*rcz<&Nzsv2snqnZ35f-J*utc=ywH@1oo!*H6BN{m zgX4|Y6lC2J=l`V8H4ftM)6jmWbSxV&9s$H9kGg%@#dC(xFR^B$SnqdZ_r8?H=)?ya zBqc%EaGT4^;MQraO(d}gpklG^OzgZljZOG-?=4@WSgV!sjPEj`I`Ot*znc+gHyV zpCE+8Yv;DS>B(q4z3WYn<+U@FZ+eWqVdV=dFb_%D5Y!T})p$90*QCr*WzXnskJ=>{ zPJe0{urGTNYGQ3QqCpw#Z5@a0Y^W{CTGc4^Q1pwN z6Y&m#`ytsPig;wlHq*D>zGQzV;Sc|Tc(;$v7SA%+yKV^dA0+mYAtSKKn#79H>b*rC;?d0 zYb#ns&53$N%!jqdz!xERS{iuqji>$-=jPLpfbAa`)wF0j2&V8{RN{4;xW_){aW%1n3pylNy!0gpw)@A*42;2opw1UnFs4woKI(Zd64R58V4-9A- zp2`o=6C`tSZVo>{Pd?BKk@J2$6-}7<`u>OLnHTj}1nAyTb}B2SlcPIK5i<+i!ddN& zVT1RVx}LB0Af%x@^g37B5HQ+%WY#zF5(n*>UZ(kIM^2k)ozNWy@`yUawvE3BfWAuJ z9ZK;C^(YK(AEIq<=6St7W$n*kb=TKybeL9X$pEch+DT$f5uf`ak0K_CVa7Fgf@6Op zCcDlh{3yu{P4vQ62I_ry5vVt)=2}oqMAW(>f%}k&L+fdD1GOMddfUR%V@3Sl>7D#< z_?P%|oq425JZ4;&hX6jc>5=5>J=r^ewF^Bpa@!D}l{E5US;abT!a5$%>Uu;}(&44(rwL~{ zxP$`9wjX1bc|mcQv^UNffC^~AxI`Ux%8#Do1cD|(kPLpg3um;mn*eiC5y-XM{@GmCC{17k?d|lun zT62Lj3w9;!ErGiU2PfSA1?aWV`nV4M6|G~LqcydbRZ^>^N+3vkk&iJNMH$h+x+bRAx_~J7_P_&R#T(?9*Y-4u`WD~@KdH$oh znHg~j4iYzkW1S(Qqp+Tw1wVWeBSjK}uyn|b8T7I6C)cm97qlw2J%bTfgA<&1EO77i zTk=KzvIm$MMo7p9!Tb%-*?kyR2Nu-q}Jq)L`yh3ayxAdz@Xwn~z!fQd^G`5p?5g>+K2tcfq&i_5-tZ;O6mV-xP2P-llOC z)GO`F7ZkJ{lu4`-Dg7&BIE8*cm2}Y1DM-3bLGQgeqe6^Ail&?dr@I|D)nLqUcZ(~w zB8S;}Dt)nE!Qu*C17vz*P6K)R%Jwh}LVO)+!OgQtHT=(X9&MHpqomyUN{#+^B5{+XGEn7DZXb(M$5 zGG^2$v;_e+Gf}Q8zS~y!#MA_DbWWUYoB;}>ixCy6wcfN}ejoGzvQd1=|L&UyW=GM# z0CSg2nZr?^Ufg{ARWTdGh$W=u_#^Sy>@? z4DfV4jqg1@ZDE7dCTLM`k4u^i{2Trb@!=f!*H|7-D(J5q?6?{mcR(A6nd|_)1Aikk zi&0x_Hq&hWG`W^8360X>JVxusVgz6O{uua8&50IHYF&-Q~Dfs-CZsR@| zti2Q|XdQc=%QRXT!sM{qVXZ{dB5Ci*8pX=*I8$L8oTFKO%|zwuLPs zEt(^X--~Z1Bp;qLoTV(!r5gcBYSHP_@0CL?=raZkUSW;qgsj=oo)c!p6%93qQS6w*LYt0rY@{31I3MR3kYun1`(}LZF1~|zCiOi@`>FDZ zig<0jAo3|_NdsJHf#P=Tdtv+hA-nKt@~){)>X%%~W?Qae|Hfm}rrwi?0iW^SM(Qtm zo55FhWwD=@hvD<|(_0MVV!!a|NXyqd92t;z;l+a)*5$u;;LwcFdKZZ?Q2Ei}0RR5* z_u_wZTS}H0HA8|cO00nmnAha$=mUO{T6}`9JcND1?7Zp_xG-8P?4O12&+TL#`~l3L ziup62%1P>YV6!A_&|%&=)dY$DQ^M}IiZ=nThdV3ZeWm;cB>d9M1MragLZ=z}2eVGw zFcU=Ee6GuJ&ut_35dUor-*)0AEhRzs)}bvTQYaBk8wQU{`KrMyl}?9zMsF;d_Vg z!5aFKviF1BV_{hQ7ef{nQj}u-#$)W{mT=HGeE+*|?EKlyH-fkLN^o*pLq6_^H#L~$ zz=7G$3}vsnSUGsfj=9(v$Q$x0t=s696S7R`Gx5DwZ+Ow8_zsk(^d&m~2X6K&d_4o7 z*$yo^&Dn4pFJeIRO{8=fkk7II135{32kvp&t>?Lsnbd6XVV-enTVhUYptai+JwZCf z$eHg^G=K0Ni2PnhHnhl@$y)5%r0uB&))8p=1QHjgVJCdre)yy#r&=V&6#14VsSJNCB5ZHhf?i^xRqR`SuP-J5CH-$d$T47dpqX zWcEQ?$#GE$u33e&|Xl!u?%kXd66*R+(kgRF! zACI@!e>R?3{}}()xiFv0k5<>D=MRMc#rk*Gw<-?=NHdqO^S1eP9JbblCFV*P3G6!2i_QZPC57c+i6avt)!m>XY6;F z^mX4u8dX?e=B?gLrNIUppK1>51}^cF!Hn{-vSr!lfS`Pj;^nRrZEkH!tX_-kYuP4u zf%C?@_TPJ_iFb&Geo$`e1)6*kxF4xmFMIUZ^dhBU3ff%a`H^F7FEq2u?vA{LQ@~Ij zwhcsk+G?z>;7w>Dg%^at@sU2H8zV)xVbk7Kdp04euaF*&AG>Wlc1$U&F}e-_lhr`$ zSzm2v?_XoJ;ki$=@x9cuzPc(>&-=yuUP#rHUwpyU1I;5)@37^#9!%DAK;%0n^1(Y# z$7leDG{it}qx=ZTrjV`F_=B`{&xAmV{L3pH;|%M$Cx0HV`kp=H zx(YtkoYcGf2;UMr1DOe&?0e<~ZwG*1Ar2AzOM0o^fjS_cy(L$-5uL-W$4qPeH%Lm( zlB+Eu1@e#P#67f_H+>zp>V3vqpZ6@ix5nENsri9ut4HTXC28Kb#P`9a+$w;iMROAF zIg6;S^lPGr)3>opmQAmyV7$F&JN6nZ5|CzB&*QRy%Svy*Ug!KYF@i^)|HzBDJ%8*2dtfd&M;+nzCp*B9M^ugvFq|3I75zbWTp&Rnqietr0B{666S29kVF z{7AjbaVH0jGb|J7vr{Z&bnry!sX}_feQ1tsSYMauC($1$Uv+M!=vQf?U#o}jPV~%W zRSR+wr54mbirbLTR|{`r-M}d3690v^EyyMKnffs!U&i1qr=OvB&N<~99_8zSnP-sX zlNj9GQ=doycfd&q*yn%H0UsG?ss%q{0w!aCY**Te9{5!DY$tt&ZEMoo;sf$U5new* zCn4kG4MB%<2Q=Z<6f*V~!Y3#Lx~Y}+z7X)b+yn|n$PaT0pMvi@54i&s0epY@ujjsx zc+Ondo87)vm$1TD{5Rq$%WU=V>2y`XE8Nz;;#nDYAqOq&*{XgZX7X$UXMhC@F2-9s zJbwmk{&x@B{Z`-Y4BNorXOUwLo1cv544D^J9`dg2B)?kFoKl<-CE%Kt+j`1aKO1)Ye=|zicgq>MO+~{#0$c_elCsrhR&j1mW@U}qz zrY%k%B&R)gKURW{eWtqz+qIKdoQe-UIH4Lu50(Hm-jM7;Y;ZC2{#+n_fbfB&4(qv6 zK4EC}MZWwkv@SN7%ij0Pb&}CjC)XV{dJrw3e^#zD8Dm%MY%E`t+zd<+uockbQ6Er$ z0-fYS`5Rovcgw+% zPTq;%Y+@l z{Tz_)V!zDPTlL3UekJ1%wmkT};?8A!Y2e3mdKw#Ok5*tVysE-iGI=(r0{gg&+6G>D zwJy)vgB3squelCxdOu;SBy}=N^e$~?Xngz+=&6Lgirm0@Kw7Zr4r%T?q^(ZP4A5Rf zY~j2Fm+56lvns|DD+smcQmNtfcE93Q*&4sra0M~ovAWSp?!w-132(gg`y8!Ukx6Xt z;{gW!Ljj=%fnXH~UfOBE^E47&7HP?yh+CBSdRP~7<0aS2IS{IW^|TLha%9?FNxbUs zmCAFfQ{9PDSs~+GsVSqK+J`+42{C0mho9UmAz$3SV<}3cd*3AFwvW*E?*O~j2~-Rs zrND>q0IUTDB_I9;Ck70VL#h%u=|OGd4|JcTr<8*ef-g&AmM~MeV+MH%Kc!>Mv?(7y z>ns^Qts|Tv>}M{>@c?e9^O3#{c?^z1ZIA{_m2hn@o-)*pn=1ETx^Ah_dZrlko z#=on)&7ggrV54h9juZwjHt9tF+)YVLA+NqF<_4ThE~KVWCkyE_v<~t!^qqsNXK0?5 z&9#d>DStyVwMf)lMKguc@DPlhg@?)GO|VUY%cpkHS22Eg3tl2Nmd~7Ba@|Q5tA*7V z|6eYW>jEq`4T}fL^Nl6FOMn`0D<{7<-BS4}rI}vpR=X*0Y@Bh6$F7Hs*t_)$Z$8 z8vfiyo&ce)K#{iunt%gmI_iojr&4QHk?%V2gthygP#TK$d`(Qx_tu$?u_cLo0pz2b z+-mndsWdz`Ki`FKcGTskzU)HI7T6hT_w7*{{>S{B`(LFIqS3F)Vh*QXcMC&_%it<& z_jRKUIn-8bIM$Pe`AM|o-(Tx+EYfqAQSKJVuC@ER(6eN2_Eh29!*FS!%V=^O=3!@c$0=fF|{Y7G|l3!l*t&Tw{k;^dMBiC%0y@mKo!)Qei z_dM*|fzi(J>&T1F80Amt;unxLS zKe%fLkV^xz!2JqjpOY+Tg!nB$6qz)fmz`V2Y|2-dA(1l^dn1|Co^H>8KO?YXWY55_ z%)w0fM!+s0YR{T01D`#@>Q(Ez3t!9s!*!%;%NjK+KZG7rugx}BTY>g}QaV+St*3GE z_r>?gH%y>#{ms9JaZL5k?p=cc!7$d`Dp^Z4K_adysoFX`pe z-;+J+cc=kK`p_?IeYh(Y>k0h0^K#Ldrkr+h2QOspsTJUQ!P8;oxFe7`5`M2%$Q?i_ z3%R2dDAPGVZavPzlhq8IKH?0`*#d3#(tUDGFu`|8>Kac!ymuDn>4gVLDvxik{{rP{ zZhJ=Xw-tiFwGeL`Y#cPEuTV32(WZUvLcXoOwQ156QE%V|pSf00`fJUd^U9th4CcZ- zkWlB^anUcSzxE_}c8YI6d+f07n`c^wRLh?v{F}NiFAMap?7z9Qp{R1#Wv4Ar4isGp z__~PeIuKUp8T+#R>t~kI6C1D}AS)wzSV=H4h*Lc+mI3O=-0~eg%>o_SLiX{Shl9XZ zoLNTYk25;k`mGM5?0Uy~(KCiyV{o=&ZAIRBljzC47yL@y7U`mYLHgPYez`XIA*Ew4 z&*d*4fi!mlsS`lBrfONLSOV$Kd8jS*%+={E!m8@IdHuAx!l!FAg)Rs9Ez+KW+sp^I z3C}aWF=BiRbFphSY7~0U1a9lpufT8Y>&b)10~@lqEi>rZT=b@%#&O&Wo5UjpjPTg7 zP(7e-)9`mJKhv(%e$V(WqT@{OIKMeq{_a7(W8VbD;2YWre#4^JA>$J_CdMV^fq%Yz z!km_J1-_O$am$Zssw~h?|0|_m>KX;d28>Dn{ClVnRS9TWF0%k5~Lu!>&j zSL^|?b}nU;#k;z{`pcR7^7aGMu$bi@SqnKA{t!TwnZA|9b2ZaaPa4dgU7gngHQU>#XyC$SB9Z?pO?A=eiKCj|J%>Oe+h5MJ_DZv zNWb9O;2pe(P5IUwNR=Uem(nNUH(?DhXA^7C?Uv3iui&eHFXs`Qjn)a=QXg25b0qo2 zQW!j8`ymM|b_*+}i5G?Ye*GNrm+^|&p)9tdK}1{Wk{yScr&xBJW{|@j;0=c}*~oK} zYtT6IT!p&#!PK{P{&zG393|-lCXuVvwRg3%3%5#jjXX#CphRy=naT207mT#MgGy*J@HyS(tet)QNNyR%#i#^PS5ZJ+qtRM`9$1$g zO0zMR=hhP!w(S5svW%pY0GEZ+3zA7vpXSgd5{$*7P}gSML5>`{=U9RlC@_yLmSDf7 z8bT#^tm8Rt&2PY|zWd}55Gf^)Brf|ym^ab3dJ$nmvuvjRZ|FYm2{nZRDBlNP!%14rZJNM6 zWpUUC0|xS=h#V6Vs}#~_CwWd~q|J>1w(xd33%LW4QkuzsZTgz#68g59^YSE1{=O+| z&mcla`8oL9O#nLuJ(N+=ecM3OYfOm<0jtTA0e6q#9)&acum-KbVO*ah!%nt z=>9Ld7Q~N8L_*i~e+wLFCHBX|KkSeKadUx5R-b?cqXHfQdMdb9r0phch9R+52VgU5 zA1|Q@d5{BI#0~CPeG>+(C3E7`+Ly_kJ!hWT@?@+mlS#gufvM*6sz*JqUeDd4dhXt$ zUbk9R&(caYR+a%j%3Z3b0v^)`>MYhK&qiz0b?KVwS#whj4t7dgnmo;0n*1AfH3j(T<$T5sU>NIbYYi?|#s9bJes2iBQ?s1>9 z8`#4x?Ef8dZNGJ>tNIC8;2FG_XL}m;SbeZtrS1j<<@pn>re`@t=EB)J&%0k^J!aDF zy$0RhhY23DjiO%6=Rxz6`oClziUcIrt1P;!x*%$yw~^0%y`wGdcYoUNk>qd0qq~sy zTeI{mi<%-&v^)$gX5trkr+Xs4H#>-HOz`7()C)^>chn32R`7t`{H(B^LqZtLBmD_9 zJLRA-R$t=wpgYCF*P>n*iEXFqOz1+BBCNwj0Fj zA=wFbf|PCy{#^-gX~;jn0S8@5b|hG`pc$LNxjNK^m?Q?J{`pVHW0!Pgs$mF!Cm4EN zA2D77=P+%blPll{vng%~8Js2FrYRqM1A%QgWlh@aPu<2Gkq^_T_Qn;Xb}??$-Zq=G z6J;iF2`lbm(1%PfW01Yy!e3wPrDc$_@w6TPD|pVs|FGi4qKLoj!|bfz;=3+I_f+~~ z{$e(1+U1MA?tmWZxG#2lDRZpuXquBz;0KmrQ%Ig_OVIf>GQJrtVimq$AE-W{R5BoA zl}gn(q*lP!9VhRSP;2C`q17i#sJRIDZ~pp#d{#2XYN2O3E35|Xuo|2-8Dsf{Y%mk! z)jelj)P3JZ^G|&SZJp~gz7r)+#AG|k12Ao@cg*ur z+|*;4>o3+djkhO*^{T(tXjLHoHLVE=(Vwv*f>m_}w5Cw046q9aBGor*M@`jozj8rS z+~B^J{-R@aPM&V7j#U3Yl$sy6-%{J{aM>{J*{y|FtbgLl1{0dB0ll@f6R0u2GO8~i6q!SW8eO}~L=vz)S}@jDw&y-TwHOcQvyi)9ua zi5Po*4dmRRikb59@}Y7!{0Qgzam+GRLaT5faV8BJ1@e8xr`S}9?w<$hEh(?Sqcur& zLD$I(o%pGl=D5-SIdAKDbNXA%)#NJXZFTkrcF%N^+(B)RH(tIED^dcd{Q+{59Zu3u z0AW`JSN^C;_zo9%d&_-8y{Q_(qjHbnX7E*Sud@}=PBxuf zWuc{^znFDI0i;3Rf2vtHekFC%z9gATA;o6LsEWY!mPZFwM8**s`V9y6?u;Ay!0*DdRnp> zmBv{s;jH}_2vQ5J5W!REa_zQlg@M6(MoUrwa>HA9|Ex`6e>j6D@ zIhQ#yLWq0t6+)fSTjHQ}d92pC6Lgj!Cw=RNX&A3-|Q`kIK`pxyqVN3BY2N!8)j!~s5@})6ltQn&mHmh29{0z zF!ZbFzfJ9S`<(xC=*BpkQQdD2o%X^*HMD!wFfw5Kz#Fh82ORq~oEF-KCf<^d-5rh+0vL;yJOG|9N)uyQ#SpHrm*_U(ZgyOYiA49()}q zL$R)>KlQQOM_Tw0bTGtcM*jZ4cbqZ{-<{>qv7aPgD$c?4l0TIXIOUb3$0p4XS(uZz zC6JG~&SwFe4nFIhBnF($=Isvfihtn!z;p(^!wCm%Y-^LlF~^I5+Yla&!mot+A0++) zDL|U(DFs$aF(Xe;>8?nfXAsoWj1dn7)SyO=v^JAlsZ`;O^^*BmY>a9`!LR+ z$?5zl;v(b`Ka?7^0gT$2Oo8}oMciiMBvS7J)3zi!F1<`=ZhBi=K(i8~q~ik@)ME2H zY{WyU3}YjrD~Rz@(mAjmqLRRZ2H;IB-mVrSCu$aRk@`kZp5tuXH?&PxvUoUXQSTRAlC<54AY0QCmpY$Oi+Y`oiLF*H#81Z={z8~Q2wOcn#aYR_rgXc z&Q3!t3+xh){5^4d=w-4`!fT<6ZzrS~ zv<^!lCxXKR{riM3hyAXBN)Rpe=Qvf?g)kl8&^hF=1EgIIFWIINQEz!02StTV)9}Th+Q`ALA}ySAo%L46GUIN|p^6Q5L70 zz&(sDXIjNMXQTxX}Q7bGFt9%owHhYmJr5 zTzy*OmSvIQmWSbo3_99-66G!zGsgx(h_!?CJQn^kzreQ?eyPMNCg6 zy%}=Vg8xC>44y^WmAVFMn^IfD;!3Q%5Ya%P0ZAQ$W3W0-z54OqMMA*?tJz32t&giaiaOo7V43(~+UF4>* z*rPS>GKadf#^Ywq{-QyXUN!S!dEn!1^3%X=-`D9n9*&){vuojChB%D}%o2JT^U#am(pord}#vr1SaS@YG9shd9;WHJLCa1G5-9~TLyVxt9W`XAh-XW0el?RK)Xocn_+brkX_Y=bF0yB zF&6N5D&mDe-!Fl+$cTGh65cw)4^m58DO3oMkUO^E~Vm0wu$>r?gIVIIo>hxyq zwOz}2^DU;mc6^x>0L26H4|FOgg;yQ`h0>$Z5T`;^--1ZMp2*8W4_B%Y3bx%11ge54 z+e%r$kd*iQ1*EedX^-6gd(zk~A`d4#UHT!O3XJxAZmvkY1%=i1xv&odw@Y*t@nJw$ z*F--36Dlh!X2=)$0TUuuLXxKlDN5-Fv$c;?>{F%oe`E{nj5+e3guX?7laoyw$)`1i ztu`PA1MrSR&F~=*^gH%eF{t-YDXbHB!Eyp*l!IwCmCLo7Ez7+tBL1HUT3(Q$)C^=o zHuwxsYpr;TojU+$kyp)?y6p#f{t?H}ijhaO3hXnYr>#Kv z1~9&$-Z;-p`uO6c2@o<3^?wYTCsE|O0_NTE<43qLUIQ*$?VIgHj86KBkxlQh6-KkG z*F{$<6>5EohMz;98+R|S-4*Tgu0Z^lt>F1VNeZj@a+R+EBtzD`ogYu#NWWFWmmPJ=7(uDbFnLcw-icr*unjc0D;b1Q1pD>e* zLG?y6QeWJmJ&arx2~<@ey7N6;JG7^`E(er{B4h~eX=a56A9Mlg< z#d(U8rNqEp=_`bE61@5Brtw4C!8h6TyO4ie=ha|I|9(2FM_wK|XEVE5wRs3pq+876 zt_y`T?8oceCBRV_6e(~|U}d-iyb8%hSTn)(+>7|(?G6LY;BmwjTTw==W%mx5*(RacakmIjdMY>YK%t?wA zLllZM3kB*{H=z_o6by(R1Z1JM@m$HTpQSGZw6`A(^lKZhmBcsHx2L}G=`%!;o`G%A zFtYx_qr|hotFsE_N~gPfRpoJLl8MFGIF)UVMA~dMxC{oQM5u4(6RV(xB)=r#z43)4|AJlSsn-g6%v$-d znRdL^Fl?68(;eF8U1qX0!uJq&j*z#;QDe|$^Ml$ft0sgS?qr+O87FO&bM;0uZS~b2 zs!{h$=oE4qoutCI`QIRaz36V{lcZh1?z^=Frz&ZWXEtG`%;Z%Bjhb2P6U0H)u`@VD zCi9rLg*~H{{>Q9V_Z#pEZdm1oM#KcJ*cAEvpLfW<-dUZ?jAz6gc`UT!noqy^1>=us zXNmoKgm61n9k+9LZ&$)IWzr5?w_F#5t^;vUFREt9ZP3}JmAeMtlef!^+8c4~BzmV( zorK_lUW9mCe09enoORZ|ST8J9X`>`1B-%%kdXfNSSCaaHbVaWkyqjpeyglAhXw-TV zUpAt4AKgU|>jW)%V7SfO5^ru;291yzT*&*#MS62Ha_Lf4DX7cFM~zz`@8~r^YD(6y z2^N(wW8NN4zS_BZ|Dg{sL!)GVFF6Jd(3y*7*hl8(_xD<^M=aeZ#QR38^d_pAq+j}`7*#QHc-uC$$-4FW7H;+S;4By8FqIewJ@;H6{q@vC z!moQw$9=)o^Xk)gVCht|TXpV$&Au$)ANNgdno&cD?L72z;T3T4CUe3=j#qhiM5LLA zxo^xs5m5E{y9KXWitY-!LTM*43NK<_=jkL;GpI-Fflh+7HObWJA8`xK=aiVwDGvRF zBZYS+EGFSkfDKCdJ&3!j)P%+%f$MNOeSw1TdeEeGk-~ovC&%p^Zh`dPkdW7*QE)bs zq^^5Eq@P=--r)h@kD}u~MD0WCW>$@_;se76+^ax|mrrCvHp(VnR1x(y4#a21)GEl{ z!aI8?8>eTRJZTUb@~J1~cHEKH0jaSdzBZUGyV@V3dtGN9NZx$b37sg?(sJMyv_y_e z;tn)ug4>an%wdyVFF%;f@qKaQ+W3>VX5@CHCi29tECaUpkyNhzBG=gOrm}UfUp6rG z2%~o-*W)xo)3|9==QXab%&B%rmgR~P zz|8}QdSi;c>SW{Da_()>0x8h~w*kBN`Vxk3>{mK(0A=a}1|_r#`U;}Bh&O(EyY|XW z%lLm8`oFwSPCt>X|Fv)BT#$XAo9(RjB8DpYeh+2SyabEA+pMamkmhD?%!1&7B%{5L zQZaJL(YDAnCZl(oy^lWz`OLu)O+wA~J{kUOwe^1nAA+9M(>PDY ze=B)UAMZr$XjpzYc=MPMxB2u?PO>_uQNFCHPxS(|@L>|22AYkUUjov0mF)%TZp7ty ztlCc+PtdT>V(eY|>gU_x0b77u21I*E0u`9iQ~xM-vLEi&Vh%s;d=fXBT4l9;7H8_p zIi09YYm2y9FSI_|rZPL?3*?ax6224WtNQzHf{$&}tW6CzrPj})yKM&`-{CyG>AP+U z@7{KRF9nyL%kP(6msYve3IoL~t1*B=wbLj@p7_g$`8mWBSVDSO{=_8SjIVP0^n7dP z<(nG|(#Xyq3wZWFF^Z_sh%bh}?d1KMA?Mx@YhR}(L`!1(el1{@jS0TF1O2kR2jBY-!dQ8@);0hi00=ykiF3d2FzY{F-qr|u^nsP;}+geCUj+bAy z!a^?MiA?$0Mu3uLboUSOgCeGjB^i?z@!^PzKLlQI6yK!V5{39w865p$WaMq&u%rQ!Q?% zIx%kWLr<^K8ulmq0egLXCHj$->c@q&e(2VGOM<`4J@q>;e4|5$hHyjCc!0*_lqsb{ zAm0cd`iQ#(5xcw7B@jk&?`5?$aQdr1^bzVP?!LS}iB>$OiU@X@u%W$!`<2ucPa~qu z4k=J)C|7~r`whj1IQ@n4FnMCrImPw_HVhgNbBs~UvGTAtz|G}sh?T3m)a$0WH~$ta zI$PPZ+O`t58Y{&f_9EW!X53Jh^6jRWHoqD&x>o>uIR@;JS^HUwMPlQYA!V165B^VrPurb3CwNhGh4iMV7o50=7~2ksVzXjDX#y>^IPbrTNLl~Xfx&nm^Pf*Ki>A(ihx4=k zz}v*VQ%VTZCvH(cf{3L3hy(P<^lQA>j+3)-cCrkd?`E>p@_TF}JU?!T{R3>hh>bwy zxH@h@I}sC&TFSb|ck-=)#a#Bb=sZ&B)xej>kK((O1NlXcXCYygr^n-z415`JC|i@9 z=YYU;yhM>?lb#ENzvQx8Z))%^$PX zi-^SV3}Uv>N-pB4hIZoJLs8H`bn1>6}@G@h$p`C;u;KjCK?unN- zq`kXklxld!>5}oyb2A${%DPj$*ecsMi5qE1Mm)66?;VZhpk1^X>mWI1-WA}MaNc6X z@{;QX@oO?kV=HCMuL1U}WF*H0bpv;k>AW8?9D9Hx+={yP5s$TtIW2C((3=(TIfbpY zDU>l)6}k`6X^FdRheolG-!A~=z`q*9*oUjf$Hhh z!kN;I(ti6VLHD|$IeNuRd|=gh)likYYNm3$a;VZ>32kO3c3qBlHBQY;?7>Xhb-aeO z@z{5sc$UmrIN#sn%q02}Ap2`L)Eue|^eKbT z6eA`j|KX&mqG^0f2-ZgVa1L`;1_l(avRAvYXa8;fNRhlGBF47M;l57!w8IPpOFj@R zWr#&nJGJ7-+VImyYWb$2?od^LA{%2*hPJY&H~Rv6*@dYWxP@&HRG@igYv={n=e;Y! z{p{O;r2;oWGF5Z*q0kHL^MNAVT?6lFZ!?_&p+4_n_SATv_fu|{^S&W9@P%<7`tA#T z(R~P`VjAj7t!vv<_0)rqCll+Myk)0e&_@H7ME%=`XI===Z$YnS`T|9KX=n@Wys5s> z7Q||Sh53J%Gqh`}Dljth0$(?*C?C02NRcJfE^ z1Y>p6y#t8)_YQs$cCd0D{rES2a%ctL2m0}|7PIz7k6C;BiWz6Nc}QT=zoK45af5CU%%5&m|k#@;>#^x6&rP|n~ zyFkMRXQ!aAiEY1&@zv4I(geT9>I+t+P#0Tux&yr-=+1>C-SJ_^zAn$BI$qobq*ERK zkMgAqNVwQZw-+&Ii&A^iaLjf3UZpl{aQE(B?h z=_uD}i?L zBHACLaW&FRiqjBj6T|iY$}{^1EkH6h}3vdt@CH%zry^fI4L9puWGUklX$FaIoY zl1h%8A&Qh%09_jRLHx!kBhL5vUp|TRM2`MA`Q7<7&f8TBzJ_%Rj8_Pws-4)vyys@Z zQzo}Td*wV!(Mao5C0`AEP4euoymPzp^+cQh$k!3sKYhgNvc2a}4t=`Axcfj0x?q78 zG1KRlbC!9{4Es%GMA_oC^?Ka%1%0D^=&%G7u^(JcGpll!g$@Vy;RFGeTIV=L?F-65 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 PphJgP<&6ocMMUKz|)Dxu! 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 z zVCz6N01}im&(LV)Cid^%A?P6fTiSXSt2}uQGL6pQR0#Xh_PsoMC)Nbz#I@l(YNC6z zt-D!%?mY4wju&A~+|JiT;zr{u*p#3p%~%`!hEs1B1np*;9v!U>jS4l-{erdeW)r9l z-ec`mPZQmGwTKv!=n-p!_Xz6$hV{)OSR2|G_<_>eNcM^OyxsCzVr`_)y3;5gz?0b1 z2ZSYVqKLp-Cn;~C_mEzYh$4O|IWPQnj-JTGy>^IGw3KOs>=AGa6JXBL%ps64 zb3f?-%esD05+#{CjRI14if53pXW?i0gc?F#=vS^b#a z4=o&b*lOuF{PX}dN-O=&tM+m1S6llW=!<8dr<;$T&Z`C2Y*;{(r6#^XKP9-v^vIlL zzzLX(GY*-`5J$y;tZRvNGJoEu!QDq0X^{~ZWxwMm$pnq>%yr}23jS+K%{^&VSKhr> z^&M!Oxpirt#P}()R{J$>p+?!VzEE8V&!n7m<~?T~p$tkYytblGrNQFNUkJNk;FvrU zbDBlZ<|)JiS_xShe5s<}ryKFyf}bp^)&myCt{6PmFD%X zcH7Tv!wtu-4zz*(1>Lj}XIKqn8Un#2Ek{4AaesTz&h3O3Wc|`X?v)7|eks<@edq(< z!X@-guIZuo^ARb@to^xt4m`w1 z!L!t4T?~KwvilH6P)&*a!@XNnQ)8+*bip8cSgLenBn4C}qctf%hdboXs~-10L}XeH zKGTFV?}Zjv7vpq#sQ&@C0;<-GlmAE^lYiBYI)~wPqNX%0AHTEdfyg&nVUL{LXTVG@ zUrp0I&%Y-rA`OOAo-3iLZ$5T_hg*+<6V$T0(rss}!~OZK?OTR*pVEr9GZJ@GvhDun z(fbo)efDiqPeJ6Qw_;N>Mw{{-_zBv ze*Ps>)sbxkiAD#^X~V-$?@F;WFCnuM9;UOpcN@*`=$!WZkN25eT`q5Lfa2C;UF*8v zG%XpnW5kr-M2ZC3KnHYLcH|}cnhUMRl6MWfzCPHE2e#3<(#iU(>X8S2B!y!(<=CR> zbrU@HN6g?&-T~-}ZIC<64}{H+!{g(iJ4A5~xjjeQ(3GWz77oU;o9u)#B{ z7NG(Wr*Dgxz-d4_tUA<{k%3<$2XA-@W+#=-F=U*q{pIFj7G8`f)oUzXmrq`I%1#ow z_yNnFMphq$eOd3Tn`iESoQ^4=&@rd6#7S<|X=T(6oPPReF@7ZxPnq8-e^Ljo+SSov ztm$Y=B{b;KvP#zP#NT)Y8?VJl^+E;c5S&xHDp-FAK7VBu3|^oG<1F&C7fbzyVcf|5 zwTN4?$r7{`kLKgvTITHlWtZ*hpqcH5r2?X+VLrzd!j9Om98&aXtPD4c%a3+nSjn;k zQ1VsXRnkvF`o?Yi=GfR96kZP;70Zw6!(YaJzF8_cYXE*ZMG~zk#p(GQ#LOK)OC|7R zq3@t}HwJ=4mCzX&Jvs9pZxd&KbmG=T=@A{?D#wYVN36KyTaSKL*}fHs+Z!mv%<}e` zAxSAkYh29MN>oqu{pD1~-@o7fSxK*=3A8Y$!nRa91WZ}|Obp$<~Scd3(p*2m_ z{4Nxl^2a^>&5^u+)!;bb1a61()jf@7_0j7_-M3_B)D=sv8#P)#T%34&)_`$nxO&^k zYaLdiVdr&q_~;v*+@BKn9I(hVEKcLg!E7zKu^)mb%UZ3(h>qhqS>kOwct0v}wK)(3 z=b^Qdz!h(QY%#~ycl185SpHpobpJe1lmE9qdJ6HNd1=fn&721Bpkro~K1ZSipO@s! zo`)m^9_3g&u?%RKW^fL#AK?5|+#=IB-(<-GUgEbfKzO@`bs?)MpQMJ7SAMye }v?60?5n-}tQ0 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

  • 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

    U53RW| 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�GWhU4AkN!R_aZA*s9G!z{q& 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

    H1|j-ixS-v-y(9JEHzs|FOnMim_dWQJ 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

    bqDuXa4Q9zDGY#JIwFlH!9Ah8PR+-7P5 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≧6|}E-Wel43Du=SL>lvls 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

    +RutBW(bRmn-Doy_S0&G>S4e3T3hu1M4v&a?3La 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 z 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 z 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

    |`D^Yg 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.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 bqDd$gARc|e`N{|X_SU*{x@GWrAz#je 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%0A-klkea7MHMx~93 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