From c8e3bd021ec57a90f5443aa9acfd73a2bb9997f7 Mon Sep 17 00:00:00 2001 From: zhaoxingyu Date: Fri, 21 Jun 2024 13:55:12 +0800 Subject: [PATCH 1/4] remove files from older SDK Signed-off-by: zhaoxingyu --- gr551x/BUILD.gn | 0 gr551x/NOTICE | 0 gr551x/components/watchdog/BUILD.gn | 0 gr551x/components/watchdog/hi_watchdog.c | 0 gr551x/gr551x_executable.gni | 0 gr551x/sdk_liteos/BUILD.gn | 0 gr551x/sdk_liteos/config/BUILD.gn | 0 gr551x/sdk_liteos/config/custom_config.h | 0 .../sdk_liteos/config/flash_scatter_config.h | 0 gr551x/sdk_liteos/gr551x_sdk/BUILD.gn | 0 gr551x/sdk_liteos/gr551x_sdk/README.md | 0 .../sdk_liteos/gr551x_sdk/components/BUILD.gn | 0 .../components/app_drivers/inc/app_dma.h | 177 - .../app_drivers/inc/app_drv_config.h | 151 - .../app_drivers/inc/app_drv_error.h | 116 - .../components/app_drivers/inc/app_gpiote.h | 142 - .../components/app_drivers/inc/app_i2c.h | 402 - .../components/app_drivers/inc/app_io.h | 302 - .../components/app_drivers/inc/app_pwm.h | 244 - .../components/app_drivers/inc/app_pwr_mgmt.h | 122 - .../components/app_drivers/inc/app_qspi.h | 526 -- .../components/app_drivers/inc/app_rng.h | 213 - .../components/app_drivers/inc/app_rtos_cfg.h | 268 - .../components/app_drivers/inc/app_spi.h | 448 -- .../components/app_drivers/inc/app_systick.h | 93 - .../components/app_drivers/inc/app_uart.h | 322 - .../components/app_drivers/src/app_dma.c | 330 - .../components/app_drivers/src/app_gpiote.c | 436 -- .../components/app_drivers/src/app_i2c.c | 1132 --- .../components/app_drivers/src/app_io.c | 293 - .../components/app_drivers/src/app_pwm.c | 377 - .../components/app_drivers/src/app_pwr_mgmt.c | 147 - .../components/app_drivers/src/app_qspi.c | 1635 ----- .../components/app_drivers/src/app_rng.c | 418 -- .../components/app_drivers/src/app_rtos_cfg.c | 214 - .../components/app_drivers/src/app_spi.c | 1432 ---- .../components/app_drivers/src/app_systick.c | 114 - .../components/app_drivers/src/app_uart.c | 1033 --- .../gr551x_sdk/components/boards/boards.h | 21 - .../drivers_ext/gr551x/gr551x_spi_flash.c | 620 -- .../drivers_ext/gr551x/gr551x_spi_flash.h | 273 - .../gr55xx/gr55xx_measure_mux_signal_api.c | 0 .../gr55xx/gr55xx_measure_mux_signal_api.h | 0 .../drivers_ext/gr55xx/gr55xx_spi_flash.c | 0 .../drivers_ext/gr55xx/gr55xx_spi_flash.h | 0 .../drivers_ext/gr55xx/gr55xx_tim_delay.c | 0 .../drivers_ext/gr55xx/gr55xx_tim_delay.h | 0 .../components/drivers_ext/st7735/st7735.c | 0 .../components/drivers_ext/st7735/st7735.h | 0 .../drivers_ext/st7735/st7735_config.c | 0 .../drivers_ext/st7735/st7735_config.h | 0 .../gr551x_sdk/components/libraries/BUILD.gn | 0 .../libraries/CMSIS/cmsis_dsp/BUILD.gn | 0 .../Lib/GCC/libarm_cortexM4lf_math.a | Bin .../cmsis_dsp/include/arm_common_tables.h | 0 .../cmsis_dsp/include/arm_const_structs.h | 0 .../CMSIS/cmsis_dsp/include/arm_math.h | 0 .../CMSIS/cmsis_dsp/include/arm_mve_tables.h | 0 .../CMSIS/cmsis_dsp/include/arm_vec_math.h | 0 .../components/libraries/app_alarm/BUILD.gn | 0 .../libraries/app_alarm/app_alarm.c | 0 .../libraries/app_alarm/app_alarm.h | 0 .../components/libraries/app_assert/BUILD.gn | 0 .../libraries/app_assert/app_assert.c | 0 .../libraries/app_assert/app_assert.h | 0 .../components/libraries/app_error/BUILD.gn | 0 .../libraries/app_error/app_error.c | 0 .../libraries/app_error/app_error.h | 0 .../libraries/app_error/app_error_cfg.h | 0 .../libraries/app_error/cortex_backtrace.c | 0 .../libraries/app_error/cortex_backtrace.h | 0 .../hardfault_handler/cortex_hardfault_gcc.s | 0 .../hardfault_handler/cortex_hardfault_iar.s | 0 .../hardfault_handler/cortex_hardfault_keil.s | 0 .../components/libraries/app_key/BUILD.gn | 0 .../components/libraries/app_key/app_key.c | 0 .../components/libraries/app_key/app_key.h | 0 .../libraries/app_key/app_key_core.c | 0 .../libraries/app_key/app_key_core.h | 0 .../libraries/app_linked_list/BUILD.gn | 0 .../app_linked_list/app_linked_list.c | 0 .../app_linked_list/app_linked_list.h | 0 .../components/libraries/app_log/BUILD.gn | 0 .../components/libraries/app_log/app_log.c | 0 .../components/libraries/app_log/app_log.h | 0 .../libraries/app_log/app_log_dump_port.c | 0 .../libraries/app_log/app_log_dump_port.h | 0 .../libraries/app_log/app_log_store.c | 0 .../libraries/app_log/app_log_store.h | 0 .../components/libraries/app_memory/BUILD.gn | 0 .../libraries/app_memory/app_memory.c | 0 .../libraries/app_memory/app_memory.h | 0 .../components/libraries/app_queue/BUILD.gn | 0 .../libraries/app_queue/app_queue.c | 0 .../libraries/app_queue/app_queue.h | 0 .../libraries/app_scheduler/BUILD.gn | 0 .../libraries/app_scheduler/app_scheduler.c | 0 .../libraries/app_scheduler/app_scheduler.h | 0 .../components/libraries/app_timer/BUILD.gn | 0 .../libraries/app_timer/app_timer.c | 0 .../libraries/app_timer/app_timer.h | 0 .../components/libraries/at_cmd/BUILD.gn | 0 .../components/libraries/at_cmd/at_cmd.c | 0 .../components/libraries/at_cmd/at_cmd.h | 0 .../libraries/at_cmd/at_cmd_utils.c | 0 .../libraries/at_cmd/at_cmd_utils.h | 0 .../libraries/ble/ble_advertising/BUILD.gn | 0 .../ble/ble_advertising/ble_advertising.c | 0 .../ble/ble_advertising/ble_advertising.h | 0 .../libraries/ble/ble_connect/BUILD.gn | 0 .../libraries/ble/ble_connect/ble_connect.c | 0 .../libraries/ble/ble_connect/ble_connect.h | 0 .../libraries/ble/ble_gatt_service/BUILD.gn | 0 .../ble/ble_gatt_service/ble_gatt_service.c | 0 .../ble/ble_gatt_service/ble_gatt_service.h | 0 .../libraries/ble/ble_scanner/BUILD.gn | 0 .../libraries/ble/ble_scanner/ble_scanner.c | 0 .../libraries/ble/ble_scanner/ble_scanner.h | 0 .../libraries/ble/ble_time/BUILD.gn | 0 .../libraries/ble/ble_time/ble_time.c | 0 .../libraries/ble/ble_time/ble_time.h | 0 .../components/libraries/crypto_lib/BUILD.gn | 0 .../libraries/crypto_lib/inc/crypto_aes.h | 0 .../libraries/crypto_lib/inc/crypto_ecc.h | 0 .../crypto_lib/inc/crypto_ecc_port.h | 0 .../libraries/crypto_lib/inc/crypto_gcm.h | 0 .../libraries/crypto_lib/inc/crypto_pkc.h | 0 .../crypto_lib/inc/crypto_pkc_port.h | 0 .../libraries/crypto_lib/inc/crypto_rsa.h | 0 .../crypto_lib/inc/crypto_rsa_port.h | 0 .../libraries/crypto_lib/inc/crypto_sha256.h | 0 .../libraries/crypto_lib/src/crypto_aes.c | 0 .../libraries/crypto_lib/src/crypto_ecc.c | 0 .../crypto_lib/src/crypto_ecc_port.c | 0 .../libraries/crypto_lib/src/crypto_gcm.c | 0 .../libraries/crypto_lib/src/crypto_pkc.c | 0 .../crypto_lib/src/crypto_pkc_port.c | 0 .../libraries/crypto_lib/src/crypto_rsa.c | 0 .../crypto_lib/src/crypto_rsa_port.c | 0 .../libraries/crypto_lib/src/crypto_sha256.c | 0 .../components/libraries/dfu_master/BUILD.gn | 0 .../libraries/dfu_master/dfu_master.c | 0 .../libraries/dfu_master/dfu_master.h | 0 .../components/libraries/dfu_port/BUILD.gn | 0 .../components/libraries/dfu_port/dfu_port.c | 0 .../components/libraries/dfu_port/dfu_port.h | 0 .../components/libraries/fault_trace/BUILD.gn | 0 .../libraries/fault_trace/fault_trace.c | 0 .../libraries/fault_trace/fault_trace.h | 0 .../components/libraries/fcc/BUILD.gn | 0 .../components/libraries/fcc/dtm_fcc_test.c | 0 .../components/libraries/fcc/dtm_fcc_test.h | 0 .../libraries/fcc/dtm_fcc_test_int.h | 0 .../components/libraries/gui/font_gb2312.c | 0 .../components/libraries/gui/gui_animation.c | 0 .../components/libraries/gui/gui_animation.h | 0 .../components/libraries/gui/gui_basic.c | 0 .../components/libraries/gui/gui_basic.h | 0 .../components/libraries/gui/gui_color.c | 0 .../components/libraries/gui/gui_color.h | 0 .../libraries/gui/gui_config/gb2312_font.bin | Bin .../libraries/gui/gui_config/gb2312_font.hex | 0 .../gui/gui_config/gui_animation_config.c | 0 .../libraries/gui/gui_config/gui_config.h | 0 .../gui/gui_config/gui_gb2312_config.c | 0 .../libraries/gui/gui_config/gui_lcd_config.c | 0 .../libraries/gui/gui_config/gui_lcm_cfg.c | 0 .../libraries/gui/gui_config/gui_lcm_config.c | 0 .../gui/gui_config/gui_oled_config.c | 0 .../libraries/gui/gui_convert_color.c | 0 .../libraries/gui/gui_convert_color.h | 0 .../components/libraries/gui/gui_font5_7.c | 0 .../components/libraries/gui/gui_font5_7.h | 0 .../components/libraries/gui/gui_font8_8.c | 0 .../components/libraries/gui/gui_font8_8.h | 0 .../libraries/gui/gui_font_gb2312.c | 0 .../libraries/gui/gui_font_gb2312.h | 0 .../components/libraries/gui/gui_font_macro.h | 0 .../components/libraries/gui/gui_font_other.c | 0 .../components/libraries/gui/gui_font_other.h | 0 .../components/libraries/gui/gui_include.h | 0 .../components/libraries/hal_flash/BUILD.gn | 0 .../hal_flash/hal_exflash_user_operation.c | 0 .../hal_flash/hal_exflash_user_operation.h | 0 .../libraries/hal_flash/hal_flash.c | 0 .../libraries/hal_flash/hal_flash.h | 0 .../libraries/hal_flash/vflash/vflash.c | 0 .../libraries/hal_flash/vflash/vflash.h | 0 .../components/libraries/hci_uart/BUILD.gn | 0 .../components/libraries/hci_uart/hci_uart.c | 0 .../components/libraries/hci_uart/hci_uart.h | 0 .../libraries/pmu_calibration/BUILD.gn | 0 .../pmu_calibration/pmu_calibration.c | 0 .../pmu_calibration/pmu_calibration.h | 0 .../components/libraries/ring_buffer/BUILD.gn | 0 .../libraries/ring_buffer/ring_buffer.c | 0 .../libraries/ring_buffer/ring_buffer.h | 0 .../components/libraries/sensorsim/BUILD.gn | 0 .../libraries/sensorsim/sensorsim.c | 0 .../libraries/sensorsim/sensorsim.h | 0 .../components/libraries/user_efuse/BUILD.gn | 0 .../libraries/user_efuse/user_efuse.c | 0 .../libraries/user_efuse/user_efuse.h | 0 .../components/libraries/utility/BUILD.gn | 0 .../components/libraries/utility/utility.c | 0 .../components/libraries/utility/utility.h | 0 .../components/libraries/virt_key/BUILD.gn | 0 .../libraries/virt_key/uart_simu_key_init.c | 0 .../libraries/virt_key/uart_simu_key_init.h | 0 .../gr551x_sdk/components/patch/ind/patch.h | 107 - .../components/patch/ind/patch_tab.h | 163 - .../patch/symbol_table/rom_symbol_gcc.txt | 1287 ---- .../gr551x_sdk/components/profiles/BUILD.gn | 0 .../components/profiles/ags/BUILD.gn | 0 .../gr551x_sdk/components/profiles/ags/ags.c | 0 .../gr551x_sdk/components/profiles/ags/ags.h | 0 .../components/profiles/ams_c/BUILD.gn | 0 .../components/profiles/ams_c/ams_c.c | 0 .../components/profiles/ams_c/ams_c.h | 0 .../components/profiles/ancs_c/BUILD.gn | 0 .../components/profiles/ancs_c/ancs_c.c | 0 .../components/profiles/ancs_c/ancs_c.h | 0 .../profiles/ancs_c/ancs_protocol.c | 0 .../profiles/ancs_c/ancs_protocol.h | 0 .../components/profiles/ans/BUILD.gn | 0 .../gr551x_sdk/components/profiles/ans/ans.c | 0 .../gr551x_sdk/components/profiles/ans/ans.h | 0 .../components/profiles/ans_c/BUILD.gn | 0 .../components/profiles/ans_c/ans_c.c | 0 .../components/profiles/ans_c/ans_c.h | 0 .../components/profiles/bas/BUILD.gn | 0 .../gr551x_sdk/components/profiles/bas/bas.c | 0 .../gr551x_sdk/components/profiles/bas/bas.h | 0 .../components/profiles/bas_c/BUILD.gn | 0 .../components/profiles/bas_c/bas_c.c | 0 .../components/profiles/bas_c/bas_c.h | 0 .../components/profiles/bcs/BUILD.gn | 0 .../gr551x_sdk/components/profiles/bcs/bcs.c | 0 .../gr551x_sdk/components/profiles/bcs/bcs.h | 0 .../components/profiles/bps/BUILD.gn | 0 .../gr551x_sdk/components/profiles/bps/bps.c | 0 .../gr551x_sdk/components/profiles/bps/bps.h | 0 .../components/profiles/common/BUILD.gn | 0 .../profiles/common/ble_prf_types.h | 0 .../profiles/common/ble_prf_utils.c | 0 .../profiles/common/ble_prf_utils.h | 0 .../profiles/common/ble_srv_disc_utils.c | 0 .../profiles/common/ble_srv_disc_utils.h | 0 .../components/profiles/cscs/BUILD.gn | 0 .../components/profiles/cscs/cscs.c | 0 .../components/profiles/cscs/cscs.h | 0 .../components/profiles/cts/BUILD.gn | 0 .../gr551x_sdk/components/profiles/cts/cts.c | 0 .../gr551x_sdk/components/profiles/cts/cts.h | 0 .../components/profiles/cts_c/BUILD.gn | 0 .../components/profiles/cts_c/cts_c.c | 0 .../components/profiles/cts_c/cts_c.h | 0 .../components/profiles/dis/BUILD.gn | 0 .../gr551x_sdk/components/profiles/dis/dis.c | 0 .../gr551x_sdk/components/profiles/dis/dis.h | 0 .../components/profiles/dis_c/BUILD.gn | 0 .../components/profiles/dis_c/dis_c.c | 0 .../components/profiles/dis_c/dis_c.h | 0 .../components/profiles/dss/BUILD.gn | 0 .../gr551x_sdk/components/profiles/dss/dss.c | 0 .../gr551x_sdk/components/profiles/dss/dss.h | 0 .../components/profiles/escs/escs.c | 441 -- .../components/profiles/escs/escs.h | 308 - .../components/profiles/fast_otas/fast_otas.c | 402 - .../components/profiles/fast_otas/fast_otas.h | 164 - .../components/profiles/gls/BUILD.gn | 0 .../gr551x_sdk/components/profiles/gls/gls.c | 0 .../gr551x_sdk/components/profiles/gls/gls.h | 0 .../components/profiles/gls/gls_db.c | 0 .../components/profiles/gls/gls_db.h | 0 .../components/profiles/gls/gls_racp.c | 0 .../components/profiles/gls/gls_racp.h | 0 .../components/profiles/gus/BUILD.gn | 0 .../gr551x_sdk/components/profiles/gus/gus.c | 0 .../gr551x_sdk/components/profiles/gus/gus.h | 0 .../components/profiles/gus_c/BUILD.gn | 0 .../components/profiles/gus_c/gus_c.c | 0 .../components/profiles/gus_c/gus_c.h | 0 .../components/profiles/hids/BUILD.gn | 0 .../components/profiles/hids/hids.c | 0 .../components/profiles/hids/hids.h | 0 .../components/profiles/hrrcps/BUILD.gn | 0 .../components/profiles/hrrcps/hrrcps.c | 0 .../components/profiles/hrrcps/hrrcps.h | 0 .../components/profiles/hrs/BUILD.gn | 0 .../gr551x_sdk/components/profiles/hrs/hrs.c | 0 .../gr551x_sdk/components/profiles/hrs/hrs.h | 0 .../components/profiles/hrs_c/BUILD.gn | 0 .../components/profiles/hrs_c/hrs_c.c | 0 .../components/profiles/hrs_c/hrs_c.h | 0 .../components/profiles/hts/BUILD.gn | 0 .../gr551x_sdk/components/profiles/hts/hts.c | 0 .../gr551x_sdk/components/profiles/hts/hts.h | 0 .../components/profiles/ias/BUILD.gn | 0 .../gr551x_sdk/components/profiles/ias/ias.c | 0 .../gr551x_sdk/components/profiles/ias/ias.h | 0 .../components/profiles/ias_c/BUILD.gn | 0 .../components/profiles/ias_c/ias_c.c | 0 .../components/profiles/ias_c/ias_c.h | 0 .../components/profiles/lls/BUILD.gn | 0 .../gr551x_sdk/components/profiles/lls/lls.c | 0 .../gr551x_sdk/components/profiles/lls/lls.h | 0 .../components/profiles/lls_c/BUILD.gn | 0 .../components/profiles/lls_c/lls_c.c | 0 .../components/profiles/lls_c/lls_c.h | 0 .../components/profiles/lms/BUILD.gn | 0 .../gr551x_sdk/components/profiles/lms/lms.c | 0 .../gr551x_sdk/components/profiles/lms/lms.h | 0 .../components/profiles/lns/BUILD.gn | 0 .../gr551x_sdk/components/profiles/lns/lns.c | 0 .../gr551x_sdk/components/profiles/lns/lns.h | 0 .../components/profiles/mlmr/BUILD.gn | 0 .../components/profiles/mlmr/mlmr.c | 0 .../components/profiles/mlmr/mlmr.h | 0 .../components/profiles/mlmr_c/BUILD.gn | 0 .../components/profiles/mlmr_c/mlmr_c.c | 0 .../components/profiles/mlmr_c/mlmr_c.h | 0 .../components/profiles/ndcs/BUILD.gn | 0 .../components/profiles/ndcs/ndcs.c | 0 .../components/profiles/ndcs/ndcs.h | 0 .../components/profiles/otas/BUILD.gn | 0 .../components/profiles/otas/otas.c | 0 .../components/profiles/otas/otas.h | 0 .../components/profiles/otas_c/BUILD.gn | 0 .../components/profiles/otas_c/otas_c.c | 0 .../components/profiles/otas_c/otas_c.h | 0 .../components/profiles/pass/BUILD.gn | 0 .../components/profiles/pass/pass.c | 0 .../components/profiles/pass/pass.h | 0 .../components/profiles/pass_c/BUILD.gn | 0 .../components/profiles/pass_c/pass_c.c | 0 .../components/profiles/pass_c/pass_c.h | 0 .../components/profiles/pcs/BUILD.gn | 0 .../gr551x_sdk/components/profiles/pcs/pcs.c | 0 .../gr551x_sdk/components/profiles/pcs/pcs.h | 0 .../components/profiles/rscs/BUILD.gn | 0 .../components/profiles/rscs/rscs.c | 0 .../components/profiles/rscs/rscs.h | 0 .../components/profiles/rscs_c/BUILD.gn | 0 .../components/profiles/rscs_c/rscs_c.c | 0 .../components/profiles/rscs_c/rscs_c.h | 0 .../components/profiles/rtus/BUILD.gn | 0 .../components/profiles/rtus/rtus.c | 0 .../components/profiles/rtus/rtus.h | 0 .../components/profiles/sample/BUILD.gn | 0 .../profiles/sample/sample_service.c | 0 .../profiles/sample/sample_service.h | 0 .../components/profiles/ths/BUILD.gn | 0 .../gr551x_sdk/components/profiles/ths/ths.c | 0 .../gr551x_sdk/components/profiles/ths/ths.h | 0 .../components/profiles/ths_c/BUILD.gn | 0 .../components/profiles/ths_c/ths_c.c | 0 .../components/profiles/ths_c/ths_c.h | 0 .../components/profiles/thscps/thscps.c | 803 -- .../components/profiles/thscps/thscps.h | 298 - .../components/profiles/tps/BUILD.gn | 0 .../gr551x_sdk/components/profiles/tps/tps.c | 0 .../gr551x_sdk/components/profiles/tps/tps.h | 0 .../components/profiles/tps_c/BUILD.gn | 0 .../components/profiles/tps_c/tps_c.c | 0 .../components/profiles/tps_c/tps_c.h | 0 .../components/profiles/uds/BUILD.gn | 0 .../gr551x_sdk/components/profiles/uds/uds.c | 0 .../gr551x_sdk/components/profiles/uds/uds.h | 0 .../components/profiles/wechat/wechat.c | 642 -- .../components/profiles/wechat/wechat.h | 233 - .../components/profiles/wss/BUILD.gn | 0 .../gr551x_sdk/components/profiles/wss/wss.c | 0 .../gr551x_sdk/components/profiles/wss/wss.h | 0 .../gr551x_sdk/components/sdk/BUILD.gn | 0 .../gr551x_sdk/components/sdk/ble.h | 0 .../gr551x_sdk/components/sdk/ble_att.h | 0 .../gr551x_sdk/components/sdk/ble_audio.h | 0 .../gr551x_sdk/components/sdk/ble_error.h | 0 .../gr551x_sdk/components/sdk/ble_event.h | 0 .../gr551x_sdk/components/sdk/ble_gapc.h | 0 .../gr551x_sdk/components/sdk/ble_gapm.h | 0 .../gr551x_sdk/components/sdk/ble_gatt.h | 0 .../gr551x_sdk/components/sdk/ble_gattc.h | 0 .../gr551x_sdk/components/sdk/ble_gatts.h | 0 .../gr551x_sdk/components/sdk/ble_l2cap.h | 0 .../gr551x_sdk/components/sdk/ble_lcp.h | 0 .../gr551x_sdk/components/sdk/ble_prf.h | 0 .../gr551x_sdk/components/sdk/ble_sec.h | 0 .../gr551x_sdk/components/sdk/gr55xx_dfu.h | 0 .../gr551x_sdk/components/sdk/gr55xx_fpb.h | 0 .../gr551x_sdk/components/sdk/gr55xx_lcp.h | 196 - .../gr551x_sdk/components/sdk/gr55xx_nvds.h | 0 .../gr551x_sdk/components/sdk/gr55xx_pwr.h | 0 .../gr551x_sdk/components/sdk/gr55xx_sys.h | 0 .../components/sdk/gr55xx_sys_cfg.h | 0 .../gr551x_sdk/components/sdk/gr_includes.h | 0 .../gr551x_sdk/components/sdk/grx_sys.h | 0 .../gr551x_sdk/components/sdk/lcp_sdk.h | 196 - .../components/sdk/linker/lib_gcc/LICENSE | 64 - .../sdk/linker/lib_gcc/libble_sdk.a | Bin 3864174 -> 0 bytes .../gr551x_sdk/components/sdk/patch.h | 0 .../gr551x_sdk/components/sdk/patch_tab.h | 0 .../gr551x_sdk/components/sdk/platform_sdk.h | 0 gr551x/sdk_liteos/gr551x_sdk/drivers/BUILD.gn | 0 .../gr551x_sdk/drivers/inc/app_adc.h | 0 .../gr551x_sdk/drivers/inc/app_adc_dma.h | 0 .../gr551x_sdk/drivers/inc/app_aon_wdt.h | 0 .../gr551x_sdk/drivers/inc/app_bod.h | 0 .../gr551x_sdk/drivers/inc/app_comp.h | 0 .../gr551x_sdk/drivers/inc/app_dma.h | 0 .../gr551x_sdk/drivers/inc/app_drv.h | 0 .../gr551x_sdk/drivers/inc/app_drv_config.h | 0 .../gr551x_sdk/drivers/inc/app_drv_error.h | 0 .../gr551x_sdk/drivers/inc/app_dual_tim.h | 0 .../gr551x_sdk/drivers/inc/app_gpiote.h | 0 .../drivers/inc/app_graphics_qspi.h | 0 .../gr551x_sdk/drivers/inc/app_i2c.h | 0 .../gr551x_sdk/drivers/inc/app_i2c_dma.h | 0 .../gr551x_sdk/drivers/inc/app_i2s.h | 0 .../gr551x_sdk/drivers/inc/app_i2s_dma.h | 0 .../gr551x_sdk/drivers/inc/app_io.h | 0 .../gr551x_sdk/drivers/inc/app_iso7816.h | 0 .../gr551x_sdk/drivers/inc/app_pwm.h | 0 .../gr551x_sdk/drivers/inc/app_pwm_dma.h | 0 .../gr551x_sdk/drivers/inc/app_pwr_mgmt.h | 0 .../gr551x_sdk/drivers/inc/app_qspi.h | 0 .../gr551x_sdk/drivers/inc/app_qspi_dma.h | 0 .../gr551x_sdk/drivers/inc/app_rng.h | 0 .../gr551x_sdk/drivers/inc/app_rtc.h | 0 .../gr551x_sdk/drivers/inc/app_rtos_cfg.h | 0 .../gr551x_sdk/drivers/inc/app_soft_encoder.h | 0 .../gr551x_sdk/drivers/inc/app_spi.h | 0 .../gr551x_sdk/drivers/inc/app_spi_dma.h | 0 .../gr551x_sdk/drivers/inc/app_tim.h | 0 .../gr551x_sdk/drivers/inc/app_uart.h | 0 .../gr551x_sdk/drivers/inc/app_uart_dma.h | 0 .../gr551x_sdk/drivers/inc/gr55xx_delay.h | 139 - .../gr551x_sdk/drivers/inc/gr55xx_hal.h | 390 - .../gr551x_sdk/drivers/inc/gr55xx_hal_adc.h | 603 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_aes.h | 832 --- .../drivers/inc/gr55xx_hal_aon_gpio.h | 408 -- .../drivers/inc/gr55xx_hal_aon_gpio_ex.h | 181 - .../drivers/inc/gr55xx_hal_aon_wdt.h | 263 - .../drivers/inc/gr55xx_hal_calendar.h | 570 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_cgc.h | 356 - .../gr551x_sdk/drivers/inc/gr55xx_hal_comp.h | 441 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_conf.h | 241 - .../drivers/inc/gr55xx_hal_cortex.h | 748 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_def.h | 162 - .../gr551x_sdk/drivers/inc/gr55xx_hal_dma.h | 762 -- .../drivers/inc/gr55xx_hal_dual_tim.h | 507 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_efuse.h | 508 -- .../drivers/inc/gr55xx_hal_exflash.h | 748 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_gpio.h | 477 -- .../drivers/inc/gr55xx_hal_gpio_ex.h | 497 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_hmac.h | 624 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_i2c.h | 1178 --- .../gr551x_sdk/drivers/inc/gr55xx_hal_i2s.h | 951 --- .../drivers/inc/gr55xx_hal_iso7816.h | 650 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_msio.h | 332 - .../drivers/inc/gr55xx_hal_msio_ex.h | 176 - .../gr551x_sdk/drivers/inc/gr55xx_hal_pkc.h | 1036 --- .../gr551x_sdk/drivers/inc/gr55xx_hal_pwm.h | 511 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_pwr.h | 481 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_qspi.h | 1185 --- .../gr551x_sdk/drivers/inc/gr55xx_hal_rng.h | 443 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_spi.h | 1066 --- .../gr551x_sdk/drivers/inc/gr55xx_hal_tim.h | 411 -- .../gr551x_sdk/drivers/inc/gr55xx_hal_uart.h | 1041 --- .../gr551x_sdk/drivers/inc/gr55xx_hal_wdt.h | 318 - .../gr551x_sdk/drivers/inc/gr55xx_hal_xqspi.h | 855 --- .../gr551x_sdk/drivers/inc/gr55xx_ll_adc.h | 929 --- .../gr551x_sdk/drivers/inc/gr55xx_ll_aes.h | 1399 ---- .../drivers/inc/gr55xx_ll_aon_gpio.h | 1113 --- .../drivers/inc/gr55xx_ll_aon_wdt.h | 263 - .../drivers/inc/gr55xx_ll_calendar.h | 417 -- .../gr551x_sdk/drivers/inc/gr55xx_ll_cgc.h | 2714 ------- .../gr551x_sdk/drivers/inc/gr55xx_ll_comp.h | 396 - .../gr551x_sdk/drivers/inc/gr55xx_ll_dma.h | 3955 ---------- .../drivers/inc/gr55xx_ll_dual_tim.h | 633 -- .../gr551x_sdk/drivers/inc/gr55xx_ll_efuse.h | 692 -- .../gr551x_sdk/drivers/inc/gr55xx_ll_gpio.h | 1387 ---- .../gr551x_sdk/drivers/inc/gr55xx_ll_hmac.h | 1183 --- .../gr551x_sdk/drivers/inc/gr55xx_ll_i2c.h | 3316 --------- .../gr551x_sdk/drivers/inc/gr55xx_ll_i2s.h | 1632 ----- .../drivers/inc/gr55xx_ll_iso7816.h | 1264 ---- .../gr551x_sdk/drivers/inc/gr55xx_ll_msio.h | 716 -- .../gr551x_sdk/drivers/inc/gr55xx_ll_pkc.h | 2471 ------- .../gr551x_sdk/drivers/inc/gr55xx_ll_pwm.h | 1641 ----- .../gr551x_sdk/drivers/inc/gr55xx_ll_pwr.h | 1327 ---- .../gr551x_sdk/drivers/inc/gr55xx_ll_rng.h | 667 -- .../gr551x_sdk/drivers/inc/gr55xx_ll_spi.h | 2371 ------ .../gr551x_sdk/drivers/inc/gr55xx_ll_tim.h | 404 - .../gr551x_sdk/drivers/inc/gr55xx_ll_uart.h | 1425 ---- .../gr551x_sdk/drivers/inc/gr55xx_ll_wdt.h | 359 - .../gr551x_sdk/drivers/inc/gr55xx_ll_xqspi.h | 2511 ------- .../drivers/inc/gr55xx_rom_symbol.h | 144 - .../gr551x_sdk/drivers/inc/hal/gr55xx_delay.h | 0 .../gr551x_sdk/drivers/inc/hal/gr55xx_hal.h | 0 .../drivers/inc/hal/gr55xx_hal_adc.h | 0 .../drivers/inc/hal/gr55xx_hal_adc_temp_api.h | 0 .../drivers/inc/hal/gr55xx_hal_adc_vbat_api.h | 0 .../inc/hal/gr55xx_hal_adc_voltage_api.h | 0 .../drivers/inc/hal/gr55xx_hal_aes.h | 0 .../drivers/inc/hal/gr55xx_hal_aon_gpio.h | 0 .../drivers/inc/hal/gr55xx_hal_aon_gpio_ex.h | 0 .../drivers/inc/hal/gr55xx_hal_aon_wdt.h | 0 .../drivers/inc/hal/gr55xx_hal_bod.h | 0 .../drivers/inc/hal/gr55xx_hal_calendar.h | 0 .../drivers/inc/hal/gr55xx_hal_cgc.h | 0 .../drivers/inc/hal/gr55xx_hal_comp.h | 0 .../drivers/inc/hal/gr55xx_hal_conf.h | 0 .../drivers/inc/hal/gr55xx_hal_cortex.h | 0 .../drivers/inc/hal/gr55xx_hal_def.h | 0 .../drivers/inc/hal/gr55xx_hal_dma.h | 0 .../drivers/inc/hal/gr55xx_hal_dual_tim.h | 0 .../drivers/inc/hal/gr55xx_hal_efuse.h | 0 .../drivers/inc/hal/gr55xx_hal_exflash.h | 0 .../drivers/inc/hal/gr55xx_hal_gpio.h | 0 .../drivers/inc/hal/gr55xx_hal_gpio_ex.h | 0 .../drivers/inc/hal/gr55xx_hal_hmac.h | 0 .../drivers/inc/hal/gr55xx_hal_i2c.h | 0 .../drivers/inc/hal/gr55xx_hal_i2s.h | 0 .../drivers/inc/hal/gr55xx_hal_iso7816.h | 0 .../drivers/inc/hal/gr55xx_hal_msio.h | 0 .../drivers/inc/hal/gr55xx_hal_msio_ex.h | 0 .../drivers/inc/hal/gr55xx_hal_pkc.h | 0 .../drivers/inc/hal/gr55xx_hal_pwm.h | 0 .../drivers/inc/hal/gr55xx_hal_pwr.h | 0 .../drivers/inc/hal/gr55xx_hal_qspi.h | 0 .../drivers/inc/hal/gr55xx_hal_rng.h | 0 .../drivers/inc/hal/gr55xx_hal_sleep_timer.h | 0 .../drivers/inc/hal/gr55xx_hal_spi.h | 0 .../drivers/inc/hal/gr55xx_hal_spi_v2.h | 0 .../drivers/inc/hal/gr55xx_hal_tim.h | 0 .../drivers/inc/hal/gr55xx_hal_uart.h | 0 .../drivers/inc/hal/gr55xx_hal_wdt.h | 0 .../drivers/inc/hal/gr55xx_hal_xqspi.h | 0 .../drivers/inc/hal/gr55xx_ll_adc.h | 0 .../drivers/inc/hal/gr55xx_ll_aes.h | 0 .../drivers/inc/hal/gr55xx_ll_aon_gpio.h | 0 .../drivers/inc/hal/gr55xx_ll_aon_wdt.h | 0 .../drivers/inc/hal/gr55xx_ll_bod.h | 0 .../drivers/inc/hal/gr55xx_ll_calendar.h | 0 .../drivers/inc/hal/gr55xx_ll_cgc.h | 0 .../drivers/inc/hal/gr55xx_ll_comp.h | 0 .../drivers/inc/hal/gr55xx_ll_dma.h | 0 .../drivers/inc/hal/gr55xx_ll_dual_tim.h | 0 .../drivers/inc/hal/gr55xx_ll_efuse.h | 0 .../drivers/inc/hal/gr55xx_ll_gpio.h | 0 .../drivers/inc/hal/gr55xx_ll_hmac.h | 0 .../drivers/inc/hal/gr55xx_ll_i2c.h | 0 .../drivers/inc/hal/gr55xx_ll_i2s.h | 0 .../drivers/inc/hal/gr55xx_ll_iso7816.h | 0 .../drivers/inc/hal/gr55xx_ll_msio.h | 0 .../drivers/inc/hal/gr55xx_ll_pkc.h | 0 .../drivers/inc/hal/gr55xx_ll_pwm.h | 0 .../drivers/inc/hal/gr55xx_ll_pwr.h | 0 .../drivers/inc/hal/gr55xx_ll_rng.h | 0 .../drivers/inc/hal/gr55xx_ll_spi.h | 0 .../drivers/inc/hal/gr55xx_ll_tim.h | 0 .../drivers/inc/hal/gr55xx_ll_uart.h | 0 .../drivers/inc/hal/gr55xx_ll_wdt.h | 0 .../drivers/inc/hal/gr55xx_ll_xqspi.h | 0 .../gr551x_sdk/drivers/inc/hal/grx_hal.h | 0 .../gr551x_sdk/drivers/src/app_adc.c | 0 .../gr551x_sdk/drivers/src/app_adc_dma.c | 0 .../gr551x_sdk/drivers/src/app_aon_wdt.c | 0 .../gr551x_sdk/drivers/src/app_bod.c | 0 .../gr551x_sdk/drivers/src/app_comp.c | 0 .../gr551x_sdk/drivers/src/app_dma.c | 0 .../gr551x_sdk/drivers/src/app_dual_tim.c | 0 .../gr551x_sdk/drivers/src/app_gpiote.c | 0 .../drivers/src/app_graphics_qspi.c | 0 .../gr551x_sdk/drivers/src/app_i2c.c | 0 .../gr551x_sdk/drivers/src/app_i2c_dma.c | 0 .../gr551x_sdk/drivers/src/app_i2s.c | 0 .../gr551x_sdk/drivers/src/app_i2s_dma.c | 0 .../gr551x_sdk/drivers/src/app_io.c | 0 .../gr551x_sdk/drivers/src/app_iso7816.c | 0 .../gr551x_sdk/drivers/src/app_pwm.c | 0 .../gr551x_sdk/drivers/src/app_pwm_dma.c | 0 .../gr551x_sdk/drivers/src/app_pwr_mgmt.c | 0 .../gr551x_sdk/drivers/src/app_qspi.c | 0 .../gr551x_sdk/drivers/src/app_qspi_dma.c | 0 .../gr551x_sdk/drivers/src/app_rng.c | 0 .../gr551x_sdk/drivers/src/app_rtc.c | 0 .../gr551x_sdk/drivers/src/app_rtos_cfg.c | 0 .../gr551x_sdk/drivers/src/app_soft_encoder.c | 0 .../gr551x_sdk/drivers/src/app_spi.c | 0 .../gr551x_sdk/drivers/src/app_spi_dma.c | 0 .../gr551x_sdk/drivers/src/app_tim.c | 0 .../gr551x_sdk/drivers/src/app_uart.c | 0 .../gr551x_sdk/drivers/src/app_uart_dma.c | 0 .../gr551x_sdk/drivers/src/gr55xx_hal.c | 89 - .../gr551x_sdk/drivers/src/gr55xx_hal_adc.c | 102 - .../gr551x_sdk/drivers/src/gr55xx_hal_aes.c | 116 - .../drivers/src/gr55xx_hal_aon_gpio.c | 72 - .../drivers/src/gr55xx_hal_aon_wdt.c | 80 - .../drivers/src/gr55xx_hal_calendar.c | 107 - .../gr551x_sdk/drivers/src/gr55xx_hal_comp.c | 94 - .../drivers/src/gr55xx_hal_dual_tim.c | 101 - .../gr551x_sdk/drivers/src/gr55xx_hal_efuse.c | 86 - .../drivers/src/gr55xx_hal_exflash.c | 113 - .../gr551x_sdk/drivers/src/gr55xx_hal_gpio.c | 75 - .../gr551x_sdk/drivers/src/gr55xx_hal_hmac.c | 115 - .../gr551x_sdk/drivers/src/gr55xx_hal_i2c.c | 150 - .../gr551x_sdk/drivers/src/gr55xx_hal_i2s.c | 123 - .../gr551x_sdk/drivers/src/gr55xx_hal_pkc.c | 124 - .../gr551x_sdk/drivers/src/gr55xx_hal_pwm.c | 94 - .../gr551x_sdk/drivers/src/gr55xx_hal_pwr.c | 59 - .../gr551x_sdk/drivers/src/gr55xx_hal_qspi.c | 130 - .../gr551x_sdk/drivers/src/gr55xx_hal_rng.c | 105 - .../gr551x_sdk/drivers/src/gr55xx_hal_spi.c | 130 - .../gr551x_sdk/drivers/src/gr55xx_hal_tim.c | 92 - .../gr551x_sdk/drivers/src/gr55xx_hal_uart.c | 129 - .../gr551x_sdk/drivers/src/gr55xx_hal_wdt.c | 106 - .../gr551x_sdk/drivers/src/gr55xx_hal_xqspi.c | 95 - .../gr551x_sdk/external/segger_rtt/BUILD.gn | 0 .../sdk_liteos/gr551x_sdk/platform/BUILD.gn | 1 + .../cmsis/core/include/cmsis_compiler.h | 0 .../cortex-m/cmsis/core/include/cmsis_gcc.h | 0 .../cmsis/core/include/cmsis_version.h | 0 .../cortex-m/cmsis/core/include/core_cm4.h | 0 .../cortex-m/cmsis/core/include/mpu_armv7.h | 0 .../arch/arm/cortex-m/gcc/startup_gr55xx.s | 218 + .../gr551x_sdk/platform/boards/board_SK.c | 0 .../gr551x_sdk/platform/boards/board_SK.h | 0 .../platform/boards/unity_test_config.h | 0 .../gr551x_sdk/platform/include/gr_plat.h | 0 .../gr551x_sdk/platform/include/gr_soc.h | 0 .../platform/include/scatter_common.h | 0 .../platform/soc/common/gr_interrupt.c | 0 .../platform/soc/common/gr_platform.c | 0 .../platform/soc/common/gr_system.c | 0 .../gr551x_sdk/platform/soc/include/ble_cfg.h | 0 .../gr551x_sdk/platform/soc/include/gr551xx.h | 0 .../gr551x_sdk/platform/soc/include/gr55xx.h | 0 .../platform/soc/include/grx_soc_reg.h | 0 .../platform/soc/include/system_gr55xx.h | 0 .../soc/linker/gcc/gcc_linker_gr5513.lds | 0 .../soc/linker/gcc/gcc_linker_gr5515.lds | 0 .../soc/linker/gcc/hardfloat_lib/libble_sdk.a | Bin .../platform/soc/linker/gcc/libble_sdk.a | Bin .../soc/linker/gcc/rom_symbol_gcc.txt | 0 .../platform/soc/linker/gcc/startup_gr55xx.s | 193 + .../gr551x_sdk/platform/soc/src/gr_soc.c | 0 .../toolchain/gr551x/include/gr551xx.h | 6476 ----------------- .../toolchain/gr551x/include/gr55xx.h | 223 - .../toolchain/gr551x/include/scatter_common.h | 76 - .../toolchain/gr551x/include/system_gr55xx.h | 168 - .../gr551x/source/interrupt_gr55xx.c | 246 - .../toolchain/gr551x/source/platform_gr55xx.c | 313 - .../toolchain/gr551x/source/system_gr55xx.c | 234 - gr551x/sdk_liteos/liteos_m/los_port_pm.c | 0 gr551x/sdk_liteos/liteos_m/los_port_pm.h | 49 - gr551x/sdk_liteos/liteos_m/target_config.h | 0 gr551x/sdk_liteos/platform/BUILD.gn | 23 - .../sdk_liteos/platform/linker/gr5515.ld.tmpl | 0 gr551x/sdk_liteos/platform/main/BUILD.gn | 0 gr551x/sdk_liteos/platform/startup/BUILD.gn | 18 - gr551x/sdk_liteos/platform/startup/gr551x.ld | 249 - .../platform/startup/startup_gr55xx.s | 292 - gr551x/sdk_liteos/platform/system/uart.c | 0 gr551x/sdk_liteos/platform/system/uart.h | 0 gr551x/sdk_liteos/platform/uart/BUILD.gn | 22 - gr551x/sdk_liteos/platform/uart/uart.c | 163 - gr551x/sdk_liteos/platform/uart/uart.h | 52 - .../third_party_adapter/mbedtls/BUILD.gn | 0 .../mbedtls/config/mbedtls_config_gr551x.h | 0 gr551x/tools/bin_create.py | 406 -- 672 files changed, 412 insertions(+), 84222 deletions(-) mode change 100644 => 100755 gr551x/BUILD.gn mode change 100644 => 100755 gr551x/NOTICE mode change 100644 => 100755 gr551x/components/watchdog/BUILD.gn mode change 100644 => 100755 gr551x/components/watchdog/hi_watchdog.c mode change 100644 => 100755 gr551x/gr551x_executable.gni mode change 100644 => 100755 gr551x/sdk_liteos/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/config/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/config/custom_config.h mode change 100644 => 100755 gr551x/sdk_liteos/config/flash_scatter_config.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/README.md mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/BUILD.gn delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_dma.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_config.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_error.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_gpiote.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_i2c.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_io.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwm.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwr_mgmt.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_qspi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_rng.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_rtos_cfg.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_spi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_systick.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_uart.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_dma.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_gpiote.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_i2c.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_io.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwm.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwr_mgmt.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_qspi.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rng.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rtos_cfg.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_spi.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_systick.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_uart.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/boards/boards.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_measure_mux_signal_api.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_measure_mux_signal_api.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_spi_flash.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_spi_flash.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_tim_delay.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_tim_delay.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735_config.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735_config.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/Lib/GCC/libarm_cortexM4lf_math.a mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_common_tables.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_const_structs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_math.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_mve_tables.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_vec_math.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/app_alarm.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/app_alarm.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/app_assert.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/app_assert.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error_cfg.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/cortex_backtrace.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/cortex_backtrace.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_gcc.s mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_iar.s mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_keil.s mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key_core.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key_core.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/app_linked_list.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/app_linked_list.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_dump_port.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_dump_port.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_store.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_store.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/app_memory.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/app_memory.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/app_queue.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/app_queue.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/app_scheduler.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/app_scheduler.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/app_timer.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/app_timer.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd_utils.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd_utils.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/ble_advertising.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/ble_advertising.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/ble_connect.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/ble_connect.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/ble_gatt_service.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/ble_gatt_service.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/ble_scanner.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/ble_scanner.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/ble_time.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/ble_time.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_aes.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_ecc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_ecc_port.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_gcm.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_pkc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_pkc_port.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_rsa.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_rsa_port.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_sha256.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_aes.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_ecc.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_ecc_port.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_gcm.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_pkc.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_pkc_port.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_rsa.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_rsa_port.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_sha256.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/dfu_master.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/dfu_master.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/dfu_port.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/dfu_port.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/fault_trace.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/fault_trace.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test_int.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/font_gb2312.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_animation.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_animation.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_basic.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_basic.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_color.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_color.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gb2312_font.bin mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gb2312_font.hex mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_animation_config.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_config.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_gb2312_config.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcd_config.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcm_cfg.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcm_config.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_oled_config.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_convert_color.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_convert_color.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font5_7.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font5_7.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font8_8.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font8_8.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_gb2312.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_gb2312.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_macro.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_other.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_other.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_include.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_exflash_user_operation.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_exflash_user_operation.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_flash.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_flash.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/vflash/vflash.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/vflash/vflash.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/hci_uart.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/hci_uart.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/pmu_calibration.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/pmu_calibration.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/ring_buffer.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/ring_buffer.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/sensorsim.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/sensorsim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/user_efuse.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/user_efuse.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/utility.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/utility.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/uart_simu_key_init.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/uart_simu_key_init.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch_tab.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/patch/symbol_table/rom_symbol_gcc.txt mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/ags.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/ags.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/ams_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/ams_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_protocol.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_protocol.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/ans.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/ans.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/ans_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/ans_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/bas.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/bas.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/bas_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/bas_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/bcs.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/bcs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/bps.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/bps.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_types.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_utils.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_utils.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_srv_disc_utils.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_srv_disc_utils.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/cscs.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/cscs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/cts.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/cts.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/cts_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/cts_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/dis.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/dis.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/dis_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/dis_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/dss.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/dss.h delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.c delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.h delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.c delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_db.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_db.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_racp.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_racp.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/gus.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/gus.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/gus_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/gus_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/hids.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/hids.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/hrrcps.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/hrrcps.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/hrs.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/hrs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/hrs_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/hrs_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/hts.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/hts.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/ias.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/ias.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/ias_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/ias_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/lls.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/lls.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/lls_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/lls_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/lms.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/lms.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/lns.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/lns.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/mlmr.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/mlmr.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/mlmr_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/mlmr_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/ndcs.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/ndcs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/otas.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/otas.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/otas_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/otas_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/pass.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/pass.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/pass_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/pass_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/pcs.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/pcs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/rscs.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/rscs.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/rscs_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/rscs_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/rtus.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/rtus.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/sample_service.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/sample_service.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/ths.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/ths.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/ths_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/ths_c.h delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.c delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/tps.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/tps.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/tps_c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/tps_c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/uds.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/uds.h delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.c delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/wss.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/wss.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_att.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_audio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_error.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_event.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gapc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gapm.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gatt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gattc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gatts.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_l2cap.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_lcp.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_prf.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_sec.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_dfu.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_fpb.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_lcp.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_nvds.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_pwr.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_sys.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_sys_cfg.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr_includes.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/grx_sys.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/lcp_sdk.h delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/LICENSE delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/libble_sdk.a mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/patch.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/patch_tab.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/components/sdk/platform_sdk.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_adc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_adc_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_aon_wdt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_bod.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_comp.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv_config.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv_error.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_dual_tim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_gpiote.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_graphics_qspi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2c_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2s.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2s_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_io.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_iso7816.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwm.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwm_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwr_mgmt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_qspi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_qspi_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rng.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rtc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rtos_cfg.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_soft_encoder.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_spi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_spi_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_tim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_uart.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_uart_dma.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_delay.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_adc.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aes.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio_ex.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_wdt.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_calendar.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cgc.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_comp.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_conf.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cortex.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_def.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dma.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dual_tim.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_efuse.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_exflash.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio_ex.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_hmac.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2c.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2s.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_iso7816.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio_ex.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pkc.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwm.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwr.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_qspi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_rng.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_spi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_tim.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_uart.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_wdt.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_xqspi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_adc.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aes.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_gpio.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_wdt.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_calendar.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_cgc.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_comp.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dma.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dual_tim.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_efuse.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_gpio.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_hmac.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2c.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2s.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_iso7816.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_msio.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pkc.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwm.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwr.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_rng.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_spi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_tim.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_uart.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_wdt.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_xqspi.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_rom_symbol.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_delay.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_temp_api.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_vbat_api.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_voltage_api.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aes.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_gpio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_gpio_ex.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_wdt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_bod.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_calendar.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_cgc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_comp.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_conf.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_cortex.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_def.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_dual_tim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_efuse.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_exflash.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_gpio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_gpio_ex.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_hmac.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_i2c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_i2s.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_iso7816.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_msio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_msio_ex.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pkc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pwm.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pwr.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_qspi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_rng.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_sleep_timer.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_spi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_spi_v2.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_tim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_uart.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_wdt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_xqspi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_adc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aes.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aon_gpio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aon_wdt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_bod.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_calendar.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_cgc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_comp.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_dma.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_dual_tim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_efuse.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_gpio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_hmac.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_i2c.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_i2s.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_iso7816.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_msio.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pkc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pwm.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pwr.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_rng.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_spi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_tim.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_uart.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_wdt.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_xqspi.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/grx_hal.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_adc.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_adc_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_aon_wdt.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_bod.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_comp.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_dual_tim.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_gpiote.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_graphics_qspi.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2c.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2c_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2s.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2s_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_io.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_iso7816.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwm.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwm_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwr_mgmt.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_qspi.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_qspi_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rng.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rtc.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rtos_cfg.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_soft_encoder.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_spi.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_spi_dma.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_tim.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_uart.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_uart_dma.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_adc.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aes.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_gpio.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_wdt.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_calendar.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_comp.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_dual_tim.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_efuse.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_exflash.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_gpio.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_hmac.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2c.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2s.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pkc.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwm.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwr.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_qspi.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_rng.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_spi.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_tim.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_uart.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_wdt.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_xqspi.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/external/segger_rtt/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_compiler.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_gcc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_version.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/core_cm4.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/mpu_armv7.h create mode 100755 gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/boards/board_SK.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/boards/board_SK.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/boards/unity_test_config.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/include/gr_plat.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/include/gr_soc.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/include/scatter_common.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_interrupt.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_platform.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_system.c mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/ble_cfg.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/gr551xx.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/gr55xx.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/grx_soc_reg.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/system_gr55xx.h mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/hardfloat_lib/libble_sdk.a mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/libble_sdk.a mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/rom_symbol_gcc.txt create mode 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s mode change 100644 => 100755 gr551x/sdk_liteos/gr551x_sdk/platform/soc/src/gr_soc.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr551xx.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr55xx.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/scatter_common.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/system_gr55xx.h delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/interrupt_gr55xx.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/platform_gr55xx.c delete mode 100755 gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/system_gr55xx.c mode change 100644 => 100755 gr551x/sdk_liteos/liteos_m/los_port_pm.c delete mode 100644 gr551x/sdk_liteos/liteos_m/los_port_pm.h mode change 100644 => 100755 gr551x/sdk_liteos/liteos_m/target_config.h delete mode 100755 gr551x/sdk_liteos/platform/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/platform/linker/gr5515.ld.tmpl mode change 100644 => 100755 gr551x/sdk_liteos/platform/main/BUILD.gn delete mode 100755 gr551x/sdk_liteos/platform/startup/BUILD.gn delete mode 100755 gr551x/sdk_liteos/platform/startup/gr551x.ld delete mode 100755 gr551x/sdk_liteos/platform/startup/startup_gr55xx.s mode change 100644 => 100755 gr551x/sdk_liteos/platform/system/uart.c mode change 100644 => 100755 gr551x/sdk_liteos/platform/system/uart.h delete mode 100755 gr551x/sdk_liteos/platform/uart/BUILD.gn delete mode 100755 gr551x/sdk_liteos/platform/uart/uart.c delete mode 100755 gr551x/sdk_liteos/platform/uart/uart.h mode change 100644 => 100755 gr551x/sdk_liteos/third_party_adapter/mbedtls/BUILD.gn mode change 100644 => 100755 gr551x/sdk_liteos/third_party_adapter/mbedtls/config/mbedtls_config_gr551x.h delete mode 100755 gr551x/tools/bin_create.py diff --git a/gr551x/BUILD.gn b/gr551x/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/NOTICE b/gr551x/NOTICE old mode 100644 new mode 100755 diff --git a/gr551x/components/watchdog/BUILD.gn b/gr551x/components/watchdog/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/components/watchdog/hi_watchdog.c b/gr551x/components/watchdog/hi_watchdog.c old mode 100644 new mode 100755 diff --git a/gr551x/gr551x_executable.gni b/gr551x/gr551x_executable.gni old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/BUILD.gn b/gr551x/sdk_liteos/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/config/BUILD.gn b/gr551x/sdk_liteos/config/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/config/custom_config.h b/gr551x/sdk_liteos/config/custom_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/config/flash_scatter_config.h b/gr551x/sdk_liteos/config/flash_scatter_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/README.md b/gr551x/sdk_liteos/gr551x_sdk/README.md old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_dma.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_dma.h deleted file mode 100755 index bb1f384..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_dma.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_dma.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of DMA app library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_DMA DMA - * @brief DMA APP module driver. - * @{ - */ - - -#ifndef _APP_DMA_H_ -#define _APP_DMA_H_ - -#include "gr55xx_hal.h" -#include "app_drv_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAL_DMA_MODULE_ENABLED - -/** @addtogroup APP_DMA_ENUMERATIONS Enumerations - * @{ - */ -/** - * @brief DMA event Enumerations definition - */ -typedef enum { - APP_DMA_EVT_ERROR, /**< The event of error interrupt. */ - APP_DMA_EVT_TFR, /**< The event of transfer complete interrupt. */ -} app_dma_evt_type_t; -/** @} */ - -/** @addtogroup APP_DMA_STRUCTURES Structures - * @{ - */ -/** - * @brief DMA parameters structure definition - */ -typedef struct { - dma_channel_t channel_number; /**< Specifies the channel of DMA. */ - dma_init_t init; /**< DMA communication parameters. */ -} app_dma_params_t; -/** @} */ - -/** @addtogroup APP_DMA_TYPEDEFS Typedefs - * @{ - */ -/** - * @brief DMA event callback definition - */ -typedef void (*app_dma_evt_handler_t)(app_dma_evt_type_t type); - -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup APP_DMA_DRIVER_FUNCTIONS Functions - * @{ - */ -/** - **************************************************************************************** - * @brief Initialize the APP DMA DRIVER according to the specified parameters - * in the app_dma_params_t and app_dma_evt_handler_t. - * - * @param[in] p_params: Pointer to app_dma_params_t parameter which contains the - * configuration information for the specified DMA module. - * @param[in] evt_handler: DMA user callback function. - * - * @return DMA ID - **************************************************************************************** - */ -int16_t app_dma_init(app_dma_params_t *p_params, app_dma_evt_handler_t evt_handler); - -/** - **************************************************************************************** - * @brief De-initialize the APP ADC DRIVER peripheral. - * - * @param[in] ins_id: Deinitialize DMA channel for a specific ID. - * - * @return Result of De-initialization. - **************************************************************************************** - */ -uint16_t app_dma_deinit(int16_t ins_id); - -/** - **************************************************************************************** - * @brief Start the DMA Transfer. - * - * @param[in] id: DMA channel id. - * @param[in] src_address: The source memory Buffer address - * @param[in] dst_address: The destination memory Buffer address - * @param[in] data_length: The length of data to be transferred from source to destination, ranging between 0 and 4095. - **************************************************************************************** - */ -uint16_t app_dma_start(int16_t id, uint32_t src_address, uint32_t dst_address, uint32_t data_length); - -/** - **************************************************************************************** - * @brief Return the DMA handle. - * - * @param[in] id: DMA Channel ID. - * - * @return Pointer to the specified ID's DMA handle. - **************************************************************************************** - */ -dma_handle_t *app_dma_get_handle(int16_t id); - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -/** - **************************************************************************************** - * @brief resume dma after wake up for other modules. - * - * @param[in] id: DMA Channel ID. - * - * @return void. - **************************************************************************************** - */ -void dma_wake_up(int16_t id); -#endif - - -/** @} */ - -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_config.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_config.h deleted file mode 100755 index 316a08b..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_config.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_drv_config.h - * @author BLE Driver Team - * @brief Header file of app driver config code. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_DRIVER_CONFIG DRIVER CONFIG - * @brief APP DRIVER CONFIG - * @{ - */ - - -#ifndef _APP_DRV_CONFIG_H_ -#define _APP_DRV_CONFIG_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup APP_DRV_PERIPHERAL_PRIORITY_DEFINE Defines - * @{ - */ -/**@brief APP driver peripheral priority define. */ -#ifndef APP_DRIVER_ADC_WAPEUP_PRIORITY -#define APP_DRIVER_ADC_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< ADC Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_AES_WAPEUP_PRIORITY -#define APP_DRIVER_AES_WAPEUP_PRIORITY WAPEUP_PRIORITY_MID /**< AES Wakeup priority Mid */ -#endif - -#ifndef APP_DRIVER_COMP_WAPEUP_PRIORITY -#define APP_DRIVER_COMP_WAPEUP_PRIORITY WAPEUP_PRIORITY_LOW /**< COMP Wakeup priority Low */ -#endif - -#ifndef APP_DRIVER_DUAL_TIM_WAPEUP_PRIORITY -#define APP_DRIVER_DUAL_TIM_WAPEUP_PRIORITY WAPEUP_PRIORITY_MID /**< DUAL TIM Wakeup priority Mid */ -#endif - -#ifndef APP_DRIVER_DMA_WAPEUP_PRIORITY -#define APP_DRIVER_DMA_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< DMA Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_GPIOTE_WAPEUP_PRIORITY -#define APP_DRIVER_GPIOTE_WAPEUP_PRIORITY WAPEUP_PRIORITY_LOW /**< GPIOTE Wakeup priority Low */ -#endif - -#ifndef APP_DRIVER_SYSTICK_WAPEUP_PRIORITY -#define APP_DRIVER_SYSTICK_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< SysTick Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_UART_WAPEUP_PRIORITY -#define APP_DRIVER_UART_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< Uart Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_HMAC_WAPEUP_PRIORITY -#define APP_DRIVER_HMAC_WAPEUP_PRIORITY WAPEUP_PRIORITY_MID /**< Hmac Wakeup priority Mid */ -#endif - -#ifndef APP_DRIVER_I2C_WAPEUP_PRIORITY -#define APP_DRIVER_I2C_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< I2C Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_I2S_WAPEUP_PRIORITY -#define APP_DRIVER_I2S_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< I2S Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_QSPI_WAPEUP_PRIORITY -#define APP_DRIVER_QSPI_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< QSPI Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_RNG_WAPEUP_PRIORITY -#define APP_DRIVER_RNG_WAPEUP_PRIORITY WAPEUP_PRIORITY_MID /**< RNG Wakeup priority Mid */ -#endif - -#ifndef APP_DRIVER_SPI_WAPEUP_PRIORITY -#define APP_DRIVER_SPI_WAPEUP_PRIORITY WAPEUP_PRIORITY_HIGH /**< SPI Wakeup priority High */ -#endif - -#ifndef APP_DRIVER_TIM_WAPEUP_PRIORITY -#define APP_DRIVER_TIM_WAPEUP_PRIORITY WAPEUP_PRIORITY_MID /**< TIM Wakeup priority Mid */ -#endif - -#ifndef APP_DRIVER_PWM_WAPEUP_PRIORITY -#define APP_DRIVER_PWM_WAPEUP_PRIORITY WAPEUP_PRIORITY_MID /**< PWM Wakeup priority Mid */ -#endif - -/**@} */ - - -/**@addtogroup APP_DRV_WAPEUP_PRIORITY_ENUM Enumerations - * @{ - */ -/**@brief APP driver peripheral wakeup priority define. */ -typedef enum { - WAPEUP_PRIORITY_LOW = 1, /**< Wakeup priority low */ - WAPEUP_PRIORITY_MID, /**< Wakeup priority mid */ - WAPEUP_PRIORITY_HIGH /**< Wakeup priority high */ -} wakeup_priority_t; -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ -/** @} */ -/** @} */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_error.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_error.h deleted file mode 100755 index 6d447e9..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_drv_error.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_drv_error.h - * @author BLE Driver Team - * @brief Header file of app driver error code. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_DRIVER_ERROR ERROR DEFINE - * @brief APP ERROR DEFINE - * @{ - */ - - -#ifndef _APP_DRV_ERROR_H_ -#define _APP_DRV_ERROR_H_ - -#include "gr55xx_hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup APP_DRV_ERR Defines - * @{ - */ -/**@addtogroup APP_DRV_ERR_CODE App Driver error codes - * @{ - */ -#define APP_DRV_SUCCESS 0x0000 /**< Successful. */ -#define APP_DRV_ERR_HAL 0x0001 /**< Hal internal error. */ -#define APP_DRV_ERR_BUSY 0x0002 /**< Driver is busy. */ -#define APP_DRV_ERR_TIMEOUT 0x0003 /**< Timeout occurred. */ -#define APP_DRV_ERR_INVALID_PARAM 0x0004 /**< Invalid parameter supplied. */ -#define APP_DRV_ERR_POINTER_NULL 0x0005 /**< Invalid pointer supplied. */ -#define APP_DRV_ERR_INVALID_TYPE 0x0006 /**< Invalid type suplied. */ -#define APP_DRV_ERR_INVALID_MODE 0x0007 /**< Invalid mode suplied. */ -#define APP_DRV_ERR_INVALID_ID 0x0008 /**< Invalid ID suplied. */ -/** @} */ - -/**@addtogroup APP_DRV_ERR_CODE_CHECK App Driver error code check - * @{ - */ -/**@brief App Driver error code check. */ -#define APP_DRV_ERR_CODE_CHECK(err_code) \ - do \ - { \ - if ((err_code) != APP_DRV_SUCCESS) \ - { \ - return err_code; \ - } \ - } while (0) -/** @} */ - -/**@addtogroup HAL_DRV_ERR_CODE_CHECK Hal Driver error code check - * @{ - */ -/**@brief Hal Driver error code check. */ -#define HAL_ERR_CODE_CHECK(err_code) \ - do \ - { \ - if ((err_code) != HAL_OK) \ - { \ - return (uint16_t)(err_code); \ - } \ - } while (0) -/** @} */ -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ -/** @} */ -/** @} */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_gpiote.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_gpiote.h deleted file mode 100755 index 75f1801..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_gpiote.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_gpiote.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of GPIO Interrupt app library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_GPIO_INTERRUPT GPIO INTERRUPT - * @brief GPIO INTERRUPT APP module driver. - * @{ - */ - - -#ifndef _APP_GPIOTE_H_ -#define _APP_GPIOTE_H_ - -#include "app_io.h" -#include "app_drv_error.h" - -/** @addtogroup APP_GPIO_INTERRUPT_STRUCTURES Structures - * @{ - */ - -/** - * @brief GPIO Interrupt event Structure definition - */ -typedef struct { - app_io_type_t type; /**< Type of event. */ - uint32_t pin; /**< Specifies the IO pins to be configured. */ - app_ctx_type_t ctx_type; /**< Type of handler context. */ -} app_gpiote_evt_t; - -/** - * @brief GPIOTE input event handler type. - */ -typedef void (*app_gpiote_event_handler_t)(app_gpiote_evt_t *p_evt); - -/** - * @brief GPIOTE callback type. - */ -typedef void (*app_io_callback_t)(app_gpiote_evt_t *p_evt); - -/** - * @brief GPIOTE Interrupt parameters structure definition - */ -typedef struct { - app_io_type_t type; /**< Specifies IO type */ - uint32_t pin; /**< Specifies the IO pins to be configured. */ - app_io_mode_t mode; /**< Specifies the IO mode for the selected pins. */ - app_io_pull_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. */ - app_handle_mode_t handle_mode; /**< Specifies the IO wakeup mode. */ - app_io_callback_t io_evt_cb; /**< IO callback function. */ -} app_gpiote_param_t; - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup APP_GPIOTE_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the APP GPIO Interrupt DRIVER according to the specified parameters - * in the app_gpiote_param_t and app_gpiote_event_handler_t. - * - * @param[in] p_params: Pointer to app_gpiote_param_t parameter which contains the - * configuration information for the specified GPIO. - * @param[in] table_cnt: Used GPIO number. - * - * @return Result of initialization. - **************************************************************************************** - */ -uint16_t app_gpiote_init(const app_gpiote_param_t *p_params, uint8_t table_cnt); - -/** - **************************************************************************************** - * @brief De-initialize the APP GPIO Interrupt DRIVER peripheral. - * - **************************************************************************************** - */ -void app_gpiote_deinit(void); - -/** - **************************************************************************************** - * @brief Config the APP GPIO Interrupt DRIVER according to the specified parameters - * in the app_gpiote_param_t. - * - * @param[in] p_config: Pointer to app_gpiote_param_t parameter which contains the - * configuration information for the specified GPIO. - * - * @return Result of initialization. - **************************************************************************************** - */ -uint16_t app_gpiote_config(const app_gpiote_param_t *p_config); - - -/** @} */ - -#endif - -/** @} */ -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_i2c.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_i2c.h deleted file mode 100755 index 1afe9ad..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_i2c.h +++ /dev/null @@ -1,402 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_i2c.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of I2C app library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_IIC IIC - * @brief IIC APP module driver. - * @{ - */ - - -#ifndef _APP_I2C_H_ -#define _APP_I2C_H_ - -#include "gr55xx_hal.h" -#include "app_io.h" -#include "app_drv_error.h" -#ifdef ENV_USE_FREERTOS -#include "app_rtos_cfg.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAL_I2C_MODULE_ENABLED - -/** @addtogroup APP_I2C_ENUM Enumerations - * @{ - */ - -/** - * @brief I2C module Enumerations definition - */ -typedef enum { - APP_I2C_ID_0, /**< I2C module 0. */ - APP_I2C_ID_1, /**< I2C module 1. */ - APP_I2C_ID_MAX /**< Only for check parameter, not used as input parameters. */ -} app_i2c_id_t; - -/** - * @brief I2C role Enumerations definition - */ -typedef enum { - APP_I2C_ROLE_MASTER, /**< I2C master device. */ - APP_I2C_ROLE_SLAVE, /**< I2C slave device. */ - APP_I2C_ROLE_MAX, /**< Only for check parameter, not used as input parameters. */ -} app_i2c_role_t; - -/** - * @brief I2C operating mode Enumerations definition - */ -typedef enum { - APP_I2C_TYPE_INTERRUPT, /**< Interrupt operation mode */ - APP_I2C_TYPE_POLLING, /**< Polling operation mode */ - APP_I2C_TYPE_DMA, /**< DMA operation mode */ - APP_I2C_TYPE_MAX, /**< Only for check parameter, not used as input parameters. */ -} app_i2c_type_t; - -/** - * @brief I2C event Enumerations definition - */ -typedef enum { - APP_I2C_EVT_ERROR, /**< Error reported by I2C peripheral. */ - APP_I2C_EVT_TX_CPLT, /**< Requested TX transfer completed. */ - APP_I2C_EVT_RX_DATA, /**< Requested RX transfer completed. */ -} app_i2c_evt_type_t; -/** @} */ - -/** @addtogroup APP_I2C_STRUCTURES Structures - * @{ - */ -/** - * @brief I2C IO Structures - */ -typedef struct { - app_io_type_t type; /**< Specifies the type of SPI IO. */ - app_io_mux_t mux; /**< Specifies the Peripheral to be connected to the selected pins. */ - uint32_t pin; /**< Specifies the IO pins to be configured. - This parameter can be any value of @ref GR551x_pins. */ - app_io_pull_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. */ -} app_i2c_pin_t; - -/** - * @brief I2C IO configuration Structures - */ -typedef struct { - app_i2c_pin_t scl; /**< Set the configuration of I2C SCL pin. */ - app_i2c_pin_t sda; /**< Set the configuration of I2C SDA pin. */ -} app_i2c_pin_cfg_t; - -/** - * @brief I2C operate mode Enumerations definition - */ -typedef struct { - app_i2c_type_t type; /**< Specifies the operation mode of I2C. */ - dma_channel_t tx_dma_channel; /**< Specifies the dma channel of I2C TX. */ - dma_channel_t rx_dma_channel; /**< Specifies the dma channel of I2C RX. */ -} app_i2c_mode_t; - -/** - * @brief I2C parameters structure definition - */ -typedef struct { - app_i2c_id_t id; /**< specified I2C module ID. */ - app_i2c_role_t role; /**< specified the role of I2C. */ - app_i2c_pin_cfg_t pin_cfg; /**< the pin configuration information for the specified I2C module. */ - app_i2c_mode_t use_mode; /**< I2C operate mode. */ - i2c_init_t init; /**< I2C communication parameters. */ -} app_i2c_params_t; - -/** - * @brief I2C event structure definition - */ -typedef struct { - app_i2c_evt_type_t type; /**< Type of event. */ - union { - uint32_t error_code; /**< I2C Error code . */ - uint16_t size; /**< I2C transmitted/received counter. */ - } data; /**< I2C data. */ -} app_i2c_evt_t; - -/** - * @brief I2C event callback definition - */ -typedef void (*app_i2c_evt_handler_t)(app_i2c_evt_t *p_evt); - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_APP_I2C_DRIVER_FUNCTIONS Functions - * @{ - */ -/** - **************************************************************************************** - * @brief Initialize the APP I2C DRIVER according to the specified parameters - * in the app_i2c_params_t and app_i2c_evt_handler_t. - * @note If interrupt mode is set, you can use blocking mode. Conversely, if blocking mode - * is set, you can't use interrupt mode. - * - * @param[in] p_params: Pointer to app_i2c_params_t parameter which contains the - * configuration information for the specified I2C module. - * @param[in] evt_handler: I2C user callback function. - * - * @return Result of initialization. - **************************************************************************************** - */ -uint16_t app_i2c_init(app_i2c_params_t *p_params, app_i2c_evt_handler_t evt_handler); - -/** - **************************************************************************************** - * @brief De-initialize the APP I2C DRIVER peripheral. - * - * @param[in] id: De-initialize for a specific ID. - * - * @return Result of De-initialization. - **************************************************************************************** - */ -uint16_t app_i2c_deinit(app_i2c_id_t id); - -/** - **************************************************************************************** - * @brief Receive in master or slave mode an amount of data in blocking mode. - * - * @param[in] id: which I2C module want to receive. - * @param[in] target_address: Target device address: The device 7 bits address value in datasheet - must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_receive_sync(app_i2c_id_t id, uint16_t target_address, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive in master or slave mode an amount of data in non-blocking mode with Interrupt/DMA. - * - * @param[in] id: which I2C module want to receive. - * @param[in] target_address: Target device address: The device 7 bits address value in datasheet - must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_receive_async(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Transmits in master or slave mode an amount of data in blocking mode. - * - * @param[in] id: which I2C module want to transmit. - * @param[in] target_address: Target device address: The device 7 bits address value in datasheet - must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_transmit_sync(app_i2c_id_t id, uint16_t target_address, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmits in master or slave mode an amount of data in non-blocking mode with Interrupt/DMA. - * - * @param[in] id: which I2C module want to transmit. - * @param[in] target_address: Target device address: The device 7 bits address value in datasheet - must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_transmit_async(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Read an amount of data in blocking mode from a specific memory address - * - * @param[in] id: I2C module ID. - * @param[in] dev_address: Target device address: The device 7 bits address value - * in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_mem_read_sync(app_i2c_id_t id, uint16_t dev_address, - uint16_t mem_address, uint16_t mem_addr_size, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Read an amount of data in non-blocking mode with Interrupt/DMA from a specific memory address - * - * @param[in] id: I2C module ID. - * @param[in] dev_address: Target device address: The device 7 bits address value in - * datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_mem_read_async(app_i2c_id_t id, uint16_t dev_address, - uint16_t mem_address, uint16_t mem_addr_size, - uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Write an amount of data in blocking mode to a specific memory address - * - * @param[in] id: I2C module ID. - * @param[in] dev_address: Target device address: The device 7 bits address value in - * datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_mem_write_sync(app_i2c_id_t id, uint16_t dev_address, - uint16_t mem_address, uint16_t mem_addr_size, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Write an amount of data in non-blocking mode with Interrupt/DMA to a specific memory address - * - * @param[in] id: I2C module ID. - * @param[in] dev_address: Target device address: The device 7 bits address value in - * datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_mem_write_async(app_i2c_id_t id, uint16_t dev_address, - uint16_t mem_address, uint16_t mem_addr_size, - uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Return the I2C handle. - * - * @param[in] id: I2C module ID. - * - * @return Pointer to the specified ID's I2C handle. - **************************************************************************************** - */ -i2c_handle_t *app_i2c_get_handle(app_i2c_id_t id); - -#ifdef ENV_RTOS_USE_SEMP - -/** - **************************************************************************************** - * @brief [RTOS] Receive in master or slave mode an amount of data in blocking mode. - * - * @param[in] id: I2C module ID. - * @param[in] target_address: Target device address: The device 7 bits address value in datasheet - must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_receive_sem_sync(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief [RTOS] Transmits in master or slave mode an amount of data in blocking mode. - * - * @param[in] id: I2C module ID. - * @param[in] target_address: Target device address: The device 7 bits address value in datasheet - must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_i2c_transmit_sem_sync(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size); - -#endif - -/** @} */ - - -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ -/** @} */ -/** @} */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_io.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_io.h deleted file mode 100755 index 1366f28..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_io.h +++ /dev/null @@ -1,302 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_io.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of GPIO app library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_GPIO GPIO - * @brief GPIO APP module driver. - * @{ - */ - - -#ifndef _APP_IO_H_ -#define _APP_IO_H_ - -#include -#include "app_drv_error.h" - -/** @addtogroup APP_GPIO_PIN_DEFINES Defines - * @{ - */ -/** @addtogroup GR551x_pins IO pins - * @{ - */ - -/** -* @brief APP_GPIO_DEFINE Defines -*/ -#define APP_IO_PIN_0 ((uint32_t)0x00000001U) /**< Pin 0 selected */ -#define APP_IO_PIN_1 ((uint32_t)0x00000002U) /**< Pin 1 selected */ -#define APP_IO_PIN_2 ((uint32_t)0x00000004U) /**< Pin 2 selected */ -#define APP_IO_PIN_3 ((uint32_t)0x00000008U) /**< Pin 3 selected */ -#define APP_IO_PIN_4 ((uint32_t)0x00000010U) /**< Pin 4 selected */ -#define APP_IO_PIN_5 ((uint32_t)0x00000020U) /**< Pin 5 selected */ -#define APP_IO_PIN_6 ((uint32_t)0x00000040U) /**< Pin 6 selected */ -#define APP_IO_PIN_7 ((uint32_t)0x00000080U) /**< Pin 7 selected */ -#define APP_IO_PIN_8 ((uint32_t)0x00000100U) /**< Pin 8 selected */ -#define APP_IO_PIN_9 ((uint32_t)0x00000200U) /**< Pin 9 selected */ -#define APP_IO_PIN_10 ((uint32_t)0x00000400U) /**< Pin 10 selected */ -#define APP_IO_PIN_11 ((uint32_t)0x00000800U) /**< Pin 11 selected */ -#define APP_IO_PIN_12 ((uint32_t)0x00001000U) /**< Pin 12 selected */ -#define APP_IO_PIN_13 ((uint32_t)0x00002000U) /**< Pin 13 selected */ -#define APP_IO_PIN_14 ((uint32_t)0x00004000U) /**< Pin 14 selected */ -#define APP_IO_PIN_15 ((uint32_t)0x00008000U) /**< Pin 15 selected */ -#define APP_IO_PIN_16 ((uint32_t)0x00010000U) /**< Pin 16 selected */ -#define APP_IO_PIN_17 ((uint32_t)0x00020000U) /**< Pin 17 selected */ -#define APP_IO_PIN_18 ((uint32_t)0x00040000U) /**< Pin 18 selected */ -#define APP_IO_PIN_19 ((uint32_t)0x00080000U) /**< Pin 19 selected */ -#define APP_IO_PIN_20 ((uint32_t)0x00100000U) /**< Pin 20 selected */ -#define APP_IO_PIN_21 ((uint32_t)0x00200000U) /**< Pin 21 selected */ -#define APP_IO_PIN_22 ((uint32_t)0x00400000U) /**< Pin 22 selected */ -#define APP_IO_PIN_23 ((uint32_t)0x00800000U) /**< Pin 23 selected */ -#define APP_IO_PIN_24 ((uint32_t)0x01000000U) /**< Pin 24 selected */ -#define APP_IO_PIN_25 ((uint32_t)0x02000000U) /**< Pin 25 selected */ -#define APP_IO_PIN_26 ((uint32_t)0x04000000U) /**< Pin 26 selected */ -#define APP_IO_PIN_27 ((uint32_t)0x08000000U) /**< Pin 27 selected */ -#define APP_IO_PIN_28 ((uint32_t)0x10000000U) /**< Pin 28 selected */ -#define APP_IO_PIN_29 ((uint32_t)0x20000000U) /**< Pin 29 selected */ -#define APP_IO_PIN_30 ((uint32_t)0x40000000U) /**< Pin 30 selected */ -#define APP_IO_PIN_31 ((uint32_t)0x80000000U) /**< Pin 31 selected */ - -#define APP_IO_PINS_0_15 ((uint32_t)0x0000FFFFU) /**< 0~15 pins selected */ -#define APP_IO_PINS_16_31 ((uint32_t)0xFFFF0000U) /**< 16~31 pins selected */ -#define APP_IO_PIN_ALL ((uint32_t)0xFFFFFFFFU) /**< All pins selected */ -#define APP_MSIO_PIN_MASK ((uint32_t)0x0000001FU) /**< PIN mask for assert test */ -#define APP_MSIO_PIN_ALL ((uint32_t)0x001FU) /**< All pins selected */ -#define APP_AON_IO_PIN_MASK ((uint32_t)0x000000FFU) /**< PIN mask for assert test */ -#define APP_AON_IO_PIN_ALL ((uint32_t)0x00FFU) /**< All pins selected */ - -#define APP_IO_PIN_MASK ((uint32_t)0xFFFFFFFFU) /**< PIN mask for assert test */ - -/** - * @brief GR551x_APP_GPIO_default_config initStruct default configuart APP_GPIOn - */ -#define APP_IO_DEFAULT_CONFIG \ -{ \ - .pin = APP_IO_PIN_ALL, \ - .mode = APP_IO_MODE_INPUT, \ - .pull = APP_IO_PULLDOWN, \ - .mux = APP_IO_MUX_7, \ -} - -/** @} */ -/** @} */ - -/** @addtogroup APP_GPIO_ENUMERATIONS Enumerations - * @{ - */ -/** - * @brief GPIO state Enumerations definition - */ -typedef enum { - APP_IO_PIN_RESET, /**< IO pin low level. */ - APP_IO_PIN_SET, /**< IO pin high level. */ -} app_io_pin_state_t; - -/** - * @brief GPIO type Enumerations definition - */ -typedef enum { - APP_IO_TYPE_NORMAL, /**< General Purpose Input/Output. */ - APP_IO_TYPE_AON, /**< Always-on Input/Output. */ - APP_IO_TYPE_MSIO, /**< Mixed Signal I/O. */ - APP_IO_TYPE_MAX, /**< Only for check parameter, not used as input parameters. */ -} app_io_type_t; - -/** - * @brief GPIO mode Enumerations definition - */ -typedef enum { - APP_IO_MODE_INPUT, /**< Input Mode. */ - APP_IO_MODE_OUT_PUT, /**< Output Mode. */ - APP_IO_MODE_MUX, /**< Mux Mode. */ - APP_IO_MODE_IT_RISING, /**< Interrupt Mode with Rising edge trigger detection. */ - APP_IO_MODE_IT_FALLING, /**< Interrupt Mode with Falling edge trigger detection. */ - APP_IO_MODE_IT_HIGH, /**< Interrupt Mode with High-level trigger detection. */ - APP_IO_MODE_IT_LOW, /**< Interrupt Mode with Low-level trigger detection. */ - APP_IO_MODE_ANALOG, /**< Analog IO Mode. */ - APP_IO_MODE_MAX, /**< Only for check parameter, not used as input parameters. */ -} app_io_mode_t; - -/** - * @brief GPIO wake-up mode Enumerations definition - */ -typedef enum { - APP_IO_NONE_WAKEUP, /**< None Wakeup. */ - APP_IO_DISABLE_WAKEUP, /**< Disable AON GPIO Wakeup. */ - APP_IO_ENABLE_WAKEUP, /**< Enable AON GPIO Wakeup. */ -} app_handle_mode_t; - -/** - * @brief GPIO handler context type Enumerations definition - */ -typedef enum { - APP_IO_CTX_WAKEUP, /**< the event of wakeup. */ - APP_IO_CTX_INT, /**< the event of interrupt. */ -} app_ctx_type_t; - -/** - * @brief GPIO pull Enumerations definition - */ -typedef enum { - APP_IO_NOPULL, /**< No Pull-up or Pull-down activation. */ - APP_IO_PULLUP, /**< Pull-up activation. */ - APP_IO_PULLDOWN, /**< Pull-down activation. */ - APP_IO_PULL_MAX /**< Only for check parameter, not used as input parameters. */ -} app_io_pull_t; - -/** - * @brief GPIO mux Enumerations definition - */ -typedef enum { - APP_IO_MUX_0, /**< IO mux mode 0. */ - APP_IO_MUX_1, /**< IO mux mode 1. */ - APP_IO_MUX_2, /**< IO mux mode 2. */ - APP_IO_MUX_3, /**< IO mux mode 3. */ - APP_IO_MUX_4, /**< IO mux mode 4. */ - APP_IO_MUX_5, /**< IO mux mode 5. */ - APP_IO_MUX_6, /**< IO mux mode 6. */ - APP_IO_MUX_7, /**< IO mux mode 7. */ - APP_IO_MUX_8, /**< IO mux mode 8. */ - APP_IO_MUX_MAX, /**< Only for check parameter, not used as input parameters. */ -} app_io_mux_t; -/** @} */ - -/** @addtogroup APP_GPIO_STRUCT Structures - * @{ - */ -/** - * @brief GPIO parameter structure definition - */ -typedef struct { - uint32_t pin; /**< Specifies the IO pins to be configured. - This parameter can be any value of @ref GR551x_pins */ - app_io_mode_t mode; /**< Specifies the operating mode for the selected pins. */ - app_io_pull_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. */ - app_io_mux_t mux; /**< Specifies the Peripheral to be connected to the selected pins. */ -} app_io_init_t; -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_APP_GPIO_DRIVER_FUNCTIONS Functions - * @{ - */ -/** - **************************************************************************************** - * @brief Initialize the APP GPIO DRIVER according to the specified parameters - * in the app_io_type_t and app_io_init_t. - * - * @param[in] type: GPIO type. - * @param[in] p_init: Pointer to app_io_init_t parameter which contains the - * configuration information for the specified GPIO. - * - * @return Result of initialization. - **************************************************************************************** - */ -uint16_t app_io_init(app_io_type_t type, app_io_init_t *p_init); - -/** - **************************************************************************************** - * @brief De-initialize the GPIOx peripheral. - * - * @param[in] type: GPIO type, See app_io_type_t. - * @param[in] pin: The pin want to De-initialization. - * - * @return Result of De-initialization. - **************************************************************************************** - */ -uint16_t app_io_deinit(app_io_type_t type, uint32_t pin); - -/** - **************************************************************************************** - * @brief Read the specified input port pin.. - * - * @param[in] type: GPIO type, See app_io_type_t. - * @param[in] pin: The pin want to read. - * - * @return The GPIO state. - **************************************************************************************** - */ -app_io_pin_state_t app_io_read_pin(app_io_type_t type, uint32_t pin); - -/** - **************************************************************************************** - * @brief Set or clear the selected data port bit. - * - * @param[in] type: GPIO type, See app_io_type_t. - * @param[in] pin: The pin want to set or clear. - * @param[in] pin_state: Specifies the value to be written to the selected bit. - * - * @return Result of write. - **************************************************************************************** - */ -uint16_t app_io_write_pin(app_io_type_t type, uint32_t pin, app_io_pin_state_t pin_state); - -/** - **************************************************************************************** - * @brief Toggle the specified GPIO pin. - * - * @param[in] type: GPIO type, See app_io_type_t. - * @param[in] pin: The pin want to toggle. - * - * @return Result of toggle. - **************************************************************************************** - */ -uint16_t app_io_toggle_pin(app_io_type_t type, uint32_t pin); -/** @} */ - -uint16_t app_io_toggle_pin_sym(app_io_type_t type, uint32_t pin); - -uint16_t app_io_write_pin_sym(app_io_type_t type, uint32_t pin, app_io_pin_state_t pin_state); - -app_io_pin_state_t app_io_read_pin_sym(app_io_type_t type, uint32_t pin); - -uint16_t app_io_deinit_sym(app_io_type_t type, uint32_t pin); - -uint16_t app_io_init_sym(app_io_type_t type, app_io_init_t *p_init); - -#endif - -/** @} */ -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwm.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwm.h deleted file mode 100755 index 06c5c42..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwm.h +++ /dev/null @@ -1,244 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_pwm.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PWM app library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_PWM PWM - * @brief PWM APP module driver. - * @{ - */ -#ifndef _APP_PWM_H_ -#define _APP_PWM_H_ - -#include "gr55xx_hal.h" -#include "app_io.h" -#include "app_drv_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAL_PWM_MODULE_ENABLED - -/** @addtogroup APP_PWM_DEFINE Defines - * @{ - */ - -#define APP_PWM_PIN_ENABLE 1 /**< PWM pin enable */ -#define APP_PWM_PIN_DISABLE 0 /**< PWM pin disable */ - -/** @} */ - -/** @addtogroup APP_PWM_ENUM Enumerations - * @{ - */ - -/** - * @brief PWM module Enumerations definition - */ -typedef enum { - APP_PWM_ID_0, /**< PWM module 0 */ - APP_PWM_ID_1, /**< PWM module 1 */ - APP_PWM_ID_MAX /**< Only for check parameter, not used as input parameters. */ -} app_pwm_id_t; -/** @} */ - -/** @addtogroup APP_PWM_STRUCTURES Structures - * @{ - */ -/** - * @brief PWM IO configuration Structures - */ -typedef struct { - app_io_type_t type; /**< Specifies the type of PWM IO. */ - app_io_mux_t mux; /**< Specifies the Peripheral to be connected to the selected pins. */ - uint32_t pin; /**< Specifies the IO pins to be configured. - This parameter can be any value of @ref GR551x_pins. */ - app_io_pull_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. */ - uint8_t enable; /**< Enable or disable the pin. */ -} app_pwm_pin_t; - - -/** - * @brief PWM configuration Structures - */ -typedef struct { - app_pwm_pin_t channel_a; /**< Set the configuration of PWM channel A pin. */ - app_pwm_pin_t channel_b; /**< Set the configuration of PWM channel B pin. */ - app_pwm_pin_t channel_c; /**< Set the configuration of PWM channel C pin. */ -} app_pwm_pin_cfg_t; - - -/** - * @brief PWM Channel init Structure definition - */ -typedef struct { - uint8_t duty; /**< Specifies the duty in PWM output mode. - This parameter must be a number between 0 ~ 100. */ - - uint8_t drive_polarity; /**< Specifies the drive polarity in PWM output mode. - This parameter can be a value of @ref PWM_Drive_Polarity. */ -} app_pwm_channel_init_t; -/** @} */ - -/** @addtogroup APP_PWM_ENUM Enumerations - * @{ - */ -/** - * @brief PWM active channel Enumerations definition - */ -typedef enum { - APP_PWM_ACTIVE_CHANNEL_A = 0x01, /**< The active channel is A */ - APP_PWM_ACTIVE_CHANNEL_B = 0x02, /**< The active channel is B */ - APP_PWM_ACTIVE_CHANNEL_C = 0x04, /**< The active channel is C */ - APP_PWM_ACTIVE_CHANNEL_ALL = 0x07, /**< The active channels are ALL */ - APP_PWM_ACTIVE_CHANNEL_CLEARED = 0x00 /**< All active channels are cleared */ -} app_pwm_active_channel_t; -/** @} */ - -/** @addtogroup APP_PWM_STRUCTURES Structures - * @{ - */ -/** - * @brief PWM parameters structure definition - */ -typedef struct { - app_pwm_id_t id; /**< specified PWM module ID. */ - app_pwm_pin_cfg_t pin_cfg; /**< the pin configuration information for the specified PWM module. */ - app_pwm_active_channel_t active_channel; /**< PWM operate mode. */ - pwm_init_t init; /**< PWM communication parameters. */ -} app_pwm_params_t; -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup APP_PWM_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the pwm peripheral. - * - * @param[in] p_params: Pointer to app_pwm_params_t parameter which contains the - * configuration information for the specified PWM module. - * - * @return Result of initialization. - **************************************************************************************** - */ -uint16_t app_pwm_init(app_pwm_params_t *p_params); - - -/** - **************************************************************************************** - * @brief De-initialize the pwm peripheral. - * - * @param[in] id: De-initialize for a specific ID. - * - * @return Result of De-initialization. - **************************************************************************************** - */ -uint16_t app_pwm_deinit(app_pwm_id_t id); - - -/** - **************************************************************************************** - * @brief Starts the PWM signal generation on the output. - * - * @param[in] id: which PWM module want to output. - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_pwm_start(app_pwm_id_t id); - - -/** - **************************************************************************************** - * @brief Stops the PWM signal generation on the output. - * - * @param[in] id: which PWM module want to stop output. - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_pwm_stop(app_pwm_id_t id); - -/** - **************************************************************************************** - * @brief Update the PWM frequency on the output. - * - * @param[in] id: which PWM module want to config. - * @param[in] freq: This parameter ranges between min = 0 and max = SystemFreq / 2. - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_pwm_update_freq(app_pwm_id_t id, uint32_t freq); - -/** - **************************************************************************************** - * @brief Initialize the PWM channels according to the specified parameters. - * - * @param[in] id: which PWM module want to config. - * @param[in] channel: PWM Channels to be configured. - * @param[in] p_config: PWM Channels configuration structure. - * - * @return Result of operation. - **************************************************************************************** - */ -uint16_t app_pwm_config_channel(app_pwm_id_t id, app_pwm_active_channel_t channel, app_pwm_channel_init_t *p_config); - -/** @} */ - -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwr_mgmt.h b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwr_mgmt.h deleted file mode 100755 index f26975c..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/inc/app_pwr_mgmt.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - **************************************************************************************** - * - * @file app_pwr_mgmt.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of UART PWR library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup APP_DRIVER APP DRIVER - * @{ - */ - -/** @defgroup APP_PWR_MGMT PWR MGMT - * @brief PWR MGMT APP module driver. - * @{ - */ - - -#ifndef _APP_PWR_MGMT_H_ -#define _APP_PWR_MGMT_H_ - -#include -#include -#include "app_drv_config.h" -#include "gr55xx_pwr.h" - -/** @addtogroup APP_PWR_DEFINE Defines - * @{ - */ -/** - * @brief PWR MAX value for sleep check - */ -#define APP_SLEEP_CB_MAX 16 -/** @} */ - -/** - * @brief PWR sleep check function Structure - */ -typedef struct { - bool (*app_prepare_for_sleep)(void); /** -#include -#include "app_pwr_mgmt.h" -#include "platform_sdk.h" -#include "app_dma.h" - -/* - * DEFINES - ***************************************************************************************** - */ -#define DMA_HANDLE_MAX 8 - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App dma state types. */ -typedef enum { - APP_DMA_INVALID = 0, - APP_DMA_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_DMA_SLEEP, -#endif -} app_dma_state_t; - -struct dma_env_t { - app_dma_state_t dma_state; - dma_handle_t handle; - app_dma_evt_handler_t evt_handler; -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool dma_prepare_for_sleep(void); -static void dma_sleep_canceled(void); -static void dma_wake_up_ind(void); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static bool s_sleep_cb_registered_flag = false; -static struct dma_env_t s_dma_env[DMA_HANDLE_MAX]; -static int16_t s_dma_pwr_id; - -static const app_sleep_callbacks_t dma_sleep_cb = { - .app_prepare_for_sleep = dma_prepare_for_sleep, - .app_sleep_canceled = dma_sleep_canceled, - .app_wake_up_ind = dma_wake_up_ind, -}; - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool dma_prepare_for_sleep(void) -{ - hal_dma_state_t state; - - for (uint8_t i = 0; i < DMA_HANDLE_MAX; i++) { - if (s_dma_env[i].dma_state == APP_DMA_ENABLE) { - state = hal_dma_get_state(&s_dma_env[i].handle); - if ((state != HAL_DMA_STATE_RESET) && (state != HAL_DMA_STATE_READY)) { - return false; - } - hal_dma_suspend_reg(&s_dma_env[i].handle); -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_dma_env[i].dma_state = APP_DMA_SLEEP; -#endif - } - } - - return true; -} - -static void dma_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void dma_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - bool find = false; - - for (uint8_t i = 0; i < DMA_HANDLE_MAX; i++) { - if (s_dma_env[i].dma_state == APP_DMA_ENABLE) { - hal_dma_resume_reg(&s_dma_env[i].handle); - find = true; - } - } - - if (find) { - hal_nvic_clear_pending_irq(DMA_IRQn); - hal_nvic_enable_irq(DMA_IRQn); - } -#endif -} - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -void dma_wake_up(int16_t id) -{ - if (id<0 || id >= DMA_HANDLE_MAX) { - return; - } - - if (s_dma_env[id].dma_state == APP_DMA_SLEEP) { - hal_dma_resume_reg(&s_dma_env[id].handle); - s_dma_env[id].dma_state = APP_DMA_ENABLE; - - if (!NVIC_GetEnableIRQ(DMA_IRQn)) { - hal_nvic_clear_pending_irq(DMA_IRQn); - hal_nvic_enable_irq(DMA_IRQn); - } - } -} -#endif - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -void dma_tfr_callback(struct _dma_handle *hdma) -{ - uint8_t i; - - for (i = 0; i < DMA_HANDLE_MAX; i++) { - if ((s_dma_env[i].dma_state == APP_DMA_ENABLE) && - (s_dma_env[i].handle.channel == hdma->channel)) { - if (s_dma_env[i].evt_handler != NULL) { - s_dma_env[i].evt_handler(APP_DMA_EVT_TFR); - } - break; - } - } -} - -void dma_err_callback(struct _dma_handle * hdma) -{ - uint8_t i; - - for (i = 0; i < DMA_HANDLE_MAX; i++) { - if ((s_dma_env[i].dma_state == APP_DMA_ENABLE) && - (s_dma_env[i].handle.channel == hdma->channel)) { - if (s_dma_env[i].evt_handler != NULL) { - s_dma_env[i].evt_handler(APP_DMA_EVT_ERROR); - } - break; - } - } -} - - -static void dma_handle_config(uint8_t *p_i, int16_t *p_id, app_dma_params_t *p_params) -{ - GLOBAL_EXCEPTION_DISABLE(); - for (*p_i = 0; (*p_i) < DMA_HANDLE_MAX; (*p_i)++) { - if (s_dma_env[*p_i].dma_state == APP_DMA_INVALID || \ - s_dma_env[*p_i].handle.channel == p_params->channel_number) { - if (HAL_DMA_STATE_BUSY == s_dma_env[*p_i].handle.state) { - *p_i = DMA_HANDLE_MAX; - break; - } else { - *p_id = *p_i; - s_dma_env[*p_i].dma_state = APP_DMA_ENABLE; - break; - } - } - } - GLOBAL_EXCEPTION_ENABLE(); -} - -int16_t app_dma_init(app_dma_params_t *p_params, app_dma_evt_handler_t evt_handler) -{ - uint8_t i = 0; - int16_t id = -1; - hal_status_t status = HAL_ERROR; - - if (p_params != NULL) { - if (!IS_DMA_ALL_INSTANCE(p_params->channel_number)) { - return -1; - } - - dma_handle_config(&i, &id, p_params); - - if (i < DMA_HANDLE_MAX) { - if (s_sleep_cb_registered_flag == false) { // register sleep callback - s_sleep_cb_registered_flag = true; - s_dma_pwr_id = pwr_register_sleep_cb(&dma_sleep_cb, APP_DRIVER_DMA_WAPEUP_PRIORITY); - } - s_dma_env[i].handle.channel = p_params->channel_number; - memcpy_s(&s_dma_env[i].handle.init, sizeof(s_dma_env[i].handle.init), &p_params->init, sizeof(dma_init_t)); - s_dma_env[i].handle.xfer_tfr_callback = dma_tfr_callback; - s_dma_env[i].handle.xfer_error_callback = dma_err_callback; - s_dma_env[i].handle.xfer_abort_callback = NULL; - s_dma_env[i].evt_handler = evt_handler; - - hal_nvic_clear_pending_irq(DMA_IRQn); - hal_nvic_enable_irq(DMA_IRQn); - status = hal_dma_init(&s_dma_env[i].handle); - } - } - - if (HAL_OK != status) { - id = -1; - } - - return id; -} - - -uint16_t app_dma_deinit(int16_t id) -{ - uint8_t i; - - if ((id < 0) || (id >= DMA_HANDLE_MAX) || (s_dma_env[id].dma_state == APP_DMA_INVALID)) { - return APP_DRV_ERR_INVALID_ID; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_dma_deinit(&s_dma_env[id].handle); - s_dma_env[id].dma_state = APP_DMA_INVALID; - s_dma_env[id].handle.channel = (dma_channel_t)(-1); - - for (i = 0; i < DMA_HANDLE_MAX; i++) { - if (s_dma_env[i].dma_state == APP_DMA_ENABLE) { - break; - } - } - - if (i == DMA_HANDLE_MAX) { - pwr_unregister_sleep_cb(s_dma_pwr_id); - s_sleep_cb_registered_flag = false; - hal_nvic_disable_irq(DMA_IRQn); - } - GLOBAL_EXCEPTION_ENABLE(); - - return APP_DRV_SUCCESS; -} - -dma_handle_t *app_dma_get_handle(int16_t id) -{ - if (id < 0 || id >= DMA_HANDLE_MAX || s_dma_env[id].dma_state == APP_DMA_INVALID) { - return NULL; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - dma_wake_up(id); -#endif - - return &s_dma_env[id].handle; -} - -uint16_t app_dma_start(int16_t id, uint32_t src_address, uint32_t dst_address, uint32_t data_length) -{ - hal_status_t status = HAL_ERROR; - - if (id < 0 || id >= DMA_HANDLE_MAX || s_dma_env[id].dma_state == APP_DMA_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - dma_wake_up(id); -#endif - - status = hal_dma_start_it(&s_dma_env[id].handle, src_address, dst_address, data_length); - if (HAL_OK != status) { - return (uint16_t)status; - } - - return APP_DRV_SUCCESS; -} - -SECTION_RAM_CODE void DMA_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - uint8_t i; - for (i = 0; i < DMA_HANDLE_MAX; i++) { - if (s_dma_env[i].dma_state == APP_DMA_ENABLE) { - hal_dma_irq_handler(&s_dma_env[i].handle); - } - } -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_gpiote.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_gpiote.c deleted file mode 100755 index d469e63..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_gpiote.c +++ /dev/null @@ -1,436 +0,0 @@ -/** - **************************************************************************************** - * @file app_gpiote.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "app_pwr_mgmt.h" -#include "platform_sdk.h" -#include "app_gpiote.h" - -/* - * DEFINES - ***************************************************************************************** - */ -#define BIT_8 8 -#define BIT_16 16 -#define BIT_24 24 - -#define GPIOTE_USE_PATTERN 0x47 -#define GPIOTE_USE_MAX 32 -#define GPIOTE_AON_PIN_USE_MAX 8 -/* - * STRUCT DEFINE - ***************************************************************************************** - */ -struct gpiote_env_t { - uint8_t total_used; - app_gpiote_param_t params[GPIOTE_USE_MAX]; -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool gpiote_prepare_for_sleep(void); -static void gpiote_sleep_canceled(void); -static void gpiote_wake_up_ind(void); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static struct gpiote_env_t s_gpiote_env; - -static bool s_sleep_cb_registered_flag = false; -static uint16_t s_gpiote_pwr_id; - -static const app_sleep_callbacks_t gpiote_sleep_cb = { - .app_prepare_for_sleep = gpiote_prepare_for_sleep, - .app_sleep_canceled = gpiote_sleep_canceled, - .app_wake_up_ind = gpiote_wake_up_ind -}; - -static app_io_callback_t aon_cb_called_table[GPIOTE_AON_PIN_USE_MAX]; -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool gpiote_prepare_for_sleep(void) -{ - return true; -} - -static void gpiote_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void gpiote_wake_up_ind(void) -{ - bool is_ext0_need_enable = false; - bool is_ext1_need_enable = false; - - for (int idx = 0; idx < s_gpiote_env.total_used; idx++) { - if (s_gpiote_env.params[idx].type == APP_IO_TYPE_NORMAL) { - if (APP_IO_PINS_0_15 & s_gpiote_env.params[idx].pin) { - is_ext0_need_enable = true; - continue; - } - if (APP_IO_PINS_16_31 & s_gpiote_env.params[idx].pin) { - is_ext1_need_enable = true; - continue; - } - } - } - - if (is_ext0_need_enable) { - hal_nvic_enable_irq(EXT0_IRQn); - } - - if (is_ext1_need_enable) { - hal_nvic_enable_irq(EXT1_IRQn); - } - - return; -} - -static uint16_t params_check(const app_gpiote_param_t *p_params, uint8_t table_cnt) -{ - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - if (((s_gpiote_env.total_used + table_cnt) > GPIOTE_USE_MAX) && table_cnt) { - return APP_DRV_ERR_INVALID_PARAM; - } - - return APP_DRV_SUCCESS; -} - -static void gpiote_wakeup_mode_config(uint8_t idx, const app_gpiote_param_t *p_params) -{ - if ((p_params[idx].handle_mode == APP_IO_ENABLE_WAKEUP) && (p_params[idx].type == APP_IO_TYPE_AON)) { - switch (p_params[idx].mode) { - case APP_IO_MODE_IT_RISING: - hal_pwr_config_ext_wakeup(p_params[idx].pin, PWR_EXTWKUP_TYPE_RISING); - break; - - case APP_IO_MODE_IT_FALLING: - hal_pwr_config_ext_wakeup(p_params[idx].pin, PWR_EXTWKUP_TYPE_FALLING); - break; - - case APP_IO_MODE_IT_HIGH: - hal_pwr_config_ext_wakeup(p_params[idx].pin, PWR_EXTWKUP_TYPE_HIGH); - break; - - case APP_IO_MODE_IT_LOW: - hal_pwr_config_ext_wakeup(p_params[idx].pin, PWR_EXTWKUP_TYPE_LOW); - break; - - default: - break; - } - pwr_mgmt_wakeup_source_setup(PWR_WKUP_COND_EXT); - } -} - -static uint16_t register_cb(void) -{ - if (!s_sleep_cb_registered_flag) { // register sleep callback - s_gpiote_pwr_id = pwr_register_sleep_cb(&gpiote_sleep_cb, APP_DRIVER_GPIOTE_WAPEUP_PRIORITY); - if (s_gpiote_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - s_sleep_cb_registered_flag = true; - } - - return APP_DRV_SUCCESS; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -uint16_t app_gpiote_init(const app_gpiote_param_t *p_params, uint8_t table_cnt) -{ - static uint8_t exit_flag = 0x0; - app_io_init_t io_init; - uint16_t err_code; - - err_code = params_check(p_params, table_cnt); - APP_DRV_ERR_CODE_CHECK(err_code); - - for (uint8_t idx = 0; idx < table_cnt; idx++) { - exit_flag = 0x0; - - for (uint8_t index = 0; index < s_gpiote_env.total_used; index ++) { - if (s_gpiote_env.params[index].pin == p_params[idx].pin && \ - s_gpiote_env.params[index].type == p_params[idx].type) { - exit_flag = 0x1; - break; - } - } - - io_init.pin = p_params[idx].pin; - io_init.mode = p_params[idx].mode; - io_init.pull = p_params[idx].pull; - io_init.mux = APP_IO_MUX_7; - - app_io_deinit(p_params[idx].type, io_init.pin); - err_code = app_io_init(p_params[idx].type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - if (exit_flag) { - continue; - } - - memcpy_s(&s_gpiote_env.params[s_gpiote_env.total_used], - sizeof(s_gpiote_env.params[s_gpiote_env.total_used]), - &p_params[idx], sizeof(app_gpiote_param_t)); - - gpiote_wakeup_mode_config(idx, p_params); - - if (p_params[idx].type == APP_IO_TYPE_NORMAL) { - hal_nvic_clear_pending_irq(EXT0_IRQn); - hal_nvic_enable_irq(EXT0_IRQn); - hal_nvic_clear_pending_irq(EXT1_IRQn); - hal_nvic_enable_irq(EXT1_IRQn); - } else if (p_params[idx].type == APP_IO_TYPE_AON) { - hal_nvic_clear_pending_irq(EXT2_IRQn); - hal_nvic_enable_irq(EXT2_IRQn); - } - - s_gpiote_env.total_used += 1; - } - - err_code = register_cb(); - APP_DRV_ERR_CODE_CHECK(err_code); - - return APP_DRV_SUCCESS; -} - -static void gpiote_config_wake_up_config(const app_gpiote_param_t *p_config) -{ - if ((p_config->handle_mode == APP_IO_ENABLE_WAKEUP) && (p_config->type == APP_IO_TYPE_AON)) { - switch (p_config->mode) { - case APP_IO_MODE_IT_RISING: - hal_pwr_config_ext_wakeup(p_config->pin, PWR_EXTWKUP_TYPE_RISING); - break; - - case APP_IO_MODE_IT_FALLING: - hal_pwr_config_ext_wakeup(p_config->pin, PWR_EXTWKUP_TYPE_FALLING); - break; - - case APP_IO_MODE_IT_HIGH: - hal_pwr_config_ext_wakeup(p_config->pin, PWR_EXTWKUP_TYPE_HIGH); - break; - - case APP_IO_MODE_IT_LOW: - hal_pwr_config_ext_wakeup(p_config->pin, PWR_EXTWKUP_TYPE_LOW); - break; - - default: - break; - } - pwr_mgmt_wakeup_source_setup(PWR_WKUP_COND_EXT); - } -} - -uint16_t app_gpiote_config(const app_gpiote_param_t *p_config) -{ - uint8_t exit_flag = 0x0; - uint8_t index; - app_io_init_t io_init; - uint16_t err_code; - - if (p_config == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - for (index = 0; index < s_gpiote_env.total_used; index ++) { - if (s_gpiote_env.params[index].pin == p_config->pin && \ - s_gpiote_env.params[index].type == p_config->type) { - exit_flag = 0x1; - break; - } - } - - if (!exit_flag || index >= GPIOTE_USE_MAX) { - return APP_DRV_ERR_INVALID_PARAM; - } - - memcpy_s(&s_gpiote_env.params[index], sizeof(s_gpiote_env.params[index]), - p_config, sizeof(app_gpiote_param_t)); - - io_init.pin = p_config->pin; - io_init.mode = p_config->mode; - io_init.pull = p_config->pull; - io_init.mux = APP_IO_MUX_7; - - app_io_deinit(p_config->type, p_config->pin); - err_code = app_io_init(p_config->type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - gpiote_config_wake_up_config(p_config); - - if ((p_config->handle_mode == APP_IO_DISABLE_WAKEUP) && (p_config->type == APP_IO_TYPE_AON)) { - hal_pwr_disable_ext_wakeup(p_config->pin); - } - - if (p_config->type == APP_IO_TYPE_NORMAL) { - hal_nvic_clear_pending_irq(EXT0_IRQn); - hal_nvic_enable_irq(EXT0_IRQn); - hal_nvic_clear_pending_irq(EXT1_IRQn); - hal_nvic_enable_irq(EXT1_IRQn); - } else if (p_config->type == APP_IO_TYPE_AON) { - hal_nvic_clear_pending_irq(EXT2_IRQn); - hal_nvic_enable_irq(EXT2_IRQn); - } - - return APP_DRV_SUCCESS; -} - -void app_gpiote_deinit(void) -{ - for (int idx = 0; idx < s_gpiote_env.total_used; idx++) { - app_io_deinit(s_gpiote_env.params[idx].type, s_gpiote_env.params[idx].pin); - } - hal_nvic_disable_irq(EXT0_IRQn); - hal_nvic_disable_irq(EXT1_IRQn); - hal_nvic_disable_irq(EXT2_IRQn); - pwr_unregister_sleep_cb(s_gpiote_pwr_id); - s_gpiote_env.total_used = 0; -} - -void hal_gpio_exti_callback(gpio_regs_t *GPIOx, uint16_t gpio_pin) -{ - uint32_t io_pin = gpio_pin; - app_gpiote_evt_t gpiote_evt; - - if (GPIO1 == GPIOx) { - io_pin = (uint32_t)(gpio_pin << BIT_16); - } - - gpiote_evt.type = APP_IO_TYPE_NORMAL; - gpiote_evt.pin = io_pin; - gpiote_evt.ctx_type = APP_IO_CTX_INT; - - for (uint8_t idx = 0; idx < s_gpiote_env.total_used; idx++) { - if ((s_gpiote_env.params[idx].type == APP_IO_TYPE_NORMAL) && (io_pin == s_gpiote_env.params[idx].pin)) { - if (s_gpiote_env.params[idx].io_evt_cb) - s_gpiote_env.params[idx].io_evt_cb(&gpiote_evt); - } - } -} - -static void gpio_callback_config(uint8_t idx, uint16_t aon_gpio_pin, uint8_t *p_called_flag, - uint8_t *p_called_table_used_pos, app_gpiote_evt_t gpiote_evt) -{ - if ((s_gpiote_env.params[idx].type == APP_IO_TYPE_AON) && \ - (aon_gpio_pin & s_gpiote_env.params[idx].pin) && \ - (s_gpiote_env.params[idx].io_evt_cb)) { - for (uint8_t i = 0; i < *p_called_table_used_pos; i++) { - if (aon_cb_called_table[i] == s_gpiote_env.params[idx].io_evt_cb) { - *p_called_flag = 1; - break; - } else { - *p_called_flag = 0; - } - } - if (*p_called_flag == 0) { - s_gpiote_env.params[idx].io_evt_cb(&gpiote_evt); - aon_cb_called_table[*p_called_table_used_pos] = s_gpiote_env.params[idx].io_evt_cb; - *p_called_table_used_pos++; - } - } -} - -void hal_aon_gpio_callback(uint16_t aon_gpio_pin) -{ - uint8_t called_table_used_pos = 0; - uint8_t called_flag = 0; - - app_gpiote_evt_t gpiote_evt; - - gpiote_evt.type = APP_IO_TYPE_AON; - gpiote_evt.pin = aon_gpio_pin; - - if (pwr_mgmt_get_wakeup_flag() == WARM_BOOT) { - gpiote_evt.ctx_type = APP_IO_CTX_WAKEUP; - } else { - gpiote_evt.ctx_type = APP_IO_CTX_INT; - } - - memset_s(aon_cb_called_table, sizeof(aon_cb_called_table), 0, sizeof(aon_cb_called_table)); - for (uint8_t idx = 0; idx < s_gpiote_env.total_used; idx++) { - gpio_callback_config(idx, aon_gpio_pin, &called_flag, - &called_table_used_pos, gpiote_evt); - } -} - -SECTION_RAM_CODE void EXT0_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_gpio_exti_irq_handler(GPIO0); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -SECTION_RAM_CODE void EXT1_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_gpio_exti_irq_handler(GPIO1); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -SECTION_RAM_CODE void EXT2_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_aon_gpio_irq_handler(); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_i2c.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_i2c.c deleted file mode 100755 index 44a6907..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_i2c.c +++ /dev/null @@ -1,1132 +0,0 @@ -/** - **************************************************************************************** - * @file app_i2c.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "app_io.h" -#include "app_dma.h" -#include "app_pwr_mgmt.h" -#include "app_systick.h" -#include "platform_sdk.h" -#include "app_i2c.h" - -#ifdef HAL_I2C_MODULE_ENABLED - -/* - * DEFINES - ***************************************************************************************** - */ - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App i2c state types. */ -typedef enum { - APP_I2C_INVALID = 0, - APP_I2C_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_I2C_SLEEP, -#endif -} app_i2c_state_t; - -struct i2c_env_t { - app_i2c_evt_handler_t evt_handler; - i2c_handle_t handle; - app_i2c_mode_t use_mode; - app_i2c_role_t role; - app_i2c_pin_cfg_t pin_cfg; - int16_t dma_id[2]; - app_i2c_state_t i2c_state; - bool start_flag; -#ifdef ENV_RTOS_USE_SEMP - APP_DRV_SEM_DECL(sem_tx); - APP_DRV_SEM_DECL(sem_rx); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - APP_DRV_MUTEX_DECL(mutex_sync); - APP_DRV_MUTEX_DECL(mutex_async); -#endif -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool i2c_prepare_for_sleep(void); -static void i2c_sleep_canceled(void); -static void i2c_wake_up_ind(void); -static uint16_t i2c_gpio_config(app_i2c_pin_cfg_t pin_cfg); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static const IRQn_Type s_i2c_irq[APP_I2C_ID_MAX] = { I2C0_IRQn, I2C1_IRQn }; -static const uint32_t s_i2c_instance[APP_I2C_ID_MAX] = { I2C0_BASE, I2C1_BASE }; - -struct i2c_env_t s_i2c_env[APP_I2C_ID_MAX] = { - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - }, - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - }, -}; -static bool s_sleep_cb_registered_flag = false; -static int16_t s_i2c_pwr_id; - -static const app_sleep_callbacks_t i2c_sleep_cb = { - .app_prepare_for_sleep = i2c_prepare_for_sleep, - .app_sleep_canceled = i2c_sleep_canceled, - .app_wake_up_ind = i2c_wake_up_ind -}; - -#ifdef ENV_RTOS_USE_MUTEX -static inline void APP_I2C_DRV_SYNC_MUTEX_LOCK(app_i2c_id_t id); -static inline void APP_I2C_DRV_SYNC_MUTEX_UNLOCK(app_i2c_id_t id); -static inline void APP_I2C_DRV_ASYNC_MUTEX_LOCK(app_i2c_id_t id); -static inline void APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(app_i2c_id_t id); - -static inline void APP_I2C_DRV_SYNC_MUTEX_LOCK(app_i2c_id_t id) -{ - app_driver_mutex_pend(s_i2c_env[id].mutex_sync, MUTEX_WAIT_FOREVER); -} - -static inline void APP_I2C_DRV_SYNC_MUTEX_UNLOCK(app_i2c_id_t id) -{ - app_driver_mutex_post(s_i2c_env[id].mutex_sync); -} - -static inline void APP_I2C_DRV_ASYNC_MUTEX_LOCK(app_i2c_id_t id) -{ - app_driver_mutex_pend(s_i2c_env[id].mutex_async, MUTEX_WAIT_FOREVER); -} - -static inline void APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(app_i2c_id_t id) -{ - app_driver_mutex_post(s_i2c_env[id].mutex_async); -} -#endif - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool i2c_prepare_for_sleep(void) -{ - hal_i2c_state_t state; - - for (uint8_t i = 0; i < APP_I2C_ID_MAX; i++) { - if (s_i2c_env[i].i2c_state == APP_I2C_ENABLE) { - state = hal_i2c_get_state(&s_i2c_env[i].handle); - if ((state != HAL_I2C_STATE_READY) && (state != HAL_I2C_STATE_RESET)) { - return false; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_i2c_suspend_reg(&s_i2c_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_i2c_env[i].i2c_state = APP_I2C_SLEEP; -#endif - } - } - - return true; -} - -static void i2c_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void i2c_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - for (uint8_t i = 0; i < APP_I2C_ID_MAX; i++) { - if (s_i2c_env[i].i2c_state == APP_I2C_ENABLE) { - GLOBAL_EXCEPTION_DISABLE(); - hal_i2c_resume_reg(&s_i2c_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_i2c_env[i].use_mode.type != APP_I2C_TYPE_POLLING) { - hal_nvic_clear_pending_irq(s_i2c_irq[i]); - hal_nvic_enable_irq(s_i2c_irq[i]); - } - } - } -#endif -} - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -static void i2c_wake_up(app_i2c_id_t id) -{ - if (s_i2c_env[id].i2c_state == APP_I2C_SLEEP) { - GLOBAL_EXCEPTION_DISABLE(); - hal_i2c_resume_reg(&s_i2c_env[id].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_i2c_env[id].use_mode.type != APP_I2C_TYPE_POLLING) { - hal_nvic_clear_pending_irq(s_i2c_irq[id]); - hal_nvic_enable_irq(s_i2c_irq[id]); - } - s_i2c_env[id].i2c_state = APP_I2C_ENABLE; - } - - if (s_i2c_env[id].use_mode.type == APP_I2C_TYPE_DMA) { - dma_wake_up(s_i2c_env[id].dma_id[0]); - dma_wake_up(s_i2c_env[id].dma_id[1]); - } -} -#endif - -static uint16_t i2c_gpio_config(app_i2c_pin_cfg_t pin_cfg) -{ - app_io_init_t io_init = APP_IO_DEFAULT_CONFIG; - uint16_t err_code = APP_DRV_SUCCESS; - - io_init.pull = pin_cfg.scl.pull; - io_init.mode = APP_IO_MODE_MUX; - io_init.pin = pin_cfg.scl.pin; - io_init.mux = pin_cfg.scl.mux; - err_code = app_io_init(pin_cfg.scl.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - io_init.pull = pin_cfg.sda.pull; - io_init.pin = pin_cfg.sda.pin; - io_init.mux = pin_cfg.sda.mux; - err_code = app_io_init(pin_cfg.sda.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - return err_code; -} - -static uint16_t app_i2c_config_dma(app_i2c_params_t *p_params) -{ - app_dma_params_t tx_dma_params; - app_dma_params_t rx_dma_params; - - tx_dma_params.channel_number = p_params->use_mode.tx_dma_channel; - tx_dma_params.init.src_request = DMA_REQUEST_MEM; - tx_dma_params.init.dst_request = (p_params->id == APP_I2C_ID_0) ? \ - DMA_REQUEST_I2C0_TX : DMA_REQUEST_I2C1_TX; - tx_dma_params.init.direction = DMA_MEMORY_TO_PERIPH; - tx_dma_params.init.src_increment = DMA_SRC_INCREMENT; - tx_dma_params.init.dst_increment = DMA_DST_NO_CHANGE; - tx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - tx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - tx_dma_params.init.mode = DMA_NORMAL; - tx_dma_params.init.priority = DMA_PRIORITY_LOW; - - s_i2c_env[p_params->id].dma_id[0] = app_dma_init(&tx_dma_params, NULL); - if (s_i2c_env[p_params->id].dma_id[0] < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - s_i2c_env[p_params->id].handle.p_dmatx = app_dma_get_handle(s_i2c_env[p_params->id].dma_id[0]); - s_i2c_env[p_params->id].handle.p_dmatx->p_parent = (void*)&s_i2c_env[p_params->id].handle; - - rx_dma_params.channel_number = p_params->use_mode.rx_dma_channel; - rx_dma_params.init.src_request = (p_params->id == APP_I2C_ID_0) ? \ - DMA_REQUEST_I2C0_RX : DMA_REQUEST_I2C1_RX; - rx_dma_params.init.dst_request = DMA_REQUEST_MEM; - rx_dma_params.init.direction = DMA_PERIPH_TO_MEMORY; - rx_dma_params.init.src_increment = DMA_SRC_NO_CHANGE; - rx_dma_params.init.dst_increment = DMA_DST_INCREMENT; - rx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - rx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - rx_dma_params.init.mode = DMA_NORMAL; - rx_dma_params.init.priority = DMA_PRIORITY_LOW; - - s_i2c_env[p_params->id].dma_id[1] = app_dma_init(&rx_dma_params, NULL); - if (s_i2c_env[p_params->id].dma_id[1] < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - s_i2c_env[p_params->id].handle.p_dmarx = app_dma_get_handle(s_i2c_env[p_params->id].dma_id[1]); - s_i2c_env[p_params->id].handle.p_dmarx->p_parent = (void*)&s_i2c_env[p_params->id].handle; - - return APP_DRV_SUCCESS; -} - -static void app_i2c_event_call(i2c_handle_t *p_i2c, app_i2c_evt_type_t evt_type) -{ - app_i2c_evt_t i2c_evt; - app_i2c_id_t id; - if (p_i2c->p_instance == I2C0) { - id = APP_I2C_ID_0; - } else if (p_i2c->p_instance == I2C1) { - id = APP_I2C_ID_1; - } - i2c_evt.type = evt_type; - if (evt_type == APP_I2C_EVT_ERROR) { -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_i2c_env[id].sem_tx); - app_driver_sem_post_from_isr(s_i2c_env[id].sem_rx); -#endif - i2c_evt.data.error_code = p_i2c->error_code; - } else if (evt_type == APP_I2C_EVT_TX_CPLT) { -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_i2c_env[id].sem_tx); -#endif - i2c_evt.data.size = p_i2c->xfer_size - p_i2c->xfer_count; - } else if (evt_type == APP_I2C_EVT_RX_DATA) { -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_i2c_env[id].sem_rx); -#endif - i2c_evt.data.size = p_i2c->xfer_size - p_i2c->xfer_count; - } - - s_i2c_env[id].start_flag = false; - if (s_i2c_env[id].evt_handler != NULL) { - s_i2c_env[id].evt_handler(&i2c_evt); - } -} - -static uint16_t params_check(app_i2c_params_t *p_params) -{ - uint8_t id = p_params->id; - - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - if (id >= APP_I2C_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t semp_init_config(uint8_t id) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - - if (s_i2c_env[id].sem_tx == NULL) { - app_err_code = app_driver_sem_init(&s_i2c_env[id].sem_tx); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_i2c_env[id].sem_rx == NULL) { - app_err_code = app_driver_sem_init(&s_i2c_env[id].sem_rx); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_init_config(uint8_t id) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - - if (s_i2c_env[id].mutex_async == NULL) { - app_err_code = app_driver_mutex_init(&s_i2c_env[id].mutex_async); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_i2c_env[id].mutex_sync == NULL) { - app_err_code = app_driver_mutex_init(&s_i2c_env[id].mutex_sync); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -static void sync_params_to_env(app_i2c_params_t *p_params, app_i2c_evt_handler_t evt_handler, uint8_t id) -{ - s_i2c_env[id].use_mode.type = p_params->use_mode.type; - s_i2c_env[id].use_mode.rx_dma_channel = p_params->use_mode.rx_dma_channel; - s_i2c_env[id].use_mode.tx_dma_channel = p_params->use_mode.tx_dma_channel; - s_i2c_env[id].role = p_params->role; - memcpy_s(&s_i2c_env[id].pin_cfg, sizeof (s_i2c_env[id].pin_cfg), &p_params->pin_cfg, sizeof(app_i2c_pin_cfg_t)); - s_i2c_env[id].evt_handler = evt_handler; - - memcpy_s(&s_i2c_env[id].handle.init, sizeof (s_i2c_env[id].handle.init), &p_params->init, sizeof(i2c_init_t)); - s_i2c_env[id].handle.p_instance = (i2c_regs_t *)s_i2c_instance[id]; -} - -static uint16_t register_cb(void) -{ - if (s_sleep_cb_registered_flag == false) { // register sleep callback - s_sleep_cb_registered_flag = true; - s_i2c_pwr_id = pwr_register_sleep_cb(&i2c_sleep_cb, APP_DRIVER_I2C_WAPEUP_PRIORITY); - if (s_i2c_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - } - - return APP_DRV_SUCCESS; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -uint16_t app_i2c_init(app_i2c_params_t *p_params, app_i2c_evt_handler_t evt_handler) -{ - uint8_t id = p_params->id; - uint16_t app_err_code; - hal_status_t hal_err_code; - - app_err_code = params_check(p_params); - APP_DRV_ERR_CODE_CHECK(app_err_code); - -#ifdef ENV_RTOS_USE_SEMP - app_err_code = semp_init_config(id); - APP_DRV_ERR_CODE_CHECK(app_err_code); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - app_err_code = mutex_init_config(id); - APP_DRV_ERR_CODE_CHECK(app_err_code); -#endif - - app_systick_init(); - - app_err_code = i2c_gpio_config(p_params->pin_cfg); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - if (p_params->use_mode.type == APP_I2C_TYPE_DMA) { - GLOBAL_EXCEPTION_DISABLE(); - app_err_code = app_i2c_config_dma(p_params); - GLOBAL_EXCEPTION_ENABLE(); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - - if (p_params->use_mode.type != APP_I2C_TYPE_POLLING) { - hal_nvic_clear_pending_irq(s_i2c_irq[id]); - hal_nvic_enable_irq(s_i2c_irq[id]); - } - - sync_params_to_env(p_params, evt_handler, id); - - hal_err_code = hal_i2c_deinit(&s_i2c_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - hal_err_code = hal_i2c_init(&s_i2c_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - app_err_code = register_cb(); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - s_i2c_env[id].i2c_state = APP_I2C_ENABLE; - s_i2c_env[id].start_flag = false; - - return APP_DRV_SUCCESS; -} - -uint16_t app_i2c_deinit(app_i2c_id_t id) -{ - uint16_t app_err_code; - hal_status_t hal_err_code; - - if ((id >= APP_I2C_ID_MAX) || (s_i2c_env[id].i2c_state == APP_I2C_INVALID)) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef ENV_RTOS_USE_SEMP - if (s_i2c_env[id].sem_tx != NULL) { - app_driver_sem_deinit(s_i2c_env[id].sem_tx); - s_i2c_env[id].sem_tx = NULL; - } - if (s_i2c_env[id].sem_rx != NULL) { - app_driver_sem_deinit(s_i2c_env[id].sem_rx); - s_i2c_env[id].sem_rx = NULL; - } -#endif - -#ifdef ENV_RTOS_USE_MUTEX - if (s_i2c_env[id].mutex_sync != NULL) { - app_driver_mutex_deinit(s_i2c_env[id].mutex_sync); - s_i2c_env[id].mutex_sync = NULL; - } - if (s_i2c_env[id].mutex_async != NULL) { - app_driver_mutex_deinit(s_i2c_env[id].mutex_async); - s_i2c_env[id].mutex_async = NULL; - } -#endif - - app_err_code = app_io_deinit(s_i2c_env[id].pin_cfg.scl.type, s_i2c_env[id].pin_cfg.scl.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - app_err_code = app_io_deinit(s_i2c_env[id].pin_cfg.sda.type, s_i2c_env[id].pin_cfg.sda.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - hal_nvic_disable_irq(s_i2c_irq[id]); - if (s_i2c_env[id].use_mode.type == APP_I2C_TYPE_DMA) { - app_dma_deinit(s_i2c_env[id].dma_id[0]); - app_dma_deinit(s_i2c_env[id].dma_id[1]); - } - s_i2c_env[id].i2c_state = APP_I2C_INVALID; - s_i2c_env[id].start_flag = false; - - GLOBAL_EXCEPTION_DISABLE(); - if (s_i2c_env[APP_I2C_ID_0].i2c_state == APP_I2C_INVALID && - s_i2c_env[APP_I2C_ID_1].i2c_state == APP_I2C_INVALID) { - pwr_unregister_sleep_cb(s_i2c_pwr_id); - s_sleep_cb_registered_flag = false; - } - GLOBAL_EXCEPTION_ENABLE(); - - app_systick_deinit(); - - hal_err_code = hal_i2c_deinit(&s_i2c_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - return APP_DRV_SUCCESS; -} - -uint16_t app_i2c_receive_sync(app_i2c_id_t id, uint16_t target_address, \ - uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - switch (s_i2c_env[id].role) { - case APP_I2C_ROLE_MASTER: - err_code = hal_i2c_master_receive(&s_i2c_env[id].handle, target_address, p_data, size, timeout); - break; - - case APP_I2C_ROLE_SLAVE: - err_code = hal_i2c_slave_receive(&s_i2c_env[id].handle, p_data, size, timeout); - break; - - default: - break; - } - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t sem_sync_params_check(app_i2c_id_t id, uint8_t *p_data, uint16_t size) -{ - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID || - s_i2c_env[id].use_mode.type == APP_I2C_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - return APP_DRV_SUCCESS; -} - -static hal_status_t master_or_slave_receive_process(app_i2c_id_t id, uint16_t target_address, - uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - switch (s_i2c_env[id].role) { - case APP_I2C_ROLE_MASTER: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_master_receive_it(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_master_receive_dma(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - default: - break; - } - break; - - case APP_I2C_ROLE_SLAVE: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_slave_receive_it(&s_i2c_env[id].handle, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_slave_receive_dma(&s_i2c_env[id].handle, p_data, size); - break; - - default: - break; - } - break; - - default: - break; - } - return err_code; -} -#endif - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_i2c_receive_sem_sync(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size) -{ - uint16_t app_err_code; - hal_status_t err_code = HAL_OK; - -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - app_err_code = sem_sync_params_check(id, p_data, size); - APP_DRV_ERR_CODE_CHECK(app_err_code); - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - if (s_i2c_env[id].start_flag == false) { - s_i2c_env[id].start_flag = true; - err_code = master_or_slave_receive_process(id, target_address, p_data, size); - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_i2c_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_i2c_env[id].sem_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_i2c_receive_async(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID || - s_i2c_env[id].use_mode.type == APP_I2C_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - if (s_i2c_env[id].start_flag == false) { - s_i2c_env[id].start_flag = true; - switch (s_i2c_env[id].role) { - case APP_I2C_ROLE_MASTER: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_master_receive_it(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_master_receive_dma(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - default: - break; - } - break; - - case APP_I2C_ROLE_SLAVE: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_slave_receive_it(&s_i2c_env[id].handle, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_slave_receive_dma(&s_i2c_env[id].handle, p_data, size); - break; - - default: - break; - } - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_i2c_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_i2c_transmit_sync(app_i2c_id_t id, uint16_t target_address, \ - uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - switch (s_i2c_env[id].role) { - case APP_I2C_ROLE_MASTER: - err_code = hal_i2c_master_transmit(&s_i2c_env[id].handle, target_address, p_data, size, timeout); - break; - - case APP_I2C_ROLE_SLAVE: - err_code = hal_i2c_slave_transmit(&s_i2c_env[id].handle, p_data, size, timeout); - break; - - default: - break; - } - - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static hal_status_t master_or_slave_transmit_process(app_i2c_id_t id, uint16_t target_address, - uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - switch (s_i2c_env[id].role) { - case APP_I2C_ROLE_MASTER: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_master_transmit_it(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_master_transmit_dma(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - default: - break; - } - break; - - case APP_I2C_ROLE_SLAVE: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_slave_transmit_it(&s_i2c_env[id].handle, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_slave_transmit_dma(&s_i2c_env[id].handle, p_data, size); - break; - - default: - break; - } - break; - - default: - break; - } - return err_code; -} -#endif - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_i2c_transmit_sem_sync(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - app_err_code = sem_sync_params_check(id, p_data, size); - APP_DRV_ERR_CODE_CHECK(app_err_code); - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - if (s_i2c_env[id].start_flag == false) { - s_i2c_env[id].start_flag = true; - err_code = master_or_slave_transmit_process(id, target_address, p_data, size); - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_i2c_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_i2c_env[id].sem_tx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_I2C_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_i2c_transmit_async(app_i2c_id_t id, uint16_t target_address, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID || - s_i2c_env[id].use_mode.type == APP_I2C_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - if (s_i2c_env[id].start_flag == false) { - s_i2c_env[id].start_flag = true; - switch (s_i2c_env[id].role) { - case APP_I2C_ROLE_MASTER: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_master_transmit_it(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_master_transmit_dma(&s_i2c_env[id].handle, target_address, p_data, size); - break; - - default: - break; - } - break; - - case APP_I2C_ROLE_SLAVE: - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_slave_transmit_it(&s_i2c_env[id].handle, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_slave_transmit_dma(&s_i2c_env[id].handle, p_data, size); - break; - - default: - break; - } - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_i2c_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - - -uint16_t app_i2c_mem_read_sync(app_i2c_id_t id, uint16_t dev_address, \ - uint16_t mem_address, uint16_t mem_addr_size, \ - uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - err_code = hal_i2c_mem_read(&s_i2c_env[id].handle, dev_address, mem_address, mem_addr_size, p_data, size, timeout); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_i2c_mem_read_async(app_i2c_id_t id, uint16_t dev_address, \ - uint16_t mem_address, uint16_t mem_addr_size, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID || - s_i2c_env[id].use_mode.type == APP_I2C_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - if (s_i2c_env[id].start_flag == false) { - s_i2c_env[id].start_flag = true; - - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_mem_read_it(&s_i2c_env[id].handle, dev_address, \ - mem_address, mem_addr_size, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_mem_read_dma(&s_i2c_env[id].handle, dev_address, \ - mem_address, mem_addr_size, p_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_i2c_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_i2c_mem_write_sync(app_i2c_id_t id, uint16_t dev_address, \ - uint16_t mem_address, uint16_t mem_addr_size, \ - uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - err_code = hal_i2c_mem_write(&s_i2c_env[id].handle, dev_address, mem_address, mem_addr_size, p_data, size, timeout); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_i2c_mem_write_async(app_i2c_id_t id, uint16_t dev_address, \ - uint16_t mem_address, uint16_t mem_addr_size, \ - uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_I2C_ID_MAX || - p_data == NULL || - size == 0 || - s_i2c_env[id].i2c_state == APP_I2C_INVALID || - s_i2c_env[id].use_mode.type == APP_I2C_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - if (s_i2c_env[id].start_flag == false) { - s_i2c_env[id].start_flag = true; - - switch (s_i2c_env[id].use_mode.type) { - case APP_I2C_TYPE_INTERRUPT: - err_code = hal_i2c_mem_write_it(&s_i2c_env[id].handle, dev_address, \ - mem_address, mem_addr_size, p_data, size); - break; - - case APP_I2C_TYPE_DMA: - err_code = hal_i2c_mem_write_dma(&s_i2c_env[id].handle, dev_address, \ - mem_address, mem_addr_size, p_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_i2c_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -i2c_handle_t *app_i2c_get_handle(app_i2c_id_t id) -{ - if (id >= APP_I2C_ID_MAX || - s_i2c_env[id].i2c_state == APP_I2C_INVALID) { - return NULL; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - i2c_wake_up(id); -#endif - - return &s_i2c_env[id].handle; -} - -void hal_i2c_master_tx_cplt_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_TX_CPLT); -} - -void hal_i2c_master_rx_cplt_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_RX_DATA); -} - -void hal_i2c_slave_tx_cplt_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_TX_CPLT); -} - -void hal_i2c_slave_rx_cplt_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_RX_DATA); -} - -void hal_i2c_mem_tx_cplt_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_TX_CPLT); -} - -void hal_i2c_mem_rx_cplt_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_RX_DATA); -} - -void hal_i2c_error_callback(i2c_handle_t *p_i2c) -{ - app_i2c_event_call(p_i2c, APP_I2C_EVT_ERROR); -} - -SECTION_RAM_CODE void I2C0_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_i2c_irq_handler(&s_i2c_env[APP_I2C_ID_0].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -SECTION_RAM_CODE void I2C1_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_i2c_irq_handler(&s_i2c_env[APP_I2C_ID_1].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_io.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_io.c deleted file mode 100755 index cabf5ea..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_io.c +++ /dev/null @@ -1,293 +0,0 @@ -/** - **************************************************************************************** - * @file app_io.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include "gr55xx_hal_gpio.h" -#include "gr55xx_hal_aon_gpio.h" -#include "gr55xx_hal_msio.h" -#include "app_io.h" - -#ifndef GR5515_E -/* - * DEFINES - ***************************************************************************************** - */ -#define BIT_8 8 -#define BIT_16 16 -#define BIT_24 24 - -#define IO_MODE_NONE 0x00 - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static const uint32_t s_io_pull[APP_IO_TYPE_MAX][APP_IO_PULL_MAX] = { - { GPIO_NOPULL, GPIO_PULLUP, GPIO_PULLDOWN }, - { AON_GPIO_NOPULL, AON_GPIO_PULLUP, AON_GPIO_PULLDOWN }, - { MSIO_NOPULL, MSIO_PULLUP, MSIO_PULLDOWN }, -}; - -static const uint32_t s_io_mode[APP_IO_TYPE_MAX][APP_IO_MODE_MAX] = { - { - GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_MUX, GPIO_MODE_IT_RISING, - GPIO_MODE_IT_FALLING, GPIO_MODE_IT_HIGH, GPIO_MODE_IT_LOW, IO_MODE_NONE - }, - { - AON_GPIO_MODE_INPUT, AON_GPIO_MODE_OUTPUT, AON_GPIO_MODE_MUX, AON_GPIO_MODE_IT_RISING, - AON_GPIO_MODE_IT_FALLING, AON_GPIO_MODE_IT_HIGH, AON_GPIO_MODE_IT_LOW, IO_MODE_NONE - }, - { - MSIO_DIRECTION_INPUT, MSIO_DIRECTION_OUTPUT, MSIO_DIRECTION_INPUT, IO_MODE_NONE, - IO_MODE_NONE, IO_MODE_NONE, IO_MODE_NONE, MSIO_DIRECTION_NONE - }, -}; - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -uint16_t app_io_init(app_io_type_t type, app_io_init_t *p_init) -{ - gpio_init_t io_config; - aon_gpio_init_t aon_io_config; - msio_init_t msio_config; - - if (p_init == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } else { - switch (type) { - case APP_IO_TYPE_NORMAL: - if (APP_IO_MODE_ANALOG == p_init->mode) { - return APP_DRV_ERR_INVALID_MODE; - } - - io_config.mode = s_io_mode[type][p_init->mode]; - io_config.pull = s_io_pull[type][p_init->pull]; - io_config.mux = p_init->mux; - - if (APP_IO_PINS_0_15 & p_init->pin) { - io_config.pin = (APP_IO_PINS_0_15 & p_init->pin); - hal_gpio_init(GPIO0, &io_config); - } - if (APP_IO_PINS_16_31 & p_init->pin) { - io_config.pin = (APP_IO_PINS_16_31 & p_init->pin) >> BIT_16; - hal_gpio_init(GPIO1, &io_config); - } - break; - - case APP_IO_TYPE_AON: - if (APP_IO_MODE_ANALOG == p_init->mode) { - return APP_DRV_ERR_INVALID_MODE; - } - aon_io_config.mode = s_io_mode[type][p_init->mode]; - aon_io_config.pull = s_io_pull[type][p_init->pull]; - aon_io_config.mux = p_init->mux; - aon_io_config.pin = (APP_AON_IO_PIN_ALL & p_init->pin); - hal_aon_gpio_init(&aon_io_config); - break; - - case APP_IO_TYPE_MSIO: - if (p_init->mode >= APP_IO_MODE_IT_RISING && p_init->mode <= APP_IO_MODE_IT_LOW) { - return APP_DRV_ERR_INVALID_MODE; - } - msio_config.direction = (APP_IO_MODE_ANALOG == p_init->mode) ? \ - MSIO_DIRECTION_INPUT : s_io_mode[type][p_init->mode]; - msio_config.mode = (APP_IO_MODE_ANALOG == p_init->mode)? MSIO_MODE_ANALOG : MSIO_MODE_DIGITAL; - msio_config.pull = s_io_pull[type][p_init->pull]; - msio_config.mux = p_init->mux; - msio_config.pin = (APP_MSIO_PIN_ALL & p_init->pin); - hal_msio_init(&msio_config); - break; - - default: - return APP_DRV_ERR_INVALID_TYPE; - } - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_io_deinit(app_io_type_t type, uint32_t pin) -{ - switch (type) { - case APP_IO_TYPE_NORMAL: - if (APP_IO_PINS_0_15 & pin) { - hal_gpio_deinit(GPIO0, (APP_IO_PINS_0_15 & pin)); - } - if (APP_IO_PINS_16_31 & pin) { - hal_gpio_deinit(GPIO1, (APP_IO_PINS_16_31 & pin) >> BIT_16); - } - break; - - case APP_IO_TYPE_AON: - hal_aon_gpio_deinit(APP_AON_IO_PIN_ALL & pin); - break; - - case APP_IO_TYPE_MSIO: - hal_msio_deinit(APP_MSIO_PIN_ALL & pin); - break; - - default: - return APP_DRV_ERR_INVALID_TYPE; - } - - return APP_DRV_SUCCESS; -} - - -app_io_pin_state_t app_io_read_pin(app_io_type_t type, uint32_t pin) -{ - app_io_pin_state_t pin_state = APP_IO_PIN_RESET; - gpio_pin_state_t io_pin_state = GPIO_PIN_RESET; - aon_gpio_pin_state_t aon_io_pin_state = AON_GPIO_PIN_RESET; - msio_pin_state_t msio_pin_state = MSIO_PIN_RESET; - - switch (type) { - case APP_IO_TYPE_NORMAL: - if (APP_IO_PINS_0_15 & pin) { - io_pin_state = hal_gpio_read_pin(GPIO0, pin); - } - if (APP_IO_PINS_16_31 & pin) { - io_pin_state = hal_gpio_read_pin(GPIO1, pin >> BIT_16); - } - pin_state = (app_io_pin_state_t)io_pin_state; - break; - - case APP_IO_TYPE_AON: - aon_io_pin_state = hal_aon_gpio_read_pin(pin); - pin_state = (app_io_pin_state_t)aon_io_pin_state; - break; - - case APP_IO_TYPE_MSIO: - msio_pin_state = hal_msio_read_pin(pin); - pin_state = (app_io_pin_state_t)msio_pin_state; - break; - - default: - break; - } - - return pin_state; -} - -uint16_t app_io_write_pin(app_io_type_t type, uint32_t pin, app_io_pin_state_t pin_state) -{ - if (pin_state != APP_IO_PIN_RESET && pin_state != APP_IO_PIN_SET) { - return APP_DRV_ERR_INVALID_PARAM; - } - - switch (type) { - case APP_IO_TYPE_NORMAL: - if (APP_IO_PINS_0_15 & pin) { - hal_gpio_write_pin(GPIO0, (uint16_t)(APP_IO_PINS_0_15 & pin), (gpio_pin_state_t)pin_state); - } - if (APP_IO_PINS_16_31 & pin) { - hal_gpio_write_pin(GPIO1, (uint16_t)((APP_IO_PINS_16_31 & pin) >> BIT_16), (gpio_pin_state_t)pin_state); - } - break; - - case APP_IO_TYPE_AON: - hal_aon_gpio_write_pin(pin, (aon_gpio_pin_state_t)pin_state); - break; - - case APP_IO_TYPE_MSIO: - hal_msio_write_pin(pin, (msio_pin_state_t)pin_state); - break; - - default: - return APP_DRV_ERR_INVALID_TYPE; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_io_toggle_pin(app_io_type_t type, uint32_t pin) -{ - switch (type) { - case APP_IO_TYPE_NORMAL: - if (APP_IO_PINS_0_15 & pin) { - hal_gpio_toggle_pin(GPIO0, (uint16_t)(APP_IO_PINS_0_15 & pin)); - } - if (APP_IO_PINS_16_31 & pin) { - hal_gpio_toggle_pin(GPIO1, (uint16_t)((APP_IO_PINS_16_31 & pin) >> BIT_16)); - } - break; - - case APP_IO_TYPE_AON: - hal_aon_gpio_toggle_pin(pin); - break; - - case APP_IO_TYPE_MSIO: - hal_msio_toggle_pin(pin); - break; - - default: - return APP_DRV_ERR_INVALID_TYPE; - } - - return APP_DRV_SUCCESS; -} -#else - -uint16_t app_io_init(app_io_type_t type, app_io_init_t *p_init) -{ - return app_io_init_sym(type, p_init); -} - -uint16_t app_io_deinit(app_io_type_t type, uint32_t pin) -{ - return app_io_deinit_sym(type, pin); -} - -app_io_pin_state_t app_io_read_pin(app_io_type_t type, uint32_t pin) -{ - return app_io_read_pin_sym(type, pin); -} - -uint16_t app_io_write_pin(app_io_type_t type, uint32_t pin, app_io_pin_state_t pin_state) -{ - return app_io_write_pin_sym(type, pin, pin_state); -} - -uint16_t app_io_toggle_pin(app_io_type_t type, uint32_t pin) -{ - return app_io_toggle_pin_sym(type, pin); -} -#endif - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwm.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwm.c deleted file mode 100755 index 91e3efd..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwm.c +++ /dev/null @@ -1,377 +0,0 @@ -/** - **************************************************************************************** - * @file app_pwm.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "app_io.h" -#include "app_systick.h" -#include "app_pwr_mgmt.h" -#include "app_pwm.h" - -#ifdef HAL_CALENDAR_MODULE_ENABLED - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App pwm state types. */ -typedef enum { - APP_PWM_INVALID = 0, - APP_PWM_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_PWM_SLEEP, -#endif -} app_pwm_state_t; - -/**@brief App pwm module state types. */ -typedef enum { - APP_PWM_STOP = 0, - APP_PWM_START, -} app_pwm_module_state_t; - -struct pwm_env_t { - app_pwm_pin_cfg_t pin_cfg; - app_pwm_state_t pwm_state; - app_pwm_module_state_t pwm_module_state; - pwm_handle_t handle; -}; - - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool pwm_prepare_for_sleep(void); -static void pwm_sleep_canceled(void); -static void pwm_wake_up_ind(void); -static uint16_t pwm_gpio_config(app_pwm_pin_cfg_t pin_cfg); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -struct pwm_env_t s_pwm_env[APP_PWM_ID_MAX]; -static const uint32_t s_pwm_instance[APP_PWM_ID_MAX] = {PWM0_BASE, PWM1_BASE}; -static bool s_sleep_cb_registered_flag = false; -static uint16_t s_pwm_pwr_id; - -static const app_sleep_callbacks_t pwm_sleep_cb = { - .app_prepare_for_sleep = pwm_prepare_for_sleep, - .app_sleep_canceled = pwm_sleep_canceled, - .app_wake_up_ind = pwm_wake_up_ind -}; - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool pwm_prepare_for_sleep(void) -{ - hal_pwm_state_t state; - uint8_t i; - - for (i = 0; i < APP_PWM_ID_MAX; i++) { - if (s_pwm_env[i].pwm_state == APP_PWM_ENABLE) { - state = hal_pwm_get_state(&s_pwm_env[i].handle); - if ((state != HAL_PWM_STATE_RESET) && (state != HAL_PWM_STATE_READY)) { - return false; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_pwm_suspend_reg(&s_pwm_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_pwm_env[i].pwm_state = APP_PWM_SLEEP; -#endif - } - } - return true; -} - -static void pwm_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void pwm_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - uint8_t i; - - for (i = 0; i < APP_PWM_ID_MAX; i++) { - if (s_pwm_env[i].pwm_state == APP_PWM_ENABLE) { - GLOBAL_EXCEPTION_DISABLE(); - hal_pwm_resume_reg(&s_pwm_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_pwm_env[i].pwm_module_state == APP_PWM_START) { - hal_pwm_start(&s_pwm_env[i].handle); - } - } - } -#endif -} - - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -static void pwm_wake_up(app_pwm_id_t id) -{ - if (s_pwm_env[id].pwm_state == APP_PWM_SLEEP) { - GLOBAL_EXCEPTION_DISABLE(); - hal_pwm_resume_reg(&s_pwm_env[id].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_pwm_env[id].pwm_module_state == APP_PWM_START) { - hal_pwm_start(&s_pwm_env[id].handle); - } - } -} -#endif - - -static uint16_t pwm_gpio_config(app_pwm_pin_cfg_t pin_cfg) -{ - app_io_init_t io_init = APP_IO_DEFAULT_CONFIG; - uint16_t err_code = APP_DRV_SUCCESS; - - io_init.pull = APP_IO_PULLUP; - io_init.mode = APP_IO_MODE_MUX; - - if (pin_cfg.channel_a.enable == APP_PWM_PIN_ENABLE) { - io_init.pin = pin_cfg.channel_a.pin; - io_init.mux = pin_cfg.channel_a.mux; - err_code = app_io_init(pin_cfg.channel_a.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - if (pin_cfg.channel_b.enable == APP_PWM_PIN_ENABLE) { - io_init.pin = pin_cfg.channel_b.pin; - io_init.mux = pin_cfg.channel_b.mux; - err_code = app_io_init(pin_cfg.channel_b.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - if (pin_cfg.channel_c.enable == APP_PWM_PIN_ENABLE) { - io_init.pin = pin_cfg.channel_c.pin; - io_init.mux = pin_cfg.channel_c.mux; - err_code = app_io_init(pin_cfg.channel_c.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - return err_code; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ - -uint16_t app_pwm_init(app_pwm_params_t *p_params) -{ - uint8_t id = p_params->id; - uint16_t app_err_code; - hal_status_t hal_err_code; - - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - if (id >= APP_PWM_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - - app_systick_init(); - - app_err_code = pwm_gpio_config(p_params->pin_cfg); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - s_pwm_env[id].handle.active_channel = (hal_pwm_active_channel_t)p_params->active_channel; - - memcpy_s(&s_pwm_env[id].pin_cfg, sizeof (s_pwm_env[id].pin_cfg), &p_params->pin_cfg, sizeof(app_pwm_pin_cfg_t)); - memcpy_s(&s_pwm_env[id].handle.init, sizeof (s_pwm_env[id].handle.init), &p_params->init, sizeof(pwm_init_t)); - - pwm_gpio_config(s_pwm_env[id].pin_cfg); - - s_pwm_env[id].handle.p_instance = (pwm_regs_t *)s_pwm_instance[id]; - - hal_err_code = hal_pwm_deinit(&s_pwm_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - hal_err_code = hal_pwm_init(&s_pwm_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - if (!s_sleep_cb_registered_flag) { - s_sleep_cb_registered_flag = true; - - s_pwm_pwr_id = pwr_register_sleep_cb(&pwm_sleep_cb, APP_DRIVER_PWM_WAPEUP_PRIORITY); - if (s_pwm_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - } - - s_pwm_env[id].pwm_state = APP_PWM_ENABLE; - s_pwm_env[id].pwm_module_state = APP_PWM_STOP; - - return APP_DRV_SUCCESS; -} - - -uint16_t app_pwm_deinit(app_pwm_id_t id) -{ - hal_status_t err_code = HAL_ERROR; - - if (id >= APP_PWM_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - - if (s_pwm_env[id].pwm_state == APP_PWM_INVALID) { - return APP_DRV_ERR_INVALID_ID; - } - - GLOBAL_EXCEPTION_DISABLE(); - if (s_pwm_env[APP_PWM_ID_0].pwm_state == APP_PWM_INVALID && - s_pwm_env[APP_PWM_ID_1].pwm_state == APP_PWM_INVALID) { - pwr_unregister_sleep_cb(s_pwm_pwr_id); - s_sleep_cb_registered_flag = false; - } - GLOBAL_EXCEPTION_ENABLE(); - - if (s_pwm_env[id].pin_cfg.channel_a.enable == APP_PWM_PIN_ENABLE) { - app_io_deinit(s_pwm_env[id].pin_cfg.channel_a.type, s_pwm_env[id].pin_cfg.channel_a.pin); - } - if (s_pwm_env[id].pin_cfg.channel_b.enable == APP_PWM_PIN_ENABLE) { - app_io_deinit(s_pwm_env[id].pin_cfg.channel_b.type, s_pwm_env[id].pin_cfg.channel_b.pin); - } - if (s_pwm_env[id].pin_cfg.channel_c.enable == APP_PWM_PIN_ENABLE) { - app_io_deinit(s_pwm_env[id].pin_cfg.channel_c.type, s_pwm_env[id].pin_cfg.channel_c.pin); - } - - err_code = hal_pwm_deinit(&s_pwm_env[id].handle); - HAL_ERR_CODE_CHECK(err_code); - - s_pwm_env[id].pwm_state = APP_PWM_INVALID; - s_pwm_env[id].pwm_module_state = APP_PWM_STOP; - - return APP_DRV_SUCCESS; -} - - -uint16_t app_pwm_start(app_pwm_id_t id) -{ - hal_status_t err_code; - - if (id >= APP_PWM_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - pwm_wake_up(id); -#endif - err_code = hal_pwm_start(&s_pwm_env[id].handle); - HAL_ERR_CODE_CHECK(err_code); - - s_pwm_env[id].pwm_module_state = APP_PWM_START; - - return APP_DRV_SUCCESS; -} - - -uint16_t app_pwm_stop(app_pwm_id_t id) -{ - hal_status_t err_code; - - if (id >= APP_PWM_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - pwm_wake_up(id); -#endif - - err_code = hal_pwm_stop(&s_pwm_env[id].handle); - HAL_ERR_CODE_CHECK(err_code); - - s_pwm_env[id].pwm_module_state = APP_PWM_STOP; - - return APP_DRV_SUCCESS; -} - - -uint16_t app_pwm_update_freq(app_pwm_id_t id, uint32_t freq) -{ - hal_status_t err_code; - - if (id >= APP_PWM_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - pwm_wake_up(id); -#endif - - err_code = hal_pwm_update_freq(&s_pwm_env[id].handle, freq); - HAL_ERR_CODE_CHECK(err_code); - - return APP_DRV_SUCCESS; -} - - -uint16_t app_pwm_config_channel(app_pwm_id_t id, app_pwm_active_channel_t channel, app_pwm_channel_init_t *p_config) -{ - hal_status_t err_code; - - hal_pwm_active_channel_t active_channel; - pwm_channel_init_t channel_cfg; - - if (id >= APP_PWM_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - pwm_wake_up(id); -#endif - - active_channel = (hal_pwm_active_channel_t)channel; - channel_cfg.duty = p_config->duty; - channel_cfg.drive_polarity = p_config->drive_polarity; - - err_code = hal_pwm_config_channel(&s_pwm_env[id].handle, &channel_cfg, active_channel); - HAL_ERR_CODE_CHECK(err_code); - - return APP_DRV_SUCCESS; -} -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwr_mgmt.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwr_mgmt.c deleted file mode 100755 index 401a726..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_pwr_mgmt.c +++ /dev/null @@ -1,147 +0,0 @@ -/** - **************************************************************************************** - * @file app_pwr_mgmt.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include "gr55xx_hal.h" -#include "gr55xx_pwr.h" -#include "app_pwr_mgmt.h" - -/* - * STRUCT DEFINES - ***************************************************************************************** - */ -struct pwr_env_t { - app_sleep_callbacks_t *pwr_sleep_cb[APP_SLEEP_CB_MAX]; - wakeup_priority_t wakeup_priority[APP_SLEEP_CB_MAX]; - bool is_pwr_callback_reg; -}; - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -struct pwr_env_t s_pwr_env; - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -int16_t pwr_register_sleep_cb(const app_sleep_callbacks_t *p_cb, wakeup_priority_t wakeup_priority) -{ - int16_t id = -1; - uint8_t i = 0; - - if (p_cb == NULL || wakeup_priority > WAPEUP_PRIORITY_HIGH || wakeup_priority < WAPEUP_PRIORITY_LOW) { - return id; - } - - GLOBAL_EXCEPTION_DISABLE(); - if (!s_pwr_env.is_pwr_callback_reg) { - pwr_mgmt_dev_init(pwr_wake_up_ind); - pwr_mgmt_set_callback(pwr_enter_sleep_check, NULL); - s_pwr_env.is_pwr_callback_reg = true; - } - - while ((i < APP_SLEEP_CB_MAX) && (s_pwr_env.pwr_sleep_cb[i] != NULL)) { - i++; - } - - if (i < APP_SLEEP_CB_MAX) { - s_pwr_env.pwr_sleep_cb[i] = (app_sleep_callbacks_t *)p_cb; - s_pwr_env.wakeup_priority[i] = wakeup_priority; - id = i; - } - - GLOBAL_EXCEPTION_ENABLE(); - return id; -} - -void pwr_unregister_sleep_cb(int16_t id) -{ - if (id < APP_SLEEP_CB_MAX) { // Is id valid? - s_pwr_env.pwr_sleep_cb[id] = NULL; - } -} - -SECTION_RAM_CODE void pwr_wake_up_ind(void) -{ - uint8_t i; - app_sleep_callbacks_t *p_cb; - wakeup_priority_t priority; - - for (priority = WAPEUP_PRIORITY_HIGH; priority != 0; priority--) { - for (i = 0; i < APP_SLEEP_CB_MAX; i++) { - p_cb = s_pwr_env.pwr_sleep_cb[i]; - if ((p_cb != NULL) && (p_cb ->app_wake_up_ind != NULL) && (priority == s_pwr_env.wakeup_priority[i])) { - p_cb ->app_wake_up_ind(); - } - } - } -} - -pwr_mgmt_dev_state_t pwr_enter_sleep_check(void) -{ - int16_t i; - pwr_mgmt_dev_state_t allow_entering_sleep = DEVICE_IDLE; - app_sleep_callbacks_t *p_cb; - - // 1. Inquiry Adapters - for (i = APP_SLEEP_CB_MAX - 1; i >= 0; i--) { - p_cb = s_pwr_env.pwr_sleep_cb[i]; - if ((p_cb != NULL) && (p_cb->app_prepare_for_sleep != NULL)) { - if (!p_cb->app_prepare_for_sleep()) { - allow_entering_sleep = DEVICE_BUSY; - break; - } - } - } - - // 2. If an Adapter rejected sleep, resume any Adapters that have already accepted it. - if (allow_entering_sleep == DEVICE_BUSY) { - i++; - while (i < APP_SLEEP_CB_MAX) { - p_cb = s_pwr_env.pwr_sleep_cb[i]; - if ((p_cb != NULL) && (p_cb->app_sleep_canceled != NULL)) { - p_cb->app_sleep_canceled(); - } - i++; - } - } - - return allow_entering_sleep; -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_qspi.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_qspi.c deleted file mode 100755 index e929f10..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_qspi.c +++ /dev/null @@ -1,1635 +0,0 @@ -/** - **************************************************************************************** - * @file app_qspi.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "app_io.h" -#include "app_dma.h" -#include "app_pwr_mgmt.h" -#include "app_systick.h" -#include "platform_sdk.h" -#include "app_qspi.h" - -#ifdef HAL_QSPI_MODULE_ENABLED - -/* - * DEFINES - ***************************************************************************************** - */ - -/******************************************************************** - * QUAD_WRITE_32b_PATCH : just exist in QUAD/DATASIZE_32BITS/DMA scene - * if enable, MUST Control the CS By Software. - */ -#define QSPI_QUAD_WRITE_32b_PATCH_EN 0u - -/******************************************************************** - * DATA Endian Mode Optional Value : - * 0 : data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24) - * 1 : data[1] | (data[0] << 8) | (data[3] << 16) | (data[2] << 24) - * 2 : data[3] | (data[2] << 8) | (data[1] << 16) | (data[0] << 24) - * 3 : data[2] | (data[3] << 8) | (data[0] << 16) | (data[1] << 24) - */ -#define QSPI_QUAD_WRITE_DATA_ENDIAN_MODE 0u - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App qspi state types. */ -typedef enum { - APP_QSPI_INVALID = 0, - APP_QSPI_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_QSPI_SLEEP, -#endif -} app_qspi_state_t; - -struct qspi_env_t { - app_qspi_evt_handler_t evt_handler; - qspi_handle_t handle; - app_qspi_mode_t use_mode; - app_qspi_pin_cfg_t pin_cfg; - int16_t dma_id; - app_qspi_state_t qspi_state; - bool start_flag; - volatile uint8_t rx_done; - volatile uint8_t tx_done; - volatile uint8_t user_mode; - -#ifdef ENV_RTOS_USE_SEMP - APP_DRV_SEM_DECL(sem_tx); - APP_DRV_SEM_DECL(sem_rx); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - APP_DRV_MUTEX_DECL(mutex_sync); - APP_DRV_MUTEX_DECL(mutex_async); -#endif -}; - - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool qspi_prepare_for_sleep(void); -static void qspi_sleep_canceled(void); -static void qspi_wake_up_ind(void); -static uint16_t qspi_gpio_config(app_qspi_pin_cfg_t pin_cfg); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static const IRQn_Type s_qspi_irq[APP_QSPI_ID_MAX] = { QSPI0_IRQn, QSPI1_IRQn }; -static const uint32_t s_qspi_instance[APP_QSPI_ID_MAX] = { QSPI0_BASE, QSPI1_BASE }; - -struct qspi_env_t s_qspi_env[APP_QSPI_ID_MAX] = { - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - }, - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - } -}; -static bool s_sleep_cb_registered_flag = false; -static pwr_id_t s_qspi_pwr_id; - -static const app_sleep_callbacks_t qspi_sleep_cb = { - .app_prepare_for_sleep = qspi_prepare_for_sleep, - .app_sleep_canceled = qspi_sleep_canceled, - .app_wake_up_ind = qspi_wake_up_ind -}; - -static inline void QSPI_SMART_CS_LOW(app_qspi_id_t id); -static inline void QSPI_SMART_CS_HIGH(app_qspi_id_t id); - -static inline void QSPI_SMART_CS_LOW(app_qspi_id_t id) -{ - if (s_qspi_env[id].pin_cfg.cs.enable == APP_QSPI_PIN_ENABLE) { - app_io_write_pin(s_qspi_env[id].pin_cfg.cs.type, - s_qspi_env[id].pin_cfg.cs.pin, - APP_IO_PIN_RESET); - } -} - -static inline void QSPI_SMART_CS_HIGH(app_qspi_id_t id) -{ - if (s_qspi_env[id].pin_cfg.cs.enable == APP_QSPI_PIN_ENABLE) { - app_io_write_pin(s_qspi_env[id].pin_cfg.cs.type, - s_qspi_env[id].pin_cfg.cs.pin, - APP_IO_PIN_SET); - } -} - -#ifdef ENV_RTOS_USE_MUTEX -static inline void APP_QSPI_DRV_SYNC_MUTEX_LOCK(app_qspi_id_t id); -static inline void APP_QSPI_DRV_SYNC_MUTEX_UNLOCK(app_qspi_id_t id); -static inline void APP_QSPI_DRV_ASYNC_MUTEX_LOCK(app_qspi_id_t id); -static inline void APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(app_qspi_id_t id); - -static inline void APP_QSPI_DRV_SYNC_MUTEX_LOCK(app_qspi_id_t id) -{ - app_driver_mutex_pend(s_qspi_env[id].mutex_sync, MUTEX_WAIT_FOREVER); -} - -static inline void APP_QSPI_DRV_SYNC_MUTEX_UNLOCK(app_qspi_id_t id) -{ - app_driver_mutex_post(s_qspi_env[id].mutex_sync); -} - -static inline void APP_QSPI_DRV_ASYNC_MUTEX_LOCK(app_qspi_id_t id) -{ - app_driver_mutex_pend(s_qspi_env[id].mutex_async, MUTEX_WAIT_FOREVER); -} - -static inline void APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(app_qspi_id_t id) -{ - app_driver_mutex_post(s_qspi_env[id].mutex_async); -} -#endif - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool qspi_prepare_for_sleep(void) -{ - hal_qspi_state_t state; - uint8_t i; - - for (i = 0; i < APP_QSPI_ID_MAX; i++) { - if (s_qspi_env[i].qspi_state == APP_QSPI_ENABLE) { - state = hal_qspi_get_state(&s_qspi_env[i].handle); - if ((state != HAL_QSPI_STATE_RESET) && (state != HAL_QSPI_STATE_READY)) { - return false; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_qspi_suspend_reg(&s_qspi_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_qspi_env[i].qspi_state = APP_QSPI_SLEEP; -#endif - } - } - - return true; -} - -static void qspi_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void qspi_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - uint8_t i; - - for (i = 0; i < APP_QSPI_ID_MAX; i++) { - if (s_qspi_env[i].qspi_state == APP_QSPI_ENABLE) { - GLOBAL_EXCEPTION_DISABLE(); - hal_qspi_resume_reg(&s_qspi_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_qspi_env[i].use_mode.type == APP_QSPI_TYPE_INTERRUPT || - s_qspi_env[i].use_mode.type == APP_QSPI_TYPE_DMA) { - hal_nvic_clear_pending_irq(s_qspi_irq[i]); - hal_nvic_enable_irq(s_qspi_irq[i]); - } - } - } -#endif -} - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -static void qspi_wake_up(app_qspi_id_t id) -{ - if (s_qspi_env[id].qspi_state == APP_QSPI_SLEEP) { - GLOBAL_EXCEPTION_DISABLE(); - hal_qspi_resume_reg(&s_qspi_env[id].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_INTERRUPT || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_DMA) { - hal_nvic_clear_pending_irq(s_qspi_irq[id]); - hal_nvic_enable_irq(s_qspi_irq[id]); - } - s_qspi_env[id].qspi_state = APP_QSPI_ENABLE; - } - - if (s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_DMA) { - dma_wake_up(s_qspi_env[id].dma_id); - } -} -#endif - -static uint16_t qspi_gpio_config(app_qspi_pin_cfg_t pin_cfg) -{ - app_io_init_t io_init = APP_IO_DEFAULT_CONFIG; - uint16_t err_code = APP_DRV_SUCCESS; - - io_init.mode = APP_IO_MODE_MUX; - - if (pin_cfg.cs.enable == APP_QSPI_PIN_ENABLE) { - io_init.pull = pin_cfg.cs.pull; - io_init.mode = APP_IO_MODE_OUT_PUT; - io_init.pin = pin_cfg.cs.pin; - io_init.mux = APP_IO_MUX_7; - err_code = app_io_init(pin_cfg.cs.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - app_io_write_pin(pin_cfg.cs.type, pin_cfg.cs.pin, APP_IO_PIN_SET); - } - if (pin_cfg.clk.enable == APP_QSPI_PIN_ENABLE) { - io_init.pull = pin_cfg.clk.pull; - io_init.pin = pin_cfg.clk.pin; - io_init.mux = pin_cfg.clk.mux; - err_code = app_io_init(pin_cfg.clk.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (pin_cfg.io_0.enable == APP_QSPI_PIN_ENABLE) { - io_init.pull = pin_cfg.io_0.pull; - io_init.pin = pin_cfg.io_0.pin; - io_init.mux = pin_cfg.io_0.mux; - err_code = app_io_init(pin_cfg.io_0.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (pin_cfg.io_1.enable == APP_QSPI_PIN_ENABLE) { - io_init.pull = pin_cfg.io_1.pull; - io_init.pin = pin_cfg.io_1.pin; - io_init.mux = pin_cfg.io_1.mux; - err_code = app_io_init(pin_cfg.io_1.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (pin_cfg.io_2.enable == APP_QSPI_PIN_ENABLE) { - io_init.pull = pin_cfg.io_2.pull; - io_init.pin = pin_cfg.io_2.pin; - io_init.mux = pin_cfg.io_2.mux; - err_code = app_io_init(pin_cfg.io_2.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (pin_cfg.io_3.enable == APP_QSPI_PIN_ENABLE) { - io_init.pull = pin_cfg.io_3.pull; - io_init.pin = pin_cfg.io_3.pin; - io_init.mux = pin_cfg.io_3.mux; - err_code = app_io_init(pin_cfg.io_3.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return err_code; -} - -static uint16_t app_qspi_config_dma(app_qspi_params_t *p_params) -{ - app_dma_params_t dma_params = {DMA_Channel0, {0}}; - - dma_params.channel_number = p_params->use_mode.dma_channel; - dma_params.init.direction = DMA_MEMORY_TO_PERIPH; - dma_params.init.src_increment = DMA_SRC_INCREMENT; - dma_params.init.dst_increment = DMA_DST_NO_CHANGE; - dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - dma_params.init.mode = DMA_NORMAL; - dma_params.init.priority = DMA_PRIORITY_LOW; - - s_qspi_env[p_params->id].dma_id = app_dma_init(&dma_params, NULL); - if (s_qspi_env[p_params->id].dma_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - s_qspi_env[p_params->id].handle.p_dma = app_dma_get_handle(s_qspi_env[p_params->id].dma_id); - s_qspi_env[p_params->id].handle.p_dma->p_parent = (void*)&s_qspi_env[p_params->id].handle; - - return APP_DRV_SUCCESS; -} - -static void app_qspi_event_call(qspi_handle_t *p_qspi, app_qspi_evt_type_t evt_type) -{ - app_qspi_evt_t qspi_evt; - app_qspi_id_t id = APP_QSPI_ID_MAX; - - if (p_qspi->p_instance == QSPI0) { - id = APP_QSPI_ID_0; - } else if (p_qspi->p_instance == QSPI1) { - id = APP_QSPI_ID_1; - } - - qspi_evt.type = evt_type; - if (evt_type == APP_QSPI_EVT_ERROR) { - qspi_evt.data.error_code = p_qspi->error_code; -#ifdef ENV_RTOS_USE_SEMP - if (!s_qspi_env[id].user_mode) { - app_driver_sem_post_from_isr(s_qspi_env[id].sem_tx); - app_driver_sem_post_from_isr(s_qspi_env[id].sem_rx); - } -#endif - s_qspi_env[id].rx_done = 1; - s_qspi_env[id].tx_done = 1; - } else if (evt_type == APP_QSPI_EVT_TX_CPLT) { - qspi_evt.data.size = p_qspi->tx_xfer_size - p_qspi->tx_xfer_count; -#ifdef ENV_RTOS_USE_SEMP - if (!s_qspi_env[id].user_mode) { - app_driver_sem_post_from_isr(s_qspi_env[id].sem_tx); - } -#endif - s_qspi_env[id].tx_done = 1; - } else if (evt_type == APP_QSPI_EVT_RX_DATA) { - qspi_evt.data.size = p_qspi->rx_xfer_size - p_qspi->rx_xfer_count; -#ifdef ENV_RTOS_USE_SEMP - if (!s_qspi_env[id].user_mode) { - app_driver_sem_post_from_isr(s_qspi_env[id].sem_rx); - } -#endif - s_qspi_env[id].rx_done = 1; - } - s_qspi_env[id].start_flag = false; - QSPI_SMART_CS_HIGH(id); - if (s_qspi_env[id].evt_handler != NULL) { - s_qspi_env[id].evt_handler(&qspi_evt); - } -} - -static void app_qspi_config_dma_qwrite_32b_patch(app_qspi_id_t id, bool enable_patch, uint32_t endian_mode) -{ -#if defined(GR5515_D) - hal_qspi_config_dma_qwrite_32b_patch(&s_qspi_env[id].handle, enable_patch, endian_mode); -#endif -} - -static uint16_t params_check(app_qspi_params_t *p_params) -{ - uint8_t id = p_params->id; - - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - if (id >= APP_QSPI_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t semp_init_config(uint8_t id) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - - if (s_qspi_env[id].sem_rx == NULL) { - app_err_code = app_driver_sem_init(&s_qspi_env[id].sem_rx); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].sem_tx == NULL) { - app_err_code = app_driver_sem_init(&s_qspi_env[id].sem_tx); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_init_config(uint8_t id) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - - if (s_qspi_env[id].mutex_async == NULL) { - app_err_code = app_driver_mutex_init(&s_qspi_env[id].mutex_async); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].mutex_sync == NULL) { - app_err_code = app_driver_mutex_init(&s_qspi_env[id].mutex_sync); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -static void sync_params_to_env(app_qspi_params_t *p_params, app_qspi_evt_handler_t evt_handler, uint8_t id) -{ - s_qspi_env[id].use_mode.type = p_params->use_mode.type; - s_qspi_env[id].use_mode.dma_channel = p_params->use_mode.dma_channel; - memcpy_s(&s_qspi_env[id].pin_cfg, sizeof (s_qspi_env[id].pin_cfg), &p_params->pin_cfg, sizeof(app_qspi_pin_cfg_t)); - s_qspi_env[id].evt_handler = evt_handler; - - memcpy_s(&s_qspi_env[id].handle.init, sizeof (s_qspi_env[id].handle.init), &p_params->init, sizeof(qspi_init_t)); - s_qspi_env[id].handle.p_instance = (ssi_regs_t *)s_qspi_instance[id]; -} - -static uint16_t register_cb(void) -{ - if (!s_sleep_cb_registered_flag) { // register sleep callback - s_sleep_cb_registered_flag = true; - s_qspi_pwr_id = pwr_register_sleep_cb(&qspi_sleep_cb, APP_DRIVER_QSPI_WAPEUP_PRIORITY); - if (s_qspi_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - } - - return APP_DRV_SUCCESS; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -uint16_t app_qspi_init(app_qspi_params_t *p_params, app_qspi_evt_handler_t evt_handler) -{ - uint8_t id = p_params->id; - uint16_t app_err_code; - hal_status_t hal_err_code; - - app_err_code = params_check(p_params); - APP_DRV_ERR_CODE_CHECK(app_err_code); - -#ifdef ENV_RTOS_USE_SEMP - app_err_code = semp_init_config(id); - APP_DRV_ERR_CODE_CHECK(app_err_code); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - app_err_code = mutex_init_config(id); - APP_DRV_ERR_CODE_CHECK(app_err_code); -#endif - - app_systick_init(); - app_err_code = qspi_gpio_config(p_params->pin_cfg); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - if (p_params->use_mode.type == APP_QSPI_TYPE_DMA) { - GLOBAL_EXCEPTION_DISABLE(); - app_err_code = app_qspi_config_dma(p_params); - GLOBAL_EXCEPTION_ENABLE(); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - - if (p_params->use_mode.type != APP_QSPI_TYPE_POLLING) { - hal_nvic_clear_pending_irq(s_qspi_irq[id]); - hal_nvic_enable_irq(s_qspi_irq[id]); - } - - sync_params_to_env(p_params, evt_handler, id); - - hal_err_code = hal_qspi_deinit(&s_qspi_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - hal_err_code =hal_qspi_init(&s_qspi_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - app_err_code = register_cb(); - APP_DRV_ERR_CODE_CHECK(app_err_code); - - s_qspi_env[id].qspi_state = APP_QSPI_ENABLE; - s_qspi_env[id].start_flag = false; - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static void semp_deinit_config(uint8_t id) -{ - if (s_qspi_env[id].sem_tx != NULL) { - app_driver_sem_deinit(s_qspi_env[id].sem_tx); - s_qspi_env[id].sem_tx = NULL; - } - if (s_qspi_env[id].sem_rx != NULL) { - app_driver_sem_deinit(s_qspi_env[id].sem_rx); - s_qspi_env[id].sem_rx = NULL; - } -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_deinit_config(uint8_t id) -{ - if (s_qspi_env[id].mutex_sync != NULL) { - app_driver_mutex_deinit(s_qspi_env[id].mutex_sync); - s_qspi_env[id].mutex_sync = NULL; - } - if (s_qspi_env[id].mutex_async != NULL) { - app_driver_mutex_deinit(s_qspi_env[id].mutex_async); - s_qspi_env[id].mutex_async = NULL; - } -} -#endif - -static void unregister_cb(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - if (s_qspi_env[APP_QSPI_ID_0].qspi_state == APP_QSPI_INVALID && - s_qspi_env[APP_QSPI_ID_1].qspi_state == APP_QSPI_INVALID) { - pwr_unregister_sleep_cb(s_qspi_pwr_id); - s_sleep_cb_registered_flag = false; - } - GLOBAL_EXCEPTION_ENABLE(); -} - -uint16_t app_qspi_deinit(app_qspi_id_t id) -{ - uint16_t app_err_code; - hal_status_t hal_err_code; - - if ((id >= APP_QSPI_ID_MAX) || (s_qspi_env[id].qspi_state == APP_QSPI_INVALID)) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef ENV_RTOS_USE_SEMP - semp_deinit_config(id); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - mutex_deinit_config(id); -#endif - - if (s_qspi_env[id].pin_cfg.cs.enable == APP_QSPI_PIN_ENABLE) { - app_err_code = app_io_deinit(s_qspi_env[id].pin_cfg.cs.type, s_qspi_env[id].pin_cfg.cs.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].pin_cfg.clk.enable == APP_QSPI_PIN_ENABLE) { - app_err_code = app_io_deinit(s_qspi_env[id].pin_cfg.clk.type, s_qspi_env[id].pin_cfg.clk.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].pin_cfg.io_0.enable == APP_QSPI_PIN_ENABLE) { - app_err_code = app_io_deinit(s_qspi_env[id].pin_cfg.io_0.type, s_qspi_env[id].pin_cfg.io_0.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].pin_cfg.io_1.enable == APP_QSPI_PIN_ENABLE) { - app_err_code = app_io_deinit(s_qspi_env[id].pin_cfg.io_1.type, s_qspi_env[id].pin_cfg.io_1.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].pin_cfg.io_2.enable == APP_QSPI_PIN_ENABLE) { - app_err_code = app_io_deinit(s_qspi_env[id].pin_cfg.io_2.type, s_qspi_env[id].pin_cfg.io_2.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_qspi_env[id].pin_cfg.io_3.enable == APP_QSPI_PIN_ENABLE) { - app_err_code = app_io_deinit(s_qspi_env[id].pin_cfg.io_3.type, s_qspi_env[id].pin_cfg.io_3.pin); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - hal_nvic_disable_irq(s_qspi_irq[id]); - if (s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_DMA) { - app_dma_deinit(s_qspi_env[id].dma_id); - } - s_qspi_env[id].qspi_state = APP_QSPI_INVALID; - s_qspi_env[id].start_flag = false; - - unregister_cb(); - - app_systick_deinit(); - - hal_err_code = hal_qspi_deinit(&s_qspi_env[id].handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - return APP_DRV_SUCCESS; -} - -uint16_t app_qspi_command_receive_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - QSPI_SMART_CS_LOW(id); - err_code = hal_qspi_command_receive(&s_qspi_env[id].handle, p_cmd, p_data, timeout); - QSPI_SMART_CS_HIGH(id); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_qspi_command_receive_sem_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - hal_status_t err_code = HAL_OK; - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_command_receive_it(&s_qspi_env[id].handle, p_cmd, p_data); - break; - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_command_receive_dma(&s_qspi_env[id].handle, p_cmd, p_data); - break; - default: - break; - } - if (HAL_OK != err_code) { - QSPI_SMART_CS_HIGH(id); -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_qspi_env[id].sem_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} - -#endif - -uint16_t app_qspi_command_receive_high_speed_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - s_qspi_env[id].user_mode = 0x1; - s_qspi_env[id].rx_done = 0; - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - hal_err_code = hal_qspi_command_receive_it(&s_qspi_env[id].handle, p_cmd, p_data); - break; - case APP_QSPI_TYPE_DMA: - hal_err_code = hal_qspi_command_receive_dma(&s_qspi_env[id].handle, p_cmd, p_data); - break; - default: - break; - } - if (HAL_OK != hal_err_code) { - QSPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - s_qspi_env[id].start_flag = false; - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_qspi_env[id].rx_done == 0); - -exit: - s_qspi_env[id].user_mode = 0x0; - - return app_err_code; -} - - -uint16_t app_qspi_command_receive_async(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_command_receive_it(&s_qspi_env[id].handle, p_cmd, p_data); - break; - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_command_receive_dma(&s_qspi_env[id].handle, p_cmd, p_data); - break; - default: - break; - } - if (HAL_OK != err_code) { - QSPI_SMART_CS_HIGH(id); - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_qspi_command_transmit_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - QSPI_SMART_CS_LOW(id); - err_code = hal_qspi_command_transmit(&s_qspi_env[id].handle, p_cmd, p_data, timeout); - QSPI_SMART_CS_HIGH(id); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t sem_sync_params_check(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - return APP_DRV_SUCCESS; -} - -static hal_status_t command_transmit_process(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - hal_status_t err_code = HAL_OK; - - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_command_transmit_it(&s_qspi_env[id].handle, p_cmd, p_data); - break; - - case APP_QSPI_TYPE_DMA: - app_qspi_config_dma_qwrite_32b_patch(id, QSPI_QUAD_WRITE_32b_PATCH_EN, - QSPI_QUAD_WRITE_DATA_ENDIAN_MODE); - err_code = hal_qspi_command_transmit_dma(&s_qspi_env[id].handle, p_cmd, p_data); - app_qspi_config_dma_qwrite_32b_patch(id, 0, QSPI_QUAD_WRITE_DATA_ENDIAN_MODE); - break; - - default: - break; - } - return err_code; -} -#endif - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_qspi_command_transmit_sem_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - uint16_t app_err_code; - hal_status_t err_code = HAL_OK; - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - app_err_code = sem_sync_params_check(id, p_cmd, p_data); - APP_DRV_ERR_CODE_CHECK(app_err_code); - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - err_code = command_transmit_process(id, p_cmd, p_data); - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_qspi_env[id].sem_tx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - - -uint16_t app_qspi_command_transmit_high_speed_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - s_qspi_env[id].user_mode = 0x1; - s_qspi_env[id].tx_done = 0; - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - hal_err_code = hal_qspi_command_transmit_it(&s_qspi_env[id].handle, p_cmd, p_data); - break; - - case APP_QSPI_TYPE_DMA: - app_qspi_config_dma_qwrite_32b_patch(id, QSPI_QUAD_WRITE_32b_PATCH_EN, - QSPI_QUAD_WRITE_DATA_ENDIAN_MODE); - hal_err_code = hal_qspi_command_transmit_dma(&s_qspi_env[id].handle, p_cmd, p_data); - app_qspi_config_dma_qwrite_32b_patch(id, 0, QSPI_QUAD_WRITE_DATA_ENDIAN_MODE); - break; - - default: - break; - } - if (hal_err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - s_qspi_env[id].start_flag = false; - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_qspi_env[id].tx_done == 0); - -exit: - s_qspi_env[id].user_mode = 0x0; - - return app_err_code; -} - -uint16_t app_qspi_command_transmit_async(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_command_transmit_it(&s_qspi_env[id].handle, p_cmd, p_data); - break; - - case APP_QSPI_TYPE_DMA: - app_qspi_config_dma_qwrite_32b_patch(id, QSPI_QUAD_WRITE_32b_PATCH_EN, - QSPI_QUAD_WRITE_DATA_ENDIAN_MODE); - err_code = hal_qspi_command_transmit_dma(&s_qspi_env[id].handle, p_cmd, p_data); - app_qspi_config_dma_qwrite_32b_patch(id, 0, QSPI_QUAD_WRITE_DATA_ENDIAN_MODE); - break; - - default: - break; - } - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_qspi_command_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - QSPI_SMART_CS_LOW(id); - err_code = hal_qspi_command(&s_qspi_env[id].handle, p_cmd, timeout); - QSPI_SMART_CS_HIGH(id); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_qspi_command_sem_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd) -{ - hal_status_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_command_it(&s_qspi_env[id].handle, p_cmd); - break; - - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_command_dma(&s_qspi_env[id].handle, p_cmd); - break; - - default: - break; - } - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_qspi_env[id].sem_tx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_qspi_command_high_speed_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - s_qspi_env[id].user_mode = 0x1; - s_qspi_env[id].tx_done = 0; - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - hal_err_code = hal_qspi_command_it(&s_qspi_env[id].handle, p_cmd); - break; - - case APP_QSPI_TYPE_DMA: - hal_err_code = hal_qspi_command_dma(&s_qspi_env[id].handle, p_cmd); - break; - - default: - break; - } - if (hal_err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - s_qspi_env[id].start_flag = false; - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_qspi_env[id].tx_done == 0); - -exit: - s_qspi_env[id].user_mode = 0x0; - - return app_err_code; -} - -uint16_t app_qspi_command_async(app_qspi_id_t id, app_qspi_command_t *p_cmd) -{ - hal_status_t err_code; - - if (id >= APP_QSPI_ID_MAX || - p_cmd == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_command_it(&s_qspi_env[id].handle, p_cmd); - break; - - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_command_dma(&s_qspi_env[id].handle, p_cmd); - break; - - default: - break; - } - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_qspi_transmit_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_QSPI_ID_MAX || - p_data == NULL || - length == 0 || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - QSPI_SMART_CS_LOW(id); - err_code = hal_qspi_transmit(&s_qspi_env[id].handle, p_data, length, timeout); - QSPI_SMART_CS_HIGH(id); - if (err_code != HAL_OK) { - return err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_qspi_transmit_sem_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length) -{ - hal_status_t err_code = HAL_OK; - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_QSPI_ID_MAX || - p_data == NULL || - length == 0 || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_transmit_it(&s_qspi_env[id].handle, p_data, length); - break; - - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_transmit_dma(&s_qspi_env[id].handle, p_data, length); - break; - - default: - break; - } - - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_qspi_env[id].sem_tx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_qspi_transmit_high_speed_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_data == NULL || - length == 0 || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - s_qspi_env[id].user_mode = 0x1; - s_qspi_env[id].tx_done = 0; - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - hal_err_code = hal_qspi_transmit_it(&s_qspi_env[id].handle, p_data, length); - break; - - case APP_QSPI_TYPE_DMA: - hal_err_code = hal_qspi_transmit_dma(&s_qspi_env[id].handle, p_data, length); - break; - - default: - break; - } - - if (hal_err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - s_qspi_env[id].start_flag = false; - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_qspi_env[id].tx_done == 0); - -exit: - s_qspi_env[id].user_mode = 0x0; - - return app_err_code; -} - -uint16_t app_qspi_transmit_async(app_qspi_id_t id, uint8_t *p_data, uint32_t length) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - p_data == NULL || - length == 0 || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_transmit_it(&s_qspi_env[id].handle, p_data, length); - break; - - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_transmit_dma(&s_qspi_env[id].handle, p_data, length); - break; - - default: - break; - } - - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_qspi_receive_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_QSPI_ID_MAX || - length == 0 || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - QSPI_SMART_CS_LOW(id); - err_code = hal_qspi_receive(&s_qspi_env[id].handle, p_data, length, timeout); - QSPI_SMART_CS_HIGH(id); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_qspi_receive_sem_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length) -{ - hal_status_t err_code = HAL_OK; - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_QSPI_ID_MAX || - length == 0 || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_receive_it(&s_qspi_env[id].handle, p_data, length); - break; - - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_receive_dma(&s_qspi_env[id].handle, p_data, length); - break; - - default: - break; - } - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_qspi_env[id].sem_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_QSPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_qspi_receive_high_speed_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - length == 0 || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - s_qspi_env[id].user_mode = 0x1; - s_qspi_env[id].rx_done = 0; - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - hal_err_code = hal_qspi_receive_it(&s_qspi_env[id].handle, p_data, length); - break; - - case APP_QSPI_TYPE_DMA: - hal_err_code = hal_qspi_receive_dma(&s_qspi_env[id].handle, p_data, length); - break; - - default: - break; - } - if (hal_err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - s_qspi_env[id].start_flag = false; - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_qspi_env[id].rx_done == 0); - -exit: - s_qspi_env[id].user_mode = 0x0; - - return app_err_code; -} - -uint16_t app_qspi_receive_async(app_qspi_id_t id, uint8_t *p_data, uint32_t length) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_QSPI_ID_MAX || - length == 0 || - p_data == NULL || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID || - s_qspi_env[id].use_mode.type == APP_QSPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - if (s_qspi_env[id].start_flag == false) { - s_qspi_env[id].start_flag = true; - QSPI_SMART_CS_LOW(id); - switch (s_qspi_env[id].use_mode.type) { - case APP_QSPI_TYPE_INTERRUPT: - err_code = hal_qspi_receive_it(&s_qspi_env[id].handle, p_data, length); - break; - - case APP_QSPI_TYPE_DMA: - err_code = hal_qspi_receive_dma(&s_qspi_env[id].handle, p_data, length); - break; - - default: - break; - } - if (err_code != HAL_OK) { - QSPI_SMART_CS_HIGH(id); - s_qspi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -qspi_handle_t *app_qspi_get_handle(app_qspi_id_t id) -{ - if (id >= APP_QSPI_ID_MAX || - s_qspi_env[id].qspi_state == APP_QSPI_INVALID) { - return NULL; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - qspi_wake_up(id); -#endif - - return &s_qspi_env[id].handle; -} - -void hal_qspi_error_callback(qspi_handle_t *p_qspi) -{ - app_qspi_event_call(p_qspi, APP_QSPI_EVT_ERROR); -} - -void hal_qspi_rx_cplt_callback(qspi_handle_t *p_qspi) -{ - app_qspi_event_call(p_qspi, APP_QSPI_EVT_RX_DATA); -} - -void hal_qspi_tx_cplt_callback(qspi_handle_t *p_qspi) -{ - app_qspi_event_call(p_qspi, APP_QSPI_EVT_TX_CPLT); -} - -SECTION_RAM_CODE void QSPI0_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_qspi_irq_handler(&s_qspi_env[APP_QSPI_ID_0].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -SECTION_RAM_CODE void QSPI1_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_qspi_irq_handler(&s_qspi_env[APP_QSPI_ID_1].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rng.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rng.c deleted file mode 100755 index 81bad0a..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rng.c +++ /dev/null @@ -1,418 +0,0 @@ -/** - **************************************************************************************** - * @file app_rng.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include "string.h" -#include "platform_sdk.h" -#include "app_pwr_mgmt.h" -#include "app_systick.h" -#include "app_rng.h" - -#ifdef HAL_RNG_MODULE_ENABLED - -/* - * DEFINES - ***************************************************************************************** - */ - -#ifdef ENV_RTOS_USE_MUTEX - -#define APP_RNG_DRV_SYNC_MUTEX_LOCK app_driver_mutex_pend(s_rng_env.mutex_sync, MUTEX_WAIT_FOREVER) -#define APP_RNG_DRV_SYNC_MUTEX_UNLOCK app_driver_mutex_post(s_rng_env.mutex_sync) - -#define APP_RNG_DRV_ASYNC_MUTEX_LOCK app_driver_mutex_pend(s_rng_env.mutex_async, MUTEX_WAIT_FOREVER) -#define APP_RNG_DRV_ASYNC_MUTEX_UNLOCK app_driver_mutex_post(s_rng_env.mutex_async) - -#endif - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App rng state types. */ -typedef enum { - APP_RNG_INVALID = 0, - APP_RNG_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_RNG_SLEEP, -#endif -} app_rng_state_t; - -struct rng_env_t { - app_rng_evt_handler_t evt_handler; - rng_handle_t handle; - app_rng_type_t ues_type; - app_rng_state_t rng_state; -#ifdef ENV_RTOS_USE_SEMP - APP_DRV_SEM_DECL(sem_rx); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - APP_DRV_MUTEX_DECL(mutex_sync); - APP_DRV_MUTEX_DECL(mutex_async); -#endif -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool rng_prepare_for_sleep(void); -static void rng_sleep_canceled(void); -static void rng_wake_up_ind(void); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -struct rng_env_t s_rng_env = { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif -}; -static bool s_sleep_cb_registered_flag = false; -static int16_t s_rng_pwr_id; - -const static app_sleep_callbacks_t rng_sleep_cb = { - .app_prepare_for_sleep = rng_prepare_for_sleep, - .app_sleep_canceled = rng_sleep_canceled, - .app_wake_up_ind = rng_wake_up_ind -}; - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool rng_prepare_for_sleep(void) -{ - hal_rng_state_t state; - - if (s_rng_env.rng_state == APP_RNG_ENABLE) { - state = hal_rng_get_state(&s_rng_env.handle); - if ((state != HAL_RNG_STATE_READY) && (state != HAL_RNG_STATE_RESET)) { - return false; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_rng_suspend_reg(&s_rng_env.handle); - GLOBAL_EXCEPTION_ENABLE(); -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_rng_env.rng_state = APP_RNG_SLEEP; -#endif - } - - return true; -} - -static void rng_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void rng_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - if (s_rng_env.rng_state == APP_RNG_ENABLE) { - GLOBAL_EXCEPTION_DISABLE(); - hal_rng_resume_reg(&s_rng_env.handle); - GLOBAL_EXCEPTION_ENABLE(); - if (s_rng_env.ues_type == APP_RNG_TYPE_INTERRUPT) { - hal_nvic_clear_pending_irq(RNG_IRQn); - hal_nvic_enable_irq(RNG_IRQn); - } - } -#endif -} - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -static void rng_wake_up(void) -{ - if (s_rng_env.rng_state == APP_RNG_SLEEP) { - GLOBAL_EXCEPTION_DISABLE(); - hal_rng_resume_reg(&s_rng_env.handle); - GLOBAL_EXCEPTION_ENABLE(); - if (s_rng_env.ues_type == APP_RNG_TYPE_INTERRUPT) { - hal_nvic_clear_pending_irq(RNG_IRQn); - hal_nvic_enable_irq(RNG_IRQn); - } - s_rng_env.rng_state = APP_RNG_ENABLE; - } -} -#endif - -static void app_rng_event_call(rng_handle_t *p_rng, app_rng_evt_type_t evt_type, uint32_t random32bit) -{ - app_rng_evt_t rng_evt = {APP_RNG_EVT_ERROR, 0x0}; - - if (p_rng->p_instance == RNG) { - rng_evt.type = evt_type; - rng_evt.random_data = random32bit; - } - -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_rng_env.sem_rx); -#endif - - if (s_rng_env.evt_handler != NULL) { - s_rng_env.evt_handler(&rng_evt); - } -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -uint16_t app_rng_init(app_rng_params_t *p_params, app_rng_evt_handler_t evt_handler) -{ - hal_status_t hal_err_code = HAL_OK; - uint16_t app_err_code = APP_DRV_SUCCESS; - - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - -#ifdef ENV_RTOS_USE_SEMP - if (s_rng_env.sem_rx == NULL) { - app_err_code = app_driver_sem_init(&s_rng_env.sem_rx); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } -#endif - -#ifdef ENV_RTOS_USE_MUTEX - if (s_rng_env.mutex_async == NULL) { - app_err_code = app_driver_mutex_init(&s_rng_env.mutex_async); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } - if (s_rng_env.mutex_sync == NULL) { - app_err_code = app_driver_mutex_init(&s_rng_env.mutex_sync); - APP_DRV_ERR_CODE_CHECK(app_err_code); - } -#endif - - app_systick_init(); - - if (p_params->use_type == APP_RNG_TYPE_INTERRUPT) { - hal_nvic_clear_pending_irq(RNG_IRQn); - hal_nvic_enable_irq(RNG_IRQn); - } - - s_rng_env.ues_type = p_params->use_type; - s_rng_env.evt_handler = evt_handler; - - memcpy_s(&s_rng_env.handle.init, sizeof (s_rng_env.handle.init), &p_params->init, sizeof(rng_init_t)); - s_rng_env.handle.p_instance = RNG; - hal_err_code = hal_rng_deinit(&s_rng_env.handle); - APP_DRV_ERR_CODE_CHECK(hal_err_code); - - hal_err_code = hal_rng_init(&s_rng_env.handle); - APP_DRV_ERR_CODE_CHECK(hal_err_code); - - if (s_sleep_cb_registered_flag == false) { // register sleep callback - s_sleep_cb_registered_flag = true; - s_rng_pwr_id = pwr_register_sleep_cb(&rng_sleep_cb, APP_DRIVER_RNG_WAPEUP_PRIORITY); - if (s_rng_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - } - - s_rng_env.rng_state = APP_RNG_ENABLE; - - return app_err_code; -} - -uint16_t app_rng_deinit(void) -{ - hal_status_t hal_err_code; - - if (s_rng_env.rng_state == APP_RNG_INVALID) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef ENV_RTOS_USE_SEMP - if (s_rng_env.sem_rx != NULL) { - app_driver_sem_deinit(s_rng_env.sem_rx); - s_rng_env.sem_rx = NULL; - } -#endif - -#ifdef ENV_RTOS_USE_MUTEX - if (s_rng_env.mutex_sync != NULL) { - app_driver_mutex_deinit(s_rng_env.mutex_sync); - s_rng_env.mutex_sync = NULL; - } - if (s_rng_env.mutex_async != NULL) { - app_driver_mutex_deinit(s_rng_env.mutex_async); - s_rng_env.mutex_async = NULL; - } -#endif - - hal_nvic_disable_irq(RNG_IRQn); - s_rng_env.rng_state = APP_RNG_INVALID; - - GLOBAL_EXCEPTION_DISABLE(); - pwr_unregister_sleep_cb(s_rng_pwr_id); - s_sleep_cb_registered_flag = false; - GLOBAL_EXCEPTION_ENABLE(); - - app_systick_deinit(); - - hal_err_code = hal_rng_deinit(&s_rng_env.handle); - HAL_ERR_CODE_CHECK(hal_err_code); - - return APP_DRV_SUCCESS; -} - -uint16_t app_rng_gen_sync(uint16_t *p_seed, uint32_t *p_random32bit) -{ - hal_status_t err_code; - - if (s_rng_env.rng_state == APP_RNG_INVALID || - p_seed == NULL || - p_random32bit == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - rng_wake_up(); -#endif - - err_code = hal_rng_generate_random_number(&s_rng_env.handle, p_seed, p_random32bit); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_rng_gen_sem_sync(uint16_t *p_seed) -{ - hal_status_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_RNG_DRV_ASYNC_MUTEX_LOCK; -#endif - - if (s_rng_env.rng_state == APP_RNG_INVALID || - s_rng_env.ues_type == APP_RNG_TYPE_POLLING || - p_seed == NULL) { -#ifdef ENV_RTOS_USE_MUTEX - APP_RNG_DRV_ASYNC_MUTEX_UNLOCK; -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - rng_wake_up(); -#endif - - err_code = hal_rng_generate_random_number_it(&s_rng_env.handle, p_seed); - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_RNG_DRV_ASYNC_MUTEX_UNLOCK; -#endif - return (uint16_t)err_code; - } - - app_driver_sem_pend(s_rng_env.sem_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_RNG_DRV_ASYNC_MUTEX_UNLOCK; -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_rng_gen_async(uint16_t *p_seed) -{ - hal_status_t err_code; - - if (s_rng_env.rng_state == APP_RNG_INVALID || - s_rng_env.ues_type == APP_RNG_TYPE_POLLING || - p_seed == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - rng_wake_up(); -#endif - - err_code = hal_rng_generate_random_number_it(&s_rng_env.handle, p_seed); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -rng_handle_t *app_rng_get_handle(void) -{ - if (s_rng_env.rng_state == APP_RNG_INVALID) { - return NULL; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - rng_wake_up(); -#endif - - return &s_rng_env.handle; -} - -void hal_rng_ready_data_callback(rng_handle_t *p_rng, uint32_t random32bit) -{ - app_rng_event_call(p_rng, APP_RNG_EVT_DONE, random32bit); -} - -SECTION_RAM_CODE void RNG_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_rng_irq_handler(&s_rng_env.handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rtos_cfg.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rtos_cfg.c deleted file mode 100755 index de0809b..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_rtos_cfg.c +++ /dev/null @@ -1,214 +0,0 @@ -/** - **************************************************************************************** - * @file app_rtos_adapter.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include -#include "app_drv_error.h" -#include "app_rtos_cfg.h" - -#ifdef ENV_USE_FREERTOS - -#include "FreeRTOS.h" -#include "semphr.h" - -uint16_t app_driver_sem_init(sem_t *sem) -{ - SemaphoreHandle_t *xSemaphore = (SemaphoreHandle_t *)sem; - - if (sem == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - *xSemaphore = xSemaphoreCreateBinary(); - if (*xSemaphore == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - return APP_DRV_SUCCESS; -} - -void app_driver_sem_deinit(sem_t sem) -{ - vSemaphoreDelete(sem); -} - -uint16_t app_driver_sem_pend(sem_t sem, uint32_t time_out) -{ - BaseType_t ret = pdTRUE; - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - SemaphoreHandle_t xSemaphore = (SemaphoreHandle_t)sem; - TickType_t xTicks = portMAX_DELAY; - - if (sem == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - - if (time_out != portMAX_DELAY) { - xTicks = pdMS_TO_TICKS(time_out); - } - - if (__get_IPSR()) { - ret = xSemaphoreTakeFromISR(xSemaphore, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken != pdFALSE) { - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } else { - ret = xSemaphoreTake(xSemaphore, xTicks); - } - if (ret != pdTRUE) { - return APP_DRV_ERR_TIMEOUT; - } - return APP_DRV_SUCCESS; -} - -uint16_t app_driver_sem_post(sem_t sem) -{ - BaseType_t ret = pdTRUE; - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - SemaphoreHandle_t xSemaphore = (SemaphoreHandle_t)sem; - - if (sem == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - if (__get_IPSR()) { - ret = xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken != pdFALSE) { - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } else { - ret = xSemaphoreGive(xSemaphore); - } - if (ret != pdTRUE) { - return APP_DRV_ERR_INVALID_PARAM; - } - return APP_DRV_SUCCESS; -} - -uint16_t app_driver_sem_post_from_isr(sem_t sem) -{ - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - BaseType_t ret = pdTRUE; - SemaphoreHandle_t xSemaphore = (SemaphoreHandle_t)sem; - - if (sem == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - - ret = xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken != pdFALSE) { - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - if (ret != pdTRUE) { - return APP_DRV_ERR_INVALID_PARAM; - } - return APP_DRV_SUCCESS; -} - -uint16_t app_driver_mutex_init(mutex_t *mutex) -{ - SemaphoreHandle_t *xMutex = (SemaphoreHandle_t *)(mutex); - - if (mutex == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - *xMutex = xSemaphoreCreateMutex(); - if (*xMutex == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - return APP_DRV_SUCCESS; -} - -void app_driver_mutex_deinit(mutex_t mutex) -{ - vSemaphoreDelete(mutex); -} - -uint16_t app_driver_mutex_pend(mutex_t mutex, uint32_t time_out) -{ - SemaphoreHandle_t xMutex = (SemaphoreHandle_t)mutex; - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - BaseType_t ret = pdTRUE; - TickType_t xTicks = portMAX_DELAY; - - if (mutex == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - - if (time_out != portMAX_DELAY) { - xTicks = pdMS_TO_TICKS(time_out); - } - - if (__get_IPSR()) { - ret = xSemaphoreTakeFromISR(xMutex, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken != pdFALSE) { - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } else { - ret = xSemaphoreTake(xMutex, xTicks); - } - - if (ret != pdTRUE) { - return APP_DRV_ERR_TIMEOUT; - } - return APP_DRV_SUCCESS; -} - -uint16_t app_driver_mutex_post(mutex_t mutex) -{ - BaseType_t ret = pdTRUE; - SemaphoreHandle_t xMutex = (SemaphoreHandle_t)mutex; - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - if (mutex == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - if (__get_IPSR()) { - ret = xSemaphoreGiveFromISR(xMutex, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken != pdFALSE) { - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } else { - ret = xSemaphoreGive(xMutex); - } - - if (ret != pdTRUE) { - return APP_DRV_ERR_INVALID_PARAM; - } - return APP_DRV_SUCCESS; -} - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_spi.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_spi.c deleted file mode 100755 index 5a5fdda..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_spi.c +++ /dev/null @@ -1,1432 +0,0 @@ -/** - **************************************************************************************** - * @file app_spi.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "app_dma.h" -#include "app_pwr_mgmt.h" -#include "app_systick.h" -#include "platform_sdk.h" -#include "app_spi.h" - -#if defined(HAL_SPI_V2_MODULE_ENABLED) -#error "Please undef HAL_SPI_V2_MODULE_ENABLED in gr55xx_hal_conf.h" -#endif - -#ifdef HAL_SPI_MODULE_ENABLED - -/* - * DEFINES - ***************************************************************************************** - */ -#define MS_1000 1000 - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App spi state types. */ -typedef enum { - APP_SPI_INVALID = 0, - APP_SPI_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_SPI_SLEEP, -#endif -} app_spi_state_t; - -struct spi_env_t { - app_spi_evt_handler_t evt_handler; - spi_handle_t handle; - app_spi_mode_t use_mode; - app_spi_pin_cfg_t pin_cfg; - int16_t dma_id[2]; - app_spi_state_t spi_state; - bool start_flag; - volatile uint8_t rx_done; - volatile uint8_t tx_done; - volatile uint8_t user_mode; -#ifdef ENV_RTOS_USE_SEMP - APP_DRV_SEM_DECL(sem_tx); - APP_DRV_SEM_DECL(sem_rx); - APP_DRV_SEM_DECL(sem_tx_rx); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - APP_DRV_MUTEX_DECL(mutex_sync); - APP_DRV_MUTEX_DECL(mutex_async); -#endif -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool spi_prepare_for_sleep(void); -static void spi_sleep_canceled(void); -static void spi_wake_up_ind(void); -static uint16_t spi_gpio_config(app_spi_id_t id, app_spi_pin_cfg_t pin_cfg); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static const IRQn_Type s_spi_irq[APP_SPI_ID_MAX] = {SPI_S_IRQn, SPI_M_IRQn}; -static const uint32_t s_spi_instance[APP_SPI_ID_MAX] = {SPIS_BASE, SPIM_BASE}; - -struct spi_env_t s_spi_env[APP_SPI_ID_MAX] = { - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, - .sem_tx_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - }, - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, - .sem_tx_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - } -}; -static bool s_sleep_cb_registered_flag = false; -static int16_t s_spi_pwr_id; - -static const app_sleep_callbacks_t spi_sleep_cb = { - .app_prepare_for_sleep = spi_prepare_for_sleep, - .app_sleep_canceled = spi_sleep_canceled, - .app_wake_up_ind = spi_wake_up_ind -}; - -static inline void SPI_SMART_CS_LOW(uint8_t id); -static inline void SPI_SMART_CS_HIGH(uint8_t id); - -static inline void SPI_SMART_CS_LOW(uint8_t id) -{ - if ((APP_SPI_ID_SLAVE != id) && - (s_spi_env[id].pin_cfg.cs.enable == APP_SPI_PIN_ENABLE)) { - app_io_write_pin(s_spi_env[id].pin_cfg.cs.type, - s_spi_env[id].pin_cfg.cs.pin, - APP_IO_PIN_RESET); - } -} - -static inline void SPI_SMART_CS_HIGH(uint8_t id) -{ - if ((APP_SPI_ID_SLAVE != id) && - (s_spi_env[id].pin_cfg.cs.enable == APP_SPI_PIN_ENABLE)) { - app_io_write_pin(s_spi_env[id].pin_cfg.cs.type, - s_spi_env[id].pin_cfg.cs.pin, - APP_IO_PIN_SET); - } -} - -#ifdef ENV_RTOS_USE_MUTEX -static inline void APP_SPI_DRV_SYNC_MUTEX_LOCK(uint8_t id); -static inline void APP_SPI_DRV_SYNC_MUTEX_UNLOCK(uint8_t id); -static inline void APP_SPI_DRV_ASYNC_MUTEX_LOCK(uint8_t id); -static inline void APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(uint8_t id); - -static inline void APP_SPI_DRV_SYNC_MUTEX_LOCK(uint8_t id) -{ - app_driver_mutex_pend(s_spi_env[id].mutex_sync, MUTEX_WAIT_FOREVER); -} - -static inline void APP_SPI_DRV_SYNC_MUTEX_UNLOCK(uint8_t id) -{ - app_driver_mutex_post(s_spi_env[id].mutex_sync); -} - -static inline void APP_SPI_DRV_ASYNC_MUTEX_LOCK(uint8_t id) -{ - app_driver_mutex_pend(s_spi_env[id].mutex_async, MUTEX_WAIT_FOREVER); -} - -static inline void APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(uint8_t id) -{ - app_driver_mutex_post(s_spi_env[id].mutex_async); -} -#endif - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static bool spi_prepare_for_sleep(void) -{ - hal_spi_state_t state; - uint8_t i; - - for (i = 0; i < APP_SPI_ID_MAX; i++) { - if (s_spi_env[i].spi_state == APP_SPI_ENABLE) { - state = hal_spi_get_state(&s_spi_env[i].handle); - if ((state != HAL_SPI_STATE_READY) && (state != HAL_SPI_STATE_RESET)) { - return false; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_spi_suspend_reg(&s_spi_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_spi_env[i].spi_state = APP_SPI_SLEEP; -#endif - } - } - - return true; -} - -static void spi_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void spi_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - uint8_t i; - - for (i = 0; i < APP_SPI_ID_MAX; i++) { - if (s_spi_env[i].spi_state == APP_SPI_ENABLE) { - GLOBAL_EXCEPTION_DISABLE(); - hal_spi_resume_reg(&s_spi_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); - if (s_spi_env[i].use_mode.type == APP_SPI_TYPE_INTERRUPT || - s_spi_env[i].use_mode.type == APP_SPI_TYPE_DMA) { - hal_nvic_clear_pending_irq(s_spi_irq[i]); - hal_nvic_enable_irq(s_spi_irq[i]); - } - } - } -#endif -} - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -static void spi_wake_up(app_spi_id_t id) -{ - if (s_spi_env[id].spi_state == APP_SPI_SLEEP) { - GLOBAL_EXCEPTION_DISABLE(); - hal_spi_resume_reg(&s_spi_env[id].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_spi_env[id].use_mode.type == APP_SPI_TYPE_INTERRUPT || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_DMA) { - hal_nvic_clear_pending_irq(s_spi_irq[id]); - hal_nvic_enable_irq(s_spi_irq[id]); - } - s_spi_env[id].spi_state = APP_SPI_ENABLE; - } - - if (s_spi_env[id].use_mode.type == APP_SPI_TYPE_DMA) { - dma_wake_up(s_spi_env[id].dma_id[0]); - dma_wake_up(s_spi_env[id].dma_id[1]); - } -} -#endif - -static uint16_t spi_gpio_config(app_spi_id_t id, app_spi_pin_cfg_t pin_cfg) -{ - app_io_init_t io_init = APP_IO_DEFAULT_CONFIG; - uint16_t err_code = APP_DRV_SUCCESS; - - if (pin_cfg.cs.enable == APP_SPI_PIN_ENABLE) { - if (id == APP_SPI_ID_SLAVE) { - io_init.pull = pin_cfg.cs.pull; - io_init.mode = APP_IO_MODE_MUX; - io_init.pin = pin_cfg.cs.pin; - io_init.mux = pin_cfg.cs.mux; - err_code = app_io_init(pin_cfg.cs.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } else { - io_init.pull = pin_cfg.cs.pull; - io_init.mode = APP_IO_MODE_OUT_PUT; - io_init.pin = pin_cfg.cs.pin; - io_init.mux = APP_IO_MUX_7; - err_code = app_io_init(pin_cfg.cs.type, &io_init); - app_io_write_pin(pin_cfg.cs.type, pin_cfg.cs.pin, APP_IO_PIN_SET); - APP_DRV_ERR_CODE_CHECK(err_code); - } - } - if (pin_cfg.clk.enable == APP_SPI_PIN_ENABLE) { - io_init.pull = pin_cfg.clk.pull; - io_init.mode = APP_IO_MODE_MUX; - io_init.pin = pin_cfg.clk.pin; - io_init.mux = pin_cfg.clk.mux; - err_code = app_io_init(pin_cfg.clk.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (pin_cfg.mosi.enable == APP_SPI_PIN_ENABLE) { - io_init.pull = pin_cfg.mosi.pull; - io_init.pin = pin_cfg.mosi.pin; - io_init.mux = pin_cfg.mosi.mux; - err_code = app_io_init(pin_cfg.mosi.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (pin_cfg.miso.enable == APP_SPI_PIN_ENABLE) { - io_init.pull = pin_cfg.miso.pull; - io_init.pin = pin_cfg.miso.pin; - io_init.mux = pin_cfg.miso.mux; - err_code = app_io_init(pin_cfg.miso.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return err_code; -} - -static uint16_t spi_tx_dma_config(app_spi_params_t *p_params) -{ - app_dma_params_t tx_dma_params; - - tx_dma_params.channel_number = p_params->use_mode.tx_dma_channel; - tx_dma_params.init.src_request = DMA_REQUEST_MEM; - tx_dma_params.init.dst_request = (p_params->id == APP_SPI_ID_SLAVE) ? \ - DMA_REQUEST_SPIS_TX : DMA_REQUEST_SPIM_TX; - tx_dma_params.init.direction = DMA_MEMORY_TO_PERIPH; - tx_dma_params.init.src_increment = DMA_SRC_INCREMENT; - tx_dma_params.init.dst_increment = DMA_DST_NO_CHANGE; - if (p_params->init.data_size <= SPI_DATASIZE_8BIT) { - tx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - tx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - } else if (p_params->init.data_size <= SPI_DATASIZE_16BIT) { - tx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_HALFWORD; - tx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_HALFWORD; - } else { - tx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_WORD; - tx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_WORD; - } - tx_dma_params.init.mode = DMA_NORMAL; - tx_dma_params.init.priority = DMA_PRIORITY_LOW; - - s_spi_env[p_params->id].dma_id[0] = app_dma_init(&tx_dma_params, NULL); - - if (s_spi_env[p_params->id].dma_id[0] < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - s_spi_env[p_params->id].handle.p_dmatx = app_dma_get_handle(s_spi_env[p_params->id].dma_id[0]); - s_spi_env[p_params->id].handle.p_dmatx->p_parent = (void*)&s_spi_env[p_params->id].handle; - - return APP_DRV_SUCCESS; -} - -static uint16_t spi_rx_dma_config(app_spi_params_t *p_params) -{ - app_dma_params_t rx_dma_params; - - rx_dma_params.channel_number = p_params->use_mode.rx_dma_channel; - rx_dma_params.init.src_request = (p_params->id == APP_SPI_ID_SLAVE) ? \ - DMA_REQUEST_SPIS_RX : DMA_REQUEST_SPIM_TX; - rx_dma_params.init.dst_request = DMA_REQUEST_MEM; - rx_dma_params.init.direction = DMA_PERIPH_TO_MEMORY; - rx_dma_params.init.src_increment = DMA_SRC_NO_CHANGE; - rx_dma_params.init.dst_increment = DMA_DST_INCREMENT; - if (p_params->init.data_size <= SPI_DATASIZE_8BIT) { - rx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - rx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - } else if (p_params->init.data_size <= SPI_DATASIZE_16BIT) { - rx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_HALFWORD; - rx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_HALFWORD; - } else { - rx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_WORD; - rx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_WORD; - } - rx_dma_params.init.mode = DMA_NORMAL; - rx_dma_params.init.priority = DMA_PRIORITY_LOW; - - s_spi_env[p_params->id].dma_id[1] = app_dma_init(&rx_dma_params, NULL); - - if (s_spi_env[p_params->id].dma_id[1] < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - s_spi_env[p_params->id].handle.p_dmarx = app_dma_get_handle(s_spi_env[p_params->id].dma_id[1]); - s_spi_env[p_params->id].handle.p_dmarx->p_parent = (void*)&s_spi_env[p_params->id].handle; - - return APP_DRV_SUCCESS; -} - -static uint16_t app_spi_config_dma(app_spi_params_t *p_params) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - err_code = spi_tx_dma_config(p_params); - APP_DRV_ERR_CODE_CHECK(err_code); - - err_code = spi_rx_dma_config(p_params); - APP_DRV_ERR_CODE_CHECK(err_code); - - return APP_DRV_SUCCESS; -} - -static void app_spi_event_call(spi_handle_t *p_spi, app_spi_evt_type_t evt_type) -{ - app_spi_evt_t spi_evt; - app_spi_id_t id = APP_SPI_ID_MAX; - - if (p_spi->p_instance == SPIS) { - id = APP_SPI_ID_SLAVE; - } else if (p_spi->p_instance == SPIM) { - id = APP_SPI_ID_MASTER; - } - - spi_evt.type = evt_type; - if (evt_type == APP_SPI_EVT_ERROR) { - spi_evt.data.error_code = p_spi->error_code; -#ifdef ENV_RTOS_USE_SEMP - if (!s_spi_env[id].user_mode) { - app_driver_sem_post_from_isr(s_spi_env[id].sem_tx); - app_driver_sem_post_from_isr(s_spi_env[id].sem_rx); - } -#endif - s_spi_env[id].rx_done = 1; - s_spi_env[id].tx_done = 1; - } else if (evt_type == APP_SPI_EVT_TX_CPLT) { - spi_evt.data.size = p_spi->tx_xfer_size - p_spi->tx_xfer_count; -#ifdef ENV_RTOS_USE_SEMP - if (!s_spi_env[id].user_mode) { - app_driver_sem_post_from_isr(s_spi_env[id].sem_tx); - } -#endif - s_spi_env[id].tx_done = 1; - } else if (evt_type == APP_SPI_EVT_RX_DATA) { - spi_evt.data.size = p_spi->rx_xfer_size - p_spi->rx_xfer_count; -#ifdef ENV_RTOS_USE_SEMP - if (!s_spi_env[id].user_mode) { - app_driver_sem_post_from_isr(s_spi_env[id].sem_rx); - } -#endif - s_spi_env[id].rx_done = 1; - } else if (evt_type == APP_SPI_EVT_TX_RX) { - spi_evt.data.size = p_spi->rx_xfer_size - p_spi->rx_xfer_count; - } - - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - - if (s_spi_env[id].evt_handler != NULL) { - s_spi_env[id].evt_handler(&spi_evt); - } -} - -static uint16_t params_check(app_spi_params_t *p_params) -{ - uint8_t id = p_params->id; - - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - if (id >= APP_SPI_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t semp_init_config(uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (s_spi_env[id].sem_rx == NULL) { - err_code = app_driver_sem_init(&s_spi_env[id].sem_rx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_spi_env[id].sem_tx == NULL) { - err_code = app_driver_sem_init(&s_spi_env[id].sem_tx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_spi_env[id].sem_tx_rx == NULL) { - err_code = app_driver_sem_init(&s_spi_env[id].sem_tx_rx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_init_config(uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (s_spi_env[id].mutex_async == NULL) { - err_code = app_driver_mutex_init(&s_spi_env[id].mutex_async); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_spi_env[id].mutex_sync == NULL) { - err_code = app_driver_mutex_init(&s_spi_env[id].mutex_sync); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -static void sync_params_to_env(app_spi_params_t *p_params, app_spi_evt_handler_t evt_handler, uint8_t id) -{ - s_spi_env[id].use_mode.type = p_params->use_mode.type; - s_spi_env[id].use_mode.rx_dma_channel = p_params->use_mode.rx_dma_channel; - s_spi_env[id].use_mode.tx_dma_channel = p_params->use_mode.tx_dma_channel; - memcpy_s(&s_spi_env[id].pin_cfg, sizeof (s_spi_env[id].pin_cfg), &p_params->pin_cfg, sizeof(app_spi_pin_cfg_t)); - s_spi_env[id].evt_handler = evt_handler; - - memcpy_s(&s_spi_env[id].handle.init, sizeof (s_spi_env[id].handle.init), &p_params->init, sizeof(spi_init_t)); - s_spi_env[id].handle.p_instance = (ssi_regs_t *)s_spi_instance[id]; -} - -static uint16_t register_cb(void) -{ - if (s_sleep_cb_registered_flag == false) { // register sleep callback - s_sleep_cb_registered_flag = true; - s_spi_pwr_id = pwr_register_sleep_cb(&spi_sleep_cb, APP_DRIVER_SPI_WAPEUP_PRIORITY); - if (s_spi_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - } - - return APP_DRV_SUCCESS; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -uint16_t app_spi_init(app_spi_params_t *p_params, app_spi_evt_handler_t evt_handler) -{ - uint8_t id = p_params->id; - uint16_t err_code = APP_DRV_SUCCESS; - - err_code = params_check(p_params); - APP_DRV_ERR_CODE_CHECK(err_code); - -#ifdef ENV_RTOS_USE_SEMP - err_code = semp_init_config(id); - APP_DRV_ERR_CODE_CHECK(err_code); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - err_code = mutex_init_config(id); - APP_DRV_ERR_CODE_CHECK(err_code); -#endif - - app_systick_init(); - - err_code = spi_gpio_config(p_params->id, p_params->pin_cfg); - APP_DRV_ERR_CODE_CHECK(err_code); - - if (p_params->use_mode.type == APP_SPI_TYPE_DMA) { - GLOBAL_EXCEPTION_DISABLE(); - err_code = app_spi_config_dma(p_params); - GLOBAL_EXCEPTION_ENABLE(); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - if (p_params->use_mode.type != APP_SPI_TYPE_POLLING) { - hal_nvic_clear_pending_irq(s_spi_irq[id]); - hal_nvic_enable_irq(s_spi_irq[id]); - } - - sync_params_to_env(p_params, evt_handler, id); - - hal_spi_deinit(&s_spi_env[id].handle); - hal_spi_init(&s_spi_env[id].handle); - - err_code = register_cb(); - APP_DRV_ERR_CODE_CHECK(err_code); - - s_spi_env[id].spi_state = APP_SPI_ENABLE; - s_spi_env[id].start_flag = false; - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static void semp_deinit_config(uint8_t id) -{ - if (s_spi_env[id].sem_tx != NULL) { - app_driver_sem_deinit(s_spi_env[id].sem_tx); - s_spi_env[id].sem_tx = NULL; - } - if (s_spi_env[id].sem_rx != NULL) { - app_driver_sem_deinit(s_spi_env[id].sem_rx); - s_spi_env[id].sem_rx = NULL; - } - if (s_spi_env[id].sem_tx_rx != NULL) { - app_driver_sem_deinit(s_spi_env[id].sem_tx_rx); - s_spi_env[id].sem_tx_rx = NULL; - } -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_deinit_config(uint8_t id) -{ - if (s_spi_env[id].mutex_sync != NULL) { - app_driver_mutex_deinit(s_spi_env[id].mutex_sync); - s_spi_env[id].mutex_sync = NULL; - } - if (s_spi_env[id].mutex_async != NULL) { - app_driver_mutex_deinit(s_spi_env[id].mutex_async); - s_spi_env[id].mutex_async = NULL; - } -} -#endif - -static void unregister_cb(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - if (s_spi_env[APP_SPI_ID_SLAVE].spi_state == APP_SPI_INVALID && - s_spi_env[APP_SPI_ID_MASTER].spi_state == APP_SPI_INVALID) { - pwr_unregister_sleep_cb(s_spi_pwr_id); - s_sleep_cb_registered_flag = false; - } - GLOBAL_EXCEPTION_ENABLE(); -} - -uint16_t app_spi_deinit(app_spi_id_t id) -{ - if ((id >= APP_SPI_ID_MAX) || (s_spi_env[id].spi_state == APP_SPI_INVALID)) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef ENV_RTOS_USE_SEMP - semp_deinit_config(id); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - mutex_deinit_config(id); -#endif - - if (s_spi_env[id].pin_cfg.cs.enable == APP_SPI_PIN_ENABLE) { - app_io_deinit(s_spi_env[id].pin_cfg.cs.type, s_spi_env[id].pin_cfg.cs.pin); - } - if (s_spi_env[id].pin_cfg.clk.enable == APP_SPI_PIN_ENABLE) { - app_io_deinit(s_spi_env[id].pin_cfg.clk.type, s_spi_env[id].pin_cfg.clk.pin); - } - if (s_spi_env[id].pin_cfg.mosi.enable == APP_SPI_PIN_ENABLE) { - app_io_deinit(s_spi_env[id].pin_cfg.mosi.type, s_spi_env[id].pin_cfg.mosi.pin); - } - if (s_spi_env[id].pin_cfg.miso.enable == APP_SPI_PIN_ENABLE) { - app_io_deinit(s_spi_env[id].pin_cfg.miso.type, s_spi_env[id].pin_cfg.miso.pin); - } - - hal_nvic_disable_irq(s_spi_irq[id]); - if (s_spi_env[id].use_mode.type == APP_SPI_TYPE_DMA) { - app_dma_deinit(s_spi_env[id].dma_id[0]); - app_dma_deinit(s_spi_env[id].dma_id[1]); - } - s_spi_env[id].spi_state = APP_SPI_INVALID; - s_spi_env[id].start_flag = false; - - unregister_cb(); - - app_systick_deinit(); - - hal_spi_deinit(&s_spi_env[id].handle); - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_receive_async(app_spi_id_t id, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_receive_it(&s_spi_env[id].handle, p_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_receive_dma(&s_spi_env[id].handle, p_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_receive_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - SPI_SMART_CS_LOW(id); - err_code = hal_spi_receive(&s_spi_env[id].handle, p_data, size, timeout); - SPI_SMART_CS_HIGH(id); - - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_spi_receive_sem_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_receive_it(&s_spi_env[id].handle, p_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_receive_dma(&s_spi_env[id].handle, p_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_spi_env[id].start_flag = false; - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_spi_env[id].sem_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_spi_receive_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - s_spi_env[id].user_mode = 0x1; - - BLE_INT_DISABLE(); - s_spi_env[id].rx_done = 0; - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - hal_err_code = hal_spi_receive_it(&s_spi_env[id].handle, p_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - hal_err_code = hal_spi_receive_dma(&s_spi_env[id].handle, p_data, size); - break; - - default: - break; - } - if (hal_err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_spi_env[id].rx_done == 0); - -exit: - s_spi_env[id].user_mode = 0x0; - BLE_INT_RESTORE(); - - return app_err_code; -} - -uint16_t app_spi_transmit_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size) -{ - uint16_t app_err_code = APP_DRV_SUCCESS; - hal_status_t hal_err_code = HAL_OK; - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - s_spi_env[id].user_mode = 0x1; - - BLE_INT_DISABLE(); - s_spi_env[id].tx_done = 0; - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - hal_err_code = hal_spi_transmit_it(&s_spi_env[id].handle, p_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - hal_err_code = hal_spi_transmit_dma(&s_spi_env[id].handle, p_data, size); - break; - - default: - break; - } - if (hal_err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - app_err_code = (uint16_t)hal_err_code; - - goto exit; - } - } else { - app_err_code = APP_DRV_ERR_BUSY; - goto exit; - } - - while (s_spi_env[id].tx_done == 0); - -exit: - s_spi_env[id].user_mode = 0x0; - BLE_INT_RESTORE(); - - return app_err_code; -} - -uint16_t app_spi_transmit_async(app_spi_id_t id, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_it(&s_spi_env[id].handle, p_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_dma(&s_spi_env[id].handle, p_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_transmit_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit(&s_spi_env[id].handle, p_data, size, timeout); - SPI_SMART_CS_HIGH(id); - - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_spi_transmit_sem_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_SPI_ID_MAX || - p_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_it(&s_spi_env[id].handle, p_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_dma(&s_spi_env[id].handle, p_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - return (uint16_t)err_code; - } - } else { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_BUSY; - } - - app_driver_sem_pend(s_spi_env[id].sem_tx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_spi_transmit_receive_sync(app_spi_id_t id, uint8_t *p_tx_data, \ - uint8_t *p_rx_data, uint32_t size, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_tx_data == NULL || - p_rx_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_receive(&s_spi_env[id].handle, p_tx_data, p_rx_data, size, timeout); - SPI_SMART_CS_HIGH(id); - - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_transmit_receive_async(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t size) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_tx_data == NULL || - p_rx_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_receive_it(&s_spi_env[id].handle, p_tx_data, p_rx_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_receive_dma(&s_spi_env[id].handle, p_tx_data, p_rx_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - return (uint16_t)err_code; - } - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_spi_transmit_receive_sem_sync(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t size) -{ - hal_status_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_SPI_ID_MAX || - p_tx_data == NULL || - p_rx_data == NULL || - size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_receive_it(&s_spi_env[id].handle, p_tx_data, p_rx_data, size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit_receive_dma(&s_spi_env[id].handle, p_tx_data, p_rx_data, size); - break; - - default: - break; - } - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - return (uint16_t)err_code; - } - } - - app_driver_sem_pend(s_spi_env[id].sem_tx_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_SPI_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_spi_read_eeprom_async(app_spi_id_t id, uint8_t *p_tx_data, \ - uint8_t *p_rx_data, uint32_t tx_size, uint32_t rx_size) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_tx_data == NULL || - p_rx_data == NULL || - tx_size == 0 || - rx_size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_read_eeprom_it(&s_spi_env[id].handle, p_tx_data, p_rx_data, tx_size, rx_size); - break; - - case APP_SPI_TYPE_DMA: - SPI_SMART_CS_LOW(id); - err_code = hal_spi_read_eeprom_dma(&s_spi_env[id].handle, p_tx_data, p_rx_data, tx_size, rx_size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_read_eeprom_sync(app_spi_id_t id, uint8_t *p_tx_data, \ - uint8_t *p_rx_data, uint32_t tx_size, uint32_t rx_size, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_tx_data == NULL || - p_rx_data == NULL || - tx_size == 0 || - rx_size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - SPI_SMART_CS_LOW(id); - err_code = hal_spi_read_eeprom(&s_spi_env[id].handle, p_tx_data, p_rx_data, tx_size, rx_size, timeout); - SPI_SMART_CS_HIGH(id); - - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_read_memory_async(app_spi_id_t id, uint8_t *p_cmd_data, \ - uint8_t *p_rx_data, uint32_t cmd_size, uint32_t rx_size) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_cmd_data == NULL || - p_rx_data == NULL || - cmd_size == 0 || - rx_size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit(&s_spi_env[id].handle, p_cmd_data, cmd_size, MS_1000); - if (err_code != HAL_OK) { - SPI_SMART_CS_HIGH(id); - s_spi_env[id].start_flag = false; - return (uint16_t)err_code; - } - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - err_code = hal_spi_receive_it(&s_spi_env[id].handle, p_rx_data, rx_size); - break; - - case APP_SPI_TYPE_DMA: - err_code = hal_spi_receive_dma(&s_spi_env[id].handle, p_rx_data, rx_size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_spi_write_memory_async(app_spi_id_t id, uint8_t *p_cmd_data, \ - uint8_t *p_tx_data, uint32_t cmd_size, uint32_t tx_size) -{ - hal_status_t err_code; - - if (id >= APP_SPI_ID_MAX || - p_cmd_data == NULL || - p_tx_data == NULL || - cmd_size == 0 || - tx_size == 0 || - s_spi_env[id].spi_state == APP_SPI_INVALID || - s_spi_env[id].use_mode.type == APP_SPI_TYPE_POLLING) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - if (s_spi_env[id].start_flag == false) { - s_spi_env[id].start_flag = true; - - SPI_SMART_CS_LOW(id); - err_code = hal_spi_transmit(&s_spi_env[id].handle, p_cmd_data, cmd_size, MS_1000); - if (err_code != HAL_OK) { - SPI_SMART_CS_HIGH(id); - s_spi_env[id].start_flag = false; - return (uint16_t)err_code; - } - - switch (s_spi_env[id].use_mode.type) { - case APP_SPI_TYPE_INTERRUPT: - err_code = hal_spi_transmit_it(&s_spi_env[id].handle, p_tx_data, tx_size); - break; - - case APP_SPI_TYPE_DMA: - err_code = hal_spi_transmit_dma(&s_spi_env[id].handle, p_tx_data, tx_size); - break; - - default: - break; - } - if (err_code != HAL_OK) { - s_spi_env[id].start_flag = false; - SPI_SMART_CS_HIGH(id); - return (uint16_t)err_code; - } - } else { - return APP_DRV_ERR_BUSY; - } - - return APP_DRV_SUCCESS; -} - -spi_handle_t *app_spi_get_handle(app_spi_id_t id) -{ - if (id >= APP_SPI_ID_MAX || - s_spi_env[id].spi_state == APP_SPI_INVALID) { - return NULL; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - spi_wake_up(id); -#endif - - return &s_spi_env[id].handle; -} - -void hal_spi_tx_cplt_callback(spi_handle_t *p_spi) -{ - app_spi_event_call(p_spi, APP_SPI_EVT_TX_CPLT); -} - -void hal_spi_rx_cplt_callback(spi_handle_t *p_spi) -{ - app_spi_event_call(p_spi, APP_SPI_EVT_RX_DATA); -} - -void hal_spi_tx_rx_cplt_callback(spi_handle_t *p_spi) -{ - app_spi_event_call(p_spi, APP_SPI_EVT_TX_RX); -} - -void hal_spi_error_callback(spi_handle_t *p_spi) -{ - app_spi_event_call(p_spi, APP_SPI_EVT_ERROR); -} - -SECTION_RAM_CODE void SPI_S_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_spi_irq_handler(&s_spi_env[APP_SPI_ID_SLAVE].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -SECTION_RAM_CODE void SPI_M_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_spi_irq_handler(&s_spi_env[APP_SPI_ID_MASTER].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -#endif - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_systick.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_systick.c deleted file mode 100755 index 7b8bf33..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_systick.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - **************************************************************************************** - * @file app_systick.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "gr55xx_hal.h" -#include "app_pwr_mgmt.h" -#include "app_systick.h" - -/* - * DEFINES - ***************************************************************************************** - */ -#define SYSTICK_USE_PATTERN 0x47 - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool systick_prepare_for_sleep(void); -static void systick_sleep_canceled(void); -static void systick_wake_up_ind(void); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static uint8_t s_systick_use_flag = 0; -static bool s_sleep_cb_registered_flag = false; - -static const app_sleep_callbacks_t systick_sleep_cb = { - .app_prepare_for_sleep = systick_prepare_for_sleep, - .app_sleep_canceled = systick_sleep_canceled, - .app_wake_up_ind = systick_wake_up_ind -}; - -static bool systick_prepare_for_sleep(void) -{ - return true; -} - -static void systick_sleep_canceled(void) -{ -} - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -SECTION_RAM_CODE static void systick_wake_up_ind(void) -{ - if (s_systick_use_flag != SYSTICK_USE_PATTERN) { - return; - } - - hal_init(); -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -void app_systick_init(void) -{ - s_systick_use_flag = SYSTICK_USE_PATTERN; - - if (s_sleep_cb_registered_flag == false) { // register sleep callback - if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk)) { - hal_init(); - } - s_sleep_cb_registered_flag = true; - pwr_register_sleep_cb(&systick_sleep_cb, APP_DRIVER_SYSTICK_WAPEUP_PRIORITY); - } -} - -void app_systick_deinit(void) -{ -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_uart.c b/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_uart.c deleted file mode 100755 index 5f8dc0f..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/app_drivers/src/app_uart.c +++ /dev/null @@ -1,1033 +0,0 @@ -/** - **************************************************************************************** - * @file app_uart.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "platform_sdk.h" -#include "app_dma.h" -#include "app_pwr_mgmt.h" -#include "app_systick.h" -#include "app_uart.h" - - -/* - * DEFINES - ***************************************************************************************** - */ -#define TX_ONCE_MAX_SIZE 128 - -#define MS_5000 5000 - -/* - * STRUCT DEFINE - ***************************************************************************************** - */ - -/**@brief App uart state types. */ -typedef enum { - APP_UART_INVALID = 0, - APP_UART_ENABLE, -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - APP_UART_SLEEP, -#endif -} app_uart_state_t; - -struct uart_env_t { - app_uart_evt_handler_t evt_handler; - uart_handle_t handle; - app_uart_mode_t use_mode; - app_uart_pin_cfg_t pin_cfg; - int16_t dma_id[2]; - app_uart_state_t uart_state; - ring_buffer_t tx_ring_buffer; - uint8_t tx_send_buf[TX_ONCE_MAX_SIZE]; - bool start_tx_flag; - bool start_flush_flag; -#ifdef ENV_RTOS_USE_SEMP - APP_DRV_SEM_DECL(sem_tx); - APP_DRV_SEM_DECL(sem_rx); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - APP_DRV_MUTEX_DECL(mutex_sync); - APP_DRV_MUTEX_DECL(mutex_async); -#endif -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static bool uart_prepare_for_sleep(void); -static void uart_sleep_canceled(void); -static void uart_wake_up_ind(void); -static uint16_t uart_gpio_config(uint32_t hw_flow_ctrl, app_uart_pin_cfg_t pin_cfg); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static const IRQn_Type s_uart_irq[APP_UART_ID_MAX] = {UART0_IRQn, UART1_IRQn}; -static const uint32_t s_uart_instance[APP_UART_ID_MAX] = {UART0_BASE, UART1_BASE}; - -struct uart_env_t s_uart_env[APP_UART_ID_MAX] = { - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - }, - { - .evt_handler = NULL, -#ifdef ENV_RTOS_USE_SEMP - .sem_tx = NULL, - .sem_rx = NULL, -#endif -#ifdef ENV_RTOS_USE_MUTEX - .mutex_sync = NULL, - .mutex_async = NULL, -#endif - } -}; -static bool s_sleep_cb_registered_flag = false; -static int16_t s_uart_pwr_id; - -static const app_sleep_callbacks_t uart_sleep_cb = { - .app_prepare_for_sleep = uart_prepare_for_sleep, - .app_sleep_canceled = uart_sleep_canceled, - .app_wake_up_ind = uart_wake_up_ind, -}; - - -#ifdef ENV_RTOS_USE_MUTEX -static inline void APP_UART_DRV_SYNC_MUTEX_LOCK(uint8_t id); -static inline void APP_UART_DRV_SYNC_MUTEX_UNLOCK(uint8_t id); -static inline void APP_UART_DRV_ASYNC_MUTEX_LOCK(uint8_t id); -static inline void APP_UART_DRV_ASYNC_MUTEX_UNLOCK(uint8_t id); - -static inline void APP_UART_DRV_SYNC_MUTEX_LOCK(uint8_t id) -{ - app_driver_mutex_pend(s_uart_env[id].mutex_sync, MUTEX_WAIT_FOREVER); -} - -static inline void APP_UART_DRV_SYNC_MUTEX_UNLOCK(uint8_t id) -{ - app_driver_mutex_post(s_uart_env[id].mutex_sync); -} - -static inline void APP_UART_DRV_ASYNC_MUTEX_LOCK(uint8_t id) -{ - app_driver_mutex_pend(s_uart_env[id].mutex_async, MUTEX_WAIT_FOREVER); -} - -static inline void APP_UART_DRV_ASYNC_MUTEX_UNLOCK(uint8_t id) -{ - app_driver_mutex_post(s_uart_env[id].mutex_async); -} -#endif -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ - -static bool uart_prepare_for_sleep(void) -{ - hal_uart_state_t state; - - for (uint8_t i = 0; i < APP_UART_ID_MAX; i++) { - if (s_uart_env[i].uart_state == APP_UART_ENABLE) { - state = hal_uart_get_state(&s_uart_env[i].handle); - if ((state != HAL_UART_STATE_RESET) && (state != HAL_UART_STATE_READY)) { - return false; - } - - GLOBAL_EXCEPTION_DISABLE(); - hal_uart_suspend_reg(&s_uart_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - s_uart_env[i].uart_state = APP_UART_SLEEP; -#endif - } - } - return true; -} - - -static void uart_sleep_canceled(void) -{ -} - -SECTION_RAM_CODE static void uart_wake_up_ind(void) -{ -#ifndef APP_DRIVER_WAKEUP_CALL_FUN - uint8_t i; - - for (i = 0; i < APP_UART_ID_MAX; i++) { - if (s_uart_env[i].uart_state == APP_UART_ENABLE) { - GLOBAL_EXCEPTION_DISABLE(); - hal_uart_resume_reg(&s_uart_env[i].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_uart_env[i].use_mode.type == APP_UART_TYPE_INTERRUPT || - s_uart_env[i].use_mode.type == APP_UART_TYPE_DMA) { - hal_nvic_clear_pending_irq(s_uart_irq[i]); - hal_nvic_enable_irq(s_uart_irq[i]); - } - } - } -#endif -} - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN -static void uart_wake_up(app_uart_id_t id) -{ - if (s_uart_env[id].uart_state == APP_UART_SLEEP) { - GLOBAL_EXCEPTION_DISABLE(); - hal_uart_resume_reg(&s_uart_env[id].handle); - GLOBAL_EXCEPTION_ENABLE(); - - if (s_uart_env[id].use_mode.type == APP_UART_TYPE_INTERRUPT || - s_uart_env[id].use_mode.type == APP_UART_TYPE_DMA) { - hal_nvic_clear_pending_irq(s_uart_irq[id]); - hal_nvic_enable_irq(s_uart_irq[id]); - } - s_uart_env[id].uart_state = APP_UART_ENABLE; - } - - if (s_uart_env[id].use_mode.type == APP_UART_TYPE_DMA) { - dma_wake_up(s_uart_env[id].dma_id[0]); - dma_wake_up(s_uart_env[id].dma_id[1]); - } -} -#endif - -static uint16_t uart_gpio_config(uint32_t hw_flow_ctrl, app_uart_pin_cfg_t pin_cfg) -{ - app_io_init_t io_init = APP_IO_DEFAULT_CONFIG; - uint16_t err_code = APP_DRV_SUCCESS; - - io_init.pull = pin_cfg.tx.pull; - io_init.mode = APP_IO_MODE_MUX; - io_init.pin = pin_cfg.tx.pin; - io_init.mux = pin_cfg.tx.mux; - err_code = app_io_init(pin_cfg.tx.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - io_init.pull = pin_cfg.rx.pull; - io_init.pin = pin_cfg.rx.pin; - io_init.mux = pin_cfg.rx.mux; - err_code = app_io_init(pin_cfg.rx.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - if (UART_HWCONTROL_RTS_CTS == hw_flow_ctrl) { - io_init.pull = pin_cfg.cts.pull; - io_init.pin = pin_cfg.cts.pin; - io_init.mux = pin_cfg.cts.mux; - err_code = app_io_init(pin_cfg.cts.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - - io_init.pull = pin_cfg.rts.pull; - io_init.pin = pin_cfg.rts.pin; - io_init.mux = pin_cfg.rts.mux; - err_code = app_io_init(pin_cfg.rts.type, &io_init); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return err_code; -} - -static uint16_t app_uart_config_dma(app_uart_params_t *p_params) -{ - app_dma_params_t tx_dma_params; - app_dma_params_t rx_dma_params; - - tx_dma_params.channel_number = p_params->use_mode.tx_dma_channel; - tx_dma_params.init.src_request = DMA_REQUEST_MEM; - tx_dma_params.init.dst_request = DMA_REQUEST_UART0_TX; - tx_dma_params.init.direction = DMA_MEMORY_TO_PERIPH; - tx_dma_params.init.src_increment = DMA_SRC_INCREMENT; - tx_dma_params.init.dst_increment = DMA_DST_NO_CHANGE; - tx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - tx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - tx_dma_params.init.mode = DMA_NORMAL; - tx_dma_params.init.priority = DMA_PRIORITY_LOW; - s_uart_env[p_params->id].dma_id[0] = app_dma_init(&tx_dma_params, NULL); - - if (s_uart_env[p_params->id].dma_id[0] < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - - /* Associate the initialized DMA handle to the UART handle */ - s_uart_env[p_params->id].handle.p_dmatx = app_dma_get_handle(s_uart_env[p_params->id].dma_id[0]); - s_uart_env[p_params->id].handle.p_dmatx->p_parent = (void*)&s_uart_env[p_params->id].handle; - - rx_dma_params.channel_number = p_params->use_mode.rx_dma_channel; - rx_dma_params.init.src_request = DMA_REQUEST_UART0_RX; - rx_dma_params.init.dst_request = DMA_REQUEST_MEM; - rx_dma_params.init.direction = DMA_PERIPH_TO_MEMORY; - rx_dma_params.init.src_increment = DMA_SRC_NO_CHANGE; - rx_dma_params.init.dst_increment = DMA_DST_INCREMENT; - rx_dma_params.init.src_data_alignment = DMA_SDATAALIGN_BYTE; - rx_dma_params.init.dst_data_alignment = DMA_DDATAALIGN_BYTE; - rx_dma_params.init.mode = DMA_NORMAL; - rx_dma_params.init.priority = DMA_PRIORITY_HIGH; - s_uart_env[p_params->id].dma_id[1] = app_dma_init(&rx_dma_params, NULL); - - if (s_uart_env[p_params->id].dma_id[1] < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - - /* Associate the initialized DMA handle to the the UART handle */ - s_uart_env[p_params->id].handle.p_dmarx = app_dma_get_handle(s_uart_env[p_params->id].dma_id[1]); - s_uart_env[p_params->id].handle.p_dmarx->p_parent = (void*)&s_uart_env[p_params->id].handle; - - return APP_DRV_SUCCESS; -} - -static uint16_t app_uart_start_transmit_async(app_uart_id_t id) -{ - uint16_t items_count = ring_buffer_items_count_get(&s_uart_env[id].tx_ring_buffer); - uint16_t send_size = items_count; - hal_status_t err_code; - - if ((items_count == 0) || (s_uart_env[id].start_flush_flag == true)) { - s_uart_env[id].start_tx_flag = false; - return APP_DRV_SUCCESS; - } - - if (items_count >= TX_ONCE_MAX_SIZE) { - ring_buffer_read(&s_uart_env[id].tx_ring_buffer, s_uart_env[id].tx_send_buf, TX_ONCE_MAX_SIZE); - send_size = TX_ONCE_MAX_SIZE; - } else { - ring_buffer_read(&s_uart_env[id].tx_ring_buffer, s_uart_env[id].tx_send_buf, items_count); - } - - switch (s_uart_env[id].use_mode.type) { - case APP_UART_TYPE_INTERRUPT: - err_code = hal_uart_transmit_it(&s_uart_env[id].handle, s_uart_env[id].tx_send_buf, send_size); - HAL_ERR_CODE_CHECK(err_code); - break; - - case APP_UART_TYPE_DMA: - err_code = hal_uart_transmit_dma(&s_uart_env[id].handle, s_uart_env[id].tx_send_buf, send_size); - HAL_ERR_CODE_CHECK(err_code); - break; - - default: - break; - } - - return APP_DRV_SUCCESS; -} - -static void evt_handler_process(app_uart_id_t id, uart_handle_t *p_uart, app_uart_evt_type_t evt_type) -{ - app_uart_evt_t uart_evt; - uart_evt.type = evt_type; - - if (evt_type == APP_UART_EVT_ERROR) { - uart_evt.data.error_code = p_uart->error_code; -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_uart_env[id].sem_tx); - app_driver_sem_post_from_isr(s_uart_env[id].sem_rx); -#endif - s_uart_env[id].start_tx_flag = false; - if (s_uart_env[id].evt_handler != NULL) { - s_uart_env[id].evt_handler(&uart_evt); - } - } else if (evt_type == APP_UART_EVT_TX_CPLT) { - uart_evt.data.size = p_uart->tx_xfer_size - p_uart->tx_xfer_count; - app_uart_start_transmit_async(id); -#ifdef ENV_RTOS_USE_SEMP - if (s_uart_env[id].start_tx_flag == false) { - app_driver_sem_post_from_isr(s_uart_env[id].sem_tx); - } -#endif - if (s_uart_env[id].start_tx_flag == false && s_uart_env[id].evt_handler != NULL) { - s_uart_env[id].evt_handler(&uart_evt); - } - } else if (evt_type == APP_UART_EVT_RX_DATA) { -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_uart_env[id].sem_rx); -#endif - uart_evt.data.size = p_uart->rx_xfer_size - p_uart->rx_xfer_count; - if (s_uart_env[id].evt_handler != NULL) { - s_uart_env[id].evt_handler(&uart_evt); - } - } else if (evt_type == APP_UART_EVT_ABORT_TX) { -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_uart_env[id].sem_tx); -#endif - s_uart_env[id].start_tx_flag = false; - if (s_uart_env[id].evt_handler != NULL) { - s_uart_env[id].evt_handler(&uart_evt); - } - } else if (evt_type == APP_UART_EVT_ABORT_RX) { -#ifdef ENV_RTOS_USE_SEMP - app_driver_sem_post_from_isr(s_uart_env[id].sem_rx); -#endif - if (s_uart_env[id].evt_handler != NULL) { - s_uart_env[id].evt_handler(&uart_evt); - } - } -} - -static void app_uart_event_call(uart_handle_t *p_uart, app_uart_evt_type_t evt_type) -{ - app_uart_id_t id = APP_UART_ID_MAX; - - if (p_uart->p_instance == UART0) { - id = APP_UART_ID_0; - } else if (p_uart->p_instance == UART1) { - id = APP_UART_ID_1; - } - - evt_handler_process(id, p_uart, evt_type); -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -static uint16_t params_check(app_uart_params_t *p_params, app_uart_tx_buf_t *tx_buffer) -{ - uint8_t id = p_params->id; - - if (p_params == NULL) { - return APP_DRV_ERR_POINTER_NULL; - } - - if (id >= APP_UART_ID_MAX) { - return APP_DRV_ERR_INVALID_ID; - } - - if (p_params->use_mode.type != APP_UART_TYPE_POLLING && tx_buffer == NULL) { - return APP_DRV_ERR_INVALID_PARAM; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t semp_init_config(uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (s_uart_env[id].sem_tx == NULL) { - err_code = app_driver_sem_init(&s_uart_env[id].sem_tx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_uart_env[id].sem_rx == NULL) { - err_code = app_driver_sem_init(&s_uart_env[id].sem_rx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_init_config(uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (s_uart_env[id].mutex_async == NULL) { - err_code = app_driver_mutex_init(&s_uart_env[id].mutex_async); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_uart_env[id].mutex_sync == NULL) { - err_code = app_driver_mutex_init(&s_uart_env[id].mutex_sync); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -static void sync_params_to_env(app_uart_params_t *p_params, app_uart_evt_handler_t evt_handler, uint8_t id) -{ - s_uart_env[id].use_mode.type = p_params->use_mode.type; - s_uart_env[id].use_mode.rx_dma_channel = p_params->use_mode.rx_dma_channel; - s_uart_env[id].use_mode.tx_dma_channel = p_params->use_mode.tx_dma_channel; - memcpy_s(&s_uart_env[id].pin_cfg, sizeof(s_uart_env[id].pin_cfg), &p_params->pin_cfg, sizeof(app_uart_pin_cfg_t)); - s_uart_env[id].evt_handler = evt_handler; - - memcpy_s(&s_uart_env[id].handle.init, sizeof(s_uart_env[id].handle.init), &p_params->init, sizeof(uart_init_t)); - s_uart_env[id].handle.p_instance = (uart_regs_t *)s_uart_instance[id]; -} - -static uint16_t register_cb(void) -{ - if (s_sleep_cb_registered_flag == false) { // register sleep callback - s_sleep_cb_registered_flag = true; - s_uart_pwr_id = pwr_register_sleep_cb(&uart_sleep_cb, APP_DRIVER_UART_WAPEUP_PRIORITY); - if (s_uart_pwr_id < 0) { - return APP_DRV_ERR_INVALID_PARAM; - } - } - return APP_DRV_SUCCESS; -} - -static uint16_t uart_dma_config(app_uart_params_t *p_params, uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (id != APP_UART_ID_0) { - return APP_DRV_ERR_INVALID_ID; - } else { - GLOBAL_EXCEPTION_DISABLE(); - err_code = app_uart_config_dma(p_params); - GLOBAL_EXCEPTION_ENABLE(); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_uart_init(app_uart_params_t *p_params, app_uart_evt_handler_t evt_handler, app_uart_tx_buf_t *tx_buffer) -{ - uint8_t id = p_params->id; - uint16_t err_code = APP_DRV_SUCCESS; - - err_code = params_check(p_params, tx_buffer); - APP_DRV_ERR_CODE_CHECK(err_code); - -#ifdef ENV_RTOS_USE_SEMP - err_code = semp_init_config(id); - APP_DRV_ERR_CODE_CHECK(err_code); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - err_code = mutex_init_config(id); - APP_DRV_ERR_CODE_CHECK(err_code); -#endif - - app_systick_init(); - - err_code = uart_gpio_config(p_params->init.hw_flow_ctrl, p_params->pin_cfg); - APP_DRV_ERR_CODE_CHECK(err_code); - - if (APP_UART_TYPE_DMA == p_params->use_mode.type) { - err_code = uart_dma_config(p_params, id); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - if (p_params->use_mode.type != APP_UART_TYPE_POLLING) { - ring_buffer_init(&s_uart_env[id].tx_ring_buffer, tx_buffer->tx_buf, tx_buffer->tx_buf_size); - hal_nvic_clear_pending_irq(s_uart_irq[id]); - hal_nvic_enable_irq(s_uart_irq[id]); - } - - sync_params_to_env(p_params, evt_handler, id); - - hal_uart_deinit(&s_uart_env[id].handle); - hal_uart_init(&s_uart_env[id].handle); - - err_code = register_cb(); - APP_DRV_ERR_CODE_CHECK(err_code); - - s_uart_env[id].uart_state = APP_UART_ENABLE; - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -static uint16_t semp_deinit_config(uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (s_uart_env[id].sem_tx == NULL) { - err_code = app_driver_sem_deinit(&s_uart_env[id].sem_tx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_uart_env[id].sem_rx == NULL) { - err_code = app_driver_sem_deinit(&s_uart_env[id].sem_rx); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -#ifdef ENV_RTOS_USE_MUTEX -static uint16_t mutex_deinit_config(uint8_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if (s_uart_env[id].mutex_async == NULL) { - err_code = app_driver_mutex_deinit(&s_uart_env[id].mutex_async); - APP_DRV_ERR_CODE_CHECK(err_code); - } - if (s_uart_env[id].mutex_sync == NULL) { - err_code = app_driver_mutex_deinit(&s_uart_env[id].mutex_sync); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - return APP_DRV_SUCCESS; -} -#endif - -static void unregister_cb(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - if (s_uart_env[APP_UART_ID_0].uart_state == APP_UART_INVALID && - s_uart_env[APP_UART_ID_1].uart_state == APP_UART_INVALID) { - pwr_unregister_sleep_cb(s_uart_pwr_id); - s_sleep_cb_registered_flag = false; - } - GLOBAL_EXCEPTION_ENABLE(); -} - -uint16_t app_uart_deinit(app_uart_id_t id) -{ - uint16_t err_code = APP_DRV_SUCCESS; - - if ((id >= APP_UART_ID_MAX) || (s_uart_env[id].uart_state == APP_UART_INVALID)) { - return APP_DRV_ERR_INVALID_ID; - } - -#ifdef ENV_RTOS_USE_SEMP - err_code = semp_deinit_config(id); - APP_DRV_ERR_CODE_CHECK(err_code); -#endif - -#ifdef ENV_RTOS_USE_MUTEX - err_code = mutex_deinit_config(id); - APP_DRV_ERR_CODE_CHECK(err_code); -#endif - - err_code = app_io_deinit(s_uart_env[id].pin_cfg.tx.type, s_uart_env[id].pin_cfg.tx.pin); - APP_DRV_ERR_CODE_CHECK(err_code); - - err_code = app_io_deinit(s_uart_env[id].pin_cfg.rx.type, s_uart_env[id].pin_cfg.rx.pin); - APP_DRV_ERR_CODE_CHECK(err_code); - - if (UART_HWCONTROL_RTS_CTS == s_uart_env[id].handle.init.hw_flow_ctrl) { - err_code = app_io_deinit(s_uart_env[id].pin_cfg.rts.type, s_uart_env[id].pin_cfg.rts.pin); - APP_DRV_ERR_CODE_CHECK(err_code); - - err_code = app_io_deinit(s_uart_env[id].pin_cfg.cts.type, s_uart_env[id].pin_cfg.cts.pin); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - hal_nvic_disable_irq(s_uart_irq[id]); - - if (s_uart_env[id].use_mode.type == APP_UART_TYPE_DMA) { - err_code = app_dma_deinit(s_uart_env[id].dma_id[0]); - APP_DRV_ERR_CODE_CHECK(err_code); - - err_code = app_dma_deinit(s_uart_env[id].dma_id[1]); - APP_DRV_ERR_CODE_CHECK(err_code); - } - - s_uart_env[id].uart_state = APP_UART_INVALID; - s_uart_env[id].start_tx_flag = false; - s_uart_env[id].start_flush_flag = false; - - unregister_cb(); - - app_systick_deinit(); - - hal_uart_deinit(&s_uart_env[id].handle); - - return APP_DRV_SUCCESS; -} - -uint16_t app_uart_receive_async(app_uart_id_t id, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - - if (id >= APP_UART_ID_MAX || - p_data == NULL || - size == 0 || - s_uart_env[id].uart_state == APP_UART_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - switch (s_uart_env[id].use_mode.type) { - case APP_UART_TYPE_INTERRUPT: - err_code = hal_uart_receive_it(&s_uart_env[id].handle, p_data, size); - break; - - case APP_UART_TYPE_DMA: - err_code = hal_uart_receive_dma(&s_uart_env[id].handle, p_data, size); - break; - - case APP_UART_TYPE_POLLING: - break; - - default: - break; - } - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -uint16_t app_uart_receive_sync(app_uart_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_UART_ID_MAX || - p_data == NULL || - size == 0 || - s_uart_env[id].uart_state == APP_UART_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - err_code = hal_uart_receive(&s_uart_env[id].handle, p_data, size, timeout); - if (err_code != HAL_OK) { - return (uint16_t)err_code; - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_uart_receive_sem_sync(app_uart_id_t id, uint8_t *p_data, uint16_t size) -{ - hal_status_t err_code = HAL_OK; - -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_UART_ID_MAX || - p_data == NULL || - size == 0 || - s_uart_env[id].uart_state == APP_UART_INVALID) { -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - switch (s_uart_env[id].use_mode.type) { - case APP_UART_TYPE_INTERRUPT: - err_code = hal_uart_receive_it(&s_uart_env[id].handle, p_data, size); - break; - - case APP_UART_TYPE_DMA: - err_code = hal_uart_receive_dma(&s_uart_env[id].handle, p_data, size); - break; - - case APP_UART_TYPE_POLLING: - break; - - default: - break; - } - if (err_code != HAL_OK) { -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return (uint16_t)err_code; - } - - app_driver_sem_pend(s_uart_env[id].sem_rx, OS_WAIT_FOREVER); - -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_uart_transmit_async(app_uart_id_t id, uint8_t *p_data, uint16_t size) -{ - uint16_t err_code; - - if (id >= APP_UART_ID_MAX || - p_data == NULL || - size == 0 || - s_uart_env[id].uart_state == APP_UART_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - ring_buffer_write(&s_uart_env[id].tx_ring_buffer, p_data, size); - - if ((s_uart_env[id].start_tx_flag == false) && (s_uart_env[id].start_flush_flag == false) && - (s_uart_env[id].uart_state == APP_UART_ENABLE) && - ll_uart_is_enabled_fifo(s_uart_env[id].handle.p_instance)) { - s_uart_env[id].start_tx_flag = true; - - err_code = app_uart_start_transmit_async(id); - if (err_code != APP_DRV_SUCCESS) { - s_uart_env[id].start_tx_flag = false; - return err_code; - } - } - - return APP_DRV_SUCCESS; -} - -#ifdef ENV_RTOS_USE_SEMP -uint16_t app_uart_transmit_sem_sync(app_uart_id_t id, uint8_t *p_data, uint16_t size) -{ - uint16_t err_code; - -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_LOCK(id); -#endif - - if (id >= APP_UART_ID_MAX || - p_data == NULL || - size == 0 || - s_uart_env[id].uart_state == APP_UART_INVALID) { -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - ring_buffer_write(&s_uart_env[id].tx_ring_buffer, p_data, size); - - if ((s_uart_env[id].start_tx_flag == false) && (s_uart_env[id].start_flush_flag == false) && - (s_uart_env[id].uart_state == APP_UART_ENABLE) && - ll_uart_is_enabled_fifo(s_uart_env[id].handle.p_instance)) { - s_uart_env[id].start_tx_flag = true; - - err_code = app_uart_start_transmit_async(id); - if (err_code != APP_DRV_SUCCESS) { -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - s_uart_env[id].start_tx_flag = false; - return err_code; - } - - app_driver_sem_pend(s_uart_env[id].sem_tx, OS_WAIT_FOREVER); - } - -#ifdef ENV_RTOS_USE_MUTEX - APP_UART_DRV_ASYNC_MUTEX_UNLOCK(id); -#endif - - return APP_DRV_SUCCESS; -} -#endif - -uint16_t app_uart_transmit_sync(app_uart_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) -{ - hal_status_t err_code; - - if (id >= APP_UART_ID_MAX || - p_data == NULL || - size == 0 || - s_uart_env[id].uart_state == APP_UART_INVALID) { - return APP_DRV_ERR_INVALID_PARAM; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - err_code = hal_uart_transmit(&s_uart_env[id].handle, p_data, size, timeout); - if (err_code != HAL_OK) { - return err_code; - } - - return APP_DRV_SUCCESS; -} - -uart_handle_t *app_uart_get_handle(app_uart_id_t id) -{ - if (id >= APP_UART_ID_MAX || s_uart_env[id].uart_state == APP_UART_INVALID) { - return NULL; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - return &s_uart_env[id].handle; -} - -static void flush_process(app_uart_id_t id) -{ - uint16_t items_count; - - if (APP_UART_TYPE_POLLING == s_uart_env[id].use_mode.type) { - return ; - } - - uint16_t tx_xfer_size = 0; - uint16_t tx_xfer_count = 0; - uint32_t tx_wait_count = 0; - uint32_t data_width = 1 + s_uart_env[id].handle.init.data_bits + \ - 5 + s_uart_env[id].handle.init.stop_bits + 1 + \ - (s_uart_env[id].handle.init.parity & 1); - - while (!ll_uart_is_active_flag_tfe(s_uart_env[id].handle.p_instance)); - - if (APP_UART_TYPE_INTERRUPT == s_uart_env[id].use_mode.type) { - tx_xfer_size = s_uart_env[id].handle.tx_xfer_size; - tx_xfer_count = s_uart_env[id].handle.tx_xfer_count; - hal_uart_abort_transmit_it(&s_uart_env[id].handle); - hal_uart_transmit(&s_uart_env[id].handle, - s_uart_env[id].tx_send_buf + tx_xfer_size - tx_xfer_count, - tx_xfer_count, - MS_5000); - } else { - do { - tx_wait_count++; - } while (HAL_UART_STATE_READY != hal_uart_get_state(&s_uart_env[id].handle) && - (tx_wait_count <= data_width * TX_ONCE_MAX_SIZE * \ - (SystemCoreClock/s_uart_env[id].handle.init.baud_rate))); - } - - do { - items_count = ring_buffer_items_count_get(&s_uart_env[id].tx_ring_buffer); - while (items_count) { - uint8_t send_char; - - ring_buffer_read(&s_uart_env[id].tx_ring_buffer, &send_char, 1); - - while (!ll_uart_is_active_flag_tfnf(s_uart_env[id].handle.p_instance)); - - ll_uart_transmit_data8(s_uart_env[id].handle.p_instance, send_char); - - items_count--; - } - } while (ring_buffer_items_count_get(&s_uart_env[id].tx_ring_buffer)); -} - -void app_uart_flush(app_uart_id_t id) -{ - uart_handle_t *p_uart = &s_uart_env[id].handle; - - if (APP_UART_ID_MAX <= id || s_uart_env[id].uart_state == APP_UART_INVALID) { - return; - } - -#ifdef APP_DRIVER_WAKEUP_CALL_FUN - uart_wake_up(id); -#endif - - app_systick_init(); - - if (s_uart_env[id].uart_state == APP_UART_ENABLE) { - s_uart_env[id].start_flush_flag = true; - - flush_process(id); - - while (!ll_uart_is_active_flag_tfe(s_uart_env[id].handle.p_instance)); - - if (APP_UART_TYPE_POLLING != s_uart_env[id].use_mode.type) { - /* Enable the UART Transmit Data Register Empty Interrupt */ - HAL_UART_ENABLE_IT(p_uart, UART_IT_THRE); - } - - s_uart_env[id].start_flush_flag = false; - } -} - -void hal_uart_tx_cplt_callback(uart_handle_t *p_uart) -{ - app_uart_event_call(p_uart, APP_UART_EVT_TX_CPLT); -} - -void hal_uart_rx_cplt_callback(uart_handle_t *p_uart) -{ - app_uart_event_call(p_uart, APP_UART_EVT_RX_DATA); -} - -void hal_uart_error_callback(uart_handle_t *p_uart) -{ - app_uart_event_call(p_uart, APP_UART_EVT_ERROR); -} - -void hal_uart_abort_tx_cplt_callback(uart_handle_t *p_uart) -{ - app_uart_event_call(p_uart, APP_UART_EVT_ABORT_TX); -} - -void hal_uart_abort_rx_cplt_callback(uart_handle_t *p_uart) -{ - app_uart_event_call(p_uart, APP_UART_EVT_ABORT_RX); -} - -SECTION_RAM_CODE void UART0_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_uart_irq_handler(&s_uart_env[APP_UART_ID_0].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - -SECTION_RAM_CODE void UART1_IRQHandler(void) -{ -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_push(); -#endif - hal_uart_irq_handler(&s_uart_env[APP_UART_ID_1].handle); -#if FLASH_PROTECT_PRIORITY - platform_interrupt_protection_pop(); -#endif -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/boards/boards.h b/gr551x/sdk_liteos/gr551x_sdk/components/boards/boards.h deleted file mode 100755 index e2e4d87..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/boards/boards.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2021 GOODIX. - * 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. - */ - -#ifndef __BOARD_CONFIG_H__ -#define __BOARD_CONFIG_H__ - -#include "custom_config.h" - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.c b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.c deleted file mode 100755 index 5544ae8..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.c +++ /dev/null @@ -1,620 +0,0 @@ -/** - **************************************************************************************** - * @file gr551x_spi_flash.c - * @author BLE Driver Team - * @brief HAL APP module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "gr55xx_hal.h" -#include "gr551x_spi_flash.h" - -/* - * DEFINES - ***************************************************************************************** - */ -#define BIT_0 0 -#define BIT_8 8 -#define BIT_16 16 -#define BIT_24 24 - -#define SPI_SPEED_1M (1000000) -#define SPI_SPEED_2M (2000000) -#define SPI_SPEED_4M (4000000) -#define SPI_SPEED_8M (8000000) -#define SPI_SPEED_16M (16000000) -#define SPI_SPEED_32M (32000000) - -#define DEFAULT_QSPI_SPEED (SPI_SPEED_8M) -#define DEFAULT_QSPI_IO_CONFIG { { APP_IO_TYPE_NORMAL, APP_IO_MUX_2, APP_IO_PIN_15}, \ - { APP_IO_TYPE_NORMAL, APP_IO_MUX_2, APP_IO_PIN_9 }, \ - { APP_IO_TYPE_NORMAL, APP_IO_MUX_2, APP_IO_PIN_8 }, \ - { APP_IO_TYPE_NORMAL, APP_IO_MUX_2, APP_IO_PIN_14}, \ - { APP_IO_TYPE_NORMAL, APP_IO_MUX_2, APP_IO_PIN_13}, \ - { APP_IO_TYPE_NORMAL, APP_IO_MUX_2, APP_IO_PIN_12} } -#define DEFAULT_QSPI_MODE_CONFIG { APP_QSPI_TYPE_DMA, DMA_Channel7 } -#define DEFAULT_QSPI_CONFIG { (SystemCoreClock / DEFAULT_QSPI_SPEED), QSPI_CLOCK_MODE_3, 0} -#define DEFAULT_QSPI_PARAM_CONFIG { APP_QSPI_ID_1, DEFAULT_QSPI_IO_CONFIG, \ - DEFAULT_QSPI_MODE_CONFIG, DEFAULT_QSPI_CONFIG} - -#define DEFAULT_SPIM_SPEED (SPI_SPEED_8M) -#define DEFAULT_SPIM_IO_CONFIG { {APP_IO_TYPE_NORMAL, APP_IO_MUX_7, APP_IO_PIN_15}, \ - {APP_IO_TYPE_NORMAL, APP_IO_MUX_1, APP_IO_PIN_12}, \ - {APP_IO_TYPE_NORMAL, APP_IO_MUX_1, APP_IO_PIN_13}, \ - {APP_IO_TYPE_NORMAL, APP_IO_MUX_1, APP_IO_PIN_14} } -#define DEFAULT_SPIM_MODE_CONFIG {APP_SPI_TYPE_DMA, DMA_Channel5, DMA_Channel6} -#define DEFAULT_SPIM_CONFIG {SPI_DATASIZE_8BIT, SPI_POLARITY_LOW, \ - SPI_PHASE_1EDGE, (SystemCoreClock / DEFAULT_SPIM_SPEED), \ - SPI_TIMODE_DISABLE, SPI_SLAVE_SELECT_0} -#define DEFAULT_SPIM_PARAM_CONFIG {APP_SPI_ID_MASTER, DEFAULT_SPIM_IO_CONFIG, \ - DEFAULT_SPIM_MODE_CONFIG, DEFAULT_SPIM_CONFIG} - -#define MS_5000 5000 -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static volatile qspi_control_t g_qspi_ctl; -static dma_handle_t g_dma_handle; -static spi_handle_t g_spim_handle; -static qspi_handle_t g_qspi_handle; -static flash_init_t g_flash_init; - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -static void spi_app_qspi_callback(app_qspi_evt_t *p_evt) -{ - if (p_evt->type == APP_QSPI_EVT_TX_CPLT) { - g_qspi_ctl.qspi_tmt_done = 1; - } - if (p_evt->type == APP_QSPI_EVT_RX_DATA) { - g_qspi_ctl.qspi_rcv_done = 1; - } - if (p_evt->type == APP_QSPI_EVT_ERROR) { - g_qspi_ctl.qspi_tmt_done = 1; - g_qspi_ctl.qspi_rcv_done = 1; - } -} - -void spi_app_spim_callback(app_spi_evt_t *p_evt) -{ - if (p_evt->type == APP_SPI_EVT_TX_CPLT) { - g_qspi_ctl.spi_tmt_done = 1; - } - if (p_evt->type == APP_SPI_EVT_RX_DATA) { - g_qspi_ctl.spi_rcv_done = 1; - } - if (p_evt->type == APP_SPI_EVT_ERROR) { - g_qspi_ctl.spi_tmt_done = 1; - g_qspi_ctl.spi_rcv_done = 1; - } -} - -static void spi_flash_write_enable(void) -{ - uint8_t control_frame[1] = {SPI_FLASH_CMD_WREN}; - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - g_qspi_ctl.spi_tmt_done = 0; - app_spi_transmit_async(g_qspi_ctl.spi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.spi_tmt_done == 0); - } else { - g_qspi_ctl.qspi_tmt_done = 0; - app_qspi_transmit_async(g_qspi_ctl.qspi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.qspi_tmt_done == 0); - } - - return; -} - -static uint8_t spi_flash_read_status(void) -{ - uint8_t status = 0; - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - uint8_t control_frame[1] = {SPI_FLASH_CMD_RDSR}; - - g_qspi_ctl.spi_rcv_done = 0; - app_spi_read_memory_async(g_qspi_ctl.spi_id, control_frame, (uint8_t*)&status, sizeof(control_frame), 1); - while (g_qspi_ctl.spi_rcv_done == 0); - } else { - qspi_command_t command = { - .instruction = SPI_FLASH_CMD_RDSR, - .address = 0, - .instruction_size = QSPI_INSTSIZE_08_BITS, - .address_size = QSPI_ADDRSIZE_00_BITS, - .data_size = QSPI_DATASIZE_08_BITS, - .dummy_cycles = 0, - .instruction_address_mode = QSPI_INST_ADDR_ALL_IN_SPI, - .data_mode = QSPI_DATA_MODE_SPI, - .length = 1, - }; - - g_qspi_ctl.qspi_rcv_done = 0; - app_qspi_command_receive_async(g_qspi_ctl.qspi_id, &command, (uint8_t*)&status); - while (g_qspi_ctl.qspi_rcv_done == 0); - } - - return status; -} - -static uint32_t spi_flash_device_size(void) -{ - uint32_t flash_size = 0; - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - uint8_t data[ITEM_5] = {0}; - uint8_t control_frame[ITEM_5] = {SPI_FLASH_CMD_SFUD, 0, 0, 0x34, DUMMY_BYTE}; - - g_qspi_ctl.spi_rcv_done = 0; - app_spi_read_memory_async(g_qspi_ctl.spi_id, control_frame, data, sizeof(control_frame), sizeof(data)); - while (g_qspi_ctl.spi_rcv_done == 0); - - if (data[ITEM_0] != 0 && data[ITEM_3] < 0xFF) { - flash_size = ((data[ITEM_3] << BIT_24) + (data[ITEM_2] << BIT_16) + - (data[ITEM_1] << BIT_8) + (data[ITEM_0] << BIT_0) + 1) / BIT_8; - } - } else { - uint8_t data[ITEM_4] = {0}; - qspi_command_t command = { - .instruction = SPI_FLASH_CMD_SFUD, // SPI_FLASH_CMD_SFUD //SPI_FLASH_CMD_RDSR - .address = 0x000034, - .instruction_size = QSPI_INSTSIZE_08_BITS, - .address_size = QSPI_ADDRSIZE_24_BITS, - .data_size = QSPI_DATASIZE_08_BITS, - .dummy_cycles = 8, - .instruction_address_mode = QSPI_INST_ADDR_ALL_IN_SPI, - .data_mode = QSPI_DATA_MODE_SPI, - .length = sizeof(data), - }; - - g_qspi_ctl.qspi_rcv_done = 0; - app_qspi_command_receive_async(g_qspi_ctl.qspi_id, &command, data); - while (g_qspi_ctl.qspi_rcv_done == 0); - - if (data[ITEM_0] != 0 && data[ITEM_3] < 0xFF) { - flash_size = ((data[ITEM_3] << BIT_24) + (data[ITEM_2] << BIT_16) + - (data[ITEM_1] << BIT_8) + (data[ITEM_0] << BIT_0) + 1) / BIT_8; - } - } - - return flash_size; -} - - -static uint32_t spim_flash_write(uint32_t address, uint8_t *buffer, uint32_t nbytes) -{ - uint8_t control_frame[ITEM_4] = {0}; - - control_frame[ITEM_0] = SPI_FLASH_CMD_PP; - control_frame[ITEM_1] = (address >> BIT_16) & 0xFF; - control_frame[ITEM_2] = (address >> BIT_8) & 0xFF; - control_frame[ITEM_3] = address & 0xFF; - - g_qspi_ctl.spi_tmt_done = 0; - app_spi_write_memory_async(g_qspi_ctl.spi_id, control_frame, buffer, sizeof(control_frame), nbytes); - while (g_qspi_ctl.spi_tmt_done == 0); - - return nbytes; -} - -static uint32_t qspi_flash_write(uint32_t address, uint8_t *buffer, uint32_t nbytes) -{ - qspi_command_t command = { - .instruction = SPI_FLASH_CMD_PP, - .address = address, - .instruction_size = QSPI_INSTSIZE_08_BITS, - .address_size = QSPI_ADDRSIZE_24_BITS, - .data_size = QSPI_DATASIZE_08_BITS, - .dummy_cycles = 0, - .instruction_address_mode = QSPI_INST_ADDR_ALL_IN_SPI, - .data_mode = QSPI_DATA_MODE_SPI, - .length = nbytes, - }; - - g_qspi_ctl.qspi_tmt_done = 0; - app_qspi_command_transmit_async(g_qspi_ctl.qspi_id, &command, buffer); - while (g_qspi_ctl.qspi_tmt_done == 0); - - return nbytes; -} - -static uint32_t spim_flash_read(uint32_t address, uint8_t *buffer, uint32_t nbytes) -{ - uint8_t control_frame[ITEM_4] = {0}; - - control_frame[ITEM_0] = SPI_FLASH_CMD_READ; - control_frame[ITEM_1] = (address >> BIT_16) & 0xFF; - control_frame[ITEM_2] = (address >> BIT_8) & 0xFF; - control_frame[ITEM_3] = address & 0xFF; - - g_qspi_ctl.spi_rcv_done = 0; - app_spi_read_memory_async(g_qspi_ctl.spi_id, control_frame, buffer, sizeof(control_frame), nbytes); - while (g_qspi_ctl.spi_rcv_done == 0); - - return nbytes; -} - -static uint32_t qspi_flash_read(uint32_t address, uint8_t *buffer, uint32_t nbytes) -{ - qspi_command_t command = { - .instruction = SPI_FLASH_CMD_READ, - .address = address, - .instruction_size = QSPI_INSTSIZE_08_BITS, - .address_size = QSPI_ADDRSIZE_24_BITS, - .data_size = QSPI_DATASIZE_08_BITS, - .dummy_cycles = 0, - .instruction_address_mode = QSPI_INST_ADDR_ALL_IN_SPI, - .data_mode = QSPI_DATA_MODE_SPI, - .length = nbytes, - }; - - g_qspi_ctl.qspi_rcv_done = 0; - app_qspi_command_receive_async(g_qspi_ctl.qspi_id, &command, buffer); - while (g_qspi_ctl.qspi_rcv_done == 0); - - return nbytes; -} - -bool spim_flash_sector_erase(uint32_t address) -{ - uint8_t control_frame[4] = {0}; - - control_frame[ITEM_0] = SPI_FLASH_CMD_SE; - control_frame[ITEM_1] = (address >> BIT_16) & 0xFF; - control_frame[ITEM_2] = (address >> BIT_8) & 0xFF; - control_frame[ITEM_3] = address & 0xFF; - - g_qspi_ctl.spi_tmt_done = 0; - app_spi_transmit_async(g_qspi_ctl.spi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.spi_tmt_done == 0); - - return true; -} - -bool qspi_flash_sector_erase(uint32_t address) -{ - uint8_t control_frame[4] = {0}; - - control_frame[ITEM_0] = SPI_FLASH_CMD_SE; - control_frame[ITEM_1] = (address >> BIT_16) & 0xFF; - control_frame[ITEM_2] = (address >> BIT_8) & 0xFF; - control_frame[ITEM_3] = address & 0xFF; - - g_qspi_ctl.qspi_tmt_done = 0; - app_qspi_transmit_async(g_qspi_ctl.qspi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.qspi_tmt_done == 0); - - return true; -} - -uint32_t FLASH_SPIM_ID_init(flash_init_t *p_flash_init) -{ - app_spi_params_t spim_params = DEFAULT_SPIM_PARAM_CONFIG; - - spim_params.pin_cfg.cs.type = p_flash_init->flash_io.spi_cs.gpio; - spim_params.pin_cfg.cs.pin = p_flash_init->flash_io.spi_cs.pin; - spim_params.pin_cfg.cs.mux = p_flash_init->flash_io.spi_cs.mux; - spim_params.pin_cfg.cs.pull = APP_IO_NOPULL; - spim_params.pin_cfg.cs.enable = APP_SPI_PIN_ENABLE; - spim_params.pin_cfg.clk.type = p_flash_init->flash_io.spi_clk.gpio; - spim_params.pin_cfg.clk.pin = p_flash_init->flash_io.spi_clk.pin; - spim_params.pin_cfg.clk.mux = p_flash_init->flash_io.spi_clk.mux; - spim_params.pin_cfg.clk.pull = APP_IO_NOPULL; - spim_params.pin_cfg.clk.enable = APP_SPI_PIN_ENABLE; - spim_params.pin_cfg.mosi.type = p_flash_init->flash_io.spi_io0.qspi_io0.gpio; - spim_params.pin_cfg.mosi.pin = p_flash_init->flash_io.spi_io0.qspi_io0.pin; - spim_params.pin_cfg.mosi.mux = p_flash_init->flash_io.spi_io0.qspi_io0.mux; - spim_params.pin_cfg.mosi.pull = APP_IO_NOPULL; - spim_params.pin_cfg.mosi.enable = APP_SPI_PIN_ENABLE; - spim_params.pin_cfg.miso.type = p_flash_init->flash_io.spi_io1.qspi_io1.gpio; - spim_params.pin_cfg.miso.pin = p_flash_init->flash_io.spi_io1.qspi_io1.pin; - spim_params.pin_cfg.miso.mux = p_flash_init->flash_io.spi_io1.qspi_io1.mux; - spim_params.pin_cfg.miso.pull = APP_IO_NOPULL; - spim_params.pin_cfg.miso.enable = APP_SPI_PIN_ENABLE; - - g_qspi_ctl.spi_id = APP_SPI_ID_MASTER; - - app_spi_deinit(g_qspi_ctl.spi_id); - - if (app_spi_init(&spim_params, spi_app_spim_callback)) { - return; - } -} - -uint32_t FLASH_SPIM_ID0_ID1_init(flash_init_t *p_flash_init, app_qspi_params_t *qspi_params) -{ - if (FLASH_QSPI_ID0 == p_flash_init->spi_type) { - g_qspi_ctl.qspi_id = APP_QSPI_ID_0; - } else { - g_qspi_ctl.qspi_id = APP_QSPI_ID_1; - } - - qspi_params->id = g_qspi_ctl.qspi_id; - qspi_params->pin_cfg.cs.type = p_flash_init->flash_io.spi_cs.gpio; - qspi_params->pin_cfg.cs.pin = p_flash_init->flash_io.spi_cs.pin; - qspi_params->pin_cfg.cs.mux = p_flash_init->flash_io.spi_cs.mux; - qspi_params->pin_cfg.cs.pull = APP_IO_NOPULL; - qspi_params->pin_cfg.cs.enable = APP_SPI_PIN_ENABLE; - qspi_params->pin_cfg.clk.type = p_flash_init->flash_io.spi_clk.gpio; - qspi_params->pin_cfg.clk.pin = p_flash_init->flash_io.spi_clk.pin; - qspi_params->pin_cfg.clk.mux = p_flash_init->flash_io.spi_clk.mux; - qspi_params->pin_cfg.clk.pull = APP_IO_NOPULL; - qspi_params->pin_cfg.clk.enable = APP_SPI_PIN_ENABLE; - qspi_params->pin_cfg.io_0.type = p_flash_init->flash_io.spi_io0.qspi_io0.gpio; - qspi_params->pin_cfg.io_0.pin = p_flash_init->flash_io.spi_io0.qspi_io0.pin; - qspi_params->pin_cfg.io_0.mux = p_flash_init->flash_io.spi_io0.qspi_io0.mux; - qspi_params->pin_cfg.io_0.pull = APP_IO_NOPULL; - qspi_params->pin_cfg.io_0.enable = APP_SPI_PIN_ENABLE; - qspi_params->pin_cfg.io_1.type = p_flash_init->flash_io.spi_io1.qspi_io1.gpio; - qspi_params->pin_cfg.io_1.pin = p_flash_init->flash_io.spi_io1.qspi_io1.pin; - qspi_params->pin_cfg.io_1.mux = p_flash_init->flash_io.spi_io1.qspi_io1.mux; - qspi_params->pin_cfg.io_1.pull = APP_IO_NOPULL; - qspi_params->pin_cfg.io_1.enable = APP_SPI_PIN_ENABLE; - qspi_params->pin_cfg.io_2.type = p_flash_init->flash_io.qspi_io2.gpio; - qspi_params->pin_cfg.io_2.pin = p_flash_init->flash_io.qspi_io2.pin; - qspi_params->pin_cfg.io_2.mux = p_flash_init->flash_io.qspi_io2.mux; - qspi_params->pin_cfg.io_2.pull = APP_IO_NOPULL; - qspi_params->pin_cfg.io_2.enable = APP_SPI_PIN_ENABLE; - qspi_params->pin_cfg.io_3.type = p_flash_init->flash_io.qspi_io3.gpio; - qspi_params->pin_cfg.io_3.pin = p_flash_init->flash_io.qspi_io3.pin; - qspi_params->pin_cfg.io_3.mux = p_flash_init->flash_io.qspi_io3.mux; - qspi_params->pin_cfg.io_3.pull = APP_IO_NOPULL; - qspi_params->pin_cfg.io_3.enable = APP_SPI_PIN_ENABLE; -} - -uint32_t IO_init(app_qspi_params_t qspi_params) -{ - if (app_qspi_init(&qspi_params, spi_app_qspi_callback)) { - return false; - } - // set qspi hold/wp pin to high - app_io_init_t io_init = APP_IO_DEFAULT_CONFIG; - - io_init.mode = APP_IO_MODE_OUT_PUT; - io_init.pull = APP_IO_PULLUP; - io_init.pin = qspi_params.pin_cfg.io_2.pin; - io_init.mux = APP_IO_MUX_7; - if (app_io_init(qspi_params.pin_cfg.io_2.type, &io_init)) { - return false; - } - - io_init.mode = APP_IO_MODE_OUT_PUT; - io_init.pull = APP_IO_PULLUP; - io_init.pin = qspi_params.pin_cfg.io_3.pin; - io_init.mux = APP_IO_MUX_7; - if (app_io_init(qspi_params.pin_cfg.io_3.type, &io_init)) { - return false; - } - - if (app_io_write_pin(qspi_params.pin_cfg.io_2.type, qspi_params.pin_cfg.io_2.pin, APP_IO_PIN_SET)) { - return false; - } - - if (app_io_write_pin(qspi_params.pin_cfg.io_3.type, qspi_params.pin_cfg.io_3.pin, APP_IO_PIN_SET)) { - return false; - } -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -bool spi_flash_init(flash_init_t *p_flash_init) -{ - memcpy_s(&g_flash_init, sizeof (g_flash_init), p_flash_init, sizeof(flash_init_t)); - - if (FLASH_SPIM_ID == p_flash_init->spi_type) { - FLASH_SPIM_ID_init(p_flash_init); - } else if ((FLASH_QSPI_ID0 == p_flash_init->spi_type) || (FLASH_QSPI_ID1 == p_flash_init->spi_type)) { - app_qspi_params_t qspi_params = DEFAULT_QSPI_PARAM_CONFIG; - FLASH_SPIM_ID0_ID1_init(p_flash_init, &qspi_params); - app_qspi_deinit(g_qspi_ctl.qspi_id); - IO_init(qspi_params); - } - - return true; -} - -uint32_t spi_flash_write(uint32_t address, uint8_t *buffer, uint32_t nbytes) -{ - uint32_t page_ofs, write_size, write_cont = nbytes; - hal_status_t status = HAL_OK; - - while (write_cont) { - page_ofs = address & 0xFF; - write_size = EXFLASH_SIZE_PAGE_BYTES - page_ofs; - - if (write_cont < write_size) { - write_size = write_cont; - write_cont = 0; - } else { - write_cont -= write_size; - } - - spi_flash_write_enable(); - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - spim_flash_write(address, buffer, write_size); - } else { - qspi_flash_write(address, buffer, write_size); - } - - while (spi_flash_read_status() & 0x1); - - address += write_size; - buffer += write_size; - } - - return ((status == HAL_OK) ? nbytes : 0); -} - -uint32_t spi_flash_read(uint32_t address, uint8_t *buffer, uint32_t nbytes) -{ - uint32_t count = 0; - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - count = spim_flash_read(address, buffer, nbytes); - } else { - count = qspi_flash_read(address, buffer, nbytes); - } - - return count; -} - -bool spi_flash_sector_erase(uint32_t address, uint32_t size) -{ - bool status = true; - - uint32_t erase_addr = address; - uint32_t sector_ofs, erase_size, erase_cont = size; - - while (erase_cont) { - sector_ofs = erase_addr & 0xFFF; - erase_size = EXFLASH_SIZE_SECTOR_BYTES - sector_ofs; - - if (erase_cont < erase_size) { - erase_size = erase_cont; - erase_cont = 0; - } else { - erase_cont -= erase_size; - } - - spi_flash_write_enable(); - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - status = spim_flash_sector_erase(erase_addr); - } else { - status = qspi_flash_sector_erase(erase_addr); - } - - while (spi_flash_read_status() & 0x1); - - erase_addr += erase_size; - } - - return status; -} - -bool spi_flash_chip_erase(void) -{ - hal_status_t status = HAL_OK; - uint8_t control_frame[1] = {SPI_FLASH_CMD_CE}; - - spi_flash_write_enable(); - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - g_qspi_ctl.spi_tmt_done = 0; - app_spi_transmit_async(g_qspi_ctl.spi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.spi_tmt_done == 0); - } else { - g_qspi_ctl.qspi_tmt_done = 0; - app_qspi_transmit_async(g_qspi_ctl.qspi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.qspi_tmt_done == 0); - } - while (spi_flash_read_status() & 0x1); - - return ((status == HAL_OK) ? true : false); -} - -void spi_flash_chip_reset(void) -{ - uint8_t control_frame[1] = {SPI_FLASH_CMD_RSTEN}; - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - g_qspi_ctl.spi_tmt_done = 0; - app_spi_transmit_async(g_qspi_ctl.spi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.spi_tmt_done == 0); - } else { - hal_qspi_transmit(&g_qspi_handle, control_frame, sizeof(control_frame), MS_5000); - } - - control_frame[0] = SPI_FLASH_CMD_RST; - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - g_qspi_ctl.spi_tmt_done = 0; - app_spi_transmit_async(g_qspi_ctl.spi_id, control_frame, sizeof(control_frame)); - while (g_qspi_ctl.spi_tmt_done == 0); - } else { - hal_qspi_transmit(&g_qspi_handle, control_frame, sizeof(control_frame), MS_5000); - } - - return; -} - -uint32_t spi_flash_device_id(void) -{ - uint8_t data[3] = {0}; - - if (FLASH_SPIM_ID == g_flash_init.spi_type) { - uint8_t control_frame[1] = {SPI_FLASH_CMD_RDID}; - - g_qspi_ctl.spi_rcv_done = 0; - app_spi_read_memory_async(g_qspi_ctl.spi_id, control_frame, data, sizeof(control_frame), sizeof(data)); - while (g_qspi_ctl.spi_rcv_done == 0); - } else { - qspi_command_t command = { - .instruction = SPI_FLASH_CMD_RDID, - .address = 0, - .instruction_size = QSPI_INSTSIZE_08_BITS, - .address_size = QSPI_ADDRSIZE_00_BITS, - .data_size = QSPI_DATASIZE_08_BITS, - .dummy_cycles = 0, - .instruction_address_mode = QSPI_INST_ADDR_ALL_IN_SPI, - .data_mode = QSPI_DATA_MODE_SPI, - .length = 3, - }; - - g_qspi_ctl.qspi_rcv_done = 0; - app_qspi_command_receive_async(g_qspi_ctl.qspi_id, &command, data); - while (g_qspi_ctl.qspi_rcv_done == 0); - } - - return (((uint32_t)data[ITEM_0] << BIT_16) + ((uint32_t)data[ITEM_1] << BIT_8) + data[ITEM_2]); -} - -void spi_flash_device_info(uint32_t *id, uint32_t *size) -{ - if (id == NULL || size == NULL) { - return; - } - - *id = spi_flash_device_id(); - *size = spi_flash_device_size(); - - return; -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.h b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.h deleted file mode 100755 index e350d62..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr551x/gr551x_spi_flash.h +++ /dev/null @@ -1,273 +0,0 @@ -/** - **************************************************************************************** - * @file gr551x_spi_flash.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of spi flash library. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ -#ifndef __GR551X_SPI_FLASH_H__ -#define __GR551X_SPI_FLASH_H__ - -#include -#include "gr55xx_hal.h" -#include "app_io.h" -#include "app_qspi.h" -#include "app_spi.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup Flash operation instruction macro definition - * @{ - */ - -#define SPI_FLASH_CMD_WRSR 0x01 -#define SPI_FLASH_CMD_WRSR1 0x31 -#define SPI_FLASH_CMD_RDSR 0x05 - -#define SPI_FLASH_CMD_WREN 0x06 -#define SPI_FLASH_CMD_WRDI 0x04 - -#define SPI_FLASH_CMD_READ 0x03 -#define SPI_FLASH_CMD_FREAD 0x0B -#define SPI_FLASH_CMD_DOFR 0x3B -#define SPI_FLASH_CMD_DIOFR 0xBB -#define SPI_FLASH_CMD_QOFR 0x6B -#define SPI_FLASH_CMD_QIOFR 0xEB -#define SPI_FLASH_CMD_READ_RESET 0xFF - -#define SPI_FLASH_CMD_PP 0x02 -#define SPI_FLASH_CMD_SE 0x20 -#define SPI_FLASH_CMD_BE_32 0x52 -#define SPI_FLASH_CMD_BE_64 0xD8 -#define SPI_FLASH_CMD_CE 0xC7 -#define SPI_FLASH_CMD_PES 0x75 -#define SPI_FLASH_CMD_PER 0x7A - -#define SPI_FLASH_CMD_RDI 0xAB -#define SPI_FLASH_CMD_REMS 0x90 -#define SPI_FLASH_CMD_RDID 0x9F - -#define SPI_FLASH_CMD_RSTEN 0x66 -#define SPI_FLASH_CMD_RST 0x99 -#define SPI_FLASH_CMD_DP 0xB9 -#define SPI_FLASH_CMD_RDP 0xAB - -#define SPI_FLASH_CMD_SFUD 0x5A - -#define DUMMY_BYTE 0xFF - -#define SPI_FLASH_PAGE_SIZE 0x00100 -#define SPI_FLASH_SECTOR_SIZE 0x01000 -#define SPI_FLASH_BLOCK_SIZE 0x10000 -#define SPI_FLASH_ADDRESS_MAX 0xFFFFF - -/** @} */ - - -/** @addtogroup Flash hardware interface default parameters - * @{ - */ - -#define DEFAULT_SPIM_GROUP0 {{APP_IO_TYPE_NORMAL, APP_IO_PIN_6, APP_IO_MUX_7}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_3, APP_IO_MUX_2}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_4, APP_IO_MUX_2}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_5, APP_IO_MUX_2}} -#define DEFAULT_SPIM_GROUP1 {{APP_IO_TYPE_NORMAL, APP_IO_PIN_4, APP_IO_MUX_7}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_7, APP_IO_MUX_4}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_6, APP_IO_MUX_4}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_5, APP_IO_MUX_4}} -#define DEFAULT_SPIM_GROUP2 {{APP_IO_TYPE_NORMAL, APP_IO_PIN_15, APP_IO_MUX_7}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_12, APP_IO_MUX_1}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_13, APP_IO_MUX_1}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_14, APP_IO_MUX_1}} -#define DEFAULT_SPIM_GROUP3 {{APP_IO_TYPE_NORMAL, APP_IO_PIN_17, APP_IO_MUX_7}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_24, APP_IO_MUX_0}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_25, APP_IO_MUX_0}, \ - {APP_IO_TYPE_NORMAL, APP_IO_PIN_16, APP_IO_MUX_0}} - -/** @} */ - -/** - * @addtogroup Spi Flash IO configuration Structures - * @{ - */ -typedef enum { - FLASH_SPIM_ID, /**< SPI master module. */ - FLASH_QSPI_ID0, /**< QSPI master module 0. */ - FLASH_QSPI_ID1, /**< QSPI master module 1. */ - FLASH_SPI_ID_MAX, /**< Only for check parameter, not used as input parameters. */ -} spi_type_t; - -typedef struct _spi_io { - app_io_type_t gpio; - uint32_t pin; - app_io_mux_t mux; -} spi_io_t; - -typedef struct _flash_io { - spi_io_t spi_cs; - spi_io_t spi_clk; - union { - spi_io_t spim_mosi; - spi_io_t qspi_io0; - } spi_io0; - union { - spi_io_t spim_miso; - spi_io_t qspi_io1; - } spi_io1; - spi_io_t qspi_io2; - spi_io_t qspi_io3; -} flash_io_t; - -typedef struct _flash_init { - spi_type_t spi_type; - flash_io_t flash_io; -} flash_init_t; - -typedef struct flash_control { - uint8_t qspi_tmt_done; - uint8_t qspi_rcv_done; - app_qspi_id_t qspi_id; - uint8_t spi_tmt_done; - uint8_t spi_rcv_done; - app_spi_id_t spi_id; -} qspi_control_t; - - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_SPI_FLASH_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the SPI FLASH DRIVER according to the specified parameters - * in the spi_flash_io_t. - * - * @param[in] p_params: Pointer to spi_flash_io_t parameter. - * - **************************************************************************************** - */ -bool spi_flash_init(flash_init_t *p_flash_init); - -/** - ******************************************************************************* - * @brief Write flash Memory. - * - * @param[in] address: start address in flash to write data to. - * @param[in,out] buffer: buffer of data to write. - * @param[in] nbytes: number of bytes to write. - * - * @return number of bytes written - ******************************************************************************* - */ -uint32_t spi_flash_write(uint32_t address, uint8_t *buffer, uint32_t nbytes); - -/** - ******************************************************************************* - * @brief Read flash Memory. - * - * @param[in] address: start address in flash to read data. - * @param[in,out] buffer: buffer to read data to. - * @param[in] nbytes: number of bytes to read. - * - * @return number of bytes read - ******************************************************************************* - */ -uint32_t spi_flash_read(uint32_t address, uint8_t *buffer, uint32_t nbytes); - -/** - ******************************************************************************* - * @brief Erase flash region. - * - * @note All sectors that have address in range of [addr, addr+len] - * will be erased. If addr is not sector aligned, preceding data - * on the sector that addr belongs to will also be erased. - * If (addr + size) is not sector aligned, the whole sector - * will also be erased. - * - * @param[in] address: start address in flash to write data to. - * @param[in] size: number of bytes to write. - * - * @retval true: If successful. - * @retval false: If failure. - ******************************************************************************* - */ -bool spi_flash_sector_erase(uint32_t address, uint32_t size); - -/** - ******************************************************************************* - * @brief Erase flash chip. - * - * @retval true: If successful. - * @retval false: If failure. - ******************************************************************************* - */ -bool spi_flash_chip_erase(void); - -/** - ******************************************************************************* - * @brief Reset flash chip. - * - ******************************************************************************* - */ -void spi_flash_chip_reset(void); - -/** - ******************************************************************************* - * @brief Get flash chip id. - * - * @retval Flash chip id. - ******************************************************************************* - */ -uint32_t spi_flash_device_id(void); - -/** - ******************************************************************************* - * @brief Get Flash information. - * - * @param[in,out] id: Pointer to flash id. - * @param[in,out] size: Pointer to flash size. - * - ******************************************************************************* - */ -void spi_flash_device_info(uint32_t *id, uint32_t *size); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif // __GR551X_SPI_FLASH_H__ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_measure_mux_signal_api.c b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_measure_mux_signal_api.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_measure_mux_signal_api.h b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_measure_mux_signal_api.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_spi_flash.c b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_spi_flash.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_spi_flash.h b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_spi_flash.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_tim_delay.c b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_tim_delay.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_tim_delay.h b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/gr55xx/gr55xx_tim_delay.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735.c b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735.h b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735_config.c b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735_config.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735_config.h b/gr551x/sdk_liteos/gr551x_sdk/components/drivers_ext/st7735/st7735_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/Lib/GCC/libarm_cortexM4lf_math.a b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/Lib/GCC/libarm_cortexM4lf_math.a old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_common_tables.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_common_tables.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_const_structs.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_const_structs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_math.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_math.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_mve_tables.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_mve_tables.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_vec_math.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/CMSIS/cmsis_dsp/include/arm_vec_math.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/app_alarm.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/app_alarm.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/app_alarm.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_alarm/app_alarm.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/app_assert.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/app_assert.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/app_assert.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_assert/app_assert.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error_cfg.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/app_error_cfg.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/cortex_backtrace.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/cortex_backtrace.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/cortex_backtrace.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/cortex_backtrace.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_gcc.s b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_gcc.s old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_iar.s b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_iar.s old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_keil.s b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_error/hardfault_handler/cortex_hardfault_keil.s old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key_core.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key_core.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key_core.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_key/app_key_core.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/app_linked_list.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/app_linked_list.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/app_linked_list.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_linked_list/app_linked_list.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_dump_port.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_dump_port.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_dump_port.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_dump_port.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_store.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_store.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_store.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_log/app_log_store.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/app_memory.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/app_memory.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/app_memory.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_memory/app_memory.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/app_queue.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/app_queue.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/app_queue.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_queue/app_queue.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/app_scheduler.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/app_scheduler.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/app_scheduler.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_scheduler/app_scheduler.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/app_timer.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/app_timer.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/app_timer.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/app_timer/app_timer.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd_utils.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd_utils.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd_utils.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/at_cmd/at_cmd_utils.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/ble_advertising.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/ble_advertising.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/ble_advertising.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_advertising/ble_advertising.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/ble_connect.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/ble_connect.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/ble_connect.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_connect/ble_connect.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/ble_gatt_service.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/ble_gatt_service.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/ble_gatt_service.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_gatt_service/ble_gatt_service.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/ble_scanner.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/ble_scanner.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/ble_scanner.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_scanner/ble_scanner.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/ble_time.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/ble_time.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/ble_time.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ble/ble_time/ble_time.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_aes.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_aes.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_ecc.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_ecc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_ecc_port.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_ecc_port.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_gcm.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_gcm.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_pkc.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_pkc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_pkc_port.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_pkc_port.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_rsa.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_rsa.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_rsa_port.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_rsa_port.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_sha256.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/inc/crypto_sha256.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_aes.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_aes.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_ecc.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_ecc.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_ecc_port.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_ecc_port.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_gcm.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_gcm.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_pkc.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_pkc.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_pkc_port.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_pkc_port.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_rsa.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_rsa.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_rsa_port.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_rsa_port.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_sha256.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/crypto_lib/src/crypto_sha256.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/dfu_master.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/dfu_master.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/dfu_master.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_master/dfu_master.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/dfu_port.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/dfu_port.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/dfu_port.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/dfu_port/dfu_port.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/fault_trace.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/fault_trace.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/fault_trace.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fault_trace/fault_trace.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test_int.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/fcc/dtm_fcc_test_int.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/font_gb2312.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/font_gb2312.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_animation.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_animation.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_animation.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_animation.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_basic.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_basic.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_basic.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_basic.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_color.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_color.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_color.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_color.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gb2312_font.bin b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gb2312_font.bin old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gb2312_font.hex b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gb2312_font.hex old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_animation_config.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_animation_config.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_config.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_gb2312_config.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_gb2312_config.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcd_config.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcd_config.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcm_cfg.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcm_cfg.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcm_config.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_lcm_config.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_oled_config.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_config/gui_oled_config.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_convert_color.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_convert_color.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_convert_color.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_convert_color.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font5_7.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font5_7.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font5_7.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font5_7.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font8_8.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font8_8.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font8_8.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font8_8.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_gb2312.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_gb2312.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_gb2312.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_gb2312.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_macro.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_macro.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_other.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_other.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_other.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_font_other.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_include.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/gui/gui_include.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_exflash_user_operation.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_exflash_user_operation.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_exflash_user_operation.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_exflash_user_operation.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_flash.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_flash.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_flash.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/hal_flash.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/vflash/vflash.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/vflash/vflash.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/vflash/vflash.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hal_flash/vflash/vflash.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/hci_uart.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/hci_uart.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/hci_uart.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/hci_uart/hci_uart.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/pmu_calibration.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/pmu_calibration.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/pmu_calibration.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/pmu_calibration/pmu_calibration.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/ring_buffer.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/ring_buffer.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/ring_buffer.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/ring_buffer/ring_buffer.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/sensorsim.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/sensorsim.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/sensorsim.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/sensorsim/sensorsim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/user_efuse.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/user_efuse.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/user_efuse.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/user_efuse/user_efuse.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/utility.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/utility.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/utility.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/utility/utility.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/uart_simu_key_init.c b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/uart_simu_key_init.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/uart_simu_key_init.h b/gr551x/sdk_liteos/gr551x_sdk/components/libraries/virt_key/uart_simu_key_init.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch.h b/gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch.h deleted file mode 100755 index 5f484d2..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - ****************************************************************************** - * - * @file patch.h - * - * @brief offer the interface for the patch function based on the FPB of the cortex arm-m4; - * - ****************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -#ifndef __PATCH_H_ -#define __PATCH_H_ - -/* - * ENUMERATIONS - **************************************************************************************** - */ -enum { - BIT_HCI_SEND_2_CONTROLLER, - BIT_HAL_XQSPI_SET_XIP_PRESENT_STATUS, - BIT_LL_XQSPI_INIT, - BIT_HAL_EXFLASH_WRITE, - BIT_HAL_EXFLASH_ERASE, - BIT_HAL_EXFLASH_READ, - BIT_BLE_BM_SET_SEC_INFO, - BIT_KE_TASK_SCHEDULE, -}; - - -/* - * MACRO DECLARATIONS - **************************************************************************************** - */ -static inline uint32_t PATCH_ENABLE_FLAG(uint32_t BIT) -{ - return (1 << BIT); -} - -#define ENCRYPT_PATCH ((PATCH_ENABLE_FLAG(BIT_HCI_SEND_2_CONTROLLER) | \ - PATCH_ENABLE_FLAG(BIT_HAL_EXFLASH_WRITE) | \ - PATCH_ENABLE_FLAG(BIT_HAL_EXFLASH_ERASE) | \ - PATCH_ENABLE_FLAG(BIT_HAL_EXFLASH_READ) | \ - PATCH_ENABLE_FLAG(BIT_BLE_BM_SET_SEC_INFO)) | \ - PATCH_ENABLE_FLAG(BIT_KE_TASK_SCHEDULE)) - - -#define NO_ENCRYPT_PATCH ((PATCH_ENABLE_FLAG(BIT_HCI_SEND_2_CONTROLLER) | \ - PATCH_ENABLE_FLAG(BIT_HAL_EXFLASH_WRITE) | \ - PATCH_ENABLE_FLAG(BIT_HAL_EXFLASH_ERASE) | \ - PATCH_ENABLE_FLAG(BIT_BLE_BM_SET_SEC_INFO)) | \ - PATCH_ENABLE_FLAG(BIT_KE_TASK_SCHEDULE)) - -/** - ***************************************************************************************** - * @brief Apply Cold Patch - * This function is used for cold patch - ***************************************************************************************** - */ -extern void cold_patch_apply(void); - -/** - ***************************************************************************************** - * @brief Patch Enabling Function - * This function can not be used directly. It needs to be registered with FPB unit - * and automatically enabled by the system. - ***************************************************************************************** - */ -extern void fpb_patch_enable(void); - -/** - ***************************************************************************************** - * @brief Patch Enabling Function for encrypt - * This function can not be used directly. It needs to be registered with FPB unit - * and automatically enabled by the system. - ***************************************************************************************** - */ -extern void fpb_encrypt_mode_patch_enable(void); - -#endif // __PATCH_H_ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch_tab.h b/gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch_tab.h deleted file mode 100755 index e35f370..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/patch/ind/patch_tab.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef __PATCH_TAB_H_ -#define __PATCH_TAB_H_ - -// WEAK Functions for platform init & code size optimization -__WEAK void ble_con_env_init(void) {}; -__WEAK void ble_adv_env_init(void) {}; -__WEAK void ble_per_adv_env_init(void) {}; -__WEAK void ble_scan_env_init(void) {}; -__WEAK void ble_sync_env_init(void) {}; - -typedef int (*ke_msg_func_t)(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); - -typedef int (*llm_hci_cmd_hdl_func_t)(uint16_t const *param, uint16_t opcode); - -typedef struct { - ke_msg_func_t ori_func_addr; - ke_msg_func_t new_func_addr; -} msg_tab_item_t; - -typedef struct { - llm_hci_cmd_hdl_func_t ori_func_addr; - llm_hci_cmd_hdl_func_t new_func_addr; -} hci_cmd_tab_item_t; - -// ble sdk task -extern int host_to_sdk_msg_handler_patch(uint16_t const msgid, uint16_t *param, - uint16_t const dest_id, uint16_t const src_id); -// ble sdk gapm for common -extern int gap_activity_stopped_ind_handler_patch(uint16_t const msgid, uint16_t const *p_param, - uint16_t const dest_id, uint16_t const src_id); -extern int gapm_cmp_evt_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int gap_dev_bdaddr_ind_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -// llm task for common -extern int llm_hci_command_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -// hci cmd for common -extern int hci_le_add_dev_to_wlst_cmd_handler_patch(uint16_t const *param, uint16_t opcode); -extern int hci_le_rmv_dev_from_wlst_cmd_handler_patch(uint16_t const *param, uint16_t opcode); -extern int hci_le_clear_wlst_cmd_handler_patch(uint16_t const *param, uint16_t opcode); - -extern int hci_dbg_ble_reg_wr_cmd_handler_patch(uint16_t const *param, uint16_t opcode); -extern int hci_dbg_ble_reg_rd_cmd_handler_patch(uint16_t const *param, uint16_t opcode); - -#if CFG_MAX_CONNECTIONS -// gattc task -extern int l2cc_pdu_recv_ind_handler_patch(uint16_t const msgid, struct l2cc_pdu_recv_ind *param, - uint16_t const dest_id, uint16_t const src_id); -// llc task -extern int llc_loc_llcp_rsp_to_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int llc_rem_llcp_rsp_to_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_acl_rx_ind_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_con_offset_upd_ind_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_con_param_upd_cfm_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_llcp_rx_ind_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_llcp_tx_cfm_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_ch_map_upd_cfm_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int lld_phy_upd_cfm_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int llc_auth_payl_nearly_to_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int llc_auth_payl_real_to_handler_patch(uint16_t const msgid, uint16_t const *param, - uint16_t const dest_id, uint16_t const src_id); -// l2cc task -extern int hci_nb_cmp_pkts_evt_handler_patch(uint16_t const msgid, struct hci_nb_cmp_pkts_evt const *event, - uint16_t const dest_id, uint16_t const src_id); -// gapc task -extern int gapc_hci_handler_patch(uint16_t const msgid, uint16_t const *event, - uint16_t dest_id, uint16_t src_id); -// ble sdk task for gapc -extern int gap_connection_req_ind_handler_patch(uint16_t const msgid, struct gapc_connection_req_ind const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int gap_disconnect_ind_handler_patch(uint16_t const msgid, struct gapc_disconnect_ind const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int gap_cmp_evt_handler_patch(uint16_t const msgid, struct gapc_cmp_evt const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int sec_rcv_sec_req_ind_handler_patch(uint16_t const msgid, struct gapc_security_ind const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int sec_rcv_encrypt_req_ind_handler_patch(uint16_t const msgid, struct gapc_encrypt_req_ind const *param, - uint16_t const dest_id, uint16_t const src_id); -// ble sdk task for gatt -extern int ble_sdk_gatts_svc_changed_cfg_ind_handler_patch(uint16_t const msgid, - struct gattc_svc_changed_cfg const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int ble_sdk_gattc_event_ind_handler_patch(uint16_t const msgid, struct gattc_event_ind const *param, - uint16_t const dest_id, uint16_t const src_id); -#endif - -#if CFG_MAX_SCAN -// gapm task for scan -extern int gapm_activity_create_cmd_handler_patch(uint16_t const msgid, struct gapm_activity_create_cmd const *param, - uint16_t const dest_id, uint16_t const src_id); -extern int gapm_hci_handler_patch(uint16_t const msgid, uint16_t const *event, - uint16_t dest_id, uint16_t opcode); - -// hci cmd for scan -extern int hci_le_ext_create_con_cmd_handler_patch(struct hci_le_ext_create_con_cmd *param, uint16_t opcode); -extern int hci_le_set_ext_scan_param_cmd_handler_patch(struct hci_le_set_ext_scan_param_cmd const *param, - uint16_t opcode); -extern int hci_le_set_ext_scan_en_cmd_handler_patch(struct hci_le_set_ext_scan_en_cmd const *param, uint16_t opcode); -#endif - -msg_tab_item_t msg_tab[] = { - // ble sdk gapm for common - {(ke_msg_func_t)0x00074235, (ke_msg_func_t)gapm_cmp_evt_handler_patch}, - {(ke_msg_func_t)0x000709e1, (ke_msg_func_t)gap_activity_stopped_ind_handler_patch}, - {(ke_msg_func_t)0x00071f6d, (ke_msg_func_t)gap_dev_bdaddr_ind_handler_patch}, - // llm task for common - {(ke_msg_func_t)0x00051d09, (ke_msg_func_t)llm_hci_command_handler_patch}, - // ble sdk task for common - {(ke_msg_func_t)0x000761a9, (ke_msg_func_t)host_to_sdk_msg_handler_patch}, - -#if CFG_MAX_CONNECTIONS - // gattc task for conn - {(ke_msg_func_t)0x00032e7d, (ke_msg_func_t)l2cc_pdu_recv_ind_handler_patch}, - // llc task for conn - {(ke_msg_func_t)0x000391b5, (ke_msg_func_t)llc_loc_llcp_rsp_to_handler_patch}, - {(ke_msg_func_t)0x0003a795, (ke_msg_func_t)llc_rem_llcp_rsp_to_handler_patch}, - {(ke_msg_func_t)0x00049a6d, (ke_msg_func_t)lld_llcp_rx_ind_handler_patch}, - {(ke_msg_func_t)0x00049c95, (ke_msg_func_t)lld_llcp_tx_cfm_handler_patch}, - {(ke_msg_func_t)0x0003aed9, (ke_msg_func_t)lld_acl_rx_ind_handler_patch}, - {(ke_msg_func_t)0x00045e6d, (ke_msg_func_t)lld_con_param_upd_cfm_handler_patch}, - {(ke_msg_func_t)0x000418c9, (ke_msg_func_t)lld_ch_map_upd_cfm_handler_patch}, - {(ke_msg_func_t)0x0004b67d, (ke_msg_func_t)lld_phy_upd_cfm_handler_patch}, - {(ke_msg_func_t)0x00045da1, (ke_msg_func_t)lld_con_offset_upd_ind_handler_patch}, - {(ke_msg_func_t)0x0003679d, (ke_msg_func_t)llc_auth_payl_nearly_to_handler_patch}, - {(ke_msg_func_t)0x00036801, (ke_msg_func_t)llc_auth_payl_real_to_handler_patch}, - // l2cc task for conn - {(ke_msg_func_t)0x0002b281, (ke_msg_func_t)hci_nb_cmp_pkts_evt_handler_patch}, - // gapc task for conn - {(ke_msg_func_t)0x0000f751, (ke_msg_func_t)gapc_hci_handler_patch}, - // ble sdk gapc for conn - {(ke_msg_func_t)0x00071781, (ke_msg_func_t)gap_connection_req_ind_handler_patch}, - {(ke_msg_func_t)0x00072229, (ke_msg_func_t)gap_disconnect_ind_handler_patch}, - {(ke_msg_func_t)0x0007ac89, (ke_msg_func_t)sec_rcv_sec_req_ind_handler_patch}, - {(ke_msg_func_t)0x00071519, (ke_msg_func_t)gap_cmp_evt_handler_patch}, - {(ke_msg_func_t)0x0007ab15, (ke_msg_func_t)sec_rcv_encrypt_req_ind_handler_patch}, - // ble sdk gatt for conn - {(ke_msg_func_t)0x0006d0d5, (ke_msg_func_t)ble_sdk_gattc_event_ind_handler_patch}, - {(ke_msg_func_t)0x0006db75, (ke_msg_func_t)ble_sdk_gatts_svc_changed_cfg_ind_handler_patch}, -#endif - -#if CFG_MAX_SCAN - // gapm task for scan - {(ke_msg_func_t)0x00010d2d, (ke_msg_func_t)gapm_activity_create_cmd_handler_patch}, - {(ke_msg_func_t)0x00012751, (ke_msg_func_t)gapm_hci_handler_patch}, -#endif -}; - -extern void reg_hci_cmd_patch_tab(hci_cmd_tab_item_t *hci_cmd_tab, uint16_t hci_cmd_cnt); -extern void reg_msg_patch_tab(msg_tab_item_t *msg_tab, uint16_t msg_cnt); - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/patch/symbol_table/rom_symbol_gcc.txt b/gr551x/sdk_liteos/gr551x_sdk/components/patch/symbol_table/rom_symbol_gcc.txt deleted file mode 100755 index 0996ee8..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/patch/symbol_table/rom_symbol_gcc.txt +++ /dev/null @@ -1,1287 +0,0 @@ -boot_info = 0x00801f10; -gm_drv_present_encrypt = 0x00001b75; -bl1_srand = 0x00004bb9; -adc_dma_error = 0x00005edd; -adc_wait_notempty_until_timeout = 0x00005ef1; -assert_err = 0x00006f01; -assert_param = 0x00006f2d; -assert_warn = 0x00006f5d; -attc_l2cc_pdu_recv_handler = 0x000072c5; -attmdb_get_attribute = 0x00008449; -attmdb_uuid16_comp = 0x00008bed; -atts_clear_read_cache = 0x00008c95; -atts_execute_write_req = 0x00008ce9; -atts_find_by_type_req = 0x00008ef9; -atts_find_info_req = 0x0000917d; -atts_get_att_chk_perm = 0x000093fd; -atts_get_value = 0x000094f5; -atts_hdl_value_cfm = 0x000095c1; -atts_mtu_exc_req = 0x000096d1; -atts_prepare_write_req = 0x0000976d; -atts_process_pdu = 0x000098c9; -atts_read_blob_req = 0x00009991; -atts_read_by_grp_type_req = 0x00009ac5; -atts_read_by_type_req = 0x00009cf5; -atts_read_req = 0x0000a0b1; -atts_send_error = 0x0000a1b9; -atts_send_pdu = 0x0000a273; -atts_write_cmd = 0x0000a369; -atts_write_req = 0x0000a3f9; -atts_write_signed = 0x0000a4d9; -bb_watch_timer_cbk_func = 0x0000a5fd; -bb_watch_timer_start_func = 0x0000a601; -ble_get_role_and_cs_idx_from_et = 0x0000a9dd; -ble_sdk_default_prf_config_set = 0x0000aa4d; -ble_util_buf_acl_tx_alloc = 0x0000aab1; -ble_util_buf_acl_tx_free = 0x0000ab09; -ble_util_buf_adv_tx_free = 0x0000ab69; -ble_util_buf_rx_alloc = 0x0000add9; -ble_util_buf_rx_free = 0x0000ae15; -check_boot_info = 0x0000bdf5; -check_image_crc = 0x0000be3d; -co_bdaddr_compare = 0x0000be99; -co_list_extract = 0x0000bf45; -co_list_extract_sublist = 0x0000c125; -co_list_find = 0x0000c1bd; -co_list_insert_after = 0x0000c231; -co_list_pop_front = 0x0000c47b; -co_list_push_back = 0x0000c4c5; -co_list_push_back_sublist = 0x0000c54d; -co_list_push_front = 0x0000c60d; -co_list_size = 0x0000c68d; -dbg_log_printf = 0x0000cd9d; -exflash_check_id = 0x0000e3fd; -exflash_deepsleep = 0x0000e479; -exflash_enable_quad = 0x0000e495; -exflash_enable_write = 0x0000e4f9; -exflash_erase_chip = 0x0000e515; -exflash_erase_sector = 0x0000e571; -exflash_page_program = 0x0000e5d9; -exflash_resume = 0x0000e6a5; -exflash_suspend = 0x0000e6c1; -exflash_wait_busy = 0x0000e715; -exflash_wakeup = 0x0000e78d; -exflash_write_status = 0x0000e7a9; -force_dpad_le_high = 0x0000e8ad; -gapc_get_conidx = 0x0000f2a9; -gapc_get_dest_task = 0x0000f2f5; -gapc_get_operation = 0x0000f591; -gapc_link_encrypted = 0x0000f8e1; -gapc_send_complete_evt = 0x0000fe49; -gapc_set_local_addr = 0x00010025; -gapc_update_state = 0x000104c5; -gapm_actv_alloc = 0x00010f7d; -gapm_actv_check_create_param = 0x00010fad; -gapm_actv_created = 0x00010fbd; -gapm_actv_get_free_idx = 0x000110c5; -gapm_actv_retrieve_cmd_cmp_evt = 0x000111d5; -gapm_actv_started = 0x000112b9; -gapm_adv_create = 0x00011a19; -gapm_get_address_type = 0x000123b9; -gapm_get_att_handle = 0x000123c9; -gapm_get_requester = 0x000126b1; -gapm_init_check_param = 0x0001287d; -gapm_init_delete = 0x00012a1d; -gapm_init_send_hci_le_create_con_cancel_cmd = 0x00012a21; -gapm_init_send_hci_le_ext_create_con_cmd = 0x00012a33; -gapm_init_stopped = 0x00012bbd; -gapm_is_addr_type_valid = 0x00012c0d; -gapm_per_sync_create = 0x000133fd; -gapm_process_op = 0x00013649; -gapm_scan_create = 0x000139bd; -gattc_get_mtu = 0x0001501d; -get_time_before_instant_by_hus = 0x000166b1; -h4tl_read_start = 0x000169a5; -hal_adc_get_dma_threshold = 0x00016e71; -hal_adc_get_error = 0x00016e81; -hal_adc_get_state = 0x00016e85; -hal_adc_register_callback = 0x00017021; -hal_adc_set_dma_threshold = 0x00017055; -hal_aes_abort = 0x000171d9; -hal_aes_abort_it = 0x000171f9; -hal_aes_cbc_decrypt = 0x000171fd; -hal_aes_cbc_decrypt_it = 0x000172b5; -hal_aes_cbc_encrypt = 0x0001730d; -hal_aes_cbc_encrypt_it = 0x000173c9; -hal_aes_ecb_decrypt = 0x00017475; -hal_aes_ecb_decrypt_it = 0x00017525; -hal_aes_ecb_encrypt = 0x00017579; -hal_aes_ecb_encrypt_it = 0x0001762d; -hal_aes_get_error = 0x0001769d; -hal_aes_get_state = 0x000176a1; -hal_aes_irq_handler = 0x0001772d; -hal_aes_register_callback = 0x00017831; -hal_aes_resume_reg = 0x0001783d; -hal_aes_set_timeout = 0x000178d9; -hal_aes_suspend_reg = 0x000178dd; -hal_aon_gpio_br_callback = 0x0001797c; -hal_aon_gpio_read_pin = 0x00017a75; -hal_aon_gpio_register_callback = 0x00017a8d; -hal_aon_wdt_deinit_ext = 0x00017b39; -hal_aon_wdt_irq_handler = 0x00017ba9; -hal_aon_wdt_register_callback = 0x00017c19; -hal_calendar_register_callback = 0x00017e95; -hal_comp_get_error = 0x000180a7; -hal_comp_get_state = 0x000180ab; -hal_comp_register_callback = 0x0001815d; -hal_comp_resume_reg = 0x00018169; -hal_comp_start = 0x00018179; -hal_comp_stop = 0x000181bd; -hal_comp_suspend_reg = 0x00018205; -hal_deinit_ext = 0x00018249; -hal_delay = 0x0001824d; -hal_dma_abort = 0x00018265; -hal_dma_abort_it = 0x00018345; -hal_dma_get_error = 0x00018459; -hal_dma_get_state = 0x0001845d; -hal_dma_irq_handler = 0x000184f1; -hal_dma_poll_for_transfer = 0x00018639; -hal_dma_register_callback = 0x00018729; -hal_dma_resume_reg = 0x00018775; -hal_dma_start = 0x000187bd; -hal_dma_start_it = 0x00018839; -hal_dma_suspend_reg = 0x00018911; -hal_dma_unregister_callback = 0x0001893d; -hal_dual_timer_base_start = 0x00018a7d; -hal_dual_timer_base_start_it = 0x00018ab7; -hal_dual_timer_base_stop = 0x00018af1; -hal_dual_timer_base_stop_it = 0x00018b2b; -hal_dual_timer_deinit_ext = 0x00018b6f; -hal_dual_timer_get_state = 0x00018b73; -hal_dual_timer_init_ext = 0x00018b77; -hal_dual_timer_register_callback = 0x00018bcd; -hal_efuse_crc_calculate = 0x00018c2d; -hal_efuse_initial_value_check = 0x00018d75; -hal_efuse_read = 0x00018e01; -hal_efuse_read_trim = 0x00018e79; -hal_efuse_register_callback = 0x00018f05; -hal_efuse_set_main_backup = 0x00018f11; -hal_efuse_write = 0x00018f2d; -hal_efuse_write_keyram = 0x0001902d; -hal_exflash_deepsleep = 0x0001907d; -hal_exflash_deinit_ext = 0x000190f3; -hal_exflash_get_error = 0x00019245; -hal_exflash_get_state = 0x00019249; -hal_exflash_init_ext = 0x0001935d; -hal_exflash_lock = 0x00019361; -hal_exflash_msp_init = 0x0001941d; -hal_exflash_read_rom = 0x00019435; -hal_exflash_register_callback = 0x0001958d; -hal_exflash_reset = 0x00019599; -hal_exflash_set_retry = 0x0001962d; -hal_exflash_unlock = 0x00019683; -hal_exflash_wakeup = 0x00019723; -hal_get_tick = 0x000199c1; -hal_gpio_deinit_ext = 0x00019a71; -hal_gpio_exti_irq_handler = 0x00019a91; -hal_gpio_init_ext = 0x00019acb; -hal_gpio_read_pin = 0x00019acf; -hal_gpio_register_callback = 0x00019ae1; -hal_gpio_toggle_pin = 0x00019aed; -hal_gpio_write_pin = 0x00019af5; -hal_hmac_register_callback = 0x00019dbd; -hal_i2c_register_callback = 0x0001ae51; -hal_i2s_abort = 0x0001b299; -hal_i2s_deinit_ext = 0x0001b3e1; -hal_i2s_get_error = 0x0001b401; -hal_i2s_get_rx_fifo_threshold = 0x0001b405; -hal_i2s_get_state = 0x0001b40f; -hal_i2s_get_tx_fifo_threshold = 0x0001b415; -hal_i2s_init_ext = 0x0001b515; -hal_i2s_irq_handler = 0x0001b519; -hal_i2s_receive = 0x0001b661; -hal_i2s_receive_dma = 0x0001b6f9; -hal_i2s_receive_it = 0x0001b825; -hal_i2s_register_callback = 0x0001b8fd; -hal_i2s_resume_reg = 0x0001b909; -hal_i2s_set_rx_fifo_threshold = 0x0001b969; -hal_i2s_set_tx_fifo_threshold = 0x0001b9b7; -hal_i2s_start_clock = 0x0001ba05; -hal_i2s_stop_clock = 0x0001ba2d; -hal_i2s_suspend_reg = 0x0001ba55; -hal_i2s_transmit_dma = 0x0001bb19; -hal_i2s_transmit_it = 0x0001bc59; -hal_i2s_transmit_receive = 0x0001bd31; -hal_i2s_transmit_receive_dma = 0x0001bdc9; -hal_i2s_transmit_receive_it = 0x0001bf3d; -hal_increment_tick = 0x0001c051; -hal_init_ext = 0x0001c071; -hal_init_tick = 0x0001c075; -hal_mpu_config_region = 0x0001c095; -hal_mpu_disable = 0x0001c0ed; -hal_mpu_enable = 0x0001c105; -hal_msio_read_pin = 0x0001c18d; -hal_msio_toggle_pin = 0x0001c1a5; -hal_msio_write_pin = 0x0001c1bd; -hal_nvic_clear_pending_irq = 0x0001c219; -hal_nvic_disable_irq = 0x0001c233; -hal_nvic_enable_irq = 0x0001c255; -hal_nvic_get_active = 0x0001c26f; -hal_nvic_get_pending_irq = 0x0001c297; -hal_nvic_get_priority = 0x0001c2bf; -hal_nvic_set_pending_irq = 0x0001c325; -hal_nvic_set_priority = 0x0001c341; -hal_nvic_set_priority_grouping = 0x0001c399; -hal_pkc_register_callback = 0x0001d971; -hal_pwr_config_timer_wakeup_ext = 0x0001df01; -hal_pwr_enter_chip_deepsleep = 0x0001df05; -hal_pwr_register_timer_elaspsed_handler = 0x0001df81; -hal_pwr_set_comm_mode = 0x0001df8d; -hal_pwr_set_comm_power = 0x0001dfc1; -hal_pwr_set_mem_current_power = 0x0001e035; -hal_pwr_set_mem_deepsleep_power = 0x0001e071; -hal_pwr_set_mem_wakeup_power = 0x0001e091; -hal_pwr_set_wakeup_condition = 0x0001e0b1; -hal_pwr_sleep_timer_irq_handler = 0x0001e0d9; -hal_qspi_register_callback = 0x0001f4c5; -hal_register_callback = 0x0001f921; -hal_resume_tick = 0x0001f92d; -hal_rng_get_state = 0x0001fb23; -hal_rng_irq_handler = 0x0001fb95; -hal_rng_read_last_random_number = 0x0001fc01; -hal_rng_register_callback = 0x0001fc21; -hal_rng_resume_reg = 0x0001fc2d; -hal_rng_suspend_reg = 0x0001fc47; -hal_sha256_digest = 0x0001fc51; -hal_sha256_digest_dma = 0x0001fcb3; -hal_sha256_digest_it = 0x0001fd09; -hal_spi_abort = 0x0001fd5f; -hal_spi_abort_it = 0x0001fe0d; -hal_spi_deinit_ext = 0x0001ff4d; -hal_spi_get_error = 0x0001ff6d; -hal_spi_get_rx_fifo_threshold = 0x0001ff71; -hal_spi_get_state = 0x0001ff7b; -hal_spi_get_tx_fifo_threshold = 0x0001ff81; -hal_spi_init_ext = 0x0002013d; -hal_spi_irq_handler = 0x00020141; -hal_spi_read_eeprom = 0x000202d5; -hal_spi_read_eeprom_dma = 0x00020369; -hal_spi_receive = 0x000205e1; -hal_spi_receive_dma = 0x00020669; -hal_spi_register_callback = 0x00020829; -hal_spi_resume_reg = 0x00020835; -hal_spi_set_rx_fifo_threshold = 0x00020891; -hal_spi_set_timeout = 0x000208bf; -hal_spi_set_tx_fifo_threshold = 0x000208c3; -hal_spi_suspend_reg = 0x000208f1; -hal_spi_transmit = 0x00020917; -hal_spi_transmit_dma = 0x0002098d; -hal_spi_transmit_receive = 0x00020b3b; -hal_spi_transmit_receive_dma = 0x00020bb5; -hal_suspend_tick = 0x00020e21; -hal_systick_callback = 0x00020e2f; -hal_systick_clk_source_config = 0x00020e31; -hal_systick_config = 0x00020e4d; -hal_systick_irq_handler = 0x00020e75; -hal_timer_base_start = 0x00020f25; -hal_timer_base_start_it = 0x00020f5f; -hal_timer_base_stop = 0x00020f99; -hal_timer_base_stop_it = 0x00020fd3; -hal_timer_base_deinit_ext = 0x00021017; -hal_timer_get_state = 0x0002101b; -hal_timer_base_init_ext = 0x0002101f; -hal_timer_irq_handler = 0x00021023; -hal_timer_register_callback = 0x0002104d; -hal_timer_set_config = 0x00021059; -hal_uart_abort = 0x00021081; -hal_uart_abort_it = 0x00021119; -hal_uart_abort_receive = 0x000211c5; -hal_uart_abort_receive_it = 0x00021225; -hal_uart_abort_transmit = 0x000212c9; -hal_uart_abort_transmit_it = 0x00021325; -hal_uart_deinit_ext = 0x00021479; -hal_uart_dma_pause = 0x0002147d; -hal_uart_dma_resume = 0x000214e5; -hal_uart_dma_stop = 0x00021545; -hal_uart_get_error = 0x00021595; -hal_uart_init_ext = 0x00021655; -hal_uart_irq_handler = 0x00021659; -hal_uart_receive = 0x00021749; -hal_uart_receive_dma = 0x000217ad; -hal_uart_receive_it = 0x000218a9; -hal_uart_register_callback = 0x00021911; -hal_uart_resume_reg = 0x0002191d; -hal_uart_suspend_reg = 0x00021981; -hal_uart_transmit = 0x000219bf; -hal_uart_transmit_dma = 0x00021a35; -hal_uart_transmit_it = 0x00021ac1; -hal_wdt_deinit_ext = 0x00021b79; -hal_wdt_init_ext = 0x00021be1; -hal_wdt_irq_handler = 0x00021be5; -hal_wdt_refresh = 0x00021c7d; -hal_wdt_register_callback = 0x00021cb9; -hal_xqspi_command_receive = 0x00021cc5; -hal_xqspi_command_transmit = 0x00021d53; -hal_xqspi_deinit_ext = 0x00021e17; -hal_xqspi_get_error = 0x00021e1b; -hal_xqspi_get_rx_fifo_threshold = 0x00021e1f; -hal_xqspi_get_state = 0x00021e2b; -hal_xqspi_get_tx_fifo_threshold = 0x00021e31; -hal_xqspi_init_ext_rom = 0x00021ef5; -hal_xqspi_msp_init = 0x00021f19; -hal_xqspi_receive = 0x00021f31; -hal_xqspi_register_callback = 0x00021fbd; -hal_xqspi_set_retry = 0x00021fc9; -hal_xqspi_set_rx_fifo_threshold = 0x00021fcd; -hal_xqspi_set_tx_fifo_threshold = 0x0002200b; -hal_xqspi_transmit = 0x00022139; -hci_le_cmd_cmp_evt_started_handler = 0x00025295; -hci_le_cmd_cmp_evt_stopping_handler = 0x00025481; -hci_look_for_cmd_desc = 0x0002b1b5; -hci_send_2_host = 0x0002bac1; -jump_app = 0x0002f831; -ke_event_callback_set = 0x0002f989; -ke_event_clear = 0x0002f9c5; -ke_event_get_all = 0x0002faa5; -ke_event_set = 0x0002fb11; -ke_free = 0x0002fbc9; -ke_is_free = 0x0002feb5; -ke_malloc = 0x0002fec9; -ke_msg_alloc = 0x000301a1; -ke_msg_free = 0x00030225; -ke_msg_send = 0x00030239; -ke_sleep_check = 0x00030363; -ke_state_get = 0x00030375; -ke_task_handler_get = 0x0003058d; -ke_timer_clear = 0x00030891; -ke_timer_set = 0x000309b1; -l2cc_pdu_send = 0x0003108b; -ll_clock_accuracy_req_handler = 0x00031095; -l2cc_pdu_alloc = 0x00032629; -l2cm_get_nb_buffer_available = 0x00033d85; -ll_adc_struct_init = 0x00033f3d; -ll_aes_deinit = 0x00033f55; -ll_aes_init = 0x00033f63; -ll_aes_struct_init = 0x00033f77; -ll_aon_gpio_struct_init = 0x000340bd; -ll_cgc_deinit = 0x0003413d; -ll_cgc_init = 0x00034151; -ll_cgc_struct_init = 0x00034199; -ll_channel_map_ind_handler = 0x000341a9; -ll_cis_ind_handler = 0x0003426d; -ll_cis_req_handler = 0x000342e1; -ll_cis_rsp_handler = 0x00034535; -ll_cis_terminate_ind_handler = 0x0003460d; -ll_clock_accuracy_rsp_handler = 0x00034625; -ll_comp_deinit = 0x00034651; -ll_comp_init = 0x00034661; -ll_comp_struct_init = 0x000346ad; -ll_connection_param_req_handler = 0x000346b9; -ll_connection_param_rsp_handler = 0x00034795; -ll_connection_update_ind_handler = 0x0003482d; -ll_dbg_is_opcode_supported = 0x00034955; -ll_dma_struct_init = 0x00034e49; -ll_dual_timer_deinit = 0x00034e99; -ll_dual_timer_init = 0x00034ea9; -ll_dual_timer_struct_init = 0x00034ed5; -ll_enc_req_handler = 0x00034efd; -ll_enc_rsp_handler = 0x00034fc5; -ll_feature_req_handler = 0x00035039; -ll_feature_rsp_handler = 0x00035051; -ll_get_event_cnt = 0x000350a1; -ll_gpio_deinit = 0x000350b1; -ll_gpio_init = 0x0003516d; -ll_gpio_struct_init = 0x00035381; -ll_hmac_deinit = 0x00035395; -ll_hmac_init = 0x000353a3; -ll_hmac_struct_init = 0x000353cb; -ll_i2c_init = 0x0003543d; -ll_i2c_struct_init = 0x00035501; -ll_i2s_deinit = 0x00035515; -ll_i2s_init = 0x0003561d; -ll_i2s_struct_init = 0x00035769; -ll_length_req_handler = 0x00035783; -ll_length_rsp_handler = 0x000357d9; -ll_min_used_channels_ind_handler = 0x00035859; -ll_msio_struct_init = 0x00035a0d; -ll_pause_enc_req_handler = 0x00035a21; -ll_pause_enc_rsp_handler = 0x00035a95; -ll_phy_req_handler = 0x00035af9; -ll_phy_rsp_handler = 0x00035bad; -ll_phy_update_ind_handler = 0x00035c2d; -ll_ping_req_handler = 0x00035cc5; -ll_ping_rsp_handler = 0x00035ccf; -ll_pkc_deinit = 0x00035ced; -ll_pkc_init = 0x00035d13; -ll_pkc_struct_init = 0x00035d49; -ll_qspi_deinit = 0x00035f2d; -ll_qspi_init = 0x00035f4d; -ll_qspi_struct_init = 0x00035ff5; -ll_rng_deinit = 0x00036075; -ll_rng_init = 0x0003609b; -ll_rng_struct_init = 0x000360e3; -ll_slave_feature_req_handler = 0x000360f9; -ll_spim_deinit = 0x0003612d; -ll_spim_init = 0x00036149; -ll_spim_struct_init = 0x000361a9; -ll_spis_deinit = 0x000361d9; -ll_spis_init = 0x000361ef; -ll_spis_struct_init = 0x0003623d; -ll_start_enc_req_handler = 0x0003624d; -ll_start_enc_rsp_handler = 0x000362a5; -ll_terminate_ind_handler = 0x000362fd; -ll_timer_deinit = 0x00036339; -ll_timer_init = 0x00036347; -ll_timer_struct_init = 0x0003634f; -ll_uart_deinit = 0x00036357; -ll_uart_init = 0x00036361; -ll_uart_struct_init = 0x000363e5; -ll_version_ind_handler = 0x00036409; -ll_xqspi_deinit = 0x00036461; -ll_xqspi_init = 0x000364dd; -ll_xqspi_struct_init = 0x00036749; -llc_auth_payl_nearly_to_handler = 0x0003679d; -llc_auth_payl_real_to_handler = 0x00036801; -llc_ch_map_up_proc_err_cb = 0x00036855; -llc_con_upd_param_in_range = 0x00037491; -llc_disconnect = 0x000374dd; -llc_hci_con_param_req_evt_send = 0x00037905; -llc_hci_con_upd_info_send = 0x0003793d; -llc_hci_enc_evt_send = 0x00037a99; -llc_hci_ltk_request_evt_send = 0x00037ba9; -llc_iv_skd_rand_gen = 0x00037cd5; -llc_le_ping_restart = 0x00037e29; -llc_ll_connection_param_rsp_pdu_send = 0x00037f95; -llc_ll_enc_rsp_ack_handler = 0x00038079; -llc_ll_enc_rsp_pdu_send = 0x000380a1; -llc_ll_pause_enc_rsp_pdu_send = 0x00038209; -llc_ll_reject_ind_ack_handler = 0x00038291; -llc_ll_reject_ind_pdu_send = 0x000382b9; -llc_ll_start_enc_req_pdu_send = 0x00038315; -llc_ll_start_enc_rsp_ack_handler = 0x0003832d; -llc_ll_start_enc_rsp_pdu_send = 0x00038355; -llc_llcp_state_set = 0x0003852d; -llc_llcp_tx_check = 0x00038679; -llc_loc_con_upd_proc_err_cb = 0x00038bb5; -llc_loc_encrypt_proc_continue_func = 0x00038dcd; -llc_proc_collision_check = 0x00039cb5; -llc_proc_get = 0x00039d31; -llc_proc_id_get = 0x00039d65; -llc_proc_reg = 0x00039d99; -llc_proc_state_get = 0x00039e19; -llc_proc_state_set = 0x00039e1d; -llc_proc_timer_pause_set = 0x00039e21; -llc_proc_timer_set = 0x00039ed5; -llc_proc_unreg = 0x00039f89; -llc_rem_ch_map_proc_continue_func = 0x0003a00d; -llc_rem_con_upd_proc_err_cb = 0x0003a2b1; -llc_rem_encrypt_proc_continue_func = 0x0003a3e5; -llc_rem_phy_upd_proc_err_cb = 0x0003a9c5; -llc_sk_gen = 0x0003aaf9; -lld_aa_gen = 0x0003ae59; -lld_acl_rx_ind_handler = 0x0003aed9; -lld_addr_is_in_ral_list = 0x0003afe7; -lld_adv_adv_data_set = 0x0003aff9; -lld_adv_aux_ch_idx_set = 0x0003b11d; -lld_adv_end = 0x0003b5b1; -lld_adv_ext_chain_construct = 0x0003bdc5; -lld_adv_frm_skip_isr = 0x0003cd81; -lld_adv_pkt_rx = 0x0003cf49; -lld_adv_scan_rsp_data_set = 0x0003daa1; -lld_adv_start_func = 0x0003dc09; -lld_bi_frm_cbk = 0x0003f1a1; -lld_calc_aux_rx = 0x000416a9; -lld_ch_map_upd_cfm_handler = 0x000418c9; -lld_ci_frm_cbk = 0x000421e5; -lld_con_activity_offset_compute = 0x0004474d; -lld_con_cleanup = 0x000448bd; -lld_con_clear_ccmcnt_rx = 0x000449f5; -lld_con_clear_ccmcnt_tx = 0x00044a11; -lld_con_data_flow_set = 0x00044aa5; -lld_con_enc_key_load = 0x00044e01; -lld_con_event_counter_get = 0x00044ec1; -lld_con_frm_cbk_func = 0x00045021; -lld_con_evt_time_update_func = 0x000455cd; -lld_con_max_lat_calc = 0x00045c29; -lld_con_offset_get = 0x00045d11; -lld_con_offset_upd_ind_handler = 0x00045da1; -lld_con_param_upd_cfm_handler = 0x00045e6d; -lld_con_param_update = 0x00045f2d; -lld_con_rx_enc = 0x00046605; -lld_con_start_func = 0x00046add; -lld_con_tx_enc = 0x00047239; -lld_con_tx_len_update_for_intv = 0x0004739d; -lld_init_compute_winoffset = 0x00047b21; -lld_init_connect_req_pack = 0x00047b6d; -lld_init_evt_canceled_cbk = 0x0004800d; -lld_init_evt_start_cbk = 0x00048105; -lld_init_func = 0x0004851d; -lld_instant_proc_end = 0x00049805; -lld_iso_hop_accel_isr = 0x00049915; -lld_llcp_rx_ind_handler = 0x00049a6d; -lld_llcp_tx_cfm_handler = 0x00049c95; -lld_phy_upd_cfm_handler = 0x0004b67d; -lld_ral_search = 0x0004b6bd; -lld_read_clock = 0x0004b71d; -lld_res_list_is_empty = 0x0004b901; -lld_rxdesc_check = 0x0004bcd1; -lld_rxdesc_free = 0x0004bd05; -lld_scan_end = 0x0004bddd; -lld_scan_evt_start_cbk = 0x0004c07d; -lld_scan_frm_eof_isr = 0x0004c205; -lld_scan_frm_rx_isr = 0x0004c339; -lld_scan_frm_skip_isr = 0x0004c3a5; -lld_scan_get_adv_data_len = 0x0004c4d5; -lld_scan_params_update = 0x0004c561; -lld_scan_sched_func = 0x0004d165; -lld_scan_start_func = 0x0004d561; -lld_scan_stop = 0x0004dab1; -lld_scan_sync_accept = 0x0004db35; -lld_scan_sync_info_unpack = 0x0004dc49; -lld_scan_trunc_ind = 0x0004dcd5; -lld_supervision_to_cb = 0x0004dd49; -lld_sync_cleanup = 0x0004dddd; -lld_sync_frm_eof_isr = 0x0004e00d; -lld_sync_frm_rx_isr = 0x0004e10d; -lld_sync_frm_skip_isr = 0x0004e175; -lld_sync_trunc_ind = 0x0004ef79; -lld_test_cleanup = 0x0004efa5; -lld_test_frm_cbk = 0x0004f1b1; -lld_test_frm_isr = 0x0004f1f5; -lld_test_rx_isr = 0x0004f2d9; -lld_test_start = 0x0004f319; -lld_white_list_add = 0x0004f795; -lld_white_list_rem = 0x0004f831; -llm_activity_free_get = 0x00051569; -llm_cmd_cmp_send = 0x00051ba9; -llm_cmd_stat_send = 0x00051bc5; -llm_dev_list_empty_entry = 0x00051be1; -llm_dev_list_search = 0x00051c05; -llm_is_dev_connected = 0x00051f25; -llm_is_wl_empty = 0x0005204d; -llm_le_evt_mask_check = 0x00052189; -llm_rx_path_comp_get = 0x00052391; -llm_scan_start = 0x000523e5; -llm_update_dbg_act_state_info = 0x00052575; -prevent_sleep_get = 0x00052a65; -qspi_config = 0x000531b5; -qspi_send_inst_addr = 0x00053475; -qspi_wait_flag_state_until_timeout = 0x00053545; -register_config_1M_tx_gain_value = 0x00053601; -register_config_2M_tx_gain_value = 0x0005360d; -register_config_coded_tx_gain_value = 0x00053619; -register_rwip_us_2_lpcycles = 0x00053695; -register_rwip_wakeup = 0x000536a1; -register_rwip_wakeup_end = 0x000536ad; -rwble_init = 0x000537c5; -rwble_recovery = 0x00053879; -rwip_active_check = 0x000538f9; -rwip_crypt_isr_handler = 0x000539dd; -rwip_isr = 0x00053b61; -rwip_prevent_sleep_clear = 0x00053dad; -rwip_prevent_sleep_set = 0x00053ddd; -rwip_sw_int_handler = 0x00054309; -rwip_sw_int_req = 0x00054319; -rwip_time_get = 0x00054335; -rwip_timer_10ms_handler = 0x00054395; -rwip_timer_hs_handler = 0x00054435; -rwip_timer_hus_handler = 0x00054499; -rwip_timer_hus_set = 0x000544bd; -rwip_wakeup = 0x000545b9; -rwip_wakeup_end = 0x000546b1; -sch_alarm_clear = 0x00054771; -sch_alarm_set = 0x00054861; -sch_arb_allow_activity_notify = 0x00054995; -sch_arb_conflict_check = 0x000549b1; -sch_arb_elt_cancel = 0x00054aa5; -sch_arb_event_start_isr_func = 0x00054bc9; -sch_arb_idle_time_notify = 0x00054dd1; -sch_arb_insert_func = 0x00054e41; -sch_arb_prog_timer = 0x0005516d; -sch_arb_remove = 0x00055269; -sch_arb_sched_act_margin = 0x00055321; -sch_plan_chk = 0x0005546d; -sch_plan_req = 0x0005592d; -sch_prog_convert_cs_idx_to_handle = 0x00055ba9; -sch_prog_end_isr = 0x00055bb9; -sch_prog_rx_iso_isr = 0x00056295; -sch_prog_rx_isr = 0x00056309; -sch_prog_skip_isr = 0x000563dd; -sch_prog_tx_iso_isr = 0x00056561; -sch_prog_tx_isr = 0x000565d5; -sch_slice_bg_add = 0x000566a9; -set_master_gclk = 0x00056931; -smpc_generate_stk = 0x000586a9; -smpc_secure_connections_enabled = 0x0005aaf9; -smpc_send_ltk_req_rsp = 0x0005abbd; -smpc_send_pairing_ind = 0x0005ac39; -smpc_tkdp_rcp_start = 0x0005b5b5; -smpc_tkdp_send_start = 0x0005b78d; -svc_get_nvds_api_entry = 0x0005be59; -svc_rwip_init = 0x0005be71; -svc_set_heaps_table_entry = 0x0005bead; -sys_signal_handler_register = 0x0005bf05; -xqspi_send_inst_addr = 0x0005c697; -xqspi_wait_flag_state_until_retry = 0x0005c801; -rom_init = 0x0005c889; -one_bits = 0x0005d0b4; -co_null_bdaddr = 0x0005d0d4; -rwip_priority = 0x0005db83; -hci_le_event_handler_tab = 0x0005dc70; -rom_gapc_msg_handler_tab = 0x0005dcf0; -gapm_hci_cmd_cmp_event_handler_tab = 0x0005de90; -gapm_hci_cmd_stat_event_handler_tab = 0x0005e010; -gapm_msg_handler_tab = 0x0005e080; -gattc_msg_handler_tab = 0x0005e424; -lld_scan_map_legacy_pdu_to_evt_type = 0x0005eba8; -pwr_mgmt_save_context = 0x00062d69; -pwr_mgmt_load_context = 0x00062d99; -pwr_mgmt_save_ctx_lvl_two = 0x00062dc9; -sdk_srand = 0x00063339; -BLESLEEP_IRQHandler_func = 0x000636c9; -BLESLP_IRQHandler = 0x000637d1; -BLE_IRQHandler = 0x000637dd; -BLE_IRQHandler_func = 0x000637e9; -BLE_SDK_Handler = 0x00063839; -SVC_handler_proc = 0x000638b5; -ble_activity_end_notify_cb_register = 0x00064dbd; -ble_activity_start_notify_cb_register = 0x00064dfd; -ble_aes_ccm = 0x00064e19; -ble_aes_cmac = 0x00064e49; -ble_aes_encrypt = 0x00064e55; -ble_aes_k1 = 0x00064e65; -ble_aes_k2 = 0x00064e79; -ble_aes_k3 = 0x00064e85; -ble_aes_k4 = 0x00064e89; -ble_aes_rand = 0x00064e8d; -ble_aes_result_handler = 0x00064e91; -ble_aes_s1 = 0x00064e95; -ble_attm_reserve_handle_range = 0x00064ea5; -ble_attm_svc_create_db = 0x00064ea9; -ble_attmdb_get_attribute = 0x00064f05; -ble_attmdb_svc_visibility_set = 0x00064f0d; -ble_attmdb_uuid16_comp = 0x00064f11; -ble_audio_callback_register = 0x00064f15; -ble_audio_event_count_read = 0x00064f25; -ble_audio_role_switch = 0x00065015; -ble_audio_sniffer_create = 0x00065131; -ble_audio_sync_info_send = 0x00065225; -ble_audio_time_sync = 0x000652b9; -ble_bm_clear_bond_devs = 0x00065501; -ble_bm_del_bond_dev = 0x000655f1; -ble_bm_get_bond_devs = 0x00065749; -ble_bm_get_gatt_info = 0x000657a5; -ble_bm_get_ral_dev_list = 0x00065825; -ble_bm_get_sec_info = 0x000658b9; -ble_bm_get_sec_info_by_peer_irk = 0x000658ed; -ble_bm_init = 0x0006596d; -ble_bm_set_gatt_info = 0x00065a49; -ble_client_prf_add = 0x00065b29; -ble_co_list_extract = 0x00065c29; -ble_co_list_init = 0x00065c2d; -ble_co_list_insert_before = 0x00065c31; -ble_co_list_pop_front = 0x00065c35; -ble_co_list_push_back = 0x00065c39; -ble_co_list_push_back_sublist = 0x00065c3d; -ble_co_list_push_front = 0x00065c41; -ble_co_util_pack = 0x00065c45; -ble_co_util_unpack = 0x00065c51; -ble_core_is_powered_on = 0x00065c5d; -ble_core_sleep_func = 0x00065cd1; -ble_env_get = 0x00065f97; -ble_gap_active_link_set = 0x00065f9d; -ble_gap_addr_get = 0x00065fb1; -ble_gap_adv_data_set = 0x00066121; -ble_gap_adv_param_set = 0x00066231; -ble_gap_adv_start = 0x0006647d; -ble_gap_adv_stop = 0x00066695; -ble_gap_appearance_get = 0x00066729; -ble_gap_appearance_set = 0x00066779; -ble_gap_bond_devs_get = 0x0006689d; -ble_gap_callback_register = 0x000668f1; -ble_gap_chnl_map_set = 0x00066909; -ble_gap_con_plan_consult = 0x000669ad; -ble_gap_conn_info_get = 0x00066a05; -ble_gap_conn_param_update = 0x00066ac5; -ble_gap_conn_param_update_reply = 0x00066ba9; -ble_gap_connect_cancel = 0x00066d51; -ble_gap_data_length_set = 0x00066dad; -ble_gap_data_length_update = 0x00066e21; -ble_gap_default_tx_power_get = 0x00066ec1; -ble_gap_default_tx_power_set = 0x00066ec5; -ble_gap_dev_info_get = 0x00066ec9; -ble_gap_device_name_get = 0x00066f91; -ble_gap_device_name_set = 0x00067021; -ble_gap_disconnect = 0x000670c5; -ble_gap_ext_adv_param_set = 0x00067149; -ble_gap_ext_connect = 0x00067429; -ble_gap_ext_scan_param_set = 0x00067561; -ble_gap_irk_set = 0x00067621; -ble_gap_l2cap_params_set = 0x00067689; -ble_gap_latency_set = 0x00067709; -ble_gap_lepsm_register = 0x0006771d; -ble_gap_lepsm_unregister = 0x000678a1; -ble_gap_pair_enable = 0x00067941; -ble_gap_path_compensation_set = 0x00067999; -ble_gap_peer_info_get = 0x000679ed; -ble_gap_per_adv_list_add = 0x00067aa1; -ble_gap_per_adv_list_clear = 0x00067bc1; -ble_gap_per_adv_list_del = 0x00067c25; -ble_gap_per_adv_list_get = 0x00067d09; -ble_gap_per_sync_param_set = 0x00067d8d; -ble_gap_per_sync_start = 0x00067e85; -ble_gap_per_sync_stop = 0x00067f51; -ble_gap_phy_update = 0x00067ff5; -ble_gap_ppcp_get = 0x00068099; -ble_gap_ppcp_present_set = 0x000680f5; -ble_gap_ppcp_set = 0x00068159; -ble_gap_pref_phy_set = 0x000681b5; -ble_gap_privacy_mode_set = 0x00068209; -ble_gap_privacy_params_set = 0x0006828d; -ble_gap_role_set = 0x00068375; -ble_gap_rpa_list_get = 0x000683c1; -ble_gap_rslv_addr_read = 0x00068415; -ble_gap_scan_param_set = 0x000684b5; -ble_gap_scan_start = 0x0006859d; -ble_gap_scan_stop = 0x00068629; -ble_gap_set_ral_list = 0x000686ad; -ble_gap_static_random_addr_set = 0x00068789; -ble_gap_tx_power_get = 0x00068841; -ble_gap_tx_power_set = 0x00068919; -ble_gap_update_adv_data = 0x00068a01; -ble_gap_whitelist_add = 0x00068abd; -ble_gap_whitelist_clear = 0x00068bf1; -ble_gap_whitelist_del = 0x00068c55; -ble_gap_whitelist_get = 0x00068d3d; -ble_gapc_auth_get = 0x00068dc1; -ble_gapc_role_get = 0x00068dd5; -ble_gapm_bdaddr_get = 0x00068ddd; -ble_gatt_common_callback_register = 0x00068e2d; -ble_gatt_init = 0x00068e7d; -ble_gatt_mtu_get_rom = 0x00068ec5; -ble_gatt_mtu_set = 0x00068f25; -ble_gattc_callback_register = 0x00068f7d; -ble_gattc_char_desc_discover_rom = 0x00068f91; -ble_gattc_char_discover_rom = 0x00068f9b; -ble_gattc_get_mtu = 0x00068fa7; -ble_gattc_included_services_discover_rom = 0x00068fab; -ble_gattc_indicate_cfm_rom = 0x00068fb5; -ble_gattc_mtu_exchange_rom = 0x00069029; -ble_gattc_prf_char_desc_discover_rom = 0x0006909d; -ble_gattc_prf_char_discover_rom = 0x0006913d; -ble_gattc_prf_evt_handle_register_rom = 0x00069215; -ble_gattc_prf_evt_handle_unregister_rom = 0x0006921b; -ble_gattc_prf_included_services_discover_rom = 0x00069221; -ble_gattc_prf_indicate_cfm_rom = 0x000692c1; -ble_gattc_prf_primary_services_discover_rom = 0x00069349; -ble_gattc_prf_read_rom = 0x0006940d; -ble_gattc_prf_read_by_uuid_rom = 0x000694a9; -ble_gattc_prf_read_multiple_rom = 0x00069581; -ble_gattc_prf_services_browse_rom = 0x00069625; -ble_gattc_prf_write_rom = 0x000696e9; -ble_gattc_prf_write_execute_rom = 0x000697cd; -ble_gattc_prf_write_no_resp_rom = 0x00069859; -ble_gattc_prf_write_prepare_rom = 0x000698f9; -ble_gattc_primary_services_discover_rom = 0x000699b9; -ble_gattc_read_rom = 0x00069a6d; -ble_gattc_read_by_uuid_rom = 0x00069af5; -ble_gattc_read_multiple_rom = 0x00069bb1; -ble_gattc_services_browse_rom = 0x00069c49; -ble_gattc_write_rom = 0x00069d05; -ble_gattc_write_execute_rom = 0x00069ddd; -ble_gattc_write_no_resp_rom = 0x00069e55; -ble_gattc_write_prepare_rom = 0x00069edd; -ble_gattm_svc_start_hdl_get = 0x00069f8d; -ble_gatts_attr_permission_get = 0x00069f91; -ble_gatts_attr_permission_set = 0x0006a09d; -ble_gatts_noti_ind_rom = 0x0006a10d; -ble_gatts_prepare_write_cfm_rom = 0x0006a271; -ble_gatts_read_cfm_rom = 0x0006a399; -ble_gatts_service_changed = 0x0006a4e9; -ble_gatts_srvc_db_create = 0x0006a555; -ble_gatts_value_get = 0x0006a861; -ble_gatts_value_set = 0x0006a90d; -ble_gatts_write_cfm_rom = 0x0006a971; -ble_h4tl_stop = 0x0006aa8d; -bl1_hci_uart_register = 0x0006aaa9; -ble_idle_time_notify_cb_register = 0x0006aab1; -ble_init_cmp_callback_register = 0x0006aad1; -ble_iso_accept_cis_req = 0x0006ab01; -ble_iso_create_big = 0x0006abdd; -ble_iso_create_big_sync = 0x0006acd5; -ble_iso_create_cis = 0x0006ade1; -ble_iso_disc_cis = 0x0006af01; -ble_iso_discover_ann = 0x0006af5d; -ble_iso_get_core_bts = 0x0006afe9; -ble_iso_read_tx_sync = 0x0006afed; -ble_iso_reg_rcv_data_cb = 0x0006aff1; -ble_iso_register_ascp_gap_callback = 0x0006b007; -ble_iso_register_callback = 0x0006b00d; -ble_iso_reject_cis_req = 0x0006b021; -ble_iso_req_peer_sca = 0x0006b089; -ble_iso_rm_cig = 0x0006b105; -ble_iso_rm_data_path = 0x0006b171; -ble_iso_send_data = 0x0006b1ed; -ble_iso_set_cig_param = 0x0006b231; -ble_iso_set_data_path = 0x0006b41d; -ble_iso_start_bd_ann = 0x0006b49d; -ble_iso_start_gen_ann = 0x0006b569; -ble_iso_start_target_ann = 0x0006b619; -ble_iso_stop_ann = 0x0006b6fd; -ble_iso_stop_discover_ann = 0x0006b709; -ble_iso_stop_sync_bd_ann = 0x0006b70d; -ble_iso_sync_bd_ann = 0x0006b711; -ble_iso_terminate_big = 0x0006b7e1; -ble_iso_terminate_big_sync = 0x0006b851; -ble_ke_event_callback_set = 0x0006b8d9; -ble_ke_event_clear = 0x0006b8dd; -ble_ke_event_set = 0x0006b8e1; -ble_ke_free = 0x0006b8e5; -ble_ke_malloc = 0x0006b8e9; -ble_ke_msg_alloc = 0x0006b935; -ble_ke_msg_forward = 0x0006b9b9; -ble_ke_msg_free = 0x0006b9bd; -ble_ke_msg_send = 0x0006b9c1; -ble_ke_state_set = 0x0006b9c5; -ble_ke_task_create = 0x0006b9c9; -ble_ke_time = 0x0006b9cd; -ble_l2cap_lecb_cb_register = 0x0006b9d1; -ble_l2cap_lecb_conn_cfm = 0x0006bb3d; -ble_l2cap_lecb_conn_create = 0x0006bc8d; -ble_l2cap_lecb_credits_add = 0x0006be85; -ble_l2cap_lecb_disconnect = 0x0006bf9d; -ble_l2cap_lecb_sdu_send = 0x0006c069; -ble_mesh_prf_cbs_register = 0x0006c205; -ble_nvds_get = 0x0006c215; -ble_nvds_initialized = 0x0006c241; -ble_prf_env_get = 0x0006c27d; -ble_prf_get_id_from_task = 0x0006c341; -ble_prf_src_task_get = 0x0006c34d; -ble_prf_task_env_get = 0x0006c351; -ble_rf_calibration_func_cb_register = 0x0006c355; -ble_rf_match_circuit_get = 0x0006c371; -ble_rf_match_circuit_set = 0x0006c375; -ble_rf_tx_mode_get = 0x0006c379; -ble_rf_tx_mode_set = 0x0006c37d; -ble_rom_prf_init = 0x0006c3ad; -ble_rwip_reset = 0x0006c3b1; -ble_rwip_time_get = 0x0006c3b5; -ble_rwip_wakeup = 0x0006c3b9; -ble_rwip_wakeup_end = 0x0006c465; -ble_sch_alarm_clear = 0x0006c511; -ble_sch_alarm_prog = 0x0006c515; -ble_sch_alarm_set = 0x0006c519; -ble_schedule_start = 0x0006c51d; -ble_sdk_adap_config_get = 0x0006c529; -ble_sdk_common_timeout_handler = 0x0006c6ad; -ble_sdk_core_reinit = 0x0006c6e5; -ble_sdk_init_func = 0x0006dbe5; -ble_sdk_iso_init = 0x0006dfcd; -ble_sdk_l2cap_init = 0x0006e09d; -ble_sdk_prf_init = 0x0006e0b9; -ble_sdk_rf_init = 0x0006e101; -ble_sdk_rf_wakeup_init = 0x0006e121; -ble_sdk_schedule = 0x0006e1a1; -ble_sdk_sec_init = 0x0006e1a5; -ble_sec_callback_register = 0x0006e235; -ble_sec_enc_cfm = 0x0006e249; -ble_sec_keypress_notify_send = 0x0006e429; -ble_sec_params_set = 0x0006e4ad; -ble_server_prf_add = 0x0006e569; -ble_stack_debug_setup = 0x0006e67d; -ble_wait_for_bleslpstat_signal = 0x0006e831; -calc_checksum = 0x0006e8a9; -calculate_hmac = 0x0006e8c0; -config_1M_tx_gain_value = 0x0006ed25; -config_2M_tx_gain_value = 0x0006ed45; -config_coded_tx_gain_value = 0x0006ed65; -cp_hdr_incr = 0x0006ed9d; -dec_flash_read = 0x0006edbd; -dec_flash_write = 0x0006edf1; -dfu_ble_receive_data_process = 0x0006ef31; -dfu_ble_send_data_cmpl_process = 0x0006ef59; -dfu_ble_set_mtu_size = 0x0006ef95; -dfu_cmd_disable_config = 0x0006f011; -dfu_cmd_parse_state_reset = 0x0006f15d; -dfu_copy_flash_process = 0x0006f235; -dfu_flash_erase = 0x0006f42d; -dfu_flash_get_security = 0x0006f4b5; -dfu_flash_read = 0x0006f535; -dfu_flash_set_security = 0x0006f569; -dfu_flash_type_set = 0x0006f581; -dfu_flash_update = 0x0006f5a5; -dfu_flash_write = 0x0006f675; -dfu_init = 0x0006f6a9; -dfu_port_flash_init = 0x0006f71d; -dfu_program_end = 0x0006f919; -dfu_reset_device = 0x0006fa2d; -dfu_schedule = 0x0006fa3d; -dfu_security_check_enable = 0x0006fa4d; -dfu_send_frame = 0x0006faed; -dfu_set_cmd_handler = 0x0006fb69; -dfu_spi_flash_func_config = 0x0006fbf1; -dfu_start_jump = 0x0006fc5d; -dfu_uart_receive_data_process = 0x0006fe75; -find_item = 0x000700bd; -find_peer_addr = 0x00070141; -find_unused_bond_idx = 0x000701c9; -fpb_init = 0x00070229; -fpb_load_state = 0x00070281; -fpb_register_patch_init_func = 0x000702e1; -fpb_save_state = 0x000702ed; -gap_activity_opera_end = 0x00070479; -gap_activity_opera_start = 0x000705a5; -gap_bm_error_to_sdk_error = 0x00071049; -gap_cache_data_get = 0x0007106d; -gap_cache_data_init = 0x00071079; -gap_cache_data_save = 0x00071095; -gap_check_modify_bondlist = 0x00071159; -gap_create_initiating = 0x000719c5; -gap_delete_initiating = 0x00071da1; -gap_get_actv_type_by_actv_idx = 0x0007265d; -gap_get_adv_idx_by_actv_idx = 0x0007269d; -gap_get_per_sync_idx_by_actv_idx = 0x00072761; -gap_reset = 0x00073079; -gap_reslv_addr = 0x00073105; -gap_set_device_config = 0x000736d5; -gap_start_initiating = 0x00073b45; -gap_stop_initiating = 0x00073de9; -gapm_cmp_evt_handler = 0x00074235; -gatt_add_bond_cccd = 0x0007475d; -gatt_clear_cccd = 0x000748e5; -gatt_on_connection = 0x00074ccf; -gatt_on_disconnection = 0x00074dd9; -gatt_recovery_cccd = 0x00074e95; -gattc_on_connection = 0x000754d9; -gattc_on_disconnection = 0x00075509; -get_F_value = 0x00075745; -get_align_bytes = 0x000757b9; -get_conn_idx_by_hdl = 0x00075825; -get_msg_handler_func = 0x00075aa5; -get_rf_api = 0x00075bc9; -get_system_config_info = 0x00075c51; -hal_efuse_deinit = 0x00075d4d; -hal_efuse_init = 0x00075d65; -hal_flash_get_info = 0x00075ded; -hal_flash_get_security = 0x00075e05; -hal_flash_sector_size = 0x00075e99; -hal_flash_set_security = 0x00075ea1; -mesh_init_callback_register = 0x00077569; -mesh_prf_config = 0x000775c1; -nvds_del = 0x0007760d; -nvds_get = 0x000776f5; -nvds_get_start_addr = 0x00077839; -nvds_init = 0x00077845; -nvds_tag_length = 0x00077a7d; -operate_nvds = 0x00077bd1; -operate_system_info = 0x00077d35; -prf_get_prf_cb_by_task_id = 0x00078221; -pwr_mgmt_baseband_state_get = 0x00078739; -pwr_mgmt_check_ble_event = 0x00078791; -pwr_mgmt_check_ble_timer = 0x000787ad; -pwr_mgmt_check_pend_irq = 0x000788e1; -pwr_mgmt_dev_init = 0x00078905; -pwr_mgmt_dev_resume = 0x00078915; -pwr_mgmt_dev_suspend = 0x00078925; -pwr_mgmt_force_wakeup_ble_done = 0x00078971; -pwr_mgmt_get_counter_A_B = 0x00078985; -pwr_mgmt_get_sleep_mode = 0x000789b9; -pwr_mgmt_get_wakeup_flag = 0x00078af1; -pwr_mgmt_init = 0x00078b05; -pwr_mgmt_locker = 0x00078c41; -pwr_mgmt_mem_check_process_reg = 0x00078c4d; -pwr_mgmt_mode_get = 0x00078c59; -pwr_mgmt_mode_set = 0x00078c65; -pwr_mgmt_notify_timer_event = 0x00078c7d; -pwr_mgmt_rtc_timer_thrd_set = 0x00078c95; -pwr_mgmt_set_callback = 0x00078dc9; -pwr_mgmt_set_wakeup_flag = 0x00078dd5; -pwr_mgmt_shutdown = 0x00078ded; -pwr_mgmt_sleep_param_get = 0x00078e85; -pwr_mgmt_unlocker = 0x00078fed; -pwr_mgmt_update_wkup_param = 0x00078ff5; -pwr_mgmt_wakeup_source_clear = 0x000790dd; -pwr_mgmt_wakeup_source_setup = 0x000790f1; -pwr_mgmt_wfe_sleep = 0x00079105; -read_incr = 0x00079395; -restore_sys_context = 0x000794f5; -rf_SX_Enable = 0x00079559; -rf_SX_Tune = 0x000795a5; -rf_SX_reset = 0x00079601; -rf_agc_init = 0x0007963d; -rf_api_init = 0x00079659; -rf_communication_core_init = 0x000796f5; -rf_em_init = 0x000797f1; -rf_freq_table_init = 0x00079809; -rf_get_recalibration_flag = 0x00079939; -rf_init = 0x00079945; -rf_mat_cir_get = 0x00079979; -rf_misc_init = 0x00079991; -rf_modulation_accuracy_calibration = 0x00079a05; -rf_recalibrate = 0x00079b79; -rf_recalibration_handler_register = 0x00079ba1; -rf_set_recalibration_flag = 0x00079bed; -rf_trim_calibration = 0x00079c1d; -rf_tx_mode_get = 0x00079c59; -rom_simu = 0x00079e1d; -rwip_lpcycles_2_hus = 0x00079ec5; -rwip_prevent_sleep_get = 0x00079efd; -rwip_us_2_lpcycles = 0x00079f11; -save_context_and_enter_sleep = 0x00079f35; -sdk_blecore_postsleep_task = 0x00079f57; -sdk_blecore_presleep_task = 0x00079f71; -sdk_register_assert_cb = 0x0007a02d; -sdk_timer_init = 0x0007a1f1; -sec_build_rand16 = 0x0007a251; -sec_clear_bond_info_env = 0x0007a2f9; -sec_enc_link = 0x0007a341; -sec_get_bond_dev_addr = 0x0007a37d; -sec_on_conn_complete = 0x0007a3b9; -sec_on_disconn = 0x0007a4e9; -sec_send_pair_req = 0x0007ae21; -sec_send_security_req = 0x0007ae51; -set_comm_wkup_time = 0x0007af95; -set_sdk_schedule_event = 0x0007afed; -svc_func_register = 0x0007b759; -svc_table_register = 0x0007b79d; -sys_assert_cb_register = 0x0007b879; -sys_ble_heartbeat_period_set = 0x0007b94d; -sys_ble_timer_10ms_handler = 0x0007b95d; -sys_ble_timer_hs_handler = 0x0007b961; -sys_ble_timer_hus_handler = 0x0007b965; -sys_context_save = 0x0007b985; -sys_context_save_register = 0x0007bb65; -sys_delay_ms = 0x0007bbf5; -sys_delay_us = 0x0007bbff; -sys_first_regs_save = 0x0007bd5d; -sys_free = 0x0007bd79; -sys_get_heap_info = 0x0007bd9b; -sys_ke_sleep_check = 0x0007bdab; -sys_ke_timer_clear = 0x0007bdb7; -sys_ke_timer_set = 0x0007bdbb; -sys_link_quality_clear = 0x0007bdc1; -sys_link_quality_get = 0x0007bde1; -sys_lpclk_get = 0x0007be15; -sys_lpclk_set = 0x0007be21; -sys_lpclk_update_func_register = 0x0007be3d; -sys_lpcycles_2_hus = 0x0007be49; -sys_lpper_get = 0x0007be51; -sys_malloc = 0x0007be5d; -sys_max_msg_usage_ratio_set = 0x0007be69; -sys_prevent_sleep_clear = 0x0007bf1d; -sys_prevent_sleep_set = 0x0007bf21; -sys_security_data_use_present = 0x0007bf5d; -sys_security_enable_status_check = 0x0007bf6d; -sys_sleep_enter = 0x0007bf79; -sys_sleep_env_get = 0x0007bf7d; -sys_sleep_wakeup_end = 0x0007bf81; -sys_swd_disable = 0x0007bf85; -sys_swd_enable = 0x0007bf95; -sys_timer_clear = 0x0007bfa5; -sys_timer_set = 0x0007bfd5; -sys_us_2_lpcycles = 0x0007c059; -tags_cache_clean = 0x0007c0b5; -tags_cache_rec_del = 0x0007c109; -ultra_wfe = 0x0007c2c9; -ultra_wfi = 0x0007c345; -update_lru_bond_list = 0x0007c469; -verify_hdr_checksum = 0x0007c631; -write_compacted_items = 0x0007c671; -write_item = 0x0007c845; -default_device_name = 0x0007d388; -rom_prf_unint = 0x0007d529; -sdk_prf_unint = 0x0007d52a; -NVDS_MAGIC = 0x0007d5ac; -RF_25OHM_ULP_TX_PW_CONV_TBL = 0x0007dae8; -RF_100OHM_LP_TX_PW_CONV_TBL = 0x0007db28; -RF_100OHM_ULP_TX_PW_CONV_TBL = 0x0007db7c; -bl0_boot_info = 0x00800000; -hci_cmd_handler_tab_info = 0x00800270; -llm_hci_cmd_handler_tab_info = 0x00800298; -TASK_DESC_GAPC = 0x008002c0; -TASK_DESC_GAPM = 0x008002cc; -TASK_DESC_GATTC = 0x008002d8; -TASK_DESC_L2CC = 0x008002f0; -TASK_DESC_LLC = 0x008002fc; -llcp_pdu_handler = 0x00800320; -diag_shutdown_func = 0x0080035c; -p_adc_callback = 0x00800364; -p_aes_callback = 0x00800368; -p_efuse_callback = 0x00800384; -p_rng_callback = 0x008003ac; -rwip_prog_delay = 0x008003d2; -gapc_auth_get = 0x008003e0; -gapm_send_complete_evt = 0x008003ec; -gapm_init_connection_ind = 0x008004c8; -gapm_hci_le_event_handler_tab_info = 0x008004d8; -gapm_hci_cmd_stat_event_handler_tab_info = 0x008004e0; -gapm_hci_cmd_cmp_event_handler_tab_info = 0x008004e8; -rom_callback = 0x00800500; -smpc_handle_enc_change_evt = 0x00800514; -atts_pdu_handler_info = 0x0080057c; -l2cc_data_send = 0x00800598; -llc_loc_con_upd_proc_continue = 0x008005d0; -llc_rem_con_upd_proc_continue = 0x008005d4; -llc_pref_param_compute = 0x008005d8; -llc_rem_encrypt_proc_continue = 0x008005e0; -g_bqb_test_en = 0x008005e4; -llc_rem_phy_upd_proc_continue = 0x008005ec; -llc_loc_phy_upd_proc_continue = 0x008005f0; -lld_exp_sync_pos_tab = 0x00800604; -lld_init = 0x0080060c; -lld_adv_frm_cbk = 0x00800614; -lld_adv_start = 0x00800618; -g_lld_con_heap_used_ratio_limit = 0x0080061e; -lld_con_frm_cbk = 0x00800624; -lld_con_tx_prog = 0x00800628; -lld_con_evt_time_update = 0x0080062c; -lld_con_sched = 0x00800630; -lld_con_start = 0x00800634; -g_master_chsel_2_supported = 0x00800638; -lld_init_frm_cbk = 0x0080063c; -lld_init_env = 0x00800644; -lld_init_start = 0x00800648; -g_scan_watch_period_hs = 0x00800654; -lld_scan_frm_cbk = 0x00800658; -lld_scan_sched = 0x0080065c; -lld_scan_env = 0x00800660; -__lld_sync_env = 0x00800664; -lld_scan_start = 0x00800668; -lld_sync_sched = 0x0080066c; -lld_sync_frm_cbk = 0x00800670; -lld_test_env = 0x0080067c; -g_max_con_intv = 0x00800680; -g_max_con_sup_to = 0x00800682; -scan_host_params = 0x00800692; -hci_ext_host = 0x008006a3; -g_sch_arb_pick_limit = 0x008006ac; -g_sch_arb_insert_run_hus = 0x008006ae; -g_sch_arb_prog_delay_hus = 0x008006b0; -g_rsvd_before_abort_hus = 0x008006b2; -g_evt_start_cbk_run_hus = 0x008006b4; -g_max_evt_start_cbk_run_hus = 0x008006b6; -g_min_evt_start_cbk_run_hus = 0x008006b8; -g_max_evt_start_rsvd_hus = 0x008006ba; -g_min_evt_start_rsvd_hus = 0x008006bc; -diag_evt_start_cbk_start_func = 0x008006c0; -diag_evt_start_cbk_done_func = 0x008006c4; -ble_activity_start_notify_func = 0x008006cc; -sch_arb_insert = 0x008006d4; -sch_arb_event_start_isr = 0x008006d8; -g_bb_watch_period_times = 0x008006e4; -g_et_correct_cnt = 0x008006e6; -g_bb_crush_wa_cnt = 0x008006e8; -g_prefetch_wa_cnt = 0x008006ea; -g_debug_push_cnt = 0x008006ec; -g_bb_watch_period_hs = 0x008006f0; -ble_activity_end_notify_func = 0x008006f8; -ble_rf_calibration_func = 0x008006fc; -bb_watch_timer_cbk = 0x00800700; -bb_watch_timer_start = 0x00800704; -sch_prog_push = 0x00800708; -sch_prog_activity_isr = 0x0080070c; -sch_slice_params = 0x00800710; -restore_sys_env_callback = 0x0080076c; -sw_to_hw = 0x00800808; -h4tl_env = 0x0080095c; -ke_env = 0x00800990; -rwip_rf = 0x00800bbc; -g_dbg_rwip_info = 0x00800c40; -gapc_env = 0x00800dcc; -gapm_env = 0x00800e00; -gattc_env = 0x00800ec4; -l2cc_env = 0x00800f18; -l2cm_env = 0x00800f4c; -ble_util_buf_env = 0x00800f58; -llc_env = 0x00801238; -lld_env = 0x00801274; -lld_adv_env = 0x00801384; -lld_con_env = 0x008013b4; -lld_sync_rx_info = 0x00801414; -lld_sync_env = 0x00801474; -llm_env = 0x008014a4; -hci_env = 0x00801950; -sch_arb_env = 0x008019b4; -g_bb_watch_alarm = 0x00801ab4; -sch_prog_env = 0x00801ac0; -sch_alarm_env = 0x00801c34; -bl1_boot_info = 0x00801f10; -g_xqspi_handle = 0x00801f28; -g_exflash_handle = 0x00801f64; -func_env = 0x00801f84; -g_gap_cb_fun = 0x00802198; -gapc_msg_handler_desc = 0x00802200; -set_privacy_mode_flag = 0x00802208; -add_whitelist_bong_flag = 0x00802209; -gap_device_config_params_init = 0x0080220c; -gap_adv_fsm_next = 0x00802210; -gap_scan_fsm_next = 0x00802214; -gap_init_fsm_next = 0x00802218; -gap_per_sync_fsm_next = 0x0080221c; -actv_state_str = 0x00802228; -gap_actv_type_str = 0x00802268; -gapm_msg_handler_desc = 0x00802298; -l2cap_lecb_msg_handler_desc = 0x008022a8; -ble_sdk_gattc_cb_env = 0x008022b4; -gatt_msg_handler_desc = 0x008022bc; -gatt_on_disconnection_fp = 0x008022d8; -gatt_items = 0x008022dc; -gatt_on_connection_fp = 0x008022e4; -prf_default_msg_handler_tab = 0x00802308; -g_bond_num = 0x00802338; -bonds = 0x0080233c; -default_sdk_adapt_present = 0x00802344; -ble_sdk_init = 0x00802348; -TASK_DESC_SDK = 0x00802354; -diag_ble_isr_start_func = 0x00802364; -diag_ble_isr_done_func = 0x00802368; -rf_init_callback = 0x00802378; -rf_wakeup_init_callback = 0x0080237c; -ble_irq_handler = 0x00802380; -efuse_config = 0x00802384; -ble_sdk_handler = 0x0080239c; -m_nvds_initialized = 0x008023c8; -m_encryption_enabled = 0x008023c9; -m_nvds_start_addr = 0x008023cc; -m_nvds_end_addr = 0x008023d0; -g_connection_num = 0x008023e4; -g_bond_list = 0x008023e8; -g_sec_cb_fun = 0x008023ec; -g_sec_param = 0x008023f0; -g_rf_tx_power_level_max = 0x008023f8; -g_rf_tx_power_dbm_default = 0x008023fa; -g_b_rf_bqb_test_enable = 0x008023fb; -tx_power_offset = 0x00802400; -g_b_merge_slp_wakeup = 0x00802444; -g_sleep_complement_us = 0x00802446; -g_merge_threshold_us = 0x00802448; -update_lpclk = 0x0080244c; -g_lpclkper = 0x00802454; -diag_ble_core_sleep_status_func = 0x00802458; -diag_ble_core_sleep_break_func = 0x0080245c; -diag_no25_isr_start_func = 0x00802460; -diag_no25_isr_done_func = 0x00802464; -ble_sleep_irq_handler = 0x00802468; -g_sleep_param_cfg = 0x0080246c; -g_lpcalibcyclecount = 0x0080247c; -ble_core_sleep = 0x00802480; -xip_copy_flag = 0x00802485; -file_size = 0x00802488; -all_check_sum = 0x00802490; -cmd_receive_flag = 0x00802548; -FLASH_OP_START_ADDR = 0x0080256c; -s_is_need_to_care_about_app_timer = 0x00802674; -s_sys_clk = 0x00802675; -s_pwr_mgmt_table = 0x0080267c; -local_mem_pwr_mgmt_check_proc = 0x00802680; -pwr_mgmt_status_chk_func = 0x00802684; -pwr_mgmt_sched_ret_func = 0x00802688; -pwr_mgmt_before_enter_sleep_fun = 0x0080268c; -pwr_mgmt_device_state_check = 0x00802690; -p_func_shutdown = 0x008026a0; -ultra_wfe_is_allowed = 0x008026a4; -ultra_wfi_or_wfe = 0x008026a8; -g_msp_context_bl = 0x008026ac; -pwr_mgmt_var_box = 0x008026b0; -g_sleep_env = 0x008026bc; -g_conn_cmp_info = 0x00802718; -sdk_gapc_env = 0x0080272a; -sdk_gap_env = 0x0080277c; -efuse_trim = 0x00803212; -m_nvds_mgr = 0x008032d8; -HP_Gain_1M = 0x00803414; -HP_Gain_2M = 0x0080343c; -g_ble_slp_reg = 0x00803528; -now_img_info = 0x00803588; -patch_func_table = 0x00803d64; - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/ags.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/ags.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/ags.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ags/ags.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/ams_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/ams_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/ams_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ams_c/ams_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_protocol.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_protocol.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_protocol.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ancs_c/ancs_protocol.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/ans.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/ans.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/ans.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans/ans.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/ans_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/ans_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/ans_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ans_c/ans_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/bas.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/bas.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/bas.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas/bas.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/bas_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/bas_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/bas_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bas_c/bas_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/bcs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/bcs.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/bcs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bcs/bcs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/bps.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/bps.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/bps.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/bps/bps.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_types.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_types.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_utils.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_utils.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_utils.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_prf_utils.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_srv_disc_utils.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_srv_disc_utils.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_srv_disc_utils.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/common/ble_srv_disc_utils.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/cscs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/cscs.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/cscs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cscs/cscs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/cts.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/cts.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/cts.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts/cts.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/cts_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/cts_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/cts_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/cts_c/cts_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/dis.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/dis.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/dis.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis/dis.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/dis_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/dis_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/dis_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dis_c/dis_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/dss.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/dss.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/dss.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/dss/dss.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.c deleted file mode 100644 index e966a09..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.c +++ /dev/null @@ -1,441 +0,0 @@ -/** - ******************************************************************************* - * - * @file hrs.c - * - * @brief Heart Rate Profile Sensor implementation. - * - ******************************************************************************* - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ -/* -* INCLUDE FILES -***************************************************************************************** -*/ -#include "escs.h" -#include "ble_prf_types.h" -#include "ble_prf_utils.h" -#include "utility.h" - -/* - * STRUCT DEFINE - ******************************************************************************* - */ -/**@brief EddyStone Configuration Service environment variable. */ -typedef struct { - ble_escs_init_params_t escs_init; /**< EddyStone Configuration Service initialization variables. */ - uint16_t start_hdl; /**< EddyStone Configuration Service start handle. */ -} escs_env_t; - -/* -* LOCAL FUNCTION DECLARATION -***************************************************************************************** -*/ -static sdk_err_t escs_init (void); -static sdk_err_t escs_write_att_cb (uint8_t conn_idx, const gatts_write_req_cb_t *p_param); -static sdk_err_t escs_read_att_cb (uint8_t conn_idx, const gatts_read_req_cb_t *p_param); -static void escs_gatts_cmp_cb (uint8_t conn_idx, const gatt_op_cmp_evt_t *p_param); - -/* - * LOCAL VARIABLE DEFINITIONS - ******************************************************************************* - */ -uint16_t my_escs_service_start_handle; - -/**@brief ESCS Information. */ -static escs_env_t s_escs_env; - -static const attm_desc_128_t escs_att_db[ESCSS_IDX_NB] = { - [ESEC_IDX_SVC] = {ATT_128_PRIMARY_SERVICE, READ_PERM_UNSEC, 0, 0}, - [ESCS_BROADCAST_CAP_RD_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_BROADCAST_CAP_RD_VALUE] = {BLE_UUID_ESCS_BROADCAST_CAP_CHAR, READ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), - ESEC_CAP_DEFAULT_LEN + ESCS_NUM_OF_SUPPORTED_TX_POWER}, - [ESCS_ACTIVE_SLOT_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_ACTIVE_SLOT_RW_VALUE] = {BLE_UUID_ESCS_ACTIVE_SLOT_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), 1}, - [ESCS_ADV_INTERVAL_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_ADV_INTERVAL_RW_VALUE] = {BLE_UUID_ESCS_ADV_INTERVAL_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), 2}, - [ESCS_RADIO_TX_PWR_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_RADIO_TX_PWR_RW_VALUE] = {BLE_UUID_ESCS_RADIO_TX_PWR_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), 1}, - [ESCS_ADV_TX_PWR_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_ADV_TX_PWR_RW_VALUE] = {BLE_UUID_ESCS_ADV_TX_PWR_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - TT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), 1}, - [ESCS_LOCK_STATE_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_LOCK_STATE_RW_VALUE] = {BLE_UUID_ESCS_LOCK_STATE_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), ESCS_LOCK_CODE_WRITE_LENGTH}, - [ESCS_UNLOCK_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_UNLOCK_RW_VALUE] = {BLE_UUID_ESCS_UNLOCK_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), ESCS_AES_KEY_SIZE}, - [ESCS_PUBLIC_ECDH_KEY_RD_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_PUBLIC_ECDH_KEY_RD_VALUE] = {BLE_UUID_ESCS_PUBLIC_ECDH_KEY_CHAR, READ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), ESCS_ECDH_KEY_SIZE}, - [ESCS_EID_ID_KEY_RD_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_EID_ID_KEY_RD_VALUE] = {BLE_UUID_ESCS_EID_ID_KEY_CHAR, READ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), ESCS_AES_KEY_SIZE}, - [ESCS_RW_ADV_SLOT_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_RW_ADV_SLOT_RW_VALUE] = {BLE_UUID_ESCS_RW_ADV_SLOT_CHAR, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), - ESCS_ADV_SLOT_CHAR_LENGTH_MAX}, - [ESCS_FACTORY_RESET_SET_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_FACTORY_RESET_SET_VALUE] = {BLE_UUID_ESCS_FACTORY_RESET_CHAR, WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), 1}, - [ESCS_REMAIN_CONNECTABLE_RW_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [ESCS_REMAIN_CONNECTABLE_RW_VALUE] = {BLE_UUID_ESCS_REMAIN_CONNECTABLE_CHAR, - READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET (UUID_TYPE_128), 1}, -}; - -/**@brief ESCS interface required by profile manager. */ -static ble_prf_manager_cbs_t escs_tack_cbs = { - (prf_init_func_t) escs_init, - NULL, - NULL -}; - -/**@brief ESCS GATT server Callbacks. */ -static gatts_prf_cbs_t escs_cb_func = { - escs_read_att_cb, - escs_write_att_cb, - NULL, - escs_gatts_cmp_cb, -}; - -/**@brief ESCS Information. */ -static const prf_server_info_t escs_prf_info = { - .max_connection_nb = ESCS_CONNECTION_MAX, - .manager_cbs = &escs_tack_cbs, - .gatts_prf_cbs = &escs_cb_func -}; - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -/** - ***************************************************************************************** - * @brief Initialize Immediate Alert Service and create DB in ATT. - * - * @return Error code to know if service initialization succeed or not. - ***************************************************************************************** - */ -static sdk_err_t escs_init (void) -{ - const uint8_t escs_svc_uuid[] = {EDDYSTONE_CONFIGURATION_SERVICE_UUID}; - sdk_err_t error_code = SDK_SUCCESS; - uint16_t start_hdl = 0; - gatts_create_db_t gatts_db; - - uint32_t escs_char_mask = ESCS_DEFAULT_CHAR_MASK; - - error_code = memset_s(&gatts_db, sizeof(gatts_db), 0, sizeof(gatts_db)); - if (error_code < 0) { - return error_code; - } - gatts_db.shdl = &start_hdl; - gatts_db.uuid = escs_svc_uuid; - gatts_db.attr_tab_cfg = (uint8_t *) (&escs_char_mask); - gatts_db.max_nb_attr = ESCSS_IDX_NB; - gatts_db.srvc_perm = SRVC_UUID_TYPE_SET (UUID_TYPE_128); - gatts_db.attr_tab_type = SERVICE_TABLE_TYPE_128; - gatts_db.attr_tab.attr_tab_128 = escs_att_db; - - error_code = ble_gatts_srvc_db_create (&gatts_db); - ERROR_CODE_PRINT (error_code, BLE_SUCCESS); - - if (SDK_SUCCESS == error_code) { - my_escs_service_start_handle = * (gatts_db.shdl); - } - - return error_code; -} - -/** - ***************************************************************************************** - * @brief Handles reception of the attribute info request message. - * - * @param[in] conn_idx: Connection index - * @param[in] p_param: Pointer to the parameters of the read request. - * - * @retval ::BLE_SDK_SUCCESS Send write confirm status to stack successfully. - * @retval ::BLE_SDK_ERR_BAD_PARAM Conidx is invalid or param is NULL. - * - ***************************************************************************************** - */ -static sdk_err_t escs_read_att_cb (uint8_t conn_idx, const gatts_read_req_cb_t *p_param) -{ - sdk_err_t error_code; - uint8_t handle = p_param->handle; - uint8_t tab_index = 0; - gatts_read_cfm_t cfm; - uint8_t att_data_array[ESEC_MAX_READ_LEN]; - uint32_t escs_char_mask = ESCS_DEFAULT_CHAR_MASK; - tab_index = prf_find_idx_by_handle (handle, - my_escs_service_start_handle, - ESCSS_IDX_NB, - (uint8_t *) (&escs_char_mask)); - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - cfm.value = att_data_array; - - escs_attribute_value_set (tab_index, &cfm, s_escs_env.escs_init.lock_state); - - error_code = ble_gatts_read_cfm (conn_idx, &cfm); - RETURN_IF_ERROR (error_code, BLE_SUCCESS); - - return error_code; -} - -/** - ***************************************************************************************** - * @brief Handles reception of the write request. - * - * @param[in] conn_idx: Connection index - * @param[in] p_param: Pointer to the parameters of the write request. - * - * @retval ::BLE_SDK_SUCCESS Send write confirm status to stack successfully. - * @retval ::BLE_SDK_ERR_BAD_PARAM Conidx is invalid or param is NULL. - * - ***************************************************************************************** - */ -static sdk_err_t escs_write_att_cb (uint8_t conn_idx, const gatts_write_req_cb_t *p_param) -{ - uint8_t handle = p_param->handle; - uint8_t tab_index = 0; - gatts_write_cfm_t cfm; - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - uint32_t escs_char_mask = ESCS_DEFAULT_CHAR_MASK; - - tab_index = prf_find_idx_by_handle (handle, - my_escs_service_start_handle, - ESCSS_IDX_NB, - (uint8_t *) (&escs_char_mask)); - - cfm.status = escs_attribute_value_get (tab_index, (gatts_write_req_cb_t*) p_param, s_escs_env.escs_init.lock_state); - return ble_gatts_write_cfm (conn_idx, &cfm); -} - -/** - ***************************************************************************************** - * @brief Handles reception of the complete event. - * - * @param[in] conn_idx: Connection index - * @param[in] p_param: Pointer to the parameters of the complete event. - * - ***************************************************************************************** - */ -static void escs_gatts_cmp_cb (uint8_t conn_idx, const gatt_op_cmp_evt_t *p_param) -{ -} - -/* - * GLOBAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -void esec_service_init (ble_escs_init_params_t *p_escs_init) -{ - sdk_err_t error_code; - - error_code = memcpy_s(&s_escs_env.escs_init, sizeof(ble_escs_init_params_t), - p_escs_init, sizeof(ble_escs_init_params_t)); - if (error_code < 0) { - return; - } - - error_code = ble_server_prf_add (&escs_prf_info); - ERROR_CODE_PRINT (error_code, BLE_SUCCESS); -} - -void set_beacon_locked (void) -{ - s_escs_env.escs_init.lock_state = ESCS_LOCK_STATE_LOCKED; -} - -void set_beacon_unlocked (void) -{ - s_escs_env.escs_init.lock_state = ESCS_LOCK_STATE_UNLOCKED; -} - -uint8_t es_active_slot_number_get (void) -{ - return s_escs_env.escs_init.active_slot_no; -} - -void es_active_slot_number_set (uint8_t slot_no) -{ - s_escs_env.escs_init.active_slot_no = slot_no; -} - -uint16_t es_adv_interval_get (void) -{ - if (s_escs_env.escs_init.adv_interval > APP_CONFIG_ADV_INTERVAL_MS_MAX) { - s_escs_env.escs_init.adv_interval = APP_CONFIG_ADV_INTERVAL_MS_MAX; - } else if (s_escs_env.escs_init.adv_interval < APP_CONFIG_ADV_FRAME_SPACING_MS_MIN) { - s_escs_env.escs_init.adv_interval = APP_CONFIG_ADV_FRAME_SPACING_MS_MIN; - } - - return s_escs_env.escs_init.adv_interval; -} - -void es_adv_interval_set (uint16_t adv_interval) -{ - if (adv_interval > APP_CONFIG_ADV_INTERVAL_MS_MAX) { - s_escs_env.escs_init.adv_interval = APP_CONFIG_ADV_INTERVAL_MS_MAX; - } else if (adv_interval < APP_CONFIG_ADV_FRAME_SPACING_MS_MIN) { - s_escs_env.escs_init.adv_interval = APP_CONFIG_ADV_FRAME_SPACING_MS_MIN; - } else { - s_escs_env.escs_init.adv_interval = adv_interval; - } -} - -int8_t es_slot_tx_power_get (void) -{ - uint8_t slot_no; - slot_no = es_active_slot_number_get(); - return s_escs_env.escs_init.slot_tx_power[slot_no]; -} - -void es_slot_tx_power_set (int8_t tx_power) -{ - uint8_t slot_no; - int8_t supported_tx[ESCS_NUM_OF_SUPPORTED_TX_POWER] = ESCS_SUPPORTED_TX_POWER; - int8_t tx_power_suitable_setting; - int8_t i; - uint32_t a, b; - - slot_no = es_active_slot_number_get(); - tx_power_suitable_setting = supported_tx[0]; - - if (strstr((const char*)supported_tx, (const char*)(&tx_power))) { - tx_power_suitable_setting = tx_power; - } else if (tx_power < supported_tx[0]) { - tx_power_suitable_setting = supported_tx[0]; - } else if (tx_power > supported_tx[ESCS_NUM_OF_SUPPORTED_TX_POWER - 1]) { - tx_power_suitable_setting = supported_tx[ESCS_NUM_OF_SUPPORTED_TX_POWER - 1]; - } else { - for (i = 0; i < (ESCS_NUM_OF_SUPPORTED_TX_POWER - 1); i++) { - if ((tx_power >= supported_tx[i]) && (tx_power <= supported_tx[i + 1])) { - a = ABS (tx_power - supported_tx[i]); - b = ABS (tx_power - supported_tx[i + 1]); - if (a > b) { - tx_power_suitable_setting = supported_tx[i + 1]; - } else { - tx_power_suitable_setting = supported_tx[i]; - } - break; - } - } - } - - s_escs_env.escs_init.slot_tx_power[slot_no] = tx_power_suitable_setting; -} - -int8_t es_adv_tx_power_get (void) -{ - return s_escs_env.escs_init.adv_tx_power; -} - -void es_adv_tx_power_set (int8_t adv_tx_power) -{ - s_escs_env.escs_init.adv_tx_power = adv_tx_power; -} - -void es_security_key_set (uint8_t* p_security_key, bool is_eid_write) -{ - uint8_t ret; -#if(APP_IS_EID_SUPPORTED) - if (is_eid_write) { - s_escs_env.escs_init.beacon_lock_code.k_scaler = p_security_key[ESCS_AES_KEY_SIZE]; - } -#endif // APP_IS_EID_SUPPORTED - ret = memcpy_s(s_escs_env.escs_init.beacon_lock_code.security_key, ESCS_AES_KEY_SIZE, - p_security_key, ESCS_AES_KEY_SIZE); - if (ret < 0) { - return; - } - es_nvds_lock_key_set (p_security_key); -} - -bool is_active_slot_eid (void) -{ -#if(APP_IS_EID_SUPPORTED) - return true; -#else // APP_IS_EID_SUPPORTED - return false; -#endif // APP_IS_EID_SUPPORTED -} - -void es_adv_remain_connectable_set (bool remain_connectable) -{ - s_escs_env.escs_init.remain_connectable = remain_connectable; -} - -bool es_adv_remain_connectable_get (void) -{ - return s_escs_env.escs_init.remain_connectable; -} - -void es_public_ecdh_key_get (uint8_t* p_ecdh_key_buf) -{ - uint8_t ret; -#if(APP_IS_EID_SUPPORTED) - ret = memcpy_s(p_ecdh_key_buf, ESCS_ECDH_KEY_SIZE, - s_escs_env.escs_init.eid_slot_data[s_escs_env.escs_init.active_slot_no].pub_ecdh_key, - ESCS_ECDH_KEY_SIZE); - if (ret < 0) { - return; - } -#endif // APP_IS_EID_SUPPORTED -} - -void es_public_ecdh_key_set (uint8_t* p_ecdh_key_buf) -{ - uint8_t ret; -#if(APP_IS_EID_SUPPORTED) - ret = memcpy_s(s_escs_env.escs_init.eid_slot_data[s_escs_env.escs_init.active_slot_no].pub_ecdh_key, - ESCS_ECDH_KEY_SIZE, p_ecdh_key_buf + 1, ESCS_ECDH_KEY_SIZE); - if (ret < 0) { - return; - } - s_escs_env.escs_init.eid_slot_data[s_escs_env.escs_init.active_slot_no].k_scaler = \ - p_ecdh_key_buf[ESCS_ECDH_KEY_SIZE + 1]; -#endif // APP_IS_EID_SUPPORTED -} - -bool es_beacon_has_eid_adv (void) -{ -#if(APP_IS_EID_SUPPORTED) - return true; -#endif // APP_IS_EID_SUPPORTED - return false; -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.h deleted file mode 100644 index 5ba7cdf..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/escs/escs.h +++ /dev/null @@ -1,308 +0,0 @@ -/** - ***************************************************************************************** - * - * @file escs.h - * - * @brief Eddystone Configuration Service API - * - ***************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ -/** -* @addtogroup BLE_SRV BLE Services -* @{ -* @brief Definitions and prototypes for the BLE Service interface. -*/ -/** - * @defgroup BLE_SDK_ESCS BLE Eddystone Configuration Service (ESCS) - * @{ - * @brief Eddystone Configuration Service module. - */ -#ifndef _ESCS_H_ -#define _ESCS_H_ -#include -#include -#include "es_app_config.h" -#include "es.h" -#include "ble_prf_types.h" -#include "ble_sdk_error.h" -#include "es_utility.h" -#include "es_nvds.h" -#include "es_gatts_read_write.h" - -/** - * @defgroup ESCS_ENUM Enumerations - * @{ - */ -/** @brief ESCS Service Attributes Indexes. */ -enum escs_attr_idx_t { - ESEC_IDX_SVC, - ESCS_BROADCAST_CAP_RD_CHAR, - ESCS_BROADCAST_CAP_RD_VALUE, - ESCS_ACTIVE_SLOT_RW_CHAR, - ESCS_ACTIVE_SLOT_RW_VALUE, - ESCS_ADV_INTERVAL_RW_CHAR, - ESCS_ADV_INTERVAL_RW_VALUE, - ESCS_RADIO_TX_PWR_RW_CHAR, - ESCS_RADIO_TX_PWR_RW_VALUE, - ESCS_ADV_TX_PWR_RW_CHAR, - ESCS_ADV_TX_PWR_RW_VALUE, - ESCS_LOCK_STATE_RW_CHAR, - ESCS_LOCK_STATE_RW_VALUE, - ESCS_UNLOCK_RW_CHAR, - ESCS_UNLOCK_RW_VALUE, - ESCS_PUBLIC_ECDH_KEY_RD_CHAR, - ESCS_PUBLIC_ECDH_KEY_RD_VALUE, - ESCS_EID_ID_KEY_RD_CHAR, - ESCS_EID_ID_KEY_RD_VALUE, - ESCS_RW_ADV_SLOT_RW_CHAR, - ESCS_RW_ADV_SLOT_RW_VALUE, - ESCS_FACTORY_RESET_SET_CHAR, - ESCS_FACTORY_RESET_SET_VALUE, - ESCS_REMAIN_CONNECTABLE_RW_CHAR, - ESCS_REMAIN_CONNECTABLE_RW_VALUE, - ESCSS_IDX_NB, -}; -/** @} */ - -/** - * @defgroup ESCS_STRUCT Structures - * @{ - */ -/** @} */ -/**@brief Structure for storing a slot key. */ -typedef struct { - uint8_t security_key[ESCS_LOCK_CODE_WRITE_LENGTH]; /**< security key.*/ - uint8_t k_scaler; /**< K rotation scaler.*/ -} slot_lock_code_t; - -/**@brief Structure for storing EID slot key. */ -typedef struct { - uint8_t pub_ecdh_key[ESCS_ECDH_KEY_SIZE]; /**< public ecdh key.*/ - uint8_t k_scaler; /**< K rotation scaler.*/ -} escs_eid_t; - -/**@brief EddyStone Configuration Service environment variable. */ -typedef struct { - uint8_t active_slot_no; /**< curret active slot number.*/ - uint8_t lock_state; /**< beacon lock state.*/ - uint16_t adv_interval; /**< advertising interval.*/ - int8_t slot_tx_power[APP_MAX_ADV_SLOTS]; /**< radio tx power.*/ - int8_t adv_tx_power; /**< advertised tx Power.*/ - bool remain_connectable; /**< whether to remain connectable.*/ - slot_lock_code_t beacon_lock_code; /**< beacon lock code.*/ -#if(APP_IS_EID_SUPPORTED) - escs_eid_t eid_slot_data[APP_MAX_ADV_SLOTS]; -#endif // APP_IS_EID_SUPPORTED -} ble_escs_init_params_t; - -/** - * @defgroup ESCE_FUNCTION Functions - * @{ - */ -/** - ***************************************************************************************** - * @brief get eddystone remain connectable state - * - * @retval true beacon connectable function is on. - * @retval false beacon connectable function is off. - * - ***************************************************************************************** - */ -bool es_adv_remain_connectable_get(void); - -/** - ***************************************************************************************** - * @brief set eddystone remain connectable state - * - * @param[in] remain_connectable: turn on or off beacon connectable function. - * - ***************************************************************************************** - */ -void es_adv_remain_connectable_set(bool remain_connectable); - -/** - ***************************************************************************************** - * @brief get public ecdh key - * - * @param[out] p_ecdh_key_buf: pointer to key buffer. - * - ***************************************************************************************** - */ -void es_public_ecdh_key_get (uint8_t* p_ecdh_key_buf); - -/** - ***************************************************************************************** - * @brief set public ecdh key - * - * @param[in] p_ecdh_key_buf: pointer of key buffer to set. - * - ***************************************************************************************** - */ -void es_public_ecdh_key_set (uint8_t* p_ecdh_key_buf); - -/** - ***************************************************************************************** - * @brief set security key for slot - * - * @param[in] p_security_key: pointer to setting key data. - * @param[in] is_eid_write: true if the key for EID slot. - * - ***************************************************************************************** - */ -void es_security_key_set(uint8_t* p_security_key, bool is_eid_write); - -/** - ***************************************************************************************** - * @brief to konw if a beacon has EID slot - * - * @return true if has EID slot. - * - ***************************************************************************************** - */ -bool es_beacon_has_eid_adv(void); - -/** - ***************************************************************************************** - * @brief set number of the actived slot - * - * @param[in] slot_no: the number to be set to actived slot. - * - ***************************************************************************************** - */ -void es_active_slot_number_set (uint8_t slot_no); - -/** - ***************************************************************************************** - * @brief get number of the actived slot - * - * @return slot number of the actived slot. - * - ***************************************************************************************** - */ -uint8_t es_active_slot_number_get (void); - -/** - ***************************************************************************************** - * @brief to know if the actived slot is a n EID slot - * - ***************************************************************************************** - */ -bool is_active_slot_eid(void); - -/** - ***************************************************************************************** - * @brief lock a beacon - * - ***************************************************************************************** - */ -void set_beacon_locked(void); - -/** - ***************************************************************************************** - * @brief unlock a beacon - * - ***************************************************************************************** - */ -void set_beacon_unlocked(void); - -/** - ***************************************************************************************** - * @brief get the radio tx power - * - * @return tx power(dBm). - * - ***************************************************************************************** - */ -int8_t es_adv_tx_power_get(void); - -/** - ***************************************************************************************** - * @brief set the radio tx power - * - * @param[in] adv_tx_power: tx power(dBm) to set. - * - ***************************************************************************************** - */ -void es_adv_tx_power_set(int8_t adv_tx_power); - -/** - ***************************************************************************************** - * @brief get advertised tx power of a slot - * - * @return advertised tx power(dBm). - * - ***************************************************************************************** - */ -int8_t es_slot_tx_power_get(void); - -/** - ***************************************************************************************** - * @brief set advertised tx power of a slot - * - * @param[in] tx_power: advertised tx power(dBm). - * - ***************************************************************************************** - */ -void es_slot_tx_power_set(int8_t tx_power); - -/** - ***************************************************************************************** - * @brief get advertising interval for slot - * - * @return advertising interval(mS). - * - ***************************************************************************************** - */ -uint16_t es_adv_interval_get(void); - -/** - ***************************************************************************************** - * @brief set advertising interval for slot - * - * @param[in] adv_interval: advertising interval(mS). - * - ***************************************************************************************** - */ -void es_adv_interval_set (uint16_t adv_interval); - -/** - ***************************************************************************************** - * @brief Initialize Eddystone Configuration Service,and data for the service. - * - * @param[in] p_escs_init: pointer to a initializing data structure. - * - ***************************************************************************************** - */ -sdk_err_t esec_service_init(ble_escs_init_params_t *p_escs_init); -/** @} */ - -#endif -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.c deleted file mode 100644 index b400f69..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.c +++ /dev/null @@ -1,402 +0,0 @@ -/** - **************************************************************************************** - * - * @file fast_otas.c - * - * @brief Over The Air Server Implementation. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/* -* INCLUDE FILES -**************************************************************************************** -*/ -#include "fast_otas.h" -#include "ble_prf_types.h" -#include "ble_prf_utils.h" -#include "utility.h" -#define OFFSET_4 4 -/* - * DEFINES - **************************************************************************************** - */ -/**@brief Proprietary UUIDs. */ -#define FAST_OTA_SERVICE_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, \ - 0x46, 0x44, 0xD3, 0x01, 0x07, 0xED, 0xA6} -#define FAST_OTA_SERVICE_CMD_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, \ - 0x46, 0x44, 0xD3, 0x02, 0x07, 0xED, 0xA6} -#define FAST_OTA_SERVICE_DATA_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, \ - 0x46, 0x44, 0xD3, 0x03, 0x07, 0xED, 0xA6} - -/**@brief Macros for conversion of 128bit to 16bit UUID. */ -#define ATT_128_PRIMARY_SERVICE BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DECL_PRIMARY_SERVICE) -#define ATT_128_CHARACTERISTIC BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DECL_CHARACTERISTIC) -#define ATT_128_CLIENT_CHAR_CFG BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DESC_CLIENT_CHAR_CFG) - -/* - * ENUMERATIONS - **************************************************************************************** - */ -/**@brief FAST_OTA Service Attributes Indexes. */ -enum fast_otas_attr_idx_tag { - FAST_OTAS_IDX_SVC, - - FAST_OTAS_IDX_CMD_CHAR, - FAST_OTAS_IDX_CMD_VAL, - FAST_OTAS_IDX_CMD_CFG, - FAST_OTAS_IDX_DATA_CHAR, - FAST_OTAS_IDX_DATA_VAL, - - FAST_OTAS_IDX_NB, -}; - -/* - * STRUCT DEFINE - **************************************************************************************** - */ -struct fast_otas_env_t { - fast_otas_init_t fast_otas_init; - uint16_t ntf_cfg[FAST_OTAS_CONNECTION_MAX]; - uint16_t start_hdl; -}; - - -/* -* LOCAL FUNCTION DECLARATION -**************************************************************************************** -*/ -static sdk_err_t fast_otas_init(void); -static void fast_otas_write_att_cb(uint8_t conn_idx, const gatts_write_req_cb_t *p_param); -static void fast_otas_read_att_cb(uint8_t conn_idx, const gatts_read_req_cb_t *p_param); -static void fast_otas_cccd_set_cb(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value); -static void fast_otas_gatts_cmpl_cb(uint8_t conn_idx, uint8_t status, const ble_gatts_ntf_ind_t *p_ntf_ind); - -/* - * LOCAL VARIABLE DEFINITIONS - **************************************************************************************** - */ -static struct fast_otas_env_t s_fast_otas_env; -static uint16_t s_char_mask = 0xff; -/**@brief Full FAST_OTAS Database Description - Used to add attributes into the database. */ -static const attm_desc_128_t fast_otas_att_db[FAST_OTAS_IDX_NB] = { - // FAST_OTA service - [FAST_OTAS_IDX_SVC] = {ATT_128_PRIMARY_SERVICE, READ_PERM_UNSEC, 0, 0}, - - // FAST_OTA TX Characteristic Declaration - [FAST_OTAS_IDX_CMD_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - // FAST_OTA TX Characteristic Value - [FAST_OTAS_IDX_CMD_VAL] = { - FAST_OTA_SERVICE_CMD_UUID, - WRITE_CMD_PERM_UNSEC | NOTIFY_PERM_UNSEC, - (ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET(UUID_TYPE_128)), - FAST_OTAS_MAX_DATA_LEN - }, - - // FAST_OTA TX Characteristic - Client Characteristic Configuration Descriptor - [FAST_OTAS_IDX_CMD_CFG] = { - ATT_128_CLIENT_CHAR_CFG, - READ_PERM_UNSEC| WRITE_REQ_PERM_UNSEC, - 0, - 0 - }, - - // FAST_OTA RX Characteristic Declaration - [FAST_OTAS_IDX_DATA_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0 }, - - // FAST_OTA RX Characteristic Value - [FAST_OTAS_IDX_DATA_VAL] = { - FAST_OTA_SERVICE_DATA_UUID, - WRITE_CMD_PERM_UNSEC, - (ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET(UUID_TYPE_128)), - FAST_OTAS_MAX_DATA_LEN - }, -}; - -/**@brief FAST_OTA Server Task interface required by profile manager. */ -static ble_prf_manager_cbs_t fast_otas_tack_cbs = { - (prf_init_func_t) fast_otas_init, - NULL, - NULL, -}; - -/**@brief FAST_OTA Server Task Callbacks. */ -static gatts_prf_cbs_t fast_otas_cb_func = { - fast_otas_read_att_cb, - fast_otas_write_att_cb, - NULL, - fast_otas_gatts_cmpl_cb, - fast_otas_cccd_set_cb -}; - -/**@brief FAST_OTA Server Information. */ -static const prf_server_info_t fast_otas_prf_info = { - .max_connection_nb = FAST_OTAS_CONNECTION_MAX, - .manager_cbs = &fast_otas_tack_cbs, - .gatts_prf_cbs =&fast_otas_cb_func -}; - -/* - * LOCAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -/** - ***************************************************************************************** - * @brief Initialize FAST_OTA service create db in att - * - * @return Error code to know if profile initialization succeed or not. - ***************************************************************************************** - */ -static sdk_err_t fast_otas_init(void) -{ - // The start hanlde must be set with PRF_INVALID_HANDLE to be allocated automatically by BLE Stack. - uint16_t start_hdl = PRF_INVALID_HANDLE; - const uint8_t fast_otas_svc_uuid[] = FAST_OTA_SERVICE_UUID; - sdk_err_t error_code = SDK_SUCCESS; - gatts_create_db_t gatts_db; - - error_code = memset_s(&gatts_db, sizeof(gatts_db), 0, sizeof(gatts_db)); - if (error_code < 0) { - return error_code; - } - - gatts_db.shdl = &start_hdl; - gatts_db.uuid = fast_otas_svc_uuid; - gatts_db.attr_tab_cfg = (uint8_t*)&s_char_mask; - gatts_db.max_nb_attr = FAST_OTAS_IDX_NB; - gatts_db.srvc_perm = SRVC_UUID_TYPE_SET(UUID_TYPE_128); - gatts_db.attr_tab_type = SERVICE_TABLE_TYPE_128; - gatts_db.attr_tab.attr_tab_128 = fast_otas_att_db; - - error_code = ble_gatts_srvc_db_create(&gatts_db); - if (SDK_SUCCESS == error_code) { - s_fast_otas_env.start_hdl = *(gatts_db.shdl); - } - - return error_code; -} - -/** - ***************************************************************************************** - * @brief Handles reception of the attribute info request message. - * - * @param[in] conn_idx: Connection index - * @param[in] p_param: The parameters of the read request. - ***************************************************************************************** - */ -static void fast_otas_read_att_cb(uint8_t conn_idx, const gatts_read_req_cb_t *p_param) -{ - gatts_read_cfm_t cfm; - uint8_t handle = p_param->handle; - uint8_t tab_index = 0; - - tab_index = prf_find_idx_by_handle(handle, s_fast_otas_env.start_hdl, FAST_OTAS_IDX_NB, (uint8_t*)&s_char_mask); - - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - - switch (tab_index) { - case FAST_OTAS_IDX_CMD_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)(&s_fast_otas_env.ntf_cfg[conn_idx]); - break; - - default: - cfm.length = 0; - cfm.status = BLE_ATT_ERR_INVALID_HANDLE; - break; - } - - ble_gatts_read_cfm(conn_idx, &cfm); -} - -/** - ***************************************************************************************** - * @brief Handles reception of the write request. - * - * @param[in] conn_idx: of connection index - * @param[in] p_param: Pointer to the parameters of the write request. - ***************************************************************************************** - */ -static void fast_otas_write_att_cb(uint8_t conn_idx, const gatts_write_req_cb_t *p_param) -{ - gatts_write_cfm_t cfm; - uint8_t handle = p_param->handle; - uint8_t tab_index = 0; - uint16_t cccd_value = 0; - fast_otas_evt_t event; - - tab_index = prf_find_idx_by_handle(handle, s_fast_otas_env.start_hdl, FAST_OTAS_IDX_NB, (uint8_t*)&s_char_mask); - - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - switch (tab_index) { - case FAST_OTAS_IDX_CMD_VAL: - if (le32toh(&p_param->value[0]) == FAST_OTA_PATTERN_VALUE) { - if (s_fast_otas_env.fast_otas_init.evt_handler != NULL) { - event.conn_idx = conn_idx; - event.evt_type = FAST_OTAS_EVT_CMD_RECEIVE_DATA; - event.p_data = (uint8_t*)&p_param->value[OFFSET_4]; - event.length = p_param->length-OFFSET_4; - - s_fast_otas_env.fast_otas_init.evt_handler(&event); - } - } - - break; - - case FAST_OTAS_IDX_CMD_CFG: - cccd_value = le16toh(&p_param->value[0]); - if (s_fast_otas_env.fast_otas_init.evt_handler != NULL) { - event.conn_idx = conn_idx; - event.evt_type = (cccd_value == PRF_CLI_START_NTF) ?\ - FAST_OTAS_EVT_CMD_NOTIFICATION_ENABLED : - FAST_OTAS_EVT_CMD_NOTIFICATION_DISABLED; - s_fast_otas_env.fast_otas_init.evt_handler(&event); - } - s_fast_otas_env.ntf_cfg[conn_idx] = cccd_value; - break; - - case FAST_OTAS_IDX_DATA_VAL: - if (s_fast_otas_env.fast_otas_init.evt_handler != NULL) { - event.conn_idx = conn_idx; - event.evt_type = FAST_OTAS_EVT_DATA_RECEIVE_DATA; - event.p_data = (uint8_t*)p_param->value; - event.length = p_param->length; - - s_fast_otas_env.fast_otas_init.evt_handler(&event); - } - - break; - - default: - cfm.status = BLE_ATT_ERR_INVALID_HANDLE; - break; - } - - ble_gatts_write_cfm(conn_idx, &cfm); -} - -/** - ***************************************************************************************** - * @brief Handles reception of the cccd recover request. - * - * @param[in]: conn_idx: Connection index - * @param[in]: handle: The handle of cccd attribute. - * @param[in]: cccd_value: The value of cccd attribute. - ***************************************************************************************** - */ -static void fast_otas_cccd_set_cb(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value) -{ - uint8_t tab_index = 0; - fast_otas_evt_t event; - - if (!prf_is_cccd_value_valid(cccd_value)) { - return; - } - - tab_index = prf_find_idx_by_handle(handle, s_fast_otas_env.start_hdl, FAST_OTAS_IDX_NB, (uint8_t*)&s_char_mask); - - switch (tab_index) { - case FAST_OTAS_IDX_CMD_CFG: - if (s_fast_otas_env.fast_otas_init.evt_handler != NULL) { - event.conn_idx = conn_idx; - event.evt_type = (cccd_value == PRF_CLI_START_NTF) ?\ - FAST_OTAS_EVT_CMD_NOTIFICATION_ENABLED : - FAST_OTAS_EVT_CMD_NOTIFICATION_DISABLED; - s_fast_otas_env.fast_otas_init.evt_handler(&event); - } - s_fast_otas_env.ntf_cfg[conn_idx] = cccd_value; - break; - - default: - break; - } -} - -/** - ***************************************************************************************** - * @brief Handles reception of the complete event. - * - * @param[in] conn_idx: Connection index - * @param[in] p_param: Pointer to the parameters of the complete event. - * - * @return If the event was consumed or not. - ***************************************************************************************** - */ -static void fast_otas_gatts_cmpl_cb(uint8_t conn_idx, uint8_t status, const ble_gatts_ntf_ind_t *p_ntf_ind) -{ - if (s_fast_otas_env.fast_otas_init.evt_handler != NULL) { - fast_otas_evt_t event; - - event.conn_idx = conn_idx; - if (status == BLE_SUCCESS) { - if (p_ntf_ind->type == BLE_GATT_NOTIFICATION) { - event.evt_type = FAST_OTAS_EVT_CMD_NOTIFY_COMPLETE; - s_fast_otas_env.fast_otas_init.evt_handler(&event); - } - } - } -} - -/* - * GLOBAL FUNCTION DEFINITIONS - **************************************************************************************** - */ -sdk_err_t fast_otas_notify_cmd_data(uint8_t conn_idx, uint8_t* p_data, uint16_t len) -{ - sdk_err_t error_code = SDK_ERR_NTF_DISABLED; - gatts_noti_ind_t send_cmd; - - if (s_fast_otas_env.ntf_cfg[conn_idx] == PRF_CLI_START_NTF) { - // Fill in the parameter structure - send_cmd.type = BLE_GATT_NOTIFICATION; - send_cmd.handle = prf_find_handle_by_idx(FAST_OTAS_IDX_CMD_VAL, s_fast_otas_env.start_hdl, - (uint8_t*)&s_char_mask); - // pack measured value in database - send_cmd.length = len; - send_cmd.value = p_data; - // send notification to peer device - error_code = ble_gatts_noti_ind(conn_idx, &send_cmd); - } - return error_code; -} - - -sdk_err_t fast_otas_service_init(fast_otas_init_t *p_fast_otas_init) -{ - if (p_fast_otas_init == NULL) { - return SDK_ERR_POINTER_NULL; - } - - s_fast_otas_env.fast_otas_init.evt_handler = p_fast_otas_init->evt_handler; - - return ble_server_prf_add(&fast_otas_prf_info); -} diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.h deleted file mode 100644 index de1f553..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/fast_otas/fast_otas.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - **************************************************************************************** - * - * @file fast_otas.h - * - * @brief FAST_OTA Service API - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/** - * @addtogroup BLE_SRV BLE Services - * @{ - * @brief Definitions and prototypes for the BLE Service interface. - */ - -/** - * @defgroup BLE_SDK_FAST_OTA FAST_OTA Service (FAST_OTAS) - * @{ - * @brief Definitions and prototypes for the FAST_OTAS interface. - * - * @details The FAST_OTA Service exposes the state of a battery within a device. - * This module implements the Battery Service with the Battery Level - * characteristic. After @ref otas_init_t variable is initialized, the - * developer shall call @ref otas_service_init() to add the FAST_OTA - * Service and RX, TX, Control characteristic to the BLE stack database. - * - * This module also provides \ref otas_notify_tx_data() function to the application - * to send data to peer. - */ - -#ifndef _FAST_OTAS_H_ -#define _FAST_OTAS_H_ - -/* - * INCLUDE FILES - **************************************************************************************** - */ -#include "gr55xx_sys.h" -#include "custom_config.h" - -/** - * @defgroup FAST_OTAS_MACRO Defines - * @{ - */ -#define FAST_OTAS_CONNECTION_MAX (10 < CFG_MAX_CONNECTIONS ? \ - 10 : CFG_MAX_CONNECTIONS) /**< Maximum number of FAST_OTA Service connections. */ -#define FAST_OTAS_MAX_DATA_LEN 244 /**< Maximum length of FAST_OTAS characteristic. */ -#define BLE_UUID_FAST_OTA_SERVICE 0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, 0x46, 0x44, 0xD3, 0x01, \ - 0x07, 0xED, 0xA6 /**< The UUID of FAST_OTA Service for setting advertising data. */ - -#define FAST_OTA_PATTERN_VALUE 0x474f4f44 /**< The Fast OTA pattern value. */ -/** @} */ - -/** - * @defgroup FAST_OTA_ENUM Enumerations - * @{ - */ -/**@brief FAST_OTA Service event type. */ -typedef enum { - FAST_OTAS_EVT_INVALID, - FAST_OTAS_EVT_CMD_NOTIFICATION_ENABLED, - FAST_OTAS_EVT_CMD_NOTIFICATION_DISABLED, - FAST_OTAS_EVT_CMD_RECEIVE_DATA, - FAST_OTAS_EVT_CMD_NOTIFY_COMPLETE, - FAST_OTAS_EVT_DATA_RECEIVE_DATA -} fast_otas_evt_type_t; -/** @} */ - -/** - * @defgroup FAST_OTAS_STRUCT Structures - * @{ - */ -/**@brief FAST_OTA Service event. */ -typedef struct { - fast_otas_evt_type_t evt_type; /**< The FAST_OTAS event. */ - uint8_t conn_idx; /**< Index of connection. */ - uint8_t *p_data; /**< Pointer to data. */ - uint16_t length; /**< Length of data. */ -} fast_otas_evt_t; -/** @} */ - -/** - * @defgroup FAST_OTAS_TYPEDEF Typedefs - * @{ - */ -/**@brief FAST_OTA Service event handler type. */ -typedef void (*fast_otas_evt_handler_t)(fast_otas_evt_t *p_evt); - -/**@brief FAST_OTA Service function type. */ -typedef void (*function)(void); -/** @} */ - -/** - * @defgroup FAST_OTAS_STRUCT Structures - * @{ - */ -/**@brief FAST_OTA Service initialization variable. */ -typedef struct { - fast_otas_evt_handler_t evt_handler; /**< Handler to handle otas event. */ -} fast_otas_init_t; -/** @} */ - - -/** - * @defgroup FAST_OTAS_FUNCTION Functions - * @{ - */ -/** - ***************************************************************************************** - * @brief Add an FAST_OTA Service instance in the DB - * - * @param[in] p_otas_init :Pointer to FAST_OTA Service environment variable - * - * @return Result of service initialization. - ***************************************************************************************** - */ -sdk_err_t fast_otas_service_init(fast_otas_init_t *p_otas_init); - - -/** - ***************************************************************************************** - * @brief Send data to peer device - * - * @param[in] conn_idx: Connection index - * @param[in] p_data: The Pointer of send value - * @param[in] length: The Lenth of send value - * - * @return Result of notify and indicate value - ***************************************************************************************** - */ -sdk_err_t fast_otas_notify_cmd_data(uint8_t conn_idx, uint8_t *p_data, uint16_t length); -/** @} */ - -#endif -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_db.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_db.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_db.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_db.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_racp.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_racp.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_racp.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gls/gls_racp.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/gus.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/gus.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/gus.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus/gus.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/gus_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/gus_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/gus_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/gus_c/gus_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/hids.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/hids.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/hids.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hids/hids.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/hrrcps.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/hrrcps.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/hrrcps.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrrcps/hrrcps.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/hrs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/hrs.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/hrs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs/hrs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/hrs_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/hrs_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/hrs_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hrs_c/hrs_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/hts.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/hts.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/hts.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/hts/hts.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/ias.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/ias.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/ias.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias/ias.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/ias_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/ias_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/ias_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ias_c/ias_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/lls.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/lls.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/lls.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls/lls.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/lls_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/lls_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/lls_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lls_c/lls_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/lms.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/lms.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/lms.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lms/lms.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/lns.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/lns.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/lns.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/lns/lns.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/mlmr.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/mlmr.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/mlmr.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr/mlmr.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/mlmr_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/mlmr_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/mlmr_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/mlmr_c/mlmr_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/ndcs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/ndcs.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/ndcs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ndcs/ndcs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/otas.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/otas.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/otas.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas/otas.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/otas_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/otas_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/otas_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/otas_c/otas_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/pass.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/pass.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/pass.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass/pass.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/pass_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/pass_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/pass_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pass_c/pass_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/pcs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/pcs.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/pcs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/pcs/pcs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/rscs.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/rscs.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/rscs.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs/rscs.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/rscs_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/rscs_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/rscs_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rscs_c/rscs_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/rtus.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/rtus.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/rtus.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/rtus/rtus.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/sample_service.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/sample_service.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/sample_service.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/sample/sample_service.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/ths.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/ths.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/ths.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths/ths.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/ths_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/ths_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/ths_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/ths_c/ths_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.c deleted file mode 100644 index 593f93f..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.c +++ /dev/null @@ -1,803 +0,0 @@ -/** - ***************************************************************************************** - * - * @file thscps.c - * - * @brief Throughput Control Point Service Implementation. - * - ***************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include -#include "ble_prf_utils.h" -#include "utility.h" -#include "app_log.h" -#include "thscps.h" - -#define INDEX_0 0 -#define INDEX_1 1 -#define INDEX_2 2 -#define INDEX_4 4 -#define INDEX_6 6 -#define INDEX_7 7 -#define LEN_3 3 -/* -* DEFINES -***************************************************************************************** -*/ -#define THSCPS_CTRL_PT_CHARACTERISTIC_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, \ - 0x0A, 0x46, 0x44, 0xD3, 0x02, 0x07, 0xED, 0xA6} -#define THSCPS_TEST_SETTING_CHARACTERISTIC_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, \ - 0x0A, 0x46, 0x44, 0xD3, 0x03, 0x07, 0xED, 0xA6} -#define THSCPS_TEST_INFO_CHARACTERISTIC_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, \ - 0x0A, 0x46, 0x44, 0xD3, 0x04, 0x07, 0xED, 0xA6} -#define THSCPS_CONN_INFO_CHARACTERISTIC_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, \ - 0x0A, 0x46, 0x44, 0xD3, 0x05, 0x07, 0xED, 0xA6} - -/**@brief Macros for conversion of 128bit to 16bit UUID. */ -#define ATT_128_PRIMARY_SERVICE BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DECL_PRIMARY_SERVICE) -#define ATT_128_CHARACTERISTIC BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DECL_CHARACTERISTIC) -#define ATT_128_CLIENT_CHAR_CFG BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DESC_CLIENT_CHAR_CFG) - -/* - * ENUMERATIONS - ***************************************************************************************** - */ -/**@brief THS Control Point Service Attributes Indexes. */ -enum { - // THS Control Point Service - THSCPS_IDX_SVC, - - // THS Control Point - THSCPS_IDX_THS_CTRL_PT_CHAR, - THSCPS_IDX_THS_CTRL_PT_VAL, - THSCPS_IDX_THS_CTRL_PT_CFG, - - // THS throughput Test Setting - THSCPS_IDX_TEST_SETTING_CHAR, - THSCPS_IDX_TEST_SETTING_VAL, - THSCPS_IDX_TEST_SETTING_CFG, - - // THS throughput Test Information - THSCPS_IDX_TEST_INFO_CHAR, - THSCPS_IDX_TEST_INFO_VAL, - THSCPS_IDX_TEST_INFO_CFG, - - // THS throughput Conn Information - THSCPS_IDX_CONN_INFO_CHAR, - THSCPS_IDX_CONN_INFO_VAL, - THSCPS_IDX_CONN_INFO_CFG, - - THSCPS_IDX_NB -}; - -/* - * STRUCTURES - ***************************************************************************************** - */ -/**@brief THS Control Point Service environment variable. */ -struct thscps_env_t { - thscps_evt_handler_t evt_handler; /**< THS Control Point Service event handler. */ - uint16_t start_hdl; /**< THS Control Point Service start handle. */ - thscps_test_role_t curr_role; /**< Current test role. */ - thscps_test_state_t test_state; /**< Test is on going or not. */ - uint16_t - ctrl_pt_ind_cfg[THSCPS_CONNECTION_MAX]; /**< The configuration of Control Point Response \ - which is configured by the peer devices. */ - uint16_t - test_setting_ntf_cfg[THSCPS_CONNECTION_MAX]; /**< The configuration of Test Setting \ - which is configured by the peer devices. */ - uint16_t - conn_info_ntf_cfg[THSCPS_CONNECTION_MAX]; /**< The configuration of Connection Information \ - which is configured by the peer devices. */ - uint16_t - test_info_ntf_cfg[THSCPS_CONNECTION_MAX]; /**< The configuration of Test Information \ - which is configured by the peer devices. */ -}; - -/* - * LOCAL FUNCTION DECLARATION - ***************************************************************************************** - */ -static sdk_err_t thscps_init(void); -static void thscps_read_att_cb(uint8_t conn_idx, const gatts_read_req_cb_t *p_param); -static void thscps_write_att_cb(uint8_t conn_idx, const gatts_write_req_cb_t *p_param); -static void thscps_cccd_set_cb(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value); -static void thscps_ctrl_pt_handler(uint8_t conn_idx, const gatts_write_req_cb_t *p_param); -static sdk_err_t thscps_ctrl_pt_fail_rsp_send(uint8_t conn_idx, thscps_ctrl_pt_id_t cmd_id, - thscps_status_rsp_t status); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static struct thscps_env_t s_thscps_env; -static uint16_t s_thscps_char_mask = 0x1fff; -/**@brief Full THSCPS Database Description - Used to add attributes into the database. */ -static const attm_desc_128_t thscps_attr_tab[THSCPS_IDX_NB] = { - // THS Control Point Service - [THSCPS_IDX_SVC] = {ATT_128_PRIMARY_SERVICE, READ_PERM_UNSEC, 0, 0}, - - // THS Control Point Characteristic - Declaration - [THSCPS_IDX_THS_CTRL_PT_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - // THS Control Point Characteristic - Value - [THSCPS_IDX_THS_CTRL_PT_VAL] = { - THSCPS_CTRL_PT_CHARACTERISTIC_UUID, - WRITE_REQ_PERM_UNSEC | INDICATE_PERM_UNSEC, - (ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET(UUID_TYPE_128)), - THSCPS_CTRL_PT_VAL_LEN - }, - // THS Control Point Characteristic - Client Characteristic Configuration Descriptor - [THSCPS_IDX_THS_CTRL_PT_CFG] = {ATT_128_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0}, - - // THS Test Setting Characteristic - Declaration - [THSCPS_IDX_TEST_SETTING_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - // THS Test Setting Characteristic - Value - [THSCPS_IDX_TEST_SETTING_VAL] = { - THSCPS_TEST_SETTING_CHARACTERISTIC_UUID, - WRITE_REQ_PERM_UNSEC | NOTIFY_PERM_UNSEC, - (ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET(UUID_TYPE_128)), - THSCPS_TEST_SETTING_VAL_LEN - }, - // THS Test Setting Characteristic - Client Characteristic Configuration Descriptor - [THSCPS_IDX_TEST_SETTING_CFG] = {ATT_128_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0}, - - // THS Test Information Characteristic - Declaration - [THSCPS_IDX_TEST_INFO_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - // THS Test Information Characteristic - Value - [THSCPS_IDX_TEST_INFO_VAL] = { - THSCPS_TEST_INFO_CHARACTERISTIC_UUID, - NOTIFY_PERM_UNSEC, - (ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET(UUID_TYPE_128)), - THSCPS_TEST_INFO_VAL_LEN - }, - // THS Test Information Characteristic - Client Characteristic Configuration Descriptor - [THSCPS_IDX_TEST_INFO_CFG] = {ATT_128_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0}, - - // THS Test Connection Characteristic - Declaration - [THSCPS_IDX_CONN_INFO_CHAR] = {ATT_128_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - // THS Test Connection Characteristic - Value - [THSCPS_IDX_CONN_INFO_VAL] = { - THSCPS_CONN_INFO_CHARACTERISTIC_UUID, - NOTIFY_PERM_UNSEC, - (ATT_VAL_LOC_USER | ATT_UUID_TYPE_SET(UUID_TYPE_128)), - THSCPS_CONN_INFO_VAL_LEN - }, - // THS Test Connection Characteristic - Client Characteristic Configuration Descriptor - [THSCPS_IDX_CONN_INFO_CFG] = {ATT_128_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0} -}; - -/**@brief THSCPS Service interface required by profile manager. */ -static ble_prf_manager_cbs_t thscps_mgr_cbs = { - (prf_init_func_t)thscps_init, - NULL, - NULL -}; - -/**@brief THSCPS GATT Server Callbacks. */ -static gatts_prf_cbs_t thscps_gatts_cbs = { - thscps_read_att_cb, - thscps_write_att_cb, - NULL, - NULL, - thscps_cccd_set_cb -}; - -/**@brief THSCPS Service Information. */ -static const prf_server_info_t thscps_prf_info = { - .max_connection_nb = THSCPS_CONNECTION_MAX, - .manager_cbs = &thscps_mgr_cbs, - .gatts_prf_cbs = &thscps_gatts_cbs -}; - -/* - * LOCAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -/** - ***************************************************************************************** - * @brief Initialize THS Control Point service and create database in ATT. - * - * @return Error code to know if profile initialization succeed or not. - ***************************************************************************************** - */ -static sdk_err_t thscps_init(void) -{ - const uint8_t thscps_svc_uuid[] = {THSCPS_SERVICE_UUID}; - uint16_t start_hdl = PRF_INVALID_HANDLE; - sdk_err_t error_code; - gatts_create_db_t gatts_db; - - error_code = memset_s(&gatts_db, sizeof(gatts_db), 0, sizeof(gatts_db)); - if (error_code < 0) { - return error_code; - } - - gatts_db.shdl = &start_hdl; - gatts_db.uuid = thscps_svc_uuid; - gatts_db.attr_tab_cfg = NULL; - gatts_db.max_nb_attr = THSCPS_IDX_NB; - gatts_db.srvc_perm = SRVC_UUID_TYPE_SET(UUID_TYPE_128); - gatts_db.attr_tab_type = SERVICE_TABLE_TYPE_128; - gatts_db.attr_tab.attr_tab_128 = thscps_attr_tab; - - error_code = ble_gatts_srvc_db_create(&gatts_db); - if (SDK_SUCCESS == error_code) { - s_thscps_env.start_hdl = *gatts_db.shdl; - } - - return error_code; -} - -/** - ***************************************************************************************** - * @brief Handles reception of the attribute info request message. - * - * @param[in] conn_idx: Connection index. - * @param[in] p_param: Pointer to the parameters of the read request. - ***************************************************************************************** - */ -static void thscps_read_att_cb(uint8_t conn_idx, const gatts_read_req_cb_t *p_param) -{ - gatts_read_cfm_t cfm; - uint8_t handle = p_param->handle; - uint8_t tab_index = 0; - - tab_index = prf_find_idx_by_handle(handle, s_thscps_env.start_hdl, THSCPS_IDX_NB, (uint8_t *)&s_thscps_char_mask); - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - - switch (tab_index) { - case THSCPS_IDX_THS_CTRL_PT_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_thscps_env.ctrl_pt_ind_cfg[conn_idx]; - break; - - case THSCPS_IDX_TEST_SETTING_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_thscps_env.test_setting_ntf_cfg[conn_idx]; - break; - - case THSCPS_IDX_TEST_INFO_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_thscps_env.test_info_ntf_cfg[conn_idx]; - break; - - case THSCPS_IDX_CONN_INFO_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_thscps_env.conn_info_ntf_cfg[conn_idx]; - break; - - default: - cfm.length = 0; - cfm.status = BLE_ATT_ERR_INVALID_HANDLE; - break; - } - - ble_gatts_read_cfm(conn_idx, &cfm); -} - -/** - ***************************************************************************************** - * @brief Handles reception of the write request. - * - * @param[in] conn_idx: Connection index. - * @param[in] p_param: Pointer to the parameters of the write request. - ***************************************************************************************** - */ -static void thscps_write_att_cb(uint8_t conn_idx, const gatts_write_req_cb_t *p_param) -{ - uint8_t handle = p_param->handle; - uint8_t tab_index = 0; - uint16_t cccd_value = 0; - bool is_ctrl_pt_wr = false; - thscps_rsp_val_t rsp_val; - thscps_evt_t event; - gatts_write_cfm_t cfm; - - tab_index = prf_find_idx_by_handle(handle, s_thscps_env.start_hdl, - THSCPS_IDX_NB, (uint8_t *)&s_thscps_char_mask); - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - event.conn_idx = conn_idx; - event.evt_type = THSCPS_EVT_INVALID; - - switch (tab_index) { - case THSCPS_IDX_THS_CTRL_PT_VAL: - is_ctrl_pt_wr = true; - break; - - case THSCPS_IDX_THS_CTRL_PT_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = ((PRF_CLI_START_IND == cccd_value) ? \ - THSCPS_EVT_CTRL_PT_IND_ENABLE : \ - THSCPS_EVT_CTRL_PT_IND_DISABLE); - s_thscps_env.ctrl_pt_ind_cfg[conn_idx] = cccd_value; - break; - - case THSCPS_IDX_TEST_SETTING_VAL: - event.evt_type = THSCPS_EVT_SETTING_SET; - event.param.setting_info.length = p_param->length; - event.param.setting_info.p_data = p_param->value; - break; - - case THSCPS_IDX_TEST_SETTING_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = ((PRF_CLI_START_NTF == cccd_value) ? \ - THSCPS_EVT_TSET_SET_NTF_ENABLE : \ - THSCPS_EVT_TSET_SET_NTF_DISABLE); - s_thscps_env.test_setting_ntf_cfg[conn_idx] = cccd_value; - break; - - case THSCPS_IDX_TEST_INFO_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = ((PRF_CLI_START_NTF == cccd_value) ? \ - THSCPS_EVT_TSET_INFO_NTF_ENABLE : \ - THSCPS_EVT_TSET_INFO_NTF_DISABLE); - s_thscps_env.test_info_ntf_cfg[conn_idx] = cccd_value; - break; - - case THSCPS_IDX_CONN_INFO_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = ((PRF_CLI_START_NTF == cccd_value) ? \ - THSCPS_EVT_CONN_INFO_NTF_ENABLE : \ - THSCPS_EVT_CONN_INFO_NTF_DISABLE); - s_thscps_env.conn_info_ntf_cfg[conn_idx] = cccd_value; - break; - - default: - cfm.status = BLE_ATT_ERR_INVALID_HANDLE; - break; - } - - ble_gatts_write_cfm(conn_idx, &cfm); - - if (is_ctrl_pt_wr) { - thscps_ctrl_pt_handler(conn_idx, p_param); - } else if (THSCPS_EVT_SETTING_SET == event.evt_type && - THSCPS_TEST_STARTED == s_thscps_env.test_state && - p_param->value[0] != THSCPS_SETTINGS_TYPE_TOGGLE) { - rsp_val.cmd_id = p_param->value[0]; - rsp_val.conn_idx = p_param->value[1]; - rsp_val.status = THSCPS_RSP_ID_STATUS_ERR; - - thscps_test_setting_rsp_send(conn_idx, &rsp_val); - } else if (THSCPS_EVT_INVALID != event.evt_type && s_thscps_env.evt_handler) { - s_thscps_env.evt_handler(&event); - } -} - -/** - ***************************************************************************************** - * @brief Handles reception of the cccd recover request. - * - * @param[in]: conn_idx: Connection index - * @param[in]: handle: The handle of cccd attribute. - * @param[in]: cccd_value: The value of cccd attribute. - ***************************************************************************************** - */ -static void thscps_cccd_set_cb(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value) -{ - uint8_t tab_index = 0; - thscps_evt_t event; - - event.conn_idx = conn_idx; - event.evt_type = THSCPS_EVT_INVALID; - - if (!prf_is_cccd_value_valid(cccd_value)) { - return; - } - - tab_index = prf_find_idx_by_handle(handle, s_thscps_env.start_hdl, THSCPS_IDX_NB, (uint8_t *)&s_thscps_char_mask); - - switch (tab_index) { - case THSCPS_IDX_THS_CTRL_PT_CFG: - event.evt_type = ((PRF_CLI_START_IND == cccd_value) ? \ - THSCPS_EVT_CTRL_PT_IND_ENABLE : \ - THSCPS_EVT_CTRL_PT_IND_DISABLE); - s_thscps_env.ctrl_pt_ind_cfg[conn_idx] = cccd_value; - break; - - case THSCPS_IDX_TEST_SETTING_CFG: - event.evt_type = ((PRF_CLI_START_NTF == cccd_value) ? \ - THSCPS_EVT_TSET_SET_NTF_ENABLE : \ - THSCPS_EVT_TSET_SET_NTF_DISABLE); - s_thscps_env.test_setting_ntf_cfg[conn_idx] = cccd_value; - break; - - case THSCPS_IDX_TEST_INFO_CFG: - event.evt_type = ((PRF_CLI_START_NTF == cccd_value) ? \ - THSCPS_EVT_TSET_INFO_NTF_ENABLE : \ - THSCPS_EVT_TSET_INFO_NTF_DISABLE); - s_thscps_env.test_info_ntf_cfg[conn_idx] = cccd_value; - break; - - case THSCPS_IDX_CONN_INFO_CFG: - event.evt_type = ((PRF_CLI_START_NTF == cccd_value) ? \ - THSCPS_EVT_CONN_INFO_NTF_ENABLE : \ - THSCPS_EVT_CONN_INFO_NTF_DISABLE); - s_thscps_env.conn_info_ntf_cfg[conn_idx] = cccd_value; - break; - - default: - break; - } - - if (s_thscps_env.evt_handler) { - s_thscps_env.evt_handler(&event); - } -} - -/** - ***************************************************************************************** - * @brief Handle THS Control Point. - * - * @param[in] conn_idx Connection index. - * @param[in] p_param: Pointer to the parameters of the write request. - ***************************************************************************************** - */ -static void thscps_ctrl_pt_handler(uint8_t conn_idx, const gatts_write_req_cb_t *p_param) -{ - thscps_evt_t event; - thscps_ctrl_pt_id_t ctrl_pt_id; - - ctrl_pt_id = (thscps_ctrl_pt_id_t)p_param->value[0]; - - if (THSCPS_TEST_STARTED == s_thscps_env.test_state) { - thscps_ctrl_pt_fail_rsp_send(conn_idx, ctrl_pt_id, THSCPS_RSP_ID_STATUS_ERR); - return; - } - - event.conn_idx = conn_idx; - event.evt_type = THSCPS_EVT_INVALID; - - switch (ctrl_pt_id) { - case THSCPS_CTRL_PT_TEST_ROLE: - if (p_param->value[1] != THSCPS_TEST_ROLE_SLAVE && p_param->value[1] != THSCPS_TEST_ROLE_MASTER) { - thscps_ctrl_pt_fail_rsp_send(conn_idx, ctrl_pt_id, THSCPS_RSP_ID_PARAM_ERR); - } else { - s_thscps_env.curr_role = (thscps_test_role_t)p_param->value[1]; - event.evt_type = THSCPS_EVT_TEST_ROLE_SET; - event.param.test_role = (thscps_test_role_t)p_param->value[1]; - } - break; - - case THSCPS_CTRL_PT_ADV_PARAM: - if (THSCPS_TEST_ROLE_SLAVE == s_thscps_env.curr_role) { - event.evt_type = THSCPS_EVT_ADV_PRAM_SET; - event.param.adv_param.phy = (thscps_adv_phy_t)(p_param->value[1]); - event.param.adv_param.interval = le16toh(&p_param->value[INDEX_2]); - event.param.adv_param.duration = le16toh(&p_param->value[INDEX_4]); - event.param.adv_param.tx_power = p_param->value[INDEX_6] == 1 ? \ - 0 - p_param->value[INDEX_7] : p_param->value[INDEX_7]; - } else { - thscps_ctrl_pt_fail_rsp_send(conn_idx, ctrl_pt_id, THSCPS_RSP_ID_TEST_ROLE_ERR); - } - break; - - case THSCPS_CTRL_PT_ADV_ACTION: - if (THSCPS_TEST_ROLE_SLAVE == s_thscps_env.curr_role) { - event.evt_type = THSCPS_EVT_ADV_ACTION; - event.param.action_set = p_param->value[1]; - } else { - thscps_ctrl_pt_fail_rsp_send(conn_idx, ctrl_pt_id, THSCPS_RSP_ID_TEST_ROLE_ERR); - } - break; - - case THSCPS_CTRL_PT_SCAN_ACTION: - if (THSCPS_TEST_ROLE_MASTER == s_thscps_env.curr_role) { - event.evt_type = THSCPS_EVT_SCAN_ACTION; - event.param.action_set = p_param->value[1]; - } else { - thscps_ctrl_pt_fail_rsp_send(conn_idx, ctrl_pt_id, THSCPS_RSP_ID_TEST_ROLE_ERR); - } - break; - - default: - thscps_ctrl_pt_fail_rsp_send(conn_idx, ctrl_pt_id, THSCPS_RSP_ID_UNSUPPORT); - break; - } - - if (THSCPS_EVT_INVALID != event.evt_type && s_thscps_env.evt_handler) { - s_thscps_env.evt_handler(&event); - } -} - -/** - ***************************************************************************************** - * @brief Encode THS Control Point Response value. - * - * @param[in] p_rsp_val: Pointer to Control Point Response value. - * @param[out] p_encoded_buff: Pointer to buffer encoded. - * - * @return Length of encoded - ***************************************************************************************** - */ -static uint16_t thscps_ctrl_pt_rsp_encode(thscps_rsp_val_t *p_rsp_val, uint8_t *p_encoded_buff) -{ - uint16_t length = 0; - - p_encoded_buff[length++] = THSCPS_CTRL_PT_RSP_CODE; - p_encoded_buff[length++] = p_rsp_val->cmd_id; - p_encoded_buff[length++] = p_rsp_val->status; - - return length; -} - -/** - ***************************************************************************************** - * @brief Encode THS Settings Response value. - * - * @param[in] p_rsp_val: Pointer to Settings Response value. - * @param[out] p_encoded_buff: Pointer to buffer encoded. - * - * @return Length of encoded - ***************************************************************************************** - */ -static uint16_t thscps_settings_rsp_encode(thscps_rsp_val_t *p_rsp_val, uint8_t *p_encoded_buff) -{ - uint16_t length = 0; - - p_encoded_buff[length++] = THSCPS_CTRL_PT_RSP_CODE; - p_encoded_buff[length++] = p_rsp_val->cmd_id; - p_encoded_buff[length++] = p_rsp_val->conn_idx; - p_encoded_buff[length++] = p_rsp_val->status; - - return length; -} - -/** - ***************************************************************************************** - * @brief Encode THS test information. - * - * @param[in] p_ctrl_val_pt: Pointer to test information. - * @param[out] p_encoded_buff: Pointer to buffer encoded. - * - * @return Length of encoded - ***************************************************************************************** - */ -static uint16_t thscps_test_info_encode(thscps_test_info_t *p_test_info, uint8_t *p_encoded_buff) -{ - uint16_t length = 0; - - // RSSI - if (p_test_info->rssi > 0) { - p_encoded_buff[length++] = 0; - p_encoded_buff[length++] = p_test_info->rssi; - } else { - p_encoded_buff[length++] = 1; - p_encoded_buff[length++] = 0 - p_test_info->rssi; - } - - // Right rate - p_encoded_buff[length++] = p_test_info->right_rate; - - // Throughput instant value - p_encoded_buff[length++] = LO_U16(p_test_info->instant_val); - p_encoded_buff[length++] = HI_U16(p_test_info->instant_val); - - // Throughput average value - p_encoded_buff[length++] = LO_U16(p_test_info->average_val); - p_encoded_buff[length++] = HI_U16(p_test_info->average_val); - - // Total recieved packets value in one second - p_encoded_buff[length++] = LO_U16(p_test_info->packets_val); - p_encoded_buff[length++] = HI_U16(p_test_info->packets_val); - - return length; -} - -/** - ***************************************************************************************** - * @brief Encode THS conn information. - * - * @param[in] p_ctrl_val_pt: Pointer to test information. - * @param[out] p_encoded_buff: Pointer to buffer encoded. - * - * @return Length of encoded - ***************************************************************************************** - */ -static uint16_t thscps_conn_info_encode(thscps_test_conn_info_t *p_conn_info, uint8_t *p_encoded_buff) -{ - uint16_t length = 0; - - // CI - p_encoded_buff[length++] = LO_U16(p_conn_info->ci); - p_encoded_buff[length++] = HI_U16(p_conn_info->ci); - - // PDU - p_encoded_buff[length++] = LO_U16(p_conn_info->pdu); - p_encoded_buff[length++] = HI_U16(p_conn_info->pdu); - - // MTU - p_encoded_buff[length++] = LO_U16(p_conn_info->mtu); - p_encoded_buff[length++] = HI_U16(p_conn_info->mtu); - - // PHY - p_encoded_buff[length++] = p_conn_info->tx_phy; - p_encoded_buff[length++] = p_conn_info->rx_phy; - - // TX POWER - if (p_conn_info->tx_power > 0) { - p_encoded_buff[length++] = 0; - p_encoded_buff[length++] = p_conn_info->tx_power; - } else { - p_encoded_buff[length++] = 1; - p_encoded_buff[length++] = 0 - p_conn_info->tx_power; - } - - // THS Mode - p_encoded_buff[length++] = p_conn_info->ths_mode; - - return length; -} - -/** - ***************************************************************************************** - * @brief Send Control Point Fail Response if its indicaiton has been enabled. - * - * @param[in] conn_idx: Connnection index. -* @param[in] cmd_id: Control Point ID. - * @param[in] status: Status response ID. - * - * @return Result of indicate value - ***************************************************************************************** - */ -static sdk_err_t thscps_ctrl_pt_fail_rsp_send(uint8_t conn_idx, thscps_ctrl_pt_id_t cmd_id, thscps_status_rsp_t status) -{ - uint8_t encoded_ctrl_pt_rsp[3]; - gatts_noti_ind_t ctrl_pt_rsp_ind; - - encoded_ctrl_pt_rsp[INDEX_0] = THSCPS_CTRL_PT_RSP_CODE; - encoded_ctrl_pt_rsp[INDEX_1] = cmd_id; - encoded_ctrl_pt_rsp[INDEX_2] = status; - - if (PRF_CLI_START_IND == s_thscps_env.ctrl_pt_ind_cfg[conn_idx]) { - ctrl_pt_rsp_ind.type = BLE_GATT_INDICATION; - ctrl_pt_rsp_ind.handle = prf_find_handle_by_idx(THSCPS_IDX_THS_CTRL_PT_VAL, - s_thscps_env.start_hdl, - (uint8_t *)&s_thscps_char_mask); - ctrl_pt_rsp_ind.length = LEN_3; - ctrl_pt_rsp_ind.value = encoded_ctrl_pt_rsp; - - return ble_gatts_noti_ind(conn_idx, &ctrl_pt_rsp_ind); - } - - return SDK_ERR_IND_DISABLED; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -sdk_err_t thscps_ctrl_pt_rsp_send(uint8_t conn_idx, thscps_rsp_val_t *p_rsp_val) -{ - uint8_t encoded_ctrl_pt_rsp[THSCPS_CTRL_PT_VAL_LEN]; - gatts_noti_ind_t ctrl_pt_rsp_ind; - uint16_t encoded_length; - - encoded_length =thscps_ctrl_pt_rsp_encode(p_rsp_val, encoded_ctrl_pt_rsp); - - if (PRF_CLI_START_IND == s_thscps_env.ctrl_pt_ind_cfg[conn_idx]) { - ctrl_pt_rsp_ind.type = BLE_GATT_INDICATION; - ctrl_pt_rsp_ind.handle = prf_find_handle_by_idx(THSCPS_IDX_THS_CTRL_PT_VAL, - s_thscps_env.start_hdl, - (uint8_t *)&s_thscps_char_mask); - ctrl_pt_rsp_ind.length = encoded_length; - ctrl_pt_rsp_ind.value = encoded_ctrl_pt_rsp; - - return ble_gatts_noti_ind(conn_idx, &ctrl_pt_rsp_ind); - } - - return SDK_ERR_IND_DISABLED; -} - -sdk_err_t thscps_test_setting_rsp_send(uint8_t conn_idx, thscps_rsp_val_t *p_rsp_val) -{ - uint8_t encoded_rsp[THSCPS_CTRL_PT_VAL_LEN]; - gatts_noti_ind_t test_setting_rsp_ntf; - uint16_t encoded_length; - - encoded_length =thscps_settings_rsp_encode(p_rsp_val, encoded_rsp); - - if (PRF_CLI_START_NTF == s_thscps_env.test_setting_ntf_cfg[conn_idx]) { - test_setting_rsp_ntf.type = BLE_GATT_NOTIFICATION; - test_setting_rsp_ntf.handle = prf_find_handle_by_idx(THSCPS_IDX_TEST_SETTING_VAL, - s_thscps_env.start_hdl, - (uint8_t *)&s_thscps_char_mask); - test_setting_rsp_ntf.length = encoded_length; - test_setting_rsp_ntf.value = encoded_rsp; - - return ble_gatts_noti_ind(conn_idx, &test_setting_rsp_ntf); - } - - return SDK_ERR_NTF_DISABLED; -} - -sdk_err_t thscps_test_info_send(uint8_t conn_idx, thscps_test_info_t *p_test_info) -{ - uint8_t encoded_test_info[THSCPS_TEST_INFO_VAL_LEN]; - gatts_noti_ind_t test_info_ntf; - uint16_t encoded_length; - - encoded_length = thscps_test_info_encode(p_test_info, encoded_test_info); - - if (PRF_CLI_START_NTF == s_thscps_env.test_info_ntf_cfg[conn_idx]) { - test_info_ntf.type = BLE_GATT_NOTIFICATION; - test_info_ntf.handle = prf_find_handle_by_idx(THSCPS_IDX_TEST_INFO_VAL, - s_thscps_env.start_hdl, - (uint8_t *)&s_thscps_char_mask); - test_info_ntf.length = encoded_length; - test_info_ntf.value = encoded_test_info; - - return ble_gatts_noti_ind(conn_idx, &test_info_ntf); - } - - return SDK_ERR_NTF_DISABLED; -} - -sdk_err_t thscps_conn_info_send(uint8_t conn_idx, thscps_test_conn_info_t *p_conn_info) -{ - uint8_t encoded_conn_info[THSCPS_CONN_INFO_VAL_LEN]; - gatts_noti_ind_t test_info_ntf; - uint16_t encoded_length; - - encoded_length = thscps_conn_info_encode(p_conn_info, encoded_conn_info); - - if (PRF_CLI_START_NTF == s_thscps_env.conn_info_ntf_cfg[conn_idx]) { - test_info_ntf.type = BLE_GATT_NOTIFICATION; - test_info_ntf.handle = prf_find_handle_by_idx(THSCPS_IDX_CONN_INFO_VAL, - s_thscps_env.start_hdl, - (uint8_t *)&s_thscps_char_mask); - test_info_ntf.length = encoded_length; - test_info_ntf.value = encoded_conn_info; - - return ble_gatts_noti_ind(conn_idx, &test_info_ntf); - } - - return SDK_ERR_NTF_DISABLED; -} - -sdk_err_t thscps_service_init(thscps_evt_handler_t evt_handler) -{ - s_thscps_env.evt_handler = evt_handler; - - return ble_server_prf_add(&thscps_prf_info); -} - -void thscps_test_state_set(thscps_test_state_t test_state) -{ - s_thscps_env.test_state = test_state; -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.h deleted file mode 100644 index 8273513..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/thscps/thscps.h +++ /dev/null @@ -1,298 +0,0 @@ -/** - ***************************************************************************************** - * - * @file thscps.h - * - * @brief Throughput Control Point Service API - * - ***************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/** - * @addtogroup BLE_SRV BLE Services - * @{ - * @brief Definitions and prototypes for the BLE Service Interface. - */ - -/** - * @defgroup BLE_SDK_THSCPS Throughput Control Point Client (THSCPS) - * @{ - * @brief THS Control Point Interface module. - * - * @details The Throughput Control Point Service contains the APIs and types, which can be used by the - * application to perform throughput parameters set. - * - * After \ref thscps_evt_handler_t variable is initialized, the application must - * call \ref thscps_service_init() to add the Throughput Control Point Service and - * THS Control Point, THS Control Point Response characteristics to the BLE Stack database. - */ - -#ifndef __THSCPS_H__ -#define __THSCPS_H__ - -#include "ble_prf_types.h" -#include "gr55xx_sys.h" -#include "custom_config.h" - -/** - * @defgroup THSCPS_MACRO Defines - * @{ - */ -#define THSCPS_CONNECTION_MAX (10 < CFG_MAX_CONNECTIONS ? \ - 10 : CFG_MAX_CONNECTIONS) /**< Maximum number of THSCPS connections. */ -#define THSCPS_CTRL_PT_VAL_LEN 20 /**< Length of the value of Control Point characteristic. */ -#define THSCPS_TEST_SETTING_VAL_LEN 20 /**< Length of the value of Test Setting characteristic. */ -#define THSCPS_TEST_INFO_VAL_LEN 20 /**< Length of the value of Test Information characteristic. */ -#define THSCPS_CONN_INFO_VAL_LEN 20 /**< Length of the value of Connection Information characteristic. */ -#define THSCPS_SERVICE_UUID 0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, 0x46, 0x44, 0xD3, \ - 0x01, 0x07, 0xED, 0xA6 /**< The UUID of THS Control Point Control Point Service \ - for setting advertising data. */ -#define THSCPS_ACTION_ON 0x01 /**< Start the action. */ -#define THSCPS_ACTION_OFF 0x00 /**< Stop the action. */ -#define THSCPS_CTRL_PT_RSP_CODE 0xff /**< Response code. */ -/** @} */ - -/** - * @defgroup THSCPS_ENUM Enumerations - * @{ - */ -/**@brief Local device GAP Role Type. */ -typedef enum { - THSCPS_TEST_ROLE_INVALID, /**< Test role: Invalid. */ - THSCPS_TEST_ROLE_SLAVE, /**< Test role: Slave. */ - THSCPS_TEST_ROLE_MASTER, /**< Test role: Master. */ -} thscps_test_role_t; - -/** - * @brief Specify PHY. */ -typedef enum { - THSCPS_LEGACY_ADV_PHY, /**< Undefined LE PHY. */ - THSCPS_1MBPS_PHY, /**< LE 1M PHY. */ - THSCPS_CODED_PHY, /**< LE Coded PHY. */ -} thscps_adv_phy_t; - -/**@brief Throughput Test State. */ -typedef enum { - THSCPS_TEST_STOP, /**< Throughput Test is not ongoing. */ - THSCPS_TEST_STARTED, /**< Throughput Test is ongoing. */ -} thscps_test_state_t; - -/**@brief THS Control Point Service Control Point IDs. */ -typedef enum { - THSCPS_CTRL_PT_INVALID, /**< Invalid cmd id. */ - THSCPS_CTRL_PT_TEST_ROLE, /**< Test role set. */ - THSCPS_CTRL_PT_ADV_PARAM, /**< Advertising parameters set. */ - THSCPS_CTRL_PT_ADV_ACTION, /**< Advertiding action. */ - THSCPS_CTRL_PT_SCAN_ACTION, /**< Scan action. */ - THSCPS_CTRL_PT_TEST_READY, /**< Ready for test. */ - THSCPS_CTRL_PT_SETTING, -} thscps_ctrl_pt_id_t; - -/**@brief Throughput service settings types. */ -typedef enum { - THSCPS_SETTINGS_TYPE_CI, /**< BLE Connection Interval parameter. */ - THSCPS_SETTINGS_TYPE_MTU, /**< MTU Size. */ - THSCPS_SETTINGS_TYPE_PDU, /**< PDU Size. */ - THSCPS_SETTINGS_TYPE_PHY, /**< Radio Phy mode, 1M, 2M, Encoded. */ - THSCPS_SETTINGS_TYPE_TRANS_MODE, /**< Data transmission mode. */ - THSCPS_SETTINGS_TYPE_TX_POWER, /**< Connect Tx power. */ - THSCPS_SETTINGS_TYPE_TOGGLE, /**< Throughput toggle state of sending the data. */ -} thscps_settings_type_t; - -/**@brief THS Control Point Response Types. */ -typedef enum { - THSCPS_RSP_ID_SUCCESS, /**< Success. */ - THSCPS_RSP_ID_UNSUPPORT, /**< Failed because of unsupport command. */ - THSCPS_RSP_ID_STATUS_ERR, /**< Failed because of disallowed status. */ - THSCPS_RSP_ID_PARAM_ERR, /**< Failed because of parameter error. */ - THSCPS_RSP_ID_TEST_ROLE_ERR, /**< Failed becaude of Test role error. */ - THSCPS_RSP_ID_SDK_ERR, /**< Failed becaude of SDK error Size. */ -} thscps_status_rsp_t; - -/**@brief THS Control Point Service Event Type. */ -typedef enum { - THSCPS_EVT_INVALID, /**< Throughput Control Point Service invalid event. */ - THSCPS_EVT_CTRL_PT_IND_ENABLE, /**< THS Control Point indicaiton is enabled. */ - THSCPS_EVT_CTRL_PT_IND_DISABLE, /**< THS Control Point indicaiton is disabled. */ - THSCPS_EVT_TSET_SET_NTF_ENABLE, /**< THS Test Information notification is enabled. */ - THSCPS_EVT_TSET_SET_NTF_DISABLE, /**< THS Test Information notification is disabled. */ - THSCPS_EVT_TSET_INFO_NTF_ENABLE, /**< THS Test Information notification is enabled. */ - THSCPS_EVT_TSET_INFO_NTF_DISABLE, /**< THS Test Information notification is disabled. */ - THSCPS_EVT_CONN_INFO_NTF_ENABLE, /**< THS Connection Information notification is enabled. */ - THSCPS_EVT_CONN_INFO_NTF_DISABLE, /**< THS Connection Information notification is disabled. */ - THSCPS_EVT_TEST_ROLE_SET, /**< Set Test role. */ - THSCPS_EVT_ADV_PRAM_SET, /**< Set advertising parameters. */ - THSCPS_EVT_ADV_ACTION, /**< Set advertising action. */ - THSCPS_EVT_SCAN_ACTION, /**< Set scan action. */ - THSCPS_EVT_SETTING_SET, /**< Throughput setting. */ -} thscps_evt_type_t; -/** @} */ - -/** - * @defgroup THSCPS_STRUCT Structures - * @{ - */ -/**@brief THS Setting Information value. */ -typedef struct { - uint16_t length; /**< THS Setting Information length. */ - const uint8_t *p_data; /**< THS Setting Information data. */ -} thscps_setting_t; - -/**@brief THS Test Information value. */ -typedef struct { - int8_t rssi; /**< RX rssi. */ - uint8_t right_rate; /**< RX right rate. */ - uint16_t instant_val; /**< Instant throughput value. */ - uint16_t average_val; /**< Average throughput value. */ - uint16_t packets_val; /**< Recieved Packects value. */ -} thscps_test_info_t; - -/**@brief THS connect Information value. */ -typedef struct { - uint16_t ci; /**< Connect Interval. */ - uint16_t pdu; /**< PDU. */ - uint16_t mtu; /**< MTU. */ - uint8_t tx_phy; /**< TX PHY. */ - uint8_t rx_phy; /**< RX PHY. */ - int8_t tx_power; /**< TX Power. */ - uint8_t ths_mode; /**< THS Mode. */ -} thscps_test_conn_info_t; - -/**@brief THS Control Point Advertising Parameters. */ -typedef struct { - thscps_adv_phy_t phy; /**< Specify what PHY the Controller has changed for TX/RX. */ - uint16_t interval; /**< Advertising interval. */ - uint16_t duration; /**< Advertising duration. */ - int8_t tx_power; /**< Advertising tx power. */ -} thscps_adv_param_t; - -/**@brief THS Control Point Response value. */ -typedef struct { - uint8_t cmd_id; /**< Commander ID. */ - thscps_status_rsp_t status; /**< Status. */ - uint8_t conn_idx; /**< Connection of cmd set. */ -} thscps_rsp_val_t; - -/**@brief THS Control Point Service event. */ -typedef struct { - uint8_t conn_idx; /**< The connection index. */ - thscps_evt_type_t evt_type; /**< THS client event type. */ - union { - uint8_t action_set; /**< Set action. */ - thscps_test_role_t test_role; /**< GAP role type. */ - thscps_adv_param_t adv_param; /**< Advertising parameters. */ - thscps_setting_t setting_info; /**< Setting infomation. */ - } param; /**< Event parameters. */ -} thscps_evt_t; -/** @} */ - -/** - * @defgroup THSCPS_TYPEDEF Typedefs - * @{ - */ -/**@brief THS Control Point Service event handler type. */ -typedef void (*thscps_evt_handler_t)(thscps_evt_t *p_evt); -/** @} */ - -/** - * @defgroup THSCPS_FUNCTION Functions - * @{ - */ -/** - ***************************************************************************************** - * @brief Initialize a THS Control Point Service instance and add in the DB. - * - * @param[in] evt_handler: THS Control Point Service event handler. - * - * @return Result of service initialization. - ***************************************************************************************** - */ -sdk_err_t thscps_service_init(thscps_evt_handler_t evt_handler); - -/** - ***************************************************************************************** - * @brief Send Control Point Response if its indicaiton has been enabled. - * - * @param[in] conn_idx: Connnection index. - * @param[in] p_rsp_val: Pointer to Response value. - * - * @return Result of indicate value. - ***************************************************************************************** - */ -sdk_err_t thscps_ctrl_pt_rsp_send(uint8_t conn_idx, thscps_rsp_val_t *p_rsp_val); - -/** - ***************************************************************************************** - * @brief Send Settings Response if its notification has been enabled. - * - * @param[in] conn_idx: Connnection index. - * @param[in] p_rsp_val: Pointer to Response value. - * - * @return Result of indicate value. - ***************************************************************************************** - */ -sdk_err_t thscps_test_setting_rsp_send(uint8_t conn_idx, thscps_rsp_val_t *p_rsp_val); - -/** - ***************************************************************************************** - * @brief Send Throughput Test Information if its notification has been enabled. - * - * @param[in] conn_idx: Connnection index. - * @param[in] p_test_info: Pointer to test information value. - * - * @return Result of notify value. - ***************************************************************************************** - */ -sdk_err_t thscps_test_info_send(uint8_t conn_idx, thscps_test_info_t *p_test_info); - -/** - ***************************************************************************************** - * @brief Send Throughput Test Connect Information if its notification has been enabled. - * - * @param[in] conn_idx: Connnection index. - * @param[in] p_conn_info: Pointer to connection information value. - * - * @return Result of notify value. - ***************************************************************************************** - */ -sdk_err_t thscps_conn_info_send(uint8_t conn_idx, thscps_test_conn_info_t *p_conn_info); - -/** - ***************************************************************************************** - * @brief Set throughput state set. - * - * @param[in] test_state: Throughput Test state. - ***************************************************************************************** - */ -void thscps_test_state_set(thscps_test_state_t test_state); -/** @} */ -#endif -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/tps.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/tps.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/tps.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps/tps.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/tps_c.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/tps_c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/tps_c.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/tps_c/tps_c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/uds.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/uds.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/uds.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/uds/uds.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.c deleted file mode 100644 index 971e4ce..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.c +++ /dev/null @@ -1,642 +0,0 @@ -/** - ***************************************************************************************** - * - * @file wechat.c - * - * @briefWeChat Service API Implementation. - * - ***************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include "wechat.h" -#include "ble_prf_types.h" -#include "ble_prf_utils.h" -#include "utility.h" -#define INDEX_0 0 -#define INDEX_1 1 -#define INDEX_2 2 -#define INDEX_3 3 -/* - * ENUMERATIONS - ***************************************************************************************** - */ -/**@brief WeChat Service Attributes Indexes. */ -enum wechat_attr_idx_t { - WECHAT_IDX_SVC, - - WECHAR_IDX_AIRSYNC_WRITE_CHAR, - WECHAR_IDX_AIRSYNC_WRITE_VAL, - - WECHAR_IDX_AIRSYNC_INDICATE_CHAR, - WECHAR_IDX_AIRSYNC_INDICATE_VAL, - WECHAR_IDX_AIRSYNC_INDICATE_CFG, - - WECHAR_IDX_AIRSYNC_READ_CHAR, - WECHAR_IDX_AIRSYNC_READ_VAL, - - WECHAT_IDX_PEDO_MEAS_CHAR, - WECHAT_IDX_PEDO_MEAS_VAL, - WECHAT_IDX_PEDO_MEAS_CFG, - - WECHAT_IDX_TARGET_CHAR, - WECHAT_IDX_TARGET_VAL, - WECHAT_IDX_TARGET_CFG, - - WECHAT_IDX_NB, -}; - -/* - * STRUCTURES - ***************************************************************************************** - */ -/**@brief WeChat service environment variable. */ -struct wechat_env_t { - wechat_evt_handler_t evt_handler; /**< WeChat Service event handler. */ - uint16_t start_hdl; /**< WeChat Service start handle. */ - wechat_pedo_meas_t pedo_meas; /**< WeChat pedometer measurement value. */ - wechat_pedo_target_t pedo_target; /**< WeChat pedometer target value. */ - uint8_t dev_mac[GAP_ADDR_LEN]; /**< WeChat device mac address. */ - uint16_t airsync_ind_cfg[WECHAT_CONNECTION_MAX]; /**< Indication configuration for Airsync. */ - uint16_t - pedo_meas_ntf_cfg[WECHAT_CONNECTION_MAX]; /**< Notification configuration for pedometer measurement. */ - uint16_t - pedo_target_ind_cfg[WECHAT_CONNECTION_MAX]; /**< Indication configuration for pedometer target. */ -}; - -/* -* LOCAL FUNCTION DECLARATION -***************************************************************************************** -*/ -static sdk_err_t wechat_init(void); -static void wechat_read_att_cb(uint8_t conn_idx, const gatts_read_req_cb_t *p_param); -static void wechat_write_att_cb(uint8_t conn_idx, const gatts_write_req_cb_t *p_param); -static void wechat_gatts_cmpl_cb(uint8_t conn_idx, uint8_t status, const ble_gatts_ntf_ind_t *p_ntf_ind); -static void wechat_cccd_set_cb(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value); -static uint8_t wechat_pedo_meas_encode(uint8_t *p_buff, wechat_pedo_meas_t *p_pedo_meas); -static uint8_t wechat_pedo_target_encode(uint8_t *p_buff, wechat_pedo_target_t *p_pedo_target); -static void wechat_pedo_target_set(const uint8_t *p_data, uint8_t length); -static sdk_err_t wechat_indicate_data_chunk(uint8_t conn_idx); - -/* - * LOCAL VARIABLE DEFINITIONS - ***************************************************************************************** - */ -static struct wechat_env_t s_wechat_env; -static wechat_data_t s_ind_data; -static const uint16_t s_char_mask = 0x3FFF; - -static const attm_desc_t wechat_attr_tab[WECHAT_IDX_NB] = { - [WECHAT_IDX_SVC] = {BLE_ATT_DECL_PRIMARY_SERVICE, READ_PERM_UNSEC, 0, 0}, - - [WECHAR_IDX_AIRSYNC_WRITE_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [WECHAR_IDX_AIRSYNC_WRITE_VAL] = {WECHAT_WRITE_CHAR_UUID, WRITE_REQ_PERM_UNSEC, ATT_VAL_LOC_USER, WECHAT_DATA_LEN}, - - [WECHAR_IDX_AIRSYNC_INDICATE_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [WECHAR_IDX_AIRSYNC_INDICATE_VAL] = {WECHAT_INDICATE_CHAR_UUID, INDICATE_PERM_UNSEC, - ATT_VAL_LOC_USER, WECHAT_DATA_LEN}, - [WECHAR_IDX_AIRSYNC_INDICATE_CFG] = {BLE_ATT_DESC_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0}, - - [WECHAR_IDX_AIRSYNC_READ_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [WECHAR_IDX_AIRSYNC_READ_VAL] = {WECHAT_READ_CHAR_UUID, READ_PERM_UNSEC, ATT_VAL_LOC_USER, 6}, - - [WECHAT_IDX_PEDO_MEAS_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [WECHAT_IDX_PEDO_MEAS_VAL] = {WECHAT_PEDOMETER_MEASUREMENT, READ_PERM_UNSEC | NOTIFY_PERM_UNSEC, - ATT_VAL_LOC_USER, WECHAT_DATA_LEN}, - [WECHAT_IDX_PEDO_MEAS_CFG] = {BLE_ATT_DESC_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0}, - - [WECHAT_IDX_TARGET_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, READ_PERM_UNSEC, 0, 0}, - [WECHAT_IDX_TARGET_VAL] = {WECHAT_TARGET, READ_PERM_UNSEC | INDICATE_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, - ATT_VAL_LOC_USER, WECHAT_DATA_LEN}, - [WECHAT_IDX_TARGET_CFG] = {BLE_ATT_DESC_CLIENT_CHAR_CFG, READ_PERM_UNSEC | WRITE_REQ_PERM_UNSEC, 0, 0}, -}; - -/**@brief WeChat interface required by profile manager. */ -static ble_prf_manager_cbs_t wechat_mgr_cbs = { - (prf_init_func_t)wechat_init, - NULL, - NULL -}; - -/**@brief WeChat GATT server Callbacks. */ -static gatts_prf_cbs_t wechat_gatts_cbs = { - wechat_read_att_cb, - wechat_write_att_cb, - NULL, - wechat_gatts_cmpl_cb, - wechat_cccd_set_cb -}; - -/**@brief WeChat Information. */ -static const prf_server_info_t wechat_prf_info = { - .max_connection_nb = WECHAT_CONNECTION_MAX, - .manager_cbs = &wechat_mgr_cbs, - .gatts_prf_cbs = &wechat_gatts_cbs -}; - -/* - * LOCAL FUNCTION DEFINITIONS - ******************************************************************************* - */ -/** - ***************************************************************************************** - * @brief Initialize WeChat service and create database in ATT. - * - * @return Error code to know if profile initialization succeed or not. - ***************************************************************************************** - */ -static sdk_err_t wechat_init(void) -{ - // The start hanlde must be set with PRF_INVALID_HANDLE to be allocated automatically by BLE Stack. - uint16_t start_hdl = PRF_INVALID_HANDLE; - const uint8_t wechat_svc_uuid[] = BLE_ATT_16_TO_16_ARRAY(WECHAT_SERVICE_UUID); - sdk_err_t error_code; - gatts_create_db_t gatts_db; - - error_code = memset_s(&gatts_db, sizeof(gatts_db), 0, sizeof(gatts_db)); - if (error_code < 0) { - return error_code; - } - - gatts_db.shdl = &start_hdl; - gatts_db.uuid = wechat_svc_uuid; - gatts_db.attr_tab_cfg = (uint8_t *)&s_char_mask; - gatts_db.max_nb_attr = WECHAT_IDX_NB; - gatts_db.srvc_perm = 0; - gatts_db.attr_tab_type = SERVICE_TABLE_TYPE_16; - gatts_db.attr_tab.attr_tab_16 = wechat_attr_tab; - - error_code = ble_gatts_srvc_db_create(&gatts_db); - if (SDK_SUCCESS == error_code) { - s_wechat_env.start_hdl = *gatts_db.shdl; - } - - return error_code; -} - -/** - ***************************************************************************************** - * @brief Handles reception of the attribute info request message. - * - * @param[in] conn_idx: Connection index - * @param[in] p_param: The parameters of the read request. - ***************************************************************************************** - */ -static void wechat_read_att_cb(uint8_t conn_idx, const gatts_read_req_cb_t *p_param) -{ - gatts_read_cfm_t cfm; - uint8_t encode_data[WECHAT_DATA_LEN]; - uint8_t handle = p_param->handle; - uint8_t tab_index = prf_find_idx_by_handle(handle, - s_wechat_env.start_hdl, - WECHAT_IDX_NB, - (uint8_t *)&s_char_mask); - - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - - switch (tab_index) { - case WECHAR_IDX_AIRSYNC_INDICATE_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_wechat_env.airsync_ind_cfg[conn_idx]; - break; - - case WECHAR_IDX_AIRSYNC_READ_VAL: - cfm.length = GAP_ADDR_LEN; - cfm.value = s_wechat_env.dev_mac; - break; - - case WECHAT_IDX_PEDO_MEAS_VAL: - cfm.length = wechat_pedo_meas_encode(encode_data, &s_wechat_env.pedo_meas); - cfm.value = encode_data; - break; - - case WECHAT_IDX_PEDO_MEAS_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_wechat_env.pedo_meas_ntf_cfg[conn_idx]; - break; - - case WECHAT_IDX_TARGET_VAL: - cfm.length = wechat_pedo_target_encode(encode_data, &s_wechat_env.pedo_target); - cfm.value = encode_data; - break; - - case WECHAT_IDX_TARGET_CFG: - cfm.length = sizeof(uint16_t); - cfm.value = (uint8_t *)&s_wechat_env.pedo_target_ind_cfg[conn_idx]; - break; - - default: - cfm.length = 0; - cfm.status = BLE_ATT_ERR_INVALID_HANDLE; - break; - } - - ble_gatts_read_cfm(conn_idx, &cfm); -} - -/** - ******************************************************************************* - * @brief Handles reception of the write request. - * - * @param[in] conn_idx: Connection index. - * @param[in] p_param: Pointer to the parameters of the write request. - ******************************************************************************* - */ -static void wechat_write_att_cb(uint8_t conn_idx, const gatts_write_req_cb_t *p_param) -{ - uint16_t handle = p_param->handle; - uint16_t cccd_value = 0; - uint8_t tab_index = 0; - wechat_evt_t event; - gatts_write_cfm_t cfm; - uint8_t ret; - - tab_index = prf_find_idx_by_handle(handle, - s_wechat_env.start_hdl, - WECHAT_IDX_NB, - (uint8_t *)&s_char_mask); - cfm.handle = handle; - cfm.status = BLE_SUCCESS; - - event.conn_idx = conn_idx; - event.evt_type = WECHAT_EVT_INVALID; - - switch (tab_index) { - case WECHAR_IDX_AIRSYNC_WRITE_VAL: - event.evt_type = WECHAT_EVT_AIRSYNC_DATA_RECIEVE; - event.param.data.p_data = p_param->value; - event.param.data.length = p_param->length; - break; - - case WECHAR_IDX_AIRSYNC_INDICATE_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = (PRF_CLI_START_IND == cccd_value ?\ - WECHAT_EVT_AIRSYNC_IND_ENABLE :\ - WECHAT_EVT_AIRSYNC_IND_DISABLE); - s_wechat_env.airsync_ind_cfg[conn_idx] = cccd_value; - break; - - case WECHAT_IDX_PEDO_MEAS_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = (PRF_CLI_START_NTF == cccd_value ?\ - WECHAT_EVT_PEDO_MEAS_NTF_ENABLE :\ - WECHAT_EVT_PEDO_MEAS_NTF_DISABLE); - s_wechat_env.pedo_meas_ntf_cfg[conn_idx] = cccd_value; - break; - - case WECHAT_IDX_TARGET_VAL: - wechat_pedo_target_set(p_param->value, p_param->length); - event.evt_type = WECHAT_EVT_PEDO_TARGET_UPDATE; - ret = memcpy_s(&event.param.pedo_target, sizeof(wechat_pedo_target_t), - &s_wechat_env.pedo_target, sizeof(wechat_pedo_target_t)); - if (ret < 0) { - return; - } - break; - - case WECHAT_IDX_TARGET_CFG: - cccd_value = le16toh(&p_param->value[0]); - event.evt_type = (PRF_CLI_START_IND == cccd_value ?\ - WECHAT_EVT_PEDO_TARGET_IND_ENABLE :\ - WECHAT_EVT_PEDO_TARGET_IND_DISABLE); - s_wechat_env.pedo_target_ind_cfg[conn_idx] = cccd_value; - break; - - default: - cfm.status = BLE_ATT_ERR_INVALID_HANDLE; - break; - } - - ble_gatts_write_cfm(conn_idx, &cfm); - - if (WECHAT_EVT_INVALID != event.evt_type && s_wechat_env.evt_handler) { - s_wechat_env.evt_handler(&event); - } -} - -/** - ***************************************************************************************** - * @brief Handles reception of the cccd recover request. - * - * @param[in]: conn_idx: Connection index - * @param[in]: handle: The handle of cccd attribute. - * @param[in]: cccd_value: The value of cccd attribute. - ***************************************************************************************** - */ -static void wechat_cccd_set_cb(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value) -{ - uint8_t tab_index = 0; - wechat_evt_t event; - - event.conn_idx = conn_idx; - event.evt_type = WECHAT_EVT_INVALID; - - if (!prf_is_cccd_value_valid(cccd_value)) { - return; - } - - tab_index = prf_find_idx_by_handle(handle, s_wechat_env.start_hdl, - WECHAT_IDX_NB, - (uint8_t *)&s_char_mask); - - switch (tab_index) { - case WECHAR_IDX_AIRSYNC_INDICATE_CFG: - event.evt_type = (PRF_CLI_START_IND == cccd_value ?\ - WECHAT_EVT_AIRSYNC_IND_ENABLE :\ - WECHAT_EVT_AIRSYNC_IND_DISABLE); - s_wechat_env.airsync_ind_cfg[conn_idx] = cccd_value; - break; - - case WECHAT_IDX_PEDO_MEAS_CFG: - event.evt_type = (PRF_CLI_START_NTF == cccd_value ?\ - WECHAT_EVT_PEDO_MEAS_NTF_ENABLE :\ - WECHAT_EVT_PEDO_MEAS_NTF_DISABLE); - s_wechat_env.pedo_meas_ntf_cfg[conn_idx] = cccd_value; - break; - - case WECHAT_IDX_TARGET_CFG: - event.evt_type = (PRF_CLI_START_IND == cccd_value ?\ - WECHAT_EVT_PEDO_TARGET_IND_ENABLE :\ - WECHAT_EVT_PEDO_TARGET_IND_DISABLE); - s_wechat_env.pedo_target_ind_cfg[conn_idx] = cccd_value; - break; - - default: - break; - } - - if (WECHAT_EVT_INVALID != event.evt_type && s_wechat_env.evt_handler) { - s_wechat_env.evt_handler(&event); - } -} - -/** - ***************************************************************************************** - * @brief Handles reception of the complete event. - * - * @param[in] conn_idx: Connection index. - * @param[in] p_param: Pointer to the parameters of the complete event. - ***************************************************************************************** - */ -static void wechat_gatts_cmpl_cb(uint8_t conn_idx, uint8_t status, const ble_gatts_ntf_ind_t *p_ntf_ind) -{ - uint8_t tab_index; - - tab_index = prf_find_idx_by_handle(p_ntf_ind->handle, s_wechat_env.start_hdl, - WECHAT_IDX_NB, - (uint8_t *)&s_char_mask); - if (WECHAR_IDX_AIRSYNC_INDICATE_VAL == tab_index) { - wechat_indicate_data_chunk(conn_idx); - } -} - -/** - ***************************************************************************************** - * @brief Encode WeChat pedometer measurement value. - * - * @param[in] p_buff: Pointer to encode buffer. - * @param[in] p_pedo_meas: Pointer to pedometer measurement value. - * - * @return Length of encoded. - ***************************************************************************************** - */ -static uint8_t wechat_pedo_meas_encode(uint8_t *p_buff, wechat_pedo_meas_t *p_pedo_meas) -{ - uint8_t encode_length = 0; - - p_buff[encode_length++] = p_pedo_meas->flag; - - // Encode step count - if (p_pedo_meas->flag & WECHAT_PEDO_FLAG_STEP_COUNT_BIT) { - p_buff[encode_length++] = p_pedo_meas->step_count[INDEX_0]; - p_buff[encode_length++] = p_pedo_meas->step_count[INDEX_1]; - p_buff[encode_length++] = p_pedo_meas->step_count[INDEX_2]; - } - - // Encode step distance - if (p_pedo_meas->flag & WECHAT_PEDO_FLAG_STEP_DISTENCE_BIT) { - p_buff[encode_length++] = p_pedo_meas->step_dist[INDEX_0]; - p_buff[encode_length++] = p_pedo_meas->step_dist[INDEX_1]; - p_buff[encode_length++] = p_pedo_meas->step_dist[INDEX_2]; - } - - // Encode step calorie - if (p_pedo_meas->flag & WECHAT_PEDO_FLAG_STEP_CALORIE_BIT) { - p_buff[encode_length++] = p_pedo_meas->step_calorie[INDEX_0]; - p_buff[encode_length++] = p_pedo_meas->step_calorie[INDEX_1]; - p_buff[encode_length++] = p_pedo_meas->step_calorie[INDEX_2]; - } - - return encode_length; -} - -/** - ***************************************************************************************** - * @brief Encode WeChat pedometer target value. - * - * @param[in] p_buff: Pointer to encode buffer. - * @param[in] p_pedo_meas: Pointer to pedometer target value. - * - * @return Length of encoded. - ***************************************************************************************** - */ -static uint8_t wechat_pedo_target_encode(uint8_t *p_buff, wechat_pedo_target_t *p_pedo_target) -{ - uint8_t encode_length = 0; - - if (p_pedo_target->flag & WECHAT_PEDO_FLAG_STEP_COUNT_BIT) { - p_buff[encode_length++] = p_pedo_target->flag; - p_buff[encode_length++] = p_pedo_target->step_count[INDEX_0]; - p_buff[encode_length++] = p_pedo_target->step_count[INDEX_1]; - p_buff[encode_length++] = p_pedo_target->step_count[INDEX_2]; - } - - return encode_length; -} - -/** - ***************************************************************************************** - * @brief Set wechat pedometer target value. - * - * @param[in] p_data: Pointer to data. - * @param[in] length: Length to data. - ***************************************************************************************** - */ -static void wechat_pedo_target_set(const uint8_t *p_data, uint8_t length) -{ - if ((p_data[INDEX_0] & WECHAT_PEDO_FLAG_STEP_COUNT_BIT) && (WECHAT_PEDO_TARGET_VAL_LEN == length)) { - s_wechat_env.pedo_target.flag = WECHAT_PEDO_FLAG_STEP_COUNT_BIT; - s_wechat_env.pedo_target.step_count[INDEX_0] = p_data[INDEX_1]; - s_wechat_env.pedo_target.step_count[INDEX_1] = p_data[INDEX_2]; - s_wechat_env.pedo_target.step_count[INDEX_2] = p_data[INDEX_3]; - } else { - return; - } -} - -/** - ***************************************************************************************** - * @brief Handle WeChat Airsync data indicate. - * - * @param[in] conn_idx: Connection index. - * - * @return Result of handle. - ***************************************************************************************** - */ -static sdk_err_t wechat_indicate_data_chunk(uint8_t conn_idx) -{ - uint16_t chunk_len = 0; - gatts_noti_ind_t wechat_ind; - sdk_err_t error_code; - - chunk_len = s_ind_data.length - s_ind_data.offset; - chunk_len = chunk_len > WECHAT_DATA_LEN ? WECHAT_DATA_LEN : chunk_len; - - if (chunk_len == 0) { - s_ind_data.p_data = NULL; - s_ind_data.length = 0; - s_ind_data.offset = 0; - - return SDK_SUCCESS; - } - - wechat_ind.type = BLE_GATT_INDICATION; - wechat_ind.handle = prf_find_handle_by_idx(WECHAR_IDX_AIRSYNC_INDICATE_VAL, - s_wechat_env.start_hdl, - (uint8_t *)&s_char_mask); - wechat_ind.length = chunk_len; - wechat_ind.value = (uint8_t *)s_ind_data.p_data + s_ind_data.offset; - - error_code = ble_gatts_noti_ind(conn_idx, &wechat_ind); - if (SDK_SUCCESS == error_code) { - s_ind_data.offset += chunk_len; - } - - return error_code; -} - -/* - * GLOBAL FUNCTION DEFINITIONS - ***************************************************************************************** - */ -sdk_err_t wechat_service_init(wechat_init_t *p_wechat_init) -{ - sdk_err_t ret; - if (p_wechat_init == NULL) { - return SDK_ERR_POINTER_NULL; - } - - s_wechat_env.evt_handler = p_wechat_init->evt_handler; - s_wechat_env.pedo_meas.flag = WECHAT_PEDO_FLAG_ALL_SUP_BIT; - s_wechat_env.pedo_target.flag = WECHAT_PEDO_FLAG_STEP_COUNT_BIT; - s_wechat_env.pedo_target.step_count[INDEX_0] = LO_UINT32_T(p_wechat_init->step_count_target); - s_wechat_env.pedo_target.step_count[INDEX_1] = L2_UINT32_T(p_wechat_init->step_count_target); - s_wechat_env.pedo_target.step_count[INDEX_2] = L3_UINT32_T(p_wechat_init->step_count_target); - ret = memcpy_s(s_wechat_env.dev_mac, GAP_ADDR_LEN, p_wechat_init->p_dev_mac, GAP_ADDR_LEN); - if (ret < 0) { - return ret; - } - - return ble_server_prf_add(&wechat_prf_info); -} - -sdk_err_t wechat_airsync_data_indicate(uint8_t conn_idx, uint8_t *p_data, uint16_t length) -{ - if (p_data == NULL || length == 0) { - return SDK_ERR_INVALID_PARAM; - } - - s_ind_data.p_data = p_data; - s_ind_data.length = length; - s_ind_data.offset = 0; - - return wechat_indicate_data_chunk(conn_idx); -} - -sdk_err_t wechat_pedo_measurement_send(uint8_t conn_idx, wechat_pedo_meas_t *p_pedo_meas) -{ - gatts_noti_ind_t pedo_meas_ntf; - uint8_t encode_data[WECHAT_DATA_LEN]; - uint8_t encode_len = 0; - sdk_err_t error_code = SDK_ERR_NTF_DISABLED; - uint8_t ret; - - if (p_pedo_meas == NULL) { - return SDK_ERR_POINTER_NULL; - } - - ret = memcpy_s(&s_wechat_env.pedo_meas, sizeof(wechat_pedo_meas_t), p_pedo_meas, sizeof(wechat_pedo_meas_t)); - if (ret < 0) { - return ret; - } - - encode_len = wechat_pedo_meas_encode(encode_data, &s_wechat_env.pedo_meas); - - if (s_wechat_env.pedo_meas_ntf_cfg[conn_idx] & PRF_CLI_START_NTF) { - pedo_meas_ntf.type = BLE_GATT_NOTIFICATION; - pedo_meas_ntf.handle = prf_find_handle_by_idx(WECHAT_IDX_PEDO_MEAS_VAL, - s_wechat_env.start_hdl, - (uint8_t *)&s_char_mask); - pedo_meas_ntf.length = encode_len; - pedo_meas_ntf.value = encode_data; - - error_code = ble_gatts_noti_ind(conn_idx, &pedo_meas_ntf); - } - - return error_code; -} - -sdk_err_t wechat_pedo_target_send(uint8_t conn_idx) -{ - gatts_noti_ind_t pedo_target_ind; - uint8_t encode_data[WECHAT_DATA_LEN]; - uint8_t encode_len = 0; - sdk_err_t error_code = SDK_ERR_IND_DISABLED; - - encode_len = wechat_pedo_target_encode(encode_data, &s_wechat_env.pedo_target); - - if (s_wechat_env.pedo_target_ind_cfg[conn_idx] & PRF_CLI_START_IND) { - pedo_target_ind.type = BLE_GATT_INDICATION; - pedo_target_ind.handle = prf_find_handle_by_idx(WECHAT_IDX_TARGET_VAL, - s_wechat_env.start_hdl, - (uint8_t *)&s_char_mask); - pedo_target_ind.length = encode_len; - pedo_target_ind.value = encode_data; - - error_code = ble_gatts_noti_ind(conn_idx, &pedo_target_ind); - } - - return error_code; -} - diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.h deleted file mode 100644 index 4f9a716..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wechat/wechat.h +++ /dev/null @@ -1,233 +0,0 @@ -/** - ***************************************************************************************** - * - * @file wechat.h - * - * @brief WeChat Service API. - * - ***************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/** - * @addtogroup BLE_SRV BLE Services - * @{ - * @brief Definitions and prototypes for the BLE Service interface. - */ -/** - * @defgroup BLE_SDK_WECHAT Wechat (WECHAT) - * @{ - * @brief Definitions and prototypes for the WeChat interface. - * - * @details The WeChat Service contains two modules: WeChat Airsync Protocol and WeChat - * Pedometer Protocol. - * - * WeChat Airsync Protocol opens the data link between the device and the vendor server, - * which supports sending data from the device to the vendor's server, as well as the vendor's - * data to the device. The protocol also opens the data link between the device and the WeChat server. - * The data format between the device and the WeChat server is stipulated by WeChat, such as login, - * new message notification, etc. - * - * WeChat Pedometer Protocol is based on GATT protocol, which requires less hardware - * capability of the device, and the manufacturer does not need a back-end server (that is, - * only need to develop the device) to dock with WeChat. It allows pedometers to connect to WeChat - * and transmit steps, kilometers, calories, moving targets, etc. - */ - -#ifndef WECHART_H -#define WECHART_H - -#include -#include -#include "gr55xx_sys.h" -#include "custom_config.h" - -/** - * @defgroup WECHAT_MACRO Defines - * @{ - */ -#define WECHAT_CONNECTION_MAX (10 < CFG_MAX_CONNECTIONS ? \ - 10 : CFG_MAX_CONNECTIONS) /**< Maximum number of WeChat connections. */ -#define WECHAT_DATA_LEN 20 /**< Maximum length of WeChat Data. */ -#define WECHAT_PEDO_TARGET_VAL_LEN 0x04 /**< Maximum length of WeChat pedometer target value. */ -#define WECHAT_PEDO_STEP_COUNT_MAX 0xFFFFFF /**< Maximum value of WeChat pedometer step count. */ - -/** - * @defgroup WECHAT_UUID WECHAT Service and Characteristic UUID - * @{ - * @brief WeChat Service, Airsync and Pedometer Characteristic UUID. - */ -#define WECHAT_SERVICE_UUID 0XFEE7 /**< WeChat Service UUID. */ -#define WECHAT_WRITE_CHAR_UUID 0XFEC7 /**< WeChat Airsync Write Characteristic UUID. */ -#define WECHAT_INDICATE_CHAR_UUID 0XFEC8 /**< WeChat Airsync Indication Characteristic UUID. */ -#define WECHAT_READ_CHAR_UUID 0XFEC9 /**< WeChat Airsync Read Characteristic UUID. */ -#define WECHAT_PEDOMETER_MEASUREMENT 0XFEA1 /**< WeChat Current Pedometer Measurement Characteristic UUID. */ -#define WECHAT_TARGET 0XFEA2 /**< WeChat Pedometer Target Characteristic UUID. */ -/** @} */ - -/** - * @defgroup WECHAT_PEDO_FLAG WECHAT pedeometer measurement flag - * @{ - * @brief WeChat pedeometer measurement flag bits. - */ -#define WECHAT_PEDO_FLAG_STEP_COUNT_BIT 0X01 /**< WeChat pedometer measurement step count flag bit. */ -#define WECHAT_PEDO_FLAG_STEP_DISTENCE_BIT 0X02 /**< WeChat pedometer measurement step distance flag bit. */ -#define WECHAT_PEDO_FLAG_STEP_CALORIE_BIT 0X04 /**< WeChat pedometer measurement step calorie flag bit. */ -#define WECHAT_PEDO_FLAG_ALL_SUP_BIT 0X07 /**< WeChat pedometer measurement all flag bit. */ -/** @} */ -/** @} */ - -/** - * @defgroup WECHAT_ENUM Enumerations - * @{ - */ -/**@brief WeChat Service event type.*/ -typedef enum { - WECHAT_EVT_INVALID, /**< WeChat invalid event. */ - WECHAT_EVT_AIRSYNC_IND_ENABLE, /**< WeChat Airsync indication has been enabled. */ - WECHAT_EVT_AIRSYNC_IND_DISABLE, /**< WeChat Airsync indication has been disabled. */ - WECHAT_EVT_PEDO_MEAS_NTF_ENABLE, /**< WeChat Pedometer measurement notification has been enabled. */ - WECHAT_EVT_PEDO_MEAS_NTF_DISABLE, /**< WeChat Pedometer measurement notification has been disabled. */ - WECHAT_EVT_PEDO_TARGET_IND_ENABLE, /**< WeChat Pedometer target indicaiton has been enabled. */ - WECHAT_EVT_PEDO_TARGET_IND_DISABLE, /**< WeChat Pedometer target indicaiton has been disabled. */ - WECHAT_EVT_PEDO_TARGET_UPDATE, /**< WeChat Pedometer target has been updated. */ - WECHAT_EVT_AIRSYNC_DATA_RECIEVE, /**< Recieved Airsync data. */ -} wechat_evt_type_t; -/** @} */ - -/** - * @defgroup WECHAT_STRUCT Structures - * @{ - */ -/**@brief WeChat current pedometer measurement variable. */ -typedef struct { - uint8_t flag; /**< Flag for WeChat current pedometer measurement. */ - uint8_t step_count[3]; /**< Step counts of pedometer measurement. */ - uint8_t step_dist[3]; /**< Step distance of pedometer measurement. */ - uint8_t step_calorie[3]; /**< Step Calorie of pedometer measurement. */ -} wechat_pedo_meas_t; - -/**@brief WeChat pedometer target variable. */ -typedef struct { - uint8_t flag; /**< Flag for WeChat pedometer target. */ - uint8_t step_count[3]; /**< Target of step pedometer counts. */ -} wechat_pedo_target_t; - -/**@brief WeChat service data. */ -typedef struct { - const uint8_t *p_data; /**< Pointer to data. */ - uint16_t length; /**< Length of data. */ - uint16_t offset; /**< Offset of data. */ -} wechat_data_t; - -/**@brief WeChat Service event.*/ -typedef struct { - uint8_t conn_idx; /**< The index of connection. */ - wechat_evt_type_t evt_type; /**< Event type. */ - union { - wechat_pedo_target_t pedo_target; /**< Pedometer target set value. */ - wechat_data_t data; /**< Data of Airsync. */ - } param; /**< Parameter of WeChat airsync event. */ -} wechat_evt_t; -/** @} */ - -/** - * @defgroup WECHAT_TYPEDEF Typedefs - * @{ - */ -/**@brief WeChat Service event handler type.*/ -typedef void (*wechat_evt_handler_t)(wechat_evt_t *p_evt); -/** @} */ - -/** - * @defgroup WECHAT_STRUCT Structures - * @{ - */ -/**@brief WeChat Service Init variable. */ -typedef struct { - wechat_evt_handler_t evt_handler; /**< WeChat Service event handler. */ - uint32_t step_count_target; /**< WeChat pedometer step count target value. */ - uint8_t *p_dev_mac; /**< Pointer to WeChat device MAC address. */ -} wechat_init_t; -/** @} */ - -/** - * @defgroup WECHAT_FUNCTION Functions - * @{ - */ -/** - ***************************************************************************************** - * @brief Initialize a WeChat Service instance and add in the DB. - * - * @param[in] p_wechat_init: Pointer to WeChat init value. - * - * @return Result of service initialization. - ***************************************************************************************** - */ -sdk_err_t wechat_service_init(wechat_init_t *p_wechat_init); - -/** - ***************************************************************************************** - * @brief WeChat Service Airsync indicate data. - * - * @param[in] conn_idx: The index of connection. - * @param[in] p_data: Pointer to data. - * @param[in] length: Length of data. - * - * @return Result of indicaition. - ***************************************************************************************** - */ -sdk_err_t wechat_airsync_data_indicate(uint8_t conn_idx, uint8_t *p_data, uint16_t length); - -/** - ***************************************************************************************** - * @brief Send WeChat pedometer measurement information. - * - * @param[in] conn_idx: The index of connection. - * @param[in] p_pedo_meas: Pointer to pedometer measurement. - * - * @return Result of send. - ***************************************************************************************** - */ -sdk_err_t wechat_pedo_measurement_send(uint8_t conn_idx, wechat_pedo_meas_t *p_pedo_meas); - -/** - ***************************************************************************************** - * @brief Send WeChat pedometer target value. - * - * @param[in] conn_idx: Connection index. - * - * @return Result of send. - ***************************************************************************************** - */ -sdk_err_t wechat_pedo_target_send(uint8_t conn_idx); -/** @} */ -#endif -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/wss.c b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/wss.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/wss.h b/gr551x/sdk_liteos/gr551x_sdk/components/profiles/wss/wss.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_att.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_att.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_audio.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_audio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_error.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_error.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_event.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_event.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gapc.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gapc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gapm.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gapm.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gatt.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gatt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gattc.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gattc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gatts.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_gatts.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_l2cap.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_l2cap.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_lcp.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_lcp.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_prf.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_prf.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_sec.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/ble_sec.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_dfu.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_dfu.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_fpb.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_fpb.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_lcp.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_lcp.h deleted file mode 100755 index b1eeb91..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_lcp.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_lcp.h - * - * @brief GR55XX LCP API - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/** -* @addtogroup BLE -* @{ -* @brief Definitions and prototypes for the BLE SDK interface. -*/ - -/** -* @addtogroup BLE_LCP Light Communication Protocol (LCP) -* @{ -* @brief Definitions and prototypes for the LCP interface. -*/ - -#ifndef _GR55XX_LCP_H_ -#define _GR55XX_LCP_H_ - - -/** @addtogroup BLE_LCP_TYPEDEFS Typedefs - * @{ */ -/** @brief RX handler callback function. */ -typedef uint16_t (*rx_handler_cb_t) (uint8_t header, uint8_t length, uint8_t *p_payload); -/** @} */ - -/** @addtogroup BLE_LCP_ENUMERATIONS Enumerations - * @{ */ -/** @brief Protocol Mode. */ -enum PROTOCOL_MODE { - BLE_ADV, /**< BLE ADV mode. */ - BLE_SCAN, /**< BLE SCAN mode. */ - LCP_TX, /**< LCP TX mode. */ - LCP_RX, /**< LCP RX mode. */ -}; -/** @} */ - -/** @addtogroup BLE_LCP_STRUCTURES Structures - * @{ */ -/** @brief LCP Parameter. */ -typedef struct { - uint8_t mode; /**< Set protocol mode, see @ref PROTOCOL_MODE. */ - int8_t txpwr_dbm; /**< The value of the tx power(range: -20-7), uint: dBm. */ - uint8_t ch_idx; /**< The value of the channel index(range: 0-39). */ - uint32_t freq; /**< The value of the frequency(range: 2360-2520), uint: MHz. */ - uint32_t access_address; /**< The value of the access address. */ - uint32_t crc_init; /**< The initial value of the crc. */ - rx_handler_cb_t rx_handler_cb; /**< The callback function of rx. */ -} gdx_lcp_config_t; -/** @} */ - -/** @addtogroup BLE_LCP_FUNCTIONS Functions - * @{ */ -/** - **************************************************************************************** - * @brief Initialize LCP. - * - * @param[in] gdx_lcp_config: Configure the parameter of LCP, @ref gdx_lcp_config_t. - * - * @retval ::SDK_SUCCESS: The LCP parameter is successfully configured. - * @retval ::SDK_ERR_POINTER_NULL: Invalid pointer supplied. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_init(gdx_lcp_config_t *gdx_lcp_config); - -/** - **************************************************************************************** - * @brief Deinitialize LCP. - * - * @retval ::SDK_SUCCESS: The LCP is successfully Deinitialized. - **************************************************************************************** - */ -uint16_t gdx_lcp_deinit(void); - -/** - **************************************************************************************** - * @brief Set the tx power of LCP. - * - * @param[in] txpwr_dbm: The value of the tx power, Range: -20dbm to 7dbm. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_tx_power_set(int8_t txpwr_dbm); - -/** - **************************************************************************************** - * @brief Get the tx power of LCP. - * - * @param[in] txpwr_dbm: The value of the tx power, Range: -20dbm to 7dbm. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_POINTER_NULL: Invalid pointer supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_tx_power_get(int8_t *txpwr_dbm); - -/** - **************************************************************************************** - * @brief Set the channel of LCP. - * - * @param[in] freq: The value of the frequency, Range: 2360MHz to 2520MHz. - * @param[in] ch_idx: The value of the channel index, Range: 0 to 39. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_channel_set(uint32_t freq, uint8_t ch_idx); - -/** - **************************************************************************************** - * @brief Get the channel of LCP. - * - * @param[in] freq: The value of the frequency, Range: 2360MHz to 2520MHz. - * @param[in] ch_idx: The value of the channel index, Range: 0 to 39. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_POINTER_NULL: Invalid pointer supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_channel_get(uint32_t *freq, uint8_t *ch_idx); - -/** - **************************************************************************************** - * @brief Transmmit a packet. - * - * @param[in] header: The header of the packet. - * @param[in] length: The length of the packet payload. - * @param[in] p_payload: The pointer of the packet payload. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_data_tx(uint8_t header, uint8_t length, uint8_t *p_payload); - -/** - **************************************************************************************** - * @brief Start receiving packets - * - * @retval ::SDK_SUCCESS: Operation is Success. - **************************************************************************************** - */ -uint16_t gdx_lcp_rx_start(void); - -/** - **************************************************************************************** - * @brief Stop receiving packets - * - * @retval ::SDK_SUCCESS: Operation is Success. - **************************************************************************************** - */ -uint16_t gdx_lcp_rx_stop(void); - -/** @} */ - -#endif - -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_nvds.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_nvds.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_pwr.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_pwr.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_sys.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_sys.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_sys_cfg.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr55xx_sys_cfg.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr_includes.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/gr_includes.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/grx_sys.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/grx_sys.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/lcp_sdk.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/lcp_sdk.h deleted file mode 100755 index b1a119b..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/lcp_sdk.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - **************************************************************************************** - * - * @file lcp_sdk.h - * - * @brief LCP SDK API - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/** -* @addtogroup BLE -* @{ -* @brief Definitions and prototypes for the BLE SDK interface. -*/ - -/** -* @addtogroup BLE_LCP Light Communication Protocol (LCP) -* @{ -* @brief Definitions and prototypes for the LCP interface. -*/ - -#ifndef _LCP_SDK_H_ -#define _LCP_SDK_H_ - - -/** @addtogroup BLE_LCP_TYPEDEFS Typedefs - * @{ */ -/** @brief RX handler callback function. */ -typedef uint16_t (*rx_handler_cb_t) (uint8_t header, uint8_t length, uint8_t *p_payload); -/** @} */ - -/** @addtogroup BLE_LCP_ENUMERATIONS Enumerations - * @{ */ -/** @brief Protocol Mode. */ -enum PROTOCOL_MODE { - BLE_ADV, /**< BLE ADV mode. */ - BLE_SCAN, /**< BLE SCAN mode. */ - LCP_TX, /**< LCP TX mode. */ - LCP_RX, /**< LCP RX mode. */ -}; -/** @} */ - -/** @addtogroup BLE_LCP_STRUCTURES Structures - * @{ */ -/** @brief LCP Parameter. */ -typedef struct { - uint8_t mode; /**< Set protocol mode, see @ref PROTOCOL_MODE. */ - int8_t txpwr_dbm; /**< The value of the tx power(range: -20-7), uint: dBm. */ - uint8_t ch_idx; /**< The value of the channel index(range: 0-39). */ - uint32_t freq; /**< The value of the frequency(range: 2360-2520), uint: MHz. */ - uint32_t access_address; /**< The value of the access address. */ - uint32_t crc_init; /**< The initial value of the crc. */ - rx_handler_cb_t rx_handler_cb; /**< The callback function of rx. */ -} gdx_lcp_config_t; -/** @} */ - -/** @addtogroup BLE_LCP_FUNCTIONS Functions - * @{ */ -/** - **************************************************************************************** - * @brief Initialize LCP. - * - * @param[in] gdx_lcp_config: Configure the parameter of LCP, @ref gdx_lcp_config_t. - * - * @retval ::SDK_SUCCESS: The LCP parameter is successfully configured. - * @retval ::SDK_ERR_POINTER_NULL: Invalid pointer supplied. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_init(gdx_lcp_config_t *gdx_lcp_config); - -/** - **************************************************************************************** - * @brief Deinitialize LCP. - * - * @retval ::SDK_SUCCESS: The LCP is successfully Deinitialized. - **************************************************************************************** - */ -uint16_t gdx_lcp_deinit(void); - -/** - **************************************************************************************** - * @brief Set the tx power of LCP. - * - * @param[in] txpwr_dbm: The value of the tx power, Range: -20dbm to 7dbm. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_tx_power_set(int8_t txpwr_dbm); - -/** - **************************************************************************************** - * @brief Get the tx power of LCP. - * - * @param[in] txpwr_dbm: The value of the tx power, Range: -20dbm to 7dbm. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_POINTER_NULL: Invalid pointer supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_tx_power_get(int8_t *txpwr_dbm); - -/** - **************************************************************************************** - * @brief Set the channel of LCP. - * - * @param[in] freq: The value of the frequency, Range: 2360MHz to 2520MHz. - * @param[in] ch_idx: The value of the channel index, Range: 0 to 39. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_channel_set(uint32_t freq, uint8_t ch_idx); - -/** - **************************************************************************************** - * @brief Get the channel of LCP. - * - * @param[in] freq: The value of the frequency, Range: 2360MHz to 2520MHz. - * @param[in] ch_idx: The value of the channel index, Range: 0 to 39. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_POINTER_NULL: Invalid pointer supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_channel_get(uint32_t *freq, uint8_t *ch_idx); - -/** - **************************************************************************************** - * @brief Transmmit a packet. - * - * @param[in] header: The header of the packet. - * @param[in] length: The length of the packet payload. - * @param[in] p_payload: The pointer of the packet payload. - * - * @retval ::SDK_SUCCESS: Operation is Success. - * @retval ::SDK_ERR_INVALID_PARAM: Invalid parameter supplied. - **************************************************************************************** - */ -uint16_t gdx_lcp_data_tx(uint8_t header, uint8_t length, uint8_t *p_payload); - -/** - **************************************************************************************** - * @brief Start receiving packets - * - * @retval ::SDK_SUCCESS: Operation is Success. - **************************************************************************************** - */ -uint16_t gdx_lcp_rx_start(void); - -/** - **************************************************************************************** - * @brief Stop receiving packets - * - * @retval ::SDK_SUCCESS: Operation is Success. - **************************************************************************************** - */ -uint16_t gdx_lcp_rx_stop(void); - -/** @} */ - -#endif - -/** @} */ -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/LICENSE b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/LICENSE deleted file mode 100644 index 152dc0b..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/LICENSE +++ /dev/null @@ -1,64 +0,0 @@ -End User License Agreement - -THIS END USER LICENSE AGREEMENT (“AGREEMENT”) IS A LEGAL AGREEMENT BETWEEN YOU (EITHER A SINGLE INDIVIDUAL, OR SINGLE LEGAL ENTITY) AND【Shenzhen Goodix Technology Co., Ltd.】 (HERE AFTER REFERRED TO AS"【 Goodix 】") FOR THE USE OF THE SOFTWARE ACCOMPANYING THIS AGREEMENT. Goodix IS ONLY WILLING TO LICENSE THE SOFTWARE TO YOU ON CONDITION THAT YOU ACCEPT ALL OF THE TERMS IN THIS AGREEMENT. BY DOWNDOADING OR BY INSTALLING OR OTHERWISE USING OR COPYING THE SOFTWARE YOU INDICATE THAT YOU AGREE TO BE BOUND BY ALL OF THE TERMS OF THIS AGREEMENT. IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, Goodix WILL NOT LICENSE THE SOFTWARE TO YOU AND YOU MAY NOT INSTALL, USE OR COPY THE SOFTWARE, AND YOU SHALL PROMPTLY DESTROY, DELETE, OR RETURN THE SOFTWARE TO YOUR SUPPLIER. - -“SOFTWARE” means the software in object code provided under the terms of this Agreement. - -【Shenzhen, China】 is the signing place of this Agreement. - -1. GRANT OF LICENSE -In consideration of your agreement to abide by the following terms, and subject to the terms and conditions of this Agreement, Goodix hereby grants YOU, a non-transferable, non-exclusive, no-charge, royalty-free, revocable, perpetual, worldwide copyright license (without the right to sublicense) to internally use and copy the SOFTWARE to reproduce, prepare any work that is based on (or derived from) the Software, and to manufacture, have manufactured, or sell, supply or distribute any products which use or embody any of the SOFTWARE or any of the intellectual property rights embodied therein. - -All rights to the SOFTWARE and all intellectual property rights contained therein are reserved and shall remain the sole and exclusive property of Goodix. The SOFTWARE is licensed but not sold. Except as expressly licensed in Clause 1, in no event shall the license granted in this Clause 1 be construed as granting YOU expressly or by implication, estoppels or otherwise, licenses to any intellectual property rights, including but not limited to patent rights, copyrights, trademark or trade secret in the SOFTWARE. - -2. RESTRICTIONS -YOU shall reproduce and not remove or obscure any notice incorporated by Goodix in the SOFTWARE to protect Goodix’s intellectual property rights embodied therein. - -YOU shall not decompile, disassemble, or reverse engineer the SOFTWARE. - -YOU shall not distribute the SOFTWARE under an open source license as listed by the Open Source Initiative (a non-profit corporation whose website is www.opensource.org), or other license which requires the source code or object code of the SOFTWARE to be licensed or otherwise shared with any third party. - -3. CONFLICT WITH OPEN SOURCE SOFTWARE LICENSE -The SOFTWARE may contain open source software. If the license applied on such open source software has conflict with this Agreement, the license applied on such open source software will prevail and apply to the open source software. - -4. Use with Third Party Products. -If YOU use the SOFTWARE together with third-party products, such use is at Your risk. You are responsible for complying with any third-party provider terms, including its privacy policy. Goodix does not provide support or guarantee ongoing integration support for products that are not a native part of the Cisco Technology. - -5. FEEDBACK -YOU may choose to provide suggestions, comments, feedback, ideas, modifications or know-how (whether in oral or written form) relating to the use of the SOFTWARE ("Feedback") to Goodix under the terms of this Agreement. YOU hereby grants to Goodix and its affiliates, under all of you and your affiliates’ (as applicable) intellectual property rights, a perpetual, irrevocable, royalty free, non-exclusive, worldwide license to (i) use, copy and modify the Feedback; (ii) sell, supply, or otherwise distribute the Feedback; (iii) design, have designed, manufacture, have manufactured, use, import, sell, and otherwise distribute and dispose of products that incorporate the Feedback; and (iv) sublicense (together with the rights to further sublicense) the rights granted in this paragraph to any third party. - -6. NO WARRANTY -YOU AGREE THAT THE SOFTWARE IS PROVIDED BY Goodix ON AN "AS IS" BASIS. Goodix MAKES NO WARRANTY, EXPRESSED OR IMPLIED OR STATUTORY, WITH RESPECT TO ANY OF THE SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. - -YOU EXPRESSLY ASSUME ALL LIABILITIES AND RISKS, FOR USE OR OPERATION OF THE SOFTWARE, INCLUDING WITHOUT LIMITATION, SOFTWARE APPLICATIONS DESIGNED OR INTENDED FOR MISSION CRITICAL APPLICATIONS, SUCH AS PACEMAKERS, WEAPONRY, AIRCRAFT NAVIGATION, FACTORY CONTROL SYSTEMS, ETC. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -7. NO LIABILITY -PLEASE NOTE THAT YOU SHOULD USE THE SOFTWARE AT YOUR OWN RISK. - -IN NO EVENT SHALL Goodix BE LIABLE FOR ANY DIRECT OR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHER LEGAL THEORY, EVEN IF Goodix HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. EVEN IF THE SOFTWARE HAS ANY MATERIAL, VERIFIABLE, AND REPRODUCIBLE PROGRAM ERRORS, Goodix SHALL HAVE NO LIABILITY TO MODIFY SUCH ERRORS. - -NOTWITHSTANDING ANYTHING TO THE CONTRARY CONTAINED IN THIS AGREEMENT, THE MAXIMUM LIABILITY OF Goodix TO YOU IN AGGREGATE FOR ALL CLAIMS MADE AGAINST Goodix IN CONTRACT TORT OR OTHERWISE UNDER OR IN CONNECTION WITH THE SUBJECT MATTER OF THIS AGREEMENT SHALL NOT EXCEED THE TOTAL OF SUMS RECEIVED BY Goodix FROM YOU FOR THIS AGREEMENT. THE EXISTENCE OF MORE THAN ONE CLAIM WILL NOT ENLARGE OR EXTEND THE LIMIT. - -8. CONFIDENTIALITY -YOU acknowledge and agree that the SOFTWARE provided under this Agreement contain trade secrets and confidential material of Goodix and YOU agree to maintain all such information in confidence and apply security measures no less stringent than the measures which YOU apply to protect your own like information, but not less than a reasonable degree of care, to prevent their unauthorized disclosure and use. The period of confidentiality shall be indefinite. YOU agree not to use any such information other than in normal use of the SOFTWARE under the license granted in this Agreement. - -9. TERM AND TERMINATION -This Agreement shall remain in force until terminated. Goodix may terminate this Agreement at any time with or without any cause. Upon termination of this Agreement, YOU shall immediately stop using the SOFTWARE and confidential information and destroy all copies of the SOFTWARE and confidential information in your possession, together with all documentation and related materials. The provisions of clauses 2, 3, 4, 5, 6, 7,8, 9 and 10 shall survive termination of this Agreement. - -10. GENERAL -Any provision of this Agreement which is prohibited or unenforceable in any jurisdiction shall be ineffective to the extent of such prohibition or unenforceability without affecting, impairing or invalidating the remaining provisions hereof. - -The failure by Goodix to enforce any of the provisions of this Agreement, unless waived in writing, shall not constitute a waiver of Goodix 's rights to enforce such provision or any other provision of this Agreement in the future. - -Each party will comply with all laws and regulations applicable to their respective obligations under this AGREEMENT. Goodix may restrict the availability of the SOFTWARE in any particular location or modify or discontinue features to comply with applicable laws and regulations. - -If YOU use the SOFTWARE in a location with local laws requiring a designated entity to be responsible for collection of data about individual end users and transfer of data outside of that jurisdiction (e.g. Russia and China), YOU acknowledge that YOU are the entity responsible for complying with such laws. - -This Agreement does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor. - -This Agreement shall be governed by and construed in accordance with the laws of People’s Republic of China, without reference to the principles of conflicts of laws. Any dispute arising out of or relating to this Agreement shall be submitted to Shenzhen Nanshan District People's Court and the parties waive all objections to that jurisdiction and venue. - ---------------------------------------------------------------------- -Copyright (C) 【starting year of this Agreement】【FULL NAME OF THE LICENSOR】 All rights reserved. - -END OF TERMS AND CONDITIONS diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/libble_sdk.a b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/linker/lib_gcc/libble_sdk.a deleted file mode 100755 index 87c42bb8b3f55a40b3dc004f2af3d1c999e73584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3864174 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 z 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

~=0N`04L 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

  • `ta%-My}fdcoe^pq7=tJ5ke$~y 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%0A?lm>9kfsQXEyb+Z6^+4br0CzK`x*I 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 I|J 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

    k8&&&|dEKyC>CQ*y(Z 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

    K{M%Ac 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

    ZxOi!3|tz+RV@?3hHOlVWsxk-pC6 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

    yH(nM)e1E)#Lm2|c#3AdjDV~SX5Sfkp=(b#F7 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

    LL-c2;WjppB@`Z21V!pzP-d;kL+ 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 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/patch.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/patch.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/patch_tab.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/patch_tab.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/components/sdk/platform_sdk.h b/gr551x/sdk_liteos/gr551x_sdk/components/sdk/platform_sdk.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/drivers/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_adc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_adc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_adc_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_adc_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_aon_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_aon_wdt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_bod.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_bod.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_comp.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_comp.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv_config.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv_error.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_drv_error.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_dual_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_dual_tim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_gpiote.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_gpiote.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_graphics_qspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_graphics_qspi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2c.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2c_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2c_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2s.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2s.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2s_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_i2s_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_io.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_io.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_iso7816.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_iso7816.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwm.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwm.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwm_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwm_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwr_mgmt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_pwr_mgmt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_qspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_qspi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_qspi_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_qspi_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rng.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rng.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rtc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rtc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rtos_cfg.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_rtos_cfg.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_soft_encoder.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_soft_encoder.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_spi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_spi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_spi_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_spi_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_tim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_uart.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_uart.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_uart_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/app_uart_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_delay.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_delay.h deleted file mode 100755 index 19a0883..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_delay.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_delay.h - * - * @brief PERIPHERAL API DELAY DRIVER - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#ifndef __GR55xx_DELAY_H__ -#define __GR55xx_DELAY_H__ - -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined ( __CC_ARM ) - -#ifndef __STATIC_FORCEINLINE -#define __STATIC_FORCEINLINE static __forceinline /**< Static inline define */ -#endif - -#elif defined ( __GNUC__ ) - -#ifndef __STATIC_FORCEINLINE -#define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline /**< Static inline define */ -#endif - -#else - -#ifndef __STATIC_FORCEINLINE -#define __STATIC_FORCEINLINE __STATIC_INLINE /**< Static inline define */ -#endif - -#endif - -/** - * @brief Function for delaying execution for number of microseconds. - * - * @note GR55xxx is based on ARM Cortex-M4, and this fuction is based on Data Watchpoint and Trace (DWT) unit - * so delay is precise. - * - * @param number_of_us: The maximum delay time is about 67 seconds in 64M system clock. - * The faster the system clock, the shorter the maximum delay time. - * - */ -#if defined(GR5515_E) -void delay_us(uint32_t number_of_us); -#else -__STATIC_FORCEINLINE void delay_us(uint32_t number_of_us) -{ - const uint8_t clocks[] = {64, 48, 16, 24, 16, 32}; - uint32_t cycles = number_of_us * (clocks[AON->PWR_RET01 & AON_PWR_REG01_SYS_CLK_SEL]); - - if (number_of_us == 0) { - return; - } - - // Save the DEMCR register value which is used to restore it - uint32_t core_debug_initial = CoreDebug->DEMCR; - // Enable DWT - CoreDebug->DEMCR = core_debug_initial | CoreDebug_DEMCR_TRCENA_Msk; - - // Save the CTRL register value which is used to restore it - uint32_t dwt_ctrl_initial = DWT->CTRL; - // Enable cycle counter - DWT->CTRL = dwt_ctrl_initial | DWT_CTRL_CYCCNTENA_Msk; - - // Get start value of the cycle counter. - uint32_t cyccnt_initial = DWT->CYCCNT; - - // Wait time end - while ((DWT->CYCCNT - cyccnt_initial) < cycles) { } - - // Restore registers. - DWT->CTRL = dwt_ctrl_initial; - CoreDebug->DEMCR = core_debug_initial; -} -#endif - -/** - * @brief Function for delaying execution for number of milliseconds. - * - * @note GR55xx is based on ARM Cortex-M4, and this fuction is based on Data Watchpoint and Trace (DWT) - * unit so delay is precise. - * - * @note Function internally calls @ref delay_us so the maximum delay is the - * same as in case of @ref delay_us. - * - * @param number_of_ms: The maximum delay time is about 67 seconds in 64M system clock. - * The faster the system clock, the shorter the maximum delay time. - * - */ -#if defined(GR5515_E) -void delay_ms(uint32_t number_of_ms); -#else -#define DELAY_CON_FACTOR 1000 -__STATIC_FORCEINLINE void delay_ms(uint32_t number_of_ms) -{ - delay_us(DELAY_CON_FACTOR * number_of_ms); - return; -} -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_DELAY_H__ */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal.h deleted file mode 100755 index 601c4c0..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal.h +++ /dev/null @@ -1,390 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal.h - * @author BLE Driver Team - * @brief This file contains all the functions prototypes for the HAL - * module driver. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_HAL HAL - * @brief HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_H__ -#define __GR55xx_HAL_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" -#include "gr55xx_hal_conf.h" -#include "gr55xx_hal_def.h" -#include "gr55xx_delay.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup HAL_HAL_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_HAL_Callback Callback - * @{ - */ - -/** - * @brief HAL_HAL Callback function definition - */ - -typedef struct _hal_callback { - void (*msp_init)(void); /**< HAL init MSP callback */ - void (*msp_deinit)(void); /**< HAL de-init MSP callback */ -} hal_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_MACRO Defines - * @{ - */ - -/* Private macros ------------------------------------------------------------*/ -/* Exported macros ------------------------------------------------------------*/ -/** @defgroup HAL_Exported_Constants HAL Exported Constants - * @{ - */ - -/** @brief compare if a > b - * @sa CO_MAX - */ -#define CO_MAX(a, b) ((a) > (b) ? (a) : (b)) - -/** @brief Disable BLE_IRQn and BLESLP_IRQn. - * @sa BLE_INT_DISABLE - */ -#define BLE_INT_DISABLE() \ -do { \ - volatile uint32_t __ble_l_irq_rest = __get_PRIMASK(); \ - volatile bool __ble_int_status = NVIC_GetEnableIRQ(BLE_IRQn) || NVIC_GetEnableIRQ(BLESLP_IRQn); \ - __set_PRIMASK(1); \ - if (__ble_int_status) { \ - NVIC_DisableIRQ(BLE_IRQn); \ - NVIC_DisableIRQ(BLESLP_IRQn); \ - } \ - __set_PRIMASK(__ble_l_irq_rest) -/** @brief Restore BLE_IRQn and BLESLP_IRQn. - * @sa BLE_INT_RESTORE - */ -#define BLE_INT_RESTORE() \ - __ble_l_irq_rest = __get_PRIMASK(); \ - __set_PRIMASK(1); \ - if (__ble_int_status) \ - { \ - NVIC_EnableIRQ(BLE_IRQn); \ - NVIC_EnableIRQ(BLESLP_IRQn); \ - } \ - __set_PRIMASK(__ble_l_irq_rest); \ -} while (0) - -#ifdef GR5515_E -/** @brief Disable interrupts globally in the system. - * This macro must be used in conjunction with the @ref GLOBAL_INT_RESTORE macro. - */ -#define GLOBAL_INT_DISABLE() \ -do { \ - extern uint32_t global_int_disable(void); \ - uint32_t __res_mask = global_int_disable() - -/** @brief Restore global interrupt. - * @sa GLOBAL_INT_RESTORE - */ -#define GLOBAL_INT_RESTORE() \ - extern void global_int_enable(uint32_t mask); \ - global_int_enable(__res_mask); \ -} while (0) -#else -/** @brief Disable interrupts globally in the system. - * This macro must be used in conjunction with the @ref GLOBAL_INT_RESTORE macro - * since this last one will close the brace that the current macro opens. This - * means that both macros must be located at the same scope level. - */ -#define GLOBAL_INT_DISABLE() \ -do { \ - volatile uint32_t __nvic_iser0 = 0xFFFFFFFF; \ - volatile uint32_t __nvic_iser1 = 0xFFFFFFFF; \ - volatile uint32_t __ret_pri = __get_PRIMASK(); \ - __set_PRIMASK(1); \ - if ((NVIC->ICER[0] != 0xFFFFFFFF) || (NVIC->ICER[1] != 0xFFFFFFFF)) { \ - __nvic_iser0 = NVIC->ISER[0]; \ - __nvic_iser1 = NVIC->ISER[1]; \ - NVIC->ICER[0] = 0xFFFFFFFF; \ - NVIC->ICER[1] = 0xFFFFFFFF; \ - } \ - __set_PRIMASK(__ret_pri); \ - __DSB(); \ - __ISB() -/** @brief Restore external interrupts(Exception Type: 16~255) from the previous disable. - * @sa GLOBAL_INT_RESTORE - */ -#define GLOBAL_INT_RESTORE() \ - __ret_pri = __get_PRIMASK(); \ - __set_PRIMASK(1); \ - if ( (__nvic_iser0 != 0xFFFFFFFF) || (__nvic_iser1 != 0xFFFFFFFF) ) \ - { \ - NVIC->ISER[0] = __nvic_iser0; \ - NVIC->ISER[1] = __nvic_iser1; \ - } \ - __set_PRIMASK(__ret_pri); \ -} while (0) -#endif - -/** @brief Disable external interrupts with a priority lower than IRQn_Type in the system. - * This macro must be used in conjunction with the @ref LOCAL_INT_RESTORE macro - * since this last one will close the brace that the current macro opens. This - * means that both macros must be located at the same scope level. - */ -#define LOCAL_INT_DISABLE(IRQn_Type) \ -do { \ - uint32_t __l_irq_rest = __get_BASEPRI(); \ - __set_BASEPRI(NVIC_GetPriority(IRQn_Type) + \ - (1 << (NVIC_GetPriorityGrouping() + 1))) - -/** @brief Restore external interrupts(apart from the BLE) from the previous disable. - * @sa EXP_BLE_INT_RESTORE - */ -#define LOCAL_INT_RESTORE() \ - __set_BASEPRI(__l_irq_rest); \ -} while (0) - - -/** @brief Check if the program is running on the FPGA platform. - */ -#define CHECK_IS_ON_FPGA() (AON->FPGA_CTRL & AON_REG_FPGA_CTRL_EXIST) - -#define SYSTICK_RELOAD_VALUE (SysTick->LOAD) /**< SysTick Reload value. */ -#define SYSTICK_CURRENT_VALUE (SysTick->VAL) /**< SysTick Current value. */ - -/** @} */ - -/** @} */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_HAL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup HAL_Exported_Functions_Group1 Initialization and De-initialization Functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the Flash interface, the NVIC allocation and initial clock - configuration. It also initializes the source of time base when timeout - is needed. - (+) De-initialize common part of the HAL. - (+) Configure The time base source to have 1ms time base with a dedicated - Tick interrupt priority. - (++) SysTick timer is used by default as source of time base, but user can - eventually implement his or her proper time base source (a general purpose - timer for example or other time source), keeping in mind that Time base - duration should be kept as 1ms since PPP_TIMEOUT_VALUEs are defined and - handled in milliseconds basis. - (++) Time base configuration function (hal_init_tick()) is called automatically - at the beginning of the program after reset by hal_init(). - (++) Source of time base is configured to generate interrupts at regular - time intervals. Care must be taken if hal_delay() is called from a - peripheral ISR process, the Tick interrupt line must have higher priority - (numerically lower) than the peripheral interrupt. Otherwise the caller - ISR process will be blocked. - (++) Functions affecting time base configurations are declared as __Weak - to make override possible in case of other implementations in user file. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief This function configures time base source, NVIC and Low level hardware. - * - * @note This function is called at the beginning of program after reset and before - * the clock configuration. - * The SysTick configuration is based on AHB clock and the NVIC configuration - * is set to Priority group 4. - * When the time base configuration is done, time base tick starts incrementing. - * In the default implementation, SysTick is used as source of time base. - * The tick variable is incremented each 1ms in its ISR. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_init(void); - -/** - **************************************************************************************** - * @brief This function de-initializes common part of the HAL and stops the source - * of time base. - * - * @note This function is optional. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_deinit(void); - -/** - **************************************************************************************** - * @brief Initialize the MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_msp_init could be implemented in the user file. - **************************************************************************************** - */ -void hal_msp_init(void); - -/** - **************************************************************************************** - * @brief De-initialize the MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_msp_deinit could be implemented in the user file. - **************************************************************************************** - */ -void hal_msp_deinit(void); - -/** - **************************************************************************************** - * @brief This function configures the source of the time base. - * - * @param[in] tick_priority: Tick interrupt priority. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_init_tick (uint32_t tick_priority); - -/** @} */ - -/** @addtogroup HAL_Exported_Functions_Group2 HAL Control functions - * @brief HAL Control functions - * -@verbatim - =============================================================================== - ##### HAL Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Suspend the time base source interrupt - (+) Resume the time base source interrupt - (+) Get the HAL API driver version - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Suspend Tick increment. - * - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once hal_suspend_tick() - * is called, the SysTick interrupt will be disabled so Tick increment - * is suspended. - * This function is declared as __WEAK to be overwritten in case of other - * implementations in user file. - **************************************************************************************** - */ -void hal_suspend_tick(void); - -/** - **************************************************************************************** - * @brief Resume Tick increment. - * - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once hal_resume_tick() - * is called, the SysTick interrupt will be enabled so Tick increment - * is resumed. - * The function is declared as __WEAK to be overwritten in case of other - * implementations in user file. - **************************************************************************************** - */ -void hal_resume_tick(void); - -/** - **************************************************************************************** - * @brief This function returns the HAL revision - * - * @return version: 0xXYZR (8 bits for each decimal, R for RC) - **************************************************************************************** - */ -uint32_t hal_get_hal_version(void); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_adc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_adc.h deleted file mode 100755 index 4588cac..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_adc.h +++ /dev/null @@ -1,603 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_adc.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of ADC HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_ADC ADC - * @brief ADC HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_ADC_H__ -#define __GR55xx_HAL_ADC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_adc.h" -#include "gr55xx_hal_def.h" -#include "gr55xx_hal_dma.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_ADC_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_ADC_state HAL ADC State - * @{ - */ - -/** - * @brief HAL ADC State Enumerations definition - */ -typedef enum { - HAL_ADC_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_ADC_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_ADC_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_ADC_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_adc_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_ADC_STRUCTURES Structures - * @{ - */ - -/** @defgroup ADC_Configuration ADC Configuration - * @{ - */ - -/** - * @brief ADC init structure definition - */ -typedef ll_adc_init_t adc_init_t; -/** @} */ - -/** @defgroup ADC_handle ADC Handle - * @{ - */ - -/** - * @brief ADC handle Structure definition - */ -typedef struct _adc_handle { - adc_init_t init; /**< ADC configuration parameters */ - - uint16_t *p_buffer; /**< Pointer to ADC conversion buffer */ - - __IO uint32_t buff_size; /**< Conversion buffer size */ - - __IO uint32_t buff_count; /**< Conversion buffer counter */ - - dma_handle_t *p_dma; /**< ADC DMA Handle parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_adc_state_t state; /**< ADC communication state */ - - __IO uint32_t error_code; /**< ADC error code */ - - uint32_t retention[2]; /**< ADC important register information. */ -} adc_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_ADC_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup ADC_Callback ADC Callback - * @{ - */ - -/** - * @brief HAL ADC Callback function definition - */ -typedef struct _adc_callback { - void (*adc_msp_init)(adc_handle_t *p_adc); /**< ADC init MSP callback */ - void (*adc_msp_deinit)(adc_handle_t *p_adc); /**< ADC de-init MSP callback */ - void (*adc_conv_cplt_callback)(adc_handle_t *p_adc); /**< ADC conversion completed callback */ -} adc_callback_t; - -/** @} */ - -/** @} */ - -/** - * @brief ADC init structure definition - */ - -/** - * @defgroup HAL_ADC_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup ADC_Exported_Constants ADC Exported Constants - * @{ - */ - -/** @defgroup ADC_Error_Code ADC Error Code - * @{ - */ -#define HAL_ADC_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_ADC_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_ADC_ERROR_DMA ((uint32_t)0x00000004) /**< DMA transfer error */ -#define HAL_ADC_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameter error */ -/** @} */ - -/** @defgroup ADC_CLK ADC Clock Select - * @{ - */ -#define ADC_CLK_16M LL_ADC_CLK_16 /**< ADC Clock = 16 MHz */ -#define ADC_CLK_1P6M LL_ADC_CLK_1P6 /**< ADC Clock = 1.6 MHz */ -#define ADC_CLK_8M LL_ADC_CLK_8 /**< ADC Clock = 8 MHz */ -#define ADC_CLK_4M LL_ADC_CLK_4 /**< ADC Clock = 4 MHz */ -#define ADC_CLK_2M LL_ADC_CLK_2 /**< ADC Clock = 2 MHz */ -#define ADC_CLK_1M LL_ADC_CLK_1 /**< ADC Clock = 1 MHz */ -/** @} */ - -/** @defgroup ADC_REFERENCE ADC Reference Value Select - * @{ - */ -#define ADC_REF_VALUE_0P8 LL_ADC_REF_VALUE_0P8 /**< Reference = 0.85 V */ -#define ADC_REF_VALUE_1P2 LL_ADC_REF_VALUE_1P2 /**< Reference = 1.28 V */ -#define ADC_REF_VALUE_1P6 LL_ADC_REF_VALUE_1P6 /**< Reference = 1.60 V */ -/** @} */ - -/** @defgroup ADC_INPUT_MODE ADC Input Mode - * @brief Single or Differential mode - * @{ - */ -#define ADC_INPUT_SINGLE LL_ADC_INPUT_SINGLE /**< Single ended mode */ -#define ADC_INPUT_DIFFERENTIAL LL_ADC_INPUT_DIFFERENTIAL/**< Differential mode */ -/** @} */ - -/** @defgroup ADC_INPUT_SOURCE ADC Input Channel Select - * @{ - */ -#define ADC_INPUT_SRC_IO0 LL_ADC_INPUT_SRC_IO0 /**< Select MSIO0 as input */ -#define ADC_INPUT_SRC_IO1 LL_ADC_INPUT_SRC_IO1 /**< Select MSIO1 as input */ -#define ADC_INPUT_SRC_IO2 LL_ADC_INPUT_SRC_IO2 /**< Select MSIO2 as input */ -#define ADC_INPUT_SRC_IO3 LL_ADC_INPUT_SRC_IO3 /**< Select MSIO3 as input */ -#define ADC_INPUT_SRC_IO4 LL_ADC_INPUT_SRC_IO4 /**< Select MSIO4 as input */ -#define ADC_INPUT_SRC_TMP LL_ADC_INPUT_SRC_TMP /**< Select temperature as input */ -#define ADC_INPUT_SRC_BAT LL_ADC_INPUT_SRC_BAT /**< Select Vbattery as input */ -#define ADC_INPUT_SRC_REF LL_ADC_INPUT_SRC_REF /**< Select reference as input */ - -/** @} */ - -/** @defgroup ADC_REFERENCE_SOURCE ADC Reference Source Select - * @{ - */ -#define ADC_REF_SRC_BUF_INT LL_ADC_REF_SRC_BUF_INT /**< Select buffered internal reference as reference */ -#define ADC_REF_SRC_IO0 LL_ADC_REF_SRC_IO0 /**< Select MSIO0 as reference */ -#define ADC_REF_SRC_IO1 LL_ADC_REF_SRC_IO1 /**< Select MSIO1 as reference */ -#define ADC_REF_SRC_IO2 LL_ADC_REF_SRC_IO2 /**< Select MSIO2 as reference */ -#define ADC_REF_SRC_IO3 LL_ADC_REF_SRC_IO3 /**< Select MSIO3 as reference */ -/** @} */ - -/** - * @brief ADC_default_config initStruct default configuartion - */ -#define ADC_DEFAULT_CONFIG LL_ADC_DEFAULT_CONFIG -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup ADC_Exported_Macros ADC Exported Macros - * @{ - */ - -/** @brief Reset ADC handle states. - * @param __HANDLE__ ADC handle. - * @retval None - */ -#define HAL_ADC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_ADC_STATE_RESET) - -/** @brief Enable the specified ADC peripheral. - * @param __HANDLE__ Specify the ADC Handle. - * @retval None - */ -#define HAL_ADC_ENABLE(__HANDLE__) ll_adc_enable() - -/** @brief Disable the specified ADC peripheral. - * @param __HANDLE__ Specify the ADC Handle. - * @retval None - */ -#define HAL_ADC_DISABLE(__HANDLE__) ll_adc_disable() - -/** @brief Enable the specified ADC clock. - * @param __HANDLE__ Specify the ADC Handle. - * @retval None - */ -#define HAL_ADC_ENABLE_CLOCK(__HANDLE__) ll_adc_enable_clock() - -/** @brief Disable the specified ADC clock. - * @param __HANDLE__ Specify the ADC Handle. - * @retval None - */ -#define HAL_ADC_DISABLE_CLOCK(__HANDLE__) ll_adc_disable_clock() - -/** @brief Check the FIFO is not empty. - * @param __HANDLE__ Specify the ADC Handle. - * @retval The new state of notempty flag (TRUE or FALSE). - */ -#define HAL_ADC_GET_FLAG_NOTEMPTY(__HANDLE__) ll_adc_is_fifo_notempty() - -/** @brief Flush the FIFO. - * @param __HANDLE__ Specify the ADC Handle. - * @retval None - */ -#define HAL_ADC_FLUSH_FIFO(__HANDLE__) \ -do { \ - while (ll_adc_is_fifo_notempty()) \ - { \ - ll_adc_read_fifo(); \ - } \ -} while (0) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @addtogroup ADC_Private_Macros ADC Private Macros - * @{ - */ - -/** - * @brief Check if ADC input source is valid. - * @param __INPUT__ ADC input source. - * @retval SET (__INPUT__ is valid) or RESET (__INPUT__ is invalid) - */ -#define IS_ADC_INPUT(__INPUT__) (((__INPUT__) == ADC_INPUT_SRC_IO0) || \ - ((__INPUT__) == ADC_INPUT_SRC_IO1) || \ - ((__INPUT__) == ADC_INPUT_SRC_IO2) || \ - ((__INPUT__) == ADC_INPUT_SRC_IO3) || \ - ((__INPUT__) == ADC_INPUT_SRC_IO4) || \ - ((__INPUT__) == ADC_INPUT_SRC_TMP) || \ - ((__INPUT__) == ADC_INPUT_SRC_BAT) || \ - ((__INPUT__) == ADC_INPUT_SRC_REF)) - -/** - * @brief Check if ADC input mode is valid. - * @param __MODE__ ADC input mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_ADC_INPUT_MODE(__MODE__) (((__MODE__) == ADC_INPUT_SINGLE) || \ - ((__MODE__) == ADC_INPUT_DIFFERENTIAL) - -/** - * @brief Check if ADC reference source is valid. - * @param __INPUT__ ADC reference source. - * @retval SET (__INPUT__ is valid) or RESET (__INPUT__ is invalid) - */ -#define IS_ADC_REF(__INPUT__) (((__INPUT__) == ADC_REF_SRC_BUF_INT) || \ - ((__INPUT__) == ADC_REF_SRC_INT) || \ - ((__INPUT__) == ADC_REF_SRC_IO0) || \ - ((__INPUT__) == ADC_REF_SRC_IO1) || \ - ((__INPUT__) == ADC_REF_SRC_IO2) || \ - ((__INPUT__) == ADC_REF_SRC_IO3)) - -/** - * @brief Check if ADC reference value is valid. - * @param __VALUE__ ADC reference value. - * @retval SET (__VALUE__ is valid) or RESET (__VALUE__ is invalid) - */ -#define IS_ADC_REF_VALUE(__VALUE__) (((__VALUE__) >= ADC_REF_VALUE_0P8) && \ - ((__VALUE__) <= ADC_REF_VALUE_1P6)) - -/** - * @brief Check if ADC clock is valid. - * @param __CLOCK__ ADC clock. - * @retval SET (__CLOCK__ is valid) or RESET (__CLOCK__ is invalid) - */ -#define IS_ADC_CLOCK(__CLOCK__) (((__CLOCK__) == ADC_CLK_16M) || \ - ((__CLOCK__) == ADC_CLK_8M) || \ - ((__CLOCK__) == ADC_CLK_4M) || \ - ((__CLOCK__) == ADC_CLK_2M) || \ - ((__CLOCK__) == ADC_CLK_1M) || \ - ((__CLOCK__) == ADC_CLK_1P6M)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_ADC_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup ADC_Exported_Functions_Group1 Initialization and de-initialization Functions - * @brief Initialization and Configuration functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the ADC according to the specified parameters - * in the adc_init_t and initialize the associated handle. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_init(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief De-initialize the ADC peripheral. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_deinit(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief Initialize the ADC MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_adc_msp_deinit can be implemented in the user file. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - **************************************************************************************** - */ -void hal_adc_msp_init(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief De-initialize the ADC MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_adc_msp_deinit can be implemented in the user file. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - **************************************************************************************** - */ -void hal_adc_msp_deinit(adc_handle_t *p_adc); - -/** @} */ - -/** @addtogroup ADC_Exported_Functions_Group2 IO Operation Functions - * @brief ADC polling and DMA conversion management functions. - * @{ - */ - -/** -**************************************************************************************** -* @brief Set the FIFO threshold for DMA trigger. -* -* @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for -* the specified ADC module. -* @param[in] threshold: FIFO threshold value ranging bwtween 0x0U ~ 0x64U. -* -* @retval ::HAL_OK: Operation is OK. -* @retval ::HAL_ERROR: Parameter error or operation not supported. -* @retval ::HAL_BUSY: Driver is busy. -* @retval ::HAL_TIMEOUT: Timeout occurred. -**************************************************************************************** -*/ -hal_status_t hal_adc_set_dma_threshold(adc_handle_t *p_adc, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Get the FIFO threshold for DMA trigger. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - * - * @return FIFO threshold - **************************************************************************************** - */ -uint32_t hal_adc_get_dma_threshold(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief Polling for conversion. - * - * @param[in] p_adc: Pointer to an ADC handle. - * @param[in] p_data: Pointer to data buffer which to store ADC conversion results. - * @param[in] length: Length of data buffer. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_poll_for_conversion(adc_handle_t *p_adc, uint16_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief DMA for conversion. - * - * @param[in] p_adc: Pointer to an ADC handle. - * @param[in] p_data: Pointer to data buffer which to store ADC conversion results. - * @param[in] length: Length of data buffer, ranging between 0 and 4095. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_start_dma(adc_handle_t *p_adc, uint16_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Abort ongoing conversion (blocking mode). - * - * @note This procedure could be only used for aborting conversion started in DMA mode. - * This procedure performs following operations: - * - Disable ADC clock, stop conversion - * - Abort DMA transfer by calling hal_dma_abort (in case of transfer in DMA mode) - * - Set handle State to READY. - * This procedure is executed in blocking mode: when exiting function, Abort is considered as completed. - * - * @param[in] p_adc: ADC handle. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_stop_dma(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief Conversion completed callback. - * - * @note This function should not be modified. When the callback is needed, - * the hal_adc_msp_deinit can be implemented in the user file. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - **************************************************************************************** - */ -void hal_adc_conv_cplt_callback(adc_handle_t* p_adc); - -/** @} */ - -/** @defgroup ADC_Exported_Functions_Group3 Peripheral State and Errors Functions - * @brief ADC control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the ADC. - (+) hal_adc_get_state() API can be helpful to check in run-time the state of the ADC peripheral. - (+) hal_adc_get_error() check in run-time Errors occurring during communication. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the ADC handle state. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - * - * @retval ::HAL_ADC_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_ADC_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_ADC_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_ADC_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_adc_state_t hal_adc_get_state(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief Return the ADC error code. - * - * @param[in] p_adc: Pointer to an ADC handle which contains the configuration information for - * the specified ADC module. - * - * @return ADC error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_adc_get_error(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief Suspend some registers related to ADC configuration before sleep. - * @param[in] p_adc: Pointer to a ADC handle which contains the configuration - * information for the specified ADC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_suspend_reg(adc_handle_t *p_adc); - -/** - **************************************************************************************** - * @brief Restore some registers related to ADC configuration after sleep. - * This function must be used in conjunction with the hal_adc_suspend_reg(). - * @param[in] p_adc: Pointer to a ADC handle which contains the configuration - * information for the specified ADC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_adc_resume_reg(adc_handle_t *p_adc); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_ADC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aes.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aes.h deleted file mode 100755 index aa58592..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aes.h +++ /dev/null @@ -1,832 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_aes.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of AES HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_AES AES - * @brief AES HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_AES_H__ -#define __GR55xx_HAL_AES_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_aes.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_AES_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_AES_state HAL AES State - * @{ - */ - -/** - * @brief HAL AES State Enumerations definition - */ -typedef enum { - HAL_AES_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_AES_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_AES_STATE_BUSY = 0x02, /**< Peripheral in indirect mode and busy */ - HAL_AES_STATE_ERROR = 0x03, /**< Peripheral in error */ - HAL_AES_STATE_TIMEOUT = 0x04, /**< Peripheral in timeout */ - HAL_AES_STATE_SUSPENDED = 0x05, /**< Peripheral in suspended */ -} hal_aes_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_AES_STRUCTURES Structures - * @{ - */ - -/** @defgroup AES_Configuration AES Configuration - * @{ - */ - -/** - * @brief AES Init Structure definition - */ -typedef struct _aes_init { - uint32_t key_size; /**< 128, 192 or 256-bits key length. - This parameter can be a value of @ref AES_Key_Size */ - - uint32_t operation_mode; /**< AES operating mode. - This parameter can be a value of @ref AES_OPERATION_MODE */ - - uint32_t chaining_mode; /**< AES chaining mode. - This parameter can be a value of @ref AES_CHAININGMODE */ - - uint32_t *p_key; /**< Encryption/Decryption Key */ - - uint32_t *p_init_vector; /**< Initialization Vector used for CBC modes */ - - uint32_t dpa_mode; /**< DPA Mode */ - - uint32_t *p_seed; /**< Random seeds */ -} aes_init_t; -/** @} */ - -/** @defgroup AES_handle AES Handle - * @{ - */ - -/** - * @brief AES handle Structure definition - */ -typedef struct _aes_handle { - aes_regs_t *p_instance; /**< AES registers base address */ - - aes_init_t init; /**< AES operation parameters */ - - uint32_t *p_cryp_input_buffer; /**< Pointer to CRYP processing (encryption or decryption) - input buffer */ - - uint32_t *p_cryp_output_buffer; /**< Pointer to CRYP processing (encryption or decryption) - output buffer */ - - uint32_t block_size; /**< Data size in blocks (16 bytes per block) */ - - uint32_t block_count; /**< Blocks count */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_aes_state_t state; /**< AES operation state */ - - __IO uint32_t error_code; /**< AES Error code */ - - uint32_t timeout; /**< Timeout for the AES operation */ - - uint32_t retention[18]; /**< AES important register information. */ -} aes_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_AES_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup AES_Callback AES Callback - * @{ - */ - -/** - * @brief HAL AES Callback function definition - */ -typedef struct _aes_callback { - void (*aes_msp_init)(aes_handle_t *p_aes); /**< AES init MSP callback */ - void (*aes_msp_deinit)(aes_handle_t *p_aes); /**< AES de-init MSP callback */ - void (*aes_error_callback)(aes_handle_t *p_aes); /**< AES error callback */ - void (*aes_done_callback)(aes_handle_t *p_aes); /**< AES encrypt or decrypt done callback */ - void (*aes_abort_cplt_callback)(aes_handle_t *p_aes); /**< AES abort complete callback */ -} aes_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_AES_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup AES_Exported_Constants AES Exported Constants - * @{ - */ - -/** @defgroup AES_Error_Code AES Error Code - * @{ - */ -#define HAL_AES_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_AES_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_AES_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_AES_ERROR_INVALID_PARAM ((uint32_t)0x00000004) /**< Invalid parameters error */ -/** @} */ - -/** @defgroup AES_Key_Size AES Key Size - * @{ - */ -#define AES_KEYSIZE_128BITS LL_AES_KEY_SIZE_128 /**< 128 bits */ -#define AES_KEYSIZE_192BITS LL_AES_KEY_SIZE_192 /**< 192 bits */ -#define AES_KEYSIZE_256BITS LL_AES_KEY_SIZE_256 /**< 256 bits */ -/** @} */ - -/** @defgroup AES_Block_Size AES Block Size - * @{ - */ -#define AES_BLOCK_MAX (2048) /**< Block max size */ -#define AES_BLOCKSIZE_BITS (128) /**< Block size in bits */ -#define AES_BLOCKSIZE_BYTES (AES_BLOCKSIZE_BITS >> 3) /**< Block size in bytes */ -#define AES_BLOCKSIZE_WORDS (AES_BLOCKSIZE_BYTES >> 2) /**< Block size in words */ -/** @} */ - -/** @defgroup AES_OPERATION_MODE AES Operation Mode - * @{ - */ -#define AES_OPERATION_MODE_ENCRYPT (1) /**< Encrypt operation mode */ -#define AES_OPERATION_MODE_DECRYPT (0) /**< Decrypt operation mode */ -/** @} */ - -/** @defgroup AES_CHAININGMODE AES Chaining Mode - * @{ - */ -#define AES_CHAININGMODE_ECB LL_AES_OPERATION_MODE_ECB /**< ECB chaining mode */ -#define AES_CHAININGMODE_CBC LL_AES_OPERATION_MODE_CBC /**< CBC chaining mode */ -/** @} */ - -/** @defgroup AES_Flags_definition AES Flags Definition - * @{ - */ -#define AES_FLAG_DATAREADY LL_AES_FLAG_DATAREADY /**< Data ready flag */ -#define AES_FLAG_DMA_DONE LL_AES_FLAG_DMA_DONE /**< DMA transfer done flag */ -#define AES_FLAG_DMA_ERR LL_AES_FLAG_DMA_ERR /**< DMA transfer error flag */ -#define AES_FLAG_KEY_VALID LL_AES_FLAG_KEY_VALID /**< Key valid flag */ -/** @} */ - -/** @defgroup AES_Interrupt_definition AES Interrupt definition - * @{ - */ -#define AES_IT_DONE ((uint32_t)0x00000001) /**< AES Encrypted or Decrypted Data Done - Interrupt source */ -/** @} */ - -/** @defgroup AES_Timeout_definition AES Timeout definition - * @{ - */ -#define HAL_AES_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup AES_Exported_Macros AES Exported Macros - * @{ - */ - -/** @brief Reset AES handle states. - * @param __HANDLE__ AES handle. - * @retval None - */ -#define HAL_AES_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_AES_STATE_RESET) - -/** @brief Enable the specified AES peripheral. - * @param __HANDLE__ Specifies the AES Handle. - * @retval None - */ -#define HAL_AES_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, AES_CTRL_ENABLE) - -/** @brief Disable the specified AES peripheral. - * @param __HANDLE__ Specifies the AES Handle. - * @retval None - */ -#define HAL_AES_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, AES_CTRL_ENABLE) - -/** @brief Enable the AES interrupt. - * @param __HANDLE__ Specifies the AES Handle. - * @retval None - */ -#define HAL_AES_ENABLE_IT(__HANDLE__) ll_aes_enable_it_done((__HANDLE__)->p_instance) - -/** @brief Disable the AES interrupt. - * @param __HANDLE__ Specifies the AES Handle. - * @retval None - */ -#define HAL_AES_DISABLE_IT(__HANDLE__) ll_aes_disable_it_done((__HANDLE__)->p_instance) - -/** @brief Check whether the specified AES interrupt flag is set or not. - * @param __HANDLE__ Specifies the AES Handle. - * @param __FLAG__ Specifies the interrupt flag to check. - * This parameter can be the following value: - * @arg @ref AES_IT_DONE Encrypted or Decrypted Data Done Interrupt - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_AES_GET_FLAG_IT(__HANDLE__, __FLAG__) \ - (READ_BITS((__HANDLE__)->p_instance->INTERRUPT, (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified AES interrupt flag. - * @param __HANDLE__ Specifies the AES interrupt Handle. - * @param __FLAG__ Specifies the flag to clear. - * This parameter can be the following value: - * @arg @ref AES_IT_DONE Encrypted or Decrypted Data Done Interrupt - * @retval None - */ -#define HAL_AES_CLEAR_FLAG_IT(__HANDLE__, __FLAG__) SET_BITS((__HANDLE__)->p_instance->INTERRUPT, (__FLAG__)) - -/** @brief Check whether the specified AES flag is set or not. - * @param __HANDLE__ Specifies the AES Handle. - * @param __FLAG__ Specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref AES_FLAG_DATAREADY Data ready flag - * @arg @ref AES_FLAG_DMA_DONE DMA transfer done flag - * @arg @ref AES_FLAG_DMA_ERR DMA transfer error flag - * @arg @ref AES_FLAG_KEY_VALID Key valid flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_AES_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->STATUS, (__FLAG__)) != 0) ? SET : RESET) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup AES_Private_Macro AES Private Macros - * @{ - */ - -/** @brief Check if AES Key Size is valid. - * @param __SIZE__ AES Key Size. - * @retval SET (__SIZE__ is valid) or RESET (__SIZE__ is invalid) - */ -#define IS_AES_KEY_SIZE(__SIZE__) (((__SIZE__) == AES_KEYSIZE_128BITS) || \ - ((__SIZE__) == AES_KEYSIZE_192BITS) || \ - ((__SIZE__) == AES_KEYSIZE_256BITS)) - -/** @brief Check if AES Operation Mode is valid. - * @param __MODE__ AES Operation Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_AES_OPERATION_MODE(__MODE__) (((__MODE__) == AES_OPERATION_MODE_ENCRYPT) || \ - ((__MODE__) == AES_OPERATION_MODE_DECRYPT)) - -/** @brief Check if AES Chaining Mode is valid. - * @param __MODE__ AES Chaining Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_AES_CHAININGMODE(__MODE__) (((__MODE__) == AES_CHAININGMODE_ECB) || \ - ((__MODE__) == AES_CHAININGMODE_CBC)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_AES_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup AES_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the AESx peripheral. - - (+) User must implement hal_aes_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_aes_init() to configure the selected device with - the selected configuration: - (++) Key Size - (++) operation_mode - (++) ChainingMode - (++) key - (++) init_vector - (++) DPAMode - (++) Seed - - (+) Call the function hal_aes_deinit() to restore the default configuration - of the selected AESx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the AES according to the specified parameters - * in the aes_init_t and initialize the associated handle. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration - * information for the specified AES module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_init(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief De-initialize the AES peripheral. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration - * information for the specified AES module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_deinit(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief Initialize the AES MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_aes_msp_deinit can be implemented in the user file. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration - * information for the specified AES module. - **************************************************************************************** - */ -void hal_aes_msp_init(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief De-initialize the AES MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_aes_msp_deinit can be implemented in the user file. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration - * information for the specified AES module. - **************************************************************************************** - */ -void hal_aes_msp_deinit(aes_handle_t *p_aes); - -/** @} */ - -/** @addtogroup AES_Exported_Functions_Group2 IO operation functions - * @brief AES Encrypt/Decrypt functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the AES encrypt or decrypt. - - (#) There are two mode of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing are returned by the same function - after finishing transfer. - (++) Non-Blocking mode: The communication is performed using Interrupts - or DMA. These API return the HAL status. - The end of the data processing will be indicated through the - dedicated AES IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The hal_aes_done_callback() user callbacks will be executed respectively - at the end of the encrypt or decrypt process - The hal_aes_error_callback() user callback will be executed when a error is detected - - (#) Blocking mode API's are : - (++) hal_aes_ecb_encrypt() - (++) hal_aes_ecb_decrypt() - (++) hal_aes_cbc_encrypt() - (++) hal_aes_cbc_decrypt() - - (#) Non-Blocking mode API's with Interrupt are : - (++) hal_aes_ecb_encrypt_it() - (++) hal_aes_ecb_decrypt_it() - (++) hal_aes_cbc_encrypt_it() - (++) hal_aes_cbc_decrypt_it() - - (#) Non-Blocking mode API's with DMA are : - (++) hal_aes_ecb_encrypt_dma() - (++) hal_aes_ecb_decrypt_dma() - (++) hal_aes_cbc_encrypt_dma() - (++) hal_aes_cbc_decrypt_dma() - - (#) A set of encrypt or decrypt Callbacks are provided in Non_Blocking mode: - (++) hal_aes_done_callback() - (++) hal_aes_error_callback() - - (#) Non-Blocking mode transfers could be aborted using Abort API's : - (++) hal_aes_abort() - (++) hal_aes_abort_it() - - (#) For Abort services based on interrupts (hal_aes_abort_xxx_it), Abort Complete Callback is provided: - (++) hal_aes_abort_cplt_callback() - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Encrypted an amount of data in blocking mode in ECB mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_plain_data: Pointer to plain data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_cypher_data: Pointer to cypher data buffer - * @param[in] timeout: Timeout duration - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_ecb_encrypt(aes_handle_t *p_aes, uint32_t *p_plain_data, uint32_t number, - uint32_t *p_cypher_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Decrypted an amount of data in blocking mode in ECB mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_cypher_data: Pointer to cypher data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_plain_data: Pointer to plain data buffer - * @param[in] timeout: Timeout duration - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_ecb_decrypt(aes_handle_t *p_aes, uint32_t *p_cypher_data, uint32_t number, - uint32_t *p_plain_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Encrypted an amount of data in blocking mode in CBC mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_plain_data: Pointer to plain data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_cypher_data: Pointer to cypher data buffer - * @param[in] timeout: Timeout duration - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_cbc_encrypt(aes_handle_t *p_aes, uint32_t *p_plain_data, uint32_t number, - uint32_t *p_cypher_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Decrypted an amount of data in blocking mode in CBC mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_cypher_data: Pointer to cypher data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_plain_data: Pointer to plain data buffer - * @param[in] timeout: Timeout duration - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_cbc_decrypt(aes_handle_t *p_aes, uint32_t *p_cypher_data, uint32_t number, - uint32_t *p_plain_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Encrypted an amount of data in non-blocking mode with Interrupt in ECB mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_plain_data: Pointer to plain data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_cypher_data: Pointer to cypher data buffer - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_ecb_encrypt_it(aes_handle_t *p_aes, uint32_t *p_plain_data, uint32_t number, - uint32_t *p_cypher_data); - -/** - **************************************************************************************** - * @brief Decrypted an amount of data in non-blocking mode with Interrupt in ECB mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_cypher_data: Pointer to cypher data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_plain_data: Pointer to plain data buffer - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_ecb_decrypt_it(aes_handle_t *p_aes, uint32_t *p_cypher_data, uint32_t number, - uint32_t *p_plain_data); - -/** - **************************************************************************************** - * @brief Encrypted an amount of data in non-blocking mode with Interrupt in CBC mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_plain_data: Pointer to plain data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_cypher_data: Pointer to cypher data buffer - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_cbc_encrypt_it(aes_handle_t *p_aes, uint32_t *p_plain_data, uint32_t number, - uint32_t *p_cypher_data); - -/** - **************************************************************************************** - * @brief Decrypted an amount of data in non-blocking mode with Interrupt in CBC mode. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] p_cypher_data: Pointer to cypher data buffer - * @param[in] number: Amount of data to be decrypted in bytes - * @param[out] p_plain_data: Pointer to plain data buffer - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_cbc_decrypt_it(aes_handle_t *p_aes, uint32_t *p_cypher_data, uint32_t number, - uint32_t *p_plain_data); - -/** - **************************************************************************************** - * @brief Abort the current encryption or decryption - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_abort(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief Abort the current encryption or decryption (non-blocking function) - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_abort_it(aes_handle_t *p_aes); - -/** @} */ - -/** @addtogroup AES_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle AES interrupt request. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified the specified AES module. - **************************************************************************************** - */ -void hal_aes_irq_handler(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief Encrypt or decrypt Done callback. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - **************************************************************************************** - */ -void hal_aes_done_callback(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief AES error callback. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - **************************************************************************************** - */ -void hal_aes_error_callback(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief AES Abort Complete callback. - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - **************************************************************************************** - */ -void hal_aes_abort_cplt_callback(aes_handle_t *p_aes); - -/** @} */ - -/** @defgroup AES_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief AES control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the AES. - (+) hal_aes_get_state() API can be helpful to check in run-time the state of the AES peripheral. - (+) hal_aes_get_error() check in run-time Errors occurring during communication. - (+) hal_aes_set_timeout() set the timeout during internal process. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the AES handle state. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * - * @retval ::HAL_AES_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_AES_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_AES_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_AES_STATE_ERROR: Peripheral in error. - * @retval ::HAL_AES_STATE_TIMEOUT: Peripheral in timeout. - * @retval ::HAL_AES_STATE_SUSPENDED: Peripheral in suspended. - **************************************************************************************** - */ -hal_aes_state_t hal_aes_get_state(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief Return the AES error code. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * - * @return AES error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_aes_get_error(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief Set the AES internal process timeout value. - * - * @param[in] p_aes: Pointer to an AES handle which contains the configuration information for - * the specified AES module. - * @param[in] timeout: Internal process timeout value. - **************************************************************************************** - */ -void hal_aes_set_timeout(aes_handle_t *p_aes, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Suspend some registers related to AES configuration before sleep. - * @param[in] p_aes: Pointer to a AES handle which contains the configuration - * information for the specified AES module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_suspend_reg(aes_handle_t *p_aes); - -/** - **************************************************************************************** - * @brief Restore some registers related to AES configuration after sleep. - * This function must be used in conjunction with the hal_aes_suspend_reg(). - * @param[in] p_aes: Pointer to a AES handle which contains the configuration - * information for the specified AES module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aes_resume_reg(aes_handle_t *p_aes); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_AES_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio.h deleted file mode 100755 index d39ca53..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio.h +++ /dev/null @@ -1,408 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_aon_gpio.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of AON GPIO HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_AON_GPIO AON_GPIO - * @brief AON_GPIO HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_AON_GPIO_H__ -#define __GR55xx_HAL_AON_GPIO_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_aon_gpio.h" -#include "gr55xx_hal_def.h" -/* Include AON GPIO HAL Extended module */ -#include "gr55xx_hal_aon_gpio_ex.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_AON_GPIO_ENUMERATIONS Enumerations - * @{ - */ - -/** - * @brief AON_GPIO Bit SET and Bit RESET enumerations - */ -typedef enum { - AON_GPIO_PIN_RESET = 0U, /**< AON GPIO pin low level.*/ - AON_GPIO_PIN_SET /**< AON GPIO pin high level.*/ -} aon_gpio_pin_state_t; - -/** @} */ - -/** @addtogroup HAL_AON_GPIO_STRUCTURES Structures - * @{ - */ - -/** - * @brief AON_GPIO init structure definition - */ -typedef struct _aon_gpio_init { - uint32_t pin; /**< Specifies the AON_GPIO pins to be configured. - This parameter can be any value of @ref AON_GPIO_Pins */ - - uint32_t mode; /**< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref AON_GPIO_Mode */ - - uint32_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref AON_GPIO_Pull */ - - uint32_t mux; /**< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIOEx_Mux_Function_Selection. */ -} aon_gpio_init_t; - -/** @} */ - -/** @addtogroup HAL_AON_GPIO_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup AON_GPIO_Callback AON_GPIO Callback - * @{ - */ - -/** - * @brief HAL AON_GPIO Callback function definition - */ -typedef struct _aon_gpio_callback { - void (*aon_gpio_callback)(uint16_t aon_gpio_pin); /**< AON GPIO pin detection callback */ -} aon_gpio_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_AON_GPIO_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup AON_GPIO_Exported_Constants AON_GPIO Exported Constants - * @{ - */ - -/** @defgroup AON_GPIO_Pins AON_GPIO pins - * @{ - */ -#define AON_GPIO_PIN_0 ((uint16_t)0x0001U) /**< Pin 0 selected */ -#define AON_GPIO_PIN_1 ((uint16_t)0x0002U) /**< Pin 1 selected */ -#define AON_GPIO_PIN_2 ((uint16_t)0x0004U) /**< Pin 2 selected */ -#define AON_GPIO_PIN_3 ((uint16_t)0x0008U) /**< Pin 3 selected */ -#define AON_GPIO_PIN_4 ((uint16_t)0x0010U) /**< Pin 4 selected */ -#define AON_GPIO_PIN_5 ((uint16_t)0x0020U) /**< Pin 5 selected */ -#define AON_GPIO_PIN_6 ((uint16_t)0x0040U) /**< Pin 6 selected */ -#define AON_GPIO_PIN_7 ((uint16_t)0x0080U) /**< Pin 7 selected */ - -#define AON_GPIO_PIN_ALL ((uint16_t)0x00FFU) /**< All pins selected */ - -#define AON_GPIO_PIN_MASK (0x000000FFU) /**< PIN mask for assert test */ -/** @} */ - -/** @defgroup AON_GPIO_Mode AON_GPIO mode - * @brief AON_GPIO Configuration Mode - * Elements values convention: 0x000000YX - * - X : IO Direction mode (Input, Output, Mux) - * - Y : IT trigger detection - * @{ - */ -#define AON_GPIO_MODE_INPUT (LL_AON_GPIO_MODE_INPUT << 0) /**< Input Mode */ -#define AON_GPIO_MODE_OUTPUT (LL_AON_GPIO_MODE_OUTPUT << 0) /**< Output Mode */ -#define AON_GPIO_MODE_MUX (LL_GPIO_MODE_MUX << 0) /**< Mux Mode */ -#define AON_GPIO_MODE_IT_RISING (LL_AON_GPIO_TRIGGER_RISING << 4) /**< Interrupt Mode with Rising edge - trigger detection */ -#define AON_GPIO_MODE_IT_FALLING (LL_AON_GPIO_TRIGGER_FALLING << 4) /**< Interrupt Mode with Falling edge - trigger detection */ -#define AON_GPIO_MODE_IT_HIGH (LL_AON_GPIO_TRIGGER_HIGH << 4) /**< Interrupt Mode with High-level - trigger detection */ -#define AON_GPIO_MODE_IT_LOW (LL_AON_GPIO_TRIGGER_LOW << 4) /**< Interrupt Mode with Low-level - trigger detection */ -/** @} */ - -/** @defgroup AON_GPIO_Pull AON_GPIO pull - * @brief AON_GPIO Pull-Up or Pull-Down activation - * @{ - */ -#define AON_GPIO_NOPULL LL_AON_GPIO_PULL_NO /**< No Pull-up or Pull-down activation */ -#define AON_GPIO_PULLUP LL_AON_GPIO_PULL_UP /**< Pull-up activation */ -#define AON_GPIO_PULLDOWN LL_AON_GPIO_PULL_DOWN /**< Pull-down activation */ -/** @} */ - -/** - * @brief AON_GPIO_default_config initStruct default configuartion - */ -#define AON_GPIO_DEFAULT_CONFIG \ -{ \ - .pin = AON_GPIO_PIN_ALL, \ - .mode = AON_GPIO_MODE_INPUT, \ - .pull = AON_GPIO_PULLDOWN, \ - .mux = AON_GPIO_MUX_7, \ -} -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup AON_GPIO_Exported_Macros AON_GPIO Exported Macros - * @{ - */ - -/** - * @brief Check whether the specified AON_GPIO pin is asserted or not. - * @param __AON_GPIO_PIN__ specifies the AON_GPIO pin to be checked. - * This parameter can be AON_GPIO_PIN_x where x can be (0..15). - * @retval The new state of __AON_GPIO_PIN__ (SET or RESET). - */ -#define HAL_AON_GPIO_IT_GET_IT(__AON_GPIO_PIN__) ll_aon_gpio_read_flag_it(__AON_GPIO_PIN__) - -/** - * @brief Clear the AON_GPIO pin pending bits. - * @param __AON_GPIO_PIN__ specifies the AON_GPIO pins to be cleared. - * This parameter can be any combination of AON_GPIO_PIN_x where x can be (0..15). - * @retval None - */ -#define HAL_AON_GPIO_IT_CLEAR_IT(__AON_GPIO_PIN__) ll_aon_gpio_clear_flag_it(__AON_GPIO_PIN__) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @addtogroup AON_GPIO_Private_Macros AON_GPIO Private Macros - * @{ - */ - -/** - * @brief Check if AON GPIO pin action is valid. - * @param __ACTION__ AON GPIO pin action. - * @retval SET (__ACTION__ is valid) or RESET (__ACTION__ is invalid) - */ -#define IS_AON_GPIO_PIN_ACTION(__ACTION__) (((__ACTION__) == AON_GPIO_PIN_RESET) || \ - ((__ACTION__) == AON_GPIO_PIN_SET)) - -/** - * @brief Check if AON GPIO pins are valid. - * @param __PIN__ AON GPIO pins. - * @retval SET (__PIN__ is valid) or RESET (__PIN__ is invalid) - */ -#define IS_AON_GPIO_PIN(__PIN__) ((((__PIN__) & AON_GPIO_PIN_MASK) != 0x00U) && \ - (((__PIN__) & ~AON_GPIO_PIN_MASK) == 0x00U)) - -/** - * @brief Check if AON GPIO mode is valid. - * @param __MODE__ AON GPIO mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_AON_GPIO_MODE(__MODE__) (((__MODE__) == AON_GPIO_MODE_INPUT) || \ - ((__MODE__) == AON_GPIO_MODE_OUTPUT) || \ - ((__MODE__) == AON_GPIO_MODE_MUX) || \ - ((__MODE__) == AON_GPIO_MODE_IT_RISING) || \ - ((__MODE__) == AON_GPIO_MODE_IT_FALLING) || \ - ((__MODE__) == AON_GPIO_MODE_IT_HIGH) || \ - ((__MODE__) == AON_GPIO_MODE_IT_LOW)) - -/** - * @brief Check if AON GPIO pull type is valid. - * @param __PULL__ AON GPIO pull type. - * @retval SET (__PULL__ is valid) or RESET (__PULL__ is invalid) - */ -#define IS_AON_GPIO_PULL(__PULL__) (((__PULL__) == AON_GPIO_NOPULL) || \ - ((__PULL__) == AON_GPIO_PULLUP) || \ - ((__PULL__) == AON_GPIO_PULLDOWN)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_AON_GPIO_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup AON_GPIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the AON_GPIOx peripheral according to the specified parameters in the @ref aon_gpio_init_t. - * - * @param[in] p_aon_gpio_init: Pointer to an @ref aon_gpio_init_t structure that contains - * the configuration information for the specified AON_GPIO peripheral port. - **************************************************************************************** - */ -void hal_aon_gpio_init(aon_gpio_init_t *p_aon_gpio_init); - -/** - **************************************************************************************** - * @brief De-initialize the AON_GPIOx peripheral registers to their default reset values. - * - * @param[in] aon_gpio_pin: Specifies the port bit to be written. - * This parameter can be a combination of the following values: - * @arg @ref AON_GPIO_PIN_0 - * @arg @ref AON_GPIO_PIN_1 - * @arg @ref AON_GPIO_PIN_2 - * @arg @ref AON_GPIO_PIN_3 - * @arg @ref AON_GPIO_PIN_4 - * @arg @ref AON_GPIO_PIN_5 - * @arg @ref AON_GPIO_PIN_ALL - **************************************************************************************** - */ -void hal_aon_gpio_deinit(uint32_t aon_gpio_pin); - -/** @} */ - -/** @addtogroup AON_GPIO_Exported_Functions_Group2 IO operation functions - * @brief AON_GPIO Read, Write, Toggle, Lock and EXTI management functions. - * @{ - */ - -/** - **************************************************************************************** - * @brief Read the specified input port pin. - * - * @param[in] aon_gpio_pin: Specifies the port bit to be read. - * This parameter can be one of the following values: - * @arg @ref AON_GPIO_PIN_0 - * @arg @ref AON_GPIO_PIN_1 - * @arg @ref AON_GPIO_PIN_2 - * @arg @ref AON_GPIO_PIN_3 - * @arg @ref AON_GPIO_PIN_4 - * @arg @ref AON_GPIO_PIN_5 - * - * @return The input port pin value. - **************************************************************************************** - */ -aon_gpio_pin_state_t hal_aon_gpio_read_pin(uint16_t aon_gpio_pin); - -/** - **************************************************************************************** - * @brief Set or clear the selected data port bit. - * - * @param[in] aon_gpio_pin: Specifies the port bit to be written. - * This parameter can be a combination of the following values: - * @arg @ref AON_GPIO_PIN_0 - * @arg @ref AON_GPIO_PIN_1 - * @arg @ref AON_GPIO_PIN_2 - * @arg @ref AON_GPIO_PIN_3 - * @arg @ref AON_GPIO_PIN_4 - * @arg @ref AON_GPIO_PIN_5 - * @arg @ref AON_GPIO_PIN_ALL - * @param[in] pin_state: Specifies the value to be written to the selected bit. - * This parameter can be one of the AON_GPIO_PinState enum values: - * @arg AON_GPIO_PIN_RESET: to clear the port pin - * @arg AON_GPIO_PIN_SET: to set the port pin - **************************************************************************************** - */ -void hal_aon_gpio_write_pin(uint16_t aon_gpio_pin, aon_gpio_pin_state_t pin_state); - -/** - **************************************************************************************** - * @brief Toggle the specified AON_GPIO pin. - * - * @param[in] aon_gpio_pin: Specifies the pin to be toggled. - * This parameter can be a combination of the following values: - * @arg @ref AON_GPIO_PIN_0 - * @arg @ref AON_GPIO_PIN_1 - * @arg @ref AON_GPIO_PIN_2 - * @arg @ref AON_GPIO_PIN_3 - * @arg @ref AON_GPIO_PIN_4 - * @arg @ref AON_GPIO_PIN_5 - * @arg @ref AON_GPIO_PIN_ALL - **************************************************************************************** - */ -void hal_aon_gpio_toggle_pin(uint16_t aon_gpio_pin); - -/** @} */ - -/** @addtogroup AON_GPIO_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle AON_GPIO interrupt request. - **************************************************************************************** - */ -void hal_aon_gpio_irq_handler(void); - -/** - **************************************************************************************** - * @brief AON GPIO pin detection callback. - * - * @note This function should not be modified. When the callback is needed, - * the hal_aon_gpio_callback can be implemented in the user file. - * - * @param[in] aon_gpio_pin: Indicate the port pin whose interrupt was triggered. - * This parameter can be a combination of the following values: - * @arg @ref AON_GPIO_PIN_0 - * @arg @ref AON_GPIO_PIN_1 - * @arg @ref AON_GPIO_PIN_2 - * @arg @ref AON_GPIO_PIN_3 - * @arg @ref AON_GPIO_PIN_4 - * @arg @ref AON_GPIO_PIN_5 - * @arg @ref AON_GPIO_PIN_ALL - **************************************************************************************** - */ -void hal_aon_gpio_callback(uint16_t aon_gpio_pin); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_AON_GPIO_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio_ex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio_ex.h deleted file mode 100755 index 98a3195..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_gpio_ex.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_aon_gpio_ex.h - * @author BLE Driver Team - * @brief Header file containing extended macro of AON GPIO HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_AON_GPIOEx AON_GPIOEx - * @brief AON_GPIOEx HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_AON_GPIO_EX_H__ -#define __GR55xx_HAL_AON_GPIO_EX_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_gpio.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ - -/** - * @defgroup HAL_AON_GPIOEX_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup AON_GPIOEx_Exported_Constants AON_GPIOEx Exported Constants - * @{ - */ - -/** @defgroup AON_GPIOEx_Mux_Mode AON_GPIOEx Mux Mode definition - * @{ - */ -#define AON_GPIO_MUX_0 LL_AON_GPIO_MUX_0 /**< AON GPIO Mux mode 0 */ -#define AON_GPIO_MUX_1 LL_AON_GPIO_MUX_1 /**< AON GPIO Mux mode 1 */ -#define AON_GPIO_MUX_2 LL_AON_GPIO_MUX_2 /**< AON GPIO Mux mode 2 */ -#define AON_GPIO_MUX_3 LL_AON_GPIO_MUX_3 /**< AON GPIO Mux mode 3 */ -#define AON_GPIO_MUX_4 LL_AON_GPIO_MUX_4 /**< AON GPIO Mux mode 4 */ -#define AON_GPIO_MUX_5 LL_AON_GPIO_MUX_5 /**< AON GPIO Mux mode 5 */ -#define AON_GPIO_MUX_6 LL_AON_GPIO_MUX_6 /**< AON GPIO Mux mode 6 */ -#define AON_GPIO_MUX_7 LL_AON_GPIO_MUX_7 /**< AON GPIO Mux mode 7 */ -/** @} */ - -/** @defgroup AON_GPIOEx_Mux_Function_Selection AON_GPIOEx Mux function selection - * @{ - */ - -#if defined (GR551xx) -/*---------------------------------- GR551xx ------------------------------*/ - -/** @defgroup AON_GPIOEx_Common_Selection AON_GPIO PIN common MUX selection(Available for all AON GPIO pins) - * @{ - */ - -#define AON_GPIO_PIN_MUX_GPIO AON_GPIO_MUX_7 /**< AON GPIO PIN x Mux Select GPIO */ - -/** @} */ - -/** @defgroup AON_GPIOEx_PIN0_Mux_Selection AON_GPIO_PIN1 MUX selection - * @{ - */ -#define AON_GPIO_PIN1_MUX_QSPIM0_CS_N AON_GPIO_MUX_5 /**< AON_GPIO_PIN1 Mux Select QSPIM0_CS_N */ -#define AON_GPIO_PIN1_MUX_COEX_BLE_TX AON_GPIO_MUX_6 /**< AON_GPIO_PIN1 Mux Select COEX_BLE_TX */ -/** @} */ - -/** @defgroup AON_GPIOEx_PIN2_Mux_Selection AON_GPIO_PIN2 MUX selection - * @{ - */ -#define AON_GPIO_PIN2_MUX_SIM_PRESENCE AON_GPIO_MUX_0 /**< AON_GPIO_PIN2 Mux Select SIM_PRESENCE */ -#define AON_GPIO_PIN2_MUX_QSPIM1_CS_N AON_GPIO_MUX_1 /**< AON_GPIO_PIN2 Mux Select QSPIM1_CS_N */ -#define AON_GPIO_PIN2_MUX_I2S_WS AON_GPIO_MUX_2 /**< AON_GPIO_PIN2 Mux Select I2S_WS */ -#define AON_GPIO_PIN2_MUX_I2S_S_WS AON_GPIO_MUX_3 /**< AON_GPIO_PIN2 Mux Select I2S_S_WS */ -#define AON_GPIO_PIN2_MUX_PWM0_C AON_GPIO_MUX_5 /**< AON_GPIO_PIN2 Mux Select PWM0_C */ -#define AON_GPIO_PIN2_MUX_COEX_BLE_PROC AON_GPIO_MUX_6 /**< AON_GPIO_PIN2 Mux Select COEX_BLE_PROC */ -/** @} */ - -/** @defgroup AON_GPIOEx_PIN3_Mux_Selection AON_GPIO_PIN3 MUX selection - * @{ - */ -#define AON_GPIO_PIN3_MUX_SIM_RST_N AON_GPIO_MUX_0 /**< AON_GPIO_PIN3 Mux Select SIM_RST_N */ -#define AON_GPIO_PIN3_MUX_QSPIM1_IO_0 AON_GPIO_MUX_1 /**< AON_GPIO_PIN3 Mux Select QSPIM1_IO_0 */ -#define AON_GPIO_PIN3_MUX_I2S_TX_SDO AON_GPIO_MUX_2 /**< AON_GPIO_PIN3 Mux Select I2S_TX_SDO */ -#define AON_GPIO_PIN3_MUX_I2S_S_TX_SDO AON_GPIO_MUX_3 /**< AON_GPIO_PIN3 Mux Select I2S_S_TX_SDO */ -#define AON_GPIO_PIN3_MUX_PWM1_A AON_GPIO_MUX_5 /**< AON_GPIO_PIN3 Mux Select PWM1_A */ -#define AON_GPIO_PIN3_MUX_COEX_WLAN_RX AON_GPIO_MUX_6 /**< AON_GPIO_PIN3 Mux Select COEX_WLAN_RX */ -/** @} */ - -/** @defgroup AON_GPIOEx_PIN4_Mux_Selection AON_GPIO_PIN4 MUX selection - * @{ - */ -#define AON_GPIO_PIN4_MUX_SIM_IO AON_GPIO_MUX_0 /**< AON_GPIO_PIN4 Mux Select SIM_IO */ -#define AON_GPIO_PIN4_MUX_QSPIM1_IO_1 AON_GPIO_MUX_1 /**< AON_GPIO_PIN4 Mux Select QSPIM1_IO_1 */ -#define AON_GPIO_PIN4_MUX_I2S_RX_SDI AON_GPIO_MUX_2 /**< AON_GPIO_PIN4 Mux Select I2S_RX_SDI */ -#define AON_GPIO_PIN4_MUX_I2S_S_RX_SDI AON_GPIO_MUX_3 /**< AON_GPIO_PIN4 Mux Select I2S_S_RX_SDI */ -#define AON_GPIO_PIN4_MUX_PWM1_B AON_GPIO_MUX_5 /**< AON_GPIO_PIN4 Mux Select PWM1_B */ -#define AON_GPIO_PIN4_MUX_COEX_BLE_RX AON_GPIO_MUX_6 /**< AON_GPIO_PIN4 Mux Select COEX_BLE_RX */ -/** @} */ - -/** @defgroup AON_GPIOEx_PIN5_Mux_Selection AON_GPIO_PIN5 MUX selection - * @{ - */ -#define AON_GPIO_PIN5_MUX_SIM_CLK AON_GPIO_MUX_0 /**< AON_GPIO_PIN5 Mux Select SIM_CLK */ -#define AON_GPIO_PIN5_MUX_QSPIM1_CLK AON_GPIO_MUX_1 /**< AON_GPIO_PIN5 Mux Select QSPIM1_CLK */ -#define AON_GPIO_PIN5_MUX_I2S_SCLK AON_GPIO_MUX_2 /**< AON_GPIO_PIN5 Mux Select I2S_SCLK */ -#define AON_GPIO_PIN5_MUX_I2S_S_SCLK AON_GPIO_MUX_3 /**< AON_GPIO_PIN5 Mux Select I2S_S_SCLK */ -#define AON_GPIO_PIN5_MUX_PWM1_C AON_GPIO_MUX_5 /**< AON_GPIO_PIN5 Mux Select PWM1_C */ -#define AON_GPIO_PIN5_MUX_COEX_WLAN_TX AON_GPIO_MUX_6 /**< AON_GPIO_PIN5 Mux Select COEX_WLAN_TX */ -/** @} */ - -/** - * @brief Check if AON GPIO Mux mode is valid. - * @param __MUX__ AON GPIO Mux mode. - * @retval SET (__ACTION__ is valid) or RESET (__ACTION__ is invalid) - */ -#define IS_AON_GPIO_MUX(__MUX__) (((__MUX__) <= AON_GPIO_MUX_7)) - -/*------------------------------------------------------------------------------------------*/ -#endif /* GR551xx */ - -/** @} */ - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_AON_GPIO_EX_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_wdt.h deleted file mode 100755 index 8784921..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_aon_wdt.h +++ /dev/null @@ -1,263 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_aon_wdt.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of AON WDT HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_AON_WDT AON_WDT - * @brief WDT HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_AON_WDT_H__ -#define __GR55xx_HAL_AON_WDT_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_aon_wdt.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_AON_WDT_STRUCTURES Structures - * @{ - */ - -/** @defgroup AON_WDT_Configuration AON_WDT Configuration - * @{ - */ - -/** - * @brief AON_WDT_Configuration init structure definition - */ -typedef struct _aon_wdt_init { - uint32_t counter; /**< Specifies the AON_WDT free-running downcounter value. - This parameter can be a number ranging between 0x0U ~ 0xFFFFFFFFU. */ - - uint32_t alarm_counter; /**< Specifies the AON_WDT downcounter alarm value before system reset. - When counter counts down to the alarm value, AON_WDT will generate - an interrupt. After counter counts down to 0, AON_WDT will then - request a SoC Reset. - - This parameter can be a number ranging between 0x0U ~ 0x1FU, - and the default value is 20U. */ -} aon_wdt_init_t; - -/** @} */ - -/** @defgroup AON_WDT_handle AON_WDT handle - * @{ - */ - -/** - * @brief AON_WDT handle Structure definition - */ -typedef struct _aon_wdt_handle { - aon_wdt_init_t init; /**< AON_WDT required parameters */ - - hal_lock_t lock; /**< AON_WDT locking object */ -} aon_wdt_handle_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_AON_WDT_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_AON_WDT_Callback Callback - * @{ - */ - -/** - * @brief HAL_AON_WDT Callback function definition - */ - -typedef struct _aon_wdt_callback { - void (*aon_wdt_alarm_callback)(aon_wdt_handle_t *p_aon_wdt); /**< AON_WDT count complete callback */ -} hal_aon_wdt_callback_t; - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_AON_WDT_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup AON_WDT_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - ============================================================================== - ##### Initialization and Configuration functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and start the AON_WDT according to the specified parameters - in the wdt_init_t of associated handle. - (+) Initialize the AON_WDT MSP. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the AON_WDT according to the specified parameters in the wdt_init_t - * of associated handle. - * - * @param[in] p_aon_wdt: Pointer to a AON_WDT handle which contains the configuration - * information for the specified AON_WDT module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aon_wdt_init(aon_wdt_handle_t *p_aon_wdt); - -/** - **************************************************************************************** - * @brief De-initialize the AON_WDT peripheral. - * - * @param[in] p_aon_wdt: AON_WDT handle. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aon_wdt_deinit(aon_wdt_handle_t *p_aon_wdt); - -/** @} */ - -/** @addtogroup AON_WDT_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Refresh the AON_WDT. - (+) Handle AON_WDT interrupt request and associated function callback. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Refresh the AON_WDT. - * - * @param[in] p_aon_wdt: Pointer to a AON_WDT handle which contains the configuration - * information for the specified AON_WDT module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_aon_wdt_refresh(aon_wdt_handle_t *p_aon_wdt); - -/** @} */ - - -/** @addtogroup AON_WDT_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle AON_WDT interrupt request. - * - * @note The count completed can be used if specific safety operations - * or data logging must be performed before the actual reset is generated. - * When RESET Mode is enabled, AON_WDT will generate an interrupt on first timeout. - * If interrupt has not been cleared before the second timeout, AON_WDT will then - * request a SoC Reset. - * - * @param[in] p_aon_wdt: Pointer to a AON_WDT handle which contains the configuration - * information for the specified AON_WDT module. - **************************************************************************************** - */ -void hal_aon_wdt_irq_handler(aon_wdt_handle_t *p_aon_wdt); - -/** - **************************************************************************************** - * @brief AON_WDT count complete (counter reaches to 0) callback. - * - * @note This function should not be modified. When the callback is needed, - * the hal_wdt_count_cplt_callback can be implemented in the user file. - * - * @param[in] p_aon_wdt: Pointer to a AON_WDT handle which contains the configuration - * information for the specified AON_WDT module. - **************************************************************************************** - */ -void hal_aon_wdt_alarm_callback(aon_wdt_handle_t *p_aon_wdt); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_AON_WDT_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_calendar.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_calendar.h deleted file mode 100755 index ae30efe..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_calendar.h +++ /dev/null @@ -1,570 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_calendar.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of CALENDAR HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_CALENDAR CALENDAR - * @brief CALENDAR HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_CALENDAR_H__ -#define __GR55xx_HAL_CALENDAR_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_calendar.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_CALENDAR_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_CALENDAR_STATE HAL CALENDAR state - * @{ - */ -/** - * @brief HAL CALENDAR State Enumerations definition - */ -typedef enum { - HAL_CALENDAR_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_CALENDAR_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_CALENDAR_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_calender_state_t; - -/** @} */ -/** @} */ - - -/** @addtogroup HAL_CALENDAR_STRUCTURES Structures - * @{ - */ -/** @defgroup CALENDAR_Time CALENDAR Time - * @{ - */ - -/** - * @brief CALENDAR_Time calendar time structure definition - */ -typedef struct _calendar_time { - uint8_t sec; /**< Specifies the Calendar time seconds. - This parameter must be a number between min_value = 0 and max_value = 59. */ - - uint8_t min; /**< Specifies the Calendar time minutes. - This parameter must be a number between min_value = 0 and max_value = 59. */ - - uint8_t hour; /**< Specifies the Calendar time hour. - This parameter must be a number between min_value = 0 and max_value = 23. */ - - uint8_t date; /**< Specifies the Calendar date. - This parameter must be a number between min_value = 1 and max_value = 31. */ - - uint8_t mon; /**< Specifies the Calendar month. - This parameter must be a number between min_value = 1 and max_value = 12. */ - - uint8_t year; /**< Specifies the Calendar year which stars from 2010. - This parameter must be a number between min_value = 10 and max_value = 99. */ - - uint8_t week; /**< Specifies the Calendar weekday. - This parameter must be a number between min_value = 0 and max_value = 6. */ - - uint16_t ms; /**< Specifies the Calendar time milliseconds. - This parameter must be a number between min_value = 0 and max_value = 999. */ -} calendar_time_t; - -/** - * @brief CALENDAR_Alarm calendar alarm structure definition - */ -typedef struct _calendar_alarm { - uint8_t min; /**< Specifies the alarm time minutes. - This parameter must be a number between min_value = 0 and max_value = 59. */ - - uint8_t hour; /**< Specifies the alarm time hour. - This parameter must be a number between min_value = 0 and max_value = 23. */ - - uint8_t alarm_sel; /**< Specifies the alarm is on date or weekday. - This parameter can be a value of @ref CALENDAR_ALARM_SEL. */ - - uint8_t alarm_date_week_mask; /**< Specifies the alarm date/weekday. - If the alarm date is selected, this parameter must be set to a value - in the 1 ~ 31 range. - If the alarm weekday is selected, this parameter must be a value of - @ref CALENDAR_ALARM_WEEKDAY. */ -} calendar_alarm_t; - -/** @} */ - -/** @defgroup CALENDAR_handle CALENDAR handle - * @{ - */ - -/** - * @brief CALENDAR handle Structure definition - */ -typedef struct _calendar_handle { - calendar_time_t time_init; /**< Specifies the Calendar inital time. */ - - calendar_alarm_t alarm; /**< Specifies the Calendar date alarm. */ - - hal_lock_t lock; /**< Specifies the Calendar locking object. */ - - uint32_t prev_ms; /**< Accumulated millisecond count .*/ - - uint32_t interval; /**< Specifies the Calendar milliseconds alarm. */ - - uint8_t mode; /**< Specifies the Calendar alarm mode. */ - - uint8_t sec; /**< The seconds for the date alarm. */ - - uint16_t ms; /**< The milliseconds for the date alarm. */ - - hal_calender_state_t state; /**< Calendar state */ -} calendar_handle_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_CALENDAR_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_CALENDAR_Callback Callback - * @{ - */ - -/** - * @brief HAL_CALENDAR Callback function definition - */ - -typedef struct _hal_calendar_callback { - void (*calendar_alarm_callback)(calendar_handle_t *p_calendar); /**< CALENDAR date count complete callback */ - void (*calendar_tick_callback)(calendar_handle_t *p_calendar); /**< CALENDAR tick count complete callback */ - void (*calendar_overflow_callback)(calendar_handle_t *p_calendar); /**< CALENDAR count overflow callback */ -} hal_calendar_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_CALENDAR_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CALENDAR_Exported_Constants CALENDAR Exported Constants - * @{ - */ - -/** @defgroup CALENDAR_Interrupts CALENDAR Interrupts - * @{ - */ -#define CALENDAR_IT_ALARM AON_CALENDAR_TIMER_CTL_ALARM_INT_EN /**< Alarm interrupt */ -#define CALENDAR_IT_WARP AON_CALENDAR_TIMER_CTL_WRAP_INT_EN /**< Warp interrupt */ -/** @} */ - -/** @defgroup CALENDAR_Flags CALENDAR Flags - * @{ - */ -#define CALENDAR_FLAG_ALARM AON_SLP_EVENT_CALENDAR_TIMER_ALARM /**< Alarm interrupt flag */ -#define CALENDAR_FLAG_WARP AON_SLP_EVENT_CALENDAR_TIMER_WRAP /**< Warp interrupt flag */ -/** @} */ - -/** @defgroup CALENDAR_ALARM_SEL CALENDAR Alarm type select - * @{ - */ -#define CALENDAR_ALARM_SEL_DATE (0UL) /**< Alarm in date */ -#define CALENDAR_ALARM_SEL_WEEKDAY (1UL) /**< Alarm in weekday */ -/** @} */ - -/** @defgroup CALENDAR_ALARM_WEEKDAY CALENDAR Alarm weekday - * @{ - */ -#define CALENDAR_ALARM_WEEKDAY_SUN (0x01ul) /**< Alarm weekday mask Sunday */ -#define CALENDAR_ALARM_WEEKDAY_MON (0x02ul) /**< Alarm weekday mask Monday */ -#define CALENDAR_ALARM_WEEKDAY_TUE (0x04ul) /**< Alarm weekday mask Tuesday */ -#define CALENDAR_ALARM_WEEKDAY_WED (0x08ul) /**< Alarm weekday mask Wednesday */ -#define CALENDAR_ALARM_WEEKDAY_THU (0x10ul) /**< Alarm weekday mask Thursday */ -#define CALENDAR_ALARM_WEEKDAY_FRI (0x20ul) /**< Alarm weekday mask Friday */ -#define CALENDAR_ALARM_WEEKDAY_SAT (0x40ul) /**< Alarm weekday mask Saturday */ -/** @} */ - -/** @defgroup CALENDAR_ALARM_DISABLE CALENDAR Alarm mdoe - * @{ - */ -#define CALENDAR_ALARM_DISABLE_DATE (1UL) /**< Disable date alarm */ -#define CALENDAR_ALARM_DISABLE_TICK (2UL) /**< Disable tick alarm */ -#define CALENDAR_ALARM_DISABLE_ALL ((CALENDAR_ALARM_DISABLE_DATE) | \ - CALENDAR_ALARM_DISABLE_TICK) /**< Disable all alarm */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup CALENDAR_Exported_Macros CALENDAR Exported Macros - * @{ - */ - -/** @brief Enable the specified CALENDAR peripheral. - * @retval None - */ -#define HAL_CALENDAR_ENABLE() SET_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_EN) - -/** @brief Disable the specified CALENDAR peripheral. - * @retval None - */ -#define HAL_CALENDAR_DISABLE() CLEAR_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_EN) - -/** @brief Enable the specified CALENDAR interrupts. - * @param __INTERRUPT__ Specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref CALENDAR_IT_ALARM Alarm Interrupt - * @arg @ref CALENDAR_IT_WARP Warp Interrupt - * @retval None - */ -#define HAL_CALENDAR_ENABLE_IT(__INTERRUPT__) SET_BITS(AON->CALENDAR_TIMER_CTL, (__INTERRUPT__)) - -/** @brief Disable the specified CALENDAR interrupts. - * @param __INTERRUPT__ Specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref CALENDAR_IT_ALARM Alarm Interrupt - * @arg @ref CALENDAR_IT_WARP Warp Interrupt - * @retval None - */ -#define HAL_CALENDAR_DISABLE_IT(__INTERRUPT__) CLEAR_BITS(AON->CALENDAR_TIMER_CTL, (__INTERRUPT__)) - -/** @brief Check whether the specified CALENDAR interrupt flag is set or not. - * @param __FLAG__ Specifies the interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref CALENDAR_FLAG_ALARM Alarm Interrupt event - * @arg @ref CALENDAR_FLAG_WARP Warp Interrupt event - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define HAL_CALENDAR_GET_IT_SOURCE(__FLAG__) (READ_BITS(AON->SLP_EVENT, (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified CALENDAR flag. - * @param __FLAG__ Specifies the flag to clear. - * This parameter can be one of the following values: - * @arg @ref CALENDAR_FLAG_ALARM Alarm Interrupt event - * @arg @ref CALENDAR_FLAG_WARP Warp Interrupt event - * @retval None - */ -#define HAL_CALENDAR_CLEAR_FLAG(__FLAG__) WRITE_REG(AON->SLP_EVENT, ~(__FLAG__)) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CALENDAR_Private_Macro CALENDAR Private Macros - * @{ - */ - -/** @brief Check if CALENDAR Alarm Type is valid. - * @param __TYPE__ CALENDAR Alarm Type. - * @retval SET (__TYPE__ is valid) or RESET (__TYPE__ is invalid) - */ -#define IS_CALENDAR_ALARM_TYPE(__TYPE__) (((__TYPE__) == CALENDAR_ALARM_SEL_DATE) || \ - ((__TYPE__) == CALENDAR_ALARM_SEL_WEEKDAY)) - -/** @brief Check if CALENDAR Date is valid. - * @param __DATE__ CALENDAR Date. - * @retval SET (__DATE__ is valid) or RESET (__DATE__ is invalid) - */ -#define IS_CALENDAR_DATE(__DATE__) (((__DATE__) > 0) && ((__DATE__) <= 31)) - -/** @brief Check if CALENDAR Weekday is valid. - * @param __WEEKDAY__ CALENDAR Weekday. - * @retval SET (__WEEKDAY__ is valid) or RESET (__WEEKDAY__ is invalid) - */ -#define IS_CALENDAR_WEEKDAY(__WEEKDAY__) (((__WEEKDAY__) >= 0) && ((__WEEKDAY__) <= 6)) - -/** @brief Check if CALENDAR year is leap year. - * @param __YEAR__ CALENDAR Year. - * @retval SET (__YEAR__ is leap year) or RESET (__YEAR__ is nonleap year) - */ -#define IS_CALENDAR_LEAP_YEAR(__YEAR__) ((((__YEAR__) % 4) == 0 && ((__YEAR__) % 100) != 0) || \ - ((__YEAR__) % 400) == 0) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_CALENDAR_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup CALENDAR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - ============================================================================== - ##### Initialization and Configuration functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and start the CALENDAR according to the specified parameters - in the cslendar_init_t of associated handle. - (+) Initialize the CALENDAR MSP. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the CALENDAR according to the specified parameters in the - * calendar_init_t of associated handle. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_init(calendar_handle_t *p_calendar); - -/** - **************************************************************************************** - * @brief De-initialize the CALENDAR peripheral. - * - * @param[in] p_calendar: CALENDAR handle. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_deinit(calendar_handle_t *p_calendar); - -/** @} */ - -/** @addtogroup CALENDAR_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Init the CALENDAR time. - (+) Get the CALENDAR time. - (+) Set the CALENDAR alarm. - (+) Disable the CALENDAR alarm. - (+) Handle CALENDAR interrupt request and associated function callback. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the CALENDAR time. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - * @param[in] p_time: Pointer to a CALENDAR time struction. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_init_time(calendar_handle_t *p_calendar, calendar_time_t *p_time); - -/** - **************************************************************************************** - * @brief Get current CALENDAR time. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - * @param[in] p_time: Pointer to a CALENDAR time struction. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_get_time(calendar_handle_t *p_calendar, calendar_time_t *p_time); - -/** - **************************************************************************************** - * @brief Set a CALENDAR date alarm. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - * @param[in] p_alarm: After seconds will generate an date alarm interrupt. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_set_alarm(calendar_handle_t *p_calendar, calendar_alarm_t *p_alarm); - -/** - **************************************************************************************** - * @brief Set a CALENDAR tick alarm. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - * @param[in] interval: After milliseconds will generate an milliseconds alarm interrupt. - * The value of interval is greater than or equal to 5ms.(Max: 3600*1000 ms) - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_set_tick(calendar_handle_t *p_calendar, uint32_t interval); - -/** - **************************************************************************************** - * @brief Disable CALENDAR alarm event. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - * @param[in] disable_mode: Disable specified CALENDAR alarm mode. - * This parameter can be the following values: - * @arg @ref CALENDAR_ALARM_DISABLE_DATE - * @arg @ref CALENDAR_ALARM_DISABLE_TICK - * @arg @ref CALENDAR_ALARM_DISABLE_ALL - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_calendar_disable_event(calendar_handle_t *p_calendar, uint32_t disable_mode); - -/** @} */ - - -/** @addtogroup CALENDAR_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle CALENDAR interrupt request. - * - * @note When alarm is enabled, CALENDAR will generate an interrupt on conter match alarm value. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - **************************************************************************************** - */ -void calendar_irq_handler(calendar_handle_t *p_calendar); - -/** - **************************************************************************************** - * @brief CALENDAR date count complete callback. - * - * @note This function should not be modified. when the callback is needed, - * the hal_calendar_alarm_callback can be implemented in the user file. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - **************************************************************************************** - */ -void hal_calendar_alarm_callback(calendar_handle_t *p_calendar); - -/** - **************************************************************************************** - * @brief CALENDAR milliseconds count complete callback. - * - * @note This function should not be modified. when the callback is needed, - * the hal_calendar_tick_callback can be implemented in the user file. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - **************************************************************************************** - */ -void hal_calendar_tick_callback(calendar_handle_t *p_calendar); - -/** - **************************************************************************************** - * @brief CALENDAR overflow callback. - * - * @note This function should not be modified. when the callback is needed, - * the hal_calendar_overflow_callback can be implemented in the user file. - * - * @note The overflow time is about 36 hours. - * - * @param[in] p_calendar: Pointer to a CALENDAR handle which contains the configuration - * information for the specified CALENDAR module. - **************************************************************************************** - */ -void hal_calendar_overflow_callback(calendar_handle_t *p_calendar); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_CALENDAR_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cgc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cgc.h deleted file mode 100755 index 14922c8..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cgc.h +++ /dev/null @@ -1,356 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_cgc.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of CGC HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_CGC CGC - * @brief CGC HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_CGC_H__ -#define __GR55xx_HAL_CGC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_cgc.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_CGC_ENUMERATIONS Enumerations - * @{ - */ - -/** - * @brief CGC Bit Open and Bit Close Enumerations - */ -typedef enum { - CGC_CLK_ON = 0U, /**< Turn on the clock.*/ - CGC_CLK_OFF = 1U, /**< Turn off the clock.*/ -} cgc_clk_state_t; - -/** @} */ - -/** @addtogroup HAL_CGC_STRUCTURES Structures - * @{ - */ - -/** - * @brief CGC init structure definition - */ -typedef struct _cgc_init { - uint32_t wfi_clk; /**< Specifies the blocks that automatically closes the clock. - This parameter can be a combination of group CGC_LL_EC_WFI_CLK0 */ - - uint32_t force_clk; /**< Specifies the blocks to forcibly turn off the clock. - This parameter can be a combination of group CGC_LL_EC_FRC_CLK0 */ -} cgc_init_t; - -/** @} */ - - -/** - * @defgroup HAL_CGC_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CGC_Exported_Constants CGC Exported Constants - * @{ - */ - -/** @defgroup CGC_auto_clk Automatic Turn off clocks - * @{ - */ -#define CGC_WFI_SECU_HCLK ((uint32_t)0x00000001U) /**< Hclk for all security blocks */ -#define CGC_WFI_SIM_HCLK ((uint32_t)0x00000002U) /**< Hclk for sim card interface */ -#define CGC_WFI_HTB_HCLK ((uint32_t)0x00000004U) /**< Hclk for hopping table */ -#define CGC_WFI_PWM_HCLK ((uint32_t)0x00000008U) /**< Hclk for PWM */ -#define CGC_WFI_ROM_HCLK ((uint32_t)0x00000010U) /**< Hclk for ROM */ -#define CGC_WFI_SNSADC_HCLK ((uint32_t)0x00000020U) /**< Hclk for sense ADC */ -#define CGC_WFI_GPIO_HCLK ((uint32_t)0x00000040U) /**< Hclk for GPIOs */ -#define CGC_WFI_DMA_HCLK ((uint32_t)0x00000080U) /**< Hclk for DMA engine */ -#define CGC_WFI_BLE_BRG_HCLK ((uint32_t)0x00000100U) /**< Hclk for BLE MCU bridge */ -#define CGC_WFI_APB_SUB_HCLK ((uint32_t)0x00000200U) /**< Hclk for APB subsystem */ -#define CGC_WFI_SERIAL_HCLK ((uint32_t)0x00000400U) /**< Hclk for serial blocks */ -#define CGC_WFI_I2S_S_HCLK ((uint32_t)0x00000800U) /**< Hclk for I2S slave */ -#define CGC_WFI_AON_MCUSUB_HCLK ((uint32_t)0x00001000U) /**< Hclk for Always-on register */ -#define CGC_WFI_XF_XQSPI_HCLK ((uint32_t)0x00002000U) /**< Hclk for cache top */ -#define CGC_WFI_SRAM_HCLK ((uint32_t)0x00004000U) /**< Hclk for SRAMs */ -#define CGC_WFI_SECU_DIV4_PCLK ((uint32_t)0x00008000U) /**< Div4 clk for security blocks */ -#define CGC_WFI_XQSPI_DIV4_PCLK ((uint32_t)0x00020000U) /**< Div4 clk for xf qspi */ - -#define CGC_WFI_ALL_CLK ((uint32_t)0x0002FFFFU) /**< All clocks */ -/** @} */ - -/** @defgroup CGC_force_clk Force cloks off - * @{ - */ -#define CGC_FRC_SECU_HCLK ((uint32_t)0x00000001U) /**< Hclk for all security blocks */ -#define CGC_FRC_SIM_HCLK ((uint32_t)0x00000002U) /**< Hclk for sim card interface */ -#define CGC_FRC_HTB_HCLK ((uint32_t)0x00000004U) /**< Hclk for hopping table */ -#define CGC_FRC_PWM_HCLK ((uint32_t)0x00000008U) /**< Hclk for PWM */ -#define CGC_FRC_ROM_HCLK ((uint32_t)0x00000010U) /**< Hclk for ROM */ -#define CGC_FRC_SNSADC_HCLK ((uint32_t)0x00000020U) /**< Hclk for sense ADC */ -#define CGC_FRC_GPIO_HCLK ((uint32_t)0x00000040U) /**< Hclk for GPIOs */ -#define CGC_FRC_DMA_HCLK ((uint32_t)0x00000080U) /**< Hclk for DMA engine */ -#define CGC_FRC_BLE_BRG_HCLK ((uint32_t)0x00000100U) /**< Hclk for BLE MCU bridge */ -#define CGC_FRC_APB_SUB_HCLK ((uint32_t)0x00000200U) /**< Hclk for APB subsystem */ -#define CGC_FRC_SERIAL_HCLK ((uint32_t)0x00000400U) /**< Hclk for serial blocks */ -#define CGC_FRC_I2S_S_HCLK ((uint32_t)0x00000800U) /**< Hclk for I2S slave */ -#define CGC_FRC_AON_MCUSUB_HCLK ((uint32_t)0x00001000U) /**< Hclk for Always-on register */ -#define CGC_FRC_XF_XQSPI_HCLK ((uint32_t)0x00002000U) /**< Hclk for cache top */ -#define CGC_FRC_SRAM_HCLK ((uint32_t)0x00004000U) /**< Hclk for SRAMs */ -#define CGC_FRC_UART0_HCLK ((uint32_t)0x00008000U) /**< Hclk for uart0 */ -#define CGC_FRC_UART1_HCLK ((uint32_t)0x00010000U) /**< Hclk for uart1 */ -#define CGC_FRC_I2C0_HCLK ((uint32_t)0x00020000U) /**< Hclk for i2c0 */ -#define CGC_FRC_I2C1_HCLK ((uint32_t)0x00040000U) /**< Hclk for i2c1 */ -#define CGC_FRC_SPIM_HCLK ((uint32_t)0x00080000U) /**< Hclk for spim */ -#define CGC_FRC_SPIS_HCLK ((uint32_t)0x00100000U) /**< Hclk for spis */ -#define CGC_FRC_QSPI0_HCLK ((uint32_t)0x00200000U) /**< Hclk for qspi0 */ -#define CGC_FRC_QSPI1_HCLK ((uint32_t)0x00400000U) /**< Hclk for qspi1 */ -#define CGC_FRC_I2S_HCLK ((uint32_t)0x00800000U) /**< Hclk for i2s */ -#define CGC_FRC_SECU_DIV4_PCLK ((uint32_t)0x01000000U) /**< Div4 clk for security blocks */ -#define CGC_FRC_XQSPI_DIV4_PCLK ((uint32_t)0x04000000U) /**< Div4 clk for xf qspi */ - -#define CGC_FRC_ALL_CLK ((uint32_t)0x05FFFFFFU) /**< All clocks */ -/** @} */ - -/** - * @brief CGC_default_config init Struct default configuartion - */ -#define CGC_DEFAULT_CONFIG \ -{ \ - .wfi_clk = ~CGC_WFI_ALL_CLK, \ - .force_clk = ~CGC_FRC_ALL_CLK, \ -} -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_CGC_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup CGC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the CGC registers according to the specified parameters in the @ref cgc_init_t. - * @param[in] p_cgc_init: Pointer to a @ref cgc_init_t structure that contains - * the configuration information for the specified CGC registers. - **************************************************************************************** - */ -void hal_cgc_init(cgc_init_t *p_cgc_init); - -/** - **************************************************************************************** - * @brief De-initialize the CGC registers to their default reset values. - **************************************************************************************** - */ -void hal_cgc_deinit(void); - -/** @} */ - -/** @addtogroup CGC_Exported_Functions_Group2 Peripheral Control functions. - * @brief Clock Gate Open and Closemanagement functions. - * @{ - */ - -/** - **************************************************************************************** - * @brief Configure the clock state for a specified block during WFI. - * @param[in] blocks: Specifies the peripheral blocks. - * This parameter can be a combiantion of the following values: - * @arg @ref CGC_WFI_SECU_HCLK - * @arg @ref CGC_WFI_SIM_HCLK - * @arg @ref CGC_WFI_HTB_HCLK - * @arg @ref CGC_WFI_PWM_HCLK - * @arg @ref CGC_WFI_ROM_HCLK - * @arg @ref CGC_WFI_SNSADC_HCLK - * @arg @ref CGC_WFI_GPIO_HCLK - * @arg @ref CGC_WFI_DMA_HCLK - * @arg @ref CGC_WFI_BLE_BRG_HCLK - * @arg @ref CGC_WFI_APB_SUB_HCLK - * @arg @ref CGC_WFI_SERIAL_HCLK - * @arg @ref CGC_WFI_I2S_S_HCLK - * @arg @ref CGC_WFI_AON_MCUSUB_HCLK - * @arg @ref CGC_WFI_XF_XQSPI_HCLK - * @arg @ref CGC_WFI_SRAM_HCLK - * @arg @ref CGC_WFI_SECU_DIV4_PCLK - * @arg @ref CGC_WFI_XQSPI_DIV4_PCLK - * @param[in] clk_state: Specifies the clock state during WFI. - * This parameter can be one of the following values: - * @arg @ref CGC_CLK_ON - * @arg @ref CGC_CLK_OFF - **************************************************************************************** - */ -void hal_cgc_config_wfi_clk(uint32_t blocks, cgc_clk_state_t clk_state); - -/** - **************************************************************************************** - * @brief Get the clock state for a specified block during WFI. - * @param[in] block: Specifies the peripheral blocks. - * This parameter can be one of the following values: - * @arg @ref CGC_WFI_SECU_HCLK - * @arg @ref CGC_WFI_SIM_HCLK - * @arg @ref CGC_WFI_HTB_HCLK - * @arg @ref CGC_WFI_PWM_HCLK - * @arg @ref CGC_WFI_ROM_HCLK - * @arg @ref CGC_WFI_SNSADC_HCLK - * @arg @ref CGC_WFI_GPIO_HCLK - * @arg @ref CGC_WFI_DMA_HCLK - * @arg @ref CGC_WFI_BLE_BRG_HCLK - * @arg @ref CGC_WFI_APB_SUB_HCLK - * @arg @ref CGC_WFI_SERIAL_HCLK - * @arg @ref CGC_WFI_I2S_S_HCLK - * @arg @ref CGC_WFI_AON_MCUSUB_HCLK - * @arg @ref CGC_WFI_XF_XQSPI_HCLK - * @arg @ref CGC_WFI_SRAM_HCLK - * @arg @ref CGC_WFI_SECU_DIV4_PCLK - * @arg @ref CGC_WFI_XQSPI_DIV4_PCLK - * @retval ::CGC_CLK_ON: Clock On. - * @retval ::CGC_CLK_OFF: Clock Off. - **************************************************************************************** - */ -cgc_clk_state_t hal_cgc_get_wfi_clk(uint32_t block); - -/** - **************************************************************************************** - * @brief Forced to Configure the clock state for a specified block. - * @param[in] blocks: Specifies the peripheral blocks. - * This parameter can be a combiantion of the following values: - * @arg @ref CGC_FRC_SECU_HCLK - * @arg @ref CGC_FRC_SIM_HCLK - * @arg @ref CGC_FRC_HTB_HCLK - * @arg @ref CGC_FRC_PWM_HCLK - * @arg @ref CGC_FRC_ROM_HCLK - * @arg @ref CGC_FRC_SNSADC_HCLK - * @arg @ref CGC_FRC_GPIO_HCLK - * @arg @ref CGC_FRC_DMA_HCLK - * @arg @ref CGC_FRC_BLE_BRG_HCLK - * @arg @ref CGC_FRC_APB_SUB_HCLK - * @arg @ref CGC_FRC_SERIAL_HCLK - * @arg @ref CGC_FRC_I2S_S_HCLK - * @arg @ref CGC_FRC_AON_MCUSUB_HCLK - * @arg @ref CGC_FRC_XF_XQSPI_HCLK - * @arg @ref CGC_FRC_SRAM_HCLK - * @arg @ref CGC_FRC_UART0_HCLK - * @arg @ref CGC_FRC_UART1_HCLK - * @arg @ref CGC_FRC_I2C0_HCLK - * @arg @ref CGC_FRC_I2C1_HCLK - * @arg @ref CGC_FRC_SPIM_HCLK - * @arg @ref CGC_FRC_SPIS_HCLK - * @arg @ref CGC_FRC_QSPI0_HCLK - * @arg @ref CGC_FRC_QSPI1_HCLK - * @arg @ref CGC_FRC_I2S_HCLK - * @arg @ref CGC_FRC_SECU_DIV4_PCLK - * @arg @ref CGC_FRC_XQSPI_DIV4_PCLK - * @param[in] clk_state: Specifies the clock state. - * This parameter can be one of the following values: - * @arg @ref CGC_CLK_ON - * @arg @ref CGC_CLK_OFF - **************************************************************************************** - */ -void hal_cgc_config_force_clk(uint32_t blocks, cgc_clk_state_t clk_state); - -/** - **************************************************************************************** - * @brief Get the clock status of the currently specified block. - * @param[in] block: Specifies the peripheral blocks. - * This parameter can be one of the following values: - * @arg @ref CGC_FRC_SECU_HCLK - * @arg @ref CGC_FRC_SIM_HCLK - * @arg @ref CGC_FRC_HTB_HCLK - * @arg @ref CGC_FRC_PWM_HCLK - * @arg @ref CGC_FRC_ROM_HCLK - * @arg @ref CGC_FRC_SNSADC_HCLK - * @arg @ref CGC_FRC_GPIO_HCLK - * @arg @ref CGC_FRC_DMA_HCLK - * @arg @ref CGC_FRC_BLE_BRG_HCLK - * @arg @ref CGC_FRC_APB_SUB_HCLK - * @arg @ref CGC_FRC_SERIAL_HCLK - * @arg @ref CGC_FRC_I2S_S_HCLK - * @arg @ref CGC_FRC_AON_MCUSUB_HCLK - * @arg @ref CGC_FRC_XF_XQSPI_HCLK - * @arg @ref CGC_FRC_SRAM_HCLK - * @arg @ref CGC_FRC_UART0_HCLK - * @arg @ref CGC_FRC_UART1_HCLK - * @arg @ref CGC_FRC_I2C0_HCLK - * @arg @ref CGC_FRC_I2C1_HCLK - * @arg @ref CGC_FRC_SPIM_HCLK - * @arg @ref CGC_FRC_SPIS_HCLK - * @arg @ref CGC_FRC_QSPI0_HCLK - * @arg @ref CGC_FRC_QSPI1_HCLK - * @arg @ref CGC_FRC_I2S_HCLK - * @arg @ref CGC_FRC_SECU_DIV4_PCLK - * @arg @ref CGC_FRC_XQSPI_DIV4_PCLK - * @retval ::CGC_CLK_ON: Clock On. - * @retval ::CGC_CLK_OFF: Clock Off. - **************************************************************************************** - */ -cgc_clk_state_t hal_cgc_get_force_clk(uint32_t block); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_CGC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_comp.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_comp.h deleted file mode 100755 index 23fbbe7..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_comp.h +++ /dev/null @@ -1,441 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_comp.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of COMP HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_COMP COMP - * @brief COMP HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_COMP_H__ -#define __GR55xx_HAL_COMP_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_comp.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_COMP_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_COMP_state HAL COMP state - * @{ - */ - -/** - * @brief HAL COMP State Enumerations definition - */ -typedef enum { - HAL_COMP_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_COMP_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_COMP_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_COMP_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_comp_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_COMP_STRUCTURES Structures - * @{ - */ - -/** @defgroup COMP_Configuration COMP Configuration - * @{ - */ - -/** - * @brief COMP init structure definition - */ -typedef ll_comp_init_t comp_init_t; -/** @} */ - -/** @defgroup COMP_handle COMP handle - * @{ - */ - -/** - * @brief COMP handle Structure definition - */ -typedef struct _comp_handle { - comp_init_t init; /**< COMP configuration parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_comp_state_t state; /**< COMP communication state */ - - __IO uint32_t error_code; /**< COMP error code */ - - uint32_t retention[1]; /**< COMP important register information. */ -} comp_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_COMP_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup COMP_Callback COMP Callback - * @{ - */ - -/** - * @brief HAL COMP Callback function definition - */ -typedef struct _comp_callback { - void (*comp_msp_init)(comp_handle_t *p_comp); /**< COMP init MSP callback */ - void (*comp_msp_deinit)(comp_handle_t *p_comp); /**< COMP de-init MSP callback */ - void (*comp_trigger_callback)(comp_handle_t *p_comp); /**< COMP comparator callback */ -} comp_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_COMP_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup COMP_Exported_Constants COMP Exported Constants - * @{ - */ - -/** @defgroup COMP_Error_Code COMP Error Code - * @{ - */ -#define HAL_COMP_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_COMP_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_COMP_ERROR_INVALID_PARAM ((uint32_t)0x00000002) /**< Invalid parameters error */ -/** @} */ - - -/** @defgroup COMP_INPUT_SOURCE COMP Input Channel Select - * @{ - */ -#define COMP_INPUT_SRC_IO0 LL_COMP_INPUT_SRC_IO0 /**< Set MSIO_0 as inputs for the comparator */ -#define COMP_INPUT_SRC_IO1 LL_COMP_INPUT_SRC_IO1 /**< Set MSIO_1 as inputs for the comparator */ -#define COMP_INPUT_SRC_IO2 LL_COMP_INPUT_SRC_IO2 /**< Set MSIO_2 as inputs for the comparator */ -#define COMP_INPUT_SRC_IO3 LL_COMP_INPUT_SRC_IO3 /**< Set MSIO_3 as inputs for the comparator */ -#define COMP_INPUT_SRC_IO4 LL_COMP_INPUT_SRC_IO4 /**< Set MSIO_4 as inputs for the comparator */ -/** @} */ - -/** @defgroup COMP_REFERENCE_SOURCE COMP Reference Source Select - * @{ - */ -#define COMP_REF_SRC_IO0 LL_COMP_REF_SRC_IO0 /**< Set MSIO_0 as references for the comparator */ -#define COMP_REF_SRC_IO1 LL_COMP_REF_SRC_IO1 /**< Set MSIO_1 as references for the comparator */ -#define COMP_REF_SRC_IO2 LL_COMP_REF_SRC_IO2 /**< Set MSIO_2 as references for the comparator */ -#define COMP_REF_SRC_IO3 LL_COMP_REF_SRC_IO3 /**< Set MSIO_3 as references for the comparator */ -#define COMP_REF_SRC_IO4 LL_COMP_REF_SRC_IO4 /**< Set MSIO_4 as references for the comparator */ -#define COMP_REF_SRC_VBAT LL_COMP_REF_SRC_VBAT /**< Set VBATT as references for the comparator */ -#define COMP_REF_SRC_VREF LL_COMP_REF_SRC_VREF /**< Set VREF as references for the comparator */ -/** @} */ - -/** - * @brief Default configuartion for initializing structure - */ -#define COMP_DEFAULT_CONFIG LL_COMP_DEFAULT_CONFIG -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @addtogroup COMP_Private_Macros COMP Private Macros - * @{ - */ - -/** - * @brief Check if COMP input source is valid. - * @param __INPUT__ COMP input source. - * @retval SET (__INPUT__ is valid) or RESET (__INPUT__ is invalid) - */ -#define IS_COMP_INPUT(__INPUT__) (((__INPUT__) == COMP_INPUT_SRC_IO0) || \ - ((__INPUT__) == COMP_INPUT_SRC_IO1) || \ - ((__INPUT__) == COMP_INPUT_SRC_IO2) || \ - ((__INPUT__) == COMP_INPUT_SRC_IO3) || \ - ((__INPUT__) == COMP_INPUT_SRC_IO4)) - -/** - * @brief Check if COMP reference source is valid. - * @param __INPUT__ COMP reference source. - * @retval SET (__INPUT__ is valid) or RESET (__INPUT__ is invalid) - */ -#define IS_COMP_REF(__INPUT__) (((__INPUT__) == COMP_REF_SRC_IO0) || \ - ((__INPUT__) == COMP_REF_SRC_IO1) || \ - ((__INPUT__) == COMP_REF_SRC_IO2) || \ - ((__INPUT__) == COMP_REF_SRC_IO3) || \ - ((__INPUT__) == COMP_REF_SRC_IO4) || \ - ((__INPUT__) == COMP_REF_SRC_VBAT) || \ - ((__INPUT__) == COMP_REF_SRC_VREF)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_COMP_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup COMP_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the COMP according to the specified parameters - * in the comp_init_t and initialize the associated handle. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_comp_init(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief De-initialize the COMP peripheral. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_comp_deinit(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief Initialize the COMP MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_comp_msp_deinit can be implemented in the user file. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - **************************************************************************************** - */ -void hal_comp_msp_init(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief De-initialize the COMP MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_comp_msp_deinit can be implemented in the user file. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - **************************************************************************************** - */ -void hal_comp_msp_deinit(comp_handle_t *p_comp); - -/** @} */ - -/** @addtogroup COMP_Exported_Functions_Group2 IO operation functions - * @brief COMP polling and DMA conversion management functions. - * @{ - */ - -/** -**************************************************************************************** -* @brief Start the comparator. -* -* @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for -* the specified COMP module. -* -* @retval ::HAL_OK: Operation is OK. -* @retval ::HAL_ERROR: Parameter error or operation not supported. -* @retval ::HAL_BUSY: Driver is busy. -* @retval ::HAL_TIMEOUT: Timeout occurred. -**************************************************************************************** -*/ -hal_status_t hal_comp_start(comp_handle_t *p_comp); - -/** -**************************************************************************************** -* @brief Stop the comparator. -* -* @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for -* the specified COMP module. -* -* @retval ::HAL_OK: Operation is OK. -* @retval ::HAL_ERROR: Parameter error or operation not supported. -* @retval ::HAL_BUSY: Driver is busy. -* @retval ::HAL_TIMEOUT: Timeout occurred. -**************************************************************************************** -*/ -hal_status_t hal_comp_stop(comp_handle_t *p_comp); - -/** @} */ - -/** @addtogroup COMP_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle COMP interrupt request. - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information - * for the specified COMP module. - **************************************************************************************** - */ -void hal_comp_irq_handler(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief comparator callback. - * - * @note This function should not be modified. When the callback is needed, - * the hal_comp_trigger_callback can be implemented in the user file. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - **************************************************************************************** - */ -void hal_comp_trigger_callback(comp_handle_t *p_comp); - -/** @} */ - -/** @defgroup COMP_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief COMP control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the COMP. - (+) hal_comp_get_state() API can be helpful to check in run-time the state of the COMP peripheral. - (+) hal_comp_get_error() check in run-time Errors occurring during communication. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the COMP handle state. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - * - * @retval ::HAL_COMP_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_COMP_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_COMP_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_COMP_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_comp_state_t hal_comp_get_state(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief Return the COMP error code. - * - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration information for - * the specified COMP module. - * - * @return COMP error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_comp_get_error(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief Suspend some registers related to COMP configuration before sleep. - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration - * information for the specified COMP module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_comp_suspend_reg(comp_handle_t *p_comp); - -/** - **************************************************************************************** - * @brief Restore some registers related to COMP configuration after sleep. - * This function must be used in conjunction with the hal_comp_suspend_reg(). - * @param[in] p_comp: Pointer to a COMP handle which contains the configuration - * information for the specified COMP module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_comp_resume_reg(comp_handle_t *p_comp); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_COMP_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_conf.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_conf.h deleted file mode 100755 index 0f6ce2f..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_conf.h +++ /dev/null @@ -1,241 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_conf.h - * @author BLE Driver Team - * @brief HAL configuration file. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_CONF_H__ -#define __GR55xx_HAL_CONF_H__ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED /**< Enable HAL module driver */ -#define HAL_ADC_MODULE_ENABLED /**< Enable ADC HAL module driver */ -#define HAL_AON_GPIO_MODULE_ENABLED /**< Enable AON GPIO HAL module driver */ -#define HAL_CORTEX_MODULE_ENABLED /**< Enable CORTEX HAL module driver */ -#define HAL_DMA_MODULE_ENABLED /**< Enable DMA HAL module driver */ -#define HAL_DUAL_TIMER_MODULE_ENABLED /**< Enable DUAL TIM module driver */ -#define HAL_EXFLASH_MODULE_ENABLED /**< Enable EXFLASH module driver */ -#define HAL_GPIO_MODULE_ENABLED /**< Enable GPIO module driver */ -#define HAL_I2C_MODULE_ENABLED /**< Enable I2C module driver */ -#define HAL_MSIO_MODULE_ENABLED /**< Enable MSIO module driver */ -#define HAL_PKC_MODULE_ENABLED /**< Enable PKC module driver */ -#define HAL_PWM_MODULE_ENABLED /**< Enable PWM module driver */ -#define HAL_PWR_MODULE_ENABLED /**< Enable PWR module driver */ -#define HAL_QSPI_MODULE_ENABLED /**< Enable QSPI module driver */ -#define HAL_SPI_MODULE_ENABLED /**< Enable SPI module driver */ -#define HAL_TIMER_MODULE_ENABLED /**< Enable TIM module driver */ -#define HAL_UART_MODULE_ENABLED /**< Enable UART module driver */ -#define HAL_WDT_MODULE_ENABLED /**< Enable WDT module driver */ -#define HAL_XQSPI_MODULE_ENABLED /**< Enable XQSPI module driver */ -#define HAL_AON_WDT_MODULE_ENABLED /**< Enable AON WDT module driver */ -#define HAL_CALENDAR_MODULE_ENABLED /**< Enable CALENDAR module driver */ -#define HAL_HMAC_MODULE_ENABLED /**< Enable HMAC module driver */ -#define HAL_I2S_MODULE_ENABLED /**< Enable I2S module driver */ -#define HAL_AES_MODULE_ENABLED /**< Enable AES module driver */ -#define HAL_EFUSE_MODULE_ENABLED /**< Enable EFUSE module driver */ -#define HAL_ISO7816_MODULE_ENABLED /**< Enable ISO7816 module driver */ -#define HAL_CGC_MODULE_ENABLED /**< Enable CGC module driver */ -#define HAL_RNG_MODULE_ENABLED /**< Enable RNG module driver */ -#define HAL_COMP_MODULE_ENABLED /**< Enable COMP module driver */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define TICK_INT_PRIORITY ((uint32_t)(1U<<(__NVIC_PRIO_BITS - 4)) - 1U) /*!< tick interrupt priority - (lowest by default) - by group priority 4. */ -#define USE_RTOS 0U /*!< use rtos */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "gr_assert_param" macro in the - * HAL drivers code - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" -/** - * @brief Include module's header file - */ -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "gr55xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "gr55xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_AES_MODULE_ENABLED -#include "gr55xx_hal_aes.h" -#endif /* HAL_AES_MODULE_ENABLED */ - -#ifdef HAL_AON_GPIO_MODULE_ENABLED -#include "gr55xx_hal_aon_gpio.h" -#endif /* HAL_AON_GPIO_MODULE_ENABLED */ - -#ifdef HAL_AON_WDT_MODULE_ENABLED -#include "gr55xx_hal_aon_wdt.h" -#endif /* HAL_AON_WDT_MODULE_ENABLED */ - -#ifdef HAL_CALENDAR_MODULE_ENABLED -#include "gr55xx_hal_calendar.h" -#endif /* HAL_CALENDAR_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "gr55xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_DUAL_TIMER_MODULE_ENABLED -#include "gr55xx_hal_dual_tim.h" -#endif /* HAL_DUAL_TIMER_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "gr55xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_HMAC_MODULE_ENABLED -#include "gr55xx_hal_hmac.h" -#endif /* HAL_HMAC_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "gr55xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "gr55xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_MSIO_MODULE_ENABLED -#include "gr55xx_hal_msio.h" -#endif /* HAL_MSIO_MODULE_ENABLED */ - -#ifdef HAL_PKC_MODULE_ENABLED -#include "gr55xx_hal_pkc.h" -#endif /* HAL_PKC_MODULE_ENABLED */ - -#ifdef HAL_PWM_MODULE_ENABLED -#include "gr55xx_hal_pwm.h" -#endif /* HAL_PWM_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "gr55xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED -#include "gr55xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "gr55xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SPI_V2_MODULE_ENABLED -#include "gr55xx_hal_spi_v2.h" -#endif /* HAL_SPI_V2_MODULE_ENABLED */ - -#ifdef HAL_TIMER_MODULE_ENABLED -#include "gr55xx_hal_tim.h" -#endif /* HAL_TIMER_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "gr55xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_WDT_MODULE_ENABLED -#include "gr55xx_hal_wdt.h" -#endif /* HAL_WDT_MODULE_ENABLED */ - -#ifdef HAL_XQSPI_MODULE_ENABLED -#include "gr55xx_hal_xqspi.h" -#endif /* HAL_XQSPI_MODULE_ENABLED */ - -#ifdef HAL_EXFLASH_MODULE_ENABLED -#include "gr55xx_hal_exflash.h" -#endif /* HAL_EXFLASH_MODULE_ENABLED */ - -#ifdef HAL_EFUSE_MODULE_ENABLED -#include "gr55xx_hal_efuse.h" -#endif /* HAL_EFUSE_MODULE_ENABLED */ - -#ifdef HAL_CGC_MODULE_ENABLED -#include "gr55xx_hal_cgc.h" -#endif /* HAL_CGC_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED -#include "gr55xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED -#include "gr55xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_ISO7816_MODULE_ENABLED -#include "gr55xx_hal_iso7816.h" -#endif /* HAL_ISO7816_MODULE_ENABLED */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The gr_assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define gr_assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(char *file, uint32_t line); -#else -#define gr_assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_CONF_H__ */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cortex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cortex.h deleted file mode 100755 index f273c63..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_cortex.h +++ /dev/null @@ -1,748 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_cortex.h - * @author BLE Driver Team - * @brief Header file of CORTEX HAL module. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_CORTEX CORTEX - * @brief CORTEX HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_CORTEX_H__ -#define __GR55xx_HAL_CORTEX_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ - -/** @addtogroup HAL_CORTEX_STRUCTURES Structures - * @{ - */ - -#if (__MPU_PRESENT == 1U) - -/** @defgroup CORTEX_MPU_Region_Configuration MPU Region Configuration - * @{ - */ - -/** - * @brief MPU Region initialization structure - */ -typedef struct _mpu_region_init_t { - uint8_t enable; /**< Specifies the status of the region. - This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ - - uint8_t number; /**< Specifies the number of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Number */ - - uint32_t base_address; /**< Specifies the base address of the region to protect. */ - - uint8_t size; /**< Specifies the size of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Size */ - - uint8_t subregion_disable; /**< Specifies the number of the subregion protection to disable. - This parameter must be a number between Min_Data = 0x00 and - Max_Data = 0xFF */ - - uint8_t type_tex_field; /**< Specifies the TEX field level. - This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ - - uint8_t access_permission; /**< Specifies the region access permission type. - This parameter can be a value of - @ref CORTEX_MPU_Region_Permission_Attributes */ - - uint8_t disable_exec; /**< Specifies the instruction access status. - This parameter can be a value of - @ref CORTEX_MPU_Instruction_Access */ - - uint8_t is_shareable; /**< Specifies the shareability status of the protected region. - This parameter can be a value of - @ref CORTEX_MPU_Access_Shareable */ - - uint8_t is_cacheable; /**< Specifies the cacheable status of the region protected. - This parameter can be a value of - @ref CORTEX_MPU_Access_Cacheable */ - - uint8_t is_bufferable; /**< Specifies the bufferable status of the protected region. - This parameter can be a value of - @ref CORTEX_MPU_Access_Bufferable */ -} mpu_region_init_t; - -/** @} */ - -#endif /* __MPU_PRESENT */ - -/** @} */ - - -/** - * @defgroup HAL_CORTEX_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group - * @{ - */ -#define NVIC_PRIORITYGROUP_0 (0x00000007U) /**< 0 bit for pre-emption priority, - 8 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 (0x00000006U) /**< 1 bit for pre-emption priority, - 7 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 (0x00000005U) /**< 2 bits for pre-emption priority, - 6 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 (0x00000004U) /**< 3 bits for pre-emption priority, - 5 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 (0x00000003U) /**< 4 bits for pre-emption priority, - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_5 (0x00000002U) /**< 5 bits for pre-emption priority, - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_6 (0x00000001U) /**< 6 bits for pre-emption priority, - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_7 (0x00000000U) /**< 7 bits for pre-emption priority, - 1 bit for subpriority */ -/** @} */ - -/** @defgroup CORTEX_SysTick_clock_source CORTEX SysTick clock source - * @{ - */ -#define SYSTICK_CLKSOURCE_REFCLK (0x00000000U) /**< SYSTICK clock source External Reference Clock */ -#define SYSTICK_CLKSOURCE_HCLK (0x00000004U) /**< SYSTICK clock source HCLK */ -/** @} */ - -#if (__MPU_PRESENT == 1U) -/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control - * @{ - */ -#define MPU_HFNMI_PRIVDEF_NONE (0x00000000U) /**< HFNMIENA disable, PRIVDEFENA disable */ -#define MPU_HARDFAULT_NMI (0x00000002U) /**< HFNMIENA enable, PRIVDEFENA disable */ -#define MPU_PRIVILEGED_DEFAULT (0x00000004U) /**< HFNMIENA disable, PRIVDEFENA enable */ -#define MPU_HFNMI_PRIVDEF (0x00000006U) /**< HFNMIENA enable, PRIVDEFENA enable */ -/** @} */ - -/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable - * @{ - */ -#define MPU_REGION_ENABLE ((uint8_t)0x01U) /**< MPU Region Enable */ -#define MPU_REGION_DISABLE ((uint8_t)0x00U) /**< MPU Region Disable */ -/** @} */ - -/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access - * @{ - */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00U) /**< MPU Instruction Access Enable */ -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01U) /**< MPU Instruction Access Disable */ -/** @} */ - -/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable - * @{ - */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01U) /**< MPU Instruction Access Shareable */ -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00U) /**< MPU Instruction Access Not Shareable */ -/** @} */ - -/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable - * @{ - */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01U) /**< MPU Instruction Access Cacheable */ -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00U) /**< MPU Instruction Access Not Cacheable */ -/** @} */ - -/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable - * @{ - */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01U) /**< MPU Instruction Access Bufferable */ -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00U) /**< MPU Instruction Access Not Bufferable */ -/** @} */ - -/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels - * @{ - */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00U) /**< MPU TEX Level 0 */ -#define MPU_TEX_LEVEL1 ((uint8_t)0x01U) /**< MPU TEX Level 1 */ -#define MPU_TEX_LEVEL2 ((uint8_t)0x02U) /**< MPU TEX Level 2 */ -/** @} */ - -/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size - * @{ - */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04U) /**< MPU Region Size 32B */ -#define MPU_REGION_SIZE_64B ((uint8_t)0x05U) /**< MPU Region Size 64B */ -#define MPU_REGION_SIZE_128B ((uint8_t)0x06U) /**< MPU Region Size 128B */ -#define MPU_REGION_SIZE_256B ((uint8_t)0x07U) /**< MPU Region Size 256B */ -#define MPU_REGION_SIZE_512B ((uint8_t)0x08U) /**< MPU Region Size 512B */ -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09U) /**< MPU Region Size 1KB */ -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) /**< MPU Region Size 2KB */ -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) /**< MPU Region Size 4KB */ -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) /**< MPU Region Size 8KB */ -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) /**< MPU Region Size 16KB */ -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) /**< MPU Region Size 32KB */ -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) /**< MPU Region Size 64KB */ -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10U) /**< MPU Region Size 128KB */ -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11U) /**< MPU Region Size 256KB */ -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12U) /**< MPU Region Size 512KB */ -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13U) /**< MPU Region Size 1MB */ -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14U) /**< MPU Region Size 2MB */ -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15U) /**< MPU Region Size 4MB */ -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16U) /**< MPU Region Size 8MB */ -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17U) /**< MPU Region Size 16MB */ -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18U) /**< MPU Region Size 32MB */ -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19U) /**< MPU Region Size 64MB */ -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) /**< MPU Region Size 128MB */ -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) /**< MPU Region Size 256MB */ -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) /**< MPU Region Size 512MB */ -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) /**< MPU Region Size 1GB */ -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) /**< MPU Region Size 2GB */ -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) /**< MPU Region Size 4GB */ -/** @} */ - -/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes - * @{ - */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00U) /**< All accesses generate a permission fault */ -#define MPU_REGION_PRIV_RW ((uint8_t)0x01U) /**< Access from privileged software only */ -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02U) /**< Write by unprivileged software generate a permission fault */ -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03U) /**< Full access */ -#define MPU_REGION_PRIV_RO ((uint8_t)0x05U) /**< Reads by privileged software only */ -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06U) /**< Read only, by privileged or unprivileged software */ -/** @} */ - -/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number - * @{ - */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00U) /**< MPU Region Number 0 */ -#define MPU_REGION_NUMBER1 ((uint8_t)0x01U) /**< MPU Region Number 1 */ -#define MPU_REGION_NUMBER2 ((uint8_t)0x02U) /**< MPU Region Number 2 */ -#define MPU_REGION_NUMBER3 ((uint8_t)0x03U) /**< MPU Region Number 3 */ -#define MPU_REGION_NUMBER4 ((uint8_t)0x04U) /**< MPU Region Number 4 */ -#define MPU_REGION_NUMBER5 ((uint8_t)0x05U) /**< MPU Region Number 5 */ -#define MPU_REGION_NUMBER6 ((uint8_t)0x06U) /**< MPU Region Number 6 */ -#define MPU_REGION_NUMBER7 ((uint8_t)0x07U) /**< MPU Region Number 7 */ -/** @} */ -#endif /* __MPU_PRESENT */ - -/** @} */ - -/* Exported Macros -----------------------------------------------------------*/ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CORTEX_Private_Macros CORTEX Private Macros - * @{ - */ - -/** - * @brief Check if NVIC priority group is valid. - * @param __GROUP__ NVIC priority group. - * @retval SET (__GROUP__ is valid) or RESET (__GROUP__ is invalid) - */ -#define IS_NVIC_PRIORITY_GROUP(__GROUP__) (((__GROUP__) == NVIC_PRIORITYGROUP_0) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_1) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_2) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_3) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_4) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_5) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_6) || \ - ((__GROUP__) == NVIC_PRIORITYGROUP_7)) - -/** - * @brief Check if NVIC priority group is valid. - * @param __PRIORITY__ NVIC priority group. - * @retval SET (__PRIORITY__ is valid) or RESET (__PRIORITY__ is invalid) - */ -#define IS_NVIC_PREEMPTION_PRIORITY(__PRIORITY__) ((__PRIORITY__) < 0x80U) - -/** - * @brief Check if NVIC sub priority is valid. - * @param __PRIORITY__ NVIC sub priority. - * @retval SET (__PRIORITY__ is valid) or RESET (__PRIORITY__ is invalid) - */ -#define IS_NVIC_SUB_PRIORITY(__PRIORITY__) ((__PRIORITY__) <= 0xFFU) - -/** - * @brief Check if NVIC deivce IRQ is valid. - * @param __IRQ__ NVIC device IRQ. - * @retval SET (__IRQ__ is valid) or RESET (__IRQ__ is invalid) - */ -#define IS_NVIC_DEVICE_IRQ(__IRQ__) ((__IRQ__) >= 0x00) - -/** - * @brief Check if SYSTICK clock source is valid. - * @param __SOURCE__ SYSTICK clock source. - * @retval SET (__SOURCE__ is valid) or RESET (__SOURCE__ is invalid) - */ -#define IS_SYSTICK_CLK_SOURCE(__SOURCE__) (((__SOURCE__) == SYSTICK_CLKSOURCE_HCLK) || \ - ((__SOURCE__) == SYSTICK_CLKSOURCE_REFCLK)) - -#if (__MPU_PRESENT == 1U) - -/** - * @brief Check if MPU enable state is valid. - * @param __STATE__ Enable state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is not invalid) - */ -#define IS_MPU_REGION_ENABLE(__STATE__) (((__STATE__) == MPU_REGION_ENABLE) || \ - ((__STATE__) == MPU_REGION_DISABLE)) - -/** - * @brief Check if MPU instruction access state is valid. - * @param __STATE__ MPU instruction access state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is not invalid) - */ -#define IS_MPU_INSTRUCTION_ACCESS(__STATE__) (((__STATE__) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ - ((__STATE__) == MPU_INSTRUCTION_ACCESS_DISABLE)) - -/** - * @brief Check if MPU access shareable state is valid. - * @param __STATE__ MPU access shareable state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is not invalid) - */ -#define IS_MPU_ACCESS_SHAREABLE(__STATE__) (((__STATE__) == MPU_ACCESS_SHAREABLE) || \ - ((__STATE__) == MPU_ACCESS_NOT_SHAREABLE)) - -/** - * @brief Check if MPU access cacheable state is valid. - * @param __STATE__ MPU access cacheable state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is not invalid) - */ -#define IS_MPU_ACCESS_CACHEABLE(__STATE__) (((__STATE__) == MPU_ACCESS_CACHEABLE) || \ - ((__STATE__) == MPU_ACCESS_NOT_CACHEABLE)) - -/** - * @brief Check if MPU access bufferable state is valid. - * @param __STATE__ MPU access bufferable state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is not invalid) - */ -#define IS_MPU_ACCESS_BUFFERABLE(__STATE__) (((__STATE__) == MPU_ACCESS_BUFFERABLE) || \ - ((__STATE__) == MPU_ACCESS_NOT_BUFFERABLE)) - -/** - * @brief Check if MPU Tex level is valid. - * @param __TYPE__ MPU Tex level. - * @retval SET (__TYPE__ is valid) or RESET (__TYPE__ is invalid) - */ -#define IS_MPU_TEX_LEVEL(__TYPE__) (((__TYPE__) == MPU_TEX_LEVEL0) || \ - ((__TYPE__) == MPU_TEX_LEVEL1) || \ - ((__TYPE__) == MPU_TEX_LEVEL2)) - -/** - * @brief Check if MPU region permission attribute type is valid. - * @param __TYPE__ MPU region permission attribute type. - * @retval SET (__TYPE__ is valid) or RESET (__TYPE__ is invalid) - */ -#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(__TYPE__) (((__TYPE__) == MPU_REGION_NO_ACCESS) || \ - ((__TYPE__) == MPU_REGION_PRIV_RW) || \ - ((__TYPE__) == MPU_REGION_PRIV_RW_URO) || \ - ((__TYPE__) == MPU_REGION_FULL_ACCESS) || \ - ((__TYPE__) == MPU_REGION_PRIV_RO) || \ - ((__TYPE__) == MPU_REGION_PRIV_RO_URO)) - -/** - * @brief Check if MPU region number is valid. - * @param __NUMBER__ MPU region number. - * @retval SET (__NUMBER__ is valid) or RESET (__NUMBER__ is invalid) - */ -#define IS_MPU_REGION_NUMBER(__NUMBER__) (((__NUMBER__) == MPU_REGION_NUMBER0) || \ - ((__NUMBER__) == MPU_REGION_NUMBER1) || \ - ((__NUMBER__) == MPU_REGION_NUMBER2) || \ - ((__NUMBER__) == MPU_REGION_NUMBER3) || \ - ((__NUMBER__) == MPU_REGION_NUMBER4) || \ - ((__NUMBER__) == MPU_REGION_NUMBER5) || \ - ((__NUMBER__) == MPU_REGION_NUMBER6) || \ - ((__NUMBER__) == MPU_REGION_NUMBER7)) - -/** - * @brief Check if MPU sub region is valid. - * @param __SUBREGION__ MPU sub region. - * @retval SET (__SUBREGION__ is valid) or RESET (__SUBREGION__ is invalid) - */ -#define IS_MPU_SUB_REGION_DISABLE(__SUBREGION__) ((__SUBREGION__) < (uint16_t)0x00FFU) -#endif /* __MPU_PRESENT */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_CORTEX_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides the CORTEX HAL driver functions allowing to configure Interrupts - Systick functionalities - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Set the priority grouping field (pre-emption priority and subpriority) - * using the required unlock sequence. - * - * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * - * @param[in] priority_group: The priority grouping bits length. - * This parameter can be one of the following values: - * @arg @ref NVIC_PRIORITYGROUP_0 0 bit for pre-emption priority, - * 8 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_1 1 bit for pre-emption priority, - * 7 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_2 2 bits for pre-emption priority, - * 6 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_3 3 bits for pre-emption priority, - * 5 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_4 4 bits for pre-emption priority, - * 4 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_5 5 bits for pre-emption priority, - * 3 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_6 6 bits for pre-emption priority, - * 2 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_7 7 bits for pre-emption priority, - * 1 bit for subpriority - **************************************************************************************** - */ -void hal_nvic_set_priority_grouping(uint32_t priority_group); - -/** - **************************************************************************************** - * @brief Set the priority of an interrupt. - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - * @param[in] preempt_priority: The pre-emption priority for the IRQn channel. - * This parameter can be a value between 0 and 127 as described in the table CORTEX_NVIC_Priority_Table. - * A lower priority value indicates a higher priority - * @param[in] sub_priority: The subpriority level for the IRQ channel. - * This parameter can be a value between 0 and 255 as described in the table CORTEX_NVIC_Priority_Table. - * A lower priority value indicates a higher priority. - **************************************************************************************** - */ -void hal_nvic_set_priority(IRQn_Type IRQn, uint32_t preempt_priority, uint32_t sub_priority); - -/** - **************************************************************************************** - * @brief Enable a device specific interrupt in the NVIC interrupt controller. - * - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - **************************************************************************************** - */ -void hal_nvic_enable_irq(IRQn_Type IRQn); - -/** - **************************************************************************************** - * @brief Disable a device specific interrupt in the NVIC interrupt controller. - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - **************************************************************************************** - */ -void hal_nvic_disable_irq(IRQn_Type IRQn); - -/** - **************************************************************************************** - * @brief Initiate a system reset request to reset the MCU. - **************************************************************************************** - */ -void hal_nvic_system_reset(void); - - -/** - **************************************************************************************** - * @brief Initialize the System Timer and its interrupt, and start the System Tick Timer. - * Counter is in free running mode to generate periodic interrupts. - * - * @param[in] ticks_number: Specifies the number of ticks between two interrupts. - * - * @retval status - * - 0 Function succeeded. - * - 1 Function failed. - **************************************************************************************** - */ -uint32_t hal_systick_config(uint32_t ticks_number); - -/** @} */ - -/** @addtogroup CORTEX_Exported_Functions_Group2 Peripheral Control functions - * @brief Cortex control functions. - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the CORTEX - (NVIC, SYSTICK, MPU) functionalities. - - -@endverbatim - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** - **************************************************************************************** - * @brief Initialize and configures the Region and the memory to be protected. - * - * @param[in] p_mpu_init: Pointer to a mpu_region_init_t structure that contains - * the initialization and configuration information. - **************************************************************************************** - */ -void hal_mpu_config_region(mpu_region_init_t *p_mpu_init); -#endif /* __MPU_PRESENT */ - -/** - **************************************************************************************** - * @brief Get the priority grouping field from the NVIC Interrupt Controller. - * - * @return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) - **************************************************************************************** - */ -uint32_t hal_nvic_get_priority_grouping(void); - -/** - **************************************************************************************** - * @brief Get the priority of an interrupt. - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration. - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - * @param[in] priority_group: The priority grouping bits length. - * This parameter can be one of the following values: - * @arg @ref NVIC_PRIORITYGROUP_0 0 bit for pre-emption priority, - * 8 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_1 1 bit for pre-emption priority, - * 7 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_2 2 bits for pre-emption priority, - * 6 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_3 3 bits for pre-emption priority, - * 5 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_4 4 bits for pre-emption priority, - * 4 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_5 5 bits for pre-emption priority, - * 3 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_6 6 bits for pre-emption priority, - * 2 bits for subpriority - * @arg @ref NVIC_PRIORITYGROUP_7 7 bits for pre-emption priority, - * 1 bit for subpriority - * @param[in] p_preempt_priority: Pointer on the Preemptive priority value (starting from 0). - * @param[in] p_sub_priority: Pointer on the Subpriority value (starting from 0). - **************************************************************************************** - */ -void hal_nvic_get_priority(IRQn_Type IRQn, uint32_t priority_group, uint32_t *p_preempt_priority, - uint32_t *p_sub_priority); - -/** - **************************************************************************************** - * @brief Set Pending bit of an external interrupt. - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - **************************************************************************************** - */ -void hal_nvic_set_pending_irq(IRQn_Type IRQn); - -/** - **************************************************************************************** - * @brief Get Pending Interrupt (reads the pending register in the NVIC - * and returns the pending bit for the specified interrupt). - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - * - * @return status - * - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - **************************************************************************************** - */ -uint32_t hal_nvic_get_pending_irq(IRQn_Type IRQn); - -/** - **************************************************************************************** - * @brief Clear the pending bit of an external interrupt. - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - **************************************************************************************** - */ -void hal_nvic_clear_pending_irq(IRQn_Type IRQn); - -/** - **************************************************************************************** - * @brief Get active interrupt (reads the active register in NVIC and returns the active bit). - * - * @param[in] IRQn: External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete GR55xx Devices IRQ Channels list, please refer to the - * appropriate CMSIS device file (gr55xxxx.h)) - * - * @return status - * - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - **************************************************************************************** - */ -uint32_t hal_nvic_get_active(IRQn_Type IRQn); - -/** - **************************************************************************************** - * @brief Configure the SysTick clock source. - * - * @param[in] clk_source: specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg @ref SYSTICK_CLKSOURCE_REFCLK External Reference Clock as SysTick clock source. - * @arg @ref SYSTICK_CLKSOURCE_HCLK AHB clock selected as SysTick clock source. - **************************************************************************************** - */ -void hal_systick_clk_source_config(uint32_t clk_source); - -/** @} */ - -/** @addtogroup CORTEX_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions. - * @{ - */ - -/** - **************************************************************************************** - * @brief This function handles SYSTICK interrupt request. - **************************************************************************************** - */ -void hal_systick_irq_handler(void); - -/** - **************************************************************************************** - * @brief SYSTICK callback. - * - * @note This function should not be modified. When the callback is needed, - * the hal_systick_callback can be implemented in the user file. - **************************************************************************************** - */ -void hal_systick_callback(void); - -/** @} */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup CORTEX_Private_Functions CORTEX Private Functions - * @brief CORTEX private functions - * @{ - */ - -#if (__MPU_PRESENT == 1U) - -/** - **************************************************************************************** - * @brief Disables the MPU and clears the HFNMIENA bit (ARM recommendation) - **************************************************************************************** - */ -void hal_mpu_disable(void); - -/** - **************************************************************************************** - * @brief Enable the MPU - * - * @param[in] mpu_control: Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory. - * This parameter can be one of the following values: - * @arg @ref MPU_HFNMI_PRIVDEF_NONE - * @arg @ref MPU_HARDFAULT_NMI - * @arg @ref MPU_PRIVILEGED_DEFAULT - * @arg @ref MPU_HFNMI_PRIVDEF - **************************************************************************************** - */ -void hal_mpu_enable(uint32_t mpu_control); - -#endif /* __MPU_PRESENT */ - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_CORTEX_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_def.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_def.h deleted file mode 100755 index a346175..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_def.h +++ /dev/null @@ -1,162 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_def.h - * @author BLE Driver Team - * @brief This file contains HAL common definitions, enumeration, macros and structures definitions. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_DEF HAL DEFINE - * @brief HAL common definitions. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55xx_HAL_DEF -#define GR55xx_HAL_DEF - -/* Includes ------------------------------------------------------------------*/ -#include -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_ENUMERATIONS Enumerations - * @{ */ -/** - * @brief HAL Status structures definition - */ -typedef enum { - HAL_OK = 0x00U, /**< Operation is OK. */ - HAL_ERROR = 0x01U, /**< Parameter error or operation is not supported. */ - HAL_BUSY = 0x02U, /**< Driver is busy. */ - HAL_TIMEOUT = 0x03 /**< Timeout occurred. */ -} hal_status_t; - -/** - * @brief HAL Lock structures definition - */ -typedef enum { - HAL_UNLOCKED = 0x00U, /**< Object is unlocked. */ - HAL_LOCKED = 0x01 /**< Object is locked. */ -} hal_lock_t; -/** @} */ - -/** - * @defgroup HAL_DEF_MACRO Defines - * @{ - */ - -/* Exported macro ------------------------------------------------------------*/ -/** - * @brief HAL max delay definition - */ -#define HAL_MAX_DELAY (0xFFFFFFFFU) - -/** - * @brief Check whether the bits of register are set. - * @param REG specifies the register. - * @param BIT specifies the bits will be checked. - * @retval SET (BIT is set) or RESET (BIT is not set) - */ -#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) != RESET) -/** - * @brief Check whether the bits of register are clear. - * @param REG specifies the register. - * @param BIT specifies the bits will be checked. - * @retval SET (BIT is clear) or RESET (BIT is not clear) - */ -#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == RESET) - -/** - * @brief Link DMA handle and peripheral handle. - * @param __HANDLE__ specifies the peripheral handle. - * @param __PPP_DMA_FIELD_ specifies the DMA pointer in struction of peripheral handle. - * @param __DMA_HANDLE_ specifies the DMA handle. - * @retval None - */ -#define HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD_, __DMA_HANDLE_) \ -do { \ - (__HANDLE__)->__PPP_DMA_FIELD_ = &(__DMA_HANDLE_); \ - (__DMA_HANDLE_).p_parent = (__HANDLE__); \ -} while (0U) - -/** @brief Reset the Handle's State field. - * @param __HANDLE__ specifies the Peripheral Handle. - * @retval None - */ -#define HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = 0U) - -/** - * @brief Unlock peripheral handle. - * @param __HANDLE__ specifies the peripheral handle. - * @retval None - */ -#define HAL_UNLOCK(__HANDLE__) \ -do { \ - (__HANDLE__)->lock = HAL_UNLOCKED; \ -} while (0U) - - -#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ -#ifndef __weak -#define __weak __attribute__((weak)) -#endif /* __weak */ -#ifndef __packed -#define __packed __attribute__((__packed__)) -#endif /* __packed */ -#endif /* __GNUC__ */ - - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* ___GR55xx_HAL_DEF__ */ -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dma.h deleted file mode 100755 index 1117c7d..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dma.h +++ /dev/null @@ -1,762 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_dma.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of DMA HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_DMA DMA - * @brief DMA HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_DMA_H__ -#define __GR55xx_HAL_DMA_H__ - -/* Includes ------------------------------------------------------------------*/ -#include -#include "gr55xx_ll_dma.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_DMA_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_DMA_state HAL DMA state - * @{ - */ - -/** - * @brief HAL DMA State Enumerations definition - */ -typedef enum { - HAL_DMA_STATE_RESET = 0x00U, /**< DMA not yet initialized or disabled */ - HAL_DMA_STATE_READY = 0x01U, /**< DMA process success and ready for use */ - HAL_DMA_STATE_BUSY = 0x02U, /**< DMA process is ongoing */ - HAL_DMA_STATE_TIMEOUT = 0x03U, /**< DMA timeout state */ - HAL_DMA_STATE_ERROR = 0x04U, /**< DMA error state */ -} hal_dma_state_t; -/** @} */ - -/** @defgroup HAL_DMA_channel HAL DMA channel - * @{ - */ - -/** - * @brief HAL DMA Channel Enumerations definition - */ -typedef enum { - DMA_Channel0 = 0U, /**< Channel 0 */ - DMA_Channel1 = 1U, /**< Channel 1 */ - DMA_Channel2 = 2U, /**< Channel 2 */ - DMA_Channel3 = 3U, /**< Channel 3 */ - DMA_Channel4 = 4U, /**< Channel 4 */ - DMA_Channel5 = 5U, /**< Channel 5 */ - DMA_Channel6 = 6U, /**< Channel 6 */ - DMA_Channel7 = 7U, /**< Channel 7 */ -} dma_channel_t; -/** @} */ - -/** @defgroup HAL_DMA_callback_ID HAL DMA callback ID - * @{ - */ - -/** - * @brief HAL DMA Callback ID Enumerations definition - */ -typedef enum { - HAL_DMA_XFER_TFR_CB_ID = 0x00, /**< Full transfer */ - HAL_DMA_XFER_BLK_CB_ID = 0x01, /**< Block transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x02, /**< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x03, /**< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x04 /**< All */ -} hal_dma_callback_id_t; -/** @} */ - -/** @} */ - - -/** @addtogroup HAL_DMA_STRUCTURES Structures - * @{ - */ - -/** @defgroup DMA_Configuration DMA Configuration - * @{ - */ - -/** - * @brief DMA Configuration Structure definition - */ -typedef struct _dma_init { - uint32_t src_request; /**< Specifies the source request selected for the specified channel. - This parameter can be a value of @ref DMA_request */ - - uint32_t dst_request; /**< Specifies the destination request selected for the specified channel. - This parameter can be a value of @ref DMA_request */ - - uint32_t direction; /**< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_Data_transfer_direction */ - - uint32_t src_increment; /**< Specifies whether the srouce address register should be incremented - or decrement or not. - This parameter can be a value of @ref DMA_Source_incremented_mode */ - - uint32_t dst_increment; /**< Specifies whether the destination address register should be incremented - or decrement or not. - This parameter can be a - value of @ref - DMA_Destination_incremented_mode - */ - - uint32_t src_data_alignment; /**< Specifies the source data width. - This parameter can be a value of @ref DMA_Source_data_size */ - - uint32_t dst_data_alignment; /**< Specifies the destination data width. - This parameter can be a value of @ref DMA_Destination_data_size */ - - uint32_t mode; /**< Specifies the operation mode of the DMA Channel(Normal or Circular). - This parameter can be a value of @ref DMA_mode - @note The circular buffer - mode cannot be used if - the memory-to-memory - data transfer is configured on the selected Channel */ - - uint32_t priority; /**< Specifies the software priority for the DMA Channel. - This parameter can be a value of @ref DMA_Priority_level */ -} dma_init_t; - -/** @} */ - -/** @defgroup DMA_handle DMA handle - * @{ - */ - -/** - * @brief DMA handle Structure definition - */ -typedef struct _dma_handle { - dma_channel_t channel; /**< DMA Channel Number */ - - dma_init_t init; /**< DMA communication parameters */ - - hal_lock_t lock; /**< DMA locking object */ - - __IO hal_dma_state_t state; /**< DMA transfer state */ - - void *p_parent; /**< Parent object state */ - - void (* xfer_tfr_callback)(struct _dma_handle *p_dma); /**< DMA transfer complete callback */ - - void (* xfer_blk_callback)(struct _dma_handle *p_dma); /**< DMA block complete callback */ - - void (* xfer_error_callback)(struct _dma_handle *p_dma); /**< DMA transfer error callback */ - - void (* xfer_abort_callback)(struct _dma_handle *p_dma); /**< DMA transfer abort callback */ - - __IO uint32_t error_code; /**< DMA Error code */ - - uint32_t retention[5]; /**< DMA important register - information. */ -} dma_handle_t; - -/** @} */ - -/** @} */ - - -/** - * @defgroup HAL_DMA_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA_Exported_Constants DMA Exported Constants - * @{ - */ - -/** @defgroup DMA_Error_Code DMA Error Code - * @{ - */ -#define HAL_DMA_ERROR_NONE ((uint32_t)0x00000000U) /**< No error */ -#define HAL_DMA_ERROR_TE ((uint32_t)0x00000001U) /**< Transfer error */ -#define HAL_DMA_ERROR_NO_XFER ((uint32_t)0x00000004U) /**< no ongoing transfer */ -#define HAL_DMA_ERROR_TIMEOUT ((uint32_t)0x00000020U) /**< Timeout error */ -/** @} */ - -/** @defgroup DMA_request DMA request definitions - * @{ - */ -#define DMA_REQUEST_SPIM_TX LL_DMA_PERIPH_SPIM_TX /**< DMA SPIM transmit request */ -#define DMA_REQUEST_SPIM_RX LL_DMA_PERIPH_SPIM_RX /**< DMA SPIM receive request */ -#define DMA_REQUEST_SPIS_TX LL_DMA_PERIPH_SPIS_TX /**< DMA SPIS transmit request */ -#define DMA_REQUEST_SPIS_RX LL_DMA_PERIPH_SPIS_RX /**< DMA SPIS receive request */ -#define DMA_REQUEST_QSPI0_TX LL_DMA_PERIPH_QSPI0_TX /**< DMA QSPI0 transmit request */ -#define DMA_REQUEST_QSPI0_RX LL_DMA_PERIPH_QSPI0_RX /**< DMA QSPI0 receive request */ -#define DMA_REQUEST_I2C0_TX LL_DMA_PERIPH_I2C0_TX /**< DMA I2C0 transmit request */ -#define DMA_REQUEST_I2C0_RX LL_DMA_PERIPH_I2C0_RX /**< DMA I2C0 receive request */ -#define DMA_REQUEST_I2C1_TX LL_DMA_PERIPH_I2C1_TX /**< DMA I2C1 transmit request */ -#define DMA_REQUEST_I2C1_RX LL_DMA_PERIPH_I2C1_RX /**< DMA I2C1 receive request */ -#define DMA_REQUEST_I2S_S_TX LL_DMA_PERIPH_I2S_S_TX /**< DMA I2S_S transmit request */ -#define DMA_REQUEST_I2S_S_RX LL_DMA_PERIPH_I2S_S_RX /**< DMA I2S_S receive request */ -#define DMA_REQUEST_UART0_TX LL_DMA_PERIPH_UART0_TX /**< DMA UART0 transmit request */ -#define DMA_REQUEST_UART0_RX LL_DMA_PERIPH_UART0_RX /**< DMA UART0 receive request */ -#define DMA_REQUEST_QSPI1_TX LL_DMA_PERIPH_QSPI1_TX /**< DMA QSPI1 transmit request */ -#define DMA_REQUEST_QSPI1_RX LL_DMA_PERIPH_QSPI1_RX /**< DMA QSPI1 receive request */ -#define DMA_REQUEST_I2S_M_TX LL_DMA_PERIPH_I2S_M_TX /**< DMA I2S_M transmit request */ -#define DMA_REQUEST_I2S_M_RX LL_DMA_PERIPH_I2S_M_RX /**< DMA I2S_M receive request */ -#define DMA_REQUEST_SNSADC LL_DMA_PERIPH_SNSADC /**< DMA SenseADC request */ -#define DMA_REQUEST_MEM LL_DMA_PERIPH_MEM /**< DMA Memory request */ -/** @} */ - -/** @defgroup DMA_Data_transfer_direction DMA Data Transfer directions - * @{ - */ -#define DMA_MEMORY_TO_MEMORY LL_DMA_DIRECTION_MEMORY_TO_MEMORY /**< Memory to memory direction */ -#define DMA_MEMORY_TO_PERIPH LL_DMA_DIRECTION_MEMORY_TO_PERIPH /**< Memory to peripheral direction */ -#define DMA_PERIPH_TO_MEMORY LL_DMA_DIRECTION_PERIPH_TO_MEMORY /**< Peripheral to memory direction */ -#define DMA_PERIPH_TO_PERIPH LL_DMA_DIRECTION_PERIPH_TO_PERIPH /**< Peripheral to - Peripheral direction */ -/** @} */ - -/** @defgroup DMA_Source_incremented_mode DMA Source Incremented Mode - * @{ - */ -#define DMA_SRC_INCREMENT LL_DMA_SRC_INCREMENT /**< Source increment mode */ -#define DMA_SRC_DECREMENT LL_DMA_SRC_DECREMENT /**< Source decrement mode */ -#define DMA_SRC_NO_CHANGE LL_DMA_SRC_NO_CHANGE /**< Source no change mode */ -/** @} */ - -/** @defgroup DMA_Destination_incremented_mode DMA Destination Incremented Mode - * @{ - */ -#define DMA_DST_INCREMENT LL_DMA_DST_INCREMENT /**< Destination increment mode */ -#define DMA_DST_DECREMENT LL_DMA_DST_DECREMENT /**< Destination decrement mode */ -#define DMA_DST_NO_CHANGE LL_DMA_DST_NO_CHANGE /**< Destination no change mode */ -/** @} */ - -/** @defgroup DMA_Source_data_size DMA Source Data Size Alignment - * @{ - */ -#define DMA_SDATAALIGN_BYTE LL_DMA_SDATAALIGN_BYTE /**< Source data alignment : Byte */ -#define DMA_SDATAALIGN_HALFWORD LL_DMA_SDATAALIGN_HALFWORD /**< Source data alignment : HalfWord */ -#define DMA_SDATAALIGN_WORD LL_DMA_SDATAALIGN_WORD /**< Source data alignment : Word */ -/** @} */ - -/** @defgroup DMA_Destination_data_size DMA Destination Data Size Alignment - * @{ - */ -#define DMA_DDATAALIGN_BYTE LL_DMA_DDATAALIGN_BYTE /**< Destination data alignment : Byte */ -#define DMA_DDATAALIGN_HALFWORD LL_DMA_DDATAALIGN_HALFWORD /**< Destination data alignment : HalfWord */ -#define DMA_DDATAALIGN_WORD LL_DMA_DDATAALIGN_WORD /**< Destination data alignment : Word */ -/** @} */ - -/** @defgroup DMA_mode DMA Mode - * @{ - */ -#define DMA_NORMAL LL_DMA_MODE_SINGLE_BLOCK /**< Normal Mode */ -#define DMA_CIRCULAR LL_DMA_MODE_MULTI_BLOCK_ALL_RELOAD /**< Circular Mode */ - -/** @} */ - -/** @defgroup DMA_Priority_level DMA Priority Level - * @{ - */ -#define DMA_PRIORITY_LOW LL_DMA_PRIORITY_0 /**< Priority level : Low */ -#define DMA_PRIORITY_MEDIUM LL_DMA_PRIORITY_2 /**< Priority level : Medium */ -#define DMA_PRIORITY_HIGH LL_DMA_PRIORITY_5 /**< Priority level : High */ -#define DMA_PRIORITY_VERY_HIGH LL_DMA_PRIORITY_7 /**< Priority level : Very High */ -/** @} */ - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA_Private_Macro DMA Private Macros - * @{ - */ - -/** @brief Check if DMA channel instance is valid. - * @param instance DMA channel instance. - * @retval SET (instance is valid) or RESET (instance is invalid) - */ -__STATIC_INLINE bool IS_DMA_ALL_INSTANCE(dma_channel_t instance) -{ - return (((instance) == DMA_Channel0) || ((instance) == DMA_Channel1) || \ - ((instance) == DMA_Channel2) || ((instance) == DMA_Channel3) || \ - ((instance) == DMA_Channel4) || ((instance) == DMA_Channel5) || \ - ((instance) == DMA_Channel6) || ((instance) == DMA_Channel7)); -} - -/** @brief Check if DMA request is valid. - * @param REQUEST DMA request. - * @retval SET (REQUEST is valid) or RESET (REQUEST is invalid) - */ -__STATIC_INLINE bool IS_DMA_ALL_REQUEST(uint32_t REQUEST) -{ - return (((REQUEST) == DMA_REQUEST_SPIM_TX) || \ - ((REQUEST) == DMA_REQUEST_SPIM_RX) || \ - ((REQUEST) == DMA_REQUEST_SPIS_TX) || \ - ((REQUEST) == DMA_REQUEST_SPIS_RX) || \ - ((REQUEST) == DMA_REQUEST_QSPI0_TX) || \ - ((REQUEST) == DMA_REQUEST_QSPI0_RX) || \ - ((REQUEST) == DMA_REQUEST_I2C0_TX) || \ - ((REQUEST) == DMA_REQUEST_I2C0_RX) || \ - ((REQUEST) == DMA_REQUEST_I2C1_TX) || \ - ((REQUEST) == DMA_REQUEST_I2C1_RX) || \ - ((REQUEST) == DMA_REQUEST_I2S_S_TX) || \ - ((REQUEST) == DMA_REQUEST_I2S_S_RX) || \ - ((REQUEST) == DMA_REQUEST_UART0_TX) || \ - ((REQUEST) == DMA_REQUEST_UART0_RX) || \ - ((REQUEST) == DMA_REQUEST_QSPI1_TX) || \ - ((REQUEST) == DMA_REQUEST_QSPI1_RX) || \ - ((REQUEST) == DMA_REQUEST_I2S_M_TX) || \ - ((REQUEST) == DMA_REQUEST_I2S_M_RX) || \ - ((REQUEST) == DMA_REQUEST_SNSADC) || \ - ((REQUEST) == DMA_REQUEST_MEM)); -} - -/** @brief Check if DMA direction is valid. - * @param DIRECTION DMA direction. - * @retval SET (DIRECTION is valid) or RESET (DIRECTION is invalid) - */ -__STATIC_INLINE bool IS_DMA_DIRECTION(uint32_t DIRECTION) -{ - return (((DIRECTION) == DMA_MEMORY_TO_MEMORY) || \ - ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ - ((DIRECTION) == DMA_PERIPH_TO_MEMORY) || \ - ((DIRECTION) == DMA_PERIPH_TO_PERIPH)); -} - -/** @brief Check if DMA buffer size is valid. - * @param SIZE DMA buffer size. - * @retval SET (SIZE is valid) or RESET (SIZE is invalid) - */ -__STATIC_INLINE bool IS_DMA_BUFFER_SIZE(uint32_t SIZE) -{ - return (((SIZE) >= 0x1) && ((SIZE) < 0xFFF)); -} - -/** @brief Check if DMA source address increment state is valid. - * @param STATE DMA source address increment state. - * @retval SET (STATE is valid) or RESET (STATE is invalid) - */ -__STATIC_INLINE bool IS_DMA_SOURCE_INC_STATE(uint32_t STATE) -{ - return (((STATE) == DMA_SRC_INCREMENT) || \ - ((STATE) == DMA_SRC_DECREMENT) || \ - ((STATE) == DMA_SRC_NO_CHANGE)); -} - -/** @brief Check if DMA destination address increment state is valid. - * @param STATE DMA destination address increment state. - * @retval SET (STATE is valid) or RESET (STATE is invalid) - */ -__STATIC_INLINE bool IS_DMA_DESTINATION_INC_STATE(uint32_t STATE) -{ - return (((STATE) == DMA_DST_INCREMENT) || \ - ((STATE) == DMA_DST_DECREMENT) || \ - ((STATE) == DMA_DST_NO_CHANGE)); -} - -/** @brief Check if DMA source data size is valid. - * @param SIZE DMA source data size. - * @retval SET (SIZE is valid) or RESET (SIZE is invalid) - */ -__STATIC_INLINE bool IS_DMA_SOURCE_DATA_SIZE(uint32_t SIZE) -{ - return (((SIZE) == DMA_SDATAALIGN_BYTE) || \ - ((SIZE) == DMA_SDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_SDATAALIGN_WORD)); -} - -/** @brief Check if DMA destination data size is valid. - * @param SIZE DMA destination data size. - * @retval SET (SIZE is valid) or RESET (SIZE is invalid) - */ -__STATIC_INLINE bool IS_DMA_DESTINATION_DATA_SIZE(uint32_t SIZE) -{ - return (((SIZE) == DMA_DDATAALIGN_BYTE) || \ - ((SIZE) == DMA_DDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_DDATAALIGN_WORD)); -} - -/** @brief Check if DMA mode is valid. - * @param MODE DMA mode. - * @retval SET (MODE is valid) or RESET (MODE is invalid) - */ -__STATIC_INLINE bool IS_DMA_MODE(uint32_t MODE) -{ - return (((MODE) == DMA_NORMAL) || ((MODE) == DMA_CIRCULAR)); -} - -/** @brief Check if DMA priority is valid. - * @param PRIORITY DMA priority. - * @retval SET (PRIORITY is valid) or RESET (PRIORITY is invalid) - */ -__STATIC_INLINE bool IS_DMA_PRIORITY(uint32_t PRIORITY) -{ - return (((PRIORITY) == DMA_PRIORITY_LOW ) || ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ - ((PRIORITY) == DMA_PRIORITY_HIGH) || ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)); -} -/** @} */ - -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_DMA_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize the DMA Channel source - and destination addresses, incrementation and data sizes, transfer direction, - circular/normal mode selection, memory-to-memory mode selection and Channel priority value. - [..] - The hal_dma_init() function follows the DMA configuration procedures as described in - reference manual. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the DMA according to the specified - * parameters in the dma_init_t and initialize the associated handle. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_init(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief De-initialize the DMA peripheral. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_deinit (dma_handle_t *p_dma); - -/** @} */ - - -/** @defgroup DMA_Exported_Functions_Group2 Input and Output operation functions - * @brief Input and Output operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and Start DMA transfer - (+) Configure the source, destination address and data length and - Start DMA transfer with interrupt - (+) Abort DMA transfer - (+) Poll for transfer complete - (+) Handle DMA interrupt request - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Start the DMA Transfer. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @param[in] src_address: The source memory Buffer address - * @param[in] dst_address: The destination memory Buffer address - * @param[in] data_length: The length of data to be transferred from - * source to destination, ranging between 0 and - * 4095. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_start (dma_handle_t *p_dma, uint32_t src_address, uint32_t dst_address, uint32_t data_length); - -/** - **************************************************************************************** - * @brief Start the DMA Transfer with interrupt enabled. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @param[in] src_address: The source memory Buffer address - * @param[in] dst_address: The destination memory Buffer address - * @param[in] data_length: The length of data to be transferred from - * source to destination, ranging between 0 and - * 4095. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_start_it(dma_handle_t *p_dma, uint32_t src_address, uint32_t dst_address, uint32_t data_length); - -/** - **************************************************************************************** - * @brief Abort the DMA Transfer. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_abort(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief Aborts the DMA Transfer in Interrupt mode. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_abort_it(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief Polling for transfer complete. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @param[in] timeout: Timeout duration. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_poll_for_transfer(dma_handle_t *p_dma, uint32_t timeout); - -/** @} */ - -/** @addtogroup DMA_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle DMA interrupt request. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the - * configuration information for the specified DMA Channel. - **************************************************************************************** - */ -void hal_dma_irq_handler(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief Register callbacks - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @param[in] id: User Callback identifer. This parameter can be one of the following values: - * @arg @ref HAL_DMA_XFER_TFR_CB_ID - * @arg @ref HAL_DMA_XFER_BLK_CB_ID - * @arg @ref HAL_DMA_XFER_ERROR_CB_ID - * @arg @ref HAL_DMA_XFER_ABORT_CB_ID - * @param[in] callback: Pointer to private callback function which - * has pointer to dma_handle_t structure as - * parameter. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_register_callback(dma_handle_t *p_dma, hal_dma_callback_id_t id, - void (* callback)(dma_handle_t *p_dma)); - -/** - **************************************************************************************** - * @brief UnRegister callbacks - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @param[in] id: User Callback identifer. This parameter can be a combiantion of the following values: - * @arg @ref HAL_DMA_XFER_TFR_CB_ID - * @arg @ref HAL_DMA_XFER_BLK_CB_ID - * @arg @ref HAL_DMA_XFER_ERROR_CB_ID - * @arg @ref HAL_DMA_XFER_ABORT_CB_ID - * @arg @ref HAL_DMA_XFER_ALL_CB_ID - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_unregister_callback(dma_handle_t *p_dma, hal_dma_callback_id_t id); - -/** @} */ - -/** @defgroup DMA_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral State and Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DMA state - (+) Get error code - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the DMA hande state. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * - * @retval ::HAL_DMA_STATE_RESET: DMA not yet initialized or disabled. - * @retval ::HAL_DMA_STATE_READY: DMA process succeeded and ready for use. - * @retval ::HAL_DMA_STATE_BUSY: DMA process is ongoing. - * @retval ::HAL_DMA_STATE_TIMEOUT: DMA timeout state. - * @retval ::HAL_DMA_STATE_ERROR: DMA error state. - **************************************************************************************** - */ -hal_dma_state_t hal_dma_get_state(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief Return the DMA error code. - * - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * - * @return DMA Error Code - **************************************************************************************** - */ -uint32_t hal_dma_get_error(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief Suspend some registers related to DMA configuration before sleep. - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_suspend_reg(dma_handle_t *p_dma); - -/** - **************************************************************************************** - * @brief Restore some registers related to DMA configuration after sleep. - * This function must be used in conjunction with the hal_dma_resume_reg(). - * @param[in] p_dma: Pointer to a DMA handle which contains the configuration - * information for the specified DMA Channel. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dma_resume_reg(dma_handle_t *p_dma); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_DMA_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dual_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dual_tim.h deleted file mode 100755 index 1ad9c4a..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_dual_tim.h +++ /dev/null @@ -1,507 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_dual_tim.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of DUAL TIMER HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_DUAL_TIMER DUAL TIMER - * @brief DUAL TIM HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55xx_HAL_DUAL_TIMER_H -#define GR55xx_HAL_DUAL_TIMER_H - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_dual_tim.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_DUAL_TIMER_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_DUAL_TIMER_state HAL DUAL TIM state - * @{ - */ - -/** - * @brief HAL DUAL TIMER State Enumerations definition - */ -typedef enum { - HAL_DUAL_TIMER_STATE_RESET = 0x00, /**< Peripheral not yet initialized or disabled */ - HAL_DUAL_TIMER_STATE_READY = 0x01, /**< Peripheral Initialized and ready for use */ - HAL_DUAL_TIMER_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_DUAL_TIMER_STATE_ERROR = 0x04 /**< Reception process is ongoing */ -} hal_dual_timer_state_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_DUAL_TIMER_STRUCTURES Structures - * @{ - */ - -/** @defgroup DUAL_TIMER_Configuration DUAL TIMER Configuration - * @{ - */ - -/** - * @brief DUAL TIMER init Structure definition - */ -typedef struct _dual_timer_init { - uint32_t prescaler; /**< Specifies the prescaler value used to divide the DUAL_TIMER clock. - This parameter can be a value of @ref DUAL_TIMER_Prescaler_Div */ - - uint32_t counter_mode; /**< Specifies the counter mode. - This parameter can be a value of @ref DUAL_TIMER_Counter_Mode */ - - uint32_t auto_reload; /**< Specifies the auto-reload value. */ -} dual_timer_init_t; - -/** @} */ - -/** @defgroup DUAL_TIMER_handle DUAL TIMER handle - * @{ - */ - -/** - * @brief DUAL_TIMER handle Structure definition - */ -typedef struct _dual_timer_handle { - dual_timer_regs_t *p_instance; /**< Register base address */ - - dual_timer_init_t init; /**< DUAL_TIMER Base required parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_dual_timer_state_t state; /**< DUAL_TIMER operation state */ -} dual_timer_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_DUAL_TIMER_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_DUAL_TIMER_Callback Callback - * @{ - */ - -/** - * @brief HAL_DUAL_TIMER Callback function definition - */ - -typedef struct _hal_dual_timer_callback { - void (*dual_timer_msp_init)(dual_timer_handle_t *p_dual_timer); /**< DUAL_TIMER init MSP - callback */ - void (*dual_timer_msp_deinit)(dual_timer_handle_t *p_dual_timer); /**< DUAL_TIMER de-init MSP - callback */ - void (*dual_timer_period_elapsed_callback)(dual_timer_handle_t *p_dual_timer); /**< DUAL_TIMER period elapsed - callback */ -} hal_dual_timer_callback_t; -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_DUAL_TIMER_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_Exported_Constants DUAL TIMER Exported Constants - * @{ - */ - -/** @defgroup DUAL_TIMER_Prescaler_Div DUAL TIMER Prescaler Division - * @{ - */ -#define DUAL_TIMER_PRESCALER_DIV0 LL_DUAL_TIMER_PRESCALER_DIV0 /**< 0 stage of prescale, - clock is divided by 1. */ -#define DUAL_TIMER_PRESCALER_DIV16 LL_DUAL_TIMER_PRESCALER_DIV16 /**< 4 stages of prescale, - clock is divided by 16. */ -#define DUAL_TIMER_PRESCALER_DIV256 LL_DUAL_TIMER_PRESCALER_DIV256 /**< 8 stages of prescale, - clock is divided by 256. */ -/** @} */ - -/** @defgroup DUAL_TIMER_Counter_Mode DUAL TIMER Counter Mode - * @{ - */ -#define DUAL_TIMER_COUNTERMODE_LOOP 0x00000000U /**< DUAL TIMER Loop mode.*/ -#define DUAL_TIMER_COUNTERMODE_ONESHOT DUAL_TIMER_CTRL_ONESHOT /**< DUAL TIMER One-shot mode. */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_Exported_Macros DUAL TIMER Exported Macros - * @{ - */ - -/** @brief Reset DUAL TIMER handle states. - * @param __HANDLE__ DUAL TIMER handle. - * @retval None - */ -#define HAL_DUAL_TIMER_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_DUAL_TIMER_STATE_RESET) - -/** @brief Enable the specified DUAL TIMER peripheral. - * @param __HANDLE__ Specifies the DUAL TIMER Handle. - * @retval None - */ -#define HAL_DUAL_TIMER_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, DUAL_TIMER_CTRL_EN) - -/** @brief Disable the specified DUAL TIMER peripheral. - * @param __HANDLE__ Specifies the DUAL TIMER Handle. - * @retval None - */ -#define HAL_DUAL_TIMER_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, DUAL_TIMER_CTRL_EN) - -/** @brief Enable the DUAL TIMER interrupt. - * @param __HANDLE__ Specifies the DUAL TIM Handle. - * @retval None - */ -#define HAL_DUAL_TIMER_ENABLE_IT(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, DUAL_TIMER_CTRL_INTEN) - -/** @brief Disable the DUAL TIMER interrupt. - * @param __HANDLE__ Specifies the DUAL TIM Handle. - * @retval None - */ -#define HAL_DUAL_TIMER_DISABLE_IT(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, DUAL_TIMER_CTRL_INTEN) - -/** @brief Check whether the DUAL TIMER interrupt has occurred or not. - * @param __HANDLE__ Specifies the DUAL TIMER Handle. - * @retval The new state of DUAL TIMER interrupt (SET or RESET). - */ -#define HAL_DUAL_TIMER_GET_FLAG_IT(__HANDLE__) ll_dual_timer_is_active_flag_it((__HANDLE__)->p_instance) - -/** @brief Clear the DUAL TIMER interrupt flag. - * @param __HANDLE__ Specifies the DUAL TIMER Handle. - * @retval None. - */ -#define HAL_DUAL_TIMER_CLEAR_FLAG_IT(__HANDLE__) ll_dual_timer_clear_flag_it((__HANDLE__)->p_instance) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_Private_Macros DUAL TIMER Private Macros - * @{ - */ - -/** @brief Check if DUAL TIMER prescaler is valid. - * @param __PRESCALER__ DUAL TIMER prescaler. - * @retval SET (__PRESCALER__ is valid) or RESET (__PRESCALER__ is invalid) - */ -#define IS_DUAL_TIMER_PRESCALER(__PRESCALER__) (((__PRESCALER__) == DUAL_TIMER_PRESCALER_DIV0) || \ - ((__PRESCALER__) == DUAL_TIMER_PRESCALER_DIV16) || \ - ((__PRESCALER__) == DUAL_TIMER_PRESCALER_DIV256)) - -/** @brief Check if DUAL TIMER counter mode is valid. - * @param __MODE__ DUAL TIMER counter mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_DUAL_TIMER_COUNTERMODE(__MODE__) (((__MODE__) == DUAL_TIMER_COUNTERMODE_LOOP) || \ - ((__MODE__) == DUAL_TIMER_COUNTERMODE_ONESHOT)) -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_DUAL_TIMER_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup DUAL_TIMER_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * - * @verbatim -=============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the DUAL TIMER. - (+) De-initialize the DUAL TIMER. - (+) Start the Timer. - (+) Stop the Timer. - (+) Start the Timer and enable interrupt. - (+) Stop the Timer and disable interrupt. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the DUAL TIMER according to the specified parameters - * in the dual_timer_init_t and initialize the associated handle. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_base_init(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief De-initialize the DUAL TIMER peripheral. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIM handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_base_deinit(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief Initialize the DUAL TIMER MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_dual_timer_base_msp_init could be implemented in the user file - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - **************************************************************************************** - */ -void hal_dual_timer_base_msp_init(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief De-initialize the DUAL TIMER MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_dual_timer_base_msp_deinit could be implemented in the user file - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIM handle which contains the configuration information - * for the specified DUAL TIMER. - **************************************************************************************** - */ -void hal_dual_timer_base_msp_deinit(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief Starts the DUAL TIMER counter. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_base_start(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief Stops the DUAL TIMER counter. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIM handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_base_stop(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief Starts the DUAL TIMER counter in interrupt mode. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIM handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_base_start_it(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief Stops the DUAL TIMER counter in interrupt mode. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_base_stop_it(dual_timer_handle_t *p_dual_timer); - -/** @} */ - -/** @addtogroup DUAL_TIMER_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle DUAL TIMER interrupt request. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - **************************************************************************************** - */ -void hal_dual_timer_irq_handler(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief Period elapsed callback in non-blocking mode. - * - * @note This function should not be modified. When the callback is needed, - * the hal_dual_timer_period_elapsed_callback can be implemented in the user file. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - **************************************************************************************** - */ -void hal_dual_timer_period_elapsed_callback(dual_timer_handle_t *p_dual_timer); - -/** @} */ - -/** @addtogroup DUAL_TIMER_Exported_Functions_Group2 Peripheral Control and State functions - * @brief DUAL TIMER Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral Control and State functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the DUAL TIMER handle state. - (+) Configure the DUAL TIMER. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the DUAL TIMER handle state. - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - * - * @retval ::HAL_DUAL_TIMER_STATE_RESET: Peripheral not yet initialized or disabled. - * @retval ::HAL_DUAL_TIMER_STATE_READY: Peripheral Initialized and ready for use. - * @retval ::HAL_DUAL_TIMER_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_DUAL_TIMER_STATE_ERROR: Reception process is ongoing. - **************************************************************************************** - */ -hal_dual_timer_state_t hal_dual_timer_get_state(dual_timer_handle_t *p_dual_timer); - -/** - **************************************************************************************** - * @brief DUAL TIMER configuration - * - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - * @param[in] p_structure: The DUAL TIMER configuration structure - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_set_config(dual_timer_handle_t *p_dual_timer, dual_timer_init_t *p_structure); - -/** - **************************************************************************************** - * @brief DUAL TIMER set background reload value - * The background reload value contains the value from which the counter is to decrement. - * This is the value used to reload the counter when Periodic mode is enabled, and the current count reaches 0. - * The difference is that writes to background reload value do not cause the counter to immediately restart - * from the new value. - * @param[in] p_dual_timer: Pointer to a DUAL_TIMER handle which contains the configuration information - * for the specified DUAL TIMER. - * @param[in] reload_value: Background reload value - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - **************************************************************************************** - */ -hal_status_t hal_dual_timer_set_background_reload(dual_timer_handle_t *p_dual_timer, uint32_t reload_value); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_DUAL_TIMER_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_efuse.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_efuse.h deleted file mode 100755 index 501b35b..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_efuse.h +++ /dev/null @@ -1,508 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_efuse.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of eFuse HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_EFUSE EFUSE - * @brief eFuse HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_EFUSE_H__ -#define __GR55xx_HAL_EFUSE_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_efuse.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_EFUSE_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_EFUSE_state HAL EFUSE state - * @{ - */ - -/** - * @brief HAL eFuse State Enumerations definition - */ -typedef enum { - HAL_EFUSE_STATE_RESET = 0x00, /**< Peripheral not yet initialized or disabled */ - HAL_EFUSE_STATE_READY = 0x01, /**< Peripheral Initialized and ready for use */ - HAL_EFUSE_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_EFUSE_STATE_ERROR = 0x04 /**< Reception process is error */ -} hal_efuse_state_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_EFUSE_STRUCTURES Structures - * @{ - */ - -/** @defgroup EFUSE_Configuration EFUSE Configuration - * @{ - */ - -/** - * @brief eFuse init Structure definition - */ -typedef struct _efuse_init { - uint32_t info_mode; /**< Specifies the info mode, enable or disable main or backup info. */ -} efuse_init_t; - -/** @} */ - -/** @defgroup EFUSE_handle EFUSE handle - * @{ - */ - -/** - * @brief eFuse handle Structure definition - */ -typedef struct _efuse_handle { - efuse_regs_t *p_instance; /**< Register base address */ - - efuse_init_t init; /**< eFuse base required parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_efuse_state_t state; /**< eFuse operation state */ - - __IO uint32_t error_code; /**< eFuse Error code */ -} efuse_handle_t; -/** @} */ - -/** @defgroup EFUSE_Keyram Keyram configuration - * @{ - */ - -/** - * @brief eFuse Keyram Structure definition - */ -typedef struct _keyram_mask { - uint32_t aes_mask; /**< AES port mask. */ - - uint32_t hmac_mask; /**< HMAC port mask. */ - - uint32_t present_mcu_mask; /**< Present of MCU port mask. */ - - uint32_t present_xip_mask; /**< Present of XIP port mask. */ - - uint32_t efuse_mask; /**< eFuse port mask. */ - - uint32_t enc_key_low; /**< encrypt key low 32bit mask. */ - - uint32_t enc_key_high; /**< encrypt key high 32bit mask. */ -} keyram_mask_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_EFUSE_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_EFUSE_Callback Callback - * @{ - */ - -/** - * @brief HAL_EFUSE Callback function definition - */ - -typedef struct _hal_efuse_callback { - void (*efuse_msp_init)(efuse_handle_t *p_efuse); /**< EFUSE init MSP callback */ - void (*efuse_msp_deinit)(efuse_handle_t *p_efuse); /**< EFUSE de-init MSP callback */ -} hal_efuse_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_EFUSE_MACRO Defines - * @{ - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EFUSE_Exported_Macros EFUSE Exported Macros - * @{ - */ - -/** @defgroup EFUSE_Error_Code EFUSE Error Code - * @{ - */ -#define HAL_EFUSE_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_EFUSE_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_EFUSE_ERROR_INVALID_PARAM ((uint32_t)0x00000002) /**< Invalid parameters error */ -/** @} */ - -/** @defgroup EFUSE_Flags EFUSE Flags - * @{ - */ -#define EFUSE_FLAG_WRITE_KEYRAM_BUSY LL_EFUSE_WRITE_KEYRAM_BUSY /**< Write keyram operation is in process */ -#define EFUSE_FLAG_READ_TRIM_DONE LL_EFUSE_READ_TRIM_DONE /**< Read trim from eFuse has done */ -#define EFUSE_FLAG_CRC_CHECK_DONE LL_EFUSE_CRC_CHECK_DONE /**< eFuse CRC check done */ -#define EFUSE_FLAG_CRC_CHECK_SUCCESS LL_EFUSE_CRC_CHECK_SUCCESS /**< CRC check succeeded */ -#define EFUSE_FLAG_INIT_CHECK_DONE LL_EFUSE_INIT_CHECK_DONE /**< eFuse initial value check done */ -#define EFUSE_FLAG_INIT_CHECK_SUCCESS LL_EFUSE_INIT_CHECK_SUCCESS /**< eFuse initial value check succeeded */ -#define EFUSE_FLAG_WRITE_DONE LL_EFUSE_WRITE_DONE /**< eFuse one word write done */ -#define EFUSE_FLAG_TEST_DONE LL_EFUSE_TEST_DONE /**< Read from eFuse has done in test mode */ -/** @} */ - -/** @defgroup EFUSE_Loyout_Map EFUSE Loyout Map - * @{ - */ -#define EFUSE_OFFSET_USER_DSVD (0x0000UL) /**< Reserved offset in backup info block */ -#define EFUSE_OFFSET_BBLK_TRIM (0x0020UL) /**< Triming offset in backup info block */ -#define EFUSE_OFFSET_BBLK_CONFIG (0x005CUL) /**< Configuration offset in backup info block */ -#define EFUSE_OFFSET_BBLK_SWD (0x0060UL) /**< SWD Enable offset in backup info block */ -#define EFUSE_OFFSET_BBLK_EncMode (0x0062UL) /**< Encryption Mode offset in backup info block */ -#define EFUSE_OFFSET_BBLK_CRC32 (0x0064UL) /**< CRC32 offset in backup info block */ -#define EFUSE_OFFSET_BBLK_CHIP_ID (0x0068UL) /**< Chip ID offset in backup info block */ -#define EFUSE_OFFSET_BBLK_PRODUCT_ID (0x006EUL) /**< Product ID offset in backup info block */ -#define EFUSE_OFFSET_BBLK_FW_PUBLICKEY (0x0070UL) /**< Firmware public key offset in backup info block */ -#define EFUSE_OFFSET_BBLK_ROOT_PUBLICKEY (0x0080UL) /**< Root public key offset in backup info block */ -#define EFUSE_OFFSET_BBLK_ECC_KEY (0x0090UL) /**< ECC key offset in backup info block */ -#define EFUSE_OFFSET_BBLK_FW_KEY (0x00B0UL) /**< Firmware key offset in backup info block */ -#define EFUSE_OFFSET_BBLK_HMAC_KEY (0x00D0UL) /**< HMAC key offset in backup info block */ -#define EFUSE_OFFSET_BBLK_DATA_KEY (0x00F0UL) /**< Data key offset in backup info block */ -#define EFUSE_OFFSET_MBLK_TRIM (0x0110UL) /**< Triming offset in main info block */ -#define EFUSE_OFFSET_MBLK_CONFIG (0x014CUL) /**< Configuration offset in main info block */ -#define EFUSE_OFFSET_MBLK_SWD (0x0150UL) /**< SWD Enable offset in main info block */ -#define EFUSE_OFFSET_MBLK_EncMode (0x0152UL) /**< Encryption Mode offset in main info block */ -#define EFUSE_OFFSET_MBLK_CRC32 (0x0154UL) /**< CRC32 offset in main info block */ -#define EFUSE_OFFSET_MBLK_CHIP_ID (0x0158UL) /**< Chip ID offset in main info block */ -#define EFUSE_OFFSET_MBLK_PRODUCT_ID (0x015EUL) /**< Product ID offset in main info block */ -#define EFUSE_OFFSET_MBLK_FW_PUBLICKEY (0x0160UL) /**< Firmware public key offset in main info block */ -#define EFUSE_OFFSET_MBLK_ROOT_PUBLICKEY (0x0170UL) /**< Root public key offset in main info block */ -#define EFUSE_OFFSET_MBLK_ECC_KEY (0x0180UL) /**< ECC key offset in main info block */ -#define EFUSE_OFFSET_MBLK_FW_KEY (0x01A0UL) /**< Firmware key offset in main info block */ -#define EFUSE_OFFSET_MBLK_HMAC_KEY (0x01C0UL) /**< HMAC key offset in main info block */ -#define EFUSE_OFFSET_MBLK_DATA_KEY (0x01E0UL) /**< Data key offset in main info block */ -#define EFUSE_OFFSET_END (0x0200UL) /**< eFuse Offset end */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EFUSE_Exported_Macros EFUSE Exported Macros - * @{ - */ - -/** @brief Enable the eFuse main or backup. - * @param __HANDLE__ Specifies the eFuse Handle. - * @retval None. - */ -#define HAL_EFUSE_ENABLE_MAIN_BACKUP(__HANDLE__) ll_efuse_enable_main_backup((__HANDLE__)->p_instance) - -/** @brief Disable the eFuse main or backup. - * @param __HANDLE__ Specifies the eFuse Handle. - * @retval None. - */ -#define HAL_EFUSE_DISABLE_MAIN_BACKUP(__HANDLE__) ll_efuse_disable_main_backup((__HANDLE__)->p_instance) - -/** @brief Enable the eFuse PGENB. - * @param __HANDLE__ Specifies the eFuse Handle. - * @retval None. - */ -#define HAL_EFUSE_ENABLE_PGENB(__HANDLE__) ll_efuse_enable_pgenb((__HANDLE__)->p_instance) - -/** @brief Disable the eFuse PGENB. - * @param __HANDLE__ Specifies the eFuse Handle. - * @retval None. - */ -#define HAL_EFUSE_DISABLE_PGENB(__HANDLE__) ll_efuse_disable_pgenb((__HANDLE__)->p_instance) - -/** @brief Check whether the specified eFuse flag is set or not. - * @param __HANDLE__ specifies the eFuse Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref EFUSE_FLAG_WRITE_KEYRAM_BUSY Write keyram operation is in process - * @arg @ref EFUSE_FLAG_READ_TRIM_DONE Read trim from eFuse has done - * @arg @ref EFUSE_FLAG_CRC_CHECK_DONE eFuse CRC check done - * @arg @ref EFUSE_FLAG_CRC_CHECK_SUCCESS CRC check succeeded - * @arg @ref EFUSE_FLAG_INIT_CHECK_DONE eFuse initial value check done - * @arg @ref EFUSE_FLAG_INIT_CHECK_SUCCESS eFuse initial value check succeeded - * @arg @ref EFUSE_FLAG_WRITE_DONE eFuse one word write done - * @arg @ref EFUSE_FLAG_TEST_DONE Read from eFuse has done in test mode - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_EFUSE_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->STAT, (__FLAG__)) != 0) ? SET : RESET) -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_EFUSE_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup EFUSE_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the EFUSEx peripheral. - - (+) User must implement hal_efuse_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_efuse_init() to configure the selected device with - the selected configuration: - (++) info_mode - - (+) Call the function hal_efuse_deinit() to restore the default configuration - of the selected EFUSEx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the eFuse according to the specified parameters - * in the efuse_init_t and initialize the associated handle. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_init(efuse_handle_t *p_efuse); - -/** - **************************************************************************************** - * @brief De-initialize the eFuse peripheral. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_deinit(efuse_handle_t *p_efuse); - -/** - **************************************************************************************** - * @brief Initialize the eFuse MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_efuse_msp_deinit can be implemented in the user file. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - **************************************************************************************** - */ -void hal_efuse_msp_init(efuse_handle_t *p_efuse); - -/** - **************************************************************************************** - * @brief De-initialize the eFuse MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_efuse_msp_deinit can be implemented in the user file. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - **************************************************************************************** - */ -void hal_efuse_msp_deinit(efuse_handle_t *p_efuse); - -/** @} */ - -/** @defgroup EFUSE_Exported_Functions_Group2 IO operation functions - * @brief eFuse Data manage functions - * - * @{ - */ - -/** - **************************************************************************************** - * @brief Write the eFuse memory data. - * - * @note Address should be eFuse memory address. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * @param[in] word_offset: eFuse memory offset, unit word, this parament can be a value between: 0x00 ~ 0x80. - * @param[in] p_data: Pointer to data buffer for storage eFuse data. - * @param[in] nword: Size of data to be write, unit word. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_write(efuse_handle_t *p_efuse, uint32_t word_offset, uint32_t *p_data, uint32_t nword); - -/** - **************************************************************************************** - * @brief Read the eFuse memory data. - * - * @note Address should be eFuse memory address. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * @param[in] word_offset: eFuse memory offset, unit word, this parament can be a value between: 0x000 ~ 0x80. - * @param[in] p_data: Pointer to data buffer for storage eFuse data. - * @param[in] nword: Size of data to be read, unit word. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_read(efuse_handle_t *p_efuse, uint32_t word_offset, uint32_t *p_data, uint32_t nword); - -/** - **************************************************************************************** - * @brief Read the key from eFuse memory and write to keyram. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * @param[in] p_mask: Pointer to a KEYRAM handle which contains the configuration information for the specified MASK. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_write_keyram(efuse_handle_t *p_efuse, keyram_mask_t *p_mask); - -/** - **************************************************************************************** - * @brief Check the eFuse memory with 0, if memory are all 0, return HAL_OK, then return HAL_ERROR. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_initial_value_check(efuse_handle_t *p_efuse); - -/** - **************************************************************************************** - * @brief Calculate CRC of the eFuse memory data. - * - * @note Address must be main info eFuse memory address. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * @param[in] word_offset: eFuse memory offset, unit word, this parament can be a value between: 0x00 ~ 0x80. - * @param[in] nword: Size of data to be read, unit word, this parament can be a value between: 1 ~ 60. - * @param[in] p_result: Pointer to result. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_crc_calculate(efuse_handle_t *p_efuse, uint32_t word_offset, uint32_t nword, uint32_t *p_result); - -/** - **************************************************************************************** - * @brief Read trim from eFuse memory data. - * - * @note Address must be main info eFuse memory address. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * @param[in] word_offset: eFuse memory offset, unit word, this parament can be a value between: 0x00 ~ 0x80. - * @param[in] p_data: Pointer to data buffer for storage eFuse data. - * @param[in] nword: Size of data to be read, unit word, this parament can be a value between: 1 ~ 20. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_read_trim(efuse_handle_t *p_efuse, uint32_t word_offset, uint32_t *p_data, uint32_t nword); - -/** - **************************************************************************************** - * @brief Set the main or backup info of the eFuse memory. - * - * @param[in] p_efuse: Pointer to a eFuse handle which contains the configuration information for the specified eFuse. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_efuse_set_main_backup(efuse_handle_t *p_efuse); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_EFUSE_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_exflash.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_exflash.h deleted file mode 100755 index aeb3ba7..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_exflash.h +++ /dev/null @@ -1,748 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_exflash.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of EXFLASH HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_EXFLASH EXFLASH - * @brief exFlash HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_EXFLASH_H__ -#define __GR55xx_HAL_EXFLASH_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_xqspi.h" -#include "gr55xx_hal_xqspi.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_EXFLASH_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_EXFLASH_STATE HAL EXFLASH State - * @{ - */ - -/** - * @brief HAL exFlash State Enumerations definition - */ -typedef enum { - HAL_EXFLASH_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_EXFLASH_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_EXFLASH_STATE_BUSY = 0x02, /**< Peripheral in indirect mode and busy */ - HAL_EXFLASH_STATE_BUSY_READ = 0x12, /**< Peripheral in indirect mode with reception ongoing */ - HAL_EXFLASH_STATE_BUSY_WRITE = 0x22, /**< Peripheral in indirect mode with transmission ongoing */ - HAL_EXFLASH_STATE_BUSY_ERASE = 0x42, /**< Peripheral in indirect mode with erase ongoing */ - HAL_EXFLASH_STATE_SUSPEND_WRITE = 0x21, /**< Peripheral in suspend mode from transmission */ - HAL_EXFLASH_STATE_SUSPEND_ERASE = 0x41, /**< Peripheral in suspend mode from erase */ - HAL_EXFLASH_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_exflash_state_t; - -/** - * @brief HAL exFlash Security Enumerations definition - */ -typedef enum { - HAL_EXFLASH_UNENCRYPTED = 0x00, /**< Data will not be encrypted and decrypted - in write-read operations */ - HAL_EXFLASH_ENCRYPTED = 0x01, /**< Data will be encrypted and decrypted - in write-read operations */ -} hal_eflash_security; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_EXFLASH_STRUCTURES Structures - * @{ - */ - -/** @defgroup EXFLASH_HANDLE EXFLASH handle - * @{ - */ - -/** - * @brief exFlash handle Structure definition - */ -typedef struct _exflash_handle { - xqspi_handle_t *p_xqspi; /**< exFlash XQSPI Handle parameters */ - - __IO uint32_t fw_mode; /**< exFlash firmware mode */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_exflash_state_t state; /**< exFlash communication state */ - - __IO hal_eflash_security security; /**< exFlash data security */ - - __IO uint32_t flash_id; /**< exFlash ID */ - - __IO uint32_t flash_size; /**< exFlash Size */ - - __IO uint32_t count; /**< exFlash count for suspend and resume */ - - __IO uint32_t error_code; /**< exFlash Error code */ - - uint32_t retry; /**< Repeat times for the exFlash memory access */ -} exflash_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_EXFLASH_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_EXFLASH_Callback Callback - * @{ - */ - -/** - * @brief HAL_EXFLASH Callback function definition - */ - -typedef struct _hal_exflash_callback { - void (*exflash_msp_init)(exflash_handle_t *p_exflash); /**< EXFLASH init MSP callback */ - void (*exflash_msp_deinit)(exflash_handle_t *p_exflash); /**< EXFLASH de-init MSP callback */ -} hal_exflash_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_EXFLASH_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXFLASH_EXPORTED_CONSTANTS EXFLASH Exported Constants - * @{ - */ - -/** @defgroup EXFLASH_ERROR_CODE EXFLASH Error Code - * @{ - */ -#define HAL_EXFLASH_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_EXFLASH_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_EXFLASH_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_EXFLASH_ERROR_ID ((uint32_t)0x00000003) /**< Flash ID error */ -#define HAL_EXFLASH_ERROR_QUAD ((uint32_t)0x00000004) /**< Quad mode error */ -#define HAL_EXFLASH_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameters error */ -/** @} */ - -/** @defgroup EXFLASH_ERASE_TYPE EXFLASH Erase Type - * @{ - */ -#define EXFLASH_ERASE_SECTOR 0 /**< Sector erase */ -#define EXFLASH_ERASE_CHIP 1 /**< Chip erase */ -/** @} */ - -/** @defgroup EXFLASH_SIZE_INFO EXFLASH Size Information - * @{ - */ -#define EXFLASH_SIZE_PAGE_BYTES ((uint32_t)256) /**< Page size in Bytes */ -#define EXFLASH_SIZE_SECTOR_BYTES ((uint32_t)4096) /**< Sector size in Bytes */ -#define EXFLASH_SIZE_CHIP_BYTES ((uint32_t)0x800000) /**< Chip size in Bytes */ -#define EXFLASH_START_ADDR FLASH_BASE /**< Flash start address */ -#define EXFLASH_SIZE (0x00800000UL) /**< Flash size */ -#define EXFLASH_END_ADDR (EXFLASH_START_ADDR + EXFLASH_SIZE) /**< Flash end address */ -#define EXFLASH_ALIAS_OFFSET (0x02000000UL) /**< Alias address offset */ -#define EXFLASH_ALIAS_ADDR (EXFLASH_START_ADDR + EXFLASH_ALIAS_OFFSET) /**< Alias start address */ -/** @} */ - -/** @defgroup EXFLASH_LOCK_AREA_TYPE EXFLASH Lock Area Type - * @{ - */ -#define EXFLASH_LOCK_AREA_NONE 0 /**< Offset NONE */ -#define EXFLASH_LOCK_AREA_UPPER_1_8 1 /**< Offset 0x070000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_1_4 2 /**< Offset 0x060000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_1_2 3 /**< Offset 0x040000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_LOWER_1_8 9 /**< Offset 0x000000 - 0x00FFFF */ -#define EXFLASH_LOCK_AREA_LOWER_1_4 10 /**< Offset 0x000000 - 0x01FFFF */ -#define EXFLASH_LOCK_AREA_LOWER_1_2 11 /**< Offset 0x000000 - 0x03FFFF */ -#define EXFLASH_LOCK_AREA_ALL 12 /**< Offset 0x000000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_TOP_4K 17 /**< Offset 0x07F000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_TOP_8K 18 /**< Offset 0x07E000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_TOP_16K 19 /**< Offset 0x07C000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_TOP_32K 20 /**< Offset 0x078000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_BOTTOM_4K 25 /**< Offset 0x000000 - 0x000FFF */ -#define EXFLASH_LOCK_AREA_BOTTOM_8K 26 /**< Offset 0x000000 - 0x001FFF */ -#define EXFLASH_LOCK_AREA_BOTTOM_16K 27 /**< Offset 0x000000 - 0x003FFF */ -#define EXFLASH_LOCK_AREA_BOTTOM_32K 28 /**< Offset 0x000000 - 0x007FFF */ -#define EXFLASH_LOCK_AREA_LOWER_7_8 33 /**< Offset 0x070000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_LOWER_3_4 34 /**< Offset 0x060000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_7_8 41 /**< Offset 0x000000 - 0x00FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_3_4 42 /**< Offset 0x000000 - 0x01FFFF */ -#define EXFLASH_LOCK_AREA_LOWER_127_128 49 /**< Offset 0x000000 - 0x07EFFF */ -#define EXFLASH_LOCK_AREA_LOWER_63_64 50 /**< Offset 0x000000 - 0x07DFFF */ -#define EXFLASH_LOCK_AREA_LOWER_31_32 51 /**< Offset 0x000000 - 0x07BFFF */ -#define EXFLASH_LOCK_AREA_LOWER_15_16 52 /**< Offset 0x000000 - 0x077FFF */ -#define EXFLASH_LOCK_AREA_UPPER_127_128 57 /**< Offset 0x001000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_63_64 58 /**< Offset 0x002000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_31_32 59 /**< Offset 0x004000 - 0x07FFFF */ -#define EXFLASH_LOCK_AREA_UPPER_15_16 60 /**< Offset 0x008000 - 0x07FFFF */ -/** @} */ - -/** @defgroup EXFLASH_RETRY_DEFINITION EXFLASH Repeat Times definition - * @{ - */ -#define HAL_EXFLASH_RETRY_DEFAULT_VALUE ((uint32_t)400000) /**< 400000 times */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXFLASH_EXPORTED_MACROS EXFLASH Exported Macros - * @{ - */ - -/** @brief Reset exFlash handle states. - * @param __HANDLE__ exFlash handle. - * @retval None - */ -#define HAL_EXFLASH_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_EXFLASH_STATE_RESET) - -/** @brief Enable the specified exFlash power. - * @retval None - */ -#define HAL_EXFLASH_POWER_ON() ll_xqspi_enable_exflash_power() - -/** @brief Disable the specified exFlash power. - * @retval None - */ -#define HAL_EXFLASH_POWER_OFF() ll_xqspi_disable_exflash_power() - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_EXFLASH_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup EXFLASH_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the exFlash peripheral. - - (+) User must implement hal_exflash_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_exflash_deinit() to restore the default configuration - of the selected exFlash peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the exFlash according to the specified parameters - * in the exflash_init_t and initialize the associated handle. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_init(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief De-initialize the exFlash peripheral. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_deinit(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Initialize the exFlash MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_exflash_msp_deinit can be implemented in the user file. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - **************************************************************************************** - */ -void hal_exflash_msp_init(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief De-initialize the exFlash MSP. - * - * @note This function should not be modified. When the callback is needed, - * the hal_exflash_msp_deinit can be implemented in the user file. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - **************************************************************************************** - */ -void hal_exflash_msp_deinit(exflash_handle_t *p_exflash); - -/** @} */ - -/** @defgroup EXFLASH_EXPORTED_FUNCTIONS_GROUP2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the exFlash - data transfers. - - [..] The exFlash supports XIP and QSPI mode: - - (#) There are only one modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - -@endverbatim - * @{ - */ -/** - **************************************************************************************** - * @brief During Flash erase/write operation, Disable external interrupts with a priority less than - * or equal to base_priority in the system. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] base_priority: Base Priority value to set. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_operation_protection(exflash_handle_t *p_exflash, uint32_t base_priority); - -/** - **************************************************************************************** - * @brief Write an amount of data with specified instruction and address to flash. - * - * @note This function is used only in Indirect Write Mode. In secure mode, address alignment requires 4 bytes. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] addr: Address to write data in flash, start at @ref EXFLASH_START_ADDR. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Size of buffer bytes - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_write(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); - -/** - **************************************************************************************** - * @brief Read an amount of data with specified instruction and address from flash. - * - * @note This function is used only in non-encrypted Indirect Read Mode. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] addr: Address to read data in flash, start at @ref EXFLASH_START_ADDR. - * @param[out] p_data: Pointer to data buffer - * @param[in] size: Size of buffer bytes - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_read(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); - -#if defined(GR5515_D) - -/** - **************************************************************************************** - * @brief [High speed]Read an amount of data with specified instruction and address from flash. - * - * @note This function is used only in non-encrypted Indirect Read Mode. - * Data content needs to be processed in 4-byte reverse order. - * And all parameters need to be aligned with 4 bytes. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] addr: Address to read data in flash, start at @ref EXFLASH_START_ADDR.(Aligned with 4 bytes) - * @param[out] p_data: Pointer to data buffer.(Pointer aligned with 4 bytes) - * @param[in] size: Size of buffer bytes.number of bytes to read.(A multiple of 4) - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_read_align_word(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); - -#endif - -/** - **************************************************************************************** - * @brief Erase flash region. - * - * @note All sectors that have address in range of [addr, addr+len] will be erased. If addr is not sector aligned, - * preceding data on the sector that addr belongs to will also be erased. If (addr + size) is not sector - * aligned, the whole sector will also be erased. If erase_type is @ref EXFLASH_ERASE_CHIP , all data in flash - * will be erased ignored addr and size. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] erase_type: Erase flash with page/sector/chip. - * @arg @ref EXFLASH_ERASE_SECTOR - * @arg @ref EXFLASH_ERASE_CHIP - * @param[in] addr: Address to erased data in flash, start at @ref EXFLASH_START_ADDR. - * @param[in] size: Size of erased bytes. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_erase(exflash_handle_t *p_exflash, uint32_t erase_type, uint32_t addr, uint32_t size); - -/** - **************************************************************************************** - * @brief Suspend flash pragram/erase. - * - * @note The Suspend instruction interrupts a Page Program, Sector Erase, or Block Erase operation to allow access - * to the memory array. After the program or erase operation has entered the suspended state, the memory - * array can be read except for the page being programmed or the sector or block being erased. This function - * is only used in XIP mode. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_suspend(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Resume flash pragram/erase. - * - * @note The Resume instruction resumes a suspended Page Program, Sector Erase, or Block Erase operation. - * Before issuing the Resume instruction to restart a suspended erase operation, make sure that there is no - * Page Program operation in progress. This function is only used in XIP mode. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_resume(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Lock area of flash to be software protected against Write and Erase operation. - * - * @note Locked area only to be read. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] lock_type Area need to lock - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_lock(exflash_handle_t *p_exflash, uint32_t lock_type); - -/** - **************************************************************************************** - * @brief Unlock write/erase protected in flash. - * - * @note This function will unlock all chip. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_unlock(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief the exFlash will go to the Deep Power-Down Mode. - * - * @note This function is used only in Indirect Write Mode. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_deepsleep(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief exFlash will be released from Deep Power-Down Mode. - * - * @note This function is used only in Indirect Write Mode. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_wakeup(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Reset exFlash. exFlash will return to its default power-on state and lose all - * the current volatile settings. - * - * @note This function is used only in Indirect Write Mode. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_reset(exflash_handle_t *p_exflash); - -#if defined(GR5515_D) && defined(ENCRYPT_ENABLE) - -/** - **************************************************************************************** - * @brief Specify the offset address and encrypted KEY address read by XIP. - * - * @param[in] p_exflash Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] read_offset The value must be 0x0 and EXFLASH_ALIAS_OFFSET. - * @param[in] key_addr The value must be FWCODEKEY_BASE_ADDR(0xA00170E0) and AESKEY_BASE_ADDR(0xA0017060). - **************************************************************************************** - */ -hal_status_t hal_exflash_encrypt_mode(exflash_handle_t *p_exflash, uint32_t read_offset, uint32_t key_addr); - -/** - **************************************************************************************** - * @brief Expand write an amount of data with specified instruction and address to flash. - * - * @note This function is used only in Indirect Write Mode. In secure mode, address alignment requires 4 bytes. - * Can specify write data to data area or code area. Need to call first hal_exflash_encrypt_mode - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] addr: Address to write data in flash, start at @ref EXFLASH_START_ADDR. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Size of buffer bytes - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_write_expand(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); - -/** - **************************************************************************************** - * @brief Expand read an amount of data with specified instruction and address from flash. - * - * @note This function is used only in non-encrypted Indirect Read Mode. - * Can specify read data from data area or code area. Need to call first hal_exflash_encrypt_mode - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] addr: Address to read data in flash, start at @ref EXFLASH_START_ADDR. - * @param[out] p_data: Pointer to data buffer - * @param[in] size: Size of buffer bytes - * - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_exflash_read_expand(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); - -#endif - -/** @} */ - -/** @defgroup EXFLASH_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief exFlash control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the exFlash. - (+) hal_exflash_get_state()API can be helpful to check in run-time the state of the exFlash peripheral. - (+) hal_exflash_get_error() check in run-time Errors occurring during communication. - (+) hal_exflash_set_timeout() set the timeout during internal process. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the exFlash handle state. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @retval ::HAL_EXFLASH_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_EXFLASH_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_EXFLASH_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_EXFLASH_STATE_BUSY_WRITE: Peripheral in indirect mode with transmission ongoing. - * @retval ::HAL_EXFLASH_STATE_BUSY_READ: Peripheral in indirect mode with reception ongoing. - * @retval ::HAL_EXFLASH_STATE_BUSY_ERASE: Peripheral in indirect mode with erase ongoing. - * @retval ::HAL_EXFLASH_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_exflash_state_t hal_exflash_get_state(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Return the exFlash error code. - * - * @param[in] p_exflash: Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * - * @return exFlash error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_exflash_get_error(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Set the exFlash internal process timeout value. - * - * @param[in] p_exflash Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] retry Internal process repeat times value. - **************************************************************************************** - */ -void hal_exflash_set_retry(exflash_handle_t *p_exflash, uint32_t retry); - - -/** - * @brief HAL exFlash operation function - */ -typedef hal_status_t (*exflash_operation_func)(exflash_handle_t *p_exflash); - -/** - **************************************************************************************** - * @brief Call user XIP Flash operation functon. - * - * @param[in] p_exflash Pointer to an exFlash handle which contains the configuration - * information for the specified exFlash module. - * @param[in] exflash_operation_func HAL exFlash operation function. - **************************************************************************************** - */ -hal_status_t hal_exflash_operation(exflash_handle_t *p_exflash, exflash_operation_func p_func_exflash_operation); -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_EXFLASH_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio.h deleted file mode 100755 index 70c7ee6..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio.h +++ /dev/null @@ -1,477 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_gpio.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of GPIO HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_GPIO GPIO - * @brief GPIO HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_GPIO_H__ -#define __GR55xx_HAL_GPIO_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_gpio.h" -#include "gr55xx_hal_def.h" -/* Include GPIO HAL Extended module */ -#include "gr55xx_hal_gpio_ex.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_GPIO_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_GPIO_Callback Callback - * @{ - */ - -/** - * @brief HAL_GPIO Callback function definition - */ - -typedef struct _hal_gpio_callback { - void (*gpio_callback)(gpio_regs_t *GPIOx, uint16_t gpio_pin); /**< GPIO pin detection callback */ -} hal_gpio_callback_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_GPIO_ENUMERATIONS Enumerations - * @{ - */ - -/** - * @brief GPIO Bit SET and Bit RESET Enumerations - */ -typedef enum { - GPIO_PIN_RESET = 0U, /**< GPIO pin low level.*/ - GPIO_PIN_SET /**< GPIO pin high level.*/ -} gpio_pin_state_t; - -/** @} */ - - -/** @addtogroup HAL_GPIO_STRUCTURES Structures - * @{ - */ - -/** - * @brief GPIO init structure definition - */ -typedef struct _gpio_init { - uint32_t pin; /**< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins */ - - uint32_t mode; /**< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_mode */ - - uint32_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref GPIO_pull */ - - uint32_t mux; /**< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIOEx_Mux_Function_Selection. */ -} gpio_init_t; - -/** @} */ - -/** - * @defgroup HAL_GPIO_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_pins GPIO pins - * @{ - */ -#define GPIO_PIN_0 ((uint16_t)0x0001U) /**< Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002U) /**< Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004U) /**< Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008U) /**< Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010U) /**< Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020U) /**< Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040U) /**< Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080U) /**< Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100U) /**< Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200U) /**< Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400U) /**< Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800U) /**< Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000U) /**< Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000U) /**< Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000U) /**< Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000U) /**< Pin 15 selected */ -#define GPIO_PIN_ALL ((uint16_t)0xFFFFU) /**< All pins selected */ - -#define GPIO_PIN_MASK (0x0000FFFFU) /**< PIN mask for assert test */ -/** @} */ - -/** @defgroup GPIO_mode GPIO mode - * @brief GPIO Configuration Mode - * Elements values convention: 0x000000YX - * - X : IO Direction mode (Input, Output, Mux) - * - Y : IT trigger detection - * @{ - */ -#define GPIO_MODE_INPUT (LL_GPIO_MODE_INPUT << 0) /**< Input Mode */ -#define GPIO_MODE_OUTPUT (LL_GPIO_MODE_OUTPUT << 0) /**< Output Mode */ -#define GPIO_MODE_MUX (LL_GPIO_MODE_MUX << 0) /**< Mux Mode */ -#define GPIO_MODE_IT_RISING (LL_GPIO_TRIGGER_RISING << 4) /**< Interrupt Mode with Rising edge - trigger detection */ -#define GPIO_MODE_IT_FALLING (LL_GPIO_TRIGGER_FALLING << 4) /**< Interrupt Mode with Falling edge - trigger detection */ -#define GPIO_MODE_IT_HIGH (LL_GPIO_TRIGGER_HIGH << 4) /**< Interrupt Mode with High-level - trigger detection */ -#define GPIO_MODE_IT_LOW (LL_GPIO_TRIGGER_LOW << 4) /**< Interrupt Mode with Low-level - trigger detection */ -/** @} */ - -/** @defgroup GPIO_pull GPIO pull - * @brief GPIO Pull-Up or Pull-Down Activation - * @{ - */ -#define GPIO_NOPULL LL_GPIO_PULL_NO /**< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP LL_GPIO_PULL_UP /**< Pull-up activation */ -#define GPIO_PULLDOWN LL_GPIO_PULL_DOWN /**< Pull-down activation */ -/** @} */ - -/** - * @brief GPIO_default_config InitStruct default configuartion - */ -#define GPIO_DEFAULT_CONFIG \ -{ \ - .pin = GPIO_PIN_ALL, \ - .mode = GPIO_MODE_INPUT, \ - .pull = GPIO_PULLDOWN, \ - .mux = GPIO_PIN_MUX_GPIO, \ -} - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** - * @brief Check whether the specified GPIO pin is asserted or not. - * @param __GPIOX__ Where X can be (0, 1) to select the GPIO peripheral port - * @param __GPIO_PIN__ Specifies the GPIO pin to check. - * This parameter can be GPIO_PIN_x where x can be (0..15) - * @retval The new state of __GPIO_PIN__ (SET or RESET). - */ -#define HAL_GPIO_IT_GET_IT(__GPIOX__, __GPIO_PIN__) ll_gpio_read_flag_it(__GPIOX__, __GPIO_PIN__) - -/** - * @brief Clear the GPIO pin pending bits. - * @param __GPIOX__ Where X can be (0, 1) to select the GPIO peripheral port - * @param __GPIO_PIN__ Specifies the GPIO pins to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define HAL_GPIO_IT_CLEAR_IT(__GPIOX__, __GPIO_PIN__) ll_gpio_clear_flag_it(__GPIOX__, __GPIO_PIN__) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @addtogroup GPIO_Private_Macros GPIO Private Macros - * @{ - */ - -/** - * @brief Check if GPIO pin action is valid. - * @param __ACTION__ GPIO pin action. - * @retval SET (__ACTION__ is valid) or RESET (__ACTION__ is invalid) - */ -#define IS_GPIO_PIN_ACTION(__ACTION__) (((__ACTION__) == GPIO_PIN_RESET) || ((__ACTION__) == GPIO_PIN_SET)) - -/** - * @brief Check if GPIO pins are valid. - * @param __PIN__ GPIO pins. - * @retval SET (__PIN__ is valid) or RESET (__PIN__ is invalid) - */ -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != 0x00U) && \ - (((__PIN__) & ~GPIO_PIN_MASK) == 0x00U)) - -/** - * @brief Check if GPIO mode is valid. - * @param __MODE__ GPIO mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_GPIO_MODE(__MODE__) (((__MODE__) == GPIO_MODE_INPUT) || \ - ((__MODE__) == GPIO_MODE_OUTPUT) || \ - ((__MODE__) == GPIO_MODE_MUX) || \ - ((__MODE__) == GPIO_MODE_IT_RISING) || \ - ((__MODE__) == GPIO_MODE_IT_FALLING) || \ - ((__MODE__) == GPIO_MODE_IT_HIGH) || \ - ((__MODE__) == GPIO_MODE_IT_LOW)) - -/** - * @brief Check if GPIO pull type is valid. - * @param __PULL__ GPIO pull type. - * @retval SET (__PULL__ is valid) or RESET (__PULL__ is invalid) - */ -#define IS_GPIO_PULL(__PULL__) (((__PULL__) == GPIO_NOPULL) || \ - ((__PULL__) == GPIO_PULLUP) || \ - ((__PULL__) == GPIO_PULLDOWN)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_GPIO_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions - * @brief Initialization and de-initialization functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the GPIOx peripheral according to the specified parameters in the p_gpio_init. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port - * @param[in] p_gpio_init: Pointer to a gpio_init_t structure that contains the configuration information - * for the specified GPIO peripheral port. - **************************************************************************************** - */ -void hal_gpio_init(gpio_regs_t *GPIOx, gpio_init_t *p_gpio_init); - -/** - **************************************************************************************** - * @brief De-initialize the GPIOx peripheral registers to their default reset values. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port for GR55xx device - * @param[in] gpio_pin: Specifies the port bit to be written. - * This parameter can be a combiantion of the following values: - * @arg @ref GPIO_PIN_0 - * @arg @ref GPIO_PIN_1 - * @arg @ref GPIO_PIN_2 - * @arg @ref GPIO_PIN_3 - * @arg @ref GPIO_PIN_4 - * @arg @ref GPIO_PIN_5 - * @arg @ref GPIO_PIN_6 - * @arg @ref GPIO_PIN_7 - * @arg @ref GPIO_PIN_8 - * @arg @ref GPIO_PIN_9 - * @arg @ref GPIO_PIN_10 - * @arg @ref GPIO_PIN_11 - * @arg @ref GPIO_PIN_12 - * @arg @ref GPIO_PIN_13 - * @arg @ref GPIO_PIN_14 - * @arg @ref GPIO_PIN_15 - * @arg @ref GPIO_PIN_ALL - **************************************************************************************** - */ -void hal_gpio_deinit(gpio_regs_t *GPIOx, uint32_t gpio_pin); - -/** @} */ - -/** @addtogroup GPIO_Exported_Functions_Group2 IO operation functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Read the specified input port pin. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port - * @param[in] gpio_pin: Specifies the port bit to be read. - * This parameter can be a one of the following values: - * @arg @ref GPIO_PIN_0 - * @arg @ref GPIO_PIN_1 - * @arg @ref GPIO_PIN_2 - * @arg @ref GPIO_PIN_3 - * @arg @ref GPIO_PIN_4 - * @arg @ref GPIO_PIN_5 - * @arg @ref GPIO_PIN_6 - * @arg @ref GPIO_PIN_7 - * @arg @ref GPIO_PIN_8 - * @arg @ref GPIO_PIN_9 - * @arg @ref GPIO_PIN_10 - * @arg @ref GPIO_PIN_11 - * @arg @ref GPIO_PIN_12 - * @arg @ref GPIO_PIN_13 - * @arg @ref GPIO_PIN_14 - * @arg @ref GPIO_PIN_15 - * - * @retval ::GPIO_PIN_RESET: GPIO pin low level. - * @retval ::GPIO_PIN_SET: GPIO pin high level. - **************************************************************************************** - */ -gpio_pin_state_t hal_gpio_read_pin(gpio_regs_t *GPIOx, uint16_t gpio_pin); - -/** - **************************************************************************************** - * @brief Set or clear the selected data port bit. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port - * @param[in] gpio_pin: Specifies the port bit to be written. - * This parameter can be a combiantion of the following values: - * @arg @ref GPIO_PIN_0 - * @arg @ref GPIO_PIN_1 - * @arg @ref GPIO_PIN_2 - * @arg @ref GPIO_PIN_3 - * @arg @ref GPIO_PIN_4 - * @arg @ref GPIO_PIN_5 - * @arg @ref GPIO_PIN_6 - * @arg @ref GPIO_PIN_7 - * @arg @ref GPIO_PIN_8 - * @arg @ref GPIO_PIN_9 - * @arg @ref GPIO_PIN_10 - * @arg @ref GPIO_PIN_11 - * @arg @ref GPIO_PIN_12 - * @arg @ref GPIO_PIN_13 - * @arg @ref GPIO_PIN_14 - * @arg @ref GPIO_PIN_15 - * @arg @ref GPIO_PIN_ALL - * @param[in] pin_state: Specifies the value to be written to the selected bit. - * This parameter can be one of the GPIO_PinState enum values: - * @arg @ref GPIO_PIN_RESET clear the port pin - * @arg @ref GPIO_PIN_SET set the port pin - **************************************************************************************** - */ -void hal_gpio_write_pin(gpio_regs_t *GPIOx, uint16_t gpio_pin, gpio_pin_state_t pin_state); - -/** - **************************************************************************************** - * @brief Toggle the specified GPIO pin. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port - * @param[in] gpio_pin: Specifies the pin to be toggled. - * This parameter can be a combiantion of the following values: - * @arg @ref GPIO_PIN_0 - * @arg @ref GPIO_PIN_1 - * @arg @ref GPIO_PIN_2 - * @arg @ref GPIO_PIN_3 - * @arg @ref GPIO_PIN_4 - * @arg @ref GPIO_PIN_5 - * @arg @ref GPIO_PIN_6 - * @arg @ref GPIO_PIN_7 - * @arg @ref GPIO_PIN_8 - * @arg @ref GPIO_PIN_9 - * @arg @ref GPIO_PIN_10 - * @arg @ref GPIO_PIN_11 - * @arg @ref GPIO_PIN_12 - * @arg @ref GPIO_PIN_13 - * @arg @ref GPIO_PIN_14 - * @arg @ref GPIO_PIN_15 - * @arg @ref GPIO_PIN_ALL - **************************************************************************************** - */ -void hal_gpio_toggle_pin(gpio_regs_t *GPIOx, uint16_t gpio_pin); - -/** @} */ - -/** @addtogroup GPIO_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle GPIO interrupt request. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port - **************************************************************************************** - */ -void hal_gpio_exti_irq_handler(gpio_regs_t *GPIOx); - -/** - **************************************************************************************** - * @brief GPIO pin detection callback. - * - * @note This function should not be modified. When the callback is needed, - * the hal_gpio_exti_callback can be implemented in the user file. - * - * @param[in] GPIOx: Where x can be (0, 1) to select the GPIO peripheral port - * @param[in] gpio_pin: Indicate the port pin whose interrupt was triggered. - * This parameter can be a combiantion of the following values: - * @arg @ref GPIO_PIN_0 - * @arg @ref GPIO_PIN_1 - * @arg @ref GPIO_PIN_2 - * @arg @ref GPIO_PIN_3 - * @arg @ref GPIO_PIN_4 - * @arg @ref GPIO_PIN_5 - * @arg @ref GPIO_PIN_6 - * @arg @ref GPIO_PIN_7 - * @arg @ref GPIO_PIN_8 - * @arg @ref GPIO_PIN_9 - * @arg @ref GPIO_PIN_10 - * @arg @ref GPIO_PIN_11 - * @arg @ref GPIO_PIN_12 - * @arg @ref GPIO_PIN_13 - * @arg @ref GPIO_PIN_14 - * @arg @ref GPIO_PIN_15 - * @arg @ref GPIO_PIN_ALL - **************************************************************************************** - */ -void hal_gpio_exti_callback(gpio_regs_t *GPIOx, uint16_t gpio_pin); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_GPIO_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio_ex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio_ex.h deleted file mode 100755 index cc8bee7..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_gpio_ex.h +++ /dev/null @@ -1,497 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_gpio_ex.h - * @author BLE Driver Team - * @brief Header file containing extended macro of GPIO HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_GPIOEx GPIOEx - * @brief GPIOEx HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_GPIO_EX_H__ -#define __GR55xx_HAL_GPIO_EX_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_gpio.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ - -/** - * @defgroup HAL_GPIOEX_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Constants GPIOEx Exported Constants - * @{ - */ - -/** @defgroup GPIOEx_Mux_Mode GPIOEx Mux Mode definition - * @{ - */ -#define GPIO_MUX_0 LL_GPIO_MUX_0 /**< GPIO Mux mode 0 */ -#define GPIO_MUX_1 LL_GPIO_MUX_1 /**< GPIO Mux mode 1 */ -#define GPIO_MUX_2 LL_GPIO_MUX_2 /**< GPIO Mux mode 2 */ -#define GPIO_MUX_3 LL_GPIO_MUX_3 /**< GPIO Mux mode 3 */ -#define GPIO_MUX_4 LL_GPIO_MUX_4 /**< GPIO Mux mode 4 */ -#define GPIO_MUX_5 LL_GPIO_MUX_5 /**< GPIO Mux mode 5 */ -#define GPIO_MUX_6 LL_GPIO_MUX_6 /**< GPIO Mux mode 6 */ -#define GPIO_MUX_7 LL_GPIO_MUX_7 /**< GPIO Mux mode 7 */ -#define GPIO_MUX_8 LL_GPIO_MUX_8 /**< GPIO Mux mode 8 */ -/** @} */ - -/** @defgroup GPIOEx_Mux_Function_Selection GPIOEx Mux function selection - * @{ - */ - -#if defined (GR551xx) -/*---------------------------------- GR551xx ------------------------------*/ - -/** @defgroup GPIOEx_Common_Selection GPIO PIN common MUX selection(Available for all GPIO pins) - * @{ - */ -#define GPIO_PIN_MUX_TESTBUS GPIO_MUX_8 /**< GPIO PIN x Mux Select TESTBUS */ - -#define GPIO_PIN_MUX_GPIO GPIO_MUX_7 /**< GPIO PIN x Mux Select GPIO */ - -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN0_Mux_Selection GPIO0_PIN0 MUX selection - * @{ - */ -#define GPIO0_PIN0_MUX_SWD_CLK GPIO_MUX_0 /**< GPIO0_PIN0 Mux Select SWD_CLK */ -#define GPIO0_PIN0_MUX_I2C0_SCL GPIO_MUX_1 /**< GPIO0_PIN0 Mux Select I2C0_SCL */ -#define GPIO0_PIN0_MUX_I2C1_SCL GPIO_MUX_2 /**< GPIO0_PIN0 Mux Select I2C1_SCL */ -#define GPIO0_PIN0_MUX_UART1_RTS GPIO_MUX_3 /**< GPIO0_PIN0 Mux Select UART1_RTS */ -#define GPIO0_PIN0_MUX_UART0_TX GPIO_MUX_4 /**< GPIO0_PIN0 Mux Select UART0_TX */ -#define GPIO0_PIN0_MUX_UART1_TX GPIO_MUX_5 /**< GPIO0_PIN0 Mux Select UART1_TX */ -#define GPIO0_PIN0_MUX_UART0_RTS GPIO_MUX_6 /**< GPIO0_PIN0 Mux Select UART0_RTS */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN1_Mux_Selection GPIO0_PIN1 MUX selection - * @{ - */ -#define GPIO0_PIN1_MUX_SWD_IO GPIO_MUX_0 /**< GPIO0_PIN1 Mux Select SWD_IO */ -#define GPIO0_PIN1_MUX_I2C0_SDA GPIO_MUX_1 /**< GPIO0_PIN1 Mux Select I2C0_SDA */ -#define GPIO0_PIN1_MUX_I2C1_SDA GPIO_MUX_2 /**< GPIO0_PIN1 Mux Select I2C1_SDA */ -#define GPIO0_PIN1_MUX_UART1_CTS GPIO_MUX_3 /**< GPIO0_PIN1 Mux Select UART1_CTS */ -#define GPIO0_PIN1_MUX_UART0_RX GPIO_MUX_4 /**< GPIO0_PIN1 Mux Select UART0_RX */ -#define GPIO0_PIN1_MUX_UART1_RX GPIO_MUX_5 /**< GPIO0_PIN1 Mux Select UART1_RX */ -#define GPIO0_PIN1_MUX_UART0_CTS GPIO_MUX_6 /**< GPIO0_PIN1 Mux Select UART0_CTS */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN2_Mux_Selection GPIO0_PIN2 MUX selection - * @{ - */ -#define GPIO0_PIN2_MUX_UART0_CTS GPIO_MUX_0 /**< GPIO0_PIN2 Mux Select UART0_CTS */ -#define GPIO0_PIN2_MUX_SIM_PRESENCE GPIO_MUX_1 /**< GPIO0_PIN2 Mux Select SIM_PRESENCE */ -#define GPIO0_PIN2_MUX_SWV GPIO_MUX_2 /**< GPIO0_PIN2 Mux Select SWV */ -#define GPIO0_PIN2_MUX_SPIS_CS_N GPIO_MUX_3 /**< GPIO0_PIN2 Mux Select SPIS_CS_N */ -#define GPIO0_PIN2_MUX_I2C0_SDA GPIO_MUX_4 /**< GPIO0_PIN2 Mux Select I2C0_SDA */ -#define GPIO0_PIN2_MUX_PWM0_A GPIO_MUX_5 /**< GPIO0_PIN2 Mux Select PWM0_A */ -#define GPIO0_PIN2_MUX_FERP_TRIG GPIO_MUX_6 /**< GPIO0_PIN2 Mux Select FERP_TRIG */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN3_Mux_Selection GPIO0_PIN3 MUX selection - * @{ - */ -#define GPIO0_PIN3_MUX_UART0_TX GPIO_MUX_0 /**< GPIO0_PIN3 Mux Select UART0_TX */ -#define GPIO0_PIN3_MUX_SIM_RST_N GPIO_MUX_1 /**< GPIO0_PIN3 Mux Select SIM_RST_N */ -#define GPIO0_PIN3_MUX_SPIM_CLK GPIO_MUX_2 /**< GPIO0_PIN3 Mux Select SPIM_CLK */ -#define GPIO0_PIN3_MUX_SPIS_CLK GPIO_MUX_3 /**< GPIO0_PIN3 Mux Select SPIS_CLK */ -#define GPIO0_PIN3_MUX_SPIM_CS1 GPIO_MUX_4 /**< GPIO0_PIN3 Mux Select SPIM_CS1 */ -#define GPIO0_PIN3_MUX_PWM0_B GPIO_MUX_5 /**< GPIO0_PIN3 Mux Select PWM0_B */ -#define GPIO0_PIN3_MUX_COEX_BLE_TX GPIO_MUX_6 /**< GPIO0_PIN3 Mux Select COEX_BLE_TX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN4_Mux_Selection GPIO0_PIN4 MUX selection - * @{ - */ -#define GPIO0_PIN4_MUX_UART0_RX GPIO_MUX_0 /**< GPIO0_PIN4 Mux Select UART0_RX */ -#define GPIO0_PIN4_MUX_SIM_IO GPIO_MUX_1 /**< GPIO0_PIN4 Mux Select SIM_IO */ -#define GPIO0_PIN4_MUX_SPIM_MOSI GPIO_MUX_2 /**< GPIO0_PIN4 Mux Select SPIM_MOSI */ -#define GPIO0_PIN4_MUX_SPIS_MISO GPIO_MUX_3 /**< GPIO0_PIN4 Mux Select SPIS_MISO */ -#define GPIO0_PIN4_MUX_SPIM_CS0 GPIO_MUX_4 /**< GPIO0_PIN4 Mux Select SPIM_CS0 */ -#define GPIO0_PIN4_MUX_PWM0_C GPIO_MUX_5 /**< GPIO0_PIN3 Mux Select PWM0_C */ -#define GPIO0_PIN4_MUX_COEX_BLE_RX GPIO_MUX_6 /**< GPIO0_PIN4 Mux Select COEX_BLE_RX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN5_Mux_Selection GPIO0_PIN5 MUX selection - * @{ - */ -#define GPIO0_PIN5_MUX_UART0_RTS GPIO_MUX_0 /**< GPIO0_PIN5 Mux Select UART0_RTS */ -#define GPIO0_PIN5_MUX_SIM_CLK GPIO_MUX_1 /**< GPIO0_PIN5 Mux Select SIM_CLK */ -#define GPIO0_PIN5_MUX_SPIM_MISO GPIO_MUX_2 /**< GPIO0_PIN5 Mux Select SPIM_MISO */ -#define GPIO0_PIN5_MUX_SPIS_MOSI GPIO_MUX_3 /**< GPIO0_PIN5 Mux Select SPIS_MOSI */ -// #define GPIO0_PIN5_MUX_SPIM_MISO GPIO_MUX_4 /**< GPIO0_PIN5 Mux Select SPIM_MISO */ -#define GPIO0_PIN5_MUX_I2C0_SCL GPIO_MUX_5 /**< GPIO0_PIN5 Mux Select I2C0_SCL */ -#define GPIO0_PIN5_MUX_COEX_WLAN_TX GPIO_MUX_6 /**< GPIO0_PIN5 Mux Select COEX_WLAN_TX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN6_Mux_Selection GPIO0_PIN6 MUX selection - * @{ - */ -#define GPIO0_PIN6_MUX_I2SM_WS GPIO_MUX_0 /**< GPIO0_PIN6 Mux Select I2S_WS */ -#define GPIO0_PIN6_MUX_I2SS_WS GPIO_MUX_1 /**< GPIO0_PIN6 Mux Select I2S_S_WS */ -#define GPIO0_PIN6_MUX_SPIM_CS0 GPIO_MUX_2 /**< GPIO0_PIN6 Mux Select SPIM_CS0 */ -#define GPIO0_PIN6_MUX_UART1_RX GPIO_MUX_3 /**< GPIO0_PIN6 Mux Select UART1_RX */ -#define GPIO0_PIN6_MUX_SPIM_MOSI GPIO_MUX_4 /**< GPIO0_PIN6 Mux Select SPIM_MOSI */ -#define GPIO0_PIN6_MUX_I2C0_SDA GPIO_MUX_5 /**< GPIO0_PIN6 Mux Select I2C0_SDA */ -#define GPIO0_PIN6_MUX_COEX_WLAN_RX GPIO_MUX_6 /**< GPIO0_PIN6 Mux Select COEX_WLAN_RX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN7_Mux_Selection GPIO0_PIN7 MUX selection - * @{ - */ -#define GPIO0_PIN7_MUX_I2SM_TX_SDO GPIO_MUX_0 /**< GPIO0_PIN7 Mux Select I2SM_TX_SDO */ -#define GPIO0_PIN7_MUX_I2SS_TX_SDO GPIO_MUX_1 /**< GPIO0_PIN7 Mux Select I2SS_TX_SDO */ -#define GPIO0_PIN7_MUX_SPIM_CS1 GPIO_MUX_2 /**< GPIO0_PIN7 Mux Select SPIM_CS1 */ -#define GPIO0_PIN7_MUX_UART1_TX GPIO_MUX_3 /**< GPIO0_PIN7 Mux Select UART1_TX */ -#define GPIO0_PIN7_MUX_SPIM_CLK GPIO_MUX_4 /**< GPIO0_PIN7 Mux Select SPIM_CLK */ -#define GPIO0_PIN7_MUX_PWM1_A GPIO_MUX_5 /**< GPIO0_PIN7 Mux Select PWM1_A */ -#define GPIO0_PIN7_MUX_COEX_BLE_PROC GPIO_MUX_6 /**< GPIO0_PIN7 Mux Select COEX_BLE_PROC */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN8_Mux_Selection GPIO0_PIN8 MUX selection - * @{ - */ -#define GPIO0_PIN8_MUX_XQSPIM_IO_0 GPIO_MUX_0 /**< GPIO0_PIN8 Mux Select XQSPIM_IO_0 */ -#define GPIO0_PIN8_MUX_I2C1_SDA GPIO_MUX_1 /**< GPIO0_PIN8 Mux Select I2C1_SDA */ -#define GPIO0_PIN8_MUX_QSPIM1_IO_0 GPIO_MUX_2 /**< GPIO0_PIN8 Mux Select QSPIM1_IO_0 */ -#define GPIO0_PIN8_MUX_UART1_RX GPIO_MUX_3 /**< GPIO0_PIN8 Mux Select UART1_RX */ -#define GPIO0_PIN8_MUX_PWM1_B GPIO_MUX_5 /**< GPIO0_PIN8 Mux Select PWM1_B */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN9_Mux_Selection GPIO0_PIN9 MUX selection - * @{ - */ -#define GPIO0_PIN9_MUX_XQSPIM_CLK GPIO_MUX_0 /**< GPIO0_PIN9 Mux Select XQSPIM_CLK */ -#define GPIO0_PIN9_MUX_I2C1_SCL GPIO_MUX_1 /**< GPIO0_PIN9 Mux Select I2C1_SCL */ -#define GPIO0_PIN9_MUX_QSPIM1_CLK GPIO_MUX_2 /**< GPIO0_PIN9 Mux Select QSPIM1_CLK */ -#define GPIO0_PIN9_MUX_UART1_TX GPIO_MUX_3 /**< GPIO0_PIN9 Mux Select UART1_TX */ -#define GPIO0_PIN9_MUX_PWM1_C GPIO_MUX_5 /**< GPIO0_PIN9 Mux Select PWM1_C */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN10_Mux_Selection GPIO0_PIN10 MUX selection - * @{ - */ -#define GPIO0_PIN10_MUX_I2SM_RX_SDI GPIO_MUX_0 /**< GPIO0_PIN10 Mux Select I2SM_RX_SDI */ -#define GPIO0_PIN10_MUX_I2SS_RX_SDI GPIO_MUX_1 /**< GPIO0_PIN10 Mux Select I2SS_RX_SDI */ -#define GPIO0_PIN10_MUX_UART0_TX GPIO_MUX_2 /**< GPIO0_PIN10 Mux Select UART0_TX */ -#define GPIO0_PIN10_MUX_I2C0_SCL GPIO_MUX_4 /**< GPIO0_PIN10 Mux Select I2C0_SCL */ -#define GPIO0_PIN10_MUX_PWM1_B GPIO_MUX_5 /**< GPIO0_PIN10 Mux Select PWM1_B */ -#define GPIO0_PIN10_MUX_COEX_BLE_TX GPIO_MUX_6 /**< GPIO0_PIN10 Mux Select COEX_BLE_TX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN11_Mux_Selection GPIO0_PIN11 MUX selection - * @{ - */ -#define GPIO0_PIN11_MUX_I2SM_SCLK GPIO_MUX_0 /**< GPIO0_PIN10 Mux Select I2SM_SCLK */ -#define GPIO0_PIN11_MUX_I2SS_SCLK GPIO_MUX_1 /**< GPIO0_PIN10 Mux Select I2SS_SCLK */ -#define GPIO0_PIN11_MUX_UART0_RX GPIO_MUX_2 /**< GPIO0_PIN10 Mux Select UART0_RX */ -#define GPIO0_PIN11_MUX_I2C0_SDA GPIO_MUX_4 /**< GPIO0_PIN10 Mux Select I2C0_SDA */ -#define GPIO0_PIN11_MUX_PWM1_C GPIO_MUX_5 /**< GPIO0_PIN10 Mux Select PWM1_C */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN12_Mux_Selection GPIO0_PIN12 MUX selection - * @{ - */ -#define GPIO0_PIN12_MUX_XQSPIM_IO_3 GPIO_MUX_0 /**< GPIO0_PIN12 Mux Select XQSPIM_IO_3 */ -#define GPIO0_PIN12_MUX_SPIM_CLK GPIO_MUX_1 /**< GPIO0_PIN12 Mux Select SPIM_CLK */ -#define GPIO0_PIN12_MUX_QSPIM1_IO3 GPIO_MUX_2 /**< GPIO0_PIN12 Mux Select QSPIM1_IO3 */ -#define GPIO0_PIN12_MUX_SIM_PRESENCE GPIO_MUX_3 /**< GPIO0_PIN12 Mux Select SIM_PRESENCE */ -#define GPIO0_PIN12_MUX_I2SM_WS GPIO_MUX_4 /**< GPIO0_PIN12 Mux Select I2SM_WS */ -#define GPIO0_PIN12_MUX_I2SS_WS GPIO_MUX_5 /**< GPIO0_PIN12 Mux Select I2SS_WS */ -#define GPIO0_PIN12_MUX_SPIS_CS GPIO_MUX_6 /**< GPIO0_PIN12 Mux Select I2SS_WS */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN13_Mux_Selection GPIO0_PIN13 MUX selection - * @{ - */ -#define GPIO0_PIN13_MUX_XQSPIM_IO_2 GPIO_MUX_0 /**< GPIO0_PIN13 Mux Select XQSPIM_IO_2 */ -#define GPIO0_PIN13_MUX_SPIM_MOSI GPIO_MUX_1 /**< GPIO0_PIN13 Mux Select SPIM_MOSI */ -#define GPIO0_PIN13_MUX_QSPIM1_IO_2 GPIO_MUX_2 /**< GPIO0_PIN13 Mux Select QSPIM1_IO_2 */ -#define GPIO0_PIN13_MUX_SIM_RST_N GPIO_MUX_3 /**< GPIO0_PIN13 Mux Select SIM_RST_N */ -#define GPIO0_PIN13_MUX_I2SM_TX_SDO GPIO_MUX_4 /**< GPIO0_PIN13 Mux Select I2SM_TX_SDO */ -#define GPIO0_PIN13_MUX_I2SS_TX_SDO GPIO_MUX_5 /**< GPIO0_PIN13 Mux Select I2SS_TX_SDO */ -#define GPIO0_PIN13_MUX_SPIS_CLK GPIO_MUX_6 /**< GPIO0_PIN13 Mux Select SPIS_CLK */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN14_Mux_Selection GPIO0_PIN14 MUX selection - * @{ - */ -#define GPIO0_PIN14_MUX_XQSPIM_IO_1 GPIO_MUX_0 /**< GPIO0_PIN14 Mux Select XQSPIM_IO_1 */ -#define GPIO0_PIN14_MUX_SPIM_MISO GPIO_MUX_1 /**< GPIO0_PIN14 Mux Select SPIM_MISO */ -#define GPIO0_PIN14_MUX_QSPIM1_IO1 GPIO_MUX_2 /**< GPIO0_PIN14 Mux Select QSPIM1_IO1 */ -#define GPIO0_PIN14_MUX_SIM_IO GPIO_MUX_3 /**< GPIO0_PIN14 Mux Select SIM_IO */ -#define GPIO0_PIN14_MUX_I2SM_RX_SDI GPIO_MUX_4 /**< GPIO0_PIN14 Mux Select I2SM_RX_SDI */ -#define GPIO0_PIN14_MUX_I2SS_RX_SDI GPIO_MUX_5 /**< GPIO0_PIN14 Mux Select I2SS_RX_SDI */ -#define GPIO0_PIN14_MUX_SPIS_MISO GPIO_MUX_6 /**< GPIO0_PIN14 Mux Select SPIS_MISO */ -/** @} */ - -/** @defgroup GPIOEx_GPIO0_PIN15_Mux_Selection GPIO0_PIN15 MUX selection - * @{ - */ -#define GPIO0_PIN15_MUX_XQSPIM_CS_N GPIO_MUX_0 /**< GPIO0_PIN15 Mux Select QSPIM_CS_N */ -#define GPIO0_PIN15_MUX_SPIM_CS0 GPIO_MUX_1 /**< GPIO0_PIN15 Mux Select SPIM_CS0 */ -#define GPIO0_PIN15_MUX_QSPIM1_CS_N GPIO_MUX_2 /**< GPIO0_PIN15 Mux Select QSPIM1_CS_N */ -#define GPIO0_PIN15_MUX_SIM_CLK GPIO_MUX_3 /**< GPIO0_PIN15 Mux Select SIM_CLK */ -#define GPIO0_PIN15_MUX_I2SM_SCLK GPIO_MUX_4 /**< GPIO0_PIN15 Mux Select I2SM_SCLK */ -#define GPIO0_PIN15_MUX_I2SS_SCLK GPIO_MUX_5 /**< GPIO0_PIN15 Mux Select I2SS_SCLK */ -#define GPIO0_PIN15_MUX_SPIS_MOSI GPIO_MUX_6 /**< GPIO0_PIN15 Mux Select SPIS_MOSI */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN0_Mux_Selection GPIO1_PIN0 MUX selection - * @{ - */ -#define GPIO1_PIN0_MUX_SPIM_MISO GPIO_MUX_0 /**< GPIO1_PIN0 Mux Select SPIM_MISO */ -#define GPIO1_PIN0_MUX_SPIS_MOSI GPIO_MUX_1 /**< GPIO1_PIN0 Mux Select SPIS_MOSI */ -#define GPIO1_PIN0_MUX_SIM_IO GPIO_MUX_2 /**< GPIO1_PIN0 Mux Select SIM_IO */ -#define GPIO1_PIN0_MUX_I2SM_RX_SDI GPIO_MUX_3 /**< GPIO1_PIN0 Mux Select I2SM_RX_SDI */ -#define GPIO1_PIN0_MUX_I2SS_RX_SDI GPIO_MUX_4 /**< GPIO1_PIN0 Mux Select I2SS_RX_SDI */ -#define GPIO1_PIN0_MUX_QSPIM0_IO_1 GPIO_MUX_5 /**< GPIO1_PIN0 Mux Select QSPIM0_IO_1 */ -#define GPIO1_PIN0_MUX_ISO_SYNC GPIO_MUX_6 /**< GPIO1_PIN0 Mux Select ISO_SYNC */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN1_Mux_Selection GPIO1_PIN1 MUX selection - * @{ - */ -#define GPIO1_PIN1_MUX_SPIM_CS0 GPIO_MUX_0 /**< GPIO1_PIN1 Mux Select SPIM_CS0 */ -#define GPIO1_PIN1_MUX_SPIS_CS GPIO_MUX_1 /**< GPIO1_PIN1 Mux Select SPIS_CS */ -#define GPIO1_PIN1_MUX_SIM_CLK GPIO_MUX_2 /**< GPIO1_PIN1 Mux Select SIM_CLK */ -#define GPIO1_PIN1_MUX_I2SM_SCLK GPIO_MUX_3 /**< GPIO1_PIN1 Mux Select I2SM_SCLK */ -#define GPIO1_PIN1_MUX_I2SS_SCLK GPIO_MUX_4 /**< GPIO1_PIN1 Mux Select I2SS_SCLK */ -#define GPIO1_PIN1_MUX_QSPIM0_IO_2 GPIO_MUX_5 /**< GPIO1_PIN1 Mux Select QSPIM0_IO_2 */ -#define GPIO1_PIN1_MUX_COEX_BLE_RX GPIO_MUX_6 /**< GPIO1_PIN1 Mux Select COEX_BLE_RX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN2_Mux_Selection GPIO1_PIN2 MUX selection - * @{ - */ -#define GPIO1_PIN2_MUX_QSPIM0_CS_N GPIO_MUX_0 /**< GPIO1_PIN2 Mux Select QSPIM0_CS_N */ -#define GPIO1_PIN2_MUX_XQSPIM_CS_N GPIO_MUX_1 /**< GPIO1_PIN2 Mux Select XQSPIM_CS_N */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN3_Mux_Selection GPIO1_PIN3 MUX selection - * @{ - */ -#define GPIO1_PIN3_MUX_QSPIM0_IO_3 GPIO_MUX_0 /**< GPIO1_PIN3 Mux Select QSPIM0_IO_3 */ -#define GPIO1_PIN3_MUX_XQSPIM_IO_3 GPIO_MUX_1 /**< GPIO1_PIN3 Mux Select XQSPIM_IO_3 */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN4_Mux_Selection GPIO1_PIN4 MUX selection - * @{ - */ -#define GPIO1_PIN4_MUX_QSPIM0_CLK GPIO_MUX_0 /**< GPIO1_PIN4 Mux Select QSPIM0_CLK */ -#define GPIO1_PIN4_MUX_XQSPIM_CLK GPIO_MUX_1 /**< GPIO1_PIN4 Mux Select XQSPIM_CLK */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN5_Mux_Selection GPIO1_PIN5 MUX selection - * @{ - */ -#define GPIO1_PIN5_MUX_QSPIM0_IO_2 GPIO_MUX_0 /**< GPIO1_PIN5 Mux Select QSPIM0_IO_2 */ -#define GPIO1_PIN5_MUX_XQSPIM_IO_2 GPIO_MUX_1 /**< GPIO1_PIN5 Mux Select XQSPIM_IO_2 */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN6_Mux_Selection GPIO1_PIN6 MUX selection - * @{ - */ -#define GPIO1_PIN6_MUX_QSPIM0_IO_1 GPIO_MUX_0 /**< GPIO1_PIN6 Mux Select QSPIM0_IO_1 */ -#define GPIO1_PIN6_MUX_XQSPIM_IO_1 GPIO_MUX_1 /**< GPIO1_PIN6 Mux Select XQSPIM_IO_1 */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN7_Mux_Selection GPIO1_PIN7 MUX selection - * @{ - */ -#define GPIO1_PIN7_MUX_QSPIM0_IO_0 GPIO_MUX_0 /**< GPIO1_PIN7 Mux Select QSPIM0_IO_0 */ -#define GPIO1_PIN7_MUX_XQSPIM_IO_0 GPIO_MUX_1 /**< GPIO1_PIN7 Mux Select XQSPIM_IO_0 */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN8_Mux_Selection GPIO1_PIN8 MUX selection - * @{ - */ -#define GPIO1_PIN8_MUX_SPIM_CLK GPIO_MUX_0 /**< GPIO1_PIN8 Mux Select SPIM_CLK */ -#define GPIO1_PIN8_MUX_SPIS_CLK GPIO_MUX_1 /**< GPIO1_PIN8 Mux Select SPIS_CLK */ -#define GPIO1_PIN8_MUX_SIM_PRESENCE GPIO_MUX_2 /**< GPIO1_PIN8 Mux Select SIM_PRESENCE */ -#define GPIO1_PIN8_MUX_I2SM_WS GPIO_MUX_3 /**< GPIO1_PIN8 Mux Select I2SM_WS */ -#define GPIO1_PIN8_MUX_I2SS_WS GPIO_MUX_4 /**< GPIO1_PIN8 Mux Select I2SS_WS */ -#define GPIO1_PIN8_MUX_QSPIM0_CLK GPIO_MUX_5 /**< GPIO1_PIN8 Mux Select QSPIM0_CLK */ -#define GPIO1_PIN8_MUX_COEX_WLAN_TX GPIO_MUX_6 /**< GPIO1_PIN8 Mux Select COEX_WLAN_TX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN9_Mux_Selection GPIO1_PIN9 MUX selection - * @{ - */ -#define GPIO1_PIN9_MUX_SPIM_MOSI GPIO_MUX_0 /**< GPIO1_PIN9 Mux Select SPIM_MOSI */ -#define GPIO1_PIN9_MUX_SPIS_MISO GPIO_MUX_1 /**< GPIO1_PIN9 Mux Select SPIS_MISO */ -#define GPIO1_PIN9_MUX_SIM_RST_N GPIO_MUX_2 /**< GPIO1_PIN9 Mux Select SIM_RST_N */ -#define GPIO1_PIN9_MUX_I2SM_TX_SD0 GPIO_MUX_3 /**< GPIO1_PIN9 Mux Select I2SM_TX_SD0 */ -#define GPIO1_PIN9_MUX_I2SS_TX_SD0 GPIO_MUX_4 /**< GPIO1_PIN9 Mux Select I2SS_TX_SD0 */ -#define GPIO1_PIN9_MUX_QSPIM0_IO_0 GPIO_MUX_5 /**< GPIO1_PIN9 Mux Select QSPIM0_IO_0 */ -#define GPIO1_PIN9_MUX_COEX_BLE_PROC GPIO_MUX_6 /**< GPIO1_PIN9 Mux Select COEX_BLE_PROC */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN10_Mux_Selection GPIO1_PIN10 MUX selection - * @{ - */ -#define GPIO1_PIN10_MUX_I2C1_SDA GPIO_MUX_0 /**< GPIO1_PIN10 Mux Select I2C1_SDA */ -#define GPIO1_PIN10_MUX_UART1_RX GPIO_MUX_1 /**< GPIO1_PIN10 Mux Select UART1_RX */ -#define GPIO1_PIN10_MUX_I2C0_SDA GPIO_MUX_2 /**< GPIO1_PIN10 Mux Select I2C0_SDA */ -#define GPIO1_PIN10_MUX_PWM0_C GPIO_MUX_3 /**< GPIO1_PIN10 Mux Select PWM0_C */ -#define GPIO1_PIN10_MUX_PWM1_C GPIO_MUX_4 /**< GPIO1_PIN10 Mux Select PWM5 */ -#define GPIO1_PIN10_MUX_UART0_RX GPIO_MUX_5 /**< GPIO1_PIN10 Mux Select UART0_RX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN11_Mux_Selection GPIO1_PIN11 MUX selection - * @{ - */ -#define GPIO1_PIN11_MUX_UART1_RTS GPIO_MUX_1 /**< GPIO1_PIN11 Mux Select UART1_RTS */ -#define GPIO1_PIN11_MUX_UART0_RTS GPIO_MUX_5 /**< GPIO1_PIN11 Mux Select UART0_RTS */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN12_Mux_Selection GPIO1_PIN12 MUX selection - * @{ - */ -#define GPIO1_PIN12_MUX_UART1_CTS GPIO_MUX_1 /**< GPIO1_PIN12 Mux Select UART1_CTS */ -#define GPIO1_PIN12_MUX_UART0_CTS GPIO_MUX_5 /**< GPIO1_PIN12 Mux Select UART0_CTS */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN13_Mux_Selection GPIO1_PIN13 MUX selection - * @{ - */ - -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN14_Mux_Selection GPIO1_PIN14 MUX selection - * @{ - */ -#define GPIO1_PIN14_MUX_I2C1_SCL GPIO_MUX_0 /**< GPIO1_PIN14 Mux Select I2C1_SCL */ -#define GPIO1_PIN14_MUX_UART1_TX GPIO_MUX_1 /**< GPIO1_PIN14 Mux Select UART1_TX */ -#define GPIO1_PIN14_MUX_I2C0_SCL GPIO_MUX_2 /**< GPIO1_PIN14 Mux Select I2C0_SCL */ -#define GPIO1_PIN14_MUX_PWM0_B GPIO_MUX_3 /**< GPIO1_PIN14 Mux Select PWM0_B */ -#define GPIO1_PIN14_MUX_PWM1_B GPIO_MUX_4 /**< GPIO1_PIN14 Mux Select PWM1_B */ -#define GPIO1_PIN14_MUX_UART0_TX GPIO_MUX_5 /**< GPIO1_PIN14 Mux Select UART0_TX */ -#define GPIO1_PIN14_MUX_COEX_BLE_TX GPIO_MUX_6 /**< GPIO1_PIN14 Mux Select COEX_BLE_TX */ -/** @} */ - -/** @defgroup GPIOEx_GPIO1_PIN15_Mux_Selection GPIO1_PIN15 MUX selection - * @{ - */ -#define GPIO1_PIN15_MUX_SPIM_CS1 GPIO_MUX_0 /**< GPIO1_PIN15 Mux Select SPIM_CS1 */ -#define GPIO1_PIN15_MUX_PWM0_A GPIO_MUX_3 /**< GPIO1_PIN15 Mux Select PWM0_A */ -#define GPIO1_PIN15_MUX_PWM1_A GPIO_MUX_4 /**< GPIO1_PIN15 Mux Select PWM1_A */ -#define GPIO1_PIN15_MUX_QSPIM0_IO_3 GPIO_MUX_5 /**< GPIO1_PIN15 Mux Select QSPIM0_IO_3 */ -#define GPIO1_PIN15_MUX_COEX_WLAN_TX GPIO_MUX_6 /**< GPIO1_PIN15 Mux Select COEX_WLAN_TX */ -/** @} */ - -/** - * @brief Check if GPIO Mux mode is valid. - * @param __MUX__ GPIO mux mode. - * @retval SET (__ACTION__ is valid) or RESET (__ACTION__ is invalid) - */ -#define IS_GPIO_MUX(__MUX__) (((__MUX__) <= GPIO_MUX_8)) - -/*------------------------------------------------------------------------------------------*/ -#endif /* GR551xx */ - -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Macros GPIOEx Exported Macros - * @{ - */ - -/** @defgroup GPIOEx_Get_Port_Index GPIOEx_Get Port Index -* @{ - */ -#if defined(GR551xx) - -/** - * @brief Get GPIO Port Index. - * @param __GPIOx__ GPIO instance. - * @retval Port Index. - */ -#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIO0))? 0U : 1U) - -#endif /* GR551xx */ -/** @} */ - -/** @defgroup GPIOEx_Get_Port_IRQNum GPIOEx_Get Port IRQ number -* @{ - */ -#if defined(GR551xx) - -/** - * @brief Get GPIO Port IRQ number. - * @param __GPIOx__ GPIO instance. - * @retval Port IRQ number. - */ -#define GPIO_GET_IRQNUM(__GPIOx__) (((__GPIOx__) == (GPIO0))? EXT0_IRQn : EXT1_IRQn) - -#endif /* GR551xx */ - -/** @} */ - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_GPIO_EX_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_hmac.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_hmac.h deleted file mode 100755 index 92f3f69..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_hmac.h +++ /dev/null @@ -1,624 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_hmac.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of HMAC HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_HMAC HMAC - * @brief HMAC HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_HMAC_H__ -#define __GR55xx_HAL_HMAC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_hmac.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_HMAC_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_HMAC_state HAL HMAC state - * @{ - */ - -/** - * @brief HAL HMAC State enumerations definition - * @note HAL HMAC State value is a combination of 2 different substates: gState and RxState. - */ -typedef enum { - HAL_HMAC_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_HMAC_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_HMAC_STATE_BUSY = 0x02, /**< Peripheral in indirect mode and busy */ - HAL_HMAC_STATE_ERROR = 0x03, /**< Peripheral in error */ - HAL_HMAC_STATE_TIMEOUT = 0x04, /**< Peripheral in timeout */ - HAL_HMAC_STATE_SUSPENDED = 0x05, /**< Peripheral in suspended */ -} hal_hmac_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_HMAC_STRUCTURES Structures - * @{ - */ - -/** @defgroup HMAC_Configuration HMAC Configuration - * @{ - */ - -/** - * @brief HMAC init Structure definition - */ -typedef struct _hmac_init { - uint32_t mode; /**< Operating mode */ - - uint32_t *p_key; /**< Encryption/Decryption Key */ - - uint32_t *p_user_hash; /**< Initialization HASH value */ - - uint32_t key_fetch_type; /**< @ref HAL_HMAC_KEYTYPE_MCU Fetch key from ram; - { Start_private - @ref HAL_HMAC_KEYTYPE_AHB Fetch key from AHB; - } End_private - @ref HAL_HMAC_KEYTYPE_KRAM Fetch key from keyport */ - uint32_t dpa_mode; /**< DPA Mode */ -} hmac_init_t; -/** @} */ - -/** @defgroup HMAC_handle HMAC handle - * @{ - */ - -/** - * @brief HMAC handle Structure definition - */ -typedef struct _hmac_handle { - hmac_regs_t *p_instance; /**< HMAC registers base address */ - - hmac_init_t init; /**< HMAC operation parameters */ - - uint32_t *p_message; /**< Pointer to message input buffer */ - - uint32_t *p_digest; /**< Pointer to digest output buffer */ - - uint32_t block_size; /**< Data size in blocks (64 bytes per block) */ - - uint32_t block_count; /**< Blocks count */ - - uint32_t is_last_trans; /**< Flag for last transfer */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_hmac_state_t state; /**< HMAC operation state */ - - __IO uint32_t error_code; /**< HMAC Error code */ - - uint32_t timeout; /**< Timeout for the HMAC operation */ - - uint32_t retention[17]; /**< HMAC important register information. */ -} hmac_handle_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_HMAC_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_HMAC_Callback Callback - * @{ - */ - -/** - * @brief HAL_HMAC Callback function definition - */ - -typedef struct _hal_hmac_callback { - void (*hmac_msp_init)(hmac_handle_t *p_hmac); /**< HMAC init MSP callback */ - void (*hmac_msp_deinit)(hmac_handle_t *p_hmac); /**< HMAC de-init MSP callback */ - void (*hmac_done_callback)(hmac_handle_t *p_hmac); /**< HMAC digest done callback */ - void (*hmac_error_callback)(hmac_handle_t *p_hmac); /**< HMAC error callback */ -} hal_hmac_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_HMAC_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup HMAC_Exported_Constants HMAC Exported Constants - * @{ - */ - -/** @defgroup HMAC_Error_Code HMAC Error Code - * @{ - */ -#define HAL_HMAC_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_HMAC_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_HMAC_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_HMAC_ERROR_INVALID_PARAM ((uint32_t)0x00000004) /**< Invalid parameters error */ -/** @} */ - -/** @defgroup HMAC_Mode HMAC Mode - * @{ - */ -#define HMAC_MODE_SHA LL_HMAC_CALCULATETYPE_SHA /**< SHA mode */ -#define HMAC_MODE_HMAC LL_HMAC_CALCULATETYPE_HMAC /**< HMAC mode */ -/** @} */ - -/** @defgroup HMAC_Block_Size HAMC Block Size - * @{ - */ -#define HMAC_BLOCK_MAX (512) /**< Block max size */ -#define HMAC_BLOCKSIZE_BITS (512) /**< Block size in bits */ -#define HMAC_BLOCKSIZE_BYTES (HMAC_BLOCKSIZE_BITS >> 3) /**< Block size in bytes */ -#define HMAC_BLOCKSIZE_WORDS (HMAC_BLOCKSIZE_BYTES >> 2) /**< Block size in words */ -#define HMAC_DIGESTSIZE_BITS (256) /**< Digest size in bits */ -#define HMAC_DIGESTSIZE_BYTES (HMAC_DIGESTSIZE_BITS >> 3) /**< Digest size in bytes */ -#define HMAC_DIGESTSIZE_WORDS (HMAC_DIGESTSIZE_BYTES >> 2) /**< Digest size in words */ -#define HMAC_DMA_BLOCK_MAX (512) /**< DMA Block max size */ -/** @} */ - -/** @defgroup HMAC_Flags_definition HAMC Flags Definition - * @{ - */ -#define HMAC_FLAG_DATAREADY_SHA LL_HMAC_FLAG_DATAREADY_SHA /**< HMAC data ready (SHA mode) */ -#define HMAC_FLAG_DATAREADY_HMAC LL_HMAC_FLAG_DATAREADY_HMAC /**< HMAC data ready (HAMC mode) */ -#define HMAC_FLAG_DMA_MESSAGEDONE LL_HMAC_FLAG_DMA_MESSAGEDONE /**< HMAC DMA message done */ -#define HMAC_FLAG_DMA_DONE LL_HMAC_FLAG_DMA_DONE /**< HMAC DMA transfer done */ -#define HMAC_FLAG_DMA_ERR LL_HMAC_FLAG_DMA_ERR /**< HMAC DMA transfer error */ -#define HMAC_FLAG_KEY_VALID LL_HMAC_FLAG_KEY_VALID /**< HMAC has fetched key */ -/** @} */ - -/** @defgroup HMAC_HAL_KEY_TYPE Key Type - * @{ - */ -#define HAL_HMAC_KEYTYPE_MCU LL_HMAC_KEYTYPE_MCU /**< Key from MCU */ -/* { Start_private */ -#define HAL_HMAC_KEYTYPE_AHB LL_HMAC_KEYTYPE_AHB /**< Key from AHB master */ -/* } End_private */ -#define HAL_HMAC_KEYTYPE_KRAM LL_HMAC_KEYTYPE_KRAM /**< Key from Key Port */ -/** @} */ - -/** @defgroup HMAC_Interrupt_definition HMAC Interrupt_definition - * @{ - */ -#define HMAC_IT_DONE ((uint32_t)0x00000001) /**< Operation Done Interrupt source */ -/** @} */ - -/** @defgroup HMAC_Timeout_definition HMAC Timeout_definition - * @{ - */ -#define HAL_HMAC_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HMAC_Exported_Macros HMAC Exported Macros - * @{ - */ - -/** @brief Reset HMAC handle states. - * @param __HANDLE__ HMAC handle. - * @retval None - */ -#define HAL_HMAC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_HMAC_STATE_RESET) - -/** @brief Enable the specified HMAC peripheral. - * @param __HANDLE__ Specifies the HMAC Handle. - * @retval None - */ -#define HAL_HMAC_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, HMAC_CTRL_ENABLE) - -/** @brief Disable the specified HMAC peripheral. - * @param __HANDLE__ Specifies the HMAC Handle. - * @retval None - */ -#define HAL_HMAC_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, HMAC_CTRL_ENABLE) - -/** @brief Enable the HMAC interrupt. - * @param __HANDLE__ Specifies the HMAC Handle. - * @retval None - */ -#define HAL_HMAC_ENABLE_IT(__HANDLE__) ll_hmac_enable_it_done((__HANDLE__)->p_instance) - -/** @brief Disable the HMAC interrupt. - * @param __HANDLE__ Specifies the HMAC Handle. - * @retval None - */ -#define HAL_HMAC_DISABLE_IT(__HANDLE__) ll_hmac_disable_it_done((__HANDLE__)->p_instance) - -/** @brief Check whether the specified HMAC interrupt flag is set or not. - * @param __HANDLE__ Specifies the HMAC Handle. - * @param __FLAG__ Specifies the interrupt flag to check. - * This parameter can be one of the following values: - * @arg @ref HMAC_IT_DONE Encrypted or Decrypted Data Done Interrupt - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_HMAC_GET_FLAG_IT(__HANDLE__, __FLAG__) \ - (READ_BITS((__HANDLE__)->p_instance->INTERRUPT, (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified HMAC interrupt flag. - * @param __HANDLE__ Specifies the HMAC interrupt Handle. - * @param __FLAG__ Specifies the flag to clear. - * This parameter can be one of the following values: - * @arg @ref HMAC_IT_DONE Encrypted or Decrypted Data Done Interrupt - * @retval None - */ -#define HAL_HMAC_CLEAR_FLAG_IT(__HANDLE__, __FLAG__) SET_BITS((__HANDLE__)->p_instance->INTERRUPT, (__FLAG__)) - -/** @brief Check whether the specified HMAC flag is set or not. - * @param __HANDLE__ Specifies the HMAC Handle. - * @param __FLAG__ Specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref HMAC_FLAG_DATAREADY_SHA Data ready (SHA mode) flag - * @arg @ref HMAC_FLAG_DATAREADY_HMAC Data ready (HMAC mode) flag - * @arg @ref HMAC_FLAG_DMA_DONE DMA transfer done flag - * @arg @ref HMAC_FLAG_DMA_ERR DMA transfer error flag - * @arg @ref HMAC_FLAG_KEY_VALID Key valid flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_HMAC_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->STATUS, (__FLAG__)) != 0) ? SET : RESET) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_HMAC_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup HMAC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the HMACx peripheral. - - (+) User must implement hal_hmac_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_hmac_init() to configure the selected device with - the selected configuration: - (++) mode - (++) key - (++) user_hash - (++) dpa_mode - - (+) Call the function hal_hmac_deinit() to restore the default configuration - of the selected HMACx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the HMAC according to the specified parameters - * in the hmac_init_t and initialize the associated handle. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_init(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief De-initialize the HMAC peripheral. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_deinit(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief Initialize the HMAC MSP. - * @note This function should not be modified. When the callback is needed, - the hal_hmac_msp_deinit can be implemented in the user file. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - **************************************************************************************** - */ -void hal_hmac_msp_init(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief De-initialize the HMAC MSP. - * @note This function should not be modified. When the callback is needed, - the HAL_HMAC_MspDeInit can be implemented in the user file. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - **************************************************************************************** - */ -void hal_hmac_msp_deinit(hmac_handle_t *p_hmac); - -/** @} */ - -/** @addtogroup HMAC_Exported_Functions_Group2 IO operation functions - * @brief HMAC Encrypt/Decrypt functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the HMAC encrypt or decrypt. - - (#) There are two mode of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) Non-Blocking mode: The communication is performed using Interrupts - or DMA, These API's return the HAL status. - The end of the data processing will be indicated through the - dedicated HMAC IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The hal_hmac_done_callback() user callbacks will be executed respectively - at the end of the encrypt or decrypt process - The hal_hmac_error_callback() user callback will be executed when a error is detected - - (#) Blocking mode API's are : - (++) hal_hmac_sha256_digest() - - (#) Non-Blocking mode API's with Interrupt are : - (++) hal_hmac_sha256_digest_it() - - (#) Non-Blocking mode API's with DMA are : - (++) hal_hmac_sha256_digest_dma() - - (#) A set of encrypt or decrypt Callbacks are provided in Non_Blocking mode: - (++) hal_hmac_done_callback() - (++) hal_hmac_error_callback() - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief xxx in blocking mode in SHA/HMAC mode. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @param[in] p_message: Pointer to message buffer - * @param[in] number: Amount of data - * @param[out] p_digest: Pointer to digest buffer - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_sha256_digest(hmac_handle_t *p_hmac, uint32_t *p_message, uint32_t number, - uint32_t *p_digest, uint32_t timeout); - -/** - **************************************************************************************** - * @brief xxx in non-blocking mode with interrupt in SHA/HMAC mode. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @param[in] p_message: Pointer to message buffer - * @param[in] number: Amount of data - * @param[out] p_digest: Pointer to digest buffer - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_sha256_digest_it(hmac_handle_t *p_hmac, uint32_t *p_message, uint32_t number, uint32_t *p_digest); - -/** - **************************************************************************************** - * @brief xxx in non-blocking mode with DMA in SHA/HMAC mode. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @param[in] p_message: Pointer to massage buffer - * @param[in] number: Amount of data - * @param[out] p_digest: Pointer to digest buffer - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_sha256_digest_dma(hmac_handle_t *p_hmac, uint32_t *p_message, - uint32_t number, uint32_t *p_digest); - -/** @} */ - -/** @addtogroup HMAC_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle HMAC interrupt request. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - **************************************************************************************** - */ -void hal_hmac_irq_handler(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief Digest Done callback. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - **************************************************************************************** - */ -void hal_hmac_done_callback(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief HMAC error callback. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - **************************************************************************************** - */ -void hal_hmac_error_callback(hmac_handle_t *p_hmac); - -/** @} */ - -/** @defgroup HMAC_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief HMAC control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the HMAC. - (+) hal_hmac_get_state() API can be helpful to check in run-time the state of the HMAC peripheral. - (+) hal_hmac_get_error() check in run-time Errors occurring during communication. - (+) hal_hmac_set_timeout() set the timeout during internal process. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the HMAC handle state. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @retval ::HAL_HMAC_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_HMAC_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_HMAC_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_HMAC_STATE_ERROR: Peripheral in error. - * @retval ::HAL_HMAC_STATE_TIMEOUT: Peripheral in timeout. - * @retval ::HAL_HMAC_STATE_SUSPENDED: Peripheral in suspended. - **************************************************************************************** - */ -hal_hmac_state_t hal_hmac_get_state(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief Return the HMAC error code. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @return HMAC error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_hmac_get_error(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief Set the HMAC internal process timeout value. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration information - * for the specified HMAC module. - * @param[in] timeout: Internal process timeout value. - **************************************************************************************** - */ -void hal_hmac_set_timeout(hmac_handle_t *p_hmac, uint32_t timeout); - - -/** - **************************************************************************************** - * @brief Suspend some registers related to HMAC configuration before sleep. - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration - * information for the specified HMAC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_suspend_reg(hmac_handle_t *p_hmac); - -/** - **************************************************************************************** - * @brief Restore some registers related to HMAC configuration after sleep. - * This function must be used in conjunction with the hal_hmac_suspend_reg(). - * @param[in] p_hmac: Pointer to a HMAC handle which contains the configuration - * information for the specified HMAC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_hmac_resume_reg(hmac_handle_t *p_hmac); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_HMAC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2c.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2c.h deleted file mode 100755 index d014da8..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2c.h +++ /dev/null @@ -1,1178 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_i2c.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of I2C HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_I2C I2C - * @brief I2C HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_I2C_H__ -#define __GR55xx_HAL_I2C_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_i2c.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_I2C_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_I2C_state HAL I2C state - * @{ - */ - -/** - * @brief HAL I2C State Enumerations definition - * @note HAL I2C State value coding follow below described bitmap :\n - * @verbatim - b7-b6 Error information - 00 : No Error - 01 : Abort (Abort user request on going) - 10 : Timeout - 11 : Error - b5 IP initilisation status - 0 : Reset (IP not initialized) - 1 : init done (IP initialized and ready to use. HAL I2C init function called) - b4 (not used) - x : Should be set to 0 - b3 - 0 : Ready or Busy (No Listen mode ongoing) - 1 : Listen (IP in Address Listen Mode) - b2 Intrinsic process state - 0 : Ready - 1 : Busy (IP busy with some configuration or internal operations) - b1 Rx state - 0 : Ready (no Rx operation ongoing) - 1 : Busy (Rx operation ongoing) - b0 Tx state - 0 : Ready (no Tx operation ongoing) - 1 : Busy (Tx operation ongoing) - * @endverbatim - */ -typedef enum { - HAL_I2C_STATE_RESET = 0x00U, /**< Peripheral is not yet Initialized */ - HAL_I2C_STATE_READY = 0x20U, /**< Peripheral Initialized and ready for use */ - HAL_I2C_STATE_BUSY = 0x24U, /**< An internal process is ongoing */ - HAL_I2C_STATE_BUSY_TX = 0x21U, /**< Data Transmission process is ongoing */ - HAL_I2C_STATE_BUSY_RX = 0x22U, /**< Data Reception process is ongoing */ - HAL_I2C_STATE_LISTEN = 0x28U, /**< Address Listen Mode is ongoing */ - HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /**< Address Listen Mode and Data Transmission - process is ongoing */ - HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /**< Address Listen Mode and Data Reception - process is ongoing */ - HAL_I2C_STATE_ABORT = 0x60U, /**< Abort user request ongoing */ - HAL_I2C_STATE_TIMEOUT = 0xA0U, /**< Timeout state */ - HAL_I2C_STATE_ERROR = 0xE0U /**< Error */ -} hal_i2c_state_t; -/** @} */ - -/** @defgroup HAL_I2C_mode HAL I2C mode - * @{ - */ - -/** - * @brief HAL I2C Mode Enumerations definition - * @note HAL I2C Mode value coding follow below described bitmap :\n - * @verbatim - b7 (not used) - x : Should be set to 0 - b6 - 0 : None - 1 : Memory (HAL I2C communication is in Memory Mode) - b5 - 0 : None - 1 : Slave (HAL I2C communication is in Slave Mode) - b4 - 0 : None - 1 : Master (HAL I2C communication is in Master Mode) - b3-b2-b1-b0 (not used) - xxxx : Should be set to 0000 - * @endverbatim - */ -typedef enum { - HAL_I2C_MODE_NONE = 0x00U, /**< No I2C communication on going */ - HAL_I2C_MODE_MASTER = 0x10U, /**< I2C communication is in Master Mode */ - HAL_I2C_MODE_SLAVE = 0x20U, /**< I2C communication is in Slave Mode */ - HAL_I2C_MODE_MEM = 0x40U /**< I2C communication is in Memory Mode */ -} hal_i2c_mode_t; -/** @} */ - -/** @} */ - - -/** @addtogroup HAL_I2C_STRUCTURES Structures - * @{ - */ - -/** @defgroup I2C_Configuration I2C Configuration - * @{ - */ - -/** - * @brief I2C Configuration Structure definition - */ -typedef struct _i2c_init { - uint32_t speed; /**< Specifies the I2C transfer speed. - This parameter can be a value of @ref I2C_Speed */ - - uint32_t own_address; /**< Specifies the device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint32_t addressing_mode; /**< Specifies if 7-bit or 10-bit addressing mode is selected. - This parameter can be a value of @ref I2C_Addressing_Mode */ - - uint32_t general_call_mode; /**< Specifies if general call mode is selected. - This parameter can be a value of @ref I2C_General_Call_Addressing_Mode */ -} i2c_init_t; -/** @} */ - -/** @defgroup I2C_handle I2C handle - * @{ - */ - -/** - * @brief I2C handle Structure definition - */ -typedef struct _i2c_handle { - i2c_regs_t *p_instance; /**< I2C registers base address */ - - i2c_init_t init; /**< I2C communication parameters */ - - uint8_t *p_buffer; /**< Pointer to I2C transfer buffer */ - - uint16_t xfer_size; /**< I2C transfer size */ - - __IO uint16_t xfer_count; /**< I2C transfer counter */ - - __IO uint16_t master_ack_count; /**< I2C master acknowledge counter in master receive progress */ - - __IO uint32_t xfer_options; /**< I2C sequantial transfer options, this parameter can - be a value of @ref I2C_XferOptions */ - - __IO uint32_t previous_state; /**< I2C communication Previous state */ - - hal_status_t(*xfer_isr)(struct _i2c_handle *p_i2c, uint32_t it_source, uint32_t abort_sources); - /**< I2C transfer IRQ handler function pointer */ - - dma_handle_t *p_dmatx; /**< I2C Tx DMA handle parameters */ - - dma_handle_t *p_dmarx; /**< I2C Rx DMA handle parameters */ - - hal_lock_t lock; /**< I2C locking object */ - - __IO hal_i2c_state_t state; /**< I2C communication state */ - - __IO hal_i2c_mode_t mode; /**< I2C communication mode */ - - __IO uint32_t error_code; /**< I2C Error code */ - - uint32_t retention[10]; /**< I2C important register information. */ -} i2c_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_I2C_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_I2C_Callback Callback - * @{ - */ - -/** - * @brief HAL_I2C Callback function definition - */ - -typedef struct _hal_i2c_callback { - void (*i2c_msp_init)(i2c_handle_t *p_i2c); /**< I2C init MSP callback */ - void (*i2c_msp_deinit)(i2c_handle_t *p_i2c); /**< I2C de-init MSP callback */ - void (*i2c_master_tx_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C master tx transfer completed callbac */ - void (*i2c_master_rx_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C master rx transfer completed callback */ - void (*i2c_slave_tx_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C slave tx transfer completed callback */ - void (*i2c_slave_rx_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C slave rx transfer completed callback */ - void (*i2c_listen_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C listen Complete callback */ - void (*i2c_mem_tx_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C mem tx transfer completed callback */ - void (*i2c_mem_rx_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C mem rx transfer completed callback */ - void (*i2c_error_callback)(i2c_handle_t *p_i2c); /**< I2C error callback */ - void (*i2c_abort_cplt_callback)(i2c_handle_t *p_i2c); /**< I2C abort completed callback */ -} hal_i2c_callback_t; - -/** @} */ - -/** @} */ - -/** @defgroup HAL_I2C_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2C_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_Error_Code_definition I2C Error Code definition - * @{ - */ -#define HAL_I2C_ERROR_NONE (0x00000000U) /**< No error */ -#define HAL_I2C_ERROR_ARB_LOST (0x00000002U) /**< Arbitration lost error */ -#define HAL_I2C_ERROR_NOACK (0x00000004U) /**< No acknowledge error */ -#define HAL_I2C_ERROR_OVER (0x00000008U) /**< RX_OVER error */ -#define HAL_I2C_ERROR_DMA (0x00000010U) /**< DMA transfer error */ -#define HAL_I2C_ERROR_TIMEOUT (0x00000020U) /**< Timeout error */ -/** @} */ - -/** @defgroup I2C_Speed I2C Transfer Speed - * @{ - */ -#define I2C_SPEED_100K LL_I2C_SPEED_100K /**< Standard speed. */ -#define I2C_SPEED_400K LL_I2C_SPEED_400K /**< Fast speed. */ -#define I2C_SPEED_1000K LL_I2C_SPEED_1000K /**< Fast Plus speed. */ -#define I2C_SPEED_2000K LL_I2C_SPEED_2000K /**< High speed. */ -/** @} */ - -/** @defgroup I2C_Addressing_Mode I2C Addressing Mode - * @{ - */ -#define I2C_ADDRESSINGMODE_7BIT (0x00000001U) /**< 7-bit addressing mode. */ -#define I2C_ADDRESSINGMODE_10BIT (0x00000002U) /**< 10-bit addressing mode. */ -/** @} */ - -/** @defgroup I2C_General_Call_Addressing_Mode I2C General Call Addressing Mode - * @{ - */ -#define I2C_GENERALCALL_DISABLE (0x00000000U) /**< General call mode disable. */ -#define I2C_GENERALCALL_ENABLE (0x00000001U) /**< General call mode enable. */ -/** @} */ - -/** @defgroup I2C_Mmmeory_Address_Size I2C Memory Address Size - * @{ - */ -#define I2C_MEMADD_SIZE_8BIT (0x00000001U) /**< 8-bit memory address. */ -#define I2C_MEMADD_SIZE_16BIT (0x00000002U) /**< 16-bit memory address. */ -/** @} */ - -/** @defgroup I2C_XferOptions I2C Sequential Transfer Options - * @{ - */ -#define I2C_FIRST_FRAME (0x00000000U) /**< First transfer frame. */ -#define I2C_FIRST_AND_NEXT_FRAME (0x00000001U) /**< First and next transfer frames. */ -#define I2C_NEXT_FRAME (0x00000002U) /**< Next transfer frame. */ -#define I2C_FIRST_AND_LAST_FRAME (0x00000003U) /**< First and last transfer frames. */ -#define I2C_LAST_FRAME (0x00000004U) /**< Last transfer frame. */ -/** @} */ - -/** - * @brief I2C InitStruct default configuartion - */ -#define I2C_DEFAULT_CONFIG \ -{ \ - .speed = I2C_SPEED_400K, \ - .own_address = 0x55U, \ - .addressing_mode = I2C_ADDRESSINGMODE_7BIT, \ - .general_call_mode = I2C_GENERALCALL_DISABLE, \ -} - -/** @} */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup I2C_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @brief Reset I2C handle state. - * @param __HANDLE__ Specifies the I2C Handle. - * @retval None - */ -#define HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_I2C_STATE_RESET) -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Macro I2C Private Macros - * @{ - */ - -/** - * @brief Check if the I2C speed is valid. - * @param __SPEED__ I2C transfer speed. - * @retval SET (__SPEED__ is valid) or RESET (__SPEED__ is invalid) - */ -#define IS_I2C_SPEED(__SPEED__) (((__SPEED__) == I2C_SPEED_100K) || \ - ((__SPEED__) == I2C_SPEED_400K) || \ - ((__SPEED__) == I2C_SPEED_1000K) || \ - ((__SPEED__) == I2C_SPEED_2000K)) - -/** - * @brief Check if the I2C addressing mode is valid. - * @param __MODE__ I2C addressing mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_I2C_ADDRESSING_MODE(__MODE__) (((__MODE__) == I2C_ADDRESSINGMODE_7BIT) || \ - ((__MODE__) == I2C_ADDRESSINGMODE_10BIT)) - -/** - * @brief Check if the I2C general call mode is valid. - * @param __CALL__ I2C general call mode. - * @retval SET (__CALL__ is valid) or RESET (__CALL__ is invalid) - */ -#define IS_I2C_GENERAL_CALL(__CALL__) (((__CALL__) == I2C_GENERALCALL_DISABLE) || \ - ((__CALL__) == I2C_GENERALCALL_ENABLE)) - -/** - * @brief Check if the I2C memory address size is valid. - * @param __SIZE__ I2C memory address size. - * @retval SET (__SIZE__ is valid) or RESET (__SIZE__ is invalid) - */ -#define IS_I2C_MEMADD_SIZE(__SIZE__) (((__SIZE__) == I2C_MEMADD_SIZE_8BIT) || \ - ((__SIZE__) == I2C_MEMADD_SIZE_16BIT)) - -/** - * @brief Check if the I2C transfer request command is valid. - * @param __REQUEST__ I2C transfer request command. - * @retval SET (__REQUEST__ is valid) or RESET (__REQUEST__ is invalid) - */ -#define IS_TRANSFER_REQUEST(__REQUEST__) (((__REQUEST__) == I2C_CMD_SLV_NONE) || \ - ((__REQUEST__) == I2C_CMD_MST_WRITE) || \ - ((__REQUEST__) == I2C_CMD_MST_READ) || \ - ((__REQUEST__) == I2C_CMD_MST_GEN_STOP) || \ - ((__REQUEST__) == I2C_CMD_MST_GEN_RESTART)) - -/** - * @brief Check if the I2C transfer options request is valid. - * @param __REQUEST__ I2C transfer options request. - * @retval SET (__REQUEST__ is valid) or RESET (__REQUEST__ is invalid) - */ -#define IS_I2C_TRANSFER_OPTIONS_REQUEST(__REQUEST__) (((__REQUEST__) == I2C_FIRST_FRAME) || \ - ((__REQUEST__) == I2C_FIRST_AND_NEXT_FRAME) || \ - ((__REQUEST__) == I2C_NEXT_FRAME) || \ - ((__REQUEST__) == I2C_FIRST_AND_LAST_FRAME) || \ - ((__REQUEST__) == I2C_LAST_FRAME)) - -/** - * @brief Check if the I2C slave address is valid. - * @param __ADDRESS__ I2C slave address. - * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid) - */ -#define IS_I2C_SLV_ADDRESS(__ADDRESS__) ((__ADDRESS__) < 0x03FFU) - -/** - * @brief Check if the I2C own address is valid. - * @param __ADDRESS__ I2C own address. - * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid) - */ -#define IS_I2C_OWN_ADDRESS(__ADDRESS__) ((((__ADDRESS__) > 0x0007U) && ((__ADDRESS__) < 0x0078U)) || \ - (((__ADDRESS__) > 0x007FU) && ((__ADDRESS__) < 0x03FFU))) - -/** - * @brief Get the Most Significant 8 Bits of memory address. - * @param __ADDRESS__ Memory address. - * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid) - */ -#define I2C_MEM_ADD_MSB(__ADDRESS__) \ - ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U))) - -/** - * @brief Get the Least Significant 8 Bits of memory address. - * @param __ADDRESS__ Memory address. - * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid) - */ -#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU)))) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_I2C_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * @verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the I2Cx peripheral. - - (+) User must Implement hal_i2c_msp_init() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_i2c_init() to configure the selected device with - the selected configuration: - (++) Speed - (++) Own Address - (++) Addressing mode (Master, Slave) - (++) General call mode - - (+) Call the function hal_i2c_deinit() to restore the default configuration - of the selected I2Cx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initializes the I2C according to the specified parameters - * in the i2c_init_t and initialize the associated handle. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration - * information for the specified I2C. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_init(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief De-initialize the I2C peripheral. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_deinit(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Initialize the I2C MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_msp_init could be implemented in the user file. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_msp_init(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief De-initialize the I2C MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_msp_deinit could be implemented in the user file. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_msp_deinit(i2c_handle_t *p_i2c); - -/** @} */ - -/** @addtogroup I2C_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2C data - transfers. - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - - (#) Blocking mode functions are : - (++) hal_i2c_master_transmit() - (++) hal_i2c_master_receive() - (++) hal_i2c_slave_transmit() - (++) hal_i2c_slave_receive() - (++) hal_i2c_mem_write() - (++) hal_i2c_mem_read() - (++) hal_i2c_is_device_ready() - - (#) No-Blocking mode functions with Interrupt are : - (++) hal_i2c_master_transmit_it() - (++) hal_i2c_master_receive_it() - (++) hal_i2c_slave_transmit_it() - (++) hal_i2c_slave_receive_it() - (++) hal_i2c_mem_write_it() - (++) hal_i2c_mem_read_it() - - (#) No-Blocking mode functions with DMA are : - (++) hal_i2c_master_transmit_dma() - (++) hal_i2c_master_recevice_dma() - (++) hal_i2c_slave_transmit_dma() - (++) hal_i2c_slave_receive_dma() - (++) hal_i2c_mem_write_dma() - (++) hal_i2c_mem_read_dma() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) hal_i2c_mem_tx_cplt_callback() - (++) hal_i2c_mem_rx_cplt_callback() - (++) hal_i2c_master_tx_cplt_callback() - (++) hal_i2c_master_rx_cplt_callback() - (++) hal_i2c_slave_tx_cplt_callback() - (++) hal_i2c_slave_rx_cplt_callback()() - (++) hal_i2c_error_callback() - -@endverbatim - * @{ - */ - -/******* Blocking mode: Polling */ - -/** - **************************************************************************************** - * @brief Transmits in master mode an amount of data in blocking mode. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_transmit(i2c_handle_t *p_i2c, uint16_t dev_address, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receives in master mode an amount of data in blocking mode. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - * @note This function will return HAL_OK even if the length of data sent by slave is - * less than the expected Size. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_receive(i2c_handle_t *p_i2c, uint16_t dev_address, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmits in slave mode an amount of data in blocking mode. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_transmit(i2c_handle_t *p_i2c, uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive in slave mode an amount of data in blocking mode - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_receive(i2c_handle_t *p_i2c, uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Write an amount of data in blocking mode to a specific memory address - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_mem_write(i2c_handle_t *p_i2c, uint16_t dev_address, uint16_t mem_address, uint16_t mem_addr_size, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Read an amount of data in blocking mode from a specific memory address - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_mem_read(i2c_handle_t *p_i2c, uint16_t dev_address, uint16_t mem_address, uint16_t mem_addr_size, - uint8_t *p_data, uint16_t size, uint32_t timeout); - -/******* Non-Blocking mode: Interrupt */ - -/** - **************************************************************************************** - * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_transmit_it(i2c_handle_t *p_i2c, uint16_t dev_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_receive_it(i2c_handle_t *p_i2c, uint16_t dev_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_transmit_it(i2c_handle_t *p_i2c, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_receive_it(i2c_handle_t *p_i2c, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_mem_write_it(i2c_handle_t *p_i2c, uint16_t dev_address, uint16_t mem_address, - uint16_t mem_addr_size, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_mem_read_it(i2c_handle_t *p_i2c, uint16_t dev_address, uint16_t mem_address, - uint16_t mem_addr_size, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Sequentially transmit in master I2C mode an amount of data in non-blocking mode with Interrupt. - * @note This interface allows to manage repeated start condition when a direction changes during transfer - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] xfer_options: Options of Transfer, value of @ref I2C_XferOptions - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_sequential_transmit_it(i2c_handle_t *p_i2c, uint16_t dev_address, uint8_t *p_data, - uint16_t size, uint32_t xfer_options); - -/** - **************************************************************************************** - * @brief Sequentially receive in master I2C mode an amount of data in non-blocking mode with Interrupt - * @note This interface allows to manage repeated start condition when a direction changes during transfer - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] xfer_options: Options of Transfer, value of @ref I2C_XferOptions - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_sequential_receive_it(i2c_handle_t *p_i2c, uint16_t dev_address, uint8_t *p_data, - uint16_t size, uint32_t xfer_options); - -/** - **************************************************************************************** - * @brief Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] xfer_options: Options of Transfer, value of @ref I2C_XferOptions - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_sequential_transmit_it(i2c_handle_t *p_i2c, uint8_t *p_data, - uint16_t size, uint32_t xfer_options); - -/** - **************************************************************************************** - * @brief Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent - * @param[in] xfer_options: Options of Transfer, value of @ref I2C_XferOptions - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_sequential_receive_it(i2c_handle_t *p_i2c, uint8_t *p_data, - uint16_t size, uint32_t xfer_options); - -/** - **************************************************************************************** - * @brief Enable the Master Read Request listen mode with Interrupt. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_enable_listen_it(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Disable the Master Read Request listen mode with Interrupt. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_disable_listen_it(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Abort a master I2C IT or DMA process communication with Interrupt. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_abort_it(i2c_handle_t *p_i2c); - -/******* Non-Blocking mode: DMA */ - -/** - **************************************************************************************** - * @brief Transmit in master mode an amount of data in non-blocking mode with DMA - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_transmit_dma(i2c_handle_t *p_i2c, uint16_t dev_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Receive in master mode an amount of data in non-blocking mode with DMA - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_master_receive_dma(i2c_handle_t *p_i2c, uint16_t dev_address, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_transmit_dma(i2c_handle_t *p_i2c, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Receive in slave mode an amount of data in non-blocking mode with DMA - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_slave_receive_dma(i2c_handle_t *p_i2c, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_mem_write_dma(i2c_handle_t *p_i2c, uint16_t dev_address, uint16_t mem_address, - uint16_t mem_addr_size, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @param[in] dev_address: The device 7 bits address value in datasheet must be shifted at right before call interface - * @param[in] mem_address: Internal memory address - * @param[in] mem_addr_size: Size of internal memory address - * @param[in] p_data: Pointer to data buffer - * @param[in] size: Amount of data to be sent, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_mem_read_dma(i2c_handle_t *p_i2c, uint16_t dev_address, uint16_t mem_address, - uint16_t mem_addr_size, uint8_t *p_data, uint16_t size); - -/** @} */ - -/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief This function handles I2C event interrupt request. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_irq_handler(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Master Tx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_master_tx_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_master_tx_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Master Rx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_master_rx_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_master_rx_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Slave Tx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_slave_tx_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_slave_tx_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Slave Rx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_slave_rx_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_slave_rx_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Memory Tx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_mem_tx_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_mem_tx_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Memory Rx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_mem_rx_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_mem_rx_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Listen Complete callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_listen_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_listen_cplt_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief I2C error callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_error_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_error_callback(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief I2C abort callback. - * @note This function should not be modified. When the callback is needed, - * the hal_i2c_abort_cplt_callback can be implemented in the user file - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - **************************************************************************************** - */ -void hal_i2c_abort_cplt_callback(i2c_handle_t *p_i2c); - -/** @} */ - -/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @brief Peripheral State, Mode and Error functions - * -@verbatim - =============================================================================== - ##### Peripheral State, Mode and Error functions ##### - =============================================================================== - [..] - This subsection permit to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the I2C handle state. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @retval ::HAL_I2C_STATE_RESET: Peripheral is not yet Initialized. - * @retval ::HAL_I2C_STATE_READY: Peripheral Initialized and ready for use. - * @retval ::HAL_I2C_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_I2C_STATE_BUSY_TX: Data Transmission process is ongoing. - * @retval ::HAL_I2C_STATE_BUSY_RX: Data Reception process is ongoing. - * @retval ::HAL_I2C_STATE_LISTEN: Address Listen Mode is ongoing. - * @retval ::HAL_I2C_STATE_BUSY_TX_LISTEN: Address Listen Mode and Data Transmission process is ongoing. - * @retval ::HAL_I2C_STATE_BUSY_RX_LISTEN: Address Listen Mode and Data Reception process is ongoing. - * @retval ::HAL_I2C_STATE_ABORT: Abort user request ongoing. - * @retval ::HAL_I2C_STATE_TIMEOUT: Timeout state. - * @retval ::HAL_I2C_STATE_ERROR: Error. - **************************************************************************************** - */ -hal_i2c_state_t hal_i2c_get_state(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Returns the I2C Master, Slave, Memory or no mode. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @retval ::HAL_I2C_MODE_NONE: No I2C communication on going. - * @retval ::HAL_I2C_MODE_MASTER: I2C communication is in Master Mode. - * @retval ::HAL_I2C_MODE_SLAVE: I2C communication is in Slave Mode. - * @retval ::HAL_I2C_MODE_MEM: I2C communication is in Memory Mode. - **************************************************************************************** - */ -hal_i2c_mode_t hal_i2c_get_mode(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Return the I2C error code. - * @param[in] p_i2c: Pointer to an I2C handle which contains the configuration information for the specified I2C. - * @return I2C Error Code - **************************************************************************************** - */ -uint32_t hal_i2c_get_error(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Suspend some registers related to I2C configuration before sleep. - * @param[in] p_i2c: Pointer to a I2C handle which contains the configuration - * information for the specified I2C module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_suspend_reg(i2c_handle_t *p_i2c); - -/** - **************************************************************************************** - * @brief Restore some registers related to I2C configuration after sleep. - * This function must be used in conjunction with the hal_i2c_suspend_reg(). - * @param[in] p_i2c: Pointer to a I2C handle which contains the configuration - * information for the specified I2C module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2c_resume_reg(i2c_handle_t *p_i2c); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_I2C_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2s.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2s.h deleted file mode 100755 index 500750d..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_i2s.h +++ /dev/null @@ -1,951 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_i2s.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of I2S HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_I2S I2S - * @brief I2S HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_I2S_H__ -#define __GR55xx_HAL_I2S_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_i2s.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_I2S_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_I2S_state HAL I2S state - * @{ - */ - -/** - * @brief HAL I2S State Enumerations definition - */ -typedef enum { - HAL_I2S_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_I2S_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_I2S_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_I2S_STATE_BUSY_TX = 0x12, /**< Data Transmission process is ongoing */ - HAL_I2S_STATE_BUSY_RX = 0x22, /**< Data Reception process is ongoing */ - HAL_I2S_STATE_BUSY_TX_RX = 0x32, /**< Data Transmission and Reception process is ongoing */ - HAL_I2S_STATE_ABORT = 0x08, /**< Peripheral with abort request ongoing */ - HAL_I2S_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_i2s_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_I2S_STRUCTURES Structures - * @{ - */ - -/** @defgroup I2S_Configuration I2S Configuration - * @{ - */ - -/** - * @brief I2S init Structure definition - */ -typedef struct _i2s_init { - uint32_t data_size; /**< Specifies the data size for I2S communication. - This parameter can be a value of @ref I2S_Data_Size */ - - uint32_t clock_source; /**< Specifies the source of the I2S clock. - This parameter can be a value of @ref I2S_Clock_Source */ - - uint32_t audio_freq; /**< Specifies the frequency selected for the I2S communication. - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ -#if I2S_CHANNEL_NUM > 1 - uint32_t channel_active; /**< Specifies the active channels for I2S communication. - This parameter can be one or more value of @ref I2S_Channel */ -#endif -} i2s_init_t; -/** @} */ - -/** @defgroup I2S_handle I2S handle - * @{ - */ - -/** - * @brief I2S handle Structure definition - */ -typedef struct _i2s_handle { - i2s_regs_t *p_instance; /**< I2S registers base address */ - - i2s_init_t init; /**< I2S communication parameters */ - - uint16_t *p_tx_buffer; /**< Pointer to I2S TX transfer Buffer */ - - __IO uint32_t tx_xfer_size; /**< I2S TX Transfer size */ - - __IO uint32_t tx_xfer_count; /**< I2S TX Transfer Counter */ - - uint16_t *p_rx_buffer; /**< Pointer to I2S RX transfer Buffer */ - - __IO uint32_t rx_xfer_size; /**< I2S RX Transfer size */ - - __IO uint32_t rx_xfer_count; /**< I2S RX Transfer Counter */ - - void (*write_fifo)(struct _i2s_handle *p_i2s); /**< Pointer to I2S Tx transfer FIFO write function */ - - void (*read_fifo)(struct _i2s_handle *p_i2s); /**< Pointer to I2S Rx transfer FIFO read function */ - - dma_handle_t *p_dmatx; /**< I2S TX DMA Handle parameters */ - - dma_handle_t *p_dmarx; /**< I2S RX DMA Handle parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_i2s_state_t state; /**< I2S communication state */ - - __IO uint32_t error_code; /**< I2S Error code */ - - uint32_t timeout; /**< Timeout for the I2S memory access */ - - uint32_t retention[7]; /**< I2S important register information. */ -} i2s_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_I2S_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_I2S_Callback Callback - * @{ - */ - -/** - * @brief HAL_I2S Callback function definition - */ - -typedef struct _hal_i2s_callback { - void (*i2s_msp_init)(i2s_handle_t *p_i2s); /**< I2S init MSP callback */ - void (*i2s_msp_deinit)(i2s_handle_t *p_i2s); /**< I2S de-init MSP callback */ - void (*i2s_error_callback)(i2s_handle_t *p_i2s); /**< I2S error callback */ - void (*i2s_rx_cplt_callback)(i2s_handle_t *p_i2s); /**< I2S rx transfer completed callback */ - void (*i2s_tx_cplt_callback)(i2s_handle_t *p_i2s); /**< I2S tx transfer completed callbac */ - void (*i2s_tx_rx_cplt_callback)(i2s_handle_t *p_i2s); /**< I2S tx/rx transfer completed callback */ -} hal_i2s_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_I2S_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2S_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_Direction I2S Direction - * @{ - */ -#define I2S_DIRECTION_FULL_DUPLEX LL_I2S_FULL_DUPLEX /**< Full Duplex: Transmit & Receive */ -#define I2S_DIRECTION_SIMPLEX_TX LL_I2S_SIMPLEX_TX /**< Simplex TX: Transmit only */ -#define I2S_DIRECTION_SIMPLEX_RX LL_I2S_SIMPLEX_RX /**< Simplex RX: Receive only */ -/** @} */ - -/** @defgroup I2S_Error_Code I2S Error Code - * @{ - */ -#define HAL_I2S_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_I2S_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_I2S_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_I2S_ERROR_DMA ((uint32_t)0x00000004) /**< DMA transfer error */ -#define HAL_I2S_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameters error */ -/** @} */ - -/** @defgroup I2S_Data_Size I2S Data Size - * @{ - */ -#define I2S_DATASIZE_12BIT LL_I2S_DATASIZE_12BIT /**< 12-bit serial data transfer */ -#define I2S_DATASIZE_16BIT LL_I2S_DATASIZE_16BIT /**< 16-bit serial data transfer */ -#define I2S_DATASIZE_20BIT LL_I2S_DATASIZE_20BIT /**< 20-bit serial data transfer */ -#define I2S_DATASIZE_24BIT LL_I2S_DATASIZE_24BIT /**< 24-bit serial data transfer */ -#define I2S_DATASIZE_32BIT LL_I2S_DATASIZE_32BIT /**< 32-bit serial data transfer */ -/** @} */ - -/** @defgroup I2S_Clock_Source I2S Clock Source - * @{ - */ -#define I2S_CLOCK_SRC_96M LL_I2S_CLOCK_SRC_96M /**< Inactive state of SCLK is low */ -#define I2S_CLOCK_SRC_32M LL_I2S_CLOCK_SRC_32M /**< Inactive state of SCLK is high */ -/** @} */ - -/** @defgroup I2S_FIFO_LEVEL_MAX I2S FIFO Level Max - * @{ - */ -#define I2S_TX_FIFO_LEVEL_MAX 16 /**< I2S TX FIFO Level Max Value */ -#define I2S_RX_FIFO_LEVEL_MAX 16 /**< I2S RX FIFO Level Max Value */ -/** @} */ - -/** @defgroup I2S_Flags_definition I2S Flags Definition - * @{ - */ -#define I2S_FLAG_TXFO LL_I2S_STATUS_TXFO /**< TX FIFO write overflow flag */ -#define I2S_FLAG_TXFE LL_I2S_STATUS_TXFE /**< TX FIFO empty trigger flag */ -#define I2S_FLAG_RXFO LL_I2S_STATUS_RXFO /**< RX FIFO receive overflow flag */ -#define I2S_FLAG_RXDA LL_I2S_STATUS_RXDA /**< RX FIFO data available flag */ -/** @} */ - -/** @defgroup I2S_Interrupt_definition I2S Interrupt Definition - * @{ - */ -#define I2S_IT_TXFO LL_I2S_INT_TXFO /**< TX FIFO write overflow interrupt */ -#define I2S_IT_TXFE LL_I2S_INT_TXFE /**< TX FIFO empty trigger interrupt */ -#define I2S_IT_RXFO LL_I2S_INT_RXFO /**< RX FIFO receive overflow interrupt */ -#define I2S_IT_RXDA LL_I2S_INT_RXDA /**< RX FIFO data available interrupt */ -/** @} */ - -/** @defgroup I2S_Timeout_definition I2S Timeout_definition - * @{ - */ -#define HAL_I2S_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2S_Exported_Macros I2S Exported Macros - * @{ - */ - -/** @brief Reset I2S handle states. - * @param __HANDLE__ I2S handle. - * @retval None - */ -#define HAL_I2S_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_I2S_STATE_RESET) - -/** @brief Enable the specified I2S peripheral. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->ENABLE, I2S_ENABLE_EN) - -/** @brief Disable the specified I2S peripheral. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->ENABLE, I2S_ENABLE_EN) - -/** @brief Enable the specified I2S clock. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_ENABLE_CLOCK(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CLKEN, I2S_CLKEN_EN) - -/** @brief Disable the specified I2S clock. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_DISABLE_CLOCK(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CLKEN, I2S_CLKEN_EN) - -/** @brief Enable the specified I2S transmitter block. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_ENABLE_TX_BLOCK(__HANDLE__) ll_i2s_enable_txblock((__HANDLE__)->p_instance) - -/** @brief Disable the specified I2S transmitter block. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_DISABLE_TX_BLOCK(__HANDLE__) ll_i2s_disable_txblock((__HANDLE__)->p_instance) - -/** @brief Enable the specified I2S receiver block. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_ENABLE_RX_BLOCK(__HANDLE__) ll_i2s_enable_rxblock((__HANDLE__)->p_instance) - -/** @brief Disable the specified I2S receiver block. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_DISABLE_RX_BLOCK(__HANDLE__) ll_i2s_disable_rxblock((__HANDLE__)->p_instance) - -/** @brief Enable the specified I2S transmitter channel. - * @param __HANDLE__ Specifies the I2S Handle. - * @param __CH__ Specifies the I2S channel. - * @retval None - */ -#define HAL_I2S_ENABLE_TX_CHANNEL(__HANDLE__, __CH__) ll_i2s_enable_tx((__HANDLE__)->p_instance, (__CH__)) - -/** @brief Disable the specified I2S transmitter channel. - * @param __HANDLE__ Specifies the I2S Handle. - * @param __CH__ Specifies the I2S channel. - * @retval None - */ -#define HAL_I2S_DISABLE_TX_CHANNEL(__HANDLE__, __CH__) ll_i2s_disable_tx((__HANDLE__)->p_instance, (__CH__)) - -/** @brief Enable the specified I2S receiver channel. - * @param __HANDLE__ Specifies the I2S Handle. - * @param __CH__ Specifies the I2S channel. - * @retval None - */ -#define HAL_I2S_ENABLE_RX_CHANNEL(__HANDLE__, __CH__) ll_i2s_enable_rx((__HANDLE__)->p_instance, (__CH__)) - -/** @brief Disable the specified I2S receiver channel. - * @param __HANDLE__ Specifies the I2S Handle. - * @param __CH__ Specifies the I2S channel. - * @retval None - */ -#define HAL_I2S_DISABLE_RX_CHANNEL(__HANDLE__, __CH__) ll_i2s_disable_rx((__HANDLE__)->p_instance, (__CH__)) - -/** @brief Flush the I2S transmitter FIFO. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_FLUSH_TX_FIFO(__HANDLE__) ll_i2s_clr_txfifo_all((__HANDLE__)->p_instance) - -/** @brief Flush the I2S receiver FIFO. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_FLUSH_RX_FIFO(__HANDLE__) ll_i2s_clr_rxfifo_all((__HANDLE__)->p_instance) - -/** @brief Enable the I2S DMA Request. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_ENABLE_DMA(__HANDLE__) ll_i2s_enable_dma((__HANDLE__)->p_instance) - -/** @brief Disable the I2S DMA Request. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_DISABLE_DMA(__HANDLE__) ll_i2s_disable_dma((__HANDLE__)->p_instance) - -/** @brief Reset the I2S TX DMA request to the lowest enabled channel. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_RESET_TXDMA(__HANDLE__) WRITE_REG((__HANDLE__)->p_instance->TXDMA_RST, I2S_TXDMA_RST) - -/** @brief Reset the I2S RX DMA request to the lowest enabled channel. - * @param __HANDLE__ Specifies the I2S Handle. - * @retval None - */ -#define HAL_I2S_RESET_RXDMA(__HANDLE__) WRITE_REG((__HANDLE__)->p_instance->RXDMA_RST, I2S_RXDMA_RST) - -/** @brief Enable the specified I2S interrupts. - * @param __HANDLE__ Specifies the I2S Handle. - * @param __INTERRUPT__ Specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref I2S_IT_TXFO TX FIFO write overflow interrupt - * @arg @ref I2S_IT_TXFE TX FIFO empty trigger interrupt - * @arg @ref I2S_IT_RXFO RX FIFO receive overflow interrupt - * @arg @ref I2S_IT_RXDA RX FIFO data available interrupt - * @retval None - */ -#define HAL_I2S_ENABLE_IT(__HANDLE__, __INTERRUPT__) \ - CLEAR_BITS((__HANDLE__)->p_instance->I2S_CHANNEL[0].INTMASK, (__INTERRUPT__)) - -/** @brief Disable the specified I2S interrupts. - * @param __HANDLE__ Specifies the I2S handle. - * @param __INTERRUPT__ Specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref I2S_IT_TXFO TX FIFO write overflow interrupt - * @arg @ref I2S_IT_TXFE TX FIFO empty trigger interrupt - * @arg @ref I2S_IT_RXFO RX FIFO receive overflow interrupt - * @arg @ref I2S_IT_RXDA RX FIFO data available interrupt - * @retval None - */ -#define HAL_I2S_DISABLE_IT(__HANDLE__, __INTERRUPT__) \ - SET_BITS((__HANDLE__)->p_instance->I2S_CHANNEL[0].INTMASK, (__INTERRUPT__)) - -/** @brief Check whether the specified I2S flag is set or not. - * @param __HANDLE__ Specifies the I2S Handle. - * @param __FLAG__ Specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref I2S_FLAG_TXFO TX FIFO write overflow flag - * @arg @ref I2S_FLAG_TXFE TX FIFO empty trigger flag - * @arg @ref I2S_FLAG_RXFO RX FIFO receive overflow flag - * @arg @ref I2S_FLAG_RXDA RX FIFO data available flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_I2S_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->I2S_CHANNEL[0].INTSTAT, (__FLAG__)) != 0) ? SET : RESET) - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2S_Private_Macro I2S Private Macros - * @{ - */ - -/** @brief Check if I2S Direction Mode is valid. - * @param __MODE__ I2S Direction Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_I2S_DIRECTION(__MODE__) (((__MODE__) == I2S_DIRECTION_FULL_DUPLEX) || \ - ((__MODE__) == I2S_DIRECTION_SIMPLEX_TX) || \ - ((__MODE__) == I2S_DIRECTION_SIMPLEX_RX)) - -/** @brief Check if I2S Data Size is valid. - * @param __DATASIZE__ I2S Data Size. - * @retval SET (__DATASIZE__ is valid) or RESET (__DATASIZE__ is invalid) - */ -#define IS_I2S_DATASIZE(__DATASIZE__) (((__DATASIZE__) == I2S_DATASIZE_12BIT) || \ - ((__DATASIZE__) == I2S_DATASIZE_16BIT) || \ - ((__DATASIZE__) == I2S_DATASIZE_20BIT) || \ - ((__DATASIZE__) == I2S_DATASIZE_24BIT) || \ - ((__DATASIZE__) == I2S_DATASIZE_32BIT)) - -/** @brief Check if I2S Clock Polarity is valid. - * @param __CPOL__ I2S Clock Polarity. - * @retval SET (__CPOL__ is valid) or RESET (__CPOL__ is invalid) - */ -#define IS_I2S_CPOL(__CPOL__) (((__CPOL__) == I2S_POLARITY_LOW) || \ - ((__CPOL__) == I2S_POLARITY_HIGH)) - -/** @brief Check if I2S Audio Frequency is valid. - * @param __FREQUENCY__ I2S Audio Frequency. - * @retval SET (__FREQUENCY__ is valid) or RESET (__FREQUENCY__ is invalid) - */ -#define IS_I2S_AUDIO_FREQUENCY(__FREQUENCY__) (((__FREQUENCY__) > 0) && ((__FREQUENCY__) <= 1500000)) - -/** @brief Check if I2S FIFO Threshold is valid. - * @param __THR__ I2S FIFO Threshold. - * @retval SET (__THR__ is valid) or RESET (__THR__ is invalid) - */ -#define IS_I2S_FIFO_THRESHOLD(__THR__) (((__THR__) >= 0) && ((__THR__) <= I2S_TX_FIFO_LEVEL_MAX)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_I2S_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup I2S_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initializations functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the I2Sx peripheral. - - (+) User must implement hal_i2s_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_i2s_init() to configure the selected device with - the selected configuration: - (++) Data Size - (++) Clock Polarity - (++) Audio Frequency - - (+) Call the function hal_i2s_deinit() to restore the default configuration - of the selected I2Sx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the I2S according to the specified parameters - * in the i2s_init_t and initialize the associated handle. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_init(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief De-initialize the I2S peripheral. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_deinit(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Initialize the I2S MSP. - * @note This function should not be modified. When the callback is needed, - the hal_i2s_msp_deinit can be implemented in the user file. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_msp_init(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief De-initialize the I2S MSP. - * @note This function should not be modified. When the callback is needed, - the hal_i2s_msp_deinit can be implemented in the user file. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_msp_deinit(i2s_handle_t *p_i2s); - -/** @} */ - -/** @defgroup I2S_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2S - data transfers. - - [..] The I2S supports master and slave mode: - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The hal_i2s_tx_cplt_callback(), hal_i2s_rx_cplt_callback() and hal_i2s_tx_rx_cplt_callback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The hal_i2s_error_callback() user callback will be executed when a communication error is detected. - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1-Line (simplex) and 2-Line (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Transmit an amount of data in blocking mode. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in halfword, data of a channel. - * For example, when 32 bytes of data need to be sent in each of the left and right channels, length = 16. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_transmit(i2s_handle_t *p_i2s, uint16_t *p_data, uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive an amount of data in blocking mode. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be received in halfword, data of a channel. - * For example, when 32 bytes of data need to be sent in each of the left and right channels, length = 16. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_receive(i2s_handle_t *p_i2s, uint16_t *p_data, uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit and Receive an amount of data in blocking mode. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] length: Amount of data to be sent and received in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_transmit_receive(i2s_handle_t *p_i2s, uint16_t *p_tx_data, uint16_t *p_rx_data, - uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in non-blocking mode with Interrupt. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in halfword, data of a channel. - * For example, when 32 bytes of data need to be sent in each of the left and right channels, length = 16. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_transmit_it(i2s_handle_t *p_i2s, uint16_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Receive an amount of data in non-blocking mode with Interrupt. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in halfword, data of a channel. - * For example, when 32 bytes of data need to be sent in each of the left and right channels, length = 16. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_receive_it(i2s_handle_t *p_i2s, uint16_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified SPI module. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] length: Amount of data to be sent and received in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_transmit_receive_it(i2s_handle_t *p_i2s, uint16_t *p_tx_data, - uint16_t *p_rx_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in non-blocking mode with DMA. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in halfword, data of a channel, ranging between 1 and 4095. - * For example, when 32 bytes of data need to be sent in each of the left and right channels, length = 16. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_transmit_dma(i2s_handle_t *p_i2s, uint16_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Receive an amount of data in non-blocking mode with DMA. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in halfword, data of a channel, ranging between 1 and 4095. - * For example, when 32 bytes of data need to be sent in each of the left and right channels, length = 16. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_receive_dma(i2s_handle_t *p_i2s, uint16_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] length: Amount of data to be sent in bytes, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_transmit_receive_dma(i2s_handle_t *p_i2s, uint16_t *p_tx_data, - uint16_t *p_rx_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Start the I2S master clock. - * @note In case of SLAVE mode, this function will not take effect. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_start_clock(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Stop the I2S master clock. - * @note In case of SLAVE mode, this function will not take effect. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_stop_clock(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Abort ongoing transfer (blocking mode). - * @param[in] p_i2s: I2S handle. - * @note This procedure could be used for aborting any ongoing transfer (TX and RX), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable I2S Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode: When exiting function, Abort is considered as completed. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_abort(i2s_handle_t *p_i2s); - -/** @} */ - -/** @addtogroup I2S_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle I2S interrupt request. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_irq_handler(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief TX Transfer completed callback. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_tx_cplt_callback(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief RX Transfer completed callback. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_rx_cplt_callback(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief TX/RX Transfer completed callback. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_tx_rx_cplt_callback(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief I2S error callback. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - **************************************************************************************** - */ -void hal_i2s_error_callback(i2s_handle_t *p_i2s); - -/** @} */ - -/** @defgroup I2S_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief I2S control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the I2S. - (+) hal_i2s_get_state() API can be helpful to check in run-time the state of the I2S peripheral - (+) hal_i2s_get_error() check in run-time Errors occurring during communication - (+) hal_i2s_set_timeout() set the timeout during internal process - (+) hal_i2s_set_tx_fifo_threshold() set the TX FIFO Threshold - (+) hal_i2s_set_rx_fifo_threshold() set the RX FIFO Threshold - (+) hal_i2s_get_tx_fifo_threshold() get the TX FIFO Threshold - (+) hal_i2s_get_rx_fifo_threshold() get the RX FIFO Threshold -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the I2S handle state. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @retval ::HAL_I2S_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_I2S_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_I2S_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_I2S_STATE_BUSY_TX: Data Transmii2son process is ongoing. - * @retval ::HAL_I2S_STATE_BUSY_RX: Data Reception process is ongoing. - * @retval ::HAL_I2S_STATE_ABORT: Peripheral with abort request ongoing. - * @retval ::HAL_I2S_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_i2s_state_t hal_i2s_get_state(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Return the I2S error code. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @return I2S error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_i2s_get_error(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Set the TX FIFO threshold. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] threshold: TX FIFO threshold value ranging bwtween 0x0U ~ 0x7U. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_set_tx_fifo_threshold(i2s_handle_t *p_i2s, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Set the RX FIFO threshold. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @param[in] threshold: RX FIFO threshold value ranging bwtween 0x0U ~ 0x7U. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_set_rx_fifo_threshold(i2s_handle_t *p_i2s, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Get the TX FIFO threshold. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @return TX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_i2s_get_tx_fifo_threshold(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Get the RX FIFO threshold. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration information for the specified I2S module. - * @return RX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_i2s_get_rx_fifo_threshold(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Suspend some registers related to I2S configuration before sleep. - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration - * information for the specified I2S module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_suspend_reg(i2s_handle_t *p_i2s); - -/** - **************************************************************************************** - * @brief Restore some registers related to I2S configuration after sleep. - * This function must be used in conjunction with the hal_i2s_suspend_reg(). - * @param[in] p_i2s: Pointer to a I2S handle which contains the configuration - * information for the specified I2S module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_i2s_resume_reg(i2s_handle_t *p_i2s); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_I2S_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_iso7816.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_iso7816.h deleted file mode 100755 index a89e0f0..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_iso7816.h +++ /dev/null @@ -1,650 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_iso7816.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of ISO7816 HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_ISO7816 ISO7816 - * @brief ISO7816 HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_ISO7816_H__ -#define __GR55xx_HAL_ISO7816_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_iso7816.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_ISO7816_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_ISO7816_state HAL ISO7816 State - * @{ - */ -/** - * @brief HAL ISO7816 State Enumerations definition - */ -typedef enum { - HAL_ISO7816_STATE_RESET = 0x00U, /**< Peripheral not initialized */ - HAL_ISO7816_STATE_READY = 0x20U, /**< Peripheral initialized and ready for use */ - HAL_ISO7816_STATE_BUSY = 0x24U, /**< An internal process is ongoing */ - HAL_ISO7816_STATE_BUSY_TX = 0x21U, /**< Data Transmission process is ongoing */ - HAL_ISO7816_STATE_BUSY_RX = 0x22U, /**< Data Reception process is ongoing */ - HAL_ISO7816_STATE_BUSY_TX_RX = 0x23U, /**< Data Transmission and Reception process is ongoing */ - HAL_ISO7816_STATE_ABORT = 0x08U, /**< Peripheral with abort request ongoing */ - HAL_ISO7816_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */ - HAL_ISO7816_STATE_ERROR = 0xE0U /**< Peripheral in error */ -} hal_iso7816_state_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_ISO7816_STRUCTURES Structures - * @{ - */ - -/** @defgroup ISO7816_Configuration ISO7816 Configuration - * @{ - */ -/** - * @brief ISO7816_init_structure ISO7816 init structure definition - */ -typedef struct { - uint32_t clk_div; /*!< clk_div is used for dividing the system clock, - and ISO7816 output clock is equal to (system clock)/(clk_div+1). */ - uint32_t wait_time; /*!< Specifies the guard time value in terms of number of baud clocks */ - uint16_t guard_time; /*!< Specifies the maximum card response time (leading edge to leading edge) */ - uint8_t detect_coding; /*!< Specifies whether automatically detect coding convention during - ATR receiption. */ -} iso7816_init_t; -/** @} */ -/** @} */ - -/** @defgroup HAL_ISO7816_MACRO Defines - * @{ - */ -/** - * @brief ISO7816_default_config InitStruct default configuration - */ -#define ISO7816_DEFAULT_CONFIG \ -{ \ - .clk_div = 0x2F, \ - .wait_time = 0x6B, \ - .guard_time = 0x00, \ - .detect_coding = ENABLE, \ -} -/** @} */ - -/** @addtogroup HAL_ISO7816_STRUCTURES Structures - * @{ - */ -/** @defgroup ISO7816_handle Handle - * @{ - */ - -/** - * @brief ISO7816 handle Structure definition - */ -typedef struct _iso7816_handle_t { - iso7816_regs_t *p_instance; /**< ISO7816 registers base address */ - iso7816_init_t init; /**< ISO7816 configuration parameters */ - uint8_t *p_tx_rx_buffer; /**< Pointer to ISO7816 Tx&Rx transfer Buffer */ - uint16_t buffer_size; /**< ISO7816 Tx Transfer size */ - uint16_t tx_xfer_size; /**< ISO7816 Tx Transfer size */ - __IO uint16_t tx_xfer_count; /**< ISO7816 Tx Transfer Counter */ - uint16_t rx_xfer_size; /**< ISO7816 Rx Transfer size */ - __IO uint16_t rx_xfer_count; /**< ISO7816 Rx Transfer Counter */ - __IO hal_lock_t lock; /**< Locking object */ - __IO hal_iso7816_state_t state; /**< ISO7816 communication state */ - __IO hal_iso7816_state_t tx_state; /**< ISO7816 state information related to Tx operations. */ - __IO hal_iso7816_state_t rx_state; /**< ISO7816 state information related to Rx operations. */ - __IO uint32_t previous_action; /**< ISO7816 previous_action */ - __IO uint32_t error_code; /**< ISO7816 error code */ - uint32_t retention[6]; /**< ISO7816 important register information. */ -} iso7816_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_ISO7816_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup ISO7816_Callback ISO7816 Callback - * @{ - */ - -/** - * @brief HAL_ISO7816 Callback function definition - */ - -typedef struct _iso7816_callback { - void (*iso7816_msp_init)(iso7816_handle_t *p_iso7816); /**< ISO7816 init MSP callback */ - void (*iso7816_msp_deinit)(iso7816_handle_t *p_iso7816); /**< ISO7816 de-init MSP callback */ - void (*iso7816_error_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 error callback */ - void (*iso7816_abort_cplt_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 abort completed callback */ - void (*iso7816_presence_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 card presence state - changed callback */ - void (*iso7816_atr_cplt_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 reseive atr completed callback */ - void (*iso7816_tx_cplt_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 rx transfer completed callback */ - void (*iso7816_rx_cplt_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 tx transfer completed callback */ - void (*iso7816_tx_rx_cplt_callback)(iso7816_handle_t *p_iso7816); /**< ISO7816 tx/rx transfer - completed callback */ -} iso7816_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_ISO7816_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup ISO7816_Exported_Constants ISO7816 Exported Constants - * @{ - */ - -/** @defgroup ISO7816_ACTION Action state - * @{ - */ -#define HAL_ISO7816_ACTION_NONE LL_ISO7816_ACTION_NONE /**< Do Nothing. */ -#define HAL_ISO7816_ACTION_OFF LL_ISO7816_ACTION_OFF /**< Switch Off. */ -#define HAL_ISO7816_ACTION_STOPCLK LL_ISO7816_ACTION_STOPCLK /**< Stop the clock. */ -#define HAL_ISO7816_ACTION_ON LL_ISO7816_ACTION_ON /**< Switch on and receive ATR. */ -#define HAL_ISO7816_ACTION_WARMRST LL_ISO7816_ACTION_WARMRST /**< Trigger warm reset and receive ATR. */ -#define HAL_ISO7816_ACTION_RX LL_ISO7816_ACTION_RX /**< Receive. */ -#define HAL_ISO7816_ACTION_TX LL_ISO7816_ACTION_TX /**< Transmit. */ -#define HAL_ISO7816_ACTION_TXRX LL_ISO7816_ACTION_TXRX /**< Transmit, followed by RX. */ -/** @} */ - -/** @defgroup ISO7816_Interrupt_definition ISO7816 Interrupt Definition - * @{ - */ -#define HAL_ISO7816_INTR_TEST LL_ISO7816_INTR_TEST /**< Test interrupt */ -#define HAL_ISO7816_INTR_PRESENCE LL_ISO7816_INTR_PRESENCE /**< Source presence interrupt */ -#define HAL_ISO7816_INTR_STATE_ERR LL_ISO7816_INTR_STATE_ERR /**< Source state error interrupt */ -#define HAL_ISO7816_INTR_DMA_ERR LL_ISO7816_INTR_DMA_ERR /**< Source dma error interrupt */ -#define HAL_ISO7816_INTR_RETRY_ERR LL_ISO7816_INTR_RETRY_ERR /**< Source retry error interrupt */ -#define HAL_ISO7816_INTR_RX_ERR LL_ISO7816_INTR_RX_ERR /**< Source rx error interrupt */ -#define HAL_ISO7816_INTR_DONE LL_ISO7816_INTR_DONE /**< Source done error interrupt */ -/** @} */ - - -/** @defgroup ISO7816_HAL_CARD_PRESENCE Card Presence Defines - * @{ - */ -#define HAL_ISO7816_CARD_ABSENT LL_ISO7816_CARD_ABSENT /**< SIM Card is absent. */ -#define HAL_ISO7816_CARD_PRESENT LL_ISO7816_CARD_PRESENT /**< SIM Card is present. */ -/** @} */ - -/** @defgroup ISO7816_HAL_IO_STATES IO States Defines - * @{ - */ -#define HAL_ISO7816_IO_STATE_OFF LL_ISO7816_IO_STATE_OFF /**< Off */ -#define HAL_ISO7816_IO_STATE_IDLE LL_ISO7816_IO_STATE_IDLE /**< Idle */ -#define HAL_ISO7816_IO_STATE_RX_WAIT LL_ISO7816_IO_STATE_RX_WAIT /**< Receive Wait */ -#define HAL_ISO7816_IO_STATE_RX LL_ISO7816_IO_STATE_RX /**< Receive */ -#define HAL_ISO7816_IO_STATE_TX LL_ISO7816_IO_STATE_TX /**< Transmit */ -#define HAL_ISO7816_IO_STATE_TX_GUARD LL_ISO7816_IO_STATE_TX_GUARD /**< Transmit Guard */ -/** @} */ - -/** @defgroup ISO7816_HAL_PWR_STATES Power States Defines - * @{ - */ -#define HAL_ISO7816_PWR_STATE_OFF LL_ISO7816_PWR_STATE_OFF /**< Off */ -#define HAL_ISO7816_PWR_STATE_PWRUP_VCC LL_ISO7816_PWR_STATE_PWRUP_VCC /**< Power up VCC */ -#define HAL_ISO7816_PWR_STATE_PWRUP_RST LL_ISO7816_PWR_STATE_PWRUP_RST /**< Power up reset */ -#define HAL_ISO7816_PWR_STATE_PWRDN_RST LL_ISO7816_PWR_STATE_PWRDN_RST /**< Power Down reset */ -#define HAL_ISO7816_PWR_STATE_PWRDN_VCC LL_ISO7816_PWR_STATE_PWRDN_VCC /**< Power Down VCC */ -#define HAL_ISO7816_PWR_STATE_STOP_PRE LL_ISO7816_PWR_STATE_STOP_PRE /**< Preparing Clock Stop */ -#define HAL_ISO7816_PWR_STATE_STOP LL_ISO7816_PWR_STATE_STOP /**< Clock Stopped */ -#define HAL_ISO7816_PWR_STATE_STOP_POST LL_ISO7816_PWR_STATE_STOP_POST /**< Exiting Clock Stop */ -#define HAL_ISO7816_PWR_STATE_IDLE LL_ISO7816_PWR_STATE_IDLE /**< Idle */ -#define HAL_ISO7816_PWR_STATE_RX_TS0 LL_ISO7816_PWR_STATE_RX_TS0 /**< RX TS Character */ -#define HAL_ISO7816_PWR_STATE_RX_TS1 LL_ISO7816_PWR_STATE_RX_TS1 /**< RX TS Character */ -#define HAL_ISO7816_PWR_STATE_RX LL_ISO7816_PWR_STATE_RX /**< Receive */ -#define HAL_ISO7816_PWR_STATE_TX LL_ISO7816_PWR_STATE_TX /**< Transmit */ -#define HAL_ISO7816_PWR_STATE_TX_RX LL_ISO7816_PWR_STATE_TX_RX /**< Transmit and Receive */ -/** @} */ - -/** @defgroup ISO7816_Error_Code ISO7816 Error Code - * @{ - */ -#define HAL_ISO7816_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_ISO7816_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_ISO7816_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_ISO7816_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameters error */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup ISO7816_Exported_Macros ISO7816 Exported Macros - * @{ - */ - -/** @brief Enable the specified ISO7816 interrupts. - * @param __HANDLE__ Specifies the ISO7816 Handle. - * @param __INTERRUPT__ Specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref HAL_ISO7816_INTR_TEST Test interrupt - * @arg @ref HAL_ISO7816_INTR_PRESENCE Presence interrupt - * @arg @ref HAL_ISO7816_INTR_STATE_ERR State error interrupt - * @arg @ref HAL_ISO7816_INTR_DMA_ERR DMA error interrupt - * @arg @ref HAL_ISO7816_INTR_RETRY_ERR Retry error interrupt - * @arg @ref HAL_ISO7816_INTR_RX_ERR Rx error interrupt - * @arg @ref HAL_ISO7816_INTR_DONE Done error interrupt - * @retval None - */ -#define HAL_ISO7816_ENABLE_IT(__HANDLE__, __INTERRUPT__) \ - SET_BITS((__HANDLE__)->p_instance->INT_MASK, (__INTERRUPT__)) - -/** @brief Disable the specified ISO7816 interrupts. - * @param __HANDLE__ Specifies the ISO7816 handle. - * @param __INTERRUPT__ Specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref HAL_ISO7816_INTR_TEST Test interrupt - * @arg @ref HAL_ISO7816_INTR_PRESENCE Presence interrupt - * @arg @ref HAL_ISO7816_INTR_STATE_ERR State error interrupt - * @arg @ref HAL_ISO7816_INTR_DMA_ERR DMA error interrupt - * @arg @ref HAL_ISO7816_INTR_RETRY_ERR Retry error interrupt - * @arg @ref HAL_ISO7816_INTR_RX_ERR Rx error interrupt - * @arg @ref HAL_ISO7816_INTR_DONE Done error interrupt - * @retval None - */ -#define HAL_ISO7816_DISABLE_IT(__HANDLE__, __INTERRUPT__) \ - CLEAR_BITS((__HANDLE__)->p_instance->INT_MASK, (__INTERRUPT__)) - -/** @brief Get the ISO7816 interrupt flags. - * @param __ISO7816_REGS ISO7816 Register. - * @retval ISO78116 Interrupt definitions. - */ -#define HAL_ISO7816_IT_GET_IT_FLAG(__ISO7816_REGS) ll_iso7816_get_it_flag(__ISO7816_REGS) -/** @} */ -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_ISO7816_DRIVER_FUNCTIONS Functions - * @{ - */ -/** - * @brief Transimit data in blocking mode - * - * @param p_iso7816 Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @param tx_size Bytes of data to transmit - * @param timeout Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ -hal_status_t hal_iso7816_transmit(iso7816_handle_t *p_iso7816, uint16_t tx_size, uint32_t timeout); - -/** - * @brief Receive data in blocking mode - * - * @param p_iso7816 Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @param rx_size Bytes of data to receive - * @param timeout Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ -hal_status_t hal_iso7816_receive(iso7816_handle_t *p_iso7816, uint16_t rx_size, uint32_t timeout); - -/** - * @brief Transimit and receive data in blocking mode - * - * @param p_iso7816 Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @param tx_size Bytes of data to transmit - * @param rx_size Bytes of data to receive - * @param timeout Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ -hal_status_t hal_iso7816_transmit_receive(iso7816_handle_t *p_iso7816, uint16_t tx_size, - uint16_t rx_size, uint32_t timeout); - -/** - * @brief Transimit data in non-blocking mode with Interrupt - * - * @param p_iso7816 Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @param tx_size Bytes of data to transmit - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ -hal_status_t hal_iso7816_transmit_it(iso7816_handle_t *p_iso7816, uint16_t tx_size); - -/** - * @brief Receive data in non-blocking mode with Interrupt - * - * @param p_iso7816 Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @param rx_size Bytes of data to receive - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ -hal_status_t hal_iso7816_receive_it(iso7816_handle_t *p_iso7816, uint16_t rx_size); - -/** - * @brief Transimit and receive data in non-blocking mode with Interrupt - * - * @param p_iso7816: Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @param tx_size: Bytes of data to transfer. - * @param rx_size: Bytes of data to receive. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ - -hal_status_t hal_iso7816_transmit_receive_it(iso7816_handle_t *p_iso7816, uint16_t tx_size, uint16_t rx_size); - -/** - * @brief Transfer Abort functions - * - * @param p_iso7816 Pointer to an ISO7816 handle which contains the configuration information - * for the specified ISO7816. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - */ -hal_status_t hal_iso7816_abort(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Initializes the ISO7816 according to the specified parameters - * in the iso7816_init_t and initialize the associated handle. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_iso7816_init(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief De-initializes the ISO7816 according to the specified parameters - * in the iso7816_init_t and initialize the associated handle. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_iso7816_deinit(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Initialize the ISO7816 MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_iso7816_msp_init could be implemented in the user file. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_msp_init(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief De-initialize the ISO7816 MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_iso7816_msp_deinit could be implemented in the user file. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_msp_deinit(iso7816_handle_t *p_iso7816); -/** - **************************************************************************************** - * @brief Handle ISO7816 interrupt request. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_irq_handler(iso7816_handle_t *p_iso7816); - - -/** - **************************************************************************************** - * @brief Card presence state changed callback. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_presence_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Receive completed callback. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_atr_cplt_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Rx Transfer completed callback. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_rx_cplt_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Tx Transfer completed callback. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_tx_cplt_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Tx and Rx Transfer completed callback. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_tx_rx_cplt_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief ISO7816 error callback. - * @param[in] p_iso7816: Pointer to an ISO7816 handle which contains the configuration - * information for the specified ISO7816. - **************************************************************************************** - */ -void hal_iso7816_error_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief ISO7816 Abort Completed callback. - * @param[in] p_iso7816: ISO7816 handle. - **************************************************************************************** - */ -void hal_iso7816_abort_cplt_callback(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Return the ISO7816 handle state. - * @param[in] p_iso7816: ISO7816 handle. - * @retval ::HAL_ISO7816_STATE_RESET - * @retval ::HAL_ISO7816_STATE_READY - * @retval ::HAL_ISO7816_STATE_BUSY - * @retval ::HAL_ISO7816_STATE_BUSY_TX - * @retval ::HAL_ISO7816_STATE_BUSY_RX - * @retval ::HAL_ISO7816_STATE_BUSY_TX_RX - * @retval ::HAL_ISO7816_STATE_ABORT - * @retval ::HAL_ISO7816_STATE_TIMEOUT - * @retval ::HAL_ISO7816_STATE_ERROR - **************************************************************************************** - */ -hal_iso7816_state_t hal_iso7816_get_state(iso7816_handle_t *p_iso7816); - -/** - * @brief Request ISO7816 to go to the next action. - * @param p_iso7816: ISO7816 handle. - * @param action: This parameter can be one of the following values: - * @arg @ref HAL_ISO7816_ACTION_NONE - * @arg @ref HAL_ISO7816_ACTION_OFF - * @arg @ref HAL_ISO7816_ACTION_STOPCLK - * @arg @ref HAL_ISO7816_ACTION_ON - * @arg @ref HAL_ISO7816_ACTION_WARMRST - * @arg @ref HAL_ISO7816_ACTION_RX - * @arg @ref HAL_ISO7816_ACTION_TX - * @arg @ref HAL_ISO7816_ACTION_TXRX - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - */ -hal_status_t hal_iso7816_set_action(iso7816_handle_t *p_iso7816, uint32_t action); - -/** - * @brief Get ISO7816 Power States. - * @param p_iso7816: ISO7816 handle. - * @retval Returned value can be one of the following values: - * @arg @ref HAL_ISO7816_PWR_STATE_OFF - * @arg @ref HAL_ISO7816_PWR_STATE_PWRUP_VCC - * @arg @ref HAL_ISO7816_PWR_STATE_PWRUP_RST - * @arg @ref HAL_ISO7816_PWR_STATE_PWRDN_RST - * @arg @ref HAL_ISO7816_PWR_STATE_PWRDN_VCC - * @arg @ref HAL_ISO7816_PWR_STATE_STOP_PRE - * @arg @ref HAL_ISO7816_PWR_STATE_STOP - * @arg @ref HAL_ISO7816_PWR_STATE_STOP_POST - * @arg @ref HAL_ISO7816_PWR_STATE_IDLE - * @arg @ref HAL_ISO7816_PWR_STATE_RX_TS0 - * @arg @ref HAL_ISO7816_PWR_STATE_RX_TS1 - * @arg @ref HAL_ISO7816_PWR_STATE_RX - * @arg @ref HAL_ISO7816_PWR_STATE_TX - * @arg @ref HAL_ISO7816_PWR_STATE_TX_RX - */ -uint32_t hal_iso7816_get_power_states(iso7816_handle_t *p_iso7816); - -/** - * @brief Set divide ISO7816 clock. - * @note Divide SIM clock by this value+1 to define ETU length. The reset value - * is the one, needed for theATR. - * @param p_iso7816: ISO7816 handle. - * @param divide This parameter should range between 0x0 and 0x3FF. - * @retval None. - */ -hal_status_t hal_iso7816_set_etudiv(iso7816_handle_t *p_iso7816, uint32_t divide); - -/** - **************************************************************************************** - * @brief Return the ISO7816 error code. - * @param[in] p_iso7816: ISO7816 handle. - * @return ISO7816 Error Code - **************************************************************************************** - */ -uint32_t hal_iso7816_get_error(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Suspend some registers related to ISO7816 configuration before sleep. - * @param[in] p_iso7816: ISO7816 handle. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_iso7816_suspend_reg(iso7816_handle_t *p_iso7816); - -/** - **************************************************************************************** - * @brief Restore some registers related to ISO7816 configuration after sleep. - * This function must be used in conjunction with the hal_iso7816_suspend_reg(). - * @param[in] p_iso7816: ISO7816 handle. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_iso7816_resume_reg(iso7816_handle_t *p_iso7816); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_ISO7816_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio.h deleted file mode 100755 index f2a9603..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio.h +++ /dev/null @@ -1,332 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_msio.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of MSIO HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_MSIO MSIO - * @brief MSIO HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_MSIO_H__ -#define __GR55xx_HAL_MSIO_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_msio.h" -#include "gr55xx_hal_def.h" -/* Include MSIO HAL Extended module */ -#include "gr55xx_hal_msio_ex.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_MSIO_ENUMERATIONS Enumerations - * @{ - */ - -/** - * @brief MSIO Bit SET and Bit RESET enumerations - */ -typedef enum { - MSIO_PIN_RESET = 0U, /**< MSIO pin low level. */ - MSIO_PIN_SET /**< MSIO pin high level.*/ -} msio_pin_state_t; - -/** @} */ - -/** @addtogroup HAL_MSIO_STRUCTURES Structures - * @{ - */ - -/** - * @brief MSIO init structure definition - */ -typedef struct _msio_init { - uint32_t pin; /**< Specifies the MSIO pins to be configured. - This parameter can be any value of @ref MSIO_pins */ - - uint32_t direction; /**< Specifies the direction for the selected pins. - This parameter can be a value of @ref MSIO_direction */ - - uint32_t mode; /**< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref MSIO_mode */ - - uint32_t pull; /**< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref MSIO_pull */ - - uint32_t mux; /**< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIOEx_Mux_Function_Selection. */ -} msio_init_t; - -/** @} */ - -/** - * @defgroup HAL_MSIO_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup MSIO_Exported_Constants MSIO Exported Constants - * @{ - */ - -/** @defgroup MSIO_pins MSIO pins - * @{ - */ -#define MSIO_PIN_0 ((uint16_t)0x0001U) /**< Pin 0 selected */ -#define MSIO_PIN_1 ((uint16_t)0x0002U) /**< Pin 1 selected */ -#define MSIO_PIN_2 ((uint16_t)0x0004U) /**< Pin 2 selected */ -#define MSIO_PIN_3 ((uint16_t)0x0008U) /**< Pin 3 selected */ -#define MSIO_PIN_4 ((uint16_t)0x0010U) /**< Pin 4 selected */ - -#define MSIO_PIN_ALL ((uint16_t)0x001FU) /**< All pins selected */ - -#define MSIO_PIN_MASK (0x0000001FU) /**< PIN mask for assert test */ -/** @} */ - -/** @defgroup MSIO_direction MSIO direction - * @{ - */ -#define MSIO_DIRECTION_NONE LL_MSIO_DIRECTION_NONE /**< Disable input & output */ -#define MSIO_DIRECTION_INPUT LL_MSIO_DIRECTION_INPUT /**< Only Input */ -#define MSIO_DIRECTION_OUTPUT LL_MSIO_DIRECTION_OUTPUT /**< Only Output */ -#define MSIO_DIRECTION_INOUT LL_MSIO_DIRECTION_INOUT /**< Input & Output */ -/** @} */ - -/** @defgroup MSIO_mode MSIO mode - * @brief MSIO Analog or Digital mode - * @{ - */ -#define MSIO_MODE_ANALOG LL_MSIO_MODE_ANALOG /**< Analog IO */ -#define MSIO_MODE_DIGITAL LL_MSIO_MODE_DIGITAL /**< Digital IO */ -/** @} */ - -/** @defgroup MSIO_pull MSIO pull - * @brief MSIO Pull-Up or Pull-Down Activation - * @{ - */ -#define MSIO_NOPULL LL_MSIO_PULL_NO /**< No Pull-up or Pull-down activation */ -#define MSIO_PULLUP LL_MSIO_PULL_UP /**< Pull-up activation */ -#define MSIO_PULLDOWN LL_MSIO_PULL_DOWN /**< Pull-down activation */ -/** @} */ - -/** - * @brief MSIO_default_config initStruct default configuartion - */ -#define MSIO_DEFAULT_CONFIG \ -{ \ - .pin = MSIO_PIN_ALL, \ - .direction = MSIO_DIRECTION_INPUT, \ - .mode = MSIO_MODE_DIGITAL, \ - .pull = MSIO_PULLDOWN, \ - .mux = GPIO_MUX_7, \ -} -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup MSIO_Exported_Macros MSIO Exported Macros - * @{ - */ - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @addtogroup MSIO_Private_Macros MSIO Private Macros - * @{ - */ - -/** - * @brief Check if MSIO pin action is valid. - * @param __ACTION__ MSIO pin action. - * @retval SET (__ACTION__ is valid) or RESET (__ACTION__ is invalid) - */ -#define IS_MSIO_PIN_ACTION(__ACTION__) (((__ACTION__) == MSIO_PIN_RESET) || ((__ACTION__) == MSIO_PIN_SET)) - -/** - * @brief Check if MSIO pins are valid. - * @param __PIN__ MSIO pins. - * @retval SET (__PIN__ is valid) or RESET (__PIN__ is invalid) - */ -#define IS_MSIO_PIN(__PIN__) ((((__PIN__) & MSIO_PIN_MASK) != 0x00U) && \ - (((__PIN__) & ~MSIO_PIN_MASK) == 0x00U)) - -/** - * @brief Check if MSIO direction is valid. - * @param __DIR__ MSIO direction. - * @retval SET (__DIR__ is valid) or RESET (__DIR__ is invalid) - */ -#define IS_MSIO_DIRECTION(__DIR__) (((__DIR__) == MSIO_DIRECTION_NONE) || \ - ((__DIR__) == MSIO_DIRECTION_INPUT) || \ - ((__DIR__) == MSIO_DIRECTION_OUTPUT) || \ - ((__DIR__) == MSIO_DIRECTION_INOUT)) - -/** - * @brief Check if MSIO mode is valid. - * @param __MODE__ MSIO mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_MSIO_MODE(__MODE__) (((__MODE__) == MSIO_MODE_ANALOG) || \ - ((__MODE__) == MSIO_MODE_DIGITAL)) - -/** - * @brief Check if MSIO pull type is valid. - * @param __PULL__ MSIO pull type. - * @retval SET (__PULL__ is valid) or RESET (__PULL__ is invalid) - */ -#define IS_MSIO_PULL(__PULL__) (((__PULL__) == MSIO_NOPULL) || \ - ((__PULL__) == MSIO_PULLUP) || \ - ((__PULL__) == MSIO_PULLDOWN)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_MSIO_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup MSIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the MSIOx peripheral according to the specified parameters in the @ref msio_init_t. - * @param[in] p_msio_init: Pointer to an @ref msio_init_t structure that contains - * the configuration information for the specified MSIO peripheral port. - **************************************************************************************** - */ -void hal_msio_init(msio_init_t *p_msio_init); - -/** - **************************************************************************************** - * @brief De-initialize the MSIOx peripheral registers to their default reset values. - * @param[in] msio_pin: Specifies the port bit to be written. - * This parameter can be a combination of the following values: - * @arg @ref MSIO_PIN_0 - * @arg @ref MSIO_PIN_1 - * @arg @ref MSIO_PIN_2 - * @arg @ref MSIO_PIN_3 - * @arg @ref MSIO_PIN_4 - * @arg @ref MSIO_PIN_ALL - **************************************************************************************** - */ -void hal_msio_deinit(uint32_t msio_pin); - -/** @} */ - -/** @addtogroup MSIO_Exported_Functions_Group2 IO operation functions - * @brief MSIO Read, Write, and Toggle management functions. - * @{ - */ - -/** - **************************************************************************************** - * @brief Read the specified input port pin. - * @param[in] msio_pin: Specifies the port bit to be read. - * This parameter can be one of the following values: - * @arg @ref MSIO_PIN_0 - * @arg @ref MSIO_PIN_1 - * @arg @ref MSIO_PIN_2 - * @arg @ref MSIO_PIN_3 - * @arg @ref MSIO_PIN_4 - * @retval ::MSIO_PIN_RESET: MSIO pin low level. - * @retval ::MSIO_PIN_SET: MSIO pin high level. - **************************************************************************************** - */ -msio_pin_state_t hal_msio_read_pin(uint16_t msio_pin); - -/** - **************************************************************************************** - * @brief Set or clear the selected data port bit. - * @param[in] msio_pin: Specifies the port bit to be written. - * This parameter can be a combination of the following values: - * @arg @ref MSIO_PIN_0 - * @arg @ref MSIO_PIN_1 - * @arg @ref MSIO_PIN_2 - * @arg @ref MSIO_PIN_3 - * @arg @ref MSIO_PIN_4 - * @arg @ref MSIO_PIN_ALL - * @param[in] pin_state: Specifies the value to be written to the selected bit. - * This parameter can be one of the MSIO_PinState enum values: - * @arg MSIO_PIN_RESET: to clear the port pin - * @arg MSIO_PIN_SET: to set the port pin - **************************************************************************************** - */ -void hal_msio_write_pin(uint16_t msio_pin, msio_pin_state_t pin_state); - -/** - **************************************************************************************** - * @brief Toggle the specified MSIO pin. - * @param[in] msio_pin: Specifies the pin to be toggled. - * This parameter can be a combination of the following values: - * @arg @ref MSIO_PIN_0 - * @arg @ref MSIO_PIN_1 - * @arg @ref MSIO_PIN_2 - * @arg @ref MSIO_PIN_3 - * @arg @ref MSIO_PIN_4 - * @arg @ref MSIO_PIN_ALL - **************************************************************************************** - */ -void hal_msio_toggle_pin(uint16_t msio_pin); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_MSIO_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio_ex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio_ex.h deleted file mode 100755 index a20c0b6..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_msio_ex.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_msio_ex.h - * @author BLE Driver Team - * @brief Header file containing extended macro of MSIO HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_MSIOEx MSIOEx - * @brief MSIOEx HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_MSIO_EX_H__ -#define __GR55xx_HAL_MSIO_EX_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_msio.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ - -/** - * @defgroup HAL_MSIOEX_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup MSIOEx_Exported_Constants MSIOEx Exported Constants - * @{ - */ - -/** @defgroup MSIOEx_Mux_Mode MSIOEx Mux Mode definition - * @{ - */ -#define MSIO_MUX_0 LL_MSIO_MUX_0 /**< MSIO mux mode 0 */ -#define MSIO_MUX_1 LL_MSIO_MUX_1 /**< MSIO mux mode 1 */ -#define MSIO_MUX_2 LL_MSIO_MUX_2 /**< MSIO mux mode 2 */ -#define MSIO_MUX_3 LL_MSIO_MUX_3 /**< MSIO mux mode 3 */ -#define MSIO_MUX_4 LL_MSIO_MUX_4 /**< MSIO mux mode 4 */ -#define MSIO_MUX_5 LL_MSIO_MUX_5 /**< MSIO mux mode 5 */ -#define MSIO_MUX_6 LL_MSIO_MUX_6 /**< MSIO mux mode 6 */ -#define MSIO_MUX_7 LL_MSIO_MUX_7 /**< MSIO mux mode 7 */ -/** @} */ - -/** @defgroup MSIOEx_Mux_Function_Selection MSIOEx Mux function selection - * @{ - */ - -#if defined (GR551xx) -/*---------------------------------- GR551xx ------------------------------*/ - -/** @defgroup MSIOEx_Common_Selection MSIO PIN common MUX selection(Available for all MSIO pins) - * @{ - */ - -#define MSIO_PIN_MUX_GPIO MSIO_MUX_7 /**< MSIO PIN x Mux Select GPIO */ - -/** @} */ - -/** @defgroup MSIOEx_PIN0_Mux_Selection MSIO_PIN0 MUX selection - * @{ - */ -#define MSIO_PIN0_MUX_PWM0_A MSIO_MUX_0 /**< MSIO_PIN0 Mux Select PWM0_A */ -#define MSIO_PIN0_MUX_UART0_TX MSIO_MUX_1 /**< MSIO_PIN0 Mux Select UART0_TX */ -#define MSIO_PIN0_MUX_UART1_TX MSIO_MUX_2 /**< MSIO_PIN0 Mux Select UART1_TX */ -#define MSIO_PIN0_MUX_I2C0_SCL MSIO_MUX_3 /**< MSIO_PIN0 Mux Select I2C0_SCL */ -#define MSIO_PIN0_MUX_I2C1_SCL MSIO_MUX_4 /**< MSIO_PIN0 Mux Select I2C1_SCL */ -/** @} */ - -/** @defgroup MSIOEx_PIN1_Mux_Selection MSIO_PIN1 MUX selection - * @{ - */ -#define MSIO_PIN1_MUX_PWM0_B MSIO_MUX_0 /**< MSIO_PIN1 Mux Select PWM0_B */ -#define MSIO_PIN1_MUX_UART0_RX MSIO_MUX_1 /**< MSIO_PIN1 Mux Select UART0_RX */ -#define MSIO_PIN1_MUX_UART1_RX MSIO_MUX_2 /**< MSIO_PIN1 Mux Select UART1_RX */ -#define MSIO_PIN1_MUX_I2C0_SDA MSIO_MUX_3 /**< MSIO_PIN1 Mux Select I2C0_SDA */ -#define MSIO_PIN1_MUX_I2C1_SDA MSIO_MUX_4 /**< MSIO_PIN1 Mux Select I2C1_SDA */ -/** @} */ - -/** @defgroup MSIOEx_PIN2_Mux_Selection MSIO_PIN2 MUX selection - * @{ - */ -#define MSIO_PIN2_MUX_PWM0_C MSIO_MUX_0 /**< MSIO_PIN2 Mux Select PWM0_C */ -/** @} */ - -/** @defgroup MSIOEx_PIN3_Mux_Selection MSIO_PIN3 MUX selection - * @{ - */ -#define MSIO_PIN3_MUX_PWM1_A MSIO_MUX_0 /**< MSIO_PIN3 Mux Select PWM1_A */ -#define MSIO_PIN3_MUX_UART0_RTS MSIO_MUX_1 /**< MSIO_PIN3 Mux Select UART0_RTS */ -#define MSIO_PIN3_MUX_UART1_RTS MSIO_MUX_2 /**< MSIO_PIN3 Mux Select UART1_RTS */ -#define MSIO_PIN3_MUX_I2C0_SCL MSIO_MUX_3 /**< MSIO_PIN3 Mux Select I2C0_SCL */ -#define MSIO_PIN3_MUX_I2C1_SCL MSIO_MUX_4 /**< MSIO_PIN3 Mux Select I2C1_SCL */ -/** @} */ - -/** @defgroup MSIOEx_PIN4_Mux_Selection MSIO_PIN4 MUX selection - * @{ - */ -#define MSIO_PIN4_MUX_PWM1_B MSIO_MUX_0 /**< MSIO_PIN4 Mux Select PWM1_B */ -#define MSIO_PIN4_MUX_UART0_CTS MSIO_MUX_1 /**< MSIO_PIN4 Mux Select UART0_CTS */ -#define MSIO_PIN4_MUX_UART1_CTS MSIO_MUX_2 /**< MSIO_PIN4 Mux Select UART1_CTS */ -#define MSIO_PIN4_MUX_I2C0_SDA MSIO_MUX_3 /**< MSIO_PIN4 Mux Select I2C0_SDA */ -#define MSIO_PIN4_MUX_I2C1_SDA MSIO_MUX_4 /**< MSIO_PIN4 Mux Select I2C1_SDA */ -/** @} */ - -/** - * @brief Check if MSIO mux mode is valid. - * @param __MUX__ MSIO mux mode. - * @retval SET (__ACTION__ is valid) or RESET (__ACTION__ is invalid) - */ -#define IS_MSIO_MUX(__MUX__) (((__MUX__) <= MSIO_MUX_7)) - -/*------------------------------------------------------------------------------------------*/ -#endif /* GR551xx */ - -/** @} */ - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_MSIO_EX_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pkc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pkc.h deleted file mode 100755 index 25a4172..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pkc.h +++ /dev/null @@ -1,1036 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_pkc.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PKC HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_PKC PKC - * @brief PKC HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_PKC_H__ -#define __GR55xx_HAL_PKC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_pkc.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_PKC_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_PKC_state HAL PKC state - * @{ - */ - -/** - * @brief HAL PKC State Enumerations definition - */ -typedef enum { - HAL_PKC_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_PKC_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_PKC_STATE_BUSY = 0x02, /**< Peripheral in indirect mode and busy */ - HAL_PKC_STATE_ERROR = 0x04, /**< Peripheral in error */ - HAL_PKC_STATE_TIMEOUT = 0x08, /**< Peripheral in timeout */ -} hal_pkc_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_PKC_STRUCTURES Structures - * @{ - */ - -/** @defgroup PKC_Configuration PKC Configuration - * @{ - */ - -/** - * @brief PKC ECC Point Structure definition - */ -typedef struct _ll_ecc_point ecc_point_t; - -/** - * @brief PKC ECC P-256 Elliptic Curve Init Structure definition - */ -typedef struct _ll_ecc_curve_init ecc_curve_init_t; - -/** - * @brief PKC Init Structure definition - */ -typedef struct { - ecc_curve_init_t *p_ecc_curve; /**< Specifies the pointer to elliptic curve description */ - - uint32_t data_bits; /**< Specifies the Data size: 256 ~ 2048 bits */ - - uint32_t secure_mode; /**< Specifies the Secure Mode. It indicates that DPA-resistance software - algorithm and hardware measures are applied at a cost of about - 35%- 50% performance loss. - This parameter can be a value of @ref PKC_Secure_Mode. */ - - uint32_t (*random_func)(void); /**< Specifies the function to generate random number. */ -} pkc_init_t; - -/** @} */ - -/** @defgroup PKC_handle PKC handle - * @{ - */ - -/** - * @brief PKC handle Structure definition - */ -typedef struct _pkc_handle { - pkc_regs_t *p_instance; /**< PKC registers base address */ - - pkc_init_t init; /**< PKC operation parameters */ - - void *p_result; /**< Pointer to PKC result buffer */ - - uint32_t shift_count; /**< Count to left shift */ - - uint32_t *p_P; /**< Prime number */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_pkc_state_t state; /**< PKC operation state */ - - __IO uint32_t error_code; /**< PKC Error code */ - - uint32_t timeout; /**< Timeout for the PKC operation */ - - uint32_t retention[1]; /**< pkc important register information. */ -} pkc_handle_t; -/** @} */ - -/** @defgroup PKC_Expression_Input PKC expression input - * @{ - */ - -/** - * @brief PKC ECC Point Multiplication expression input - * @note Result = K * Point - */ -typedef struct _pkc_ecc_point_multi { - uint32_t *p_K; /**< Pointer to operand K */ - ecc_point_t *p_ecc_point; /**< Pointer to ECC Point */ -} pkc_ecc_point_multi_t; - -/** - * @brief PKC RSA Modular Exponentiation expression input - * @note Result = A^B mod P - */ -typedef struct _pkc_rsa_modular_exponent { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_B; /**< Pointer to operand B */ - uint32_t *p_P; /**< Pointer to prime number P */ - uint32_t *p_P_R2; /**< P_R2 = R^2 mod P, where R = 2^DataBits */ - uint32_t ConstP; /**< Montgomery multiplication constant of P */ -} pkc_rsa_modular_exponent_t; - -/** - * @brief PKC Modular Addition expression input - * @note Result = (A + B) mod P - */ -typedef struct _pkc_modular_add { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_B; /**< Pointer to operand B */ - uint32_t *p_P; /**< Pointer to prime number P */ -} pkc_modular_add_t; - -/** - * @brief PKC Modular Subtraction expression input - * @note Result = (A - B) mod P - */ -typedef struct _pkc_modular_sub { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_B; /**< Pointer to operand B */ - uint32_t *p_P; /**< Pointer to prime number P */ -} pkc_modular_sub_t; - -/** - * @brief PKC Modular Left Shift expression input - * @note Result = (A << ShiftBits) mod P - */ -typedef struct _pkc_modular_shift { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t shift_bits; /**< Pointer to operand A */ - uint32_t *p_P; /**< Pointer to prime number P */ -} pkc_modular_shift_t; - -/** - * @brief PKC Modular Comparison expression input - * @note Result = A mod P - */ -typedef struct _pkc_modular_compare { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_P; /**< Pointer to prime number P */ -} pkc_modular_compare_t; - -/** - * @brief PKC Montgomery Modular Multiplication expression input - * @note Result = A * B * R^(-1) mod P, where R = 2^DataBits - */ -typedef struct _pkc_montgomery_multi { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_B; /**< Pointer to operand B */ - uint32_t *p_P; /**< Pointer to prime number P */ - uint32_t ConstP; /**< Montgomery multiplication constant for P, - where constp = (-P[0])^(-1) mod 2^32 */ -} pkc_montgomery_multi_t; - -/** - * @brief PKC Montgomery Inversion expression input - * @note Result = A^(-1) * 2^(K) mod P - */ -typedef struct _pkc_montgomery_inversion { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_P; /**< Pointer to prime number P */ - uint32_t ConstP; /**< Montgomery multiplication constant for P, - where ConstP = (-P[0])^(-1) mod 2^32 */ -} pkc_montgomery_inversion_t; - -/** - * @brief PKC Big Number Multiplication expression input - * @note Result = A * B, up to 1024 bits - */ -typedef struct _pkc_big_number_multi { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_B; /**< Pointer to operand B */ -} pkc_big_number_multi_t; - -/** - * @brief PKC Big Number Addition expression input - * @note Result = A + B, up to 2048 bits - */ -typedef struct _pkc_big_number_add { - uint32_t *p_A; /**< Pointer to operand A */ - uint32_t *p_B; /**< Pointer to operand B */ -} pkc_big_number_add_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_PKC_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_PKC_Callback Callback - * @{ - */ - -/** - * @brief HAL_PKC Callback function definition - */ - -typedef struct _hal_pkc_callback { - void (*pkc_msp_init)(pkc_handle_t *p_pkc); /**< PKC init MSP callback */ - void (*pkc_msp_deinit)(pkc_handle_t *p_pkc); /**< PKC de-init MSP callback */ - void (*pkc_done_callback)(pkc_handle_t *p_pkc); /**< PKC calculate done callback */ - void (*pkc_error_callback)(pkc_handle_t *p_pkc); /**< PKC error callback */ - void (*pkc_overflow_callback)(pkc_handle_t *p_pkc); /**< PKC over flow callback */ -} hal_pkc_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_PKC_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PKC_Exported_Constants PKC Exported Constants - * @{ - */ - -/** @defgroup PKC_Error_Code PKC Error Code - * @{ - */ -#define HAL_PKC_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_PKC_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_PKC_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_PKC_ERROR_OVERFLOW ((uint32_t)0x00000004) /**< Result overflow error */ -#define HAL_PKC_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameters error */ -#define HAL_PKC_ERROR_INVERSE_K ((uint32_t)0x00000010) /**< Inverse K error */ -#define HAL_PKC_ERROR_IRREVERSIBLE ((uint32_t)0x00000020) /**< Irreversible error */ -/** @} */ - -/** @defgroup PKC_Secure_Mode PKC Secure Mode - * @{ - */ -#define PKC_SECURE_MODE_DISABLE ((uint32_t)0x00000000) /**< Secure mode disable */ -#define PKC_SECURE_MODE_ENABLE ((uint32_t)0x00000001) /**< Secure mode enable */ -/** @} */ - -/** @defgroup PKC_Operation_Mode PKC Operation Mode - * @{ - */ -#define PKC_OPERATION_MODE_MULTI LL_PKC_operation_mode_MULTIPLY /**< Multiplication operation mode */ -#define PKC_OPERATION_MODE_INVER LL_PKC_operation_mode_INVERTION /**< Inversion operation mode */ -#define PKC_OPERATION_MODE_ADD LL_PKC_operation_mode_ADD /**< Addition operation mode */ -#define PKC_OPERATION_MODE_SUB LL_PKC_operation_mode_SUB /**< Subtraction operation mode */ -#define PKC_OPERATION_MODE_CMP LL_PKC_operation_mode_COMPARE /**< Comparison operation mode */ -#define PKC_OPERATION_MODE_LSHIFT LL_PKC_operation_mode_LEFTSHIFT /**< Left Shift operation mode */ -#define PKC_OPERATION_MODE_BIGMULTI LL_PKC_operation_mode_BIGINTEGERMULTIPLY /**< Big Number Multiplication - operation mode */ -#define PKC_OPERATION_MODE_BIGADD LL_PKC_operation_mode_BIGINTEGERADD /**< Big Number Addition - operation mode */ -/** @} */ - -/** @defgroup PKC_Bits_Length PKC Bits Length - * @{ - */ -#define PKC_BITS_LENGTH_MIN LL_PKC_BITS_LENGTH_MIN /**< Min value of bits length */ -#define PKC_BITS_LENGTH_MAX LL_PKC_BITS_LENGTH_MAX /**< Max value of bits length */ -#define PKC_BIGMULTI_BITS_LENGTH_MAX LL_PKC_BIGMULTI_BITS_LENGTH_MAX /**< Max value of big number multiplication - bits length */ -/** @} */ - -/** @defgroup PKC_Flags PKC Flags - * @{ - */ -#define PKC_FLAG_BUSY LL_PKC_WORKSTAT_BUSY /**< Busy flag */ -/** @} */ - -/** @defgroup PKC_Interrupt_definition PKC Interrupt_definition - * @{ - */ -#define PKC_IT_DONE LL_PKC_INTEN_DONE /**< Operation Done Interrupt source */ -#define PKC_IT_ERR LL_PKC_INTEN_ERR /**< Operation Error Interrupt source */ -#define PKC_IT_OVF LL_PKC_INTEN_BAOVF /**< Big Integer Result Overflow Interrupt source */ -/** @} */ - -/** @defgroup PKC_Timeout_definition PKC Timeout_definition - * @{ - */ -#define HAL_PKC_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< The default value of PKC timeout is 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PKC_Exported_Macros PKC Exported Macros - * @{ - */ - -/** @brief Reset PKC handle states. - * @param __HANDLE__ PKC handle. - * @retval None - */ -#define HAL_PKC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_PKC_STATE_RESET) - -/** @brief Reset the specified PKC peripheral. - * @param __HANDLE__ PKC handle. - * @retval None - */ -#define HAL_PKC_RESET(__HANDLE__) \ -do { \ - CLEAR_BITS((__HANDLE__)->p_instance->CTRL, PKC_CTRL_SWRST); \ - SET_BITS((__HANDLE__)->p_instance->CTRL, PKC_CTRL_SWRST); \ -} while (0) - - -/** @brief Enable the specified PKC peripheral. - * @param __HANDLE__ Specifies the PKC Handle. - * @retval None - */ -#define HAL_PKC_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, PKC_CTRL_EN) - -/** @brief Disable the specified PKC peripheral. - * @param __HANDLE__ Specifies the PKC Handle. - * @retval None - */ -#define HAL_PKC_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, PKC_CTRL_EN) - -/** @brief Enable the specified PKC interrupts. - * @param __HANDLE__ Specifies the PKC Handle. - * @param __INTERRUPT__ Specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref PKC_IT_DONE Operation Done Interrupt source - * @arg @ref PKC_IT_ERR Operation Error Interrupt source - * @arg @ref PKC_IT_OVF Big Integer Result Overflow Interrupt source - * @retval None - */ -#define HAL_PKC_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BITS((__HANDLE__)->p_instance->INTEN, (__INTERRUPT__)) - -/** @brief Disable the specified PKC interrupts. - * @param __HANDLE__ Specifies the PKC Handle. - * @param __INTERRUPT__ Specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref PKC_IT_DONE Operation Done Interrupt source - * @arg @ref PKC_IT_ERR Operation Error Interrupt source - * @arg @ref PKC_IT_OVF Big Integer Result Overflow Interrupt source - * @retval None - */ -#define HAL_PKC_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BITS((__HANDLE__)->p_instance->INTEN, (__INTERRUPT__)) - -/** @brief Check whether the specified PKC interrupt flag is set or not. - * @param __HANDLE__ Specifies the PKC Handle. - * @param __FLAG__ Specifies the interrupt flag to check. - * This parameter can be one of the following values: - * @arg @ref PKC_IT_DONE Operation Done Interrupt source - * @arg @ref PKC_IT_ERR Operation Error Interrupt source - * @arg @ref PKC_IT_OVF Big Integer Result Overflow Interrupt source - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_PKC_GET_FLAG_IT(__HANDLE__, __FLAG__) \ - (READ_BITS((__HANDLE__)->p_instance->INTSTAT, (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified PKC interrupt flag. - * @param __HANDLE__ Specifies the PKC Handle. - * @param __FLAG__ Specifies the interrupt flag to clear. - * This parameter can be one of the following values: - * @arg @ref PKC_IT_DONE Operation Done Interrupt source - * @arg @ref PKC_IT_ERR Operation Error Interrupt source - * @arg @ref PKC_IT_OVF Big Integer Result Overflow Interrupt source - * @retval None - */ -#define HAL_PKC_CLEAR_FLAG_IT(__HANDLE__, __FLAG__) SET_BITS((__HANDLE__)->p_instance->INTSTAT, (__FLAG__)) - -/** @brief Check whether the specified PKC flag is set or not. - * @param __HANDLE__ Specifies the PKC Handle. - * @param __FLAG__ Specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref PKC_FLAG_BUSY Busy flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_PKC_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->WORKSTAT, (__FLAG__)) != 0) ? SET : RESET) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PKC_Private_Macro PKC Private Macros - * @{ - */ - -/** @brief Check if PKC Bits Length is valid. - * @param __BITS__ PKC Bits Length. - * @retval SET (__BITS__ is valid) or RESET (__BITS__ is invalid) - */ -#define IS_PKC_BITS_LENGTH(__BITS__) (((__BITS__) >= PKC_BITS_LENGTH_MIN) && ((__BITS__) <= PKC_BITS_LENGTH_MAX)) - -/** @brief Check if PKC Big Number Multiplication Bits Length is valid. - * @param __BITS__ PKC Big Number Multiplication Bits Length. - * @retval SET (__BITS__ is valid) or RESET (__BITS__ is invalid) - */ -#define IS_PKC_BIGMULTI_BITS_LENGTH(__BITS__) \ - (((__BITS__) >= PKC_BITS_LENGTH_MIN) && ((__BITS__) <= PKC_BIGMULTI_BITS_LENGTH_MAX)) - -/** @brief Check if PKC Secure Mode is valid. - * @param __MODE__ PKC Secure Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PKC_SECURE_MODE(__MODE__) (((__MODE__) == PKC_SECURE_MODE_DISABLE) || \ - ((__MODE__) == PKC_SECURE_MODE_ENABLE)) - -/** @brief Check if PKC Operation Mode is valid. - * @param __MODE__ PKC Operation Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PKC_OPERATION_MODE(__MODE__) (((__MODE__) == PKC_OPERATION_MODE_MULTI) || \ - ((__MODE__) == PKC_OPERATION_MODE_INVER) || \ - ((__MODE__) == PKC_OPERATION_MODE_ADD) || \ - ((__MODE__) == PKC_OPERATION_MODE_SUB) || \ - ((__MODE__) == PKC_OPERATION_MODE_CMP) || \ - ((__MODE__) == PKC_OPERATION_MODE_LSHIFT) || \ - ((__MODE__) == PKC_OPERATION_MODE_BIGMULTI) || \ - ((__MODE__) == PKC_OPERATION_MODE_BIGADD)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_PKC_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup PKC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the PKC peripheral. - - (+) User must implement hal_pkc_msp_init() function in which it configures - all related peripherals resources (IT and NVIC ). - - (+) Call the function hal_pkc_init() to configure the selected device with - the selected configuration: - (++) pECC_Curve - (++) DataBits - (++) SecureMode - (++) pRandomFunc - - (+) Call the function hal_pkc_deinit() to restore the default configuration - of the selected PKC peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the PKC according to the specified parameters - * in the pkc_init_t and initialize the associated handle. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_init(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief De-initialize the PKC peripheral. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_deinit(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief Initialize the PKC MSP. - * @note This function should not be modified. When the callback is needed, - the hal_pkc_msp_deinit can be implemented in the user file. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - **************************************************************************************** - */ -void hal_pkc_msp_init(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief De-initialize the PKC MSP. - * @note This function should not be modified. When the callback is needed, - the hal_pkc_msp_deinit can be implemented in the user file. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - **************************************************************************************** - */ -void hal_pkc_msp_deinit(pkc_handle_t *p_pkc); - -/** @} */ - -/** @defgroup PKC_Exported_Functions_Group2 IO Operation Functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the PKC - data transfers. - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - , These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated PKC IRQ when using Interrupt mode. - The hal_pkc_done_callback() user callbacks will be executed respectively at the end of the calculate process - The hal_pkc_error_callback() user callback will be executed when a communication error is detected - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Execute RSA Modular Exponentiation in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_rsa_modular_exponent(pkc_handle_t *p_pkc, pkc_rsa_modular_exponent_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute ECC Point Multiplication in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_ecc_point_multi(pkc_handle_t *p_pkc, pkc_ecc_point_multi_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute ECC Point Multiplication in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_ecc_point_multi_it(pkc_handle_t *p_pkc, pkc_ecc_point_multi_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Modular Addition in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_add(pkc_handle_t *p_pkc, pkc_modular_add_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Modular Addition in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_add_it(pkc_handle_t *p_pkc, pkc_modular_add_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Modular Subtraction in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_sub(pkc_handle_t *p_pkc, pkc_modular_sub_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Modular Subtraction in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_sub_it(pkc_handle_t *p_pkc, pkc_modular_sub_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Modular Left Shift in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_left_shift(pkc_handle_t *p_pkc, pkc_modular_shift_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Modular Left Shift in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_left_shift_it(pkc_handle_t *p_pkc, pkc_modular_shift_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Modular Comparison in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_compare(pkc_handle_t *p_pkc, pkc_modular_compare_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Modular Comparison in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_modular_compare_it(pkc_handle_t *p_pkc, pkc_modular_compare_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Montgomery Modular Multiplication in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_montgomery_multi(pkc_handle_t *p_pkc, pkc_montgomery_multi_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Montgomery Modular Multiplication in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_montgomery_multi_it(pkc_handle_t *p_pkc, pkc_montgomery_multi_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Montgomery Inversion in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_montgomery_inversion(pkc_handle_t *p_pkc, pkc_montgomery_inversion_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Montgomery Inversion in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_montgomery_inversion_it(pkc_handle_t *p_pkc, pkc_montgomery_inversion_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Big Number Multiplication in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_big_number_multi(pkc_handle_t *p_pkc, pkc_big_number_multi_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Big Number Multiplication in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_big_number_multi_it(pkc_handle_t *p_pkc, pkc_big_number_multi_t *p_input); - -/** - **************************************************************************************** - * @brief Execute Big Number Addition in blocking mode. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_big_number_add(pkc_handle_t *p_pkc, pkc_big_number_add_t *p_input, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Execute Big Number Addition in non-blocking mode with Interrupt. - * @note The computed result will be stored in the buffter pointed by p_pkc->pResult. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] p_input: Pointer to an expression structure which contains the input computing parameters. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pkc_big_number_add_it(pkc_handle_t *p_pkc, pkc_big_number_add_t *p_input); - -/** @} */ - -/** @addtogroup PKC_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle PKC interrupt request. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - **************************************************************************************** - */ -void hal_pkc_irq_handler(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief PKC calculate done callback. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - **************************************************************************************** - */ -void hal_pkc_done_callback(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief PKC error callback. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - **************************************************************************************** - */ -void hal_pkc_error_callback(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief PKC over flow callback. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - **************************************************************************************** - */ -void hal_pkc_overflow_callback(pkc_handle_t *p_pkc); - -/** @} */ - -/** @addtogroup PKC_Exported_Functions_Group3 Peripheral Control and State functions - * @brief PKC Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral Control and State functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the PKC handle state. - (+) Return the PKC handle error code. - (+) Set the timeout during internal process. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the PKC handle state. - * @param[in] p_pkc: Pointer to a pkc_handle_t structure that contains - * the configuration information for the specified PKC. - * @retval ::HAL_PKC_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_PKC_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_PKC_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_PKC_STATE_ERROR: Peripheral in error. - * @retval ::HAL_PKC_STATE_TIMEOUT: Peripheral in timeout. - **************************************************************************************** - */ -hal_pkc_state_t hal_pkc_get_state(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief Return the PKC error code. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @return PKC error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_pkc_get_error(pkc_handle_t *p_pkc); - -/** - **************************************************************************************** - * @brief Set the PKC internal process timeout value. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @param[in] timeout: Internal process timeout value. - **************************************************************************************** - */ -void hal_pkc_set_timeout(pkc_handle_t *p_pkc, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Suspend some registers related to PKC configuration before sleep. - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ - -hal_status_t hal_pkc_suspend_reg(pkc_handle_t *p_pkc); -/** - **************************************************************************************** - * @brief Restore some registers related to PKC configuration after sleep. - * This function must be used in conjunction with the hal_hmac_suspend_reg(). - * @param[in] p_pkc: Pointer to a PKC handle which contains the configuration - * information for the specified PKC module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ - -hal_status_t hal_pkc_resume_reg(pkc_handle_t *p_pkc); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_PKC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwm.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwm.h deleted file mode 100755 index 0f75dfb..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwm.h +++ /dev/null @@ -1,511 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_pwm.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PWM HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_PWM PWM - * @brief PWM HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_PWM_H__ -#define __GR55xx_HAL_PWM_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_pwm.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_PWM_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_PWM_state HAL PWM state - * @{ - */ - -/** - * @brief HAL PWM State Enumerations definition - */ -typedef enum { - HAL_PWM_STATE_RESET = 0x00, /**< Peripheral is not initialized or disabled */ - HAL_PWM_STATE_READY = 0x01, /**< Peripheral is initialized and ready for use */ - HAL_PWM_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_PWM_STATE_ERROR = 0x04 /**< Reception process is ongoing */ -} hal_pwm_state_t; -/** @} */ - -/** @defgroup HAL_PWM_active_channel HAL PWM active channel - * @{ - */ - -/** - * @brief HAL PWM active channel Enumerations definition - */ -typedef enum { - HAL_PWM_ACTIVE_CHANNEL_A = 0x01, /**< The active channel is A */ - HAL_PWM_ACTIVE_CHANNEL_B = 0x02, /**< The active channel is B */ - HAL_PWM_ACTIVE_CHANNEL_C = 0x04, /**< The active channel is C */ - HAL_PWM_ACTIVE_CHANNEL_ALL = 0x07, /**< The active channels are ALL */ - HAL_PWM_ACTIVE_CHANNEL_CLEARED = 0x00 /**< All active channels are cleared */ -} hal_pwm_active_channel_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_PWM_STRUCTURES Structures - * @{ - */ - -/** @defgroup PWM_Configuration PWM Configuration - * @{ - */ - -/** - * @brief PWM Channel init Structure definition - */ -typedef struct { - uint8_t duty; /**< Specifies the duty in PWM output mode. - This parameter must be a number between 0 ~ 100. */ - - uint8_t drive_polarity; /**< Specifies the drive polarity in PWM output mode. - This parameter can be a value of @ref PWM_Drive_Polarity. */ -} pwm_channel_init_t; - -/** - * @brief PWM init Structure definition - */ -typedef struct { - uint32_t mode; /**< Specifies the PWM output mode state. - This parameter can be a value of @ref PWM_Mode */ - - uint32_t align; /**< Specifies the PWM alignment mode with three channels - This parameter can be a value of @ref PWM_Alignment_Mode */ - - uint32_t freq; /**< Specifies the PWM frequency. - This parameter must be a number between 0 ~ SystemFreq/2 (max = 32Mhz). */ - - uint32_t bperiod; /**< Specifies the PWM breath period in breath mode. Unit: ms. - This parameter must be a number between 0 ~ 0xFFFFFFFF/SystemFreq*1000. */ - - uint32_t hperiod; /**< Specifies the PWM hold period in breath mode. Unit: ms. - This parameter must be a number between 0 ~ 0xFFFFFF/SystemFreq*1000. */ - - pwm_channel_init_t channel_a; /**< Specifies the configuration parameters of channel A. */ - - pwm_channel_init_t channel_b; /**< Specifies the configuration parameters of channel B. */ - - pwm_channel_init_t channel_c; /**< Specifies the configuration parameters of channel C. */ -} pwm_init_t; -/** @} */ - -/** @defgroup PWM_handle PWM handle - * @{ - */ - -/** - * @brief PWM handle Structure definition - */ -typedef struct { - pwm_regs_t *p_instance; /**< Register base address */ - - pwm_init_t init; /**< Required parameters for PWM Base */ - - hal_pwm_active_channel_t active_channel; /**< Active channel */ - - __IO hal_lock_t lock; /**< Lock object */ - - __IO hal_pwm_state_t state; /**< PWM operation state */ - - uint32_t retention[11]; /**< PWM important register information. */ -} pwm_handle_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_PWM_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_PWM_Callback Callback - * @{ - */ - -/** - * @brief HAL_PWM Callback function definition - */ - -typedef struct _hal_pwm_callback { - void (*pwm_msp_init)(pwm_handle_t *p_pwm); /**< PWM init MSP callback */ - void (*pwm_msp_deinit)(pwm_handle_t *p_pwm); /**< PWM de-init MSP callback */ -} hal_pwm_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_PWM_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWM_Exported_Constants PWM Exported Constants - * @{ - */ - -/** @defgroup PWM_Mode PWM Mode - * @{ - */ -#define PWM_MODE_FLICKER LL_PWM_FLICKER_MODE /**< PWM flicker mode */ -#define PWM_MODE_BREATH LL_PWM_BREATH_MODE /**< PWM breath mode */ -/** @} */ - -/** @defgroup PWM_Alignment_Mode PWM Pulses Aligned. - * @{ - */ -#define PWM_ALIGNED_EDGE LL_PWM_EDGE_ALIGNED /**< PWM edge-aligned */ -#define PWM_ALIGNED_CENTER LL_PWM_CENTER_ALIGNED /**< PWM center-aligned */ -/** @} */ - -/** @defgroup PWM_Drive_Polarity PWM Drive Polarity - * @{ - */ -#define PWM_DRIVEPOLARITY_NEGATIVE LL_PWM_DRIVEPOLARITY_NEGATIVE /**< PWM led-negative-drive mode */ -#define PWM_DRIVEPOLARITY_POSITIVE LL_PWM_DRIVEPOLARITY_POSITIVE /**< PWM led-positive-drive mode */ -/** @} */ -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWM_Exported_Macros PWM Exported Macros - * @{ - */ - -/** @brief Reset PWM handle states. - * @param __HANDLE__ PWM handle. - * @retval None - */ -#define HAL_PWM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_PWM_STATE_RESET) - -/** @brief Enable the specified PWM peripheral. - * @param __HANDLE__ specifies the PWM Handle. - * @retval None - */ -#define HAL_PWM_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->MODE, PWM_MODE_EN) - -/** @brief Disable the specified PWM peripheral. - * @param __HANDLE__ specifies the PWM Handle. - * @retval None - */ -#define HAL_PWM_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->MODE, PWM_MODE_EN) - -/** @brief Enable PWM breath mode. - * @param __HANDLE__ specifies the PWM Handle. - * @retval None - */ -#define HAL_PWM_ENABLE_BREATH(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->MODE, PWM_MODE_BREATHEN) - -/** @brief Disable PWM breath mode. - * @param __HANDLE__ specifies the PWM Handle. - * @retval None - */ -#define HAL_PWM_DISABLE_BREATH(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->MODE, PWM_MODE_BREATHEN) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWM_Private_Macro PWM Private Macros - * @{ - */ - -/** - * @brief Check if PWM mode is valid. - * @param __MODE__ PWM mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PWM_MODE(__MODE__) (((__MODE__) == PWM_MODE_FLICKER) || \ - ((__MODE__) == PWM_MODE_BREATH)) - -/** - * @brief Check if PWM Alignment mode is valid. - * @param __MODE__ PWM Alignment mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PWM_ALIGNMENT_MODE(__MODE__) (((__MODE__) == PWM_EDGE) || \ - ((__MODE__) == PWM_CENTER)) - -/** - * @brief Check if PWM drive polarity is valid. - * @param __POLARITY__ PWM drive polarity. - * @retval SET (__POLARITY__ is valid) or RESET (__POLARITY__ is invalid) - */ -#define IS_PWM_DRIVEPOLARITY(__POLARITY__) (((__POLARITY__) == PWM_DRIVEPOLARITY_NEGATIVE) || \ - ((__POLARITY__) == PWM_DRIVEPOLARITY_POSITIVE)) - -/** @} */ - -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_PWM_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup PWM_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * - * @verbatim -=============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the PWMx. - (+) The parameters below can only be configured in breath mode: - (++) BreathPeriod - (++) HoldPeriod - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the PWM mode according to the specified - * parameters in the pwm_init_t and initialize the associated handle. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_init(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief De-initialize the PWM peripheral. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_deinit(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief Initialize the PWM MSP. - * @note This function should not be modified. When the callback is needed, - the hal_pwm_msp_init can be implemented in the user file. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - **************************************************************************************** - */ -void hal_pwm_msp_init(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief De-initialize the PWM MSP. - * @note This function should not be modified. When the callback is needed, - the hal_pwm_msp_deinit can be implemented in the user file. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - **************************************************************************************** - */ -void hal_pwm_msp_deinit(pwm_handle_t *p_pwm); - -/** @} */ - -/** @addtogroup PWM_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the PWM. - (+) Stop the PWM. - (+) Configure the specified PWM channel. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Starts the PWM signal generation on the output. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_start(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief Stops the PWM signal generation on the output. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_stop(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief Update the PWM frequency on the output. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - * @param[in] freq: This parameter ranges between min = 0 and max = SystemFreq / 2. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_update_freq(pwm_handle_t *p_pwm, uint32_t freq); - -/** - **************************************************************************************** - * @brief Suspend some registers related to PWM configuration before sleep. - * @param[in] p_pwm: Pointer to a PWM handle which contains the configuration - * information for the specified PWM module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_suspend_reg(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief Restore some registers related to PWM configuration after sleep. - * This function must be used in conjunction with the hal_pwm_suspend_reg(). - * @param[in] p_pwm: Pointer to a PWM handle which contains the configuration - * information for the specified PWM module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_resume_reg(pwm_handle_t *p_pwm); - -/** - **************************************************************************************** - * @brief Initialize the PWM channels according to the specified - * parameters in the pwm_init_t. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration information for the specified PWM module. - * @param[in] p_config: PWM Channels configuration structure. - * @param[in] channel: PWM Channels to be configured. - * This parameter can be one of the following values: - * @arg @ref HAL_PWM_ACTIVE_CHANNEL_A :PWM Channel A is active - * @arg @ref HAL_PWM_ACTIVE_CHANNEL_B :PWM Channel B is active - * @arg @ref HAL_PWM_ACTIVE_CHANNEL_C :PWM Channel C is active - * @arg @ref HAL_PWM_ACTIVE_CHANNEL_ALL :All Channels are active - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwm_config_channel(pwm_handle_t *p_pwm, pwm_channel_init_t *p_config, - hal_pwm_active_channel_t channel); - -/** @} */ - -/** @addtogroup PWM_Exported_Functions_Group3 Peripheral Control and State functions - * @brief PWM Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral Control and State functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the PWM handle state. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the PWM handle state. - * @param[in] p_pwm: Pointer to a PWM handle that contains the configuration - * information for the specified PWM module. - * @retval ::HAL_PWM_STATE_RESET: Peripheral is not initialized or disabled. - * @retval ::HAL_PWM_STATE_READY: Peripheral is initialized and ready for use. - * @retval ::HAL_PWM_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_PWM_STATE_ERROR: Reception process is ongoing. - **************************************************************************************** - */ -hal_pwm_state_t hal_pwm_get_state(pwm_handle_t *p_pwm); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_PWM_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwr.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwr.h deleted file mode 100755 index cbf4eea..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_pwr.h +++ /dev/null @@ -1,481 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_pwr.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PWR HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_PWR PWR - * @brief PWR HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_PWR_H__ -#define __GR55xx_HAL_PWR_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_pwr.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ - -/** @addtogroup HAL_PWR_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_PWR_SLEEP_ELAPSED_HANDLER HAL PWR sleep elapsed handler define - * @{ - */ - -/** - * @brief PWR Sleep Timer Elapsed callback - */ - -typedef void (*pwr_slp_elapsed_handler_t)(void); - -/** @} */ - -/** @defgroup HAL_PWR_CALLBACK_HANDLER PWR callback handle - * @{ - */ - -/** - * @brief PWR callback handle Structure definition - */ -typedef struct _hal_pwr_handler { - pwr_slp_elapsed_handler_t pwr_slp_elapsed_hander; /**< PWR sleep timer elapsed callback */ -} hal_pwr_handler_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_PWR_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins - * @{ - */ -#define PWR_EXTWKUP_PIN0 LL_PWR_EXTWKUP_PIN0 /**< External wakeup pin 0 */ -#define PWR_EXTWKUP_PIN1 LL_PWR_EXTWKUP_PIN1 /**< External wakeup pin 1 */ -#define PWR_EXTWKUP_PIN2 LL_PWR_EXTWKUP_PIN2 /**< External wakeup pin 2 */ -#define PWR_EXTWKUP_PIN3 LL_PWR_EXTWKUP_PIN3 /**< External wakeup pin 3 */ -#define PWR_EXTWKUP_PIN4 LL_PWR_EXTWKUP_PIN4 /**< External wakeup pin 4 */ -#define PWR_EXTWKUP_PIN5 LL_PWR_EXTWKUP_PIN5 /**< External wakeup pin 5 */ -#define PWR_EXTWKUP_PIN6 LL_PWR_EXTWKUP_PIN6 /**< External wakeup pin 6 */ -#define PWR_EXTWKUP_PIN7 LL_PWR_EXTWKUP_PIN7 /**< External wakeup pin 7 */ -#define PWR_EXTWKUP_PIN_ALL LL_PWR_EXTWKUP_PIN_ALL /**< External wakeup pin 0 ~ 7 */ -/** @} */ - -/** @defgroup PWR_WakeUp_Conditions PWR Wakeup Condition - * @{ - */ -#define PWR_WKUP_COND_EXT LL_PWR_WKUP_COND_EXT /**< External wakeup: AON_GPIO */ -#define PWR_WKUP_COND_TIMER LL_PWR_WKUP_COND_TIMER /**< AON Timer wakeup */ -#define PWR_WKUP_COND_BLE LL_PWR_WKUP_COND_BLE /**< BLE wakeup */ -#define PWR_WKUP_COND_CALENDAR LL_PWR_WKUP_COND_CALENDAR /**< Calendar wakeup */ -#define PWR_WKUP_COND_BOD_FEDGE LL_PWR_WKUP_COND_BOD_FEDGE /**< PMU Bod falling edge wakeup */ -#define PWR_WKUP_COND_MSIO_COMP LL_PWR_WKUP_COND_MSIO_COMP /**< Msio comparator wakeup */ -#define PWR_WKUP_COND_ALL LL_PWR_WKUP_COND_ALL /**< All wakeup sources mask */ - -/** @} */ - -/** @defgroup PWR_External_WakeUp_Type PWR External Wakeup Type - * @{ - */ -#define PWR_EXTWKUP_TYPE_LOW LL_PWR_EXTWKUP_TYPE_LOW /**< Low level wakeup */ -#define PWR_EXTWKUP_TYPE_HIGH LL_PWR_EXTWKUP_TYPE_HIGH /**< High level wakeup */ -#define PWR_EXTWKUP_TYPE_RISING LL_PWR_EXTWKUP_TYPE_RISING /**< Rising edge wakeup */ -#define PWR_EXTWKUP_TYPE_FALLING LL_PWR_EXTWKUP_TYPE_FALLING /**< Falling edge wakeup */ -/** @} */ - -/** @defgroup PWR_Sleep_Timer_Mode PWR Sleep Timer Mode - * @{ - */ -#define PWR_SLP_TIMER_MODE_NORMAL 0x0U /**< Start counting after sleeping and disabled when waked up */ -#define PWR_SLP_TIMER_MODE_SINGLE 0x1U /**< Single mode(keep counting until finished) */ -#define PWR_SLP_TIMER_MODE_RELOAD 0x2U /**< Auto reload */ -#define PWR_SLP_TIMER_MODE_DISABLE 0x3U /**< Disabled (used for reset mode) */ -/** @} */ - -/** @defgroup PWR_Timer_Type PWR Timer Type - * @note Only available on GR5515_C and later versions. - * @{ - */ -#define PWR_TIMER_TYPE_CAL_TIMER LL_PWR_TIMER_READ_SEL_CAL_TIMER /**< Calendar timer */ -#define PWR_TIMER_TYPE_AON_WDT LL_PWR_TIMER_READ_SEL_AON_WDT /**< AON watchdog timer */ -#define PWR_TIMER_TYPE_SLP_TIMER LL_PWR_TIMER_READ_SEL_SLP_TIMER /**< Sleep timer */ -#define PWR_TIMER_TYPE_CAL_ALARM LL_PWR_TIMER_READ_SEL_CAL_ALARM /**< Calendar timer */ -/** @} */ - - -/** @defgroup PWR_Memory_Power_State Memory Power State - * @{ - */ -#define PWR_MEM_POWER_OFF LL_PWR_MEM_POWER_OFF /**< Power off */ -#define PWR_MEM_POWER_FULL LL_PWR_MEM_POWER_FULL /**< Full power */ -#define PWR_MEM_POWER_RETENTION LL_PWR_MEM_POWER_RETENTION /**< Power retention, low valtage mode */ -/** @} */ - -/** @defgroup PWR_Communication_Power_State Communication Power State - * @{ - */ -#define PWR_COMM_TIMER_POWER_DOWN 0x0U /**< Power down communication timer */ -#define PWR_COMM_TIMER_POWER_UP 0x1U /**< Power on communication timer */ -#define PWR_COMM_CORE_POWER_DOWN 0x0U /**< Power down communication core */ -#define PWR_COMM_CORE_POWER_UP 0x1U /**< Power on communication core */ -/** @} */ - -/** @defgroup PWR_Communication_Mode Communication Mode - * @{ - */ -#define PWR_COMM_TIMER_MODE_RESET 0x0U /**< Communication timer in reset mode */ -#define PWR_COMM_TIMER_MODE_RUNNING 0x1U /**< Communication timer in running mode */ -#define PWR_COMM_CORE_MODE_RESET 0x0U /**< Communication core in reset mode */ -#define PWR_COMM_CORE_MODE_RUNNING 0x1U /**< Communication core in running mode */ -/** @} */ - -/** @defgroup PWR_Timeout_definition PWR Timeout definition - * @{ - */ -#define HAL_PWR_TIMEOUT_DEFAULT_VALUE ((uint32_t)0x000FFFFF) /**< 0xFFFFF counts */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @addtogroup PWR_Private_Macros PWR Private Macros - * @{ - */ - -/** - * @brief Check if PWR wakeup condition is valid. - * @param __COND__ PWR wakeup condition. - * @retval SET (__COND__ is valid) or RESET (__COND__ is invalid) - */ -#define IS_PWR_WAKEUP_CONDITION(__COND__) ((((__COND__) & PWR_WKUP_COND_ALL) != 0x00U) && \ - (((__COND__) & ~PWR_WKUP_COND_ALL) == 0x00U)) - -/** - * @brief Check if PWR external wakeup pin is valid. - * @param __PIN__ PWR external wakeup pin. - * @retval SET (__PIN__ is valid) or RESET (__PIN__ is invalid) - */ -#define IS_PWR_EXT_WAKEUP_PIN(__PIN__) ((((__PIN__) & PWR_EXTWKUP_PIN_ALL) != 0x00U) && \ - (((__PIN__) & ~PWR_EXTWKUP_PIN_ALL) == 0x00U)) - -/** - * @brief Check if PWR sleep timer mode is valid. - * @param __MODE__ PWR sleep timer mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PWR_SLP_TIMER_MODE(__MODE__) (((__MODE__) == PWR_SLP_TIMER_MODE_NORMAL) || \ - ((__MODE__) == PWR_SLP_TIMER_MODE_SINGLE) || \ - ((__MODE__) == PWR_SLP_TIMER_MODE_RELOAD) || \ - ((__MODE__) == PWR_SLP_TIMER_MODE_DISABLE)) - -/** - * @brief Check if PWR external wakeup type is valid. - * @param __TYPE__ PWR external wakeup type. - * @retval SET (__TYPE__ is valid) or RESET (__TYPE__ is invalid) - */ -#define IS_PWR_EXTWKUP_TYPE(__TYPE__) (((__TYPE__) == PWR_EXTWKUP_TYPE_LOW) || \ - ((__TYPE__) == PWR_EXTWKUP_TYPE_HIGH) || \ - ((__TYPE__) == PWR_EXTWKUP_TYPE_RISING) || \ - ((__TYPE__) == PWR_EXTWKUP_TYPE_FALLING)) - -/** - * @brief Check if PWR memory block is valid. - * @param __BLOCK__ PWR memory block. - * @retval SET (__BLOCK__ is valid) or RESET (__BLOCK__ is invalid) - */ -#define IS_PWR_MEM_BLOCK(__BLOCK__) ((((__BLOCK__) & PWR_MEM_ALL) != 0x00U) && \ - (((__BLOCK__) & ~PWR_MEM_ALL) == 0x00U)) - -/** - * @brief Check if PWR memory power state is valid. - * @param __STATE__ PWR memory power state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_PWR_MEM_POWER_STAT(__STATE__) (((__STATE__) == PWR_MEM_POWER_OFF) || \ - ((__STATE__) == PWR_MEM_POWER_FULL) || \ - ((__STATE__) == PWR_MEM_POWER_RETENTION)) - -/** - * @brief Check if PWR BLE communication timer power state is valid. - * @param __STATE__ PWR BLE communication timer power state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_PWR_COMM_TIMER_POWER_STAT(__STATE__) (((__STATE__) == PWR_COMM_TIMER_POWER_DOWN) || \ - ((__STATE__) == PWR_COMM_TIMER_POWER_UP)) - -/** - * @brief Check if PWR BLE communication core power state is valid. - * @param __STATE__ PWR BLE communication core power state. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_PWR_COMM_CORE_POWER_STAT(__STATE__) (((__STATE__) == PWR_COMM_CORE_POWER_DOWN) || \ - ((__STATE__) == PWR_COMM_CORE_POWER_UP)) - -/** - * @brief Check if PWR BLE communication timer mode is valid. - * @param __MODE__ PWR BLE communication timer mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PWR_COMM_TIMER_MODE(__MODE__) (((__MODE__) == PWR_COMM_TIMER_MODE_RESET) || \ - ((__MODE__) == PWR_COMM_TIMER_MODE_RUNNING)) - -/** - * @brief Check if PWR BLE communication core mode is valid. - * @param __MODE__ PWR BLE communication core mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_PWR_COMM_CORE_MODE(__MODE__) (((__MODE__) == PWR_COMM_CORE_MODE_RESET) || \ - ((__MODE__) == PWR_COMM_CORE_MODE_RUNNING)) - -/** - * @brief Check if PWR sleep timer type is valid. - * @param __TYPE__ PWR sleep timer type. - * @retval SET (__TYPE__ is valid) or RESET (__TYPE__ is invalid) - */ -#define IS_PWR_PWR_TIMER_TYPE(__TYPE__) (((__TYPE__) == PWR_TIMER_TYPE_CAL_TIMER) || \ - ((__TYPE__) == PWR_TIMER_TYPE_AON_WDT) || \ - ((__TYPE__) == PWR_TIMER_TYPE_SLP_TIMER) || \ - ((__TYPE__) == PWR_TIMER_TYPE_CAL_ALARM)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_PWR_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup PWR_Exported_Functions_Group1 Low Power mode configuration functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Set the DeepSleep WakeUp Condition - * @param[in] condition: This parameter can be a combination of the following values: - * @arg @ref PWR_WKUP_COND_EXT - * @arg @ref PWR_WKUP_COND_TIMER - * @arg @ref PWR_WKUP_COND_BLE - * @arg @ref PWR_WKUP_COND_CALENDAR - * @arg @ref PWR_WKUP_COND_BOD_FEDGE - * @arg @ref PWR_WKUP_COND_MSIO_COMP - * @arg @ref PWR_WKUP_COND_ALL - * @note When @ref PWR_WKUP_COND_EXT is set, use @ref hal_pwr_config_ext_wakeup() to - * configure wakeup pins and pin trigger type. - * When @ref PWR_WKUP_COND_TIMER is set, use @ref hal_pwr_config_timer_wakeup() - * to configure the time count to wakeup. - * When @ref PWR_WKUP_COND_ALL is set, use @ref hal_pwr_config_ext_wakeup() and - * @ref hal_pwr_config_timer_wakeup() to configure - * AON timer and External AON GPIO. - **************************************************************************************** - */ -void hal_pwr_set_wakeup_condition(uint32_t condition); - -/** - **************************************************************************************** - * @brief Configure the AON Sleep Timer mode and count used to wakeup MCU. - * @param[in] timer_mode: Specifies the sleep timer mode. - * This parameter can be a combination of the following values: - * @arg @ref PWR_SLP_TIMER_MODE_NORMAL - * @arg @ref PWR_SLP_TIMER_MODE_SINGLE - * @arg @ref PWR_SLP_TIMER_MODE_RELOAD - * @arg @ref PWR_SLP_TIMER_MODE_DISABLE - * @param[in] load_count: Count value of the AON Sleep Timer. - * @note The sleep clock of AON Timer is 32 KHz. - **************************************************************************************** - */ -void hal_pwr_config_timer_wakeup(uint8_t timer_mode, uint32_t load_count); - -/** - **************************************************************************************** - * @brief Configure the External AON GPIO pins and pin trigger type that is used to wakeup MCU. - * @param[in] ext_wakeup_pinx: This parameter can be a combination of the following values: - * @arg @ref PWR_EXTWKUP_PIN0 - * @arg @ref PWR_EXTWKUP_PIN1 - * @arg @ref PWR_EXTWKUP_PIN2 - * @arg @ref PWR_EXTWKUP_PIN3 - * @arg @ref PWR_EXTWKUP_PIN4 - * @arg @ref PWR_EXTWKUP_PIN5 - * @arg @ref PWR_EXTWKUP_PIN_ALL - * @param[in] ext_wakeup_type: This parameter can be a combination of the following values: - * @arg @ref PWR_EXTWKUP_TYPE_LOW - * @arg @ref PWR_EXTWKUP_TYPE_HIGH - * @arg @ref PWR_EXTWKUP_TYPE_RISING - * @arg @ref PWR_EXTWKUP_TYPE_FALLING - * @note When the level of any selected GPIO pin changes in accordance with the set - * trigger type, MCU will be waked up from DeepSleep mode. - **************************************************************************************** - */ -void hal_pwr_config_ext_wakeup(uint32_t ext_wakeup_pinx, uint32_t ext_wakeup_type); - -/** - **************************************************************************************** - * @brief Disable the interrupt wake-up function of the specified AON GPIO pin. - * @param[in] disable_wakeup_pinx: This parameter can be a combination of the following values: - * @arg @ref PWR_EXTWKUP_PIN0 - * @arg @ref PWR_EXTWKUP_PIN1 - * @arg @ref PWR_EXTWKUP_PIN2 - * @arg @ref PWR_EXTWKUP_PIN3 - * @arg @ref PWR_EXTWKUP_PIN4 - * @arg @ref PWR_EXTWKUP_PIN5 - * @arg @ref PWR_EXTWKUP_PIN_ALL - **************************************************************************************** - */ -void hal_pwr_disable_ext_wakeup(uint32_t disable_wakeup_pinx); - -/** - **************************************************************************************** - * @brief Enters DeepSleep mode. - * @note In DeepSleep mode, all I/O pins keep the same state as in Run mode. - **************************************************************************************** -*/ -void hal_pwr_enter_chip_deepsleep(void); - -/** @} */ - -/** @addtogroup PWR_Exported_Functions_Group2 BLE Communication timer and core configuration function - * @{ - */ - -/** - **************************************************************************************** - * @brief Set the power state of communication timer and communication core in running mode. - * @param[in] timer_power_state: This parameter can be one of the following values: - * @arg @ref PWR_COMM_TIMER_POWER_UP - * @arg @ref PWR_COMM_TIMER_POWER_DOWN - * @param[in] core_power_state: This parameter can be one of the following values: - * @arg @ref PWR_COMM_CORE_POWER_UP - * @arg @ref PWR_COMM_CORE_POWER_DOWN - **************************************************************************************** - */ -void hal_pwr_set_comm_power(uint32_t timer_power_state, uint32_t core_power_state); - -/** - **************************************************************************************** - * @brief Set the work mode of communication timer and communication core. - * @param[in] timer_mode: This parameter can be one of the following values: - * @arg @ref PWR_COMM_TIMER_MODE_RESET - * @arg @ref PWR_COMM_TIMER_MODE_RUNNING - * @param[in] core_mode: This parameter can be one of the following values: - * @arg @ref PWR_COMM_CORE_MODE_RESET - * @arg @ref PWR_COMM_CORE_MODE_RUNNING - **************************************************************************************** - */ -void hal_pwr_set_comm_mode(uint32_t timer_mode, uint32_t core_mode); - -/** - **************************************************************************************** - * @brief Get the current value of specified timer. - * @note Only available on GR5515_C and later versions. - * @param[in] timer_type: This parameter can be one of the following values: - * @arg @ref PWR_TIMER_TYPE_CAL_TIMER - * @arg @ref PWR_TIMER_TYPE_AON_WDT - * @arg @ref PWR_TIMER_TYPE_SLP_TIMER - * @arg @ref PWR_TIMER_TYPE_CAL_ALARM - * @param[out] p_value: Pointer to an integer storing current value - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_pwr_get_timer_current_value(uint32_t timer_type, uint32_t *p_value); - -/** @} */ - -/** @addtogroup PWR_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle PWR Sleep Timer interrupt request. - * @note Only available on GR5515_C and later versions. - **************************************************************************************** - */ -void hal_pwr_sleep_timer_irq_handler(void); - -/** - **************************************************************************************** - * @brief PWR Sleep Timer Elapsed callback. - * @note Only available on GR5515_C and later versions. - * This function should not be modified. When the callback is needed, - * the hal_pwr_sleep_timer_elapsed_callback can be implemented in the user file. - **************************************************************************************** - */ -void hal_pwr_sleep_timer_elapsed_callback(void); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_PWR_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_qspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_qspi.h deleted file mode 100755 index 1389490..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_qspi.h +++ /dev/null @@ -1,1185 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_qspi.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of QSPI HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_QSPI QSPI - * @brief QSPI HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_QSPI_H__ -#define __GR55xx_HAL_QSPI_H__ - -/* Includes ------------------------------------------------------------------*/ -#include -#include "gr55xx_ll_spi.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX 7 -#define QSPI_CYCLE_MAX 31 - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_QSPI_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_QSPI_state HAL QSPI state - * @{ - */ - -/** - * @brief HAL QSPI State Enumerations definition - */ -typedef enum { - HAL_QSPI_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_QSPI_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_QSPI_STATE_BUSY = 0x02, /**< Peripheral in indirect mode and busy */ - HAL_QSPI_STATE_BUSY_INDIRECT_TX = 0x12, /**< Peripheral in indirect mode with transmission ongoing */ - HAL_QSPI_STATE_BUSY_INDIRECT_RX = 0x22, /**< Peripheral in indirect mode with reception ongoing */ - HAL_QSPI_STATE_ABORT = 0x08, /**< Peripheral with abort request ongoing */ - HAL_QSPI_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_qspi_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_QSPI_STRUCTURES Structures - * @{ - */ - -/** @defgroup QSPI_Configuration QSPI Configuration - * @{ - */ - -/** - * @brief QSPI init Structure definition - */ -typedef struct _qspi_init_t { - uint32_t clock_prescaler; /**< Specifies the prescaler factor for generating clock based on the AHB clock. - This parameter can be a number between 0 and 0xFFFF */ - - uint32_t clock_mode; /**< Specifies the Clock Mode. It indicates the level that clock takes between commands. - This parameter can be a value of @ref QSPI_Clock_Mode */ - - uint32_t rx_sample_delay; /**< Specifies the RX sample delay. It is used to delay the sample of the RX input port. - This parameter can be a number between 0 and 0x7 */ -} qspi_init_t; -/** @} */ - -/** @defgroup QSPI_handle QSPI handle - * @{ - */ - -/** - * @brief QSPI handle Structure definition - */ -typedef struct _qspi_handle { - ssi_regs_t *p_instance; /**< QSPI registers base address */ - - qspi_init_t init; /**< QSPI communication parameters */ - - uint8_t *p_tx_buffer; /**< Pointer to QSPI Tx transfer Buffer */ - - __IO uint32_t tx_xfer_size; /**< QSPI Tx Transfer size */ - - __IO uint32_t tx_xfer_count; /**< QSPI Tx Transfer Counter */ - - uint8_t *p_rx_buffer; /**< Pointer to QSPI Rx transfer Buffer */ - - __IO uint32_t rx_xfer_size; /**< QSPI Rx Transfer size */ - - __IO uint32_t rx_xfer_count; /**< QSPI Rx Transfer Counter */ - - void (*write_fifo)(struct _qspi_handle *p_qspi); /**< Pointer to QSPI Tx transfer FIFO write function */ - - void (*read_fifo)(struct _qspi_handle *p_qspi); /**< Pointer to QSPI Rx transfer FIFO read function */ - - dma_handle_t *p_dma; /**< QSPI Rx/Tx DMA Handle parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_qspi_state_t state; /**< QSPI communication state */ - - __IO uint32_t error_code; /**< QSPI Error code */ - - uint32_t timeout; /**< Timeout for the QSPI memory access */ - - uint32_t retention[9]; /**< DMA important register information. */ -} qspi_handle_t; -/** @} */ - -/** @defgroup QSPI_Command QSPI command - * @{ - */ - -/** - * @brief QSPI command Structure definition - */ -typedef struct _qspi_command_t { - uint32_t instruction; /**< Specifies the Instruction to be sent. - This parameter can be a value (8-bit) between 0x00 and 0xFF. */ - - uint32_t address; /**< Specifies the Address to be sent. - Size from 1 to 4 bytes according AddressSize. - This parameter can be a value (32-bits) between 0x0 and 0xFFFFFFFF. */ - - uint32_t instruction_size; /**< Specifies the Instruction Size. - This parameter can be a value of @ref QSPI_Instruction_Size. */ - - uint32_t address_size; /**< Specifies the Address Size. - This parameter can be a value of @ref QSPI_Address_Size. */ - - uint32_t dummy_cycles; /**< Specifies the Number of Dummy Cycles. - This parameter can be a number between 0 and 31. */ - - uint32_t data_size; /**< Specifies the QSPI address width. - This parameter can be a value of @ref QSPI_Data_Size. */ - - uint32_t instruction_address_mode; /**< Specifies the Instruction and Address Mode. - This parameter can be a value of @ref QSPI_Inst_Addr_Mode. */ - - uint32_t data_mode; /**< Specifies the Data Mode (used for dummy cycles and data phases). - This parameter can be a value of @ref QSPI_Data_Mode. */ - - uint32_t length; /**< Specifies the number of data to transfer. (This is the number of bytes). - This parameter can be any value between 0 and 0xFFFFFFFF - (0 means undefined length until end of memory). */ -} qspi_command_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_QSPI_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_QSPI_Callback Callback - * @{ - */ - -/** - * @brief HAL_QSPI Callback function definition - */ - -typedef struct _hal_qspi_callback { - void (*qspi_msp_init)(qspi_handle_t *p_qspi); /**< QSPI init MSP callback */ - void (*qspi_msp_deinit)(qspi_handle_t *p_qspi); /**< QSPI de-init MSP callback */ - void (*qspi_error_callback)(qspi_handle_t *p_qspi); /**< QSPI error callback */ - void (*qspi_abort_cplt_callback)(qspi_handle_t *p_qspi); /**< QSPI abort complete callback */ - void (*qspi_fifo_threshold_callback)(qspi_handle_t *p_qspi); /**< QSPI FIFO threshold callback */ - void (*qspi_rx_cplt_callback)(qspi_handle_t *p_qspi); /**< QSPI rx transfer completed callback */ - void (*qspi_tx_cplt_callback)(qspi_handle_t *p_qspi); /**< QSPI tx transfer completed callback */ -} hal_qspi_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_QSPI_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup QSPI_Exported_Constants QSPI Exported Constants - * @{ - */ - -/** @defgroup QSPI_Error_Code QSPI Error Code - * @{ - */ -#define HAL_QSPI_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_QSPI_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_QSPI_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_QSPI_ERROR_DMA ((uint32_t)0x00000004) /**< DMA transfer error */ -#define HAL_QSPI_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameter error */ -/** @} */ - -/** @defgroup QSPI_Clock_Mode QSPI Clock Mode - * @{ - */ -#define QSPI_CLOCK_MODE_0 (LL_SSI_SCPOL_LOW | LL_SSI_SCPHA_1EDGE) /**< Inactive state of CLK is low; - CLK toggles at the start of - the first data bit */ -#define QSPI_CLOCK_MODE_1 (LL_SSI_SCPOL_LOW | LL_SSI_SCPHA_2EDGE) /**< Inactive state of CLK is low; - CLK toggles in the middle of - the first data bit */ -#define QSPI_CLOCK_MODE_2 (LL_SSI_SCPOL_HIGH | LL_SSI_SCPHA_1EDGE) /**< Inactive state of CLK is high; - CLK toggles at the start of - the first data bit */ -#define QSPI_CLOCK_MODE_3 (LL_SSI_SCPOL_HIGH | LL_SSI_SCPHA_2EDGE) /**< Inactive state of CLK is high; - CLK toggles in the middle of - the first data bit */ -/** @} */ - -/** @defgroup QSPI_Data_Mode QSPI Data Mode - * @{ - */ -#define QSPI_DATA_MODE_SPI LL_SSI_FRF_SPI /**< Standard SPI Frame Format */ -#define QSPI_DATA_MODE_DUALSPI LL_SSI_FRF_DUALSPI /**< Dual SPI Frame Format */ -#define QSPI_DATA_MODE_QUADSPI LL_SSI_FRF_QUADSPI /**< Quad SPI Frame Format */ -/** @} */ - -/** @defgroup QSPI_Instruction_Size QSPI Instruction Size - * @{ - */ -#define QSPI_INSTSIZE_00_BITS LL_SSI_INSTSIZE_0BIT /**< 0-bit (No Instruction) */ -#define QSPI_INSTSIZE_04_BITS LL_SSI_INSTSIZE_4BIT /**< 4-bit Instruction */ -#define QSPI_INSTSIZE_08_BITS LL_SSI_INSTSIZE_8BIT /**< 8-bit Instruction */ -#define QSPI_INSTSIZE_16_BITS LL_SSI_INSTSIZE_16BIT /**< 16-bit Instruction */ -/** @} */ - -/** @defgroup QSPI_Address_Size QSPI Address Size - * @{ - */ -#define QSPI_ADDRSIZE_00_BITS LL_SSI_ADDRSIZE_0BIT /**< 0-bit address */ -#define QSPI_ADDRSIZE_04_BITS LL_SSI_ADDRSIZE_4BIT /**< 4-bit address */ -#define QSPI_ADDRSIZE_08_BITS LL_SSI_ADDRSIZE_8BIT /**< 8-bit address */ -#define QSPI_ADDRSIZE_12_BITS LL_SSI_ADDRSIZE_12BIT /**< 12-bit address */ -#define QSPI_ADDRSIZE_16_BITS LL_SSI_ADDRSIZE_16BIT /**< 16-bit address */ -#define QSPI_ADDRSIZE_20_BITS LL_SSI_ADDRSIZE_20BIT /**< 20-bit address */ -#define QSPI_ADDRSIZE_24_BITS LL_SSI_ADDRSIZE_24BIT /**< 24-bit address */ -#define QSPI_ADDRSIZE_28_BITS LL_SSI_ADDRSIZE_28BIT /**< 28-bit address */ -#define QSPI_ADDRSIZE_32_BITS LL_SSI_ADDRSIZE_32BIT /**< 32-bit address */ -/** @} */ - -/** @defgroup QSPI_Data_Size Data Width - * @{ - */ -#define QSPI_DATASIZE_04_BITS LL_SSI_DATASIZE_4BIT /**< Data length for SPI transfer: 4 bits */ -#define QSPI_DATASIZE_05_BITS LL_SSI_DATASIZE_5BIT /**< Data length for SPI transfer: 5 bits */ -#define QSPI_DATASIZE_06_BITS LL_SSI_DATASIZE_6BIT /**< Data length for SPI transfer: 6 bits */ -#define QSPI_DATASIZE_07_BITS LL_SSI_DATASIZE_7BIT /**< Data length for SPI transfer: 7 bits */ -#define QSPI_DATASIZE_08_BITS LL_SSI_DATASIZE_8BIT /**< Data length for SPI transfer: 8 bits */ -#define QSPI_DATASIZE_09_BITS LL_SSI_DATASIZE_9BIT /**< Data length for SPI transfer: 9 bits */ -#define QSPI_DATASIZE_10_BITS LL_SSI_DATASIZE_10BIT /**< Data length for SPI transfer: 10 bits */ -#define QSPI_DATASIZE_11_BITS LL_SSI_DATASIZE_11BIT /**< Data length for SPI transfer: 11 bits */ -#define QSPI_DATASIZE_12_BITS LL_SSI_DATASIZE_12BIT /**< Data length for SPI transfer: 12 bits */ -#define QSPI_DATASIZE_13_BITS LL_SSI_DATASIZE_13BIT /**< Data length for SPI transfer: 13 bits */ -#define QSPI_DATASIZE_14_BITS LL_SSI_DATASIZE_14BIT /**< Data length for SPI transfer: 14 bits */ -#define QSPI_DATASIZE_15_BITS LL_SSI_DATASIZE_15BIT /**< Data length for SPI transfer: 15 bits */ -#define QSPI_DATASIZE_16_BITS LL_SSI_DATASIZE_16BIT /**< Data length for SPI transfer: 16 bits */ -#define QSPI_DATASIZE_17_BITS LL_SSI_DATASIZE_17BIT /**< Data length for SPI transfer: 17 bits */ -#define QSPI_DATASIZE_18_BITS LL_SSI_DATASIZE_18BIT /**< Data length for SPI transfer: 18 bits */ -#define QSPI_DATASIZE_19_BITS LL_SSI_DATASIZE_19BIT /**< Data length for SPI transfer: 19 bits */ -#define QSPI_DATASIZE_20_BITS LL_SSI_DATASIZE_20BIT /**< Data length for SPI transfer: 20 bits */ -#define QSPI_DATASIZE_21_BITS LL_SSI_DATASIZE_21BIT /**< Data length for SPI transfer: 21 bits */ -#define QSPI_DATASIZE_22_BITS LL_SSI_DATASIZE_22BIT /**< Data length for SPI transfer: 22 bits */ -#define QSPI_DATASIZE_23_BITS LL_SSI_DATASIZE_23BIT /**< Data length for SPI transfer: 23 bits */ -#define QSPI_DATASIZE_24_BITS LL_SSI_DATASIZE_24BIT /**< Data length for SPI transfer: 24 bits */ -#define QSPI_DATASIZE_25_BITS LL_SSI_DATASIZE_25BIT /**< Data length for SPI transfer: 25 bits */ -#define QSPI_DATASIZE_26_BITS LL_SSI_DATASIZE_26BIT /**< Data length for SPI transfer: 26 bits */ -#define QSPI_DATASIZE_27_BITS LL_SSI_DATASIZE_27BIT /**< Data length for SPI transfer: 27 bits */ -#define QSPI_DATASIZE_28_BITS LL_SSI_DATASIZE_28BIT /**< Data length for SPI transfer: 28 bits */ -#define QSPI_DATASIZE_29_BITS LL_SSI_DATASIZE_29BIT /**< Data length for SPI transfer: 29 bits */ -#define QSPI_DATASIZE_30_BITS LL_SSI_DATASIZE_30BIT /**< Data length for SPI transfer: 30 bits */ -#define QSPI_DATASIZE_31_BITS LL_SSI_DATASIZE_31BIT /**< Data length for SPI transfer: 31 bits */ -#define QSPI_DATASIZE_32_BITS LL_SSI_DATASIZE_32BIT /**< Data length for SPI transfer: 32 bits */ - -/** @} */ - - -/** @defgroup QSPI_Inst_Addr_Mode QSPI Instruction and Address Mode - * @{ - */ -#define QSPI_INST_ADDR_ALL_IN_SPI LL_SSI_INST_ADDR_ALL_IN_SPI /**< Instruction and address are sent in - SPI mode */ -#define QSPI_INST_IN_SPI_ADDR_IN_SPIFRF LL_SSI_INST_IN_SPI_ADDR_IN_SPIFRF /**< Instruction is sent in SPI mode, - address is sent in Daul/Quad SPI mode */ -#define QSPI_INST_ADDR_ALL_IN_SPIFRF LL_SSI_INST_ADDR_ALL_IN_SPIFRF /**< Instruction and address are sent in - Daul/Quad SPI mode */ -/** @} */ - -/** @defgroup QSPI_Flags QSPI Flags - * @{ - */ -#define QSPI_FLAG_DCOL LL_SSI_SR_DCOL /**< Data collision error flag */ -#define QSPI_FLAG_TXE LL_SSI_SR_TXE /**< Transmission error flag */ -#define QSPI_FLAG_RFF LL_SSI_SR_RFF /**< Rx FIFO full flag */ -#define QSPI_FLAG_RFNE LL_SSI_SR_RFNE /**< Rx FIFO not empty flag */ -#define QSPI_FLAG_TFE LL_SSI_SR_TFE /**< Tx FIFO empty flag */ -#define QSPI_FLAG_TFNF LL_SSI_SR_TFNF /**< Tx FIFO not full flag */ -#define QSPI_FLAG_BUSY LL_SSI_SR_BUSY /**< Busy flag */ -/** @} */ - -/** @defgroup QSPI_Interrupts QSPI Interrupts - * @{ - */ -#define QSPI_IT_MST LL_SSI_IS_MST /**< Multi-Master Contention Interrupt flag */ -#define QSPI_IT_RXF LL_SSI_IS_RXF /**< Receive FIFO Full Interrupt flag */ -#define QSPI_IT_RXO LL_SSI_IS_RXO /**< Receive FIFO Overflow Interrupt flag */ -#define QSPI_IT_RXU LL_SSI_IS_RXU /**< Receive FIFO Underflow Interrupt flag */ -#define QSPI_IT_TXO LL_SSI_IS_TXO /**< Transmit FIFO Overflow Interrupt flag */ -#define QSPI_IT_TXE LL_SSI_IS_TXE /**< Transmit FIFO Empty Interrupt flag */ -/** @} */ - -/** @defgroup QSPI_Timeout_definition QSPI Timeout_definition - * @{ - */ -#define HAL_QSPI_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup QSPI_Exported_Macros QSPI Exported Macros - * @{ - */ - -/** @brief Reset QSPI handle states. - * @param HANDLE QSPI handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_RESET_HANDLE_STATE(qspi_handle_t *HANDLE) -{ - HANDLE->state = HAL_QSPI_STATE_RESET; -} - -/** @brief Enable the specified QSPI peripheral. - * @param HANDLE Specifies the QSPI Handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_ENABLE(qspi_handle_t *HANDLE) -{ - SET_BITS(HANDLE->p_instance->SSI_EN, SSI_SSIEN_EN); -} - -/** @brief Disable the specified QSPI peripheral. - * @param HANDLE Specifies the QSPI Handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_DISABLE(qspi_handle_t *HANDLE) -{ - CLEAR_BITS(HANDLE->p_instance->SSI_EN, SSI_SSIEN_EN); -} - -/** @brief Enable the QSPI DMA TX Request. - * @param HANDLE Specifies the QSPI Handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_ENABLE_DMATX(qspi_handle_t *HANDLE) -{ - SET_BITS(HANDLE->p_instance->DMAC, SSI_DMAC_TDMAE); -} - -/** @brief Enable the QSPI DMA RX Request. - * @param HANDLE Specifies the QSPI Handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_ENABLE_DMARX(qspi_handle_t *HANDLE) -{ - SET_BITS(HANDLE->p_instance->DMAC, SSI_DMAC_RDMAE); -} - -/** @brief Disable the QSPI DMA TX Request. - * @param HANDLE Specifies the QSPI Handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_DISABLE_DMATX(qspi_handle_t *HANDLE) -{ - CLEAR_BITS(HANDLE->p_instance->DMAC, SSI_DMAC_TDMAE); -} - -/** @brief Disable the QSPI DMA RX Request. - * @param HANDLE Specifies the QSPI Handle. - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_DISABLE_DMARX(qspi_handle_t *HANDLE) -{ - CLEAR_BITS(HANDLE->p_instance->DMAC, SSI_DMAC_RDMAE); -} - -/** @brief Enable the specified QSPI interrupts. - * @param HANDLE Specifies the QSPI Handle. - * @param INTERRUPT Specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref QSPI_IT_MST Multi-Master Contention Interrupt enable - * @arg @ref QSPI_IT_RXF Receive FIFO Full Interrupt enable - * @arg @ref QSPI_IT_RXO Receive FIFO Overflow Interrupt enable - * @arg @ref QSPI_IT_RXU Receive FIFO Underflow Interrupt enable - * @arg @ref QSPI_IT_TXO Transmit FIFO Overflow Interrupt enable - * @arg @ref QSPI_IT_TXE Transmit FIFO Empty Interrupt enable - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_ENABLE_IT(qspi_handle_t *HANDLE, uint32_t INTERRUPT) -{ - SET_BITS(HANDLE->p_instance->INTMASK, INTERRUPT); -} - -/** @brief Disable the specified QSPI interrupts. - * @param HANDLE Specifies the QSPI handle. - * @param INTERRUPT Specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref QSPI_IT_MST Multi-Master Contention Interrupt enable - * @arg @ref QSPI_IT_RXF Receive FIFO Full Interrupt enable - * @arg @ref QSPI_IT_RXO Receive FIFO Overflow Interrupt enable - * @arg @ref QSPI_IT_RXU Receive FIFO Underflow Interrupt enable - * @arg @ref QSPI_IT_TXO Transmit FIFO Overflow Interrupt enable - * @arg @ref QSPI_IT_TXE Transmit FIFO Empty Interrupt enable - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_DISABLE_IT(qspi_handle_t *HANDLE, uint32_t INTERRUPT) -{ - CLEAR_BITS(HANDLE->p_instance->INTMASK, INTERRUPT); -} - -/** @brief Check whether the specified QSPI interrupt source is enabled or not. - * @param HANDLE Specifies the QSPI Handle. - * @param INTERRUPT Specifies the interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref QSPI_IT_MST Multi-Master Contention Interrupt enable - * @arg @ref QSPI_IT_RXF Receive FIFO Full Interrupt enable - * @arg @ref QSPI_IT_RXO Receive FIFO Overflow Interrupt enable - * @arg @ref QSPI_IT_RXU Receive FIFO Underflow Interrupt enable - * @arg @ref QSPI_IT_TXO Transmit FIFO Overflow Interrupt enable - * @arg @ref QSPI_IT_TXE Transmit FIFO Empty Interrupt enable - * @retval The new state of __IT__ (TRUE or FALSE). - */ -__STATIC_INLINE bool HAL_QSPI_GET_IT_SOURCE(qspi_handle_t *HANDLE, uint32_t INTERRUPT) -{ - return (READ_BITS(HANDLE->p_instance->INTSTAT, INTERRUPT) == INTERRUPT); -} - -/** @brief Check whether the specified QSPI flag is set or not. - * @param HANDLE Specifies the QSPI Handle. - * @param FLAG Specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref QSPI_FLAG_DCOL Data collision error flag - * @arg @ref QSPI_FLAG_TXE Transmission error flag - * @arg @ref QSPI_FLAG_RFF Rx FIFO full flag - * @arg @ref QSPI_FLAG_RFNE Rx FIFO not empty flag - * @arg @ref QSPI_FLAG_TFE Tx FIFO empty flag - * @arg @ref QSPI_FLAG_TFNF Tx FIFO not full flag - * @arg @ref QSPI_FLAG_BUSY Busy flag - * @retval The new state of FLAG (TRUE or FALSE). - */ -__STATIC_INLINE bool HAL_QSPI_GET_FLAG(qspi_handle_t *HANDLE, uint32_t FLAG) -{ - return ((READ_BITS(HANDLE->p_instance->STAT, FLAG) != 0) ? SET : RESET); -} - -/** @brief Clear the specified QSPI flag. - * @param HANDLE Specifies the QSPI Handle. - * @param FLAG Specifies the flag to clear. - * This parameter can be one of the following values: - * @arg @ref QSPI_FLAG_DCOL Data collision error flag - * @arg @ref QSPI_FLAG_TXE Transmission error flag - * @arg @ref QSPI_FLAG_RFF Rx FIFO full flag - * @arg @ref QSPI_FLAG_RFNE Rx FIFO not empty flag - * @arg @ref QSPI_FLAG_TFE Tx FIFO empty flag - * @arg @ref QSPI_FLAG_TFNF Tx FIFO not full flag - * @arg @ref QSPI_FLAG_BUSY Busy flag - * @retval None - */ -__STATIC_INLINE void HAL_QSPI_CLEAR_FLAG(qspi_handle_t *HANDLE, uint32_t FLAG) -{ - READ_BITS(HANDLE->p_instance->STAT, FLAG); -} - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup QSPI_Private_Macro QSPI Private Macros - * @{ - */ - -/** @brief Check if QSPI Clock Prescaler is valid. - * @param PRESC QSPI Clock Prescaler. - * @retval SET (__PRESCALER__ is valid) or RESET (__PRESCALER__ is invalid) - */ -__STATIC_INLINE bool IS_QSPI_CLOCK_PRESCALER(uint32_t PRESC) -{ - return ((PRESC) <= 0xFFFF); -} - -/** @brief Check if QSPI FIFO Threshold is valid. - * @param THRE QSPI FIFO Threshold. - * @retval SET (__THR__ is valid) or RESET (__THR__ is invalid) - */ -__STATIC_INLINE bool IS_QSPI_FIFO_THRESHOLD(uint32_t THRE) -{ - return (((THRE) >= 0) && ((THRE) <= MAX)); -} - -/** @brief Check if QSPI Clock Mode is valid. - * @param CLKMODE QSPI Clock Mode. - * @retval SET (__CLKMODE__ is valid) or RESET (__CLKMODE__ is invalid) - */ -__STATIC_INLINE bool IS_QSPI_CLOCK_MODE(uint32_t CLKMODE) -{ - return (((CLKMODE) == QSPI_CLOCK_MODE_0) || ((CLKMODE) == QSPI_CLOCK_MODE_1) || \ - ((CLKMODE) == QSPI_CLOCK_MODE_2) || ((CLKMODE) == QSPI_CLOCK_MODE_3)); -} - -/** @brief Check if QSPI Instruction Size is valid. - * @param INST_SIZE QSPI Instruction Size. - * @retval SET (__INST_SIZE__ is valid) or RESET (__INST_SIZE__ is invalid) - */ -__STATIC_INLINE bool IS_QSPI_INSTRUCTION_SIZE(uint32_t INST_SIZE) -{ - return (((INST_SIZE) == QSPI_INSTSIZE_00_BITS) || \ - ((INST_SIZE) == QSPI_INSTSIZE_04_BITS) || \ - ((INST_SIZE) == QSPI_INSTSIZE_08_BITS) || \ - ((INST_SIZE) == QSPI_INSTSIZE_16_BITS)); -} - -/** @brief Check if QSPI Address Size is valid. - * @param ADDR_SIZE QSPI Address Size . - * @retval SET (ADDR_SIZE is valid) or RESET (ADDR_SIZE is invalid) - */ -__STATIC_INLINE bool IS_QSPI_ADDRESS_SIZE(uint32_t ADDR_SIZE) -{ - return (((ADDR_SIZE) == QSPI_ADDRSIZE_00_BITS) || ((ADDR_SIZE) == QSPI_ADDRSIZE_04_BITS) || \ - ((ADDR_SIZE) == QSPI_ADDRSIZE_08_BITS) || ((ADDR_SIZE) == QSPI_ADDRSIZE_12_BITS) || \ - ((ADDR_SIZE) == QSPI_ADDRSIZE_16_BITS) || ((ADDR_SIZE) == QSPI_ADDRSIZE_20_BITS) || \ - ((ADDR_SIZE) == QSPI_ADDRSIZE_24_BITS) || ((ADDR_SIZE) == QSPI_ADDRSIZE_28_BITS) || \ - ((ADDR_SIZE) == QSPI_ADDRSIZE_32_BITS)); -} - -/** @brief Check if QSPI Dummy Cycle is valid. - * @param DCY QSPI Dummy Cycle. - * @retval SET (DCY is valid) or RESET (DCY is invalid) - */ -__STATIC_INLINE bool IS_QSPI_DUMMY_CYCLES(uint32_t DCY) -{ - return ((DCY) <= QSPI_CYCLE_MAX); -} - -/** @brief Check if QSPI Instruction and Address Mode is valid. - * @param MODE QSPI Instruction and Address Mode. - * @retval SET (MODE is valid) or RESET (MODE is invalid) - */ -__STATIC_INLINE bool IS_QSPI_INSTADDR_MODE(uint32_t MODE) -{ - return (((MODE) == QSPI_INST_ADDR_ALL_IN_SPI) || \ - ((MODE) == QSPI_INST_IN_SPI_ADDR_IN_SPIFRF) || \ - ((MODE) == QSPI_INST_ADDR_ALL_IN_SPIFRF)); -} - -/** @brief Check if QSPI Data Mode is valid. - * @param MODE QSPI Data Mode. - * @retval SET (MODE is valid) or RESET (MODE is invalid) - */ -__STATIC_INLINE bool IS_QSPI_DATA_MODE(uint32_t MODE) -{ - return (((MODE) == QSPI_DATA_MODE_SPI) || \ - ((MODE) == QSPI_DATA_MODE_DUALSPI) || \ - ((MODE) == QSPI_DATA_MODE_QUADSPI)); -} - -/** @} */ - -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_QSPI_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup QSPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the QSPIx peripheral. - - (+) User must implement hal_qspi_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_qspi_init() to configure the selected device with - the selected configuration: - (++) Clock Prescaler - (++) Clock Mode - - (+) Call the function hal_qspi_deinit() to restore the default configuration - of the selected QSPIx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the QSPI according to the specified parameters - * in the qspi_init_t and initialize the associated handle. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_init(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief De-initialize the QSPI peripheral. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_deinit(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Initialize the QSPI MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_qspi_msp_deinit can be implemented in the user file. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_msp_init(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief De-initialize the QSPI MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_qspi_msp_deinit can be implemented in the user file. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_msp_deinit(qspi_handle_t *p_qspi); - -/** @} */ - -/** @defgroup QSPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the QSPI - data transfers. - - [..] The QSPI supports master and slave mode: - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts. - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated QSPI IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The hal_qspi_tx_cplt_callback(), hal_qspi_rx_cplt_callback() and hal_qspi_txrx_cplt_callback() - user callbacks will be executed respectively at the end of the transmit or Receive process. - The hal_qspi_error_callback() user callback will be executed when a communication error is detected - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1 Line (simplex) and 2 Lines (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Transmit an amount of data with the specified instruction and address in blocking mode. - * @note This function is used only in Indirect Write Mode. Dummy cycles in command will be ignored. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[in] p_data: Pointer to data buffer - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_transmit(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint8_t *p_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive an amount of data with the specified instruction, address and dummy cycles in blocking mode. - * @note This function is used only in Indirect Read Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[out] p_data: Pointer to data buffer - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_receive(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint8_t *p_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit only instruction in blocking mode. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in blocking mode with standard SPI. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_transmit(qspi_handle_t *p_qspi, uint8_t *p_data, uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive an amount of data in blocking mode with standard SPI. - * @note This function is used only in Indirect Read Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be received in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_receive(qspi_handle_t *p_qspi, uint8_t *p_data, uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit an amount of data with the specified instruction and address in non-blocking mode with Interrupt. - * @note This function is used only in Indirect Write Mode. Dummy cycles in command will be ignored. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[in] p_data: Pointer to data buffer - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_transmit_it(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint8_t *p_data); - -/** - **************************************************************************************** - * @brief Receive an amount of data with the specified instruction, address and dummy cycles - * in non-blocking mode with Interrupt. - * @note This function is used only in Indirect Read Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[out] p_data: Pointer to data buffer - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_receive_it(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint8_t *p_data); - -/** - **************************************************************************************** - * @brief Transmit instruction in non-blocking mode with Interrupt. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_it(qspi_handle_t *p_qspi, qspi_command_t *p_cmd); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in non-blocking mode at standard SPI with Interrupt. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_transmit_it(qspi_handle_t *p_qspi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Receive an amount of data in non-blocking mode at standard SPI with Interrupt. - * @note This function is used only in Indirect Read Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be received in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_receive_it(qspi_handle_t *p_qspi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Transmit an amount of data with the specified instruction and address in non-blocking mode with DMA. - * @note This function is used only in Indirect Write Mode. Dummy cycles in command will be ignored. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[in] p_data: Pointer to data buffer - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_transmit_dma(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint8_t *p_data); - -/** - **************************************************************************************** - * @brief Receive an amount of data with the specified instruction, address and dummy cycles - * in non-blocking mode with DMA. - * @note This function is used only in Indirect Read Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @param[out] p_data: Pointer to data buffer - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_receive_dma(qspi_handle_t *p_qspi, qspi_command_t *p_cmd, uint8_t *p_data); - -/** - **************************************************************************************** - * @brief Transmit instruction in non-blocking mode with DMA. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_cmd: Pointer to a qspi_command_t structure that contains the instruction and address for data transfer. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_command_dma(qspi_handle_t *p_qspi, qspi_command_t *p_cmd); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in non-blocking mode at standard SPI with DMA. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_transmit_dma(qspi_handle_t *p_qspi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Receive an amount of data in non-blocking mode at standard SPI with DMA. - * @note This function is used only in Indirect Read Mode. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be received in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_receive_dma(qspi_handle_t *p_qspi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Abort the current transmission. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_abort(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Abort the current transmission (non-blocking function) - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_abort_it(qspi_handle_t *p_qspi); - -/** @} */ - -/** @addtogroup QSPI_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle QSPI interrupt request. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_irq_handler(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Tx Transfer completed callback. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_tx_cplt_callback(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Rx Transfer completed callback. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_rx_cplt_callback(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief QSPI error callback. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_error_callback(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief QSPI Abort Complete callback. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_abort_cplt_callback(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief FIFO Threshold callback. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - **************************************************************************************** - */ -void hal_qspi_fifo_threshold_callback(qspi_handle_t *p_qspi); - -/** @} */ - -/** @defgroup QSPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief QSPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the QSPI. - (+) hal_qspi_get_state() API can be helpful to check in run-time the state of the QSPI peripheral. - (+) hal_qspi_get_error() check in run-time Errors occurring during communication. - (+) hal_qspi_set_timeout() set the timeout during internal process. - (+) hal_qspi_set_tx_fifo_threshold() set the TX FIFO Threshold. - (+) hal_qspi_set_rx_fifo_threshold() set the RX FIFO Threshold. - (+) hal_qspi_get_tx_fifo_threshold() get the TX FIFO Threshold. - (+) hal_qspi_get_rx_fifo_threshold() get the RX FIFO Threshold. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the QSPI handle state. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @retval ::HAL_QSPI_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_QSPI_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_QSPI_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_QSPI_STATE_BUSY_INDIRECT_TX: Peripheral in indirect mode with transmission ongoing. - * @retval ::HAL_QSPI_STATE_BUSY_INDIRECT_RX: Peripheral in indirect mode with reception ongoing. - * @retval ::HAL_QSPI_STATE_ABORT: Peripheral with abort request ongoing. - * @retval ::HAL_QSPI_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_qspi_state_t hal_qspi_get_state(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Return the QSPI error code. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @return QSPI error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_qspi_get_error(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Set the QSPI internal process timeout value. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] timeout: Internal process timeout value. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -void hal_qspi_set_timeout(qspi_handle_t *p_qspi, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Set the TX FIFO threshold. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] threshold: TX FIFO threshold value ranging between 0x0U and 0x7U. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_set_tx_fifo_threshold(qspi_handle_t *p_qspi, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Set the RX FIFO threshold. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @param[in] threshold: RX FIFO threshold value ranging between 0x0U and 0x7U. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_set_rx_fifo_threshold(qspi_handle_t *p_qspi, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Get the TX FIFO threshold. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @return TX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_qspi_get_tx_fifo_threshold(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Get the RX FIFO threshold. - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration information for the specified QSPI. - * @return RX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_qspi_get_rx_fifo_threshold(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Suspend some registers related to QSPI configuration before sleep. - * @param[in] p_qspi: Pointer to a QSPIhandle which contains the configuration - * information for the specified QSPI module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_suspend_reg(qspi_handle_t *p_qspi); - -/** - **************************************************************************************** - * @brief Restore some registers related to QSPI configuration after sleep. - * This function must be used in conjunction with the hal_qspi_suspend_reg(). - * @param[in] p_qspi: Pointer to a QSPI handle which contains the configuration - * information for the specified QSPI module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_qspi_resume_reg(qspi_handle_t *p_qspi); - -void hal_qspi_config_dma_qwrite_32b_patch(qspi_handle_t *p_qspi, bool enable_patch, uint32_t endian_mode); -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_QSPI_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_rng.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_rng.h deleted file mode 100755 index 6273144..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_rng.h +++ /dev/null @@ -1,443 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_rng.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of RNG HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_RNG RNG - * @brief RNG HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_RNG_H__ -#define __GR55xx_HAL_RNG_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_rng.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_RNG_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_RNG_state HAL RNG state - * @{ - */ - -/** - * @brief HAL RNG State Enumerations definition - */ -typedef enum { - HAL_RNG_STATE_RESET = 0x00, /**< RNG not initialized or disabled yet */ - HAL_RNG_STATE_READY = 0x01, /**< RNG initialized and ready for use */ - HAL_RNG_STATE_BUSY = 0x02, /**< RNG internal process is ongoing */ - HAL_RNG_STATE_TIMEOUT = 0x03, /**< RNG timeout state */ - HAL_RNG_STATE_ERROR = 0x04 /**< RNG error state */ -} hal_rng_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_RNG_STRUCTURES Structures - * @{ - */ - -/** @defgroup RNG_Configuration RNG Configuration - * @{ - */ - -/** - * @brief RNG init structure definition - */ -typedef struct _rng_init { - uint32_t seed_mode; /**< Specifies the seed source for the LFSR. - This parameter can be a value of @ref RNG_SEED_SOURCE */ - - uint32_t lfsr_mode; /**< Specifies the configuration mode for the LFSR. - This parameter can be a value of @ref RNG_LFSR_MODE */ - - uint32_t out_mode; /**< Specifies the Output mode for the RNG. - This parameter can be a value of @ref RNG_OUTPUT_MODE */ - - uint32_t post_mode; /**< Specifies post-process configuration for the RNG. - This parameter can be a value of @ref RNG_POST_PRO */ -} rng_init_t; - -/** @} */ - -/** @defgroup RNG_handle RNG handle - * @{ - */ - -/** - * @brief RNG handle Structure definition - */ -typedef struct _rng_handle { - rng_regs_t *p_instance; /**< Register base address */ - - rng_init_t init; /**< RNG required parameters */ - - hal_lock_t lock; /**< RNG locking object */ - - __IO hal_rng_state_t state; /*!< RNG communication state */ - - uint32_t random_number; /*!< Last-generated RNG Data */ - - uint32_t retention[1]; /**< RNG important register information. */ -} rng_handle_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_RNG_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_RNG_Callback Callback - * @{ - */ - -/** - * @brief HAL_RNG Callback function definition - */ - -typedef struct _hal_rng_callback { - void (*rng_msp_init)(rng_handle_t *p_rng); /**< RNG init MSP callback */ - void (*rng_msp_deinit)(rng_handle_t *p_rng); /**< RNG de-init MSP callback */ - void (*rng_ready_data_callback)(rng_handle_t *p_rng, uint32_t random32bit); /**< RNG data ready callback */ -} hal_rng_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_RNG_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RNG_Exported_Constants RNG Exported Constants - * @{ - */ - -/** @defgroup RNG_SEED_SOURCE LFSR seed source - * @{ - */ -#define RNG_SEED_FR0_S0 LL_RNG_SEED_FR0_S0 /**< LFSR seed is from the switching oscillator S0. */ -#define RNG_SEED_USER LL_RNG_SEED_USER /**< LFSR seed is configured by users. */ -/** @} */ - - -/** @defgroup RNG_LFSR_MODE LFSR configuration mode - * @{ - */ -#define RNG_LFSR_MODE_59BIT LL_RNG_LFSR_MODE_59BIT /**< 59-bit LFSR. */ -#define RNG_LFSR_MODE_128BIT LL_RNG_LFSR_MODE_128BIT /**< 128-bit LFSR. */ -/** @} */ - -/** @defgroup RNG_POST_PRO Post-process mode - * @{ - */ -#define RNG_POST_PRO_NOT LL_RNG_POST_PRO_NOT /**< No post process. */ -#define RNG_POST_PRO_SKIPPING LL_RNG_POST_PRO_SKIPPING /**< bit skipping. */ -#define RNG_POST_PRO_COUNTING LL_RNG_POST_PRO_COUNTING /**< bit counting. */ -#define RNG_POST_PRO_NEUMANN LL_RNG_POST_PRO_NEUMANN /**< Von-Neumann. */ -/** @} */ - -/** @defgroup RNG_OUTPUT_MODE RNG Output mode - * @{ - */ -#define RNG_OUTPUT_FR0_S0 LL_RNG_OUTPUT_FR0_S0 /**< Digital RNG direct output, - for ring oscillator S0 LFSR seed. */ -#define RNG_OUTPUT_CYCLIC_PARITY LL_RNG_OUTPUT_CYCLIC_PARITY /**< LFSR and RNG cyclic sampling and - parity generation. */ -#define RNG_OUTPUT_CYCLIC LL_RNG_OUTPUT_CYCLIC /**< LFSR and RNG cyclic sampling. */ -#define RNG_OUTPUT_LFSR_RNG LL_RNG_OUTPUT_LFSR_RNG /**< LFSR ⊕ RNG. */ -#define RNG_OUTPUT_LFSR LL_RNG_OUTPUT_LFSR /**< LFSR direct output. */ -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_RNG_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup RNG_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions. - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and start the RNG according to the specified parameters - in the rng_init_t of associated handle. - (+) Initialize the RNG MSP. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the RNG according to the specified - * parameters in the rng_init_t of associated handle. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_rng_init(rng_handle_t *p_rng); - -/** - **************************************************************************************** - * @brief De-initialize the RNG peripheral. - * @param[in] p_rng: RNG handle. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_rng_deinit(rng_handle_t *p_rng); - -/** - **************************************************************************************** - * @brief Initialize the RNG MSP. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @note When rewriting this function in user file, mechanism may be added - * to avoid multiple initialize when hal_rng_init function is called - * again to change parameters. - **************************************************************************************** - */ -void hal_rng_msp_init(rng_handle_t *p_rng); - -/** - **************************************************************************************** - * @brief De-initialize the RNG MSP. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @note When rewriting this function in user file, mechanism may be added - * to avoid multiple initialize when hal_rng_init function is called - * again to change parameters. - **************************************************************************************** - */ -void hal_rng_msp_deinit(rng_handle_t *p_rng); - -/** @} */ - -/** @addtogroup RNG_Exported_Functions_Group2 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Generate Random Number. - (+) Handle RNG interrupt request and associated function callback. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Generate a 32-bit random number. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @param[in] p_seed: user configured seeds. the seed is valid when seed_mode member of - * rng_init_t is configured as RNG_SEED_USER. If 59-bit random number is - * selected, the seed need to provide [0~58] bit spaces. If 128-bit random - * number is selected, the seed need to provide [0~127] bit spaces. - * @param[out] p_random32bit: Pointer to generated random number variable if successful. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_rng_generate_random_number(rng_handle_t *p_rng, uint16_t *p_seed, uint32_t *p_random32bit); - -/** - **************************************************************************************** - * @brief Generate a 32-bit random number in interrupt mode. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @param[in] p_seed: user configured seeds. the seed is valid when seed_mode member of - * rng_init_t is configured as RNG_SEED_USER. If 59-bit random number is - * selected, the seed need to provide [0~58] bit spaces. If 128-bit random - * number is selected, the seed need to provide [0~127] bit spaces. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_rng_generate_random_number_it(rng_handle_t *p_rng, uint16_t *p_seed); - -/** - **************************************************************************************** - * @brief Read the latest generated random number. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @retval random value. - **************************************************************************************** - */ -uint32_t hal_rng_read_last_random_number(rng_handle_t *p_rng); - -/** @} */ - -/** @addtogroup RNG_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callback functions - * @{ - */ -/** - **************************************************************************************** - * @brief Handle RNG interrupt request. - * @param[in] p_rng: RNG handle. - **************************************************************************************** - */ -void hal_rng_irq_handler(rng_handle_t *p_rng); - -/** - **************************************************************************************** - * @brief Data Ready callback in non-blocking mode. - * @note This function should not be modified. When the callback is needed, - the hal_rng_ready_data_callback can be implemented in the user file. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @param random32bit: generated random value - * @retval None - **************************************************************************************** - */ -void hal_rng_ready_data_callback(rng_handle_t *p_rng, uint32_t random32bit); - -/** @} */ - -/** @defgroup RNG_Exported_Functions_Group3 Peripheral State functions - * @brief RNG State functions - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RNG. - (+) hal_rng_get_state() API can be helpful to check in run-time the state of the RNG peripheral. -@endverbatim - * @{ - */ -/** - **************************************************************************************** - * @brief Return the RNG handle state. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration information - * for the specified HMAC module. - * @retval ::HAL_RNG_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_RNG_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_RNG_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_RNG_STATE_ERROR: Peripheral in error. - * @retval ::HAL_RNG_STATE_TIMEOUT: Peripheral in timeout. - **************************************************************************************** - */ -hal_rng_state_t hal_rng_get_state(rng_handle_t *p_rng); - -/** - **************************************************************************************** - * @brief Suspend some registers related to RNG configuration before sleep. - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_rng_suspend_reg(rng_handle_t *p_rng); - -/** - **************************************************************************************** - * @brief Restore some registers related to RNG configuration after sleep. - * This function must be used in conjunction with the hal_rng_resume_reg(). - * @param[in] p_rng: Pointer to a RNG handle which contains the configuration - * information for the specified RNG module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_rng_resume_reg(rng_handle_t *p_rng); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_RNG_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_spi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_spi.h deleted file mode 100755 index 19ce20c..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_spi.h +++ /dev/null @@ -1,1066 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_spi.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of SPI HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_SPI SPI - * @brief SPI HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55xx_HAL_SPI_H -#define GR55xx_HAL_SPI_H - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_spi.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_SPI_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_SPI_state HAL SPI state - * @{ - */ - -/** - * @brief HAL SPI State Enumerations definition - */ -typedef enum { - HAL_SPI_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_SPI_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_SPI_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_SPI_STATE_BUSY_TX = 0x12, /**< Data Transmission process is ongoing */ - HAL_SPI_STATE_BUSY_RX = 0x22, /**< Data Reception process is ongoing */ - HAL_SPI_STATE_BUSY_TX_RX = 0x32, /**< Data Transmission and Reception process is ongoing */ - HAL_SPI_STATE_ABORT = 0x08, /**< Peripheral with abort request ongoing */ - HAL_SPI_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_spi_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_SPI_STRUCTURES Structures - * @{ - */ - -/** @defgroup SPI_Configuration SPI Configuration - * @{ - */ - -/** - * @brief SPI init Structure definition - */ -typedef struct _spi_init { - uint32_t data_size; /**< Specifies the SPI data size. - This parameter can be a value of @ref SPI_Data_Size */ - - uint32_t clock_polarity; /**< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint32_t clock_phase; /**< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint32_t baudrate_prescaler; /**< Specifies the BaudRate prescaler value which will be - used to configure the transmit and receive SCK clock. - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint32_t ti_mode; /**< Specifies if the TI mode is enabled or not. - This parameter can be a value of @ref SPI_TI_Mode */ - - uint32_t slave_select; /**< Specifies the slaves to be selected. - This parameter can be a value of @ref SPI_Slave_Select */ -} spi_init_t; -/** @} */ - -/** @defgroup SPI_handle SPI handle - * @{ - */ - -/** - * @brief SPI handle Structure definition - */ -typedef struct _spi_handle { - ssi_regs_t *p_instance; /**< SPI registers base address */ - - spi_init_t init; /**< SPI communication parameters */ - - uint8_t *p_tx_buffer; /**< Pointer to SPI Tx transfer Buffer */ - - __IO uint32_t tx_xfer_size; /**< SPI Tx Transfer size */ - - __IO uint32_t tx_xfer_count; /**< SPI Tx Transfer Counter */ - - uint8_t *p_rx_buffer; /**< Pointer to SPI Rx transfer Buffer */ - - __IO uint32_t rx_xfer_size; /**< SPI Rx Transfer size */ - - __IO uint32_t rx_xfer_count; /**< SPI Rx Transfer Counter */ - - void (*write_fifo)(struct _spi_handle *p_spi); /**< Pointer to SPI Tx transfer FIFO write function */ - - void (*read_fifo)(struct _spi_handle *p_spi); /**< Pointer to SPI Rx transfer FIFO read function */ - - void (*read_write_fifo)(struct _spi_handle *p_spi); /**< Pointer to SPI transfer FIFO read and write function */ - - dma_handle_t *p_dmatx; /**< SPI Tx DMA Handle parameters */ - - dma_handle_t *p_dmarx; /**< SPI Rx DMA Handle parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_spi_state_t state; /**< SPI communication state */ - - __IO uint32_t error_code; /**< SPI Error code */ - - uint32_t timeout; /**< Timeout for the SPI memory access */ - -#if defined(HAL_SPI_V2_MODULE_ENABLED) - uint32_t retention[9]; /**< SPI important register information. */ -#else - uint32_t retention[8]; /**< SPI important register information. */ -#endif -} spi_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_SPI_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_SPI_Callback Callback - * @{ - */ - -/** - * @brief HAL_SPI Callback function definition - */ - -typedef struct _hal_spi_callback { - void (*spi_msp_init)(spi_handle_t *p_spi); /**< SPI init MSP callback */ - void (*spi_msp_deinit)(spi_handle_t *p_spi); /**< SPI de-init MSP callback */ - void (*spi_error_callback)(spi_handle_t *p_spi); /**< SPI error callback */ - void (*spi_abort_cplt_callback)(spi_handle_t *p_spi); /**< SPI abort completed callback */ - void (*spi_rx_cplt_callback)(spi_handle_t *p_spi); /**< SPI rx transfer completed callback */ - void (*spi_tx_cplt_callback)(spi_handle_t *p_spi); /**< SPI tx transfer completed callback */ - void (*spi_tx_rx_cplt_callback)(spi_handle_t *p_spi); /**< SPI tx/rx transfer completed callback */ -} hal_spi_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_SPI_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_Direction SPI Direction - * @{ - */ -#define SPI_DIRECTION_FULL_DUPLEX LL_SSI_FULL_DUPLEX /**< Full Duplex: Transmit & Receive */ -#define SPI_DIRECTION_SIMPLEX_TX LL_SSI_SIMPLEX_TX /**< Simplex Tx: Transmit only */ -#define SPI_DIRECTION_SIMPLEX_RX LL_SSI_SIMPLEX_RX /**< Simplex Rx: Receive only */ -#define SPI_DIRECTION_READ_EEPROM LL_SSI_READ_EEPROM /**< Read EEPROM */ -/** @} */ - -/** @defgroup SPI_Error_Code SPI Error Code - * @{ - */ -#define HAL_SPI_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_SPI_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_SPI_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_SPI_ERROR_DMA ((uint32_t)0x00000004) /**< DMA transfer error */ -#define HAL_SPI_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameters error */ -/** @} */ - -/** @defgroup SPI_Data_Size SPI Data Size - * @{ - */ -#define SPI_DATASIZE_4BIT LL_SSI_DATASIZE_4BIT /**< 4-bit serial data transfer */ -#define SPI_DATASIZE_5BIT LL_SSI_DATASIZE_5BIT /**< 5-bit serial data transfer */ -#define SPI_DATASIZE_6BIT LL_SSI_DATASIZE_6BIT /**< 6-bit serial data transfer */ -#define SPI_DATASIZE_7BIT LL_SSI_DATASIZE_7BIT /**< 7-bit serial data transfer */ -#define SPI_DATASIZE_8BIT LL_SSI_DATASIZE_8BIT /**< 8-bit serial data transfer */ -#define SPI_DATASIZE_9BIT LL_SSI_DATASIZE_9BIT /**< 9-bit serial data transfer */ -#define SPI_DATASIZE_10BIT LL_SSI_DATASIZE_10BIT /**< 10-bit serial data transfer */ -#define SPI_DATASIZE_11BIT LL_SSI_DATASIZE_11BIT /**< 11-bit serial data transfer */ -#define SPI_DATASIZE_12BIT LL_SSI_DATASIZE_12BIT /**< 12-bit serial data transfer */ -#define SPI_DATASIZE_13BIT LL_SSI_DATASIZE_13BIT /**< 13-bit serial data transfer */ -#define SPI_DATASIZE_14BIT LL_SSI_DATASIZE_14BIT /**< 14-bit serial data transfer */ -#define SPI_DATASIZE_15BIT LL_SSI_DATASIZE_15BIT /**< 15-bit serial data transfer */ -#define SPI_DATASIZE_16BIT LL_SSI_DATASIZE_16BIT /**< 16-bit serial data transfer */ -#define SPI_DATASIZE_17BIT LL_SSI_DATASIZE_17BIT /**< 17-bit serial data transfer */ -#define SPI_DATASIZE_18BIT LL_SSI_DATASIZE_18BIT /**< 18-bit serial data transfer */ -#define SPI_DATASIZE_19BIT LL_SSI_DATASIZE_19BIT /**< 19-bit serial data transfer */ -#define SPI_DATASIZE_20BIT LL_SSI_DATASIZE_20BIT /**< 20-bit serial data transfer */ -#define SPI_DATASIZE_21BIT LL_SSI_DATASIZE_21BIT /**< 21-bit serial data transfer */ -#define SPI_DATASIZE_22BIT LL_SSI_DATASIZE_22BIT /**< 22-bit serial data transfer */ -#define SPI_DATASIZE_23BIT LL_SSI_DATASIZE_23BIT /**< 23-bit serial data transfer */ -#define SPI_DATASIZE_24BIT LL_SSI_DATASIZE_24BIT /**< 24-bit serial data transfer */ -#define SPI_DATASIZE_25BIT LL_SSI_DATASIZE_25BIT /**< 25-bit serial data transfer */ -#define SPI_DATASIZE_26BIT LL_SSI_DATASIZE_26BIT /**< 26-bit serial data transfer */ -#define SPI_DATASIZE_27BIT LL_SSI_DATASIZE_27BIT /**< 27-bit serial data transfer */ -#define SPI_DATASIZE_28BIT LL_SSI_DATASIZE_28BIT /**< 28-bit serial data transfer */ -#define SPI_DATASIZE_29BIT LL_SSI_DATASIZE_29BIT /**< 29-bit serial data transfer */ -#define SPI_DATASIZE_30BIT LL_SSI_DATASIZE_30BIT /**< 30-bit serial data transfer */ -#define SPI_DATASIZE_31BIT LL_SSI_DATASIZE_31BIT /**< 31-bit serial data transfer */ -#define SPI_DATASIZE_32BIT LL_SSI_DATASIZE_32BIT /**< 32-bit serial data transfer */ -/** @} */ - -/** @defgroup SPI_Clock_Polarity SPI Clock Polarity - * @{ - */ -#define SPI_POLARITY_LOW LL_SSI_SCPOL_LOW /**< Inactive state of CLK is low */ -#define SPI_POLARITY_HIGH LL_SSI_SCPOL_HIGH /**< Inactive state of CLK is high */ -/** @} */ - -/** @defgroup SPI_Clock_Phase SPI Clock Phase - * @{ - */ -#define SPI_PHASE_1EDGE LL_SSI_SCPHA_1EDGE /**< CLK toggles at start of first data bit */ -#define SPI_PHASE_2EDGE LL_SSI_SCPHA_2EDGE /**< CLK toggles in middle of first data bit */ -/** @} */ - -/** @defgroup SPI_TI_Mode SPI TI Mode - * @{ - */ -#define SPI_TIMODE_DISABLE ((uint32_t)0x00000000) /**< SPI TI mode disable */ -#define SPI_TIMODE_ENABLE LL_SSI_PROTOCOL_TI /**< SPI TI mode enable */ -/** @} */ - -/** @defgroup SPI_Slave_Select SPI Slave Select - * @{ - */ -#define SPI_SLAVE_SELECT_0 LL_SSI_SLAVE0 /**< SPIM Select Slave 0 */ -#define SPI_SLAVE_SELECT_1 LL_SSI_SLAVE1 /**< SPIM Select Slave 1 */ -#define SPI_SLAVE_SELECT_ALL (LL_SSI_SLAVE0 | LL_SSI_SLAVE1) /**< SPIM Select All Slave */ -/** @} */ - -/** @defgroup SPI_FIFO_LEVEL_MAX SPI FIFO Level Max - * @{ - */ -#define SPI_TX_FIFO_LEVEL_MAX 8 /**< SPI TX FIFO Level Max Value */ -#define SPI_RX_FIFO_LEVEL_MAX 8 /**< SPI RX FIFO Level Max Value */ -/** @} */ - -/** @defgroup SPI_Flags_definition SPI Flags Definition - * @{ - */ -#define SPI_FLAG_DCOL LL_SSI_SR_DCOL /**< Data collision error flag */ -#define SPI_FLAG_TXE LL_SSI_SR_TXE /**< Transmission error flag */ -#define SPI_FLAG_RFF LL_SSI_SR_RFF /**< Rx FIFO full flag */ -#define SPI_FLAG_RFNE LL_SSI_SR_RFNE /**< Rx FIFO not empty flag */ -#define SPI_FLAG_TFE LL_SSI_SR_TFE /**< Tx FIFO empty flag */ -#define SPI_FLAG_TFNF LL_SSI_SR_TFNF /**< Tx FIFO not full flag */ -#define SPI_FLAG_BUSY LL_SSI_SR_BUSY /**< Busy flag */ -/** @} */ - -/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition - * @{ - */ -#define SPI_IT_MST LL_SSI_IS_MST /**< Multi-Master Contention Interrupt flag */ -#define SPI_IT_RXF LL_SSI_IS_RXF /**< Receive FIFO Full Interrupt flag */ -#define SPI_IT_RXO LL_SSI_IS_RXO /**< Receive FIFO Overflow Interrupt flag */ -#define SPI_IT_RXU LL_SSI_IS_RXU /**< Receive FIFO Underflow Interrupt flag */ -#define SPI_IT_TXO LL_SSI_IS_TXO /**< Transmit FIFO Overflow Interrupt flag */ -#define SPI_IT_TXE LL_SSI_IS_TXE /**< Transmit FIFO Empty Interrupt flag */ -/** @} */ - -/** @defgroup SPI_Timeout_definition SPI Timeout_definition - * @{ - */ -#define HAL_SPI_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SPI_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @brief Reset SPI handle states. - * @param __HANDLE__ SPI handle. - * @retval None - */ -#define HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_SPI_STATE_RESET) - -/** @brief Enable the specified SPI peripheral. - * @param __HANDLE__ Specifies the SPI Handle. - * @retval None - */ -#define HAL_SPI_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->SSI_EN, SSI_SSIEN_EN) - -/** @brief Disable the specified SPI peripheral. - * @param __HANDLE__ Specifies the SPI Handle. - * @retval None - */ -#define HAL_SPI_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->SSI_EN, SSI_SSIEN_EN) - -/** @brief Enable the SPI DMA TX Request. - * @param __HANDLE__ Specifies the SPI Handle. - * @retval None - */ -#define HAL_SPI_ENABLE_DMATX(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->DMAC, SSI_DMAC_TDMAE) - -/** @brief Enable the SPI DMA RX Request. - * @param __HANDLE__ Specifies the SPI Handle. - * @retval None - */ -#define HAL_SPI_ENABLE_DMARX(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->DMAC, SSI_DMAC_RDMAE) - -/** @brief Disable the SPI DMA TX Request. - * @param __HANDLE__ Specifies the SPI Handle. - * @retval None - */ -#define HAL_SPI_DISABLE_DMATX(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->DMAC, SSI_DMAC_TDMAE) - -/** @brief Disable the SPI DMA RX Request. - * @param __HANDLE__ Specifies the SPI Handle. - * @retval None - */ -#define HAL_SPI_DISABLE_DMARX(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->DMAC, SSI_DMAC_RDMAE) - -/** @brief Enable the specified SPI interrupts. - * @param __HANDLE__ Specifies the SPI Handle. - * @param __INTERRUPT__ Specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref SPI_IT_MST Multi-Master Contention Interrupt enable - * @arg @ref SPI_IT_RXF Receive FIFO Full Interrupt enable - * @arg @ref SPI_IT_RXO Receive FIFO Overflow Interrupt enable - * @arg @ref SPI_IT_RXU Receive FIFO Underflow Interrupt enable - * @arg @ref SPI_IT_TXO Transmit FIFO Overflow Interrupt enable - * @arg @ref SPI_IT_TXE Transmit FIFO Empty Interrupt enable - * @retval None - */ -#define HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BITS((__HANDLE__)->p_instance->INTMASK, (__INTERRUPT__)) - -/** @brief Disable the specified SPI interrupts. - * @param __HANDLE__ Specifies the SPI handle. - * @param __INTERRUPT__ Specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref SPI_IT_MST Multi-Master Contention Interrupt enable - * @arg @ref SPI_IT_RXF Receive FIFO Full Interrupt enable - * @arg @ref SPI_IT_RXO Receive FIFO Overflow Interrupt enable - * @arg @ref SPI_IT_RXU Receive FIFO Underflow Interrupt enable - * @arg @ref SPI_IT_TXO Transmit FIFO Overflow Interrupt enable - * @arg @ref SPI_IT_TXE Transmit FIFO Empty Interrupt enable - * @retval None - */ -#define HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BITS((__HANDLE__)->p_instance->INTMASK, (__INTERRUPT__)) - -/** @brief Check whether the specified SPI interrupt source is enabled or not. - * @param __HANDLE__ Specifies the SPI Handle. - * @param __INTERRUPT__ Specifies the interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref SPI_IT_MST Multi-Master Contention Interrupt enable - * @arg @ref SPI_IT_RXF Receive FIFO Full Interrupt enable - * @arg @ref SPI_IT_RXO Receive FIFO Overflow Interrupt enable - * @arg @ref SPI_IT_RXU Receive FIFO Underflow Interrupt enable - * @arg @ref SPI_IT_TXO Transmit FIFO Overflow Interrupt enable - * @arg @ref SPI_IT_TXE Transmit FIFO Empty Interrupt enable - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) \ - (READ_BITS((__HANDLE__)->p_instance->INTSTAT, (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __HANDLE__ Specifies the SPI Handle. - * @param __FLAG__ Specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref SPI_FLAG_DCOL Data collision error flag - * @arg @ref SPI_FLAG_TXE Transmission error flag - * @arg @ref SPI_FLAG_RFF Rx FIFO full flag - * @arg @ref SPI_FLAG_RFNE Rx FIFO not empty flag - * @arg @ref SPI_FLAG_TFE Tx FIFO empty flag - * @arg @ref SPI_FLAG_TFNF Tx FIFO not full flag - * @arg @ref SPI_FLAG_BUSY Busy flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->STAT, (__FLAG__)) != 0) ? SET : RESET) - -/** @brief Clear the specified SPI flag. - * @param __HANDLE__ Specifies the SPI Handle. - * @param __FLAG__ Specifies the flag to clear. - * This parameter can be one of the following values: - * @arg @ref SPI_FLAG_DCOL Data collision error flag - * @arg @ref SPI_FLAG_TXE Transmission error flag - * @arg @ref SPI_FLAG_RFF Rx FIFO full flag - * @arg @ref SPI_FLAG_RFNE Rx FIFO not empty flag - * @arg @ref SPI_FLAG_TFE Tx FIFO empty flag - * @arg @ref SPI_FLAG_TFNF Tx FIFO not full flag - * @arg @ref SPI_FLAG_BUSY Busy flag - * @retval None - */ -#define HAL_SPI_CLEAR_FLAG(__HANDLE__, __FLAG__) READ_BITS((__HANDLE__)->p_instance->STAT, (__FLAG__)) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup SPI_Private_Macro SPI Private Macros - * @{ - */ - -/** @brief Check if SPI Direction Mode is valid. - * @param __MODE__ SPI Direction Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_SPI_DIRECTION(__MODE__) (((__MODE__) == SPI_DIRECTION_FULL_DUPLEX) || \ - ((__MODE__) == SPI_DIRECTION_SIMPLEX_TX) || \ - ((__MODE__) == SPI_DIRECTION_SIMPLEX_RX) || \ - ((__MODE__) == SPI_DIRECTION_READ_EEPROM)) - -/** @brief Check if SPI Data Size is valid. - * @param __DATASIZE__ SPI Data Size. - * @retval SET (__DATASIZE__ is valid) or RESET (__DATASIZE__ is invalid) - */ -#define IS_SPI_DATASIZE(__DATASIZE__) (((__DATASIZE__) >= SPI_DATASIZE_4BIT) && \ - ((__DATASIZE__) <= SPI_DATASIZE_32BIT)) - -/** @brief Check if SPI Clock Polarity is valid. - * @param __CPOL__ SPI Clock Polarity. - * @retval SET (__CPOL__ is valid) or RESET (__CPOL__ is invalid) - */ -#define IS_SPI_CPOL(__CPOL__) (((__CPOL__) == SPI_POLARITY_LOW) || \ - ((__CPOL__) == SPI_POLARITY_HIGH)) - -/** @brief Check if SPI Clock Phase is valid. - * @param __CPHA__ SPI Clock Phase. - * @retval SET (__CPHA__ is valid) or RESET (__CPHA__ is invalid) - */ -#define IS_SPI_CPHA(__CPHA__) (((__CPHA__) == SPI_PHASE_1EDGE) || \ - ((__CPHA__) == SPI_PHASE_2EDGE)) - -/** @brief Check if SPI BaudRate Prescaler is valid. - * @param __PRESCALER__ SPI BaudRate Prescaler. - * @retval SET (__PRESCALER__ is valid) or RESET (__PRESCALER__ is invalid) - */ -#define IS_SPI_BAUDRATE_PRESCALER(__PRESCALER__) ((__PRESCALER__) <= 0xFFFF) - -/** @brief Check if SPI TI Mode is valid. - * @param __MODE__ SPI TI Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_SPI_TIMODE(__MODE__) (((__MODE__) == SPI_TIMODE_DISABLE) || \ - ((__MODE__) == SPI_TIMODE_ENABLE)) - -/** @brief Check if SPI Slave Select is valid. - * @param __SLAVE__ SPI Slave Select. - * @retval SET (__SLAVE__ is valid) or RESET (__SLAVE__ is invalid) - */ -#define IS_SPI_SLAVE(__SLAVE__) (((__SLAVE__) == SPI_SLAVE_SELECT_0) || \ - ((__SLAVE__) == SPI_SLAVE_SELECT_1) || \ - ((__SLAVE__) == SPI_SLAVE_SELECT_ALL)) - -/** @brief Check if SPI Receive Sample Delay Value is valid. - * @param __DLY__ SPI Receive Sample Delay Value - * @retval SET (__DLY__ is valid) or RESET (__DLY__ is invalid) - */ -#define IS_SPI_RX_SAMPLE_DLY(__DLY__) (((__DLY__) >= 0) && ((__DLY__) <= 7)) - - -/** @brief Check if SPI FIFO Threshold is valid. - * @param __THR__ SPI FIFO Threshold. - * @retval SET (__THR__ is valid) or RESET (__THR__ is invalid) - */ -#define IS_SPI_FIFO_THRESHOLD(__THR__) (((__THR__) >= 0) && ((__THR__) <= 7)) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_SPI_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the SPIx peripheral. - - (+) User must implement hal_spi_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_spi_init() to configure the selected device with - the selected configuration: - (++) Direction - (++) Data Size - (++) Clock Polarity and Phase - (++) BaudRate Prescaler - (++) TIMode - (++) Slave Select - - (+) Call the function hal_spi_deinit() to restore the default configuration - of the selected SPIx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the SPI according to the specified parameters - * in the spi_init_t and initialize the associated handle. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_init(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief De-initialize the SPI peripheral. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_deinit(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Initialize the SPI MSP. - * @note This function should not be modified. When the callback is needed, - the hal_spi_msp_deinit can be implemented in the user file. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_msp_init(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief De-initialize the SPI MSP. - * @note This function should not be modified. When the callback is needed, - the hal_spi_msp_deinit can be implemented in the user file. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_msp_deinit(spi_handle_t *p_spi); - -/** @} */ - -/** @defgroup SPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfer functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the SPI - data transfer. - - [..] The SPI supports master and slave mode: - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The hal_spi_tx_cplt_callback(), hal_spi_rx_cplt_callback() and hal_spi_txrx_cplt_callback() - user callbacks will be executed respectively at the end of the transmit or Receive process - The hal_spi_error_callback() user callback will be executed when a communication error is detected. - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1-Line (simplex) and 2-Line (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Transmit an amount of data in blocking mode. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_transmit(spi_handle_t *p_spi, uint8_t *p_data, uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive an amount of data in blocking mode. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be received in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_receive(spi_handle_t *p_spi, uint8_t *p_data, uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit and Receive an amount of data in blocking mode. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] length: Amount of data to be sent and received in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_transmit_receive(spi_handle_t *p_spi, uint8_t *p_tx_data, uint8_t *p_rx_data, - uint32_t length, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Read an amount of data from EEPROM in blocking mode. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] tx_number_data: Amount of data to be sent in bytes - * @param[in] rx_number_data: Amount of data to be received in bytes - * @param[in] timeout: Timeout duration - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_read_eeprom(spi_handle_t *p_spi, uint8_t *p_tx_data, uint8_t *p_rx_data, - uint32_t tx_number_data, uint32_t rx_number_data, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in non-blocking mode with Interrupt. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_transmit_it(spi_handle_t *p_spi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Receive an amount of data in non-blocking mode with Interrupt. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_receive_it(spi_handle_t *p_spi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] length: Amount of data to be sent and received in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_transmit_receive_it(spi_handle_t *p_spi, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Read an amount of data from EEPROM in non-blocking mode with Interrupt. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] tx_number_data: Amount of data to be sent in bytes - * @param[in] rx_number_data: Amount of data to be received in bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_read_eeprom_it(spi_handle_t *p_spi, uint8_t *p_tx_data, uint8_t *p_rx_data, - uint32_t tx_number_data, uint32_t rx_number_data); - -/** - **************************************************************************************** - * @brief Transmit an amount of data in non-blocking mode with DMA. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_transmit_dma(spi_handle_t *p_spi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Receive an amount of data in non-blocking mode with DMA. - * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, p_dmatx shall be defined. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_receive_dma(spi_handle_t *p_spi, uint8_t *p_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] length: Amount of data to be sent in bytes, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_transmit_receive_dma(spi_handle_t *p_spi, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t length); - -/** - **************************************************************************************** - * @brief Read an amount of data from EEPROM in non-blocking mode with DMA. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] p_tx_data: Pointer to transmission data buffer - * @param[out] p_rx_data: Pointer to reception data buffer - * @param[in] tx_number_data: Amount of data to be sent in bytes - * @param[in] rx_number_data: Amount of data to be received in bytes, ranging between 0 and 4095. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_read_eeprom_dma(spi_handle_t *p_spi, uint8_t *p_tx_data, uint8_t *p_rx_data, - uint32_t tx_number_data, uint32_t rx_number_data); - -/** - **************************************************************************************** - * @brief Abort ongoing transfer (blocking mode). - * @param[in] p_spi: SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode: when exiting function, Abort is considered as completed. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_abort(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Abort ongoing transfer (Interrupt mode). - * @param[in] p_spi: SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort_it (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_abort_it(spi_handle_t *p_spi); - -/** @} */ - -/** @addtogroup SPI_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle SPI interrupt request. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_irq_handler(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Tx Transfer completed callback. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_tx_cplt_callback(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Rx Transfer completed callback. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_rx_cplt_callback(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Tx and Rx Transfer completed callback. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_tx_rx_cplt_callback(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief SPI error callback. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - **************************************************************************************** - */ -void hal_spi_error_callback(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief SPI Abort Completed callback. - * @param[in] p_spi: SPI handle. - **************************************************************************************** - */ -void hal_spi_abort_cplt_callback(spi_handle_t *p_spi); - -/** @} */ - -/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief SPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SPI. - (+) hal_spi_get_state() API can be helpful to check in run-time the state of the SPI peripheral - (+) hal_spi_get_error() check in run-time Errors occurring during communication - (+) hal_spi_set_timeout() set the timeout during internal process - (+) hal_spi_set_tx_fifo_threshold() set the TX FIFO Threshold - (+) hal_spi_set_rx_fifo_threshold() set the RX FIFO Threshold - (+) hal_spi_get_tx_fifo_threshold() get the TX FIFO Threshold - (+) hal_spi_get_rx_fifo_threshold() get the RX FIFO Threshold -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the SPI handle state. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @retval ::HAL_SPI_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_SPI_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_SPI_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_SPI_STATE_BUSY_TX: Data Transmission process is ongoing. - * @retval ::HAL_SPI_STATE_BUSY_RX: Data Reception process is ongoing. - * @retval ::HAL_SPI_STATE_BUSY_TX_RX: Data Transmission and Reception process is ongoing. - * @retval ::HAL_SPI_STATE_ABORT: Peripheral with abort request ongoing. - * @retval ::HAL_SPI_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_spi_state_t hal_spi_get_state(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Return the SPI error code. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @return SPI error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_spi_get_error(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Set the SPI internal process timeout value. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] timeout: Internal process timeout value. - **************************************************************************************** - */ -void hal_spi_set_timeout(spi_handle_t *p_spi, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Set the TX FIFO threshold. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] threshold: TX FIFO threshold value ranging bwtween 0x0U ~ 0x7U. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_set_tx_fifo_threshold(spi_handle_t *p_spi, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Set the RX FIFO threshold. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @param[in] threshold: RX FIFO threshold value ranging bwtween 0x0U ~ 0x7U. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_set_rx_fifo_threshold(spi_handle_t *p_spi, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Get the TX FIFO threshold. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @return TX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_spi_get_tx_fifo_threshold(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Get the RX FIFO threshold. - * @param[in] p_spi: Pointer to an SPI handle which contains the configuration information for the specified SPI. - * @return RX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_spi_get_rx_fifo_threshold(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Suspend some registers related to SPI configuration before sleep. - * @param[in] p_spi: Pointer to a SPI handle which contains the configuration - * information for the specified SPI module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_suspend_reg(spi_handle_t *p_spi); - -/** - **************************************************************************************** - * @brief Restore some registers related to SPI configuration after sleep. - * This function must be used in conjunction with the hal_spi_suspend_reg(). - * @param[in] p_spi: Pointer to a SPI handle which contains the configuration - * information for the specified SPI module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_spi_resume_reg(spi_handle_t *p_spi); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_SPI_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_tim.h deleted file mode 100755 index 918b531..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_tim.h +++ /dev/null @@ -1,411 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_tim.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of TIMER HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_TIMER TIMER - * @brief TIM HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55xx_HAL_TIMER_H -#define GR55xx_HAL_TIMER_H - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal_def.h" -#include "gr55xx_ll_tim.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_TIMER_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_TIMER_state HAL TIMER state - * @{ - */ - -/** - * @brief HAL TIMER State Enumerations definition - */ -typedef enum { - HAL_TIMER_STATE_RESET = 0x00, /**< Peripheral not yet initialized or disabled */ - HAL_TIMER_STATE_READY = 0x01, /**< Peripheral Initialized and ready for use */ - HAL_TIMER_STATE_BUSY = 0x02, /**< An internal process is ongoing */ - HAL_TIMER_STATE_ERROR = 0x04 /**< Reception process is ongoing */ -} hal_timer_state_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_TIMER_STRUCTURES Structures - * @{ - */ - -/** @defgroup TIMER_Configuration TIMER Configuration - * @{ - */ - -/** - * @brief TIMER init Structure definition - */ -typedef struct _timer_init { - uint32_t auto_reload; /**< Specifies the auto-reload value. */ -} timer_init_t; - -/** @} */ - -/** @defgroup TIMER_handle TIMER handle - * @{ - */ - -/** - * @brief TIMER handle Structure definition - */ -typedef struct _timer_handle { - timer_regs_t *p_instance; /**< Register base address */ - - timer_init_t init; /**< TIMER Base required parameters */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_timer_state_t state; /**< TIMER operation state */ -} timer_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_TIMER_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_TIMER_Callback Callback - * @{ - */ - -/** - * @brief HAL_TIMER Callback function definition - */ - -typedef struct _hal_timer_callback { - void (*timer_msp_init)(timer_handle_t *p_timer); /**< TIMER init MSP callback */ - void (*timer_msp_deinit)(timer_handle_t *p_timer); /**< TIMER de-init MSP callback */ - void (*timer_period_elapsed_callback)(timer_handle_t *p_timer); /**< TIMER period elapsed callback */ -} hal_timer_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_TIMER_MACRO Defines - * @{ - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMER_Exported_Macros TIMER Exported Macros - * @{ - */ - -/** @brief Reset TIMER handle states. - * @param __HANDLE__ TIMER handle. - * @retval None - */ -#define HAL_TIMER_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_TIMER_STATE_RESET) - -/** @brief Enable the specified TIMER peripheral. - * @param __HANDLE__ Specifies the TIMER Handle. - * @retval None - */ -#define __HAL_TIMER_ENABLE(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, TIMER_CTRL_EN) - -/** @brief Disable the specified TIMER peripheral. - * @param __HANDLE__ Specifies the TIMER Handle. - * @retval None - */ -#define __HAL_TIMER_DISABLE(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, TIMER_CTRL_EN) - -/** @brief Enable the TIMER interrupt. - * @param __HANDLE__ Specifies the TIMER Handle. - * @retval None - */ -#define __HAL_TIMER_ENABLE_IT(__HANDLE__) SET_BITS((__HANDLE__)->p_instance->CTRL, TIMER_CTRL_INTEN) - -/** @brief Disable the TIMER interrupt. - * @param __HANDLE__ Specifies the TIMER Handle. - * @retval None - */ -#define __HAL_TIMER_DISABLE_IT(__HANDLE__) CLEAR_BITS((__HANDLE__)->p_instance->CTRL, TIMER_CTRL_INTEN) - -/** @brief Check whether the TIMER interrupt has occurred or not. - * @param __HANDLE__ Specifies the TIMER Handle. - * @retval The new state of TIMER interrupt (SET or RESET). - */ -#define __HAL_TIMER_GET_FLAG_IT(__HANDLE__) ll_timer_is_active_flag_it((__HANDLE__)->p_instance) - -/** @brief Clear the TIMER interrupt flag. - * @param __HANDLE__ Specifies the TIMER Handle. - * @retval None - */ -#define __HAL_TIMER_CLEAR_FLAG_IT(__HANDLE__) ll_timer_clear_flag_it((__HANDLE__)->p_instance) - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_TIMER_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup TIMER_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * - * @verbatim -=============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIMER. - (+) De-initialize the TIMER. - (+) Start the Timer. - (+) Stop the Timer. - (+) Start the Timer and enable interrupt. - (+) Stop the Timer and disable interrupt. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the TIMER according to the specified parameters - * in the timer_init_t and initialize the associated handle. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_base_init(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief De-initialize the TIMER peripheral. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_base_deinit(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief Initialize the TIMER MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_timer_base_msp_init could be implemented in the user file. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - **************************************************************************************** - */ -void hal_timer_base_msp_init(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief De-initialize the TIMER MSP. - * @note This function should not be modified. When the callback is needed, - * the hal_timer_base_msp_deinit could be implemented in the user file. - * @param[in] p_timer: Pointer to a TIM handle which contains the configuration - * information for the specified TIMER module. - **************************************************************************************** - */ -void hal_timer_base_msp_deinit(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief Starts the TIMER counter. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_base_start(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief Stops the TIMER counter. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_base_stop(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief Starts the TIMER counter in interrupt mode. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_base_start_it(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief Stops the TIMER counter in interrupt mode. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_base_stop_it(timer_handle_t *p_timer); - -/** @} */ - -/** @addtogroup TIMER_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle TIMER interrupt request. - * @param[in] p_timer: TIMER handle. - **************************************************************************************** - */ -void hal_timer_irq_handler(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief Period elapsed callback in non-blocking mode. - * @note This function should not be modified. When the callback is needed, - the hal_timer_period_elapsed_callback can be implemented in the user file. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - **************************************************************************************** - */ -void hal_timer_period_elapsed_callback(timer_handle_t *p_timer); - -/** @} */ - -/** @addtogroup TIMER_Exported_Functions_Group2 Peripheral Control and State functions - * @brief TIMER Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral Control and State functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the TIMER handle state. - (+) Configure the TIMER. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the TIMER handle state. - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @retval ::HAL_TIMER_STATE_RESET: Peripheral not yet initialized or disabled. - * @retval ::HAL_TIMER_STATE_READY: Peripheral Initialized and ready for use. - * @retval ::HAL_TIMER_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_TIMER_STATE_ERROR: Reception process is ongoing. - **************************************************************************************** - */ -hal_timer_state_t hal_timer_get_state(timer_handle_t *p_timer); - -/** - **************************************************************************************** - * @brief TIMER configuration - * @param[in] p_timer: Pointer to a TIMER handle which contains the configuration - * information for the specified TIMER module. - * @param[in] p_structure: The TIMER configuration structure - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_timer_set_config(timer_handle_t *p_timer, timer_init_t *p_structure); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_TIMER_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_uart.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_uart.h deleted file mode 100755 index 83981a8..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_uart.h +++ /dev/null @@ -1,1041 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_uart.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of UART HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_UART UART - * @brief UART HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_UART_H__ -#define __GR55xx_HAL_UART_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_uart.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_UART_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_UART_state HAL UART state - * @{ - */ - -/** - * @brief HAL UART State enumerations definition - * @note HAL UART State value is a combination of 2 different substates: gState and RxState. - */ -typedef enum { - HAL_UART_STATE_RESET = 0x00U, /**< Peripheral is not initialized. - Value is allowed for gState and RxState */ - - HAL_UART_STATE_READY = 0x10U, /**< Peripheral initialized and ready for use. - Value is allowed for gState and RxState */ - - HAL_UART_STATE_BUSY = 0x14U, /**< An internal process is ongoing. - Value is allowed for gState only */ - - HAL_UART_STATE_BUSY_TX = 0x11U, /**< Data Transmission process is ongoing. - Value is allowed for gState only */ - - HAL_UART_STATE_BUSY_RX = 0x12U, /**< Data Reception process is ongoing. - Value is allowed for RxState only */ - - HAL_UART_STATE_BUSY_TXRX = 0x13U, /**< Data Transmission and Reception process is ongoing. - Value is allowed for gState only */ - - HAL_UART_STATE_TIMEOUT = 0x30U, /**< Timeout state. - Value is allowed for gState only */ - - HAL_UART_STATE_ERROR = 0x70U /**< Error. - Value is allowed for gState only */ -} hal_uart_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_UART_STRUCTURES Structures - * @{ - */ - -/** @defgroup UART_Configuration UART Configuration - * @{ - */ - -/** - * @brief UART init structure definition - */ -typedef struct _uart_init { - uint32_t baud_rate; /**< This member configures the UART communication baud rate. */ - - uint32_t data_bits; /**< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref UART_Data_Bits. */ - - uint32_t stop_bits; /**< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref UART_Stop_Bits. */ - - uint32_t parity; /**< Specifies the parity mode. - This parameter can be a value of @ref UART_Parity. */ - - uint32_t hw_flow_ctrl; /**< Specifies whether the hardware flow control mode is enabled or disabled. - This parameter can be a value of @ref UART_Hardware_Flow_Control. */ - - uint32_t rx_timeout_mode; /**< Specifies whether the receive timeout mode is enabled or disabled. - When rx_timeout_mode is enabled, character timeout interrupt will disable - current receive process after the data in RxFIFO is received, and call - hal_uart_rx_cplt_callback(). Note that the rx_timeout_mode only works - in interrupt mode. - This parameter can be a value of @ref UART_Receiver_TimeOut. */ -} uart_init_t; -/** @} */ - -/** @defgroup UART_handle UART handle - * @{ - */ - -/** - * @brief UART handle Structure definition - */ -typedef struct _uart_handle { - uart_regs_t *p_instance; /**< UART registers base address */ - - uart_init_t init; /**< UART communication parameters */ - - uint8_t *p_tx_buffer; /**< Pointer to UART Tx transfer Buffer */ - - uint16_t tx_xfer_size; /**< UART Tx Transfer size */ - - __IO uint16_t tx_xfer_count; /**< UART Tx Transfer Counter */ - - uint8_t *p_rx_buffer; /**< Pointer to UART Rx transfer Buffer */ - - uint16_t rx_xfer_size; /**< UART Rx Transfer size */ - - __IO uint16_t rx_xfer_count; /**< UART Rx Transfer Counter */ - - dma_handle_t *p_dmatx; /**< UART Tx DMA Handle parameters */ - - dma_handle_t *p_dmarx; /**< UART Rx DMA Handle parameters */ - - functional_state_t dma_tx_mode; /**< UART Tx DMA mode state */ - - functional_state_t dma_rx_mode; /**< UART Rx DMA mode state */ - - hal_lock_t lock; /**< Locking object */ - - __IO hal_uart_state_t tx_state; /**< UART state information related to Tx operations. - This parameter can be a value of @ref hal_uart_state_t */ - - __IO hal_uart_state_t rx_state; /**< UART state information related to Rx operations. - This parameter can be a value of @ref hal_uart_state_t */ - - __IO uint32_t error_code; /**< UART Error code */ - - uint32_t retention[8]; /**< UART important register information. */ -} uart_handle_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_UART_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_UART_Callback Callback - * @{ - */ - -/** - * @brief HAL_UART Callback function definition - */ - -typedef struct _hal_uart_callback { - void (*uart_msp_init)(uart_handle_t *p_uart); /**< UART init MSP callback */ - void (*uart_msp_deinit)(uart_handle_t *p_uart); /**< UART de-init MSP callback */ - void (*uart_tx_cplt_callback)(uart_handle_t *p_uart); /**< UART tx transfer completed callback */ - void (*uart_rx_cplt_callback)(uart_handle_t *p_uart); /**< UART rx transfer completed callback */ - void (*uart_error_callback)(uart_handle_t *p_uart); /**< UART error callback */ - void (*uart_abort_cplt_callback)(uart_handle_t *p_uart); /**< UART abort completed callback */ - void (*uart_abort_tx_cplt_callback)(uart_handle_t *p_uart); /**< UART abort tansmit complete callback */ - void (*uart_abort_rx_cplt_callback)(uart_handle_t *p_uart); /**< UART abort receive complete callback */ -} hal_uart_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_UART_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup UART_Exported_Constants UART Exported Constants - * @{ - */ - -/** @defgroup UART_Error_Code UART Error Code - * @{ - */ -#define HAL_UART_ERROR_NONE (0x00000000U) /**< No error */ -#define HAL_UART_ERROR_PE LL_UART_LSR_PE /**< Parity error */ -#define HAL_UART_ERROR_FE LL_UART_LSR_FE /**< frame error */ -#define HAL_UART_ERROR_OE LL_UART_LSR_OE /**< Overrun error */ -#define HAL_UART_ERROR_BI LL_UART_LSR_BI /**< Break dection error */ -#define HAL_UART_ERROR_DMA (0x00000100U) /**< DMA transfer error */ -#define HAL_UART_ERROR_BUSY (0x00000200U) /**< Busy Error */ -/** @} */ - -/** @defgroup UART_Data_Bits UART Number of Data Bits - * @{ - */ -#define UART_DATABITS_5 LL_UART_DATABITS_5B /**< UART frame with 5 data bits */ -#define UART_DATABITS_6 LL_UART_DATABITS_6B /**< UART frame with 6 data bits */ -#define UART_DATABITS_7 LL_UART_DATABITS_7B /**< UART frame with 7 data bits */ -#define UART_DATABITS_8 LL_UART_DATABITS_8B /**< UART frame with 8 data bits */ -/** @} */ - -/** @defgroup UART_Stop_Bits UART Number of Stop Bits - * @{ - */ -#define UART_STOPBITS_1 LL_UART_STOPBITS_1 /**< UART frame with 1 stop bit */ -#define UART_STOPBITS_1_5 LL_UART_STOPBITS_1_5 /**< UART frame with 1.5 stop bits */ -#define UART_STOPBITS_2 LL_UART_STOPBITS_2 /**< UART frame with 2 stop bits */ -/** @} */ - -/** @defgroup UART_Parity UART Parity - * @{ - */ -#define UART_PARITY_NONE LL_UART_PARITY_NONE /**< No parity */ -#define UART_PARITY_ODD LL_UART_PARITY_ODD /**< Odd parity */ -#define UART_PARITY_EVEN LL_UART_PARITY_EVEN /**< Even parity */ -#define UART_PARITY_SP0 LL_UART_PARITY_SP0 /**< Stick Parity 0 */ -#define UART_PARITY_SP1 LL_UART_PARITY_SP1 /**< Stick Parity 1 */ -/** @} */ - -/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control - * @{ - */ -#define UART_HWCONTROL_NONE LL_UART_HWCONTROL_NONE /**< No hardware control */ -#define UART_HWCONTROL_RTS_CTS LL_UART_HWCONTROL_RTS_CTS /**< Auto RTS and CTS hardware flow control */ -/** @} */ - -/** @defgroup UART_Receiver_TimeOut UART Receiver TimeOut - * @{ - */ -#define UART_RECEIVER_TIMEOUT_DISABLE (0x00000000U) /**< UART receiver timeout disable */ -#define UART_RECEIVER_TIMEOUT_ENABLE (0x00000001U) /**< UART receiver timeout enable */ -/** @} */ - -/** @defgroup UART_Interrupt_definition UART Interrupt_definition - * @{ - */ -#define UART_IT_MS LL_UART_IER_MS /**< Enable Modem Status Interrupt */ -#define UART_IT_RLS LL_UART_IER_RLS /**< Enable Receiver Line Status Interrupt */ -#define UART_IT_THRE LL_UART_IER_THRE /**< Enable Transmit Holding Register Empty Interrupt */ -#define UART_IT_RDA LL_UART_IER_RDA /**< Enable Received Data Available Interrupt and - Character Timeout Interrupt */ -/** @} */ - -/** @defgroup UART_Request_Parameters UART Request Parameters - * @{ - */ -#define UART_RXDATA_FLUSH_REQUEST UART_SRR_RFR /**< RX FIFO flush Request */ -#define UART_TXDATA_FLUSH_REQUEST UART_SRR_XFR /**< TX FIFO flush Request */ -#define UART_TXRXDATA_FLUSH_REQUEST (UART_SRR_XFR | UART_SRR_RFR) /**< TX FIFO and RX FIFO flush Request */ -/** @} */ - -/** @defgroup UART_Interrupt_Mask UART Interrupt Flag Mask - * @{ - */ -#define UART_IT_MASK (0x008FU) /**< UART interruptions flags mask */ -/** @} */ - -/** @defgroup UART_Line_Error_Mask UART Line Error Flag Mask - * @{ - */ -#define UART_LINE_ERROR_MASK (LL_UART_LSR_PE | LL_UART_LSR_OE | \ - LL_UART_LSR_FE | LL_UART_LSR_BI) /**< UART interruptions flags mask */ -/** @} */ - -/** @defgroup UART_Retention_Length UART Retention Register Length - * @{ - */ -#define UART_RETENTION_LENGTH ((uint32_t)8) /**< the number of retention registers */ -/** @} */ - -/** @defgroup UART_Timeout_definition UART Timeout_definition - * @{ - */ -#define HAL_UART_TIMEOUT_DEFAULT_VALUE ((uint32_t)5000) /**< 5s */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup UART_Exported_Macros UART Exported Macros - * @{ - */ - -/** @brief Reset UART handle states. - * @param __HANDLE__ UART handle. - * @retval None - */ -#define HAL_UART_RESET_HANDLE_STATE(__HANDLE__) \ -do { \ - (__HANDLE__)->g_state = HAL_UART_STATE_RESET; \ - (__HANDLE__)->rx_state = HAL_UART_STATE_RESET; \ -} while (0U) - -/** @brief Enable the specified UART interrupt. - * @param __HANDLE__ Specifies the UART Handle. - * @param __INTERRUPT__ Specifies the UART interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref UART_IT_RDA - * @arg @ref UART_IT_THRE - * @arg @ref UART_IT_RLS - * @arg @ref UART_IT_MS - * @retval None - */ -#define HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) \ -do { \ - GLOBAL_EXCEPTION_DISABLE(); \ - ll_uart_enable_it((__HANDLE__)->p_instance, (__INTERRUPT__)); \ - GLOBAL_EXCEPTION_ENABLE(); \ -} while (0U) - -/** @brief Disable the specified UART interrupt. - * @param __HANDLE__ Specifies the UART Handle. - * @param __INTERRUPT__ Specifies the UART interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref UART_IT_RDA - * @arg @ref UART_IT_THRE - * @arg @ref UART_IT_RLS - * @arg @ref UART_IT_MS - * @retval None - */ -#define HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__) \ -do { \ - GLOBAL_EXCEPTION_DISABLE(); \ - ll_uart_disable_it((__HANDLE__)->p_instance, (__INTERRUPT__)); \ - GLOBAL_EXCEPTION_ENABLE(); \ -} while (0) - -/** @brief Flush the UART FIFO and treat FIFO as empty. - * @param __HANDLE__ Specifies the UART Handle. - * @param __REQ__ Specifies the request flag to set - * This parameter can be one of the following values: - * @arg @ref UART_RXDATA_FLUSH_REQUEST RX FIFO flush Request - * @arg @ref UART_TXDATA_FLUSH_REQUEST TX FIFO flush Request - * @arg @ref UART_TXRXDATA_FLUSH_REQUEST TX FIFO and RX FIFO flush - * @retval None - */ -#define HAL_UART_SEND_REQ(__HANDLE__, __REQ__) ((__HANDLE__)->p_instance->SRR = (__REQ__)) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup UART_Private_Macro UART Private Macros - * @{ - */ - -/** @brief Check if UART Baudrate is valid. - * @param __BAUDRATE__ UART Baudrate. - * @retval SET (__BAUDRATE__ is valid) or RESET (__BAUDRATE__ is invalid) - */ -#define IS_UART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) < 921600U) - -/** - * @brief Check if UART frame number of stop bits is valid. - * @param __STOPBITS__ UART frame number of stop bits. - * @retval SET (__STOPBITS__ is valid) or RESET (__STOPBITS__ is invalid) - */ -#define IS_UART_STOPBITS(__STOPBITS__) (((__STOPBITS__) == UART_STOPBITS_1) || \ - ((__STOPBITS__) == UART_STOPBITS_1_5) || \ - ((__STOPBITS__) == UART_STOPBITS_2)) - -/** - * @brief Check if UART frame number of data bits is valid. - * @param __DATABITS__ UART frame number of data bits. - * @retval SET (__DATABITS__ is valid) or RESET (__DATABITS__ is invalid) - */ -#define IS_UART_DATABITS(__DATABITS__) (((__DATABITS__) == UART_DATABITS_5) || \ - ((__DATABITS__) == UART_DATABITS_6) || \ - ((__DATABITS__) == UART_DATABITS_7) || \ - ((__DATABITS__) == UART_DATABITS_8)) - -/** - * @brief Check if UART frame parity is valid. - * @param __PARITY__ UART frame parity. - * @retval SET (__PARITY__ is valid) or RESET (__PARITY__ is invalid) - */ -#define IS_UART_PARITY(__PARITY__) (((__PARITY__) == UART_PARITY_NONE) || \ - ((__PARITY__) == UART_PARITY_EVEN) || \ - ((__PARITY__) == UART_PARITY_ODD) || \ - ((__PARITY__) == UART_PARITY_SP0) || \ - ((__PARITY__) == UART_PARITY_SP1)) - -/** - * @brief Check if UART hardware flow control is valid. - * @param __CONTROL__ UART hardware flow control. - * @retval SET (__CONTROL__ is valid) or RESET (__CONTROL__ is invalid) - */ -#define IS_UART_HARDWARE_FLOW_CONTROL(__CONTROL__) (((__CONTROL__) == UART_HWCONTROL_NONE) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) -/** @} */ - -/** - * @brief Default configuartion for initializing structure - */ -#define UART_DEFAULT_CONFIG \ -{ \ - .baud_rate = 9600, \ - .data_bits = UART_DATABITS_8, \ - .stop_bits = UART_STOPBITS_1, \ - .parity = UART_PARITY_NONE, \ - .hw_flow_ctrl = UART_HWCONTROL_NONE, \ - .rx_timeout_mode = UART_RECEIVER_TIMEOUT_DISABLE, \ -} - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_UART_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup UART_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * - * @verbatim -=============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the UARTx. - (+) For the asynchronous mode the parameters below can be configured: - (++) Baud Rate - (++) Data Bit - (++) Stop Bit - (++) Parity - (++) Hardware flow control - [..] - The hal_uart_init() API follow the UART asynchronous configuration procedures. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the UART according to the specified - * parameters in the uart_init_t and initialize the associated handle. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_init(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief De-initialize the UART peripheral. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_deinit (uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Initialize the UART MSP. - * @note This function should not be modified. When the callback is needed, - the hal_uart_msp_init can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_msp_init(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief De-initialize the UART MSP. - * @note This function should not be modified. When the callback is needed, - the hal_uart_msp_deinit can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_msp_deinit(uart_handle_t *p_uart); - -/** @} */ - -/** @addtogroup UART_Exported_Functions_Group2 IO operation functions - * @brief UART Transmit/Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the UART asynchronous - and Half duplex data transfers. - - (#) There are two mode of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) Non-Blocking mode: The communication is performed using Interrupts - or DMA, These API's return the HAL status. - The end of the data processing will be indicated through the - dedicated UART IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The hal_uart_tx_cplt_callback(), hal_uart_rx_cplt_callback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The hal_uart_error_callback() user callback will be executed when a - communication error is detected - - (#) Blocking mode API's are : - (++) hal_uart_transmit() - (++) hal_uart_receive() - - (#) Non-Blocking mode API's with Interrupt are : - (++) hal_uart_transmit_it() - (++) hal_uart_receive_it() - (++) hal_uart_irq_handler() - - (#) Non-Blocking mode API's with DMA are : - (++) hal_uart_transmit_dma() - (++) hal_uart_receive_dma() - (++) hal_uart_dma_pause() - (++) hal_uart_dma_resume() - (++) hal_uart_dma_stop() - - (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: - (++) hal_uart_tx_cplt_callback() - (++) hal_uart_rx_cplt_callback() - (++) hal_uart_error_callback() - - (#) Non-Blocking mode transfers could be aborted using Abort API's : - (++) hal_uart_abort() - (++) hal_uart_abort_transmit() - (++) hal_uart_abort_receive() - (++) hal_uart_abort_it() - (++) hal_uart_abort_transmit_it() - (++) hal_uart_abort_receive_it() - - (#) For Abort services based on interrupts (hal_uart_abort_xxx_it), a set - of Abort Complete Callbacks are provided: - (++) hal_uart_abort_cplt_callback() - (++) hal_uart_abort_tx_cplt_callback() - (++) hal_uart_abort_rx_cplt_callback() - - (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. - Errors are handled as follows : - (++) Error is considered as Recoverable and non blocking. Transfer could go till end, but error severity is to - be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception. - Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify - error type, and hal_uart_error_callback() user callback is executed. Transfer is kept ongoing on UART side. - If user wants to abort it, Abort services should be called by user. - (++) Error is considered as Blocking : Transfer could not be completed properly and is aborted. - This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode. - Error code is set to allow user to identify error type, and hal_uart_error_callback() user - callback is executed. - - -@- In the Half duplex communication, it is forbidden to run the transmit - and receive process in parallel, the UART state hal_uart_state_busy_tx_rx can't be useful. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Send an amount of data in blocking mode. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @param[in] p_data: Pointer to data buffer. - * @param[in] size: Amount of data to be sent. - * @param[in] timeout: Timeout duration. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_transmit(uart_handle_t *p_uart, uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Receive an amount of data in blocking mode. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @param[out] p_data: Pointer to data buffer. - * @param[in] size: Amount of data to be received. - * @param[in] timeout: Timeout duration. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_receive(uart_handle_t *p_uart, uint8_t *p_data, uint16_t size, uint32_t timeout); - -/** - **************************************************************************************** - * @brief Send an amount of data in interrupt mode. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @param[in] p_data: Pointer to data buffer. - * @param[in] size: Amount of data to be sent. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_transmit_it(uart_handle_t *p_uart, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Receive an amount of data in interrupt mode. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @param[out] p_data: Pointer to data buffer. - * @param[in] size: Amount of data to be received. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_receive_it(uart_handle_t *p_uart, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Send an amount of data in DMA mode. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @param[in] p_data: Pointer to data buffer. - * @param[in] size: Amount of data to be sent, ranging between 0 ~ 4095. - * @note This function starts a DMA transfer in interrupt mode meaning that - * DMA half transfer complete, DMA transfer complete and DMA transfer - * error interrupts are enabled - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_transmit_dma(uart_handle_t *p_uart, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Receive an amount of data in DMA mode. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @param[out] p_data: Pointer to data buffer. - * @param[in] size: Amount of data to be received, ranging between 0 and 4095. - * @note When the UART parity is enabled (PCE = 1), the received data contain - * the parity bit (MSB position). - * @note This function starts a DMA transfer in interrupt mode meaning that - * DMA half transfer complete, DMA transfer complete and DMA transfer - * error interrupts are enabled - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_receive_dma(uart_handle_t *p_uart, uint8_t *p_data, uint16_t size); - -/** - **************************************************************************************** - * @brief Pause the DMA Transfer. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_dma_pause(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Resume the DMA Transfer. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_dma_resume(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Stop the DMA Transfer. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_dma_stop(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Abort ongoing transfers (blocking mode). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode: when exiting function, Abort is considered as completed. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_abort(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Abort ongoing Transmit transfer (blocking mode). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode: when exiting function, Abort is considered as completed. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_abort_transmit(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Abort ongoing Receive transfer (blocking mode). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode: when exiting function, Abort is considered as completed. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_abort_receive(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Abort ongoing transfers (Interrupt mode). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort_it (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_abort_it(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Abort ongoing Transmit transfer (Interrupt mode). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort_it (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_abort_transmit_it(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Abort ongoing Receive transfer (Interrupt mode). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling hal_dma_abort_it (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_abort_receive_it(uart_handle_t *p_uart); - -/** @} */ - -/** @addtogroup UART_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle UART interrupt request. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration information - * for the specified UART module. - **************************************************************************************** - */ -void hal_uart_irq_handler(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Tx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_uart_tx_cplt_callback can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_tx_cplt_callback(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Rx Transfer completed callback. - * @note This function should not be modified. When the callback is needed, - * the hal_uart_rx_cplt_callback can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_rx_cplt_callback(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief UART error callback. - * @note This function should not be modified. When the callback is needed, - * the hal_uart_error_callback can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_error_callback(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief UART Abort Complete callback. - * @note This function should not be modified. When the callback is needed, - * the hal_uart_abort_cplt_callback can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_abort_cplt_callback (uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief UART Abort Tansmit Complete callback. - * @note This function should not be modified. When the callback is needed, - * the hal_uart_abort_tx_cplt_callback can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_abort_tx_cplt_callback (uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief UART Abort Receive Complete callback. - * @note This function should not be modified. When the callback is needed, - * the hal_uart_abort_rx_cplt_callback can be implemented in the user file. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - **************************************************************************************** - */ -void hal_uart_abort_rx_cplt_callback (uart_handle_t *p_uart); - -/** @} */ - - -/** @addtogroup UART_Exported_Functions_Group3 Peripheral Control and State functions - * @brief UART Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral Control and State functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the UART handle state. - (+) Return the UART handle error code - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the UART handle state. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_UART_STATE_RESET: Peripheral is not initialized. - * @retval ::HAL_UART_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_UART_STATE_BUSY: An internal process is ongoing. - * @retval ::HAL_UART_STATE_BUSY_TX: Data Transmission process is ongoing. - * @retval ::HAL_UART_STATE_BUSY_RX: Data Reception process is ongoing. - * @retval ::HAL_UART_STATE_TIMEOUT: Timeout state. - * @retval ::HAL_UART_STATE_ERROR: Error. - **************************************************************************************** - */ -hal_uart_state_t hal_uart_get_state(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Return the UART handle error code. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @return UART Error Code - **************************************************************************************** - */ -uint32_t hal_uart_get_error(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Suspend some registers related to UART configuration before sleep. - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_suspend_reg(uart_handle_t *p_uart); - -/** - **************************************************************************************** - * @brief Restore some registers related to UART configuration after sleep. - * This function must be used in conjunction with the hal_uart_suspend_reg(). - * @param[in] p_uart: Pointer to a UART handle which contains the configuration - * information for the specified UART module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_uart_resume_reg(uart_handle_t *p_uart); - - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_UART_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_wdt.h deleted file mode 100755 index 50f0754..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_wdt.h +++ /dev/null @@ -1,318 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_wdt.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of WDT HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_WDT WDT - * @brief WDT HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_WDT_H__ -#define __GR55xx_HAL_WDT_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_wdt.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_WDT_STRUCTURES Structures - * @{ - */ - -/** @defgroup WDT_Configuration WDT Configuration - * @{ - */ - -/** - * @brief WDT init structure definition - */ -typedef struct _wdt_init { - uint32_t counter; /**< Specifies the WDT free-running downcounter value. - This parameter can be a number ranging between 0x0U and 0xFFFFFFFFU. */ - - uint32_t reset_mode ; /**< Specifies if WDT Reset output is enable or not. - When RESET Mode is enabled, WDT will generate an interrupt - on first timeout. If interrupt has not been cleared before the second - timeout, WDT will then request a SoC Reset. - - This parameter can be a value of @ref WDT_RESET_Mode. */ -} wdt_init_t; - -/** @} */ - -/** @defgroup WDT_handle WDT handle - * @{ - */ - -/** - * @brief WDT handle Structure definition - */ -typedef struct _wdt_handle { - wdt_regs_t *p_instance; /**< Register base address */ - - wdt_init_t init; /**< WDT required parameters */ - - hal_lock_t lock; /**< WDT locking object */ -} wdt_handle_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_WDT_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_WDT_Callback Callback - * @{ - */ - -/** - * @brief HAL_WDT Callback function definition - */ - -typedef struct _hal_wdt_callback { - void (*wdt_msp_init)(wdt_handle_t *p_wdt); /**< WDT init MSP callback */ - void (*wdt_msp_deinit)(wdt_handle_t *p_wdt); /**< WDT de-init MSP callback */ - void (*wdt_period_elapsed_callback)(wdt_handle_t *p_wdt); /**< WDT count complete callback */ -} hal_wdt_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_WDT_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup WDT_Exported_Constants WDT Exported Constants - * @{ - */ - -/** @defgroup WDT_RESET_Mode WDT Reset Mode - * @{ - */ -#define WDT_RESET_DISABLE (0x00000000U) /**< Reset ouput disable */ -#define WDT_RESET_ENABLE (0x00000001U) /**< Reset output enable */ -/** @} */ - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup WDT_Private_Macros WDT Private Macros - * @{ - */ - -/** - * @brief Check if the WDT reset mode is valid. - * @param __MODE__ WDT reset mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_WDT_RESET_MODE(__MODE__) (((__MODE__) == WDT_RESET_ENABLE) || \ - ((__MODE__) == WDT_RESET_DISABLE)) -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_WDT_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @addtogroup WDT_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions. - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and start the WDT according to the specified parameters - in the wdt_init_t of associated handle. - (+) Initialize the WDT MSP. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the WDT according to the specified - * parameters in the wdt_init_t of associated handle. - * @param[in] p_wdt: Pointer to a WDT handle which contains the configuration - * information for the specified WDT module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_wdt_init(wdt_handle_t *p_wdt); - -/** - **************************************************************************************** - * @brief De-initialize the WDT peripheral. - * @param[in] p_wdt: WDT handle. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_wdt_deinit(wdt_handle_t *p_wdt); - -/** - **************************************************************************************** - * @brief Initialize the WDT MSP. - * @param[in] p_wdt: Pointer to a WDT handle which contains the configuration - * information for the specified WDT module. - * @note When rewriting this function in a user file, this mechanism may be added - * to avoid multiple initialization when hal_wdt_init function is called - * again to change parameters. - **************************************************************************************** - */ -void hal_wdt_msp_init(wdt_handle_t *p_wdt); - -/** - **************************************************************************************** - * @brief De-initialize the WDT MSP. - * @param[in] p_wdt: Pointer to a WDT handle which contains the configuration - * information for the specified WDT module. - * @note When rewriting this function in a user file, this mechanism may be added - * to avoid multiple initialization when hal_wdt_init function is called - * again to change parameters. - **************************************************************************************** - */ -void hal_wdt_msp_deinit(wdt_handle_t *p_wdt); - -/** @} */ - -/** @addtogroup WDT_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Refresh the WDT. - (+) Handle WDT interrupt request and associated function callback. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Refresh the WDT. - * @param[in] p_wdt: Pointer to a WDT handle which contains the configuration - * information for the specified WDT module. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_wdt_refresh(wdt_handle_t *p_wdt); - -/** @} */ - - -/** @addtogroup WDT_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @brief IRQ Handler and Callbacks functions - * @{ - */ - -/** - **************************************************************************************** - * @brief Handle WDT interrupt request. - * @note The Count Complete can be used if specific safety operations - * or data logging must be performed before the actual reset is generated. - * When RESET Mode is enabled, WDT will generate an interrupt on first timeout. - * If interrupt has not been cleared before the second timeout, WDT will then - * request a SoC Reset. - * @param[in] p_wdt: Pointer to a WDT handle which contains the configuration - * information for the specified WDT module. - **************************************************************************************** - */ -void hal_wdt_irq_handler(wdt_handle_t *p_wdt); - -/** - **************************************************************************************** - * @brief WDT count complete(counter reaches to 0) callback. - * @note In RESET mode, NVIC interrupt of WDT can be disabled in - * hal_wdt_period_elapsed_callback() to make sure this callback - * be called once only. - * This function should not be modified. When the callback is needed, - * the hal_wdt_count_cplt_callback can be implemented in the user file. - * @param[in] p_wdt: Pointer to a WDT handle which contains the configuration - * information for the specified WDT module. - **************************************************************************************** - */ -void hal_wdt_period_elapsed_callback(wdt_handle_t *p_wdt); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_WDT_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_xqspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_xqspi.h deleted file mode 100755 index f9e648d..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_hal_xqspi.h +++ /dev/null @@ -1,855 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_hal_xqspi.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of XQSPI HAL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup HAL_DRIVER HAL Driver - * @{ - */ - -/** @defgroup HAL_XQSPI XQSPI - * @brief XQSPI HAL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_HAL_XQSPI_H__ -#define __GR55xx_HAL_XQSPI_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_ll_xqspi.h" -#include "gr55xx_hal_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/** @addtogroup HAL_XQSPI_ENUMERATIONS Enumerations - * @{ - */ - -/** @defgroup HAL_XQSPI_state HAL XQSPI state - * @{ - */ - -/** - * @brief HAL XQSPI State Enumerations definition - */ -typedef enum { - HAL_XQSPI_STATE_RESET = 0x00, /**< Peripheral not initialized */ - HAL_XQSPI_STATE_READY = 0x01, /**< Peripheral initialized and ready for use */ - HAL_XQSPI_STATE_BUSY = 0x02, /**< Peripheral in indirect mode and busy */ - HAL_XQSPI_STATE_BUSY_INDIRECT_TX = 0x12, /**< Peripheral in indirect mode with transmission ongoing */ - HAL_XQSPI_STATE_BUSY_INDIRECT_RX = 0x22, /**< Peripheral in indirect mode with reception ongoing */ - HAL_XQSPI_STATE_ABORT = 0x08, /**< Peripheral with abort request ongoing */ - HAL_XQSPI_STATE_ERROR = 0x04 /**< Peripheral in error */ -} hal_xqspi_state_t; - -/** @} */ - -/** @} */ - -/** @addtogroup HAL_XQSPI_STRUCTURES Structures - * @{ - */ - -/** @defgroup XQSPI_Configuration XQSPI Configuration - * @{ - */ - -/** - * @brief XQSPI init Structure definition - */ -typedef struct _xqspi_init_t { - uint32_t work_mode; /**< Specifies the work mode for XQSPI. - This parameter can be a value of @ref XQSPI_Work_Mode */ - - uint32_t cache_mode; /**< Specifies the cache mode for XIP mode. - This parameter can be a value of @ref XQSPI_Cache_Mode */ - - uint32_t read_cmd; /**< Specifies the read command for transmit in XIP mode. - This parameter can be a value of @ref XQSPI_Read_CMD */ - - uint32_t baud_rate; /**< Specifies the serial clock speed for transmit in both XIP and QSPI mode. - This parameter can be a value of @ref XQSPI_Baud_Rate */ - - uint32_t clock_mode; /**< Specifies the Clock Mode. It indicates the level that clock takes between commands. - This parameter can be a value of @ref XQSPI_Clock_Mode */ -} xqspi_init_t; -/** @} */ - -/** @defgroup XQSPI_handle XQSPI handle - * @{ - */ - -/** - * @brief XQSPI handle Structure definition - */ -typedef struct _xqspi_handle_t { - xqspi_regs_t *p_instance; /**< XQSPI registers base address */ - - xqspi_init_t init; /**< XQSPI communication parameters */ - - uint8_t *p_tx_buffer; /**< Pointer to XQSPI Tx transfer Buffer */ - - __IO uint32_t tx_xfer_size; /**< XQSPI Tx Transfer size */ - - __IO uint32_t tx_xfer_count; /**< XQSPI Tx Transfer Counter */ - - uint8_t *p_rx_buffer; /**< Pointer to XQSPI Rx transfer Buffer */ - - __IO uint32_t rx_xfer_size; /**< XQSPI Rx Transfer size */ - - __IO uint32_t rx_xfer_count; /**< XQSPI Rx Transfer Counter */ - - __IO hal_lock_t lock; /**< Locking object */ - - __IO hal_xqspi_state_t state; /**< XQSPI communication state */ - - __IO uint32_t error_code; /**< XQSPI Error code */ - - uint32_t retry; /**< Retry for the XQSPI flag access */ -} xqspi_handle_t; -/** @} */ - -/** @defgroup XQSPI_Command XQSPI command - * @{ - */ - -/** - * @brief XQSPI command Structure definition - */ -typedef struct _xqspi_command_t { - uint32_t inst; /**< Specifies the Instruction to be sent. - This parameter can be a value (8-bit) between 0x00 and 0xFF */ - - uint32_t addr; /**< Specifies the Address to be sent. - (Size from 1 to 4 bytes according to AddressSize) - This parameter can be a value (32-bits) between 0x0 and 0xFFFFFFFF. */ - - uint32_t inst_size; /**< Specifies the Instruction Size. - This parameter can be a value of @ref XQSPI_Instruction_Size */ - - uint32_t addr_size; /**< Specifies the Address Size. - This parameter can be a value of @ref XQSPI_Address_Size */ - - uint32_t dummy_cycles; /**< Specifies the Number of Dummy Cycles. - This parameter can be a number between 0 and 31 */ - - uint32_t inst_addr_mode; /**< Specifies the Instruction and Address Mode. - This parameter can be a value of @ref XQSPI_Inst_Addr_Mode */ - - uint32_t data_mode; /**< Specifies the Data Mode (used for dummy cycles and data phases). - This parameter can be a value of @ref XQSPI_Data_Mode */ - - uint32_t length; /**< Specifies the number of data to transfer. (This is the number of bytes). - This parameter can be any value between 0 and 0xFFFFFFFF. - (0 means undefined length until end of memory) */ -} xqspi_command_t; -/** @} */ - -/** @} */ - -/** @addtogroup HAL_XQSPI_CALLBACK_STRUCTURES Callback Structures - * @{ - */ - -/** @defgroup HAL_XQSPI_Callback Callback - * @{ - */ - -/** - * @brief HAL_XQSPI Callback function definition - */ - -typedef struct _hal_xqspi_callback { - void (*xqspi_msp_init)(xqspi_handle_t *p_xqspi); /**< XQSPI init MSP callback */ - void (*xqspi_msp_deinit)(xqspi_handle_t *p_xqspi); /**< XQSPI de-init MSP callback */ -} hal_xqspi_callback_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HAL_XQSPI_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup XQSPI_Exported_Constants XQSPI Exported Constants - * @{ - */ - -/** @defgroup XQSPI_Error_Code XQSPI Error Code - * @{ - */ -#define HAL_XQSPI_ERROR_NONE ((uint32_t)0x00000000) /**< No error */ -#define HAL_XQSPI_ERROR_TIMEOUT ((uint32_t)0x00000001) /**< Timeout error */ -#define HAL_XQSPI_ERROR_TRANSFER ((uint32_t)0x00000002) /**< Transfer error */ -#define HAL_XQSPI_ERROR_INVALID_PARAM ((uint32_t)0x00000008) /**< Invalid parameter error */ -/** @} */ - -/** @defgroup XQSPI_Work_Mode XQSPI Work Mode - * @{ - */ -#define XQSPI_WORK_MODE_QSPI LL_XQSPI_MODE_QSPI /**< Work in QSPI mode */ -#define XQSPI_WORK_MODE_XIP LL_XQSPI_MODE_XIP /**< Work in XIP mode */ -/** @} */ - -/** @defgroup XQSPI_Cache_Mode XQSPI Cache Mode in XIP mode - * @{ - */ -#define XQSPI_CACHE_MODE_DIS LL_XQSPI_CACHE_DIS /**< Cache off in XIP mode */ -#define XQSPI_CACHE_MODE_EN LL_XQSPI_CACHE_EN /**< Cache on in XIP mode */ -/** @} */ - -/** @defgroup XQSPI_Read_CMD XQSPI Read Command in XIP mode - * @{ - */ -#define XQSPI_READ_CMD_READ LL_XQSPI_XIP_CMD_READ /**< Read mode */ -#define XQSPI_READ_CMD_FAST_READ LL_XQSPI_XIP_CMD_FAST_READ /**< Fast Read mode */ -#define XQSPI_READ_CMD_DUAL_OUT_READ LL_XQSPI_XIP_CMD_DUAL_OUT_READ /**< Dual-Out Fast Read mode */ -#define XQSPI_READ_CMD_DUAL_IO_READ LL_XQSPI_XIP_CMD_DUAL_IO_READ /**< Dual-IO Fast Read mode */ -#define XQSPI_READ_CMD_QUAD_OUT_READ LL_XQSPI_XIP_CMD_QUAD_OUT_READ /**< Quad-Out Fast Read mode */ -#define XQSPI_READ_CMD_QUAD_IO_READ LL_XQSPI_XIP_CMD_QUAD_IO_READ /**< Quad-IO Fast Read mode */ -/** @} */ - -/** @defgroup XQSPI_Clock_Mode XQSPI Clock Mode - * @{ - */ -#define XQSPI_CLOCK_MODE_0 ((LL_XQSPI_SCPOL_LOW << 1) | LL_XQSPI_SCPHA_1EDGE) /**< Inactive state of CLK is - low, CLK toggles at the - start of first data bit */ -#define XQSPI_CLOCK_MODE_1 ((LL_XQSPI_SCPOL_LOW << 1) | LL_XQSPI_SCPHA_2EDGE) /**< Inactive state of CLK is - low, CLK toggles in the - middle of first data bit */ -#define XQSPI_CLOCK_MODE_2 ((LL_XQSPI_SCPOL_HIGH << 1) | LL_XQSPI_SCPHA_1EDGE) /**< Inactive state of CLK is - high, CLK toggles at the - start of first data bit */ -#define XQSPI_CLOCK_MODE_3 ((LL_XQSPI_SCPOL_HIGH << 1) | LL_XQSPI_SCPHA_2EDGE) /**< Inactive state of CLK is - high, CLK toggles in the - middle of first data bit */ -/** @} */ - -/** @defgroup XQSPI_Baud_Rate XQSPI Clock Speed - * @{ - */ -#define XQSPI_BAUD_RATE_64M LL_XQSPI_BAUD_RATE_64M /**< Serial clock speed is 64 MHz */ -#define XQSPI_BAUD_RATE_48M LL_XQSPI_BAUD_RATE_48M /**< Serial clock speed is 48 MHz */ -#define XQSPI_BAUD_RATE_32M LL_XQSPI_BAUD_RATE_32M /**< Serial clock speed is 32 MHz */ -#define XQSPI_BAUD_RATE_24M LL_XQSPI_BAUD_RATE_24M /**< Serial clock speed is 24 MHz */ -#define XQSPI_BAUD_RATE_16M LL_XQSPI_BAUD_RATE_16M /**< Serial clock speed is 16 MHz */ -/** @} */ - -/** @defgroup XQSPI_Data_Mode XQSPI Data Mode, only in QSPI mode - * @{ - */ -#define XQSPI_DATA_MODE_SPI LL_XQSPI_QSPI_FRF_SPI /**< Standard SPI Frame Format */ -#define XQSPI_DATA_MODE_DUALSPI LL_XQSPI_QSPI_FRF_DUALSPI /**< Dual-SPI Frame Format */ -#define XQSPI_DATA_MODE_QUADSPI LL_XQSPI_QSPI_FRF_QUADSPI /**< Quad-SPI Frame Format */ -/** @} */ - -/** @defgroup XQSPI_FIFO_Threshold XQSPI FIFO Threshold, FIFO depth is 64*4bytes, only in QSPI mode - * @{ - */ -#define XQSPI_FIFO_THRESHOLD_1_8 LL_XQSPI_QSPI_FIFO_WATERMARK_1_8 /**< FIFO depth/8 */ -#define XQSPI_FIFO_THRESHOLD_1_4 LL_XQSPI_QSPI_FIFO_WATERMARK_1_4 /**< FIFO depth/4 */ -#define XQSPI_FIFO_THRESHOLD_1_2 LL_XQSPI_QSPI_FIFO_WATERMARK_1_2 /**< FIFO depth/2 */ -#define XQSPI_FIFO_THRESHOLD_3_4 LL_XQSPI_QSPI_FIFO_WATERMARK_3_4 /**< FIFO depth*3/4 */ -#define XQSPI_FIFO_DEPTH LL_XQSPI_QSPI_FIFO_DEPTH /**< FIFO full depth */ -/** @} */ - -/** @defgroup XQSPI_Instruction_Size XQSPI Instruction Size, only in QSPI mode - * @{ - */ -#define XQSPI_INSTSIZE_00_BITS (0) /**< 0-bit (No Instruction) */ -#define XQSPI_INSTSIZE_08_BITS (1) /**< 8-bit Instruction */ -#define XQSPI_INSTSIZE_16_BITS (2) /**< 16-bit Instruction */ -/** @} */ - -/** @defgroup XQSPI_Address_Size XQSPI Address Size, only in QSPI mode - * @{ - */ -#define XQSPI_ADDRSIZE_00_BITS (0) /**< 0-bit (No Address) */ -#define XQSPI_ADDRSIZE_08_BITS (1) /**< 8-bit Address */ -#define XQSPI_ADDRSIZE_16_BITS (2) /**< 16-bit Address */ -#define XQSPI_ADDRSIZE_24_BITS (3) /**< 24-bit Address */ -#define XQSPI_ADDRSIZE_32_BITS (4) /**< 32-bit Address */ -/** @} */ - -/** @defgroup XQSPI_Inst_Addr_Mode XQSPI Instruction and Address Mode, only in QSPI mode - * @{ - */ -#define XQSPI_INST_ADDR_ALL_IN_SPI (0) /**< Instruction and address are sent in SPI mode */ -#define XQSPI_INST_IN_SPI_ADDR_IN_SPIFRF (1) /**< Instruction is sent in SPI mode, - and address is sent in Daul/Quad SPI mode */ -#define XQSPI_INST_ADDR_ALL_IN_SPIFRF (2) /**< Instruction and address are sent in Daul/Quad SPI mode */ -/** @} */ - -/** @defgroup XQSPI_Flags XQSPI Flags, only in QSPI mode - * @{ - */ -#define XQSPI_FLAG_RFF LL_XQSPI_QSPI_STAT_RFF /**< Rx FIFO full flag */ -#define XQSPI_FLAG_RFTF LL_XQSPI_QSPI_STAT_RFTF /**< Rx FIFO threshold flag */ -#define XQSPI_FLAG_RFE LL_XQSPI_QSPI_STAT_RFE /**< Rx FIFO empty flag */ -#define XQSPI_FLAG_TFF LL_XQSPI_QSPI_STAT_TFF /**< Tx FIFO full flag */ -#define XQSPI_FLAG_TFTF LL_XQSPI_QSPI_STAT_TFTF /**< Tx FIFO threshold flag */ -#define XQSPI_FLAG_TFE LL_XQSPI_QSPI_STAT_TFE /**< Tx FIFO empty flag */ -#define XQSPI_FLAG_BUSY LL_XQSPI_QSPI_STAT_BUSY /**< Busy flag */ -/** @} */ - -/** @defgroup XQSPI_Ctrl_Present Control Present Status, only in XIP mode - * @{ - */ -#define XQSPI_DISABLE_PRESENT LL_XQSPI_DISABLE_PRESENT /**< Disable Present */ -#define XQSPI_ENABLE_PRESENT LL_XQSPI_ENABLE_PRESENT /**< Enable Present */ -/** @} */ - -/** - * @brief XQSPI_Retry_definition XQSPI Retry definition - */ -#define HAL_XQSPI_RETRY_DEFAULT_VALUE ((uint32_t)1000) /**< 1000 times */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup XQSPI_Exported_Macros XQSPI Exported Macros - * @{ - */ - -/** @brief Reset XQSPI handle states. - * @param __HANDLE__ XQSPI handle. - * @retval None - */ -#define HAL_XQSPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->state = HAL_XQSPI_STATE_RESET) - -/** @brief Enable the specified QSPI peripheral in XQSPI. - * @param __HANDLE__ specifies the XQSPI Handle. - * @retval None - */ -#define HAL_XQSPI_ENABLE_QSPI(__HANDLE__) \ - SET_BITS((__HANDLE__)->p_instance->QSPI.SPIEN, SSI_SSIEN_EN) - -/** @brief Disable the specified QSPI peripheral in XQSPI. - * @param __HANDLE__ specifies the XQSPI Handle. - * @retval None - */ -#define HAL_XQSPI_DISABLE_QSPI(__HANDLE__) \ - CLEAR_BITS((__HANDLE__)->p_instance->QSPI.SPIEN, SSI_SSIEN_EN) - -/** @brief Enable the specified XIP peripheral in XQSPI. - * @param __HANDLE__ specifies the XQSPI Handle. - * @retval None - */ -#define HAL_XQSPI_ENABLE_XIP(__HANDLE__) \ -do { \ - SET_BITS((__HANDLE__)->p_instance->XIP.CTRL3, SSI_SSIEN_EN); \ - while (!ll_xqspi_get_xip_flag((__HANDLE__)->p_instance)) \ -} while (0) - -/** @brief Disable the specified XIP peripheral in XQSPI. - * @param __HANDLE__ specifies the XQSPI Handle. - * @retval None - */ -#define HAL_XQSPI_DISABLE_XIP(__HANDLE__) \ -do { \ - CLEAR_BITS((__HANDLE__)->p_instance->XIP.CTRL3, SSI_SSIEN_EN); \ - while (ll_xqspi_get_xip_flag((__HANDLE__)->p_instance)) \ -} while (0) - -/** @brief Enable the specified CACHE peripheral in XQSPI. - * @param __HANDLE__ specifies the XQSPI Handle. - * @retval None - */ -#define HAL_XQSPI_ENABLE_CACHE(__HANDLE__) \ - CLEAR_BITS((__HANDLE__)->p_instance->CACHE.CTRL0, XQSPI_CACHE_CTRL0_DIS) - -/** @brief Disable the specified CACHE peripheral in XQSPI. - * @param __HANDLE__ specifies the XQSPI Handle. - * @retval None - */ -#define HAL_XQSPI_DISABLE_CACHE(__HANDLE__) \ - SET_BITS((__HANDLE__)->p_instance->CACHE.CTRL0, XQSPI_CACHE_CTRL0_DIS) - -/** @brief Check whether the specified XQSPI flag is set or not. - * @param __HANDLE__ specifies the XQSPI Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref XQSPI_FLAG_RFF Rx FIFO full flag - * @arg @ref XQSPI_FLAG_RFTF Rx FIFO threshold flag - * @arg @ref XQSPI_FLAG_RFE Rx FIFO empty flag - * @arg @ref XQSPI_FLAG_TFF Tx FIFO full flag - * @arg @ref XQSPI_FLAG_TFTF Tx FIFO threshold flag - * @arg @ref XQSPI_FLAG_TFE Tx FIFO empty flag - * @arg @ref XQSPI_FLAG_BUSY Busy flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define HAL_XQSPI_GET_FLAG(__HANDLE__, __FLAG__) \ - ((READ_BITS((__HANDLE__)->p_instance->QSPI.STAT, (__FLAG__)) != 0) ? SET : RESET) - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup XQSPI_Private_Macro XQSPI Private Macros - * @{ - */ - -/** @brief Check if XQSPI Work Mode is valid. - * @param __MODE__ XQSPI Work Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_XQSPI_WORK_MODE(__MODE__) (((__MODE__) == XQSPI_WORK_MODE_QSPI) || \ - ((__MODE__) == XQSPI_WORK_MODE_XIP)) - -/** @brief Check if XQSPI Cache Mode is valid. - * @param __MODE__ XQSPI Cache Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_XQSPI_CACHE_MODE(__MODE__) (((__MODE__) == XQSPI_CACHE_MODE_DIS) || \ - ((__MODE__) == XQSPI_CACHE_MODE_EN)) - -/** @brief Check if XQSPI Read CMD is valid. - * @param __CMD__ XQSPI Cache Mode. - * @retval SET (__CMD__ is valid) or RESET (__CMD__ is invalid) - */ -#define IS_XQSPI_READ_CMD(__CMD__) (((__CMD__) == XQSPI_READ_CMD_READ ) || \ - ((__CMD__) == XQSPI_READ_CMD_FAST_READ ) || \ - ((__CMD__) == XQSPI_READ_CMD_DUAL_OUT_READ) || \ - ((__CMD__) == XQSPI_READ_CMD_DUAL_IO_READ ) || \ - ((__CMD__) == XQSPI_READ_CMD_QUAD_OUT_READ) || \ - ((__CMD__) == XQSPI_READ_CMD_QUAD_IO_READ)) - -/** @brief Check if XQSPI Clock Baud Rate is valid. - * @param __BAUD__ XQSPI Clock Baud Rate. - * @retval SET (__BAUD__ is valid) or RESET (__BAUD__ is invalid) - */ -#define IS_XQSPI_BAUD_RATE(__BAUD__) (((__BAUD__) == XQSPI_BAUD_RATE_64M) || \ - ((__BAUD__) == XQSPI_BAUD_RATE_48M) || \ - ((__BAUD__) == XQSPI_BAUD_RATE_32M) || \ - ((__BAUD__) == XQSPI_BAUD_RATE_24M) || \ - ((__BAUD__) == XQSPI_BAUD_RATE_16M)) - -/** @brief Check if XQSPI Clock Mode is valid. - * @param __CLKMODE__ XQSPI Clock Mode. - * @retval SET (__CLKMODE__ is valid) or RESET (__CLKMODE__ is invalid) - */ -#define IS_XQSPI_CLOCK_MODE(__CLKMODE__) (((__CLKMODE__) == XQSPI_CLOCK_MODE_0) || \ - ((__CLKMODE__) == XQSPI_CLOCK_MODE_1) || \ - ((__CLKMODE__) == XQSPI_CLOCK_MODE_2) || \ - ((__CLKMODE__) == XQSPI_CLOCK_MODE_3)) - -/** @brief Check if XQSPI FIFO Threshold is valid. - * @param __THR__ XQSPI FIFO Threshold. - * @retval SET (__THR__ is valid) or RESET (__THR__ is invalid) - */ -#define IS_XQSPI_FIFO_THRESHOLD(__THR__) (((__THR__) == XQSPI_FIFO_THRESHOLD_1_8) || \ - ((__THR__) == XQSPI_FIFO_THRESHOLD_1_4) || \ - ((__THR__) == XQSPI_FIFO_THRESHOLD_1_2) || \ - ((__THR__) == XQSPI_FIFO_THRESHOLD_3_4)) - -/** @brief Check if XQSPI Instruction Size is valid. - * @param __INST_SIZE__ XQSPI Instruction Size. - * @retval SET (__INST_SIZE__ is valid) or RESET (__INST_SIZE__ is invalid) - */ -#define IS_XQSPI_INSTRUCTION_SIZE(__INST_SIZE__) (((__INST_SIZE__) == XQSPI_INSTSIZE_00_BITS) || \ - ((__INST_SIZE__) == XQSPI_INSTSIZE_08_BITS) || \ - ((__INST_SIZE__) == XQSPI_INSTSIZE_16_BITS)) - -/** @brief Check if XQSPI Address Size is valid. - * @param __ADDR_SIZE__ XQSPI Address Size . - * @retval SET (__ADDR_SIZE__ is valid) or RESET (__ADDR_SIZE__ is invalid) - */ -#define IS_XQSPI_ADDRESS_SIZE(__ADDR_SIZE__) (((__ADDR_SIZE__) == XQSPI_ADDRSIZE_00_BITS) || \ - ((__ADDR_SIZE__) == XQSPI_ADDRSIZE_08_BITS) || \ - ((__ADDR_SIZE__) == XQSPI_ADDRSIZE_16_BITS) || \ - ((__ADDR_SIZE__) == XQSPI_ADDRSIZE_24_BITS) || \ - ((__ADDR_SIZE__) == XQSPI_ADDRSIZE_32_BITS)) - -/** @brief Check if XQSPI Instruction and Address Mode is valid. - * @param __MODE__ XQSPI Instruction and Address Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_XQSPI_INSTADDR_MODE(__MODE__) (((__MODE__) == XQSPI_INST_ADDR_ALL_IN_SPI) || \ - ((__MODE__) == XQSPI_INST_IN_SPI_ADDR_IN_SPIFRF) || \ - ((__MODE__) == XQSPI_INST_ADDR_ALL_IN_SPIFRF)) - -/** @brief Check if XQSPI Data Mode is valid. - * @param __MODE__ XQSPI Data Mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_XQSPI_DATA_MODE(__MODE__) (((__MODE__) == XQSPI_DATA_MODE_SPI) || \ - ((__MODE__) == XQSPI_DATA_MODE_DUALSPI) || \ - ((__MODE__) == XQSPI_DATA_MODE_QUADSPI)) - -/** @} */ - -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_XQSPI_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup XQSPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the XQSPIx peripheral. - - (+) User must implement hal_xqspi_msp_init() function in which he configures - all related peripherals resources (GPIO, DMA, IT and NVIC ). - - (+) Call the function hal_xqspi_init() to configure the selected device with - the selected configuration: - (++) work_mode - (++) cache_mode - (++) read_cmd - (++) baud_rate - (++) clock_mode - - (+) Call the function hal_xqspi_deinit() to restore the default configuration - of the selected XQSPIx peripheral. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Initialize the XQSPI according to the specified parameters - * in the xqspi_init_t and initialize the associated handle. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_init(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief De-initialize the XQSPI peripheral. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_deinit(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief Initialize the XQSPI MSP. - * @note This function should not be modified. When the callback is needed, - the hal_xqspi_msp_deinit can be implemented in the user file. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - **************************************************************************************** - */ -void hal_xqspi_msp_init(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief De-initialize the XQSPI MSP. - * @note This function should not be modified. When the callback is needed, - the hal_xqspi_msp_deinit can be implemented in the user file. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - **************************************************************************************** - */ -void hal_xqspi_msp_deinit(xqspi_handle_t *p_xqspi); - -/** @} */ - -/** @defgroup XQSPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the XQSPI - data transfers. - - [..] The XQSPI supports master and slave mode: - - (#) There are one modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - - (#) APIs provided for only one transfer mode (Blocking mode) - exist for 1Line/2Line/4Line (simplex) modes. - -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Transmit an amount of data with specified instruction and address in blocking mode. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] p_cmd: Pointer to a xqspi_command_t structure that - * contains the instruction and address for data transfer. - * @param[in] p_data: Pointer to data buffer - * @param[in] retry: Repeat times - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_command_transmit(xqspi_handle_t *p_xqspi, xqspi_command_t *p_cmd, - uint8_t *p_data, uint32_t retry); - -/** - **************************************************************************************** - * @brief Receive an amount of data with specified instruction and address in blocking mode. - * @note This function is used only in Indirect Write Mode. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] p_cmd: Pointer to a xqspi_command_t structure that - * contains the instruction and address for data transfer. - * @param[out] p_data: Pointer to data buffer - * @param[in] retry: Repeat times - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_command_receive(xqspi_handle_t *p_xqspi, xqspi_command_t *p_cmd, - uint8_t *p_data, uint32_t retry); - -#if defined RTL_SIM -hal_status_t hal_xqspi_command_receive_rtl(xqspi_handle_t *p_xqspi, xqspi_command_t *p_cmd, - uint8_t *p_data, uint32_t retry); -#endif - - -/** - **************************************************************************************** - * @brief Transmit an amount of data in blocking mode. - * @note This function is used only in Indirect Write Mode, only in standard SPI mode. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be sent in bytes - * @param[in] retry: Repeat times - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_transmit(xqspi_handle_t *p_xqspi, uint8_t *p_data, uint32_t length, uint32_t retry); - -/** - **************************************************************************************** - * @brief Receive an amount of data in blocking mode. - * @note This function is used only in Indirect Read Mode, only in standard SPI mode. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[out] p_data: Pointer to data buffer - * @param[in] length: Amount of data to be received in bytes - * @param[in] retry: Repeat times - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_receive(xqspi_handle_t *p_xqspi, uint8_t *p_data, uint32_t length, uint32_t retry); - -/** @} */ - -/** @defgroup XQSPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief XQSPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the XQSPI. - (+) hal_xqspi_get_state()API can be helpful to check in run-time the state of the XQSPI peripheral. - (+) hal_xqspi_get_error() check in run-time Errors occurring during communication. - (+) hal_xqspi_set_retry() set the repeat times during internal process. - (+) hal_xqspi_set_tx_fifo_threshold() set the TX FIFO Threshold. - (+) hal_xqspi_set_rx_fifo_threshold() set the RX FIFO Threshold. - (+) hal_xqspi_get_tx_fifo_threshold() get the TX FIFO Threshold. - (+) hal_xqspi_get_rx_fifo_threshold() get the RX FIFO Threshold. -@endverbatim - * @{ - */ - -/** - **************************************************************************************** - * @brief Return the XQSPI handle state. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @retval ::HAL_XQSPI_STATE_RESET: Peripheral not initialized. - * @retval ::HAL_XQSPI_STATE_READY: Peripheral initialized and ready for use. - * @retval ::HAL_XQSPI_STATE_BUSY: Peripheral in indirect mode and busy. - * @retval ::HAL_XQSPI_STATE_BUSY_INDIRECT_TX: Peripheral in indirect mode with transmission ongoing. - * @retval ::HAL_XQSPI_STATE_BUSY_INDIRECT_RX: Peripheral in indirect mode with reception ongoing. - * @retval ::HAL_XQSPI_STATE_ABORT: Peripheral with abort request ongoing. - * @retval ::HAL_XQSPI_STATE_ERROR: Peripheral in error. - **************************************************************************************** - */ -hal_xqspi_state_t hal_xqspi_get_state(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief Return the XQSPI error code. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @return XQSPI error code in bitmap format - **************************************************************************************** - */ -uint32_t hal_xqspi_get_error(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief Set the XQSPI internal process repeat times value. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] retry: Internal process repeat times value. - **************************************************************************************** - */ -void hal_xqspi_set_retry(xqspi_handle_t *p_xqspi, uint32_t retry); - -/** - **************************************************************************************** - * @brief Set the TXFIFO threshold. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] threshold: TX FIFO threshold can be one of the following values: - * @arg @ref XQSPI_FIFO_THRESHOLD_1_8 threshold is 8 bytes - * @arg @ref XQSPI_FIFO_THRESHOLD_1_4 threshold is 16 bytes - * @arg @ref XQSPI_FIFO_THRESHOLD_1_2 threshold is 32 bytes - * @arg @ref XQSPI_FIFO_THRESHOLD_3_4 threshold is 48 bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_set_tx_fifo_threshold(xqspi_handle_t *p_xqspi, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Set the RXFIFO threshold. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] threshold: RX FIFO threshold can be one of the following values: - * @arg @ref XQSPI_FIFO_THRESHOLD_1_8 threshold is 8 bytes - * @arg @ref XQSPI_FIFO_THRESHOLD_1_4 threshold is 16 bytes - * @arg @ref XQSPI_FIFO_THRESHOLD_1_2 threshold is 32 bytes - * @arg @ref XQSPI_FIFO_THRESHOLD_3_4 threshold is 48 bytes - * @retval ::HAL_OK: Operation is OK. - * @retval ::HAL_ERROR: Parameter error or operation not supported. - * @retval ::HAL_BUSY: Driver is busy. - * @retval ::HAL_TIMEOUT: Timeout occurred. - **************************************************************************************** - */ -hal_status_t hal_xqspi_set_rx_fifo_threshold(xqspi_handle_t *p_xqspi, uint32_t threshold); - -/** - **************************************************************************************** - * @brief Get the TXFIFO threshold. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @return TX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_xqspi_get_tx_fifo_threshold(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief Get the RXFIFO threshold. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @return RX FIFO threshold - **************************************************************************************** - */ -uint32_t hal_xqspi_get_rx_fifo_threshold(xqspi_handle_t *p_xqspi); - -/** - **************************************************************************************** - * @brief Turn on/off present module, only in XIP mode. - * @param[in] p_xqspi: Pointer to an XQSPI handle which contains the - * configuration information for the specified XQSPI. - * @param[in] status: Presen status can be one of the following values: - * @arg @ref XQSPI_DISABLE_PRESENT Disable Present - * @arg @ref XQSPI_ENABLE_PRESENT Enable Present - - **************************************************************************************** - */ -void hal_xqspi_set_xip_present_status(xqspi_handle_t *p_xqspi, uint32_t status); - -/** @} */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_HAL_XQSPI_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_adc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_adc.h deleted file mode 100755 index 11593cf..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_adc.h +++ /dev/null @@ -1,929 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_adc.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of ADC LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_ADC ADC - * @brief ADC LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_ADC_H__ -#define __GR55XX_LL_ADC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(AON) - -/** @defgroup LL_ADC_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup LL_ADC_ES_INIT ADC Exported init structures - * @{ - */ - -/** - * @brief LL ADC init Structure definition - */ -typedef struct _ll_adc_init { - uint32_t channel_p; /**< Specifies the input source to ADC channel P. - This parameter can be any value of @ref LL_ADC_EC_INPUT_SRC. - This parament can be modified afterwards using unitary function - @ref ll_adc_set_channelp(). */ - - uint32_t channel_n; /**< Specifies the input source to ADC channel N. - This parameter can be any value of @ref LL_ADC_EC_INPUT_SRC. - This parament can be modified afterwards using unitary function - @ref ll_adc_set_channeln(). */ - - uint32_t input_mode; /**< Specifies the operation mode for the ADC sample. - This parameter can be a value of @ref LL_ADC_EC_INPUT_MODE. - This parament can be modified afterwards using unitary function - @ref ll_adc_set_input_mode(). */ - - uint32_t ref_source; /**< Specifies the source of the ADC reference. - This parameter can be a value of @ref LL_ADC_EC_REFERENCE_SRC. - This parament can be modified afterwards using unitary function - @ref ll_adc_set_ref(). */ - - uint32_t ref_value; /*!< Specifies the value of the ADC buffered reference. - This parameter can be a value of @ref LL_ADC_EC_REFERENCE. - This parament can be modified afterwards using unitary function - @ref ll_adc_set_ref_value(). */ - - uint32_t clock; /**< Specifies the clock of ADC. - This parameter can be a value of @ref LL_ADC_EC_CLK. - This parament can be modified afterwards using unitary function - @ref ll_adc_set_clock(). */ -} ll_adc_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup LL_ADC_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup LL_ADC_Exported_Constants ADC Exported Constants - * @{ - */ - -/** @defgroup LL_ADC_EC_CLK ADC CLOCK - * @{ - */ -#define LL_ADC_CLK_16 (0x00000000UL) /**< 16 MHz */ -#define LL_ADC_CLK_8 (1UL << AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos) /**< 8 MHz */ -#define LL_ADC_CLK_4 (2UL << AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos) /**< 4 MHz */ -#define LL_ADC_CLK_2 (3UL << AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos) /**< 2 MHz */ -#define LL_ADC_CLK_1P6 (4UL << AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos) /**< 1.6 MHz */ -#define LL_ADC_CLK_1 (5UL << AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos) /**< 1 MHz */ -/** @} */ - -/** @defgroup LL_ADC_EC_REFERENCE ADC Buffered Internal Reference Value - * @{ - */ -#define LL_ADC_REF_VALUE_0P8 (0x3UL << AON_SNSADC_CFG_REF_VALUE_Pos) /**< Reference = 0.85 V */ -#define LL_ADC_REF_VALUE_1P2 (0x7UL << AON_SNSADC_CFG_REF_VALUE_Pos) /**< Reference = 1.28 V */ -#define LL_ADC_REF_VALUE_1P6 (0xAUL << AON_SNSADC_CFG_REF_VALUE_Pos) /**< Reference = 1.60 V */ - -/** @} */ - -/** @defgroup LL_ADC_EC_INPUT_MODE ADC Input Mode - * @{ - */ -#define LL_ADC_INPUT_SINGLE (1UL << AON_SNSADC_CFG_SINGLE_EN_Pos) /**< Single ended mode */ -#define LL_ADC_INPUT_DIFFERENTIAL (0x00000000UL) /**< Differential mode */ -/** @} */ - -/** @defgroup LL_ADC_EC_INPUT_SRC ADC Input Source - * @{ - */ -#define LL_ADC_INPUT_SRC_IO0 (0UL) /**< Select MSIO0 as input */ -#define LL_ADC_INPUT_SRC_IO1 (1UL) /**< Select MSIO1 as input */ -#define LL_ADC_INPUT_SRC_IO2 (2UL) /**< Select MSIO2 as input */ -#define LL_ADC_INPUT_SRC_IO3 (3UL) /**< Select MSIO3 as input */ -#define LL_ADC_INPUT_SRC_IO4 (4UL) /**< Select MSIO4 as input */ -#define LL_ADC_INPUT_SRC_TMP (5UL) /**< Select temperature as input */ -#define LL_ADC_INPUT_SRC_BAT (6UL) /**< Select Vbattery as input */ -#define LL_ADC_INPUT_SRC_REF (7UL) /**< Select reference as input */ - -/** @} */ - -/** @defgroup LL_ADC_EC_REFERENCE_SRC ADC Reference Source - * @{ - */ -#define LL_ADC_REF_SRC_BUF_INT (0x00000000UL) /**< Select buffered internal - reference as reference */ -#define LL_ADC_REF_SRC_IO0 (3UL << AON_SNSADC_CFG_REF_SEL_Pos) /**< Select MSIO0 as reference */ -#define LL_ADC_REF_SRC_IO1 (4UL << AON_SNSADC_CFG_REF_SEL_Pos) /**< Select MSIO1 as reference */ -#define LL_ADC_REF_SRC_IO2 (5UL << AON_SNSADC_CFG_REF_SEL_Pos) /**< Select MSIO2 as reference */ -#define LL_ADC_REF_SRC_IO3 (6UL << AON_SNSADC_CFG_REF_SEL_Pos) /**< Select MSIO3 as reference */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup LL_ADC_Exported_Macros ADC Exported Macros - * @{ - */ - -/** @defgroup LL_ADC_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in ADC register - * @param __instance__ ADC instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_ADC_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG((__instance__)->__REG__, (__VALUE__)) - -/** - * @brief Read a value in ADC register - * @param __instance__ ADC instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_ADC_ReadReg(__instance__, __REG__) READ_REG((__instance__)->__REG__) - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup LL_ADC_Private_Macros ADC Private Macros - * @{ - */ - -/** @defgroup LL_ADC_EC_DEFAULT_CONFIG InitStruct default configuartion - * @{ - */ - -/** - * @brief LL ADC InitStrcut default configuartion - */ -#define LL_ADC_DEFAULT_CONFIG \ -{ \ - .channel_p = LL_ADC_INPUT_SRC_IO0, \ - .channel_n = LL_ADC_INPUT_SRC_IO1, \ - .input_mode = LL_ADC_INPUT_DIFFERENTIAL, \ - .ref_source = LL_ADC_REF_SRC_BUF_INT, \ - .ref_value = LL_ADC_REF_VALUE_1P5, \ - .clock = LL_ADC_CLK_16 \ -} -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup LL_ADC_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup LL_ADC_EF_Configuration Basic Configuration - * @{ - */ - -/** - * @brief Enable ADC module. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_enable(void) -{ - SET_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_EN_Msk); -} - -/** - * @brief Disable ADC module. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_disable(void) -{ - CLEAR_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_EN_Msk); -} - -/** - * @brief Check if ADC module is enabled. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_enabled(void) -{ - return (READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_EN_Msk) == (AON_SNSADC_CFG_EN_Msk)); -} - -/** - * @brief Enable ADC clock. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | ADC_CLK_EN - * - * @retval None - */ -__STATIC_INLINE void ll_adc_enable_clock(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, AON_MSIO_PAD_CFG_1_ADC_CLK_EN); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable ADC clock. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | ADC_CLK_EN - * - * @retval None - */ -__STATIC_INLINE void ll_adc_disable_clock(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->MSIO_PAD_CFG_1, AON_MSIO_PAD_CFG_1_ADC_CLK_EN); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if ADC clock is enabled. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | ADC_CLK_EN - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_enabled_clock(void) -{ - return (READ_BITS(AON->MSIO_PAD_CFG_1, AON_MSIO_PAD_CFG_1_ADC_CLK_EN) == (AON_MSIO_PAD_CFG_1_ADC_CLK_EN)); -} - -/** - * @brief Set ADC clock source. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | ADC_CLK_SEL - * - * @param clk This parameter can be one of the following values: - * @arg @ref LL_ADC_CLK_16 - * @arg @ref LL_ADC_CLK_8 - * @arg @ref LL_ADC_CLK_4 - * @arg @ref LL_ADC_CLK_2 - * @arg @ref LL_ADC_CLK_1P6 - * @arg @ref LL_ADC_CLK_1 - * @retval None - */ -__STATIC_INLINE void ll_adc_set_clock(uint32_t clk) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->MSIO_PAD_CFG_1, AON_MSIO_PAD_CFG_1_ADC_CLK_SEL, clk); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return source for ADC clock. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | ADC_CLK_SEL - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_CLK_16 - * @arg @ref LL_ADC_CLK_8 - * @arg @ref LL_ADC_CLK_4 - * @arg @ref LL_ADC_CLK_2 - * @arg @ref LL_ADC_CLK_1P6 - * @arg @ref LL_ADC_CLK_1 - */ -__STATIC_INLINE uint32_t ll_adc_get_clock(void) -{ - return (uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_1, AON_MSIO_PAD_CFG_1_ADC_CLK_SEL) >> \ - AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos); -} - -/** - * @brief Set ADC bias reference. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG1 - * - * @param value This parameter can be one of the following values: - * @arg @ref LL_ADC_REF_VALUE_0P8 - * @arg @ref LL_ADC_REF_VALUE_1P2 - * @arg @ref LL_ADC_REF_VALUE_1P6 - * @retval None - */ -__STATIC_INLINE void ll_adc_set_ref_value(uint32_t value) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_REF_VALUE_Msk, value); -} - -/** - * @brief Return ADC bias reference. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG1 - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REF_VALUE_0P8 - * @arg @ref LL_ADC_REF_VALUE_1P2 - * @arg @ref LL_ADC_REF_VALUE_1P6 - */ -__STATIC_INLINE uint32_t ll_adc_get_ref_value(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_REF_VALUE_Msk) >> AON_SNSADC_CFG_REF_VALUE_Pos); -} - -/** - * @brief Enable temperature sensor. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_enable_temp(void) -{ - SET_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_TEMP_EN_Msk); -} - -/** - * @brief Disable temperature sensor. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_disable_temp(void) -{ - CLEAR_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_TEMP_EN_Msk); -} - -/** - * @brief Check if temperature sensor is enabled. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_enabled_temp(void) -{ - return (READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_TEMP_EN_Msk) == (AON_SNSADC_CFG_TEMP_EN_Msk)); -} - -/** - * @brief Enable Vbattery sensor. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_enable_vbat(void) -{ - SET_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_VBAT_EN_Msk); -} - -/** - * @brief Disable Vbattery sensor. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_disable_vbat(void) -{ - CLEAR_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_VBAT_EN_Msk); -} - -/** - * @brief Check if Vbattery sensor is enabled. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_enabled_vbat(void) -{ - return (READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_VBAT_EN_Msk) == (AON_SNSADC_CFG_VBAT_EN_Msk)); -} - -/** - * @brief Set ADC input mode. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @param mode This parameter can be one of the following values: - * @arg @ref LL_ADC_INPUT_SINGLE - * @arg @ref LL_ADC_INPUT_DIFFERENTIAL - * @retval None - */ -__STATIC_INLINE void ll_adc_set_input_mode(uint32_t mode) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_SINGLE_EN_Msk, mode); -} - -/** - * @brief Return ADC input mode. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INPUT_SINGLE - * @arg @ref LL_ADC_INPUT_DIFFERENTIAL - */ -__STATIC_INLINE uint32_t ll_adc_get_input_mode(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_SINGLE_EN_Msk) >> AON_SNSADC_CFG_SINGLE_EN_Pos); -} - -/** - * @brief Enable offset calibration. - * @note Enable offset calibration, used to swap inputs of comparator for offset - * calibration. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_enable_ofs_cal(void) -{ - SET_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_OFS_CAL_EN_Msk); -} - -/** - * @brief Disable offset calibration. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_disable_ofs_cal(void) -{ - CLEAR_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_OFS_CAL_EN_Msk); -} - -/** - * @brief Check if offset calibration is enabled. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_enabled_ofs_cal(void) -{ - return (READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_OFS_CAL_EN_Msk) == (AON_SNSADC_CFG_OFS_CAL_EN_Msk)); -} - -/** - * @brief Set dynamic rang of ADC. - * @note When higher input signal frequencies close to Nyquist rate, you should set 1. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @param rang This parameter can be a value between: 1 ~ 7 - * @retval None - */ -__STATIC_INLINE void ll_adc_set_dynamic_rang(uint32_t rang) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_DYMAMIC_Msk, (rang & 0x7) << AON_SNSADC_CFG_DYMAMIC_Pos); -} - -/** - * @brief Return ADC dynamic rang. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG2 - * - * @retval Returned value can be a value between: 1 ~ 7 - */ -__STATIC_INLINE uint32_t ll_adc_get_dynamic_rang(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_DYMAMIC_Msk) >> AON_SNSADC_CFG_DYMAMIC_Pos); -} - -/** - * @brief Set source of ADC input channelP. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG3 - * - * @param source This parameter can be one of the following values: - * @arg @ref LL_ADC_INPUT_SRC_IO0 - * @arg @ref LL_ADC_INPUT_SRC_IO1 - * @arg @ref LL_ADC_INPUT_SRC_IO2 - * @arg @ref LL_ADC_INPUT_SRC_IO3 - * @arg @ref LL_ADC_INPUT_SRC_IO4 - * @arg @ref LL_ADC_INPUT_SRC_TMP - * @arg @ref LL_ADC_INPUT_SRC_BAT - * @retval None - */ -__STATIC_INLINE void ll_adc_set_channelp(uint32_t source) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_CHN_P_Msk, source << AON_SNSADC_CFG_CHN_P_Pos); -} - -/** - * @brief Return source of ADC input channelP. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG3 - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INPUT_SRC_IO0 - * @arg @ref LL_ADC_INPUT_SRC_IO1 - * @arg @ref LL_ADC_INPUT_SRC_IO2 - * @arg @ref LL_ADC_INPUT_SRC_IO3 - * @arg @ref LL_ADC_INPUT_SRC_IO4 - * @arg @ref LL_ADC_INPUT_SRC_TMP - * @arg @ref LL_ADC_INPUT_SRC_BAT - */ -__STATIC_INLINE uint32_t ll_adc_get_channelp(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_CHN_P_Msk) >> AON_SNSADC_CFG_CHN_P_Pos); -} - -/** - * @brief Set source of ADC input channelN. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG3 - * - * @param source This parameter can be one of the following values: - * @arg @ref LL_ADC_INPUT_SRC_IO0 - * @arg @ref LL_ADC_INPUT_SRC_IO1 - * @arg @ref LL_ADC_INPUT_SRC_IO2 - * @arg @ref LL_ADC_INPUT_SRC_IO3 - * @arg @ref LL_ADC_INPUT_SRC_IO4 - * @arg @ref LL_ADC_INPUT_SRC_TMP - * @arg @ref LL_ADC_INPUT_SRC_BAT - * @retval None - */ -__STATIC_INLINE void ll_adc_set_channeln(uint32_t source) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_CHN_N_Msk, source << AON_SNSADC_CFG_CHN_N_Pos); -} - -/** - * @brief Return source of ADC input channelN. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG3 - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INPUT_SRC_IO0 - * @arg @ref LL_ADC_INPUT_SRC_IO1 - * @arg @ref LL_ADC_INPUT_SRC_IO2 - * @arg @ref LL_ADC_INPUT_SRC_IO3 - * @arg @ref LL_ADC_INPUT_SRC_IO4 - * @arg @ref LL_ADC_INPUT_SRC_TMP - * @arg @ref LL_ADC_INPUT_SRC_BAT - */ -__STATIC_INLINE uint32_t ll_adc_get_channeln(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_CHN_N_Msk) >> AON_SNSADC_CFG_CHN_N_Pos); -} - -/** - * @brief Enable ADC MAS_RST. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_enable_mas_rst(void) -{ - SET_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_MAS_RST_Msk); -} - -/** - * @brief Disable ADC MAS_RST. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval None - */ -__STATIC_INLINE void ll_adc_disable_mas_rst(void) -{ - CLEAR_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_MAS_RST_Msk); -} - -/** - * @brief Check if ADC MAS_RST is enabled. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_enabled_mas_rst(void) -{ - return (READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_MAS_RST_Msk) == (AON_SNSADC_CFG_MAS_RST_Msk)); -} - -/** - * @brief Set source of ADC reference. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @param source This parameter can be one of the following values: - * @arg @ref LL_ADC_REF_SRC_BUF_INT - * @arg @ref LL_ADC_REF_SRC_IO0 - * @arg @ref LL_ADC_REF_SRC_IO1 - * @arg @ref LL_ADC_REF_SRC_IO2 - * @arg @ref LL_ADC_REF_SRC_IO3 - * @retval None - */ -__STATIC_INLINE void ll_adc_set_ref(uint32_t source) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_REF_SEL_Msk, source); -} - -/** - * @brief Return source of ADC reference. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REF_SRC_BUF_INT - * @arg @ref LL_ADC_REF_SRC_IO0 - * @arg @ref LL_ADC_REF_SRC_IO1 - * @arg @ref LL_ADC_REF_SRC_IO2 - * @arg @ref LL_ADC_REF_SRC_IO3 - */ -__STATIC_INLINE uint32_t ll_adc_get_ref(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_REF_SEL_Msk) >> AON_SNSADC_CFG_REF_SEL_Pos); -} - -/** - * @brief Set current of ADC reference circuit. - * @note When samples at 100kbps, you should set 0. - * When samples at 1mbps, you should set 7. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @param source This parameter can be a value between: 0 ~ 7 - * @retval None - */ -__STATIC_INLINE void ll_adc_set_ref_current(uint32_t source) -{ - MODIFY_REG(AON->SNSADC_CFG, AON_SNSADC_CFG_REF_HP_Msk, (source & 0x7) << AON_SNSADC_CFG_REF_HP_Pos); -} - -/** - * @brief Return current of ADC reference circuit. - * - * Register|BitsName - * --------|-------- - * SNSADC_CFG | REG4 - * - * @retval Returned value can be a value between: 0 ~ 7 - */ -__STATIC_INLINE uint32_t ll_adc_get_ref_current(void) -{ - return (uint32_t)(READ_BITS(AON->SNSADC_CFG, AON_SNSADC_CFG_REF_HP_Msk) >> AON_SNSADC_CFG_REF_HP_Pos); -} - -/** @} */ - -/** @defgroup LL_ADC_EF_FIFO_Access FIFO Access - * @{ - */ - -/** - * @brief Return samples value of ADC by reading FIFO. - * @note There are two value in the register, both of them is 16bits. - * - * Register|BitsName - * --------|-------- - * SENSE_ADC_FIFO | SENSE_ADC_FIFO - * - * @retval Smaples value of input - */ -__STATIC_INLINE uint32_t ll_adc_read_fifo(void) -{ - return (uint32_t)(READ_REG(MCU_SUB->SENSE_ADC_FIFO)); -} - -/** - * @brief Set threshold of ADC FIFO. - * - * Register|BitsName - * --------|-------- - * SENSE_FF_THRESH | SENSE_FF_THRESH - * - * @param thresh This parameter can be a value between: 0 ~ 64 - * @retval None - */ -__STATIC_INLINE void ll_adc_set_thresh(uint32_t thresh) -{ - MODIFY_REG(MCU_SUB->SENSE_FF_THRESH, MCU_SUB_SNSADC_FF_THRESH, (thresh & 0x3F) << MCU_SUB_SNSADC_FF_THRESH_Pos); -} - -/** - * @brief Return threshold of ADC FIFO. - * - * Register|BitsName - * --------|-------- - * SENSE_FF_THRESH | SENSE_FF_THRESH - * - * @retval Returned value can be a value between: 0 ~ 64 - */ -__STATIC_INLINE uint32_t ll_adc_get_thresh(void) -{ - return (uint32_t)(READ_BITS(MCU_SUB->SENSE_FF_THRESH, MCU_SUB_SNSADC_FF_THRESH) >> MCU_SUB_SNSADC_FF_THRESH_Pos); -} - -/** - * @brief Check if ADC FIFO is not empty. - * - * Register|BitsName - * --------|-------- - * SENSE_ADC_STAT | VAL - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_adc_is_fifo_notempty(void) -{ - return (uint32_t)(READ_BITS(MCU_SUB->SENSE_ADC_STAT, MCU_SUB_SNSADC_STAT_VAL) == MCU_SUB_SNSADC_STAT_VAL); -} - -/** - * @brief Return count of ADC FIFO. - * - * Register|BitsName - * --------|-------- - * SENSE_ADC_STAT | FF_COUNT - * - * @retval Returned value can be a value between: 0 ~ 64 - */ -__STATIC_INLINE uint32_t ll_adc_get_fifo_count(void) -{ - return (uint32_t)(READ_BITS(MCU_SUB->SENSE_ADC_STAT, MCU_SUB_SNSADC_STAT_FF_COUNT) >> \ - MCU_SUB_SNSADC_STAT_FF_COUNT_Pos); -} - -/** @} */ - -/** @defgroup LL_ADC_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize ADC registers (Registers restored to their default values). - * @retval An error_status_t enumeration value: - * - SUCCESS: ADC registers are de-initialized - * - ERROR: ADC registers are not de-initialized - */ -error_status_t ll_adc_deinit(void); - -/** - * @brief Initialize ADC registers according to the specified. - * parameters in p_adc_init. - * @param p_adc_init Pointer to a ll_adc_init_t structure that contains the configuration - * information for the specified ADC peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: ADC registers are initialized according to p_adc_init content - * - ERROR: Problem occurred during ADC Registers initialization - */ -error_status_t ll_adc_init(ll_adc_init_t *p_adc_init); - -/** - * @brief Set each field of a @ref ll_adc_init_t type structure to default value. - * @param p_adc_init Pointer to a @ref ll_adc_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_adc_struct_init(ll_adc_init_t *p_adc_init); - -/** @} */ - -/** @} */ - -#endif /* AON */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_ADC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aes.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aes.h deleted file mode 100755 index 6d89fd5..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aes.h +++ /dev/null @@ -1,1399 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_aes.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of AES LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_AES AES - * @brief AES LL module driver. - * @{ - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_AES_H__ -#define __GR55XX_LL_AES_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (AES) - -/** @defgroup AES_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup AES_LL_ES_INIT AES Exported Init structures - * @{ - */ - -/** - * @brief LL AES Init Structure definition - */ -typedef struct _ll_aes_init { - uint32_t key_size; /**< 128, 192 or 256-bit key length. - This parameter can be a value of @ref AES_LL_EC_KEY_SIZE */ - - uint32_t *p_key; /**< Encryption/Decryption Key */ - - uint32_t *p_init_vector; /**< Initialization Vector used for CBC modes */ - - uint32_t *p_seed; /**< Random seeds */ -} ll_aes_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup AES_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup AES_LL_Exported_Constants AES Exported Constants - * @{ - */ - -/** @defgroup AES_LL_EC_GET_FLAG Get Flag Defines - * @brief Flag definitions which can be used with LL_AES_ReadReg function - * @{ - */ -#define LL_AES_FLAG_DATAREADY AES_STATUS_READY /**< AES result data out ready */ -#define LL_AES_FLAG_DMA_DONE AES_STATUS_TRANSDONE /**< AES dma transfer done */ -#define LL_AES_FLAG_DMA_ERR AES_STATUS_TRANSERR /**< AES dma transfer error */ -#define LL_AES_FLAG_KEY_VALID AES_STATUS_KEYVALID /**< AES has fetched key */ -/** @} */ - -/** @defgroup AES_LL_EC_KEY_SIZE Key Size - * @{ - */ -#define LL_AES_KEY_SIZE_128 0x00000000U /**< 128 bits */ -#define LL_AES_KEY_SIZE_192 (1UL << AES_CONFIG_KEYMODE_Pos) /**< 192 bits */ -#define LL_AES_KEY_SIZE_256 (2UL << AES_CONFIG_KEYMODE_Pos) /**< 256 bits */ -/** @} */ - -/** @defgroup AES_LL_EC_OPERATION_MODE Operation Mode - * @{ - */ -#define LL_AES_OPERATION_MODE_ECB 0x00000000U /**< Electronic codebook (ECB) mode */ -#define LL_AES_OPERATION_MODE_CBC (1UL << AES_CONFIG_OPMODE_Pos) /**< Cipher block chaining (CBC) mode */ -/** @} */ - -/** @defgroup AES_LL_EC_KEY_TYPE Key Type - * @{ - */ -#define LL_AES_KEYTYPE_MCU 0x00000000U /**< MCU */ -#define LL_AES_KEYTYPE_AHB (1UL << AES_CONFIG_KEYTYPE_Pos) /**< AHB master */ -#define LL_AES_KEYTYPE_KRAM (2UL << AES_CONFIG_KEYTYPE_Pos) /**< Key Port */ -/** @} */ - -/** @defgroup AES_LL_EC_TRANSFER_SIZE Transfer Size - * @{ - */ -#define LL_AES_DMA_TRANSIZE_MIN (1) /**< Min size = 1 block */ -#define LL_AES_DMA_TRANSIZE_MAX (2048) /**< Max size = 2048 blocks */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup AES_LL_Exported_Macros AES Exported Macros - * @{ - */ - -/** @defgroup AES_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in AES register - * @param __INSTANCE__ AES Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_AES_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in AES register - * @param __INSTANCE__ AES Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_AES_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup AES_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup AES_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable AES. - * - * Register|BitsName - * --------|-------- - * CTRL | ENABLE - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable(aes_regs_t *AESx) -{ - SET_BITS(AESx->CTRL, AES_CTRL_ENABLE); -} - -/** - * @brief Disable AES. - * - * Register|BitsName - * --------|-------- - * CTRL | ENABLE - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->CTRL, AES_CTRL_ENABLE); -} - -/** - * @brief Indicate whether the AES is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | ENABLE - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CTRL, AES_CTRL_ENABLE) == (AES_CTRL_ENABLE)); -} - -/** - * @brief Enable AES start in MCU mode. - * - * Register|BitsName - * --------|-------- - * CTRL | START_NORMAL - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_start(aes_regs_t *AESx) -{ - SET_BITS(AESx->CTRL, AES_CTRL_START_NORMAL); -} - -/** - * @brief Disable AES start in MCU mode. - * - * Register|BitsName - * --------|-------- - * CTRL | START_NORMAL - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable_start(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->CTRL, AES_CTRL_START_NORMAL); -} - -/** - * @brief Indicate whether the AES start in MCU mode is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | START_NORMAL - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled_start(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CTRL, AES_CTRL_START_NORMAL) == (AES_CTRL_START_NORMAL)); -} - -/** - * @brief Enable AES DMA mode. - * - * Register|BitsName - * --------|-------- - * CTRL | START_DMA - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_dma_start(aes_regs_t *AESx) -{ - SET_BITS(AESx->CTRL, AES_CTRL_START_DMA); -} - -/** - * @brief Disable AES DMA mode. - * - * Register|BitsName - * --------|-------- - * CTRL | START_DMA - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable_dma_start(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->CTRL, AES_CTRL_START_DMA); -} - -/** - * @brief Indicate whether the AES DMA mode is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | START_DMA - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled_dma_start(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CTRL, AES_CTRL_START_DMA) == (AES_CTRL_START_DMA)); -} - -/** - * @brief Enable fetch key through AHB/key port. - * - * Register|BitsName - * --------|-------- - * CTRL | ENABLE_RKEY - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_read_key(aes_regs_t *AESx) -{ - SET_BITS(AESx->CTRL, AES_CTRL_ENABLE_RKEY); -} - -/** - * @brief Set AES key size. - * - * Register|BitsName - * --------|-------- - * CONFIG | KEYMODE - * - * @param AESx AES instance - * @param size This parameter can be one of the following values: - * @arg @ref LL_AES_KEY_SIZE_128 - * @arg @ref LL_AES_KEY_SIZE_192 - * @arg @ref LL_AES_KEY_SIZE_256 - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_size(aes_regs_t *AESx, uint32_t size) -{ - MODIFY_REG(AESx->CONFIG, AES_CONFIG_KEYMODE, size); -} - -/** - * @brief Get AES key size. - * - * Register|BitsName - * --------|-------- - * CONFIG | KEYMODE - * - * @param AESx AES instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_AES_KEY_SIZE_128 - * @arg @ref LL_AES_KEY_SIZE_192 - * @arg @ref LL_AES_KEY_SIZE_256 - */ -__STATIC_INLINE uint32_t ll_aes_get_key_size(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CONFIG, AES_CONFIG_KEYMODE)); -} - -/** - * @brief Enable AES full mask. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_FULLMASK - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_full_mask(aes_regs_t *AESx) -{ - SET_BITS(AESx->CONFIG, AES_CONFIG_ENABLE_FULLMASK); -} - -/** - * @brief Disable AES full mask. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_FULLMASK - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable_full_mask(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->CONFIG, AES_CONFIG_ENABLE_FULLMASK); -} - -/** - * @brief Indicate whether the AES full mask is enabled. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_FULLMASK - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled_full_mask(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CONFIG, AES_CONFIG_ENABLE_FULLMASK) == (AES_CONFIG_ENABLE_FULLMASK)); -} - -/** - * @brief Enable AES encryption mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_ENCRYPTION - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_encryption(aes_regs_t *AESx) -{ - SET_BITS(AESx->CONFIG, AES_CONFIG_ENABLE_ENCRYPTION); -} - -/** - * @brief Disable AES encryption mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_ENCRYPTION - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable_encryption(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->CONFIG, AES_CONFIG_ENABLE_ENCRYPTION); -} - -/** - * @brief Indicate whether the AES encryption mode is enabled. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_ENCRYPTION - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled_encryption(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CONFIG, AES_CONFIG_ENABLE_ENCRYPTION) == (AES_CONFIG_ENABLE_ENCRYPTION)); -} - -/** - * @brief Set AES to load seed for LFSR. - * - * Register|BitsName - * --------|-------- - * CONFIG | LOADSEED - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_set_load_seed(aes_regs_t *AESx) -{ - SET_BITS(AESx->CONFIG, AES_CONFIG_LOADSEED); -} - -/** - * @brief Set AES in first block before starting the first block in normal CBC and DMA CBC mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | FIRSTBLOCK - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_set_first_block(aes_regs_t *AESx) -{ - SET_BITS(AESx->CONFIG, AES_CONFIG_FIRSTBLOCK); -} - -/** - * @brief Enable AES in little endian. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENDIAN - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_little_endian(aes_regs_t *AESx) -{ - SET_BITS(AESx->CONFIG, AES_CONFIG_ENDIAN); -} - -/** - * @brief Disable AES in little endian. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENDIAN - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable_little_endian(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->CONFIG, AES_CONFIG_ENDIAN); -} - -/** - * @brief Indicate whether the AES is in little endian. - * - * Register|BitsName - * --------|-------- - * CONFIG | ENDIAN - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled_little_endian(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CONFIG, AES_CONFIG_ENDIAN) == (AES_CONFIG_ENDIAN)); -} - -/** - * @brief Set AES operation mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | OPMODE - * - * @param AESx AES instance - * @param mode This parameter can be one of the following values: - * @arg @ref LL_AES_OPERATION_MODE_ECB - * @arg @ref LL_AES_OPERATION_MODE_CBC - * @retval None - */ -__STATIC_INLINE void ll_aes_set_operation_mode(aes_regs_t *AESx, uint32_t mode) -{ - MODIFY_REG(AESx->CONFIG, AES_CONFIG_OPMODE, mode); -} - -/** - * @brief Get AES operation mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | OPMODE - * - * @param AESx AES instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_AES_OPERATION_MODE_ECB - * @arg @ref LL_AES_OPERATION_MODE_CBC - */ -__STATIC_INLINE uint32_t ll_aes_get_operation_mode(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CONFIG, AES_CONFIG_OPMODE)); -} - -/** - * @brief Set ways to obtain AES key. - * - * Register|BitsName - * --------|-------- - * CONFIG | KEYTYPE - * - * @param AESx AES instance - * @param Type This parameter can be one of the following values: - * @arg @ref LL_AES_KEYTYPE_MCU - * @arg @ref LL_AES_KEYTYPE_AHB - * @arg @ref LL_AES_KEYTYPE_KRAM - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_type(aes_regs_t *AESx, uint32_t Type) -{ - MODIFY_REG(AESx->CONFIG, AES_CONFIG_KEYTYPE, Type); -} - -/** - * @brief Get ways to obtain AES key. - * - * Register|BitsName - * --------|-------- - * CONFIG | KEYTYPE - * - * @param AESx AES instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_AES_KEYTYPE_MCU - * @arg @ref LL_AES_KEYTYPE_AHB - * @arg @ref LL_AES_KEYTYPE_KRAM - */ -__STATIC_INLINE uint32_t ll_aes_get_key_type(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->CONFIG, AES_CONFIG_KEYTYPE)); -} - -/** @} */ - -/** @defgroup AES_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable AES the done interrupt. - * - * Register|BitsName - * --------|-------- - * INTERRUPT | ENABLE - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_enable_it_done(aes_regs_t *AESx) -{ - SET_BITS(AESx->INTERRUPT, AES_INTERRUPT_ENABLE); -} - -/** - * @brief Disable AES the done interrupt. - * - * Register|BitsName - * --------|-------- - * INTERRUPT | ENABLE - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_disable_it_done(aes_regs_t *AESx) -{ - CLEAR_BITS(AESx->INTERRUPT, AES_INTERRUPT_ENABLE); -} - -/** - * @brief Indicate whether the done interrupt is enabled. - * - * Register|BitsName - * --------|-------- - * INTERRUPT | ENABLE - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_enabled_it_done(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->INTERRUPT, AES_INTERRUPT_ENABLE) == (AES_INTERRUPT_ENABLE)); -} - -/** @} */ - -/** @defgroup AES_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Indicate whether the ready flag is set. - * - * Register|BitsName - * --------|-------- - * STATUS | READY - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_action_flag_ready(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->STATUS, AES_STATUS_READY) == AES_STATUS_READY); -} - -/** - * @brief Indicate whether the DMA transfer done flag is set. - * - * Register|BitsName - * --------|-------- - * STATUS | TRANSDONE - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_action_flag_dma_done(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->STATUS, AES_STATUS_TRANSDONE) == AES_STATUS_TRANSDONE); -} - -/** - * @brief Indicate whether the DMA transfer error flag is set. - * - * Register|BitsName - * --------|-------- - * STATUS | TRANSERR - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_action_flag_dma_error(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->STATUS, AES_STATUS_TRANSERR) == AES_STATUS_TRANSERR); -} - -/** - * @brief Indicate whether the key valid flag is set. - * - * Register|BitsName - * --------|-------- - * STATUS | KEYVALID - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_action_flag_key_valid(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->STATUS, AES_STATUS_KEYVALID) == AES_STATUS_KEYVALID); -} - -/** - * @brief Indicate whether the done interrupt flag is set. - * - * Register|BitsName - * --------|-------- - * INTERRUPT | DONE - * - * @param AESx AES instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aes_is_action_flag_it_done(aes_regs_t *AESx) -{ - return (READ_BITS(AESx->INTERRUPT, AES_INTERRUPT_DONE) == AES_INTERRUPT_DONE); -} - -/** - * @brief Clear the done interrupt flag. - * - * Register|BitsName - * --------|-------- - * INTERRUPT | DONE - * - * @param AESx AES instance - * @retval None - */ -__STATIC_INLINE void ll_aes_clear_flag_it_done(aes_regs_t *AESx) -{ - SET_BITS(AESx->INTERRUPT, AES_INTERRUPT_DONE); -} - -/** @} */ - -/** @defgroup AES_LL_EF_DMA_Management DMA_Management - * @{ - */ - -/** - * @brief Set AES transfer blocks in DMA mode. - * - * Register|BitsName - * --------|-------- - * TRAN_SIZE | TRAN_SIZE - * - * @param AESx AES instance - * @param block This parameter can be one of the following values: 1 ~ 2048. - * @retval None - */ -__STATIC_INLINE void ll_aes_set_dma_transfer_block(aes_regs_t *AESx, uint32_t block) -{ - MODIFY_REG(AESx->TRAN_SIZE, AES_TRAN_SIZE, (block << ITEM_4) - 1); -} - -/** - * @brief Get AES transfer blocks in DMA mode. - * - * Register|BitsName - * --------|-------- - * TRAN_SIZE | TRAN_SIZE - * - * @param AESx AES instance - * @retval Return value between 1 and 2048. - */ -__STATIC_INLINE uint32_t ll_aes_get_dma_transfer_block(aes_regs_t *AESx) -{ - return ((READ_BITS(AESx->TRAN_SIZE, AES_TRAN_SIZE) + 1) >> ITEM_4); -} - -/** - * @brief Set AES read address of RAM in DMA mode. - * @note This read address of RAM requires 4 byte alignment. - * - * Register|BitsName - * --------|-------- - * RSTART_ADDR | RSTART_ADDR - * - * @param AESx AES instance - * @param address This parameter can be a address in RAM area (0x30000000 ~ 0x3003FFFF). - * @retval None - */ -__STATIC_INLINE void ll_aes_set_dma_read_address(aes_regs_t *AESx, uint32_t address) -{ - WRITE_REG(AESx->RSTART_ADDR, address); -} - -/** - * @brief Get AES read address of RAM in DMA mode. - * - * Register|BitsName - * --------|-------- - * RSTART_ADDR | RSTART_ADDR - * - * @param AESx AES instance - * @retval Returned value is the read address in RAM. - */ -__STATIC_INLINE uint32_t ll_aes_get_dma_read_address(aes_regs_t *AESx) -{ - return (READ_REG(AESx->RSTART_ADDR)); -} - -/** - * @brief Set AES write address of RAM in DMA mode. - * @note This write address of RAM requires 4 byte alignment. - * - * Register|BitsName - * --------|-------- - * WSTART_ADDR | WSTART_ADDR - * - * @param AESx AES instance - * @param address This parameter can be a address in RAM area (0x30000000 ~ 0x3003FFFF). - * @retval None - */ -__STATIC_INLINE void ll_aes_set_dma_write_address(aes_regs_t *AESx, uint32_t address) -{ - WRITE_REG(AESx->WSTART_ADDR, address); -} - -/** - * @brief Get AES write address of RAM in DMA mode. - * - * Register|BitsName - * --------|-------- - * WSTART_ADDR | WSTART_ADDR - * - * @param AESx AES instance - * @retval Returned value is the wrute address in RAM - */ -__STATIC_INLINE uint32_t ll_aes_get_dma_write_address(aes_regs_t *AESx) -{ - return (READ_REG(AESx->WSTART_ADDR)); -} - -/** @} */ - -/** @defgroup AES_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Set AES key address in memory. - * - * Register|BitsName - * --------|-------- - * KEY_ADDR | KEY_ADDR - * - * @param AESx AES instance - * @param address This parameter can be one of the address in RAM - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_address(aes_regs_t *AESx, uint32_t address) -{ - WRITE_REG(AESx->KEY_ADDR, address); -} - -/** - * @brief Get AES key address in memory. - * - * Register|BitsName - * --------|-------- - * KEY_ADDR | KEY_ADDR - * - * @param AESx AES instance - * @retval Returned value is the key address in RAM. - */ -__STATIC_INLINE uint32_t ll_aes_get_key_address(aes_regs_t *AESx) -{ - return (READ_REG(AESx->KEY_ADDR)); -} - -/** - * @brief Get AES output data[127:96]. - * - * Register|BitsName - * --------|-------- - * DATA_OUT[0] | DATA_OUT - * - * @param AESx AES instance - * @retval Output Data[127:96] - */ -__STATIC_INLINE uint32_t ll_aes_get_data_127_96(aes_regs_t *AESx) -{ - return (READ_REG(AESx->DATA_OUT[0])); -} - -/** - * @brief Get AES output data[95:64]. - * - * Register|BitsName - * --------|-------- - * DATA_OUT[1] | DATA_OUT - * - * @param AESx AES instance - * @retval Output Data[95:64] - */ -__STATIC_INLINE uint32_t ll_aes_get_data_95_64(aes_regs_t *AESx) -{ - return (READ_REG(AESx->DATA_OUT[1])); -} - -/** - * @brief Get AES output data[63:32]. - * - * Register|BitsName - * --------|-------- - * DATA_OUT[2] | DATA_OUT - * - * @param AESx AES instance - * @retval Output Data[63:32] - */ -__STATIC_INLINE uint32_t ll_aes_get_data_63_32(aes_regs_t *AESx) -{ - return (READ_REG(AESx->DATA_OUT[ITEM_2])); -} - -/** - * @brief Get AES output data[31:0]. - * - * Register|BitsName - * --------|-------- - * DATA_OUT[3] | DATA_OUT - * - * @param AESx AES instance - * @retval Output Data[31:0] - */ -__STATIC_INLINE uint32_t ll_aes_get_data_31_0(aes_regs_t *AESx) -{ - return (READ_REG(AESx->DATA_OUT[ITEM_3])); -} - -/** - * @brief Set AES key[255:224]. - * - * Register|BitsName - * --------|-------- - * KEY[0] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_255_224(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[0], key); -} - -/** - * @brief Set AES key[223:192]. - * - * Register|BitsName - * --------|-------- - * KEY[1] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_223_192(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[1], key); -} - -/** - * @brief Set AES key[191:160]. - * - * Register|BitsName - * --------|-------- - * KEY[2] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_191_160(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[ITEM_2], key); -} - -/** - * @brief Set AES key[159:128]. - * - * Register|BitsName - * --------|-------- - * KEY[3] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_159_128(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[ITEM_3], key); -} - -/** - * @brief Set AES key[127:96]. - * - * Register|BitsName - * --------|-------- - * KEY[4] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_127_96(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[ITEM_4], key); -} - -/** - * @brief Set AES key[95:64]. - * - * Register|BitsName - * --------|-------- - * KEY[5] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_95_64(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[ITEM_5], key); -} - -/** - * @brief Set AES key[63:32]. - * - * Register|BitsName - * --------|-------- - * KEY[6] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_63_32(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[ITEM_6], key); -} - -/** - * @brief Set AES key[31:0]. - * - * Register|BitsName - * --------|-------- - * KEY[7] | KEY - * - * @param AESx AES instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_31_0(aes_regs_t *AESx, uint32_t key) -{ - WRITE_REG(AESx->KEY[ITEM_7], key); -} - -/** - * @brief Set AES input seed. - * - * Register|BitsName - * --------|-------- - * SEED_IN | SEED_IN - * - * @param AESx AES instance - * @param seed This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_seed_in(aes_regs_t *AESx, uint32_t seed) -{ - WRITE_REG(AESx->SEED_IN, seed); -} - -/** - * @brief Get AES input seed. - * - * Register|BitsName - * --------|-------- - * SEED_IN | SEED_IN - * - * @param AESx AES instance - * @retval Returned value is the input seed. - */ -__STATIC_INLINE uint32_t ll_aes_get_seed_in(aes_regs_t *AESx) -{ - return (READ_REG(AESx->SEED_IN)); -} - -/** - * @brief Set AES output seed. - * - * Register|BitsName - * --------|-------- - * SEED_OUT | SEED_OUT - * - * @param AESx AES instance - * @param seed This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_seed_out(aes_regs_t *AESx, uint32_t seed) -{ - WRITE_REG(AESx->SEED_OUT, seed); -} - -/** - * @brief Get AES output seed. - * - * Register|BitsName - * --------|-------- - * SEED_OUT | SEED_OUT - * - * @param AESx AES instance - * @retval Returned value is the output seed. - */ -__STATIC_INLINE uint32_t ll_aes_get_seed_out(aes_regs_t *AESx) -{ - return (READ_REG(AESx->SEED_OUT)); -} - -/** - * @brief Set sbox input data's mask. - * - * Register|BitsName - * --------|-------- - * SEED_IMASK | SEED_IMASK - * - * @param AESx AES instance - * @param mask This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_seed_Imask(aes_regs_t *AESx, uint32_t mask) -{ - WRITE_REG(AESx->SEED_IMASK, mask); -} - -/** - * @brief Get sbox input data's mask. - * - * Register|BitsName - * --------|-------- - * SEED_IMASK | SEED_IMASK - * - * @param AESx AES instance - * @retval Returned value is the input data's mask. - */ -__STATIC_INLINE uint32_t ll_aes_get_seed_Imask(aes_regs_t *AESx) -{ - return (READ_REG(AESx->SEED_IMASK)); -} - -/** - * @brief Set sbox output data's mask. - * - * Register|BitsName - * --------|-------- - * SEED_OSBOX | SEED_OSBOX - * - * @param AESx AES instance - * @param mask This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_seed_Osbox(aes_regs_t *AESx, uint32_t mask) -{ - WRITE_REG(AESx->SEED_OSBOX, mask); -} - -/** - * @brief Get sbox output data's mask. - * - * Register|BitsName - * --------|-------- - * SEED_OSBOX | SEED_OSBOX - * - * @param AESx AES instance - * @retval Returned value is the output data's mask. - */ -__STATIC_INLINE uint32_t ll_aes_get_seed_Osbox(aes_regs_t *AESx) -{ - return (READ_REG(AESx->SEED_OSBOX)); -} - -/** - * @brief Set AES initialization vector[127:96]. - * - * Register|BitsName - * --------|-------- - * VECTOR_INIT[0] | VECTOR_INIT - * - * @param AESx AES instance - * @param vector This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_vector_127_96(aes_regs_t *AESx, uint32_t vector) -{ - WRITE_REG(AESx->VECTOR_INIT[0], vector); -} - -/** - * @brief Set AES initialization vector[95:64]. - * - * Register|BitsName - * --------|-------- - * VECTOR_INIT[1] | VECTOR_INIT - * - * @param AESx AES instance - * @param vector This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_vector_95_64(aes_regs_t *AESx, uint32_t vector) -{ - WRITE_REG(AESx->VECTOR_INIT[1], vector); -} - -/** - * @brief Set AES initialization vector[63:32]. - * - * Register|BitsName - * --------|-------- - * VECTOR_INIT[2] | VECTOR_INIT - * - * @param AESx AES instance - * @param vector This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_vector_63_32(aes_regs_t *AESx, uint32_t vector) -{ - WRITE_REG(AESx->VECTOR_INIT[ITEM_2], vector); -} - -/** - * @brief Set AES initialization vector[31:0]. - * - * Register|BitsName - * --------|-------- - * VECTOR_INIT[3] | VECTOR_INIT - * - * @param AESx AES instance - * @param vector This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_vector_31_0(aes_regs_t *AESx, uint32_t vector) -{ - WRITE_REG(AESx->VECTOR_INIT[ITEM_3], vector); -} - -/** - * @brief Set AES input data[127:96]. - * - * Register|BitsName - * --------|-------- - * DATA_IN[0] | DATA_IN - * - * @param AESx AES instance - * @param data This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_data_127_96(aes_regs_t *AESx, uint32_t data) -{ - WRITE_REG(AESx->DATA_IN[0], data); -} - -/** - * @brief Set AES input data[95:64]. - * - * Register|BitsName - * --------|-------- - * DATA_IN[1] | DATA_IN - * - * @param AESx AES instance - * @param data This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_data_95_64(aes_regs_t *AESx, uint32_t data) -{ - WRITE_REG(AESx->DATA_IN[1], data); -} - -/** - * @brief Set AES input data[63:32]. - * - * Register|BitsName - * --------|-------- - * DATA_IN[2] | DATA_IN - * - * @param AESx AES instance - * @param data This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_data_63_32(aes_regs_t *AESx, uint32_t data) -{ - WRITE_REG(AESx->DATA_IN[ITEM_2], data); -} - -/** - * @brief Set AES input data[31:0]. - * - * Register|BitsName - * --------|-------- - * DATA_IN[3] | DATA_IN - * - * @param AESx AES instance - * @param data This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_data_31_0(aes_regs_t *AESx, uint32_t data) -{ - WRITE_REG(AESx->DATA_IN[ITEM_3], data); -} - -/** - * @brief Set AES fetch key port mask. - * - * Register|BitsName - * --------|-------- - * KPORT_MASK | KPORT_MASK - * - * @param AESx AES instance - * @param mask This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_aes_set_key_port_mask(aes_regs_t *AESx, uint32_t mask) -{ - WRITE_REG(AESx->KPORT_MASK, mask); -} - -/** @} */ - -/** @defgroup AES_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize AES registers (Registers restored to their default values). - * @param AESx AES Instance - * @retval An error_status_t enumeration value: - * - SUCCESS: AES registers are de-initialized - * - ERROR: AES registers are not de-initialized - */ -error_status_t ll_aes_deinit(aes_regs_t *AESx); - -/** - * @brief Initialize AES registers according to the specified - * parameters in p_aes_init. - * @param AESx AES Instance - * @param p_aes_init Pointer to a ll_aes_init_t structure that contains the configuration - * information for the specified AES peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: AES registers are initialized according to p_aes_init content - * - ERROR: Problem occurred during AES Registers initialization - */ -error_status_t ll_aes_init(aes_regs_t *AESx, ll_aes_init_t *p_aes_init); - -/** - * @brief Set each field of a @ref ll_aes_init_t type structure to default value. - * @param p_aes_init Pointer to a @ref ll_aes_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_aes_struct_init(ll_aes_init_t *p_aes_init); - -/** @} */ - -/** @} */ - -#endif /* AES */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_AES_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_gpio.h deleted file mode 100755 index 633d04b..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_gpio.h +++ /dev/null @@ -1,1113 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_aon_gpio.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of AON GPIO LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_AON_GPIO AON_GPIO - * @brief AON_GPIO LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_AON_GPIO_H__ -#define __GR55XX_LL_AON_GPIO_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(AON) - -/** @defgroup AON_GPIO_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup AON_GPIO_LL_ES_INIT AON_GPIO Exported init structures - * @{ - */ - -/** - * @brief LL AON_GPIO init Structure definition - */ -typedef struct _ll_aon_gpio_init { - uint32_t pin; /**< Specifies the AON_GPIO pins to be AON_GPIO_InitStructured. - This parameter can be any value of @ref AON_GPIO_LL_EC_PIN */ - - uint32_t mode; /**< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref AON_GPIO_LL_EC_MODE. - AON_GPIO HW - AON_GPIO_InitStructuration can be - modified afterwards using unitary - function - @ref ll_aon_gpio_set_pin_mode(). */ - - uint32_t pull; /**< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref AON_GPIO_LL_EC_PULL. - AON_GPIO HW configuration can be - modified afterwards using unitary - function - @ref ll_aon_gpio_set_pin_pull(). */ - - uint32_t mux; /*!< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref AON_GPIO_LL_EC_MUX. - GPIO HW AON_GPIO_InitStructuration - can be modified afterwards using - unitary function - @ref ll_aon_gpio_set_mux_pin_0_7(). */ - - uint32_t trigger; /**< Specifies the trigger signal active edge. - This parameter can be a value of @ref AON_GPIO_LL_EC_TRIGGER. */ -} ll_aon_gpio_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup AON_GPIO_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup AON_GPIO_LL_Exported_Constants AON_GPIO Exported Constants - * @{ - */ - -/** @defgroup AON_GPIO_LL_EC_PIN PIN - * @{ - */ -#define LL_AON_GPIO_PIN_0 ((uint32_t)0x01U) /**< Select pin 0 */ -#define LL_AON_GPIO_PIN_1 ((uint32_t)0x02U) /**< Select pin 1 */ -#define LL_AON_GPIO_PIN_2 ((uint32_t)0x04U) /**< Select pin 2 */ -#define LL_AON_GPIO_PIN_3 ((uint32_t)0x08U) /**< Select pin 3 */ -#define LL_AON_GPIO_PIN_4 ((uint32_t)0x10U) /**< Select pin 4 */ -#define LL_AON_GPIO_PIN_5 ((uint32_t)0x20U) /**< Select pin 5 */ -#define LL_AON_GPIO_PIN_6 ((uint32_t)0x40U) /**< Select pin 6 */ -#define LL_AON_GPIO_PIN_7 ((uint32_t)0x80U) /**< Select pin 7 */ -#define LL_AON_GPIO_PIN_ALL ((uint32_t)0xFFU) /**< Select all pins */ -/** @} */ - -/** @defgroup AON_GPIO_LL_EC_MODE Mode - * @{ - */ -#define LL_AON_GPIO_MODE_INPUT ((uint32_t)0x0U) /**< Select input mode */ -#define LL_AON_GPIO_MODE_OUTPUT ((uint32_t)0x1U) /**< Select output mode */ -#define LL_AON_GPIO_MODE_MUX ((uint32_t)0x2U) /**< Select mux peripheral mode */ -/** @} */ - -/** @defgroup AON_GPIO_LL_EC_PULL Pull Up Pull Down - * @{ - */ -#define LL_AON_GPIO_PULL_NO LL_AON_GPIO_RE_N /**< Select I/O no pull */ -#define LL_AON_GPIO_PULL_UP LL_AON_GPIO_RTYP /**< Select I/O pull up */ -#define LL_AON_GPIO_PULL_DOWN ((uint32_t)0x0U) /**< Select I/O pull down */ -/** @} */ - -/** @defgroup AON_GPIO_LL_EC_MUX Alternate Function - * @{ - */ -#define LL_AON_GPIO_MUX_0 ((uint32_t)0x0U) /*!< Select alternate function 0 */ -#define LL_AON_GPIO_MUX_1 ((uint32_t)0x1U) /*!< Select alternate function 1 */ -#define LL_AON_GPIO_MUX_2 ((uint32_t)0x2U) /*!< Select alternate function 2 */ -#define LL_AON_GPIO_MUX_3 ((uint32_t)0x3U) /*!< Select alternate function 3 */ -#define LL_AON_GPIO_MUX_4 ((uint32_t)0x4U) /*!< Select alternate function 4 */ -#define LL_AON_GPIO_MUX_5 ((uint32_t)0x5U) /*!< Select alternate function 5 */ -#define LL_AON_GPIO_MUX_6 ((uint32_t)0x6U) /*!< Select alternate function 6 */ -#define LL_AON_GPIO_MUX_7 ((uint32_t)0x7U) /*!< Select alternate function 7 */ -#define LL_AON_GPIO_MUX_8 ((uint32_t)0x8U) /*!< Select alternate function 8 */ -/** @} */ - - -/** @defgroup AON_GPIO_LL_EC_TRIGGER Interrupt Trigger - * @{ - */ -#define LL_AON_GPIO_TRIGGER_NONE ((uint32_t)0x00U) /**< No Trigger Mode */ -#define LL_AON_GPIO_TRIGGER_RISING ((uint32_t)0x01U) /**< Trigger Rising Mode */ -#define LL_AON_GPIO_TRIGGER_FALLING ((uint32_t)0x02U) /**< Trigger Falling Mode */ -#define LL_AON_GPIO_TRIGGER_HIGH ((uint32_t)0x03U) /**< Trigger High Mode */ -#define LL_AON_GPIO_TRIGGER_LOW ((uint32_t)0x04U) /**< Trigger Low Mode */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup AON_GPIO_LL_Exported_Macros AON_GPIO Exported Macros - * @{ - */ - -/** @defgroup AON_GPIO_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in AON_GPIO register - * @param __instance__ AON_GPIO instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_AON_GPIO_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in AON_GPIO register - * @param __instance__ AON_GPIO instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_AON_GPIO_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup AON_GPIO_LL_Private_Macros AON_GPIO Private Macros - * @{ - */ - -/** @defgroup AON_GPIO_LL_PM_RESISTOR Resistor Enable - * @{ - */ -#define LL_AON_GPIO_RE_N_Pos AON_PAD_CTL0_GPO_RE_N_Pos /**< Resistor Enable bits position */ -#define LL_AON_GPIO_RE_N_Msk (0x1U << LL_AON_GPIO_RE_N_Pos) /**< Resistor Enable bits mask */ -#define LL_AON_GPIO_RE_N LL_AON_GPIO_RE_N_Msk /**< Resistor Enable bits */ -/** @} */ - -/** @defgroup AON_GPIO_LL_PM_RESISTOR_TYPE Resistor Type - * @{ - */ -#define LL_AON_GPIO_RTYP_Pos AON_PAD_CTL0_GPO_RTYPE_Pos /**< Resistor Type bits position */ -#define LL_AON_GPIO_RTYP_Msk (0x1U << LL_AON_GPIO_RTYP_Pos) /**< Resistor Type bits mask */ -#define LL_AON_GPIO_RTYP LL_AON_GPIO_RTYP_Msk /**< Resistor Type bits */ -/** @} */ - -/** @defgroup AON_GPIO_LL_EC_DEFAULT_CONFIG InitStruct default configuartion - * @{ - */ - -/** - * @brief LL AON_GPIO InitStrcut default configuartion - */ -#define LL_AON_GPIO_DEFAULT_CONFIG \ -{ \ - .pin = LL_AON_GPIO_PIN_ALL, \ - .mode = LL_AON_GPIO_MODE_INPUT, \ - .pull = LL_AON_GPIO_PULL_DOWN, \ - .mux = LL_AON_GPIO_MUX_7, \ - .trigger = LL_AON_GPIO_TRIGGER_NONE, \ -} -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup AON_GPIO_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup AON_GPIO_LL_EF_Port_Configuration Port Configuration - * @{ - */ - -/** - * @brief Set several AON_GPIO pins to input/output mode. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO_OE_N - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @param mode This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_MODE_INPUT - * @arg @ref LL_AON_GPIO_MODE_OUTPUT - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_set_pin_mode(uint32_t pin_mask, uint32_t mode) -{ - pin_mask = (pin_mask << AON_PAD_CTL1_AON_GPO_OE_N_Pos) & AON_PAD_CTL1_AON_GPO_OE_N; - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->AON_PAD_CTL1, pin_mask, (mode == LL_AON_GPIO_MODE_INPUT) ? pin_mask : 0); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return gpio mode for a AON_GPIO pin. - * @note I/O mode can be Input mode. General purpose output. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO_OE_N - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_AON_GPIO_MODE_INPUT - * @arg @ref LL_AON_GPIO_MODE_OUTPUT - */ -__STATIC_INLINE uint32_t ll_aon_gpio_get_pin_mode(uint32_t pin) -{ - pin = (pin << AON_PAD_CTL1_AON_GPO_OE_N_Pos) & AON_PAD_CTL1_AON_GPO_OE_N; - return ((uint32_t)(READ_BITS(AON->AON_PAD_CTL1, pin) == LL_AON_GPIO_MODE_INPUT) ? - LL_AON_GPIO_MODE_OUTPUT : LL_AON_GPIO_MODE_INPUT); -} - -/** - * @brief Configure gpio pull-up or pull-down for a dedicated AON_GPIO pin. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL0 | GPO_RE_N - * AON_PAD_CTL0 | GPO_RTYPE - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @param pull This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_PULL_NO - * @arg @ref LL_AON_GPIO_PULL_UP - * @arg @ref LL_AON_GPIO_PULL_DOWN - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_set_pin_pull(uint32_t pin_mask, uint32_t pull) -{ - uint32_t RTypeMask = (pin_mask << AON_PAD_CTL0_GPO_RTYPE_Pos) & AON_PAD_CTL0_GPO_RTYPE; - uint32_t REnMask = (pin_mask << AON_PAD_CTL0_GPO_RE_N_Pos) & AON_PAD_CTL0_GPO_RE_N; - uint32_t RType = (pull == LL_AON_GPIO_PULL_UP) ? RTypeMask : 0x0000U; - uint32_t REn = (pull == LL_AON_GPIO_PULL_NO) ? REnMask : 0x0000U; - MODIFY_REG(AON->AON_PAD_CTL0, REnMask | RTypeMask, REn | RType); -} - -/** - * @brief Return gpio pull-up or pull-down for a dedicated AON_GPIO pin. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL0 | GPO_RE_N - * AON_PAD_CTL0 | GPO_RTYPE - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_AON_GPIO_PULL_NO - * @arg @ref LL_AON_GPIO_PULL_UP - * @arg @ref LL_AON_GPIO_PULL_DOWN - */ -__STATIC_INLINE uint32_t ll_aon_gpio_get_pin_pull(uint32_t pin) -{ - uint32_t RTypeMask = (pin << AON_PAD_CTL0_GPO_RTYPE_Pos) & AON_PAD_CTL0_GPO_RTYPE; - uint32_t REnMask = (pin << AON_PAD_CTL0_GPO_RE_N_Pos) & AON_PAD_CTL0_GPO_RE_N; - return ((READ_BITS(AON->AON_PAD_CTL0, REnMask) != RESET) ? LL_AON_GPIO_PULL_NO : - ((READ_BITS(AON->AON_PAD_CTL0, RTypeMask) != RESET) ? LL_AON_GPIO_PULL_UP : LL_AON_GPIO_PULL_DOWN)); -} - -/** - * @brief Configure gpio pinmux number of a dedicated pin from 0 to 7 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * AON_PAD_MUX_CTRL | CTRL0_7 - * AON_PAD_CTL_0 | MCU_OVR - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @param mux This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_MUX_0 - * @arg @ref LL_AON_GPIO_MUX_1 - * @arg @ref LL_AON_GPIO_MUX_2 - * @arg @ref LL_AON_GPIO_MUX_3 - * @arg @ref LL_AON_GPIO_MUX_4 - * @arg @ref LL_AON_GPIO_MUX_5 - * @arg @ref LL_AON_GPIO_MUX_6 - * @arg @ref LL_AON_GPIO_MUX_7 - * @arg @ref LL_AON_GPIO_MUX_8 - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_set_mux_pin_0_7(uint32_t pin, uint32_t mux) -{ - uint32_t pos = POSITION_VAL(pin) << 2; - if (LL_AON_GPIO_MUX_7 == mux) { - CLEAR_BITS(AON->AON_PAD_CTL0, pin << AON_PAD_CTL0_MCU_OVR_Pos); - } else { - MODIFY_REG(MCU_SUB->AON_PAD_MUX_CTL, 0xF << pos, mux << pos); - SET_BITS(AON->AON_PAD_CTL0, pin << AON_PAD_CTL0_MCU_OVR_Pos); - } -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * - * Register|BitsName - * --------|-------- - * AON_PAD_MUX_CTRL | CTRL0_7 - * AON_PAD_CTL_0 | MCU_OVR - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_AON_GPIO_MUX_0 - * @arg @ref LL_AON_GPIO_MUX_1 - * @arg @ref LL_AON_GPIO_MUX_2 - * @arg @ref LL_AON_GPIO_MUX_3 - * @arg @ref LL_AON_GPIO_MUX_4 - * @arg @ref LL_AON_GPIO_MUX_5 - * @arg @ref LL_AON_GPIO_MUX_6 - * @arg @ref LL_AON_GPIO_MUX_7 - * @arg @ref LL_AON_GPIO_MUX_8 - */ -__STATIC_INLINE uint32_t ll_aon_gpio_get_mux_pin_0_7(uint32_t pin) -{ - if (READ_BITS(AON->AON_PAD_CTL0, pin << AON_PAD_CTL0_MCU_OVR_Pos)) { - uint32_t pos = POSITION_VAL(pin) << 2; - return (READ_BITS(MCU_SUB->AON_PAD_MUX_CTL, 0xF << pos) >> pos); - } else { - return LL_AON_GPIO_MUX_7; - } -} - -/** - * @brief Enable Xo_2MHz output on AON_GPIO_PIN5. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XO_2MHZ_ENA - * - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_enable_xo_2mhz_output(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_XO_2MHZ_ENA); -} - -/** - * @brief Disable Xo_2MHz output on AON_GPIO_PIN5. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XO_2MHZ_ENA - * - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_disable_xo_2mhz_output(void) -{ - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_XO_2MHZ_ENA); -} - -/** - * @brief Check if Xo_2MHz output on AON_GPIO_PIN5 is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XO_2MHZ_ENA - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_aon_gpio_is_enabled_xo_2mhz_output(void) -{ - return (uint32_t)(READ_BITS(AON->PWR_RET01, AON_PWR_REG01_XO_2MHZ_ENA) == AON_PWR_REG01_XO_2MHZ_ENA); -} - -/** @} */ - -/** @defgroup AON_GPIO_LL_EF_Data_Access Data Access - * @{ - */ - -/** - * @brief Return full input data register value of AON_GPIO. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | O_AON_GPI - * - * @retval Input data register value of port - */ -__STATIC_INLINE uint32_t ll_aon_gpio_read_input_port(void) -{ - return (uint32_t)(READ_BITS(GPIO2->DATA, GPIO_DATA)); -} - -/** - * @brief Return if input data level of several AON_GPIO pins is high or low. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | O_AON_GPI - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_input_pin_set(uint32_t pin_mask) -{ - return (uint32_t)(READ_BITS(GPIO2->DATA, pin_mask) == pin_mask); -} - -/** - * @brief Write output data register of AON_GPIO. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO - * - * @param port_value Level value for each pin of the port - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_write_output_port(uint32_t port_value) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->AON_PAD_CTL1, AON_PAD_CTL1_AON_GPO, \ - (port_value << AON_PAD_CTL1_AON_GPO_Pos) & AON_PAD_CTL1_AON_GPO); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return full output data register value of AON_GPIO. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO - * - * @retval Output data register value of port - */ -__STATIC_INLINE uint32_t ll_aon_gpio_read_output_port(void) -{ - return (uint32_t)(READ_BITS(AON->AON_PAD_CTL1, AON_PAD_CTL1_AON_GPO) >> AON_PAD_CTL1_AON_GPO_Pos); -} - -/** - * @brief Return if input data level of several AON_GPIO pins is high or low. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_output_pin_set(uint32_t pin_mask) -{ - pin_mask = (pin_mask << AON_PAD_CTL1_AON_GPO_Pos) & AON_PAD_CTL1_AON_GPO; - return (uint32_t)(READ_BITS(AON->AON_PAD_CTL1, pin_mask) == pin_mask); -} - -/** - * @brief Set specified AON_GPIO pins to high level - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_set_output_pin(uint32_t pin_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->AON_PAD_CTL1, (pin_mask << AON_PAD_CTL1_AON_GPO_Pos) & AON_PAD_CTL1_AON_GPO); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Set specified AON_GPIO pins to low level. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_reset_output_pin(uint32_t pin_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->AON_PAD_CTL1, (pin_mask << AON_PAD_CTL1_AON_GPO_Pos) & AON_PAD_CTL1_AON_GPO); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Toggle data value of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_GPO - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_toggle_pin(uint32_t pin_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - WRITE_REG(AON->AON_PAD_CTL1, \ - (READ_REG(AON->AON_PAD_CTL1) ^ ((pin_mask << AON_PAD_CTL1_AON_GPO_Pos) & AON_PAD_CTL1_AON_GPO))); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** @} */ - -/** @defgroup AON_GPIO_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable AON_GPIO Falling Edge Trigger of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPESET | INTTYPESET - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_enable_falling_trigger(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTPOLCLR, pin_mask); - WRITE_REG(GPIO2->INTTYPESET, pin_mask); -} - -/** - * @brief Check if falling edge trigger is enabled of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPESET | INTTYPESET - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_enabled_falling_trigger(uint32_t pin_mask) -{ - return ((READ_BITS(GPIO2->INTPOLCLR, pin_mask) == (pin_mask)) & - (READ_BITS(GPIO2->INTTYPESET, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable AON_GPIO Rising Edge Trigger of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPESET | INTTYPESET - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_enable_rising_trigger(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTPOLSET, pin_mask); - WRITE_REG(GPIO2->INTTYPESET, pin_mask); -} - -/** - * @brief Check if rising edge trigger is enabled of specified AON_GPIO pins. - * @note Please check each device line mapping for AON_GPIO Line availability - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPESET | INTTYPESET - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_enabled_rising_trigger(uint32_t pin_mask) -{ - return ((READ_BITS(GPIO2->INTPOLSET, pin_mask) == (pin_mask)) & - (READ_BITS(GPIO2->INTTYPESET, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable AON_GPIO High Level Trigger of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPECLR | INTTYPECLR - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_enable_high_trigger(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTPOLSET, pin_mask); - WRITE_REG(GPIO2->INTTYPECLR, pin_mask); -} - -/** - * @brief Check if high level trigger is enabled of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPECLR | INTTYPECLR - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_enabled_high_trigger(uint32_t pin_mask) -{ - return ((READ_BITS(GPIO2->INTPOLSET, pin_mask) == (pin_mask)) & - (READ_BITS(GPIO2->INTTYPECLR, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable AON_GPIO Low Level Trigger of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPECLR | INTTYPECLR - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_enable_low_trigger(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTPOLCLR, pin_mask); - WRITE_REG(GPIO2->INTTYPECLR, pin_mask); -} - -/** - * @brief Check if low level trigger is enabled of specified AON_GPIO pins. - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPECLR | INTTYPECLR - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_enabled_low_trigger(uint32_t pin_mask) -{ - return ((READ_BITS(GPIO2->INTPOLCLR, pin_mask) == (pin_mask)) & - (READ_BITS(GPIO2->INTTYPECLR, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable AON_GPIO interrupts of specified AON_GPIO pins. - * @note @ref AON_GPIO_LL_EC_TRIGGER can be used to specify the interrupt trigger type - * - * Register|BitsName - * --------|-------- - * INTENSET | INTENSET - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_enable_it(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTENSET, pin_mask); -} - -/** - * @brief Disable AON_GPIO interrupts of specified AON_GPIO pins. - * @note @ref AON_GPIO_LL_EC_TRIGGER can be used to specify the interrupt trigger type - * - * Register|BitsName - * --------|-------- - * INTENCLR | INTENCLR - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_disable_it(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTENCLR, pin_mask); -} - -/** - * @brief Check if the Interrupt of specified GPIO pins is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTENSET | INTENSET - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_enabled_it(uint32_t pin_mask) -{ - return (READ_BITS(GPIO2->INTENSET, pin_mask) == (pin_mask)); -} - -/** @} */ - -/** @defgroup AON_GPIO_LL_EF_Flag_Management Flag_Management - * @{ - */ - -/** - * @brief Read AON_GPIO Interrupt Combination Flag of specified AON_GPIO pins. - * @note After an interrupt is triggered, the corresponding bit in the INTSTATUS Register is set. - * The interrupt status can cleared by writing 1 to corresponding bit in INTCLEAR Register. - * - * Register|BitsName - * --------|-------- - * INTSTATUS | INTSTATUS - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval Interrupt flag whose bits were set when the selected trigger event arrives on the interrupt - */ -__STATIC_INLINE uint32_t ll_aon_gpio_read_flag_it(uint32_t pin_mask) -{ - uint32_t ext2 = READ_BITS(GPIO2->INTSTAT, pin_mask); - uint32_t wkup = (READ_BITS(AON->SLP_EVENT, AON_SLP_EVENT_EXT_WKUP_STATUS) >> \ - AON_SLP_EVENT_EXT_WKUP_STATUS_Pos) & \ - pin_mask & READ_BITS(AON->EXT_WKUP_CTL, LL_AON_GPIO_PIN_ALL); - return (uint32_t)(ext2 | wkup); -} - -/** - * @brief Indicate if the AON_GPIO Interrupt Flag is set or not of specified AON_GPIO pins. - * @note After an interrupt is triggered, the corresponding bit in the INTSTATUS Register is set. - * The interrupt status can cleared by writing 1 to corresponding bit in INTCLEAR Register. - * - * Register|BitsName - * --------|-------- - * INTSTATUS | INTSTATUS - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_gpio_is_active_flag_it(uint32_t pin_mask) -{ - return (READ_BITS(GPIO2->INTSTAT, pin_mask) == pin_mask); -} - -/** - * @brief Clear Interrupt Status flag of specified AON_GPIO pins. - * @note After an interrupt is triggered, the corresponding bit in the INTSTATUS Register is set. - * The interrupt status can be cleared by writing 1 to corresponding bit in INTCLEAR Register. - * - * Register|BitsName - * --------|-------- - * INTSTATUS | INTSTATUS - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_AON_GPIO_PIN_0 - * @arg @ref LL_AON_GPIO_PIN_1 - * @arg @ref LL_AON_GPIO_PIN_2 - * @arg @ref LL_AON_GPIO_PIN_3 - * @arg @ref LL_AON_GPIO_PIN_4 - * @arg @ref LL_AON_GPIO_PIN_5 - * @arg @ref LL_AON_GPIO_PIN_6 - * @arg @ref LL_AON_GPIO_PIN_7 - * @arg @ref LL_AON_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_aon_gpio_clear_flag_it(uint32_t pin_mask) -{ - WRITE_REG(GPIO2->INTSTAT, pin_mask); -} - -/** @} */ - -/** @defgroup AON_GPIO_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize AON_GPIO registers (Registers restored to their default values). - * @retval An error_status_t enumeration value: - * - SUCCESS: AON_GPIO registers are de-initialized - * - ERROR: AON_GPIO registers are not de-initialized - */ -error_status_t ll_aon_gpio_deinit(void); - -/** - * @brief Initialize AON_GPIO registers according to the specified. - * parameters in p_aon_gpio_init. - * @param p_aon_gpio_init Pointer to a ll_aon_gpio_init_t structure that contains the configuration - * information for the specified AON_GPIO peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: AON_GPIO registers are initialized according to p_aon_gpio_init content - * - ERROR: Problem occurred during AON_GPIO Registers initialization - */ -error_status_t ll_aon_gpio_init(ll_aon_gpio_init_t *p_aon_gpio_init); - -/** - * @brief Set each field of a @ref ll_aon_gpio_init_t type structure to default value. - * @param p_aon_gpio_init Pointer to a @ref ll_aon_gpio_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_aon_gpio_struct_init(ll_aon_gpio_init_t *p_aon_gpio_init); - -/** @} */ - -/** @} */ - -#endif /* AON */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_AON_GPIO_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_wdt.h deleted file mode 100755 index baf37b5..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_aon_wdt.h +++ /dev/null @@ -1,263 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_aon_wdt.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of AON WDT LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_AON_WDT AON_WDT - * @brief AON_WDT LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_AON_WDT_H__ -#define __GR55XX_LL_AON_WDT_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#if defined (AON) - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup AON_WDT_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup AON_WDT_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable AON watchdog counter and interrupt event. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_EN - * - * @retval None - */ -__STATIC_INLINE void ll_aon_wdt_enable(void) -{ - SET_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_EN); -} - -/** - * @brief Disable AON watchdog counter and interrupt event. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_EN - * - * @retval None - */ -__STATIC_INLINE void ll_aon_wdt_disable(void) -{ - CLEAR_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_EN); -} - -/** - * @brief Check if the AON_WDT peripheral is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_EN - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_wdt_is_enabled(void) -{ - return (READ_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_EN) == (AON_EXT_WKUP_CTL_WDT_EN)); -} - -/** - * @brief Specify the AON WDT down-counter reload value. - * - * Register|BitsName - * --------|-------- - * TIMER_VALUE | TIMER_VALUE - * - * @param counter Value for reload down-counter which should ranging between 0 ~ 0xFFFF_FFFF - * @retval None - */ -__STATIC_INLINE void ll_aon_wdt_set_reload_counter(uint32_t counter) -{ - WRITE_REG(AON->TIMER_VALUE, counter); -} - -/** - * @brief Reloads AON WDT counter. - * @note The value in TIMER_VALUE register will be reloaded into AON WDT down-counter - * after enable this bit, so ll_aon_wdt_set_reload_counter() should be called before - * every reload. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_RELOAD - * - * @retval None - */ -__STATIC_INLINE void ll_aon_wdt_reload_counter(void) -{ - SET_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_RELOAD); -} - -/** - * @brief Read the AON WDT counter current value. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | AON_WDT_TIMER - * TIMER_VAL | TIMER_VAL_READ - * - * @retval Value for current counter which should ranging between 0 ~ 0xFFFF_FFFF - */ -__STATIC_INLINE uint32_t ll_aon_wdt_get_counter(void) -{ - MODIFY_REG(AON->AON_PAD_CTL1, AON_PAD_CTL1_TIMER_READ_SEL, AON_PAD_CTL1_TIMER_READ_SEL_AON_WDT); - return (uint32_t)READ_REG(AON->TIMER_VAL); -} - -/** - * @brief Specify the AON_WDT down-counter alarm value - * @note AON watchdog will generate an interrupt when it counts down to the - * alarm value to alram that it is almost expired. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_ALARM - * - * @param counter Value between Min_Data=0 and Max_Data=0x1F - * @retval None - */ -__STATIC_INLINE void ll_aon_wdt_set_alarm_counter(uint32_t counter) -{ - MODIFY_REG(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_ALARM, \ - (counter << AON_EXT_WKUP_CTL_WDT_ALARM_Pos) & AON_EXT_WKUP_CTL_WDT_ALARM); -} - -/** - * @brief Get the AON_WDT down-counter alarm value - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_ALARM - * - * @retval Value between Min_Data=0 and Max_Data=0x1F - */ -__STATIC_INLINE uint32_t ll_aon_wdt_get_alarm_counter(void) -{ - return (uint32_t)(READ_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_ALARM) >> AON_EXT_WKUP_CTL_WDT_ALARM_Pos); -} - -/** @} */ - -/** @defgroup AON_WDT_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Indicate if the AON Watchdog Running Flag is set or not. - * @note This bit can be used to check if AON Watchdog is in running state. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WDT_RUNNING - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_wdt_is_active_flag_running(void) -{ - return (uint32_t)(READ_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_WDT_RUNNING) == (AON_EXT_WKUP_CTL_WDT_RUNNING)); -} - -/** - * @brief Indicate if the AON WDT Reboot Event Flag is set or not. - * @note This bit is set by hardware when the counter has reached alarm value. - * It can be cleared by writing 0 to this bit. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | SLP_EVENT_WDT - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_aon_wdt_is_active_flag_reboot(void) -{ - return (uint32_t)(READ_BITS(AON->SLP_EVENT, AON_SLP_EVENT_WDT_REBOOT) == AON_SLP_EVENT_WDT_REBOOT); -} - -/** - * @brief Clear Interrupt Status flag. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT| SLP_EVENT_WDT - * - * @retval None - */ -__STATIC_INLINE void ll_aon_wdt_clear_flag_reboot(void) -{ - WRITE_REG(AON->SLP_EVENT, ~AON_SLP_EVENT_WDT_REBOOT); -} - -/** @} */ - -/** @} */ - -#endif /* AON_WDT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_AON_WDT_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_calendar.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_calendar.h deleted file mode 100755 index d64c0c1..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_calendar.h +++ /dev/null @@ -1,417 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_calendar.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of CALENDAR LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_CALENDAR CALENDAR - * @brief CALENDAR LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_CALENDAR_H__ -#define __GR55XX_LL_CALENDAR_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(AON) - -/** - * @defgroup CALENDAR_LL_MACRO Defines - * @{ - */ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CALENDAR_LL_Exported_Constants CALENDAR Exported Constants - * @{ - */ - -/** @defgroup CALENDAR_LL_EC_CLOCK_DIV Clock divider - * @{ - */ -#define LL_CALENDAR_DIV_NONE ((uint32_t)0x00U) /**< Select RTC clock */ -#define LL_CALENDAR_DIV_32 ((uint32_t)0x01U << AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos) /**< Select 1/32 divider */ -#define LL_CALENDAR_DIV_64 ((uint32_t)0x02U << AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos) /**< Select 1/64 divider */ -#define LL_CALENDAR_DIV_128 ((uint32_t)0x03U << AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos) /**< Select 1/128 divider */ -#define LL_CALENDAR_DIV_256 ((uint32_t)0x04U << AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos) /**< Select 1/256 divider */ -#define LL_CALENDAR_NO_CLOCK ((uint32_t)0x05U << AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos) /**< Select no clock */ -/** @} */ - -/** @} */ -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CALENDAR_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup CALENDAR_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable calendar counter. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | EN - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_enable(void) -{ - SET_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_EN); -} - -/** - * @brief Disable calendar counter. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | EN - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_disable(void) -{ - CLEAR_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_EN); -} - -/** - * @brief Check if the CALENDAR peripheral is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | EN - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_calendar_is_enabled(void) -{ - return (READ_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_EN) == (AON_CALENDAR_TIMER_CTL_EN)); -} - -/** - * @brief Reloads CALENDAR counter. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | VAL_LOAD - * TIMER_VALUE | TIMER_VALUE - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_reload_counter(uint32_t counter) -{ - WRITE_REG(AON->TIMER_VALUE, counter); - SET_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_VAL_LOAD); -} - -/** - * @brief Reloads CALENDAR alarm. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ALARM_VAL_LOAD - * TIMER_VALUE | TIMER_VALUE - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_reload_alarm(uint32_t alarm) -{ - WRITE_REG(AON->TIMER_VALUE, alarm); - SET_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD); -} - -/** - * @brief Read the CALENDAR counter current value. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | CAL_TIMER - * TIMER_VAL | TIMER_VAL_READ - * - * @retval Value for current counter which should ranging between 0 ~ 0xFFFF_FFFF - */ -__STATIC_INLINE uint32_t ll_calendar_get_counter(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->AON_PAD_CTL1, AON_PAD_CTL1_TIMER_READ_SEL, AON_PAD_CTL1_TIMER_READ_SEL_CAL_TIMER); - GLOBAL_EXCEPTION_ENABLE(); - return (uint32_t)READ_REG(AON->TIMER_VAL); -} - -/** - * @brief Read the CALENDAR counter alarm value. - * - * Register|BitsName - * --------|-------- - * AON_PAD_CTL1 | CAL_ALARM - * TIMER_VAL | TIMER_VAL_READ - * - * @retval Value for current alarm which should ranging between 0 ~ 0xFFFF_FFFF - */ -__STATIC_INLINE uint32_t ll_calendar_get_alarm(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->AON_PAD_CTL1, AON_PAD_CTL1_TIMER_READ_SEL, AON_PAD_CTL1_TIMER_READ_SEL_CAL_ALARM); - GLOBAL_EXCEPTION_ENABLE(); - return (uint32_t)READ_REG(AON->TIMER_VAL); -} - -/** - * @brief Get the CALENDAR wrap-around value. - * @note The value should be read multiple times until get the same value in at least two reads. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | WRAP_CNT - * - * @retval Value between Min_Data=0 and Max_Data=0xF - */ -__STATIC_INLINE uint32_t ll_calendar_get_wrapcnt(void) -{ - return (uint32_t)(READ_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_WRAP_CNT) >> \ - AON_CALENDAR_TIMER_CTL_WRAP_CNT_Pos); -} - -/** - * @brief Select the CALENDAR clock divider. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | CLK_SEL - * - * @param div This parameter can be one of the following values: - * @arg @ref LL_CALENDAR_DIV_NONE - * @arg @ref LL_CALENDAR_DIV_32 - * @arg @ref LL_CALENDAR_DIV_64 - * @arg @ref LL_CALENDAR_DIV_128 - * @arg @ref LL_CALENDAR_DIV_256 - * @arg @ref LL_CALENDAR_NO_CLOCK - * @retval None - */ -__STATIC_INLINE void ll_calendar_set_clock_div(uint32_t div) -{ - MODIFY_REG(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_CLK_SEL, div); -} - -/** - * @brief Enable calendar alarm interrupt. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ALARM_INT_EN - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_it_enable_alarm(void) -{ - SET_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_ALARM_INT_EN); -} - -/** - * @brief Disable calendar alarm interrupt. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ALARM_INT_EN - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_it_disable_alarm(void) -{ - CLEAR_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_ALARM_INT_EN); -} - -/** - * @brief Check if the CALENDAR alarm interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ALARM_INT_EN - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_calendar_it_is_enabled_alarm(void) -{ - return (READ_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_ALARM_INT_EN) == \ - (AON_CALENDAR_TIMER_CTL_ALARM_INT_EN)); -} - -/** - * @brief Enable calendar wrap interrupt. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | WRAP_INT_EN - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_it_enable_wrap(void) -{ - SET_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_WRAP_INT_EN); -} - -/** - * @brief Disable calendar warp interrupt. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | WRAP_INT_EN - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_it_disable_wrap(void) -{ - CLEAR_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_WRAP_INT_EN); -} - -/** - * @brief Check if the CALENDAR wrap interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | WRAP_INT_EN - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_calendar_it_is_enabled_wrap(void) -{ - return (READ_BITS(AON->CALENDAR_TIMER_CTL, AON_CALENDAR_TIMER_CTL_WRAP_INT_EN) == \ - (AON_CALENDAR_TIMER_CTL_WRAP_INT_EN)); -} - -/** @} */ - -/** @defgroup CALENDAR_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Indicate if the CALENDAR alarm event flag is set or not. - * @note This bit is set by hardware when the counter has reached alarm value. - * It can be cleared by writing 0 to this bit. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | CALENDAR_TIMER_ALARM - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_calendar_is_active_flag_alarm(void) -{ - return (uint32_t)(READ_BITS(AON->SLP_EVENT, AON_SLP_EVENT_CALENDAR_TIMER_ALARM) == \ - AON_SLP_EVENT_CALENDAR_TIMER_ALARM); -} - -/** - * @brief Indicate if the CALENDAR wrap event flag is set or not. - * @note This bit is set by hardware when the counter has overflow. - * It can be cleared by writing 0 to this bit. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | CALENDAR_TIMER_WRAP - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_calendar_is_active_flag_wrap(void) -{ - return (uint32_t)(READ_BITS(AON->SLP_EVENT, AON_SLP_EVENT_CALENDAR_TIMER_WRAP) == \ - AON_SLP_EVENT_CALENDAR_TIMER_WRAP); -} - -/** - * @brief Clear calendar alarm interrupt flag. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT| CALENDAR_TIMER_ALARM - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_clear_flag_alarm(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - WRITE_REG(AON->SLP_EVENT, ~AON_SLP_EVENT_CALENDAR_TIMER_ALARM); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Clear calendar wrap interrupt flag. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT| CALENDAR_TIMER_WRAP - * - * @retval None - */ -__STATIC_INLINE void ll_calendar_clear_flag_wrap(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - WRITE_REG(AON->SLP_EVENT, ~AON_SLP_EVENT_CALENDAR_TIMER_WRAP); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** @} */ - -/** @} */ - -#endif /* CALENDAR */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_CALENDAR_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_cgc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_cgc.h deleted file mode 100755 index b2a0775..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_cgc.h +++ /dev/null @@ -1,2714 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_cgc.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of CGC LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_CGC CGC - * @brief CGC LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_CGC_H__ -#define __GR55XX_LL_CGC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MCU_SUB) - -/** @defgroup CGC_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CGC_LL_ES_INIT CGC Exported init structures - * @{ - */ - -/** - * @brief LL CGC init Structure definition - */ -typedef struct _ll_cgc_init_t { - uint32_t wfi_clk0; /**< Specifies the block that automatically closes the clock. - This parameter can be a combination of @ref CGC_LL_EC_WFI_CLK0. */ - - uint32_t wfi_clk1; /**< Specifies the block that automatically closes the clock. - This parameter can be a combination of @ref CGC_LL_EC_WFI_CLK1. */ - - uint32_t wfi_clk2; /**< Specifies the block that automatically closes the clock. - This parameter can be a combination of @ref CGC_LL_EC_WFI_CLK2. */ - - uint32_t force_clk0; /**< Specifies the blocks for forced turn off clock. - This parameter can be a combination of @ref CGC_LL_EC_FRC_CLK0. */ - - uint32_t force_clk1; /**< Specifies the blocks for forced turn off clock. - This parameter can be a combination of @ref CGC_LL_EC_FRC_CLK1. */ - - uint32_t force_clk2; /**< Specifies the blocks for forced turn off clock. - This parameter can be a combination of @ref CGC_LL_EC_FRC_CLK2. */ -} ll_cgc_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup CGC_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CGC_LL_Exported_Constants CGC Exported Constants - * @{ - */ - -/** @defgroup CGC_LL_EC_WFI_CLK0 Block0 Clock During WFI - * @{ - */ -#define LL_CGC_WFI_SECU_HCLK MCU_SUB_WFI_SECU_HCLK /**< Hclk for all security blocks */ -#define LL_CGC_WFI_SIM_HCLK MCU_SUB_WFI_SIM_HCLK /**< Hclk for sim card interface */ -#define LL_CGC_WFI_HTB_HCLK MCU_SUB_WFI_HTB_HCLK /**< Hclk for hopping table */ -#define LL_CGC_WFI_PWM_HCLK MCU_SUB_WFI_PWM_HCLK /**< Hclk for PWM */ -#define LL_CGC_WFI_ROM_HCLK MCU_SUB_WFI_ROM_HCLK /**< Hclk for ROM */ -#define LL_CGC_WFI_SNSADC_HCLK MCU_SUB_WFI_SNSADC_HCLK /**< Hclk for sense ADC */ -#define LL_CGC_WFI_GPIO_HCLK MCU_SUB_WFI_GPIO_HCLK /**< Hclk for GPIOs */ -#define LL_CGC_WFI_DMA_HCLK MCU_SUB_WFI_DMA_HCLK /**< Hclk for DMA engine */ -#define LL_CGC_WFI_BLE_BRG_HCLK MCU_SUB_WFI_BLE_BRG_HCLK /**< Hclk for BLE MCU bridge */ -#define LL_CGC_WFI_APB_SUB_HCLK MCU_SUB_WFI_APB_SUB_HCLK /**< Hclk for APB subsystem */ -#define LL_CGC_WFI_SERIAL_HCLK MCU_SUB_WFI_SERIAL_HCLK /**< Hclk for serial blocks */ -#define LL_CGC_WFI_I2S_S_HCLK MCU_SUB_WFI_I2S_S_HCLK /**< Hclk for I2S slave */ - -#define LL_CGC_WFI_ALL_HCLK0 ((uint32_t)0x00000FFFU) /**< All clock group 0 */ -/** @} */ - -/** @defgroup CGC_LL_EC_WFI_CLK1 Block1 Clock During WFI - * @{ - */ -#define LL_CGC_WFI_AON_MCUSUB_HCLK MCU_SUB_WFI_AON_MCUSUB_HCLK /**< Hclk for Always-on register */ -#define LL_CGC_WFI_XF_XQSPI_HCLK MCU_SUB_WFI_XF_XQSPI_HCLK /**< Hclk for cache top */ -#define LL_CGC_WFI_SRAM_HCLK MCU_SUB_WFI_SRAM_HCLK /**< Hclk for SRAMs */ - -#define LL_CGC_WFI_ALL_HCLK1 ((uint32_t)0x00000007U) /**< All clock group 1 */ -/** @} */ - -/** @defgroup CGC_LL_EC_WFI_CLK2 Block2 Clock During WFI - * @{ - */ -#define LL_CGC_WFI_SECU_DIV4_PCLK MCU_SUB_WFI_SECU_DIV4_PCLK /**< Div4 clk for security blocks */ -#define LL_CGC_WFI_XQSPI_DIV4_PCLK MCU_SUB_WFI_XQSPI_DIV4_PCLK /**< Div4 clk for xf qspi */ - -#define LL_CGC_WFI_ALL_HCLK2 ((uint32_t)0x05000000U) /**< All clock group 2 */ -/** @} */ - - -/** @defgroup CGC_LL_EC_FRC_CLK0 Force Clock OFF - * @{ - */ -#define LL_CGC_FRC_SECU_HCLK MCU_SUB_FORCE_SECU_HCLK /**< Hclk for all security blocks */ -#define LL_CGC_FRC_SIM_HCLK MCU_SUB_FORCE_SIM_HCLK /**< Hclk for sim card interface */ -#define LL_CGC_FRC_HTB_HCLK MCU_SUB_FORCE_HTB_HCLK /**< Hclk for hopping table */ -#define LL_CGC_FRC_PWM_HCLK MCU_SUB_FORCE_PWM_HCLK /**< Hclk for PWM */ -#define LL_CGC_FRC_ROM_HCLK MCU_SUB_FORCE_ROM_HCLK /**< Hclk for ROM */ -#define LL_CGC_FRC_SNSADC_HCLK MCU_SUB_FORCE_SNSADC_HCLK /**< Hclk for sense ADC */ -#define LL_CGC_FRC_GPIO_HCLK MCU_SUB_FORCE_GPIO_HCLK /**< Hclk for GPIOs */ -#define LL_CGC_FRC_DMA_HCLK MCU_SUB_FORCE_DMA_HCLK /**< Hclk for DMA engine */ -#define LL_CGC_FRC_BLE_BRG_HCLK MCU_SUB_FORCE_BLE_BRG_HCLK /**< Hclk for BLE MCU bridge */ -#define LL_CGC_FRC_APB_SUB_HCLK MCU_SUB_FORCE_APB_SUB_HCLK /**< Hclk for APB subsystem */ -#define LL_CGC_FRC_SERIAL_HCLK MCU_SUB_FORCE_SERIAL_HCLK /**< Hclk for serial blocks */ -#define LL_CGC_FRC_I2S_S_HCLK MCU_SUB_FORCE_I2S_S_HCLK /**< Hclk for I2S slave */ - -#define LL_CGC_FRC_ALL_HCLK0 ((uint32_t)0x00000FFFU) /**< All clock group 0 */ -/** @} */ - -/** @defgroup CGC_LL_EC_FRC_CLK1 Force Clock OFF - * @{ - */ -#define LL_CGC_FRC_AON_MCUSUB_HCLK MCU_SUB_FORCE_AON_MCUSUB_HCLK /**< Hclk for Always-on register */ -#define LL_CGC_FRC_XF_XQSPI_HCLK MCU_SUB_FORCE_XF_XQSPI_HCLK /**< Hclk for cache top */ -#define LL_CGC_FRC_SRAM_HCLK MCU_SUB_FORCE_SRAM_HCLK /**< Hclk for SRAMs */ - -#define LL_CGC_FRC_ALL_HCLK1 ((uint32_t)0x00070000U) /**< All clock group 1 */ -/** @} */ - -/** @defgroup CGC_LL_EC_FRC_CLK2 Force Clock OFF - * @{ - */ -#define LL_CGC_FRC_UART0_HCLK MCU_SUB_FORCE_UART0_HCLK /**< Hclk for uart0 */ -#define LL_CGC_FRC_UART1_HCLK MCU_SUB_FORCE_UART1_HCLK /**< Hclk for uart1 */ -#define LL_CGC_FRC_I2C0_HCLK MCU_SUB_FORCE_I2C0_HCLK /**< Hclk for i2c0 */ -#define LL_CGC_FRC_I2C1_HCLK MCU_SUB_FORCE_I2C1_HCLK /**< Hclk for i2c1 */ -#define LL_CGC_FRC_SPIM_HCLK MCU_SUB_FORCE_SPIM_HCLK /**< Hclk for spim */ -#define LL_CGC_FRC_SPIS_HCLK MCU_SUB_FORCE_SPIS_HCLK /**< Hclk for spis */ -#define LL_CGC_FRC_QSPI0_HCLK MCU_SUB_FORCE_QSPI0_HCLK /**< Hclk for qspi0 */ -#define LL_CGC_FRC_QSPI1_HCLK MCU_SUB_FORCE_QSPI1_HCLK /**< Hclk for qspi1 */ -#define LL_CGC_FRC_I2S_HCLK MCU_SUB_FORCE_I2S_HCLK /**< Hclk for i2s */ -#define LL_CGC_FRC_SECU_DIV4_PCLK MCU_SUB_FORCE_SECU_DIV4_PCLK /**< Div4 clk for security blocks */ -#define LL_CGC_FRC_XQSPI_DIV4_PCLK MCU_SUB_FORCE_XQSPI_DIV4_PCLK /**< Div4 clk for xf qspi */ - -#define LL_CGC_FRC_SERIALS_HCLK2 ((uint32_t)0x0001FF00U) /**< Hclk for serial blocks */ -#define LL_CGC_FRC_ALL_HCLK2 ((uint32_t)0x0A01FF00U) /**< All clock group 2 */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup CGC_LL_Exported_Macros CGC Exported Macros - * @{ - */ - -/** @defgroup CGC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in CGC register - * @param __instance__ CGC instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_CGC_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in CGC register - * @param __instance__ CGC instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_CGC_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CGC_LL_Private_Macros CGC Private Macros - * @{ - */ - -/** @defgroup CGC_LL_EC_DEFAULT_CONFIG InitStruct default configuartion - * @{ - */ - -/** - * @brief LL CGC InitStrcut default configuartion - */ -#define LL_CGC_DEFAULT_CONFIG \ -{ \ - .wfi_clk0 = ~LL_CGC_WFI_ALL_HCLK0, \ - .wfi_clk1 = ~LL_CGC_WFI_ALL_HCLK1, \ - .wfi_clk2 = ~LL_CGC_WFI_ALL_HCLK2, \ - .force_clk0 = ~LL_CGC_FRC_ALL_HCLK0, \ - .force_clk1 = ~LL_CGC_FRC_ALL_HCLK1, \ - .force_clk2 = ~LL_CGC_FRC_ALL_HCLK2, \ -} -/** @} */ - -/** @} */ - -/** @} */ - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CGC_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup CGC_LL_EF_CLK_Configuration Clock Configuration - * @{ - */ - -/** - * @brief Some peripherals automatic turn off clock during WFI. (Include: Security/SIM/HTB/PWM/ - * ROM/SNSADC/GPIO/DMA/BLE_BRG/APB_SUB/SERIAL/I2S) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SECU_HCLK - * CG_CTRL_0 | SIM_HCLK - * CG_CTRL_0 | HTB_HCLK - * CG_CTRL_0 | PWM_HCLK - * CG_CTRL_0 | ROM_HCLK - * CG_CTRL_0 | SNSADC_HCLK - * CG_CTRL_0 | GPIO_HCLK - * CG_CTRL_0 | DMA_HCLK - * CG_CTRL_0 | BLE_BRG_HCLK - * CG_CTRL_0 | APB_SUB_HCLK - * CG_CTRL_0 | SERIAL_HCLK - * CG_CTRL_0 | I2S_S_HCLK - * - * @param clk_mask This parameter can be a combination of the following values: - * @arg @ref LL_CGC_WFI_SECU_HCLK - * @arg @ref LL_CGC_WFI_SIM_HCLK - * @arg @ref LL_CGC_WFI_HTB_HCLK - * @arg @ref LL_CGC_WFI_PWM_HCLK - * @arg @ref LL_CGC_WFI_ROM_HCLK - * @arg @ref LL_CGC_WFI_SNSADC_HCLK - * @arg @ref LL_CGC_WFI_GPIO_HCLK - * @arg @ref LL_CGC_WFI_DMA_HCLK - * @arg @ref LL_CGC_WFI_BLE_BRG_HCLK - * @arg @ref LL_CGC_WFI_APB_SUB_HCLK - * @arg @ref LL_CGC_WFI_SERIAL_HCLK - * @arg @ref LL_CGC_WFI_I2S_S_HCLK - * @retval None - */ -__STATIC_INLINE void ll_cgc_set_wfi_off_hclk_0(uint32_t clk_mask) -{ - WRITE_REG(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], clk_mask); -} - -/** - * @brief Return to clock blocks that is turned off during WFI.(Include: Security/SIM/HTB/PWM/ - * ROM/SNSADC/GPIO/DMA/BLE_BRG/APB_SUB/SERIAL/I2S) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SECU_HCLK - * CG_CTRL_0 | SIM_HCLK - * CG_CTRL_0 | HTB_HCLK - * CG_CTRL_0 | PWM_HCLK - * CG_CTRL_0 | ROM_HCLK - * CG_CTRL_0 | SNSADC_HCLK - * CG_CTRL_0 | GPIO_HCLK - * CG_CTRL_0 | DMA_HCLK - * CG_CTRL_0 | BLE_BRG_HCLK - * CG_CTRL_0 | APB_SUB_HCLK - * CG_CTRL_0 | SERIAL_HCLK - * CG_CTRL_0 | I2S_S_HCLK - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_CGC_WFI_SECU_HCLK - * @arg @ref LL_CGC_WFI_SIM_HCLK - * @arg @ref LL_CGC_WFI_HTB_HCLK - * @arg @ref LL_CGC_WFI_PWM_HCLK - * @arg @ref LL_CGC_WFI_ROM_HCLK - * @arg @ref LL_CGC_WFI_SNSADC_HCLK - * @arg @ref LL_CGC_WFI_GPIO_HCLK - * @arg @ref LL_CGC_WFI_DMA_HCLK - * @arg @ref LL_CGC_WFI_BLE_BRG_HCLK - * @arg @ref LL_CGC_WFI_APB_SUB_HCLK - * @arg @ref LL_CGC_WFI_SERIAL_HCLK - * @arg @ref LL_CGC_WFI_I2S_S_HCLK - */ -__STATIC_INLINE uint32_t ll_cgc_get_wfi_off_hclk_0(void) -{ - return READ_REG(MCU_SUB->MCU_SUBSYS_CG_CTRL[0]); -} - - -/** - * @brief Some peripherals automatic turn off clock during WFI. (Include: AON_MCUSUB/XF_XQSPI/SRAM) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * CG_CTRL_2 | XF_XQSPI_HCLK - * CG_CTRL_2 | SRAM_HCLK - * - * @param clk_mask This parameter can be a combination of the following values: - * @arg @ref LL_CGC_WFI_AON_MCUSUB_HCLK - * @arg @ref LL_CGC_WFI_XF_XQSPI_HCLK - * @arg @ref LL_CGC_WFI_SRAM_HCLK - * @retval None - */ -__STATIC_INLINE void ll_cgc_set_wfi_off_hclk_1(uint32_t clk_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_MSK_HCLK_1, clk_mask); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return to clock blocks that is turned off during WFI.(Include: AON_MCUSUB/XF_XQSPI/SRAM) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * CG_CTRL_2 | XF_XQSPI_HCLK - * CG_CTRL_2 | SRAM_HCLK - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_CGC_WFI_AON_MCUSUB_HCLK - * @arg @ref LL_CGC_WFI_XF_XQSPI_HCLK - * @arg @ref LL_CGC_WFI_SRAM_HCLK - */ -__STATIC_INLINE uint32_t ll_cgc_get_wfi_off_hclk_1(void) -{ - return READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_MSK_HCLK_1); -} - -/** - * @brief Some peripherals automatic turn off clock during WFI. (Include: SECU_DIV4/XQSPI_DIV4) - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SECU_DIV4_PCLK - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @param clk_mask This parameter can be a combination of the following values: - * @arg @ref LL_CGC_WFI_SECU_DIV4_PCLK - * @arg @ref LL_CGC_WFI_XQSPI_DIV4_PCLK - * @retval None - */ -__STATIC_INLINE void ll_cgc_set_wfi_off_hclk_2(uint32_t clk_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_MSK_HCLK_2, clk_mask); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return to clock blocks that is turned off during WFI.(Include: AON_MCUSUB/XF_XQSPI/SRAM) - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SECU_DIV4_PCLK - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_CGC_WFI_SECU_DIV4_PCLK - * @arg @ref LL_CGC_WFI_XQSPI_DIV4_PCLK - */ -__STATIC_INLINE uint32_t ll_cgc_get_wfi_off_hclk_2(void) -{ - return READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_MSK_HCLK_2); -} - -/** - * @brief Some peripherals force turn off clock. (Include: Security/SIM/HTB/PWM/ROM/SNSADC/GPIO/ - * DMA/BLE_BRG/APB_SUB/SERIAL/I2S) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SECU_HCLK - * CG_CTRL_1 | SIM_HCLK - * CG_CTRL_1 | HTB_HCLK - * CG_CTRL_1 | PWM_HCLK - * CG_CTRL_1 | ROM_HCLK - * CG_CTRL_1 | SNSADC_HCLK - * CG_CTRL_1 | GPIO_HCLK - * CG_CTRL_1 | DMA_HCLK - * CG_CTRL_1 | BLE_BRG_HCLK - * CG_CTRL_1 | APB_SUB_HCLK - * CG_CTRL_1 | SERIAL_HCLK - * CG_CTRL_1 | I2S_S_HCLK - * - * @param clk_mask This parameter can be a combination of the following values: - * @arg @ref LL_CGC_FRC_SECU_HCLK - * @arg @ref LL_CGC_FRC_SIM_HCLK - * @arg @ref LL_CGC_FRC_HTB_HCLK - * @arg @ref LL_CGC_FRC_PWM_HCLK - * @arg @ref LL_CGC_FRC_ROM_HCLK - * @arg @ref LL_CGC_FRC_SNSADC_HCLK - * @arg @ref LL_CGC_FRC_GPIO_HCLK - * @arg @ref LL_CGC_FRC_DMA_HCLK - * @arg @ref LL_CGC_FRC_BLE_BRG_HCLK - * @arg @ref LL_CGC_FRC_APB_SUB_HCLK - * @arg @ref LL_CGC_FRC_SERIAL_HCLK - * @arg @ref LL_CGC_FRC_I2S_S_HCLK - * @retval None - */ -__STATIC_INLINE void ll_cgc_set_force_off_hclk_0(uint32_t clk_mask) -{ - WRITE_REG(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], clk_mask); -} - -/** - * @brief Return to clock blocks that was forcibly closed.(Include: Security/SIM/HTB/PWM/ - * ROM/SNSADC/GPIO/DMA/BLE_BRG/APB_SUB/SERIAL/I2S) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SECU_HCLK - * CG_CTRL_1 | SIM_HCLK - * CG_CTRL_1 | HTB_HCLK - * CG_CTRL_1 | PWM_HCLK - * CG_CTRL_1 | ROM_HCLK - * CG_CTRL_1 | SNSADC_HCLK - * CG_CTRL_1 | GPIO_HCLK - * CG_CTRL_1 | DMA_HCLK - * CG_CTRL_1 | BLE_BRG_HCLK - * CG_CTRL_1 | APB_SUB_HCLK - * CG_CTRL_1 | SERIAL_HCLK - * CG_CTRL_1 | I2S_S_HCLK - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_CGC_FRC_SECU_HCLK - * @arg @ref LL_CGC_FRC_SIM_HCLK - * @arg @ref LL_CGC_FRC_HTB_HCLK - * @arg @ref LL_CGC_FRC_PWM_HCLK - * @arg @ref LL_CGC_FRC_ROM_HCLK - * @arg @ref LL_CGC_FRC_SNSADC_HCLK - * @arg @ref LL_CGC_FRC_GPIO_HCLK - * @arg @ref LL_CGC_FRC_DMA_HCLK - * @arg @ref LL_CGC_FRC_BLE_BRG_HCLK - * @arg @ref LL_CGC_FRC_APB_SUB_HCLK - * @arg @ref LL_CGC_FRC_SERIAL_HCLK - * @arg @ref LL_CGC_FRC_I2S_S_HCLK - */ -__STATIC_INLINE uint32_t ll_cgc_get_force_off_hclk_0(void) -{ - return READ_REG(MCU_SUB->MCU_SUBSYS_CG_CTRL[1]); -} - - -/** - * @brief Some peripherals force turn off clock. (Include: AON_MCUSUB/XF_XQSPI/SRAM) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * CG_CTRL_2 | XF_XQSPI_HCLK - * CG_CTRL_2 | SRAM_HCLK - * - * @param clk_mask This parameter can be a combination of the following values: - * @arg @ref LL_CGC_FRC_AON_MCUSUB_HCLK - * @arg @ref LL_CGC_FRC_XF_XQSPI_HCLK - * @arg @ref LL_CGC_FRC_SRAM_HCLK - * @retval None - */ -__STATIC_INLINE void ll_cgc_set_force_off_hclk_1(uint32_t clk_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_MSK_HCLK_1, clk_mask); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return to clock blocks that was forcibly closed.(Include: AON_MCUSUB/XF_XQSPI/SRAM) - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * CG_CTRL_2 | XF_XQSPI_HCLK - * CG_CTRL_2 | SRAM_HCLK - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_CGC_FRC_AON_MCUSUB_HCLK - * @arg @ref LL_CGC_FRC_XF_XQSPI_HCLK - * @arg @ref LL_CGC_FRC_SRAM_HCLK - */ -__STATIC_INLINE uint32_t ll_cgc_get_force_off_hclk_1(void) -{ - return READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_MSK_HCLK_1); -} - -/** - * @brief Some peripherals force turn off clock. (Include: UART0_HCLK/UART1_HCLK/I2C0_HCLK/ - * I2C1_HCLK/SPIM_HCLK/SPIS_HCLK/QSPI0_HCLK/QSPI1_HCLK/I2S_HCLK/SECU_DIV4_PCLK/XQSPI_DIV4_PCLK) - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART0_HCLK - * PERIPH_GC | UART1_HCLK - * PERIPH_GC | I2C0_HCLK - * PERIPH_GC | I2C1_HCLK - * PERIPH_GC | SPIM_HCLK - * PERIPH_GC | SPIS_HCLK - * PERIPH_GC | QSPI0_HCLK - * PERIPH_GC | QSPI1_HCLK - * PERIPH_GC | I2S_HCLK - * PERIPH_GC | SECU_DIV4_PCLK - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @param clk_mask This parameter can be a combination of the following values: - * @arg @ref LL_CGC_FRC_UART0_HCLK - * @arg @ref LL_CGC_FRC_UART1_HCLK - * @arg @ref LL_CGC_FRC_I2C0_HCLK - * @arg @ref LL_CGC_FRC_I2C1_HCLK - * @arg @ref LL_CGC_FRC_SPIM_HCLK - * @arg @ref LL_CGC_FRC_SPIS_HCLK - * @arg @ref LL_CGC_FRC_QSPI0_HCLK - * @arg @ref LL_CGC_FRC_QSPI1_HCLK - * @arg @ref LL_CGC_FRC_I2S_HCLK - * @arg @ref LL_CGC_FRC_SECU_DIV4_PCLK - * @arg @ref LL_CGC_FRC_XQSPI_DIV4_PCLK - * @retval None - */ -__STATIC_INLINE void ll_cgc_set_force_off_hclk_2(uint32_t clk_mask) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_MSK_HCLK_2, clk_mask); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return to clock blocks that was forcibly closed.(Include: UART0_HCLK/UART1_HCLK/I2C0_HCLK/ - * I2C1_HCLK/SPIM_HCLK/SPIS_HCLK/QSPI0_HCLK/QSPI1_HCLK/I2S_HCLK/SECU_DIV4_PCLK/XQSPI_DIV4_PCLK) - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART0_HCLK - * PERIPH_GC | UART1_HCLK - * PERIPH_GC | I2C0_HCLK - * PERIPH_GC | I2C1_HCLK - * PERIPH_GC | SPIM_HCLK - * PERIPH_GC | SPIS_HCLK - * PERIPH_GC | QSPI0_HCLK - * PERIPH_GC | QSPI1_HCLK - * PERIPH_GC | I2S_HCLK - * PERIPH_GC | SECU_DIV4_PCLK - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_CGC_FRC_UART0_HCLK - * @arg @ref LL_CGC_FRC_UART1_HCLK - * @arg @ref LL_CGC_FRC_I2C0_HCLK - * @arg @ref LL_CGC_FRC_I2C1_HCLK - * @arg @ref LL_CGC_FRC_SPIM_HCLK - * @arg @ref LL_CGC_FRC_SPIS_HCLK - * @arg @ref LL_CGC_FRC_QSPI0_HCLK - * @arg @ref LL_CGC_FRC_QSPI1_HCLK - * @arg @ref LL_CGC_FRC_I2S_HCLK - * @arg @ref LL_CGC_FRC_SECU_DIV4_PCLK - * @arg @ref LL_CGC_FRC_XQSPI_DIV4_PCLK - */ -__STATIC_INLINE uint32_t ll_cgc_get_force_off_hclk_2(void) -{ - return READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_MSK_HCLK_2); -} - -/** - * @brief Enable security blocks(including AES, PKC, Present, HMAC) automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SECU_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_secu_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SECU_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable security blocks(including AES, PKC, Present, HMAC) automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SECU_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_secu_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SECU_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the security blocks(including AES, PKC, Present, HMAC) automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SECU_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_secu_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SECU_HCLK) == (MCU_SUB_WFI_SECU_HCLK)); -} - -/** - * @brief Enable SIM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SIM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_sim_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SIM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable SIM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SIM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_sim_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SIM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the SIM automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SIM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_sim_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SIM_HCLK) == (MCU_SUB_WFI_SIM_HCLK)); -} - -/** - * @brief Enable Hopping Table automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | HTB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_htb_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_HTB_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable Hopping Table automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | HTB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_htb_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_HTB_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the Hopping Table automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | HTB_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_htb_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_HTB_HCLK) == (MCU_SUB_WFI_HTB_HCLK)); -} - -/** - * @brief Enable PWM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | PWM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_pwm_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_PWM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable PWM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | PWM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_pwm_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_PWM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the PWM automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | PWM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_pwm_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_PWM_HCLK) == (MCU_SUB_WFI_PWM_HCLK)); -} - -/** - * @brief Enable ROM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | ROM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_rom_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_ROM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable ROM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | ROM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_rom_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_ROM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the ROM automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | ROM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_rom_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_ROM_HCLK) == (MCU_SUB_WFI_ROM_HCLK)); -} - -/** - * @brief Enable SNSADC automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SNSADC_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_snsadc_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SNSADC_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable SNSADC automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SNSADC_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_snsadc_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SNSADC_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the SNSADC automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SNSADC_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_snsadc_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SNSADC_HCLK) == (MCU_SUB_WFI_SNSADC_HCLK)); -} - -/** - * @brief Enable GPIO automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | GPIO_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_gpio_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_GPIO_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable GPIO automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | GPIO_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_gpio_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_GPIO_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the GPIO automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | GPIO_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_gpio_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_GPIO_HCLK) == (MCU_SUB_WFI_GPIO_HCLK)); -} - -/** - * @brief Enable DMA automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | DMA_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_dma_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_DMA_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable DMA automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | DMA_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_dma_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_DMA_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the DMA automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | DMA_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_dma_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_DMA_HCLK) == (MCU_SUB_WFI_DMA_HCLK)); -} - -/** - * @brief Enable BLE Bridge automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | BLE_BRG_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_ble_brg_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_BLE_BRG_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable BLE Bridge automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | BLE_BRG_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_ble_brg_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_BLE_BRG_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the BLE Bridge automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | BLE_BRG_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_ble_brg_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_BLE_BRG_HCLK) == (MCU_SUB_WFI_BLE_BRG_HCLK)); -} - -/** - * @brief Enable APB Subsystem automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | APB_SUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_apb_sub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_APB_SUB_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable APB Subsystem automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | APB_SUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_apb_sub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_APB_SUB_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the APB Subsystem automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | APB_SUB_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_apb_sub_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_APB_SUB_HCLK) == (MCU_SUB_WFI_APB_SUB_HCLK)); -} - -/** - * @brief Enable serial blocks(including I2C, UART, QSPI, I2S, SPI) automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SERIAL_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_serial_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SERIAL_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable serial blocks(including I2C, UART, QSPI, I2S, SPI) automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SERIAL_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_serial_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SERIAL_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the serial blocks(including I2C, UART, QSPI, I2S, SPI) automatic turn off - * clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | SERIAL_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_serial_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_SERIAL_HCLK) == (MCU_SUB_WFI_SERIAL_HCLK)); -} - -/** - * @brief Enable I2S slave automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | I2S_S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_i2s_s_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_I2S_S_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable I2S slave automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | I2S_S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_i2s_s_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_I2S_S_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the I2S slave automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_0 | I2S_S_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_i2s_s_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[0], MCU_SUB_WFI_I2S_S_HCLK) == (MCU_SUB_WFI_I2S_S_HCLK)); -} - -/** - * @brief Enable AON_MUCSUB automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_aon_mcusub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_AON_MCUSUB_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable AON_MUCSUB automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_aon_mcusub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_AON_MCUSUB_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the AON_MUCSUB automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_aon_mcusub_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_AON_MCUSUB_HCLK) == \ - (MCU_SUB_WFI_AON_MCUSUB_HCLK)); -} - -/** - * @brief Enable XQSPI automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | XF_XQSPI_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_xqspi_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_XF_XQSPI_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable XQSPI automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | XF_XQSPI_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_xqspi_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_XF_XQSPI_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the XQSPI automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | XF_XQSPI_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_xqspi_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_XF_XQSPI_HCLK) == \ - (MCU_SUB_WFI_XF_XQSPI_HCLK)); -} - -/** - * @brief Enable SRAM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | SRAM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_sram_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_SRAM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable SRAM automatic turn off clock during WFI - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | SRAM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_sram_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_SRAM_HCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the SRAM automatic turn off clock is enabled. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | SRAM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_sram_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_WFI_SRAM_HCLK) == (MCU_SUB_WFI_SRAM_HCLK)); -} - -/** - * @brief Enable security blocks automatic turn off div4 clock during WFI - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SECU_DIV4_PCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_secu_div4_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_SECU_DIV4_PCLK); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable security blocks automatic turn off div4 clock during WFI - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SECU_DIV4_PCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_secu_div4_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_SECU_DIV4_PCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the security blocks automatic turn off div4 - * clock is enabled. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SECU_DIV4_PCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_secu_div4_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_SECU_DIV4_PCLK) == (MCU_SUB_WFI_SECU_DIV4_PCLK)); -} - -/** - * @brief Enable XQSPI automatic turn off div4 clock during WFI - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_wfi_off_xqspi_div4_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_XQSPI_DIV4_PCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable XQSPI automatic turn off div4 clock during WFI - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_wfi_off_xqspi_div4_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_XQSPI_DIV4_PCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the XQSPI automatic turn off div4 clock is enabled. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | XQSPI_DIV4_PCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_wfi_off_xqspi_div4_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_WFI_XQSPI_DIV4_PCLK) == (MCU_SUB_WFI_XQSPI_DIV4_PCLK)); -} - -/** - * @brief Enabling force to turn off the clock for security blocks(including AES, PKC, Present, HMAC). - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SECU_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_secu_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SECU_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for security blocks(including AES, PKC, Present, HMAC). - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SECU_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_secu_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SECU_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for security blocks(including AES, PKC, Present, HMAC) is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SECU_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_secu_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SECU_HCLK) == (MCU_SUB_FORCE_SECU_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for SIM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SIM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_sim_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SIM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for SIM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SIM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_sim_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SIM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for SIM is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SIM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_sim_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SIM_HCLK) == (MCU_SUB_FORCE_SIM_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for Hopping Table. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | HTB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_htb_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_HTB_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for Hopping Table. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | HTB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_htb_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_HTB_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for Hopping Table is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | HTB_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_htb_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_HTB_HCLK) == (MCU_SUB_FORCE_HTB_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for PWM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | PWM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_pwm_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_PWM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for PWM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | PWM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_pwm_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_PWM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for PWM is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | PWM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_pwm_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_PWM_HCLK) == (MCU_SUB_FORCE_PWM_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for ROM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | ROM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_rom_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_ROM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for ROM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | ROM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_rom_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_ROM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for ROM is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | ROM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_rom_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_ROM_HCLK) == (MCU_SUB_FORCE_ROM_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for SNSADC. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SNSADC_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_snsadc_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SNSADC_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for SNSADC. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SNSADC_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_snsadc_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SNSADC_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for SNSADC is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SNSADC_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_snsadc_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SNSADC_HCLK) == (MCU_SUB_FORCE_SNSADC_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for GPIO. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | GPIO_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_gpio_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_GPIO_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for GPIO. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | GPIO_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_gpio_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_GPIO_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for GPIO is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | GPIO_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_gpio_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_GPIO_HCLK) == (MCU_SUB_FORCE_GPIO_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for DMA. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | DMA_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_dma_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_DMA_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for DMA. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | DMA_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_dma_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_DMA_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for DMA is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | DMA_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_dma_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_DMA_HCLK) == (MCU_SUB_FORCE_DMA_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for BLE Bridge. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | BLE_BRG_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_ble_brg_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_BLE_BRG_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for BLE Bridge. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | BLE_BRG_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_ble_brg_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_BLE_BRG_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for BLE Bridge is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | BLE_BRG_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_ble_brg_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_BLE_BRG_HCLK) == (MCU_SUB_FORCE_BLE_BRG_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for APB Subsystem. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | APB_SUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_apb_sub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_APB_SUB_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for APB Subsystem. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | APB_SUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_apb_sub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_APB_SUB_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for APB Subsystem is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | APB_SUB_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_apb_sub_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_APB_SUB_HCLK) == (MCU_SUB_FORCE_APB_SUB_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for serial blocks(including I2C, UART, QSPI, I2S, SPI). - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SERIAL_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_serial_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SERIAL_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for serial blocks(including I2C, UART, QSPI, I2S, SPI). - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SERIAL_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_serial_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SERIAL_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for serial blocks(including I2C, UART, QSPI, I2S, SPI) is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | SERIAL_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_serial_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_SERIAL_HCLK) == (MCU_SUB_FORCE_SERIAL_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for I2S slave. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | I2S_S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_i2s_s_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_I2S_S_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for I2S slave. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | I2S_S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_i2s_s_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_I2S_S_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for I2S slave is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_1 | I2S_S_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_i2s_s_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[1], MCU_SUB_FORCE_I2S_S_HCLK) == (MCU_SUB_FORCE_I2S_S_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for AON_MUCSUB. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_aon_mcusub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_AON_MCUSUB_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for AON_MUCSUB. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_aon_mcusub_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_AON_MCUSUB_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for AON_MUCSUB is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | AON_MCUSUB_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_aon_mcusub_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_AON_MCUSUB_HCLK) == \ - (MCU_SUB_FORCE_AON_MCUSUB_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for XQSPI. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | XF_XQSPI_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_xqspi_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_XF_XQSPI_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for XQSPI. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | XF_XQSPI_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_xqspi_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_XF_XQSPI_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for XQSPI is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | XF_XQSPI_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_xqspi_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_XF_XQSPI_HCLK) == \ - (MCU_SUB_FORCE_XF_XQSPI_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for SRAM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | SRAM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_sram_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_SRAM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for SRAM. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | SRAM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_sram_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_SRAM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for SRAM is forced to close. - * - * Register | BitsName - * ----------|-------- - * CG_CTRL_2 | SRAM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_sram_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_SUBSYS_CG_CTRL[ITEM_2], MCU_SUB_FORCE_SRAM_HCLK) == (MCU_SUB_FORCE_SRAM_HCLK)); -} - -/**uart0_hclk - * @brief Enabling force to turn off the clock for UART0. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART0_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_UART0_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for UART0. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART0_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_uart0_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_UART0_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for UART0 is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART0_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_uart0_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_UART0_HCLK) == (MCU_SUB_FORCE_UART0_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for UART1. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART1_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_uart1_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_UART1_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for UART1. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART1_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_uart1_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_UART1_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for UART1 is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | UART1_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_uart1_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_UART1_HCLK) == (MCU_SUB_FORCE_UART1_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for I2C0. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2C0_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_i2c0_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2C0_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for I2C0. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2C0_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_i2c0_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2C0_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for I2C0 is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2C0_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_i2c0_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2C0_HCLK) == (MCU_SUB_FORCE_I2C0_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for I2C1. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2C1_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_i2c1_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2C1_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for I2C1. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2C1_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_i2c1_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2C1_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for I2C1 is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2C1_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_i2c1_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2C1_HCLK) == (MCU_SUB_FORCE_I2C1_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for SPIM. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SPIM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_spim_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SPIM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for SPIM. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SPIM_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_spim_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SPIM_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for SPIM is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SPIM_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_spim_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SPIM_HCLK) == (MCU_SUB_FORCE_SPIM_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for SPIS. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SPIS_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_spis_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SPIS_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for SPIS. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SPIS_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_spis_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SPIS_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for SPIS is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | SPIS_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_spis_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SPIS_HCLK) == (MCU_SUB_FORCE_SPIS_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for QSPI0. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | QSPI0_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_qspi0_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_QSPI0_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for QSPI0. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | QSPI0_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_qspi0_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_QSPI0_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for QSPI0 is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | QSPI0_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_qspi0_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_QSPI0_HCLK) == (MCU_SUB_FORCE_QSPI0_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for QSPI1. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | QSPI1_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_qspi1_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_QSPI1_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for QSPI1. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | QSPI1_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_qspi1_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_QSPI1_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for QSPI1 is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | QSPI1_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_qspi1_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_QSPI1_HCLK) == (MCU_SUB_FORCE_QSPI1_HCLK)); -} - -/** - * @brief Enabling force to turn off the clock for I2S master. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_i2s_m_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2S_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the clock for I2S master. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_i2s_m_hclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2S_HCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the clock for I2S master is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2S_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_i2s_m_hclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_I2S_HCLK) == (MCU_SUB_FORCE_I2S_HCLK)); -} - -/** - * @brief Enabling force to turn off the div4 clock for security blocks. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_enable_force_off_secu_div4_pclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - SET_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SECU_DIV4_PCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disabling force to turn off the div4 clock for security blocks. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2S_HCLK - * - * @retval None - */ -__STATIC_INLINE void ll_cgc_disable_force_off_secu_div4_pclk(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - - CLEAR_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SECU_DIV4_PCLK); - - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Indicate whether the div4 clock for security blocks is forced to close. - * - * Register | BitsName - * ----------|-------- - * PERIPH_GC | I2S_HCLK - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_cgc_is_enabled_force_off_secu_div4_pclk(void) -{ - return (READ_BITS(MCU_SUB->MCU_PERIPH_CG, MCU_SUB_FORCE_SECU_DIV4_PCLK) == (MCU_SUB_FORCE_SECU_DIV4_PCLK)); -} - - -/** @} */ - -/** @defgroup CGC_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize CGC registers (Registers restored to their default values). - * @retval An error_status_t enumeration value: - * - SUCCESS: CGC registers are de-initialized - * - ERROR: CGC registers are not de-initialized - */ -error_status_t ll_cgc_deinit(void); - -/** - * @brief Initialize CGC registers according to the specified. - * parameters in p_cgc_init. - * @param p_cgc_init Pointer to a ll_cgc_init_t structure that contains the configuration - * information for the specified CGC register. - * @retval An error_status_t enumeration value: - * - SUCCESS: CGC registers are initialized according to p_cgc_init content - * - ERROR: Problem occurred during CGC Registers initialization - */ -error_status_t ll_cgc_init(ll_cgc_init_t *p_cgc_init); - -/** - * @brief Set each field of a @ref ll_cgc_init_t type structure to default value. - * @param p_cgc_init Pointer to a @ref ll_cgc_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_cgc_struct_init(ll_cgc_init_t *p_cgc_init); - -/** @} */ - -/** @} */ - - -#endif /* CGC */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_CGC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_comp.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_comp.h deleted file mode 100755 index 1d01338..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_comp.h +++ /dev/null @@ -1,396 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_comp.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of COMP LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_COMP COMP - * @brief COMP LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_COMP_H__ -#define __GR55XX_LL_COMP_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(AON) - -/** @defgroup COMP_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup COMP_LL_ES_INIT COMP Exported init structures - * @{ - */ - -/** - * @brief LL COMP init Structure definition - */ -typedef struct _ll_comp_init { - uint32_t input_source; /**< Specifies the input source for the comparator. - This parameter can be any value of @ref COMP_LL_EC_INPUT_SRC. - This parameter can be modified afterwards using unitary function - @ref ll_comp_set_input_src(). */ - - uint32_t ref_source; /**< Specifies the reference source for the comparator. - This parameter can be any value of @ref COMP_LL_EC_INPUT_SRC. - This parameter can be modified afterwards using unitary function - @ref ll_comp_set_ref_src(). */ - uint32_t ref_value; /*!< Specifies the value of the COMP buffered reference. - If ref_source select to LL_COMP_REF_SRC_VBAT, this parameter can be a value - between: 0 ~ 7. - This parameter can be modified afterwards using unitary function - @ref ll_comp_set_vbatt_lvl(). - If ref_source select to LL_COMP_REF_SRC_VREF, this parameter can be a value - between: 0 ~ 63. - This parameter can be modified afterwards using unitary function - @ref ll_comp_set_vref_lvl(). */ -} ll_comp_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup COMP_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup COMP_LL_Exported_Constants COMP Exported Constants - * @{ - */ - -/** @defgroup COMP_LL_EC_INPUT_SRC COMP INPUT SOURCE - * @{ - */ -#define LL_COMP_INPUT_SRC_IO0 (0UL << AON_RF_REG_10_CHANNEL_SEL_P_Pos) /**< Set MSIO_0 as inputs for - the comparator */ -#define LL_COMP_INPUT_SRC_IO1 (1UL << AON_RF_REG_10_CHANNEL_SEL_P_Pos) /**< Set MSIO_1 as inputs for - the comparator */ -#define LL_COMP_INPUT_SRC_IO2 (2UL << AON_RF_REG_10_CHANNEL_SEL_P_Pos) /**< Set MSIO_2 as inputs for - the comparator */ -#define LL_COMP_INPUT_SRC_IO3 (3UL << AON_RF_REG_10_CHANNEL_SEL_P_Pos) /**< Set MSIO_3 as inputs for - the comparator */ -#define LL_COMP_INPUT_SRC_IO4 (4UL << AON_RF_REG_10_CHANNEL_SEL_P_Pos) /**< Set MSIO_4 as inputs for - the comparator */ -/** @} */ - -/** @defgroup COMP_LL_EC_REF_SRC COMP REF SOURCE - * @{ - */ -#define LL_COMP_REF_SRC_IO0 (0UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set MSIO_0 as references for - the comparator */ -#define LL_COMP_REF_SRC_IO1 (1UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set MSIO_1 as references for - the comparator */ -#define LL_COMP_REF_SRC_IO2 (2UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set MSIO_2 as references for - the comparator */ -#define LL_COMP_REF_SRC_IO3 (3UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set MSIO_3 as references for - the comparator */ -#define LL_COMP_REF_SRC_IO4 (4UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set MSIO_4 as references for - the comparator */ -#define LL_COMP_REF_SRC_VBAT (6UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set VBATT as references for - the comparator */ -#define LL_COMP_REF_SRC_VREF (7UL << AON_RF_REG_10_CHANNEL_SEL_N_Pos) /**< Set VREF as references for - the comparator */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup COMP_LL_Exported_Macros COMP Exported Macros - * @{ - */ - -/** @defgroup COMP_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in COMP register - * @param __instance__ COMP instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_COMP_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG((__instance__)->__REG__, (__VALUE__)) - -/** - * @brief Read a value in COMP register - * @param __instance__ COMP instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_COMP_ReadReg(__instance__, __REG__) READ_REG((__instance__)->__REG__) - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup COMP_LL_Private_Macros COMP Private Macros - * @{ - */ - -/** @defgroup COMP_LL_EC_DEFAULT_CONFIG InitStruct default configuartion - * @{ - */ - -/** - * @brief Default configuartion for initializing structure - */ -#define LL_COMP_DEFAULT_CONFIG \ -{ \ - .channel_p = LL_COMP_CHANNEL_IO0, \ - .channel_n = LL_COMP_CHANNEL_IO1, \ -} -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup COMP_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup COMP_LL_EF_Configuration Basic Configuration - * @{ - */ - -/** - * @brief Enable COMP module. - * - * Register|BitsName - * --------|-------- - * RF_REG_10 | COMP_EN - * - * @retval None - */ -__STATIC_INLINE void ll_comp_enable(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_WAKE_UP_SEL_MSIO_COMP); - SET_BITS(AON->RF_REG_10, AON_RF_REG_10_WAKE_COMP_EN_Msk); -} - -/** - * @brief Disable COMP module. - * - * Register|BitsName - * --------|-------- - * RF_REG_10 | COMP_EN - * - * @retval None - */ -__STATIC_INLINE void ll_comp_disable(void) -{ - CLEAR_BITS(AON->RF_REG_10, AON_RF_REG_10_WAKE_COMP_EN_Msk); - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_WAKE_UP_SEL_MSIO_COMP); -} - -/** - * @brief Set channel of COMP input source. - * - * Register|BitsName - * --------|-------- - * RF_REG_10 | AON_RF_REG_10_CHANNEL_SEL_P - * - * @param source This parameter can be one of the following values: - * @arg @ref LL_COMP_INPUT_SRC_IO0 - * @arg @ref LL_COMP_INPUT_SRC_IO1 - * @arg @ref LL_COMP_INPUT_SRC_IO2 - * @arg @ref LL_COMP_INPUT_SRC_IO3 - * @arg @ref LL_COMP_INPUT_SRC_IO4 - * @retval None - */ -__STATIC_INLINE void ll_comp_set_input_src(uint32_t source) -{ - MODIFY_REG(AON->RF_REG_10, AON_RF_REG_10_CHANNEL_SEL_P_Msk, source); -} - -/** - * @brief Set channel of COMP reference source. - * - * Register|BitsName - * --------|-------- - * RF_REG_10 | AON_RF_REG_10_CHANNEL_SEL_N - * - * @param source This parameter can be one of the following values: - * @arg @ref LL_COMP_REF_SRC_IO0 - * @arg @ref LL_COMP_REF_SRC_IO1 - * @arg @ref LL_COMP_REF_SRC_IO2 - * @arg @ref LL_COMP_REF_SRC_IO3 - * @arg @ref LL_COMP_REF_SRC_IO4 - * @arg @ref LL_COMP_REF_SRC_VBAT - * @arg @ref LL_COMP_REF_SRC_VREF - * @retval None - */ -__STATIC_INLINE void ll_comp_set_ref_src(uint32_t source) -{ - MODIFY_REG(AON->RF_REG_10, AON_RF_REG_10_CHANNEL_SEL_N_Msk, source); -} - -/** - * @brief Set VBATT control level. - * - * Register|BitsName - * --------|-------- - * RF_REG_10 | BATT_LVL_CTRL_LV - * - * @param level This parameter can be a value between: 0 ~ 7 - * Vbatt_ref = ((level+1)/10) * VBATT - * @retval None - */ -__STATIC_INLINE void ll_comp_set_vbatt_lvl(uint32_t level) -{ - MODIFY_REG(AON->RF_REG_10, AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Msk, \ - level << AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Pos); -} - -/** - * @brief Set VREF control level. - * - * Register|BitsName - * --------|-------- - * RF_REG_10 | COMP_REF_CTRL_LV - * - * @param level This parameter can be a value between: 0 ~ 63 - * Vref = 30mv * level - * @retval None - */ -__STATIC_INLINE void ll_comp_set_vref_lvl(uint32_t level) -{ - MODIFY_REG(AON->RF_REG_10, AON_RF_REG_10_COMP_REF_CTRL_LV_Msk, level << AON_RF_REG_10_COMP_REF_CTRL_LV_Pos); -} - -/** - * @brief Indicate if the COMP Interrupt Flag is set or not. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | MSIO_COMP - * - * @retval State of bit (1 or o). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_comp_is_active_flag_it(void) -{ - return (READ_BITS(AON->SLP_EVENT, AON_SLP_EVENT_PMU_MSIO_COMP) == AON_SLP_EVENT_PMU_MSIO_COMP); -} - -/** - * @brief Clear Interrupt Status flag for COMP. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | MSIO_COMP - * - * @retval None. - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_comp_clear_flag_it(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->SLP_EVENT, AON_SLP_EVENT_PMU_MSIO_COMP); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** @} */ - -/** @defgroup COMP_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize COMP registers (Registers restored to their default values). - * @retval An error_status_t enumeration value: - * - SUCCESS: COMP registers are de-initialized - * - ERROR: COMP registers are not de-initialized - */ -error_status_t ll_comp_deinit(void); - -/** - * @brief Initialize COMP registers according to the specified. - * parameters in p_comp_init. - * @param p_comp_init Pointer to a ll_comp_init_t structure that contains the configuration - * information for the specified COMP peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: COMP registers are initialized according to p_comp_init content - * - ERROR: Problem occurred during COMP Registers initialization - */ -error_status_t ll_comp_init(ll_comp_init_t *p_comp_init); - -/** - * @brief Set each field of a @ref ll_comp_init_t type structure to default value. - * @param p_comp_init Pointer to a @ref ll_comp_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_comp_struct_init(ll_comp_init_t *p_comp_init); - -/** @} */ - -/** @} */ - -#endif /* AON */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_COMP_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dma.h deleted file mode 100755 index 907c018..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dma.h +++ /dev/null @@ -1,3955 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_dma.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of DMA LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_DMA DMA - * @brief DMA LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_DMA_H__ -#define __GR55xx_LL_DMA_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (DMA) - -/** @defgroup DMA_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMA_LL_ES_INIT DMA Exported init structures - * @{ - */ - -/** - * @brief LL DMA init Structure definition - */ -typedef struct _ll_dma_init { - uint32_t src_address; /**< Specifies the Source base address for DMA transfer. - This parameter must be a value between Min_Data = 0 - and Max_Data = 0xFFFFFFFF. */ - - uint32_t dst_address; /**< Specifies the Destination base address for DMA transfer. - This parameter must be a value between Min_Data = 0 - and Max_Data = 0xFFFFFFFF. */ - - uint32_t direction; /**< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory or - form peripheral to peripheral. - This parameter can be a value of @ref DMA_LL_EC_DIRECTION - This feature can be modified afterwards using unitary function - @ref ll_dma_set_data_transfer_direction(). */ - - uint32_t mode; /**< Specifies the Single block or Multi-block operation mode. - This parameter can be a value of @ref DMA_LL_EC_MODE - @note: The circular buffer mode cannot be used if the memory to memory - data transfer direction is configured on the selected Channel - This feature can be modified afterwards using unitary function - @ref ll_dma_set_mode(). */ - - uint32_t src_increment_mode; /**< Specifies whether the Source address is incremented or decrement or not. - This parameter can be a value of @ref DMA_LL_EC_SOURCE - This feature can be modified afterwards using unitary function - @ref ll_dma_set_source_increment_mode(). */ - - uint32_t dst_increment_mode; /**< Specifies whether the Destination address is incremented or decrement or not. - This parameter can be a value of @ref DMA_LL_EC_DESTINATION - This feature can be modified afterwards using unitary function - @ref ll_dma_set_destination_increment_mode(). */ - - uint32_t src_data_width; /**< Specifies the Souce transfer width alignment(byte, half word, word). - This parameter can be a value of @ref DMA_LL_EC_SDATAALIGN - This feature can be modified afterwards using unitary function - @ref ll_dma_set_source_width(). */ - - uint32_t dst_data_width; /**< Specifies the Destination transfer width alignment(byte, half word, word). - This parameter can be a value of @ref DMA_LL_EC_DDATAALIGN - This feature can be modified afterwards using unitary function - @ref ll_dma_set_destination_width(). */ - - uint32_t block_size; /**< Specifies the number of data to transfer, in data unit. - The data unit is equal to the source buffer configuration set - in src_data_width parameters. - This parameter must be a value between Min_Data = 0 and Max_Data = 0x1FF - This feature can be modified afterwards using unitary function - @ref ll_dma_set_block_size(). */ - - uint32_t src_peripheral; /**< Specifies the Source peripheral type. - This parameter can be a value of @ref DMA_LL_EC_PERIPH - This feature can be modified afterwards using unitary function - @ref ll_dma_set_source_peripheral(). */ - - uint32_t dst_peripheral; /**< Specifies the Destination peripheral type. - This parameter can be a value of @ref DMA_LL_EC_PERIPH - This feature can be modified afterwards using unitary function - @ref ll_dma_set_destination_peripheral(). */ - - uint32_t priority; /**< Specifies the channel priority level. - This parameter can be a value of @ref DMA_LL_EC_PRIORITY - This feature can be modified afterwards using unitary function - @ref ll_dma_set_channel_priority_level(). */ -} ll_dma_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup DMA_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants - * @{ - */ - -/** @defgroup DMA_LL_EC_CHANNEL CHANNEL - * @{ - */ -#define LL_DMA_CHANNEL_0 ((uint32_t)0x00000000U) /**< DMA Channel 0 */ -#define LL_DMA_CHANNEL_1 ((uint32_t)0x00000001U) /**< DMA Channel 1 */ -#define LL_DMA_CHANNEL_2 ((uint32_t)0x00000002U) /**< DMA Channel 2 */ -#define LL_DMA_CHANNEL_3 ((uint32_t)0x00000003U) /**< DMA Channel 3 */ -#define LL_DMA_CHANNEL_4 ((uint32_t)0x00000004U) /**< DMA Channel 4 */ -#define LL_DMA_CHANNEL_5 ((uint32_t)0x00000005U) /**< DMA Channel 5 */ -#define LL_DMA_CHANNEL_6 ((uint32_t)0x00000006U) /**< DMA Channel 6 */ -#define LL_DMA_CHANNEL_7 ((uint32_t)0x00000007U) /**< DMA Channel 7 */ -#define LL_DMA_CHANNEL_ALL ((uint32_t)0xFFFF0000U) /**< DMA Channel all - (used only for function - @ref ll_dma_deinit()) */ -/** @} */ - -/** @defgroup DMA_LL_EC_DIRECTION Transfer Direction - * @{ - */ -#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_CTLL_TT_FC_M2M /**< Memory to memory direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_CTLL_TT_FC_M2P /**< Memory to peripheral direction */ -#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY DMA_CTLL_TT_FC_P2M /**< Peripheral to memory direction */ -#define LL_DMA_DIRECTION_PERIPH_TO_PERIPH DMA_CTLL_TT_FC_P2P /**< Peripheral to Peripheral direction */ -/** @} */ - - -/** @defgroup DMA_LL_EC_MODE Transfer mode - * @{ - */ -#define LL_DMA_MODE_SINGLE_BLOCK ((uint32_t)0x00000000U) /**< Single block */ -#define LL_DMA_MODE_MULTI_BLOCK_SRC_RELOAD DMA_CFGL_RELOAD_SRC /**< Multi-block: - src addr reload, - dst addr contiguous */ -#define LL_DMA_MODE_MULTI_BLOCK_DST_RELOAD DMA_CFGL_RELOAD_DST /**< Multi-block: - src addr contiguous, - dst addr reload */ -#define LL_DMA_MODE_MULTI_BLOCK_ALL_RELOAD (DMA_CFGL_RELOAD_SRC | DMA_CFGL_RELOAD_DST) /**< Multi-block: - src addr reload, - dst addr reload */ -/** @} */ - -/** @defgroup DMA_LL_EC_SOURCE Source increment mode - * @{ - */ -#define LL_DMA_SRC_INCREMENT DMA_CTLL_SINC_INC /**< Source Address increment */ -#define LL_DMA_SRC_DECREMENT DMA_CTLL_SINC_DEC /**< Source Address decrement */ -#define LL_DMA_SRC_NO_CHANGE DMA_CTLL_SINC_NO /**< Source Address no change */ -/** @} */ - -/** @defgroup DMA_LL_EC_DESTINATION Destination increment mode - * @{ - */ -#define LL_DMA_DST_INCREMENT DMA_CTLL_DINC_INC /**< Destination Address increment */ -#define LL_DMA_DST_DECREMENT DMA_CTLL_DINC_DEC /**< Destination Address decrement */ -#define LL_DMA_DST_NO_CHANGE DMA_CTLL_DINC_NO /**< Destination Address no change */ -/** @} */ - -/** @defgroup DMA_LL_EC_SRC_BURST Source burst transaction length - * @{ - */ -#define LL_DMA_SRC_BURST_LENGTH_1 DMA_CTLL_SRC_MSIZE_1 /**< Source Burst length: 1 word */ -#define LL_DMA_SRC_BURST_LENGTH_4 DMA_CTLL_SRC_MSIZE_4 /**< Source Burst length: 4 words */ -#define LL_DMA_SRC_BURST_LENGTH_8 DMA_CTLL_SRC_MSIZE_8 /**< Source Burst length: 8 words */ -#define LL_DMA_SRC_BURST_LENGTH_16 DMA_CTLL_SRC_MSIZE_16 /**< Source Burst length: 16 words */ -#define LL_DMA_SRC_BURST_LENGTH_32 DMA_CTLL_SRC_MSIZE_32 /**< Source Burst length: 32 words */ -#define LL_DMA_SRC_BURST_LENGTH_64 DMA_CTLL_SRC_MSIZE_64 /**< Source Burst length: 64 words */ -/** @} */ - -/** @defgroup DMA_LL_EC_DST_BURST Destination burst transaction length - * @{ - */ -#define LL_DMA_DST_BURST_LENGTH_1 DMA_CTLL_DST_MSIZE_1 /**< Destination Burst length: 1 word */ -#define LL_DMA_DST_BURST_LENGTH_4 DMA_CTLL_DST_MSIZE_4 /**< Destination Burst length: 4 words */ -#define LL_DMA_DST_BURST_LENGTH_8 DMA_CTLL_DST_MSIZE_8 /**< Destination Burst length: 8 words */ -#define LL_DMA_DST_BURST_LENGTH_16 DMA_CTLL_DST_MSIZE_16 /**< Destination Burst length: 16 words */ -#define LL_DMA_DST_BURST_LENGTH_32 DMA_CTLL_DST_MSIZE_32 /**< Destination Burst length: 32 words */ -#define LL_DMA_DST_BURST_LENGTH_64 DMA_CTLL_DST_MSIZE_64 /**< Destination Burst length: 64 words */ -/** @} */ - -/** @defgroup DMA_LL_EC_SDATAALIGN Source data alignment - * @{ - */ -#define LL_DMA_SDATAALIGN_BYTE DMA_CTLL_SRC_TR_WIDTH_8 /**< Source data alignment : Byte */ -#define LL_DMA_SDATAALIGN_HALFWORD DMA_CTLL_SRC_TR_WIDTH_16 /**< Source data alignment : HalfWord */ -#define LL_DMA_SDATAALIGN_WORD DMA_CTLL_SRC_TR_WIDTH_32 /**< Source data alignment : Word */ -/** @} */ - -/** @defgroup DMA_LL_EC_DDATAALIGN Destination data alignment - * @{ - */ -#define LL_DMA_DDATAALIGN_BYTE DMA_CTLL_DST_TR_WIDTH_8 /**< Destination data alignment : Byte */ -#define LL_DMA_DDATAALIGN_HALFWORD DMA_CTLL_DST_TR_WIDTH_16 /**< Destination data alignment : HalfWord */ -#define LL_DMA_DDATAALIGN_WORD DMA_CTLL_DST_TR_WIDTH_32 /**< Destination data alignment : Word */ -/** @} */ - -/** @defgroup DMA_LL_EC_PRIORITY Transfer Priority level - * @{ - */ -#define LL_DMA_PRIORITY_0 DMA_CFGL_CH_PRIOR_0 /**< Priority level : 0 */ -#define LL_DMA_PRIORITY_1 DMA_CFGL_CH_PRIOR_1 /**< Priority level : 1 */ -#define LL_DMA_PRIORITY_2 DMA_CFGL_CH_PRIOR_2 /**< Priority level : 2 */ -#define LL_DMA_PRIORITY_3 DMA_CFGL_CH_PRIOR_3 /**< Priority level : 3 */ -#define LL_DMA_PRIORITY_4 DMA_CFGL_CH_PRIOR_4 /**< Priority level : 4 */ -#define LL_DMA_PRIORITY_5 DMA_CFGL_CH_PRIOR_5 /**< Priority level : 5 */ -#define LL_DMA_PRIORITY_6 DMA_CFGL_CH_PRIOR_6 /**< Priority level : 6 */ -#define LL_DMA_PRIORITY_7 DMA_CFGL_CH_PRIOR_7 /**< Priority level : 7 */ -/** @} */ - -/** @defgroup DMA_LL_EC_SHANDSHAKING Source handshake interface - * @{ - */ -#define LL_DMA_SHANDSHAKING_HW ((uint32_t)0x00000000U) /**< Source: hardware handshake */ -#define LL_DMA_SHANDSHAKING_SW DMA_CFGL_HS_SEL_SRC /**< Source: software handshake */ -/** @} */ - -/** @defgroup DMA_LL_EC_DHANDSHAKING Destination handshake interface - * @{ - */ -#define LL_DMA_DHANDSHAKING_HW ((uint32_t)0x00000000U) /**< Destination: hardware handshake */ -#define LL_DMA_DHANDSHAKING_SW DMA_CFGL_HS_SEL_DST /**< Destination: software handshake */ -/** @} */ - -/** @defgroup DMA_LL_EC_PERIPH DMA Peripheral type - * @{ - */ -#define LL_DMA_PERIPH_SPIM_TX ((uint32_t)0x00000000U) /**< DMA Peripheral type is SPIM TX */ -#define LL_DMA_PERIPH_SPIM_RX ((uint32_t)0x00000001U) /**< DMA Peripheral type is SPIM RX */ -#define LL_DMA_PERIPH_SPIS_TX ((uint32_t)0x00000002U) /**< DMA Peripheral type is SPIS TX */ -#define LL_DMA_PERIPH_SPIS_RX ((uint32_t)0x00000003U) /**< DMA Peripheral type is SPIS RX */ -#define LL_DMA_PERIPH_QSPI0_TX ((uint32_t)0x00000004U) /**< DMA Peripheral type is QSPI0 TX */ -#define LL_DMA_PERIPH_QSPI0_RX ((uint32_t)0x00000005U) /**< DMA Peripheral type is QSPI0 RX */ -#define LL_DMA_PERIPH_I2C0_TX ((uint32_t)0x00000006U) /**< DMA Peripheral type is I2C0 TX */ -#define LL_DMA_PERIPH_I2C0_RX ((uint32_t)0x00000007U) /**< DMA Peripheral type is I2C0 RX */ -#define LL_DMA_PERIPH_I2C1_TX ((uint32_t)0x00000008U) /**< DMA Peripheral type is I2C1 TX */ -#define LL_DMA_PERIPH_I2C1_RX ((uint32_t)0x00000009U) /**< DMA Peripheral type is I2C1 RX */ -#define LL_DMA_PERIPH_I2S_S_TX ((uint32_t)0x00000008U) /**< DMA Peripheral type is I2S_S TX */ -#define LL_DMA_PERIPH_I2S_S_RX ((uint32_t)0x00000009U) /**< DMA Peripheral type is I2S_S RX */ -#define LL_DMA_PERIPH_UART0_TX ((uint32_t)0x0000000AU) /**< DMA Peripheral type is UART0 TX */ -#define LL_DMA_PERIPH_UART0_RX ((uint32_t)0x0000000BU) /**< DMA Peripheral type is UART0 RX */ -#define LL_DMA_PERIPH_QSPI1_TX ((uint32_t)0x0000000CU) /**< DMA peripheral type is QSPI1 TX */ -#define LL_DMA_PERIPH_QSPI1_RX ((uint32_t)0x0000000DU) /**< DMA peripheral type is QSPI1 RX */ -#define LL_DMA_PERIPH_I2S_M_TX ((uint32_t)0x0000000CU) /**< DMA Peripheral type is I2S_M TX */ -#define LL_DMA_PERIPH_I2S_M_RX ((uint32_t)0x0000000DU) /**< DMA Peripheral type is I2S_M RX */ -#define LL_DMA_PERIPH_SNSADC ((uint32_t)0x0000000EU) /**< DMA peripheral type is SNSADC */ -#define LL_DMA_PERIPH_MEM ((uint32_t)0x0000000FU) /**< DMA peripheral type is Memory */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros - * @{ - */ - -/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in DMA register - * @param __instance__ DMA instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_DMA_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__.__REG__, (__VALUE__)) - -/** - * @brief Read a value in DMA register - * @param __instance__ DMA instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_DMA_ReadReg(__instance__, __REG__) READ_REG(__instance__.__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMA_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup DMA_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable DMA Module. - * @note This function is used to enable the DMA Module, which must be done before any - * channel is enabled. - * - * Register|BitsName - * --------|-------- - * CFG_REG | CFG_EN - * - * @param DMAx DMA instance. - * @retval None - */ -__STATIC_INLINE void ll_dma_enable(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->MISCELLANEOU.CFG, DMA_MODULE_CFG_EN); -} - -/** - * @brief Disable DMA Module. - * @note If the ll_dma_disable() function is called while any dma channel is still active, - * the ll_dma_is_enable() function still return 1 to indicate that there are channels - * still active until hardware has terminated all cativity on all channels, at which - * point the ll_dma_is_enable() function returns 0. - * - * Register|BitsName - * --------|-------- - * CFG_REG | CFG_EN - * - * @param DMAx DMA instance. - * @retval None - */ -__STATIC_INLINE void ll_dma_disable(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->MISCELLANEOU.CFG, 0); -} - -/** - * @brief Check if DMA Module is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CFG_REG | CFG_EN - * - * @param DMAx DMA instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enable(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->MISCELLANEOU.CFG, DMA_MODULE_CFG_EN) == DMA_MODULE_CFG_EN); -} - -/** - * @brief Enable DMA channel. - * @note When the DMA Module is disabled, then call this function to DMA_CFG_REG register - * is ignored and call ll_dma_disable_channel() function will always returns 0. - * - * Register|BitsName - * --------|-------- - * CH_EN_REG | CH_EN_WE&CH_EN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_channel(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->MISCELLANEOU.CH_EN, (1 << (channel + DMA_CH_WE_EN_Pos)) + (1 << channel)); -} - -/** - * @brief Disable DMA channel. - * - * Register|BitsName - * --------|-------- - * CH_EN_REG | CH_EN_WE&CH_EN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_channel(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->MISCELLANEOU.CH_EN, (1 << (channel + DMA_CH_WE_EN_Pos))); -} - -/** - * @brief Check if DMA channel is enabled or disabled. - * @note Software can therefore poll this function to determine when channel is free - * for a new DMA transfer. - * - * Register|BitsName - * --------|-------- - * CH_EN_REG | CH_EN_WE&CH_EN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enabled_channel(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->MISCELLANEOU.CH_EN, (1 << channel)) ? 1 : 0; -} - -/** - * @brief Suspend a DMA channel transfer. - * @note Suspends all DMA data transfers from the source until the ll_dma_resume_channel() - * function is called. The function may be called after enabling the DMA channel. - * - * Register|BitsName - * --------|-------- - * CFGL | CH_SUSP - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_suspend_channel(dma_regs_t *DMAx, uint32_t channel) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_CH_SUSP, DMA_CFGL_CH_SUSP); -} - -/** - * @brief Resume a DMA channel. - * @note The function may be called after enabling the DMA channel. - * - * Register|BitsName - * --------|-------- - * CFGL | CH_SUSP - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_resume_channel(dma_regs_t *DMAx, uint32_t channel) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_CH_SUSP, 0); -} - -/** - * @brief Check if DMA channel is suspended or resumed. - * - * Register|BitsName - * --------|-------- - * CFGL | CH_SUSP - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_suspended(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_CH_SUSP) == DMA_CFGL_CH_SUSP); -} - -/** - * @brief Check if DMA channel FIFO is empty. - * - * Register|BitsName - * --------|-------- - * CFGL | FIFO_EMPTY - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_empty_fifo(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_FIFO_EMPTY) == DMA_CFGL_FIFO_EMPTY); -} - -/** - * @brief Configure all parameters link to DMA transfer. - * - * Register|BitsName - * --------|-------- - * CCR | DIR - * CCR | MEM2MEM - * CCR | CIRC - * CCR | PINC - * CCR | MINC - * CCR | PSIZE - * CCR | MSIZE - * CCR | PL - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param configuration This parameter must be a combination of all the following values: - * @arg @ref LL_DMA_MODE_SINGLE_BLOCK or @ref LL_DMA_MODE_MULTI_BLOCK_SRC_RELOAD - * or @ref LL_DMA_MODE_MULTI_BLOCK_DST_RELOAD or @ref LL_DMA_MODE_MULTI_BLOCK_ALL_RELOAD - * @arg @ref LL_DMA_SRC_INCREMENT or @ref LL_DMA_SRC_DECREMENT or @ref LL_DMA_SRC_NO_CHANGE - * @arg @ref LL_DMA_DST_INCREMENT or @ref LL_DMA_DST_DECREMENT or @ref LL_DMA_DST_NO_CHANGE - * @arg @ref LL_DMA_SDATAALIGN_BYTE or @ref LL_DMA_SDATAALIGN_HALFWORD or @ref LL_DMA_SDATAALIGN_WORD - * @arg @ref LL_DMA_DDATAALIGN_BYTE or @ref LL_DMA_DDATAALIGN_HALFWORD or @ref LL_DMA_DDATAALIGN_WORD - * @arg @ref LL_DMA_SRC_BURST_LENGTH_1 or @ref LL_DMA_SRC_BURST_LENGTH_4 or @ref LL_DMA_SRC_BURST_LENGTH_8 - * @arg @ref LL_DMA_DST_BURST_LENGTH_1 or @ref LL_DMA_DST_BURST_LENGTH_4 or @ref LL_DMA_DST_BURST_LENGTH_8 - * @retval None - */ -__STATIC_INLINE void ll_dma_config_transfer(dma_regs_t *DMAx, uint32_t channel, uint32_t configuration) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DST_TR_WIDTH | DMA_CTLL_SRC_TR_WIDTH | \ - DMA_CTLL_DINC | DMA_CTLL_SINC | DMA_CTLL_DST_MSIZE | DMA_CTLL_SRC_MSIZE | DMA_CTLL_TT_FC, - configuration); -} - -/** - * @brief Set Data transfer direction (read from peripheral or from memory). - * - * Register|BitsName - * --------|-------- - * CTL_LO | TT_FC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_PERIPH - * @retval None - */ -__STATIC_INLINE void ll_dma_set_data_transfer_direction(dma_regs_t *DMAx, uint32_t channel, uint32_t direction) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_TT_FC, direction); -} - -/** - * @brief Get Data transfer direction (read from peripheral or from memory). - * - * Register|BitsName - * --------|-------- - * CTL_LO | TT_FC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_PERIPH - */ -__STATIC_INLINE uint32_t ll_dma_get_data_transfer_direction(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_TT_FC); -} - -/** - * @brief Set DMA mode Single block or Multi block. - * @note The circular buffer mode cannot be used if the memory-to-memory - * data transfer is configured on the selected Channel. - * - * Register|BitsName - * --------|-------- - * CFG_LO | RELOAD_DST - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param mode This parameter can be one of the following values: - * @arg @ref LL_DMA_MODE_SINGLE_BLOCK - * @arg @ref LL_DMA_MODE_MULTI_BLOCK_SRC_RELOAD - * @arg @ref LL_DMA_MODE_MULTI_BLOCK_DST_RELOAD - * @arg @ref LL_DMA_MODE_MULTI_BLOCK_ALL_RELOAD - * @retval None - */ -__STATIC_INLINE void ll_dma_set_mode(dma_regs_t *DMAx, uint32_t channel, uint32_t mode) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_RELOAD_DST | DMA_CFGL_RELOAD_SRC, mode); -} - - -/** - * @brief Get DMA mode circular or normal. - * - * Register|BitsName - * --------|-------- - * CFG_LO | RELOAD_DST - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MODE_SINGLE_BLOCK - * @arg @ref LL_DMA_MODE_MULTI_BLOCK_SRC_RELOAD - * @arg @ref LL_DMA_MODE_MULTI_BLOCK_DST_RELOAD - * @arg @ref LL_DMA_MODE_MULTI_BLOCK_ALL_RELOAD - */ -__STATIC_INLINE uint32_t ll_dma_get_mode(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_RELOAD_DST | DMA_CFGL_RELOAD_SRC); -} - -/** - * @brief Set Source increment mode. - * - * Register|BitsName - * --------|-------- - * CTL_LO | SINC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param src_increment_mode This parameter can be one of the following values: - * @arg @ref LL_DMA_SRC_INCREMENT - * @arg @ref LL_DMA_SRC_DECREMENT - * @arg @ref LL_DMA_SRC_NO_CHANGE - * @retval None - */ -__STATIC_INLINE void ll_dma_set_source_increment_mode(dma_regs_t *DMAx, uint32_t channel, uint32_t src_increment_mode) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_SINC, src_increment_mode); -} - -/** - * @brief Get Source increment mode. - * - * Register|BitsName - * --------|-------- - * CTL_LO | SINC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_SRC_INCREMENT - * @arg @ref LL_DMA_SRC_DECREMENT - * @arg @ref LL_DMA_SRC_NO_CHANGE - */ -__STATIC_INLINE uint32_t ll_dma_get_source_increment_mode(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_SINC); -} - -/** - * @brief Set Destination increment mode. - * - * Register|BitsName - * --------|-------- - * CTL_LO | DINC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param dst_increment_mode This parameter can be one of the following values: - * @arg @ref LL_DMA_DST_INCREMENT - * @arg @ref LL_DMA_DST_DECREMENT - * @arg @ref LL_DMA_DST_NO_CHANGE - * @retval None - */ -__STATIC_INLINE void ll_dma_set_destination_increment_mode(dma_regs_t *DMAx, uint32_t channel, - uint32_t dst_increment_mode) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DINC, dst_increment_mode); -} - -/** - * @brief Get Destination increment mode. - * - * Register|BitsName - * --------|-------- - * CTL_LO | DINC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DST_INCREMENT - * @arg @ref LL_DMA_DST_DECREMENT - * @arg @ref LL_DMA_DST_NO_CHANGE - */ -__STATIC_INLINE uint32_t ll_dma_get_destination_increment_mode(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DINC); -} - -/** - * @brief Set Source transfer width. - * - * Register|BitsName - * --------|-------- - * CTL_LO | SRC_TR_WIDTH - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param src_width This parameter can be one of the following values: - * @arg @ref LL_DMA_SDATAALIGN_BYTE - * @arg @ref LL_DMA_SDATAALIGN_HALFWORD - * @arg @ref LL_DMA_SDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void ll_dma_set_source_width(dma_regs_t *DMAx, uint32_t channel, uint32_t src_width) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_SRC_TR_WIDTH, src_width); -} - -/** - * @brief Get Source transfer width. - * - * Register|BitsName - * --------|-------- - * CTL_LO | SRC_TR_WIDTH - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_SDATAALIGN_BYTE - * @arg @ref LL_DMA_SDATAALIGN_HALFWORD - * @arg @ref LL_DMA_SDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t ll_dma_get_source_width(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_SRC_TR_WIDTH); -} - -/** - * @brief Set Destination transfer width. - * - * Register|BitsName - * --------|-------- - * CTL_LO | DST_TR_WIDTH - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param dst_width This parameter can be one of the following values: - * @arg @ref LL_DMA_DDATAALIGN_BYTE - * @arg @ref LL_DMA_DDATAALIGN_HALFWORD - * @arg @ref LL_DMA_DDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void ll_dma_set_destination_width(dma_regs_t *DMAx, uint32_t channel, uint32_t dst_width) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DST_TR_WIDTH, dst_width); -} - -/** - * @brief Get Destination transfer width. - * - * Register|BitsName - * --------|-------- - * CTL_LO | DST_TR_WIDTH - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DDATAALIGN_BYTE - * @arg @ref LL_DMA_DDATAALIGN_HALFWORD - * @arg @ref LL_DMA_DDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t ll_dma_get_destination_width(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DST_TR_WIDTH); -} - -/** - * @brief Set Source Burst Transaction Length. - * - * Register|BitsName - * --------|-------- - * CTL_LO | SRC_MSIZE - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param burst_length This parameter can be one of the following values: - * @arg @ref LL_DMA_SRC_BURST_LENGTH_1 - * @arg @ref LL_DMA_SRC_BURST_LENGTH_4 - * @arg @ref LL_DMA_SRC_BURST_LENGTH_8 - * @retval None - */ -__STATIC_INLINE void ll_dma_set_source_burst_length(dma_regs_t *DMAx, uint32_t channel, uint32_t burst_length) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_SRC_MSIZE, burst_length); -} - -/** - * @brief Get Burst Transaction Length. - * - * Register|BitsName - * --------|-------- - * CTL_LO | SRC_MSIZE - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_SRC_BURST_LENGTH_1 - * @arg @ref LL_DMA_SRC_BURST_LENGTH_4 - * @arg @ref LL_DMA_SRC_BURST_LENGTH_8 - */ -__STATIC_INLINE uint32_t ll_dma_get_source_burst_length(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_SRC_MSIZE); -} - -/** - * @brief Set Destination Burst Transaction Length. - * - * Register|BitsName - * --------|-------- - * CTL_LO | DST_MSIZE - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param burst_length This parameter can be one of the following values: - * @arg @ref LL_DMA_DST_BURST_LENGTH_1 - * @arg @ref LL_DMA_DST_BURST_LENGTH_4 - * @arg @ref LL_DMA_DST_BURST_LENGTH_8 - * @retval None - */ -__STATIC_INLINE void ll_dma_set_destination_burst_length(dma_regs_t *DMAx, uint32_t channel, uint32_t burst_length) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DST_MSIZE, burst_length); -} - -/** - * @brief Get Destination Burst Transaction Length. - * - * Register|BitsName - * --------|-------- - * CTL_LO | DST_MSIZE - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DST_BURST_LENGTH_1 - * @arg @ref LL_DMA_DST_BURST_LENGTH_4 - * @arg @ref LL_DMA_DST_BURST_LENGTH_8 - */ -__STATIC_INLINE uint32_t ll_dma_get_destination_burst_length(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_DST_MSIZE); -} - -/** - * @brief Set Channel priority level. - * - * Register|BitsName - * --------|-------- - * CFG_LO | CH_PRIOR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param priority This parameter can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_0 - * @arg @ref LL_DMA_PRIORITY_1 - * @arg @ref LL_DMA_PRIORITY_2 - * @arg @ref LL_DMA_PRIORITY_3 - * @arg @ref LL_DMA_PRIORITY_4 - * @arg @ref LL_DMA_PRIORITY_5 - * @arg @ref LL_DMA_PRIORITY_6 - * @arg @ref LL_DMA_PRIORITY_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_set_channel_priority_level(dma_regs_t *DMAx, uint32_t channel, uint32_t priority) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_CH_PRIOR, priority); -} - -/** - * @brief Get Channel priority level. - * - * Register|BitsName - * --------|-------- - * CFG_LO | CH_PRIOR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_0 - * @arg @ref LL_DMA_PRIORITY_1 - * @arg @ref LL_DMA_PRIORITY_2 - * @arg @ref LL_DMA_PRIORITY_3 - * @arg @ref LL_DMA_PRIORITY_4 - * @arg @ref LL_DMA_PRIORITY_5 - * @arg @ref LL_DMA_PRIORITY_6 - * @arg @ref LL_DMA_PRIORITY_7 - */ -__STATIC_INLINE uint32_t ll_dma_get_channel_priority_level(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_CH_PRIOR); -} - -/** - * @brief Set the block size of a transfer. - * @note This action has no effect if channel is enabled. - * - * Register|BitsName - * --------|-------- - * CTL_HI | BLOCK_TS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param block_size Between Min_Data = 0 and Max_Data = 0xFFF - * @retval None - */ -__STATIC_INLINE void ll_dma_set_block_size(dma_regs_t *DMAx, uint32_t channel, uint32_t block_size) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_HI, DMA_CTLH_BLOCK_TS, block_size); -} - -/** - * @brief Get the block size of a transfer. - * @note Once the channel is enabled, the return value indicate the - * remaining bytes to be transmitted. - * - * Register|BitsName - * --------|-------- - * CTL_HI | BLOCK_TS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Between Min_Data = 0 and Max_Data = 0xFFF - */ -__STATIC_INLINE uint32_t ll_dma_get_block_size(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_HI, DMA_CTLH_BLOCK_TS); -} - -/** - * @brief Configure the Source and Destination addresses. - * @note Each IP using DMA provides an API to get directly the register adress (LL_PPP_DMA_GetRegAddr) - * - * Register|BitsName - * --------|-------- - * SAR | SAR - * DAR | DAR - * CTL_LO | TT_FC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param src_address Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - * @param dst_address Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - * @param direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_PERIPH - * @retval None - */ -__STATIC_INLINE void ll_dma_config_address(dma_regs_t *DMAx, uint32_t channel, uint32_t src_address, - uint32_t dst_address, uint32_t direction) -{ - WRITE_REG(DMAx->CHANNEL[channel].SAR, src_address); - WRITE_REG(DMAx->CHANNEL[channel].DAR, dst_address); - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_TT_FC, direction); -} - -/** - * @brief Set the Source address. - * - * Register|BitsName - * --------|-------- - * SAR | SAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param address Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_dma_set_source_address(dma_regs_t *DMAx, uint32_t channel, uint32_t address) -{ - WRITE_REG(DMAx->CHANNEL[channel].SAR, address); -} - -/** - * @brief Set the Destination address. - * - * Register|BitsName - * --------|-------- - * DAR | DAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param address Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_dma_set_destination_address(dma_regs_t *DMAx, uint32_t channel, uint32_t address) -{ - WRITE_REG(DMAx->CHANNEL[channel].DAR, address); -} - -/** - * @brief Get Source address. - * - * Register|BitsName - * --------|-------- - * SAR | SAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_dma_get_source_address(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_REG(DMAx->CHANNEL[channel].SAR); -} - -/** - * @brief Get Destination address. - * - * Register|BitsName - * --------|-------- - * DAR | DAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_dma_get_destination_address(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_REG(DMAx->CHANNEL[channel].DAR); -} - -/** - * @brief Set the Memory to Memory Source address. - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * - * Register|BitsName - * --------|-------- - * SAR | SAR - * CTL_LO | TT_FC - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param address Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_dma_set_m2m_src_address(dma_regs_t *DMAx, uint32_t channel, uint32_t address) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_TT_FC, 0); - WRITE_REG(DMAx->CHANNEL[channel].SAR, address); -} - -/** - * @brief Set the Memory to Memory Destination address. - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * - * Register|BitsName - * --------|-------- - * DAR | DAR - * CTL_LO | TT_FC - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param address Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_dma_set_m2m_dst_address(dma_regs_t *DMAx, uint32_t channel, uint32_t address) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_TT_FC, 0); - WRITE_REG(DMAx->CHANNEL[channel].DAR, address); -} - -/** - * @brief Get the Memory to Memory Source address. - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * - * Register|BitsName - * --------|-------- - * SAR | SAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_dma_get_m2m_src_address(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_REG(DMAx->CHANNEL[channel].SAR); -} - -/** - * @brief Get the Memory to Memory Destination address. - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * - * Register|BitsName - * --------|-------- - * DAR | DAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_dma_get_m2m_dst_address(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_REG(DMAx->CHANNEL[channel].DAR); -} - -/** - * @brief Set source peripheral for DMA instance on Channel x. - * - * Register|BitsName - * --------|-------- - * CFG_HI | SRC_PER - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param peripheral This parameter can be one of the following values: - * @arg @ref LL_DMA_PERIPH_SPIM_TX - * @arg @ref LL_DMA_PERIPH_SPIM_RX - * @arg @ref LL_DMA_PERIPH_SPIS_TX - * @arg @ref LL_DMA_PERIPH_SPIS_RX - * @arg @ref LL_DMA_PERIPH_QSPI0_TX - * @arg @ref LL_DMA_PERIPH_QSPI0_RX - * @arg @ref LL_DMA_PERIPH_I2C0_TX - * @arg @ref LL_DMA_PERIPH_I2C0_RX - * @arg @ref LL_DMA_PERIPH_I2C1_TX - * @arg @ref LL_DMA_PERIPH_I2C1_RX - * @arg @ref LL_DMA_PERIPH_I2S_S_TX - * @arg @ref LL_DMA_PERIPH_I2S_S_RX - * @arg @ref LL_DMA_PERIPH_UART0_TX - * @arg @ref LL_DMA_PERIPH_UART0_RX - * @arg @ref LL_DMA_PERIPH_QSPI1_TX - * @arg @ref LL_DMA_PERIPH_QSPI1_RX - * @arg @ref LL_DMA_PERIPH_I2S_M_TX - * @arg @ref LL_DMA_PERIPH_I2S_M_RX - * @arg @ref LL_DMA_PERIPH_SNSADC - * @retval None - */ -__STATIC_INLINE void ll_dma_set_source_peripheral(dma_regs_t *DMAx, uint32_t channel, uint32_t peripheral) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_HI, DMA_CFGH_SRC_PER, (peripheral << DMA_CFGH_SRC_PER_Pos)); -} - -/** - * @brief Get source peripheral for DMA instance on Channel x. - * - * Register|BitsName - * --------|-------- - * CFG_HI | SRC_PER - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PERIPH_SPIM_TX - * @arg @ref LL_DMA_PERIPH_SPIM_RX - * @arg @ref LL_DMA_PERIPH_SPIS_TX - * @arg @ref LL_DMA_PERIPH_SPIS_RX - * @arg @ref LL_DMA_PERIPH_QSPI0_TX - * @arg @ref LL_DMA_PERIPH_QSPI0_RX - * @arg @ref LL_DMA_PERIPH_I2C0_TX - * @arg @ref LL_DMA_PERIPH_I2C0_RX - * @arg @ref LL_DMA_PERIPH_I2C1_TX - * @arg @ref LL_DMA_PERIPH_I2C1_RX - * @arg @ref LL_DMA_PERIPH_I2S_S_TX - * @arg @ref LL_DMA_PERIPH_I2S_S_RX - * @arg @ref LL_DMA_PERIPH_UART0_TX - * @arg @ref LL_DMA_PERIPH_UART0_RX - * @arg @ref LL_DMA_PERIPH_QSPI1_TX - * @arg @ref LL_DMA_PERIPH_QSPI1_RX - * @arg @ref LL_DMA_PERIPH_I2S_M_TX - * @arg @ref LL_DMA_PERIPH_I2S_M_RX - * @arg @ref LL_DMA_PERIPH_SNSADC - */ -__STATIC_INLINE uint32_t ll_dma_get_source_peripheral(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_HI, DMA_CFGH_SRC_PER) >> DMA_CFGH_SRC_PER_Pos; -} - -/** - * @brief Set destination peripheral for DMA instance on Channel x. - * - * Register|BitsName - * --------|-------- - * CFG_HI | DST_PER - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param peripheral This parameter can be one of the following values: - * @arg @ref LL_DMA_PERIPH_SPIM_TX - * @arg @ref LL_DMA_PERIPH_SPIM_RX - * @arg @ref LL_DMA_PERIPH_SPIS_TX - * @arg @ref LL_DMA_PERIPH_SPIS_RX - * @arg @ref LL_DMA_PERIPH_QSPI0_TX - * @arg @ref LL_DMA_PERIPH_QSPI0_RX - * @arg @ref LL_DMA_PERIPH_I2C0_TX - * @arg @ref LL_DMA_PERIPH_I2C0_RX - * @arg @ref LL_DMA_PERIPH_I2C1_TX - * @arg @ref LL_DMA_PERIPH_I2C1_RX - * @arg @ref LL_DMA_PERIPH_I2S_S_TX - * @arg @ref LL_DMA_PERIPH_I2S_S_RX - * @arg @ref LL_DMA_PERIPH_UART0_TX - * @arg @ref LL_DMA_PERIPH_UART0_RX - * @arg @ref LL_DMA_PERIPH_QSPI1_TX - * @arg @ref LL_DMA_PERIPH_QSPI1_RX - * @arg @ref LL_DMA_PERIPH_I2S_M_TX - * @arg @ref LL_DMA_PERIPH_I2S_M_RX - * @arg @ref LL_DMA_PERIPH_SNSADC - * @retval None - */ -__STATIC_INLINE void ll_dma_set_destination_peripheral(dma_regs_t *DMAx, uint32_t channel, uint32_t peripheral) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_HI, DMA_CFGH_DST_PER, (peripheral << DMA_CFGH_DST_PER_Pos)); -} - -/** - * @brief Get destination peripheral for DMA instance on Channel x. - * - * Register|BitsName - * --------|-------- - * CFG_HI | DST_PER - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PERIPH_SPIM_TX - * @arg @ref LL_DMA_PERIPH_SPIM_RX - * @arg @ref LL_DMA_PERIPH_SPIS_TX - * @arg @ref LL_DMA_PERIPH_SPIS_RX - * @arg @ref LL_DMA_PERIPH_QSPI0_TX - * @arg @ref LL_DMA_PERIPH_QSPI0_RX - * @arg @ref LL_DMA_PERIPH_I2C0_TX - * @arg @ref LL_DMA_PERIPH_I2C0_RX - * @arg @ref LL_DMA_PERIPH_I2C1_TX - * @arg @ref LL_DMA_PERIPH_I2C1_RX - * @arg @ref LL_DMA_PERIPH_I2S_S_TX - * @arg @ref LL_DMA_PERIPH_I2S_S_RX - * @arg @ref LL_DMA_PERIPH_UART0_TX - * @arg @ref LL_DMA_PERIPH_UART0_RX - * @arg @ref LL_DMA_PERIPH_QSPI1_TX - * @arg @ref LL_DMA_PERIPH_QSPI1_RX - * @arg @ref LL_DMA_PERIPH_I2S_M_TX - * @arg @ref LL_DMA_PERIPH_I2S_M_RX - * @arg @ref LL_DMA_PERIPH_SNSADC - */ -__STATIC_INLINE uint32_t ll_dma_get_destination_peripheral(dma_regs_t *DMAx, uint32_t channel) -{ - return READ_BITS(DMAx->CHANNEL[channel].CTL_HI, DMA_CFGH_DST_PER) >> DMA_CFGH_DST_PER_Pos; -} - -/** - * @brief Set source and destination source handshaking interface. - * - * Register|BitsName - * --------|-------- - * CFG_HI | DST_PER - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param src_handshaking This parameter can be one of the following values: - * @arg @ref LL_DMA_SHANDSHAKING_HW - * @arg @ref LL_DMA_SHANDSHAKING_HW - * @param dst_handshaking This parameter can be one of the following values: - * @arg @ref LL_DMA_DHANDSHAKING_HW - * @arg @ref LL_DMA_DHANDSHAKING_HW - * @retval None - */ -__STATIC_INLINE void ll_dma_select_handshaking(dma_regs_t *DMAx, uint32_t channel, - uint32_t src_handshaking, uint32_t dst_handshaking) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CFG_LO, DMA_CFGL_HS_SEL_SRC | DMA_CFGL_HS_SEL_DST, - src_handshaking | dst_handshaking); -} - -/** - * @brief Source Single Transaction Request. - * - * Register|BitsName - * --------|-------- - * SGL_REQ_SRC | REQ_SRC_WE&REQ_SRC - * REQ_SRC | SRC_WE&SRC - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_src_single_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.SGL_RQ_SRC, (1 << (channel + DMA_SGL_REQ_SRC_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.REQ_SRC, (1 << (channel + DMA_REQ_SRC_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Source Burst Transaction Request. - * - * Register|BitsName - * --------|-------- - * REQ_SRC | SRC_WE&SRC - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_src_burst_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.REQ_SRC, (1 << (channel + DMA_REQ_SRC_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Source Last Single Transaction Request. - * - * Register|BitsName - * --------|-------- - * SGL_REQ_SRC | REQ_SRC_WE&REQ_SRC - * LST_SRC | LST_SRC_WE&LST_SRC - * REQ_SRC | SRC_WE&SRC - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_src_last_single_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.SGL_RQ_SRC, (1 << (channel + DMA_SGL_REQ_SRC_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.LST_SRC, (1 << (channel + DMA_LST_SRC_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.REQ_SRC, (1 << (channel + DMA_REQ_SRC_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Source Last Burst Transaction Request. - * - * Register|BitsName - * --------|-------- - * LST_SRC | LST_SRC_WE&LST_SRC - * REQ_SRC | SRC_WE&SRC - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_src_last_burst_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.LST_SRC, (1 << (channel + DMA_LST_SRC_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.REQ_SRC, (1 << (channel + DMA_REQ_SRC_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Destination Single Transaction Request. - * - * Register|BitsName - * --------|-------- - * SGL_REQ_DST | REQ_DST_WE&REQ_DST - * REQ_DST | DST_WE&DST - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_dst_single_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.SGL_RQ_DST, (1 << (channel + DMA_SGL_REQ_DST_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.REQ_DST, (1 << (channel + DMA_REQ_DST_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Destination Burst Transaction Request. - * - * Register|BitsName - * --------|-------- - * REQ_DST | DST_WE&DST - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_dst_burst_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.REQ_DST, (1 << (channel + DMA_REQ_DST_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Destination Last Single Transaction Request. - * - * Register|BitsName - * --------|-------- - * SGL_REQ_DST | REQ_DST_WE&REQ_DST - * LST_DST | LST_DST_WE&LST_DST - * REQ_DST | DST_WE&DST - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_dst_last_single_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.SGL_RQ_DST, (1 << (channel + DMA_SGL_REQ_DST_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.LST_DST, (1 << (channel + DMA_LST_DST_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.REQ_DST, (1 << (channel + DMA_REQ_DST_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Destination Last Burst Transaction Request. - * - * Register|BitsName - * --------|-------- - * LST_DST | LST_DST_WE&LST_DST - * REQ_DST | DST_WE&DST - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_req_dst_last_burst_transaction(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->HANDSHAKE.LST_DST, (1 << (channel + DMA_LST_DST_WE_Pos)) + (1 << channel)); - WRITE_REG(DMAx->HANDSHAKE.REQ_DST, (1 << (channel + DMA_REQ_DST_WE_Pos)) + (1 << channel)); -} - -/** @} */ - -/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get DMA Module global transfer complete interrupt status. - * - * Register|BitsName - * --------|-------- - * STATUS_INT | TFR - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_gtfr(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_EVT, DMA_STAT_INT_TFR) == DMA_STAT_INT_TFR); -} - -/** - * @brief Get DMA Module global block complete interrupt status. - * - * Register|BitsName - * --------|-------- - * STATUS_INT | BLOCK - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_gblk(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_EVT, DMA_STAT_INT_BLK) == DMA_STAT_INT_BLK); -} - -/** - * @brief Get DMA Module global source transaction complete interrupt status. - * - * Register|BitsName - * --------|-------- - * STATUS_INT | SRCT - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_gsrct(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_EVT, DMA_STAT_INT_SRC) == DMA_STAT_INT_SRC); -} - -/** - * @brief Get DMA Module global destination transaction complete interrupt status. - * - * Register|BitsName - * --------|-------- - * STATUS_INT | DSTT - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_gdstt(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_EVT, DMA_STAT_INT_DST) == DMA_STAT_INT_DST); -} - -/** - * @brief Get DMA Module global error interrupt status. - * - * Register|BitsName - * --------|-------- - * STATUS_INT | ERR - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_gerr(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_EVT, DMA_STAT_INT_ERR) == DMA_STAT_INT_ERR); -} - -/** - * @brief Indicate the Raw Status of IntTfr Interrupt flag. - * - * Register|BitsName - * --------|-------- - * RAW_TFR | RAW - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_rtfr(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.RAW_CH_EVT[0], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the Raw Status of IntBlock Interrupt flag. - * - * Register|BitsName - * --------|-------- - * RAW_BLK | RAW - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_rblk(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.RAW_CH_EVT[ITEM_2], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the Raw Status of IntSrcTran Interrupt flag. - * - * Register|BitsName - * --------|-------- - * RAW_SRC_TRN | RAW - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_rsrct(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.RAW_CH_EVT[ITEM_4], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the Raw Status of IntDstTran Interrupt flag. - * - * Register|BitsName - * --------|-------- - * RAW_DST_TRN | RAW - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_rdstt(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.RAW_CH_EVT[ITEM_6], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the Raw Status of IntErr Interrupt flag. - * - * Register|BitsName - * --------|-------- - * RAW_ERR | RAW - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_rerr(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.RAW_CH_EVT[ITEM_8], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the status of DMA Channel transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the status of Channel 0 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr0(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << 0)) == (1 << 0)); -} - -/** - * @brief Indicate the status of Channel 1 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr1(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << 1)) == (1 << 1)); -} - -/** - * @brief Indicate the status of Channel 2 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr2(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << ITEM_2)) == (1 << ITEM_2)); -} - -/** - * @brief Indicate the status of Channel 3 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr3(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << ITEM_3)) == (1 << ITEM_3)); -} - -/** - * @brief Indicate the status of Channel 4 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr4(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << ITEM_4)) == (1 << ITEM_4)); -} - -/** - * @brief Indicate the status of Channel 5 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr5(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << ITEM_5)) == (1 << ITEM_5)); -} - -/** - * @brief Indicate the status of Channel 6 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr6(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << ITEM_6)) == (1 << ITEM_6)); -} - -/** - * @brief Indicate the status of Channel 7 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_TFR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_tfr7(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[0], (1 << ITEM_7)) == (1 << ITEM_7)); -} - -/** - * @brief Indicate the status of DMA Channel block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the status of Channel 0 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk0(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << 0)) == (1 << 0)); -} - -/** - * @brief Indicate the status of Channel 1 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk1(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << 1)) == (1 << 1)); -} - -/** - * @brief Indicate the status of Channel 2 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk2(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << ITEM_2)) == (1 << ITEM_2)); -} - -/** - * @brief Indicate the status of Channel 3 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk3(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << ITEM_3)) == (1 << ITEM_3)); -} - -/** - * @brief Indicate the status of Channel 4 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk4(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << ITEM_4)) == (1 << ITEM_4)); -} - -/** - * @brief Indicate the status of Channel 5 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk5(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << ITEM_5)) == (1 << ITEM_5)); -} - -/** - * @brief Indicate the status of Channel 6 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk6(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << ITEM_6)) == (1 << ITEM_6)); -} - -/** - * @brief Indicate the status of Channel 7 block complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_BLK | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_blk7(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_2], (1 << ITEM_7)) == (1 << ITEM_7)); -} - -/** - * @brief Indicate the status of DMA Channel source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the status of Channel 0 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct0(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << 0)) == (1 << 0)); -} - -/** - * @brief Indicate the status of Channel 1 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct1(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << 1)) == (1 << 1)); -} - -/** - * @brief Indicate the status of Channel 2 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct2(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << ITEM_2)) == (1 << ITEM_2)); -} - -/** - * @brief Indicate the status of Channel 3 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct3(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << ITEM_3)) == (1 << ITEM_3)); -} - -/** - * @brief Indicate the status of Channel 4 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct4(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << ITEM_4)) == (1 << ITEM_4)); -} - -/** - * @brief Indicate the status of Channel 5 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct5(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << ITEM_5)) == (1 << ITEM_5)); -} - -/** - * @brief Indicate the status of Channel 6 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct6(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << ITEM_6)) == (1 << ITEM_6)); -} - -/** - * @brief Indicate the status of Channel 7 source transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_SRC_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_srct7(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_4], (1 << ITEM_7)) == (1 << ITEM_7)); -} - -/** - * @brief Indicate the status of DMA Channel destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the status of Channel 0 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt0(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << 0)) == (1 << 0)); -} - -/** - * @brief Indicate the status of Channel 1 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt1(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << 1)) == (1 << 1)); -} - -/** - * @brief Indicate the status of Channel 2 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt2(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << ITEM_2)) == (1 << ITEM_2)); -} - -/** - * @brief Indicate the status of Channel 3 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt3(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << ITEM_3)) == (1 << ITEM_3)); -} - -/** - * @brief Indicate the status of Channel 4 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt4(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << ITEM_4)) == (1 << ITEM_4)); -} - -/** - * @brief Indicate the status of Channel 5 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt5(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << ITEM_5)) == (1 << ITEM_5)); -} - -/** - * @brief Indicate the status of Channel 6 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt6(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << ITEM_6)) == (1 << ITEM_6)); -} - -/** - * @brief Indicate the status of Channel 7 destination transaction complete flag. - * - * Register|BitsName - * --------|-------- - * STAT_DST_TRN | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_dstt7(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_6], (1 << ITEM_7)) == (1 << ITEM_7)); -} - -/** - * @brief Indicate the status of DMA Channel error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Indicate the status of Channel 0 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err0(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << 0)) == (1 << 0)); -} - -/** - * @brief Indicate the status of Channel 1 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err1(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << 1)) == (1 << 1)); -} - -/** - * @brief Indicate the status of Channel 2 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err2(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << ITEM_2)) == (1 << ITEM_2)); -} - -/** - * @brief Indicate the status of Channel 3 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err3(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << ITEM_3)) == (1 << ITEM_3)); -} - -/** - * @brief Indicate the status of Channel 4 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err4(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << ITEM_4)) == (1 << ITEM_4)); -} - -/** - * @brief Indicate the status of Channel 5 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err5(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << ITEM_5)) == (1 << ITEM_5)); -} - -/** - * @brief Indicate the status of Channel 6 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err6(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << ITEM_6)) == (1 << ITEM_6)); -} - -/** - * @brief Indicate the status of Channel 7 error flag. - * - * Register|BitsName - * --------|-------- - * STAT_ERR | STATUS - * - * @param DMAx DMAx instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_active_flag_err7(dma_regs_t *DMAx) -{ - return (READ_BITS(DMAx->EVENT.STATUS_CH_EVT[ITEM_8], (1 << ITEM_7)) == (1 << ITEM_7)); -} - -/** - * @brief Clear DMA Channel transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << channel)); -} - -/** - * @brief Clear Channel 0 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr0(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << 0)); -} - -/** - * @brief Clear Channel 1 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr1(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << 1)); -} - -/** - * @brief Clear Channel 2 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr2(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << ITEM_2)); -} - -/** - * @brief Clear Channel 3 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr3(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << ITEM_3)); -} - -/** - * @brief Clear Channel 4 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr4(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << ITEM_4)); -} - -/** - * @brief Clear Channel 5 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr5(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << ITEM_5)); -} - -/** - * @brief Clear Channel 6 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr6(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << ITEM_6)); -} - -/** - * @brief Clear Channel 7 transfer complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_TFR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_tfr7(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[0], (1 << ITEM_7)); -} - -/** - * @brief Clear DMA Channel block complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << channel)); -} - -/** - * @brief Clear Channel 0 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk0(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << 0)); -} - -/** - * @brief Clear Channel 1 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk1(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << 1)); -} - -/** - * @brief Clear Channel 2 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk2(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << ITEM_2)); -} - -/** - * @brief Clear Channel 3 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk3(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << ITEM_3)); -} - -/** - * @brief Clear Channel 4 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk4(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << ITEM_4)); -} - -/** - * @brief Clear Channel 5 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk5(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << ITEM_5)); -} - -/** - * @brief Clear Channel 6 Block Cmplete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk6(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << ITEM_6)); -} - -/** - * @brief Clear Channel 7 Block Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_BLK | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_blk7(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_2], (1 << ITEM_7)); -} - -/** - * @brief Clear DMA Channel source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << channel)); -} - -/** - * @brief Clear Channel 0 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct0(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << 0)); -} - -/** - * @brief Clear Channel 1 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct1(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << 1)); -} - -/** - * @brief Clear Channel 2 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct2(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << ITEM_2)); -} - -/** - * @brief Clear Channel 3 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct3(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << ITEM_3)); -} - -/** - * @brief Clear Channel 4 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct4(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << ITEM_4)); -} - -/** - * @brief Clear Channel 5 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct5(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << ITEM_5)); -} - -/** - * @brief Clear Channel 6 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct6(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << ITEM_6)); -} - -/** - * @brief Clear Channel 7 source transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_SRC_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_srct7(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_4], (1 << ITEM_7)); -} - -/** - * @brief Clear DMA Channel destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << channel)); -} - -/** - * @brief Clear Channel 0 destination transaction Complete status. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt0(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << 0)); -} - -/** - * @brief Clear Channel 1 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt1(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << 1)); -} - -/** - * @brief Clear Channel 2 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt2(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << ITEM_2)); -} - -/** - * @brief Clear Channel 3 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt3(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << ITEM_3)); -} - -/** - * @brief Clear Channel 4 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt4(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << ITEM_4)); -} - -/** - * @brief Clear Channel 5 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt5(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << ITEM_5)); -} - -/** - * @brief Clear Channel 6 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt6(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << ITEM_6)); -} - -/** - * @brief Clear Channel 7 destination transaction Complete flag. - * - * Register|BitsName - * --------|-------- - * CLR_DST_TRN | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_dstt7(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_6], (1 << ITEM_7)); -} - -/** - * @brief Clear DMA Channel error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << channel)); -} - -/** - * @brief Clear Channel 0 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err0(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << 0)); -} - -/** - * @brief Clear Channel 1 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err1(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << 1)); -} - -/** - * @brief Clear Channel 2 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err2(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << ITEM_2)); -} - -/** - * @brief Clear Channel 3 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err3(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << ITEM_3)); -} - -/** - * @brief Clear Channel 4 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err4(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << ITEM_4)); -} - -/** - * @brief Clear Channel 5 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err5(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << ITEM_5)); -} - -/** - * @brief Clear Channel 6 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err6(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << ITEM_6)); -} - -/** - * @brief Clear Channel 7 error flag. - * - * Register|BitsName - * --------|-------- - * CLR_ERR | CLEAR - * - * @param DMAx DMAx instance - * @retval None. - */ -__STATIC_INLINE void ll_dma_clear_flag_err7(dma_regs_t *DMAx) -{ - WRITE_REG(DMAx->EVENT.CLEAR_CH_EVT[ITEM_8], (1 << ITEM_7)); -} - -/** @} */ - -/** @defgroup DMA_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable Transfer Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_TFR | TFR_WE&TFR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_it_tfr(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[0], (1 << (channel + DMA_MASK_TFR_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Enable Block Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_BLK | BLK_WE&BLK - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_it_blk(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_2], (1 << (channel + DMA_MASK_BLK_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Enable source transaction Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_SRC_TRN | SRC_TRN_WE&SRC_TRN - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_it_srct(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_4], (1 << (channel + DMA_MASK_SRC_TRN_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Enable destination transaction Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_DST_TRN | DST_TRN_WE&DST_TRN - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_it_dstt(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_6], (1 << (channel + DMA_MASK_DST_TRN_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Enable error interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_ERR | ERR_WE&ERR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_it_err(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_8], (1 << (channel + DMA_MASK_ERR_WE_Pos)) + (1 << channel)); -} - -/** - * @brief Disable Transfer Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_TFR | TFR_WE&TFR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_it_tfr(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[0], (1 << (channel + DMA_MASK_TFR_WE_Pos))); -} - -/** - * @brief Disable Block Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_BLK | BLK_WE&BLK - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_it_blk(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_2], (1 << (channel + DMA_MASK_BLK_WE_Pos))); -} - -/** - * @brief Disable source transaction Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_SRC_TRN | SRC_TRN_WE&SRC_TRN - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_it_srct(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_4], (1 << (channel + DMA_MASK_SRC_TRN_WE_Pos))); -} - -/** - * @brief Disable destination transaction Complete interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_DST_TRN | DST_TRN_WE&DST_TRN - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_it_dstt(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_6], (1 << (channel + DMA_MASK_DST_TRN_WE_Pos))); -} - -/** - * @brief Disable error interrupt. - * - * Register|BitsName - * --------|-------- - * MASK_ERR | ERR_WE&ERR - * - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_it_err(dma_regs_t *DMAx, uint32_t channel) -{ - WRITE_REG(DMAx->EVENT.MASK_CH_EVT[ITEM_8], (1 << (channel + DMA_MASK_ERR_WE_Pos))); -} - -/** - * @brief Check if DMA Transfer interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MASK_TFR | TFR - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enable_it_tfr(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.MASK_CH_EVT[0], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Check if DMA block interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MASK_BLK | BLK_WE&BLK - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enable_it_blk(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.MASK_CH_EVT[ITEM_2], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Check if DMA source transaction interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MASK_SRC_TRN | SRC_TRN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enable_it_srct(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.MASK_CH_EVT[ITEM_4], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Check if DMA destination transaction interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MASK_DST_TRN | DST_TRN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enable_it_dstt(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.MASK_CH_EVT[ITEM_6], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Check if DMA error interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MASK_ERR | ERR - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dma_is_enable_it_err(dma_regs_t *DMAx, uint32_t channel) -{ - return (READ_BITS(DMAx->EVENT.MASK_CH_EVT[ITEM_8], (1 << channel)) == (1 << channel)); -} - -/** - * @brief Enable DMA channel interrupt. - * - * Register|BitsName - * --------|-------- - * CTLL | INI_EN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_enable_it(dma_regs_t *DMAx, uint32_t channel) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_INI_EN, DMA_CTLL_INI_EN); -} - -/** - * @brief Disable DMA channel interrupt. - * - * Register|BitsName - * --------|-------- - * CTLL | INI_EN - * - * @param DMAx DMA instance. - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void ll_dma_disable_it(dma_regs_t *DMAx, uint32_t channel) -{ - MODIFY_REG(DMAx->CHANNEL[channel].CTL_LO, DMA_CTLL_INI_EN, 0); -} - -/** @} */ - -/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize the DMA registers to their default reset values. - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval An error_status_t enumeration value: - * - SUCCESS: DMA registers are de-initialized - * - ERROR: DMA registers are not de-initialized - */ -error_status_t ll_dma_deinit(dma_regs_t *DMAx, uint32_t channel); - -/** - * @brief Initialize the DMA registers according to the specified parameters in p_dma_init. - * @param DMAx DMAx instance - * @param channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @param p_dma_init pointer to a @ref ll_dma_init_t structure. - * @retval An error_status_t enumeration value: - * - SUCCESS: DMA registers are initialized - * - ERROR: Not applicable - */ -error_status_t ll_dma_init(dma_regs_t *DMAx, uint32_t channel, ll_dma_init_t *p_dma_init); - -/** - * @brief Set each field of a @ref ll_dma_init_t type structure to default value. - * @param p_dma_init Pointer to a @ref ll_dma_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_dma_struct_init(ll_dma_init_t *p_dma_init); - -/** @} */ - -/** @} */ - -#endif /* DMA */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_DMA_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dual_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dual_tim.h deleted file mode 100755 index c44a7a6..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_dual_tim.h +++ /dev/null @@ -1,633 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_dual_tim.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of DUAL TIMER LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_DUAL_TIMER DUAL_TIMER - * @brief DUAL TIM LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55XX_LL_DUAL_TIMER_H -#define GR55XX_LL_DUAL_TIMER_H - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (DUAL_TIMER0) || defined (DUAL_TIMER1) - -/** @defgroup DUAL_TIMER_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_LL_ES_INIT DUAL_TIM Exported init structures - * @{ - */ - -/** - * @brief LL DUAL TIMER init Structure definition - */ -typedef struct _ll_dual_timer_init { - uint32_t prescaler; /**< Specifies the prescaler value used to divide the TIMER clock. - This parameter can be a value of @ref DUAL_TIMER_EC_LL_PRESCALER. - This feature can be modified afterwards using unitary function - @ref ll_dual_timer_set_prescaler(). */ - - uint32_t counter_size; /**< Specifies the prescaler value used to divide the DUAL_TIMER clock. - This parameter can be a value of @ref DUAL_TIMER_EC_LL_COUNTERSIZE. - This feature can be modified afterwards using unitary function - @ref ll_dual_timer_set_counter_size(). */ - - uint32_t counter_mode; /**< Specifies the counter mode. - This parameter can be a value of @ref DUAL_TIMER_LL_EC_COUNTERMODE. - This feature can be modified afterwards using unitary function - @ref ll_dual_timer_set_counter_mode(). */ - - uint32_t auto_reload; /**< Specifies the auto reload value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number - between Min_Data=0x00000000 and - Max_Data=0xFFFFFFFF. - Some timer instances may support 16 - bits counters. In that case this - parameter must - be a number between 0x0000 and 0xFFFF. - This feature can be modified afterwards using unitary function - @ref ll_dual_timer_set_auto_reload(). */ -} ll_dual_timer_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup DUAL_TIMER_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_LL_Exported_Constants DUAL_TIM Exported Constants - * @{ - */ - -/** @defgroup DUAL_TIMER_LL_EC_COUNTERMODE DUAL_TIM counter mode - * @{ - */ -#define LL_DUAL_TIMER_FREERUNNING_MODE 0x00000000U /**< Free running mode */ -#define LL_DUAL_TIMER_PERIODIC_MODE DUAL_TIMER_CTRL_MODE /**< Periodic mode */ -/** @} */ - -/** @defgroup DUAL_TIMER_EC_LL_PRESCALER DUAL_TIM prescaler - * @{ - */ -#define LL_DUAL_TIMER_PRESCALER_DIV0 0x00000000U /**< 0 stage of prescale, - clock is divided by 1. */ -#define LL_DUAL_TIMER_PRESCALER_DIV16 (1UL << DUAL_TIMER_CTRL_PRE_Pos) /**< 4 stages of prescale, - clock is divided by 16. */ -#define LL_DUAL_TIMER_PRESCALER_DIV256 (2UL << DUAL_TIMER_CTRL_PRE_Pos) /**< 8 stages of prescale, - clock is divided by 256. */ -/** @} */ - -/** @defgroup DUAL_TIMER_EC_LL_COUNTERSIZE DUAL_TIM counter size - * @{ - */ -#define LL_DUAL_TIMER_COUNTERSIZE_16 0x00000000U /**< Counter size 16 bits */ -#define LL_DUAL_TIMER_COUNTERSIZE_32 DUAL_TIMER_CTRL_SIZE /**< Counter size 32 bits */ -/** @} */ - -/** @defgroup DUAL_TIMER_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL DUAL_TIMER InitStrcut default configuartion - */ -#define DUAL_TIMER_DEFAULT_CONFIG \ -{ \ - .prescaler = LL_DUAL_TIMER_PRESCALER_DIV0, \ - .counter_size = LL_DUAL_TIMER_COUNTERSIZE_32, \ - .counter_mode = LL_DUAL_TIMER_PERIODIC_MODE, \ - .auto_reload = SystemCoreClock - 1, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_LL_Exported_Macros DUAL_TIM Exported Macros - * @{ - */ - -/** @defgroup DUAL_TIMER_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in DUAL_TIMER register - * @param __instance__ DUAL_TIMER instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_DUAL_TIMER_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in DUAL_TIMER register - * @param __instance__ DUAL_TIMER instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_DUAL_TIMER_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DUAL_TIMER_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup DUAL_TIMER_LL_EF_Configuration Configuration functions - * @{ - */ - - -/** - * @brief Enable dual_timer counter. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_enable_counter(dual_timer_regs_t *DUAL_TIMERx) -{ - SET_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_EN); -} - -/** - * @brief Disable dual_timer counter. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_disable_counter(dual_timer_regs_t *DUAL_TIMERx) -{ - CLEAR_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_EN); -} - -/** - * @brief Indicate whether the dual_timer counter is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param DUAL_TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dual_timer_is_enabled_counter(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_EN) == (DUAL_TIMER_CTRL_EN)); -} - -/** - * @brief Set the counter mode. - * - * Register|BitsName - * --------|-------- - * CTRL | MODE - * - * @param DUAL_TIMERx Timer instance - * @param counter_mode This parameter can be one of the following values: - * @arg @ref LL_DUAL_TIMER_FREERUNNING_MODE - * @arg @ref LL_DUAL_TIMER_PERIODIC_MODE - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_set_counter_mode(dual_timer_regs_t *DUAL_TIMERx, uint32_t counter_mode) -{ - MODIFY_REG(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_MODE, counter_mode); -} - -/** - * @brief Get the counter mode. - * - * Register|BitsName - * --------|-------- - * CTRL | MODE - * - * @param DUAL_TIMERx Timer instance - * @retval Return value can be one of the following values: - * @arg @ref LL_DUAL_TIMER_FREERUNNING_MODE - * @arg @ref LL_DUAL_TIMER_PERIODIC_MODE - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_counter_mode(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_MODE)); -} - -/** - * @brief Set the prescaler. - * - * Register|BitsName - * --------|-------- - * CTRL | PRE - * - * @param DUAL_TIMERx Timer instance - * @param prescaler This parameter can be one of the following values: - * @arg @ref LL_DUAL_TIMER_PRESCALER_DIV0 - * @arg @ref LL_DUAL_TIMER_PRESCALER_DIV16 - * @arg @ref LL_DUAL_TIMER_PRESCALER_DIV256 - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_set_prescaler(dual_timer_regs_t *DUAL_TIMERx, uint32_t prescaler) -{ - MODIFY_REG(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_PRE, prescaler); -} - -/** - * @brief Get the prescaler. - * - * Register|BitsName - * --------|-------- - * CTRL | PRE - * - * @param DUAL_TIMERx Timer instance - * @retval Return value can be one of the following values: - * @arg @ref LL_DUAL_TIMER_PRESCALER_DIV0 - * @arg @ref LL_DUAL_TIMER_PRESCALER_DIV16 - * @arg @ref LL_DUAL_TIMER_PRESCALER_DIV256 - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_prescaler(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_PRE)); -} - -/** - * @brief Set the counter size. - * - * Register|BitsName - * --------|-------- - * CTRL | SIZE - * - * @param DUAL_TIMERx Timer instance - * @param counter_size This parameter can be one of the following values: - * @arg @ref LL_DUAL_TIMER_COUNTERSIZE_16 - * @arg @ref LL_DUAL_TIMER_COUNTERSIZE_32 - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_set_counter_size(dual_timer_regs_t *DUAL_TIMERx, uint32_t counter_size) -{ - MODIFY_REG(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_SIZE, counter_size); -} - -/** - * @brief Get the counter size. - * - * Register|BitsName - * --------|-------- - * CTRL | SIZE - * - * @param DUAL_TIMERx Timer instance - * @retval Return value can be one of the following values: - * @arg @ref LL_DUAL_TIMER_COUNTERSIZE_16 - * @arg @ref LL_DUAL_TIMER_COUNTERSIZE_32 - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_counter_size(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_SIZE)); -} - -/** - * @brief Enable one-shot mode. - * - * Register|BitsName - * --------|-------- - * CTRL | ONESHOT - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_enable_oneshot(dual_timer_regs_t *DUAL_TIMERx) -{ - SET_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_ONESHOT); -} - -/** - * @brief Disable one-shot mode. - * - * Register|BitsName - * --------|-------- - * CTRL | ONESHOT - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_disable_oneshot(dual_timer_regs_t *DUAL_TIMERx) -{ - CLEAR_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_ONESHOT); -} - -/** - * @brief Indicate whether the one-shot mode is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | ONESHOT - * - * @param DUAL_TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dual_timer_is_enabled_oneshot(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_ONESHOT) == (DUAL_TIMER_CTRL_ONESHOT)); -} - -/** - * @brief Get the counter value. - * - * Register|BitsName - * --------|-------- - * VALUE | VALUE - * - * @param DUAL_TIMERx Timer instance - * @retval Counter value (between Min_Data=0 and Max_Data=0xFFFFFFFF) - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_counter(dual_timer_regs_t *DUAL_TIMERx) -{ - return (uint32_t)(READ_REG(DUAL_TIMERx->VALUE)); -} - -/** - * @brief Set the auto-reload value. - * @note The counter is blocked while the auto-reload value is null. - * - * Register|BitsName - * --------|-------- - * RELOAD | RELOAD - * - * @param DUAL_TIMERx Timer instance - * @param auto_reload between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_set_auto_reload(dual_timer_regs_t *DUAL_TIMERx, uint32_t auto_reload) -{ - WRITE_REG(DUAL_TIMERx->RELOAD, auto_reload); -} - -/** - * @brief Get the auto-reload value. - * - * Register|BitsName - * --------|-------- - * RELOAD | RELOAD - * - * @param DUAL_TIMERx Timer instance - * @retval Auto-reload value - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_auto_reload(dual_timer_regs_t *DUAL_TIMERx) -{ - return (uint32_t)(READ_REG(DUAL_TIMERx->RELOAD)); -} - -/** - * @brief Set the backgroud-reload value. - * - * Register|BitsName - * --------|-------- - * BG_LOAD | BG_LOAD - * - * @param DUAL_TIMERx Timer instance - * @param background_reload between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_set_background_reload(dual_timer_regs_t *DUAL_TIMERx, uint32_t background_reload) -{ - WRITE_REG(DUAL_TIMERx->BG_LOAD, background_reload); -} - -/** - * @brief Get the backgroud-reload value. - * - * Register|BitsName - * --------|-------- - * BG_LOAD | BG_LOAD - * - * @param DUAL_TIMERx Timer instance - * @retval Return value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_background_reload(dual_timer_regs_t *DUAL_TIMERx) -{ - return (uint32_t)(READ_REG(DUAL_TIMERx->BG_LOAD)); -} - -/** @} */ - -/** @defgroup DUAL_TIM_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable dual_timer interrupt. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_enable_it(dual_timer_regs_t *DUAL_TIMERx) -{ - SET_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_INTEN); -} - -/** - * @brief Disable dual_timer interrput. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_disable_it(dual_timer_regs_t *DUAL_TIMERx) -{ - CLEAR_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_INTEN); -} - -/** - * @brief Indicate whether the dual_timer interrput is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param DUAL_TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dual_timer_is_enabled_it(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->CTRL, DUAL_TIMER_CTRL_INTEN) == (DUAL_TIMER_CTRL_INTEN)); -} - -/** @} */ - -/** @defgroup DUAL_TIMER_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Clear the interrupt flag (INTSTAT). - * - - * Register|BitsName - * --------|-------- - * INTCLR | INTCLR - * - * @param DUAL_TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_dual_timer_clear_flag_it(dual_timer_regs_t *DUAL_TIMERx) -{ - WRITE_REG(DUAL_TIMERx->INTCLR, DUAL_TIMER_INT_CLR); -} - -/** - * @brief Indicate whether interrupt flag (INTSTAT) is set (interrupt is pending). - * - * Register|BitsName - * --------|-------- - * INTSTAT | INTSTAT - * - * @param DUAL_TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dual_timer_is_active_flag_it(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_BITS(DUAL_TIMERx->INTSTAT, DUAL_TIMER_ISR_TI) == (DUAL_TIMER_ISR_TI)); -} - -/** - * @brief Get Dual_timer raw interrupt flags - * - * Register|BitsName - * --------|-------- - * RAW_INTSTAT | RAW_INTSTAT - * - * @param DUAL_TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_dual_timer_get_raw_it_flag(dual_timer_regs_t *DUAL_TIMERx) -{ - return (READ_REG(DUAL_TIMERx->RAW_INTSTAT)); -} - -/** @} */ - -/** @defgroup DUAL_TIMER_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize DUAL_TIMER registers (Registers restored to their default values). - * @param DUAL_TIMERx DUAL_TIM instance - * @retval An error_status_t enumeration value: - * - SUCCESS: DUAL_TIMER registers are de-initialized - * - ERROR: DUAL_TIMER registers are not de-initialized - */ -error_status_t ll_dual_timer_deinit(dual_timer_regs_t *DUAL_TIMERx); - -/** - * @brief Initialize DUAL_TIMER registers according to the specified - * parameters in p_dual_timer_init. - * @param DUAL_TIMERx DUAL_TIMER instance - * @param p_dual_timer_init Pointer to a ll_dual_timer_init_t structure that contains the configuration - * information for the specified DUAL_TIMER peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: DUAL_TIMER registers are initialized according to p_dual_timer_init content - * - ERROR: Problem occurred during DUAL_TIM Registers initialization - */ -error_status_t ll_dual_timer_init(dual_timer_regs_t *DUAL_TIMERx, ll_dual_timer_init_t *p_dual_timer_init); - -/** - * @brief Set each field of a @ref ll_dual_timer_init_t type structure to default value. - * @param p_dual_timer_init Pointer to a @ref ll_dual_timer_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_dual_timer_struct_init(ll_dual_timer_init_t *p_dual_timer_init); - -/** @} */ - -/** @} */ - -#endif /* DUAL_TIMER0 || DUAL_TIMER1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_DUAL_TIMER_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_efuse.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_efuse.h deleted file mode 100755 index 3f230bc..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_efuse.h +++ /dev/null @@ -1,692 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_efuse.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of eFuse LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_EFUSE EFUSE - * @brief eFuse LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_EFUSE_H__ -#define __GR55xx_LL_EFUSE_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (EFUSE) - -/** - * @defgroup EFUSE_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EFUSE_LL_Exported_Constants EFUSE Exported Constants - * @{ - */ - -/** @defgroup EFUSE_LL_EC_OPERATION EFUSE Operation Defines - * @brief Operation defines which can be used with LL_EFUSE_WriteReg function - * @{ - */ -#define LL_EFUSE_WRITE_KEYRAM EFUSE_OPER_WRITE_KEYRAM /**< Read fwkay and rootkey from eFuse, - and write to keyram */ -#define LL_EFUSE_READ_TRIM EFUSE_OPER_READ_TRIM /**< Read analog trim from eFuse */ -#define LL_EFUSE_CRC_CHECK EFUSE_OPER_CRC_CHECK /**< Read the special eFuse addr, - and calculate CRC value */ -#define LL_EFUSE_INIT_CHECK EFUSE_OPER_INIT_CHECK /**< Read the whole eFuse value, - and check this value with 0 */ -#define LL_EFUSE_TEST_READ EFUSE_OPER_RD_TEST_MODE /**< Read eFuse test mode from eFuse */ -/** @} */ - -/** @defgroup EFUSE_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_EFUSE_ReadReg function - * @{ - */ -#define LL_EFUSE_WRITE_KEYRAM_BUSY EFUSE_STATUS_WRITE_KEYRAM_BUSY /**< Write keyram operation is in processing */ -#define LL_EFUSE_READ_TRIM_DONE EFUSE_STATUS_READ_TRIM_DONE /**< Read trim from eFuse has done */ -#define LL_EFUSE_CRC_CHECK_DONE EFUSE_STATUS_CRC_CHECK_DONE /**< eFuse CRC check done */ -#define LL_EFUSE_CRC_CHECK_SUCCESS EFUSE_STATUS_TRIM_CRC_SUCCESS /**< CRC check success */ -#define LL_EFUSE_INIT_CHECK_DONE EFUSE_STATUS_INIT_DONE /**< eFuse initial value check done */ -#define LL_EFUSE_INIT_CHECK_SUCCESS EFUSE_STATUS_INIT_SUCCESS /**< eFuse initial value check success */ -#define LL_EFUSE_WRITE_DONE EFUSE_STATUS_WRITE_DONE /**< eFuse one word write done */ -#define LL_EFUSE_TEST_DONE EFUSE_STATUS_TEST_MODE_DONE /**< Read from eFuse has done in test mode */ -/** @} */ - -/** @defgroup EFUSE_LL_EC_GET_CTL_FLAG Get Power Controller Flags Defines - * @brief Flags defines which can be used with LL_EFUSE_ReadReg function - * @{ - */ -#define LL_EFUSE_PWR_CTL_EN_DONE MCU_SUB_EFUSE_PWR_CTL0_EN_DONE /**< eFuse power enable done */ -#define LL_EFUSE_PWR_CTL_DIS_DONE MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE /**< eFuse power disable done */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EFUSE_LL_Exported_Macros EFUSE Exported Macros - * @{ - */ - -/** @defgroup EFUSE_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in eFuse register - * @param __instance__ eFuse instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_EFUSE_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in eFuse register - * @param __instance__ eFuse instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_EFUSE_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EFUSE_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup EFUSE_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Set eFuse program time - * - * Register|BitsName - * --------|-------- - * TPGM | TIME - * - * @param EFUSEx eFuse instance - * @param time This parameter can be one of the following values: 0 ~ 0xFFF - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_tpro(efuse_regs_t *EFUSEx, uint32_t time) -{ - MODIFY_REG(EFUSEx->TPGM, EFUSE_TPGM_TIME, time << EFUSE_TPGM_TIME_Pos); -} - -/** - * @brief Get eFuse program time - * - * Register|BitsName - * --------|-------- - * TPGM | TIME - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 0 ~ 0xFFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_tpro(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_BITS(EFUSEx->TPGM, EFUSE_TPGM_TIME) >> EFUSE_TPGM_TIME_Pos); -} - -/** - * @brief Enable read address through APB bus be a main address or backup address - * - * Register|BitsName - * --------|-------- - * TPGM | MAIN_OR_BACKUP - * - * @param EFUSEx eFuse instance - * @retval None - */ -__STATIC_INLINE void ll_efuse_enable_main_backup(efuse_regs_t *EFUSEx) -{ - SET_BITS(EFUSEx->TPGM, EFUSE_TPGM_MAIN_OR_BACKUP); -} - -/** - * @brief Disable read address through APB bus be a main address or backup address - * - * Register|BitsName - * --------|-------- - * TPGM | MAIN_OR_BACKUP - * - * @param EFUSEx eFuse instance - * @retval None - */ -__STATIC_INLINE void ll_efuse_disable_main_backup(efuse_regs_t *EFUSEx) -{ - CLEAR_BITS(EFUSEx->TPGM, EFUSE_TPGM_MAIN_OR_BACKUP); -} - -/** - * @brief Check if read address through APB bus be a main address or backup address is enabled - * - * Register|BitsName - * --------|-------- - * TPGM | MAIN_OR_BACKUP - * - * @param EFUSEx eFuse instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_efuse_is_enabled_main_backup(efuse_regs_t *EFUSEx) -{ - return (READ_BITS(EFUSEx->TPGM, EFUSE_TPGM_MAIN_OR_BACKUP) == (EFUSE_TPGM_MAIN_OR_BACKUP)); -} - -/** - * @brief Set CRC check length - * - * Register|BitsName - * --------|-------- - * TPGM | CRC_CHECK_LEN - * - * @param EFUSEx eFuse instance - * @param length This parameter can be one of the following values: 1 ~ 60 - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_crc_check_len(efuse_regs_t *EFUSEx, uint32_t length) -{ - MODIFY_REG(EFUSEx->TPGM, EFUSE_TPGM_CRC_CHECK_LEN, length << EFUSE_TPGM_CRC_CHECK_LEN_Pos); -} - -/** - * @brief Get CRC check length - * - * Register|BitsName - * --------|-------- - * TPGM | CRC_CHECK_LEN - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 1 ~ 60 - */ -__STATIC_INLINE uint32_t ll_efuse_get_crc_check_len(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_BITS(EFUSEx->TPGM, EFUSE_TPGM_CRC_CHECK_LEN) >> EFUSE_TPGM_CRC_CHECK_LEN_Pos); -} - -/** - * @brief Set the interval number of clk cycles between two bit fuse - * - * Register|BitsName - * --------|-------- - * TPGM | WRITE_INTERVAL - * - * @param EFUSEx eFuse instance - * @param interval This parameter can be one of the following values: 0 ~ 0xFF - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_interval(efuse_regs_t *EFUSEx, uint32_t interval) -{ - MODIFY_REG(EFUSEx->TPGM, EFUSE_TPGM_WRITE_INTERVAL, interval << EFUSE_TPGM_WRITE_INTERVAL_Pos); -} - -/** - * @brief Get the interval number of clk cycles between two bit fuse - * - * Register|BitsName - * --------|-------- - * TPGM | WRITE_INTERVAL - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 0 ~ 0xFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_interval(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_BITS(EFUSEx->TPGM, EFUSE_TPGM_WRITE_INTERVAL) >> EFUSE_TPGM_WRITE_INTERVAL_Pos); -} - -/** - * @brief Enable eFuse PGENB sigal - * - * Register|BitsName - * --------|-------- - * PGENB | PGENB_SIG - * - * @param EFUSEx eFuse instance - * @retval None - */ -__STATIC_INLINE void ll_efuse_enable_pgenb(efuse_regs_t *EFUSEx) -{ - SET_BITS(EFUSEx->PGENB, EFUSE_PGENB_SIG); -} - -/** - * @brief Disable eFuse PGENB sigal - * - * Register|BitsName - * --------|-------- - * PGENB | PGENB_SIG - * - * @param EFUSEx eFuse instance - * @retval None - */ -__STATIC_INLINE void ll_efuse_disable_pgenb(efuse_regs_t *EFUSEx) -{ - CLEAR_BITS(EFUSEx->PGENB, EFUSE_PGENB_SIG); -} - -/** - * @brief Check if eFuse PGENB sigal is enabled - * - * Register|BitsName - * --------|-------- - * PGENB | PGENB_SIG - * - * @param EFUSEx eFuse instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_efuse_is_enabled_pgenb(efuse_regs_t *EFUSEx) -{ - return (READ_BITS(EFUSEx->PGENB, EFUSE_PGENB_SIG) == (EFUSE_PGENB_SIG)); -} - -/** - * @brief Get test mode - * @note This bit should be read only. - * - * Register|BitsName - * --------|-------- - * TEST_MODE | TEST_MODE - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 0xFFFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_test_mode(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_BITS(EFUSEx->TEST_MODE, EFUSE_TEST_MODE)); -} - -/** - * @brief Set eFuse operation mode - * - * Register|BitsName - * --------|-------- - * OPERATION | WRITE_KEYRAM - * OPERATION | INIT_CHECK - * OPERATION | CRC_CHECK - * OPERATION | READ_TRIM - * OPERATION | RD_TEST_MODE - * - * @param EFUSEx eFuse instance - * @param mode This parameter can be one of the following values: - * @arg @ref LL_EFUSE_WRITE_KEYRAM - * @arg @ref LL_EFUSE_READ_TRIM - * @arg @ref LL_EFUSE_CRC_CHECK - * @arg @ref LL_EFUSE_INIT_CHECK - * @arg @ref LL_EFUSE_TEST_READ - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_operation(efuse_regs_t *EFUSEx, uint32_t mode) -{ - WRITE_REG(EFUSEx->OPERATION, mode); -} - -/** - * @brief Check active flag - * - * Register|BitsName - * --------|-------- - * STAT | WRITE_KEYRAM_BUSY - * STAT | READ_TRIM_DONE - * STAT | TRIM_CRC_SUCCESS - * STAT | INIT_DONE - * STAT | INIT_SUCCESS - * STAT | CRC_CHECK_DONE - * STAT | WRITE_DONE - * STAT | TEST_MODE_DONE - * - * @param EFUSEx eFuse instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_EFUSE_WRITE_KEYRAM_BUSY - * @arg @ref LL_EFUSE_READ_TRIM_DONE - * @arg @ref LL_EFUSE_CRC_CHECK_DONE - * @arg @ref LL_EFUSE_CRC_CHECK_SUCCESS - * @arg @ref LL_EFUSE_INIT_CHECK_DONE - * @arg @ref LL_EFUSE_INIT_CHECK_SUCCESS - * @arg @ref LL_EFUSE_WRITE_DONE - * @arg @ref LL_EFUSE_TEST_DONE - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_efuse_is_active_flag(efuse_regs_t *EFUSEx, uint32_t flag) -{ - return (READ_BITS(EFUSEx->STAT, flag) == (flag)); -} - -/** - * @brief Set key mask - * - * Register|BitsName - * --------|-------- - * KEY_MASK | KEY_MASK - * - * @param EFUSEx eFuse instance - * @param mask Key mask - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_key_mask(efuse_regs_t *EFUSEx, uint32_t mask) -{ - WRITE_REG(EFUSEx->KEY_MASK, mask); -} - -/** - * @brief Get key mask - * - * Register|BitsName - * --------|-------- - * KEY_MASK | KEY_MASK - * - * @param EFUSEx eFuse instance - * @retval None - */ -__STATIC_INLINE uint32_t ll_efuse_get_key_mask(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_REG(EFUSEx->KEY_MASK)); -} - -/** - * @brief Set CRC check start address - * @note The address must be a main info address. - * - * Register|BitsName - * --------|-------- - * CRC_ADDR | START_CHECK_ADDR - * - * @param EFUSEx eFuse instance - * @param address This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_crc_check_addr(efuse_regs_t *EFUSEx, uint32_t address) -{ - WRITE_REG(EFUSEx->CRC_ADDR, address); -} - -/** - * @brief Get CRC check start address - * - * Register|BitsName - * --------|-------- - * CRC_ADDR | START_CHECK_ADDR - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 0 ~ 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_crc_check_addr(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_REG(EFUSEx->CRC_ADDR)); -} - -/** - * @brief Get CRC check results - * - * Register|BitsName - * --------|-------- - * CRC_OUTPUT | OUTPUT_VALUE - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 0 ~ 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_crc_check_result(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_REG(EFUSEx->CRC_OUTPUT)); -} - -/** - * @brief Set read trim start address - * @note The address must be a main info address. - * - * Register|BitsName - * --------|-------- - * TRIM_ADDR | START_ADDR - * - * @param EFUSEx eFuse instance - * @param address This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_trim_addr(efuse_regs_t *EFUSEx, uint32_t address) -{ - WRITE_REG(EFUSEx->TRIM_ADDR, address); -} - -/** - * @brief Get read trim start address - * - * Register|BitsName - * --------|-------- - * TRIM_ADDR | START_ADDR - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 0 ~ 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_trim_addr(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_REG(EFUSEx->TRIM_ADDR)); -} - -/** - * @brief Set read trim length - * - * Register|BitsName - * --------|-------- - * TRIM_LEN | LENGTH - * - * @param EFUSEx eFuse instance - * @param length This parameter can be one of the following values: 1 ~ 14 - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_trim_length(efuse_regs_t *EFUSEx, uint32_t length) -{ - WRITE_REG(EFUSEx->TRIM_LEN, length & EFUSE_TRIM_LENGTH); -} - -/** - * @brief Get read trim length - * - * Register|BitsName - * --------|-------- - * TRIM_LEN | LENGTH - * - * @param EFUSEx eFuse instance - * @retval Returned value can be one of the following values: 1 ~ 14 - */ -__STATIC_INLINE uint32_t ll_efuse_get_trim_length(efuse_regs_t *EFUSEx) -{ - return (uint32_t)(READ_REG(EFUSEx->TRIM_LEN) & EFUSE_TRIM_LENGTH); -} - -/** - * @brief Get trim value - * - * Register|BitsName - * --------|-------- - * TRIM[n] | TRIM - * - * @param EFUSEx eFuse instance - * @param indx index of trim value registers: 0 ~ 13 - * @retval Returned value can be one of the following values: 0 ~ 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_efuse_get_trim_value(efuse_regs_t *EFUSEx, uint32_t indx) -{ - return (uint32_t)(READ_REG(EFUSEx->TRIM[indx])); -} - -/** - * @brief eFuse v1.1 power on. - * - * Register|BitsName - * --------|-------- - * TPGM | CRC_CHECK_LEN - * - * @retval None - */ -__STATIC_INLINE void ll_efuse_enable_power(efuse_regs_t *EFUSEx) -{ - SET_BITS(AON->RF_REG_2, AON_RF_REG_2_EFUSE_VDD_EN); -} - -/** - * @brief eFuse v1.1 power off. - * - * Register|BitsName - * --------|-------- - * TPGM | CRC_CHECK_LEN - * - * @retval None - */ -__STATIC_INLINE void ll_efuse_disable_power(efuse_regs_t *EFUSEx) -{ - CLEAR_BITS(AON->RF_REG_2, AON_RF_REG_2_EFUSE_VDD_EN); -} - -/** - * @brief Set Efulse power controller timing pararmeter. - * - * Register |BitsName - * ----------|-------- - * PWR_DELTA| PWR_DELTA_0 - * PWR_DELTA| PWR_DELTA_1 - * PWR_DELTA| PWR_DELTA_2 - * - * @retval None - */ -__STATIC_INLINE void ll_efuse_set_controller_power_timing(efuse_regs_t *EFUSEx, uint16_t vddq_0, - uint16_t vddq_1, uint16_t vddq_2) -{ - WRITE_REG(MCU_SUB->EFUSE_PWR_DELTA[0], vddq_0 + (vddq_1 << ITEM_16)); - WRITE_REG(MCU_SUB->EFUSE_PWR_DELTA[1], vddq_2); -} - -/** - * @brief Power sequencer begin. - * - * Register |BitsName - * -----------|-------- - * PWR_CTRL0 | CTRL_ENABLE - * PWR_CTRL0 | SEQR_BEGIN - * - * @retval None - */ -__STATIC_INLINE void ll_efuse_enable_controller_power_begin(efuse_regs_t *EFUSEx) -{ - WRITE_REG(MCU_SUB->EFUSE_PWR_CTRL[0], MCU_SUB_EFUSE_PWR_CTL0_BGN | MCU_SUB_EFUSE_PWR_CTL0_EN); -} - -/** - * @brief Power sequencer begin. - * - * Register |BitsName - * -----------|-------- - * PWR_CTRL0 | CTRL_ENABLE - * PWR_CTRL0 | SEQR_STOP - * - * @retval None - */ -__STATIC_INLINE void ll_efuse_enable_controller_power_stop(efuse_regs_t *EFUSEx) -{ - WRITE_REG(MCU_SUB->EFUSE_PWR_CTRL[0], MCU_SUB_EFUSE_PWR_CTL0_STP | MCU_SUB_EFUSE_PWR_CTL0_EN); -} - -/** - * @brief Power sequencer begin. - * - * Register |BitsName - * --------- -|-------- - * PWR_CTRL0 | CTRL_ENABLE - * PWR_CTRL0 | SEQR_BEGIN - * PWR_CTRL0 | SEQR_STOP - * - * @retval None - */ -__STATIC_INLINE void ll_efuse_disable_controller_power(efuse_regs_t *EFUSEx) -{ - WRITE_REG(MCU_SUB->EFUSE_PWR_CTRL[0], 0); -} - -/** - * @brief Check power controller active flag - * - * Register|BitsName - * --------|-------- - * PWR_CTRL1 | EN_DONE - * PWR_CTRL1 | DIS_DONE - * - * @param EFUSEx eFuse instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_EFUSE_PWR_CTL_EN_DONE - * @arg @ref LL_EFUSE_PWR_CTL_DIS_DONE - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_efuse_is_controller_power_flag(efuse_regs_t *EFUSEx, uint32_t flag) -{ - return (READ_BITS(MCU_SUB->EFUSE_PWR_CTRL[1], flag) == (flag)); -} - -/** @} */ - -/** @} */ - -#endif /* EFUSE */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_EFUSE_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_gpio.h deleted file mode 100755 index 625ba3c..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_gpio.h +++ /dev/null @@ -1,1387 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_gpio.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of GPIO LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_GPIO GPIO - * @brief GPIO LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_GPIO_H__ -#define __GR55XX_LL_GPIO_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (GPIO0) || defined (GPIO1) - -/** @defgroup GPIO_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup GPIO_LL_ES_INIT GPIO Exported init structures - * @{ - */ - -/** - * @brief LL GPIO init configuration definition - */ -typedef struct _ll_gpio_init { - uint32_t pin; /*!< Specifies the GPIO pins to be GPIO_InitStructured. - This parameter can be any value of @ref GPIO_LL_EC_PIN */ - - uint32_t mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_MODE. - GPIO HW GPIO_InitStructuration can be - modified afterwards using unitary - function - @ref ll_gpio_set_pin_mode(). */ - - uint32_t pull; /*!< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_PULL. - GPIO HW configuration can be modified - afterwards using unitary function - @ref ll_gpio_set_pin_pull(). */ - - uint32_t mux; /*!< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_MUX. - GPIO HW GPIO_InitStructuration can be - modified afterwards using unitary - function - @ref ll_gpio_set_mux_pin_0_7() and ll_gpio_set_mux_pin_8_15(). */ - - uint32_t trigger; /*!< Specifies the trigger signal active edge. - This parameter can be a value of @ref GPIO_LL_EC_TRIGGER. */ -} ll_gpio_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup GPIO_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_LL_EC_PIN PIN - * @{ - */ -#define LL_GPIO_PIN_0 ((uint32_t)0x0001U) /*!< Select pin 0 */ -#define LL_GPIO_PIN_1 ((uint32_t)0x0002U) /*!< Select pin 1 */ -#define LL_GPIO_PIN_2 ((uint32_t)0x0004U) /*!< Select pin 2 */ -#define LL_GPIO_PIN_3 ((uint32_t)0x0008U) /*!< Select pin 3 */ -#define LL_GPIO_PIN_4 ((uint32_t)0x0010U) /*!< Select pin 4 */ -#define LL_GPIO_PIN_5 ((uint32_t)0x0020U) /*!< Select pin 5 */ -#define LL_GPIO_PIN_6 ((uint32_t)0x0040U) /*!< Select pin 6 */ -#define LL_GPIO_PIN_7 ((uint32_t)0x0080U) /*!< Select pin 7 */ -#define LL_GPIO_PIN_8 ((uint32_t)0x0100U) /*!< Select pin 8 */ -#define LL_GPIO_PIN_9 ((uint32_t)0x0200U) /*!< Select pin 9 */ -#define LL_GPIO_PIN_10 ((uint32_t)0x0400U) /*!< Select pin 10 */ -#define LL_GPIO_PIN_11 ((uint32_t)0x0800U) /*!< Select pin 11 */ -#define LL_GPIO_PIN_12 ((uint32_t)0x1000U) /*!< Select pin 12 */ -#define LL_GPIO_PIN_13 ((uint32_t)0x2000U) /*!< Select pin 13 */ -#define LL_GPIO_PIN_14 ((uint32_t)0x4000U) /*!< Select pin 14 */ -#define LL_GPIO_PIN_15 ((uint32_t)0x8000U) /*!< Select pin 15 */ -#define LL_GPIO_PIN_ALL ((uint32_t)0xFFFFU) /*!< Select all pins */ -/** @} */ - -/** @defgroup GPIO_LL_EC_MODE Mode - * @{ - */ -#define LL_GPIO_MODE_INPUT ((uint32_t)0x0U) /*!< Select input mode */ -#define LL_GPIO_MODE_OUTPUT ((uint32_t)0x1U) /*!< Select output mode */ -#define LL_GPIO_MODE_MUX ((uint32_t)0x2U) /*!< Select mux peripheral mode */ -/** @} */ - -/** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down - * @{ - */ -#define LL_GPIO_PULL_NO LL_GPIO_RE_N /*!< Select I/O no pull */ -#define LL_GPIO_PULL_UP LL_GPIO_RTYP /*!< Select I/O pull up */ -#define LL_GPIO_PULL_DOWN ((uint32_t)0x0U) /*!< Select I/O pull down */ -/** @} */ - -/** @defgroup GPIO_LL_EC_MUX Alternate Function - * @{ - */ -#define LL_GPIO_MUX_0 ((uint32_t)0x0U) /*!< Select alternate function 0 */ -#define LL_GPIO_MUX_1 ((uint32_t)0x1U) /*!< Select alternate function 1 */ -#define LL_GPIO_MUX_2 ((uint32_t)0x2U) /*!< Select alternate function 2 */ -#define LL_GPIO_MUX_3 ((uint32_t)0x3U) /*!< Select alternate function 3 */ -#define LL_GPIO_MUX_4 ((uint32_t)0x4U) /*!< Select alternate function 4 */ -#define LL_GPIO_MUX_5 ((uint32_t)0x5U) /*!< Select alternate function 5 */ -#define LL_GPIO_MUX_6 ((uint32_t)0x6U) /*!< Select alternate function 6 */ -#define LL_GPIO_MUX_7 ((uint32_t)0x7U) /*!< Select alternate function 7 */ -#define LL_GPIO_MUX_8 ((uint32_t)0x8U) /*!< Select alternate function 8 */ -/** @} */ - -/** @defgroup GPIO_LL_EC_TRIGGER Interrupt Trigger - * @{ - */ -#define LL_GPIO_TRIGGER_NONE ((uint32_t)0x00U) /*!< No Trigger Mode */ -#define LL_GPIO_TRIGGER_RISING ((uint32_t)0x01U) /*!< Trigger Rising Mode */ -#define LL_GPIO_TRIGGER_FALLING ((uint32_t)0x02U) /*!< Trigger Falling Mode */ -#define LL_GPIO_TRIGGER_HIGH ((uint32_t)0x03U) /*!< Trigger High Mode */ -#define LL_GPIO_TRIGGER_LOW ((uint32_t)0x04U) /*!< Trigger Low Mode */ -/** @} */ - -/** @defgroup GPIO_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL GPIO InitStrcut default configuartion - */ -#define LL_GPIO_DEFAULT_CONFIG \ -{ \ - .pin = LL_GPIO_PIN_ALL, \ - .mode = LL_GPIO_MODE_INPUT, \ - .pull = LL_GPIO_PULL_DOWN, \ - .mux = LL_GPIO_MUX_7, \ - .trigger = LL_GPIO_TRIGGER_NONE, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in GPIO register - * @param __instance__ GPIO instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_GPIO_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in GPIO register - * @param __instance__ GPIO instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_GPIO_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIO_LL_Private_Macros GPIO Private Macros - * @{ - */ - -/** @brief Get the starting position of the specified GPIO instance - * in related pull-up/pull-down register. - * @param __GPIOx__ This parameter can be one of the following values: - * @arg GPIO0 - * @arg GPIO1 - * @retval none - */ -#define LL_GPIO_GET_RESISTOR_POS(__GPIOx__) (((__GPIOx__) == GPIO0) ? 0 : 16) - -/** @brief Get mux control register address of specified GPIO instance. - * @param __GPIOx__ This parameter can be one of the following values: - * @arg GPIO0 - * @arg GPIO1 - * @retval none - */ -#define LL_GPIO_GET_REG_MUX_CTRL_0_7( __GPIOx__) \ - (((__GPIOx__) == GPIO0) ? &(MCU_SUB->DPAD_MUX_CTL0_7) : &(MCU_SUB->DPAD_MUX_CTL16_23)) - -/** @brief Get mux control register address of specified GPIO instance. - * @param __GPIOx__ This parameter can be one of the following values: - * @arg GPIO0 - * @arg GPIO1 - * @retval none - */ -#define LL_GPIO_GET_REG_MUX_CTRL_8_15( __GPIOx__) \ - (((__GPIOx__) == GPIO0) ? &(MCU_SUB->DPAD_MUX_CTL8_15) : &(MCU_SUB->DPAD_MUX_CTL24_31)) - -/** @defgroup GPIO_LL_PM_RESISTOR Resistor Enable - * @{ - */ -#define LL_GPIO_RE_N_Pos 0 /**< Resistor Enable bits position */ -#define LL_GPIO_RE_N_Msk (0x1U << LL_GPIO_RE_N_Pos) /**< Resistor Enable bits mask */ -#define LL_GPIO_RE_N LL_GPIO_RE_N_Msk /**< Resistor Enable bits */ -/** @} */ - -/** @defgroup GPIO_LL_PM_RESISTOR_TYPE Resistor Type - * @{ - */ -#define LL_GPIO_RTYP_Pos 1 /**< Resistor Type bits position */ -#define LL_GPIO_RTYP_Msk (0x1U << LL_GPIO_RTYP_Pos) /**< Resistor Type bits mask */ -#define LL_GPIO_RTYP LL_GPIO_RTYP_Msk /**< Resistor Type bits */ -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration - * @{ - */ - -/** - * @brief Set several pins to input/output mode on dedicated port. - * - * Register|BitsName - * --------|-------- - * OUTENSET | OUTENSET - * OUTENCLR | OUTENCLR - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @param mode This parameter can be one of the following values: - * @arg @ref LL_GPIO_MODE_INPUT - * @arg @ref LL_GPIO_MODE_OUTPUT - * @retval None - */ -__STATIC_INLINE void ll_gpio_set_pin_mode(gpio_regs_t *GPIOx, uint32_t pin_mask, uint32_t mode) -{ - if (mode == LL_GPIO_MODE_OUTPUT) { - WRITE_REG(GPIOx->OUTENSET, pin_mask); - } else if (mode == LL_GPIO_MODE_INPUT) { - WRITE_REG(GPIOx->OUTENCLR, pin_mask); - } -} - -/** - * @brief Return gpio mode for a dedicated pin on dedicated port. - * @note I/O mode can be Input mode, General purpose output. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * OUTENSET | OUTENSET - * - * @param GPIOx GPIO Port - * @param pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_MODE_INPUT - * @arg @ref LL_GPIO_MODE_OUTPUT - */ -__STATIC_INLINE uint32_t ll_gpio_get_pin_mode(gpio_regs_t *GPIOx, uint32_t pin) -{ - return (uint32_t)(READ_BITS(GPIOx->OUTENSET, pin) != RESET); -} - -/** - * @brief Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port. - * - * Register|BitsName - * --------|-------- - * DPAD_RE_N_BUS | RE_N - * DPAD_RTYP_BUS | RTYP - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param pull This parameter can be one of the following values: - * @arg @ref LL_GPIO_PULL_NO - * @arg @ref LL_GPIO_PULL_UP - * @arg @ref LL_GPIO_PULL_DOWN - * @retval None - */ -__STATIC_INLINE void ll_gpio_set_pin_pull(gpio_regs_t *GPIOx, uint32_t pin_mask, uint32_t pull) -{ - /* Get pin mask in resitor related registers, GPIO0:0~15, GPIO1:16~31 */ - pin_mask <<= LL_GPIO_GET_RESISTOR_POS(GPIOx); - MODIFY_REG(MCU_SUB->DPAD_RTYP_BUS, pin_mask, (pull == LL_GPIO_PULL_UP) ? pin_mask : 0x0000U); - MODIFY_REG(MCU_SUB->DPAD_RE_N_BUS, pin_mask, (pull == LL_GPIO_PULL_NO) ? pin_mask : 0x0000U); -} - -/** - * @brief Return gpio pull-up or pull-down for a dedicated pin on a dedicated port - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * DPAD_RE_N_BUS | RE_N - * DPAD_RTYP_BUS | RTYP - * - * @param GPIOx GPIO Port - * @param pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_PULL_NO - * @arg @ref LL_GPIO_PULL_UP - * @arg @ref LL_GPIO_PULL_DOWN - */ -__STATIC_INLINE uint32_t ll_gpio_get_pin_pull(gpio_regs_t *GPIOx, uint32_t pin) -{ - /* Get pin position in resitor related registers, GPIO0:0~15, GPIO1:16~31 */ - pin <<= LL_GPIO_GET_RESISTOR_POS(GPIOx); - return ((READ_BITS(MCU_SUB->DPAD_RE_N_BUS, pin) != RESET) ? LL_GPIO_PULL_NO : - ((READ_BITS(MCU_SUB->DPAD_RTYP_BUS, pin) != RESET) ? LL_GPIO_PULL_UP : LL_GPIO_PULL_DOWN)); -} - -/** - * @brief Configure gpio pinmux number of a dedicated pin from 0 to 7 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * DPAD_MUX_CTRL0_7 | CTRL0_7 - * DPAD_MUX_CTRL16_23 | CTRL16_23 - * - * @param GPIOx GPIO Port - * @param pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @param mux This parameter can be one of the following values: - * @arg @ref LL_GPIO_MUX_0 - * @arg @ref LL_GPIO_MUX_1 - * @arg @ref LL_GPIO_MUX_2 - * @arg @ref LL_GPIO_MUX_3 - * @arg @ref LL_GPIO_MUX_4 - * @arg @ref LL_GPIO_MUX_5 - * @arg @ref LL_GPIO_MUX_6 - * @arg @ref LL_GPIO_MUX_7 - * @arg @ref LL_GPIO_MUX_8 - * @retval None - */ -__STATIC_INLINE void ll_gpio_set_mux_pin_0_7(gpio_regs_t *GPIOx, uint32_t pin, uint32_t mux) -{ - volatile uint32_t *pReg = LL_GPIO_GET_REG_MUX_CTRL_0_7(GPIOx); - uint32_t pos = POSITION_VAL(pin) << 2; - MODIFY_REG(*pReg, 0xF << pos, mux << pos); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * - * Register|BitsName - * --------|-------- - * DPAD_MUX_CTRL0_7 | CTRL0_7 - * DPAD_MUX_CTRL16_23 | CTRL16_23 - * - * @param GPIOx GPIO Port - * @param pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_MUX_0 - * @arg @ref LL_GPIO_MUX_1 - * @arg @ref LL_GPIO_MUX_2 - * @arg @ref LL_GPIO_MUX_3 - * @arg @ref LL_GPIO_MUX_4 - * @arg @ref LL_GPIO_MUX_5 - * @arg @ref LL_GPIO_MUX_6 - * @arg @ref LL_GPIO_MUX_7 - * @arg @ref LL_GPIO_MUX_8 - */ -__STATIC_INLINE uint32_t ll_gpio_get_mux_pin_0_7(gpio_regs_t *GPIOx, uint32_t pin) -{ - volatile uint32_t *pReg = LL_GPIO_GET_REG_MUX_CTRL_0_7(GPIOx); - uint32_t pos = POSITION_VAL(pin) << 2; - return (READ_BITS(*pReg, 0xF << pos) >> pos); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * DPAD_MUX_CTRL8_15 | CTRL8_15 - * DPAD_MUX_CTRL24_31 | CTRL24_31 - * - * @param GPIOx GPIO Port - * @param pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param mux This parameter can be one of the following values: - * @arg @ref LL_GPIO_MUX_0 - * @arg @ref LL_GPIO_MUX_1 - * @arg @ref LL_GPIO_MUX_2 - * @arg @ref LL_GPIO_MUX_3 - * @arg @ref LL_GPIO_MUX_4 - * @arg @ref LL_GPIO_MUX_5 - * @arg @ref LL_GPIO_MUX_6 - * @arg @ref LL_GPIO_MUX_7 - * @arg @ref LL_GPIO_MUX_8 - * @retval None - */ -__STATIC_INLINE void ll_gpio_set_mux_pin_8_15(gpio_regs_t *GPIOx, uint32_t pin, uint32_t mux) -{ - volatile uint32_t *pReg = LL_GPIO_GET_REG_MUX_CTRL_8_15(GPIOx); - uint32_t pos = POSITION_VAL(pin >> 8) << 2; - MODIFY_REG(*pReg, 0xF << pos, mux << pos); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * - * Register|BitsName - * --------|-------- - * DPAD_MUX_CTRL8_15 | CTRL8_15 - * DPAD_MUX_CTRL24_31 | CTRL24_31 - * - * @param GPIOx GPIO Port - * @param pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_MUX_0 - * @arg @ref LL_GPIO_MUX_1 - * @arg @ref LL_GPIO_MUX_2 - * @arg @ref LL_GPIO_MUX_3 - * @arg @ref LL_GPIO_MUX_4 - * @arg @ref LL_GPIO_MUX_5 - * @arg @ref LL_GPIO_MUX_6 - * @arg @ref LL_GPIO_MUX_7 - * @arg @ref LL_GPIO_MUX_8 - */ -__STATIC_INLINE uint32_t ll_gpio_get_mux_pin_8_15(gpio_regs_t *GPIOx, uint32_t pin) -{ - volatile uint32_t *pReg = LL_GPIO_GET_REG_MUX_CTRL_8_15(GPIOx); - uint32_t pos = POSITION_VAL(pin >> 8) << 2; - return (READ_BITS(*pReg, 0xF << pos) >> pos); -} - -/** @} */ - -/** @defgroup GPIO_LL_EF_Data_Access Data Access - * @{ - */ - -/** - * @brief Return full input data register value for a dedicated port. - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param GPIOx GPIO Port - * @retval Input data register value of port - */ -__STATIC_INLINE uint32_t ll_gpio_read_input_port(gpio_regs_t *GPIOx) -{ - return (uint32_t)(READ_REG(GPIOx->DATA)); -} - -/** - * @brief Return if input data level for several pins of dedicated port is high or low. - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_input_pin_set(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return (READ_BITS(GPIOx->DATA, pin_mask) == (pin_mask)); -} - -/** - * @brief Write output data register for the port. - * - * Register|BitsName - * --------|-------- - * DATAOUT | DATAOUT - * - * @param GPIOx GPIO Port - * @param port_value Level value for each pin of the port - * @retval None - */ -__STATIC_INLINE void ll_gpio_write_output_port(gpio_regs_t *GPIOx, uint32_t port_value) -{ - WRITE_REG(GPIOx->DATAOUT, port_value); -} - -/** - * @brief Return full output data register value for a dedicated port. - * - * Register|BitsName - * --------|-------- - * DATAOUT | DATAOUT - * - * @param GPIOx GPIO Port - * @retval Output data register value of port - */ -__STATIC_INLINE uint32_t ll_gpio_read_output_port(gpio_regs_t *GPIOx) -{ - return (uint32_t)(READ_REG(GPIOx->DATAOUT)); -} - -/** - * @brief Return if input data level for several pins of dedicated port is high or low. - * - * Register|BitsName - * --------|-------- - * DATAOUT | DATAOUT - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_output_pin_set(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return (READ_BITS(GPIOx->DATAOUT, pin_mask) == (pin_mask)); -} - -/** - * @brief Set several pins to high level on dedicated gpio port. - * - * Register|BitsName - * --------|-------- - * DATAOUT | DATAOUT - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_set_output_pin(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ -#ifdef USE_GPIO_MASK_REGISTER - WRITE_REG(GPIOx->MASKLOWBYTE[(uint8_t)pin_mask], pin_mask & GPIO_MASKLOWBYTE_DATA); - WRITE_REG(GPIOx->MASKHIGHBYTE[(uint8_t)(pin_mask >> GPIO_MASKHIGHBYTE_DATA_Pos)], - pin_mask & GPIO_MASKHIGHBYTE_DATA); -#else - SET_BITS(GPIOx->DATAOUT, pin_mask); -#endif -} - -/** - * @brief Set several pins to low level on dedicated gpio port. - * - * Register|BitsName - * --------|-------- - * DATAOUT | DATAOUT - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_reset_output_pin(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ -#ifdef USE_GPIO_MASK_REGISTER - WRITE_REG(GPIOx->MASKLOWBYTE[(uint8_t)pin_mask], 0x0000U); - WRITE_REG(GPIOx->MASKHIGHBYTE[(uint8_t)(pin_mask >> ITEM_8)], 0x0000U); -#else - CLEAR_BITS(GPIOx->DATAOUT, pin_mask); -#endif -} - -/** - * @brief Toggle data value for several pin of dedicated port. - * - * Register|BitsName - * --------|-------- - * DATAOUT | DATAOUT - * - * @param GPIOx GPIO Port - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_toggle_pin(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->DATAOUT, READ_REG(GPIOx->DATAOUT) ^ pin_mask); -} - -/** @} */ - -/** @defgroup GPIO_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable GPIO Falling Edge Trigger for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPESET | INTTYPESET - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_enable_falling_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTPOLCLR, pin_mask); - WRITE_REG(GPIOx->INTTYPESET, pin_mask); -} - -/** - * @brief Check if falling edge trigger is enabled for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPESET | INTTYPESET - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_enabled_falling_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return ((READ_BITS(GPIOx->INTPOLCLR, pin_mask) == (pin_mask)) && - (READ_BITS(GPIOx->INTTYPESET, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable GPIO Rising Edge Trigger for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPESET | INTTYPESET - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_enable_rising_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTPOLSET, pin_mask); - WRITE_REG(GPIOx->INTTYPESET, pin_mask); -} - -/** - * @brief Check if rising edge trigger is enabled for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPESET | INTTYPESET - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @note Please check each device line mapping for GPIO Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_enabled_rising_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return ((READ_BITS(GPIOx->INTPOLSET, pin_mask) == (pin_mask)) && - (READ_BITS(GPIOx->INTTYPESET, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable GPIO High Level Trigger for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPECLR | INTTYPECLR - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_enable_high_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTPOLSET, pin_mask); - WRITE_REG(GPIOx->INTTYPECLR, pin_mask); -} - -/** - * @brief Check if high level trigger is enabled for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLSET | INTPOLSET - * INTTYPECLR | INTTYPECLR - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_enabled_high_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return ((READ_BITS(GPIOx->INTPOLSET, pin_mask) == (pin_mask)) && - (READ_BITS(GPIOx->INTTYPECLR, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable GPIO Low Level Trigger for pins in the range of 0 to 15. - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPECLR | INTTYPECLR - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_enable_low_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTPOLCLR, pin_mask); - WRITE_REG(GPIOx->INTTYPECLR, pin_mask); -} - -/** - * @brief Check if low level trigger is enabled for pins in the range of 0 to 15 - * @note - * - * Register|BitsName - * --------|-------- - * INTPOLCLR | INTPOLCLR - * INTTYPECLR | INTTYPECLR - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_enabled_low_trigger(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return ((READ_BITS(GPIOx->INTPOLCLR, pin_mask) == (pin_mask)) && - (READ_BITS(GPIOx->INTTYPECLR, pin_mask) == (pin_mask))); -} - -/** - * @brief Enable GPIO interrupts for pins in the range of 0 to 15. - * @note @ref GPIO_LL_EC_TRIGGER can be used to specify the interrupt trigger type - * - * Register|BitsName - * --------|-------- - * INTENSET | INTENSET - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_enable_it(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTENSET, pin_mask); -} - -/** - * @brief Disable GPIO interrupts for pins in the range of 0 to 15. - * @note @ref GPIO_LL_EC_TRIGGER can be used to specify the interrupt trigger type - * - * Register|BitsName - * --------|-------- - * INTENCLR | INTENCLR - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_disable_it(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTENCLR, pin_mask); -} - -/** - * @brief Check if the Interrupt of specified GPIO pins is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTENSET | INTENSET - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_enabled_it(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return (READ_BITS(GPIOx->INTENSET, pin_mask) == (pin_mask)); -} - -/** @} */ - -/** @defgroup GPIO_LL_EF_Flag_Management Flag_Management - * @{ - */ - -/** - * @brief Read GPIO Interrupt Combination Flag for pins in the range of 0 to 15 - * @note After an interrupt is triggered, the corresponding bit in the INTSTATUS Register is set. - * The interrupt status can be cleared by writing 1 to corresponding bit in INTCLEAR Register. - * - * Register|BitsName - * --------|-------- - * INTSTATUS | INTSTATUS - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval Interrupt flag whose bits were set when the selected trigger event arrives on the interrupt - */ -__STATIC_INLINE uint32_t ll_gpio_read_flag_it(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return (uint32_t)(READ_BITS(GPIOx->INTSTAT, pin_mask)); -} - -/** - * @brief Indicates if the GPIO Interrupt Flag is set or not for pins in the range of 0 to 15. - * @note After an interrupt is triggered, the corresponding bit in the INTSTATUS Register is set. - * The interrupt status can be cleared by writing 1 to corresponding bit in INTCLEAR Register. - * - * Register|BitsName - * --------|-------- - * INTSTATUS | INTSTATUS - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_gpio_is_active_flag_it(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - return (READ_BITS(GPIOx->INTSTAT, pin_mask) == pin_mask); -} - -/** - * @brief Clear Interrupt Status flag for pins in the range of 0 to 15. - * @note After an interrupt is triggered, the corresponding bit in the INTSTATUS Register is set. - * The interrupt status can be cleared by writing 1 to corresponding bit in INTCLEAR Register. - * - * Register|BitsName - * --------|-------- - * INTSTATUS | INTSTATUS - * - * @param GPIOx GPIO instance. - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_gpio_clear_flag_it(gpio_regs_t *GPIOx, uint32_t pin_mask) -{ - WRITE_REG(GPIOx->INTSTAT, pin_mask); -} - -/** @} */ - -/** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize GPIO registers (Registers restored to their default values). - * @param GPIOx GPIO instance. - * @retval An error_status_t enumeration value: - * - SUCCESS: GPIO registers are de-initialized - * - ERROR: GPIO registers are not de-initialized - */ -error_status_t ll_gpio_deinit(gpio_regs_t *GPIOx); - -/** - * @brief Initialize GPIO registers according to the specified - * parameters in p_gpio_init. - * @param GPIOx GPIO instance. - * @param p_gpio_init Pointer to a ll_gpio_init_t structure that contains the configuration - * information for the specified GPIO peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: GPIO registers are initialized according to p_gpio_init content - * - ERROR: Problem occurred during GPIO Registers initialization - */ -error_status_t ll_gpio_init(gpio_regs_t *GPIOx, ll_gpio_init_t *p_gpio_init); - -/** - * @brief Set each field of a @ref ll_gpio_init_t type structure to default value. - * @param p_gpio_init Pointer to a @ref ll_gpio_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_gpio_struct_init(ll_gpio_init_t *p_gpio_init); - -/** @} */ - -/** @} */ - -#endif /* defined (GPIO0) || defined (GPIO1) */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_GPIO_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_hmac.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_hmac.h deleted file mode 100755 index b9067e1..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_hmac.h +++ /dev/null @@ -1,1183 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_hmac.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of HMAC LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_HMAC HMAC - * @brief HMAC LL module driver. - * @{ - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_HMAC_H__ -#define __GR55XX_LL_HMAC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (HMAC) - -/** @defgroup HMAC_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup HMAC_LL_ES_INIT HMAC Exported Init structures - * @{ - */ - -/** - * @brief LL HMAC Init Structure definition - */ -typedef struct _ll_hmac_init_t { - uint32_t *p_key; /**< Key */ - - uint32_t *p_hash; /**< HASH value */ -} ll_hmac_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup HMAC_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup HMAC_LL_Exported_Constants HMAC Exported Constants - * @{ - */ - -/** @defgroup HMAC_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags definitions which can be used with LL_HMAC_ReadReg function - * @{ - */ -#define LL_HMAC_FLAG_DATAREADY_SHA HMAC_STATUS_DATAREADY_SHA /**< HMAC data ready(SHA mode) */ -#define LL_HMAC_FLAG_DATAREADY_HMAC HMAC_STATUS_DATAREADY_HMAC /**< HMAC data ready(HAMC mode) */ -#define LL_HMAC_FLAG_DMA_MESSAGEDONE HMAC_STATUS_MESSAGEDONE_DMA /**< HMAC dma message done */ -#define LL_HMAC_FLAG_DMA_DONE HMAC_STATUS_TRANSDONE_DMA /**< HMAC dma transfer done */ -#define LL_HMAC_FLAG_DMA_ERR HMAC_STATUS_TRANSERR_DMA /**< HMAC dma transfer error */ -#define LL_HMAC_FLAG_KEY_VALID HMAC_STATUS_KEYVALID /**< HMAC has fetched key */ -/** @} */ - -/** @defgroup HMAC_LL_EC_HASH_MODE Hash Mode - * @{ - */ -#define LL_HMAC_HASH_STANDARD 0x00000000U /**< Standard Mode */ -#define LL_HMAC_HASH_USER (1UL << HMAC_CONFIG_ENABLE_USERHASH) /**< User Mode */ -/** @} */ - -/** @defgroup HMAC_LL_EC_CALCULATE_TYPE Calculate Type - * @{ - */ -#define LL_HMAC_CALCULATETYPE_HMAC 0x00000000U /**< HMAC mode */ -#define LL_HMAC_CALCULATETYPE_SHA (1UL << HMAC_CONFIG_CALCTYPE_Pos) /**< SHA moe */ -/** @} */ - -/** @defgroup HMAC_LL_EC_KEY_TYPE Key Type - * @{ - */ -#define LL_HMAC_KEYTYPE_MCU 0x00000000U /**< MCU */ -#define LL_HMAC_KEYTYPE_AHB (1UL << HMAC_CONFIG_KEYTYPE_Pos) /**< AHB master */ -#define LL_HMAC_KEYTYPE_KRAM (2UL << HMAC_CONFIG_KEYTYPE_Pos) /**< Key Port */ -/** @} */ - -/** @defgroup HMAC_LL_EC_TRANSFER_SIZE Transfer Size - * @{ - */ -#define LL_HMAC_DMA_TRANSIZE_MIN (1) /**< Min size = 1 block */ -#define LL_HMAC_DMA_TRANSIZE_MAX (512) /**< Min size = 512 blocks */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HMAC_LL_Exported_Macros HMAC Exported Macros - * @{ - */ - -/** @defgroup HMAC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in HMAC register - * @param __INSTANCE__ HMAC Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_HMAC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in HMAC register - * @param __INSTANCE__ HMAC Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_HMAC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup HMAC_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup HMAC_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable HMAC. - - * Register|BitsName - * --------|-------- - * CTRL | ENABLE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CTRL, HMAC_CTRL_ENABLE); -} - -/** - * @brief Disable HMAC. - - * Register|BitsName - * --------|-------- - * CTRL | ENABLE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->CTRL, HMAC_CTRL_ENABLE); -} - -/** - * @brief Indicate whether the HMAC is enabled. - - * Register|BitsName - * --------|-------- - * CTRL | ENABLE - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CTRL, HMAC_CTRL_ENABLE) == (HMAC_CTRL_ENABLE)); -} - -/** - * @brief Enable HMAC DMA mode. - - * Register|BitsName - * --------|-------- - * CTRL | START_DMA - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_dma_start(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CTRL, HMAC_CTRL_START_DMA); -} - -/** - * @brief Disable HMAC DMA mode. - - * Register|BitsName - * --------|-------- - * CTRL | START_DMA - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable_dma_start(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->CTRL, HMAC_CTRL_START_DMA); -} - -/** - * @brief Indicate whether the HMAC DMA mode is enabled. - - * Register|BitsName - * --------|-------- - * CTRL | START_DMA - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled_dma_start(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CTRL, HMAC_CTRL_START_DMA) == (HMAC_CTRL_START_DMA)); -} - -/** - * @brief Enable fetch key through AHB/key port. - - * Register|BitsName - * --------|-------- - * CTRL | ENABLE_RKEY - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_read_key(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CTRL, HMAC_CTRL_ENABLE_RKEY); -} - -/** - * @brief Enable last block transfer in MCU/DMA mode. - - * Register|BitsName - * --------|-------- - * CTRL | LASTTRANSFER - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_last_transfer(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CTRL, HMAC_CTRL_LASTTRANSFER); -} - -/** - * @brief Enable user HASH. - - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_USERHASH - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_user_hash(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CONFIG, HMAC_CONFIG_ENABLE_USERHASH); -} - -/** - * @brief Disable user HASH. - - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_USERHASH - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable_user_hash(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->CONFIG, HMAC_CONFIG_ENABLE_USERHASH); -} - -/** - * @brief Indicate whether the user HASH is enabled. - - * Register|BitsName - * --------|-------- - * CONFIG | ENABLE_USERHASH - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled_user_hash(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CONFIG, HMAC_CONFIG_ENABLE_USERHASH) == (HMAC_CONFIG_ENABLE_USERHASH)); -} - -/** - * @brief Enable HMAC in little endian. - - * Register|BitsName - * --------|-------- - * CONFIG | ENDIAN - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_little_endian(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CONFIG, HMAC_CONFIG_ENDIAN); -} - -/** - * @brief Disable HMAC in little endian. - - * Register|BitsName - * --------|-------- - * CONFIG | ENDIAN - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable_little_endian(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->CONFIG, HMAC_CONFIG_ENDIAN); -} - -/** - * @brief Indicate whether the HMAC is in little endian. - - * Register|BitsName - * --------|-------- - * CONFIG | ENDIAN - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled_little_endian(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CONFIG, HMAC_CONFIG_ENDIAN) == (HMAC_CONFIG_ENDIAN)); -} - -/** - * @brief Set ways to obtain HMAC key. - - * Register|BitsName - * --------|-------- - * CONFIG | KEYTYPE - - * @param HMACx HMAC instance - * @param type This parameter can be one of the following values: - * @arg @ref LL_HMAC_KEYTYPE_MCU - * @arg @ref LL_HMAC_KEYTYPE_AHB - * @arg @ref LL_HMAC_KEYTYPE_KRAM - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key_type(hmac_regs_t *HMACx, uint32_t type) -{ - MODIFY_REG(HMACx->CONFIG, HMAC_CONFIG_KEYTYPE, type); -} - -/** - * @brief Get ways to obtain HMAC key. - - * Register|BitsName - * --------|-------- - * CONFIG | KEYTYPE - - * @param HMACx HMAC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_HMAC_KEYTYPE_MCU - * @arg @ref LL_HMAC_KEYTYPE_AHB - * @arg @ref LL_HMAC_KEYTYPE_KRAM - */ -__STATIC_INLINE uint32_t ll_hmac_get_key_type(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CONFIG, HMAC_CONFIG_KEYTYPE)); -} - -/** - * @brief Enable SHA mode. - - * Register|BitsName - * --------|-------- - * CONFIG | CALCTYPE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_sha(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CONFIG, HMAC_CONFIG_CALCTYPE); -} - -/** - * @brief Disable SHA mode. - - * Register|BitsName - * --------|-------- - * CONFIG | CALCTYPE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable_sha(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->CONFIG, HMAC_CONFIG_CALCTYPE); -} - -/** - * @brief Indicate whether the SHA mode is enabled. - - * Register|BitsName - * --------|-------- - * CONFIG | CALCTYPE - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled_sha(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CONFIG, HMAC_CONFIG_CALCTYPE) == (HMAC_CONFIG_CALCTYPE)); -} - -/** - * @brief Enable private mode. - - * Register|BitsName - * --------|-------- - * CONFIG | PRIVATE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_private(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->CONFIG, HMAC_CONFIG_PRIVATE); -} - -/** - * @brief Disable private mode. - - * Register|BitsName - * --------|-------- - * CONFIG | PRIVATE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable_private(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->CONFIG, HMAC_CONFIG_PRIVATE); -} - -/** - * @brief Indicate whether the private mode is enabled. - - * Register|BitsName - * --------|-------- - * CONFIG | PRIVATE - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled_private(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->CONFIG, HMAC_CONFIG_PRIVATE) == (HMAC_CONFIG_PRIVATE)); -} - -/** @} */ - -/** @defgroup HMAC_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable the done interrupt for HMAC. - - * Register|BitsName - * --------|-------- - * INTERRUPT | ENABLE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_enable_it_done(hmac_regs_t *HMACx) -{ - SET_BITS(HMACx->INTERRUPT, HMAC_INTERRUPT_ENABLE); -} - -/** - * @brief Disable the done interrupt for HMAC. - - * Register|BitsName - * --------|-------- - * INTERRUPT | ENABLE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_disable_it_done(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->INTERRUPT, HMAC_INTERRUPT_ENABLE); -} - -/** - * @brief Indicate whether Done Interrupt is enabled. - - * Register|BitsName - * --------|-------- - * INTERRUPT | ENABLE - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_enabled_it_done(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->INTERRUPT, HMAC_INTERRUPT_ENABLE) == (HMAC_INTERRUPT_ENABLE)); -} - -/** @} */ - -/** @defgroup HMAC_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Indicate whether SHA Ready flag is set. - - * Register|BitsName - * --------|-------- - * STATUS | DATAREADY_SHA - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_sha_ready(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->STATUS, HMAC_STATUS_DATAREADY_SHA) == HMAC_STATUS_DATAREADY_SHA); -} - -/** - * @brief Indicate whether HMAC Ready flag is set. - - * Register|BitsName - * --------|-------- - * STATUS | DATAREADY_HMAC - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_hmac_ready(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->STATUS, HMAC_STATUS_DATAREADY_HMAC) == HMAC_STATUS_DATAREADY_HMAC); -} - -/** - * @brief Indicate whether DMA Transmit Message Done flag is set. - - * Register|BitsName - * --------|-------- - * STATUS | MESSAGEDONE_DMA - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_dma_message_done(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->STATUS, HMAC_STATUS_MESSAGEDONE_DMA) == HMAC_STATUS_MESSAGEDONE_DMA); -} - -/** - * @brief Indicate whether DMA Transfer Done flag is set. - - * Register|BitsName - * --------|-------- - * STATUS | TRANSDONE_DMA - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_dma_done(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->STATUS, HMAC_STATUS_TRANSDONE_DMA) == HMAC_STATUS_TRANSDONE_DMA); -} - -/** - * @brief Indicate whether DMA Transfer Error flag is set. - - * Register|BitsName - * --------|-------- - * STATUS | TRANSERR_DMA - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_dma_error(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->STATUS, HMAC_STATUS_TRANSERR_DMA) == HMAC_STATUS_TRANSERR_DMA); -} - -/** - * @brief Indicate whether Key Valid flag is set. - - * Register|BitsName - * --------|-------- - * STATUS | KEYVALID - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_key_valid(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->STATUS, HMAC_STATUS_KEYVALID) == HMAC_STATUS_KEYVALID); -} - -/** - * @brief Indicate whether Done interrupt flag is set. - - * Register|BitsName - * --------|-------- - * INTERRUPT | DONE - - * @param HMACx HMAC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_hmac_is_action_flag_it_done(hmac_regs_t *HMACx) -{ - return (READ_BITS(HMACx->INTERRUPT, HMAC_INTERRUPT_DONE) == HMAC_INTERRUPT_DONE); -} - -/** - * @brief Clear Done interrupt flag. - - * Register|BitsName - * --------|-------- - * INTERRUPT | DONE - - * @param HMACx HMAC instance - * @retval None - */ -__STATIC_INLINE void ll_hmac_clear_flag_it_done(hmac_regs_t *HMACx) -{ - CLEAR_BITS(HMACx->INTERRUPT, HMAC_INTERRUPT_DONE); -} - -/** @} */ - -/** @defgroup HMAC_LL_EF_DMA_Management DMA_Management - * @{ - */ - -/** - * @brief Set HMAC transfer blocks in DMA mode. - - * Register|BitsName - * --------|-------- - * TRANSIZE | TRANSIZE - - * @param HMACx HMAC instance - * @param block This parameter can be one of the following values: 1 ~ 512 - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_dma_transfer_block(hmac_regs_t *HMACx, uint32_t block) -{ - MODIFY_REG(HMACx->TRAN_SIZE, HMAC_TRANSIZE, (block << ITEM_6) - 1); -} - -/** - * @brief Get HMAC transfer blocks in DMA mode. - - * Register|BitsName - * --------|-------- - * TRANSIZE | TRANSIZE - - * @param HMACx HMAC instance - * @retval Return value is between: 1 ~ 512 - */ -__STATIC_INLINE uint32_t ll_hmac_get_dma_transfer_block(hmac_regs_t *HMACx) -{ - return ((READ_BITS(HMACx->TRAN_SIZE, HMAC_TRANSIZE) + 1) >> ITEM_6); -} - -/** - * @brief Set HMAC read address of RAM in DMA mode. - - * Register|BitsName - * --------|-------- - * RSTART_ADDR | RSTART_ADDR - - * @param HMACx HMAC instance - * @param address This parameter can be one of the address in RAM - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_dma_read_address(hmac_regs_t *HMACx, uint32_t address) -{ - WRITE_REG(HMACx->RSTART_ADDR, address); -} - -/** - * @brief Get HMAC read address of RAM in DMA mode. - - * Register|BitsName - * --------|-------- - * RSTART_ADDR | RSTART_ADDR - - * @param HMACx HMAC instance - * @retval Return value is the address in RAM - */ -__STATIC_INLINE uint32_t ll_hmac_get_dma_read_address(hmac_regs_t *HMACx) -{ - return (READ_REG(HMACx->RSTART_ADDR)); -} - -/** - * @brief Set HMAC write address of RAM in DMA mode. - - * Register|BitsName - * --------|-------- - * WSTART_ADDR | WSTART_ADDR - - * @param HMACx HMAC instance - * @param address This parameter can be one of the address in RAM - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_dma_write_address(hmac_regs_t *HMACx, uint32_t address) -{ - WRITE_REG(HMACx->WSTART_ADDR, address); -} - -/** - * @brief Get HMAC write address of RAM in DMA mode. - - * Register|BitsName - * --------|-------- - * WSTART_ADDR | WSTART_ADDR - - * @param HMACx HMAC instance - * @retval Return value is the address in RAM - */ -__STATIC_INLINE uint32_t ll_hmac_get_dma_write_address(hmac_regs_t *HMACx) -{ - return (READ_REG(HMACx->WSTART_ADDR)); -} - -/** @} */ - -/** @defgroup HMAC_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Set user HASH[255:224]. - - * Register|BitsName - * --------|-------- - * USER_HASH[0] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_255_224(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[0], hash); -} - -/** - * @brief Set user HASH[223:192]. - - * Register|BitsName - * --------|-------- - * USER_HASH[1] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_223_192(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[1], hash); -} - -/** - * @brief Set user HASH[191:160]. - - * Register|BitsName - * --------|-------- - * USER_HASH[2] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_191_160(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[ITEM_2], hash); -} - -/** - * @brief Set user HASH[159:128]. - - * Register|BitsName - * --------|-------- - * USER_HASH[3] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_159_128(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[ITEM_3], hash); -} - -/** - * @brief Set user HASH[127:96]. - - * Register|BitsName - * --------|-------- - * USER_HASH[4] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_127_96(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[ITEM_4], hash); -} - -/** - * @brief Set user HASH[95:64]. - - * Register|BitsName - * --------|-------- - * USER_HASH[5] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_95_64(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[ITEM_5], hash); -} - -/** - * @brief Set user HASH[63:32]. - - * Register|BitsName - * --------|-------- - * USER_HASH[6] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_63_32(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[ITEM_6], hash); -} - -/** - * @brief Set user HASH[31:0]. - - * Register|BitsName - * --------|-------- - * USER_HASH[7] | USER_HASH - - * @param HMACx HMAC instance - * @param hash This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_user_hash_31_0(hmac_regs_t *HMACx, uint32_t hash) -{ - WRITE_REG(HMACx->USER_HASH[ITEM_7], hash); -} - -/** - * @brief Get abstract from HMAC. - - * Register|BitsName - * --------|-------- - * FIFO_OUT | FIFO_OUT - - * @param HMACx HMAC instance - * @retval Abstract - */ -__STATIC_INLINE uint32_t ll_hmac_get_data(hmac_regs_t *HMACx) -{ - return (READ_REG(HMACx->FIFO_OUT)); -} - -/** - * @brief Send data to calculate. - - * Register|BitsName - * --------|-------- - * FIFO_MESSAGE | FIFO_MESSAGE - - * @param HMACx HMAC instance - * @param data This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_data(hmac_regs_t *HMACx, uint32_t data) -{ - WRITE_REG(HMACx->MESSAGE_FIFO, data); -} - -/** - * @brief Set HMAC key0. - - * Register|BitsName - * --------|-------- - * KEY[0] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key0(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[0], key); -} - -/** - * @brief Set HMAC key1. - - * Register|BitsName - * --------|-------- - * KEY[1] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key1(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[1], key); -} - -/** - * @brief Set HMAC key2. - - * Register|BitsName - * --------|-------- - * KEY[2] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key2(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[ITEM_2], key); -} - -/** - * @brief Set HMAC key3. - - * Register|BitsName - * --------|-------- - * KEY[3] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key3(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[ITEM_3], key); -} - -/** - * @brief Set HMAC key4. - - * Register|BitsName - * --------|-------- - * KEY[4] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key4(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[ITEM_4], key); -} - -/** - * @brief Set HMAC key5. - - * Register|BitsName - * --------|-------- - * KEY[5] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key5(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[ITEM_5], key); -} - -/** - * @brief Set HMAC key6. - - * Register|BitsName - * --------|-------- - * KEY[6] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key6(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[ITEM_6], key); -} - -/** - * @brief Set HMAC key7. - - * Register|BitsName - * --------|-------- - * KEY[7] | KEY - - * @param HMACx HMAC instance - * @param key This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key7(hmac_regs_t *HMACx, uint32_t key) -{ - WRITE_REG(HMACx->KEY[ITEM_7], key); -} - -/** - * @brief Set HMAC key address in memory. - - * Register|BitsName - * --------|-------- - * KEY_ADDR | KEY_ADDR - - * @param HMACx HMAC instance - * @param address This parameter can be one of the address in RAM - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key_address(hmac_regs_t *HMACx, uint32_t address) -{ - WRITE_REG(HMACx->KEY_ADDR, address); -} - -/** - * @brief Get HMAC key address in memory. - - * Register|BitsName - * --------|-------- - * KEY_ADDR | KEY_ADDR - - * @param HMACx HMAC instance - * @retval Return value is the address in RAM - */ -__STATIC_INLINE uint32_t ll_hmac_get_key_address(hmac_regs_t *HMACx) -{ - return (READ_REG(HMACx->KEY_ADDR)); -} - -/** - * @brief Set HMAC fetch key port mask. - - * Register|BitsName - * --------|-------- - * KPORT_MASK | KPORT_MASK - - * @param HMACx HMAC instance - * @param mask This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_hmac_set_key_port_mask(hmac_regs_t *HMACx, uint32_t mask) -{ - WRITE_REG(HMACx->KPORT_MASK, mask); -} - -/** @} */ - -/** @defgroup HMAC_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize HMAC registers (Registers restored to their default values). - * @param HMACx HMAC Instance - * @retval An error_status_t enumeration value: - * - SUCCESS: HMAC registers are de-initialized - * - ERROR: HMAC registers are not de-initialized - */ -error_status_t ll_hmac_deinit(hmac_regs_t *HMACx); - -/** - * @brief Initialize HMAC registers according to the specified - * parameters in p_hmac_init. - * @param HMACx HMAC Instance - * @param p_hmac_init Pointer to a ll_hmac_init_t structure that contains the configuration - * information for the specified HMAC peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: HMAC registers are initialized according to p_hmac_init content - * - ERROR: Problem occurred during HMAC Registers initialization - */ -error_status_t ll_hmac_init(hmac_regs_t *HMACx, ll_hmac_init_t *p_hmac_init); - -/** - * @brief Set each field of a @ref ll_hmac_init_t type structure to default value. - * @param p_hmac_init Pointer to a @ref ll_hmac_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_hmac_struct_init(ll_hmac_init_t *p_hmac_init); - -/** @} */ - -/** @} */ - -#endif /* HMAC */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_HMAC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2c.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2c.h deleted file mode 100755 index e7f9515..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2c.h +++ /dev/null @@ -1,3316 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_i2c.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of I2C LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_I2C I2C - * @brief I2C LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_I2C_H__ -#define __GR55xx_LL_I2C_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (I2C0) || defined (I2C1) - -/** @defgroup I2C_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2C_LL_ES_INIT I2C Exported init structure - * @{ - */ - -/** - * @brief LL I2C init Structure definition - */ -typedef struct _ll_i2c_init { - uint32_t speed; /**< Specifies the transfer speed. See @ref I2C_LL_EC_SPEED. */ - - uint32_t own_address; /**< Specifies the device own address. - This parameter must be a value between Min_Data = 0x00 and Max_Data = 0x3FF - - This feature can be modified afterwards using unitary function - @ref ll_i2c_set_own_address(). */ - - uint32_t own_addr_size; /**< Specifies the device own address 1 size (7-bit or 10-bit). - This parameter can be a value of @ref I2C_LL_EC_OWNADDRESS - - This feature can be modified afterwards using unitary function - @ref ll_i2c_set_own_address(). */ -} ll_i2c_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup I2C_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags definitions which can be used with LL_I2C_ReadReg function - * @{ - */ -#define LL_I2C_INTR_STAT_MST_ON_HOLD I2C_INTR_GEN_CALL /**< MST_ON_HOLD interrupt flag */ -#define LL_I2C_INTR_STAT_RESTART_DET I2C_INTR_RESTART_DET /**< RESTART_DET interrupt flag */ -#define LL_I2C_INTR_STAT_GEN_CALL I2C_INTR_GEN_CALL /**< GEN_CALL interrupt flag */ -#define LL_I2C_INTR_STAT_START_DET I2C_INTR_START_DET /**< START_DET interrupt flag */ -#define LL_I2C_INTR_STAT_STOP_DET I2C_INTR_STOP_DET /**< STOP_DET interrupt flag */ -#define LL_I2C_INTR_STAT_ENABLE I2C_INTR_ENABLE /**< ENABLE interrupt flag */ -#define LL_I2C_INTR_STAT_RX_DONE I2C_INTR_RX_DONE /**< RX_DONE interrupt flag */ -#define LL_I2C_INTR_STAT_TX_ABRT I2C_INTR_TX_ABRT /**< TX_ABRT interrupt flag */ -#define LL_I2C_INTR_STAT_RD_REQ I2C_INTR_RD_REQ /**< RD_REQ interrupt flag */ -#define LL_I2C_INTR_STAT_TX_EMPTY I2C_INTR_TX_EMPTY /**< TX_EMPTY interrupt flag */ -#define LL_I2C_INTR_STAT_TX_OVER I2C_INTR_TX_OVER /**< TX_OVER interrupt flag */ -#define LL_I2C_INTR_STAT_RX_FULL I2C_INTR_RX_FULL /**< RX_FULL interrupt flag */ -#define LL_I2C_INTR_STAT_RX_OVER I2C_INTR_RX_OVER /**< RX_OVER interrupt flag */ -#define LL_I2C_INTR_STAT_RX_UNDER I2C_INTR_RX_UNDER /**< RX_UNDER interrupt flag */ - -#define LL_I2C_ABRT_TX_FLUSH_CNT I2C_TX_ABRT_SRC_TX_FLUSH_CNT /**< Transfer abort detected by master */ -#define LL_I2C_ABRT_USER_ABRT I2C_TX_ABRT_SRC_USER_ABRT /**< Transfer abort detected by master */ -#define LL_I2C_ABRT_SLVRD_INTX I2C_TX_ABRT_SRC_SLVRD_INTX /**< Slave trying to transmit to - remote master in read mode */ -#define LL_I2C_ABRT_SLV_ARBLOST I2C_TX_ABRT_SRC_SLV_ARBLOST /**< Slave lost arbitration to - remote master */ -#define LL_I2C_ABRT_SLVFLUSH_TXFIFO I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO /**< Slave flushes existing data - in TX-FIFO upon getting read command */ -#define LL_I2C_ABRT_ARB_LOST I2C_TX_ABRT_SRC_ARB_LOST /**< Master or Slave Transmitter - lost arbitration */ -#define LL_I2C_ABRT_MST_DIS I2C_TX_ABRT_SRC_MST_DIS /**< User intitating master operation - when MASTER disabled */ -#define LL_I2C_ABRT_10B_RD_NORSTRT I2C_TX_ABRT_SRC_10B_RD_NORSTRT /**< Master trying to read in 10-Bit - addressing mode when RESTART disable */ -#define LL_I2C_ABRT_SBYTE_NORSTRT I2C_TX_ABRT_SRC_SBYTE_NORSTRT /**< User trying to send START byte - when RESTART disabled */ -#define LL_I2C_ABRT_HS_NORSTRT I2C_TX_ABRT_SRC_HS_NORSTRT /**< User trying to swidth Master to HS mode - when RESTART disabled */ -#define LL_I2C_ABRT_SBYTE_ACKDET I2C_TX_ABRT_SRC_SBYTE_ACKDET /**< ACK detected for START byte */ -#define LL_I2C_ABRT_HS_ACKDET I2C_TX_ABRT_SRC_HS_ACKDET /**< HS Master code is ACKed in HS Mode */ -#define LL_I2C_ABRT_GCALL_READ I2C_TX_ABRT_SRC_GCALL_READ /**< GCALL is followed by read from bus */ -#define LL_I2C_ABRT_GCALL_NOACK I2C_TX_ABRT_SRC_GCALL_NOACK /**< GCALL is not ACKed by any slave */ -#define LL_I2C_ABRT_TXDATA_NOACK I2C_TX_ABRT_SRC_TXDATA_NOACK /**< Transmitted data is not ACKed - by addressed slave */ -#define LL_I2C_ABRT_10ADDR2_NOACK I2C_TX_ABRT_SRC_10ADDR2_NOACK /**< Byte 2 of 10-Bit Address is not ACKed - by any slave */ -#define LL_I2C_ABRT_10ADDR1_NOACK I2C_TX_ABRT_SRC_10ADDR1_NOACK /**< Byte 1 of 10-Bit Address is not ACKed - by any slave */ -#define LL_I2C_ABRT_7B_ADDR_NOACK I2C_TX_ABRT_SRC_7B_ADDR_NOACK /**< 7Bit Address is not ACKed - by any slave */ -/** @} */ - -/** @defgroup I2C_LL_EC_IT IT Defines - * @brief Interrupt definitions which can be used with LL_I2C_ReadReg and LL_I2C_WriteReg functions - * @{ - */ -#define LL_I2C_INTR_MASK_MST_ON_HOLD I2C_INTR_GEN_CALL /**< MST_ON_HOLD interrupt */ -#define LL_I2C_INTR_MASK_RESTART_DET I2C_INTR_RESTART_DET /**< RESTART_DET interrupt */ -#define LL_I2C_INTR_MASK_GEN_CALL I2C_INTR_GEN_CALL /**< GEN_CALL interrupt */ -#define LL_I2C_INTR_MASK_START_DET I2C_INTR_START_DET /**< START_DET interrupt */ -#define LL_I2C_INTR_MASK_STOP_DET I2C_INTR_STOP_DET /**< STOP_DET interrupt */ -#define LL_I2C_INTR_MASK_ENABLE I2C_INTR_ENABLE /**< ENABLE interrupt */ -#define LL_I2C_INTR_MASK_RX_DONE I2C_INTR_RX_DONE /**< RX_DONE interrupt */ -#define LL_I2C_INTR_MASK_TX_ABRT I2C_INTR_TX_ABRT /**< TX_ABRT interrupt */ -#define LL_I2C_INTR_MASK_RD_REQ I2C_INTR_RD_REQ /**< RD_REQ interrupt */ -#define LL_I2C_INTR_MASK_TX_EMPTY I2C_INTR_TX_EMPTY /**< TX_EMPTY interrupt */ -#define LL_I2C_INTR_MASK_TX_OVER I2C_INTR_TX_OVER /**< TX_OVER interrupt */ -#define LL_I2C_INTR_MASK_RX_FULL I2C_INTR_RX_FULL /**< RX_FULL interrupt */ -#define LL_I2C_INTR_MASK_RX_OVER I2C_INTR_RX_OVER /**< RX_OVER interrupt */ -#define LL_I2C_INTR_MASK_RX_UNDER I2C_INTR_RX_UNDER /**< RX_UNDER interrupt */ - -#define LL_I2C_INTR_MASK_ALL 0x00000FFFU /**< All interrupt */ -/** @} */ - -/** @defgroup I2C_LL_EC_ADDRESSING_MODE Master Addressing Mode - * @{ - */ -#define LL_I2C_ADDRESSING_MODE_7BIT 0x00000000U /**< Master operates in 7-bit addressing mode. */ -#define LL_I2C_ADDRESSING_MODE_10BIT I2C_CON_10BITADDR_MST /**< Master operates in 10-bit addressing mode.*/ -/** @} */ - -/** @defgroup I2C_LL_EC_OWNADDRESS Own Address Length - * @{ - */ -#define LL_I2C_OWNADDRESS_7BIT 0x00000000U /**< Own address 1 is a 7-bit address. */ -#define LL_I2C_OWNADDRESS_10BIT I2C_CON_10BITADDR_SLV /**< Own address 1 is a 10-bit address.*/ -/** @} */ - - -/** @defgroup I2C_LL_EC_GENERATE Start And Stop Generation - * @{ - */ -#define LL_I2C_CMD_SLV_NONE 0x00000000U /**< Slave No command. */ -#define LL_I2C_CMD_MST_WRITE 0x00000000U /**< Master write command. */ -#define LL_I2C_CMD_MST_READ I2C_DATA_CMD_CMD /**< Master read command. */ -#define LL_I2C_CMD_MST_GEN_STOP I2C_DATA_CMD_STOP /**< Master issue STOP after this command. */ -#define LL_I2C_CMD_MST_GEN_RESTART I2C_DATA_CMD_RESTART /**< Master issue RESTART before this command. */ -/** @} */ - -/** @defgroup I2C_LL_EC_SPEED_MODE Transfer Speed Mode - * @{ - */ -#define LL_I2C_SPEED_MODE_STANDARD I2C_CON_SPEED_STANDARD /**< Standard Speed mode (0 to 100 Kb/s) - of operation. */ -#define LL_I2C_SPEED_MODE_FAST I2C_CON_SPEED_FAST /**< Fast (鈮?400 Kb/s) or - Fast Plus mode (鈮?1000 螝b/s) of operation. */ -#define LL_I2C_SPEED_MODE_HIGH I2C_CON_SPEED_HIGH /**< High Speed mode (鈮?3.4 Mb/s) of operation. */ -/** @} */ - -/** @defgroup I2C_LL_EC_SPEED Transfer Speed - * @{ - */ -#define LL_I2C_SPEED_100K (100000ul) /**< Standard Speed. */ -#define LL_I2C_SPEED_400K (400000ul) /**< Fast Speed. */ -#define LL_I2C_SPEED_1000K (1000000ul) /**< Fast Plus Speed. */ -#define LL_I2C_SPEED_2000K (2000000ul) /**< High Speed. */ -/** @} */ - -/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction - * @{ - */ -#define LL_I2C_DIRECTION_NONE 0x00000000U /**< No transfer request by master. */ -#define LL_I2C_DIRECTION_WRITE I2C_INTR_RX_FULL /**< Write transfer request by master, - slave enters receiver mode. */ -#define LL_I2C_DIRECTION_READ I2C_INTR_RD_REQ /**< Read transfer request by master, - slave enters transmitter mode. */ -#define LL_I2C_DIRECTION_ERROR I2C_INTR_RX_FULL | I2C_INTR_RD_REQ /**< Transfer request error. */ -/** @} */ - - -/** @defgroup I2C_LL_EC_TX_FIFO_TH TX FIFO Threshold - * @{ - */ -#define LL_I2C_TX_FIFO_TH_EMPTY 0x00000000U /**< TX FIFO empty */ -#define LL_I2C_TX_FIFO_TH_CHAR_1 0x00000001U /**< 1 character in TX FIFO */ -#define LL_I2C_TX_FIFO_TH_CHAR_2 0x00000002U /**< 2 characters in TX FIFO */ -#define LL_I2C_TX_FIFO_TH_CHAR_3 0x00000003U /**< 3 characters in TX FIFO */ -#define LL_I2C_TX_FIFO_TH_CHAR_4 0x00000004U /**< 4 characters in TX FIFO */ -#define LL_I2C_TX_FIFO_TH_CHAR_5 0x00000005U /**< 5 characters in TX FIFO */ -#define LL_I2C_TX_FIFO_TH_CHAR_6 0x00000006U /**< 6 characters in TX FIFO */ -#define LL_I2C_TX_FIFO_TH_CHAR_7 0x00000007U /**< 7 characters in TX FIFO */ -/** @} */ - -/** @defgroup I2C_LL_EC_RX_FIFO_TH RX FIFO Threshold - * @{ - */ -#define LL_I2C_RX_FIFO_TH_CHAR_1 0x00000000U /**< 1 character in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_CHAR_2 0x00000001U /**< 2 characters in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_CHAR_3 0x00000002U /**< 3 characters in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_CHAR_4 0x00000003U /**< 4 characters in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_CHAR_5 0x00000004U /**< 5 characters in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_CHAR_6 0x00000005U /**< 6 characters in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_CHAR_7 0x00000006U /**< 7 characters in RX FIFO */ -#define LL_I2C_RX_FIFO_TH_FULL 0x00000007U /**< RX FIFO full */ -/** @} */ - -/** @defgroup I2C_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL I2C InitStrcut default configuartion - */ -#define LL_I2C_DEFAULT_CONFIG \ -{ \ - .speed = LL_I2C_SPEED_400K, \ - .own_address = 0x55U, \ - .own_addr_size = LL_I2C_OWNADDRESS_7BIT, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @defgroup I2C_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2C register - * @param __instance__ I2C instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None. - */ -#define LL_I2C_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2C register - * @param __instance__ I2C instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2C_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) -/** @} */ - -/** @defgroup I2C_LL_EM_Exported_Macros_Helper Exported_Macros_Helper - * @{ - */ - -/** - * @brief Compute CLK_SSL_CNT value according to Peripheral Clock and expected Speed. - * @param __PERIPHCLK__ Peripheral Clock frequency used for I2C instance - * @param __SPEED__ Speed value to achieve - * @retval CLK_SSL_CNT value to be used for XS_SCL_HCNT, XS_SCL_LCNT registers where X can be (S, F, H) - */ -#define LL_I2C_CONVERT_CLK_SSL_CNT(__PERIPHCLK__, __SPEED__) ((__PERIPHCLK__) / 2 / (__SPEED__)) - -/** - * @brief Get Speed Mode according to expected Speed. - * @param __SPEED__ Speed value to achieve - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_SPEED_MODE_STANDARD - * @arg @ref LL_I2C_SPEED_MODE_FAST - * @arg @ref LL_I2C_SPEED_MODE_HIGH - */ -#define LL_I2C_CONVERT_SPEED_MODE(__SPEED__) ((__SPEED__ <= LL_I2C_SPEED_100K) ? LL_I2C_SPEED_MODE_STANDARD : \ - ((__SPEED__ <= LL_I2C_SPEED_1000K) ? LL_I2C_SPEED_MODE_FAST : \ - LL_I2C_SPEED_MODE_HIGH)) -/** @} */ - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2C_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup I2C_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable I2C peripheral (ENABLE = 1). - * - * Register|BitsName - * --------|-------- - * IC_ENABLE | ENABLE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->ENABLE, I2C_ENABLE_ENABLE); -} - -/** - * @brief Disable I2C peripheral (ENABLE = 0). - * @note When ENABLE = 0, the TX FIFO and RX FIFO get flushed. - * Status bits in the IC_INTR_STAT register are still active until DW_apb_i2c goes into IDLE state. - * If the module is transmitting, it stops as well as deletes the contents of the transmit buffer - * after the current transfer is complete. If the module is receiving, the DW_apb_i2c stops - * the current transfer at the end of the current byte and does not acknowledge the transfer.. - * - * Register|BitsName - * --------|-------- - * IC_ENABLE | ENABLE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->ENABLE, I2C_ENABLE_ENABLE); -} - -/** - * @brief Check if the I2C peripheral is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_ENABLE_STATUS | IC_EN - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->ENABLE_STATUS, I2C_ENABLE_STATUS_IC_EN) == (I2C_ENABLE_STATUS_IC_EN)); -} - -/** - * @brief Enable I2C master mode. - * - * Register|BitsName - * --------|-------- - * IC_CON | MASTER_ENABLE - * IC_CON | SLAVE_DISABLE - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_master_mode(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->CON, I2C_CON_MST_MODE | I2C_CON_SLV_DIS); -} - -/** - * @brief Disable I2C master mode and enable slave mode. - * - * Register|BitsName - * --------|-------- - * IC_CON | MASTER_ENABLE - * IC_CON | SLAVE_DISABLE - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_master_mode(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->CON, I2C_CON_MST_MODE | I2C_CON_SLV_DIS); -} - -/** - * @brief Check if I2C master mode is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_CON | MASTER_ENABLE - * IC_CON | SLAVE_DISABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_master_mode(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->CON, I2C_CON_MST_MODE | I2C_CON_SLV_DIS) == (I2C_CON_MST_MODE | I2C_CON_SLV_DIS)); -} - -/** - * @brief Enable General Call(slave mode). - * @note When enabled, the Address 0x00 is ACKed. - * - * Register|BitsName - * --------|-------- - * IC_ACK_GENERAL_CALL | ACK_GEN_CALL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_general_call(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->ACK_GENERAL_CALL, I2C_ACK_GENERAL_CALL_ACK_GC); -} - -/** - * @brief Disable General Call(slave mode). - * @note When disabled, the Address 0x00 is NACKed. - * - * Register|BitsName - * --------|-------- - * IC_ACK_GENERAL_CALL | ACK_GEN_CALL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_general_call(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->ACK_GENERAL_CALL, I2C_ACK_GENERAL_CALL_ACK_GC); -} - -/** - * @brief Check if General Call is enabled or disabled(slave mode). - * - * Register|BitsName - * --------|-------- - * IC_ACK_GENERAL_CALL | ACK_GEN_CALL - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_general_call(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->ACK_GENERAL_CALL, I2C_ACK_GENERAL_CALL_ACK_GC) == (I2C_ACK_GENERAL_CALL_ACK_GC)); -} - -/** - * @brief Enable Master Restart. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * This bit determines whether RESTART conditions may be sent when acting as a master. - * Some older slaves do not support handling RESTART conditions. - * When RESTART is disabled, the master is prohibited from performing the following functions: - * - Performing any high-speed mode operation. - * - Performing direction changes in combined format mode. - * - Performing a read operation with a 10-bit address. - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_RESTART_EN - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_master_restart(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->CON, I2C_CON_RESTART_EN); -} - -/** - * @brief Disable Master Restart. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_RESTART_EN - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_master_restart(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->CON, I2C_CON_RESTART_EN); -} - -/** - * @brief Check if Master Restart is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_RESTART_EN - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_master_restart(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->CON, I2C_CON_RESTART_EN) == (I2C_CON_RESTART_EN)); -} - -/** - * @brief Enable Slave issues STOP_DET interrupt only if addressed function. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * During a general call address, the slave does not issue the STOP_DET interrupt if - * STOP_DET_IF_ADDRESSED = 1'b1, even if the slave responds to the general call address - * by generating ACK. The STOP_DET interrupt is generated only when the transmitted - * address matches the slave address (SAR). - * - * Register|BitsName - * --------|-------- - * IC_CON | STOP_DET_IF_ADDRESSED - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_stop_det_if_addressed(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->CON, I2C_CON_STOP_DET_IF_ADDRESSED); -} - -/** - * @brief Disable Slave issues STOP_DET interrupt only if addressed function. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | STOP_DET_IF_ADDRESSED - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_stop_det_if_addressed(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->CON, I2C_CON_STOP_DET_IF_ADDRESSED); -} - -/** - * @brief Check if Slave issues STOP_DET interrupt only if addressed function is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_CON | STOP_DET_IF_ADDRESSED - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_stop_det_if_addressed(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->CON, I2C_CON_STOP_DET_IF_ADDRESSED) == (I2C_CON_STOP_DET_IF_ADDRESSED)); -} - -/** - * @brief Configure the Master to transfers in 7-bit or 10-bit addressing mode. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_10BITADDR_MST - * - * @param I2Cx I2C instance. - * @param addressing_mode This parameter can be one of the following values: - * @arg @ref LL_I2C_ADDRESSING_MODE_7BIT - * @arg @ref LL_I2C_ADDRESSING_MODE_10BIT - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_master_addressing_mode(i2c_regs_t *I2Cx, uint32_t addressing_mode) -{ - MODIFY_REG(I2Cx->CON, I2C_CON_10BITADDR_MST, addressing_mode); -} - -/** - * @brief Get the Master addressing mode. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_10BITADDR_MST - * - * @param I2Cx I2C instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_ADDRESSING_MODE_7BIT - * @arg @ref LL_I2C_ADDRESSING_MODE_10BIT - */ -__STATIC_INLINE uint32_t ll_i2c_get_master_addressing_mode(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->CON, I2C_CON_10BITADDR_MST)); -} - -/** - * @brief Set the Own Address. - * @note The register IC_CON and IC_SAR can only be programmed when the I2C is disabled (IC_ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_10BITADDR_SLV - * IC_SAR | SAR - * - * @param I2Cx I2C instance. - * @param own_address This parameter must be a value range between 0 ~ 0x3FF(10-bit mode) or 0 ~ 0x7F(7-bit mode). - * Reserved address 0x00 to 0x07, or 0x78 to 0x7f should not be configured. - * @param own_addr_size This parameter can be one of the following values: - * @arg @ref LL_I2C_OWNADDRESS_7BIT - * @arg @ref LL_I2C_OWNADDRESS_10BIT - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_own_address(i2c_regs_t *I2Cx, uint32_t own_address, uint32_t own_addr_size) -{ - MODIFY_REG(I2Cx->CON, I2C_CON_10BITADDR_SLV, own_addr_size); - WRITE_REG(I2Cx->SAR, own_address); -} - -/** - * @brief Set the SCL clock high-period count for standard speed. - * @note The register IC_SS_SCL_HCNT can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_SS_SCL_HCNT | SS_SCL_HCNT - * - * @param I2Cx I2C instance. - * @param count This parameter must be a value range between 6 ~ 0xFFF5. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_clock_high_period_ss(i2c_regs_t *I2Cx, uint32_t count) -{ - WRITE_REG(I2Cx->SS_SCL_HCNT, count); -} - -/** - * @brief Get the SCL clock high-period count for standard speed. - * - * Register|BitsName - * --------|-------- - * IC_SS_SCL_HCNT | SS_SCL_HCNT - * - * @param I2Cx I2C instance. - * @retval Value range between 0x6 and 0xFFF5. - */ -__STATIC_INLINE uint32_t ll_i2c_get_clock_high_period_ss(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->SS_SCL_HCNT, I2C_SS_SCL_HCNT)); -} - -/** - * @brief Set the SCL clock low-period count for standard speed. - * @note The register IC_SS_SCL_LCNT can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_SS_SCL_LCNT | SS_SCL_LCNT - * - * @param I2Cx I2C instance. - * @param count This parameter must be a value range between 0x8 and 0xFFFF. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_clock_low_period_ss(i2c_regs_t *I2Cx, uint32_t count) -{ - WRITE_REG(I2Cx->SS_SCL_LCNT, count); -} - -/** - * @brief Get the SCL clock low-period count for standard speed. - * - * Register|BitsName - * --------|-------- - * IC_SS_SCL_LCNT | SS_SCL_LCNT - * - * @param I2Cx I2C instance. - * @retval Value range between 0x8 and 0xFFFF. - */ -__STATIC_INLINE uint32_t ll_i2c_get_clock_low_period_ss(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->SS_SCL_LCNT, I2C_SS_SCL_LCNT)); -} - -/** - * @brief Set the SCL clock high-period count for fast speed. - * @note The register IC_FS_SCL_HCNT can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_FS_SCL_HCNT | FS_SCL_HCNT - * - * @param I2Cx I2C instance. - * @param count range between 0x6 and 0xFFFF. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_clock_high_period_fs(i2c_regs_t *I2Cx, uint32_t count) -{ - WRITE_REG(I2Cx->FS_SCL_HCNT, count); -} - -/** - * @brief Get the SCL clock high-period count for fast speed. - * - * Register|BitsName - * --------|-------- - * IC_FS_SCL_HCNT | FS_SCL_HCNT - * - * @param I2Cx I2C instance. - * @retval Value range between 0x6 and 0xFFFF. - */ -__STATIC_INLINE uint32_t ll_i2c_get_clock_high_period_fs(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->FS_SCL_HCNT, I2C_FS_SCL_HCNT)); -} - -/** - * @brief Set the SCL clock low-period count for fast speed. - * @note The register IC_FS_SCL_LCNT can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_FS_SCL_LCNT | FS_SCL_LCNT - * - * @param I2Cx I2C instance. - * @param count range between 0x8 and 0xFFFF - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_clock_low_period_fs(i2c_regs_t *I2Cx, uint32_t count) -{ - WRITE_REG(I2Cx->FS_SCL_LCNT, count); -} - -/** - * @brief Get the SCL clock low-period count for fast speed. - * - * Register|BitsName - * --------|-------- - * IC_FS_SCL_LCNT | FS_SCL_LCNT - * - * @param I2Cx I2C instance. - * @retval Value range between 0x8 and 0xFFFF. - */ -__STATIC_INLINE uint32_t ll_i2c_get_clock_low_period_fs(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->FS_SCL_LCNT, I2C_FS_SCL_LCNT)); -} - -/** - * @brief Get the SCL clock high-period count for high speed. - * @note The register IC_HS_SCL_HCNT can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_HS_SCL_HCNT | HS_SCL_HCNT - * - * @param I2Cx I2C instance. - * @param count range between 0x6 and 0xFFFF, should be larger than IC_HS_SPKLEN + 5. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_clock_high_period_hs(i2c_regs_t *I2Cx, uint32_t count) -{ - WRITE_REG(I2Cx->HS_SCL_HCNT, count); -} - -/** - * @brief Get the SCL clock high-period count for high speed. - * - * Register|BitsName - * --------|-------- - * IC_HS_SCL_HCNT | HS_SCL_HCNT - * - * @param I2Cx I2C instance. - * @retval range between 0x6 and 0xFFFF, should be larger than IC_HS_SPKLEN + 7. - */ -__STATIC_INLINE uint32_t ll_i2c_get_clock_high_period_hs(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->HS_SCL_HCNT, I2C_HS_SCL_HCNT)); -} - -/** - * @brief Get the SCL clock low-period count for high speed. - * @note The register IC_HS_SCL_LCNT can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_HS_SCL_LCNT | HS_SCL_LCNT - * - * @param I2Cx I2C instance. - * @param count range between 0x8 and 0xFFFF - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_clock_low_period_hs(i2c_regs_t *I2Cx, uint32_t count) -{ - WRITE_REG(I2Cx->HS_SCL_LCNT, count); -} - -/** - * @brief Get the SCL clock low-period count for high speed. - * - * Register|BitsName - * --------|-------- - * IC_HS_SCL_LCNT | HS_SCL_LCNT - * - * @param I2Cx I2C instance. - * @retval Value range between 0x8 and 0xFFFF - */ -__STATIC_INLINE uint32_t ll_i2c_get_clock_low_period_hs(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->HS_SCL_LCNT, I2C_HS_SCL_LCNT)); -} - -/** - * @brief Set the spike len in fast speed mode. - * @note The register FS_SPKLEN can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_FS_SPKLEN | FS_SPKLEN - * - * @param I2Cx I2C instance. - * @param length Spike len. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_spike_len_fs(i2c_regs_t *I2Cx, uint32_t length) -{ - MODIFY_REG(I2Cx->FS_SPKLEN, I2C_FS_SPKLEN_FS_SPKLEN, length); -} - -/** - * @brief Get the spike len in fast speed mode. - * - * Register|BitsName - * --------|-------- - * IC_FS_SPKLEN | FS_SPKLEN - * - * @param I2Cx I2C instance. - * @retval Value range between 0x2 and 0xFF. - */ -__STATIC_INLINE uint32_t ll_i2c_get_spike_len_fs(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->FS_SPKLEN, I2C_FS_SPKLEN_FS_SPKLEN)); -} - -/** - * @brief Set the spike len in high speed mode. - * @note The register FS_SPKLEN can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_HS_SPKLEN | HS_SPKLEN - * - * @param I2Cx I2C instance. - * @param length Spike len. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_spike_len_hs(i2c_regs_t *I2Cx, uint32_t length) -{ - MODIFY_REG(I2Cx->HS_SPKLEN, I2C_HS_SPKLEN_HS_SPKLEN, length); -} - -/** - * @brief Get the spike len in high speed mode. - * - * Register|BitsName - * --------|-------- - * IC_HS_SPKLEN | HS_SPKLEN - * - * @param I2Cx I2C instance. - * @retval Value range between 0x2 and 0xFF. - */ -__STATIC_INLINE uint32_t ll_i2c_get_spike_len_hs(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->HS_SPKLEN, I2C_HS_SPKLEN_HS_SPKLEN)); -} - -/** - * @brief Set I2C Speed mode. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | SPEED - * - * @param I2Cx I2C instance. - * @param speed_mode This parameter can be one of the following values: - * @arg @ref LL_I2C_SPEED_MODE_STANDARD - * @arg @ref LL_I2C_SPEED_MODE_FAST - * @arg @ref LL_I2C_SPEED_MODE_HIGH - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_speed_mode(i2c_regs_t *I2Cx, uint32_t speed_mode) -{ - MODIFY_REG(I2Cx->CON, I2C_CON_SPEED, speed_mode); -} - -/** - * @brief Get I2C Speed mode. - * - * Register|BitsName - * --------|-------- - * IC_CON | SPEED - * - * @param I2Cx I2C instance. - * @retval Value can be one of the following values: - * @arg @ref LL_I2C_SPEED_MODE_STANDARD - * @arg @ref LL_I2C_SPEED_MODE_FAST - * @arg @ref LL_I2C_SPEED_MODE_HIGH - */ -__STATIC_INLINE uint32_t ll_i2c_get_speed_mode(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->CON, I2C_CON_SPEED)); -} - -/** - * @brief Set I2C High Speed Master Code Address. - * @note The register IC_CON can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_HS_MADDR | HS_MAR - * - * @param I2Cx I2C instance. - * @param code HS mode master code, range between 0x00 and 0x07. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_high_speed_master_code(i2c_regs_t *I2Cx, uint32_t code) -{ - WRITE_REG(I2Cx->HS_MADDR, code); -} - -/** - * @brief Get I2C Speed mode. - * - * Register|BitsName - * --------|-------- - * IC_HS_MADDR | HS_MAR - * - * @param I2Cx I2C instance. - * @retval Returned value range between 0x00 and 0x07. - */ -__STATIC_INLINE uint32_t ll_i2c_get_high_speed_master_code(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->HS_MADDR, I2C_HS_MADDR_HS_MAR)); -} - -/** - * @brief Set the required transmit SDA hold time in units of ic_clk period. - * @note The register IC_SDA_HOLD can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_SDA_HOLD | TX_HOLD - * - * @param I2Cx I2C instance. - * @param time SDA Tx hold time in units of ic_clk period. - * Time should range between 1 and (N_SCL_LOW - 2) in master mode or 7 and (N_SCL_LOW - 2) in slave mode. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_data_tx_hold_time(i2c_regs_t *I2Cx, uint32_t time) -{ - MODIFY_REG(I2Cx->SDA_HOLD, I2C_SDA_HOLD_TX_HOLD, time << I2C_SDA_HOLD_TX_HOLD_Pos); -} - -/** - * @brief Get the required transmit SDA hold time in units of ic_clk period. - * - * Register|BitsName - * --------|-------- - * IC_SDA_HOLD | TX_HOLD - * - * @param I2Cx I2C instance. - * @retval Value range between 1 and (N_SCL_LOW - 2) in master mode or 7 and (N_SCL_LOW - 2) in slave mode - */ -__STATIC_INLINE uint32_t ll_i2c_get_data_tx_hold_time(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->SDA_HOLD, I2C_SDA_HOLD_TX_HOLD) >> I2C_SDA_HOLD_TX_HOLD_Pos); -} - -/** - * @brief Set the required receive SDA hold time in units of ic_clk period. - * @note The register IC_SDA_HOLD can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_SDA_HOLD | RX_HOLD - * - * @param I2Cx I2C instance. - * @param time SDA Tx hold time in units of ic_clk period. - * Time should range between 1 and (N_SCL_LOW - 2) in master mode or 7 and (N_SCL_LOW - 2) in slave mode. - * @retval Value between Min_Data=0x0 and Max_Data=0xF - */ -__STATIC_INLINE void ll_i2c_set_data_rx_hold_time(i2c_regs_t *I2Cx, uint32_t time) -{ - MODIFY_REG(I2Cx->SDA_HOLD, I2C_SDA_HOLD_RX_HOLD, time << I2C_SDA_HOLD_RX_HOLD_Pos); -} - -/** - * @brief Get the required receive SDA hold time in units of ic_clk period. - * - * Register|BitsName - * --------|-------- - * IC_SDA_HOLD | RX_HOLD - * - * @param I2Cx I2C instance. - * @retval Value range between 1 and (N_SCL_LOW - 2) in master mode or 7 and (N_SCL_LOW - 2) in slave mode - */ -__STATIC_INLINE uint32_t ll_i2c_get_data_rx_hold_time(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->SDA_HOLD, I2C_SDA_HOLD_RX_HOLD) >> I2C_SDA_HOLD_RX_HOLD_Pos); -} - -/** - * @brief Set the SDA setup time when operating as a slave transmitter. - * @note The register IC_SDA_SETUP can only be programmed when the I2C is disabled (ENABLE = 0). - * The length of setup time is calculated using [(IC_SDA_SETUP - 1) * (ic_clk_period)], so if the - * user requires 10 ic_clk periods of setup time, they should program a value of 11. - * - * Register|BitsName - * --------|-------- - * IC_SDA_SETUP | SDA_SETUP - * - * @param I2Cx I2C instance. - * @param time SDA data setup time in units of ic_clk period, range between 2 ~ 0xFF. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_data_setup_time(i2c_regs_t *I2Cx, uint32_t time) -{ - MODIFY_REG(I2Cx->SDA_SETUP, I2C_SDA_SETUP_SDA_SETUP, time); -} - -/** - * @brief Get the SDA setup time when operating as a slave transmitter. - * - * Register|BitsName - * --------|-------- - * IC_SDA_SETUP | SDA_SETUP - * - * @param I2Cx I2C instance. - * @retval Value range between 0x02 and 0xFF. - */ -__STATIC_INLINE uint32_t ll_i2c_get_data_setup_time(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->SDA_SETUP, I2C_SDA_SETUP_SDA_SETUP)); -} - -/** - * @brief Set threshold of entries (or below) that trigger the TX_EMPTY interrupt - * @note TX FIFO threshold only can be configured after FIFO was enabled. - * - * Register|BitsName - * --------|-------- - * IC_TX_TL | TX_TL - * - * @param I2Cx I2C instance - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_I2C_TX_FIFO_TH_EMPTY - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_1 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_2 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_3 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_4 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_5 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_6 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_7 - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_tx_fifo_threshold(i2c_regs_t *I2Cx, uint32_t threshold) -{ - WRITE_REG(I2Cx->TX_TL, threshold); -} - -/** - * @brief Get threshold of TX FIFO that triggers an THRE interrupt - * - * Register|BitsName - * --------|-------- - * IC_TX_TL | TX_TL - * - * @param I2Cx I2C instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_TX_FIFO_TH_EMPTY - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_1 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_2 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_3 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_4 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_5 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_6 - * @arg @ref LL_I2C_TX_FIFO_TH_CHAR_7 - */ -__STATIC_INLINE uint32_t ll_i2c_get_tx_fifo_threshold(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->TX_TL, I2C_TX_TL_TXTL)); -} - -/** - * @brief Set threshold of RX FIFO that triggers an RDA interrupt - * @note TX FIFO threshold only can be configured after FIFO was enabled. - * - * Register|BitsName - * --------|-------- - * IC_RX_TL | RX_TL - * - * @param I2Cx I2C instance - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_1 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_2 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_3 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_4 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_5 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_6 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_7 - * @arg @ref LL_I2C_RX_FIFO_TH_FULL - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_rx_fifo_threshold(i2c_regs_t *I2Cx, uint32_t threshold) -{ - WRITE_REG(I2Cx->RX_TL, threshold); -} - -/** - * @brief Get threshold of RX FIFO that triggers an RDA interrupt - * - * Register|BitsName - * --------|-------- - * IC_RX_TL | RX_TL - * - * @param I2Cx I2C instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_1 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_2 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_3 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_4 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_5 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_6 - * @arg @ref LL_I2C_RX_FIFO_TH_CHAR_7 - * @arg @ref LL_I2C_RX_FIFO_TH_FULL - */ -__STATIC_INLINE uint32_t ll_i2c_get_rx_fifo_threshold(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->RX_TL, I2C_RX_TL_RXTL)); -} - -/** - * @brief Get FIFO Transmission Level - * - * Register|BitsName - * --------|-------- - * IC_TXFLR | TXFLR - * - * @param I2Cx I2C instance - * @retval Value range between 0x0 and 0x8. - */ -__STATIC_INLINE uint32_t ll_i2c_get_tx_fifo_level(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->TXFLR, I2C_TXFLR_TXFLR)); -} - -/** - * @brief Get FIFO reception Level - * - * Register|BitsName - * --------|-------- - * IC_RXFLR | RXFLR - * - * @param I2Cx I2C instance - * @retval Value range between 0x0 and 0x8. - */ -__STATIC_INLINE uint32_t ll_i2c_get_rx_fifo_level(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->RXFLR, I2C_RXFLR_RXFLR)); -} - -/** - * @brief Enable DMA reception requests. - * - * Register|BitsName - * --------|-------- - * IC_ENABLE | ABORT - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_transfer_abort(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->ENABLE, I2C_ENABLE_ABORT); -} - -/** - * @brief Check if DMA reception requests are enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_ENABLE | ABORT - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_transfer_abort(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->ENABLE, I2C_ENABLE_ABORT) == (I2C_ENABLE_ABORT)); -} - -/** - * @brief Get the transmit abort source. - * @note This can be used to retrieve source of TX_ABRT interrupt. - * - * Register|BitsName - * --------|-------- - * IC_TX_ABRT_SOURCE | ABRT_USER_ABRT - * IC_TX_ABRT_SOURCE | ABRT_SLVRD_INTX - * IC_TX_ABRT_SOURCE | ABRT_SLV_ARBLOST - * IC_TX_ABRT_SOURCE | ABRT_SLVFLUSH_TXFIFO - * IC_TX_ABRT_SOURCE | ABRT_ARB_LOST - * IC_TX_ABRT_SOURCE | ABRT_MST_DIS - * IC_TX_ABRT_SOURCE | ABRT_10B_RD_NORSTRT - * IC_TX_ABRT_SOURCE | ABRT_SBYTE_NORSTRT - * IC_TX_ABRT_SOURCE | ABRT_HS_NORSTRT - * IC_TX_ABRT_SOURCE | ABRT_SBYTE_ACKDET - * IC_TX_ABRT_SOURCE | ABRT_HS_ACKDET - * IC_TX_ABRT_SOURCE | ABRT_GCALL_READ - * IC_TX_ABRT_SOURCE | ABRT_GCALL_NOACK - * IC_TX_ABRT_SOURCE | ABRT_TXDATA_NOACK - * IC_TX_ABRT_SOURCE | ABRT_10ADDR2_NOACK - * IC_TX_ABRT_SOURCE | ABRT_10ADDR1_NOACK - * IC_TX_ABRT_SOURCE | ABRT_7B_ADDR_NOACK - * - * @param I2Cx I2C instance - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_I2C_ABRT_USER_ABRT - * @arg @ref LL_I2C_ABRT_SLVRD_INTX - * @arg @ref LL_I2C_ABRT_SLV_ARBLOST - * @arg @ref LL_I2C_ABRT_SLVFLUSH_TXFIFO - * @arg @ref LL_I2C_ABRT_ARB_LOST - * @arg @ref LL_I2C_ABRT_MST_DIS - * @arg @ref LL_I2C_ABRT_10B_RD_NORSTRT - * @arg @ref LL_I2C_ABRT_SBYTE_NORSTRT - * @arg @ref LL_I2C_ABRT_HS_NORSTRT - * @arg @ref LL_I2C_ABRT_SBYTE_ACKDET - * @arg @ref LL_I2C_ABRT_HS_ACKDET - * @arg @ref LL_I2C_ABRT_GCALL_READ - * @arg @ref LL_I2C_ABRT_GCALL_NOACK - * @arg @ref LL_I2C_ABRT_TXDATA_NOACK - * @arg @ref LL_I2C_ABRT_10ADDR2_NOACK - * @arg @ref LL_I2C_ABRT_10ADDR1_NOACK - * @arg @ref LL_I2C_ABRT_7B_ADDR_NOACK - * - * @note @arg @ref LL_I2C_ABRT_TX_FLUSH_CNT can be used as a mask to get the - * number of Tx FIFO Data Commands which are flushed due to TX_ABRT - * interrupt. - */ -__STATIC_INLINE uint32_t ll_i2c_get_abort_source(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_REG(I2Cx->TX_ABRT_SOURCE) & (~I2C_TX_ABRT_SRC_TX_FLUSH_CNT)); -} - -/** - * @brief Get the number of Tx FIFO Data Commands which are flushed due to TX_ABRT interrupt. - * - * Register|BitsName - * --------|-------- - * IC_TX_ABRT_SOURCE | TX_FLUSH_CNT - * - * @param I2Cx I2C instance - * @retval Tx flush count. - */ -__STATIC_INLINE uint32_t ll_i2c_get_tx_flush_count(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->TX_ABRT_SOURCE, I2C_TX_ABRT_SRC_TX_FLUSH_CNT) >> \ - I2C_TX_ABRT_SRC_TX_FLUSH_CNT_Pos); -} - -/** @} */ - -/** @defgroup I2C_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable specified interrupts. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | INTR_MASK_GEN_CALL - * INTR_MASK | INTR_MASK_START_DET - * INTR_MASK | INTR_MASK_STOP_DET - * INTR_MASK | INTR_MASK_ENABLE - * INTR_MASK | INTR_MASK_RX_DONE - * INTR_MASK | INTR_MASK_TX_ABRT - * INTR_MASK | INTR_MASK_RD_REQ - * INTR_MASK | INTR_MASK_TX_EMPTY - * INTR_MASK | INTR_MASK_TX_OVER - * INTR_MASK | INTR_MASK_RX_FULL - * INTR_MASK | INTR_MASK_RX_OVER - * INTR_MASK | INTR_MASK_RX_UNDER - * - * @param I2Cx I2C instance. - * @param mask This parameter can be a combination of the following values: - * @arg @ref LL_I2C_INTR_MASK_GEN_CALL - * @arg @ref LL_I2C_INTR_MASK_START_DET - * @arg @ref LL_I2C_INTR_MASK_STOP_DET - * @arg @ref LL_I2C_INTR_MASK_ENABLE - * @arg @ref LL_I2C_INTR_MASK_RX_DONE - * @arg @ref LL_I2C_INTR_MASK_TX_ABRT - * @arg @ref LL_I2C_INTR_MASK_RD_REQ - * @arg @ref LL_I2C_INTR_MASK_TX_EMPTY - * @arg @ref LL_I2C_INTR_MASK_TX_OVER - * @arg @ref LL_I2C_INTR_MASK_RX_FULL - * @arg @ref LL_I2C_INTR_MASK_RX_OVER - * @arg @ref LL_I2C_INTR_MASK_RX_UNDER - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it(i2c_regs_t *I2Cx, uint32_t mask) -{ - SET_BITS(I2Cx->INTR_MASK, mask); -} - -/** - * @brief Disable specified interrupts. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | INTR_MASK_GEN_CALL - * INTR_MASK | INTR_MASK_START_DET - * INTR_MASK | INTR_MASK_STOP_DET - * INTR_MASK | INTR_MASK_ENABLE - * INTR_MASK | INTR_MASK_RX_DONE - * INTR_MASK | INTR_MASK_TX_ABRT - * INTR_MASK | INTR_MASK_RD_REQ - * INTR_MASK | INTR_MASK_TX_EMPTY - * INTR_MASK | INTR_MASK_TX_OVER - * INTR_MASK | INTR_MASK_RX_FULL - * INTR_MASK | INTR_MASK_RX_OVER - * INTR_MASK | INTR_MASK_RX_UNDER - * - * @param I2Cx I2C instance. - * @param mask This parameter can be a combination of the following values: - * @arg @ref LL_I2C_INTR_MASK_GEN_CALL - * @arg @ref LL_I2C_INTR_MASK_START_DET - * @arg @ref LL_I2C_INTR_MASK_STOP_DET - * @arg @ref LL_I2C_INTR_MASK_ENABLE - * @arg @ref LL_I2C_INTR_MASK_RX_DONE - * @arg @ref LL_I2C_INTR_MASK_TX_ABRT - * @arg @ref LL_I2C_INTR_MASK_RD_REQ - * @arg @ref LL_I2C_INTR_MASK_TX_EMPTY - * @arg @ref LL_I2C_INTR_MASK_TX_OVER - * @arg @ref LL_I2C_INTR_MASK_RX_FULL - * @arg @ref LL_I2C_INTR_MASK_RX_OVER - * @arg @ref LL_I2C_INTR_MASK_RX_UNDER - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it(i2c_regs_t *I2Cx, uint32_t mask) -{ - CLEAR_BITS(I2Cx->INTR_MASK, mask); -} - -/** - * @brief Check if the specified interrupts are enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | INTR_MASK_GEN_CALL - * INTR_MASK | INTR_MASK_START_DET - * INTR_MASK | INTR_MASK_STOP_DET - * INTR_MASK | INTR_MASK_ENABLE - * INTR_MASK | INTR_MASK_RX_DONE - * INTR_MASK | INTR_MASK_TX_ABRT - * INTR_MASK | INTR_MASK_RD_REQ - * INTR_MASK | INTR_MASK_TX_EMPTY - * INTR_MASK | INTR_MASK_TX_OVER - * INTR_MASK | INTR_MASK_RX_FULL - * INTR_MASK | INTR_MASK_RX_OVER - * INTR_MASK | INTR_MASK_RX_UNDER - * - * @param I2Cx I2C instance. - * @param mask This parameter can be a combination of the following values: - * @arg @ref LL_I2C_INTR_MASK_GEN_CALL - * @arg @ref LL_I2C_INTR_MASK_START_DET - * @arg @ref LL_I2C_INTR_MASK_STOP_DET - * @arg @ref LL_I2C_INTR_MASK_ENABLE - * @arg @ref LL_I2C_INTR_MASK_RX_DONE - * @arg @ref LL_I2C_INTR_MASK_TX_ABRT - * @arg @ref LL_I2C_INTR_MASK_RD_REQ - * @arg @ref LL_I2C_INTR_MASK_TX_EMPTY - * @arg @ref LL_I2C_INTR_MASK_TX_OVER - * @arg @ref LL_I2C_INTR_MASK_RX_FULL - * @arg @ref LL_I2C_INTR_MASK_RX_OVER - * @arg @ref LL_I2C_INTR_MASK_RX_UNDER - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it(i2c_regs_t *I2Cx, uint32_t mask) -{ - return (READ_BITS(I2Cx->INTR_MASK, mask) == (mask)); -} - -/** - * @brief Enable MASTER_ON_HOLD interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | MST_ON_HOLD - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_master_on_hold(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_MST_ON_HOLD); -} - -/** - * @brief Disable MASTER_ON_HOLD interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | MST_ON_HOLD - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_master_om_hold(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_MST_ON_HOLD); -} - -/** - * @brief Check if the MASTER_ON_HOLD Interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | MST_ON_HOLD - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_master_on_hold(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_MST_ON_HOLD) == (I2C_INTR_MST_ON_HOLD)); -} - -/** - * @brief Enable RESTART_DET interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RESTART_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_restart_det(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_RESTART_DET); -} - -/** - * @brief Disable RESTART_DET interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RESTART_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_restart_det(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_RESTART_DET); -} - -/** - * @brief Check if the RESTART_DET Interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RESTART_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_restart_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_RESTART_DET) == (I2C_INTR_RESTART_DET)); -} - -/** - * @brief Enable GEN_CALL interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | GEN_CALL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_gen_call(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_GEN_CALL); -} - -/** - * @brief Disable GEN_CALL interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | GEN_CALL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_gen_call(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_GEN_CALL); -} - -/** - * @brief Check if GEN_CALL interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | GEN_CALL - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_gen_call(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_GEN_CALL) == (I2C_INTR_GEN_CALL)); -} - -/** - * @brief Enable START_DET received interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | START_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_start_det(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_START_DET); -} - -/** - * @brief Disable START_DET received interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | START_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_start_det(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_START_DET); -} - -/** - * @brief Check if START_DET received interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | START_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_start_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_START_DET) == (I2C_INTR_START_DET)); -} - -/** - * @brief Enable STOP_DET interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | STOP_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_stop_det(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_STOP_DET); -} - -/** - * @brief Disable STOP_DET interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | STOP_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_stop_det(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_STOP_DET); -} - -/** - * @brief Check if STOP_DET interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | STOP_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_stop_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_STOP_DET) == (I2C_INTR_STOP_DET)); -} - -/** - * @brief Enable interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | ENABLE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_event(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_ENABLE); -} - -/** - * @brief Disable interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | ENABLE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_event(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_ENABLE); -} - -/** - * @brief Check if interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | ENABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_event(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_ENABLE) == (I2C_INTR_ENABLE)); -} - -/** - * @brief Enable RX_DONE interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_DONE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE void ll_i2c_enable_it_rx_done(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_DONE); -} - -/** - * @brief Disable RX_DONE interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_DONE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_rx_done(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_DONE); -} - -/** - * @brief Check if RX_DONE interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_DONE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enable_it_rx_done(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_DONE) == (I2C_INTR_RX_DONE)); -} - -/** - * @brief Enable TX_ABRT interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_ABRT - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_rx_abort(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_ABRT); -} - -/** - * @brief Disable TX_ABRT interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_ABRT - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_tx_abort(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_ABRT); -} - -/** - * @brief Check if TX_ABRT interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_ABRT - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_tx_abort(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_ABRT) == (I2C_INTR_TX_ABRT)); -} - -/** - * @brief Enable RD_REQ interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RD_REQ - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_read_req(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_RD_REQ); -} - -/** - * @brief Disable RD_REQ interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RD_REQ - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_read_req(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_RD_REQ); -} - -/** - * @brief Check if RD_REQ interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RD_REQ - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_read_req(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_RD_REQ) == (I2C_INTR_RD_REQ)); -} - -/** - * @brief Enable TX_EMPTY interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_EMPTY - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_tx_empty(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_EMPTY); -} - -/** - * @brief Disable TX_EMPTY interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_EMPTY - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_tx_empty(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_EMPTY); -} - -/** - * @brief Check if TX_EMPTY interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_EMPTY - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_tx_empty(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_EMPTY) == (I2C_INTR_TX_EMPTY)); -} - -/** - * @brief Enable TX_OVER interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_tx_over(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_OVER); -} - -/** - * @brief Disable TX_OVER interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_tx_over(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_OVER); -} - -/** - * @brief Check if TX_OVER interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | TX_OVER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_tx_over(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_TX_OVER) == (I2C_INTR_TX_OVER)); -} - -/** - * @brief Enable RX_FULL interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_FULL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_rx_full(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_FULL); -} - -/** - * @brief Disable RX_FULL interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_FULL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disbale_it_rx_full(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_FULL); -} - -/** - * @brief Check if RX_FULL interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_FULL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE uint32_t ll_i2c_ls_enabled_it_rx_full(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_FULL) == (I2C_INTR_RX_FULL)); -} - -/** - * @brief Enable RX_OVER interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_rx_over(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_OVER); -} - -/** - * @brief Disable RX_OVER interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_rx_over(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_OVER); -} - -/** - * @brief Check if RX_OVER interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_rx_over(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_OVER) == (I2C_INTR_RX_OVER)); -} - -/** - * @brief Enable RX_UNDER interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_UNDER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_it_rx_under(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_UNDER); -} - -/** - * @brief Disable RX_UNDER interrupt. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_UNDER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_it_rx_under(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_UNDER); -} - -/** - * @brief Check if RX_UNDER interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * INTR_MASK | RX_UNDER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_it_rx_under(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_MASK, I2C_INTR_RX_UNDER) == (I2C_INTR_RX_UNDER)); -} - -/** @} */ - -/** @defgroup I2C_LL_EF_FLAG_management FLAG_management - * @{ - */ - -/** - * @brief Get I2C interrupt flags - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | MST_ON_HOLD - * IC_INTR_STAT | RESTART_DET - * IC_INTR_STAT | GEN_CALL - * IC_INTR_STAT | START_DET - * IC_INTR_STAT | STOP_DET - * IC_INTR_STAT | ENABLE - * IC_INTR_STAT | RX_DONE - * IC_INTR_STAT | TX_ABRT - * IC_INTR_STAT | RD_REQ - * IC_INTR_STAT | TX_EMPTY - * IC_INTR_STAT | TX_OVER - * IC_INTR_STAT | RX_FULL - * IC_INTR_STAT | RX_OVER - * IC_INTR_STAT | RX_UNDER - * - * @param I2Cx I2C instance. - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_I2C_INTR_STAT_MST_ON_HOLD - * @arg @ref LL_I2C_INTR_STAT_RESTART_DET - * @arg @ref LL_I2C_INTR_STAT_GEN_CALL - * @arg @ref LL_I2C_INTR_STAT_START_DET - * @arg @ref LL_I2C_INTR_STAT_STOP_DET - * @arg @ref LL_I2C_INTR_STAT_ENABLE - * @arg @ref LL_I2C_INTR_STAT_RX_DONE - * @arg @ref LL_I2C_INTR_STAT_TX_ABRT - * @arg @ref LL_I2C_INTR_STAT_RD_REQ - * @arg @ref LL_I2C_INTR_STAT_TX_EMPTY - * @arg @ref LL_I2C_INTR_STAT_TX_OVER - * @arg @ref LL_I2C_INTR_STAT_RX_FULL - * @arg @ref LL_I2C_INTR_STAT_RX_OVER - * @arg @ref LL_I2C_INTR_STAT_RX_UNDER - */ -__STATIC_INLINE uint32_t ll_i2c_get_it_flag(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_REG(I2Cx->INTR_STAT)); -} - -/** - * @brief Get I2C RAW interrupt flags - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_MST_ON_HOLD - * IC_RAW_INTR_STAT | RAW_RESTART_DET - * IC_RAW_INTR_STAT | RAW_GEN_CALL - * IC_RAW_INTR_STAT | RAW_START_DET - * IC_RAW_INTR_STAT | RAW_STOP_DET - * IC_RAW_INTR_STAT | RAW_ENABLE - * IC_RAW_INTR_STAT | RAW_RX_DONE - * IC_RAW_INTR_STAT | RAW_TX_ABRT - * IC_RAW_INTR_STAT | RAW_RD_REQ - * IC_RAW_INTR_STAT | RAW_TX_EMPTY - * IC_RAW_INTR_STAT | RAW_TX_OVER - * IC_RAW_INTR_STAT | RAW_RX_FULL - * IC_RAW_INTR_STAT | RAW_RX_OVER - * IC_RAW_INTR_STAT | RAW_RX_UNDER - * - * @param I2Cx I2C instance. - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_I2C_INTR_STAT_MST_ON_HOLD - * @arg @ref LL_I2C_INTR_STAT_RESTART_DET - * @arg @ref LL_I2C_INTR_STAT_GEN_CALL - * @arg @ref LL_I2C_INTR_STAT_START_DET - * @arg @ref LL_I2C_INTR_STAT_STOP_DET - * @arg @ref LL_I2C_INTR_STAT_ENABLE - * @arg @ref LL_I2C_INTR_STAT_RX_DONE - * @arg @ref LL_I2C_INTR_STAT_TX_ABRT - * @arg @ref LL_I2C_INTR_STAT_RD_REQ - * @arg @ref LL_I2C_INTR_STAT_TX_EMPTY - * @arg @ref LL_I2C_INTR_STAT_TX_OVER - * @arg @ref LL_I2C_INTR_STAT_RX_FULL - * @arg @ref LL_I2C_INTR_STAT_RX_OVER - * @arg @ref LL_I2C_INTR_STAT_RX_UNDER - */ -__STATIC_INLINE uint32_t ll_i2c_get_raw_it_flag(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_REG(I2Cx->RAW_INTR_STAT)); -} - -/** - * @brief Indicate the status of MST_ON_HOLD flag. - * @note RESET: Clear default value. - * SET : When MST_ON_HOLD interrupt is actived. - * - * Register|BitsName - * --------|-------- - * RAW_INTR_STAT | MST_ON_HOLD - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_master_on_hold(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_MST_ON_HOLD) == (I2C_INTR_MST_ON_HOLD)); -} - -/** - * @brief Indicate the status of RAW_MST_ON_HOLD flag. - * @note RESET: Clear default value. - * SET : When unmasked MST_ON_HOLD interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_MST_ON_HOLD - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_master_on_hold(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_MST_ON_HOLD) == (I2C_INTR_MST_ON_HOLD)); -} - -/** - * @brief Indicate the status of RESTART_DET flag. - * @note RESET: Clear default value. - * SET : When masked RESTART_DET interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | RESTART_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_restart_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_RESTART_DET) == (I2C_INTR_RESTART_DET)); -} - -/** - * @brief Indicate the status of RAW_RESTART_DET flag. - * @note RESET: Clear default value. - * SET : When unmasked RESTART_DET interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_RESTART_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_restart_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RESTART_DET) == (I2C_INTR_RESTART_DET)); -} - -/** - * @brief Indicate the status of GEN_CALL flag. - * @note RESET: Clear default value. - * SET : When masked GEN_CALL interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | GEN_CALL - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_gen_call(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_GEN_CALL) == (I2C_INTR_GEN_CALL)); -} - -/** - * @brief Indicate the status of RAW_GEN_CALL flag. - * @note RESET: Clear default value. - * SET : When unmasked GEN_CALL interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_GEN_CALL - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_gen_call(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_GEN_CALL) == (I2C_INTR_GEN_CALL)); -} - -/** - * @brief Indicate the status of START_DET flag. - * @note RESET: Clear default value. - * SET : When masked START_DET interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | START_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_start_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_START_DET) == (I2C_INTR_START_DET)); -} - -/** - * @brief Indicate the status of RAW_START_DET flag. - * @note RESET: Clear default value. - * SET : When unmasked START_DET interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_START_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_start_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_START_DET) == (I2C_INTR_START_DET)); -} - -/** - * @brief Indicate the status of STOP_DET flag. - * @note RESET: Clear default value. - * SET : When masked STOP_DET interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | STOP_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_stop_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_STOP_DET) == (I2C_INTR_STOP_DET)); -} - -/** - * @brief Indicate the status of RAW_STOP_DET flag. - * @note RESET: Clear default value. - * SET : When unmasked STOP_DET interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_STOP_DET - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_stop_det(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_STOP_DET) == (I2C_INTR_STOP_DET)); -} - -/** - * @brief Indicate the status of ENABLE flag. - * @note RESET: Clear default value. - * SET : When masked ENABLE interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | ENABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_ENABLE) == (I2C_INTR_ENABLE)); -} - -/** - * @brief Indicate the status of RAW_ENABLE flag. - * @note RESET: Clear default value. - * SET : When unmasked ENABLE interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_ENABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_ENABLE) == (I2C_INTR_ENABLE)); -} - -/** - * @brief Indicate the status of RX_DONE flag. - * @note RESET: Clear default value. - * SET : When masked RX_DONE interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | RX_DONE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_rx_done(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_RX_DONE) == (I2C_INTR_RX_DONE)); -} - -/** - * @brief Indicate the status of RAW_RX_DONE flag. - * @note RESET: Clear default value. - * SET : When unmasked RX_DONE interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_RX_DONE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_rx_done(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RX_DONE) == (I2C_INTR_RX_DONE)); -} - -/** - * @brief Indicate the status of TX_ABRT flag. - * @note RESET: Clear default value. - * SET : When masked TX_ABRT interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | TX_ABRT - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_tx_abort(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_TX_ABRT) == (I2C_INTR_TX_ABRT)); -} - -/** - * @brief Indicate the status of RAW_TX_ABRT flag. - * @note RESET: Clear default value. - * SET : When unmasked TX_ABRT interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_TX_ABRT - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_tx_abort(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_TX_ABRT) == (I2C_INTR_TX_ABRT)); -} - -/** - * @brief Indicate the status of RD_REQ flag. - * @note RESET: Clear default value. - * SET : When masked RD_REQ interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | RD_REQ - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_read_req(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_RD_REQ) == (I2C_INTR_RD_REQ)); -} - -/** - * @brief Indicate the status of RAW_RD_REQ flag. - * @note RESET: Clear default value. - * SET : When unmasked RD_REQ interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_RD_REQ - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_read_req(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RD_REQ) == (I2C_INTR_RD_REQ)); -} - -/** - * @brief Indicate the status of TX_EMPTY flag. - * @note RESET: Clear default value. - * SET : When masked TX_EMPTY interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | TX_EMPTY - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_tx_empty(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_TX_EMPTY) == (I2C_INTR_TX_EMPTY)); -} - -/** - * @brief Indicate the status of RAW_TX_EMPTY flag. - * @note RESET: Clear default value. - * SET : When unmasked TX_EMPTY interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_TX_EMPTY - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_tx_empty(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_TX_EMPTY) == (I2C_INTR_TX_EMPTY)); -} - -/** - * @brief Indicate the status of TX_OVER flag. - * @note RESET: Clear default value. - * SET : When masked TX_OVER interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | TX_OVER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_tx_over(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_TX_OVER) == (I2C_INTR_TX_OVER)); -} - -/** - * @brief Indicate the status of RAW_TX_OVER flag. - * @note RESET: Clear default value. - * SET : When unmasked TX_OVER interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_TX_OVER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_tx_over(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_TX_OVER) == (I2C_INTR_TX_OVER)); -} - -/** - * @brief Indicate the status of RX_FULL flag. - * @note RESET: Clear default value. - * SET : When masked RX_FULL interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | RX_FULL - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_rx_full(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_RX_FULL) == (I2C_INTR_RX_FULL)); -} - -/** - * @brief Indicate the status of RAW_RX_FULL flag. - * @note RESET: Clear default value. - * SET : When unmasked RX_FULL interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_RX_FULL - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_rx_full(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RX_FULL) == (I2C_INTR_RX_FULL)); -} - -/** - * @brief Indicate the status of RX_OVER flag. - * @note RESET: Clear default value. - * SET : When masked RX_OVER interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | RX_OVER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_rx_over(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_RX_OVER) == (I2C_INTR_RX_OVER)); -} - -/** - * @brief Indicate the status of RAW_RX_OVER flag. - * @note RESET: Clear default value. - * SET : When unmasked RX_OVER interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_RX_OVER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_rx_over(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RX_OVER) == (I2C_INTR_RX_OVER)); -} - -/** - * @brief Indicate the status of RX_UNDER flag. - * @note RESET: Clear default value. - * SET : When masked RX_UNDER interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_INTR_STAT | RX_UNDER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_rx_under(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->INTR_STAT, I2C_INTR_RX_UNDER) == (I2C_INTR_RX_UNDER)); -} - -/** - * @brief Indicate the status of RAW_RX_UNDER flag. - * @note RESET: Clear default value. - * SET : When unmasked RX_UNDER interrupt is actived. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | RAW_RX_UNDER - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_raw_rx_under(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RX_UNDER) == (I2C_INTR_RX_UNDER)); -} - -/** - * @brief Clear the combined interrupt, all individual interrupts, and the IC_TX_ABRT_SOURCE register - * - * Register|BitsName - * --------|-------- - * IC_CLR_INTR | CLR_INTR - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_intr(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_INTR); - (void) tmpreg; -} - -/** - * @brief Clear GEN_CALL flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_GEN_CALL | CLR_GEN_CALL - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_gen_call(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_GEN_CALL); - (void) tmpreg; -} - -/** - * @brief Clear START_DET flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_START_DET | CLR_START_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_start_det(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_START_DET); - (void) tmpreg; -} - -/** - * @brief Clear STOP_DET flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_STOP_DET | CLR_STOP_DET - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_stop_det(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_STOP_DET); - (void) tmpreg; -} - -/** - * @brief Clear ENABLE flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_ENABLE | CLR_ENABLE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_ENABLE); - (void) tmpreg; -} - -/** - * @brief Clear RX_DONE flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_RX_DONE | CLR_RX_DONE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_rx_done(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_RX_DONE); - (void) tmpreg; -} - -/** - * @brief Clear TX_ABRT flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_TX_ABRT | CLR_TX_ABRT - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_tx_abort(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_TX_ABRT); - (void) tmpreg; -} - -/** - * @brief Clear RD_REQ flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_RD_REQ | CLR_RD_REQ - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_read_req(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_RD_REQ); - (void) tmpreg; -} - -/** - * @brief Clear TX_OVER flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_TX_OVER | CLR_TX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_tx_over(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_TX_OVER); - (void) tmpreg; -} - -/** - * @brief Clear RX_OVER flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_RX_OVER | CLR_RX_OVER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_rx_over(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_RX_OVER); - (void) tmpreg; -} - -/** - * @brief Clear RX_UNDER flag. - * - * Register|BitsName - * --------|-------- - * IC_CLR_RX_UNDER | CLR_RX_UNDER - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_clear_flag_rx_under(i2c_regs_t *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(I2Cx->CLR_RX_UNDER); - (void) tmpreg; -} - -/** - * @brief Indicate the status of IC_STATUS Slave FSM ENABLE Status flag. - * @note RESET: Slave FSM is in IDLE state. - * SET : When Slave FSM is not in IDLE state. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | SLV_ENABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status_slave(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_SLV_ENABLE) == (I2C_STATUS_SLV_ENABLE)); -} - -/** - * @brief Indicate the status of IC_STATUS Master FSM ENABLE Status flag. - * @note RESET: Master FSM is in IDLE state. - * SET : When Master FSM is not in IDLE state. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | MST_ENABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status_master(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_MST_ENABLE) == (I2C_STATUS_MST_ENABLE)); -} - -/** - * @brief Indicate the status of IC_STATUS Receive FIFO Completely Full flag. - * @note RESET: Receive FIFO is not full. - * SET : When Receive FIFO is full. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | RFF - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status_rff(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_RFF) == (I2C_STATUS_RFF)); -} - -/** - * @brief Indicate the status of IC_STATUS Receive FIFO Not Empty flag. - * @note RESET: Receive FIFO is empty. - * SET : When Receive FIFO is not empty. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | RFNE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status_rfne(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_RFNE) == (I2C_STATUS_RFNE)); -} - -/** - * @brief Indicate the status of IC_STATUS Transmit FIFO Completely Empty flag. - * @note RESET: Transmit FIFO is not empty. - * SET : When Transmit FIFO is empty. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | TFE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status_tfe(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_TFE) == (I2C_STATUS_TFE)); -} - -/** - * @brief Indicate the status of IC_STATUS Transmit FIFO Not Full flag. - * @note RESET: Transmit FIFO is full. - * SET : When Transmit FIFO is not full. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | TFNF - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status_tfnf(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_TFNF) == (I2C_STATUS_TFNF)); -} - -/** - * @brief Indicate the status of IC_STATUS ENABLE flag. - * @note RESET: I2C is idle. - * SET : When I2C is active. - * - * Register|BitsName - * --------|-------- - * IC_STATUS | ENABLE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_status(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->STATUS, I2C_STATUS_ENABLE) == (I2C_STATUS_ENABLE)); -} - -/** - * @brief Indicate the status of Slave Received Data Lost flag. - * @note RESET: Slave RX Data is not lost. - * SET : Slave RX Data is lost. - * - * Register|BitsName - * --------|-------- - * IC_ENABLE_STATUS | SLV_RX_LOST - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_slave_rx_data_lost(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->ENABLE_STATUS, I2C_ENABLE_STATUS_SLV_RX_LOST) == (I2C_ENABLE_STATUS_SLV_RX_LOST)); -} - -/** - * @brief Indicate the status of Slave Disabled While Busy flag. - * @note RESET: Slave is disabled when it is idle. - * SET : Slave is disabled when it is active. - * - * Register|BitsName - * --------|-------- - * IC_ENABLE_STATUS | SLV_DIS_WHL_BUSY - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_active_flag_slave_dis_whl_busy(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->ENABLE_STATUS, I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY) == (I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY)); -} -/** @} */ - -/** @defgroup I2C_LL_EF_DMA_Management DMA_Management - * @{ - */ - -/** - * @brief Enable DMA transmission requests. - * - * Register|BitsName - * --------|-------- - * IC_DMA_CR | TDMAE - * - * @retval Value range between 0 ~ 0x8. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_dma_req_tx(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->DMA_CR, I2C_DMA_CR_TDMAE); -} - -/** - * @brief Disable DMA transmission requests. - * - * Register|BitsName - * --------|-------- - * IC_DMA_CR | TDMAE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_dma_req_tx(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->DMA_CR, I2C_DMA_CR_TDMAE); -} - -/** - * @brief Check if DMA transmission requests are enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_DMA_CR | TDMAE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_dma_req_tx(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->DMA_CR, I2C_DMA_CR_TDMAE) == (I2C_DMA_CR_TDMAE)); -} - -/** - * @brief Enable DMA reception requests. - * - * Register|BitsName - * --------|-------- - * IC_DMA_CR | RDMAE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_enable_dma_req_rx(i2c_regs_t *I2Cx) -{ - SET_BITS(I2Cx->DMA_CR, I2C_DMA_CR_RDMAE); -} - -/** - * @brief Disable DMA reception requests. - * - * Register|BitsName - * --------|-------- - * IC_DMA_CR | RDMAE - * - * @param I2Cx I2C instance. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_disable_dma_req_rx(i2c_regs_t *I2Cx) -{ - CLEAR_BITS(I2Cx->DMA_CR, I2C_DMA_CR_RDMAE); -} - -/** - * @brief Check if DMA reception requests are enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IC_DMA_CR | RDMAE - * - * @param I2Cx I2C instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2c_is_enabled_dma_req_rx(i2c_regs_t *I2Cx) -{ - return (READ_BITS(I2Cx->DMA_CR, I2C_DMA_CR_RDMAE) == (I2C_DMA_CR_RDMAE)); -} - -/** - * @brief Set level of TX FIFO that requests a DMA transmit. - * @note TX data level should equal to the watermark level, that is, the dma_tx_req - * signal is generated when the number of valid data entries in the transmit - * FIFO is equal to or below this field value, and TDMAE = 1. - * - * Register|BitsName - * --------|-------- - * IC_DMA_TDLR | DMATDL - * - * @param I2Cx I2C instance - * @param level This parameter should range between 0x0 and 0x8. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_dma_tx_data_level(i2c_regs_t *I2Cx, uint32_t level) -{ - WRITE_REG(I2Cx->DMA_TDLR, level); -} - -/** - * @brief Get level of TX FIFO that request a DMA transmit. - * - * Register|BitsName - * --------|-------- - * IC_DMA_TDLR | DMATDL - * - * @param I2Cx I2C instance - * @retval Returned value should range between 0x0 and 0x8. - */ -__STATIC_INLINE uint32_t ll_i2c_get_dma_tx_data_level(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->DMA_TDLR, I2C_DMA_TDLR_DMATDL)); -} - -/** - * @brief Set level of RX FIFO that requests a DMA receive. - * @note The watermark level = DMARDL + 1, that is, dma_rx_req is generated when - * the number of valid data entries in the receive FIFO is equal to or - * more than this field value + 1, and RDMAE = 1. For instance, when DMARDL - * is 0, then dma_rx_req is asserted when 1 or more data entries are present - * in the receive FIFO. - * - * Register|BitsName - * --------|-------- - * IC_DMA_RDLR | DMARDL - * - * @param I2Cx I2C instance - * @param level This parameter should range between 0x0 and 0x8. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_dma_rx_data_level(i2c_regs_t *I2Cx, uint32_t level) -{ - WRITE_REG(I2Cx->DMA_RDLR, level); -} - -/** - * @brief Get level of RX FIFO that request a DMA receive. - * - * Register|BitsName - * --------|-------- - * IC_DMA_RDLR | DMARDL - * - * @param I2Cx I2C instance - * @retval Returned value should range between 0x0 and 0x8. - */ -__STATIC_INLINE uint32_t ll_i2c_get_dma_rx_data_level(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->DMA_RDLR, I2C_DMA_RDLR_DMARDL)); -} - -/** - * @brief Get the data register address used for DMA transfer - * - * Register|BitsName - * --------|-------- - * IC_DATA_CMD | DAT - * - * @param I2Cx I2C instance - * @retval Address of data register - */ -__STATIC_INLINE uint32_t ll_i2c_dma_get_register_address(i2c_regs_t *I2Cx) -{ - return ((uint32_t) & (I2Cx->DATA_CMD)); -} - -/** @} */ - -/** @defgroup I2C_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Configure the slave address for transfer (master mode). - * @note The register IC_TAR can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_TAR | TAR_ADDR - * - * @param I2Cx I2C instance. - * @param slave_addr This parameter must be a value between 0x00 and 0x3F. - * @retval None. - */ -__STATIC_INLINE void ll_i2c_set_slave_address(i2c_regs_t *I2Cx, uint32_t slave_addr) -{ - MODIFY_REG(I2Cx->TAR, I2C_TAR_ADDR, slave_addr << I2C_TAR_ADDR_Pos); -} - -/** - * @brief Get the slave address programmed for transfer (master mode). - * - * Register|BitsName - * --------|-------- - * IC_TAR | TAR_ADDR - * - * @param I2Cx I2C instance. - * @retval Value between 0x0 and0x3F - */ -__STATIC_INLINE uint32_t ll_i2c_get_slave_address(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->TAR, I2C_TAR_ADDR) >> I2C_TAR_ADDR_Pos); -} - -/** - * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set). - * @note The register IC_CON and IC_TAR can only be programmed when the I2C is disabled (ENABLE = 0). - * - * Register|BitsName - * --------|-------- - * IC_CON | CON_10BITADDR_MST - * IC_TAR | TAR_ADDR - * - * @param I2Cx I2C instance. - * @param slave_addr Specifies the slave address to be programmed. - * @param slave_addr_size This parameter can be one of the following values: - * @arg @ref LL_I2C_ADDRESSING_MODE_7BIT - * @arg @ref LL_I2C_ADDRESSING_MODE_10BIT - * @note SlaveAddrSize in IC_CON register can only be programmed when the I2C is disabled (IC_ENABLE = 0). - * @retval None. - */ -__STATIC_INLINE void ll_i2c_handle_transfer(i2c_regs_t *I2Cx, uint32_t slave_addr, uint32_t slave_addr_size) -{ - MODIFY_REG(I2Cx->TAR, I2C_TAR_ADDR, slave_addr << I2C_TAR_ADDR_Pos); - ll_i2c_set_master_addressing_mode(I2Cx, slave_addr_size); -} - -/** - * @brief Indicate the value of transfer direction (slave mode). - * @note RESET: Write transfer, Slave enters in receiver mode. - * SET: Read transfer, Slave enters in transmitter mode. - * - * Register|BitsName - * --------|-------- - * IC_RAW_INTR_STAT | INTR_RD_REQ - * IC_RAW_INTR_STAT | INTR_RX_FULL - * - * @param I2Cx I2C instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DIRECTION_WRITE - * @arg @ref LL_I2C_DIRECTION_READ - */ -__STATIC_INLINE uint32_t ll_i2c_get_transfer_direction(i2c_regs_t *I2Cx) -{ - return (uint32_t)(READ_BITS(I2Cx->RAW_INTR_STAT, I2C_INTR_RD_REQ | I2C_INTR_RX_FULL)); -} - -/** - * @brief Read Receive Data register. - * - * Register|BitsName - * --------|-------- - * IC_DATA_CMD | DAT - * - * @param I2Cx I2C instance. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t ll_i2c_receive_data8(i2c_regs_t *I2Cx) -{ - return (uint8_t)(READ_BITS(I2Cx->DATA_CMD, I2C_DATA_CMD_DAT)); -} - -/** - * @brief Write in Transmit Data Register . - * - * Register|BitsName - * --------|-------- - * IC_DATA_CMD | STOP - * IC_DATA_CMD | CMD - * IC_DATA_CMD | DAT - * - * @param I2Cx I2C instance. - * @param data Value range between 0x00 and 0xFF. - * @param cmd This parameter can be one of the following values: - * @arg @ref LL_I2C_CMD_SLV_NONE - * @arg @ref LL_I2C_CMD_MST_WRITE - * @arg @ref LL_I2C_CMD_MST_READ - * @arg @ref LL_I2C_CMD_MST_GEN_STOP - * @arg @ref LL_I2C_CMD_MST_GEN_RESTART - * @retval None. - */ -__STATIC_INLINE void ll_i2c_transmit_data8(i2c_regs_t *I2Cx, uint8_t data, uint32_t cmd) -{ - WRITE_REG(I2Cx->DATA_CMD, data | cmd); -} - -/** @} */ - -/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize I2C registers (Registers restored to their default values). - * @param I2Cx I2C instance - * @retval An error_status_t enumeration value: - * - SUCCESS: I2C registers are de-initialized - * - ERROR: I2C registers are not de-initialized - */ -error_status_t ll_i2c_deinit(i2c_regs_t *I2Cx); - -/** - * @brief Initialize I2C registers according to the specified - * parameters in p_i2c_init. - * @param I2Cx I2C instance - * @param p_i2c_init Pointer to a ll_i2c_init_t structure that contains the configuration - * information for the specified I2C peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: I2C registers are initialized according to p_i2c_init content - * - ERROR: Problem occurred during I2C Registers initialization - */ -error_status_t ll_i2c_init(i2c_regs_t *I2Cx, ll_i2c_init_t *p_i2c_init); - -/** - * @brief Set each field of a @ref ll_i2c_init_t type structure to default value. - * @param p_i2c_init Pointer to a @ref ll_i2c_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_i2c_struct_init(ll_i2c_init_t *p_i2c_init); - -/** @} */ - -/** @} */ - -#endif /* I2C0 || I2C1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_I2C_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2s.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2s.h deleted file mode 100755 index aa1f477..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_i2s.h +++ /dev/null @@ -1,1632 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_i2s.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of I2S LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_I2S I2S - * @brief I2S LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_I2S_H__ -#define __GR55xx_LL_I2S_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (I2S_M) || defined (I2S_S) - -/** @defgroup LL_I2S_DRIVER_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2S_LL_ES_INIT I2S Exported init structure - * @{ - */ - -/** - * @brief LL I2S init structures definition - */ -typedef struct _ll_i2s_init_t { - uint32_t rxdata_size; /**< Specifies the I2S receive data size. - This parameter can be a value of @ref I2S_LL_EC_DATASIZE. - This feature can be modified afterwards using unitary function - @ref ll_i2s_set_rxsize(). */ - - uint32_t txdata_size; /**< Specifies the I2S transmit data size. - This parameter can be a value of @ref I2S_LL_EC_DATASIZE. - This feature can be modified afterwards using unitary function - @ref ll_i2s_set_txsize(). */ - - uint32_t rx_threshold; /**< Specifies the I2S receive FIFO threshold. - This parameter can be a value of @ref I2S_LL_EC_FIFO_THRESHOLD. - This feature can be modified afterwards using unitary function - @ref ll_i2s_set_rx_fifo_threshold(). */ - - uint32_t tx_threshold; /**< Specifies the I2S transmit FIFO threshold. - This parameter can be a value of @ref I2S_LL_EC_FIFO_THRESHOLD. - This feature can be modified afterwards using unitary function - @ref ll_i2s_set_tx_fifo_threshold(). */ - - uint32_t clock_source; /**< Specifies the source of the I2S clock. - This parameter can be a value of @ref I2S_LL_EC_CLOCK_SOURCE. - This feature can be modified afterwards using unitary function - @ref ll_i2s_set_clock_src(). */ - - uint32_t audio_freq; /**< Specifies the frequency selected for the I2S communication. - This feature can be modified afterwards using unitary function - @ref ll_i2s_set_clock_div(). */ -} ll_i2s_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup I2S_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags definitions which can be used with LL_I2S_ReadReg function - * @{ - */ -#define LL_I2S_STATUS_TXFO I2S_INTSTAT_TXFO /**< TX FIFO write overflow flag */ -#define LL_I2S_STATUS_TXFE I2S_INTSTAT_TXFE /**< TX FIFO threshold level is not reached flag */ -#define LL_I2S_STATUS_RXFO I2S_INTSTAT_RXFO /**< RX FIFO receive overflow flag */ -#define LL_I2S_STATUS_RXDA I2S_INTSTAT_RXDA /**< RX FIFO threshold level is reached flag */ -/** @} */ - -/** @defgroup I2S_LL_EC_INTERRUPT Interrupt Defines - * @brief Interrupt definitions which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_I2S_INT_TXFO I2S_INTMASK_TXFO /**< TX FIFO write overflow interrupt */ -#define LL_I2S_INT_TXFE I2S_INTMASK_TXFE /**< TX FIFO threshold level is not reached interrupt */ -#define LL_I2S_INT_RXFO I2S_INTMASK_RXFO /**< RX FIFO receive overflow interrupt */ -#define LL_I2S_INT_RXDA I2S_INTMASK_RXDA /**< RX FIFO threshold level is reached interrupt */ -/** @} */ - -/** @defgroup I2S_LL_EC_CLOCK_SOURCE I2S Clock Source - * @{ - */ -#define LL_I2S_CLOCK_SRC_96M (0x00000000UL) /**< I2S clock source select: 96M */ -#define LL_I2S_CLOCK_SRC_32M (1UL << 18) /**< I2S clock source select: 32M */ -/** @} */ - -/** @defgroup I2S_LL_EC_DATASIZE Transfer Data width - * @{ - */ -#define LL_I2S_DATASIZE_IGNORE (0x00000000UL) /**< Data size for I2S transfer: 32 bits */ -#define LL_I2S_DATASIZE_12BIT (1UL << I2S_RXSIZE_WLEN_Pos) /**< Data size for I2S transfer: 12 bits */ -#define LL_I2S_DATASIZE_16BIT (2UL << I2S_RXSIZE_WLEN_Pos) /**< Data size for I2S transfer: 16 bits */ -#define LL_I2S_DATASIZE_20BIT (3UL << I2S_RXSIZE_WLEN_Pos) /**< Data size for I2S transfer: 20 bits */ -#define LL_I2S_DATASIZE_24BIT (4UL << I2S_RXSIZE_WLEN_Pos) /**< Data size for I2S transfer: 24 bits */ -#define LL_I2S_DATASIZE_32BIT (5UL << I2S_RXSIZE_WLEN_Pos) /**< Data size for I2S transfer: 32 bits */ -/** @} */ - -/** @defgroup I2S_LL_EC_TRANSFER_MODE Transfer Mode - * @{ - */ -#define LL_I2S_SIMPLEX_TX (1UL) /**< Simplex TX mode. */ -#define LL_I2S_SIMPLEX_RX (2UL) /**< Simplex RX mode. */ -#define LL_I2S_FULL_DUPLEX (3UL) /**< Full-Duplex mode. */ -/** @} */ - -/** @defgroup I2S_LL_EC_FIFO_THRESHOLD FIFO Threshold - * @{ - */ -#define LL_I2S_THRESHOLD_1FIFO (0x00000000UL) /**< Trigger level for FIFO: 1 depth. */ -#define LL_I2S_THRESHOLD_2FIFO (1UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 2 depth. */ -#define LL_I2S_THRESHOLD_3FIFO (2UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 3 depth. */ -#define LL_I2S_THRESHOLD_4FIFO (3UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 4 depth. */ -#define LL_I2S_THRESHOLD_5FIFO (4UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 5 depth. */ -#define LL_I2S_THRESHOLD_6FIFO (5UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 6 depth. */ -#define LL_I2S_THRESHOLD_7FIFO (6UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 7 depth. */ -#define LL_I2S_THRESHOLD_8FIFO (7UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 8 depth. */ -#define LL_I2S_THRESHOLD_9FIFO (8UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 9 depth. */ -#define LL_I2S_THRESHOLD_10FIFO (9UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 10 depth. */ -#define LL_I2S_THRESHOLD_11FIFO (10UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 11 depth. */ -#define LL_I2S_THRESHOLD_12FIFO (11UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 12 depth. */ -#define LL_I2S_THRESHOLD_13FIFO (12UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 13 depth. */ -#define LL_I2S_THRESHOLD_14FIFO (13UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 14 depth. */ -#define LL_I2S_THRESHOLD_15FIFO (14UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 15 depth. */ -#define LL_I2S_THRESHOLD_16FIFO (15UL << I2S_RXFIFO_TL_Pos) /**< Trigger level for FIFO: 16 depth. */ -/** @} */ - -/** @defgroup I2S_LL_EC_WS_CYCLES Word Select Line Cycles - * @{ - */ -#define LL_I2S_WS_CYCLES_16 (0x00000000UL) /**< 16 SCLK cycles in word select line. */ -#define LL_I2S_WS_CYCLES_24 (0x1UL << I2S_CLKCONFIG_WSS_Pos) /**< 24 SCLK cycles in word select line. */ -#define LL_I2S_WS_CYCLES_32 (0x2UL << I2S_CLKCONFIG_WSS_Pos) /**< 32 SCLK cycles in word select line. */ -/** @} */ - -/** @defgroup I2S_LL_EC_SCLK_GATE SCLK Gate - * @{ - */ -#define LL_I2S_SCLKG_NONE (0x00000000UL) /**< Clock gating is disabled. */ -#define LL_I2S_SCLKG_CYCLES_12 (0x1UL << I2S_CLKCONFIG_SCLKG_Pos) /**< Gating after 12 sclk cycles. */ -#define LL_I2S_SCLKG_CYCLES_16 (0x2UL << I2S_CLKCONFIG_SCLKG_Pos) /**< Gating after 16 sclk cycles. */ -#define LL_I2S_SCLKG_CYCLES_20 (0x3UL << I2S_CLKCONFIG_SCLKG_Pos) /**< Gating after 20 sclk cycles. */ -#define LL_I2S_SCLKG_CYCLES_24 (0x4UL << I2S_CLKCONFIG_SCLKG_Pos) /**< Gating after 24 sclk cycles. */ -/** @} */ - -/** @defgroup I2S_LL_EC_RESOLUTION RX/TX resolution of one channel - * @{ - */ -#define LL_I2S_RESOLUTION_12BIT (0UL) /**< 12 bits resolution. */ -#define LL_I2S_RESOLUTION_16BIT (1UL) /**< 16 bits resolution. */ -#define LL_I2S_RESOLUTION_20BIT (2UL) /**< 20 bits resolution. */ -#define LL_I2S_RESOLUTION_24BIT (3UL) /**< 24 bits resolution. */ -#define LL_I2S_RESOLUTION_32BIT (4UL) /**< 32 bits resolution. */ -/** @} */ - -/** @defgroup I2S_LL_EC_CHANNELS the number of RX/TX channels - * @{ - */ -#define LL_I2S_CHANNEL_NUM_1 (0UL) /**< 1 channel. */ -#define LL_I2S_CHANNEL_NUM_2 (1UL) /**< 2 channels. */ -#define LL_I2S_CHANNEL_NUM_3 (2UL) /**< 3 channels. */ -#define LL_I2S_CHANNEL_NUM_4 (3UL) /**< 4 channels. */ -/** @} */ - -/** @defgroup I2S_LL_EC_FIFO_DEPTH RX/TX FIFO depth - * @{ - */ -#define LL_I2S_FIFO_DEPTH_2 (0UL) /**< FIFO depth is 2 . */ -#define LL_I2S_FIFO_DEPTH_4 (1UL) /**< FIFO depth is 4 . */ -#define LL_I2S_FIFO_DEPTH_8 (2UL) /**< FIFO depth is 8 . */ -#define LL_I2S_FIFO_DEPTH_16 (3UL) /**< FIFO depth is 16. */ -/** @} */ - -/** @defgroup I2S_LL_EC_APB_WIDTH APB data width - * @{ - */ -#define LL_I2S_APB_WIDTH_8BIT (0UL) /**< 8 bits APB data width. */ -#define LL_I2S_APB_WIDTH_16BIT (1UL) /**< 16 bits APB data width. */ -#define LL_I2S_APB_WIDTH_32BIT (2UL) /**< 32 bits APB data width. */ -/** @} */ - -/** @} */ - -/** @defgroup I2S_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL I2S InitStrcut default configuartion - */ -#define LL_I2S_DEFAULT_CONFIG \ -{ \ - .rxdata_size = LL_I2S_DATASIZE_16BIT, \ - .txdata_size = LL_I2S_DATASIZE_16BIT, \ - .rx_threshold = LL_I2S_THRESHOLD_1FIFO, \ - .tx_threshold = LL_I2S_THRESHOLD_9FIFO, \ - .clock_source = LL_I2S_CLOCK_SRC_32M, \ - .audio_freq = 48000 \ -} - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros - * @{ - */ - -/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2S register - * @param __instance__ I2S instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2S_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2S register - * @param __instance__ I2S instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2S_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2S_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup I2S_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable I2S - * - * Register|BitsName - * --------|-------- - * ENABLE | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable(i2s_regs_t *I2Sx) -{ - SET_BITS(I2Sx->ENABLE, I2S_ENABLE_EN); -} - -/** - * @brief Disable I2S - * - * Register|BitsName - * --------|-------- - * ENABLE | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable(i2s_regs_t *I2Sx) -{ - CLEAR_BITS(I2Sx->ENABLE, I2S_ENABLE_EN); -} - -/** - * @brief Check if I2S is enabled - * - * Register|BitsName - * --------|-------- - * ENABLE | EN - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled(i2s_regs_t *I2Sx) -{ - return (READ_BITS(I2Sx->ENABLE, I2S_ENABLE_EN) == (I2S_ENABLE_EN)); -} - -/** - * @brief Enable I2S RX block - * - * Register|BitsName - * --------|-------- - * RBEN | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_rxblock(i2s_regs_t *I2Sx) -{ - SET_BITS(I2Sx->RBEN, I2S_RBEN_EN); -} - -/** - * @brief Disable I2S RX block - * - * Register|BitsName - * --------|-------- - * RBEN | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_rxblock(i2s_regs_t *I2Sx) -{ - CLEAR_BITS(I2Sx->RBEN, I2S_RBEN_EN); -} - -/** - * @brief Check if I2S RX block is enabled - * - * Register|BitsName - * --------|-------- - * RBEN | EN - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_rxblock(i2s_regs_t *I2Sx) -{ - return (READ_BITS(I2Sx->RBEN, I2S_RBEN_EN) == (I2S_RBEN_EN)); -} - -/** - * @brief Enable I2S TX block - * - * Register|BitsName - * --------|-------- - * TBEN | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_txblock(i2s_regs_t *I2Sx) -{ - SET_BITS(I2Sx->TBEN, I2S_TBEN_EN); -} - -/** - * @brief Disable I2S TX block - * - * Register|BitsName - * --------|-------- - * TBEN | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_txblock(i2s_regs_t *I2Sx) -{ - CLEAR_BITS(I2Sx->TBEN, I2S_TBEN_EN); -} - -/** - * @brief Check if I2S TX block is enabled - * - * Register|BitsName - * --------|-------- - * TBEN | EN - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_txblock(i2s_regs_t *I2Sx) -{ - return (READ_BITS(I2Sx->TBEN, I2S_TBEN_EN) == (I2S_TBEN_EN)); -} - -/** - * @brief Enable I2S clock - * - * Register|BitsName - * --------|-------- - * CLKEN | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_clock(i2s_regs_t *I2Sx) -{ - SET_BITS(I2Sx->CLKEN, I2S_CLKEN_EN); -} - -/** - * @brief Disable I2S clock - * - * Register|BitsName - * --------|-------- - * CLKEN | EN - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_clock(i2s_regs_t *I2Sx) -{ - CLEAR_BITS(I2Sx->CLKEN, I2S_CLKEN_EN); -} - -/** - * @brief Check if I2S clock is enabled - * - * Register|BitsName - * --------|-------- - * CLKEN | EN - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_clock(i2s_regs_t *I2Sx) -{ - return (READ_BITS(I2Sx->CLKEN, I2S_CLKEN_EN) == (I2S_CLKEN_EN)); -} - -/** - * @brief Set word select line cycles for left or right sample - * @note This bit should be written only when I2S is disabled (I2S_EN = 0) for correct operation. - * - * Register|BitsName - * --------|-------- - * CLKCONFIG | WSS - * - * @param I2Sx I2S instance - * @param cycles This parameter can be one of the following values: - * @arg @ref LL_I2S_WS_CYCLES_16 - * @arg @ref LL_I2S_WS_CYCLES_24 - * @arg @ref LL_I2S_WS_CYCLES_32 - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_wss(i2s_regs_t *I2Sx, uint32_t cycles) -{ - MODIFY_REG(I2Sx->CLKCONFIG, I2S_CLKCONFIG_WSS, cycles); -} - -/** - * @brief Get word select line cycles for left or right sample - * - * Register|BitsName - * --------|-------- - * CLKCONFIG | WSS - * - * @param I2Sx I2S instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_WS_CYCLES_16 - * @arg @ref LL_I2S_WS_CYCLES_24 - * @arg @ref LL_I2S_WS_CYCLES_32 - */ -__STATIC_INLINE uint32_t ll_i2s_get_wss(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->CLKCONFIG, I2S_CLKCONFIG_WSS)); -} - -/** - * @brief Set the gating of sclk - * - * Register|BitsName - * --------|-------- - * CLKCONFIG | SCLKG - * - * @param I2Sx I2S instance - * @param cycles This parameter can be one of the following values: - * @arg @ref LL_I2S_SCLKG_NONE - * @arg @ref LL_I2S_SCLKG_CYCLES_12 - * @arg @ref LL_I2S_SCLKG_CYCLES_16 - * @arg @ref LL_I2S_SCLKG_CYCLES_20 - * @arg @ref LL_I2S_SCLKG_CYCLES_24 - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_sclkg(i2s_regs_t *I2Sx, uint32_t cycles) -{ - MODIFY_REG(I2Sx->CLKCONFIG, I2S_CLKCONFIG_SCLKG, cycles); -} - -/** - * @brief Get the gating of sclk - * - * Register|BitsName - * --------|-------- - * CLKCONFIG | SCLKG - * - * @param I2Sx I2S instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_SCLKG_NONE - * @arg @ref LL_I2S_SCLKG_CYCLES_12 - * @arg @ref LL_I2S_SCLKG_CYCLES_16 - * @arg @ref LL_I2S_SCLKG_CYCLES_20 - * @arg @ref LL_I2S_SCLKG_CYCLES_24 - */ -__STATIC_INLINE uint32_t ll_i2s_get_sclkg(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->CLKCONFIG, I2S_CLKCONFIG_SCLKG)); -} - -/** - * @brief Clear I2S RX FIFO in all channels - * - * Register|BitsName - * --------|-------- - * RXFIFO_RST | RST - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_clr_rxfifo_all(i2s_regs_t *I2Sx) -{ - WRITE_REG(I2Sx->RXFIFO_RST, I2S_RXFIFO_RST); -} - -/** - * @brief Clear I2S TX FIFO in all channels - * - * Register|BitsName - * --------|-------- - * TXFIFO_RST | RST - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_clr_txfifo_all(i2s_regs_t *I2Sx) -{ - WRITE_REG(I2Sx->TXFIFO_RST, I2S_TXFIFO_RST); -} - -/** - * @brief Set I2S clock divider - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | DIV - * - * @param div This parameter can between: 0 ~ 0xFFF - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_clock_div(uint32_t div) -{ - MODIFY_REG(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_DIV_CNT, div); -} - -/** - * @brief Get I2S clock divider - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | DIV - * - * @retval Returned Value can between: 0 ~ 0xFFF - */ -__STATIC_INLINE uint32_t ll_i2s_get_clock_div(void) -{ - return (uint32_t)(READ_BITS(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_DIV_CNT)); -} - -/** - * @brief Enable I2S clock divider - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | DIV_EN - * - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_clock_div(void) -{ - SET_BITS(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN); -} - -/** - * @brief Disable I2S clock divider - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | DIV_EN - * - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_clock_div(void) -{ - CLEAR_BITS(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN); -} - -/** - * @brief Check if I2S clock divider is enabled - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | DIV_EN - * - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_clock_div(void) -{ - return (READ_BITS(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN) == (MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN)); -} - -/** - * @brief Set I2S clock source - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | SRC - * - * @param src This parameter can be one of the following values: - * @arg @ref LL_I2S_CLOCK_SRC_96M - * @arg @ref LL_I2S_CLOCK_SRC_32M - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_clock_src(uint32_t src) -{ - MODIFY_REG(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL, src); -} - -/** - * @brief Get I2S clock source - * - * Register|BitsName - * --------|-------- - * I2S_CLK_CFG | SRC - * - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_CLOCK_SRC_96M - * @arg @ref LL_I2S_CLOCK_SRC_32M - */ -__STATIC_INLINE uint32_t ll_i2s_get_clock_src(void) -{ - return (uint32_t)(READ_BITS(MCU_SUB->I2S_CLK_CFG, MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL)); -} - -/** @} */ - -/** @defgroup I2S_LL_EF_Channel Channel Configuration functions - * @{ - */ - -/** - * @brief Read one data from left RX FIFO in a channel - * - * Register|BitsName - * --------|-------- - * DATA_L | DATA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE uint32_t ll_i2s_receive_ldata(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_REG(I2Sx->I2S_CHANNEL[channel].DATA_L)); -} - -/** - * @brief Read one data from right RX FIFO in a channel - * - * Register|BitsName - * --------|-------- - * DATA_R | DATA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE uint32_t ll_i2s_receive_rdata(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_REG(I2Sx->I2S_CHANNEL[channel].DATA_R)); -} - -/** - * @brief Write one data to left TX FIFO in a channel - * - * Register|BitsName - * --------|-------- - * DATA_L | DATA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param data The data to send - * @retval None - */ -__STATIC_INLINE void ll_i2s_transmit_ldata(i2s_regs_t *I2Sx, uint8_t channel, uint32_t data) -{ - WRITE_REG(I2Sx->I2S_CHANNEL[channel].DATA_L, data); -} - -/** - * @brief Write one data to right TX FIFO in a channel - * - * Register|BitsName - * --------|-------- - * DATA_R | DATA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param data The data to send - * @retval None - */ -__STATIC_INLINE void ll_i2s_transmit_rdata(i2s_regs_t *I2Sx, uint8_t channel, uint32_t data) -{ - WRITE_REG(I2Sx->I2S_CHANNEL[channel].DATA_R, data); -} - -/** - * @brief Enable RX in a channel - * - * Register|BitsName - * --------|-------- - * RXEN | EN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_rx(i2s_regs_t *I2Sx, uint8_t channel) -{ - SET_BITS(I2Sx->I2S_CHANNEL[channel].RXEN, I2S_RXEN_EN); -} - -/** - * @brief Disable RX in a channel - * - * Register|BitsName - * --------|-------- - * RXEN | EN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_rx(i2s_regs_t *I2Sx, uint8_t channel) -{ - CLEAR_BITS(I2Sx->I2S_CHANNEL[channel].RXEN, I2S_RXEN_EN); -} - -/** - * @brief Check if RX in a channel is enabled - * - * Register|BitsName - * --------|-------- - * RXEN | EN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_rx(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (READ_BITS(I2Sx->I2S_CHANNEL[channel].RXEN, I2S_RXEN_EN) != (I2S_RXEN_EN)); -} - -/** - * @brief Enable TX in a channel - * - * Register|BitsName - * --------|-------- - * TXEN | EN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_tx(i2s_regs_t *I2Sx, uint8_t channel) -{ - SET_BITS(I2Sx->I2S_CHANNEL[channel].TXEN, I2S_TXEN_EN); -} - -/** - * @brief Disable TX in a channel - * - * Register|BitsName - * --------|-------- - * TXEN | EN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_tx(i2s_regs_t *I2Sx, uint8_t channel) -{ - CLEAR_BITS(I2Sx->I2S_CHANNEL[channel].TXEN, I2S_TXEN_EN); -} - -/** - * @brief Check if TX in a channel is enabled - * - * Register|BitsName - * --------|-------- - * TXEN | EN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_tx(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (READ_BITS(I2Sx->I2S_CHANNEL[channel].TXEN, I2S_TXEN_EN) != (I2S_TXEN_EN)); -} - -/** - * @brief Set receive data width in a channel - * @note These bits should not be changed when channel is enabled. - * - * Register|BitsName - * --------|-------- - * RXSIZE | WLEN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param size This parameter can be one of the following values: - * @arg @ref LL_I2S_DATASIZE_IGNORE - * @arg @ref LL_I2S_DATASIZE_12BIT - * @arg @ref LL_I2S_DATASIZE_16BIT - * @arg @ref LL_I2S_DATASIZE_20BIT - * @arg @ref LL_I2S_DATASIZE_24BIT - * @arg @ref LL_I2S_DATASIZE_32BIT - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_rxsize(i2s_regs_t *I2Sx, uint8_t channel, uint32_t size) -{ - MODIFY_REG(I2Sx->I2S_CHANNEL[channel].RXSIZE, I2S_RXSIZE_WLEN, size); -} - -/** - * @brief Get receive data width in a channel - * - * Register|BitsName - * --------|-------- - * RXSIZE | WLEN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_DATASIZE_IGNORE - * @arg @ref LL_I2S_DATASIZE_12BIT - * @arg @ref LL_I2S_DATASIZE_16BIT - * @arg @ref LL_I2S_DATASIZE_20BIT - * @arg @ref LL_I2S_DATASIZE_24BIT - * @arg @ref LL_I2S_DATASIZE_32BIT - */ -__STATIC_INLINE uint32_t ll_i2s_get_rxsize(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_CHANNEL[channel].RXSIZE, I2S_RXSIZE_WLEN)); -} - -/** - * @brief Set transmit data width in a channel - * @note These bits should not be changed when channel is enabled. - * - * Register|BitsName - * --------|-------- - * TXSIZE | WLEN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param size This parameter can be one of the following values: - * @arg @ref LL_I2S_DATASIZE_IGNORE - * @arg @ref LL_I2S_DATASIZE_12BIT - * @arg @ref LL_I2S_DATASIZE_16BIT - * @arg @ref LL_I2S_DATASIZE_20BIT - * @arg @ref LL_I2S_DATASIZE_24BIT - * @arg @ref LL_I2S_DATASIZE_32BIT - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_txsize(i2s_regs_t *I2Sx, uint8_t channel, uint32_t size) -{ - MODIFY_REG(I2Sx->I2S_CHANNEL[channel].TXSIZE, I2S_TXSIZE_WLEN, size); -} - -/** - * @brief Get transmit data width in a channel - * - * Register|BitsName - * --------|-------- - * TXSIZE | WLEN - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_DATASIZE_IGNORE - * @arg @ref LL_I2S_DATASIZE_12BIT - * @arg @ref LL_I2S_DATASIZE_16BIT - * @arg @ref LL_I2S_DATASIZE_20BIT - * @arg @ref LL_I2S_DATASIZE_24BIT - * @arg @ref LL_I2S_DATASIZE_32BIT - */ -__STATIC_INLINE uint32_t ll_i2s_get_txsize(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_CHANNEL[channel].TXSIZE, I2S_TXSIZE_WLEN)); -} - -/** - * @brief Get interrupt flag in a channel - * - * Register|BitsName - * --------|-------- - * INTSTAT | TXFO - * INTSTAT | TXFE - * INTSTAT | RXFO - * INTSTAT | RXDA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one or more of the following values: - * @arg @ref LL_I2S_STATUS_TXFO - * @arg @ref LL_I2S_STATUS_TXFE - * @arg @ref LL_I2S_STATUS_RXFO - * @arg @ref LL_I2S_STATUS_RXDA - */ -__STATIC_INLINE uint32_t ll_i2s_get_it_flag(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_CHANNEL[channel].INTSTAT, I2S_INTSTAT_TXFO | I2S_INTSTAT_TXFE | \ - I2S_INTSTAT_RXFO | I2S_INTSTAT_RXDA)); -} - -/** - * @brief Check interrupt flag in a channel - * - * Register|BitsName - * --------|-------- - * INTSTAT | TXFO - * INTSTAT | TXFE - * INTSTAT | RXFO - * INTSTAT | RXDA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval flag This parameter can be one or more of the following values: - * @arg @ref LL_I2S_STATUS_TXFO - * @arg @ref LL_I2S_STATUS_TXFE - * @arg @ref LL_I2S_STATUS_RXFO - * @arg @ref LL_I2S_STATUS_RXDA - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_active_it_flag(i2s_regs_t *I2Sx, uint8_t channel, uint32_t flag) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_CHANNEL[channel].INTSTAT, flag) == flag); -} - -/** - * @brief Enable interrupt in a channel - * - * Register|BitsName - * --------|-------- - * INTMASK | TXFO - * INTMASK | TXFE - * INTMASK | RXFO - * INTMASK | RXDA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param mask This parameter can be one or more of the following values: - * @arg @ref LL_I2S_INT_TXFO - * @arg @ref LL_I2S_INT_TXFE - * @arg @ref LL_I2S_INT_RXFO - * @arg @ref LL_I2S_INT_RXDA - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_it(i2s_regs_t *I2Sx, uint8_t channel, uint32_t mask) -{ - CLEAR_BITS(I2Sx->I2S_CHANNEL[channel].INTMASK, mask); -} - -/** - * @brief Disable interrupt in a channel - * - * Register|BitsName - * --------|-------- - * INTMASK | TXFO - * INTMASK | TXFE - * INTMASK | RXFO - * INTMASK | RXDA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param mask This parameter can be one or more of the following values: - * @arg @ref LL_I2S_INT_TXFO - * @arg @ref LL_I2S_INT_TXFE - * @arg @ref LL_I2S_INT_RXFO - * @arg @ref LL_I2S_INT_RXDA - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_it(i2s_regs_t *I2Sx, uint8_t channel, uint32_t mask) -{ - SET_BITS(I2Sx->I2S_CHANNEL[channel].INTMASK, mask); -} - -/** - * @brief Check if interrupt in a channel is enabled - * - * Register|BitsName - * --------|-------- - * INTMASK | TXFO - * INTMASK | TXFE - * INTMASK | RXFO - * INTMASK | RXDA - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param mask This parameter can be one or more of the following values: - * @arg @ref LL_I2S_INT_TXFO - * @arg @ref LL_I2S_INT_TXFE - * @arg @ref LL_I2S_INT_RXFO - * @arg @ref LL_I2S_INT_RXDA - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_it(i2s_regs_t *I2Sx, uint8_t channel, uint32_t mask) -{ - return ((READ_BITS(I2Sx->I2S_CHANNEL[channel].INTMASK, mask) ^ (mask)) == (mask)); -} - -/** - * @brief Clear RX FIFO data overrun interrupt flag in a channel - * - * Register|BitsName - * --------|-------- - * RXOVR | RXCHO - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_clear_it_rxovr(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (READ_BITS(I2Sx->I2S_CHANNEL[channel].RXOVR, I2S_RXOVR_RXCHO)); -} - -/** - * @brief Clear TX FIFO data overrun interrupt flag in a channel - * - * Register|BitsName - * --------|-------- - * TXOVR | TXCHO - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_clear_it_txovr(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (READ_BITS(I2Sx->I2S_CHANNEL[channel].TXOVR, I2S_TXOVR_TXCHO)); -} - -/** - * @brief Set threshold of RXFIFO in a channel that triggers an RXDA event - * - * Register|BitsName - * --------|-------- - * RXFIFO_TL | TL - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_I2S_THRESHOLD_1FIFO - * @arg @ref LL_I2S_THRESHOLD_2FIFO - * @arg @ref LL_I2S_THRESHOLD_3FIFO - * @arg @ref LL_I2S_THRESHOLD_4FIFO - * @arg @ref LL_I2S_THRESHOLD_5FIFO - * @arg @ref LL_I2S_THRESHOLD_6FIFO - * @arg @ref LL_I2S_THRESHOLD_7FIFO - * @arg @ref LL_I2S_THRESHOLD_8FIFO - * @arg @ref LL_I2S_THRESHOLD_9FIFO - * @arg @ref LL_I2S_THRESHOLD_10FIFO - * @arg @ref LL_I2S_THRESHOLD_11FIFO - * @arg @ref LL_I2S_THRESHOLD_12FIFO - * @arg @ref LL_I2S_THRESHOLD_13FIFO - * @arg @ref LL_I2S_THRESHOLD_14FIFO - * @arg @ref LL_I2S_THRESHOLD_15FIFO - * @arg @ref LL_I2S_THRESHOLD_16FIFO - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_rx_fifo_threshold(i2s_regs_t *I2Sx, uint8_t channel, uint32_t threshold) -{ - WRITE_REG(I2Sx->I2S_CHANNEL[channel].RXFIFO_TL, threshold); -} - -/** - * @brief Get threshold of RXFIFO in a channel that triggers an RXDA event - * - * Register|BitsName - * --------|-------- - * RXFIFO_TL | TL - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_THRESHOLD_1FIFO - * @arg @ref LL_I2S_THRESHOLD_2FIFO - * @arg @ref LL_I2S_THRESHOLD_3FIFO - * @arg @ref LL_I2S_THRESHOLD_4FIFO - * @arg @ref LL_I2S_THRESHOLD_5FIFO - * @arg @ref LL_I2S_THRESHOLD_6FIFO - * @arg @ref LL_I2S_THRESHOLD_7FIFO - * @arg @ref LL_I2S_THRESHOLD_8FIFO - * @arg @ref LL_I2S_THRESHOLD_9FIFO - * @arg @ref LL_I2S_THRESHOLD_10FIFO - * @arg @ref LL_I2S_THRESHOLD_11FIFO - * @arg @ref LL_I2S_THRESHOLD_12FIFO - * @arg @ref LL_I2S_THRESHOLD_13FIFO - * @arg @ref LL_I2S_THRESHOLD_14FIFO - * @arg @ref LL_I2S_THRESHOLD_15FIFO - * @arg @ref LL_I2S_THRESHOLD_16FIFO - */ -__STATIC_INLINE uint32_t ll_i2s_get_rx_fifo_threshold(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_CHANNEL[channel].RXFIFO_TL, I2S_RXFIFO_TL)); -} - -/** - * @brief Set threshold of TXFIFO in a channel that triggers an TXFE event - * - * Register|BitsName - * --------|-------- - * TXFIFO_TL | TL - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_I2S_THRESHOLD_1FIFO - * @arg @ref LL_I2S_THRESHOLD_2FIFO - * @arg @ref LL_I2S_THRESHOLD_3FIFO - * @arg @ref LL_I2S_THRESHOLD_4FIFO - * @arg @ref LL_I2S_THRESHOLD_5FIFO - * @arg @ref LL_I2S_THRESHOLD_6FIFO - * @arg @ref LL_I2S_THRESHOLD_7FIFO - * @arg @ref LL_I2S_THRESHOLD_8FIFO - * @arg @ref LL_I2S_THRESHOLD_9FIFO - * @arg @ref LL_I2S_THRESHOLD_10FIFO - * @arg @ref LL_I2S_THRESHOLD_11FIFO - * @arg @ref LL_I2S_THRESHOLD_12FIFO - * @arg @ref LL_I2S_THRESHOLD_13FIFO - * @arg @ref LL_I2S_THRESHOLD_14FIFO - * @arg @ref LL_I2S_THRESHOLD_15FIFO - * @arg @ref LL_I2S_THRESHOLD_16FIFO - * @retval None - */ -__STATIC_INLINE void ll_i2s_set_tx_fifo_threshold(i2s_regs_t *I2Sx, uint8_t channel, uint32_t threshold) -{ - WRITE_REG(I2Sx->I2S_CHANNEL[channel].TXFIFO_TL, threshold); -} - -/** - * @brief Get threshold of TXFIFO in a channel that triggers an TXFE event - * - * Register|BitsName - * --------|-------- - * TXFIFO_TL | TL - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_THRESHOLD_1FIFO - * @arg @ref LL_I2S_THRESHOLD_2FIFO - * @arg @ref LL_I2S_THRESHOLD_3FIFO - * @arg @ref LL_I2S_THRESHOLD_4FIFO - * @arg @ref LL_I2S_THRESHOLD_5FIFO - * @arg @ref LL_I2S_THRESHOLD_6FIFO - * @arg @ref LL_I2S_THRESHOLD_7FIFO - * @arg @ref LL_I2S_THRESHOLD_8FIFO - * @arg @ref LL_I2S_THRESHOLD_9FIFO - * @arg @ref LL_I2S_THRESHOLD_10FIFO - * @arg @ref LL_I2S_THRESHOLD_11FIFO - * @arg @ref LL_I2S_THRESHOLD_12FIFO - * @arg @ref LL_I2S_THRESHOLD_13FIFO - * @arg @ref LL_I2S_THRESHOLD_14FIFO - * @arg @ref LL_I2S_THRESHOLD_15FIFO - * @arg @ref LL_I2S_THRESHOLD_16FIFO - */ -__STATIC_INLINE uint32_t ll_i2s_get_tx_fifo_threshold(i2s_regs_t *I2Sx, uint8_t channel) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_CHANNEL[channel].TXFIFO_TL, I2S_TXFIFO_TL)); -} - -/** - * @brief Clear RX FIFO data in a channel - * - * Register|BitsName - * --------|-------- - * RXFIFO_FLUSH | FLUSH - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE void ll_i2s_clr_rxfifo_channel(i2s_regs_t *I2Sx, uint8_t channel) -{ - WRITE_REG(I2Sx->I2S_CHANNEL[channel].RXFIFO_FLUSH, I2S_RXFIFO_FLUSH); -} - -/** - * @brief Clear TX FIFO data in a channel - * - * Register|BitsName - * --------|-------- - * TXFIFO_FLUSH | FLUSH - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval None - */ -__STATIC_INLINE void ll_i2s_clr_txfifo_channel(i2s_regs_t *I2Sx, uint8_t channel) -{ - WRITE_REG(I2Sx->I2S_CHANNEL[channel].TXFIFO_FLUSH, I2S_TXFIFO_FLUSH); -} - -/** @} */ - -/** @defgroup I2S_LL_EF_DMA_Management DMA Management Functions - * @{ - */ - -/** - * @brief Reset RX block DMA - * @note The RX DMA can be reset to the lowest channel via this register. - * - * Register|BitsName - * --------|-------- - * RXDMA_RST | RST - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_rst_rxdma(i2s_regs_t *I2Sx) -{ - WRITE_REG(I2Sx->RXDMA_RST, I2S_RXDMA_RST); -} - -/** - * @brief Reset TX block DMA - * @note The TX DMA can be reset to the lowest channel via this register. - * - * Register|BitsName - * --------|-------- - * TXDMA_RST | RST - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_rst_txdma(i2s_regs_t *I2Sx) -{ - WRITE_REG(I2Sx->TXDMA_RST, I2S_TXDMA_RST); -} - - -/** - * @brief Enable I2S DMA - * - * Register|BitsName - * --------|-------- - * DMA_ACC_SEL | QSPI1_I2S_M_SEL - * DMA_ACC_SEL | I2C1_I2S_S_SEL - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_enable_dma(i2s_regs_t *I2Sx) -{ - if (I2S_M == I2Sx) - SET_BITS(MCU_SUB->DMA_ACC_SEL, MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM); - else - SET_BITS(MCU_SUB->DMA_ACC_SEL, MCU_SUB_DMA_ACC_SEL_I2C1_I2SS); -} - -/** - * @brief Disable I2S DMA - * - * Register|BitsName - * --------|-------- - * DMA_ACC_SEL | QSPI1_I2S_M_SEL - * DMA_ACC_SEL | I2C1_I2S_S_SEL - * - * @param I2Sx I2S instance - * @retval None - */ -__STATIC_INLINE void ll_i2s_disable_dma(i2s_regs_t *I2Sx) -{ - if (I2S_M == I2Sx) - CLEAR_BITS(MCU_SUB->DMA_ACC_SEL, MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM); - else - CLEAR_BITS(MCU_SUB->DMA_ACC_SEL, MCU_SUB_DMA_ACC_SEL_I2C1_I2SS); -} - -/** - * @brief Check if I2S DMA is enabled - * - * Register|BitsName - * --------|-------- - * DMA_ACC_SEL | QSPI1_I2S_M_SEL - * DMA_ACC_SEL | I2C1_I2S_S_SEL - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_is_enabled_dma(i2s_regs_t *I2Sx) -{ - if (I2S_M == I2Sx) - return (READ_BITS(MCU_SUB->DMA_ACC_SEL, MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM) == MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM); - else - return (READ_BITS(MCU_SUB->DMA_ACC_SEL, MCU_SUB_DMA_ACC_SEL_I2C1_I2SS) == MCU_SUB_DMA_ACC_SEL_I2C1_I2SS); -} - - -/** @} */ - -/** @defgroup I2S_LL_EF_Component Component Paraments Functions - * @{ - */ - -/** - * @brief Get I2S component paramenters: rx resolution - * - * Register|BitsName - * --------|-------- - * I2S_PARAM2 | RXSIZE_3 - * I2S_PARAM2 | RXSIZE_2 - * I2S_PARAM2 | RXSIZE_1 - * I2S_PARAM2 | RXSIZE_0 - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_RESOLUTION_12BIT - * @arg @ref LL_I2S_RESOLUTION_16BIT - * @arg @ref LL_I2S_RESOLUTION_20BIT - * @arg @ref LL_I2S_RESOLUTION_24BIT - * @arg @ref LL_I2S_RESOLUTION_32BIT - */ -__STATIC_INLINE uint32_t ll_i2s_get_rx_resolution(i2s_regs_t *I2Sx, uint8_t channel) -{ - uint32_t pos[4] = {I2S_PARAM2_RXSIZE_0_Pos, I2S_PARAM2_RXSIZE_1_Pos, \ - I2S_PARAM2_RXSIZE_2_Pos, I2S_PARAM2_RXSIZE_3_Pos - }; - uint32_t mask[4] = {I2S_PARAM2_RXSIZE_0, I2S_PARAM2_RXSIZE_1, I2S_PARAM2_RXSIZE_2, I2S_PARAM2_RXSIZE_3}; - - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM2, mask[channel]) >> pos[channel]); -} - -/** - * @brief Get I2S component paramenters: tx resolution - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | TXSIZE_3 - * I2S_PARAM1 | TXSIZE_2 - * I2S_PARAM1 | TXSIZE_1 - * I2S_PARAM1 | TXSIZE_0 - * - * @param I2Sx I2S instance - * @param channel The special channel: 0 ~ 3 - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_RESOLUTION_12BIT - * @arg @ref LL_I2S_RESOLUTION_16BIT - * @arg @ref LL_I2S_RESOLUTION_20BIT - * @arg @ref LL_I2S_RESOLUTION_24BIT - * @arg @ref LL_I2S_RESOLUTION_32BIT - */ -__STATIC_INLINE uint32_t ll_i2s_get_tx_resolution(i2s_regs_t *I2Sx, uint8_t channel) -{ - uint32_t pos[4] = {I2S_PARAM1_TXSIZE_0_Pos, I2S_PARAM1_TXSIZE_1_Pos, \ - I2S_PARAM1_TXSIZE_2_Pos, I2S_PARAM1_TXSIZE_3_Pos - }; - uint32_t mask[4] = {I2S_PARAM1_TXSIZE_0, I2S_PARAM1_TXSIZE_1, I2S_PARAM1_TXSIZE_2, I2S_PARAM1_TXSIZE_3}; - - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, mask[channel]) >> pos[channel]); -} - -/** - * @brief Get I2S component paramenters: the number of tx channels - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | TXCHN - * - * @param I2Sx I2S instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_CHANNEL_NUM_1 - * @arg @ref LL_I2S_CHANNEL_NUM_2 - * @arg @ref LL_I2S_CHANNEL_NUM_3 - * @arg @ref LL_I2S_CHANNEL_NUM_4 - */ -__STATIC_INLINE uint32_t ll_i2s_get_tx_channels(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_TXCHN) >> I2S_PARAM1_TXCHN_Pos); -} - -/** - * @brief Get I2S component paramenters: the number of rx channels - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | RXCHN - * - * @param I2Sx I2S instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_CHANNEL_NUM_1 - * @arg @ref LL_I2S_CHANNEL_NUM_2 - * @arg @ref LL_I2S_CHANNEL_NUM_3 - * @arg @ref LL_I2S_CHANNEL_NUM_4 - */ -__STATIC_INLINE uint32_t ll_i2s_get_rx_channels(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_RXCHN) >> I2S_PARAM1_RXCHN_Pos); -} - -/** - * @brief Get I2S component paramenters: whether the receiver block is enabled or not - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | RXBLOCK - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_get_rx_block(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_RXBLOCK) == I2S_PARAM1_RXBLOCK); -} - -/** - * @brief Get I2S component paramenters: whether the transmitter block is enabled or not - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | TXBLOCK - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_get_tx_block(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_TXBLOCK) == I2S_PARAM1_TXBLOCK); -} - -/** - * @brief Get I2S component paramenters: whether the master mode is enabled or not - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | MODE - * - * @param I2Sx I2S instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_i2s_get_master_mode(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_MODE) == I2S_PARAM1_MODE); -} - -/** - * @brief Get I2S component paramenters: FIOF depth - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | FIFO_DEPTH - * - * @param I2Sx I2S instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_FIFO_DEPTH_2 - * @arg @ref LL_I2S_FIFO_DEPTH_4 - * @arg @ref LL_I2S_FIFO_DEPTH_8 - * @arg @ref LL_I2S_FIFO_DEPTH_16 - */ -__STATIC_INLINE uint32_t ll_i2s_get_fifo_depth(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_FIFO_DEPTH) >> I2S_PARAM1_FIFO_DEPTH_Pos); -} - -/** - * @brief Get I2S component paramenters: APB data width - * - * Register|BitsName - * --------|-------- - * I2S_PARAM1 | APB_DATA_WIDTH - * - * @param I2Sx I2S instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_I2S_APB_WIDTH_8BIT - * @arg @ref LL_I2S_APB_WIDTH_16BIT - * @arg @ref LL_I2S_APB_WIDTH_32BIT - */ -__STATIC_INLINE uint32_t ll_i2s_get_apb_width(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_BITS(I2Sx->I2S_PARAM1, I2S_PARAM1_APB_DATA_WIDTH) >> I2S_PARAM1_APB_DATA_WIDTH_Pos); -} - -/** - * @brief Get I2S component version - * - * Register|BitsName - * --------|-------- - * I2S_VERSION | VERSION - * - * @param I2Sx I2S instance - * @retval Returned Value is const. - */ -__STATIC_INLINE uint32_t ll_i2s_get_version(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_REG(I2Sx->I2S_VERSION)); -} - -/** - * @brief Get I2S component type - * - * Register|BitsName - * --------|-------- - * I2S_TYPE | TYPE - * - * @param I2Sx I2S instance - * @retval Returned Value is const. - */ -__STATIC_INLINE uint32_t ll_i2s_get_type(i2s_regs_t *I2Sx) -{ - return (uint32_t)(READ_REG(I2Sx->I2S_TYPE)); -} - -/** @} */ - -/** @defgroup I2S_LL_EF_Init I2S_M Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize I2S registers (Registers restored to their default values). - * @param I2Sx I2S instance - * @retval An error_status_t enumeration value: - * - SUCCESS: I2S registers are de-initialized - * - ERROR: I2S registers are not de-initialized - */ -error_status_t ll_i2s_deinit(i2s_regs_t *I2Sx); - -/** - * @brief Initialize I2S_M registers according to the specified - * parameters in p_i2s_init. - * @param I2Sx I2S instance - * @param p_i2s_init Pointer to a ll_i2s_init_t structure that contains the configuration - * information for the specified I2S_M peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: I2S registers are initialized according to p_i2s_init content - * - ERROR: Problem occurred during I2S Registers initialization - */ -error_status_t ll_i2s_init(i2s_regs_t *I2Sx, ll_i2s_init_t *p_i2s_init); - -/** - * @brief Set each field of a @ref ll_i2s_init_t type structure to default value. - * @param p_i2s_init Pointer to a @ref ll_i2s_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_i2s_struct_init(ll_i2s_init_t *p_i2s_init); - -/** @} */ - -/** @} */ - -#endif /* I2S_M || I2S_S */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_I2S_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_iso7816.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_iso7816.h deleted file mode 100755 index fbb27e3..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_iso7816.h +++ /dev/null @@ -1,1264 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_iso7816.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of ISO7816 LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_ISO7816 ISO7816 - * @brief ISO7816 LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_ISO7816_H__ -#define __GR55xx_LL_ISO7816_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (ISO7816) -/** @defgroup ISO7816_LL_STRUCTURES Structures - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup ISO7816_LL_ES_INIT ISO7816 Exported init structure - * @{ - */ -/** - * @brief ISO7816_LL_init_structure LL ISO7816 init Structure definition - */ -typedef struct _ll_iso7816_init { - uint32_t clk_div; /*!< clk_div is used for dividing the system clock, - and ISO7816 output clock is equal to (system clock)/(clk_div+1). */ - uint32_t wait_time; /*!< Specifies the guard time value in terms of number of baud clocks */ - uint16_t guard_time; /*!< Specifies the maximum card response time (leading edge to leading edge) */ - uint8_t detect_coding; /*!< Specifies whether automatically detect coding convention during ATR - receiption. */ -} ll_iso7816_init_t; -/** @} */ -/** @} */ - -/** - * @defgroup ISO7816_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup ISO7816_LL_Exported_Constants ISO7816 Exported Constants - * @{ - */ - -/** @defgroup ISO7816_LL_EC_ACTION Action state. - * @{ - */ -#define LL_ISO7816_ACTION_NONE 0x00000000U /**< Do Nothing. */ -#define LL_ISO7816_ACTION_OFF 0x00000001U /**< Switch Off. */ -#define LL_ISO7816_ACTION_STOPCLK 0x00000002U /**< Stop the clock. */ -#define LL_ISO7816_ACTION_ON 0x00000003U /**< Switch on and receive ATR. */ -#define LL_ISO7816_ACTION_WARMRST 0x00000004U /**< Trigger warm reset and receive ATR. */ -#define LL_ISO7816_ACTION_RX 0x00000005U /**< Receive. */ -#define LL_ISO7816_ACTION_TX 0x00000006U /**< Transmit. */ -#define LL_ISO7816_ACTION_TXRX 0x00000007U /**< Transmit, followed by RX. */ -/** @} */ - -/** @defgroup ISO7816_LL_EC_IT IT Defines - * @brief Interrupt definitions which can be used with LL_ISO7816_ReadReg and LL_ISO7816_WriteReg functions - * @{ - */ -#define LL_ISO7816_INTR_TEST ISO7816_STAT_IRQ_TEST /**< Test interrupt */ -#define LL_ISO7816_INTR_PRESENCE ISO7816_STAT_IRQ_PRESENCE /**< Source presence interrupt */ -#define LL_ISO7816_INTR_STATE_ERR ISO7816_STAT_IRQ_STAT_ERR /**< Source state error interrupt */ -#define LL_ISO7816_INTR_DMA_ERR ISO7816_STAT_IRQ_DMA_ERR /**< Source dma error interrupt */ -#define LL_ISO7816_INTR_RETRY_ERR ISO7816_STAT_IRQ_RETRY_ERR /**< Source retry error interrupt */ -#define LL_ISO7816_INTR_RX_ERR ISO7816_STAT_IRQ_RX_ERR /**< Source rx error interrupt */ -#define LL_ISO7816_INTR_DONE ISO7816_STAT_IRQ_DONE /**< Source done error interrupt */ - -#define LL_ISO7816_INTR_MASK_ALL ISO7816_INTR_ALL /**< All interrupt */ -/** @} */ - -/** @defgroup ISO7816_LL_EC_PRESENCE Card Presence Defines - * @{ - */ -#define LL_ISO7816_CARD_ABSENT 0x00000000U /**< SIM Card is absent. */ -#define LL_ISO7816_CARD_PRESENT 0x00000001U /**< SIM Card is present. */ -/** @} */ - -/** @defgroup ISO7816_LL_EC_IO_STATES IO States Defines - * @{ - */ -#define LL_ISO7816_IO_STATE_OFF (0x0UL << ISO7816_STAT_IO_STAT_POS) /**< Off */ -#define LL_ISO7816_IO_STATE_IDLE (0x1UL << ISO7816_STAT_IO_STAT_POS) /**< Idle */ -#define LL_ISO7816_IO_STATE_RX_WAIT (0x4UL << ISO7816_STAT_IO_STAT_POS) /**< Receive Wait */ -#define LL_ISO7816_IO_STATE_RX (0x5UL << ISO7816_STAT_IO_STAT_POS) /**< Receive */ -#define LL_ISO7816_IO_STATE_TX (0x6UL << ISO7816_STAT_IO_STAT_POS) /**< Transmit */ -#define LL_ISO7816_IO_STATE_TX_GUARD (0x7UL << ISO7816_STAT_IO_STAT_POS) /**< Transmit Guard */ -/** @} */ - -/** @defgroup ISO7816_LL_EC_PWR_STATES Power States Defines - * @{ - */ -#define LL_ISO7816_PWR_STATE_OFF (0x0UL << ISO7816_STAT_PWR_STAT_POS) /**< Off */ -#define LL_ISO7816_PWR_STATE_PWRUP_VCC (0x1UL << ISO7816_STAT_PWR_STAT_POS) /**< Power up VCC */ -#define LL_ISO7816_PWR_STATE_PWRUP_RST (0x2UL << ISO7816_STAT_PWR_STAT_POS) /**< Power up reset */ -#define LL_ISO7816_PWR_STATE_PWRDN_RST (0x3UL << ISO7816_STAT_PWR_STAT_POS) /**< Power Down reset */ -#define LL_ISO7816_PWR_STATE_PWRDN_VCC (0x4UL << ISO7816_STAT_PWR_STAT_POS) /**< Power Down VCC */ -#define LL_ISO7816_PWR_STATE_STOP_PRE (0x5UL << ISO7816_STAT_PWR_STAT_POS) /**< Preparing Clock Stop */ -#define LL_ISO7816_PWR_STATE_STOP (0x6UL << ISO7816_STAT_PWR_STAT_POS) /**< Clock Stopped */ -#define LL_ISO7816_PWR_STATE_STOP_POST (0x7UL << ISO7816_STAT_PWR_STAT_POS) /**< Exiting Clock Stop */ -#define LL_ISO7816_PWR_STATE_IDLE (0x8UL << ISO7816_STAT_PWR_STAT_POS) /**< Idle */ -#define LL_ISO7816_PWR_STATE_RX_TS0 (0x9UL << ISO7816_STAT_PWR_STAT_POS) /**< RX TS Character */ -#define LL_ISO7816_PWR_STATE_RX_TS1 (0xAUL << ISO7816_STAT_PWR_STAT_POS) /**< RX TS Character */ -#define LL_ISO7816_PWR_STATE_RX (0xBUL << ISO7816_STAT_PWR_STAT_POS) /**< Receive */ -#define LL_ISO7816_PWR_STATE_TX (0xCUL << ISO7816_STAT_PWR_STAT_POS) /**< Transmit */ -#define LL_ISO7816_PWR_STATE_TX_RX (0xDUL << ISO7816_STAT_PWR_STAT_POS) /**< Transmit and Receive */ -/** @} */ - -/** @defgroup ISO7816_LL_EC_CLKSTOP Clock Stop Select Defines - * @{ - */ -#define LL_ISO7816_CLKSTOP_LOW (0x00000000UL) /**< Stop the clock at low level. */ -#define LL_ISO7816_CLKSTOP_HIGH (0x80000000UL) /**< Stop the clock at high level. */ -/** @} */ - -/** @defgroup ISO7816_LL_EC_CODING Coding Convention Defines - * @{ - */ -#define LL_ISO7816_CODING_DEFAULT (0x00000000UL) /**< High=1, LSB first. */ -#define LL_ISO7816_CODING_INVERSE (0x00000001UL) /**< High=0, MSB first. */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup ISO7816_LL_Exported_Macros ISO7816 Exported Macros - * @{ - */ - -/** @defgroup ISO7816_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in ISO7816 register - * @param __instance__ ISO7816 instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None. - */ -#define LL_ISO7816_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in ISO7816 register - * @param __instance__ ISO7816 instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_ISO7816_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup ISO7816_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup ISO7816_LL_EF_Configuration Configuration - * @{ - */ -/** - * @brief Request ISO7816 to go to the next action. - * - * Register|BitsName - * --------|-------- - * CTRL | ACTION - * - * @param ISO7816x ISO7816 instance. - * @param action This parameter can be one of the following values: - * @arg @ref LL_ISO7816_ACTION_NONE - * @arg @ref LL_ISO7816_ACTION_OFF - * @arg @ref LL_ISO7816_ACTION_STOPCLK - * @arg @ref LL_ISO7816_ACTION_ON - * @arg @ref LL_ISO7816_ACTION_WARMRST - * @arg @ref LL_ISO7816_ACTION_RX - * @arg @ref LL_ISO7816_ACTION_TX - * @arg @ref LL_ISO7816_ACTION_TXRX - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_action(iso7816_regs_t *ISO7816x, uint32_t action) -{ - WRITE_REG(ISO7816x->CTRL, action); -} - -/** - * @brief Get ISO7816 states. - * - * Register|BitsName - * --------|-------- - * CTRL | ACTION - * - * @param ISO7816x ISO7816 instance. - * @retval ISO7816 states - */ -__STATIC_INLINE uint32_t ll_iso7816_is_busy(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_BUSY) == (ISO7816_STAT_BUSY)); -} - -/** - * @brief Clear Transmit Retries Maximum. - * - * Register|BitsName - * --------|-------- - * CTRL | TX_RETRY_MAX_CLR - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_tx_retry_max(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_TX_RETYR_MC); -} - -/** - * @brief Clear Receive Retries Maximum. - * - * Register|BitsName - * --------|-------- - * CTRL | RX_RETRY_MAX_CLR - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_rx_retry_max(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_RX_RETYR_MC); -} - -/** - * @brief Check Card presence. - * - * Register|BitsName - * --------|-------- - * STAT | PRESENCE - * - * @param ISO7816x ISO7816 instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_ISO7816_CARD_ABSENT - * @arg @ref LL_ISO7816_CARD_PRESENT - */ -__STATIC_INLINE uint32_t ll_iso7816_check_card_presence(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->STAT, ISO7816_STAT_PRESENCE_STAT) >> ISO7816_STAT_PRESENCE_STAT_POS); -} - -/** - * @brief Get Maximum number of seen transmit retries after error signaling by ISO7816. - * - * Register|BitsName - * --------|-------- - * STAT | TX_RETRY_MAX - * - * @param ISO7816x ISO7816 instance. - * @retval Value range between 0x1 and 0x7. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_tx_retry_max(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->STAT, ISO7816_STAT_TX_RETRY_MAX) >> ISO7816_STAT_RX_RETRY_MAX_POS); -} - -/** - * @brief Get Maximum number of seen receive retries after error signaling by ISO7816. - * - * Register|BitsName - * --------|-------- - * STAT | RX_RETRY_MAX - * - * @param ISO7816x ISO7816 instance. - * @retval Value range between 0x1 and 0x7. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_rx_retry_max(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->STAT, ISO7816_STAT_RX_RETRY_MAX) >> ISO7816_STAT_RX_RETRY_MAX_POS); -} - -/** - * @brief Get ISO7816 IO States. - * - * Register|BitsName - * --------|-------- - * STAT | IO_STATE - * - * @param ISO7816x ISO7816 instance. - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_ISO7816_IO_STATE_OFF - * @arg @ref LL_ISO7816_IO_STATE_IDLE - * @arg @ref LL_ISO7816_IO_STATE_RX_WAIT - * @arg @ref LL_ISO7816_IO_STATE_RX - * @arg @ref LL_ISO7816_IO_STATE_TX - * @arg @ref LL_ISO7816_IO_STATE_TX_GUARD - */ -__STATIC_INLINE uint32_t ll_iso7816_get_io_states(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->STAT, ISO7816_STAT_IO_STAT) >> ISO7816_STAT_IO_STAT_POS); -} - -/** - * @brief Get ISO7816 Power States. - * - * Register|BitsName - * --------|-------- - * STAT | PWR_STATE - * - * @param ISO7816x ISO7816 instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_ISO7816_PWR_STATE_OFF - * @arg @ref LL_ISO7816_PWR_STATE_PWRUP_VCC - * @arg @ref LL_ISO7816_PWR_STATE_PWRUP_RST - * @arg @ref LL_ISO7816_PWR_STATE_PWRDN_RST - * @arg @ref LL_ISO7816_PWR_STATE_PWRDN_VCC - * @arg @ref LL_ISO7816_PWR_STATE_STOP_PRE - * @arg @ref LL_ISO7816_PWR_STATE_STOP - * @arg @ref LL_ISO7816_PWR_STATE_STOP_POST - * @arg @ref LL_ISO7816_PWR_STATE_IDLE - * @arg @ref LL_ISO7816_PWR_STATE_RX_TS0 - * @arg @ref LL_ISO7816_PWR_STATE_RX_TS1 - * @arg @ref LL_ISO7816_PWR_STATE_RX - * @arg @ref LL_ISO7816_PWR_STATE_TX - * @arg @ref LL_ISO7816_PWR_STATE_TX_RX - */ -__STATIC_INLINE uint32_t ll_iso7816_get_power_states(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->STAT, ISO7816_STAT_PWR_STAT)); -} - -/** - * @brief Set value of the clock output during stopped Clock. - * - * Register|BitsName - * --------|-------- - * CLK_CFG | CLK_STOP_SEL - * - * @param ISO7816x ISO7816 instance. - * @param level This parameter can be one of the following values: - * @arg @ref LL_ISO7816_CLKSTOP_LOW - * @arg @ref LL_ISO7816_CLKSTOP_HIGH - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_clkstop_level(iso7816_regs_t *ISO7816x, uint32_t level) -{ - MODIFY_REG(ISO7816x->CLK_CFG, ISO7816_CLK_CFG_CLK_STOP_SEL, level); -} - -/** - * @brief Get value of the clock output during stopped Clock. - * - * Register|BitsName - * --------|-------- - * CLK_CFG | CLK_STOP_SEL - * - * @param ISO7816x ISO7816 instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_ISO7816_CLKSTOP_LOW - * @arg @ref LL_ISO7816_CLKSTOP_HIGH - */ -__STATIC_INLINE uint32_t ll_iso7816_get_clkstop_level(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->CLK_CFG, ISO7816_CLK_CFG_CLK_STOP_SEL)); -} - -/** - * @brief Set clock division. - * @note Divide system clock by this value+1. - * - * Register|BitsName - * --------|-------- - * CLK_CFG | CLK_DIV - * - * @param ISO7816x ISO7816 instance - * @param value This parameter should range between 0x0 and 0xFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_clkdiv(iso7816_regs_t *ISO7816x, uint32_t value) -{ - MODIFY_REG(ISO7816x->CLK_CFG, ISO7816_CLK_CFG_CLK_DIV, value << ISO7816_CLK_CFG_CLK_DIV_POS); -} - -/** - * @brief Get clock division. - * - * Register|BitsName - * --------|-------- - * CLK_CFG | CLK_DIV - * - * @param ISO7816x ISO7816 instance - * @retval Returned value should range between 0x0 and 0xFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_clkdiv(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->CLK_CFG, ISO7816_CLK_CFG_CLK_DIV) >> ISO7816_CLK_CFG_CLK_DIV_POS); -} - -/** - * @brief Set divide ISO7816 clock. - * @note Divide SIM clock by this value+1 to define ETU length. The reset value - * is the one, needed for theATR. - * - * Register|BitsName - * --------|-------- - * CLK_CFG | ETU_DIV - * - * @param ISO7816x ISO7816 instance - * @param divide This parameter should range between 0x0 and 0x3FF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_etudiv(iso7816_regs_t *ISO7816x, uint32_t divide) -{ - MODIFY_REG(ISO7816x->CLK_CFG, ISO7816_CLK_CFG_ETU_DIV, divide); -} - -/** - * @brief Get divide ISO7816 clock. - * - * Register|BitsName - * --------|-------- - * CLK_CFG | ETU_DIV - * - * @param ISO7816x ISO7816 instance - * @retval Returned value should range between 0x0 and 0x3FF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_etudiv(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->CLK_CFG, ISO7816_CLK_CFG_ETU_DIV)); -} - -/** - * @brief Set ISO7816 wait_time in ETU. - - * @note Time between the leading edges of two consecutive characters - * - * Register|BitsName - * --------|-------- - * TIMES | WAIT_TIME - * - * @param ISO7816x ISO7816 instance - * @param wait_time This parameter should range between 0x0 and 0x3FFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_waittime(iso7816_regs_t *ISO7816x, uint32_t wait_time) -{ - MODIFY_REG(ISO7816x->TIMES_CFG, ISO7816_TIMES_CFG_WAIT_TIME, wait_time << ISO7816_TIMES_CFG_WAIT_TIME_POS); -} - -/** - * @brief Get maximum card response time(leading edge to leading edge) - * - * Register|BitsName - * --------|-------- - * TIMES | WAIT_TIME - * - * @param ISO7816x ISO7816 instance - * @retval Returned value should range between 0x0 and 0x3FFFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_waittime(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->TIMES_CFG, ISO7816_TIMES_CFG_WAIT_TIME) >> ISO7816_TIMES_CFG_WAIT_TIME_POS); -} - -/** - * @brief Set ISO7816 guard_time in ETU. - - * @note Set time between the leading edges of two consecutive characters - * - * Register|BitsName - * --------|-------- - * TIMES | GUARD_TIME - * - * @param ISO7816x ISO7816 instance - * @param guardtime Time between the leading edges of two consecutive characters - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_guardtime(iso7816_regs_t *ISO7816x, uint32_t guardtime) -{ - MODIFY_REG(ISO7816x->TIMES_CFG, ISO7816_TIMES_CFG_GUARD_TIME, guardtime); -} -/** - * @brief Get time between the leading edges of two consecutive characters. - * - * Register|BitsName - * --------|-------- - * TIMES | GUARDTIME - * - * @param ISO7816x ISO7816 instance - * @retval Returned value should range between 0x0 and 0x3FF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_guardtime(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->TIMES_CFG, ISO7816_TIMES_CFG_GUARD_TIME)); -} - -/** - * @brief Set maximum number of issued retries before giving up. - * - * Register|BitsName - * --------|-------- - * DATA_CFG| RETRY_LIMIT - * - * @param ISO7816x ISO7816 instance - * @param number This parameter should range between 0x0 and 0x7. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_retry_limit(iso7816_regs_t *ISO7816x, uint32_t number) -{ - MODIFY_REG(ISO7816x->DATA_CFG, ISO7816_DATA_CFG_RETRY_LIMIT, number << ISO7816_DATA_CFG_RETRY_LIMIT_POS); -} - -/** - * @brief Get maximum number of issued retries before giving up. - * - * Register|BitsName - * --------|-------- - * DATA_CFG| RETRY_LIMIT - * - * @param ISO7816x ISO7816 instance - * @retval Returned value should range between 0x0 and 0x7. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_retry_limit(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->DATA_CFG, ISO7816_DATA_CFG_RETRY_LIMIT) >> ISO7816_DATA_CFG_RETRY_LIMIT_POS); -} - -/** - * @brief Enable coding detection. - * - * Register|BitsName - * --------|-------- - * DATA_CFG| DETECT_CODING - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_enable_coding_detection(iso7816_regs_t *ISO7816x) -{ - SET_BITS(ISO7816x->DATA_CFG, ISO7816_DATA_CFG_DETECT_CODING); -} - -/** - * @brief Disable coding detection. - * - * Register|BitsName - * --------|-------- - * DATA_CFG| DETECT_CODING - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_disable_coding_detection(iso7816_regs_t *ISO7816x) -{ - CLEAR_BITS(ISO7816x->DATA_CFG, ISO7816_DATA_CFG_DETECT_CODING); -} - -/** - * @brief Set coding convention. - * - * Register|BitsName - * --------|-------- - * DATA_CFG| CODING - * - * @param ISO7816x ISO7816 instance. - * @param convention This parameter can be one of the following values: - * @arg @ref LL_ISO7816_CODING_DEFAULT - * @arg @ref LL_ISO7816_CODING_INVERSE - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_coding_convention(iso7816_regs_t *ISO7816x, uint32_t convention) -{ - MODIFY_REG(ISO7816x->DATA_CFG, ISO7816_DATA_CFG_CODING, convention); -} - -/** - * @brief Get coding convention. - * - * Register|BitsName - * --------|-------- - * DATA_CFG| CODING - * - * @param ISO7816x ISO7816 instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ISO7816_CODING_DEFAULT - * @arg @ref LL_ISO7816_CODING_INVERSE - */ -__STATIC_INLINE uint32_t ll_iso7816_get_coding_convention(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->DATA_CFG, ISO7816_DATA_CFG_CODING)); -} - -/** - * @brief Get current address relative to base_addr. - * - * Register|BitsName - * --------|-------- - * ADDR | ADDR - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3FFFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_current_addr(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->ADDR, ISO7816_ADDR_ADDR) >> ISO7816_ADDR_ADDR_POS); -} - -/** - * @brief Get address fraction. - * - * Register|BitsName - * --------|-------- - * ADDR | ADDR_FRAC - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_current_addr_frac(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->ADDR, ISO7816_ADDR_ADDR_FRAC)); -} - -/** - * @brief Set start address for RX and TX buffer. - * - * Register |BitsName - * ---------|-------- - * STRT_ADDR| BASE_ADDR+START_ADDR - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0xFFFFFFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_buffer_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - WRITE_REG(ISO7816x->START_ADDR, addr); -} - -/** - * @brief Get start address for RX and TX buffer. - * - * Register |BitsName - * ---------|-------- - * STRT_ADDR| BASE_ADDR+START_ADDR - * - * @param ISO7816x ISO7816 instance - */ -__STATIC_INLINE uint32_t ll_iso7816_get_buffer_addr(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_REG(ISO7816x->START_ADDR)); -} - -/** - * @brief Set base address for RX and TX buffer. - * - * Register |BitsName - * ---------|-------- - * STRT_ADDR| BASE_ADDR - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0xFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_base_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - MODIFY_REG(ISO7816x->START_ADDR, ISO7816_START_ADDR_BASE_ADDR, addr << ISO7816_START_ADDR_BASE_ADDR_POS); -} - -/** - * @brief Get base address for RX and TX buffer. - * - * Register |BitsName - * ---------|-------- - * STRT_ADDR| BASE_ADDR - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0xFFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_base_addr(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->START_ADDR, ISO7816_START_ADDR_BASE_ADDR) >> \ - ISO7816_START_ADDR_BASE_ADDR_POS); -} - -/** - * @brief Set start address for RX and TX buffer, relative to base_addr. - * - * Register |BitsName - * ---------|-------- - * STRT_ADDR| STRT_ADDR - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0x3FFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_start_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - MODIFY_REG(ISO7816x->START_ADDR, ISO7816_START_ADDR_START_ADDR, addr << ISO7816_START_ADDR_START_ADDR_POS); -} - -/** - * @brief Get start address for RX and TX buffer, relative to base_addr. - * - * Register |BitsName - * ---------|-------- - * STRT_ADDR| STRT_ADDR - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3FFFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_start_addr(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->START_ADDR, ISO7816_START_ADDR_START_ADDR) >> \ - ISO7816_START_ADDR_START_ADDR_POS); -} - -/** - * @brief Set end address of receive buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * RX_END_ADDR| RX_END_ADDR+ - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0x3FFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_rx_end_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - MODIFY_REG(ISO7816x->RX_END_ADDR, ISO7816_RX_END_ADDR_RX_END_ADDR, addr << ISO7816_RX_END_ADDR_RX_END_ADDR_POS); -} - -/** - * @brief Set RX endbyte address of receive buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * RX_END_ADDR| RX_END_ADDR+RX_END_AF - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0x3FFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_rx_endbyte_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - WRITE_REG(ISO7816x->RX_END_ADDR, addr); -} - -/** - * @brief Get RX end address of receive buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * RX_END_ADDR| RX_END_ADDR - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3FFFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_rx_end_addr(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->RX_END_ADDR, ISO7816_RX_END_ADDR_RX_END_ADDR) >> \ - ISO7816_RX_END_ADDR_RX_END_ADDR_POS); -} - -/** - * @brief Set RX end address fraction. - * - * Register | BitsName - * -----------|-------- - * RX_END_ADDR| RX_END_AF - * - * @param ISO7816x ISO7816 instance - * @param frac This parameter should range between 0x0 and 0x3. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_rx_end_addr_frac(iso7816_regs_t *ISO7816x, uint32_t frac) -{ - MODIFY_REG(ISO7816x->RX_END_ADDR, ISO7816_RX_END_ADDR_RX_END_AF, frac); -} - -/** - * @brief Set TX endbyte address of buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_ADDR+TX_END_AF - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0x3FFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_tx_endbyte_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - WRITE_REG(ISO7816x->TX_END_ADDR, addr); -} - -/** - * @brief Get TX endbyte address of buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_ADDR+TX_END_AF - * - * @param ISO7816x ISO7816 instance - * @retval TX endbyte address. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_tx_endbyte_addr(iso7816_regs_t *ISO7816x) -{ - return READ_REG(ISO7816x->TX_END_ADDR); -} - -/** - * @brief Get RX endbyte address of buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_ADDR+TX_END_AF - * - * @param ISO7816x ISO7816 instance - * @retval RX endbyte address. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_rx_endbyte_addr(iso7816_regs_t *ISO7816x) -{ - return READ_REG(ISO7816x->RX_END_ADDR); -} - -/** - * @brief Get RX end address fraction. - * - * Register | BitsName - * -----------|-------- - * RX_END_ADDR| RX_END_AF - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_rx_end_addr_frac(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->RX_END_ADDR, ISO7816_RX_END_ADDR_RX_END_AF)); -} - -/** - * @brief Set end address of transmit buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_ADDR - * - * @param ISO7816x ISO7816 instance - * @param addr This parameter should range between 0x0 and 0x3FFFF. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_tx_end_addr(iso7816_regs_t *ISO7816x, uint32_t addr) -{ - MODIFY_REG(ISO7816x->TX_END_ADDR, ISO7816_TX_END_ADDR_TX_END_ADDR, addr << ISO7816_TX_END_ADDR_TX_END_ADDR_POS); -} - -/** - * @brief Get end address of transmit buffer, relative to base_addr. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_ADDR - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3FFFF. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_tx_end_addr(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->TX_END_ADDR, ISO7816_TX_END_ADDR_TX_END_ADDR) >> \ - ISO7816_TX_END_ADDR_TX_END_ADDR_POS); -} - -/** - * @brief Set TX end address fraction. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_AF - * - * @param ISO7816x ISO7816 instance - * @param frac This parameter should range between 0x0 and 0x3. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_set_tx_end_addr_frac(iso7816_regs_t *ISO7816x, uint32_t frac) -{ - MODIFY_REG(ISO7816x->TX_END_ADDR, ISO7816_TX_END_ADDR_TX_END_AF, frac); -} - -/** - * @brief Get TX end address fraction. - * - * Register | BitsName - * -----------|-------- - * TX_END_ADDR| TX_END_AF - * - * @param ISO7816x ISO7816 instance - * @retval Value between 0x0 and 0x3. - */ -__STATIC_INLINE uint32_t ll_iso7816_get_tx_end_addr_frac(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_BITS(ISO7816x->TX_END_ADDR, ISO7816_TX_END_ADDR_TX_END_AF)); -} - -/** @} */ - -/** @defgroup ISO7816_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Get ISO7816 interrupt flags - * - * Register|BitsName - * --------|-------- - * STAT | STAT_TEST - * STAT | STAT_PRESENCE - * STAT | STAT_STATE_ERR - * STAT | STAT_DMA_ERR - * STAT | STAT_RETRY_ERR - * STAT | STAT_RX_ERR - * STAT | STAT_DONE - * - * @param ISO7816x ISO7816 instance. - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_ISO7816_INTR_TEST - * @arg @ref LL_ISO7816_INTR_PRESENCE - * @arg @ref LL_ISO7816_INTR_STATE_ERR - * @arg @ref LL_ISO7816_INTR_DMA_ERR - * @arg @ref LL_ISO7816_INTR_RETRY_ERR - * @arg @ref LL_ISO7816_INTR_RX_ERR - * @arg @ref LL_ISO7816_INTR_DONE -*/ -__STATIC_INLINE uint32_t ll_iso7816_get_it_flag(iso7816_regs_t *ISO7816x) -{ - return (uint32_t)(READ_REG(ISO7816x->STAT) & ISO7816_INTR_ALL); -} - -/** - * @brief Indicate the status of STAT_TEST flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_TEST - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_test(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_TEST) == (ISO7816_STAT_IRQ_TEST)); -} - -/** - * @brief Indicate the status of STAT_PRESENCE flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_PRESENCE - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_presence(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_PRESENCE) == (ISO7816_STAT_IRQ_PRESENCE)); -} - -/** - * @brief Indicate the status of STAT_STATE_ERR flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_STATE_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_state_err(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_STAT_ERR) == (ISO7816_STAT_IRQ_STAT_ERR)); -} - -/** - * @brief Indicate the status of STAT_DMA_ERR flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_DMA_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_dma_err(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_DMA_ERR) == (ISO7816_STAT_IRQ_DMA_ERR)); -} - -/** - * @brief Indicate the status of STAT_RETRY_ERR flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_RETRY_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_retry_err(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_RETRY_ERR) == (ISO7816_STAT_IRQ_RETRY_ERR)); -} - -/** - * @brief Indicate the status of STAT_RX_ERR flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_RX_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_rx_err(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_RX_ERR) == (ISO7816_STAT_IRQ_RX_ERR)); -} - -/** - * @brief Indicate the status of STAT_DONE flag. - * - * Register|BitsName - * --------|-------- - * STAT | STAT_DONE - * - * @param ISO7816x ISO7816 instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_iso7816_is_active_flag_done(iso7816_regs_t *ISO7816x) -{ - return (READ_BITS(ISO7816x->STAT, ISO7816_STAT_IRQ_DONE) == (ISO7816_STAT_IRQ_DONE)); -} - -/** - * @brief Clear the combined interrupt, all individual interrupts, and the STAT register - * - * Register|BitsName - * --------|-------- - * STAT | STAT_TEST - * STAT | STAT_PRESENCE - * STAT | STAT_STATE_ERR - * STAT | STAT_DMA_ERR - * STAT | STAT_RETRY_ERR - * STAT | STAT_RX_ERR - * STAT | STAT_DONE - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_all_intr(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_INTR_ALL); -} - -/** - * @brief Clear test flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_TEST - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_test(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_TEST_CLR); -} - -/** - * @brief Clear presence flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_PRESENCE - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_presence(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_PRESENCE_CLR); -} - -/** - * @brief Clear state error flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_STATE_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_state_err(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_STAT_EC); -} - -/** - * @brief Clear dma error flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_DMA_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_dma_err(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_DMA_EC); -} - -/** - * @brief Clear retry error flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_RETRY_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_retry_err(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_RETYR_EC); -} - -/** - * @brief Clear RX error flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_RX_ERR - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_rx_err(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_RX_EC); -} - -/** - * @brief Clear done flag. - * - * Register|BitsName - * --------|-------- - * CTRL | CTRL_DONE - * - * @param ISO7816x ISO7816 instance. - * @retval None. - */ -__STATIC_INLINE void ll_iso7816_clear_flag_done(iso7816_regs_t *ISO7816x) -{ - WRITE_REG(ISO7816x->CTRL, ISO7816_CTRL_IRQ_DONE_CLR); -} - -/** @} */ - -/** @defgroup ISO7816_LL_Init ISO7816 Initialization and de-initialization functions - * @{ - */ - -/** - * @brief Initialize the ISO7816 registers according to the specified parameters in p_iso7816_init. - * @param ISO7816x ISO7816 instance. - * @param p_iso7816_init pointer to a @ref ll_iso7816_init_t structure. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ISO7816 registers are initialized - * - ERROR: Not applicable - */ -error_status_t ll_iso7816_init(iso7816_regs_t *ISO7816x, ll_iso7816_init_t *p_iso7816_init); - -/** - * @brief De-initialize the ISO7816 registers to their default reset values. - * @param ISO7816x ISO7816 instance. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ISO7816 registers are de-initialized - * - ERROR: ISO7816 registers are not de-initialized - */ -error_status_t ll_iso7816_deinit(iso7816_regs_t *ISO7816x); - -/** @} */ -/** @} */ - -#endif /* ISO7816 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_ISO7816_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_msio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_msio.h deleted file mode 100755 index 98cdcd9..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_msio.h +++ /dev/null @@ -1,716 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_msio.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of MSIO LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_MSIO MSIO - * @brief MSIO LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_MSIO_H__ -#define __GR55XX_LL_MSIO_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(AON) - -/** @defgroup MSIO_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup MSIO_LL_ES_INIT MSIO Exported init structures - * @{ - */ - -/** - * @brief LL MSIO init Structure definition - */ -typedef struct _ll_msio_init { - uint32_t pin; /**< Specifies the MSIO pins to be MSIO_InitStructured. - This parameter can be any value of @ref MSIO_LL_EC_PIN */ - - uint32_t direction; /**< Specifies the direction for the selected pins. - This parameter can be a value of @ref MSIO_LL_EC_DIRECTION. - MSIO HW MSIO_InitStructuration can be - modified afterwards using unitary - function - @ref ll_msio_set_pin_direction(). */ - - uint32_t mode; /**< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref MSIO_LL_EC_MODE. - MSIO HW MSIO_InitStructuration can be - modified afterwards using unitary - function - @ref ll_msio_set_pin_mode(). */ - - uint32_t pull; /**< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref MSIO_LL_EC_PULL. - MSIO HW configuration can be modified - afterwards using unitary function - @ref ll_msio_set_pin_pull(). */ - - uint32_t mux; /*!< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref MSIO_LL_EC_MUX. - GPIO HW MSIO_InitStructuration can be - modified afterwards using unitary - function - @ref ll_msio_set_pin_mux(). */ -} ll_msio_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup MSIO_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup MSIO_LL_Exported_Constants MSIO Exported Constants - * @{ - */ - -/** @defgroup MSIO_LL_EC_PIN PIN - * @{ - */ -#define LL_MSIO_PIN_0 ((uint32_t)0x01U) /**< Select pin 0 */ -#define LL_MSIO_PIN_1 ((uint32_t)0x02U) /**< Select pin 1 */ -#define LL_MSIO_PIN_2 ((uint32_t)0x04U) /**< Select pin 2 */ -#define LL_MSIO_PIN_3 ((uint32_t)0x08U) /**< Select pin 3 */ -#define LL_MSIO_PIN_4 ((uint32_t)0x10U) /**< Select pin 4 */ -#define LL_MSIO_PIN_ALL ((uint32_t)0x1FU) /**< Select all pins */ -/** @} */ - -/** @defgroup MSIO_LL_EC_DIRECTION Direction - * @{ - */ -#define LL_MSIO_DIRECTION_NONE ((uint32_t)0x0U) /**< Disable input/output */ -#define LL_MSIO_DIRECTION_INPUT ((uint32_t)0x1U) /**< Enable input */ -#define LL_MSIO_DIRECTION_OUTPUT ((uint32_t)0x2U) /**< Enable output */ -#define LL_MSIO_DIRECTION_INOUT ((uint32_t)0x3U) /**< Enable input&output */ -/** @} */ - -/** @defgroup MSIO_LL_EC_MODE Mode - * @{ - */ -#define LL_MSIO_MODE_ANALOG ((uint32_t)0x0U) /**< Select analog mode */ -#define LL_MSIO_MODE_DIGITAL ((uint32_t)0x1U) /**< Enable digital mode */ -/** @} */ - -/** @defgroup MSIO_LL_EC_PULL Pull Up Pull Down - * @{ - */ -#define LL_MSIO_PULL_NO ((uint32_t)0x0U) /**< Select I/O no pull */ -#define LL_MSIO_PULL_UP ((uint32_t)0x1U) /**< Select I/O pull up */ -#define LL_MSIO_PULL_DOWN ((uint32_t)0x2U) /**< Select I/O pull down */ -/** @} */ - -/** @defgroup MSIO_LL_EC_MUX Alternate Function - * @{ - */ -#define LL_MSIO_MUX_0 ((uint32_t)0x0U) /*!< Select alternate function 0 */ -#define LL_MSIO_MUX_1 ((uint32_t)0x1U) /*!< Select alternate function 1 */ -#define LL_MSIO_MUX_2 ((uint32_t)0x2U) /*!< Select alternate function 2 */ -#define LL_MSIO_MUX_3 ((uint32_t)0x3U) /*!< Select alternate function 3 */ -#define LL_MSIO_MUX_4 ((uint32_t)0x4U) /*!< Select alternate function 4 */ -#define LL_MSIO_MUX_5 ((uint32_t)0x5U) /*!< Select alternate function 5 */ -#define LL_MSIO_MUX_6 ((uint32_t)0x6U) /*!< Select alternate function 6 */ -#define LL_MSIO_MUX_7 ((uint32_t)0x7U) /*!< Select alternate function 7 */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup MSIO_LL_Exported_Macros MSIO Exported Macros - * @{ - */ - -/** @defgroup MSIO_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in MSIO register - * @param __instance__ MSIO instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_MSIO_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in MSIO register - * @param __instance__ MSIO instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_MSIO_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup MSIO_LL_Private_Macros MSIO Private Macros - * @{ - */ - -/** @defgroup MSIO_LL_EC_DEFAULT_CONFIG InitStruct default configuartion - * @{ - */ - -/** - * @brief LL MSIO InitStrcut default configuartion - */ -#define LL_MSIO_DEFAULT_CONFIG \ -{ \ - .pin = LL_MSIO_PIN_ALL, \ - .direction = LL_MSIO_DIRECTION_INPUT, \ - .mode = LL_MSIO_MODE_DIGITAL, \ - .pull = LL_MSIO_PULL_DOWN, \ - .mux = LL_MSIO_MUX_7, \ -} -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup MSIO_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup MSIO_LL_EF_Port_Configuration Port Configuration - * @{ - */ - -/** - * @brief Set several MSIO pins to input/output direction. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | OE_N - * MSIO_PAD_CFG_0 | IE_N - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @param direction This parameter can be one of the following values: - * @arg @ref LL_MSIO_DIRECTION_NONE - * @arg @ref LL_MSIO_DIRECTION_INPUT - * @arg @ref LL_MSIO_DIRECTION_OUTPUT - * @arg @ref LL_MSIO_DIRECTION_INOUT - * @retval None - */ -__STATIC_INLINE void ll_msio_set_pin_direction(uint32_t pin_mask, uint32_t direction) -{ - uint32_t oe_mask = (pin_mask << AON_MSIO_PAD_CFG_0_OE_N_Pos) & AON_MSIO_PAD_CFG_0_OE_N; - uint32_t ie_mask = (pin_mask << AON_MSIO_PAD_CFG_0_IE_N_Pos) & AON_MSIO_PAD_CFG_0_IE_N; - if (direction != LL_MSIO_DIRECTION_NONE) { - if (direction != LL_MSIO_DIRECTION_INOUT) { - MODIFY_REG(AON->MSIO_PAD_CFG_0, (ie_mask | oe_mask), \ - (direction != LL_MSIO_DIRECTION_INPUT) ? ie_mask : oe_mask); - } else { - CLEAR_BITS(AON->MSIO_PAD_CFG_0, (ie_mask | oe_mask)); - } - } else { - SET_BITS(AON->MSIO_PAD_CFG_0, (ie_mask | oe_mask)); - } -} - -/** - * @brief Return gpio direction for a MSIO pin. - * @note I/O direction can be Input direction, General purpose output. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | OE_N - * MSIO_PAD_CFG_0 | IE_N - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_MSIO_DIRECTION_NONE - * @arg @ref LL_MSIO_DIRECTION_INPUT - * @arg @ref LL_MSIO_DIRECTION_OUTPUT - * @arg @ref LL_MSIO_DIRECTION_INOUT - */ -__STATIC_INLINE uint32_t ll_msio_get_pin_direction(uint32_t pin) -{ - uint32_t oe_mask = (pin << AON_MSIO_PAD_CFG_0_OE_N_Pos) & AON_MSIO_PAD_CFG_0_OE_N; - uint32_t ie_mask = (pin << AON_MSIO_PAD_CFG_0_IE_N_Pos) & AON_MSIO_PAD_CFG_0_IE_N; - uint32_t mask = READ_BITS(AON->MSIO_PAD_CFG_0, (ie_mask | oe_mask)); - if (mask == (ie_mask | oe_mask)) { - return LL_MSIO_DIRECTION_NONE; - } else { - if (mask == 0) { - return LL_MSIO_DIRECTION_INOUT; - } else { - return ((mask == ie_mask) ? LL_MSIO_DIRECTION_OUTPUT : LL_MSIO_DIRECTION_INPUT); - } - } -} - -/** - * @brief Set several MSIO pins to analog/digital mode. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | AE_N - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @param mode This parameter can be one of the following values: - * @arg @ref LL_MSIO_MODE_ANALOG - * @arg @ref LL_MSIO_MODE_DIGITAL - * @retval None - */ -__STATIC_INLINE void ll_msio_set_pin_mode(uint32_t pin_mask, uint32_t mode) -{ - uint32_t ae_mask = (pin_mask << AON_MSIO_PAD_CFG_1_AE_N_Pos) & AON_MSIO_PAD_CFG_1_AE_N; - uint32_t ae_n = (mode != LL_MSIO_MODE_DIGITAL) ? 0U : ae_mask; - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->MSIO_PAD_CFG_1, ae_mask, ae_n); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Return gpio mode for a MSIO pin. - * @note I/O mode can be analog or digital. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | AE_N - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_MSIO_MODE_ANALOG - * @arg @ref LL_MSIO_MODE_DIGITAL - */ -__STATIC_INLINE uint32_t ll_msio_get_pin_mode(uint32_t pin) -{ - uint32_t ae_mask = (pin << AON_MSIO_PAD_CFG_1_AE_N_Pos) & AON_MSIO_PAD_CFG_1_AE_N; - return ((READ_BITS(AON->MSIO_PAD_CFG_1, ae_mask) == ae_mask) ? LL_MSIO_MODE_DIGITAL : LL_MSIO_MODE_ANALOG); -} - -/** - * @brief Configure gpio pull-up or pull-down for a dedicated MSIO pin. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | RE_N - * MSIO_PAD_CFG_1 | RTYPE - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @param pull This parameter can be one of the following values: - * @arg @ref LL_MSIO_PULL_NO - * @arg @ref LL_MSIO_PULL_UP - * @arg @ref LL_MSIO_PULL_DOWN - * @retval None - */ -__STATIC_INLINE void ll_msio_set_pin_pull(uint32_t pin_mask, uint32_t pull) -{ - if (pull != LL_MSIO_PULL_NO) { - uint32_t rtype_mask = (pin_mask << AON_MSIO_PAD_CFG_1_RTYPE_Pos) & AON_MSIO_PAD_CFG_1_RTYPE; - uint32_t rtype = (pull != LL_MSIO_PULL_UP) ? 0U : rtype_mask; - CLEAR_BITS(AON->MSIO_PAD_CFG_0, (pin_mask << AON_MSIO_PAD_CFG_0_RE_N_Pos) & AON_MSIO_PAD_CFG_0_RE_N); - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->MSIO_PAD_CFG_1, rtype_mask, rtype); - GLOBAL_EXCEPTION_ENABLE(); - } else { - SET_BITS(AON->MSIO_PAD_CFG_0, (pin_mask << AON_MSIO_PAD_CFG_0_RE_N_Pos) & AON_MSIO_PAD_CFG_0_RE_N); - } -} - -/** - * @brief Return gpio pull-up or pull-down for a dedicated MSIO pin. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | RE_N - * MSIO_PAD_CFG_1 | RTYPE - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_MSIO_PULL_NO - * @arg @ref LL_MSIO_PULL_UP - * @arg @ref LL_MSIO_PULL_DOWN - */ -__STATIC_INLINE uint32_t ll_msio_get_pin_pull(uint32_t pin) -{ - if (READ_BITS(AON->MSIO_PAD_CFG_0, (pin << AON_MSIO_PAD_CFG_0_RE_N_Pos) & AON_MSIO_PAD_CFG_0_RE_N)) { - return LL_MSIO_PULL_NO; - } else { - uint32_t rtype_mask = (pin << AON_MSIO_PAD_CFG_1_RTYPE_Pos) & AON_MSIO_PAD_CFG_1_RTYPE; - return ((READ_BITS(AON->MSIO_PAD_CFG_1, rtype_mask) != RESET) ? LL_MSIO_PULL_UP : LL_MSIO_PULL_DOWN); - } -} - -/** - * @brief Configure gpio pinmux number of a dedicated pin from 0 to 4 for a dedicated port. - * @note Possible values are from AF0 to AF7 depending on target. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_MUX_CTL | CTL_00_04 - * MSIO_PAD_CFG_1 | MCU_OVR - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @param mux This parameter can be one of the following values: - * @arg @ref LL_MSIO_MUX_0 - * @arg @ref LL_MSIO_MUX_1 - * @arg @ref LL_MSIO_MUX_2 - * @arg @ref LL_MSIO_MUX_3 - * @arg @ref LL_MSIO_MUX_4 - * @arg @ref LL_MSIO_MUX_5 - * @arg @ref LL_MSIO_MUX_6 - * @arg @ref LL_MSIO_MUX_7 - * @retval None - */ -__STATIC_INLINE void ll_msio_set_pin_mux(uint32_t pin, uint32_t mux) -{ - uint32_t pos = POSITION_VAL(pin) << 2; - if (LL_MSIO_MUX_7 == mux) { - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->MSIO_PAD_CFG_1, pin << AON_MSIO_PAD_CFG_1_MCU_OVR_Pos); - GLOBAL_EXCEPTION_ENABLE(); - } else { - MODIFY_REG(MCU_SUB->MSIO_PAD_MUX_CTL, 0xF << pos, mux << pos); - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, pin << AON_MSIO_PAD_CFG_1_MCU_OVR_Pos); - GLOBAL_EXCEPTION_ENABLE(); - } -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 0 to 4 for a dedicated port. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_MUX_CTL | CTL_00_04 - * MSIO_PAD_CFG_1 | MCU_OVR - * - * @param pin This parameter can be one of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_MSIO_MUX_0 - * @arg @ref LL_MSIO_MUX_1 - * @arg @ref LL_MSIO_MUX_2 - * @arg @ref LL_MSIO_MUX_3 - * @arg @ref LL_MSIO_MUX_4 - * @arg @ref LL_MSIO_MUX_5 - * @arg @ref LL_MSIO_MUX_6 - * @arg @ref LL_MSIO_MUX_7 - */ -__STATIC_INLINE uint32_t ll_msio_get_pin_mux(uint32_t pin) -{ - if (READ_BITS(AON->MSIO_PAD_CFG_1, pin << AON_MSIO_PAD_CFG_1_MCU_OVR_Pos)) { - uint32_t pos = POSITION_VAL(pin) << 2; - return (READ_BITS(MCU_SUB->MSIO_PAD_MUX_CTL, 0xF << pos) >> pos); - } else { - return LL_MSIO_MUX_7; - } -} - -/** @} */ - -/** @defgroup MSIO_LL_EF_Data_Access Data Access - * @{ - */ - -/** - * @brief Return full input data register value of MSIO. - * - * Register|BitsName - * --------|-------- - * MSIO_REG0 | MSIO_C - * - * @retval Input data register value of port - */ -__STATIC_INLINE uint32_t ll_msio_read_input_port(void) -{ - return (uint32_t)(READ_BITS(MCU_SUB->MSIO_REG0, MCU_SUB_MSIO_REG0_MSIO_C)); -} - -/** - * @brief Return if input data level of several MSIO pins is high or low. - * - * Register|BitsName - * --------|-------- - * MSIO_REG0 | MSIO_C - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_msio_is_input_pin_set(uint32_t pin_mask) -{ - return (uint32_t)(READ_BITS(MCU_SUB->MSIO_REG0, pin_mask) == pin_mask); -} - -/** - * @brief Write output data register of MSIO. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | IN - * - * @param port_value Level value for each pin of the port - * @retval None - */ -__STATIC_INLINE void ll_msio_write_output_port(uint32_t port_value) -{ - MODIFY_REG(AON->MSIO_PAD_CFG_0, AON_MSIO_PAD_CFG_0_IN, \ - (port_value << AON_MSIO_PAD_CFG_0_IN_Pos) & AON_MSIO_PAD_CFG_0_IN); -} - -/** - * @brief Return full output data register value of MSIO. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | IN - * - * @retval Output data register value of port - */ -__STATIC_INLINE uint32_t ll_msio_read_output_port(void) -{ - return (uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_0, AON_MSIO_PAD_CFG_0_IN) >> AON_MSIO_PAD_CFG_0_IN_Pos); -} - -/** - * @brief Return if input data level of several MSIO pins is high or low. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | IN - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_msio_is_output_pin_set(uint32_t pin_mask) -{ - pin_mask = (pin_mask << AON_MSIO_PAD_CFG_0_IN_Pos) & AON_MSIO_PAD_CFG_0_IN; - return (uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_0, pin_mask) == pin_mask); -} - -/** - * @brief Set specified MSIO pins to high level - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | IN - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_msio_set_output_pin(uint32_t pin_mask) -{ - SET_BITS(AON->MSIO_PAD_CFG_0, (pin_mask << AON_MSIO_PAD_CFG_0_IN_Pos) & AON_MSIO_PAD_CFG_0_IN); -} - -/** - * @brief Set specified MSIO pins to low level. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | IN - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_msio_reset_output_pin(uint32_t pin_mask) -{ - CLEAR_BITS(AON->MSIO_PAD_CFG_0, (pin_mask << AON_MSIO_PAD_CFG_0_IN_Pos) & AON_MSIO_PAD_CFG_0_IN); -} - -/** - * @brief Toggle data value of specified MSIO pins. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_0 | IN - * - * @param pin_mask This parameter can be a combination of the following values: - * @arg @ref LL_MSIO_PIN_0 - * @arg @ref LL_MSIO_PIN_1 - * @arg @ref LL_MSIO_PIN_2 - * @arg @ref LL_MSIO_PIN_3 - * @arg @ref LL_MSIO_PIN_4 - * @arg @ref LL_MSIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void ll_msio_toggle_pin(uint32_t pin_mask) -{ - WRITE_REG(AON->MSIO_PAD_CFG_0, \ - (READ_REG(AON->MSIO_PAD_CFG_0) ^ ((pin_mask << AON_MSIO_PAD_CFG_0_IN_Pos) & AON_MSIO_PAD_CFG_0_IN))); -} - -/** @} */ - -/** @defgroup MSIO_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize MSIO registers (Registers restored to their default values). - * @retval An error_status_t enumeration value: - * - SUCCESS: MSIO registers are de-initialized - * - ERROR: MSIO registers are not de-initialized - */ -error_status_t ll_msio_deinit(void); - -/** - * @brief Initialize MSIO registers according to the specified. - * parameters in p_msio_init. - * @param p_msio_init Pointer to a ll_msio_init_t structure that contains the configuration - * information for the specified MSIO peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: MSIO registers are initialized according to p_msio_init content - * - ERROR: Problem occurred during MSIO Registers initialization - */ -error_status_t ll_msio_init(ll_msio_init_t *p_msio_init); - -/** - * @brief Set each field of a @ref ll_msio_init_t type structure to default value. - * @param p_msio_init Pointer to a @ref ll_msio_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_msio_struct_init(ll_msio_init_t *p_msio_init); - -/** @} */ - -/** @} */ - -#endif /* AON */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_MSIO_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pkc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pkc.h deleted file mode 100755 index f8de7d1..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pkc.h +++ /dev/null @@ -1,2471 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_pkc.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PKC LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_PKC PKC - * @brief PKC LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_PKC_H__ -#define __GR55XX_LL_PKC_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (PKC) - -/** @addtogroup PKC_LL_MACRO - * @{ - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PKC_LL_Private_Macro PKC Private Macros - * @{ - */ -#define ECC_U32_LENGTH (8) /**< ECC Array Length */ -#define RSA_U32_LENGTH (64) /**< RSA Array Length */ - -/** @} */ - -/** @} */ - -/** @defgroup PKC_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup PKC_LL_ES_INIT PKC Exported Init structures - * @{ - */ - -/** - * @brief LL PKC ECC Point Structure definition - */ -typedef struct _ll_ecc_point { - uint32_t X[ECC_U32_LENGTH]; /**< Specifies the point in x-axis */ - - uint32_t Y[ECC_U32_LENGTH]; /**< Specifies the point in y-axis */ -} ll_ecc_point_t; - -/** - * @brief LL PKC ECC P-256 Elliptic Curve Init Structure definition - */ -typedef struct _ll_ecc_curve_init { - uint32_t A[ECC_U32_LENGTH]; /**< Operand A array */ - uint32_t B[ECC_U32_LENGTH]; /**< Operand B array */ - - uint32_t P[ECC_U32_LENGTH]; /**< Prime number P array */ - uint32_t PRSquare[ECC_U32_LENGTH]; /**< R^2 mod P, where R = 2^256 */ - uint32_t ConstP; /**< Montgomery multiplication constant in prime field P, ConstP = 1 */ - - uint32_t N[ECC_U32_LENGTH]; /**< Prime number N array */ - uint32_t NRSquare[ECC_U32_LENGTH]; /**< R^2 mod N, where R = 2^256 */ - uint32_t ConstN; /**< Montgomery multiplication constant in prime field N, - ConstN = 0xee00bc4f */ - - uint32_t H; /**< H */ - - ll_ecc_point_t G; /**< ECC Point G */ -} ll_ecc_curve_init_t; - -/** - * @brief LL PKC Init Structure definition - */ -typedef struct _ll_pkc_init { - ll_ecc_curve_init_t *p_ecc_curve; /**< Specifies the pointer to elliptic curve description */ - - uint32_t data_bits; /**< Specifies the Data size: 256 ~ 2048bits */ -} ll_pkc_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup PKC_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PKC_LL_Exported_Constants PKC Exported Constants - * @{ - */ - -/** @defgroup PKC_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_PKC_ReadReg function - * @{ - */ -#define LL_PKC_WORKSTAT_BUSY PKC_WORKSTAT_BUSY /**< Busy flag */ -/** @} */ - -/** @defgroup PKC_LL_EC_IT IT Defines - * @brief Interrupt defines which can be used with LL_PKC_ReadReg and LL_PKC_WriteReg functions - * @{ - */ -#define LL_PKC_INTEN_DONE PKC_INTEN_DONE /**< Operation Done Interrupt source */ -#define LL_PKC_INTEN_ERR PKC_INTEN_ERR /**< Operation Error Interrupt source */ -#define LL_PKC_INTEN_BAOVF PKC_INTEN_BAOVF /**< Big Integer Result Overflow Interrupt source */ -/** @} */ - -/** @defgroup PKC_LL_EC_BITS_LENGTH Bits Length - * @{ - */ -#define LL_PKC_BITS_LENGTH_MIN (256U) /**< Bits length min value */ -#define LL_PKC_BITS_LENGTH_MAX (2048U) /**< Bits length max value */ -#define LL_PKC_BIGMULTI_BITS_LENGTH_MAX (1024U) /**< Big number multiplication bits Length max value */ -/** @} */ - -/** @defgroup PKC_LL_EC_OPERATION_MODE Operation Mode - * @{ - */ -#define LL_PKC_operation_mode_MULTIPLY (0x00000000U) /**< Multiplication operation - mode */ -#define LL_PKC_operation_mode_INVERTION (1UL << PKC_SW_CTRL_OPMODE_Pos) /**< Inversion operation - mode */ -#define LL_PKC_operation_mode_ADD (2UL << PKC_SW_CTRL_OPMODE_Pos) /**< Addition operation mode */ -#define LL_PKC_operation_mode_SUB (3UL << PKC_SW_CTRL_OPMODE_Pos) /**< Subtraction operation mode */ -#define LL_PKC_operation_mode_COMPARE (4UL << PKC_SW_CTRL_OPMODE_Pos) /**< Comparison operation mode */ -#define LL_PKC_operation_mode_LEFTSHIFT (5UL << PKC_SW_CTRL_OPMODE_Pos) /**< Left Shift operation mode */ -#define LL_PKC_operation_mode_BIGINTEGERMULTIPLY (6UL << PKC_SW_CTRL_OPMODE_Pos) /**< Big Number Multiplication - operation mode */ -#define LL_PKC_operation_mode_BIGINTEGERADD (7UL << PKC_SW_CTRL_OPMODE_Pos) /**< Big Number Addition operation - mode */ -/** @} */ - -/** @defgroup PKC_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL PKC ECC Curve default configuretion. - */ -#define LL_ECC_CURVE_DEFAULT_CONFIG LL_ECC_CURVE_SECP256R1_CONFIG - -/** - * @brief LL PKC ECC Curve SECP256R1 configuretion. - */ -#define LL_ECC_CURVE_SECP256R1_CONFIG \ -{ \ - .A = {0xFFFFFFFC, 0x00000004, 0x00000000, 0x00000000, 0x00000003, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFC}, \ - .B = {0xDC30061D, 0x04874834, 0xE5A220AB, 0xF7212ED6, 0xACF005CD, 0x78843090, 0xD89CDF62, 0x29C4BDDF}, \ - .P = {0xFFFFFFFF, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, \ - .PRSquare = {0x00000004, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFB, 0xFFFFFFFF, 0x00000000, 0x00000003}, \ - .ConstP = 1, \ - .N = {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xBCE6FAAD, 0xA7179E84, 0xF3B9CAC2, 0xFC632551}, \ - .NRSquare = {0x66E12D94, 0xF3D95620, 0x2845B239, 0x2B6BEC59, 0x4699799C, 0x49BD6FA6, 0x83244C95, 0xBE79EEA2}, \ - .ConstN = 0xEE00BC4F, \ - .H = 1, \ - .G.X = {0x6B17D1F2, 0xE12C4247, 0xF8BCE6E5, 0x63A440F2, 0x77037D81, 0x2DEB33A0, 0xF4A13945, 0xD898C296}, \ - .G.Y = {0x4FE342E2, 0xFE1A7F9B, 0x8EE7EB4A, 0x7C0F9E16, 0x2BCE3357, 0x6B315ECE, 0xCBB64068, 0x37BF51F5}, \ -} - -/** - * @brief LL PKC ECC Curve SECP256K1 configuretion. - */ -#define LL_ECC_CURVE_SECP256K1_CONFIG \ -{ \ - .A = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, \ - .B = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00001AB7}, \ - .P = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFC2F}, \ - .PRSquare = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x000007A2, 0x000E90A1}, \ - .ConstP = 0XD2253531, \ - .N = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xBAAEDCE6, 0xAF48A03B, 0xBFD25E8C, 0xD0364141}, \ - .NRSquare = {0x9D671CD5, 0x81C69BC5, 0xE697F5E4, 0x5BCD07C6, 0x741496C2, 0x0E7CF878, 0x896CF214, 0x67D7D140}, \ - .ConstN = 0X5588B13F, \ - .H = 1, \ - .G.X = {0x79BE667E, 0xF9DCBBAC, 0x55A06295, 0xCE870B07, 0x029BFCDB, 0x2DCE28D9, 0x59F2815B, 0x16F81798}, \ - .G.Y = {0x483ADA77, 0x26A3C465, 0x5DA4FBFC, 0x0E1108A8, 0xFD17B448, 0xA6855419, 0x9C47D08F, 0xFB10D4B8}, \ -} - -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PKC_LL_Exported_Macros PKC Exported Macros - * @{ - */ - -/** @defgroup PKC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in PKC register - * @param __INSTANCE__ PKC Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_PKC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in PKC register - * @param __INSTANCE__ PKC Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_PKC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PKC_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup PKC_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable pkc. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->CTRL, PKC_CTRL_EN); -} - -/** - * @brief Disable pkc. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->CTRL, PKC_CTRL_EN); -} - -/** - * @brief Indicate whether the pkc is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CTRL, PKC_CTRL_EN) == (PKC_CTRL_EN)); -} - -/** - * @brief Enable pkc start in hardware mode. - * - * Register|BitsName - * --------|-------- - * CTRL | START - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable_hardware_start(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->CTRL, PKC_CTRL_START); -} - -/** - * @brief Disable pkc start in hardware mode. - * - * Register|BitsName - * --------|-------- - * CTRL | START - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable_hardware_start(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->CTRL, PKC_CTRL_START); -} - -/** - * @brief Indicate whether the pkc start in hardware mode is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | START - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled_hardware_start(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CTRL, PKC_CTRL_START) == (PKC_CTRL_START)); -} - -/** - * @brief Enable pkc software mode. - * - * Register|BitsName - * --------|-------- - * CTRL | SWCTRL - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable_software(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->CTRL, PKC_CTRL_SWCTRL); -} - -/** - * @brief Disable pkc software mode. - * - * Register|BitsName - * --------|-------- - * CTRL | SWCTRL - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable_software(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->CTRL, PKC_CTRL_SWCTRL); -} - -/** - * @brief Indicate whether the pkc software mode is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | SWCTRL - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled_software(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CTRL, PKC_CTRL_SWCTRL) == (PKC_CTRL_SWCTRL)); -} - -/** - * @brief Enable pkc reset. - * - * Register|BitsName - * --------|-------- - * CTRL | SWRST - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable_reset(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->CTRL, PKC_CTRL_SWRST); -} - -/** - * @brief Disable pkc reset. - * - * Register|BitsName - * --------|-------- - * CTRL | SWRST - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable_reset(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->CTRL, PKC_CTRL_SWRST); -} - -/** - * @brief Indicate whether the pkc reset is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | SWRST - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled_reset(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CTRL, PKC_CTRL_SWRST) == (PKC_CTRL_SWRST)); -} - -/** - * @brief Set PKC parameter k pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG0 | KPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_k_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG0, PKC_CONFIG0_KPTR, pointer << PKC_CONFIG0_KPTR_Pos); -} - -/** - * @brief Get PKC parameter k pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG0 | KPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_k_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG0, PKC_CONFIG0_KPTR) >> PKC_CONFIG0_KPTR_Pos); -} - -/** - * @brief Set PKC parameter r pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG0 | RPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG0, PKC_CONFIG0_RPTR, pointer << PKC_CONFIG0_RPTR_Pos); -} - -/** - * @brief Get PKC parameter r pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG0 | RPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG0, PKC_CONFIG0_RPTR) >> PKC_CONFIG0_RPTR_Pos); -} - -/** - * @brief Set PKC parameter p pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG1 | PPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_p_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG1, PKC_CONFIG1_PPTR, pointer << PKC_CONFIG1_PPTR_Pos); -} - -/** - * @brief Get PKC parameter p pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG1 | PPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_p_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG1, PKC_CONFIG1_PPTR) >> PKC_CONFIG1_PPTR_Pos); -} - -/** - * @brief Set PKC parameter R^2 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG1 | RSQPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_rsq_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG1, PKC_CONFIG1_RSQPTR, pointer << PKC_CONFIG1_RSQPTR_Pos); -} - -/** - * @brief Get PKC parameter R^2 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG1 | RSQPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_rsq_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG1, PKC_CONFIG1_RSQPTR) >> PKC_CONFIG1_RSQPTR_Pos); -} - -/** - * @brief Set PKC parameter Gx pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG2 | GXPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_gx_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG2, PKC_CONFIG2_GXPTR, pointer << PKC_CONFIG2_GXPTR_Pos); -} - -/** - * @brief Get PKC parameter Gx pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG2 | GXPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_gx_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG2, PKC_CONFIG2_GXPTR) >> PKC_CONFIG2_GXPTR_Pos); -} - -/** - * @brief Set PKC parameter Gy pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG2 | GYPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_gy_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG2, PKC_CONFIG2_GYPTR, pointer << PKC_CONFIG2_GYPTR_Pos); -} - -/** - * @brief Get PKC parameter Gy pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG2 | GYPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_gy_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG2, PKC_CONFIG2_GYPTR) >> PKC_CONFIG2_GYPTR_Pos); -} - -/** - * @brief Set PKC parameter Gz pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG3 | GZPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_gz_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG3, PKC_CONFIG3_GZPTR, pointer << PKC_CONFIG3_GZPTR_Pos); -} - -/** - * @brief Get PKC parameter Gz pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG3 | GZPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_gz_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG3, PKC_CONFIG3_GZPTR) >> PKC_CONFIG3_GZPTR_Pos); -} - -/** - * @brief Set PKC parameter R0x pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG3 | R0XPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r0x_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG3, PKC_CONFIG3_R0XPTR, pointer << PKC_CONFIG3_R0XPTR_Pos); -} - -/** - * @brief Get PKC parameter R0x pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG3 | R0XPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r0x_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG3, PKC_CONFIG3_R0XPTR) >> PKC_CONFIG3_R0XPTR_Pos); -} - -/** - * @brief Set PKC parameter R0y pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG4 | R0YPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r0y_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG4, PKC_CONFIG4_R0YPTR, pointer << PKC_CONFIG4_R0YPTR_Pos); -} - -/** - * @brief Get PKC parameter R0y pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG4 | R0YPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r0y_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG4, PKC_CONFIG4_R0YPTR) >> PKC_CONFIG4_R0YPTR_Pos); -} - -/** - * @brief Set PKC parameter R0z pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG4 | R0ZPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r0z_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG4, PKC_CONFIG4_R0ZPTR, pointer << PKC_CONFIG4_R0ZPTR_Pos); -} - -/** - * @brief Get PKC parameter R0z pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG4 | R0ZPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r0z_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG4, PKC_CONFIG4_R0ZPTR) >> PKC_CONFIG4_R0ZPTR_Pos); -} - -/** - * @brief Set PKC parameter R1x pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG5 | R1XPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r1x_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG5, PKC_CONFIG5_R1XPTR, pointer << PKC_CONFIG5_R1XPTR_Pos); -} - -/** - * @brief Get PKC parameter R1x pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG5 | R1XPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r1x_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG5, PKC_CONFIG5_R1XPTR) >> PKC_CONFIG5_R1XPTR_Pos); -} - -/** - * @brief Set PKC parameter R1y pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG5 | R1YPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r1y_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG5, PKC_CONFIG5_R1YPTR, pointer << PKC_CONFIG5_R1YPTR_Pos); -} - -/** - * @brief Get PKC parameter R1y pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG5 | R1YPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r1y_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG5, PKC_CONFIG5_R1YPTR) >> PKC_CONFIG5_R1YPTR_Pos); -} - -/** - * @brief Set PKC parameter R1z pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG6 | R1ZPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_r1z_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG6, PKC_CONFIG6_R1ZPTR, pointer << PKC_CONFIG6_R1ZPTR_Pos); -} - -/** - * @brief Get PKC parameter R1z pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG6 | R1ZPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_r1z_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG6, PKC_CONFIG6_R1ZPTR) >> PKC_CONFIG6_R1ZPTR_Pos); -} - -/** - * @brief Set PKC parameter Tmp1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG6 | TMP1PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmp1_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG6, PKC_CONFIG6_TMP1PTR, pointer << PKC_CONFIG6_TMP1PTR_Pos); -} - -/** - * @brief Get PKC parameter Tmp1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG6 | TMP1PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmp1_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG6, PKC_CONFIG6_TMP1PTR) >> PKC_CONFIG6_TMP1PTR_Pos); -} - -/** - * @brief Set PKC parameter Tmp2 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG7 | TMP2PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmp2_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG7, PKC_CONFIG7_TMP2PTR, pointer << PKC_CONFIG7_TMP2PTR_Pos); -} - -/** - * @brief Get PKC parameter Tmp2 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG7 | TMP2PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmp2_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG7, PKC_CONFIG7_TMP2PTR) >> PKC_CONFIG7_TMP2PTR_Pos); -} - -/** - * @brief Set PKC parameter Tmp3 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG7 | TMP3PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmp3_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG7, PKC_CONFIG7_TMP3PTR, pointer << PKC_CONFIG7_TMP3PTR_Pos); -} - -/** - * @brief Get PKC parameter Tmp3 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG7 | TMP3PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmp3_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG7, PKC_CONFIG7_TMP3PTR) >> PKC_CONFIG7_TMP3PTR_Pos); -} - -/** - * @brief Set PKC parameter Tmp4 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG8 | TMP4PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmp4_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG8, PKC_CONFIG8_TMP4PTR, pointer << PKC_CONFIG8_TMP4PTR_Pos); -} - -/** - * @brief Get PKC parameter Tmp4 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG8 | TMP4PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmp4_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG8, PKC_CONFIG8_TMP4PTR) >> PKC_CONFIG8_TMP4PTR_Pos); -} - -/** - * @brief Set PKC parameter Tmp5 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG8 | TMP5PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmp5_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG8, PKC_CONFIG8_TMP5PTR, pointer << PKC_CONFIG8_TMP5PTR_Pos); -} - -/** - * @brief Get PKC parameter Tmp5 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG8 | TMP5PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmp5_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG8, PKC_CONFIG8_TMP5PTR) >> PKC_CONFIG8_TMP5PTR_Pos); -} - -/** - * @brief Set PKC parameter Tmp6 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG9 | TMP6PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmp6_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG9, PKC_CONFIG9_TMP6PTR, pointer << PKC_CONFIG9_TMP6PTR_Pos); -} - -/** - * @brief Get PKC parameter Tmp6 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG9 | TMP6PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmp6_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG9, PKC_CONFIG9_TMP6PTR) >> PKC_CONFIG9_TMP6PTR_Pos); -} - -/** - * @brief Set PKC parameter Constant1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG9 | CONST1PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_constant1_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG9, PKC_CONFIG9_CONST1PTR, pointer << PKC_CONFIG9_CONST1PTR_Pos); -} - -/** - * @brief Get PKC parameter Constant1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG9 | CONST1PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_constant1_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG9, PKC_CONFIG9_CONST1PTR) >> PKC_CONFIG9_CONST1PTR_Pos); -} - -/** - * @brief Set PKC parameter X1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG10 | X1PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_x1_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG10, PKC_CONFIG10_X1PTR, pointer << PKC_CONFIG10_X1PTR_Pos); -} - -/** - * @brief Get PKC parameter X1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG10 | X1PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_x1_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG10, PKC_CONFIG10_X1PTR) >> PKC_CONFIG10_X1PTR_Pos); -} - -/** - * @brief Set PKC parameter X2 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG10 | X2PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_x2_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG10, PKC_CONFIG10_X2PTR, pointer << PKC_CONFIG10_X2PTR_Pos); -} - -/** - * @brief Get PKC parameter X2 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG10 | X2PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_x2_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG10, PKC_CONFIG10_X2PTR) >> PKC_CONFIG10_X2PTR_Pos); -} - -/** - * @brief Set PKC parameter MITmp pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG11 | MITMPPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mitmp_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG11, PKC_CONFIG11_MITMPPTR, pointer << PKC_CONFIG11_MITMPPTR_Pos); -} - -/** - * @brief Get PKC parameter MITmp pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG11 | MITMPPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mitmp_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG11, PKC_CONFIG11_MITMPPTR) >> PKC_CONFIG11_MITMPPTR_Pos); -} - -/** - * @brief Set PKC parameter TmpK pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG11 | TMPKPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_tmpk_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG11, PKC_CONFIG11_TMPKPTR, pointer << PKC_CONFIG11_TMPKPTR_Pos); -} - -/** - * @brief Get PKC parameter TmpK pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG11 | TMPKPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_tmpk_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG11, PKC_CONFIG11_TMPKPTR) >> PKC_CONFIG11_TMPKPTR_Pos); -} - -/** - * @brief Set ECC parameter A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG12 | APTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_ecc_a_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG12, PKC_CONFIG12_APTR, pointer << PKC_CONFIG12_APTR_Pos); -} - -/** - * @brief Get ECC parameter A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG12 | APTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_ecc_a_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG12, PKC_CONFIG12_APTR) >> PKC_CONFIG12_APTR_Pos); -} - -/** - * @brief Set ECC parameter B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG12 | BPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_ecc_b_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->CONFIG12, PKC_CONFIG12_BPTR, pointer << PKC_CONFIG12_BPTR_Pos); -} - -/** - * @brief Get ECC parameter B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG12 | BPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_ecc_b_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->CONFIG12, PKC_CONFIG12_BPTR) >> PKC_CONFIG12_BPTR_Pos); -} - -/** - * @brief Set constant value for montgomery multiply in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG13 | CONSTP - * - * @param PKCx PKC instance - * @param ConstP This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_constp(pkc_regs_t *PKCx, uint32_t ConstP) -{ - WRITE_REG(PKCx->CONFIG13, ConstP); -} - -/** - * @brief Get constant value for montgomery multiply in pkc sram. - * - * Register|BitsName - * --------|-------- - * CONFIG13 | CONSTP - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_constp(pkc_regs_t *PKCx) -{ - return (READ_REG(PKCx->CONFIG13)); -} - -/** - * @brief Enable pkc start in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | OPSTART - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable_software_start(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_OPSTART); -} - -/** - * @brief Disable pkc start in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | OPSTART - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable_software_start(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_OPSTART); -} - -/** - * @brief Indicate whether the pkc start in software mode is enabled. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | OPSTART - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled_software_start(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_OPSTART) == (PKC_SW_CTRL_OPSTART)); -} - -/** - * @brief Set operation mode in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | OPMODE - * - * @param PKCx PKC instance - * @param operation_mode This parameter can be one of the following values: - * @arg @ref LL_PKC_operation_mode_MULTIPLY - * @arg @ref LL_PKC_operation_mode_INVERTION - * @arg @ref LL_PKC_operation_mode_ADD - * @arg @ref LL_PKC_operation_mode_SUB - * @arg @ref LL_PKC_operation_mode_COMPARE - * @arg @ref LL_PKC_operation_mode_LEFTSHIFT - * @arg @ref LL_PKC_operation_mode_BIGINTEGERMULTIPLY - * @arg @ref LL_PKC_operation_mode_BIGINTEGERADD - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_operation_mode(pkc_regs_t *PKCx, uint32_t operation_mode) -{ - MODIFY_REG(PKCx->SW_CTRL, PKC_SW_CTRL_OPMODE, operation_mode); -} - -/** - * @brief Get operation mode in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | OPMODE - * - * @param PKCx PKC instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PKC_operation_mode_MULTIPLY - * @arg @ref LL_PKC_operation_mode_INVERTION - * @arg @ref LL_PKC_operation_mode_ADD - * @arg @ref LL_PKC_operation_mode_SUB - * @arg @ref LL_PKC_operation_mode_COMPARE - * @arg @ref LL_PKC_operation_mode_LEFTSHIFT - * @arg @ref LL_PKC_operation_mode_BIGINTEGERMULTIPLY - * @arg @ref LL_PKC_operation_mode_BIGINTEGERADD - */ -__STATIC_INLINE uint32_t ll_pkc_get_operation_mode(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_OPMODE)); -} - -/** - * @brief Enable Dummy Multi in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | STARTDM - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable_dummy_multi(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_STARTDM); -} - -/** - * @brief Disable Dummy Multi in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | STARTDM - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable_dummy_multi(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_STARTDM); -} - -/** - * @brief Indicate whether the Dummy Multi in software mode is enabled. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | STARTDM - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled_dummy_multi(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_STARTDM) == (PKC_SW_CTRL_STARTDM)); -} - -/** - * @brief Enable Random Clock Gating in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | RANDEN - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_enable_random_clock_gating(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_RANDEN); -} - -/** - * @brief Disable Random Clock Gating in software mode. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | RANDEN - * - * @param PKCx PKC instance - * @retval None - */ -__STATIC_INLINE void ll_pkc_disable_random_clock_gating(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_RANDEN); -} - -/** - * @brief Indicate whether the Random Clock Gating in software mode is enabled. - * - * Register|BitsName - * --------|-------- - * SW_CTRL | RANDEN - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enabled_random_clock_gating(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CTRL, PKC_SW_CTRL_RANDEN) == (PKC_SW_CTRL_RANDEN)); -} - -/** - * @brief Set modular multiplication parameter A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG0 | MMAPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mm_a_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG0, PKC_SW_CONFIG0_MMAPTR, pointer << PKC_SW_CONFIG0_MMAPTR_Pos); -} - -/** - * @brief Get modular multiplication parameter A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG0 | MMAPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mm_a_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG0, PKC_SW_CONFIG0_MMAPTR) >> PKC_SW_CONFIG0_MMAPTR_Pos); -} - -/** - * @brief Set modular multiplication parameter B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG0 | MMBPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mm_b_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG0, PKC_SW_CONFIG0_MMBPTR, pointer << PKC_SW_CONFIG0_MMBPTR_Pos); -} - -/** - * @brief Get modular multiplication parameter B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG0 | MMBPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mm_b_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG0, PKC_SW_CONFIG0_MMBPTR) >> PKC_SW_CONFIG0_MMBPTR_Pos); -} - -/** - * @brief Set modular multiplication parameter P pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG1 | MMPPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mm_p_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG1, PKC_SW_CONFIG1_MMPPTR, pointer << PKC_SW_CONFIG1_MMPPTR_Pos); -} - -/** - * @brief Get modular multiplication parameter P pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG1 | MMPPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mm_p_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG1, PKC_SW_CONFIG1_MMPPTR) >> PKC_SW_CONFIG1_MMPPTR_Pos); -} - -/** - * @brief Set modular multiplication parameter C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG1 | MMCPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mm_c_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG1, PKC_SW_CONFIG1_MMCPTR, pointer << PKC_SW_CONFIG1_MMCPTR_Pos); -} - -/** - * @brief Get modular multiplication parameter C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG1 | MMCPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mm_c_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG1, PKC_SW_CONFIG1_MMCPTR) >> PKC_SW_CONFIG1_MMCPTR_Pos); -} - -/** - * @brief Set modular add/sub parameter A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG2 | MASAPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mas_a_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG2, PKC_SW_CONFIG2_MASAPTR, pointer << PKC_SW_CONFIG2_MASAPTR_Pos); -} - -/** - * @brief Get modular add/sub parameter A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG2 | MASAPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mas_a_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG2, PKC_SW_CONFIG2_MASAPTR) >> PKC_SW_CONFIG2_MASAPTR_Pos); -} - -/** - * @brief Set modular add/sub parameter B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG2 | MASBPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mas_b_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG2, PKC_SW_CONFIG2_MASBPTR, pointer << PKC_SW_CONFIG2_MASBPTR_Pos); -} - -/** - * @brief Get modular add/sub parameter B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG2 | MASBPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mas_b_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG2, PKC_SW_CONFIG2_MASBPTR) >> PKC_SW_CONFIG2_MASBPTR_Pos); -} - -/** - * @brief Set modular add/sub parameter P pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG3 | MASPPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mas_p_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG3, PKC_SW_CONFIG3_MASPPTR, pointer << PKC_SW_CONFIG3_MASPPTR_Pos); -} - -/** - * @brief Get modular add/sub parameter P pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG3 | MASPPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mas_p_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG3, PKC_SW_CONFIG3_MASPPTR) >> PKC_SW_CONFIG3_MASPPTR_Pos); -} - -/** - * @brief Set modular add/sub parameter C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG3 | MASCPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mas_c_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG3, PKC_SW_CONFIG3_MASCPTR, pointer << PKC_SW_CONFIG3_MASCPTR_Pos); -} - -/** - * @brief Get modular add/sub parameter C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG3 | MASCPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mas_c_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG3, PKC_SW_CONFIG3_MASCPTR) >> PKC_SW_CONFIG3_MASCPTR_Pos); -} - -/** - * @brief Set modular invertion parameter U pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG4 | MIUPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mi_u_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG4, PKC_SW_CONFIG4_MIUPTR, pointer << PKC_SW_CONFIG4_MIUPTR_Pos); -} - -/** - * @brief Get modular invertion parameter U pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG4 | MIUPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mi_u_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG4, PKC_SW_CONFIG4_MIUPTR) >> PKC_SW_CONFIG4_MIUPTR_Pos); -} - -/** - * @brief Set modular invertion parameter V pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG4 | MIVPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mi_v_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG4, PKC_SW_CONFIG4_MIVPTR, pointer << PKC_SW_CONFIG4_MIVPTR_Pos); -} - -/** - * @brief Get modular invertion parameter V pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG4 | MIVPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mi_v_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG4, PKC_SW_CONFIG4_MIVPTR) >> PKC_SW_CONFIG4_MIVPTR_Pos); -} - -/** - * @brief Set modular invertion parameter X1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG5 | MIX1PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mi_x1_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG5, PKC_SW_CONFIG5_MIX1PTR, pointer << PKC_SW_CONFIG5_MIX1PTR_Pos); -} - -/** - * @brief Get modular invertion parameter X1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG5 | MIX1PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mi_x1_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG5, PKC_SW_CONFIG5_MIX1PTR) >> PKC_SW_CONFIG5_MIX1PTR_Pos); -} - -/** - * @brief Set modular invertion parameter X1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG5 | MIX2PTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_mi_x2_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG5, PKC_SW_CONFIG5_MIX2PTR, pointer << PKC_SW_CONFIG5_MIX2PTR_Pos); -} - -/** - * @brief Get modular invertion parameter X1 pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG5 | MIX2PTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_mi_x2_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG5, PKC_SW_CONFIG5_MIX2PTR) >> PKC_SW_CONFIG5_MIX2PTR_Pos); -} - -/** - * @brief Set modular invertion parameter Tmp pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG6 | MITMPPTR - * - * @param PKCx PKC instance - * @param pointer This parameter is the offset in pkc sram, and the value can between: 0 ~ 0x200 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_swmi_tmp_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG6, PKC_SW_CONFIG6_MITMPPTR, pointer << PKC_SW_CONFIG6_MITMPPTR_Pos); -} - -/** - * @brief Get modular invertion parameter Tmp pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG6 | MITMPPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x200 - */ -__STATIC_INLINE uint32_t ll_pkc_get_swmi_tmp_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG6, PKC_SW_CONFIG6_MITMPPTR) >> PKC_SW_CONFIG6_MITMPPTR_Pos); -} - -/** - * @brief Set operation word length-bits. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG7 | WORDLEN - * - * @param PKCx PKC instance - * @param WordLength This parameter can be one of the following values: 256 ~ 2048 - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_operation_word_length(pkc_regs_t *PKCx, uint32_t WordLength) -{ - MODIFY_REG(PKCx->SW_CONFIG7, PKC_SW_CONFIG7_WORDLEN, (WordLength >> ITEM_5) - 1); -} - -/** - * @brief Get operation word length-bits. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG7 | WORDLEN - * - * @param PKCx PKC instance - * @retval Return value is between: 256 ~ 2048 - */ -__STATIC_INLINE uint32_t ll_pkc_get_operation_word_length(pkc_regs_t *PKCx) -{ - return ((READ_BITS(PKCx->SW_CONFIG7, PKC_SW_CONFIG7_WORDLEN) + 1) << ITEM_5); -} - -/** - * @brief Get K output in invertion operation. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG8 | MIKOUT - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FFF - */ -__STATIC_INLINE uint32_t ll_pkc_get_mik_output(pkc_regs_t *PKCx) -{ - return (READ_REG(PKCx->SW_CONFIG8) & PKC_SW_CONFIG8_MIKOUT_Msk); -} - -/** - * @brief Set dummy multiply seed. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG9 | DMRNGSEED - * - * @param PKCx PKC instance - * @param seed This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_dummy_multiply_seed(pkc_regs_t *PKCx, uint32_t seed) -{ - WRITE_REG(PKCx->SW_CONFIG9, seed); -} - -/** - * @brief Get dummy multiply seed. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG9 | DMRNGSEED - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pkc_get_dummy_multiply_seed(pkc_regs_t *PKCx) -{ - return (READ_REG(PKCx->SW_CONFIG9)); -} - -/** - * @brief Set big integer operand A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG10 | BMAPTR - * - * @param PKCx PKC instance - * @param pointer This parameter can be one of the following values: 0 ~ 0x1FF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_bm_a_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG10, PKC_SW_CONFIG10_BMAPTR, pointer << PKC_SW_CONFIG10_BMAPTR_Pos); -} - -/** - * @brief Get big integer operand A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG10 | BMAPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FF - */ -__STATIC_INLINE uint32_t ll_pkc_get_bm_a_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG10, PKC_SW_CONFIG10_BMAPTR) >> PKC_SW_CONFIG10_BMAPTR_Pos); -} - -/** - * @brief Set big integer operand B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG10 | BMBPTR - * - * @param PKCx PKC instance - * @param pointer This parameter can be one of the following values: 0 ~ 0x1FF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_bm_b_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG10, PKC_SW_CONFIG10_BMBPTR, pointer << PKC_SW_CONFIG10_BMBPTR_Pos); -} - -/** - * @brief Get big integer operand B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG10 | BMBPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FF - */ -__STATIC_INLINE uint32_t ll_pkc_get_bm_b_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG10, PKC_SW_CONFIG10_BMBPTR) >> PKC_SW_CONFIG10_BMBPTR_Pos); -} - -/** - * @brief Set big integer result C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG11 | BMCPTR - * - * @param PKCx PKC instance - * @param pointer This parameter can be one of the following values: 0 ~ 0x1FF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_bm_c_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG11, PKC_SW_CONFIG11_BMCPTR, pointer << PKC_SW_CONFIG11_BMCPTR_Pos); -} - -/** - * @brief Get big integer result C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG11 | BMCPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FF - */ -__STATIC_INLINE uint32_t ll_pkc_get_bm_c_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG11, PKC_SW_CONFIG11_BMCPTR) >> PKC_SW_CONFIG11_BMCPTR_Pos); -} - -/** - * @brief Set big integer operand A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG11 | BAAPTR - * - * @param PKCx PKC instance - * @param pointer This parameter can be one of the following values: 0 ~ 0x1FF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_ba_a_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG11, PKC_SW_CONFIG11_BAAPTR, pointer << PKC_SW_CONFIG11_BAAPTR_Pos); -} - -/** - * @brief Get big integer operand A pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG11 | BAAPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FF - */ -__STATIC_INLINE uint32_t ll_pkc_get_ba_a_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG11, PKC_SW_CONFIG11_BAAPTR) >> PKC_SW_CONFIG11_BAAPTR_Pos); -} - -/** - * @brief Set big integer operand B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG12 | BABPTR - * - * @param PKCx PKC instance - * @param pointer This parameter can be one of the following values: 0 ~ 0x1FF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_ba_b_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG12, PKC_SW_CONFIG12_BABPTR, pointer << PKC_SW_CONFIG12_BABPTR_Pos); -} - -/** - * @brief Get big integer operand B pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG12 | BABPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FF - */ -__STATIC_INLINE uint32_t ll_pkc_get_ba_b_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG12, PKC_SW_CONFIG12_BABPTR) >> PKC_SW_CONFIG12_BABPTR_Pos); -} - -/** - * @brief Set big integer result C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG12 | BACPTR - * - * @param PKCx PKC instance - * @param pointer This parameter can be one of the following values: 0 ~ 0x1FF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_ba_c_pointer(pkc_regs_t *PKCx, uint32_t pointer) -{ - MODIFY_REG(PKCx->SW_CONFIG12, PKC_SW_CONFIG12_BACPTR, pointer << PKC_SW_CONFIG12_BACPTR_Pos); -} - -/** - * @brief Get big integer result C pointer in pkc sram. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG12 | BACPTR - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0x1FF - */ -__STATIC_INLINE uint32_t ll_pkc_get_ba_c_pointer(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->SW_CONFIG12, PKC_SW_CONFIG12_BACPTR) >> PKC_SW_CONFIG12_BACPTR_Pos); -} - -/** - * @brief Set random clock gating seed. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG13 | RANDSEED - * - * @param PKCx PKC instance - * @param seed This parameter can be one of the following values: 0 ~ 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pkc_set_random_clock_gating_seed(pkc_regs_t *PKCx, uint32_t seed) -{ - WRITE_REG(PKCx->SW_CONFIG13, seed); -} - -/** - * @brief Get random clock gating seed. - * - * Register|BitsName - * --------|-------- - * SW_CONFIG13 | RANDSEED - * - * @param PKCx PKC instance - * @retval Return value is between: 0 ~ 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pkc_get_random_clock_gating_seed(pkc_regs_t *PKCx) -{ - return (READ_REG(PKCx->SW_CONFIG13)); -} - -/** @} */ - -/** @defgroup PKC_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable the operation done interrupt. - * - * Register|BitsName - * --------|-------- - * INTEN | DONE - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_enable_it_done(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->INTEN, PKC_INTEN_DONE); -} - -/** - * @brief Enable the operation error interrupt. - * - * Register|BitsName - * --------|-------- - * INTEN | ERR - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_enable_it_err(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->INTEN, PKC_INTEN_ERR); -} - -/** - * @brief Enable the big integer overflow interrupt. - * - * Register|BitsName - * --------|-------- - * INTEN | BAOVF - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_enable_it_big_add_overflow(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->INTEN, PKC_INTEN_BAOVF); -} - -/** - * @brief Disable the operation done interrupt. - * - * Register|BitsName - * --------|-------- - * INTEN | DONE - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_disable_it_done(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->INTEN, PKC_INTEN_DONE); -} - -/** - * @brief Disable the operation error interrupt. - * - * Register|BitsName - * --------|-------- - * INTEN | ERR - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_disable_it_err(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->INTEN, PKC_INTEN_ERR); -} - -/** - * @brief Disable the big integer overflow interrupt. - * - * Register|BitsName - * --------|-------- - * INTEN | BAOVF - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_disable_it_big_add_overflow(pkc_regs_t *PKCx) -{ - CLEAR_BITS(PKCx->INTEN, PKC_INTEN_BAOVF); -} - -/** - * @brief Indicate whether the operation done interrupt is enable. - * - * Register|BitsName - * --------|-------- - * INTEN | DONE - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enable_it_done(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->INTEN, PKC_INTEN_DONE) == PKC_INTEN_DONE); -} - -/** - * @brief Indicate whether the operation error interrupt is enable. - * - * Register|BitsName - * --------|-------- - * INTEN | ERR - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enable_it_err(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->INTEN, PKC_INTEN_ERR) == PKC_INTEN_ERR); -} - -/** - * @brief Indicate whether the big integer overflow interrupt is enable. - * - * Register|BitsName - * --------|-------- - * INTEN | BAOVF - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_enable_it_big_add_overflow(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->INTEN, PKC_INTEN_BAOVF) == PKC_INTEN_BAOVF); -} - -/** @} */ - -/** @defgroup PKC_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Indicate whether the operation done interrupt is pending. - * - * Register|BitsName - * --------|-------- - * INTSTAT | DONE - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_action_flag_it_done(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->INTSTAT, PKC_INTSTAT_DONE) == PKC_INTSTAT_DONE); -} - -/** - * @brief Indicate whether the operation error interrupt is pending. - * - * Register|BitsName - * --------|-------- - * INTSTAT | ERR - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_action_flag_it_err(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->INTSTAT, PKC_INTSTAT_ERR) == PKC_INTSTAT_ERR); -} - -/** - * @brief Indicate whether the big integer overflow interrupt is pending. - * - * Register|BitsName - * --------|-------- - * INTSTAT | BAOVF - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_action_flag_it_big_add_overflow(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->INTSTAT, PKC_INTSTAT_BAOVF) == PKC_INTSTAT_BAOVF); -} - -/** - * @brief Clear the operation done interrupt flag. - * - * Register|BitsName - * --------|-------- - * INTSTAT | DONE - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_clear_flag_it_done(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->INTSTAT, PKC_INTSTAT_DONE); -} - -/** - * @brief Clear the operation error interrupt flag. - * - * Register|BitsName - * --------|-------- - * INTSTAT | ERR - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_clear_flag_it_err(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->INTSTAT, PKC_INTSTAT_ERR); -} - -/** - * @brief Clear the big integer overflow interrupt flag. - * - * Register|BitsName - * --------|-------- - * INTSTAT | BAOVF - * - * @param PKCx PKC instance - * @retval none. - */ -__STATIC_INLINE void ll_pkc_clear_flag_it_big_add_overflow(pkc_regs_t *PKCx) -{ - SET_BITS(PKCx->INTSTAT, PKC_INTSTAT_BAOVF); -} - -/** - * @brief Indicate whether the busy flag is set. - * - * Register|BitsName - * --------|-------- - * WORKSTAT | BUSY - * - * @param PKCx PKC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pkc_is_action_flag_busy(pkc_regs_t *PKCx) -{ - return (READ_BITS(PKCx->WORKSTAT, PKC_WORKSTAT_BUSY) == PKC_WORKSTAT_BUSY); -} - -/** @} */ - -/** @defgroup PKC_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize PKC registers (Registers restored to their default values). - * @param PKCx PKC Instance - * @retval An error_status_t enumeration value: - * - SUCCESS: PKC registers are de-initialized - * - ERROR: PKC registers are not de-initialized - */ -error_status_t ll_pkc_deinit(pkc_regs_t *PKCx); - -/** - * @brief Initialize PKC registers according to the specified - * parameters in p_pkc_init. - * @param PKCx PKC Instance - * @param p_pkc_init pointer to a ll_pkc_init_t structure that contains the configuration - * information for the specified PKC peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: PKC registers are initialized according to p_pkc_init content - * - ERROR: Problem occurred during PKC Registers initialization - */ -error_status_t ll_pkc_init(pkc_regs_t *PKCx, ll_pkc_init_t *p_pkc_init); - -/** - * @brief Set each field of a @ref ll_pkc_init_t type structure to default value. - * @param p_pkc_init pointer to a @ref ll_pkc_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_pkc_struct_init(ll_pkc_init_t *p_pkc_init); - -/** @} */ - -/** @} */ - -#endif /* PKC */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_PKC_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwm.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwm.h deleted file mode 100755 index 563e2ca..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwm.h +++ /dev/null @@ -1,1641 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_pwm.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PWM LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_PWM PWM - * @brief PWM LL module driver. - * @{ - */ - -#ifndef __GR55XX_LL_PWM_H__ -#define __GR55XX_LL_PWM_H__ - -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (PWM0) || defined (PWM1) - -/** @defgroup PWM_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup PWM_LL_ES_INIT PWM Exported init structures - * @{ - */ - -/** - * @brief LL PWM Output Channel init Structure definition. - */ -typedef struct _ll_pwm_channel_init_t { - uint8_t duty; /**< Specifies the duty in PWM output mode. - This parameter must be a number ranges between Min_Data=0 and Max_Data=100. - This feature can be modified afterwards using unitary function - ll_pwm_set_compare_xn() - where X can be (A, B, C) and n can be (0, 1). */ - - uint8_t drive_polarity; /**< Specifies the drive polarity in PWM output mode. - This parameter can be a value of @ref PWM_LL_EC_DRIVEPOLARITY. - This feature can be modified afterwards using unitary function - ll_pwm_enable_positive_drive_channel_x() - and ll_pwm_disable_positive_drive_channel_x() where X can be (A, B, C). */ -} ll_pwm_channel_init_t; - -/** - * @brief LL PWM init Structure definition. - */ -typedef struct _ll_pwm_init_t { - uint32_t mode; /**< Specifies the PWM output mode. - This parameter can be a value of @ref PWM_LL_EC_MODE. - This feature can be modified afterwards using unitary function - @ref ll_pwm_set_mode(). */ - - uint32_t align; /**< Specifies the PWM alignment pulses. - This parameter can be a value of @ref PWM_LL_EC_ALIGN. */ - - uint32_t prescaler; /**< Specifies the prescaler value - which will be used configure PWM - output frequency. - This parameter must be a number ranges between Min_Data = 0 and - Max_Data = 0xFFFFFFFF. - This parameter should be larger than 128. - This feature can be modified afterwards using unitary function - @ref ll_pwm_set_prescaler(). */ - - uint32_t bprescaler; /**< Specifies the required prescaler that the duty changes from 0% to 100% in - breath mode. This parameter must - be a number ranges between - Min_Data=0 and - Max_Data=0xFFFFFFFF. This - parameter is recommended to be - larger than 128*prescaler - to guarantee an ideal breath effect. - This feature can be modified afterwards using unitary function - @ref ll_pwm_set_breath_prescaler(). */ - - uint32_t hprescaler; /**< Specifies the required prescaler in breath hold state. - This parameter must be a number - ranges between Min_Data=0 and - Max_Data=0xFFFFFF. - This feature can be modified afterwards using unitary function - @ref ll_pwm_set_hold_prescaler(). */ - - ll_pwm_channel_init_t channel_a; /**< Specifies the configuration of channelA. - This parameter can be a value of @ref ll_pwm_channel_init_t. */ - - ll_pwm_channel_init_t channel_b; /**< Specifies the configuration of channelB. - This parameter can be a value of @ref ll_pwm_channel_init_t. */ - - ll_pwm_channel_init_t channel_c; /**< Specifies the configuration of channelC. - This parameter can be a value of @ref ll_pwm_channel_init_t. */ -} ll_pwm_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup PWM_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWM_LL_Exported_Constants PWM Exported Constants - * @{ - */ - -/** @defgroup PWM_LL_EC_MODE PWM mode - * @{ - */ -#define LL_PWM_FLICKER_MODE (0x00000000U) /**< PWM flicker mode */ -#define LL_PWM_BREATH_MODE PWM_MODE_BREATHEN /**< PWM breath mode */ -/** @} */ - -/** @defgroup PWM_LL_EC_ALIGN PWM alignment pulses - * @{ - */ -#define LL_PWM_EDGE_ALIGNED (0x00000000U) /**< PWM edge-aligned */ -#define LL_PWM_CENTER_ALIGNED (0x00000001U) /**< PWM center-aligned */ -/** @} */ - -/** @defgroup PWM_LL_EC_DRIVEPOLARITY PWM drive polarity - * @{ - */ -#define LL_PWM_DRIVEPOLARITY_NEGATIVE (0x00000000U) /**< PWM led-negative-drive mode */ -#define LL_PWM_DRIVEPOLARITY_POSITIVE (0x00000001U) /**< PWM led-positive-drive mode */ -/** @} */ - -/** @defgroup PWM_LL_EC_ACTIONEVENT PWM action event - * @{ - */ -#define LL_PWM_ACTIONEVENT_NONE (0x00000000U) /**< No action event */ -#define LL_PWM_ACTIONEVENT_CLEAR (0x00000001U) /**< Action event CLEAR */ -#define LL_PWM_ACTIONEVENT_SET (0x00000002U) /**< Action event SET */ -#define LL_PWM_ACTIONEVENT_TOGGLE (0x00000003U) /**< Action event TOGGLE */ -/** @} */ - -/** @defgroup PWM_LL_EC_PERIOD_UNIT PWM period unit default configuretion - * @{ - */ -#define LL_PWM_PRESCALER_UNIT (128) /**< The unit of prescaler is 128 */ -#define LL_PWM_BREATH_PRESCALER_UNIT (128) /**< The unit of breath prescaler is 128 */ -#define LL_PWM_HOLD_PRESCALER_UNIT (10) /**< The unit of hold prescaler is 10 */ -/** @} */ - -/** @defgroup PWM_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL PWM Channel InitStrcut default configuartion - */ -#define LL_PWM_CHANNEL_DEFAULT_CONFIG \ -{ \ - .duty = 50, \ - .drive_polarity = LL_PWM_DRIVEPOLARITY_POSITIVE, \ -} - -/** - * @brief LL PWM InitStrcut default configuartion - */ -#define LL_PWM_DEFAULT_CONFIG \ -{ \ - .mode = LL_PWM_FLICKER_MODE, \ - .align = LL_PWM_EDGE_ALIGNED, \ - .prescaler = 10 * LL_PWM_PRESCALER_UNIT, \ - .bprescaler = 10 * LL_PWM_BREATH_PRESCALER_UNIT * 10 * LL_PWM_PRESCALER_UNIT, \ - .hprescaler = 10 * LL_PWM_HOLD_PRESCALER_UNIT * 10 * LL_PWM_PRESCALER_UNIT, \ - .channel_a = LL_PWM_CHANNEL_DEFAULT_CONFIG, \ - .channel_b = LL_PWM_CHANNEL_DEFAULT_CONFIG, \ - .channel_c = LL_PWM_CHANNEL_DEFAULT_CONFIG, \ -} - -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWM_LL_Exported_Macros PWM Exported Macros - * @{ - */ - -/** @defgroup PWM_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in PWM register - * @param __instance__ PWM instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_PWM_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in PWM register - * @param __instance__ PWM instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_PWM_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PWM_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup PWM_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable PWM. - * - * Register|BitsName - * --------|-------- - * MODE | EN - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->MODE, PWM_MODE_EN); -} - -/** - * @brief Disable PWM. - * - * Register|BitsName - * --------|-------- - * MODE | EN - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->MODE, PWM_MODE_EN); -} - -/** - * @brief Indicate whether the PWM is enabled. - * - * Register|BitsName - * --------|-------- - * MODE | EN - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->MODE, PWM_MODE_EN) == (PWM_MODE_EN)); -} - -/** - * @brief Enable PWM pause. - * - * Register|BitsName - * --------|-------- - * MODE | PAUSE - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_pause(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->MODE, PWM_MODE_PAUSE); -} - -/** - * @brief Disable PWM pause. - * - * Register|BitsName - * --------|-------- - * MODE | PAUSE - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_pause(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->MODE, PWM_MODE_PAUSE); -} - -/** - * @brief Indicate whether the PWM pause is enabled. - * - * Register|BitsName - * --------|-------- - * MODE | PAUSE - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_pause(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->MODE, PWM_MODE_PAUSE) == (PWM_MODE_PAUSE)); -} - -/** - * @brief Set PWM mode. - * - * Register|BitsName - * --------|-------- - * MODE | BREATHEN - * - * @param PWMx PWM instance - * @param mode This parameter can be one of the following values: - * @arg @ref LL_PWM_FLICKER_MODE - * @arg @ref LL_PWM_BREATH_MODE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_mode(pwm_regs_t *PWMx, uint32_t mode) -{ - MODIFY_REG(PWMx->MODE, PWM_MODE_BREATHEN, mode); -} - -/** - * @brief Get PWM mode. - * - * Register|BitsName - * --------|-------- - * MODE | BREATHEN - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_FLICKER_MODE - * @arg @ref LL_PWM_BREATH_MODE - */ -__STATIC_INLINE uint32_t ll_pwm_get_mode(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->MODE, PWM_MODE_BREATHEN)); -} - -/** - * @brief Enable positive drive mode in channelA. - * - * Register|BitsName - * --------|-------- - * MODE | DPENA - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_positive_drive_channel_a(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->MODE, PWM_MODE_DPENA); -} - -/** - * @brief Disable positive drive mode in channelA. - * - * Register|BitsName - * --------|-------- - * MODE | DPENA - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_positive_drive_channel_a(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->MODE, PWM_MODE_DPENA); -} - -/** - * @brief Indicate whether the positive drive mode in channelA is enabled. - * - * Register|BitsName - * --------|-------- - * MODE | DPENA - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_positive_drive_channel_a(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->MODE, PWM_MODE_DPENA) == (PWM_MODE_DPENA)); -} - -/** - * @brief Enable positive drive mode in channelB. - * - * Register|BitsName - * --------|-------- - * MODE | DPENB - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_positive_drive_channel_b(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->MODE, PWM_MODE_DPENB); -} - -/** - * @brief Disable positive drive mode in channelB. - * - * Register|BitsName - * --------|-------- - * MODE | DPENB - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_positive_drive_channel_b(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->MODE, PWM_MODE_DPENB); -} - -/** - * @brief Indicate whether the positive drive mode in channelB is enabled. - * - * Register|BitsName - * --------|-------- - * MODE | DPENB - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_positive_drive_channel_b(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->MODE, PWM_MODE_DPENB) == (PWM_MODE_DPENB)); -} - -/** - * @brief Enable positive drive mode in channelC. - * - * Register|BitsName - * --------|-------- - * MODE | DPENC - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_positive_drive_channel_c(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->MODE, PWM_MODE_DPENC); -} - -/** - * @brief Disable positive drive mode in channelC. - * - * Register|BitsName - * --------|-------- - * MODE | DPENC - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_positive_drive_channel_c(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->MODE, PWM_MODE_DPENC); -} - -/** - * @brief Indicate whether the positive drive mode in channelC is enabled. - * - * Register|BitsName - * --------|-------- - * MODE | DPENC - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_positive_drive_channel_c(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->MODE, PWM_MODE_DPENC) == (PWM_MODE_DPENC)); -} - -/** - * @brief Check update active flag - * - * Register|BitsName - * --------|-------- - * UPDATE | SAG - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_active_flag_update_all(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SAG) == (PWM_UPDATE_SAG)); -} - -/** - * @brief Enable update all parameters. - * - * Register|BitsName - * --------|-------- - * UPDATE | SA - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_all(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SA); -} - -/** - * @brief Disable update all parameters. - * - * Register|BitsName - * --------|-------- - * UPDATE | SA - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_all(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SA); -} - -/** - * @brief Indicate whether the update all parameters is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SA - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_all(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SA) == (PWM_UPDATE_SA)); -} - -/** - * @brief Enable update period. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSPRD - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_period(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSPRD); -} - -/** - * @brief Disable update period. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSPRD - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_period(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSPRD); -} - -/** - * @brief Indicate whether the update period is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSPRD - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_period(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSPRD) == (PWM_UPDATE_SSPRD)); -} - -/** - * @brief Enable update compareA0. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPA0 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_compare_a0(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPA0); -} - -/** - * @brief Disable update compareA0. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPA0 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_compare_a0(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPA0); -} - -/** - * @brief Indicate whether the update compareA0 is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPA0 - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_compare_a0(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPA0) == (PWM_UPDATE_SSCMPA0)); -} - -/** - * @brief Enable update compareA1. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPA1 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_compare_a1(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPA1); -} - -/** - * @brief Disable update compareA1. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPA1 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_compare_a1(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPA1); -} - -/** - * @brief Indicate whether the update compareA1 is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPA1 - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_compare_a1(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPA1) == (PWM_UPDATE_SSCMPA1)); -} - -/** - * @brief Enable update compareB0. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPB0 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_compare_b0(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPB0); -} - -/** - * @brief Disable update compareB0. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPB0 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_compare_b0(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPB0); -} - -/** - * @brief Indicate whether the update compareB0 is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPB0 - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_compare_b0(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPB0) == (PWM_UPDATE_SSCMPB0)); -} - -/** - * @brief Enable update compareB1. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPB1 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_compare_b1(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPB1); -} - -/** - * @brief Disable update compareB1. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPB1 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_compare_b1(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPB1); -} - -/** - * @brief Indicate whether the update compareB1 is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPB1 - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_compare_b1(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPB1) == (PWM_UPDATE_SSCMPB1)); -} - -/** - * @brief Enable update compareC0. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPC0 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_compare_c0(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPC0); -} - -/** - * @brief Disable update compareC0. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPC0 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_compare_c0(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPC0); -} - -/** - * @brief Indicate whether the update compareC0 is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPC0 - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_compare_c0(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPC0) == (PWM_UPDATE_SSCMPC0)); -} - -/** - * @brief Enable update compareC1. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPC1 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_compare_c1(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPC1); -} - -/** - * @brief Disable update compareC1. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPC1 - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_compare_c1(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPC1); -} - -/** - * @brief Indicate whether the update compareC1 is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSCMPC1 - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_compare_c1(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSCMPC1) == (PWM_UPDATE_SSCMPC1)); -} - -/** - * @brief Enable update pause. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSPAUSE - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_pause(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSPAUSE); -} - -/** - * @brief Disable update pause. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSPAUSE - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_pause(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSPAUSE); -} - -/** - * @brief Indicate whether the update pause is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSPAUSE - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_pause(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSPAUSE) == (PWM_UPDATE_SSPAUSE)); -} - -/** - * @brief Enable update breath period. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSBRPRD - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_breath_period(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSBRPRD); -} - -/** - * @brief Disable update breath period. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSBRPRD - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_breath_period(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSBRPRD); -} - -/** - * @brief Indicate whether the update breath period is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSBRPRD - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_breath_period(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSBRPRD) == (PWM_UPDATE_SSBRPRD)); -} - -/** - * @brief Enable update hold period. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSHOLD - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_hold_period(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSHOLD); -} - -/** - * @brief Disable update hold period. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSHOLD - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_hold_period(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSHOLD); -} - -/** - * @brief Indicate whether the update hold period is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSHOLD - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_hold_period(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSHOLD) == (PWM_UPDATE_SSHOLD)); -} - -/** - * @brief Enable update active event. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSAQCTRL - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_enable_update_active_event(pwm_regs_t *PWMx) -{ - SET_BITS(PWMx->UPDATE, PWM_UPDATE_SSAQCTRL); -} - -/** - * @brief Disable update active event. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSAQCTRL - * - * @param PWMx PWM instance - * @retval None - */ -__STATIC_INLINE void ll_pwm_disable_update_active_event(pwm_regs_t *PWMx) -{ - CLEAR_BITS(PWMx->UPDATE, PWM_UPDATE_SSAQCTRL); -} - -/** - * @brief Indicate whether the update active event is enabled. - * - * Register|BitsName - * --------|-------- - * UPDATE | SSAQCTRL - * - * @param PWMx PWM instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_pwm_is_enabled_update_active_event(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->UPDATE, PWM_UPDATE_SSAQCTRL) == (PWM_UPDATE_SSAQCTRL)); -} - -/** - * @brief Set the PWM prescaler. - * - * Register|BitsName - * --------|-------- - * PRD | PRD - * - * @param PWMx PWM instance - * @param prescaler This parameter ranges between Min_Data=1 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_prescaler(pwm_regs_t *PWMx, uint32_t prescaler) -{ - WRITE_REG(PWMx->PRD, prescaler); -} - -/** - * @brief Get the PWM prescaler. - * - * Register|BitsName - * --------|-------- - * PRD | PRD - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=1 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_prescaler(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->PRD)); -} - -/** - * @brief Set the PWM compare counter A0. - * - * Register|BitsName - * --------|-------- - * CMPA0 | CMPA0 - * - * @param PWMx PWM instance - * @param compare This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_compare_a0(pwm_regs_t *PWMx, uint32_t compare) -{ - WRITE_REG(PWMx->CMPA0, compare); -} - -/** - * @brief Get the PWM compare counter A0. - * - * Register|BitsName - * --------|-------- - * CMPA0 | CMPA0 - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_compare_a0(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->CMPA0)); -} - -/** - * @brief Set the PWM compare counter A1. - * - * Register|BitsName - * --------|-------- - * CMPA1 | CMPA1 - * - * @param PWMx PWM instance - * @param compare This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_compare_a1(pwm_regs_t *PWMx, uint32_t compare) -{ - WRITE_REG(PWMx->CMPA1, compare); -} - -/** - * @brief Get the PWM compare counter A1. - * - * Register|BitsName - * --------|-------- - * CMPA1 | CMPA1 - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_compare_a1(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->CMPA1)); -} - -/** - * @brief Set the PWM compare counter B0. - * - * Register|BitsName - * --------|-------- - * CMPB0 | CMPB0 - * - * @param PWMx PWM instance - * @param compare This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_compare_b0(pwm_regs_t *PWMx, uint32_t compare) -{ - WRITE_REG(PWMx->CMPB0, compare); -} - -/** - * @brief Get the PWM compare counter B0. - * - * Register|BitsName - * --------|-------- - * CMPB0 | CMPB0 - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_compare_b0(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->CMPB0)); -} - -/** - * @brief Set the PWM compare counter B1. - * - * Register|BitsName - * --------|-------- - * CMPB1 | CMPB1 - * - * @param PWMx PWM instance - * @param compare This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_compare_b1(pwm_regs_t *PWMx, uint32_t compare) -{ - WRITE_REG(PWMx->CMPB1, compare); -} - -/** - * @brief Get the PWM compare counter B1. - * - * Register|BitsName - * --------|-------- - * CMPB1 | CMPB1 - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_compare_b1(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->CMPB1)); -} - -/** - * @brief Set the PWM compare counter C0. - * - * Register|BitsName - * --------|-------- - * CMPC0 | CMPC0 - * - * @param PWMx PWM instance - * @param compare This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_compare_c0(pwm_regs_t *PWMx, uint32_t compare) -{ - WRITE_REG(PWMx->CMPC0, compare); -} - -/** - * @brief Get the PWM compare counter C0. - * - * Register|BitsName - * --------|-------- - * CMPC0 | CMPC0 - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_compare_c0(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->CMPC0)); -} - -/** - * @brief Set the PWM compare counter C1. - * - * Register|BitsName - * --------|-------- - * CMPC1 | CMPC1 - * - * @param PWMx PWM instance - * @param compare This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_compare_c1(pwm_regs_t *PWMx, uint32_t compare) -{ - WRITE_REG(PWMx->CMPC1, compare); -} - -/** - * @brief Get the PWM compare counter C1. - * - * Register|BitsName - * --------|-------- - * CMPC1 | CMPC1 - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_compare_c1(pwm_regs_t *PWMx) -{ - return (READ_REG(PWMx->CMPC1)); -} - -/** - * @brief Set the channel A0 action event when PWM counter value reaches compare counter A0. - * - * Register|BitsName - * --------|-------- - * AQCTRL | A0 - * - * @param PWMx PWM instance - * @param action_event This parameter can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_action_event_cmp_a0(pwm_regs_t *PWMx, uint32_t action_event) -{ - MODIFY_REG(PWMx->AQCTRL, PWM_AQCTRL_A0, action_event << PWM_AQCTRL_A0_Pos); -} - -/** - * @brief Get the channel A0 action event when PWM counter value reaches compare counter A0. - * - * Register|BitsName - * --------|-------- - * AQCTRL | A0 - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - */ -__STATIC_INLINE uint32_t ll_pwm_get_action_event_cmp_a0(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->AQCTRL, PWM_AQCTRL_A0) >> PWM_AQCTRL_A0_Pos); -} - -/** - * @brief Set the channel A1 action event when PWM counter value reaches compare counter A1. - * - * Register|BitsName - * --------|-------- - * AQCTRL | A1 - * - * @param PWMx PWM instance - * @param action_event This parameter can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_action_event_cmp_a1(pwm_regs_t *PWMx, uint32_t action_event) -{ - MODIFY_REG(PWMx->AQCTRL, PWM_AQCTRL_A1, action_event << PWM_AQCTRL_A1_Pos); -} - -/** - * @brief Get the channel A1 action event when PWM counter value reaches compare counter A1. - * - * Register|BitsName - * --------|-------- - * AQCTRL | A1 - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - */ -__STATIC_INLINE uint32_t ll_pwm_get_action_event_cmp_a1(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->AQCTRL, PWM_AQCTRL_A1) >> PWM_AQCTRL_A1_Pos); -} - -/** - * @brief Set the channel B0 action event when PWM counter value reaches compare counter B0. - * - * Register|BitsName - * --------|-------- - * AQCTRL | B0 - * - * @param PWMx PWM instance - * @param action_event This parameter can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_action_event_cmp_b0(pwm_regs_t *PWMx, uint32_t action_event) -{ - MODIFY_REG(PWMx->AQCTRL, PWM_AQCTRL_B0, action_event << PWM_AQCTRL_B0_Pos); -} - -/** - * @brief Get the channel B0 action event when PWM counter value reaches compare counter B0. - * - * Register|BitsName - * --------|-------- - * AQCTRL | B0 - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - */ -__STATIC_INLINE uint32_t ll_pwm_get_action_event_cmp_b0(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->AQCTRL, PWM_AQCTRL_B0) >> PWM_AQCTRL_B0_Pos); -} - -/** - * @brief Set the channel B1 action event when PWM counter value reaches compare counter B1. - * - * Register|BitsName - * --------|-------- - * AQCTRL | B1 - * - * @param PWMx PWM instance - * @param action_event This parameter can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_action_event_cmp_b1(pwm_regs_t *PWMx, uint32_t action_event) -{ - MODIFY_REG(PWMx->AQCTRL, PWM_AQCTRL_B1, action_event << PWM_AQCTRL_B1_Pos); -} - -/** - * @brief Get the channel B1 action event when PWM counter value reaches compare counter B1. - * - * Register|BitsName - * --------|-------- - * AQCTRL | B1 - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - */ -__STATIC_INLINE uint32_t ll_pwm_get_action_event_cmp_b1(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->AQCTRL, PWM_AQCTRL_B1) >> PWM_AQCTRL_B1_Pos); -} - -/** - * @brief Set the channel C0 action event when PWM counter value reaches compare counter C0. - * - * Register|BitsName - * --------|-------- - * AQCTRL | C0 - * - * @param PWMx PWM instance - * @param action_event This parameter can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_action_event_cmp_c0(pwm_regs_t *PWMx, uint32_t action_event) -{ - MODIFY_REG(PWMx->AQCTRL, PWM_AQCTRL_C0, action_event << PWM_AQCTRL_C0_Pos); -} - -/** - * @brief Get the channel C0 action event when PWM counter value reaches compare counter C0. - * - * Register|BitsName - * --------|-------- - * AQCTRL | C0 - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - */ -__STATIC_INLINE uint32_t ll_pwm_get_action_event_cmp_c0(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->AQCTRL, PWM_AQCTRL_C0) >> PWM_AQCTRL_C0_Pos); -} - -/** - * @brief Set the channel C1 action event when PWM counter value reaches compare counter C1. - * - * Register|BitsName - * --------|-------- - * AQCTRL | C1 - * - * @param PWMx PWM instance - * @param action_event This parameter can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_action_event_cmp_c1(pwm_regs_t *PWMx, uint32_t action_event) -{ - MODIFY_REG(PWMx->AQCTRL, PWM_AQCTRL_C1, action_event << PWM_AQCTRL_C1_Pos); -} - -/** - * @brief Get the channel C1 action event when PWM counter value reaches compare counter C1. - * - * Register|BitsName - * --------|-------- - * AQCTRL | C1 - * - * @param PWMx PWM instance - * @retval Return value can be one of the following values: - * @arg @ref LL_PWM_ACTIONEVENT_NONE - * @arg @ref LL_PWM_ACTIONEVENT_CLEAR - * @arg @ref LL_PWM_ACTIONEVENT_SET - * @arg @ref LL_PWM_ACTIONEVENT_TOGGLE - */ -__STATIC_INLINE uint32_t ll_pwm_get_action_event_cmp_c1(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->AQCTRL, PWM_AQCTRL_C1) >> PWM_AQCTRL_C1_Pos); -} - -/** - * @brief Set the breath prescaler in breath mode. - * - * Register|BitsName - * --------|-------- - * BRPRD | BRPRD - * - * @param PWMx PWM instance - * @param bprescaler This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_breath_prescaler(pwm_regs_t *PWMx, uint32_t bprescaler) -{ - MODIFY_REG(PWMx->BRPRD, PWM_BRPRD_BRPRD, bprescaler); -} - -/** - * @brief Get the breath prescaler in breath mode. - * - * Register|BitsName - * --------|-------- - * BRPRD | BRPRD - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_breath_prescaler(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->BRPRD, PWM_BRPRD_BRPRD)); -} - -/** - * @brief Set the hold prescaler in breath mode. - * - * Register|BitsName - * --------|-------- - * HOLD | HOLD - * - * @param PWMx PWM instance - * @param hprescaler This parameter ranges between Min_Data=0 and Max_Data=0xFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_pwm_set_hold_prescaler(pwm_regs_t *PWMx, uint32_t hprescaler) -{ - MODIFY_REG(PWMx->HOLD, PWM_HOLD_HOLD, hprescaler); -} - -/** - * @brief Get the hold prescaler in breath mode. - * - * Register|BitsName - * --------|-------- - * HOLD | HOLD - * - * @param PWMx PWM instance - * @retval Return value ranges between Min_Data=0 and Max_Data=0xFFFFFF - */ -__STATIC_INLINE uint32_t ll_pwm_get_hold_prescaler(pwm_regs_t *PWMx) -{ - return (READ_BITS(PWMx->HOLD, PWM_HOLD_HOLD)); -} - -/** @} */ - -/** @defgroup PWM_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize PWM registers (Registers restored to their default values). - * @param PWMx PWM instance - * @retval An error_status_t enumeration value: - * - SUCCESS: PWM registers are de-initialized - * - ERROR: PWM registers are not de-initialized - */ -error_status_t ll_pwm_deinit(pwm_regs_t *PWMx); - -/** - * @brief Initialize PWM registers according to the specified - * parameters in PWM_InitStruct. - * @param PWMx PWM instance - * @param p_pwm_init Pointer to a ll_pwm_init_t structure that contains the configuration - * information for the specified PWM peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: PWM registers are initialized according to p_pwm_init content - * - ERROR: Problem occurred during PWM Registers initialization - */ -error_status_t ll_pwm_init(pwm_regs_t *PWMx, ll_pwm_init_t *p_pwm_init); - -/** - * @brief Set each field of a @ref ll_pwm_init_t type structure to default value. - * @param p_pwm_init Pointer to a @ref ll_pwm_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_pwm_struct_init(ll_pwm_init_t *p_pwm_init); - -/** @} */ - -/** @} */ - -#endif /* PWM0 || PWM1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_PWM_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwr.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwr.h deleted file mode 100755 index c550985..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_pwr.h +++ /dev/null @@ -1,1327 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_pwr.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of PWR LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_PWR PWR - * @brief PWR LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55xx_LL_PWR_H -#define GR55xx_LL_PWR_H - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(AON) - -/** - * @defgroup PWR_LL_MACRO Defines - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWR_LL_Private_Constants PWR Private Constants - * @{ - */ - -/** @defgroup PWR_LL_PC_EXT_WAKEUP_CTL_LSB External Wakeup Control Low Significant Bit Defines - * @{ - */ -#define LL_PWR_EXTWKUP_TYPE_LSB (0x01U << AON_EXT_WKUP_CTL_TYPE_Pos) /**< External wakeup level type */ -#define LL_PWR_EXTWKUP_INVERT_LSB (0x01U << AON_EXT_WKUP_CTL_INVERT_Pos) /**< External wakeup level invert */ -#define LL_PWR_EXTWKUP_SRC_EN_LSB (0x01U << AON_EXT_WKUP_CTL_SRC_EN_Pos) /**< External wakeup source enable */ -/** @} */ - -/** @} */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWR_LL_Private_Macro PWR Private Macros - * @{ - */ - -/** @defgroup PWR_LL_PM_EXT_WAKEUP_CTL_LSB External Wakeup Control Low Significant Bit Defines - * @{ - */ - -/** - * @brief PWR_LL_PM_GET_MEM_PWR_MSK PWR Get Memory Power Value Mask - */ -#define LL_PWR_GET_MEM_PWR_MASK(POWER) (((POWER) == LL_PWR_MEM_POWER_OFF) ? 0x0U : \ - (((POWER) == LL_PWR_MEM_POWER_FULL) ? 0xAAAAAAAAU : 0xFFFFFFFFU)) - -/** @} */ - -/** @} */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_LL_EC_WAKEUP_COND Wakeup Condition - * @{ - */ -#define LL_PWR_WKUP_COND_EXT AON_PWR_REG01_WAKE_UP_SEL_EXTWKUP /**< External wakeup: AON_GPIO */ -#define LL_PWR_WKUP_COND_TIMER AON_PWR_REG01_WAKE_UP_SEL_TIMER /**< AON Timer wakeup */ -#define LL_PWR_WKUP_COND_BLE AON_PWR_REG01_WAKE_UP_SEL_BLE /**< BLE wakeup */ -#define LL_PWR_WKUP_COND_CALENDAR AON_PWR_REG01_WAKE_UP_SEL_CALENDAR /**< Calendar wakeup */ -#define LL_PWR_WKUP_COND_BOD_FEDGE AON_PWR_REG01_WAKE_UP_SEL_PMU_BOD_FEDGE /**< PMU Bod falling edge wakeup */ -#define LL_PWR_WKUP_COND_MSIO_COMP AON_PWR_REG01_WAKE_UP_SEL_MSIO_COMP /**< Msio comparator wakeup */ -#define LL_PWR_WKUP_COND_ALL AON_PWR_REG01_WAKE_UP_SEL /**< All wakeup sources mask */ -/** @} */ - - -/** @defgroup PWR_LL_EC_WAKEUP_EVT Wakeup Event - * @note Only available on GR5515_C and later version - * @{ - */ -#define LL_PWR_WKUP_EVENT_BLE AON_SLP_EVENT_SMCOSCEN /**< BLE Timer wakeup event */ -#define LL_PWR_WKUP_EVENT_TIMER AON_SLP_EVENT_TIMER /**< AON Timer wakeup event */ -#define LL_PWR_WKUP_EVENT_EXT AON_SLP_EVENT_EXTWKUP /**< External wakeup event: AON_GPIO */ -#define LL_PWR_WKUP_EVENT_BOD_FEDGE AON_SLP_EVENT_PMU_BOD_FEDGE /**< PMU Bod wakeup event */ -#define LL_PWR_WKUP_EVENT_MSIO_COMP AON_SLP_EVENT_PMU_MSIO_COMP /**< Msio comparator wakeup event */ -#define LL_PWR_WKUP_EVENT_WDT AON_SLP_EVENT_WDT_REBOOT /**< AON WDT wakeup event */ -#define LL_PWR_WKUP_EVENT_CALENDAR AON_SLP_EVENT_CALENDAR_TIMER_ALARM /**< Calendar wakeup event */ -#define LL_PWR_WKUP_EVENT_ALL (AON_SLP_EVENT_SMCOSCEN | \ - AON_SLP_EVENT_TIMER | \ - AON_SLP_EVENT_EXTWKUP | \ - AON_SLP_EVENT_PMU_BOD_FEDGE | \ - AON_SLP_EVENT_PMU_MSIO_COMP | \ - AON_SLP_EVENT_WDT_REBOOT | \ - AON_SLP_EVENT_CALENDAR_TIMER_ALARM) /**< All event mask */ -/** @} */ - -/** @defgroup PWR_LL_EC_EXTWAKEUP_PIN External Wakeup Pins - * @{ - */ -#define LL_PWR_EXTWKUP_PIN0 (0x00000001U) /**< WKUP pin 0 : AON_GPIO_PIN0 */ -#define LL_PWR_EXTWKUP_PIN1 (0x00000002U) /**< WKUP pin 1 : AON_GPIO_PIN1 */ -#define LL_PWR_EXTWKUP_PIN2 (0x00000004U) /**< WKUP pin 2 : AON_GPIO_PIN2 */ -#define LL_PWR_EXTWKUP_PIN3 (0x00000008U) /**< WKUP pin 3 : AON_GPIO_PIN3 */ -#define LL_PWR_EXTWKUP_PIN4 (0x00000010U) /**< WKUP pin 4 : AON_GPIO_PIN4 */ -#define LL_PWR_EXTWKUP_PIN5 (0x00000020U) /**< WKUP pin 5 : AON_GPIO_PIN5 */ -#define LL_PWR_EXTWKUP_PIN6 (0x00000040U) /**< WKUP pin 6 : AON_GPIO_PIN6 */ -#define LL_PWR_EXTWKUP_PIN7 (0x00000080U) /**< WKUP pin 7 : AON_GPIO_PIN7 */ -#define LL_PWR_EXTWKUP_PIN_ALL (0x000000FFU) /**< WKUP pin all : AON_GPIO_PIN0 ~ AON_GPIO_PIN7 */ -/** @} */ - -/** @defgroup PWR_LL_EC_EXTWAKEUP_TYPE External Wakeup Type - * @{ - */ -#define LL_PWR_EXTWKUP_TYPE_LOW (LL_PWR_EXTWKUP_INVERT_LSB | LL_PWR_EXTWKUP_TYPE_LSB | \ - LL_PWR_EXTWKUP_SRC_EN_LSB) /**< Low level wakeup */ -#define LL_PWR_EXTWKUP_TYPE_HIGH (LL_PWR_EXTWKUP_TYPE_LSB | \ - LL_PWR_EXTWKUP_SRC_EN_LSB) /**< High level wakeup */ -#define LL_PWR_EXTWKUP_TYPE_RISING (0x00000000U) /**< Rising edge wakeup */ -#define LL_PWR_EXTWKUP_TYPE_FALLING (LL_PWR_EXTWKUP_INVERT_LSB | \ - LL_PWR_EXTWKUP_SRC_EN_LSB) /**< Falling edge wakeup */ -/** @} */ - -/** @defgroup PWR_LL_EC_PSC_CMD Power State Control Commands - * @{ - */ -#define LL_PWR_CMD_LOOPBACK AON_PSC_CMD_OPC_OPCODE_LOOPBACK /**< Reserved command 0 */ -#define LL_PWR_CMD_EF_DIR_ON AON_PSC_CMD_OPC_OPCODE_EF_DIR_ON /**< Reserved command 1 */ -#define LL_PWR_CMD_32_TIMER_LD AON_PSC_CMD_OPC_OPCODE_32_TIMER_LD /**< Load sleep timer command */ -#define LL_PWR_CMD_DEEP_SLEEP AON_PSC_CMD_OPC_OPCODE_DEEP_SLEEP /**< Enter Deep Sleep - Mode command */ -#define LL_PWR_CMD_EF_DIR_OFF AON_PSC_CMD_OPC_OPCODE_EF_DIR_OFF /**< Reserved command 2 */ -#define LL_PWR_CMD_EXT_CLK AON_PSC_CMD_OPC_OPCODE_EXT_CLK /**< Select external clock - (xo_32KHz) command */ -#define LL_PWR_CMD_RNG_CLK AON_PSC_CMD_OPC_OPCODE_RNG_CLK /**< Select RING OSC clock - command */ -#define LL_PWR_CMD_RTC_CLK AON_PSC_CMD_OPC_OPCODE_RTC_CLK /**< Select RTC clock command */ -#define LL_PWR_CMD_RNG2_CLK AON_PSC_CMD_OPC_OPCODE_RNG2_CLK /**< Select RING OSC clock - command */ -#define LL_PWR_CMD_LD_MEM_SLP_CFG AON_PSC_CMD_OPC_OPCODE_LD_MEM_SLP_CFG /**< Load memory sleep settings - command */ -#define LL_PWR_CMD_LD_MEM_WKUP_CFG AON_PSC_CMD_OPC_OPCODE_LD_MEM_WKUP_CFG /**< Load memory wakeup settings - command */ -#define LL_PWR_CMD_DPAD_LE_HI AON_PSC_CMD_OPC_OPCODE_DPAD_LE_HI /**< Force dpad_le high */ -#define LL_PWR_CMD_DPAD_LE_LO AON_PSC_CMD_OPC_OPCODE_DPAD_LE_LO /**< Force dpad_le low */ -#define LL_PWR_CMD_SLP_TIMER_MODE_NORMAL AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_0 /**< Enable sleep timer - mode 0 command */ -#define LL_PWR_CMD_SLP_TIMER_MODE_SINGLE AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_1 /**< Enable sleep timer - mode 1 command */ -#define LL_PWR_CMD_SLP_TIMER_MODE_RELOAD AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_2 /**< Enable sleep timer - mode 2 command */ -#define LL_PWR_CMD_SLP_TIMER_MODE_DISABLE AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_3 /**< Enable sleep timer - mode 3 command */ -/** @} */ - - -/** @} */ - -/** @defgroup PWR_LL_EC_DPAD_VALUE Dpad LE State - * @{ - */ -#define LL_PWR_DPAD_LE_OFF (0x00000000U) /**< Dpad LE LOW */ -#define LL_PWR_DPAD_LE_ON (0x00000001U) /**< Dpad LE High */ -/** @} */ - -/** @defgroup PWR_LL_EC_TIMER_READ_SEL Timer Read Select - * @note Only available on GR5515_C and later version - * @{ - */ -#define LL_PWR_TIMER_READ_SEL_CAL_TIMER AON_PAD_CTL1_TIMER_READ_SEL_CAL_TIMER /**< Calendar timer */ -#define LL_PWR_TIMER_READ_SEL_AON_WDT AON_PAD_CTL1_TIMER_READ_SEL_AON_WDT /**< AON watchdog timer */ -#define LL_PWR_TIMER_READ_SEL_SLP_TIMER AON_PAD_CTL1_TIMER_READ_SEL_SLP_TIMER /**< Sleep timer */ -#define LL_PWR_TIMER_READ_SEL_CAL_ALARM AON_PAD_CTL1_TIMER_READ_SEL_CAL_ALARM /**< Calendar alarm */ -/** @} */ - -/** @} */ - - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in PWR register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(AON->__REG__, (__VALUE__)) - -/** - * @brief Read a value in PWR register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_PWR_ReadReg(__REG__) READ_REG(AON->__REG__) -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_LL_EF_Low_Power_Mode_Configuration Low power mode configuration - * @{ - */ - -/** - * @brief Set the DeepSleep WakeUp Condition - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WAKE_UP_SEL - * - * @param condition This parameter can be one of the following values: - * @arg @ref LL_PWR_WKUP_COND_EXT - * @arg @ref LL_PWR_WKUP_COND_TIMER - * @arg @ref LL_PWR_WKUP_COND_BLE - * @arg @ref LL_PWR_WKUP_COND_CALENDAR - * @arg @ref LL_PWR_WKUP_COND_BOD_FEDGE - * @arg @ref LL_PWR_WKUP_COND_MSIO_COMP - * @arg @ref LL_PWR_WKUP_COND_ALL - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_wakeup_condition(uint32_t condition) -{ - MODIFY_REG(AON->PWR_RET01, AON_PWR_REG01_WAKE_UP_SEL, condition); -} - -/** - * @brief Get the Selected DeepSleep WakeUp Condition - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | WAKE_UP_SEL - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_WKUP_COND_EXT - * @arg @ref LL_PWR_WKUP_COND_TIMER - * @arg @ref LL_PWR_WKUP_COND_BLE - * @arg @ref LL_PWR_WKUP_COND_CALENDAR - * @arg @ref LL_PWR_WKUP_COND_BOD_FEDGE - * @arg @ref LL_PWR_WKUP_COND_MSIO_COMP - * @arg @ref LL_PWR_WKUP_COND_ALL - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_wakeup_condition(void) -{ - return ((uint32_t)READ_BITS(AON->PWR_RET01, AON_PWR_REG01_WAKE_UP_SEL)); -} - -/** - * @brief Get the Event that triggered the DeepSleep WakeUp. - * @note Only available on GR5515_C and later version - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | SMCOSCEN_EVENT - * SLP_EVENT | TIMER_EVENT - * SLP_EVENT | EXT_WKUP_EVENT - * SLP_EVENT | WATCHDOG_EVENT - * - * @retval Returned value can be combination of the following values: - * @arg @ref LL_PWR_WKUP_EVENT_BLE - * @arg @ref LL_PWR_WKUP_EVENT_TIMER - * @arg @ref LL_PWR_WKUP_EVENT_EXT - * @arg @ref LL_PWR_WKUP_EVENT_BOD_FEDGE - * @arg @ref LL_PWR_WKUP_EVENT_MSIO_COMP - * @arg @ref LL_PWR_WKUP_EVENT_WDT - * @arg @ref LL_PWR_WKUP_EVENT_CALENDAR - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_wakeup_event(void) -{ - return ((uint32_t)READ_BITS(AON->SLP_EVENT, LL_PWR_WKUP_EVENT_ALL)); -} - -/** - * @brief Enable the External WakeUp PINx functionality - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | MASK - * - * @param wakeup_pin This parameter can be a combination of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_ext_wakeup_pin(uint32_t wakeup_pin) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->EXT_WKUP_CTL, wakeup_pin); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable the External WakeUp PINx functionality - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | MASK - * - * @param wakeup_pin This parameter can be a combination of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_ext_wakeup_pin(uint32_t wakeup_pin) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->EXT_WKUP_CTL, wakeup_pin); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if the External WakeUp PINx functionality is enabled - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | MASK - * - * @param wakeup_pin This parameter can be a combination of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_ext_wakeup_pin(uint32_t wakeup_pin) -{ - return (READ_BITS(AON->EXT_WKUP_CTL, wakeup_pin) == wakeup_pin); -} - -/** - * @brief Set the WakeUp Type of External WakeUp PINx. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | INVERT - * EXT_WKUP_CTL | TYPE - * - * @param wakeup_pin This parameter can be a combination of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - * @param wakeup_type This parameter can be one of the following values: - * @arg @ref LL_PWR_EXTWKUP_TYPE_LOW - * @arg @ref LL_PWR_EXTWKUP_TYPE_HIGH - * @arg @ref LL_PWR_EXTWKUP_TYPE_RISING - * @arg @ref LL_PWR_EXTWKUP_TYPE_FALLING - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_ext_wakeup_type(uint32_t wakeup_pin, uint32_t wakeup_type) -{ - uint32_t invert = ((wakeup_type & LL_PWR_EXTWKUP_INVERT_LSB) == LL_PWR_EXTWKUP_INVERT_LSB) ? \ - (wakeup_pin << AON_EXT_WKUP_CTL_INVERT_Pos) : 0; - uint32_t type = ((wakeup_type & LL_PWR_EXTWKUP_TYPE_LSB) == LL_PWR_EXTWKUP_TYPE_LSB) ? \ - (wakeup_pin << AON_EXT_WKUP_CTL_TYPE_Pos) : 0; - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->EXT_WKUP_CTL, - (wakeup_pin << AON_EXT_WKUP_CTL_INVERT_Pos) | (wakeup_pin << AON_EXT_WKUP_CTL_TYPE_Pos), - invert | type); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Get the WakeUp Type of External WakeUp PINx. - * @note Warning: only one pin can be passed as parameter. - * - * Register|BitsName - * --------|-------- - * EXT_WKUP_CTL | INVERT - * EXT_WKUP_CTL | TYPE - * - * @param wakeup_pin This parameter can be one of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_EXTWKUP_TYPE_LOW - * @arg @ref LL_PWR_EXTWKUP_TYPE_HIGH - * @arg @ref LL_PWR_EXTWKUP_TYPE_RISING - * @arg @ref LL_PWR_EXTWKUP_TYPE_FALLING - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_ext_wakeup_type(uint32_t wakeup_pin) -{ - return ((uint32_t)(READ_BITS(AON->EXT_WKUP_CTL, AON_EXT_WKUP_CTL_INVERT | AON_EXT_WKUP_CTL_TYPE) >> \ - POSITION_VAL(wakeup_pin))); -} - -/** - * @brief Set the 32 bits AON Sleep Timer Value to WakeUp the MCU from DeepSleep Mode. - * @note After the value was set, use @arg @ref LL_PWR_CMD_32_TIMER_LD command to - * load the configuration into Power State Controller. - * - * Register|BitsName - * --------|-------- - * TIMER_VALUE | PWR_CTL_TIMER_32B - * - * @param value 32 bits count value loaded into the t32bit_timer - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_sleep_timer_value(uint32_t value) -{ - WRITE_REG(AON->TIMER_VALUE, value); -} - -/** - * @brief Get the 32 bit AON Sleep Timer Value to WakeUp the MCU from DeepSleep Mode. - * - * Register|BitsName - * --------|-------- - * TIMER_VALUE | PWR_CTL_TIMER_32B - * - * @retval 32 bit AON Timer Count Value - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_sleep_timer_value(void) -{ - return READ_REG(AON->TIMER_VALUE); -} - -/** - * @brief Enable the SMC WakeUp Request. - * @note Once this is set up, MCU will wake up SMC, and this bit need to be cleared by MCU. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | SMC_WAKEUP_REQ - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_smc_wakeup_req(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_SMC_WAKEUP_REQ); -} - -/** - * @brief Disable the SMC WakeUp Request. - * @note This function is used to clear SMC WakeUp Request. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | SMC_WAKEUP_REQ - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_smc_wakeup_req(void) -{ - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_SMC_WAKEUP_REQ); -} - -/** - * @brief Check if the SMC WakeUp Request was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | SMC_WAKEUP_REQ - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_smc_wakeup_req(void) -{ - return (READ_BITS(AON->PWR_RET01, AON_PWR_REG01_SMC_WAKEUP_REQ) == AON_PWR_REG01_SMC_WAKEUP_REQ); -} - -/** - * @brief Set the DPAD LE value during sleep and after wake up. - * - * Register|BitsName - * --------|-------- - * MEM_N_SLP_CTL | DPAD_LE_SLP_VAL - * MEM_N_SLP_CTL | DPAD_LE_WKUP_VAL - * - * @param sleep This parameter can be one of the following values: - * @arg @ref LL_PWR_DPAD_LE_OFF - * @arg @ref LL_PWR_DPAD_LE_ON - * @param wakeup This parameter can be one of the following values: - * @arg @ref LL_PWR_DPAD_LE_OFF - * @arg @ref LL_PWR_DPAD_LE_ON - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_dpad_le_value(uint32_t sleep, uint32_t wakeup) -{ - MODIFY_REG(AON->MEM_N_SLP_CTL, AON_MEM_CTL_DPAD_LE_SLP_VAL, (sleep << AON_MEM_CTL_DPAD_LE_SLP_VAL_Pos)); - MODIFY_REG(AON->MEM_N_SLP_CTL, AON_MEM_CTL_DPAD_LE_WKUP_VAL, (wakeup << AON_MEM_CTL_DPAD_LE_WKUP_VAL_Pos)); -} - -/** - * @brief Request to excute the Power State Controller Command. - * @note The PSC command can only be excuted when Power State Controller is not in busy state. - * Use @ref ll_pwr_is_active_flag_psc_cmd_busy() to check the busy status, and make sure - * the last command has been finished. - * - * Register|BitsName - * --------|-------- - * PSC_CMD_OPC | OPCODE - * PSC_CMD | MCU_PWR_REQ - * - * @param command This parameter can be one of the following values: - * @arg @ref LL_PWR_CMD_LOOPBACK - * @arg @ref LL_PWR_CMD_EF_DIR_ON - * @arg @ref LL_PWR_CMD_32_TIMER_LD - * @arg @ref LL_PWR_CMD_DEEP_SLEEP - * @arg @ref LL_PWR_CMD_EF_DIR_OFF - * @arg @ref LL_PWR_CMD_EXT_CLK - * @arg @ref LL_PWR_CMD_RNG_CLK - * @arg @ref LL_PWR_CMD_RTC_CLK - * @arg @ref LL_PWR_CMD_LD_MEM_SLP_CFG - * @arg @ref LL_PWR_CMD_LD_MEM_WKUP_CFG - * @arg @ref LL_PWR_CMD_DPAD_LE_HI (*) - * @arg @ref LL_PWR_CMD_DPAD_LE_LO (*) - * @arg @ref LL_PWR_CMD_SLP_TIMER_MODE_NORMAL (*) - * @arg @ref LL_PWR_CMD_SLP_TIMER_MODE_SINGLE (*) - * @arg @ref LL_PWR_CMD_SLP_TIMER_MODE_RELOAD (*) - * @arg @ref LL_PWR_CMD_SLP_TIMER_MODE_DISABLE (*) - * - * (*) Not available in A0 and B0 - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_req_excute_psc_command(uint32_t command) -{ - WRITE_REG(AON->PSC_CMD_OPC, (uint8_t)command); - SET_BITS(AON->PSC_CMD, AON_PSC_CMD_MCU_PWR_REQ); -} - -/** @} */ - -/** @addtogroup PWR_LL_EF_Communication_Configuration BLE Communication timer and core configuration function - * @{ - */ - -/** - * @brief Enable the Communication Timer Reset. - * @note Comm timer can be reset when all ble connection were disconnected and - * MCU was ready to enter into deepsleep mode. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | COMM_TIMER_RST_N - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_timer_reset(void) -{ - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_COMM_TIMER_RST_N); -} - -/** - * @brief Disable the Communication Timer Reset, and set Communication Timer to running state. - * @note After powered up, Comm Timer need to enter into running mode. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | COMM_TIMER_RST_N - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_comm_timer_reset(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_COMM_TIMER_RST_N); -} - -/** - * @brief Check if the Communication Timer Reset was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | COMM_TIMER_RST_N - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_comm_timer_reset(void) -{ - return ((uint32_t)(READ_BITS(AON->PWR_RET01, AON_PWR_REG01_COMM_TIMER_RST_N) == 0x0U)); -} - -/** - * @brief Enable the Communication Core Reset. - * @note Comm Core can be reset when all ble connection were disconnected and - * MCU was ready to enter into deepsleep mode, and When COMM_CORE_RST_N - * is 0, the ble is held in reset. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | COMM_CORE_RST_N - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_core_reset(void) -{ - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_COMM_CORE_RST_N); -} - -/** - * @brief Disable the Communication Core Reset, and set Communication Core to running state. - * @note After powered up, Comm Core need to enter into running mode. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | COMM_CORE_RST_N - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_comm_core_reset(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_COMM_CORE_RST_N); -} - -/** - * @brief Check if the Communication Core Reset was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | COMM_CORE_RST_N - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_comm_core_reset(void) -{ - return ((uint32_t)(READ_BITS(AON->PWR_RET01, AON_PWR_REG01_COMM_CORE_RST_N) == 0x0U)); -} - -/** - * @brief Enable the Communication Timer Power, the Communication Timer will be Powered Up. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ISO_EN_PD_COMM_TIMER - * CALENDAR_TIMER_CTL | PWR_EN_PD_COMM_TIMER - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_timer_power(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_ISO_EN_PD_COMM_TIMER); - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_TIMER); - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_ISO_EN_PD_COMM_TIMER); -} - -/** - * @brief Disable the Communication Timer Power, the Communication Timer will be Powered Down. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ISO_EN_PD_COMM_TIMER - * CALENDAR_TIMER_CTL | PWR_EN_PD_COMM_TIMER - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_comm_timer_power(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_TIMER); - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_ISO_EN_PD_COMM_TIMER); - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_TIMER); -} - -/** - * @brief Check if the Communication Timer Power was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ISO_EN_PD_COMM_TIMER - * CALENDAR_TIMER_CTL | PWR_EN_PD_COMM_TIMER - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_comm_timer_power(void) -{ - return ((uint32_t)(READ_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_TIMER) == \ - AON_PWR_REG01_PWR_EN_PD_COMM_TIMER)); -} - -/** - * @brief Enable the Communication Core Power, the Communication Core will be Powered Up. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ISO_EN_PD_COMM_CORE - * CALENDAR_TIMER_CTL | PWR_EN_PD_COMM_CORE - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_core_power(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_CORE); - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_ISO_EN_PD_COMM_CORE); -} - -/** - * @brief Disable the Communication Core Power, the Communication Core will be Powered Down. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ISO_EN_PD_COMM_CORE - * CALENDAR_TIMER_CTL | PWR_EN_PD_COMM_CORE - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_comm_core_power(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_CORE); - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_ISO_EN_PD_COMM_CORE); - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_CORE); -} - -/** - * @brief Check if the Communication Core Power was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CALENDAR_TIMER_CTL | ISO_EN_PD_COMM_CORE - * CALENDAR_TIMER_CTL | PWR_EN_PD_COMM_CORE - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_comm_core_power(void) -{ - return ((uint32_t)(READ_BITS(AON->PWR_RET01, AON_PWR_REG01_PWR_EN_PD_COMM_CORE) == \ - AON_PWR_REG01_PWR_EN_PD_COMM_CORE)); -} - -/** - * @brief Select which timer value to read - * - * Register|BitsName - * --------|-------- - * PAD_CTL1 | TIMER_READ_SEL - * - * @param select This parameter can be one of the following values: - * @arg @ref LL_PWR_TIMER_READ_SEL_CAL_TIMER - * @arg @ref LL_PWR_TIMER_READ_SEL_AON_WDT - * @arg @ref LL_PWR_TIMER_READ_SEL_SLP_TIMER - * @arg @ref LL_PWR_TIMER_READ_SEL_CAL_ALARM - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_timer_read_select(uint32_t select) -{ - GLOBAL_EXCEPTION_DISABLE(); - MODIFY_REG(AON->AON_PAD_CTL1, AON_PAD_CTL1_TIMER_READ_SEL, select); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Get which timer value was selected to read. - * - * Register|BitsName - * --------|-------- - * PAD_CTL1 | TIMER_READ_SEL - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_TIMER_READ_SEL_CAL_TIMER - * @arg @ref LL_PWR_TIMER_READ_SEL_AON_WDT - * @arg @ref LL_PWR_TIMER_READ_SEL_SLP_TIMER - * @arg @ref LL_PWR_TIMER_READ_SEL_CAL_ALARM - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_timer_read_select(void) -{ - return ((uint32_t)READ_BITS(AON->AON_PAD_CTL1, AON_PAD_CTL1_TIMER_READ_SEL)); -} - -/** - * @brief Get current timer value based on the selection. - * @note Please read multiple times until get a stable value. - * - * Register|BitsName - * --------|-------- - * PAD_CTL1 | TIMER_READ_SEL - * - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_TIMER_READ_SEL_CAL_TIMER - * @arg @ref LL_PWR_TIMER_READ_SEL_AON_WDT - * @arg @ref LL_PWR_TIMER_READ_SEL_SLP_TIMER - * @arg @ref LL_PWR_TIMER_READ_SEL_CAL_ALARM - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_timer_read_value(void) -{ - return ((uint32_t)READ_REG(AON->TIMER_VAL)); -} - -/** - * @brief Enable high frequency crystal oscillator sleep mode, and diable OSC. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_OSC_SLEEP_EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_osc_sleep(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN); - GLOBAL_EXCEPTION_ENABLE(); -} - - -/** - * @brief Disable high frequency crystal oscillator sleep mode. - * @note Switch OSC from sleep mode into normal active mode. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_OSC_SLEEP_EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_osc_sleep(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if the OSC sleep mode was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_OSC_SLEEP_EN - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_osc_sleep(void) -{ - return ((uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN) == \ - AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN)); -} - -/** - * @brief Enable Radio sleep mode, and disable Radio module. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_RADIO_SLEEP_EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_radio_sleep(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable Radio sleep mode. - * @note Switch Radio from sleep mode into normal active mode. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_RADIO_SLEEP_EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_radio_sleep(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if the Radio sleep mode was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_RADIO_SLEEP_EN - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_radio_sleep(void) -{ - return ((uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN) == \ - AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN)); -} - -/** - * @brief Enable Communication Core Deep Sleep Mode. - * @note This bit is reset on DEEP_SLEEP_STAT falling edge. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_DEEP_SLEEP_ON - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_core_deep_sleep(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable Communication Core Deep Sleep Mode. - * @note Switch Communication Core from sleep mode into normal active mode. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_DEEP_SLEEP_ON - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_comm_core_deep_sleep(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if the Communication Core Deep Sleep Mode was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_DEEP_SLEEP_ON - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_comm_core_deep_sleep(void) -{ - return ((uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON) == \ - AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON)); -} - -/** - * @brief Enable Wake Up Request from Software. - * @note Applies when system is in Deep Sleep Mode. It wakes up the Communication Core - * when written with a 1. No action happens if it is written with 0. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_soft_wakeup_req(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if the Wake Up Request was enabled or disabled. - * @note Resets at 0 means request action is performed. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_soft_wakeup_req(void) -{ - return ((uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ) == \ - AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ)); -} - -/** - * @brief Enable Communication Core external wakeup. - * @note After this configuration, Communication Core can be woken up by external wake-up - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_EXTWKUPDSB - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_enable_comm_core_ext_wakeup(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - CLEAR_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_EXTWKUPDSB); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Disable Communication Core external wakeup. - * @note After this configuration, Communication Core cannot be woken up by external wake-up - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_EXTWKUPDSB - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_comm_core_ext_wakeup(void) -{ - GLOBAL_EXCEPTION_DISABLE(); - SET_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_EXTWKUPDSB); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Check if the Communication Core external wakeup was enabled or disabled. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_EXTWKUPDSB - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_enabled_comm_core_ext_wakeup(void) -{ - return ((uint32_t)(READ_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_EXTWKUPDSB) == 0x0U)); -} - -/** - * @brief Set the time in low_power_clk clock cycles to spend in Deep Sleep Mode before waking-up the device. - * - * Register|BitsName - * --------|-------- - * COMM_TMR_DEEPSLWKUP | AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME - * - * @param time 32 bit clock cycles loaded into the AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_comm_core_wakeup_time(uint32_t time) -{ - WRITE_REG(AON->PWR_RET28, time); -} - -/** - * @brief Get the time in low_power_clk clock cycles to spend in Deep Sleep Mode before waking-up the device. - * - * Register|BitsName - * --------|-------- - * COMM_TMR_DEEPSLWKUP | AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME - * - * @retval Clock cycles to spend in Deep Sleep Mode before waking-up the device - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_comm_wakeup_time(void) -{ - return ((uint32_t)READ_REG(AON->PWR_RET28)); -} - - -/** - * @brief Get the actual duration of the last deep sleep phase measured in low_power_clk clock cycle. - * - * Register|BitsName - * --------|-------- - * COMM_TMR_DEEPSLPSTAT | DEEPSLDUR - * - * @retval Sleep duration - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_comm_sleep_duration(void) -{ - return ((uint32_t)READ_REG(MCU_SUB->COMM_TMR_DEEPSLPSTAT)); -} - -/** - * @brief Set the wakeup timing in low_power_clk clock cycles to spend when waking-up the device. - * - * Register|BitsName - * --------|-------- - * COMM_TMR_ENBPRESET | TWEXT - * COMM_TMR_ENBPRESET | TWOSC - * COMM_TMR_ENBPRESET | TWRM - * - * @param twext Time in low power oscillator cycles allowed for stabilization of the high frequency - * oscillator following an external wake–up request (signal wakeup_req). - * @param twosc Time in low power oscillator cycles allowed for stabilization of the high frequency - * oscillator when the deep–sleep mode has been left due to sleep–timer expiry. - * @param twrm Time in low power oscillator cycles allowed for the radio module to leave low–power mode. - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_set_comm_wakeup_timing(uint32_t twext, uint32_t twosc, uint32_t twrm) -{ - WRITE_REG(AON->PWR_RET29, (twext << AON_COMM_TMR_ENBPRESET_TWEXT_Pos) | - (twosc << AON_COMM_TMR_ENBPRESET_TWOSC_Pos) | - (twrm << AON_COMM_TMR_ENBPRESET_TWRM_Pos)); -} - - -/** - * @brief Read the wakeup timing in low_power_clk clock cycles to spend when waking-up the device. - * - * Register|BitsName - * --------|-------- - * COMM_TMR_ENBPRESET | TWEXT - * COMM_TMR_ENBPRESET | TWOSC - * COMM_TMR_ENBPRESET | TWRM - * - * @retval COMM_TMR_ENBPRESET Register value - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_read_comm_wakeup_timing(void) -{ - return ((uint32_t)READ_REG(AON->PWR_RET29)); -} - -/** - * @brief Read the Twosc of the wakeup timing in low_power_clk clock cycles to spend when waking-up the device. - * - * @retval TWOSC value - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_read_comm_wakeup_timing_twosc(void) -{ - return ((((uint32_t)READ_REG(AON->PWR_RET29) & AON_COMM_TMR_ENBPRESET_TWOSC_Msk)) >> \ - AON_COMM_TMR_ENBPRESET_TWOSC_Pos); -} - - -/** @} */ - -/** @defgroup PWR_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get the External Wake Up Status. - * @note 0 means not waked up and 1 means waked up. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | EXT_WKUP_STATUS - * - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_get_ext_wakeup_status(void) -{ - return ((uint32_t)(READ_BITS(AON->SLP_EVENT, AON_SLP_EVENT_EXT_WKUP_STATUS) >> \ - AON_SLP_EVENT_EXT_WKUP_STATUS_Pos) & \ - (uint32_t)(READ_BITS(AON->EXT_WKUP_CTL, LL_PWR_EXTWKUP_PIN_ALL))); -} - -/** - * @brief Clear the External Wake Up Status. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | EXT_WKUP_STATUS - * - * @param wakeup_pin This parameter can be a combination of the following values: - * @arg @ref LL_PWR_EXTWKUP_PIN0 - * @arg @ref LL_PWR_EXTWKUP_PIN1 - * @arg @ref LL_PWR_EXTWKUP_PIN2 - * @arg @ref LL_PWR_EXTWKUP_PIN3 - * @arg @ref LL_PWR_EXTWKUP_PIN4 - * @arg @ref LL_PWR_EXTWKUP_PIN5 - * @arg @ref LL_PWR_EXTWKUP_PIN_ALL - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_clear_ext_wakeup_status(uint32_t wakeup_pin) -{ - GLOBAL_EXCEPTION_DISABLE(); - WRITE_REG(AON->SLP_EVENT, ~(wakeup_pin << AON_SLP_EVENT_EXT_WKUP_STATUS_Pos)); - GLOBAL_EXCEPTION_ENABLE(); -} - -/** - * @brief Clear the Event that triggered the DeepSleep WakeUp. - * - * Register|BitsName - * --------|-------- - * SLP_EVENT | SMCOSCEN_EVENT - * SLP_EVENT | TIMER_EVENT - * SLP_EVENT | EXT_WKUP_EVENT - * SLP_EVENT | WATCHDOG_EVENT - * - * @param event This parameter can be a combination of the following values: - * @arg @ref LL_PWR_WKUP_EVENT_BLE - * @arg @ref LL_PWR_WKUP_EVENT_TIMER - * @arg @ref LL_PWR_WKUP_EVENT_EXT - * @arg @ref LL_PWR_WKUP_EVENT_BOD_FEDGE - * @arg @ref LL_PWR_WKUP_EVENT_MSIO_COMP - * @arg @ref LL_PWR_WKUP_EVENT_WDT - * @arg @ref LL_PWR_WKUP_EVENT_CALENDAR - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_clear_wakeup_event(uint32_t event) -{ - WRITE_REG(AON->SLP_EVENT, ~(event & LL_PWR_WKUP_EVENT_ALL)); -} - -/** - * @brief Indicate if the Power State Controller is in busy state. - * @note This is bit set 1 when the PSC_CMD_REQ[0] is set to 1, and will remain 1 until - * the PSC_CMD_OPC has been transferred to the PSC. - * - * Register|BitsName - * --------|-------- - * PSC_CMD | MCU_PWR_BUSY - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_active_flag_psc_cmd_busy(void) -{ - return (READ_BITS(AON->PSC_CMD, AON_PSC_CMD_MCU_PWR_BUSY) == AON_PSC_CMD_MCU_PWR_BUSY); -} - -/** - * @brief Indicate if the Communication Core is in Deep Sleep Mode. - * @note When Communication Core is in Deep Sleep Mode, only low_power_clk is running. - * - * Register|BitsName - * --------|-------- - * MSIO_PAD_CFG_1 | COMM_DEEPSLCNTL_DEEP_SLEEP_STAT - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_pwr_is_active_flag_comm_deep_sleep_stat(void) -{ - return (READ_BITS(AON->MSIO_PAD_CFG_1, AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT) == AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT); -} - -/** - * @brief Disable cache function - * @note The cache should be closed before chip go to deepsleep. - * - * Register|BitsName - * --------|-------- - * CTRL0 |EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_pwr_disable_cache_module(void) -{ - SET_BITS(XQSPI->CACHE.CTRL0, XQSPI_CACHE_CTRL0_DIS); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); -} - -/** @} */ - -/** @} */ -/** @} */ - -#endif /* defined(AON) */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_PWR_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_rng.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_rng.h deleted file mode 100755 index dc382b1..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_rng.h +++ /dev/null @@ -1,667 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_rng.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of RNG LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_RNG RNG - * @brief RNG LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_RNG_H__ -#define __GR55XX_LL_RNG_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (RNG) - -/** @defgroup RNG_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RNG_LL_ES_INIT RNG Exported Init structures - * @{ - */ - -/** - * @brief LL RNG Init Structure definition - */ -typedef struct _ll_rng_init { - uint32_t seed; /**< Specifies the seed source for the LFSR. - This parameter can be a value of @ref RNG_LL_EC_SEED_SOURCE */ - - uint32_t lfsr_mode; /**< Specifies the configuration mode for the LFSR. - This parameter can be a value of @ref RNG_LL_EC_LFSR_MODE */ - - uint32_t out_mode; /**< Specifies the Output mode for the RNG. - This parameter can be a value of @ref RNG_LL_EC_OUTPUT_MODE */ - - uint32_t post_mode; /**< Specifies post-process configuration for the RNG. - This parameter can be a value of @ref RNG_LL_EC_POST_PRO */ - - uint32_t interrupt; /**< Specifies interrupt configuration for the RNG. - This parameter can be a value of @ref RNG_LL_EC_IT */ -} ll_rng_init_t; - -/** @} */ - -/** @} */ - -/** @defgroup RNG_LL_MACRO Defines - * @{ - */ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RNG_LL_Exported_Constants RNG Exported Constants - * @{ - */ - -/** @defgroup RNG_LL_EC_SEED_SOURCE LFSR seed source - * @{ - */ -#define LL_RNG_SEED_FR0_S0 (4UL << RNG_CONFIG_LFSR_SEED_SEL_Pos) /**< LFSR seed is from the - switching oscillator s0. */ -#define LL_RNG_SEED_USER (6UL << RNG_CONFIG_LFSR_SEED_SEL_Pos) /**< LFSR seed is configured - by users. */ -/** @} */ - -/** @defgroup RNG_LL_EC_LFSR_MODE LFSR configuration mode - * @{ - */ -#define LL_RNG_LFSR_MODE_59BIT (0x00000000UL) /**< 59 bit LFSR. */ -#define LL_RNG_LFSR_MODE_128BIT (1UL << RNG_CONFIG_LFSR_MODE_Pos) /**< 128 bit LFSR. */ -/** @} */ - -/** @defgroup RNG_LL_EC_POST_PRO Post-process mode - * @{ - */ -#define LL_RNG_POST_PRO_NOT (0x00000000UL) /**< No post process. */ -#define LL_RNG_POST_PRO_SKIPPING (1UL << RNG_CONFIG_POST_MODE_Pos) /**< bit skipping. */ -#define LL_RNG_POST_PRO_COUNTING (2UL << RNG_CONFIG_POST_MODE_Pos) /**< bit counting. */ -#define LL_RNG_POST_PRO_NEUMANN (3UL << RNG_CONFIG_POST_MODE_Pos) /**< Von-Neumann. */ -/** @} */ - -/** @defgroup RNG_LL_EC_IT RNG hardware interrupt enable. - * @{ - */ -#define LL_RNG_IT_DISABLE (0x00000000UL) /**< Disable RNG interrupt. */ -#define LL_RNG_IT_ENABLE (1UL << RNG_CONFIG_IRQ_EN_Pos) /**< Enable RNG interrupt. */ -/** @} */ - -/** @defgroup RNG_LL_EC_OUTPUT_MODE RNG Output mode - * @{ - */ -#define LL_RNG_OUTPUT_FR0_S0 (4UL << RNG_CONFIG_OUT_MODE_Pos) /**< Digital RNG direct output, - ring oscillator s0. */ -#define LL_RNG_OUTPUT_CYCLIC_PARITY (6UL << RNG_CONFIG_OUT_MODE_Pos) /**< LFSR and RNG cyclic sampling - and parity generation. */ -#define LL_RNG_OUTPUT_CYCLIC (7UL << RNG_CONFIG_OUT_MODE_Pos) /**< LFSR and RNG cyclic sampling. */ -#define LL_RNG_OUTPUT_LFSR_RNG (8UL << RNG_CONFIG_OUT_MODE_Pos) /**< LFSR ⊕ RNG. */ -#define LL_RNG_OUTPUT_LFSR (9UL << RNG_CONFIG_OUT_MODE_Pos) /**< LFSR direct output. */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RNG_LL_Exported_Macros RNG Exported Macros - * @{ - */ - -/** @defgroup RNG_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in RNG register - * @param __instance__ RNG instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None. - */ -#define LL_RNG_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in RNG register - * @param __instance__ RNG instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_RNG_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) -/** @} */ - -/** @} */ -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup RNG_LL_Exported_Functions Functions - * @{ - */ - -/** @defgroup RNG_LL_EF_Configuration RNG Configuration functions - * @{ - */ - -/** - * @brief Enable Random Number Generation. - * - * Register|BitsName - * --------|-------- - * CTRL | RNG_RUN - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_enable(rng_regs_t *RNGx) -{ - SET_BITS(RNGx->CTRL, RNG_CTRL_RUN_EN); -} - -/** - * @brief Disable Random Number Generation. - * - * Register|BitsName - * --------|-------- - * CTRL | RNG_RUN - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_disable(rng_regs_t *RNGx) -{ - CLEAR_BITS(RNGx->CTRL, RNG_CTRL_RUN_EN); -} - -/** - * @brief Check if Random Number Generator is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | RNG_RUN - * - * @param RNGx RNG instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_rng_is_enabled(rng_regs_t *RNGx) -{ - return (READ_BITS(RNGx->CTRL, RNG_CTRL_RUN_EN) == (RNG_CTRL_RUN_EN)); -} - -/** - * @brief Enable Ring oscillator TRNG enabled signal. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_FRO_EN - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_enable_fro(rng_regs_t *RNGx) -{ - SET_BITS(RNGx->CONFIG, RNG_CONFIG_FRO_EN); -} - -/** - * @brief Disable Ring oscillator TRNG enabled signal. - * - * Register|BitsName - * --------|-------- - * CTRL | RNG_RUN - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_disable_fro(rng_regs_t *RNGx) -{ - CLEAR_BITS(RNGx->CONFIG, RNG_CONFIG_FRO_EN); -} - -/** - * @brief Check if Ring oscillator TRNG enabled signal is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | RNG_RUN - * - * @param RNGx RNG instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_rng_fro_is_enabled(rng_regs_t *RNGx) -{ - return (READ_BITS(RNGx->CONFIG, RNG_CONFIG_FRO_EN) == (RNG_CONFIG_FRO_EN)); -} - -/** - * @brief Set source of LFSR seed. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_LFSR_SEED_SEL - * - * @param RNGx RNG instance. - * @param seed This parameter can be one of the following values: - * @arg @ref LL_RNG_SEED_FR0_S0 - * @arg @ref LL_RNG_SEED_USER - * @retval None - */ -__STATIC_INLINE void ll_rng_set_lfsr_seed(rng_regs_t *RNGx, uint32_t seed) -{ - MODIFY_REG(RNGx->CONFIG, RNG_CONFIG_LFSR_SEED_SEL, seed); -} - -/** - * @brief Get source of LFSR seed. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_LFSR_SEED_SEL - * - * @param RNGx RNG instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RNG_SEED_FR0_S0 - * @arg @ref LL_RNG_SEED_USER - */ -__STATIC_INLINE uint32_t ll_rng_get_lfsr_seed(rng_regs_t *RNGx) -{ - return READ_BITS(RNGx->CONFIG, RNG_CONFIG_LFSR_SEED_SEL); -} - -/** - * @brief Set LFSR configuration mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_LFSR_MODE - * - * @param RNGx RNG instance. - * @param mode This parameter can be one of the following values: - * @arg @ref LL_RNG_LFSR_MODE_59BIT - * @arg @ref LL_RNG_LFSR_MODE_128BIT - * @retval None - */ -__STATIC_INLINE void ll_rng_set_lfsr_mode(rng_regs_t *RNGx, uint32_t mode) -{ - MODIFY_REG(RNGx->CONFIG, RNG_CONFIG_LFSR_MODE, mode); -} - -/** - * @brief Get LFSR configuration mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_LFSR_MODE - * - * @param RNGx RNG instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RNG_LFSR_MODE_59BIT - * @arg @ref LL_RNG_LFSR_MODE_128BIT - */ -__STATIC_INLINE uint32_t ll_rng_get_lfsr_mode(rng_regs_t *RNGx) -{ - return READ_BITS(RNGx->CONFIG, RNG_CONFIG_LFSR_MODE); -} - -/** - * @brief Set RNG post-process configuration. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_POST_MODE - * - * @param RNGx RNG instance. - * @param post This parameter can be one of the following values: - * @arg @ref LL_RNG_POST_PRO_NOT - * @arg @ref LL_RNG_POST_PRO_SKIPPING - * @arg @ref LL_RNG_POST_PRO_COUNTING - * @arg @ref LL_RNG_POST_PRO_NEUMANN - * @retval None - */ -__STATIC_INLINE void ll_rng_set_post_mode(rng_regs_t *RNGx, uint32_t post) -{ - MODIFY_REG(RNGx->CONFIG, RNG_CONFIG_POST_MODE, post); -} - -/** - * @brief Get RNG post-process configuration. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_POST_MODE - * - * @param RNGx RNG instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RNG_POST_PRO_NOT - * @arg @ref LL_RNG_POST_PRO_SKIPPING - * @arg @ref LL_RNG_POST_PRO_COUNTING - * @arg @ref LL_RNG_POST_PRO_NEUMANN - */ -__STATIC_INLINE uint32_t ll_rng_get_post_mode(rng_regs_t *RNGx) -{ - return READ_BITS(RNGx->CONFIG, RNG_CONFIG_POST_MODE); -} - -/** - * @brief set RNG output mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_OUT_MODE - * - * @param RNGx RNG instance. - * @param mode This parameter can be one of the following values: - * @arg @ref LL_RNG_OUTPUT_FR0_S0 - * @arg @ref LL_RNG_OUTPUT_CYCLIC_PARITY - * @arg @ref LL_RNG_OUTPUT_CYCLIC - * @arg @ref LL_RNG_OUTPUT_LFSR_RNG - * @arg @ref LL_RNG_OUTPUT_LFSR - * @retval None - */ -__STATIC_INLINE void ll_rng_set_output_mode(rng_regs_t *RNGx, uint32_t mode) -{ - MODIFY_REG(RNGx->CONFIG, RNG_CONFIG_OUT_MODE, mode); -} - -/** - * @brief get RNG output mode. - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_OUT_MODE - * - * @param RNGx RNG instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RNG_OUTPUT_FR0_S0 - * @arg @ref LL_RNG_OUTPUT_CYCLIC_PARITY - * @arg @ref LL_RNG_OUTPUT_CYCLIC - * @arg @ref LL_RNG_OUTPUT_LFSR_RNG - * @arg @ref LL_RNG_OUTPUT_LFSR - */ -__STATIC_INLINE uint32_t ll_rng_get_output_mode(rng_regs_t *RNGx) -{ - return READ_BITS(RNGx->CONFIG, RNG_CONFIG_OUT_MODE); -} - -/** - * @brief set the waiting time that RNG input reaches stable. - * - * Register|BitsName - * --------|-------- - * TSCON | RNG_TRDY_TIME - * - * @param RNGx RNG instance. - * @param time range between 0x1 and 0xFF. - * @retval None - */ -__STATIC_INLINE void ll_rng_set_trdy_time(rng_regs_t *RNGx, uint32_t time) -{ - MODIFY_REG(RNGx->TSCON, RNG_TSCON_TRDY_TIME, time); -} - -/** - * @brief get the waiting time that RNG input reaches stable. - * - * Register|BitsName - * --------|-------- - * TSCON | RNG_TRDY_TIME - * - * @param RNGx RNG instance. - * @retval Between Min_Time = 0 and Max_Time = 0xFF - */ -__STATIC_INLINE uint32_t ll_rng_get_trdy_time(rng_regs_t *RNGx) -{ - return READ_BITS(RNGx->TSCON, RNG_TSCON_TRDY_TIME); -} - - -/** - * @brief set RNG seed configured by user. - * - * Register|BitsName - * --------|-------- - * USER | RNG_USER_SEED - * - * @param RNGx RNG instance. - * @param seed range between 0x1 and 0xFFFF. - * @retval None - */ -__STATIC_INLINE void ll_rng_set_user_seed(rng_regs_t *RNGx, uint32_t seed) -{ - WRITE_REG(RNGx->USER_SEED, seed); -} - -/** @} */ - -/** @defgroup RNG_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Indicate if the Flag of RNG long run test is set or not. - * - * Register |BitsName - * ---------|-------- - * LR_STATUS| RNG_LR_FLAG - * - * @param RNGx RNG instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_rng_is_active_flag_lr(rng_regs_t *RNGx) -{ - return (READ_BITS(RNGx->LR_STATUS, RNG_LR_STATUS_FLAG) == (RNG_LR_STATUS_FLAG)); -} - -/** - * @brief Indicate if the RNG Status Flag is set or not. - * - * Register|BitsName - * --------|-------- - * STATUS | RNG_READY - * - * @param RNGx RNG instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_rng_is_active_flag_sts(rng_regs_t *RNGx) -{ - return (READ_BITS(RNGx->STATUS, RNG_STATUS_READY) == (RNG_STATUS_READY)); -} - -/** - * @brief Clear RNG Status flag. - * - * Register|BitsName - * --------|-------- - * STATUS | RNG_READY - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_clear_flag_sts(rng_regs_t *RNGx) -{ - WRITE_REG(RNGx->STATUS, RNG_STATUS_READY); -} - -/** @} */ - -/** @defgroup RNG_LL_EF_IT_Management IT Management - * @{ - */ - -/** - * @brief Enable Random Number Generator Interrupt - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_IRQ_EN - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_enable_it(rng_regs_t *RNGx) -{ - SET_BITS(RNGx->CONFIG, RNG_CONFIG_IRQ_EN); -} - -/** - * @brief Disable Random Number Generator Interrupt - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_IRQ_EN - * - * @param RNGx RNG instance. - * @retval None - */ -__STATIC_INLINE void ll_rng_disable_it(rng_regs_t *RNGx) -{ - CLEAR_BITS(RNGx->CONFIG, RNG_CONFIG_IRQ_EN); -} - -/** - * @brief Check if Random Number Generator Interrupt is enabled - * - * Register|BitsName - * --------|-------- - * CONFIG | RNG_IRQ_EN - * - * @param RNGx RNG instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_rng_is_enabled_it(rng_regs_t *RNGx) -{ - return (READ_BITS(RNGx->CONFIG, RNG_CONFIG_IRQ_EN) == (RNG_CONFIG_IRQ_EN)); -} - -/** @} */ - -/** @defgroup RNG_LL_EF_Data_Management Data Management - * @{ - */ - -/** - * @brief Return32-bit Random Number value - * - * Register|BitsName - * --------|-------- - * DATA | RNG_DATA - * - * @param RNGx RNG instance. - * @retval Generated 32-bit random value - */ -__STATIC_INLINE uint32_t ll_rng_read_random_data32(rng_regs_t *RNGx) -{ - return (uint32_t)(READ_REG(RNGx->DATA)); -} - -/** - * @brief Return8-bit RNG Long Run Test counts. - * - * Register |BitsName - * ---------|-------- - * LR_STATUS| RNG_LR_CNT - * - * @param RNGx RNG instance. - * @retval Output Data[7:0] - */ -__STATIC_INLINE uint32_t ll_rng_read_lr_count(rng_regs_t *RNGx) -{ - return READ_BITS(RNGx->LR_STATUS, RNG_LR_STATUS_CNT) >> RNG_LR_STATUS_CNT_Pos; -} - -/** @} */ - -/** @defgroup RNG_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize the RNG registers to their default reset values. - * @param RNGx RNG instance. - * @retval An error_status_t enumeration value: - * - SUCCESS: RNG registers are de-initialized - * - ERROR: RNG registers are not de-initialized - */ -error_status_t ll_rng_deinit(rng_regs_t *RNGx); - -/** - * @brief Initialize RNG registers according to the specified - * parameters in p_rng_init. - * @param RNGx RNG Instance - * @param p_rng_init Pointer to a ll_rng_init_t structure that contains the configuration - * information for the specified RNG peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: RNG registers are initialized according to p_rng_init content - * - ERROR: Problem occurred during RNG Registers initialization - */ -error_status_t ll_rng_init(rng_regs_t *RNGx, ll_rng_init_t *p_rng_init); - -/** - * @brief Set each field of a @ref ll_rng_init_t type structure to default value. - * @param p_rng_init Pointer to a @ref ll_rng_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_rng_struct_init(ll_rng_init_t *p_rng_init); - -/** @} */ - -/** @} */ - -#endif /* RNG */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_RNG_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_spi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_spi.h deleted file mode 100755 index f3c7701..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_spi.h +++ /dev/null @@ -1,2371 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_spi.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of SPI LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_SPI SPI - * @brief SPI LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_SPI_H__ -#define __GR55xx_LL_SPI_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (SPIM) || defined (SPIS) || defined (QSPI0) || defined (QSPI1) - -/** @defgroup LL_SPI_DRIVER_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SPI_LL_ES_INIT SPI Exported init structure - * @{ - */ - -/** - * @brief LL SPIM init structures definition - */ -typedef struct _ll_spim_init_t { - uint32_t transfer_direction; /**< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_transfer_direction(). */ - - uint32_t data_size; /**< Specifies the SPI data size. - This parameter can be a value of @ref SPI_LL_EC_DATASIZE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_data_size(). */ - - uint32_t clock_polarity; /**< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_LL_EC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_clock_polarity(). */ - - uint32_t clock_phase; /**< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_LL_EC_PHASE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_clock_phase(). */ - - uint32_t slave_select; /**< Specifies the SPI slave select. - This parameter can be a value of @ref SPI_LL_EC_SLAVESELECT. - - This feature can be modified afterwards using unitary function - @ref ll_spi_enable_ss(). */ - - uint32_t baud_rate; /**< Specifies the BaudRate prescaler value which will be used to - configure the transmit and receive SCK clock. - This parameter can be one even value between 2 and 65534, - if the value is 0, the SCLK is disable. - @note The communication clock is derived from the master clock. - The slave clock does not need to be set. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_baud_rate_prescaler(). */ -} ll_spim_init_t; - -/** - * @brief SPIS init structures definition - */ -typedef struct _ll_spis_init_t { - uint32_t data_size; /**< Specifies the SPI data width. - This parameter can be a value of @ref SPI_LL_EC_DATASIZE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_data_size(). */ - - uint32_t clock_polarity; /**< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_LL_EC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_clock_polarity(). */ - - uint32_t clock_phase; /**< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_LL_EC_PHASE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_clock_phase(). */ -} ll_spis_init_t; - -/** - * @brief QSPI init structures definition - */ -typedef struct _ll_qspi_init_t { - uint32_t transfer_direction; /**< Specifies the QSPI transfer or receive mode. - This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_transfer_direction(). */ - - uint32_t instruction_size; /**< Specifies the QSPI instruction width. - This parameter can be a value of @ref SPI_LL_EC_INSTRUCTIONSIZE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_instruction_size(). */ - - uint32_t address_size; /**< Specifies the QSPI address width. - This parameter can be a value of @ref SPI_LL_EC_ADDRESSSIZE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_address_size(). */ - - uint32_t inst_addr_transfer_format; /**< Specifies the QSPI instruction and address transfer format. - This parameter can be a value of - @ref SPI_LL_EC_ADDRINSTTRNASFERFORMAT. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_add_inst_transfer_format(). */ - - uint32_t wait_cycles; /**< Specifies the QSPI dummy clock. - This parameter can be one of the following values: 0 ~ 31. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_wait_cycles(). */ - - uint32_t data_size; /**< Specifies the SPI data width. - This parameter can be a value of @ref SPI_LL_EC_DATASIZE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_data_size(). */ - - uint32_t clock_polarity; /**< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_LL_EC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_clock_polarity(). */ - - uint32_t clock_phase; /**< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_LL_EC_PHASE. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_clock_phase(). */ - - uint32_t baud_rate; /**< Specifies the BaudRate prescaler value which will be used to - configure the transmit and receive SCK clock. - This parameter can be one even value between 2 and 65534, - if the value is 0, the SCLK is disable. - @note The communication clock is derived from the master clock. - The slave clock does not need to be set. - - This feature can be modified afterwards using unitary function - @ref ll_spi_set_baud_rate_prescaler(). */ - - uint32_t rx_sample_delay; /**< Specifies the RX sample delay. - It is used to delay the sample of the RX input port. - This parameter can be a number between 0 and 0x7 */ -} ll_qspi_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup SPI_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags definitions which can be used with LL_SPI_ReadReg function - * @{ - */ -#define LL_SSI_SR_DCOL SSI_STAT_DCOL /**< Data collision error flag */ -#define LL_SSI_SR_TXE SSI_STAT_TXE /**< Transmission error flag */ -#define LL_SSI_SR_RFF SSI_STAT_RFF /**< Rx FIFO full flag */ -#define LL_SSI_SR_RFNE SSI_STAT_RFNE /**< Rx FIFO not empty flag */ -#define LL_SSI_SR_TFE SSI_STAT_TFE /**< Tx FIFO empty flag */ -#define LL_SSI_SR_TFNF SSI_STAT_TFNF /**< Tx FIFO not full flag */ -#define LL_SSI_SR_BUSY SSI_STAT_BUSY /**< Busy flag */ -/** @} */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief Interrupt definitions which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_SSI_IM_MST SSI_INTMASK_MSTIM /**< Multi-Master Contention Interrupt - enable */ -#define LL_SSI_IM_RXF SSI_INTMASK_RXFIM /**< Receive FIFO Full Interrupt - enable */ -#define LL_SSI_IM_RXO SSI_INTMASK_RXOIM /**< Receive FIFO Overflow Interrupt - enable */ -#define LL_SSI_IM_RXU SSI_INTMASK_RXUIM /**< Receive FIFO Underflow Interrupt - enable */ -#define LL_SSI_IM_TXO SSI_INTMASK_TXOIM /**< Transmit FIFO Overflow Interrupt - enable */ -#define LL_SSI_IM_TXE SSI_INTMASK_TXEIM /**< Transmit FIFO Empty Interrupt - enable */ - -#define LL_SSI_IS_MST SSI_INTSTAT_MSTIS /**< Multi-Master Contention Interrupt - flag */ -#define LL_SSI_IS_RXF SSI_INTSTAT_RXFIS /**< Receive FIFO Full Interrupt flag */ -#define LL_SSI_IS_RXO SSI_INTSTAT_RXOIS /**< Receive FIFO Overflow Interrupt - flag */ -#define LL_SSI_IS_RXU SSI_INTSTAT_RXUIS /**< Receive FIFO Underflow Interrupt - flag */ -#define LL_SSI_IS_TXO SSI_INTSTAT_TXOIS /**< Transmit FIFO Overflow Interrupt - flag */ -#define LL_SSI_IS_TXE SSI_INTSTAT_TXEIS /**< Transmit FIFO Empty Interrupt - flag */ - -#define LL_SSI_RIS_MST SSI_RAW_INTSTAT_MSTIR /**< Multi-Master Contention RAW Interrupt - flag */ -#define LL_SSI_RIS_RXF SSI_RAW_INTSTAT_RXFIR /**< Receive FIFO Full RAW Interrupt - flag */ -#define LL_SSI_RIS_RXO SSI_RAW_INTSTAT_RXOIR /**< Receive FIFO Overflow RAW Interrupt - flag */ -#define LL_SSI_RIS_RXU SSI_RAW_INTSTAT_RXUIR /**< Receive FIFO Underflow RAW Interrupt - flag */ -#define LL_SSI_RIS_TXO SSI_RAW_INTSTAT_TXOIR /**< Transmit FIFO Overflow RAW Interrupt - flag */ -#define LL_SSI_RIS_TXE SSI_RAW_INTSTAT_TXEIR /**< Transmit FIFO Empty RAW Interrupt - flag */ -/** @} */ - -/** @defgroup SPI_LL_EC_SPIFRAMEFORMAT SPI Frame Format - * @{ - */ -#define LL_SSI_FRF_SPI 0x00000000UL /**< SPI frame format for transfer */ -#define LL_SSI_FRF_DUALSPI (1UL << SSI_CTRL0_SPIFRF_Pos) /**< Dual-SPI frame format for transfer */ -#define LL_SSI_FRF_QUADSPI (2UL << SSI_CTRL0_SPIFRF_Pos) /**< Quad-SPI frame format for transfer */ -/** @} */ - -/** @defgroup SPI_LL_EC_DATASIZE Datawidth - * @{ - */ -#define LL_SSI_DATASIZE_4BIT (3UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 4 bits */ -#define LL_SSI_DATASIZE_5BIT (4UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 5 bits */ -#define LL_SSI_DATASIZE_6BIT (5UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 6 bits */ -#define LL_SSI_DATASIZE_7BIT (6UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 7 bits */ -#define LL_SSI_DATASIZE_8BIT (7UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 8 bits */ -#define LL_SSI_DATASIZE_9BIT (8UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 9 bits */ -#define LL_SSI_DATASIZE_10BIT (9UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 10 bits */ -#define LL_SSI_DATASIZE_11BIT (10UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 11 bits */ -#define LL_SSI_DATASIZE_12BIT (11UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 12 bits */ -#define LL_SSI_DATASIZE_13BIT (12UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 13 bits */ -#define LL_SSI_DATASIZE_14BIT (13UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 14 bits */ -#define LL_SSI_DATASIZE_15BIT (14UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 15 bits */ -#define LL_SSI_DATASIZE_16BIT (15UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 16 bits */ -#define LL_SSI_DATASIZE_17BIT (16UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 17 bits */ -#define LL_SSI_DATASIZE_18BIT (17UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 18 bits */ -#define LL_SSI_DATASIZE_19BIT (18UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 19 bits */ -#define LL_SSI_DATASIZE_20BIT (19UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 20 bits */ -#define LL_SSI_DATASIZE_21BIT (20UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 21 bits */ -#define LL_SSI_DATASIZE_22BIT (21UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 22 bits */ -#define LL_SSI_DATASIZE_23BIT (22UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 23 bits */ -#define LL_SSI_DATASIZE_24BIT (23UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 24 bits */ -#define LL_SSI_DATASIZE_25BIT (24UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 25 bits */ -#define LL_SSI_DATASIZE_26BIT (25UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 26 bits */ -#define LL_SSI_DATASIZE_27BIT (26UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 27 bits */ -#define LL_SSI_DATASIZE_28BIT (27UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 28 bits */ -#define LL_SSI_DATASIZE_29BIT (28UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 29 bits */ -#define LL_SSI_DATASIZE_30BIT (29UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 30 bits */ -#define LL_SSI_DATASIZE_31BIT (30UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 31 bits */ -#define LL_SSI_DATASIZE_32BIT (31UL << SSI_CTRL0_DFS32_Pos) /**< Data length for SPI transfer: 32 bits */ -/** @} */ - -/** @defgroup SPI_LL_EC_MICROWIRECOMMANDSIZE MicroWire CommandSize - * @{ - */ -#define LL_SSI_MW_CMDSIZE_1BIT 0x00000000UL /**< CMD length for Microwire - transfer: 1 bits */ -#define LL_SSI_MW_CMDSIZE_2BIT (1UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 2 bits */ -#define LL_SSI_MW_CMDSIZE_3BIT (2UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 3 bits */ -#define LL_SSI_MW_CMDSIZE_4BIT (3UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 4 bits */ -#define LL_SSI_MW_CMDSIZE_5BIT (4UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 5 bits */ -#define LL_SSI_MW_CMDSIZE_6BIT (5UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 6 bits */ -#define LL_SSI_MW_CMDSIZE_7BIT (6UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 7 bits */ -#define LL_SSI_MW_CMDSIZE_8BIT (7UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 8 bits */ -#define LL_SSI_MW_CMDSIZE_9BIT (8UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 9 bits */ -#define LL_SSI_MW_CMDSIZE_10BIT (9UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 10 bits */ -#define LL_SSI_MW_CMDSIZE_11BIT (10UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 11 bits */ -#define LL_SSI_MW_CMDSIZE_12BIT (11UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 12 bits */ -#define LL_SSI_MW_CMDSIZE_13BIT (12UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 13 bits */ -#define LL_SSI_MW_CMDSIZE_14BIT (13UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 14 bits */ -#define LL_SSI_MW_CMDSIZE_15BIT (14UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 15 bits */ -#define LL_SSI_MW_CMDSIZE_16BIT (15UL << SSI_CTRL0_CFS_Pos) /**< CMD length for Microwire - transfer: 16 bits */ -/** @} */ - -/** @defgroup SPI_LL_EC_TEST_MODE Test Mode - * @{ - */ -#define LL_SSI_NORMAL_MODE 0x00000000UL /**< Normal mode for SPI transfer */ -#define LL_SSI_TEST_MODE (1UL << SSI_CTRL0_SRL_Pos) /**< Test mode for SPI transfer: - Rx and Tx connected inside */ -/** @} */ - -/** @defgroup SPI_LL_EC_SLAVEOUT_ENABLE Slave Out Enable - * @{ - */ -#define LL_SSI_SLAVE_OUTDIS 0x00000000UL /**< Output enable for SPI transfer - as slave */ -#define LL_SSI_SLAVE_OUTEN (1UL << SSI_CTRL0_SLVOE_Pos) /**< Output disable for SPI transfer - as slave */ -/** @} */ - -/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode - * @{ - */ -#define LL_SSI_FULL_DUPLEX 0x00000000UL /**< Full-Duplex mode. - Rx and Tx transfer on 2 lines */ -#define LL_SSI_SIMPLEX_TX (1UL << SSI_CTRL0_TMOD_Pos) /**< Simplex Tx mode. - Tx transfer only on 1 line */ -#define LL_SSI_SIMPLEX_RX (2UL << SSI_CTRL0_TMOD_Pos) /**< Simplex Rx mode. - Rx transfer only on 1 line */ -#define LL_SSI_READ_EEPROM (3UL << SSI_CTRL0_TMOD_Pos) /**< Read EEPROM mode. - Rx transfer only on 1 line */ -/** @} */ - -/** @defgroup SPI_LL_EC_PHASE Clock Phase - * @{ - */ -#define LL_SSI_SCPHA_1EDGE 0x00000000UL /**< First clock transition is - the first data capture edge */ -#define LL_SSI_SCPHA_2EDGE (1UL << SSI_CTRL0_SCPHA_Pos) /**< Second clock transition is - the first data capture edge */ -/** @} */ - -/** @defgroup SPI_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_SSI_SCPOL_LOW 0x00000000UL /**< Clock to 0 when idle */ -#define LL_SSI_SCPOL_HIGH (1UL << SSI_CTRL0_SCPOL_Pos) /**< Clock to 1 when idle */ -/** @} */ - -/** @defgroup SPI_LL_EC_PROTOCOL Serial Protocol - * @{ - */ -#define LL_SSI_PROTOCOL_MOTOROLA 0x00000000UL /**< Motorola mode. Used as default value */ -#define LL_SSI_PROTOCOL_TI (1UL << SSI_CTRL0_FRF_Pos) /**< TI mode */ -#define LL_SSI_PROTOCOL_MICROWIRE (2UL << SSI_CTRL0_FRF_Pos) /**< Microwire mode */ -/** @} */ - -/** @defgroup SPI_LL_EC_MICROWIRECONTROL MicroWire Control - * @{ - */ -#define LL_SSI_MICROWIRE_HANDSHAKE_DIS 0x00000000UL /**< Enable Handshake for Microwire - transfer */ -#define LL_SSI_MICROWIRE_HANDSHAKE_EN (1UL << SSI_MWC_MHS_Pos) /**< Disable Handshake for Microwire - transfer */ - -#define LL_SSI_MICROWIRE_RX 0x00000000UL /**< Rx mode. Rx transfer at Microwire mode */ -#define LL_SSI_MICROWIRE_TX (1UL << SSI_MWC_MDD_Pos) /**< Tx mode. Tx transfer at Microwire mode */ - -#define LL_SSI_MICROWIRE_NON_SEQUENTIAL 0x00000000UL /**< Non-sequential for Microwire transfer */ -#define LL_SSI_MICROWIRE_SEQUENTIAL (1UL << SSI_MWC_MWMOD_Pos) /**< Sequential for Microwire transfer */ -/** @} */ - -/** @defgroup SPI_LL_EC_SLAVESELECT Slave Select - * @{ - */ -#define LL_SSI_SLAVE1 SSI_SE_SLAVE1 /**< Enable slave1 select pin for SPI - transfer */ -#define LL_SSI_SLAVE0 SSI_SE_SLAVE0 /**< Enable slave0 select pin for SPI - transfer */ -/** @} */ - -/** @defgroup SPI_LL_EC_DMA DMA Defines - * @{ - */ -#define LL_SSI_DMA_TX_DIS 0x00000000UL /**< Disable the transmit FIFO DMA channel */ -#define LL_SSI_DMA_TX_EN SSI_DMAC_TDMAE /**< Enable the transmit FIFO DMA channel */ - -#define LL_SSI_DMA_RX_DIS 0x00000000UL /**< Disable the receive FIFO DMA channel */ -#define LL_SSI_DMA_RX_EN SSI_DMAC_RDMAE /**< Enable the receive FIFO DMA channel */ -/** @} */ - -/** @defgroup SPI_LL_EC_INSTRUCTIONSIZE QSPI Instruction Size - * @{ - */ -#define LL_SSI_INSTSIZE_0BIT 0x00000000UL /**< Instruction length for QSPI - transfer: 0 bits */ -#define LL_SSI_INSTSIZE_4BIT (1UL << SSI_SCTRL0_INSTL_Pos) /**< Instructoin length for QSPI - transfer: 4 bits */ -#define LL_SSI_INSTSIZE_8BIT (2UL << SSI_SCTRL0_INSTL_Pos) /**< Instructoin length for QSPI - transfer: 8 bits */ -#define LL_SSI_INSTSIZE_16BIT (3UL << SSI_SCTRL0_INSTL_Pos) /**< Instructoin length for QSPI - transfer: 16 bits */ -/** @} */ - -/** @defgroup SPI_LL_EC_ADDRESSSIZE QSPI Address Size - * @{ - */ -#define LL_SSI_ADDRSIZE_0BIT 0x00000000UL /**< Address length for QSPI - transfer: 0 bits */ -#define LL_SSI_ADDRSIZE_4BIT (1UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 4 bits */ -#define LL_SSI_ADDRSIZE_8BIT (2UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 8 bits */ -#define LL_SSI_ADDRSIZE_12BIT (3UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 12 bits */ -#define LL_SSI_ADDRSIZE_16BIT (4UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 16 bits */ -#define LL_SSI_ADDRSIZE_20BIT (5UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 20 bits */ -#define LL_SSI_ADDRSIZE_24BIT (6UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 24 bits */ -#define LL_SSI_ADDRSIZE_28BIT (7UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 28 bits */ -#define LL_SSI_ADDRSIZE_32BIT (8UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 32 bits */ -#define LL_SSI_ADDRSIZE_36BIT (9UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 36 bits */ -#define LL_SSI_ADDRSIZE_40BIT (10UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 40 bits */ -#define LL_SSI_ADDRSIZE_44BIT (11UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 44 bits */ -#define LL_SSI_ADDRSIZE_48BIT (12UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 48 bits */ -#define LL_SSI_ADDRSIZE_52BIT (13UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 52 bits */ -#define LL_SSI_ADDRSIZE_56BIT (14UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 56 bits */ -#define LL_SSI_ADDRSIZE_60BIT (15UL << SSI_SCTRL0_ADDRL_Pos) /**< Address length for QSPI - transfer: 60 bits */ -/** @} */ - -/** @defgroup SPI_LL_EC_ADDRINSTTRNASFERFORMAT QSPI Address and Instruction Transfer Format - * @{ - */ -#define LL_SSI_INST_ADDR_ALL_IN_SPI 0x00000000UL /**< Instruction and address are sent - in SPI mode */ -#define LL_SSI_INST_IN_SPI_ADDR_IN_SPIFRF (1UL << SSI_SCTRL0_TRANSTYPE_Pos) /**< Instruction is in sent in SPI mode - and address is sent in Daul/Quad - SPI mode */ -#define LL_SSI_INST_ADDR_ALL_IN_SPIFRF (2UL << SSI_SCTRL0_TRANSTYPE_Pos) /**< Instruction and address are sent - in Daul/Quad SPI mode */ -/** @} */ - -/** @defgroup SPI_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL SPIM InitStrcut default configuartion - */ -#define LL_SPIM_DEFAULT_CONFIG \ -{ \ - .transfer_direction = LL_SSI_FULL_DUPLEX, \ - .data_size = LL_SSI_DATASIZE_8BIT, \ - .clock_polarity = LL_SSI_SCPOL_LOW, \ - .clock_phase = LL_SSI_SCPHA_1EDGE, \ - .slave_select = LL_SSI_SLAVE0, \ - .baud_rate = SystemCoreClock / 2000000, \ -} - -/** - * @brief LL SPIS InitStrcut default configuartion - */ -#define LL_SPIS_DEFAULT_CONFIG \ -{ \ - .data_size = LL_SSI_DATASIZE_8BIT, \ - .clock_polarity = LL_SSI_SCPOL_LOW, \ - .clock_phase = LL_SSI_SCPHA_1EDGE, \ -} - -/** - * @brief LL QSPI InitStrcut default configuartion - */ -#define LL_QSPI_DEFAULT_CONFIG \ -{ \ - .transfer_direction = LL_SSI_SIMPLEX_TX, \ - .instruction_size = LL_SSI_INSTSIZE_8BIT, \ - .address_size = LL_SSI_ADDRSIZE_24BIT, \ - .inst_addr_transfer_format = LL_SSI_INST_ADDR_ALL_IN_SPI, \ - .wait_cycles = 0, \ - .data_size = LL_SSI_DATASIZE_8BIT, \ - .clock_polarity = LL_SSI_SCPOL_LOW, \ - .clock_phase = LL_SSI_SCPHA_1EDGE, \ - .baud_rate = SystemCoreClock / 1000000, \ - .rx_sample_delay = 0, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in SPI register - * @param __instance__ SPI instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_SPI_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in SPI register - * @param __instance__ SPI instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_SPI_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup SPI_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable slave select toggle - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SSTEN - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_ss_toggle(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->CTRL0, SSI_CTRL0_SSTEN); -} - -/** - * @brief Disable slave select toggle - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SSTEN - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_ss_toggle(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->CTRL0, SSI_CTRL0_SSTEN); -} - -/** - * @brief Check if slave select toggle is enabled - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SSTEN - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_ss_toggle(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->CTRL0, SSI_CTRL0_SSTEN) == (SSI_CTRL0_SSTEN)); -} - -/** - * @brief Set data frame format for transmitting/receiving the data - * @note This bit should be written only when SPI is disabled (SSI_EN = 0) for correct operation. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SPIFRF - * - * @param SPIx SPI instance - * @param frf This parameter can be one of the following values: - * @arg @ref LL_SSI_FRF_SPI - * @arg @ref LL_SSI_FRF_DUALSPI - * @arg @ref LL_SSI_FRF_QUADSPI - * @retval None - */ -__STATIC_INLINE void ll_spi_set_frame_format(ssi_regs_t *SPIx, uint32_t frf) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_SPIFRF, frf); -} - -/** - * @brief Get data frame format for transmitting/receiving the data - * @note This bit should be written only when SPI is disabled (SSI_EN = 0) for correct operation. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SPIFRF - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_FRF_SPI - * @arg @ref LL_SSI_FRF_DUALSPI - * @arg @ref LL_SSI_FRF_QUADSPI - */ -__STATIC_INLINE uint32_t ll_spi_get_frame_format(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_SPIFRF)); -} - -/** - * @brief Set frame data size - * - * Register|BitsName - * --------|-------- - * CTRL0 | DFS32 - * - * @param SPIx SPI instance - * @param size This parameter can be one of the following values: - * @arg @ref LL_SSI_DATASIZE_4BIT - * @arg @ref LL_SSI_DATASIZE_5BIT - * @arg @ref LL_SSI_DATASIZE_6BIT - * @arg @ref LL_SSI_DATASIZE_7BIT - * @arg @ref LL_SSI_DATASIZE_8BIT - * @arg @ref LL_SSI_DATASIZE_9BIT - * @arg @ref LL_SSI_DATASIZE_10BIT - * @arg @ref LL_SSI_DATASIZE_11BIT - * @arg @ref LL_SSI_DATASIZE_12BIT - * @arg @ref LL_SSI_DATASIZE_13BIT - * @arg @ref LL_SSI_DATASIZE_14BIT - * @arg @ref LL_SSI_DATASIZE_15BIT - * @arg @ref LL_SSI_DATASIZE_16BIT - * @arg @ref LL_SSI_DATASIZE_17BIT - * @arg @ref LL_SSI_DATASIZE_18BIT - * @arg @ref LL_SSI_DATASIZE_19BIT - * @arg @ref LL_SSI_DATASIZE_20BIT - * @arg @ref LL_SSI_DATASIZE_21BIT - * @arg @ref LL_SSI_DATASIZE_22BIT - * @arg @ref LL_SSI_DATASIZE_23BIT - * @arg @ref LL_SSI_DATASIZE_24BIT - * @arg @ref LL_SSI_DATASIZE_25BIT - * @arg @ref LL_SSI_DATASIZE_26BIT - * @arg @ref LL_SSI_DATASIZE_27BIT - * @arg @ref LL_SSI_DATASIZE_28BIT - * @arg @ref LL_SSI_DATASIZE_29BIT - * @arg @ref LL_SSI_DATASIZE_30BIT - * @arg @ref LL_SSI_DATASIZE_31BIT - * @arg @ref LL_SSI_DATASIZE_32BIT - * @retval None - */ -__STATIC_INLINE void ll_spi_set_data_size(ssi_regs_t *SPIx, uint32_t size) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_DFS32, size); -} - -/** - * @brief Get frame data size - * - * Register|BitsName - * --------|-------- - * CTRL0 | DFS32 - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_DATASIZE_4BIT - * @arg @ref LL_SSI_DATASIZE_5BIT - * @arg @ref LL_SSI_DATASIZE_6BIT - * @arg @ref LL_SSI_DATASIZE_7BIT - * @arg @ref LL_SSI_DATASIZE_8BIT - * @arg @ref LL_SSI_DATASIZE_9BIT - * @arg @ref LL_SSI_DATASIZE_10BIT - * @arg @ref LL_SSI_DATASIZE_11BIT - * @arg @ref LL_SSI_DATASIZE_12BIT - * @arg @ref LL_SSI_DATASIZE_13BIT - * @arg @ref LL_SSI_DATASIZE_14BIT - * @arg @ref LL_SSI_DATASIZE_15BIT - * @arg @ref LL_SSI_DATASIZE_16BIT - * @arg @ref LL_SSI_DATASIZE_17BIT - * @arg @ref LL_SSI_DATASIZE_18BIT - * @arg @ref LL_SSI_DATASIZE_19BIT - * @arg @ref LL_SSI_DATASIZE_20BIT - * @arg @ref LL_SSI_DATASIZE_21BIT - * @arg @ref LL_SSI_DATASIZE_22BIT - * @arg @ref LL_SSI_DATASIZE_23BIT - * @arg @ref LL_SSI_DATASIZE_24BIT - * @arg @ref LL_SSI_DATASIZE_25BIT - * @arg @ref LL_SSI_DATASIZE_26BIT - * @arg @ref LL_SSI_DATASIZE_27BIT - * @arg @ref LL_SSI_DATASIZE_28BIT - * @arg @ref LL_SSI_DATASIZE_29BIT - * @arg @ref LL_SSI_DATASIZE_30BIT - * @arg @ref LL_SSI_DATASIZE_31BIT - * @arg @ref LL_SSI_DATASIZE_32BIT - */ -__STATIC_INLINE uint32_t ll_spi_get_data_size(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_DFS32)); -} - -/** - * @brief Set the length of the control word for the Microwire frame format - * @note This bit should be written only when SPI is disabled (SSI_EN = 0) for correct operation. - * - * Register|BitsName - * --------|-------- - * CTRL0 | CFS - * - * @param SPIx SPI instance - * @param size This parameter can be one of the following values: - * @arg @ref LL_SSI_MW_CMDSIZE_1BIT - * @arg @ref LL_SSI_MW_CMDSIZE_2BIT - * @arg @ref LL_SSI_MW_CMDSIZE_3BIT - * @arg @ref LL_SSI_MW_CMDSIZE_4BIT - * @arg @ref LL_SSI_MW_CMDSIZE_5BIT - * @arg @ref LL_SSI_MW_CMDSIZE_6BIT - * @arg @ref LL_SSI_MW_CMDSIZE_7BIT - * @arg @ref LL_SSI_MW_CMDSIZE_8BIT - * @arg @ref LL_SSI_MW_CMDSIZE_9BIT - * @arg @ref LL_SSI_MW_CMDSIZE_10BIT - * @arg @ref LL_SSI_MW_CMDSIZE_11BIT - * @arg @ref LL_SSI_MW_CMDSIZE_12BIT - * @arg @ref LL_SSI_MW_CMDSIZE_13BIT - * @arg @ref LL_SSI_MW_CMDSIZE_14BIT - * @arg @ref LL_SSI_MW_CMDSIZE_15BIT - * @arg @ref LL_SSI_MW_CMDSIZE_16BIT - * @retval None - */ -__STATIC_INLINE void ll_spi_set_control_frame_size(ssi_regs_t *SPIx, uint32_t size) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_CFS, size); -} - -/** - * @brief Get the length of the control word for the Microwire frame format - * @note This bit should be written only when SPI is disabled (SSI_EN = 0) for correct operation. - * - * Register|BitsName - * --------|-------- - * CTRL0 | CFS - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_MW_CMDSIZE_1BIT - * @arg @ref LL_SSI_MW_CMDSIZE_2BIT - * @arg @ref LL_SSI_MW_CMDSIZE_3BIT - * @arg @ref LL_SSI_MW_CMDSIZE_4BIT - * @arg @ref LL_SSI_MW_CMDSIZE_5BIT - * @arg @ref LL_SSI_MW_CMDSIZE_6BIT - * @arg @ref LL_SSI_MW_CMDSIZE_7BIT - * @arg @ref LL_SSI_MW_CMDSIZE_8BIT - * @arg @ref LL_SSI_MW_CMDSIZE_9BIT - * @arg @ref LL_SSI_MW_CMDSIZE_10BIT - * @arg @ref LL_SSI_MW_CMDSIZE_11BIT - * @arg @ref LL_SSI_MW_CMDSIZE_12BIT - * @arg @ref LL_SSI_MW_CMDSIZE_13BIT - * @arg @ref LL_SSI_MW_CMDSIZE_14BIT - * @arg @ref LL_SSI_MW_CMDSIZE_15BIT - * @arg @ref LL_SSI_MW_CMDSIZE_16BIT - */ -__STATIC_INLINE uint32_t ll_spi_get_control_frame_size(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_CFS)); -} - -/** - * @brief Enable SPI test mode - * - * Register|BitsName - * --------|-------- - * CTRL0 | SRL - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_test_mode(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->CTRL0, SSI_CTRL0_SRL); -} - -/** - * @brief Disable SPI test mode - * - * Register|BitsName - * --------|-------- - * CTRL0 | SRL - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_test_mode(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->CTRL0, SSI_CTRL0_SRL); -} - -/** - * @brief Check if SPI test mode is enabled - * - * Register|BitsName - * --------|-------- - * CTRL0 | SRL - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_test_mode(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->CTRL0, SSI_CTRL0_SRL) == (SSI_CTRL0_SRL)); -} - -/** - * @brief Enable slave output - * - * Register|BitsName - * --------|-------- - * CTRL0 | SLVOE - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_slave_out(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->CTRL0, SSI_CTRL0_SLVOE); -} - -/** - * @brief Disable slave output - * - * Register|BitsName - * --------|-------- - * CTRL0 | SLVOE - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_salve_out(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->CTRL0, SSI_CTRL0_SLVOE); -} - -/** - * @brief Check if slave output is enabled - * - * Register|BitsName - * --------|-------- - * CTRL0 | SLVOE - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_slave_out(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->CTRL0, SSI_CTRL0_SLVOE) != (SSI_CTRL0_SLVOE)); -} - -/** - * @brief Set transfer direction mode - * - * Register|BitsName - * --------|-------- - * CTRL0 | TMOD - * - * @param SPIx SPI instance - * @param transfer_direction This parameter can be one of the following values: - * @arg @ref LL_SSI_FULL_DUPLEX - * @arg @ref LL_SSI_SIMPLEX_TX - * @arg @ref LL_SSI_SIMPLEX_RX - * @arg @ref LL_SSI_READ_EEPROM - * @retval None - */ -__STATIC_INLINE void ll_spi_set_transfer_direction(ssi_regs_t *SPIx, uint32_t transfer_direction) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_TMOD, transfer_direction); -} - -/** - * @brief Get transfer direction mode - * - * Register|BitsName - * --------|-------- - * CTRL0 | TMOD - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_FULL_DUPLEX - * @arg @ref LL_SSI_SIMPLEX_TX - * @arg @ref LL_SSI_SIMPLEX_RX - * @arg @ref LL_SSI_READ_EEPROM - */ -__STATIC_INLINE uint32_t ll_spi_get_transfer_direction(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_TMOD)); -} - -/** - * @brief Set clock polarity - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SCPOL - * - * @param SPIx SPI instance - * @param clock_polarity This parameter can be one of the following values: - * @arg @ref LL_SSI_SCPOL_LOW - * @arg @ref LL_SSI_SCPOL_HIGH - * @retval None - */ -__STATIC_INLINE void ll_spi_set_clock_polarity(ssi_regs_t *SPIx, uint32_t clock_polarity) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_SCPOL, clock_polarity); -} - -/** - * @brief Get clock polarity - * - * Register|BitsName - * --------|-------- - * CTRL0 | SCPOL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_SCPOL_LOW - * @arg @ref LL_SSI_SCPOL_HIGH - */ -__STATIC_INLINE uint32_t ll_spi_get_clock_polarity(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_SCPOL)); -} - -/** - * @brief Set clock phase - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * - * Register|BitsName - * --------|-------- - * CTRL0 | SCPHA - * - * @param SPIx SPI instance - * @param clock_phase This parameter can be one of the following values: - * @arg @ref LL_SSI_SCPHA_1EDGE - * @arg @ref LL_SSI_SCPHA_2EDGE - * @retval None - */ -__STATIC_INLINE void ll_spi_set_clock_phase(ssi_regs_t *SPIx, uint32_t clock_phase) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_SCPHA, clock_phase); -} - -/** - * @brief Get clock phase - * - * Register|BitsName - * --------|-------- - * CTRL0 | SCPHA - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_SCPHA_1EDGE - * @arg @ref LL_SSI_SCPHA_2EDGE - */ -__STATIC_INLINE uint32_t ll_spi_get_clock_phase(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_SCPHA)); -} - -/** - * @brief Set serial protocol used - * @note This bit should be written only when SPI is disabled (SSI_EN = 0) for correct operation. - * - * Register|BitsName - * --------|-------- - * CTRL0 | FRF - * - * @param SPIx SPI instance - * @param standard This parameter can be one of the following values: - * @arg @ref LL_SSI_PROTOCOL_MOTOROLA - * @arg @ref LL_SSI_PROTOCOL_TI - * @arg @ref LL_SSI_PROTOCOL_MICROWIRE - * @retval None - */ -__STATIC_INLINE void ll_spi_set_standard(ssi_regs_t *SPIx, uint32_t standard) -{ - MODIFY_REG(SPIx->CTRL0, SSI_CTRL0_FRF, standard); -} - -/** - * @brief Get serial protocol used - * - * Register|BitsName - * --------|-------- - * CTRL0 | FRF - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_PROTOCOL_MOTOROLA - * @arg @ref LL_SSI_PROTOCOL_TI - * @arg @ref LL_SSI_PROTOCOL_MICROWIRE - */ -__STATIC_INLINE uint32_t ll_spi_get_standard(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL0, SSI_CTRL0_FRF)); -} - -/** - * @brief Set the number of data frames to be continuously received - * @note These bits should not be changed when communication is ongoing. - This bits are effect when TMOD = 2b10 or 2b11. - This bits are not effect in SPIS. - * - * Register|BitsName - * --------|-------- - * CTRL1 | NDF - * - * @param SPIx SPI instance - * @param size This parameter can be one of the following values: 0 ~ 65535 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_receive_size(ssi_regs_t *SPIx, uint32_t size) -{ - MODIFY_REG(SPIx->CTRL1, SSI_CTRL1_NDF, size); -} - -/** - * @brief Get the number of data frames to be continuously received - * @note These bits should not be changed when communication is ongoing. - This bits are effect when TMOD = 2b10 or 2b11. - This bits are not effect in SPIS. - * - * Register|BitsName - * --------|-------- - * CTRL1 | NDF - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 65535 - */ -__STATIC_INLINE uint32_t ll_spi_get_receive_size(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->CTRL1, SSI_CTRL1_NDF)); -} - -/** - * @brief Enable SPI peripheral - * - * Register|BitsName - * --------|-------- - * SSI_EN | EN - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->SSI_EN, SSI_SSIEN_EN); -} - -/** - * @brief Disable SPI peripheral - * @note When disabling the SPI, follow the procedure described in the Reference Manual. - * - * Register|BitsName - * --------|-------- - * SSI_EN | EN - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->SSI_EN, SSI_SSIEN_EN); -} - -/** - * @brief Check if SPI peripheral is enabled - * - * Register|BitsName - * --------|-------- - * SSI_EN | EN - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->SSI_EN, SSI_SSIEN_EN) == (SSI_SSIEN_EN)); -} - -/** - * @brief Enable Handshake in Microwire mode - * - * Register|BitsName - * --------|-------- - * MWC | MHS - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_micro_handshake(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->MWC, SSI_MWC_MHS); -} - -/** - * @brief Disable Handshake in Microwire mode - * - * Register|BitsName - * --------|-------- - * MWC | MHS - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_micro_handshake(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->MWC, SSI_MWC_MHS); -} - -/** - * @brief Check if Handshake in Microwire mode is enabled - * - * Register|BitsName - * --------|-------- - * MWC | MHS - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_micro_handshake(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->MWC, SSI_MWC_MHS) == (SSI_MWC_MHS)); -} - -/** - * @brief Set transfer direction mode in Microwire mode - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * MWC | MDD - * - * @param SPIx SPI instance - * @param transfer_direction This parameter can be one of the following values: - * @arg @ref LL_SSI_MICROWIRE_RX - * @arg @ref LL_SSI_MICROWIRE_TX - * @retval None - */ -__STATIC_INLINE void ll_spi_set_micro_transfer_direction(ssi_regs_t *SPIx, uint32_t transfer_direction) -{ - MODIFY_REG(SPIx->MWC, SSI_MWC_MDD, transfer_direction); -} - -/** - * @brief Get transfer direction mode in Microwire mode - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * MWC | MDD - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_MICROWIRE_RX - * @arg @ref LL_SSI_MICROWIRE_TX - */ -__STATIC_INLINE uint32_t ll_spi_get_micro_transfer_direction(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->MWC, SSI_MWC_MDD)); -} - -/** - * @brief Set transfer mode in Microwire mode - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * MWC | MWMOD - * - * @param SPIx SPI instance - * @param transfer_mode This parameter can be one of the following values: - * @arg @ref LL_SSI_MICROWIRE_NON_SEQUENTIAL - * @arg @ref LL_SSI_MICROWIRE_SEQUENTIAL - * @retval None - */ -__STATIC_INLINE void ll_spi_set_micro_transfer_mode(ssi_regs_t *SPIx, uint32_t transfer_mode) -{ - MODIFY_REG(SPIx->MWC, SSI_MWC_MWMOD, transfer_mode); -} - -/** - * @brief Get transfer mode in Microwire mode - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * MWC | MWMOD - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_MICROWIRE_NON_SEQUENTIAL - * @arg @ref LL_SSI_MICROWIRE_SEQUENTIAL - */ -__STATIC_INLINE uint32_t ll_spi_get_micro_transfer_mode(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->MWC, SSI_MWC_MWMOD)); -} - -/** - * @brief Enable slave select - * - * Register|BitsName - * --------|-------- - * SE | SLAVE1 - * SE | SLAVE0 - * - * @param SPIx SPI instance - * @param ss This parameter can be one of the following values: - * @arg @ref LL_SSI_SLAVE1 - * @arg @ref LL_SSI_SLAVE0 - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_ss(ssi_regs_t *SPIx, uint32_t ss) -{ - SET_BITS(SPIx->SE, ss); -} - -/** - * @brief Disable slave select - * - * Register|BitsName - * --------|-------- - * SE | SLAVE1 - * SE | SLAVE0 - * - * @param SPIx SPI instance - * @param ss This parameter can be one of the following values: - * @arg @ref LL_SSI_SLAVE1 - * @arg @ref LL_SSI_SLAVE0 - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_ss(ssi_regs_t *SPIx, uint32_t ss) -{ - CLEAR_BITS(SPIx->SE, ss); -} - -/** - * @brief Check if slave select is enabled - * - * Register|BitsName - * --------|-------- - * SE | SLAVE1 - * SE | SLAVE0 - * - * @param SPIx SPI instance - * @param ss This parameter can be one of the following values: - * @arg @ref LL_SSI_SLAVE1 - * @arg @ref LL_SSI_SLAVE0 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_ss(ssi_regs_t *SPIx, uint32_t ss) -{ - return (READ_BITS(SPIx->SE, ss) == ss); -} - -/** - * @brief Set baud rate prescaler - * @note These bits should not be changed when communication is - * ongoing. SPI BaudRate = fPCLK/Prescaler. - * - * Register|BitsName - * --------|-------- - * BAUD | SCKDIV - * - * @param SPIx SPI instance - * @param baud_rate This parameter can be one even value between 2 - * and 65534, if the value is 0, the SCLK is disable. - * @retval None - */ -__STATIC_INLINE void ll_spi_set_baud_rate_prescaler(ssi_regs_t *SPIx, uint32_t baud_rate) -{ - WRITE_REG(SPIx->BAUD, baud_rate); -} - -/** - * @brief Get baud rate prescaler - * - * Register|BitsName - * --------|-------- - * BAUD | SCKDIV - * - * @param SPIx SPI instance - * @retval Returned value can be one even value between 2 and 65534. - */ -__STATIC_INLINE uint32_t ll_spi_get_baud_rate_prescaler(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->BAUD, SSI_BAUD_SCKDIV)); -} - -/** - * @brief Set threshold of TXFIFO that triggers an TXE event - * - * Register|BitsName - * --------|-------- - * TXFTL | TFT - * - * @param SPIx SPI instance - * @param threshold This parameter can be one of the following values: 0 ~ 7 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_tx_fifo_threshold(ssi_regs_t *SPIx, uint32_t threshold) -{ - WRITE_REG(SPIx->TX_FTL, threshold); -} - -/** - * @brief Get threshold of TXFIFO that triggers an TXE event - * - * Register|BitsName - * --------|-------- - * TXFTL | TFT - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 7 - */ -__STATIC_INLINE uint32_t ll_spi_get_tx_fifo_threshold(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->TX_FTL, SSI_TXFTL_TFT)); -} - -/** - * @brief Set threshold of RXFIFO that triggers an RXNE event - * - * Register|BitsName - * --------|-------- - * RXFTL | RFT - * - * @param SPIx SPI instance - * @param threshold This parameter can be one of the following values: 0 ~ 7 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_rx_fifo_threshold(ssi_regs_t *SPIx, uint32_t threshold) -{ - WRITE_REG(SPIx->RX_FTL, threshold); -} - -/** - * @brief Get threshold of RXFIFO that triggers an RXNE event - * - * Register|BitsName - * --------|-------- - * RXFTL | RFT - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 7 - */ -__STATIC_INLINE uint32_t ll_spi_get_rx_fifo_threshold(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->RX_FTL, SSI_RXFTL_RFT)); -} - -/** - * @brief Get FIFO Transmission Level - * - * Register|BitsName - * --------|-------- - * TXFL | TXTFL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 8 - */ -__STATIC_INLINE uint32_t ll_spi_get_tx_fifo_level(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->TX_FL, SSI_TXFL_TXTFL)); -} - -/** - * @brief Get FIFO reception Level - * - * Register|BitsName - * --------|-------- - * RXFL | RXTFL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 8 - */ -__STATIC_INLINE uint32_t ll_spi_get_rx_fifo_level(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->RX_FL, SSI_RXFL_RXTFL)); -} - -/** - * @brief Get ID code - * - * Register|BitsName - * --------|-------- - * IDCODE | ID - * - * @param SPIx SPI instance - * @retval Returned value is const. - */ -__STATIC_INLINE uint32_t ll_spi_get_id_code(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->ID, SSI_IDCODE_ID)); -} - -/** - * @brief Get IP version - * - * Register|BitsName - * --------|-------- - * COMP | VERSION - * - * @param SPIx SPI instance - * @retval Returned value is const. - */ -__STATIC_INLINE uint32_t ll_spi_get_version(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->VERSION_ID, SSI_COMP_VERSION)); -} - -/** @} */ - -/** @defgroup SPI_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable interrupt - * @note This bit controls the generation of an interrupt when an event occurs. - * - * Register|BitsName - * --------|-------- - * INTMASK | INTMASK - * - * @param SPIx SPI instance - * @param mask This parameter can be one of the following values: - * @arg @ref LL_SSI_IM_MST(not effect in SPIS) - * @arg @ref LL_SSI_IM_RXF - * @arg @ref LL_SSI_IM_RXO - * @arg @ref LL_SSI_IM_RXU - * @arg @ref LL_SSI_IM_TXO - * @arg @ref LL_SSI_IM_TXE - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_it(ssi_regs_t *SPIx, uint32_t mask) -{ - SET_BITS(SPIx->INTMASK, mask); -} - -/** - * @brief Disable interrupt - * @note This bit controls the generation of an interrupt when an event occurs. - * - * Register|BitsName - * --------|-------- - * INTMASK | INTMASK - * - * @param SPIx SPI instance - * @param mask This parameter can be one of the following values: - * @arg @ref LL_SSI_IM_MST(not effect in SPIS) - * @arg @ref LL_SSI_IM_RXF - * @arg @ref LL_SSI_IM_RXO - * @arg @ref LL_SSI_IM_RXU - * @arg @ref LL_SSI_IM_TXO - * @arg @ref LL_SSI_IM_TXE - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_it(ssi_regs_t *SPIx, uint32_t mask) -{ - CLEAR_BITS(SPIx->INTMASK, mask); -} - -/** - * @brief Check if interrupt is enabled - * - * Register|BitsName - * --------|-------- - * INTMASK | INTMASK - * - * @param SPIx SPI instance - * @param mask This parameter can be one of the following values: - * @arg @ref LL_SSI_IM_MST(not effect in SPIS) - * @arg @ref LL_SSI_IM_RXF - * @arg @ref LL_SSI_IM_RXO - * @arg @ref LL_SSI_IM_RXU - * @arg @ref LL_SSI_IM_TXO - * @arg @ref LL_SSI_IM_TXE - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_it(ssi_regs_t *SPIx, uint32_t mask) -{ - return (READ_BITS(SPIx->INTMASK, mask) == mask); -} - -/** @} */ - -/** @defgroup SPI_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get SPI status - * - * Register|BitsName - * --------|-------- - * STAT | STAT - * - * @param SPIx SPI instance - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_SSI_SR_DCOL(no effect in SPIS) - * @arg @ref LL_SSI_SR_TXE - * @arg @ref LL_SSI_SR_RFF - * @arg @ref LL_SSI_SR_RFNE - * @arg @ref LL_SSI_SR_TFE - * @arg @ref LL_SSI_SR_TFNF - * @arg @ref LL_SSI_SR_BUSY - */ -__STATIC_INLINE uint32_t ll_spi_get_status(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->STAT)); -} - -/** - * @brief Check active flag - * - * Register|BitsName - * --------|-------- - * STAT | DCOL - * STAT | TXE - * STAT | RFF - * STAT | RFNE - * STAT | TFE - * STAT | TFNF - * STAT | BUSY - * - * @param SPIx SPI instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_SSI_SR_DCOL(no effect in SPIS) - * @arg @ref LL_SSI_SR_TXE - * @arg @ref LL_SSI_SR_RFF - * @arg @ref LL_SSI_SR_RFNE - * @arg @ref LL_SSI_SR_TFE - * @arg @ref LL_SSI_SR_TFNF - * @arg @ref LL_SSI_SR_BUSY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_active_flag(ssi_regs_t *SPIx, uint32_t flag) -{ - return (READ_BITS(SPIx->STAT, flag) == (flag)); -} - -/** - * @brief Get SPI interrupt flags - * - * Register|BitsName - * --------|-------- - * INTSTAT | INTSTAT - * - * @param SPIx SPI instance - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_SSI_IS_MST(no effect in SPIS) - * @arg @ref LL_SSI_IS_RXF - * @arg @ref LL_SSI_IS_RXO - * @arg @ref LL_SSI_IS_RXU - * @arg @ref LL_SSI_IS_TXO - * @arg @ref LL_SSI_IS_TXE - */ -__STATIC_INLINE uint32_t ll_spi_get_it_flag(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->INTSTAT)); -} - -/** - * @brief Check interrupt flag - * - * Register|BitsName - * --------|-------- - * INTSTAT | MSTIS - * INTSTAT | RXFIS - * INTSTAT | RXOIS - * INTSTAT | RXUIS - * INTSTAT | TXOIS - * INTSTAT | TXEIS - * - * @param SPIx SPI instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_SSI_IS_MST(no effect in SPIS) - * @arg @ref LL_SSI_IS_RXF - * @arg @ref LL_SSI_IS_RXO - * @arg @ref LL_SSI_IS_RXU - * @arg @ref LL_SSI_IS_TXO - * @arg @ref LL_SSI_IS_TXE - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_it_flag(ssi_regs_t *SPIx, uint32_t flag) -{ - return (READ_BITS(SPIx->INTSTAT, flag) == flag); -} - -/** - * @brief Get SPI raw interrupt flags - * - * Register|BitsName - * --------|-------- - * RAW_INTSTAT | RAW_INTSTAT - * - * @param SPIx SPI instance - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_SSI_RIS_MST(no effect in SPIS) - * @arg @ref LL_SSI_RIS_RXF - * @arg @ref LL_SSI_RIS_RXO - * @arg @ref LL_SSI_RIS_RXU - * @arg @ref LL_SSI_RIS_TXO - * @arg @ref LL_SSI_RIS_TXE - */ -__STATIC_INLINE uint32_t ll_spi_get_raw_if_flag(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->RAW_INTSTAT)); -} - -/** - * @brief Clear transmit FIFO overflow error flag - * @note Clearing this flag is done by reading TXOIC register - * - * Register|BitsName - * --------|-------- - * TXOIC | TXOIC - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_clear_flag_txo(ssi_regs_t *SPIx) -{ - __IOM uint32_t tmpreg; - tmpreg = SPIx->TXOIC; - (void) tmpreg; -} - -/** - * @brief Clear receive FIFO overflow error flag - * @note Clearing this flag is done by reading RXOIC register - * - * Register|BitsName - * --------|-------- - * RXOIC | RXOIC - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_clear_flag_rxo(ssi_regs_t *SPIx) -{ - __IOM uint32_t tmpreg; - tmpreg = SPIx->RXOIC; - (void) tmpreg; -} - -/** - * @brief Clear receive FIFO underflow error flag - * @note Clearing this flag is done by reading RXUIC register - * - * Register|BitsName - * --------|-------- - * RXUIC | RXUIC - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_clear_flag_rxu(ssi_regs_t *SPIx) -{ - __IOM uint32_t tmpreg; - tmpreg = SPIx->RXUIC; - (void) tmpreg; -} - -/** - * @brief Clear multi-master error flag - * @note Clearing this flag is done by reading MSTIC register - * - * Register|BitsName - * --------|-------- - * MSTIC | MSTIC - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_clear_flag_mst(ssi_regs_t *SPIx) -{ - __IOM uint32_t tmpreg; - tmpreg = SPIx->MSTIC; - (void) tmpreg; -} - -/** - * @brief Clear all error flag - * @note Clearing this flag is done by reading INTCLR register - * - * Register|BitsName - * --------|-------- - * INTCLR | INTCLR - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_clear_flag_all(ssi_regs_t *SPIx) -{ - __IOM uint32_t tmpreg; - tmpreg = SPIx->INTCLR; - (void) tmpreg; -} - -/** @} */ - -/** @defgroup SPI_LL_EF_DMA_Management DMA_Management - * @{ - */ - -/** - * @brief Enable DMA Tx - * - * Register|BitsName - * --------|-------- - * DMAC | TDMAE - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_dma_req_tx(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->DMAC, SSI_DMAC_TDMAE); -} - -/** - * @brief Disable DMA Tx - * - * Register|BitsName - * --------|-------- - * DMAC | TDMAE - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_dma_req_tx(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->DMAC, SSI_DMAC_TDMAE); -} - -/** - * @brief Check if DMA Tx is enabled - * - * Register|BitsName - * --------|-------- - * DMAC | TDMAE - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_dma_req_tx(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->DMAC, SSI_DMAC_TDMAE) == (SSI_DMAC_TDMAE)); -} - -/** - * @brief Enable DMA Rx - * - * Register|BitsName - * --------|-------- - * DMAC | RDMAE - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_enable_dma_req_rx(ssi_regs_t *SPIx) -{ - SET_BITS(SPIx->DMAC, SSI_DMAC_RDMAE); -} - -/** - * @brief Disable DMA Rx - * - * Register|BitsName - * --------|-------- - * DMAC | RDMAE - * - * @param SPIx SPI instance - * @retval None - */ -__STATIC_INLINE void ll_spi_disable_dma_req_rx(ssi_regs_t *SPIx) -{ - CLEAR_BITS(SPIx->DMAC, SSI_DMAC_RDMAE); -} - -/** - * @brief Check if DMA Rx is enabled - * - * Register|BitsName - * --------|-------- - * DMAC | RDMAE - * - * @param SPIx SPI instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_spi_is_enabled_dma_req_rx(ssi_regs_t *SPIx) -{ - return (READ_BITS(SPIx->DMAC, SSI_DMAC_RDMAE) == (SSI_DMAC_RDMAE)); -} - -/** - * @brief Set threshold of TXFIFO that triggers an DMA Tx request event - * - * Register|BitsName - * --------|-------- - * DMATDL | DMATDL - * - * @param SPIx SPI instance - * @param threshold This parameter can be one of the following values: 0 ~ 7 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_dma_tx_fifo_threshold(ssi_regs_t *SPIx, uint32_t threshold) -{ - WRITE_REG(SPIx->DMA_TDL, threshold); -} - -/** - * @brief Get threshold of TXFIFO that triggers an DMA Tx request event - * - * Register|BitsName - * --------|-------- - * DMATDL | DMATDL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 7 - */ -__STATIC_INLINE uint32_t ll_spi_get_dma_tx_fifo_threshold(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->DMA_TDL, SSI_DMATDL_DMATDL)); -} - -/** - * @brief Set threshold of RXFIFO that triggers an DMA Rx request event - * - * Register|BitsName - * --------|-------- - * DMARDL | DMARDL - * - * @param SPIx SPI instance - * @param threshold This parameter can be one of the following values: 0 ~ 7 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_dma_rx_fifo_threshold(ssi_regs_t *SPIx, uint32_t threshold) -{ - WRITE_REG(SPIx->DMA_RDL, threshold); -} - -/** - * @brief Get threshold of RXFIFO that triggers an DMA Rx request event - * - * Register|BitsName - * --------|-------- - * DMARDL | DMARDL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 7 - */ -__STATIC_INLINE uint32_t ll_spi_get_dma_rx_fifo_threshold(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->DMA_RDL, SSI_DMARDL_DMARDL)); -} - -/** @} */ - -/** @defgroup SPI_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Write 8-Bits in the data register - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param SPIx SPI instance - * @param tx_data Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void ll_spi_transmit_data8(ssi_regs_t *SPIx, uint8_t tx_data) -{ - *((__IOM uint8_t *)&SPIx->DATA) = tx_data; -} - -/** - * @brief Write 16-Bits in the data register - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param SPIx SPI instance - * @param tx_data Value between Min_Data=0x0000 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void ll_spi_transmit_data16(ssi_regs_t *SPIx, uint16_t tx_data) -{ - *((__IOM uint16_t *)&SPIx->DATA) = tx_data; -} - -/** - * @brief Write 32-Bits in the data register - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param SPIx SPI instance - * @param tx_data Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_spi_transmit_data32(ssi_regs_t *SPIx, uint32_t tx_data) -{ - *((__IOM uint32_t *)&SPIx->DATA) = tx_data; -} - -/** - * @brief Read 8-Bits in the data register - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param SPIx SPI instance - * @retval Rerturned Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t ll_spi_receive_data8(ssi_regs_t *SPIx) -{ - return (uint8_t)(READ_REG(SPIx->DATA)); -} - -/** - * @brief Read 16-Bits in the data register - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param SPIx SPI instance - * @retval Returned Value between Min_Data=0x0000 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t ll_spi_receive_data16(ssi_regs_t *SPIx) -{ - return (uint16_t)(READ_REG(SPIx->DATA)); -} - -/** - * @brief Read 32-Bits in the data register - * - * Register|BitsName - * --------|-------- - * DATA | DATA - * - * @param SPIx SPI instance - * @retval Returned Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t ll_spi_receive_data32(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->DATA)); -} - -/** - * @brief Set Rx sample delay - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * RX_SAMPLEDLY | RX_SAMPLEDLY - * - * @param SPIx SPI instance - * @param delay This parameter can be one of the following values: 0 ~ 256 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_rx_sample_delay(ssi_regs_t *SPIx, uint32_t delay) -{ - WRITE_REG(SPIx->RX_SAMPLE_DLY, delay); -} - -/** - * @brief Get Rx sample delay - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * RX_SAMPLEDLY | RX_SAMPLEDLY - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 256 - */ -__STATIC_INLINE uint32_t ll_spi_get_rx_sample_delay(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->RX_SAMPLE_DLY)); -} - -/** - * @brief Set number of wait cycles in Dual/Quad SPI mode - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | WAITCYCLES - * - * @param SPIx SPI instance - * @param wait_cycles This parameter can be one of the following values: 0 ~ 31 - * @retval None - */ -__STATIC_INLINE void ll_spi_set_wait_cycles(ssi_regs_t *SPIx, uint32_t wait_cycles) -{ - MODIFY_REG(SPIx->SPI_CTRL0, SSI_SCTRL0_WAITCYCLES, wait_cycles << SSI_SCTRL0_WAITCYCLES_Pos); -} - -/** - * @brief Get number of wait cycles in Dual/Quad SPI mode - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | WAITCYCLES - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: 0 ~ 31 - */ -__STATIC_INLINE uint32_t ll_spi_get_wait_cycles(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->SPI_CTRL0, SSI_SCTRL0_WAITCYCLES) >> SSI_SCTRL0_WAITCYCLES_Pos); -} - -/** - * @brief Set Dual/Quad SPI mode instruction length in bits - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | INSTL - * - * @param SPIx SPI instance - * @param size This parameter can be one of the following values: - * @arg @ref LL_SSI_INSTSIZE_0BIT - * @arg @ref LL_SSI_INSTSIZE_4BIT - * @arg @ref LL_SSI_INSTSIZE_8BIT - * @arg @ref LL_SSI_INSTSIZE_16BIT - * @retval None - */ -__STATIC_INLINE void ll_spi_set_instruction_size(ssi_regs_t *SPIx, uint32_t size) -{ - MODIFY_REG(SPIx->SPI_CTRL0, SSI_SCTRL0_INSTL, size); -} - -/** - * @brief Get Dual/Quad SPI mode instruction length in bits - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | INSTL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_INSTSIZE_0BIT - * @arg @ref LL_SSI_INSTSIZE_4BIT - * @arg @ref LL_SSI_INSTSIZE_8BIT - * @arg @ref LL_SSI_INSTSIZE_16BIT - */ -__STATIC_INLINE uint32_t ll_spi_get_instruction_size(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->SPI_CTRL0, SSI_SCTRL0_INSTL)); -} - -/** - * @brief Set Dual/Quad SPI mode address length in bits - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | ADDRL - * - * @param SPIx SPI instance - * @param size This parameter can be one of the following values: - * @arg @ref LL_SSI_ADDRSIZE_0BIT - * @arg @ref LL_SSI_ADDRSIZE_4BIT - * @arg @ref LL_SSI_ADDRSIZE_8BIT - * @arg @ref LL_SSI_ADDRSIZE_12BIT - * @arg @ref LL_SSI_ADDRSIZE_16BIT - * @arg @ref LL_SSI_ADDRSIZE_20BIT - * @arg @ref LL_SSI_ADDRSIZE_24BIT - * @arg @ref LL_SSI_ADDRSIZE_28BIT - * @arg @ref LL_SSI_ADDRSIZE_32BIT - * @arg @ref LL_SSI_ADDRSIZE_36BIT - * @arg @ref LL_SSI_ADDRSIZE_40BIT - * @arg @ref LL_SSI_ADDRSIZE_44BIT - * @arg @ref LL_SSI_ADDRSIZE_48BIT - * @arg @ref LL_SSI_ADDRSIZE_52BIT - * @arg @ref LL_SSI_ADDRSIZE_56BIT - * @arg @ref LL_SSI_ADDRSIZE_60BIT - * @retval None - */ -__STATIC_INLINE void ll_spi_set_address_size(ssi_regs_t *SPIx, uint32_t size) -{ - MODIFY_REG(SPIx->SPI_CTRL0, SSI_SCTRL0_ADDRL, size); -} - -/** - * @brief Get Dual/Quad SPI mode address length in bits - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | ADDRL - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_ADDRSIZE_0BIT - * @arg @ref LL_SSI_ADDRSIZE_4BIT - * @arg @ref LL_SSI_ADDRSIZE_8BIT - * @arg @ref LL_SSI_ADDRSIZE_12BIT - * @arg @ref LL_SSI_ADDRSIZE_16BIT - * @arg @ref LL_SSI_ADDRSIZE_20BIT - * @arg @ref LL_SSI_ADDRSIZE_24BIT - * @arg @ref LL_SSI_ADDRSIZE_28BIT - * @arg @ref LL_SSI_ADDRSIZE_32BIT - * @arg @ref LL_SSI_ADDRSIZE_36BIT - * @arg @ref LL_SSI_ADDRSIZE_40BIT - * @arg @ref LL_SSI_ADDRSIZE_44BIT - * @arg @ref LL_SSI_ADDRSIZE_48BIT - * @arg @ref LL_SSI_ADDRSIZE_52BIT - * @arg @ref LL_SSI_ADDRSIZE_56BIT - * @arg @ref LL_SSI_ADDRSIZE_60BIT - */ -__STATIC_INLINE uint32_t ll_spi_get_address_size(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->SPI_CTRL0, SSI_SCTRL0_ADDRL)); -} - -/** - * @brief Set Dual/Quad SPI mode address and instruction transfer format - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | TRANSTYPE - * - * @param SPIx SPI instance - * @param format This parameter can be one of the following values: - * @arg @ref LL_SSI_INST_ADDR_ALL_IN_SPI - * @arg @ref LL_SSI_INST_IN_SPI_ADDR_IN_SPIFRF - * @arg @ref LL_SSI_INST_ADDR_ALL_IN_SPIFRF - * @retval None - */ -__STATIC_INLINE void ll_spi_set_add_inst_transfer_format(ssi_regs_t *SPIx, uint32_t format) -{ - MODIFY_REG(SPIx->SPI_CTRL0, SSI_SCTRL0_TRANSTYPE, format); -} - -/** - * @brief Get Dual/Quad SPI mode address and instruction transfer format - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * SCTRL0 | TRANSTYPE - * - * @param SPIx SPI instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SSI_INST_ADDR_ALL_IN_SPI - * @arg @ref LL_SSI_INST_IN_SPI_ADDR_IN_SPIFRF - * @arg @ref LL_SSI_INST_ADDR_ALL_IN_SPIFRF - */ -__STATIC_INLINE uint32_t ll_spi_get_addr_inst_transfer_format(ssi_regs_t *SPIx) -{ - return (uint32_t)(READ_BITS(SPIx->SPI_CTRL0, SSI_SCTRL0_TRANSTYPE)); -} - -/** @} */ - -/** @defgroup SPI_LL_EF_Init SPIM Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize SSI registers (Registers restored to their default values). - * @param SPIx SSI instance - * @retval An error_status_t enumeration value: - * - SUCCESS: SSI registers are de-initialized - * - ERROR: SSI registers are not de-initialized - */ -error_status_t ll_spim_deinit(ssi_regs_t *SPIx); - -/** - * @brief Initialize SPIM registers according to the specified - * parameters in p_spi_init. - * @param SPIx SSI instance - * @param p_spi_init Pointer to a ll_spim_init_t structure that contains the configuration - * information for the specified SPIM peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: SSI registers are initialized according to p_spi_init content - * - ERROR: Problem occurred during SSI Registers initialization - */ -error_status_t ll_spim_init(ssi_regs_t *SPIx, ll_spim_init_t *p_spi_init); - -/** - * @brief Set each field of a @ref ll_spim_init_t type structure to default value. - * @param p_spi_init Pointer to a @ref ll_spim_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_spim_struct_init(ll_spim_init_t *p_spi_init); - -/** @} */ - -/** @defgroup SPIS_LL_Init SPIS Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize SSI registers (Registers restored to their default values). - * @param SPIx SSI instance - * @retval An error_status_t enumeration value: - * - SUCCESS: SSI registers are de-initialized - * - ERROR: SSI registers are not de-initialized - */ -error_status_t ll_spis_deinit(ssi_regs_t *SPIx); - -/** - * @brief Initialize SSI registers according to the specified - * parameters in p_spi_init. - * @param SPIx SSI instance - * @param p_spi_init Pointer to a ll_spis_init_t structure that contains the configuration - * information for the specified SPIS peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: SSI registers are initialized according to p_spi_init content - * - ERROR: Problem occurred during SPI Registers initialization - */ -error_status_t ll_spis_init(ssi_regs_t *SPIx, ll_spis_init_t *p_spi_init); - -/** - * @brief Set each field of a @ref ll_spis_init_t type structure to default value. - * @param p_spi_init Pointer to a @ref ll_spis_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_spis_struct_init(ll_spis_init_t *p_spi_init); -/** @} */ - -/** @defgroup QSPI_LL_Init QSPI Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize SSI registers (Registers restored to their default values). - * @param SPIx SSI instance - * @retval An error_status_t enumeration value: - * - SUCCESS: SSI registers are de-initialized - * - ERROR: SSI registers are not de-initialized - */ -error_status_t ll_qspi_deinit(ssi_regs_t *SPIx); - -/** - * @brief Initialize SSI registers according to the specified - * parameters in SPI_InitStruct. - * @param SPIx SSI instance - * @param p_spi_init Pointer to a ll_qspi_init_t structure that contains the configuration - * information for the specified QSPI peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: SPI registers are initialized according to p_spi_init content - * - ERROR: Problem occurred during SPI Registers initialization - */ -error_status_t ll_qspi_init(ssi_regs_t *SPIx, ll_qspi_init_t *p_spi_init); - -/** - * @brief Set each field of a @ref ll_qspi_init_t type structure to default value. - * @param p_spi_init Pointer to a @ref ll_qspi_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_qspi_struct_init(ll_qspi_init_t *p_spi_init); - -/** @} */ - -/** @} */ - -#endif /* SPIM || SPIS || QSPI0 || QSPI1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_SPI_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_tim.h deleted file mode 100755 index 0a377b5..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_tim.h +++ /dev/null @@ -1,404 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_tim.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of TIMER LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_TIMER TIMER - * @brief TIMER LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef GR55XX_LL_TIMER_H -#define GR55XX_LL_TIMER_H - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (TIMER0) || defined (TIMER1) - -/** @defgroup TIMER_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMER_LL_ES_INIT TIMER Exported init structures - * @{ - */ - -/** - * @brief LL TIMER init Structure definition - */ -typedef struct _ll_timer_init_t { - uint32_t auto_reload; /**< Specifies the auto reload value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number between Min_Data=0x00000000 and - Max_Data=0xFFFFFFFF. - Some timer instances may support 32 bits counters. - In that case this parameter must - be a number between 0x0000 and - 0xFFFFFFFF. - - This feature can be modified afterwards using unitary function - @ref ll_timer_set_auto_reload(). */ -} ll_timer_init_t; -/** @} */ - -/** @} */ - -/** - * @defgroup TIMER_LL_TIMER_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMER_LL_Exported_Constants TIMER Exported Constants - * @{ - */ - -/** @defgroup TIMER_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ -/** - * @brief LL TIMER InitStrcut default configuartion - */ -#define TIMER_DEFAULT_CONFIG \ -{ \ - .auto_reload = SystemCoreClock - 1, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMER_LL_Exported_Macros TIMER Exported Macros - * @{ - */ - -/** @defgroup TIMER_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in TIMER register - * @param __instance__ TIMER instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_TIMER_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in TIMER register - * @param __instance__ TIMER instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_TIMER_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIMER_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup TIMER_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable timer counter. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_timer_enable_counter(timer_regs_t *TIMERx) -{ - SET_BITS(TIMERx->CTRL, TIMER_CTRL_EN); -} - -/** - * @brief Disable timer counter. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_timer_disable_counter(timer_regs_t *TIMERx) -{ - CLEAR_BITS(TIMERx->CTRL, TIMER_CTRL_EN); -} - -/** - * @brief Indicate whether the timer counter is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | EN - * - * @param TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_timer_is_enabled_counter(timer_regs_t *TIMERx) -{ - return (READ_BITS(TIMERx->CTRL, TIMER_CTRL_EN) == (TIMER_CTRL_EN)); -} - -/** - * @brief Set the counter value. - * - * Register|BitsName - * --------|-------- - * VALUE | VALUE - * - * @param TIMERx Timer instance - * @param counter Counter value (between Min_Data=0 and Max_Data=0xFFFFFFFF) - * @retval None - */ -__STATIC_INLINE void ll_timer_set_counter(timer_regs_t *TIMERx, uint32_t counter) -{ - WRITE_REG(TIMERx->VALUE, counter); -} - -/** - * @brief Get the counter value. - * - * Register|BitsName - * --------|-------- - * VALUE | VALUE - * - * @param TIMERx Timer instance - * @retval Counter value (between Min_Data=0 and Max_Data=0xFFFFFFFF) - */ -__STATIC_INLINE uint32_t ll_timer_get_counter(timer_regs_t *TIMERx) -{ - return (uint32_t)(READ_REG(TIMERx->VALUE)); -} - -/** - * @brief Set the auto-reload value. - * @note The counter is blocked while the auto-reload value is null. - * - * Register|BitsName - * --------|-------- - * RELOAD | RELOAD - * - * @param TIMERx Timer instance - * @param auto_reload between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_timer_set_auto_reload(timer_regs_t *TIMERx, uint32_t auto_reload) -{ - WRITE_REG(TIMERx->RELOAD, auto_reload); -} - -/** - * @brief Get the auto-reload value. - * - * Register|BitsName - * --------|-------- - * RELOAD | RELOAD - * - * @param TIMERx Timer instance - * @retval Auto-reload value - */ -__STATIC_INLINE uint32_t ll_timer_get_auto_reload(timer_regs_t *TIMERx) -{ - return (uint32_t)(READ_REG(TIMERx->RELOAD)); -} - -/** @} */ - -/** @defgroup TIM_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable timer interrupt. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_timer_enable_it(timer_regs_t *TIMERx) -{ - SET_BITS(TIMERx->CTRL, TIMER_CTRL_INTEN); -} - -/** - * @brief Disable timer interrput. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_timer_disable_it(timer_regs_t *TIMERx) -{ - CLEAR_BITS(TIMERx->CTRL, TIMER_CTRL_INTEN); -} - -/** - * @brief Indicate whether the timer interrput is enabled. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_timer_is_enabled_it(timer_regs_t *TIMERx) -{ - return (READ_BITS(TIMERx->CTRL, TIMER_CTRL_INTEN) == (TIMER_CTRL_INTEN)); -} - -/** @} */ - -/** @defgroup TIM_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Clear the interrupt flag (INTSTAT). - * - * Register|BitsName - * --------|-------- - * INTSTAT | INTSTAT - * - * @param TIMERx Timer instance - * @retval None - */ -__STATIC_INLINE void ll_timer_clear_flag_it(timer_regs_t *TIMERx) -{ - WRITE_REG(TIMERx->INTSTAT, TIMER_INT_STAT); -} - -/** - * @brief Indicate whether interrupt flag (INTSTAT) is set (interrupt is pending). - * - * Register|BitsName - * --------|-------- - * INTSTAT | INTSTAT - * - * @param TIMERx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_timer_is_active_flag_it(timer_regs_t *TIMERx) -{ - return (READ_BITS(TIMERx->INTSTAT, TIMER_INT_STAT) == (TIMER_INT_STAT)); -} - -/** @} */ - -/** @defgroup TIM_LL_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize TIMER registers (Registers restored to their default values). - * @param TIMERx TIMER instance - * @retval An error_status_t enumeration value: - * - SUCCESS: TIMER registers are de-initialized - * - ERROR: TIMER registers are not de-initialized - */ -error_status_t ll_timer_deinit(timer_regs_t *TIMERx); - -/** - * @brief Initialize TIMER registers according to the specified - * parameters in TIMER_InitStruct. - * @param TIMERx TIMER instance - * @param p_timer_init Pointer to a ll_timer_init_t structure that contains the configuration - * information for the specified TIM peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: TIMER registers are initialized according to p_timer_init content - * - ERROR: Problem occurred during TIMER Registers initialization - */ -error_status_t ll_timer_init(timer_regs_t *TIMERx, ll_timer_init_t *p_timer_init); - -/** - * @brief Set each field of a @ref ll_timer_init_t type structure to default value. - * @param p_timer_init Pointer to a @ref ll_timer_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_timer_struct_init(ll_timer_init_t *p_timer_init); - -/** @} */ - -/** @} */ - -#endif /* TIMER0 || TIMER1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_TIMER_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_uart.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_uart.h deleted file mode 100755 index 5603911..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_uart.h +++ /dev/null @@ -1,1425 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_uart.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of UART LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_UART UART - * @brief UART LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_UART_H__ -#define __GR55xx_LL_UART_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (UART0) || defined (UART1) - -/** @defgroup UART_LL_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup UART_LL_ES_INIT UART Exported init structures - * @{ - */ - -/** - * @brief LL UART init Structure definition - */ -typedef struct _ll_uart_init_t { - uint32_t baud_rate; /**< This field defines expected Usart communication baud rate. - This feature can be modified afterwards using unitary function - @ref ll_uart_set_baud_rate(). */ - - uint32_t data_bits; /**< Specifies the number of - data bits transmitted or - received in a frame. - This parameter can be a value of @ref UART_LL_EC_DATABITS. - This feature can be modified afterwards using unitary function - @ref ll_uart_set_data_bits_length(). */ - - uint32_t stop_bits; /**< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref UART_LL_EC_STOPBITS. - This feature can be modified afterwards using unitary function - @ref ll_uart_set_stop_bits_length(). */ - - uint32_t parity; /**< Specifies the parity mode. - This parameter can be a value of @ref UART_LL_EC_PARITY. - This feature can be modified afterwards using unitary function - @ref ll_uart_set_parity(). */ - - uint32_t hw_flow_ctrl; /**< Specifies whether the - hardware flow control mode - is enabled or disabled. - This parameter can be a value of @ref UART_LL_EC_HWCONTROL. - This feature can be modified afterwards using unitary function - @ref ll_uart_set_hw_flow_ctrl(). */ -} ll_uart_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup UART_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup UART_LL_Exported_Constants UART Exported Constants - * @{ - */ - -/** @defgroup UART_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags definitions which can be used with LL_UART_ReadReg function - * @{ - */ -#define LL_UART_LSR_OE UART_LSR_OE /**< Overrun error flag */ -#define LL_UART_LSR_PE UART_LSR_PE /**< Parity error flag */ -#define LL_UART_LSR_FE UART_LSR_FE /**< Framing error flag */ -#define LL_UART_LSR_BI UART_LSR_BI /**< Break detection flag */ -#define LL_UART_LSR_THRE UART_LSR_THRE /**< Transmit holding register - empty flag */ -#define LL_UART_LSR_TEMT UART_LSR_TEMT /**< Transmitter empty flag */ -#define LL_UART_LSR_RFE UART_LSR_RFE /**< Rx FIFO error flag */ - -#define LL_UART_IIR_MS UART_IIR_IID_MS /**< Modem Status flag */ -#define LL_UART_IIR_NIP UART_IIR_IID_NIP /**< No Interrupt Pending flag */ -#define LL_UART_IIR_THRE UART_IIR_IID_THRE /**< THR Empty flag */ -#define LL_UART_IIR_RDA UART_IIR_IID_RDA /**< Received Data Available flag */ -#define LL_UART_IIR_RLS UART_IIR_IID_RLS /**< Receiver Line Status flag */ -#define LL_UART_IIR_CTO UART_IIR_IID_CTO /**< Character Timeout flag */ - -#define LL_UART_USR_RFF UART_USR_RFF /**< Rx FIFO Full flag */ -#define LL_UART_USR_RFNE UART_USR_RFNE /**< Rx FIFO Not Empty flag */ -#define LL_UART_USR_TFE UART_USR_TFE /**< Tx FIFO Empty flag */ -#define LL_UART_USR_TFNF UART_USR_TFNF /**< Tx FIFO Not Full flag */ -/** @} */ - -/** @defgroup UART_LL_EC_IT IT Defines - * @brief Interrupt definitions which can be used with LL_UART_ReadReg and LL_UART_WriteReg functions - * @{ - */ -#define LL_UART_IER_MS UART_IER_EDSSI /**< Enable Modem Status - Interrupt */ -#define LL_UART_IER_RLS UART_IER_ERLS /**< Enable Receiver Line - Status - Interrupt */ -#define LL_UART_IER_THRE (UART_IER_ETBEI | UART_IER_PTIME) /**< Enable Transmit Holding - Register - Empty Interrupt */ -#define LL_UART_IER_RDA UART_IER_ERBFI /**< Enable Received Data Available - Interrupt and Character - Timeout - Interrupt */ -/** @} */ - -/** @defgroup UART_LL_EC_PARITY Parity Control - * @{ - */ -#define LL_UART_PARITY_NONE UART_LCR_PARITY_NONE /**< Parity control disabled */ -#define LL_UART_PARITY_ODD UART_LCR_PARITY_ODD /**< Parity control enabled and - Odd Parity is selected */ -#define LL_UART_PARITY_EVEN UART_LCR_PARITY_EVEN /**< Parity control enabled and - Even Parity is selected */ -#define LL_UART_PARITY_SP0 UART_LCR_PARITY_SP0 /**< Parity control enabled and - Stick Parity 0 is selected */ -#define LL_UART_PARITY_SP1 UART_LCR_PARITY_SP1 /**< Parity control enabled and - Stick Parity 1 is selected */ -/** @} */ - -/** @defgroup UART_LL_EC_DATABITS Data Bits - * @{ - */ -#define LL_UART_DATABITS_5B UART_LCR_DLS_5 /**< 5 bits word length : Start bit, - 5 data bits, n stop bits */ -#define LL_UART_DATABITS_6B UART_LCR_DLS_6 /**< 6 bits word length : Start bit, - 6 data bits, n stop bits */ -#define LL_UART_DATABITS_7B UART_LCR_DLS_7 /**< 7 bits word length : Start bit, - 7 data bits, n stop bits */ -#define LL_UART_DATABITS_8B UART_LCR_DLS_8 /**< 8 bits word length : Start bit, - 8 data bits, n stop bits */ -/** @} */ - -/** @defgroup UART_LL_EC_STOPBITS Stop Bits - * @{ - */ -#define LL_UART_STOPBITS_1 UART_LCR_STOP_1 /**< 1 stop bit */ -#define LL_UART_STOPBITS_1_5 UART_LCR_STOP_1_5 /**< 1.5 stop bits */ -#define LL_UART_STOPBITS_2 UART_LCR_STOP_2 /**< 2 stop bits */ -/** @} */ - -/** @defgroup UART_LL_EC_HWCONTROL Hardware Flow Control - * @{ - */ -#define LL_UART_HWCONTROL_NONE 0x00000000U /**< CTS and RTS hardware flow - control disabled */ -#define LL_UART_HWCONTROL_RTS_CTS (UART_MCR_AFCE | UART_MCR_RTS) /**< CTS and RTS hardware flow - control enabled */ -/** @} */ - -/** @defgroup UART_LL_EC_TX_FIFO_TH TX FIFO Threshold - * @{ - */ -#define LL_UART_TX_FIFO_TH_EMPTY 0x00000000U /**< TX FIFO empty */ -#define LL_UART_TX_FIFO_TH_CHAR_2 0x00000001U /**< 2 characters in TX FIFO */ -#define LL_UART_TX_FIFO_TH_QUARTER_FULL 0x00000002U /**< TX FIFO 1/4 full */ -#define LL_UART_TX_FIFO_TH_HALF_FULL 0x00000003U /**< TX FIFO 1/2 full */ -/** @} */ - -/** @defgroup UART_LL_EC_RX_FIFO_TH RX FIFO Threshold - * @{ - */ -#define LL_UART_RX_FIFO_TH_CHAR_1 0x00000000U /**< 1 character in RX FIFO */ -#define LL_UART_RX_FIFO_TH_QUARTER_FULL 0x00000001U /**< RX FIFO 1/4 full */ -#define LL_UART_RX_FIFO_TH_HALF_FULL 0x00000002U /**< RX FIFO 1/2 full */ -#define LL_UART_RX_FIFO_TH_FULL_2 0x00000003U /**< RX FIFO 2 less than full */ -/** @} */ - -/** @defgroup UART_LL_EC_RTSPIN_STATE RTS Pin State - * @{ - */ -#define LL_UART_RTSPIN_STATE_ACTIVE 0x00000001U /**< RTS pin active(Logic 1) */ -#define LL_UART_RTSPIN_STATE_INACTIVE 0x00000000U /**< RTS pin inactive(Logic 0) */ -/** @} */ - -/** @defgroup UART_LL_EC_CTSPIN_STATE CTS Pin State - * @{ - */ -#define LL_UART_CTSPIN_STATE_ACTIVE 0x00000001U /**< CTS pin active(Logic 1) */ -#define LL_UART_CTSPIN_STATE_INACTIVE 0x00000000U /**< CTS pin pin inactive(Logic 0) */ -/** @} */ - -/** @defgroup UART_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL UART InitStrcut default configuartion - */ -#define LL_UART_DEFAULT_CONFIG \ -{ \ - .baud_rate = 9600U, \ - .data_bits = LL_UART_DATABITS_8B, \ - .stop_bits = LL_UART_STOPBITS_1, \ - .parity = LL_UART_PARITY_NONE, \ - .hw_flow_ctrl = LL_UART_HWCONTROL_NONE, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup UART_LL_Exported_Macros UART Exported Macros - * @{ - */ - -/** @defgroup UART_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in UART register - * @param __instance__ UART instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_UART_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in UART register - * @param __instance__ UART instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_UART_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @defgroup UART_LL_EM_Exported_Macros_Helper Exported_Macros_Helper - * @{ - */ - -/** - * @brief Compute UARTDIV value according to Peripheral Clock and - * expected Baud Rate (32 bits value of UARTDIV is returned) - * @param __PERIPHCLK__ Peripheral Clock frequency used for UART instance - * @param __BAUDRATE__ Baud rate value to achieve - * @retval UARTDIV value to be used for DLL,DLH registers - */ -#define LL_UART_DIV(__PERIPHCLK__, __BAUDRATE__) ((__PERIPHCLK__) / (__BAUDRATE__) / 16) - -/** - * @brief Compute UARTDLF value according to Peripheral Clock and - * expected Baud Rate (32 bits value of UARTDLF is returned) - * @param __PERIPHCLK__ Peripheral Clock frequency used for UART instance - * @param __BAUDRATE__ Baud rate value to achieve - * @retval UARTDLF value to be used for DLL,DLH registers - */ -#define LL_UART_DLF(__PERIPHCLK__, __BAUDRATE__) ((__PERIPHCLK__) / (__BAUDRATE__) % 16) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup UART_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup UART_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Configure UART DLF and DLH register for achieving expected Baud Rate value. - * @note Peripheral clock and Baud rate values provided as function parameters should be valid - * (Baud rate value != 0) - * - * Register|BitsName - * --------|-------- - * DLL | DLL - * DLH | DLH - * - * @param UARTx UART instance - * @param peripheral_clock Peripheral Clock - * @param baud_rate Baud Rate - * @retval None - */ -__STATIC_INLINE void ll_uart_set_baud_rate(uart_regs_t *UARTx, uint32_t peripheral_clock, uint32_t baud_rate) -{ - register uint32_t uartdiv = LL_UART_DIV(peripheral_clock, baud_rate); - - SET_BITS(UARTx->LCR, UART_LCR_DLAB); - WRITE_REG(UARTx->RBR_DLL_THR.DLL, uartdiv & UART_DLL_DLL); - WRITE_REG(UARTx->DLH_IER.DLH, (uartdiv >> ITEM_8) & UART_DLH_DLH); - CLEAR_BITS(UARTx->LCR, UART_LCR_DLAB); - WRITE_REG(UARTx->DLF, LL_UART_DLF(peripheral_clock, baud_rate)); -} - -/** - * @brief Return current Baud Rate value - * @note In case of non-initialized or invalid value stored in DLL, DLH and DLF register, - * the value 0 will be returned. - * - * Register|BitsName - * --------|-------- - * DLL | DLL - * DLH | DLH - * - * @param UARTx UART instance - * @param peripheral_clock Peripheral Clock - * @retval Baud Rate - */ -__STATIC_INLINE uint32_t ll_uart_get_baud_rate(uart_regs_t *UARTx, uint32_t peripheral_clock) -{ - register uint32_t uartdiv = 0x0U; - register uint32_t baud = 0x0U; - - SET_BITS(UARTx->LCR, UART_LCR_DLAB); - uartdiv = UARTx->RBR_DLL_THR.DLL | (UARTx->DLH_IER.DLH << ITEM_8); - CLEAR_BITS(UARTx->LCR, UART_LCR_DLAB); - - if ((uartdiv != 0) && (UARTx->DLF != 0x0U)) { - baud = peripheral_clock / (ITEM_16 * uartdiv + UARTx->DLF); - } - - return baud; -} - -/** - * @brief Set the length of the data bits - * - * Register|BitsName - * --------|-------- - * LCR | DLS - * - * @param UARTx UART instance - * @param data_bits This parameter can be one of the following values: - * @arg @ref LL_UART_DATABITS_5B - * @arg @ref LL_UART_DATABITS_6B - * @arg @ref LL_UART_DATABITS_7B - * @arg @ref LL_UART_DATABITS_8B - * - * @retval None - */ -__STATIC_INLINE void ll_uart_set_data_bits_length(uart_regs_t *UARTx, uint32_t data_bits) -{ - MODIFY_REG(UARTx->LCR, UART_LCR_DLS, data_bits); -} - -/** - * @brief Return the length of the data bits - * - * Register|BitsName - * --------|-------- - * LCR | DLS - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_DATABITS_5B - * @arg @ref LL_UART_DATABITS_6B - * @arg @ref LL_UART_DATABITS_7B - * @arg @ref LL_UART_DATABITS_8B - */ -__STATIC_INLINE uint32_t ll_uart_get_data_bits_length(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->LCR, UART_LCR_DLS)); -} - -/** - * @brief Set the length of the stop bits - * - * Register|BitsName - * --------|-------- - * LCR | STOP - * - * @param UARTx UART instance - * @param stop_bits This parameter can be one of the following values: - * @arg @ref LL_UART_STOPBITS_1 - * @arg @ref LL_UART_STOPBITS_1_5 (*) - * @arg @ref LL_UART_STOPBITS_2 (*) - * - * (*) STOPBITS_1_5 only valid when DataBits = 5 - * (*) STOPBITS_2 is invalid when DataBits = 5 - * @retval None - */ -__STATIC_INLINE void ll_uart_set_stop_bits_length(uart_regs_t *UARTx, uint32_t stop_bits) -{ - MODIFY_REG(UARTx->LCR, UART_LCR_STOP, stop_bits); -} - -/** - * @brief Retrieve the length of the stop bits - * - * Register|BitsName - * --------|-------- - * LCR | STOP - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_STOPBITS_1 - * @arg @ref LL_UART_STOPBITS_1_5 - * @arg @ref LL_UART_STOPBITS_2 - */ -__STATIC_INLINE uint32_t ll_uart_get_stop_bits_length(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->LCR, UART_LCR_STOP)); -} - -/** - * @brief Configure Parity. - * @note This function selects if hardware parity control - * (generation and detection) is enabled or disabled. - * When the parity control is enabled (Odd,Even,0,1), - * computed parity bit is inserted at the MSB position - * and parity is checked on the received data. - * - * Register|BitsName - * --------|-------- - * LCR | SP - * LCR | EPS - * LCR | PEN - * - * @param UARTx UART instance - * @param parity This parameter can be one of the following values: - * @arg @ref LL_UART_PARITY_NONE - * @arg @ref LL_UART_PARITY_EVEN - * @arg @ref LL_UART_PARITY_ODD - * @arg @ref LL_UART_PARITY_SP0 - * @arg @ref LL_UART_PARITY_SP1 - * @retval None - */ -__STATIC_INLINE void ll_uart_set_parity(uart_regs_t *UARTx, uint32_t parity) -{ - MODIFY_REG(UARTx->LCR, UART_LCR_PARITY, parity); -} - -/** - * @brief Return Parity configuration - * - * Register|BitsName - * --------|-------- - * LCR | SP - * LCR | EPS - * LCR | PEN - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_PARITY_NONE - * @arg @ref LL_UART_PARITY_EVEN - * @arg @ref LL_UART_PARITY_ODD - * @arg @ref LL_UART_PARITY_SP0 - * @arg @ref LL_UART_PARITY_SP1 - */ -__STATIC_INLINE uint32_t ll_uart_get_parity(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->LCR, UART_LCR_PARITY)); -} - -/** - * @brief Configure Character frame format (Datawidth, Parity control, Stop Bits) - * @note This function call is equivalent to the following function call sequence : - * - Data Width configuration using @ref ll_uart_set_data_bits_length() function - * - Parity Control and mode configuration using @ref ll_uart_set_parity() function - * - Stop bits configuration using @ref ll_uart_set_stop_bits_length() function - * - * Register|BitsName - * --------|-------- - * LCR | PS - * LCR | EPS - * LCR | PEN - * LCR | STOP - * LCR | DLS - * - * @param UARTx UART instance - * @param data_bits This parameter can be one of the following values: - * @arg @ref LL_UART_DATABITS_5B - * @arg @ref LL_UART_DATABITS_6B - * @arg @ref LL_UART_DATABITS_7B - * @arg @ref LL_UART_DATABITS_8B - * @param parity This parameter can be one of the following values: - * @arg @ref LL_UART_PARITY_NONE - * @arg @ref LL_UART_PARITY_EVEN - * @arg @ref LL_UART_PARITY_ODD - * @arg @ref LL_UART_PARITY_SP0 - * @arg @ref LL_UART_PARITY_SP1 - * @param stop_bits This parameter can be one of the following values: - * @arg @ref LL_UART_STOPBITS_1 - * @arg @ref LL_UART_STOPBITS_1_5 (*) - * @arg @ref LL_UART_STOPBITS_2 (*) - * - * (*) STOPBITS_1_5 only valid when DataBits = 5 - * (*) STOPBITS_2 is invalid when DataBits = 5 - * @retval None - */ -__STATIC_INLINE void ll_uart_config_character(uart_regs_t *UARTx, uint32_t data_bits, - uint32_t parity, uint32_t stop_bits) -{ - MODIFY_REG(UARTx->LCR, UART_LCR_PARITY | UART_LCR_STOP | UART_LCR_DLS, parity | stop_bits | data_bits); -} - -/** - * @brief Set UART RTS pin state to Active/Inactive - * @note The RTS pin is ACTIVE when logic level is low, and INACTIVE when logic level is high. - * - * Register|BitsName - * --------|-------- - * SRTS | SRTS - * MCR | RTS - * - * @param UARTx UART instance - * @param pin_state This parameter can be one of the following values: - * @arg @ref LL_UART_RTSPIN_STATE_ACTIVE - * @arg @ref LL_UART_RTSPIN_STATE_INACTIVE - * @retval None - */ -__STATIC_INLINE void ll_uart_set_rts_pin_state(uart_regs_t *UARTx, uint32_t pin_state) -{ - WRITE_REG(UARTx->SRTS, pin_state); -} - -/** - * @brief Get UART RTS pin state - * @note The RTS pin is ACTIVE when logic level is low, and INACTIVE when logic level is high. - * - * Register|BitsName - * --------|-------- - * SRTS | SRTS - * MCR | RTS - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_RTSPIN_STATE_ACTIVE - * @arg @ref LL_UART_RTSPIN_STATE_INACTIVE - */ -__STATIC_INLINE uint32_t ll_uart_get_rts_pin_state(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_REG(UARTx->SRTS)); -} - -/** - * @brief Get UART CTS pin state - * @note The CTS pin is ACTIVE when logic level is low, and INACTIVE when logic level is high. - * - * Register|BitsName - * --------|-------- - * MSR | CTS - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_CTSPIN_STATE_ACTIVE - * @arg @ref LL_UART_CTSPIN_STATE_INACTIVE - */ -__STATIC_INLINE uint32_t ll_uart_get_cts_pin_state(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->MSR, UART_MSR_CTS) >> UART_MSR_CTS_Pos); -} - -/** - * @brief Indicate if CTS is changed since the last time the MSR was read - * - * Register|BitsName - * --------|-------- - * MSR | DCTS - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_changed_cts(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->MSR, UART_MSR_DCTS) >> UART_MSR_DCTS_Pos); -} - -/** - * @brief Configure HW Flow Control mode (None or Both CTS and RTS) - * @note This function is used to Enable/Disable UART Auto Flow Control. - * - * Register|BitsName - * --------|-------- - * MCR | AFCE - * MCR | RTS - * - * @param UARTx UART instance - * @param hw_flow_ctrl This parameter can be one of the following values: - * @arg @ref LL_UART_HWCONTROL_NONE - * @arg @ref LL_UART_HWCONTROL_RTS_CTS - * @retval None - */ -__STATIC_INLINE void ll_uart_set_hw_flow_ctrl(uart_regs_t *UARTx, uint32_t hw_flow_ctrl) -{ - MODIFY_REG(UARTx->MCR, UART_MCR_AFCE | UART_MCR_RTS, hw_flow_ctrl); -} - -/** - * @brief Return HW Flow Control configuration (None or Both CTS and RTS) - * - * Register|BitsName - * --------|-------- - * MCR | AFCE - * MCR | RTS - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_HWCONTROL_NONE - * @arg @ref LL_UART_HWCONTROL_RTS_CTS - */ -__STATIC_INLINE uint32_t ll_uart_get_hw_flow_ctrl(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->MCR, UART_MCR_AFCE | UART_MCR_RTS)); -} - -/** - * @brief Enable Break sending - * - * Register|BitsName - * --------|-------- - * LCR | BC - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_enable_break_sending(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SBCR, 0x1U); -} - -/** - * @brief Disable Break sending - * - * Register|BitsName - * --------|-------- - * LCR | BC - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_break_sending(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SBCR, 0x0U); -} - -/** - * @brief Indicate if Break sending is enabled - * - * Register|BitsName - * --------|-------- - * LCR | BC - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_break_sending(uart_regs_t *UARTx) -{ - return READ_REG(UARTx->SBCR); -} - -/** - * @brief Enable TX FIFO and RX FIFO - * - * Register|BitsName - * --------|-------- - * SFE | SFE - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_enable_fifo(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SFE, 0x1U); -} - -/** - * @brief Disable TX FIFO and RX FIFO - * - * Register|BitsName - * --------|-------- - * SFE | SFE - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_fifo(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SFE, 0x0U); -} - -/** - * @brief Indicate if TX FIFO and RX FIFO is enabled - * - * Register|BitsName - * --------|-------- - * SFE | SFE - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_fifo(uart_regs_t *UARTx) -{ - return READ_REG(UARTx->SFE); -} - -/** - * @brief Set threshold of TX FIFO that triggers an THRE interrupt - * - * Register|BitsName - * --------|-------- - * STET | STET - * - * @param UARTx UART instance - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_UART_TX_FIFO_TH_EMPTY - * @arg @ref LL_UART_TX_FIFO_TH_CHAR_2 - * @arg @ref LL_UART_TX_FIFO_TH_QUARTER_FULL - * @arg @ref LL_UART_TX_FIFO_TH_HALF_FULL - * @retval None - */ -__STATIC_INLINE void ll_uart_set_tx_fifo_threshold(uart_regs_t *UARTx, uint32_t threshold) -{ - WRITE_REG(UARTx->STET, threshold); -} - -/** - * @brief Get threshold of TX FIFO that triggers an THRE interrupt - * - * Register|BitsName - * --------|-------- - * STET | STET - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_TX_FIFO_TH_EMPTY - * @arg @ref LL_UART_TX_FIFO_TH_CHAR_2 - * @arg @ref LL_UART_TX_FIFO_TH_QUARTER_FULL - * @arg @ref LL_UART_TX_FIFO_TH_HALF_FULL - */ -__STATIC_INLINE uint32_t ll_uart_get_tx_fifo_threshold(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_REG(UARTx->STET)); -} - -/** - * @brief Set threshold of RX FIFO that triggers an RDA interrupt - * - * Register|BitsName - * --------|-------- - * SRT | SRT - * - * @param UARTx UART instance - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_UART_RX_FIFO_TH_CHAR_1 - * @arg @ref LL_UART_RX_FIFO_TH_QUARTER_FULL - * @arg @ref LL_UART_RX_FIFO_TH_HALF_FULL - * @arg @ref LL_UART_RX_FIFO_TH_FULL_2 - * @retval None - */ -__STATIC_INLINE void ll_uart_set_rx_fifo_threshold(uart_regs_t *UARTx, uint32_t threshold) -{ - WRITE_REG(UARTx->SRT, threshold); -} - -/** - * @brief Get threshold of RX FIFO that triggers an RDA interrupt - * - * Register|BitsName - * --------|-------- - * SRT | SRT - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_UART_RX_FIFO_TH_CHAR_1 - * @arg @ref LL_UART_RX_FIFO_TH_QUARTER_FULL - * @arg @ref LL_UART_RX_FIFO_TH_HALF_FULL - * @arg @ref LL_UART_RX_FIFO_TH_FULL_2 - */ -__STATIC_INLINE uint32_t ll_uart_get_rx_fifo_threshold(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_REG(UARTx->SRT)); -} - -/** - * @brief Get FIFO Transmission Level - * - * Register|BitsName - * --------|-------- - * TFL | TFL - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - */ -__STATIC_INLINE uint32_t ll_uart_get_tx_fifo_level(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_REG(UARTx->TFL)); -} - -/** - * @brief Get FIFO reception Level - * - * Register|BitsName - * --------|-------- - * RFL | RFL - * - * @param UARTx UART instance - * @retval Returned value can be one of the following values: - */ -__STATIC_INLINE uint32_t ll_uart_get_rx_fifo_level(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_REG(UARTx->RFL)); -} - -/** - * @brief Flush Receive FIFO - * - * Register|BitsName - * --------|-------- - * SRR | RFR - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_flush_rx_fifo(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SRR, UART_SRR_RFR); -} - -/** - * @brief Flush Transmit FIFO - * - * Register|BitsName - * --------|-------- - * SRR | XFR - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_flush_tx_fifo(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SRR, UART_SRR_XFR); -} - -/** - * @brief Reset UART - * @note This function asynchronously resets the DW_apb_uart and synchronously - * removes the reset assertion. For a two clock implementation, both pclk - * and sclk domains will be reset. - * - * Register|BitsName - * --------|-------- - * SRR | UR - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_reset(uart_regs_t *UARTx) -{ - WRITE_REG(UARTx->SRR, UART_SRR_UR); -} - -/** @} */ - -/** @defgroup UART_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable Modem Status Interrupt - * - * Register|BitsName - * --------|-------- - * IER | EDSSI - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_enabled_it_ms(uart_regs_t *UARTx) -{ - SET_BITS(UARTx->DLH_IER.IER, UART_IER_EDSSI); -} - -/** - * @brief Enable Receiver Line Status Interrupt - * - * Register|BitsName - * --------|-------- - * IER | RLS - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_enable_it_rls(uart_regs_t *UARTx) -{ - SET_BITS(UARTx->DLH_IER.IER, UART_IER_ERLS); -} - -/** - * @brief Enable Transmit Holding Register Empty Interrupt - * - * Register|BitsName - * --------|-------- - * IER | PTIME - * IER | ETBEI - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_enable_it_thre(uart_regs_t *UARTx) -{ - SET_BITS(UARTx->DLH_IER.IER, UART_IER_PTIME | UART_IER_ETBEI); -} - -/** - * @brief Enable Received Data Available Interrupt and Character Timeout Interrupt - * - * Register|BitsName - * --------|-------- - * IER | ERBFI - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_enable_it_rda(uart_regs_t *UARTx) -{ - SET_BITS(UARTx->DLH_IER.IER, UART_IER_ERBFI); -} - -/** - * @brief Disable Modem Status Interrupt - * - * Register|BitsName - * --------|-------- - * IER | EDSSI - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_it_ms(uart_regs_t *UARTx) -{ - CLEAR_BITS(UARTx->DLH_IER.IER, UART_IER_EDSSI); -} - -/** - * @brief Disable Receiver Line Status Interrupt - * - * Register|BitsName - * --------|-------- - * IER | RLS - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_it_rls(uart_regs_t *UARTx) -{ - CLEAR_BITS(UARTx->DLH_IER.IER, UART_IER_ERLS); -} - -/** - * @brief Disable Transmit Holding Register Empty Interrupt - * - * Register|BitsName - * --------|-------- - * IER | PTIME - * IER | ETBEI - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_it_thre(uart_regs_t *UARTx) -{ - CLEAR_BITS(UARTx->DLH_IER.IER, UART_IER_PTIME | UART_IER_ETBEI); -} - -/** - * @brief Disable Received Data Available Interrupt and Character Timeout Interrupt - * - * Register|BitsName - * --------|-------- - * IER | ERBFI - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_it_rda(uart_regs_t *UARTx) -{ - CLEAR_BITS(UARTx->DLH_IER.IER, UART_IER_ERBFI); -} - -/** - * @brief Check if the UART Modem Status Interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IER | EDSSI - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_it_ms(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->DLH_IER.IER, UART_IER_EDSSI) == (UART_IER_EDSSI)); -} - -/** - * @brief Check if the UART Receiver Line Status Interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IER | RLS - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_it_rls(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->DLH_IER.IER, UART_IER_ERLS) == (UART_IER_ERLS)); -} - -/** - * @brief Check if the UART Transmit Holding Register Empty Interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IER | PTIME - * IER | ETBEI - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_it_thre(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->DLH_IER.IER, UART_IER_PTIME | UART_IER_ETBEI) == \ - (UART_IER_PTIME | UART_IER_ETBEI)); -} - -/** - * @brief Check if the UART Received Data Available Interrupt and Character Timeout Interrupt - * is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IER | ERBFI - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_it_rda(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->DLH_IER.IER, UART_IER_ERBFI) == (UART_IER_ERBFI)); -} - -/** - * @brief Enable the specified UART Interrupt. - * - * Register|BitsName - * --------|-------- - * IER | EDSSI - * IER | ERLS - * IER | PTIME - * IER | ETBEI - * IER | ERBFI - * - * @param UARTx UART instance - * @param mask This parameter can be a combination of the following values: - * @arg @ref LL_UART_IER_MS - * @arg @ref LL_UART_IER_RLS - * @arg @ref LL_UART_IER_THRE - * @arg @ref LL_UART_IER_RDA - * @retval None - */ -__STATIC_INLINE void ll_uart_enable_it(uart_regs_t *UARTx, uint32_t mask) -{ - SET_BITS(UARTx->DLH_IER.IER, mask); -} - -/** - * @brief Disable the specified UART Interrupt. - * - * Register|BitsName - * --------|-------- - * IER | EDSSI - * IER | ERLS - * IER | PTIME - * IER | ETBEI - * IER | ERBFI - * - * @param UARTx UART instance - * @param mask This parameter can be a combination of the following values: - * @arg @ref LL_UART_IER_MS - * @arg @ref LL_UART_IER_RLS - * @arg @ref LL_UART_IER_THRE - * @arg @ref LL_UART_IER_RDA - * @retval None - */ -__STATIC_INLINE void ll_uart_disable_it(uart_regs_t *UARTx, uint32_t mask) -{ - CLEAR_BITS(UARTx->DLH_IER.IER, mask); -} - -/** - * @brief Check if the specified UART Interrupt is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * IER | EDSSI - * IER | ERLS - * IER | PTIME - * IER | ETBEI - * IER | ERBFI - * - * @param UARTx UART instance - * @param mask This parameter can be a combination of the following values: - * @arg @ref LL_UART_IER_MS - * @arg @ref LL_UART_IER_RLS - * @arg @ref LL_UART_IER_THRE - * @arg @ref LL_UART_IER_RDA - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_enabled_it(uart_regs_t *UARTx, uint32_t mask) -{ - return (READ_BITS(UARTx->DLH_IER.IER, mask) == (mask)); -} - -/** @} */ - -/** @defgroup UART_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get UART Receive Line Status Flag - * @note This function is used to get OE/PE/FE/BI/THRE/TEMT/RFE flags in LSR register. - * After LSR register was read, OE/PE/FE/BI/RFE flags will be cleared. - * - * Register|BitsName - * --------|-------- - * LSR | OE - * LSR | PE - * LSR | FE - * LSR | BI - * LSR | THRE - * LSR | TEMT - * LSR | RFE - * - * @param UARTx UART instance - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_UART_LSR_OE - * @arg @ref LL_UART_LSR_PE - * @arg @ref LL_UART_LSR_FE - * @arg @ref LL_UART_LSR_BI - * @arg @ref LL_UART_LSR_THRE - * @arg @ref LL_UART_LSR_TEMT - * @arg @ref LL_UART_LSR_RFE - */ -__STATIC_INLINE uint32_t ll_uart_get_line_status_flag(uart_regs_t *UARTx) -{ - return ((uint32_t)READ_REG(UARTx->LSR)); -} - -/** - * @brief Clear UART Receive Line Status Flag - * @note OE/PE/FE/BI/RFE flags can be cleared by reading LSR register. - * - * Register|BitsName - * --------|-------- - * LSR | OE - * LSR | PE - * LSR | FE - * LSR | BI - * LSR | RFE - * - * @param UARTx UART instance - * @retval None - */ -__STATIC_INLINE void ll_uart_clear_line_status_flag(uart_regs_t *UARTx) -{ - __IO uint32_t tmpreg; - tmpreg = READ_REG(UARTx->LSR); - (void) tmpreg; -} - -/** - * @brief Check if the UART Receive FIFO Full Flag is set or not - * - * Register|BitsName - * --------|-------- - * USR | RFF - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_active_flag_rff(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->USR, UART_USR_RFF) == UART_USR_RFF); -} - -/** - * @brief Check if the UART Receive FIFO Not Empty Flag is set or not - * - * Register|BitsName - * --------|-------- - * USR | RFNE - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_active_flag_rfne(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->USR, UART_USR_RFNE) == UART_USR_RFNE); -} - -/** - * @brief Check if the UART Transmit FIFO Empty Flag is set or not - * - * Register|BitsName - * --------|-------- - * USR | TFE - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_active_flag_tfe(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->USR, UART_USR_TFE) == UART_USR_TFE); -} - -/** - * @brief Check if the UART Transmit FIFO Not Full Flag is set or not - * - * Register|BitsName - * --------|-------- - * USR | TFNF - * - * @param UARTx UART instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_uart_is_active_flag_tfnf(uart_regs_t *UARTx) -{ - return (READ_BITS(UARTx->USR, UART_USR_TFNF) == UART_USR_TFNF); -} - -/** - * @brief Get UART interrupt flags - * @note The interrupt flags will be cleared after reading IIR. - * If interrupt was triggered when reading IIR register, the interrupt will be pended, - * and No Interrupt Pending Flag will be RESET, read IIR - * again can get the pended interrupt - * - * Register|BitsName - * --------|-------- - * IIR | IID - * - * @param UARTx UART instance - * @retval Returned value can be one or combination of the following values: - * @arg @ref LL_UART_IIR_MS - * @arg @ref LL_UART_IIR_NIP - * @arg @ref LL_UART_IIR_THRE - * @arg @ref LL_UART_IIR_RDA - * @arg @ref LL_UART_IIR_RLS - * @arg @ref LL_UART_IIR_CTO - */ -__STATIC_INLINE uint32_t ll_uart_get_it_flag(uart_regs_t *UARTx) -{ - return (uint32_t)(READ_BITS(UARTx->FCR_IIR.IIR, UART_IIR_IID)); -} - -/** @} */ - -/** @defgroup UART_LL_EF_DMA_Management DMA_Management - * @{ - */ - -/** - * @brief Get the data register address used for DMA transfer - * @note The address of data register RBR is the same as the address of THR. - * - * Register|BitsName - * --------|-------- - * RBR | RBR - * THR | THR - * - * @param UARTx UART instance - * @retval Address of data register - */ -__STATIC_INLINE uint32_t ll_uart_dma_get_register_address(uart_regs_t *UARTx) -{ - return ((uint32_t) &(UARTx->RBR_DLL_THR)); -} - -/** @} */ - -/** @defgroup UART_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Read Receiver Data register (Receive Data value, 8 bits) - * - * Register|BitsName - * --------|-------- - * RBR | RBR - * - * @param UARTx UART instance - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t ll_uart_receive_data8(uart_regs_t *UARTx) -{ - return (uint8_t)(READ_REG(UARTx->RBR_DLL_THR.RBR)); -} - -/** - * @brief Write in Transmitter Data Register (Transmit Data value, 8 bits) - * - * Register|BitsName - * --------|-------- - * THR | THR - * - * @param UARTx UART instance - * @param value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void ll_uart_transmit_data8(uart_regs_t *UARTx, uint8_t value) -{ - WRITE_REG(UARTx->RBR_DLL_THR.THR, value); -} - -/** @} */ - -/** @defgroup UART_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize UART registers (Registers restored to their default values). - * @param UARTx UART instance - * @retval An error_status_t enumeration value: - * - SUCCESS: UART registers are de-initialized - * - ERROR: UART registers are not de-initialized - */ -error_status_t ll_uart_deinit(uart_regs_t *UARTx); - -/** - * @brief Initialize UART registers according to the specified - * parameters in p_uart_init. - * @param UARTx UART instance - * @param p_uart_init Pointer to a ll_uart_init_t structure that contains the configuration - * information for the specified UART peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: UART registers are initialized according to p_uart_init content - * - ERROR: Problem occurred during UART Registers initialization - */ -error_status_t ll_uart_init(uart_regs_t *UARTx, ll_uart_init_t *p_uart_init); - -/** - * @brief Set each field of a @ref ll_uart_init_t type structure to default value. - * @param p_uart_init Pointer to a @ref ll_uart_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_uart_struct_init(ll_uart_init_t *p_uart_init); - -/** @} */ - -/** @} */ - -#endif /* UART0 || UART1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_UART_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_wdt.h deleted file mode 100755 index c576cff..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_wdt.h +++ /dev/null @@ -1,359 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_wdt.h - * @author BLE Driver Team - * @brief Header file containing functions prototypes of WDT LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_WDT WDT - * @brief WDT LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55XX_LL_WDT_H__ -#define __GR55XX_LL_WDT_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (WDT) - -/** - * @defgroup WDT_LL_MACRO Defines - * @{ - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup WDT_LL_Private_Constants WDT Private Constants - * @{ - */ - -/** @defgroup WDT_LL_PC_WR_ACCESS Write Access Defines - * @{ - */ -#define LL_WDT_LOCK_WR_ACCESS_ENABLE 0x1ACCE551 /**< WDT LOCK Write Access Enable */ -#define LL_WDT_LOCK_WR_ACCESS_DISABLE (~0x1ACCE551) /**< WDT LOCK Write Access Disable */ -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup WDT_LL_Exported_Macros WDT Exported Macros - * @{ - */ - -/** @defgroup WDT_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in WDT register - * @param __instance__ WDT instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_WDT_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in WDT register - * @param __instance__ WDT instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_WDT_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup WDT_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup WDT_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief Enable write access to WDT_LOAD, WDT_CTRL and WDT_INTCLR registers. - * - * Register|BitsName - * --------|-------- - * LOCK | ENRW - * - * @param WDTx WDT instance - * @retval None - */ -__STATIC_INLINE void ll_wdt_enable_write_access(wdt_regs_t *WDTx) -{ - WRITE_REG(WDTx->LOCK, LL_WDT_LOCK_WR_ACCESS_ENABLE); -} - -/** - * @brief Disable write access to WDT_LOAD, WDT_CTRL and WDT_INTCLR registers. - * - * Register|BitsName - * --------|-------- - * LOCK | ENRW - * - * @param WDTx WDT instance - * @retval None - */ -__STATIC_INLINE void ll_wdt_disable_write_access(wdt_regs_t *WDTx) -{ - WRITE_REG(WDTx->LOCK, LL_WDT_LOCK_WR_ACCESS_DISABLE); -} - -/** - * @brief Enable watchdog counter and interrupt event. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param WDTx WDT instance. - * @retval None - */ -__STATIC_INLINE void ll_wdt_enable(wdt_regs_t *WDTx) -{ - SET_BITS(WDTx->CTRL, WDT_CTRL_INTEN); -} - -/** - * @brief Disable watchdog counter and interrupt event. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param WDTx WDT instance. - * @retval None - */ -__STATIC_INLINE void ll_wdt_disable(wdt_regs_t *WDTx) -{ - CLEAR_BITS(WDTx->CTRL, WDT_CTRL_INTEN); -} - -/** - * @brief Check if the WDT peripheral is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CTRL | INTEN - * - * @param WDTx WDT instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_wdt_is_enabled(wdt_regs_t *WDTx) -{ - return (READ_BITS(WDTx->CTRL, WDT_CTRL_INTEN) == (WDT_CTRL_INTEN)); -} - -/** - * @brief Enable reset output. - * @note RSTEN acts as a mask for the reset output. - * - * Register|BitsName - * --------|-------- - * CTRL | RSTEN - * - * @param WDTx WDT instance. - * @retval None - */ -__STATIC_INLINE void ll_wdt_enable_reset(wdt_regs_t *WDTx) -{ - SET_BITS(WDTx->CTRL, WDT_CTRL_RSTEN); -} - -/** - * @brief Disable reset output. - * - * Register|BitsName - * --------|-------- - * CTRL | RSTEN - * - * @param WDTx WDT instance. - * @retval None - */ -__STATIC_INLINE void ll_wdt_disable_reset(wdt_regs_t *WDTx) -{ - CLEAR_BITS(WDTx->CTRL, WDT_CTRL_RSTEN); -} - -/** - * @brief Check if the WDT reset is enabled or disabled. - * - * Register|BitsName - * --------|-------- - * CTRL | RSTEN - * - * @param WDTx WDT instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_wdt_is_enabled_reset(wdt_regs_t *WDTx) -{ - return (READ_BITS(WDTx->CTRL, WDT_CTRL_RSTEN) == (WDT_CTRL_RSTEN)); -} - -/** - * @brief Specify the WDT down-counter reload value. - * - * Register|BitsName - * --------|-------- - * LOAD | LOAD - * - * @param WDTx WDT instance - * @param counter Value range between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void ll_wdt_set_counter_load(wdt_regs_t *WDTx, uint32_t counter) -{ - WRITE_REG(WDTx->LOAD, counter); -} - -/** - * @brief Get the specified WDT down-counter reload value. - * - * Register|BitsName - * --------|-------- - * LOAD | LOAD - * - * @param WDTx WDT instance - * @retval Value range between Min_Data=0 and Max_Data=0x0FFF - */ -__STATIC_INLINE uint32_t ll_wdt_get_counter_load(wdt_regs_t *WDTx) -{ - return (uint32_t)(READ_REG(WDTx->LOAD)); -} - -/** - * @brief Get current value of the specified WDT decrementing down-counter. - * - * Register|BitsName - * --------|-------- - * VALUE | VALUE - * - * @param WDTx WDT instance - * @retval Value range between Min_Data=0 and Max_Data=0x0FFF - */ -__STATIC_INLINE uint32_t ll_wdt_get_counter_value(wdt_regs_t *WDTx) -{ - return (uint32_t)(READ_REG(WDTx->VALUE)); -} - -/** - * @brief Reloads WDT counter with value defined in the reload register - * - * Register|BitsName - * --------|-------- - * INTCLR | INTCLR - * - * @param WDTx WDT instance - * @retval None - */ -__STATIC_INLINE void ll_wdt_reload_counter(wdt_regs_t *WDTx) -{ - WRITE_REG(WDTx->INTCLR, WDT_INTCLR); -} - -/** @} */ - -/** @defgroup WDT_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Indicate if the WDT Interrupt Flag is set or not. - * @note This bit is set by hardware when the counter has reached 0. It can - * be cleared by software by writing any value to the INTCLR Register. - * - * Register|BitsName - * --------|-------- - * MIS | INTSTAT - * - * @param WDTx WDT instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t ll_wdt_is_active_flag_it(wdt_regs_t *WDTx) -{ - return (READ_BITS(WDTx->MIS, WDT_MIS_INTSTAT) == (WDT_MIS_INTSTAT)); -} - -/** - * @brief Clear Interrupt Status flag. - * - * Register|BitsName - * --------|-------- - * INTCLR| INTCLR - * - * @param WDTx WDT instance. - * @retval None - */ -__STATIC_INLINE void ll_wdt_clear_flag_it(wdt_regs_t *WDTx) -{ - WRITE_REG(WDTx->INTCLR, WDT_INTCLR); -} - -/** @} */ - -/** @} */ - -#endif /* WDT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55XX_LL_WDT_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_xqspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_xqspi.h deleted file mode 100755 index aebb846..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_ll_xqspi.h +++ /dev/null @@ -1,2511 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_ll_xqspi.h - * @author BLE SDK Team - * @brief Header file containing functions prototypes of XQSPI LL library. - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/** @addtogroup PERIPHERAL Peripheral Driver - * @{ - */ - -/** @addtogroup LL_DRIVER LL Driver - * @{ - */ - -/** @defgroup LL_XQSPI XQSPI - * @brief XQSPI LL module driver. - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GR55xx_LL_XQSPI_H__ -#define __GR55xx_LL_XQSPI_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (XQSPI) - -/** @defgroup LL_XQSPI_DRIVER_STRUCTURES Structures - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup XQSPI_LL_ES_INIT XQSPI Exported init structure - * @{ - */ - -/** - * @brief XQSPI init structures definition - */ -typedef struct _ll_xqspi_init_t { - uint32_t mode; /**< Specifies the work mode, XIP mode or QSPI mode. - This parameter can be a value of @ref XQSPI_LL_EC_MODE. */ - - uint32_t cache_mode; /**< Specifies the cache mode in XIP mode. - This parameter can be a value of @ref XQSPI_LL_EC_CACHE_MODE. - This feature can be - modified afterwards using - unitary function - @ref ll_xqspi_enable_cache(). */ - - uint32_t read_cmd; /**< Specifies the XQSPI read command in XIP mode. - This parameter can be a value of @ref XQSPI_LL_EC_XIP_READ_CMD. - This feature can be - modified afterwards using - unitary function - @ref ll_xqspi_set_xip_cmd(). */ - - uint32_t data_size; /**< Specifies the XQSPI data width, only in QSPI mode. - This parameter can be a value of @ref XQSPI_LL_EC_QSPI_DATASIZE. - This feature can be - modified afterwards using - unitary function - @ref ll_xqspi_set_qspi_datasize(). */ - - uint32_t data_order; /**< Specifies the XQSPI data order, MSB oe LSB, only in QSPI mode. - This parameter can be a value of @ref XQSPI_LL_EC_QSPI_DATAORDER. - This feature can be - modified afterwards using - unitary function - @ref ll_xqspi_set_qspi_data_order(). */ - - uint32_t clock_polarity; /**< Specifies the serial clock steady state. - This parameter can be a - value of @ref - XQSPI_LL_EC_QSPI_POLARITY - in XIP mode - or @ref XQSPI_LL_EC_QSPI_POLARITY in QSPI mode. - This feature can be modified afterwards using unitary function - @ref ll_xqspi_set_xip_cpol() or @ref ll_xqspi_set_qspi_cpol(). */ - - uint32_t clock_phase; /**< Specifies the clock active edge for the bit capture. - This parameter can be a - value of @ref - XQSPI_LL_EC_QSPI_PHASE in - XIP mode - or @ref XQSPI_LL_EC_QSPI_PHASE in QSPI mode. - This feature can be modified afterwards using unitary function - @ref ll_xqspi_set_xip_cpha() or @ref ll_xqspi_set_qspi_cpha(). */ - - uint32_t baud_rate; /**< Specifies the BaudRate be used to configure the transmit and - receive SCK clock. - This parameter can be a value of @ref XQSPI_LL_EC_QSPI_BAUD_REAT. - This feature can be modified afterwards using unitary function - @ref ll_xqspi_set_qspi_speed(). */ -} ll_xqspi_init_t; - -/** @} */ - -/** @} */ - -/** - * @defgroup XQSPI_LL_MACRO Defines - * @{ - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup XQSPI_LL_Exported_Constants XQSPI Exported Constants - * @{ - */ - -/** @defgroup XQSPI_LL_EC_MODE XQSPI work mode - * @{ - */ -#define LL_XQSPI_MODE_XIP 0 /**< XIP mode */ -#define LL_XQSPI_MODE_QSPI 1 /**< QSPI mode */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_XIP_READ_CMD XIP read command - * @{ - */ -#define LL_XQSPI_XIP_CMD_READ 0x03 /**< Read mode */ -#define LL_XQSPI_XIP_CMD_FAST_READ 0x0B /**< Fast Read mode */ -#define LL_XQSPI_XIP_CMD_DUAL_OUT_READ 0x3B /**< Dual-Out Fast Read mode */ -#define LL_XQSPI_XIP_CMD_DUAL_IO_READ 0xBB /**< Dual-IO Fast Read mode */ -#define LL_XQSPI_XIP_CMD_QUAD_OUT_READ 0x6B /**< Quad-Out Fast Read mode */ -#define LL_XQSPI_XIP_CMD_QUAD_IO_READ 0xEB /**< Quad-IO Fast Read mode */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_XIP_SS Slave select - * @{ - */ -#define LL_XQSPI_XIP_SS0 (1UL << XQSPI_XIP_CFG_SS_Pos) /**< Slave select 0 */ -#define LL_XQSPI_XIP_SS1 (2UL << XQSPI_XIP_CFG_SS_Pos) /**< Slave select 1 */ -#define LL_XQSPI_XIP_SS2 (4UL << XQSPI_XIP_CFG_SS_Pos) /**< Slave select 2 */ -#define LL_XQSPI_XIP_SS3 (8UL << XQSPI_XIP_CFG_SS_Pos) /**< Slave select 3 */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_XIP_ADDR_MODE Address bytes in command - * @{ - */ -#define LL_XQSPI_XIP_ADDR_3BYTES 0x00000000UL /**< Address command is 3 bytes */ -#define LL_XQSPI_XIP_ADDR_4BYTES XQSPI_XIP_CFG_ADDR4 /**< Address command is 4 bytes */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_XIP_ENDIAN Read data endian mode - * @{ - */ -#define LL_XQSPI_XIP_ENDIAN_BIG 0x00000000UL /**< Read data in big endian */ -#define LL_XQSPI_XIP_ENDIAN_LITTLE XQSPI_XIP_CFG_LE32 /**< Read data in little endian */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_CACHE_MODE XIP cache mode - * @{ - */ -#define LL_XQSPI_CACHE_DIS 0 /**< Cache OFF */ -#define LL_XQSPI_CACHE_EN 1 /**< Cache ON */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_CACHE_FIFO_MODE Cache FIFO mode - * @{ - */ -#define LL_XQSPI_CACHE_FIFO_NORMAL 0x00000000UL /**< FIFO in normal mode */ -#define LL_XQSPI_CACHE_FIFO_CLEAR XQSPI_CACHE_CTRL0_FIFO /**< FIFO in clear mode */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_CACHE_HITMISS_COUNTER_MODE Cache hit/miss counters mode - * @{ - */ -#define LL_XQSPI_CACHE_HITMISS_NORMAL 0x00000000UL /**< Hit/Miss counters in normal mode */ -#define LL_XQSPI_CACHE_HITMISS_CLEAR XQSPI_CACHE_CTRL0_HITMISS /**< Hit/Miss counters in clear mode */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_FLAG QSPI Flags Defines - * @brief Flags defines which can be used with LL_XQSPI_ReadReg function - * @{ - */ -#define LL_XQSPI_QSPI_STAT_RFTF XQSPI_QSPI_STAT_RXWMARK /**< Rx FIFO watermark flag */ -#define LL_XQSPI_QSPI_STAT_RFF XQSPI_QSPI_STAT_RXFULL /**< Rx FIFO full flag */ -#define LL_XQSPI_QSPI_STAT_RFE XQSPI_QSPI_STAT_RXEMPTY /**< Rx FIFO empty flag */ -#define LL_XQSPI_QSPI_STAT_TFTF XQSPI_QSPI_STAT_TXWMARK /**< Tx FIFO watermark flag */ -#define LL_XQSPI_QSPI_STAT_TFF XQSPI_QSPI_STAT_TXFULL /**< Tx FIFO full flag */ -#define LL_XQSPI_QSPI_STAT_TFE XQSPI_QSPI_STAT_TXEMPTY /**< Tx FIFO empty flag */ -#define LL_XQSPI_QSPI_STAT_BUSY XQSPI_QSPI_STAT_XFERIP /**< Busy flag */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_IT QSPI interrupt Defines - * @brief Interrupt defines which can be used with LL_XQSPI_ReadReg and LL_XQSPI_WriteReg functions - * @{ - */ -#define LL_XQSPI_QSPI_IM_DONE XQSPI_QSPI_XFER_DPULSE_Msk /**< Transmite Done Interrupt enable */ -#define LL_XQSPI_QSPI_IM_RFF XQSPI_QSPI_RX_FPULSE_Msk /**< Receive FIFO Full Interrupt enable */ -#define LL_XQSPI_QSPI_IM_RFTF XQSPI_QSPI_RX_WPULSE_Msk /**< Receive FIFO Watermark Interrupt - enable */ -#define LL_XQSPI_QSPI_IM_TFTF XQSPI_QSPI_TX_WPULSE_Msk /**< Transmit FIFO Watermark Interrupt - enable */ -#define LL_XQSPI_QSPI_IM_TFE XQSPI_QSPI_TX_EPULSE_Msk /**< Transmit FIFO Empty Interrupt enable */ - -#define LL_XQSPI_QSPI_IS_DONE XQSPI_QSPI_XFER_DPULSE_Msk /**< Transmite Done Interrupt flag */ -#define LL_XQSPI_QSPI_IS_RFF XQSPI_QSPI_RX_FPULSE_Msk /**< Receive FIFO Full Interrupt flag */ -#define LL_XQSPI_QSPI_IS_RFTF XQSPI_QSPI_RX_WPULSE_Msk /**< Receive FIFO Watermark Interrupt flag */ -#define LL_XQSPI_QSPI_IS_TFTF XQSPI_QSPI_TX_WPULSE_Msk /**< Transmit FIFO Watermark Interrupt - flag */ -#define LL_XQSPI_QSPI_IS_TFE XQSPI_QSPI_TX_EPULSE_Msk /**< Transmit FIFO Empty Interrupt flag */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_FIFO_WATERMARK QSPI FIFO Watermark - * @{ - */ -#define LL_XQSPI_QSPI_FIFO_WATERMARK_1_8 0UL /**< FIFO depth/8 */ -#define LL_XQSPI_QSPI_FIFO_WATERMARK_1_4 1UL /**< FIFO depth/4 */ -#define LL_XQSPI_QSPI_FIFO_WATERMARK_1_2 2UL /**< FIFO depth/2 */ -#define LL_XQSPI_QSPI_FIFO_WATERMARK_3_4 3UL /**< FIFO depth*3/4 */ -#define LL_XQSPI_QSPI_FIFO_DEPTH 16UL /**< FIFO full depth */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_FRAMEFORMAT QSPI Frame Format - * @{ - */ -#define LL_XQSPI_QSPI_FRF_SPI 0x00000000UL /**< SPI frame format for - transfer */ -#define LL_XQSPI_QSPI_FRF_DUALSPI (2UL << XQSPI_QSPI_AUXCTRL_QMODE_Pos) /**< Dual-SPI frame format - for transfer */ -#define LL_XQSPI_QSPI_FRF_QUADSPI (3UL << XQSPI_QSPI_AUXCTRL_QMODE_Pos) /**< Quad-SPI frame format - for transfer */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_DATAORDER QSPI Data Order - * @{ - */ -#define LL_XQSPI_QSPI_LSB 0x00000000UL /**< LSB first for transfer */ -#define LL_XQSPI_QSPI_MSB XQSPI_QSPI_CTRL_MSB1ST /**< MSB first for transfer */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_DATASIZE QSPI Datawidth - * @{ - */ -#define LL_XQSPI_QSPI_DATASIZE_4BIT 0x00000000UL /**< Data length for XQSPI - transfer: 4 bits */ -#define LL_XQSPI_QSPI_DATASIZE_8BIT (1UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 8 bits */ -#define LL_XQSPI_QSPI_DATASIZE_12BIT (2UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 12 bits */ -#define LL_XQSPI_QSPI_DATASIZE_16BIT (3UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 16 bits */ -#define LL_XQSPI_QSPI_DATASIZE_20BIT (4UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 20 bits */ -#define LL_XQSPI_QSPI_DATASIZE_24BIT (5UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 24 bits */ -#define LL_XQSPI_QSPI_DATASIZE_28BIT (6UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 28 bits */ -#define LL_XQSPI_QSPI_DATASIZE_32BIT (7UL << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) /**< Data length for XQSPI - transfer: 32 bits */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_PHASE QSPI Clock Phase - * @{ - */ -#define LL_XQSPI_SCPHA_1EDGE 0 /**< First clock transition is the first data capture edge */ -#define LL_XQSPI_SCPHA_2EDGE 1 /**< Second clock transition is the first data capture edge */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_POLARITY QSPI Clock Polarity - * @{ - */ -#define LL_XQSPI_SCPOL_LOW 0 /**< Clock to 0 when idle */ -#define LL_XQSPI_SCPOL_HIGH 1 /**< Clock to 1 when idle */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_BAUD_REAT QSPI Buad Rate - * @{ - */ -#define LL_XQSPI_BAUD_RATE_64M 0x00000000UL /**< Clock to 64MHz */ -#define LL_XQSPI_BAUD_RATE_48M (1UL << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos) /**< Clock to 48MHz */ -#define LL_XQSPI_BAUD_RATE_32M (2UL << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos) /**< Clock to 32MHz */ -#define LL_XQSPI_BAUD_RATE_24M (3UL << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos) /**< Clock to 24MHz */ -#define LL_XQSPI_BAUD_RATE_16M (4UL << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos) /**< Clock to 16MHz */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_PRESENT QSPI Present Bypass - * @{ - */ -#define LL_XQSPI_ENABLE_PRESENT 0 /**< Enable Present Bypass */ -#define LL_XQSPI_DISABLE_PRESENT 1 /**< Disable Present Bypass */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_QSPI_FLASH_WRITE QSPI Flash write bits - * @{ - */ -#define LL_XQSPI_FLASH_WRITE_128BIT 0 /**< 128bits flash write */ -#define LL_XQSPI_FLASH_WRITE_32BIT 1 /**< 32bits flash write */ -/** @} */ - -/** @defgroup XQSPI_LL_EC_DEFAULT_CONFIG InitStrcut default configuartion - * @{ - */ - -/** - * @brief LL XQSPI InitStrcut default configuartion - */ -#define LL_XQSPI_DEFAULT_CONFIG \ -{ \ - .mode = LL_XQSPI_MODE_QSPI, \ - .cache_mode = LL_XQSPI_CACHE_EN, \ - .read_cmd = LL_XQSPI_XIP_CMD_READ, \ - .data_size = LL_XQSPI_QSPI_DATASIZE_8BIT, \ - .data_order = LL_XQSPI_QSPI_MSB, \ - .clock_polarity = LL_XQSPI_SCPOL_HIGH, \ - .clock_phase = LL_XQSPI_SCPHA_2EDGE, \ - .baud_rate = LL_XQSPI_BAUD_RATE_16M, \ -} -/** @} */ - -/** @} */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup XQSPI_LL_Exported_Macros XQSPI Exported Macros - * @{ - */ - -/** @defgroup XQSPI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in XQSPI register - * @param __instance__ XQSPI instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_XQSPI_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in XQSPI register - * @param __instance__ XQSPI instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_XQSPI_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__) - -/** @} */ - -/** @} */ - -/** @} */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup XQSPI_LL_DRIVER_FUNCTIONS Functions - * @{ - */ - -/** @defgroup XQSPI_LL_XQSPI_Configuration Cache driver functions - * @{ - */ - -/** - * @brief Enable cache function - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |EN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_cache(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_DIS); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); -} - -/** - * @brief Disable cache function - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |EN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_cache(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_DIS); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); -} - -/** - * @brief Check if cache function is enabled - * - * Register|BitsName - * --------|-------- - * CTRL0 |EN - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_cache(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_DIS) != (XQSPI_CACHE_CTRL0_DIS)); -} - -/** - * @brief Enable tag memory flush - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |TAG - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_cache_flush(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_FLUSH); -} - -/** - * @brief Disable tag memory flush - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |TAG - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_cache_flush(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_FLUSH); -} - -/** - * @brief Check if tag memory flush is enabled - * - * Register|BitsName - * --------|-------- - * CTRL0 |TAG - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_cache_flush(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_FLUSH) == (XQSPI_CACHE_CTRL0_FLUSH)); -} - -/** - * @brief Set FIFO mode - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |FIFO - * - * @param XQSPIx XQSPI instance - * @param mode This parameter can be one of the following values: - * @arg @ref LL_XQSPI_CACHE_FIFO_NORMAL - * @arg @ref LL_XQSPI_CACHE_FIFO_CLEAR - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_cache_fifo(xqspi_regs_t *XQSPIx, uint32_t mode) -{ - MODIFY_REG(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_FIFO, mode); -} - -/** - * @brief Get FIFO mode - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |FIFO - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_CACHE_FIFO_NORMAL - * @arg @ref LL_XQSPI_CACHE_FIFO_CLEAR - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_cache_fifo(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_FIFO)); -} - -/** - * @brief Set HIT/MISS mode - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |HITMISS - * - * @param XQSPIx XQSPI instance - * @param mode This parameter can be one of the following values: - * @arg @ref LL_XQSPI_CACHE_HITMISS_NORMAL - * @arg @ref LL_XQSPI_CACHE_HITMISS_CLEAR - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_cache_hitmiss(xqspi_regs_t *XQSPIx, uint32_t mode) -{ - MODIFY_REG(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_HITMISS, mode); -} - -/** - * @brief Get HIT/MISS mode - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |HITMISS - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_CACHE_HITMISS_NORMAL - * @arg @ref LL_XQSPI_CACHE_HITMISS_CLEAR - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_cache_hitmiss(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->CACHE.CTRL0, XQSPI_CACHE_CTRL0_HITMISS)); -} - -/** - * @brief Set debugbus configurations signals - * @note These bits should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |DBGBUS_SEL - * - * @param XQSPIx XQSPI instance - * @param sel This parameter can between: 0 ~ 0x7 - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_cache_dbgbus(xqspi_regs_t *XQSPIx, uint32_t sel) -{ - MODIFY_REG(XQSPIx->CACHE.CTRL1, XQSPI_CACHE_CTRL1_DBGBUS_SEL, sel << XQSPI_CACHE_CTRL1_DBGBUS_SEL_Pos); -} - -/** - * @brief Get debugbus configurations signals - * - * Register|BitsName - * --------|-------- - * CTRL1 |DBGBUS_SEL - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 0x7 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_cache_dbgbus(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->CACHE.CTRL1, XQSPI_CACHE_CTRL1_DBGBUS_SEL) >> \ - XQSPI_CACHE_CTRL1_DBGBUS_SEL_Pos); -} - -/** - * @brief Enable debug bus mux - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |DBGMUX_EN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_cache_dbgmux(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->CACHE.CTRL1, XQSPI_CACHE_CTRL1_DBGMUX_EN); -} - -/** - * @brief Disable debug bus mux - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |DBGMUX_EN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_cache_dbgmux(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->CACHE.CTRL1, XQSPI_CACHE_CTRL1_DBGMUX_EN); -} - -/** - * @brief Check if debug bus mux is enabled - * - * Register|BitsName - * --------|-------- - * CTRL1 |DBGMUX_EN - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_cache_dbgmux(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->CACHE.CTRL1, XQSPI_CACHE_CTRL1_DBGMUX_EN) != (XQSPI_CACHE_CTRL1_DBGMUX_EN)); -} - -/** - * @brief Get hit counter - * @note This bit only be read. - * - * Register|BitsName - * --------|-------- - * HIT_COUNT|HITCOUNT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 0xFFFFFFFF - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_cache_hitcount(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_REG(XQSPIx->CACHE.HIT_COUNT)); -} - -/** - * @brief Get miss counter - * @note This bit only be read. - * - * Register|BitsName - * --------|-------- - * MISS_COUNT|MISSCOUNT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 0xFFFFFFFF - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_cache_misscount(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_REG(XQSPIx->CACHE.MISS_COUNT)); -} - -/** - * @brief Get cache status - * @note This bit only be read. - * - * Register|BitsName - * --------|-------- - * STAT |STAT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 1 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_cache_flag(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->CACHE.STAT, XQSPI_CACHE_STAT)); -} - -/** @} */ - -/** @defgroup XQSPI_LL_XIP_Configuration XIP LL driver functions - * @{ - */ - -/** - * @brief Set read command - * @note These bits should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL0 |CFG_CMD - * - * @param XQSPIx XQSPI instance - * @param cmd This parameter can be one of the following values: - * @arg @ref LL_XQSPI_XIP_CMD_READ - * @arg @ref LL_XQSPI_XIP_CMD_FAST_READ - * @arg @ref LL_XQSPI_XIP_CMD_DUAL_OUT_READ - * @arg @ref LL_XQSPI_XIP_CMD_DUAL_IO_READ - * @arg @ref LL_XQSPI_XIP_CMD_QUAD_OUT_READ - * @arg @ref LL_XQSPI_XIP_CMD_QUAD_IO_READ - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_cmd(xqspi_regs_t *XQSPIx, uint32_t cmd) -{ - MODIFY_REG(XQSPIx->XIP.CTRL0, XQSPI_XIP_CFG_CMD, cmd); -} - -/** - * @brief Get read command - * - * Register|BitsName - * --------|-------- - * CTRL0 |CFG_CMD - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_XIP_CMD_READ - * @arg @ref LL_XQSPI_XIP_CMD_FAST_READ - * @arg @ref LL_XQSPI_XIP_CMD_DUAL_OUT_READ - * @arg @ref LL_XQSPI_XIP_CMD_DUAL_IO_READ - * @arg @ref LL_XQSPI_XIP_CMD_QUAD_OUT_READ - * @arg @ref LL_XQSPI_XIP_CMD_QUAD_IO_READ - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_cmd(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL0, XQSPI_XIP_CFG_CMD)); -} - -/** - * @brief Enable high performance mode - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_HPEN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_xip_hp(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_HPEN); -} - -/** - * @brief Disable high performance mode - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_HPEN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_xip_hp(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_HPEN); -} - -/** - * @brief Check if high performance mode is enabled - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_HPEN - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_xip_hp(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_HPEN) == (XQSPI_XIP_CFG_HPEN)); -} - -/** - * @brief Set slave select - * @note These bits should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_SS - * - * @param XQSPIx XQSPI instance - * @param ss This parameter can be one or more of the following values: - * @arg @ref LL_XQSPI_XIP_SS0 - * @arg @ref LL_XQSPI_XIP_SS1 - * @arg @ref LL_XQSPI_XIP_SS2 - * @arg @ref LL_XQSPI_XIP_SS3 - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_ss(xqspi_regs_t *XQSPIx, uint32_t ss) -{ - MODIFY_REG(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_SS, ss); -} - -/** - * @brief Get slave select - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_SS - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_XIP_SS0 - * @arg @ref LL_XQSPI_XIP_SS1 - * @arg @ref LL_XQSPI_XIP_SS2 - * @arg @ref LL_XQSPI_XIP_SS3 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_ss(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_SS)); -} - -/** - * @brief Set clock phase - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_CPHA - * - * @param XQSPIx XQSPI instance - * @param cpha This parameter can be one or more of the following values: - * @arg @ref LL_XQSPI_SCPHA_1EDGE - * @arg @ref LL_XQSPI_SCPHA_2EDGE - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_cpha(xqspi_regs_t *XQSPIx, uint32_t cpha) -{ - MODIFY_REG(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_CPHA, cpha << XQSPI_XIP_CFG_CPHA_Pos); -} - -/** - * @brief Get clock phase - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_CPHA - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_SCPHA_1EDGE - * @arg @ref LL_XQSPI_SCPHA_2EDGE - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_cpha(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_CPHA) >> XQSPI_XIP_CFG_CPHA_Pos); -} - -/** - * @brief Set clock polarity - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_CPOL - * - * @param XQSPIx XQSPI instance - * @param cpol This parameter can be one or more of the following values: - * @arg @ref LL_XQSPI_SCPOL_LOW - * @arg @ref LL_XQSPI_SCPOL_HIGH - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_cpol(xqspi_regs_t *XQSPIx, uint32_t cpol) -{ - MODIFY_REG(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_CPOL, cpol << XQSPI_XIP_CFG_CPOL_Pos); -} - -/** - * @brief Get clock polarity - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_CPOL - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_SCPOL_LOW - * @arg @ref LL_XQSPI_SCPOL_HIGH - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_cpol(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_CPOL) >> XQSPI_XIP_CFG_CPOL_Pos); -} - -/** - * @brief Set address bytes in command - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_ADDR4 - * - * @param XQSPIx XQSPI instance - * @param size This parameter can be one or more of the following values: - * @arg @ref LL_XQSPI_XIP_ADDR_3BYTES - * @arg @ref LL_XQSPI_XIP_ADDR_4BYTES - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_addr_size(xqspi_regs_t *XQSPIx, uint32_t size) -{ - MODIFY_REG(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_ADDR4, size); -} - -/** - * @brief Get address bytes in command - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_ADDR4 - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_XIP_ADDR_3BYTES - * @arg @ref LL_XQSPI_XIP_ADDR_4BYTES - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_addr_size(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_ADDR4)); -} - -/** - * @brief Set endian in reading data - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_LE32 - * - * @param XQSPIx XQSPI instance - * @param endian This parameter can be one or more of the following values: - * @arg @ref LL_XQSPI_XIP_ENDIAN_BIG - * @arg @ref LL_XQSPI_XIP_ENDIAN_LITTLE - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_endian(xqspi_regs_t *XQSPIx, uint32_t endian) -{ - MODIFY_REG(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_LE32, endian); -} - -/** - * @brief Get endian in reading data - * - * Register|BitsName - * --------|-------- - * CTRL1 |CFG_LE32 - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_XIP_ENDIAN_BIG - * @arg @ref LL_XQSPI_XIP_ENDIAN_LITTLE - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_endian(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL1, XQSPI_XIP_CFG_LE32)); -} - -/** - * @brief Set high performance command - * @note These bits should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL2 |CFG_HPMODE - * - * @param XQSPIx XQSPI instance - * @param cmd This value is specified by different QSPI FLASH - * memory vendor to enter into its status register - * to activate HP mode in dual I/O and Quad I/O - * access. This parameter can between: 0 ~ 0xFF. - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_hp_cmd(xqspi_regs_t *XQSPIx, uint32_t cmd) -{ - MODIFY_REG(XQSPIx->XIP.CTRL2, XQSPI_XIP_CFG_HPMODE, cmd << XQSPI_XIP_CFG_HPMODE_Pos); -} - -/** - * @brief Get high performance command - * - * Register|BitsName - * --------|-------- - * CTRL2 |CFG_HPMODE - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 0xFF. - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_hp_cmd(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL2, XQSPI_XIP_CFG_HPMODE) >> XQSPI_XIP_CFG_HPMODE_Pos); -} - -/** - * @brief Set dummy cycles in command - * @note These bits should not be changed when XIP is ongoing. - * - Fast Read Dual I/O: dummycycles = 4 * cycles + 4 - * - Fast Read Quad I/O: dummycycles = 2 * cycles + 2 - * - Fast Read Dual Out: dummycycles = 8 * cycles - * - Fast Read Quad Out: dummycycles = 8 * cycles - * - * Register|BitsName - * --------|-------- - * CTRL2 |CFG_DUMMYCYCLES - * - * @param XQSPIx XQSPI instance - * @param cycles This parameter can between: 0 ~ 0xF. - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_dummycycles(xqspi_regs_t *XQSPIx, uint32_t cycles) -{ - MODIFY_REG(XQSPIx->XIP.CTRL2, XQSPI_XIP_CFG_DUMMYCYCLES, cycles << XQSPI_XIP_CFG_DUMMYCYCLES_Pos); -} - -/** - * @brief Get dummy cycles in command - * @note - Fast Read Dual I/O: dummycycles = 4 * cycles + 4 - * - Fast Read Quad I/O: dummycycles = 2 * cycles + 2 - * - Fast Read Dual Out: dummycycles = 8 * cycles - * - Fast Read Quad Out: dummycycles = 8 * cycles - * - * Register|BitsName - * --------|-------- - * CTRL2 |CFG_DUMMYCYCLES - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 0xF. - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_dummycycles(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL2, XQSPI_XIP_CFG_DUMMYCYCLES)); -} - -/** - * @brief Set dummy cycles in high performance end - * @note These bits should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL2 |CFG_ENDDUMMY - * - * @param XQSPIx XQSPI instance - * @param cycles This parameter can between: 0 ~ 3. - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_xip_dummy_hp(xqspi_regs_t *XQSPIx, uint32_t cycles) -{ - MODIFY_REG(XQSPIx->XIP.CTRL2, XQSPI_XIP_CFG_ENDDUMMY, cycles << XQSPI_XIP_CFG_ENDDUMMY_Pos); -} - -/** - * @brief Get dummy cycles in high performance end - * - * Register|BitsName - * --------|-------- - * CTRL2 |CFG_ENDDUMMY - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 3. - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_dummy_hp(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.CTRL2, XQSPI_XIP_CFG_ENDDUMMY) >> XQSPI_XIP_CFG_ENDDUMMY_Pos); -} - -/** - * @brief Enable XIP mode - * - * Register|BitsName - * --------|-------- - * CTRL3 |EN_REQ - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_xip(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->XIP.CTRL3, XQSPI_XIP_EN_REQ); -} - -/** - * @brief Disable XIP mode - * - * Register|BitsName - * --------|-------- - * CTRL3 |EN_REQ - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_xip(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->XIP.CTRL3, XQSPI_XIP_EN_REQ); -} - -/** - * @brief Check if XIP mode is enabled - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL3 |EN_REQ - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_xip(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->XIP.CTRL3, XQSPI_XIP_EN_REQ) == (XQSPI_XIP_EN_REQ)); -} - -/** - * @brief Get XIP status - * @note This bit is read-only. - * - * Register|BitsName - * --------|-------- - * STAT |EN_OUT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 1 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_xip_flag(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.STAT, XQSPI_XIP_EN_OUT)); -} - -/** - * @brief Check if XIP interrupt is enabled - * @note This bit is read-only. - * - * Register|BitsName - * --------|-------- - * INTEN |INT_EN - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 1 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_xip_it(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.INTEN, XQSPI_XIP_INT_EN)); -} - -/** - * @brief Get XIP interrupt flag - * @note This bit is read-only. - * - * Register|BitsName - * --------|-------- - * INTSTAT |INT_STAT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 1 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_flag_xip_it(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.INTSTAT, XQSPI_XIP_INT_STAT)); -} - -/** - * @brief Get XIP interrupt request - * @note This bit is read-only. - * - * Register|BitsName - * --------|-------- - * INTREQ |INT_REQ - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 1 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_req_xip_it(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->XIP.INTREQ, XQSPI_XIP_INT_REQ)); -} - -/** - * @brief Set XIP interrupt enable - * @note This bit is write-only. - * - * Register|BitsName - * --------|-------- - * INTSET |INT_SET - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_xip_it(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->XIP.INTSET, XQSPI_XIP_INT_SET); -} - -/** - * @brief Set XIP interrupt disable - * @note This bit is write-only. - * - * Register|BitsName - * --------|-------- - * INTCLR |INT_CLR - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_xip_it(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->XIP.INTCLR, XQSPI_XIP_INT_CLR); -} - -/** @} */ - -/** @defgroup XQSPI_LL_QSPI_Configuration QSPI driver functions - * @{ - */ - -/** - * @brief Write 8-bit in the data register - * - * Register|BitsName - * --------|-------- - * TX_DATA | DATA - * - * @param XQSPIx XQSPI instance - * @param tx_data This parameter can between: 0x00 ~ 0xFF - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_qspi_transmit_data8(xqspi_regs_t *XQSPIx, uint8_t tx_data) -{ - *((__IOM uint8_t *)&XQSPIx->QSPI.TX_DATA) = tx_data; -} - -/** - * @brief Write 16-bit in the data register - * - * Register|BitsName - * --------|-------- - * TX_DATA | DATA - * - * @param XQSPIx XQSPI instance - * @param tx_data This parameter can between: 0x00 ~ 0xFFFF - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_qspi_transmit_data16(xqspi_regs_t *XQSPIx, uint16_t tx_data) -{ - *((__IOM uint16_t *)&XQSPIx->QSPI.TX_DATA) = tx_data; -} - -/** - * @brief Write 32-bit in the data register - * - * Register|BitsName - * --------|-------- - * TX_DATA | DATA - * - * @param XQSPIx XQSPI instance - * @param tx_data This parameter can between: 0x00 ~ 0xFFFFFFFF - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_qspi_transmit_data32(xqspi_regs_t *XQSPIx, uint32_t tx_data) -{ - *((__IOM uint32_t *)&XQSPIx->QSPI.TX_DATA) = tx_data; -} - -/** - * @brief Read 8 bits in the data register - * - * Register|BitsName - * --------|-------- - * RX_DATA | DATA - * - * @param XQSPIx XQSPI instance - * @retval Returned Value between: 0x00 ~ 0xFF - */ -SECTION_RAM_CODE __STATIC_INLINE uint8_t ll_xqspi_qspi_receive_data8(xqspi_regs_t *XQSPIx) -{ - return (uint8_t)(READ_REG(XQSPIx->QSPI.RX_DATA)); -} - -/** - * @brief Read 16 bits in the data register - * - * Register|BitsName - * --------|-------- - * RX_DATA | DATA - * - * @param XQSPIx XQSPI instance - * @retval Returned Value between: 0x00 ~ 0xFFFF - */ -SECTION_RAM_CODE __STATIC_INLINE uint16_t ll_xqspi_qspi_receive_data16(xqspi_regs_t *XQSPIx) -{ - return (uint16_t)(READ_REG(XQSPIx->QSPI.RX_DATA)); -} - -/** - * @brief Read 32 bits in the data register - * - * Register|BitsName - * --------|-------- - * RX_DATA | DATA - * - * @param XQSPIx XQSPI instance - * @retval Returned Value between: 0x00 ~ 0xFFFFFFFF - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_qspi_receive_data32(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_REG(XQSPIx->QSPI.RX_DATA)); -} - -/** - * @brief Set TX FIFO threshold level - * @note FIFO maximum depth is 16 units. - * - * Register|BitsName - * --------|-------- - * CTRL |TXWMARK - * - * @param XQSPIx XQSPI instance - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_8 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_4 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_2 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_3_4 - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_tft(xqspi_regs_t *XQSPIx, uint32_t threshold) -{ - MODIFY_REG(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_TXWMARK, threshold << XQSPI_QSPI_CTRL_TXWMARK_Pos); -} - -/** - * @brief Get TX FIFO threshold level - * @note FIFO maximum depth is 16 units. - * - * Register|BitsName - * --------|-------- - * CTRL |TXWMARK - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_8 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_4 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_2 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_3_4 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_tft(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_TXWMARK) >> XQSPI_QSPI_CTRL_TXWMARK_Pos); -} - -/** - * @brief Set RX FIFO threshold level - * @note FIFO maximum depth is 16 units. - * - * Register|BitsName - * --------|-------- - * CTRL |RXWMARK - * - * @param XQSPIx XQSPI instance - * @param threshold This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_8 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_4 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_2 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_3_4 - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_rft(xqspi_regs_t *XQSPIx, uint32_t threshold) -{ - MODIFY_REG(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_RXWMARK, threshold << XQSPI_QSPI_CTRL_RXWMARK_Pos); -} - -/** - * @brief Get RX FIFO threshold level - * @note FIFO maximum depth is 16 units. - * - * Register|BitsName - * --------|-------- - * CTRL |RXWMARK - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_8 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_4 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_1_2 - * @arg @ref LL_XQSPI_QSPI_FIFO_WATERMARK_3_4 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_rft(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_RXWMARK) >> XQSPI_QSPI_CTRL_RXWMARK_Pos); -} - -/** - * @brief Enable dummy cycles - * - * Register|BitsName - * --------|-------- - * CTRL |MWAITEN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi_dummy(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_MWAITEN); -} - -/** - * @brief Disable dummy cycles - * - * Register|BitsName - * --------|-------- - * CTRL |MWAITEN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi_dummy(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_MWAITEN); -} - -/** - * @brief Check if dummy cycles is enabled - * - * Register|BitsName - * --------|-------- - * CTRL |MWAITEN - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_qspi_dummy(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_MWAITEN) == (XQSPI_QSPI_CTRL_MWAITEN)); -} - -/** - * @brief Enable DMA mode - * - * Register|BitsName - * --------|-------- - * CTRL |DMA - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi_dma(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_DMA); -} - -/** - * @brief Disable DMA mode - * - * Register|BitsName - * --------|-------- - * CTRL |DMA - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi_dma(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_DMA); -} - -/** - * @brief Check if DMA mode is enabled - * - * Register|BitsName - * --------|-------- - * CTRL |DMA - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_qspi_dma(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_DMA) == (XQSPI_QSPI_CTRL_DMA)); -} - -/** - * @brief Set clock polarity - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL |CPOL - * - * @param XQSPIx XQSPI instance - * @param cpol This parameter can be one of the following values: - * @arg @ref LL_XQSPI_SCPOL_LOW - * @arg @ref LL_XQSPI_SCPOL_HIGH - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_cpol(xqspi_regs_t *XQSPIx, uint32_t cpol) -{ - MODIFY_REG(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CPOL, cpol << XQSPI_QSPI_CTRL_CPOL_Pos); -} - -/** - * @brief Get clock polarity - * - * Register|BitsName - * --------|-------- - * CTRL |CPOL - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_SCPOL_LOW - * @arg @ref LL_XQSPI_SCPOL_HIGH - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_cpol(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CPOL) >> XQSPI_QSPI_CTRL_CPOL_Pos); -} - -/** - * @brief Set clock phase - * @note This bit should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * CTRL |CPHA - * - * @param XQSPIx XQSPI instance - * @param cpha This parameter can be one of the following values: - * @arg @ref LL_XQSPI_SCPHA_1EDGE - * @arg @ref LL_XQSPI_SCPHA_2EDGE - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_cpha(xqspi_regs_t *XQSPIx, uint32_t cpha) -{ - MODIFY_REG(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CPHA, cpha << XQSPI_QSPI_CTRL_CPHA_Pos); -} - -/** - * @brief Get clock phase - * - * Register|BitsName - * --------|-------- - * CTRL |CPHA - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_SCPHA_1EDGE - * @arg @ref LL_XQSPI_SCPHA_2EDGE - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_cpha(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CPHA) >> XQSPI_QSPI_CTRL_CPHA_Pos); -} - -/** - * @brief Set serial data order - * - * Register|BitsName - * --------|-------- - * CTRL |MSB1ST - * - * @param XQSPIx XQSPI instance - * @param order This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_LSB - * @arg @ref LL_XQSPI_QSPI_MSB - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_data_order(xqspi_regs_t *XQSPIx, uint32_t order) -{ - MODIFY_REG(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_MSB1ST, order); -} - -/** - * @brief Get serial data order - * - * Register|BitsName - * --------|-------- - * CTRL |MSB1ST - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_LSB - * @arg @ref LL_XQSPI_QSPI_MSB - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_data_order(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_MSB1ST)); -} - -/** - * @brief Enable continuous transfer mode - * - * Register|BitsName - * --------|-------- - * CTRL |CONTXFER - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi_contxfer(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CONTXFER); -} - -/** - * @brief Disable continuous transfer mode - * - * Register|BitsName - * --------|-------- - * CTRL |CONTXFER - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi_contxfer(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CONTXFER); -} - -/** - * @brief Check if continuous transfer mode is enabled - * - * Register|BitsName - * --------|-------- - * CTRL |CONTXFER - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_qspi_contxfer(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.CTRL, XQSPI_QSPI_CTRL_CONTXFER) == (XQSPI_QSPI_CTRL_CONTXFER)); -} - -/** - * @brief Enable continuous transfer extend mode - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|CONTXFERX - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi_contxfer_extend(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_CONTXFERX); -} - -/** - * @brief Disable continuous transfer extend mode - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|CONTXFERX - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi_contxfer_extend(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_CONTXFERX); -} - -/** - * @brief Check if continuous transfer extend mode is enabled - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|CONTXFERX - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_qspi_contxfer_extend(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_CONTXFERX) == (XQSPI_QSPI_AUXCTRL_CONTXFERX)); -} - -/** - * @brief Set data size - * @note These bits should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|BITSIZE - * - * @param XQSPIx XQSPI instance - * @param szie This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_DATASIZE_4BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_8BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_12BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_16BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_20BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_24BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_28BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_32BIT - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_datasize(xqspi_regs_t *XQSPIx, uint32_t szie) -{ - MODIFY_REG(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_BITSIZE, szie); -} - -/** - * @brief Get data size - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|BITSIZE - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_DATASIZE_4BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_8BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_12BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_16BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_20BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_24BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_28BIT - * @arg @ref LL_XQSPI_QSPI_DATASIZE_32BIT - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_datasize(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_BITSIZE)); -} - -/** - * @brief Enable inhibt data input to RX FIFO - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|INHIBITDIN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_inhibt_rx(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_INHIBITDIN); -} - -/** - * @brief Disable inhibt data input to RX FIFO - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|INHIBITDIN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_inhibt_rx(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_INHIBITDIN); -} - -/** - * @brief Check if inhibt data input to RX FIFO is enabled - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|INHIBITDIN - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_inhibt_rx(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_INHIBITDIN) == XQSPI_QSPI_AUXCTRL_INHIBITDIN); -} - -/** - * @brief Enable inhibt data output to TX FIFO - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|INHIBITDOUT - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_inhibt_tx(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_INHIBITDOUT); -} - -/** - * @brief Disable inhibt data output to TX FIFO - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|INHIBITDOUT - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_inhibt_tx(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_INHIBITDOUT); -} - -/** - * @brief Check if inhibt data input to TX FIFO is enabled - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|INHIBITDOUT - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_inhibt_tx(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_INHIBITDOUT) == XQSPI_QSPI_AUXCTRL_INHIBITDOUT); -} - -/** - * @brief Set frame format - * @note These bits should not be changed when communication is ongoing. - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|QMODE - * - * @param XQSPIx XQSPI instance - * @param format This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_FRF_SPI - * @arg @ref LL_XQSPI_QSPI_FRF_DUALSPI - * @arg @ref LL_XQSPI_QSPI_FRF_QUADSPI - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_frf(xqspi_regs_t *XQSPIx, uint32_t format) -{ - MODIFY_REG(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_QMODE, format); -} - -/** - * @brief Get frame format - * - * Register|BitsName - * --------|-------- - * AUX_CTRL|QMODE - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one even value: - * @arg @ref LL_XQSPI_QSPI_FRF_SPI - * @arg @ref LL_XQSPI_QSPI_FRF_DUALSPI - * @arg @ref LL_XQSPI_QSPI_FRF_QUADSPI - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_frf(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.AUX_CTRL, XQSPI_QSPI_AUXCTRL_QMODE)); -} - -/** - * @brief Get QSPI status - * - * Register|BitsName - * --------|-------- - * STATUS | RXFULL RXWMARK RXEMPTY TXFULL TXWMARK TXEMPTY XFERIP - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one or combination of the following values: - * @arg @ref LL_XQSPI_QSPI_STAT_RFTF - * @arg @ref LL_XQSPI_QSPI_STAT_RFF - * @arg @ref LL_XQSPI_QSPI_STAT_RFE - * @arg @ref LL_XQSPI_QSPI_STAT_TFTF - * @arg @ref LL_XQSPI_QSPI_STAT_TFF - * @arg @ref LL_XQSPI_QSPI_STAT_TFE - * @arg @ref LL_XQSPI_QSPI_STAT_BUSY - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_status(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_REG(XQSPIx->QSPI.STAT)); -} - -/** - * @brief Check active flag - * - * Register|BitsName - * --------|-------- - * STATUS | RXFULL RXWMARK RXEMPTY TXFULL TXWMARK TXEMPTY XFERIP - * - * @param XQSPIx XQSPI instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_STAT_RFTF - * @arg @ref LL_XQSPI_QSPI_STAT_RFF - * @arg @ref LL_XQSPI_QSPI_STAT_RFE - * @arg @ref LL_XQSPI_QSPI_STAT_TFTF - * @arg @ref LL_XQSPI_QSPI_STAT_TFF - * @arg @ref LL_XQSPI_QSPI_STAT_TFE - * @arg @ref LL_XQSPI_QSPI_STAT_BUSY - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_active_qspi_flag(xqspi_regs_t *XQSPIx, uint32_t flag) -{ - return (READ_BITS(XQSPIx->QSPI.STAT, flag) == (flag)); -} - -/** - * @brief Enable slave select output - * - * Register|BitsName - * --------|-------- - * SLAVE_SEL|OUT3 OUT2 OUT1 OUT0 - * - * @param XQSPIx XQSPI instance - * @param ssout This parameter can between: 0 ~ 0xFF - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi_ssout(xqspi_regs_t *XQSPIx, uint32_t ssout) -{ - SET_BITS(XQSPIx->QSPI.SLAVE_SEL, ssout); -} - -/** - * @brief Disable slave select output - * - * Register|BitsName - * --------|-------- - * SLAVE_SEL|OUT3 OUT2 OUT1 OUT0 - * - * @param XQSPIx XQSPI instance - * @param ssout This parameter can between: 0 ~ 0xFF - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi_ssout(xqspi_regs_t *XQSPIx, uint32_t ssout) -{ - CLEAR_BITS(XQSPIx->QSPI.SLAVE_SEL, ssout); -} - -/** - * @brief Set slave select output polarity - * - * Register|BitsName - * --------|-------- - * SLAVE_SEL_POL|POL3 POL2 POL1 POL0 - * - * @param XQSPIx XQSPI instance - * @param sspol This parameter can between: 0 ~ 0xFF - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_sspol(xqspi_regs_t *XQSPIx, uint32_t sspol) -{ - SET_BITS(XQSPIx->QSPI.SLAVE_SEL_POL, sspol); -} - -/** - * @brief Get slave select output polarity - * - * Register|BitsName - * --------|-------- - * SLAVE_SEL_POL|POL3 POL2 POL1 POL0 - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 0xFF - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_sspol(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_REG(XQSPIx->QSPI.SLAVE_SEL_POL)); -} - -/** - * @brief Get FIFO Transmission Level - * - * Register|BitsName - * --------|-------- - * TX_FIFO_LVL | TXFIFOLVL - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 16 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_tx_fifo_level(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.TX_FIFO_LVL, XQSPI_QSPI_TXFIFOLVL)); -} - -/** - * @brief Get FIFO reception Level - * - * Register|BitsName - * --------|-------- - * RX_FIFO_LVL | RXFIFOLVL - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 16 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_rx_fifo_level(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.RX_FIFO_LVL, XQSPI_QSPI_RXFIFOLVL)); -} - -/** - * @brief Enable interrupt - * @note This bit controls the generation of an interrupt when an event occurs. - * - * Register|BitsName - * --------|-------- - * INTEN |INT_EN - * - * @param XQSPIx XQSPI instance - * @param mask This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_IM_DONE - * @arg @ref LL_XQSPI_QSPI_IM_RFF - * @arg @ref LL_XQSPI_QSPI_IM_RFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFE - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi_it(xqspi_regs_t *XQSPIx, uint32_t mask) -{ - SET_BITS(XQSPIx->QSPI.INTEN, mask); -} - -/** - * @brief Disable interrupt - * @note This bit controls the generation of an interrupt when an event occurs. - * - * Register|BitsName - * --------|-------- - * INTEN |INT_EN - * - * @param XQSPIx XQSPI instance - * @param mask This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_IM_DONE - * @arg @ref LL_XQSPI_QSPI_IM_RFF - * @arg @ref LL_XQSPI_QSPI_IM_RFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFE - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi_it(xqspi_regs_t *XQSPIx, uint32_t mask) -{ - CLEAR_BITS(XQSPIx->QSPI.INTEN, mask); -} - -/** - * @brief Check if interrupt is enabled - * - * Register|BitsName - * --------|-------- - * INTEN |INT_EN - * - * @param XQSPIx XQSPI instance - * @param mask This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_IM_DONE - * @arg @ref LL_XQSPI_QSPI_IM_RFF - * @arg @ref LL_XQSPI_QSPI_IM_RFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFE - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_qspi_it(xqspi_regs_t *XQSPIx, uint32_t mask) -{ - return (READ_BITS(XQSPIx->QSPI.INTEN, mask) == (mask)); -} - -/** - * @brief Get XQSPI interrupt flags - * - * Register|BitsName - * --------|-------- - * INTSTAT |INT_STAT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one or combination of the following values: - * @arg @ref LL_XQSPI_QSPI_IS_DONE - * @arg @ref LL_XQSPI_QSPI_IS_RFF - * @arg @ref LL_XQSPI_QSPI_IS_RFTF - * @arg @ref LL_XQSPI_QSPI_IS_TFTF - * @arg @ref LL_XQSPI_QSPI_IS_TFE - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_it_flag(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_REG(XQSPIx->QSPI.INTSTAT)); -} - -/** - * @brief Check interrupt flag - * - * Register|BitsName - * --------|-------- - * INTSTAT | XFER_DPULSE - * INTSTAT | RX_FPULSE - * INTSTAT | RX_WPULSE - * INTSTAT | TX_WPULSE - * INTSTAT | TX_EPULSE - * - * @param XQSPIx XQSPI instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_IS_DONE - * @arg @ref LL_XQSPI_QSPI_IS_RFF - * @arg @ref LL_XQSPI_QSPI_IS_RFTF - * @arg @ref LL_XQSPI_QSPI_IS_TFTF - * @arg @ref LL_XQSPI_QSPI_IS_TFE - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_qspi_it_flag(xqspi_regs_t *XQSPIx, uint32_t flag) -{ - return (READ_BITS(XQSPIx->QSPI.INTSTAT, flag) == (flag)); -} - -/** - * @brief Clear interrupt flag - * @note Clearing interrupt flag is done by writting INTCLR register - * - * Register|BitsName - * --------|-------- - * INTCLR |INT_CLR - * - * @param XQSPIx XQSPI instance - * @param flag This parameter can be one of the following values: - * @arg @ref LL_XQSPI_QSPI_IM_DONE - * @arg @ref LL_XQSPI_QSPI_IM_RFF - * @arg @ref LL_XQSPI_QSPI_IM_RFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFTF - * @arg @ref LL_XQSPI_QSPI_IM_TFE - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_clear_qspi_flag(xqspi_regs_t *XQSPIx, uint32_t flag) -{ - WRITE_REG(XQSPIx->QSPI.INTCLR, flag); -} - -/** - * @brief Set master inter-transfer delay - * - * Register|BitsName - * --------|-------- - * MSTR_IT_DELAY | MWAIT - * - * @param XQSPIx XQSPI instance - * @param wait This parameter can between: 0 ~ 255 - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_wait(xqspi_regs_t *XQSPIx, uint32_t wait) -{ - MODIFY_REG(XQSPIx->QSPI.MSTR_IT_DELAY, XQSPI_QSPI_MWAIT_MWAIT, wait << XQSPI_QSPI_MWAIT_MWAIT_Pos); -} - -/** - * @brief Get master inter-transfer delay - * - * Register|BitsName - * --------|-------- - * MSTR_IT_DELAY | MWAIT - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can between: 0 ~ 255 - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_wait(xqspi_regs_t *XQSPIx) -{ - return (uint32_t)(READ_BITS(XQSPIx->QSPI.MSTR_IT_DELAY, XQSPI_QSPI_MWAIT_MWAIT) >> XQSPI_QSPI_MWAIT_MWAIT_Pos); -} - -/** - * @brief Enable QSPI - * @note This bit should not be enable when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * SPIEN |EN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_qspi(xqspi_regs_t *XQSPIx) -{ - SET_BITS(XQSPIx->QSPI.SPIEN, XQSPI_QSPI_EN_EN); -} - -/** - * @brief Disable QSPI - * - * Register|BitsName - * --------|-------- - * SPIEN |EN - * - * @param XQSPIx XQSPI instance - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_qspi(xqspi_regs_t *XQSPIx) -{ - CLEAR_BITS(XQSPIx->QSPI.SPIEN, XQSPI_QSPI_EN_EN); -} - -/** - * @brief Check if QSPI is enabled - * - * Register|BitsName - * --------|-------- - * SPIEN |EN - * - * @param XQSPIx XQSPI instance - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enabled_qspi(xqspi_regs_t *XQSPIx) -{ - return (READ_BITS(XQSPIx->QSPI.SPIEN, XQSPI_QSPI_EN_EN) == (XQSPI_QSPI_EN_EN)); -} - -/** - * @brief Set QSPI Flash write bits - * - * Register|BitsName - * --------|-------- - * FLASH_WRITE |FLASH_WRITE - * - * @param XQSPIx XQSPI instance - * @param bits This parameter can be one of the following values: - * @arg @ref LL_XQSPI_FLASH_WRITE_128BIT - * @arg @ref LL_XQSPI_FLASH_WRITE_32BIT - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_flash_write(xqspi_regs_t *XQSPIx, uint32_t bits) -{ - WRITE_REG(XQSPIx->QSPI.FLASH_WRITE, bits); -} - -/** - * @brief Get QSPI Flash write bits - * - * Register|BitsName - * --------|-------- - * FLASH_WRITE |FLASH_WRITE - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_FLASH_WRITE_128BIT - * @arg @ref LL_XQSPI_FLASH_WRITE_32BIT - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_flash_write(xqspi_regs_t *XQSPIx) -{ - return READ_REG(XQSPIx->QSPI.FLASH_WRITE); -} - -/** - * @brief Set QSPI Present Bypass - * - * Register|BitsName - * --------|-------- - * BYPASS |BYPASS - * - * @param XQSPIx XQSPI instance - * @param bypass This parameter can be one of the following values: - * @arg @ref LL_XQSPI_ENABLE_PRESENT - * @arg @ref LL_XQSPI_DISABLE_PRESENT - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_present_bypass(xqspi_regs_t *XQSPIx, uint32_t bypass) -{ - WRITE_REG(XQSPIx->QSPI.BYPASS, bypass); -} - -/** - * @brief Get QSPI Present Bypass - * - * Register|BitsName - * --------|-------- - * BYPASS |BYPASS - * - * @param XQSPIx XQSPI instance - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_ENABLE_PRESENT - * @arg @ref LL_XQSPI_DISABLE_PRESENT - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_present_bypass(xqspi_regs_t *XQSPIx) -{ - return READ_REG(XQSPIx->QSPI.BYPASS); -} - -/** - * @brief Enable exflash power - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | EFLASH_PAD_EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_exflash_power(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_EFLASH_PAD_EN); -} - -/** - * @brief Disable exflash power - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | EFLASH_PAD_EN - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_exflash_power(void) -{ - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_EFLASH_PAD_EN); -} - -/** - * @brief Check if exflash power is enabled - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | EFLASH_PAD_EN - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enable_exflash_power(void) -{ - return (READ_BITS(AON->PWR_RET01, AON_PWR_REG01_EFLASH_PAD_EN) == (AON_PWR_REG01_EFLASH_PAD_EN)); -} - -/** - * @brief Set XQSPI serial clock - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XF_SCK_CLK_SEL - * - * @param speed This parameter can be one of the following values: - * @arg @ref LL_XQSPI_BAUD_RATE_64M - * @arg @ref LL_XQSPI_BAUD_RATE_48M - * @arg @ref LL_XQSPI_BAUD_RATE_32M - * @arg @ref LL_XQSPI_BAUD_RATE_24M - * @arg @ref LL_XQSPI_BAUD_RATE_16M - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_set_qspi_speed(uint32_t speed) -{ - MODIFY_REG(AON->PWR_RET01, AON_PWR_REG01_XF_SCK_CLK_SEL, speed); -} - -/** - * @brief Get XQSPI serial clock - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XF_SCK_CLK_SEL - * - * @retval Returned Value can be one of the following values: - * @arg @ref LL_XQSPI_BAUD_RATE_64M - * @arg @ref LL_XQSPI_BAUD_RATE_48M - * @arg @ref LL_XQSPI_BAUD_RATE_32M - * @arg @ref LL_XQSPI_BAUD_RATE_24M - * @arg @ref LL_XQSPI_BAUD_RATE_16M - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_get_qspi_speed(void) -{ - return (uint32_t)(READ_BITS(AON->PWR_RET01, AON_PWR_REG01_XF_SCK_CLK_SEL)); -} - -/** - * @brief Enable cache data retention. - * @note This bit should not be changed when XIP is ongoing.. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XF_TAG_RET - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_enable_cache_retention(void) -{ - SET_BITS(AON->PWR_RET01, AON_PWR_REG01_XF_TAG_RET); -} - -/** - * @brief Disable cache data retention. - * @note This bit should not be changed when XIP is ongoing. - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XF_TAG_RET - * - * @retval None - */ -SECTION_RAM_CODE __STATIC_INLINE void ll_xqspi_disable_cache_retention(void) -{ - CLEAR_BITS(AON->PWR_RET01, AON_PWR_REG01_XF_TAG_RET); -} - -/** - * @brief Check if tag memory retention is enabled - * - * Register|BitsName - * --------|-------- - * PWR_RET01 | XF_TAG_RET - * - * @retval State of bit (1 or 0). - */ -SECTION_RAM_CODE __STATIC_INLINE uint32_t ll_xqspi_is_enable_cache_retention(void) -{ - return (READ_BITS(AON->PWR_RET01, AON_PWR_REG01_XF_TAG_RET) == (AON_PWR_REG01_XF_TAG_RET)); -} - -/** @} */ - -/** @defgroup XQSPI_LL_Init XQSPI Initialization and de-initialization functions - * @{ - */ - -/** - * @brief De-initialize XQSPI registers (Registers restored to their default values). - * @param XQSPIx XQSPI instance - * @retval An error_status_t enumeration value: - * - SUCCESS: XQSPI registers are de-initialized - * - ERROR: XQSPI registers are not de-initialized - */ -error_status_t ll_xqspi_deinit(xqspi_regs_t *XQSPIx); - -/** - * @brief Initialize XQSPI registers according to the specified - * parameters in default. - * @param XQSPIx XQSPI instance - * @param p_xqspi_init Pointer to a ll_xqspi_init_t structure that contains the configuration - * information for the specified XQPSI peripheral. - * @retval An error_status_t enumeration value: - * - SUCCESS: XQSPI registers are initialized according to default - * - ERROR: Problem occurred during XQSPI Registers initialization - */ -error_status_t ll_xqspi_init(xqspi_regs_t *XQSPIx, ll_xqspi_init_t *p_xqspi_init); - -/** - * @brief Set each field of a @ref ll_xqspi_init_t type structure to default value. - * @param p_xqspi_init Pointer to a @ref ll_xqspi_init_t structure - * whose fields will be set to default values. - * @retval None - */ -void ll_xqspi_struct_init(ll_xqspi_init_t *p_xqspi_init); - -/** @} */ - -/** @} */ - -#endif /* XQSPI */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_LL_XQSPI_H__ */ - -/** @} */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_rom_symbol.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_rom_symbol.h deleted file mode 100755 index 8c81071..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/gr55xx_rom_symbol.h +++ /dev/null @@ -1,144 +0,0 @@ -/** - **************************************************************************************** - * - * @file gr55xx_rom_symbol.h - * - * @brief PERIPHERAL API ROM SYMBOL DRIVER - * - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#ifndef __GR55xx_ROM_SYMBOL_H__ -#define __GR55xx_ROM_SYMBOL_H__ - -#include "gr55xx_hal.h" -#include "gr55xx_nvds.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern exflash_handle_t g_exflash_handle; -extern uint32_t *SVC_Table; -extern uint8_t *g_nvds_buf; - -uint16_t gdx_lcp_buf_init(uint32_t buf_addr); -uint8_t nvds_put_patch(NvdsTag_t tag, uint16_t len, const uint8_t *p_buf); -uint8_t nvds_put_rom(NvdsTag_t tag, uint16_t len, const uint8_t *p_buf); -void dfu_cmd_handler_replace_for_encrypt(void); -uint32_t get_patch_rep_addr(uint32_t ori_func); -void __main(void); -void system_platform_init(void); -int main(void); -void $Super$$main(void); -void __iar_program_start(void); -void __iar_data_init3(void); - -void hal_pwr_config_timer_wakeup_ext(uint8_t timer_mode, uint32_t load_count); -void hal_pwr_register_timer_elaspsed_handler(pwr_slp_elapsed_handler_t pwr_slp_elapsed_hander); -hal_status_t hal_calendar_init_ext(calendar_handle_t *p_calendar); -hal_status_t hal_calendar_deinit_ext(calendar_handle_t *p_calendar); -void hal_calendar_register_callback(hal_calendar_callback_t *hal_calendar_callback); -void hal_gpio_init_ext(gpio_regs_t *GPIOx, gpio_init_t *p_gpio_init); -void hal_gpio_deinit_ext(gpio_regs_t *GPIOx, uint32_t gpio_pin); -void hal_gpio_register_callback(hal_gpio_callback_t *callback); -hal_status_t hal_pkc_init_ext(pkc_handle_t *p_pkc); -hal_status_t hal_pkc_deinit_ext(pkc_handle_t *p_pkc); -void hal_pkc_register_callback(hal_pkc_callback_t *hal_pkc_callback); -hal_status_t hal_uart_init_ext(uart_handle_t *p_uart); -hal_status_t hal_uart_deinit_ext (uart_handle_t *p_uart); -void hal_uart_register_callback(hal_uart_callback_t *hal_uart_callback); -hal_status_t hal_hmac_init_ext(hmac_handle_t *p_hmac); -hal_status_t hal_hmac_deinit_ext(hmac_handle_t *p_hmac); -void hal_hmac_register_callback(hal_hmac_callback_t *hal_hmac_callback); -hal_status_t hal_xqspi_init_ext(xqspi_handle_t *p_xqspi); -hal_status_t hal_xqspi_deinit_ext(xqspi_handle_t *p_xqspi); -void hal_xqspi_register_callback(hal_xqspi_callback_t *hal_xqspi_callback); -hal_status_t hal_efuse_init_ext(efuse_handle_t *p_efuse); -hal_status_t hal_efuse_deinit_ext(efuse_handle_t *p_efuse); -void hal_efuse_register_callback(hal_efuse_callback_t *hal_efuse_callback); -hal_status_t hal_rng_init_ext(rng_handle_t *p_rng); -hal_status_t hal_rng_deinit_ext(rng_handle_t *p_rng); -void hal_rng_register_callback(hal_rng_callback_t *hal_rng_callback); -hal_status_t hal_init_ext(void); -hal_status_t hal_deinit_ext(void); -void hal_register_callback(hal_callback_t *hal_callback); -hal_status_t hal_aon_wdt_init_ext(aon_wdt_handle_t *p_aon_wdt); -hal_status_t hal_aon_wdt_deinit_ext(aon_wdt_handle_t *p_aon_wdt); -void hal_aon_wdt_register_callback(hal_aon_wdt_callback_t *aon_wdt_callback); -hal_status_t hal_qspi_init_ext(qspi_handle_t *p_qspi); -hal_status_t hal_qspi_deinit_ext(qspi_handle_t *p_qspi); -void hal_qspi_register_callback(hal_qspi_callback_t *hal_qspi_callback); -hal_status_t hal_timer_base_init_ext(timer_handle_t *p_timer); -hal_status_t hal_timer_base_deinit_ext(timer_handle_t *p_timer); -void hal_timer_register_callback(hal_timer_callback_t *hal_timer_callback); -hal_status_t hal_comp_init_ext(comp_handle_t *p_comp); -hal_status_t hal_comp_deinit_ext(comp_handle_t *p_comp); -void hal_comp_register_callback(comp_callback_t *comp_callback); -hal_status_t hal_exflash_init_ext(exflash_handle_t *p_exflash); -hal_status_t hal_exflash_deinit_ext(exflash_handle_t *p_exflash); -void hal_exflash_register_callback(hal_exflash_callback_t *hal_exflash_callback); -hal_status_t hal_exflash_read_rom(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); -hal_status_t hal_exflash_read_patch(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size); -hal_status_t hal_xqspi_init_ext_patch(xqspi_handle_t *p_xqspi); -hal_status_t hal_xqspi_init_ext_rom(xqspi_handle_t *p_xqspi); -hal_status_t hal_pwm_init_ext(pwm_handle_t *p_pwm); -hal_status_t hal_pwm_deinit_ext(pwm_handle_t *p_pwm); -void hal_pwm_register_callback(hal_pwm_callback_t *hal_pwm_callback); -hal_status_t hal_i2c_init_ext(i2c_handle_t *p_i2c); -hal_status_t hal_i2c_deinit_ext(i2c_handle_t *p_i2c); -void hal_i2c_register_callback(hal_i2c_callback_t *hal_i2c_callback); -hal_status_t hal_dual_timer_init_ext(dual_timer_handle_t *p_dual_timer); -hal_status_t hal_dual_timer_deinit_ext(dual_timer_handle_t *p_dual_timer); -void hal_dual_timer_register_callback(hal_dual_timer_callback_t *hal_dual_timer_callback); -hal_status_t hal_wdt_init_ext(wdt_handle_t *p_wdt); -hal_status_t hal_wdt_deinit_ext(wdt_handle_t *p_wdt); -void hal_wdt_register_callback(hal_wdt_callback_t *hal_wdt_callback); -hal_status_t hal_i2s_init_ext(i2s_handle_t *p_i2s); -hal_status_t hal_i2s_deinit_ext(i2s_handle_t *p_i2s); -void hal_i2s_register_callback(hal_i2s_callback_t *hal_i2s_callback); -hal_status_t hal_aes_init_ext(aes_handle_t *p_aes); -hal_status_t hal_aes_deinit_ext(aes_handle_t *p_aes); -void hal_aes_register_callback(aes_callback_t *aes_callback); -void hal_aon_gpio_init_ext(aon_gpio_init_t *p_aon_gpio_init); -void hal_aon_gpio_deinit_ext(uint32_t aon_gpio_pin); -void hal_aon_gpio_register_callback(aon_gpio_callback_t *aon_gpio_callback); -hal_status_t hal_adc_init_ext(adc_handle_t *p_adc); -hal_status_t hal_adc_deinit_ext(adc_handle_t *p_adc); -void hal_adc_register_callback(adc_callback_t *adc_callback); -hal_status_t hal_spi_init_ext(spi_handle_t *p_spi); -hal_status_t hal_spi_deinit_ext(spi_handle_t *p_spi); -void hal_spi_register_callback(hal_spi_callback_t *hal_spi_callback); - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_ROM_SYMBOL_H__ */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_delay.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_delay.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_temp_api.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_temp_api.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_vbat_api.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_vbat_api.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_voltage_api.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_adc_voltage_api.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aes.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aes.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_gpio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_gpio_ex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_gpio_ex.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_aon_wdt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_bod.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_bod.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_calendar.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_calendar.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_cgc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_cgc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_comp.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_comp.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_conf.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_conf.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_cortex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_cortex.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_def.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_def.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_dual_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_dual_tim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_efuse.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_efuse.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_exflash.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_exflash.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_gpio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_gpio_ex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_gpio_ex.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_hmac.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_hmac.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_i2c.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_i2c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_i2s.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_i2s.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_iso7816.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_iso7816.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_msio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_msio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_msio_ex.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_msio_ex.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pkc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pkc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pwm.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pwm.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pwr.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_pwr.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_qspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_qspi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_rng.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_rng.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_sleep_timer.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_sleep_timer.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_spi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_spi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_spi_v2.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_spi_v2.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_tim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_uart.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_uart.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_wdt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_xqspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_hal_xqspi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_adc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_adc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aes.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aes.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aon_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aon_gpio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aon_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_aon_wdt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_bod.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_bod.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_calendar.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_calendar.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_cgc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_cgc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_comp.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_comp.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_dma.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_dma.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_dual_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_dual_tim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_efuse.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_efuse.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_gpio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_gpio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_hmac.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_hmac.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_i2c.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_i2c.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_i2s.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_i2s.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_iso7816.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_iso7816.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_msio.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_msio.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pkc.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pkc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pwm.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pwm.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pwr.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_pwr.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_rng.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_rng.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_spi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_spi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_tim.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_tim.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_uart.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_uart.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_wdt.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_wdt.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_xqspi.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/gr55xx_ll_xqspi.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/grx_hal.h b/gr551x/sdk_liteos/gr551x_sdk/drivers/inc/hal/grx_hal.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_adc.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_adc.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_adc_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_adc_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_aon_wdt.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_aon_wdt.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_bod.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_bod.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_comp.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_comp.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_dual_tim.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_dual_tim.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_gpiote.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_gpiote.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_graphics_qspi.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_graphics_qspi.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2c.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2c.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2c_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2c_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2s.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2s.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2s_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_i2s_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_io.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_io.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_iso7816.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_iso7816.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwm.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwm.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwm_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwm_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwr_mgmt.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_pwr_mgmt.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_qspi.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_qspi.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_qspi_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_qspi_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rng.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rng.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rtc.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rtc.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rtos_cfg.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_rtos_cfg.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_soft_encoder.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_soft_encoder.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_spi.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_spi.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_spi_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_spi_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_tim.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_tim.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_uart.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_uart.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_uart_dma.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/app_uart_dma.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal.c deleted file mode 100755 index 268c680..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal.c +++ /dev/null @@ -1,89 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal.c - * @author BLE Driver Team - * @brief HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_callback_t hal_callback = { - .msp_init = hal_msp_init, - .msp_deinit = hal_msp_deinit -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_init(void) -{ - hal_register_callback(&hal_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_init_ext(); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_deinit(void) -{ - hal_register_callback(&hal_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_deinit_ext(); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_msp_init(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the hal_msp_deinit could be implemented in the user file - */ -} - -__WEAK void hal_msp_deinit(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the hal_msp_deinit could be implemented in the user file - */ -} - -#endif /* HAL_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_adc.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_adc.c deleted file mode 100755 index 11bdcfe..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_adc.c +++ /dev/null @@ -1,102 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_adc.c - * @author BLE Driver Team - * @brief ADC HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_ADC_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static adc_callback_t adc_callback = { - .adc_msp_init = hal_adc_msp_init, - .adc_msp_deinit = hal_adc_msp_deinit, - .adc_conv_cplt_callback = hal_adc_conv_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_adc_init(adc_handle_t *p_adc) -{ - hal_adc_register_callback(&adc_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_adc_init_ext(p_adc); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_adc_deinit(adc_handle_t *p_adc) -{ - hal_adc_register_callback(&adc_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_adc_deinit_ext(p_adc); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_adc_msp_init(adc_handle_t *p_adc) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_adc_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_adc_msp_deinit(adc_handle_t *p_adc) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_adc_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_adc_conv_cplt_callback(adc_handle_t *p_adc) -{ - return; -} - -#endif /* HAL_ADC_MODULE_ENABLED */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aes.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aes.c deleted file mode 100755 index 590e4c7..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aes.c +++ /dev/null @@ -1,116 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_aes.c - * @author BLE Driver Team - * @brief AES HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_AES_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static aes_callback_t aes_callback = { - .aes_msp_init = hal_aes_msp_init, - .aes_msp_deinit = hal_aes_msp_deinit, - .aes_error_callback = hal_aes_error_callback, - .aes_done_callback = hal_aes_done_callback, - .aes_abort_cplt_callback = hal_aes_abort_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_aes_init(aes_handle_t *p_aes) -{ - hal_aes_register_callback(&aes_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_aes_init_ext(p_aes); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_aes_deinit(aes_handle_t *p_aes) -{ - hal_aes_register_callback(&aes_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_aes_deinit_ext(p_aes); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_aes_msp_init(aes_handle_t *p_aes) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_aes_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_aes_msp_deinit(aes_handle_t *p_aes) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_aes_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_aes_done_callback(aes_handle_t *p_aes) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_aes); -} - -__WEAK void hal_aes_error_callback(aes_handle_t *p_aes) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_aes); -} - -__WEAK void hal_aes_abort_cplt_callback(aes_handle_t *p_aes) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_aes); -} - -#endif /* HAL_AES_MODULE_ENABLED */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_gpio.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_gpio.c deleted file mode 100755 index 6a3cd44..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_gpio.c +++ /dev/null @@ -1,72 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_aon_gpio.c - * @author BLE Driver Team - * @brief AON GPIO HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_AON_GPIO_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static aon_gpio_callback_t aon_gpio_callback = { - .aon_gpio_callback = hal_aon_gpio_callback, -}; - -/* Private function prototypes -----------------------------------------------*/ - -void hal_aon_gpio_init(aon_gpio_init_t *p_aon_gpio_init) -{ - hal_aon_gpio_register_callback(&aon_gpio_callback); - - GLOBAL_EXCEPTION_DISABLE(); - hal_aon_gpio_init_ext(p_aon_gpio_init); - GLOBAL_EXCEPTION_ENABLE(); -} - -void hal_aon_gpio_deinit(uint32_t aon_gpio_pin) -{ - GLOBAL_EXCEPTION_DISABLE(); - hal_aon_gpio_deinit_ext(aon_gpio_pin); - GLOBAL_EXCEPTION_ENABLE(); -} - -__WEAK void hal_aon_gpio_callback(uint16_t aon_gpio_pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(aon_gpio_pin); -} - -#endif /* HAL_AON_GPIO_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_wdt.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_wdt.c deleted file mode 100755 index 577caac..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_aon_wdt.c +++ /dev/null @@ -1,80 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_aon_wdt.c - * @author BLE Driver Team - * @brief AON WDT HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_AON_WDT_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_aon_wdt_callback_t aon_wdt_callback = { - .aon_wdt_alarm_callback = hal_aon_wdt_alarm_callback, -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_aon_wdt_init(aon_wdt_handle_t *p_aon_wdt) -{ - hal_aon_wdt_register_callback(&aon_wdt_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_aon_wdt_init_ext(p_aon_wdt); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_aon_wdt_deinit(aon_wdt_handle_t *p_aon_wdt) -{ - hal_aon_wdt_register_callback(&aon_wdt_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_aon_wdt_deinit_ext(p_aon_wdt); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_aon_wdt_alarm_callback(aon_wdt_handle_t *p_aon_wdt) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_aon_wdt); -} - -#endif /* HAL_AON_WDT_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_calendar.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_calendar.c deleted file mode 100755 index e561d6a..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_calendar.c +++ /dev/null @@ -1,107 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_calendar.c - * @author BLE Driver Team - * @brief CALENDAR HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_CALENDAR_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables -------------------------------------------------------*/ - -static hal_calendar_callback_t calendar_callback = { - .calendar_alarm_callback = hal_calendar_alarm_callback, - .calendar_tick_callback = hal_calendar_tick_callback, - .calendar_overflow_callback = hal_calendar_overflow_callback, -}; - -/* Private function prototypes ---------------------------------------------*/ - -hal_status_t hal_calendar_init(calendar_handle_t *p_calendar) -{ - hal_calendar_register_callback(&calendar_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_calendar_init_ext(p_calendar); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_calendar_deinit(calendar_handle_t *p_calendar) -{ - hal_calendar_register_callback(&calendar_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_calendar_deinit_ext(p_calendar); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_calendar_alarm_callback(calendar_handle_t *p_calendar) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_calendar); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_calendar_alarm_callback could be implemented in the user file - */ -} - -__WEAK void hal_calendar_tick_callback(calendar_handle_t *p_calendar) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_calendar); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_calendar_interval_callback could be implemented in the user file - */ -} - -__WEAK void hal_calendar_overflow_callback(calendar_handle_t *p_calendar) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_calendar); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_calendar_overflow_callback could be implemented in the user file - */ -} - -#endif /* HAL_CALENDAR_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_comp.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_comp.c deleted file mode 100755 index 594872a..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_comp.c +++ /dev/null @@ -1,94 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_comp.c - * @author BLE Driver Team - * @brief COMP HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_COMP_MODULE_ENABLED) && (defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static comp_callback_t comp_callback = { - .comp_msp_init = hal_comp_msp_init, - .comp_msp_deinit = hal_comp_msp_deinit, - .comp_trigger_callback = hal_comp_trigger_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_comp_init(comp_handle_t *p_comp) -{ - hal_comp_register_callback(&comp_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_comp_init_ext(p_comp); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_comp_deinit(comp_handle_t *p_comp) -{ - hal_comp_register_callback(&comp_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_comp_deinit_ext(p_comp); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_comp_trigger_callback(comp_handle_t *p_comp) -{ - return; -} - -__WEAK void hal_comp_msp_init(comp_handle_t *p_comp) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_comp); -} - -__WEAK void hal_comp_msp_deinit(comp_handle_t *p_comp) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_comp); -} - -#endif /* HAL_COMP_MODULE_ENABLED */ - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_dual_tim.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_dual_tim.c deleted file mode 100755 index 1f884f1..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_dual_tim.c +++ /dev/null @@ -1,101 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_dual_tim.c - * @author BLE Driver Team - * @brief DUAL TIMER HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_DUAL_TIMER_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_dual_timer_callback_t dual_tim_callback = { - .dual_timer_msp_init = hal_dual_timer_base_msp_init, - .dual_timer_msp_deinit = hal_dual_timer_base_msp_deinit, - .dual_timer_period_elapsed_callback = hal_dual_timer_period_elapsed_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_dual_timer_base_init(dual_timer_handle_t *p_dual_timer) -{ - hal_dual_timer_register_callback(&dual_tim_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_dual_timer_init_ext(p_dual_timer); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_dual_timer_base_deinit(dual_timer_handle_t *p_dual_timer) -{ - hal_dual_timer_register_callback(&dual_tim_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_dual_timer_deinit_ext(p_dual_timer); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_dual_timer_base_msp_init(dual_timer_handle_t *p_dual_timer) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_dual_timer_base_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_dual_timer_base_msp_deinit(dual_timer_handle_t *p_dual_timer) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_dual_timer_base_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_dual_timer_period_elapsed_callback(dual_timer_handle_t *p_dual_timer) -{ - return; -} - -#endif - diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_efuse.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_efuse.c deleted file mode 100755 index e9911ee..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_efuse.c +++ /dev/null @@ -1,86 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_efuse.c - * @author BLE Driver Team - * @brief EFUSE HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_EFUSE_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_efuse_callback_t efuse_callback = { - .efuse_msp_init = hal_efuse_msp_init, - .efuse_msp_deinit = hal_efuse_msp_deinit -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_efuse_init(efuse_handle_t *p_efuse) -{ - hal_efuse_register_callback(&efuse_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_efuse_init_ext(p_efuse); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_efuse_deinit(efuse_handle_t *p_efuse) -{ - hal_efuse_register_callback(&efuse_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_efuse_deinit_ext(p_efuse); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_efuse_msp_init(efuse_handle_t *p_efuse) -{ - /* Prevent unused argument(s) compilation warning */ - return; -} - -__WEAK void hal_efuse_msp_deinit(efuse_handle_t *p_efuse) -{ - /* Prevent unused argument(s) compilation warning */ - return; -} - -#endif /* HAL_EFUSE_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_exflash.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_exflash.c deleted file mode 100755 index 6c1a96d..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_exflash.c +++ /dev/null @@ -1,113 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_exflash.c - * @author BLE Driver Team - * @brief EXFLASH HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_EXFLASH_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_exflash_callback_t exflash_callback = { - .exflash_msp_init = hal_exflash_msp_init, - .exflash_msp_deinit = hal_exflash_msp_deinit -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_exflash_init(exflash_handle_t *p_exflash) -{ - hal_exflash_register_callback(&exflash_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_exflash_init_ext(p_exflash); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_exflash_deinit(exflash_handle_t *p_exflash) -{ - hal_exflash_register_callback(&exflash_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_exflash_deinit_ext(p_exflash); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_exflash_msp_init(exflash_handle_t *p_exflash) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_exflash_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_exflash_msp_deinit(exflash_handle_t *p_exflash) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_exflash_msp_deinit can be implemented in the user file - */ -} - -SECTION_RAM_CODE hal_status_t hal_xqspi_init_ext(xqspi_handle_t *p_xqspi) -{ -#if ENCRYPT_ENABLE - return hal_xqspi_init_ext_patch(p_xqspi); -#else - return hal_xqspi_init_ext_rom(p_xqspi); -#endif -} - -hal_status_t hal_exflash_read(exflash_handle_t *p_exflash, uint32_t addr, uint8_t *p_data, uint32_t size) -{ -#if (ENCRYPT_ENABLE || (CHIP_TYPE == 1) || (EXT_EXFLASH_ENABLE == 1)) - return hal_exflash_read_patch(p_exflash, addr, p_data, size); -#else - return hal_exflash_read_rom(p_exflash, addr, p_data, size); -#endif -} - -#endif /* HAL_EXFLASH_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_gpio.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_gpio.c deleted file mode 100755 index 102aa31..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_gpio.c +++ /dev/null @@ -1,75 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_gpio.c - * @author BLE Driver Team - * @brief GPIO HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_GPIO_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_gpio_callback_t gpio_callback = { - .gpio_callback = hal_gpio_exti_callback, -}; - -/* Private function prototypes -----------------------------------------------*/ - -void hal_gpio_init(gpio_regs_t *GPIOx, gpio_init_t *p_gpio_init) -{ - hal_gpio_register_callback(&gpio_callback); - - GLOBAL_EXCEPTION_DISABLE(); - hal_gpio_init_ext(GPIOx, p_gpio_init); - GLOBAL_EXCEPTION_ENABLE(); -} - -void hal_gpio_deinit(gpio_regs_t *GPIOx, uint32_t gpio_pin) -{ - hal_gpio_register_callback(&gpio_callback); - - GLOBAL_EXCEPTION_DISABLE(); - hal_gpio_deinit_ext(GPIOx, gpio_pin); - GLOBAL_EXCEPTION_ENABLE(); -} - -__WEAK void hal_gpio_exti_callback(gpio_regs_t *GPIOx, uint16_t gpio_pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(GPIOx); - UNUSED(gpio_pin); -} - -#endif /* HAL_GPIO_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_hmac.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_hmac.c deleted file mode 100755 index ffdc4a4..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_hmac.c +++ /dev/null @@ -1,115 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_hmac.c - * @author BLE Driver Team - * @brief HMAC HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_HMAC_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_hmac_callback_t hmac_callback = { - .hmac_msp_init = hal_hmac_msp_init, - .hmac_msp_deinit = hal_hmac_msp_deinit, - .hmac_done_callback = hal_hmac_done_callback, - .hmac_error_callback = hal_hmac_error_callback, -// .hmac_abort_cplt_callback = hal_hmac_abort_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_hmac_init(hmac_handle_t *p_hmac) -{ - hal_hmac_register_callback(&hmac_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_hmac_init_ext(p_hmac); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_hmac_deinit(hmac_handle_t *p_hmac) -{ - hal_hmac_register_callback(&hmac_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_hmac_deinit_ext(p_hmac); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_hmac_msp_init(hmac_handle_t *p_hmac) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_hmac_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_hmac_msp_deinit(hmac_handle_t *p_hmac) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_hmac_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_hmac_done_callback(hmac_handle_t *p_hmac) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_hmac); -} - -__WEAK void hal_hmac_error_callback(hmac_handle_t *p_hmac) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_hmac); -} - -__WEAK void hal_hmac_abort_cplt_callback(hmac_handle_t *p_hmac) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_hmac); -} - -#endif /* HAL_HMAC_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2c.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2c.c deleted file mode 100755 index 2343ae8..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2c.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_i2c.c - * @author BLE Driver Team - * @brief I2C HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_I2C_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_i2c_callback_t i2c_callback = { - .i2c_msp_init = hal_i2c_msp_init, - .i2c_msp_deinit = hal_i2c_msp_deinit, - .i2c_master_tx_cplt_callback = hal_i2c_master_tx_cplt_callback, - .i2c_master_rx_cplt_callback = hal_i2c_master_rx_cplt_callback, - .i2c_slave_tx_cplt_callback = hal_i2c_slave_tx_cplt_callback, - .i2c_slave_rx_cplt_callback = hal_i2c_slave_rx_cplt_callback, - .i2c_listen_cplt_callback = hal_i2c_listen_cplt_callback, - .i2c_mem_tx_cplt_callback = hal_i2c_mem_tx_cplt_callback, - .i2c_mem_rx_cplt_callback = hal_i2c_mem_rx_cplt_callback, - .i2c_error_callback = hal_i2c_error_callback, - .i2c_abort_cplt_callback = hal_i2c_abort_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_i2c_init(i2c_handle_t *p_i2c) -{ - hal_i2c_register_callback(&i2c_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_i2c_init_ext(p_i2c); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_i2c_deinit(i2c_handle_t *p_i2c) -{ - hal_i2c_register_callback(&i2c_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_i2c_deinit_ext(p_i2c); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_i2c_msp_init(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_msp_deinit(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_master_tx_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_master_rx_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_slave_tx_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_slave_rx_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_listen_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_mem_tx_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_mem_rx_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_error_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -__WEAK void hal_i2c_abort_cplt_callback(i2c_handle_t *p_i2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2c); -} - -#endif /* HAL_I2C_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2s.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2s.c deleted file mode 100755 index ae1b413..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_i2s.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_i2s_br.c - * @author BLE Driver Team - * @brief I2S HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_I2S_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_i2s_callback_t i2s_callback = { - .i2s_msp_init = hal_i2s_msp_init, - .i2s_msp_deinit = hal_i2s_msp_deinit, - .i2s_error_callback = hal_i2s_error_callback, - .i2s_rx_cplt_callback = hal_i2s_rx_cplt_callback, - .i2s_tx_cplt_callback = hal_i2s_tx_cplt_callback, - .i2s_tx_rx_cplt_callback = hal_i2s_tx_rx_cplt_callback, -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_i2s_init(i2s_handle_t *p_i2s) -{ - hal_i2s_register_callback(&i2s_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_i2s_init_ext(p_i2s); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_i2s_deinit(i2s_handle_t *p_i2s) -{ - hal_i2s_register_callback(&i2s_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_i2s_deinit_ext(p_i2s); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_i2s_msp_init(i2s_handle_t *p_i2s) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_i2s_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_i2s_msp_deinit(i2s_handle_t *p_i2s) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_i2s_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_i2s_error_callback(i2s_handle_t *p_i2s) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2s); -} - -__WEAK void hal_i2s_rx_cplt_callback(i2s_handle_t *p_i2s) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2s); -} - -__WEAK void hal_i2s_tx_cplt_callback(i2s_handle_t *p_i2s) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2s); -} - -__WEAK void hal_i2s_tx_rx_cplt_callback(i2s_handle_t *p_i2s) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_i2s); -} - -#endif /* HAL_I2S_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pkc.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pkc.c deleted file mode 100755 index cd366b9..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pkc.c +++ /dev/null @@ -1,124 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_pkc.c - * @author BLE Driver Team - * @brief PKC HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_PKC_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_pkc_callback_t pkc_callback = { - .pkc_msp_init = hal_pkc_msp_init, - .pkc_msp_deinit = hal_pkc_msp_deinit, - .pkc_done_callback = hal_pkc_done_callback, - .pkc_error_callback = hal_pkc_error_callback, - .pkc_overflow_callback = hal_pkc_overflow_callback, -// .pkc_abort_cplt_callback = hal_pkc_abort_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_pkc_init(pkc_handle_t *p_pkc) -{ - hal_pkc_register_callback(&pkc_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_pkc_init_ext(p_pkc); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_pkc_deinit(pkc_handle_t *p_pkc) -{ - hal_pkc_register_callback(&pkc_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_pkc_deinit_ext(p_pkc); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_pkc_msp_init(pkc_handle_t *p_pkc) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_pkc_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_pkc_msp_deinit(pkc_handle_t *p_pkc) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_pkc_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_pkc_done_callback(pkc_handle_t *p_pkc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_pkc); -} - -__WEAK void hal_pkc_error_callback(pkc_handle_t *p_pkc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_pkc); -} - -__WEAK void hal_pkc_overflow_callback(pkc_handle_t *p_pkc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_pkc); -} - -__WEAK void hal_pkc_abort_cplt_callback(pkc_handle_t *p_pkc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_pkc); -} - -#endif /* HAL_PKC_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwm.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwm.c deleted file mode 100755 index 082471c..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwm.c +++ /dev/null @@ -1,94 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_pwm.c - * @author BLE Driver Team - * @brief PWM HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_PWM_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_pwm_callback_t pwm_callback = { - .pwm_msp_init = hal_pwm_msp_init, - .pwm_msp_deinit = hal_pwm_msp_deinit -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_pwm_init(pwm_handle_t *p_pwm) -{ - hal_pwm_register_callback(&pwm_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_pwm_init_ext(p_pwm); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_pwm_deinit(pwm_handle_t *p_pwm) -{ - hal_pwm_register_callback(&pwm_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_pwm_deinit_ext(p_pwm); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_pwm_msp_init(pwm_handle_t *p_pwm) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_pwm_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_pwm_msp_deinit(pwm_handle_t *p_pwm) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_pwm_msp_deinit can be implemented in the user file - */ -} - -#endif /* HAL_PWM_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwr.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwr.c deleted file mode 100755 index 6be4692..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_pwr.c +++ /dev/null @@ -1,59 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_pwr_br.c - * @author BLE Driver Team - * @brief PWR HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_PWR_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -/* Private function prototypes -----------------------------------------------*/ - -void hal_pwr_config_timer_wakeup(uint8_t timer_mode, uint32_t load_count) -{ - hal_pwr_register_timer_elaspsed_handler(hal_pwr_sleep_timer_elapsed_callback); - - hal_pwr_config_timer_wakeup_ext(timer_mode, load_count); -} - -__WEAK void hal_pwr_sleep_timer_elapsed_callback(void) -{ - return; -} - - -#endif /* HAL_PWR_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_qspi.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_qspi.c deleted file mode 100755 index 4fee9f2..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_qspi.c +++ /dev/null @@ -1,130 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_qspi.c - * @author BLE Driver Team - * @brief QSPI HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_QSPI_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_qspi_callback_t qspi_callback = { - .qspi_msp_init = hal_qspi_msp_init, - .qspi_msp_deinit = hal_qspi_msp_deinit, - .qspi_error_callback = hal_qspi_error_callback, - .qspi_abort_cplt_callback = hal_qspi_abort_cplt_callback, - .qspi_fifo_threshold_callback = hal_qspi_fifo_threshold_callback, - .qspi_rx_cplt_callback = hal_qspi_rx_cplt_callback, - .qspi_tx_cplt_callback = hal_qspi_tx_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_qspi_init(qspi_handle_t *p_qspi) -{ - hal_qspi_register_callback(&qspi_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_qspi_init_ext(p_qspi); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_qspi_deinit(qspi_handle_t *p_qspi) -{ - hal_qspi_register_callback(&qspi_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_qspi_deinit_ext(p_qspi); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_qspi_msp_init(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_qspi_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_qspi_msp_deinit(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_qspi_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_qspi_error_callback(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_qspi); -} - -__WEAK void hal_qspi_abort_cplt_callback(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_qspi); -} - -__WEAK void hal_qspi_fifo_threshold_callback(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_qspi); -} - -__WEAK void hal_qspi_rx_cplt_callback(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_qspi); -} - -__WEAK void hal_qspi_tx_cplt_callback(qspi_handle_t *p_qspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_qspi); -} - -#endif /* HAL_QSPI_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_rng.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_rng.c deleted file mode 100755 index 62b9564..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_rng.c +++ /dev/null @@ -1,105 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_rng.c - * @author BLE Driver Team - * @brief RNG HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_RNG_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_rng_callback_t rng_callback = { - .rng_msp_init = hal_rng_msp_init, - .rng_msp_deinit = hal_rng_msp_deinit, - .rng_ready_data_callback = hal_rng_ready_data_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_rng_init(rng_handle_t *p_rng) -{ - hal_rng_register_callback(&rng_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_rng_init_ext(p_rng); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_rng_deinit(rng_handle_t *p_rng) -{ - hal_rng_register_callback(&rng_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_rng_deinit_ext(p_rng); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_rng_msp_init(rng_handle_t *p_rng) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_rng); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_rng_msp_init could be implemented in the user file - */ -} - -__WEAK void hal_rng_msp_deinit(rng_handle_t *p_rng) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_rng); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_rng_msp_init could be implemented in the user file - */ -} - -__weak void hal_rng_ready_data_callback(rng_handle_t *p_rng, uint32_t random32bit) -{ - UNUSED(p_rng); - UNUSED(random32bit); - /* NOTE : This function should not be modified. When the callback is needed, - function hal_rng_ready_data_callback must be implemented in the user file. - */ -} - -#endif /* HAL_WDT_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_spi.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_spi.c deleted file mode 100755 index cc99870..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_spi.c +++ /dev/null @@ -1,130 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_spi.c - * @author BLE Driver Team - * @brief SPI HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_SPI_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_spi_callback_t spi_callback = { - .spi_msp_init = hal_spi_msp_init, - .spi_msp_deinit = hal_spi_msp_deinit, - .spi_error_callback = hal_spi_error_callback, - .spi_abort_cplt_callback = hal_spi_abort_cplt_callback, - .spi_rx_cplt_callback = hal_spi_rx_cplt_callback, - .spi_tx_cplt_callback = hal_spi_tx_cplt_callback, - .spi_tx_rx_cplt_callback = hal_spi_tx_rx_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_spi_init(spi_handle_t *p_spi) -{ - hal_spi_register_callback(&spi_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_spi_init_ext(p_spi); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_spi_deinit(spi_handle_t *p_spi) -{ - hal_spi_register_callback(&spi_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_spi_deinit_ext(p_spi); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_spi_msp_init(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_spi_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_spi_msp_deinit(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_spi_msp_deinit can be implemented in the user file - */ -} - -__WEAK void hal_spi_error_callback(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_spi); -} - -__WEAK void hal_spi_abort_cplt_callback(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_spi); -} - -__WEAK void hal_spi_rx_cplt_callback(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_spi); -} - -__WEAK void hal_spi_tx_cplt_callback(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_spi); -} - -__WEAK void hal_spi_tx_rx_cplt_callback(spi_handle_t *p_spi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_spi); -} - -#endif /* HAL_SPI_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_tim.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_tim.c deleted file mode 100755 index 9c4e77d..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_tim.c +++ /dev/null @@ -1,92 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_tim.c - * @author BLE Driver Team - * @brief TIMER HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_TIMER_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_timer_callback_t timer_callback = { - .timer_msp_init = hal_timer_base_msp_init, - .timer_msp_deinit = hal_timer_base_msp_deinit, - .timer_period_elapsed_callback = hal_timer_period_elapsed_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_timer_base_init(timer_handle_t *p_timer) -{ - hal_timer_register_callback(&timer_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_timer_base_init_ext(p_timer); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_timer_base_deinit(timer_handle_t *p_timer) -{ - hal_timer_register_callback(&timer_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_timer_base_deinit_ext(p_timer); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_timer_base_msp_init(timer_handle_t *p_timer) -{ - /* Prevent unused argument(s) compilation warning */ - return; -} - -__WEAK void hal_timer_base_msp_deinit(timer_handle_t *p_timer) -{ - /* Prevent unused argument(s) compilation warning */ - return; -} - -__weak void hal_timer_period_elapsed_callback(timer_handle_t *p_timer) -{ - return; -} - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_uart.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_uart.c deleted file mode 100755 index fd5ba80..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_uart.c +++ /dev/null @@ -1,129 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal.c - * @author BLE Driver Team - * @brief HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_UART_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_uart_callback_t uart_callback = { - .uart_msp_init = hal_uart_msp_init, - .uart_msp_deinit = hal_uart_msp_deinit, - .uart_tx_cplt_callback = hal_uart_tx_cplt_callback, - .uart_rx_cplt_callback = hal_uart_rx_cplt_callback, - .uart_error_callback = hal_uart_error_callback, - .uart_abort_cplt_callback = hal_uart_abort_cplt_callback, - .uart_abort_tx_cplt_callback = hal_uart_abort_tx_cplt_callback, - .uart_abort_rx_cplt_callback = hal_uart_abort_rx_cplt_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_uart_init(uart_handle_t *p_uart) -{ - hal_uart_register_callback(&uart_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_uart_init_ext(p_uart); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_uart_deinit(uart_handle_t *p_uart) -{ - hal_uart_register_callback(&uart_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_uart_deinit_ext(p_uart); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_uart_msp_init(uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_msp_deinit(uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_tx_cplt_callback(uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_rx_cplt_callback(uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_error_callback(uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_abort_cplt_callback (uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_abort_tx_cplt_callback (uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -__WEAK void hal_uart_abort_rx_cplt_callback (uart_handle_t *p_uart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_uart); -} - -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_wdt.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_wdt.c deleted file mode 100755 index 03f28e6..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_wdt.c +++ /dev/null @@ -1,106 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_wdt.c - * @author BLE Driver Team - * @brief WDT HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_WDT_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_wdt_callback_t wdt_callback = { - .wdt_msp_init = hal_wdt_msp_init, - .wdt_msp_deinit = hal_wdt_msp_deinit, - .wdt_period_elapsed_callback = hal_wdt_period_elapsed_callback -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_wdt_init(wdt_handle_t *p_wdt) -{ - hal_wdt_register_callback(&wdt_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_wdt_init_ext(p_wdt); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_wdt_deinit(wdt_handle_t *p_wdt) -{ - hal_wdt_register_callback(&wdt_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_wdt_deinit_ext(p_wdt); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_wdt_msp_init(wdt_handle_t *p_wdt) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_wdt); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_wdt_msp_init could be implemented in the user file - */ -} - -__WEAK void hal_wdt_msp_deinit(wdt_handle_t *p_wdt) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_wdt); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_wdt_msp_init could be implemented in the user file - */ -} - -__WEAK void hal_wdt_period_elapsed_callback(wdt_handle_t *p_wdt) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(p_wdt); - - /* NOTE: This function should not be modified, when the callback is needed, - the hal_wdt_period_elapsed_callback could be implemented in the user file - */ -} - -#endif /* HAL_WDT_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_xqspi.c b/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_xqspi.c deleted file mode 100755 index fc8586f..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/drivers/src/gr55xx_hal_xqspi.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - **************************************************************************************** - * @file gr55xx_hal_xqspi.c - * @author BLE Driver Team - * @brief XQSPI HAL module driver. - **************************************************************************************** - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "gr55xx_hal.h" -#include "gr55xx_rom_symbol.h" - -#if defined(HAL_XQSPI_MODULE_ENABLED) && (defined(GR5515_D) || defined(GR5515_E)) - -/* Private variables ---------------------------------------------------------*/ - -static hal_xqspi_callback_t xqspi_callback = { - .xqspi_msp_init = hal_xqspi_msp_init, - .xqspi_msp_deinit = hal_xqspi_msp_deinit -}; - -/* Private function prototypes -----------------------------------------------*/ - -hal_status_t hal_xqspi_init(xqspi_handle_t *p_xqspi) -{ - hal_xqspi_register_callback(&xqspi_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_xqspi_init_ext(p_xqspi); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -hal_status_t hal_xqspi_deinit(xqspi_handle_t *p_xqspi) -{ - hal_xqspi_register_callback(&xqspi_callback); - - hal_status_t ret; - GLOBAL_EXCEPTION_DISABLE(); - ret = hal_xqspi_deinit_ext(p_xqspi); - GLOBAL_EXCEPTION_ENABLE(); - - return ret; -} - -__WEAK void hal_xqspi_msp_init(xqspi_handle_t *p_xqspi) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_xqspi_msp_init can be implemented in the user file - */ -} - -__WEAK void hal_xqspi_msp_deinit(xqspi_handle_t *p_xqspi) -{ - /* Prevent unused argument(s) compilation warning */ - return; - - /* NOTE : This function should not be modified, when the callback is needed, - the hal_xqspi_msp_deinit can be implemented in the user file - */ -} - -#endif /* HAL_XQSPI_MODULE_ENABLED */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/external/segger_rtt/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/external/segger_rtt/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/BUILD.gn b/gr551x/sdk_liteos/gr551x_sdk/platform/BUILD.gn old mode 100644 new mode 100755 index b3a5a0e..f47be32 --- a/gr551x/sdk_liteos/gr551x_sdk/platform/BUILD.gn +++ b/gr551x/sdk_liteos/gr551x_sdk/platform/BUILD.gn @@ -24,6 +24,7 @@ config("public") { kernel_module("platform") { sources = [ + "arch/arm/cortex-m/gcc/startup_gr55xx.s", "boards/board_SK.c", "soc/common/gr_platform.c", "soc/common/gr_system.c", diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_compiler.h b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_compiler.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_gcc.h b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_gcc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_version.h b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/cmsis_version.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/core_cm4.h b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/core_cm4.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/mpu_armv7.h b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/cmsis/core/include/mpu_armv7.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s new file mode 100755 index 0000000..2eec798 --- /dev/null +++ b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s @@ -0,0 +1,218 @@ +/**************************************************************************//** + * @file startup_ARMCM4.s + * @brief CMSIS Core Device Startup File for + * ARMCM4 Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-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 + * + * 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. + */ + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +//#ifdef __STACK_SIZE +// .equ Stack_Size, __STACK_SIZE +//#else + .equ Stack_Size, 0x00008000 +//#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000100 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long _estack /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long BLE_SDK_Handler /* 1: Reserved */ + .long BLE_IRQHandler /* 2: BLE */ + .long DMA0_IRQHandler /* 3: DMA0 */ + .long SPI_M_IRQHandler /* 4: SPI_M */ + .long SPI_S_IRQHandler /* 5: SPI_S */ + .long EXT0_IRQHandler /* 6: GPIO0 */ + .long EXT1_IRQHandler /* 7: GPIO1 */ + .long TIMER0_IRQHandler /* 8: TIMER0 */ + .long TIMER1_IRQHandler /* 9: TIMER1 */ + .long DUAL_TIMER_IRQHandler /* 10: DUAL_TIMER0/DUAL_TIMER1 */ + .long QSPI0_IRQHandler /* 11: QSPI0 */ + .long UART0_IRQHandler /* 12: UART0 */ + .long UART1_IRQHandler /* 13: UART1 */ + .long I2C0_IRQHandler /* 14: I2C0 */ + .long I2C1_IRQHandler /* 15: I2C1 */ + .long AES_IRQHandler /* 16: AES */ + .long HMAC_IRQHandler /* 17: HMAC */ + .long EXT2_IRQHandler /* 18: GPIO2 */ + .long RNG_IRQHandler /* 19: TRNG Interrupt */ + .long PMU_IRQHandler /* 20: PMU */ + .long PKC_IRQHandler /* 21: PKC */ + .long XQSPI_IRQHandler /* 22: XQSPI */ + .long QSPI1_IRQHandler /* 23: QSPI1 */ + .long PWR_CMD_IRQHandler /* 24: PWR_CMD */ + .long BLESLP_IRQHandler /* 25: BLE Sleep */ + .long SLPTIMER_IRQHandler /* 26: Sleep Timer */ + .long EXTWKUP_IRQHandler /* 27: EXT Wakeup */ + .long AON_WDT_IRQHandler /* 28: AON_WDT */ + .long I2S_M_IRQHandler /* 29: I2S_M */ + .long I2S_S_IRQHandler /* 30: I2S_S */ + .long ISO7816_IRQHandler /* 31: ISO7816 */ + .long PRESENT_IRQHandler /* 32: PRESENT */ + .long CALENDAR_IRQHandler /* 33: CALENDAR */ + .long COMM_CORE_IRQHandler /* 34: COMM_CORE */ + .long DMA1_IRQHandler /* 35: DMA1 */ + .long DMA2_IRQHandler /* 36: DMA2 */ + .long DSPI_IRQHandler /* 37: DSPI */ + .long AON_IRQHandler /* 38: AON */ + .long PDM_IRQHandler /* 39: PDM */ + .long VTTBL_IRQHandler /* 40: VTTBL */ + .long CTE_FULL_IRQHandler /* 41: CTE_FULL */ + .long USB_IRQHandler /* 42: USB */ + .long GPADC_IRQHandler /* 43: GPADC */ + .long AON_PMU_BOD_FEDGE_IRQHandler /* 44: AON_PMU_BOD_FEDGE */ + .long AON_PMU_MSIO_COMP_IRQHandler /* 45: AON_PMU_MSIO_COMP */ + .long AON_PMU_USB_WKUP_IRQHandler /* 46: AON_PMU_USB_WKUP */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + + bl SystemInit + + bl main_init + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler DMA0_IRQHandler + def_irq_handler SPI_M_IRQHandler + def_irq_handler SPI_S_IRQHandler + def_irq_handler EXT0_IRQHandler + def_irq_handler EXT1_IRQHandler + def_irq_handler TIMER0_IRQHandler + def_irq_handler TIMER1_IRQHandler + def_irq_handler DUAL_TIMER_IRQHandler + def_irq_handler QSPI0_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler I2C0_IRQHandler + def_irq_handler I2C1_IRQHandler + def_irq_handler AES_IRQHandler + def_irq_handler HMAC_IRQHandler + def_irq_handler EXT2_IRQHandler + def_irq_handler RNG_IRQHandler + def_irq_handler PMU_IRQHandler + def_irq_handler PKC_IRQHandler + def_irq_handler XQSPI_IRQHandler + def_irq_handler QSPI1_IRQHandler + def_irq_handler PWR_CMD_IRQHandler + def_irq_handler SLPTIMER_IRQHandler + def_irq_handler EXTWKUP_IRQHandler + def_irq_handler AON_WDT_IRQHandler + def_irq_handler I2S_M_IRQHandler + def_irq_handler I2S_S_IRQHandler + def_irq_handler ISO7816_IRQHandler + def_irq_handler PRESENT_IRQHandler + def_irq_handler CALENDAR_IRQHandler + def_irq_handler COMM_CORE_IRQHandler + def_irq_handler DMA1_IRQHandler + def_irq_handler DMA2_IRQHandler + def_irq_handler DSPI_IRQHandler + def_irq_handler AON_IRQHandler + def_irq_handler PDM_IRQHandler + def_irq_handler VTTBL_IRQHandler + def_irq_handler CTE_FULL_IRQHandler + def_irq_handler USB_IRQHandler + def_irq_handler GPADC_IRQHandler + def_irq_handler AON_PMU_BOD_FEDGE_IRQHandler + def_irq_handler AON_PMU_MSIO_COMP_IRQHandler + def_irq_handler AON_PMU_USB_WKUP_IRQHandler + .end diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/boards/board_SK.c b/gr551x/sdk_liteos/gr551x_sdk/platform/boards/board_SK.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/boards/board_SK.h b/gr551x/sdk_liteos/gr551x_sdk/platform/boards/board_SK.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/boards/unity_test_config.h b/gr551x/sdk_liteos/gr551x_sdk/platform/boards/unity_test_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/include/gr_plat.h b/gr551x/sdk_liteos/gr551x_sdk/platform/include/gr_plat.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/include/gr_soc.h b/gr551x/sdk_liteos/gr551x_sdk/platform/include/gr_soc.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/include/scatter_common.h b/gr551x/sdk_liteos/gr551x_sdk/platform/include/scatter_common.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_interrupt.c b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_interrupt.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_platform.c b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_platform.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_system.c b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/common/gr_system.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/ble_cfg.h b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/ble_cfg.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/gr551xx.h b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/gr551xx.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/gr55xx.h b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/gr55xx.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/grx_soc_reg.h b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/grx_soc_reg.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/system_gr55xx.h b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/include/system_gr55xx.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/hardfloat_lib/libble_sdk.a b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/hardfloat_lib/libble_sdk.a old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/libble_sdk.a b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/libble_sdk.a old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/rom_symbol_gcc.txt b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/rom_symbol_gcc.txt old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s new file mode 100755 index 0000000..b32864d --- /dev/null +++ b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s @@ -0,0 +1,193 @@ +/**************************************************************************//** + * @file startup_ARMCM4.s + * @brief CMSIS Core Device Startup File for + * ARMCM4 Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-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 + * + * 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. + */ + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +//#ifdef __STACK_SIZE +// .equ Stack_Size, __STACK_SIZE +//#else + .equ Stack_Size, 0x00004000 +//#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000100 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long BLE_SDK_Handler /* 1: Reserved */ + .long BLE_IRQHandler /* 2: BLE */ + .long DMA_IRQHandler /* 3: DMA */ + .long SPI_M_IRQHandler /* 4: SPI_M */ + .long SPI_S_IRQHandler /* 5: SPI_S */ + .long EXT0_IRQHandler /* 6: GPIO0 */ + .long EXT1_IRQHandler /* 7: GPIO1 */ + .long TIMER0_IRQHandler /* 8: TIMER0 */ + .long TIMER1_IRQHandler /* 9: TIMER1 */ + .long DUAL_TIMER_IRQHandler /* 10: DUAL_TIMER0/DUAL_TIMER1 */ + .long QSPI0_IRQHandler /* 11: QSPI0 */ + .long UART0_IRQHandler /* 12: UART0 */ + .long UART1_IRQHandler /* 13: UART1 */ + .long I2C0_IRQHandler /* 14: I2C0 */ + .long I2C1_IRQHandler /* 15: I2C1 */ + .long AES_IRQHandler /* 16: AES */ + .long HMAC_IRQHandler /* 17: HMAC */ + .long EXT2_IRQHandler /* 18: GPIO2 */ + .long RNG_IRQHandler /* 19: TRNG Interrupt */ + .long PMU_IRQHandler /* 20: PMU */ + .long PKC_IRQHandler /* 21: PKC */ + .long XQSPI_IRQHandler /* 22: XQSPI */ + .long QSPI1_IRQHandler /* 23: QSPI1 */ + .long PWR_CMD_IRQHandler /* 24: PWR_CMD */ + .long BLESLP_IRQHandler /* 25: BLE Sleep */ + .long SLPTIMER_IRQHandler /* 26: Sleep Timer */ + .long COMP_IRQHandler /* 27: COMP Wakeup */ + .long AON_WDT_IRQHandler /* 28: AON_WDT */ + .long I2S_M_IRQHandler /* 29: I2S_M */ + .long I2S_S_IRQHandler /* 30: I2S_S */ + .long ISO7816_IRQHandler /* 31: ISO7816 */ + .long PRESENT_IRQHandler /* 32: PRESENT */ + .long CALENDAR_IRQHandler /* 33: CALENDAR */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + + bl SystemInit + + bl main_init + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler DMA_IRQHandler + def_irq_handler SPI_M_IRQHandler + def_irq_handler SPI_S_IRQHandler + def_irq_handler EXT0_IRQHandler + def_irq_handler EXT1_IRQHandler + def_irq_handler TIMER0_IRQHandler + def_irq_handler TIMER1_IRQHandler + def_irq_handler DUAL_TIMER_IRQHandler + def_irq_handler QSPI0_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler I2C0_IRQHandler + def_irq_handler I2C1_IRQHandler + def_irq_handler AES_IRQHandler + def_irq_handler HMAC_IRQHandler + def_irq_handler EXT2_IRQHandler + def_irq_handler RNG_IRQHandler + def_irq_handler PMU_IRQHandler + def_irq_handler PKC_IRQHandler + def_irq_handler XQSPI_IRQHandler + def_irq_handler QSPI1_IRQHandler + def_irq_handler PWR_CMD_IRQHandler + def_irq_handler SLPTIMER_IRQHandler + def_irq_handler COMP_IRQHandler + def_irq_handler AON_WDT_IRQHandler + def_irq_handler I2S_M_IRQHandler + def_irq_handler I2S_S_IRQHandler + def_irq_handler ISO7816_IRQHandler + def_irq_handler PRESENT_IRQHandler + def_irq_handler CALENDAR_IRQHandler + + .end diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/src/gr_soc.c b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/src/gr_soc.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr551xx.h b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr551xx.h deleted file mode 100755 index 6a4d2cd..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr551xx.h +++ /dev/null @@ -1,6476 +0,0 @@ -/**************************************************************************//** - * @file gr551xx.h - * @brief CMSIS Cortex-M# Core Peripheral Access Layer Header File for - * Device gr551xx - * @version V1.00 - * @date 12. June 2018 - ******************************************************************************/ -/* - * Copyright (c) 2016-2018, Shenzhen Huiding Technology Co., Ltd - * - * 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. - */ - -/** @addtogroup Device_Included - * @{ - */ - -/** @addtogroup GR551xx - * @{ - */ - -#ifndef __GR551xx_H__ -#define __GR551xx_H__ - -#include -#include "system_gr55xx.h" /* System Header */ -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (__CC_ARM) -#pragma push -#pragma anon_unions -#elif defined (__ICCARM__) -#pragma language=extended -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc11-extensions" -#pragma clang diagnostic ignored "-Wreserved-id-macro" -#elif defined (__GNUC__) -/* anonymous unions are enabled by default */ -#elif defined (__TMS470__) -/* anonymous unions are enabled by default */ -#elif defined (__TASKING__) -#pragma warning 586 -#elif defined (__CSMC__) -/* anonymous unions are enabled by default */ -#else -#warning Not supported compiler type -#endif - - -/* ================================================================================================================= */ -/* ================ Device Specific Peripheral Section ================ */ -/* ================================================================================================================= */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief AES - */ -typedef struct _aes_regs { - __IOM uint32_t CTRL; /**< AES_REG_CTRL, Address offset: 0x00 */ - __IOM uint32_t CONFIG; /**< AES_REG_CONFIG, Address offset: 0x04 */ - __IM uint32_t STATUS; /**< AES_REG_STATUS, Address offset: 0x08 */ - __IOM uint32_t INTERRUPT; /**< AES_REG_INTERRUPT, Address offset: 0x0C */ - __IOM uint32_t TRAN_SIZE; /**< AES_REG_TRAN_SIZE, Address offset: 0x10 */ - __IOM uint32_t RSTART_ADDR; /**< AES_REG_RSTART_ADDR, Address offset: 0x14 */ - __IOM uint32_t WSTART_ADDR; /**< AES_REG_WSTART_ADDR, Address offset: 0x18 */ - __IOM uint32_t KEY_ADDR; /**< AES_REG_KEY_ADDR, Address offset: 0x1C */ - __IM uint32_t DATA_OUT[4]; /**< AES_REG_DATA_OUT, Address offset: 0x20 */ - __OM uint32_t KEY[8]; /**< AES_REG_KEY, Address offset: 0x30 */ - __IOM uint32_t SEED_IN; /**< AES_REG_SEED_IN, Address offset: 0x50 */ - __IOM uint32_t SEED_OUT; /**< AES_REG_SEED_OUT, Address offset: 0x54 */ - __IOM uint32_t SEED_IMASK; /**< AES_REG_SEED_IMASK, Address offset: 0x58 */ - __IOM uint32_t SEED_OSBOX; /**< AES_REG_SEED_OSBOX, Address offset: 0x5C */ - __OM uint32_t VECTOR_INIT[4]; /**< AES_REG_VECTOR_INIT, Address offset: 0x60 */ - __OM uint32_t DATA_IN[4]; /**< AES_REG_DATA_IN, Address offset: 0x70 */ - __OM uint32_t KPORT_MASK; /**< AES_REG_KPORT_MASK, Address offset: 0x80 */ -} aes_regs_t; - -/** - * @brief AON - */ -typedef struct _aon_regs { - __IOM uint32_t SOFTWARE_0; /**< AON_REG_SOFTWARE_0, Address offset: 0x00 */ - __IOM uint32_t PWR_RET01; /**< AON_REG_PWR_RET01, Address offset: 0x04 */ - __IOM uint32_t SNSADC_CFG; /**< AON_REG_SNSADC_CFG, Address offset: 0x08 */ - __IOM uint32_t RF_REG_0; /**< AON_REG_RF_REG_0, Address offset: 0x0C */ - __IOM uint32_t RF_REG_1; /**< AON_REG_RF_REG_1, Address offset: 0x10 */ - __IOM uint32_t RF_REG_2; /**< AON_REG_RF_REG_2, Address offset: 0x14 */ - __IOM uint32_t CALENDAR_TIMER_CTL; /**< AON_REG_CALENDAR_TIMER_CTL, Address offset: 0x18 */ - __IOM uint32_t MEM_STD_OVR; /**< AON_REG_MEM_STD_OVR, Address offset: 0x1C */ - __IOM uint32_t RF_REG_3; /**< AON_REG_RF_REG_3, Address offset: 0x20 */ - __IOM uint32_t RF_REG_4; /**< AON_REG_RF_REG_4, Address offset: 0x24 */ - __IOM uint32_t RF_REG_5; /**< AON_REG_RF_REG_5, Address offset: 0x28 */ - __IOM uint32_t RF_REG_6; /**< AON_REG_RF_REG_6, Address offset: 0x2C */ - __IOM uint32_t RF_REG_7; /**< AON_REG_RF_REG_7, Address offset: 0x30 */ - __IOM uint32_t RF_REG_8; /**< AON_REG_RF_REG_8, Address offset: 0x34 */ - __IOM uint32_t RF_REG_9; /**< AON_REG_RF_REG_9, Address offset: 0x38 */ - __IOM uint32_t MSIO_PAD_CFG_0; /**< AON_REG_MSIO_PAD_CFG_0, Address offset: 0x3C */ - __IOM uint32_t MSIO_PAD_CFG_1; /**< AON_REG_MSIO_PAD_CFG_1, Address offset: 0x40 */ - __IOM uint32_t SLP_EVENT; /**< AON_REG_SLP_EVENT, Address offset: 0x44 */ - __IOM uint32_t WARM_BOOT_TIME; /**< AON_REG_WARM_BOOT_TIME, Address offset: 0x48 */ - __IOM uint32_t RF_REG_10; /**< AON_REG_RF_REG_10, Address offset: 0x4C */ - __IOM uint32_t AON_PAD_CTL0; /**< AON_REG_AON_PAD_CTL0, Address offset: 0x50 */ - __IOM uint32_t MEM_N_SLP_CTL; /**< AON_REG_MEM_N_SLP_CTL, Address offset: 0x54 */ - __IOM uint32_t EXT_WKUP_CTL; /**< AON_REG_EXT_WKUP_CTL, Address offset: 0x58 */ - __IOM uint32_t AON_PAD_CTL1; /**< AON_REG_AON_PAD_CTL1, Address offset: 0x5C */ - __IOM uint32_t SOFTWARE_1; /**< AON_REG_SOFTWARE_1, Address offset: 0x60 */ - __IOM uint32_t MEM_PWR_SLP; /**< AON_REG_MEM_PWR_SLP, Address offset: 0x64 */ - __IOM uint32_t MEM_PWR_WKUP; /**< AON_REG_MEM_PWR_WKUP, Address offset: 0x68 */ - __IOM uint32_t PWR_RET27; /**< AON_REG_PWR_RET27, Address offset: 0x6C */ - __IOM uint32_t PWR_RET28; /**< AON_REG_PWR_RET28, Address offset: 0x70 */ - __IOM uint32_t PWR_RET29; /**< AON_REG_PWR_RET29, Address offset: 0x74 */ - __IOM uint32_t SOFTWARE_2; /**< AON_REG_SOFTWARE_2, Address offset: 0x78 */ - __IOM uint32_t PWR_RET31; /**< AON_REG_PWR_RET31, Address offset: 0x7C */ - __IOM uint32_t PSC_CMD; /**< AON_REG_PSC_CMD, Address offset: 0x80 */ - __IOM uint32_t PSC_CMD_OPC; /**< AON_REG_PSC_CMD_OPC, Address offset: 0x84 */ - __IM uint32_t MCU_RELEASE; /**< AON_REG_MCU_RELEASE, Address offset: 0x88 */ - __IM uint32_t RESERVED0; /**< Reserved, Address offset: 0x8C */ - __IOM uint32_t TIMER_VALUE; /**< AON_REG_TIMER_VALUE, Address offset: 0x90 */ - __IM uint32_t TIMER_VAL; /**< AON_REG_TIMER_VAL, Address offset: 0x94 */ - __IM uint32_t RESERVED1[13]; /**< Reserved, Address offset: 0x98 */ - __IOM uint32_t FPGA_CTRL; /**< AON_REG_FPGA_CTRL, Address offset: 0xCC */ - __IM uint32_t RESERVED2[5]; /**< Reserved, Address offset: 0xD0 */ - __IOM uint32_t ST_CALIB; /**< AON_REG_ST_CALIB_REG, Address offset: 0xE4 */ -} aon_regs_t; - -/** - * @brief DMA - */ -#define DMA_REG(name) __IOM uint32_t name; __IOM uint32_t __pad_##name -/* DMA/Channel_x_Registers Registers */ -typedef struct { - DMA_REG(SAR); /**< Source Address, Address offset: 0x00 */ - DMA_REG(DAR); /**< Destination Address, Address offset: 0x08 */ - DMA_REG(LLP); /**< Linked List Pointer, Address offset: 0x10 */ - __IOM uint32_t CTL_LO; /**< Control Register Low, Address offset: 0x18 */ - __IOM uint32_t CTL_HI; /**< Control Register High, Address offset: 0x1C */ - DMA_REG(SSTAT); /**< Source Status, Address offset: 0x20 */ - DMA_REG(DSTAT); /**< Destination Status, Address offset: 0x28 */ - DMA_REG(SSTATAR); /**< Source Status Address, Address offset: 0x30 */ - DMA_REG(DSTATAR); /**< Destination Status Address, Address offset: 0x38 */ - __IOM uint32_t CFG_LO; /**< Configuration Register Low, Address offset: 0x40 */ - __IOM uint32_t CFG_HI; /**< Configuration Register High, Address offset: 0x44 */ - DMA_REG(SGR); /**< Source Gather, Address offset: 0x48 */ - DMA_REG(DSR); /**< Destination Scatter, Address offset: 0x50 */ -} DMA_CH_REGS; - -/* DMA/Interrupt_Registers Registers */ -typedef struct { - __IO uint32_t RAW_CH_EVT[10]; /**< Raw channel event, Address offset: 0x00 */ - __I uint32_t STATUS_CH_EVT[10]; /**< Status channel event, Address offset: 0x28 */ - __IO uint32_t MASK_CH_EVT[10]; /**< Mask channel event, Address offset: 0x50 */ - __O uint32_t CLEAR_CH_EVT[10]; /**< Clear channel event, Address offset: 0x78 */ - DMA_REG(STATUS_EVT); /**< Status event, Address offset: 0xA0 */ -} DMA_INT_REGS; - -/* DMA/Software_Handshake_Registers Registers */ -typedef struct { - DMA_REG(REQ_SRC); /**< Source Transaction Request, Address offset: 0x00 */ - DMA_REG(REQ_DST); /**< Destination Transaction Request, Address offset: 0x08 */ - DMA_REG(SGL_RQ_SRC); /**< Source Single Transaction Request, Address offset: 0x20 */ - DMA_REG(SGL_RQ_DST); /**< Destination Single Transaction Request,Address offset: 0x28 */ - DMA_REG(LST_SRC); /**< Source Last Transaction Request, Address offset: 0x30 */ - DMA_REG(LST_DST); /**< Destination Last Transaction Request, Address offset: 0x38 */ -} DMA_HS_REGS; - -/* DMA/Miscellaneous_Registers Registers */ -typedef struct { - DMA_REG(CFG); /**< DMA Configuration, Address offset: 0x00 */ - DMA_REG(CH_EN); /**< DMA Channel Enable, Address offset: 0x08 */ - DMA_REG(ID); /**< DMA ID, Address offset: 0x20 */ - DMA_REG(TEST); /**< DMA Test, Address offset: 0x28 */ - DMA_REG(LP_TIMEOUT); /**< DMA Low Power Timeout, Address offset: 0x30 */ - DMA_REG(RESERVED); /**< Reserved, Address offset: 0x38 */ - DMA_REG(COMP_PARAMS_6); /**< DMA Component Parameters 6, Address offset: 0x40 */ - DMA_REG(COMP_PARAMS_5); /**< DMA Component Parameters 5, Address offset: 0x48 */ - DMA_REG(COMP_PARAMS_4); /**< DMA Component Parameters 4, Address offset: 0x50 */ - DMA_REG(COMP_PARAMS_3); /**< DMA Component Parameters 3, Address offset: 0x58 */ - DMA_REG(COMP_PARAMS_2); /**< DMA Component Parameters 2, Address offset: 0x60 */ - DMA_REG(COMP_PARAMS_1); /**< DMA Component Parameters 1, Address offset: 0x68 */ - DMA_REG(COMPS_ID); /**< DMA Component ID, Address offset: 0x70 */ -} DMA_MISC_REGS; - -typedef struct _dma_regs { - DMA_CH_REGS CHANNEL[8]; /**< DMA_REG_CH register, Address offset: 0x000 */ - DMA_INT_REGS EVENT; /**< DMA_REG_INT register, Address offset: 0x2C0 */ - DMA_HS_REGS HANDSHAKE; /**< DMA_REG_HS register, Address offset: 0x368 */ - DMA_MISC_REGS MISCELLANEOU; /**< DMA_REG_MISC register, Address offset: 0x3A8 */ -} dma_regs_t; - -/** - * @brief DUAL_TIM - */ -typedef struct _dual_timer_regs { - __IOM uint32_t RELOAD; /**< DUAL_TIMER auto-reload register, Address offset: 0x00 */ - __IM uint32_t VALUE; /**< DUAL_TIMER counter value register, Address offset: 0x04 */ - __IOM uint32_t CTRL; /**< DUAL_TIMER control register, Address offset: 0x08 */ - __OM uint32_t INTCLR; /**< DUAL_TIMER interrupt status clear register, Address offset: 0x0C */ - __IM uint32_t RAW_INTSTAT; /**< DUAL_TIMER raw interrupt status register, Address offset: 0x10 */ - __IM uint32_t INTSTAT; /**< DUAL_TIMER interrupt status register, Address offset: 0x14 */ - __IOM uint32_t BG_LOAD; /**< DUAL_TIMER background-reload register, Address offset: 0x18 */ -} dual_timer_regs_t; - -/** - * @brief GPIO - */ -typedef struct _gpio_regs { - __IOM uint32_t DATA; /**< GPIO_REG_DATA register, Address offset: 0x000 */ - __IOM uint32_t DATAOUT; /**< GPIO_REG_DATAOUT register, Address offset: 0x004 */ - __IM uint32_t RESERVED0[2]; /**< GPIO_REG_RESERVED register, Address offset: 0x008 */ - __IOM uint32_t OUTENSET; /**< GPIO_REG_OUTENSET register, Address offset: 0x010 */ - __IOM uint32_t OUTENCLR; /**< GPIO_REG_OUTENCLR register, Address offset: 0x014 */ - __IOM uint32_t ALTFUNCSET; /**< GPIO_REG_ALTFUNCSET register, Address offset: 0x018 */ - __IOM uint32_t ALTFUNCCLR; /**< GPIO_REG_ALTFUNCCLR register, Address offset: 0x01C */ - __IOM uint32_t INTENSET; /**< GPIO_REG_INTENSET register, Address offset: 0x020 */ - __IOM uint32_t INTENCLR; /**< GPIO_REG_INTENCLR register, Address offset: 0x024 */ - __IOM uint32_t INTTYPESET; /**< GPIO_REG_INTTYPESET register, Address offset: 0x028 */ - __IOM uint32_t INTTYPECLR; /**< GPIO_REG_INTTYPECLR register, Address offset: 0x02C */ - __IOM uint32_t INTPOLSET; /**< GPIO_REG_INTPOLSET register, Address offset: 0x030 */ - __IOM uint32_t INTPOLCLR; /**< GPIO_REG_INTPOLCLR register, Address offset: 0x034 */ - __IOM uint32_t INTSTAT; /**< GPIO_REG_INTSTAT register, Address offset: 0x038 */ - __IM uint32_t RESERVED1[241]; /**< GPIO_REG_RESERVED register, Address offset: 0x03C */ - __IOM uint32_t MASKLOWBYTE[256]; /**< GPIO_REG_MASKLOWBYTE register, Address offset: 0x400 */ - __IOM uint32_t MASKHIGHBYTE[256]; /**< GPIO_REG_MASKHIGHBYTE register, Address offset: 0x500 */ -} gpio_regs_t; - -/** - * @brief HMAC - */ -typedef struct _hmac_regs { - __IOM uint32_t CTRL; /**< HMAC_REG_CTRL register, Adderss offset: 0x00 */ - __IOM uint32_t CONFIG; /**< HMAC_REG_CONFIG register, Adderss offset: 0x04 */ - __IM uint32_t STATUS; /**< HMAC_REG_STATUS register, Adderss offset: 0x08 */ - __IOM uint32_t TRAN_SIZE; /**< HMAC_REG_TRAN_SIZE register, Adderss offset: 0x0C */ - __IOM uint32_t INTERRUPT; /**< HMAC_REG_INTERRUPT register, Adderss offset: 0x10 */ - __IOM uint32_t RSTART_ADDR; /**< HMAC_REG_RSTART_ADDR register, Adderss offset: 0x14 */ - __IOM uint32_t WSTART_ADDR; /**< HMAC_REG_WSTART_ADDR register, Adderss offset: 0x18 */ - __IM uint32_t REVERSED0; /**< HMAC_REG_REVERSED register, Adderss offset: 0x1C */ - __IOM uint32_t USER_HASH[8]; /**< HMAC_REG_USER_HASH register, Adderss offset: 0x20 */ - __IM uint32_t FIFO_OUT; /**< HMAC_REG_FIFO_OUT register, Adderss offset: 0x40 */ - __OM uint32_t MESSAGE_FIFO; /**< HMAC_REG_MESSAGE_FIFO register, Adderss offset: 0x44 */ - __OM uint32_t KEY[8]; /**< HMAC_REG_KEY register, Adderss offset: 0x48 */ - __IOM uint32_t KEY_ADDR; /**< HMAC_REG_KEY_ADDR register, Adderss offset: 0x68 */ - __OM uint32_t KPORT_MASK; /**< HMAC_REG_KPORT_MASK register, Adderss offset: 0x6C */ -} hmac_regs_t; - -/** - * @brief I2C - */ -typedef struct _i2c_regs { - __IOM uint32_t CON; /**< I2C control, Address offset: 0x00 */ - __IOM uint32_t TAR; /**< I2C target address, Address offset: 0x04 */ - __IOM uint32_t SAR; /**< I2C slave address, Address offset: 0x08 */ - __IOM uint32_t HS_MADDR; /**< I2C HS Master Mode Code address, Address offset: 0x0C */ - __IOM uint32_t DATA_CMD; /**< I2C Rx/Tx Data Buffer and Command, Address offset: 0x10 */ - __IOM uint32_t SS_SCL_HCNT; /**< Standard Speed I2C clock SCL High Count, Address offset: 0x14 */ - __IOM uint32_t SS_SCL_LCNT; /**< Standard Speed I2C clock SCL Low Count, Address offset: 0x18 */ - __IOM uint32_t FS_SCL_HCNT; /**< Fast Speed I2C clock SCL Low Count, Address offset: 0x1C */ - __IOM uint32_t FS_SCL_LCNT; /**< Fast Speed I2C clock SCL Low Count, Address offset: 0x20 */ - __IOM uint32_t HS_SCL_HCNT; /**< High Speed I2C clock SCL Low Count, Address offset: 0x24 */ - __IOM uint32_t HS_SCL_LCNT; /**< High Speed I2C clock SCL Low Count, Address offset: 0x28 */ - __IM uint32_t INTR_STAT; /**< I2C Interrupt Status, Address offset: 0x2C */ - __IOM uint32_t INTR_MASK; /**< I2C Interrupt Mask, Address offset: 0x30 */ - __IM uint32_t RAW_INTR_STAT; /**< I2C Raw Interrupt Status, Address offset: 0x34 */ - __IOM uint32_t RX_TL; /**< I2C Receive FIFO Threshold, Address offset: 0x38 */ - __IOM uint32_t TX_TL; /**< I2C Transmit FIFO Threshold, Address offset: 0x3C */ - __IM uint32_t CLR_INTR; /**< Clear combined and Individual Interrupts, Address offset: 0x40 */ - __IM uint32_t CLR_RX_UNDER; /**< Clear RX_UNDER Interrupt, Address offset: 0x44 */ - __IM uint32_t CLR_RX_OVER; /**< Clear RX_OVER Interrupt, Address offset: 0x48 */ - __IM uint32_t CLR_TX_OVER; /**< Clear TX_OVER Interrupt, Address offset: 0x4C */ - __IM uint32_t CLR_RD_REQ; /**< Clear RQ_REQ Interrupt, Address offset: 0x50 */ - __IM uint32_t CLR_TX_ABRT; /**< Clear TX_ABRT Interrupt, Address offset: 0x54 */ - __IM uint32_t CLR_RX_DONE; /**< Clear RX_DONE Interrupt, Address offset: 0x58 */ - __IM uint32_t CLR_ENABLE; /**< Clear ENABLE Interrupt, Address offset: 0x5C */ - __IM uint32_t CLR_STOP_DET; /**< Clear STOP_DET Interrupt, Address offset: 0x60 */ - __IM uint32_t CLR_START_DET; /**< Clear START_DET Interrupt, Address offset: 0x64 */ - __IM uint32_t CLR_GEN_CALL; /**< Clear GEN_CALL Interrupt, Address offset: 0x68 */ - __IOM uint32_t ENABLE; /**< I2C Enable, Address offset: 0x6C */ - __IM uint32_t STATUS; /**< I2C Status, Address offset: 0x70 */ - __IM uint32_t TXFLR; /**< Transmit FIFO Level Register, Address offset: 0x74 */ - __IM uint32_t RXFLR; /**< Receive FIFO Level Register, Address offset: 0x78 */ - __IOM uint32_t SDA_HOLD; /**< SDA Hold Time Length Reg, Address offset: 0x7C */ - __IM uint32_t TX_ABRT_SOURCE; /**< I2C Transmit Abort Status Reg, Address offset: 0x80 */ - __IOM uint32_t SLV_DATA_NACK_ONLY; /**< Generate SLV_DATA_NACK Register, Address offset: 0x84 */ - __IOM uint32_t DMA_CR; /**< DMA Control Register, Address offset: 0x88 */ - __IOM uint32_t DMA_TDLR; /**< DMA Transmit Data Level, Address offset: 0x8C */ - __IOM uint32_t DMA_RDLR; /**< DMA Receive Data Level, Address offset: 0x90 */ - __IOM uint32_t SDA_SETUP; /**< SDA Setup Register, Address offset: 0x94 */ - __IOM uint32_t ACK_GENERAL_CALL; /**< ACK General Call Register, Address offset: 0x98 */ - __IM uint32_t ENABLE_STATUS; /**< Enable Status Register, Address offset: 0x9C */ - __IOM uint32_t FS_SPKLEN; /**< ISS and FS spike suppression limit, Address offset: 0xA0 */ - __IOM uint32_t HS_SPKLEN; /**< HS spike suppression limit, Address offset: 0xA4 */ - __IM uint32_t CLR_RESTART_DET; /**< Clear RESTART_DET Interrupt Register, Address offset: 0xA8 */ - __IOM uint32_t SCL_STUCK_AT_LOW_TIMEOUT; /**< I2C SCL Stuck at Low Timeout, Address offset: 0xAC */ - __IOM uint32_t SDA_STUCK_AT_LOW_TIMEOUT; /**< I2C SDA Stuck at Low Timeout, Address offset: 0xB0 */ - __IM uint32_t CLR_SCL_STUCK_DET; /**< Clear SCL Stuck at Low Detect Interrupt, Address offset: 0xB4 */ - __IM uint32_t DEVICE_ID; /**< I2C Device-ID Register, Address offset: 0xB8 */ - __IOM uint32_t SMBUS_CLK_LOW_SEXT; /**< SMBus Slave Clock Extend Timeout Register, Address offset: 0xBC */ - __IOM uint32_t SMBUS_CLK_LOW_MEXT; /**< SMBus Master Clock Extend Timeout Register, Address offset: 0xC0 */ - __IOM uint32_t SMBUS_THIGH_MAX_IDLE_COUNT; /**< SMBus Master THigh MAX Bus-idle count, Address offset: 0xC4 */ - __IM uint32_t SMBUS_INTSTAT; /**< SMBUS Interrupt Status Register, Address offset: 0xC8 */ - __IOM uint32_t SMBUS_INTMASK; /**< SMBus Interrupt Mask Register, Address offset: 0xCC */ - __IM uint32_t SMBUS_RAW_INTSTAT; /**< SMBus Raw Interrupt Status Register, Address offset: 0xD0 */ - __OM uint32_t SMBUS_INTCLR; /**< SMBus Clear Interrupt Register, Address offset: 0xD4 */ - __IOM uint32_t OPTIONAL_SAR; /**< I2C Optional Slave Address Register, Address offset: 0xD8 */ - __IOM uint32_t SMBUS_UDID_LSB; /**< SMBUS ARP UDID LSB Register, Address offset: 0xDC */ - __IM uint32_t RESERVED[5]; /**< I2C RESERVED register, Address offset: 0xE0 */ - __IM uint32_t COMP_PARAM_1; /**< Component Parameter Register 1, Address offset: 0xF4 */ - __IM uint32_t COMP_VERSION; /**< Component Version Register, Address offset: 0xF8 */ - __IM uint32_t COMP_TYPE; /**< Component Type Register, Address offset: 0xFC */ -} i2c_regs_t; - -/** - * @brief I2S - */ -typedef struct { - __IOM uint32_t DATA_L; /**< Left TX/RX buffer register, Address offset: 0x000 */ - __IOM uint32_t DATA_R; /**< Right TX/RX buffer register, Address offset: 0x004 */ - __IOM uint32_t RXEN; /**< RX enable, Address offset: 0x008 */ - __IOM uint32_t TXEN; /**< TX enable, Address offset: 0x00C */ - __IOM uint32_t RXSIZE; /**< RX data size, Address offset: 0x010 */ - __IOM uint32_t TXSIZE; /**< TX data size, Address offset: 0x014 */ - __IM uint32_t INTSTAT; /**< Interrupt status, Address offset: 0x018 */ - __IOM uint32_t INTMASK; /**< Interrupt mask, Address offset: 0x01C */ - __IM uint32_t RXOVR; /**< RX FIFO overflow flag, read to clear, Address offset: 0x020 */ - __IM uint32_t TXOVR; /**< TX FIFO overflow flag, read to clear, Address offset: 0x024 */ - __IOM uint32_t RXFIFO_TL; /**< RX FIFO threshold level, Address offset: 0x028 */ - __IOM uint32_t TXFIFO_TL; /**< TX FIFO threshold level, Address offset: 0x02C */ - __OM uint32_t RXFIFO_FLUSH; /**< RX FIFO flush, Address offset: 0x030 */ - __OM uint32_t TXFIFO_FLUSH; /**< TX FIFO flush, Address offset: 0x034 */ - __IM uint32_t RESERVED[2]; /**< Reversed, Address offset: 0x038 */ -} I2S_CHANNEL_REGS; - -typedef struct _i2s_regs { - __IOM uint32_t ENABLE; /**< I2S enable, Address offset: 0x000 */ - __IOM uint32_t RBEN; /**< I2S receiver block enable, Address offset: 0x004 */ - __IOM uint32_t TBEN; /**< I2S transmitter block enable, Address offset: 0x008 */ - __IOM uint32_t CLKEN; /**< Clock enable, Address offset: 0x00C */ - __IOM uint32_t CLKCONFIG; /**< Clock configuration, Address offset: 0x010 */ - __OM uint32_t RXFIFO_RST; /**< Receiver block FIFO reset, Address offset: 0x014 */ - __OM uint32_t TXFIFO_RST; /**< Transmitter block FIFO reset, Address offset: 0x018 */ - __IM uint32_t RESERVED0; /**< Reversed, Address offset: 0x01C */ - I2S_CHANNEL_REGS I2S_CHANNEL[4]; /**< I2S channels registers, Address offset: 0x020 */ - __IM uint32_t RESERVED1[40]; /**< Reversed, Address offset: 0x120 */ - __IM uint32_t RXDMA; /**< Receiver block DMA register, Address offset: 0x1C0 */ - __OM uint32_t RXDMA_RST; /**< Receiver block DMA reset, Address offset: 0x1C4 */ - __OM uint32_t TXDMA; /**< Transmitter block DMA register, Address offset: 0x1C8 */ - __OM uint32_t TXDMA_RST; /**< Transmitter block DMA reset, Address offset: 0x1CC */ - __IM uint32_t RESERVED2[8]; /**< Reversed, Address offset: 0x1D0 */ - __IM uint32_t I2S_PARAM2; /**< I2S component parameter register 2, Address offset: 0x1F0 */ - __IM uint32_t I2S_PARAM1; /**< I2S component parameter register 1, Address offset: 0x1F4 */ - __IM uint32_t I2S_VERSION; /**< I2S component version, Address offset: 0x1F8 */ - __IM uint32_t I2S_TYPE; /**< I2S component type, Address offset: 0x1FC */ -} i2s_regs_t; - -/** - * @brief ISO7816 - */ -typedef struct _iso7816_regs { - __OM uint32_t CTRL; /**< Control Register, Address offset: 0x0000 */ - __IM uint32_t STAT; /**< Status Register, Address offset: 0x0004 */ - __IOM uint32_t CLK_CFG; /**< Clock Configuration Register , Address offset: 0x0008 */ - __IOM uint32_t RESERVED0[1]; /**< RESERVED, Address offset: 0x000C */ - __IOM uint32_t TIMES_CFG; /**< Times Configuration Register , Address offset: 0x0010 */ - __IOM uint32_t DATA_CFG; /**< Data Configuration Register , Address offset: 0x0014 */ - __IM uint32_t ADDR; /**< Address Register , Address offset: 0x0018 */ - __IOM uint32_t START_ADDR; /**< Start Address Register , Address offset: 0x001C */ - __IOM uint32_t RX_END_ADDR; /**< RX End Address Register , Address offset: 0x0020 */ - __IOM uint32_t TX_END_ADDR; /**< TX End Address Register , Address offset: 0x0024 */ -} iso7816_regs_t; - -/** - * @brief MCU_SUB - */ -typedef struct _mcu_sub_regs { - __IM uint32_t SENSE_ADC_FIFO; /**< MCU_SUB_REG_SENSE_ADC_FIFO, Address offset: 0x000 */ - __IM uint32_t RESERVED0[63]; /**< RESERVED, Address offset: 0x004 */ - __IOM uint32_t SENSE_FF_THRESH; /**< MCU_SUB_REG_SENSE_FF_THRESH, Address offset: 0x100 */ - __IM uint32_t SENSE_ADC_STAT; /**< MCU_SUB_REG_SENSE_ADC_STAT, Address offset: 0x104 */ - __IM uint32_t RESERVED1[62]; /**< RESERVED, Address offset: 0x108 */ - __IOM uint32_t COMM_TMR_DEEPSLPSTAT; /**< MCU_SUB_REG_COMM_TMR_DEEPSLPSTAT, Address offset: 0x200 */ - __IM uint32_t RESERVED2; /**< RESERVED, Address offset: 0x204 */ - __IOM uint32_t DPAD_RE_N_BUS; /**< MCU_SUB_REG_DPAD_RE_N_BUS, Address offset: 0x208 */ - __IM uint32_t RESERVED3; /**< RESERVED, Address offset: 0x20C */ - __IOM uint32_t DPAD_RTYP_BUS; /**< MCU_SUB_REG_DPAD_RTYP_BUS, Address offset: 0x210 */ - __IM uint32_t RESERVED4; /**< RESERVED, Address offset: 0x214 */ - __IOM uint32_t DPAD_IE_N_BUS; /**< MCU_SUB_REG_DPAD_IE_N_BUS, Address offset: 0x218 */ - __IM uint32_t RESERVED5; /**< RESERVED, Address offset: 0x21C */ - __IOM uint32_t MSIO_REG0; /**< MCU_SUB_REG_MSIO_REG, Address offset: 0x220 */ - __IOM uint32_t BLE_FERP_CTL; /**< MCU_SUB_REG_BLE_FERP_CTL, Address offset: 0x224 */ - __IOM uint32_t DMA_ACC_SEL; /**< MCU_SUB_REG_DMA_ACC_SEL, Address offset: 0x228 */ - __IOM uint32_t SECURITY_RESET; /**< MCU_SUB_REG_SECURITY_RESET, Address offset: 0x22C */ - __IOM uint32_t PMU_ID; /**< MCU_SUB_REG_PMU_ID, Address offset: 0x230 */ - __IOM uint32_t PWR_AVG_CTL; /**< MCU_SUB_REG_PWR_AVG_CTL_REG, Address offset: 0x234 */ - __IOM uint32_t CLK_CAL_CTL[2]; /**< MCU_SUB_REG_CLK_CAL_CTL_REG0~1, Address offset: 0x238 */ - __IOM uint32_t DPAD_MUX_CTL0_7; /**< MCU_SUB_REG_DPAD_MUX_CTL_00_07, Address offset: 0x240 */ - __IOM uint32_t DPAD_MUX_CTL8_15; /**< MCU_SUB_REG_DPAD_MUX_CTL_08_15, Address offset: 0x244 */ - __IOM uint32_t DPAD_MUX_CTL16_23; /**< MCU_SUB_REG_DPAD_MUX_CTL_16_23, Address offset: 0x248 */ - __IOM uint32_t DPAD_MUX_CTL24_31; /**< MCU_SUB_REG_DPAD_MUX_CTL_24_31, Address offset: 0x24C */ - __IM uint32_t RESERVED6; /**< RESERVED, Address offset: 0x250 */ - __IOM uint32_t EFUSE_PWR_DELTA[2]; /**< MCU_SUB_REG_EFUSE_PWR_DELTA0~1, Address offset: 0x254 */ - __IM uint32_t RESERVED7; /**< RESERVED, Address offset: 0x250 */ - __IOM uint32_t EFUSE_PWR_CTRL[2]; /**< MCU_SUB_REG_EFUSE_PWR_CTRL0~1, Address offset: 0x260 */ - __IOM uint32_t I2S_CLK_CFG; /**< MCU_SUB_REG_I2S_CLK_CFG, Address offset: 0x268 */ - __IM uint32_t RESERVED8[5]; /**< RESERVED, Address offset: 0x26C */ - __IOM uint32_t MCU_SUB_REG; /**< MCU_SUB_REG_MCU_SUB_REG, Address offset: 0x280 */ - __IM uint32_t RESERVED9[3]; /**< RESERVED, Address offset: 0x284 */ - __IOM uint32_t AON_PAD_MUX_CTL; /**< MCU_SUB_REG_AON_PAD_MUX_CTL, Address offset: 0x290 */ - __IOM uint32_t MSIO_PAD_MUX_CTL; /**< MCU_SUB_REG_MSIO_PAD_MUX_CTL, Address offset: 0x294 */ - __IM uint32_t RESERVED10[2]; /**< RESERVED, Address offset: 0x298 */ - __IOM uint32_t MCU_SUBSYS_CG_CTRL[3]; /**< MCU_SUB_REG_MCU_SUBSYS_CG_CTRL0~2, Address offset: 0x2A0 */ - __IOM uint32_t MCU_PERIPH_CG; /**< MCU_SUB_REG_MCU_PERIPH_CG, Address offset: 0x2AC */ - __IOM uint32_t MCU_SUBSYS_CLK_CTRL; /**< MCU_SUB_REG_MCU_SUBSYS_CLK_CTRL, Address offset: 0x2B0 */ - __IM uint32_t RESERVED11[3]; /**< RESERVED, Address offset: 0x2B4 */ - __IOM uint32_t BLE_DSLEEP_CORR_EN; /**< MCU_SUB_REG_BLE_DSLEEP_CORR_EN, Address offset: 0x2C0 */ - __IOM uint32_t BLE_DSLEEP_HW_TIM_CORR; /**< MCU_SUB_REG_BLE_DSLEEP_HW_TIM_CORR,Address offset: 0x2C4 */ -} mcu_sub_regs_t; - -/** - * @brief PKC - */ -typedef struct _pkc_regs { - __IOM uint32_t CTRL; /**< PKC_REG_CTRL, Address offset: 0x00 */ - __IOM uint32_t CONFIG0; /**< PKC_REG_CONFIG0, Address offset: 0x04 */ - __IOM uint32_t CONFIG1; /**< PKC_REG_CONFIG1, Address offset: 0x08 */ - __IOM uint32_t CONFIG2; /**< PKC_REG_CONFIG2, Address offset: 0x0C */ - __IOM uint32_t CONFIG3; /**< PKC_REG_CONFIG3, Address offset: 0x10 */ - __IOM uint32_t CONFIG4; /**< PKC_REG_CONFIG4, Address offset: 0x14 */ - __IOM uint32_t CONFIG5; /**< PKC_REG_CONFIG5, Address offset: 0x18 */ - __IOM uint32_t CONFIG6; /**< PKC_REG_CONFIG6, Address offset: 0x1C */ - __IOM uint32_t CONFIG7; /**< PKC_REG_CONFIG7, Address offset: 0x20 */ - __IOM uint32_t CONFIG8; /**< PKC_REG_CONFIG8, Address offset: 0x24 */ - __IOM uint32_t CONFIG9; /**< PKC_REG_CONFIG9, Address offset: 0x28 */ - __IOM uint32_t CONFIG10; /**< PKC_REG_CONFIG10, Address offset: 0x2C */ - __IOM uint32_t CONFIG11; /**< PKC_REG_CONFIG11, Address offset: 0x30 */ - __IOM uint32_t CONFIG12; /**< PKC_REG_CONFIG12, Address offset: 0x34 */ - __IOM uint32_t CONFIG13; /**< PKC_REG_CONFIG13, Address offset: 0x38 */ - __IM uint32_t REVERSED0; /**< PKC_REG_REVERSED, Address offset: 0x3C */ - __IOM uint32_t SW_CTRL; /**< PKC_REG_SW_CTRL, Address offset: 0x40 */ - __IOM uint32_t SW_CONFIG0; /**< PKC_REG_SW_CONFIG, Address offset: 0x44 */ - __IOM uint32_t SW_CONFIG1; /**< PKC_REG_SW_CONFIG, Address offset: 0x48 */ - __IOM uint32_t SW_CONFIG2; /**< PKC_REG_SW_CONFIG, Address offset: 0x4C */ - __IOM uint32_t SW_CONFIG3; /**< PKC_REG_SW_CONFIG, Address offset: 0x50 */ - __IOM uint32_t SW_CONFIG4; /**< PKC_REG_SW_CONFIG, Address offset: 0x54 */ - __IOM uint32_t SW_CONFIG5; /**< PKC_REG_SW_CONFIG, Address offset: 0x58 */ - __IOM uint32_t SW_CONFIG6; /**< PKC_REG_SW_CONFIG, Address offset: 0x5C */ - __IOM uint32_t SW_CONFIG7; /**< PKC_REG_SW_CONFIG, Address offset: 0x60 */ - __IM uint32_t SW_CONFIG8; /**< PKC_REG_SW_CONFIG, Address offset: 0x64 */ - __IOM uint32_t SW_CONFIG9; /**< PKC_REG_SW_CONFIG, Address offset: 0x68 */ - __IOM uint32_t SW_CONFIG10; /**< PKC_REG_SW_CONFIG, Address offset: 0x6C */ - __IOM uint32_t SW_CONFIG11; /**< PKC_REG_SW_CONFIG, Address offset: 0x70 */ - __IOM uint32_t SW_CONFIG12; /**< PKC_REG_SW_CONFIG, Address offset: 0x74 */ - __IOM uint32_t SW_CONFIG13; /**< PKC_REG_SW_CONFIG, Address offset: 0x78 */ - __IM uint32_t REVERSED1; /**< PKC_REG_REVERSED, Address offset: 0x7C */ - __IOM uint32_t INTSTAT; /**< PKC_REG_INT_STATUS, Address offset: 0x80 */ - __IOM uint32_t INTEN; /**< PKC_REG_INT_ENABLE, Address offset: 0x84 */ - __IM uint32_t WORKSTAT; /**< PKC_REG_WORK_STATUS, Address offset: 0x88 */ - __IM uint32_t REVERSED2; /**< PKC_REG_REVERSED, Address offset: 0x8C */ - __IOM uint32_t DUMMY0; /**< PKC_REG_DUMMY0, Address offset: 0x90 */ - __IOM uint32_t DUMMY1; /**< PKC_REG_DUMMY1, Address offset: 0x94 */ - __IOM uint32_t DUMMY2; /**< PKC_REG_DUMMY2, Address offset: 0x98 */ -} pkc_regs_t; - -/** - * @brief PWM - */ -typedef struct _pwm_regs { - __IOM uint32_t MODE; /**< PWM_REG_MODE, Address, offset: 0x00 */ - __IOM uint32_t UPDATE; /**< PWM_REG_UPDATE, Address, offset: 0x04 */ - __IOM uint32_t PRD; /**< PWM_REG_PRD, Address, offset: 0x08 */ - __IOM uint32_t CMPA0; /**< PWM_REG_CMPA0, Address, offset: 0x0C */ - __IOM uint32_t CMPA1; /**< PWM_REG_CMPA1, Address, offset: 0x10 */ - __IOM uint32_t CMPB0; /**< PWM_REG_CMPB0, Address, offset: 0x14 */ - __IOM uint32_t CMPB1; /**< PWM_REG_CMPB1, Address, offset: 0x18 */ - __IOM uint32_t CMPC0; /**< PWM_REG_CMPC0, Address, offset: 0x1C */ - __IOM uint32_t CMPC1; /**< PWM_REG_CMPC1, Address, offset: 0x20 */ - __IOM uint32_t AQCTRL; /**< PWM_REG_AQCTRL, Address, offset: 0x24 */ - __IOM uint32_t BRPRD; /**< PWM_REG_BRPRD, Address, offset: 0x28 */ - __IOM uint32_t HOLD; /**< PWM_REG_HOLD, Address, offset: 0x2C */ -} pwm_regs_t; - -/** - * @brief SSI - */ -typedef struct _ssi_regs { - __IOM uint32_t CTRL0; /**< SSI_REG_CTRL0, Address offset: 0x00 */ - __IOM uint32_t CTRL1; /**< SSI_REG_CTRL1, Address offset: 0x04 */ - __IOM uint32_t SSI_EN; /**< SSI_REG_SSI_EN, Address offset: 0x08 */ - __IOM uint32_t MWC; /**< SSI_REG_MWC, Address offset: 0x0C */ - __IOM uint32_t SE; /**< SSI_REG_SE, Address offset: 0x10 */ - __IOM uint32_t BAUD; /**< SSI_REG_BAUD, Address offset: 0x14 */ - __IOM uint32_t TX_FTL; /**< SSI_REG_TX_FTL, Address offset: 0x18 */ - __IOM uint32_t RX_FTL; /**< SSI_REG_RX_FTL, Address offset: 0x1C */ - __IM uint32_t TX_FL; /**< SSI_REG_TX_FL, Address offset: 0x20 */ - __IM uint32_t RX_FL; /**< SSI_REG_RX_FL, Address offset: 0x24 */ - __IM uint32_t STAT; /**< SSI_REG_STAT, Address offset: 0x28 */ - __IOM uint32_t INTMASK; /**< SSI_REG_INT_MASK, Address offset: 0x2C */ - __IM uint32_t INTSTAT; /**< SSI_REG_INT_STAT, Address offset: 0x30 */ - __IM uint32_t RAW_INTSTAT; /**< SSI_REG_RAW_INT_STAT, Address offset: 0x34 */ - __IM uint32_t TXOIC; /**< SSI_REG_TXOIC, Address offset: 0x38 */ - __IM uint32_t RXOIC; /**< SSI_REG_RXOIC, Address offset: 0x3C */ - __IM uint32_t RXUIC; /**< SSI_REG_RXUIC, Address offset: 0x40 */ - __IM uint32_t MSTIC; /**< SSI_REG_MSTIC, Address offset: 0x44 */ - __IM uint32_t INTCLR; /**< SSI_REG_INT_CLR, Address offset: 0x48 */ - __IOM uint32_t DMAC; /**< SSI_REG_DMAC, Address offset: 0x4C */ - __IOM uint32_t DMA_TDL; /**< SSI_REG_DMA_TDL, Address offset: 0x50 */ - __IOM uint32_t DMA_RDL; /**< SSI_REG_DMA_RDL, Address offset: 0x54 */ - __IM uint32_t ID; /**< SSI_REG_ID, Address offset: 0x58 */ - __IM uint32_t VERSION_ID; /**< SSI_REG_VERSION_ID, Address offset: 0x5C */ - __IOM uint32_t DATA; /**< SSI_REG_DATA, Address offset: 0x60 */ - __IM uint32_t REVERSED[35]; /**< SSI_REG_REVERSED, Address offset: 0x64 */ - __IOM uint32_t RX_SAMPLE_DLY; /**< SSI_REG_RX_SAMPLE_DLY, Address offset: 0xF0 */ - __IOM uint32_t SPI_CTRL0; /**< SSI_REG_SPI_CTRL0, Address offset: 0xF4 */ -} ssi_regs_t; - -/** - * @brief TIM - */ -typedef struct _timer_regs { - __IOM uint32_t CTRL; /**< TIMER control register, Address offset: 0x00 */ - __IOM uint32_t VALUE; /**< TIMER counter value register, Address offset: 0x04 */ - __IOM uint32_t RELOAD; /**< TIMER auto-reload register, Address offset: 0x08 */ - __IOM uint32_t INTSTAT; /**< TIMER interrupt status register, Address offset: 0x0C */ -} timer_regs_t; - -/** - * @brief UART - */ -typedef struct _uart_regs { - union { - __IOM uint32_t RBR; - __IOM uint32_t DLL; - __IOM uint32_t THR; - } RBR_DLL_THR; /**< UART_REG_RBR_DLL_THR, Address offset: 0x00 */ - union { - __IOM uint32_t DLH; - __IOM uint32_t IER; - } DLH_IER; /**< UART_REG_DLH_IER, Address offset: 0x04 */ - union { - __IOM uint32_t FCR; - __IOM uint32_t IIR; - } FCR_IIR; /**< UART_REG_FCR_IIR, Address offset: 0x08 */ - __IOM uint32_t LCR; /**< UART_REG_LCR, Address offset: 0x0C */ - __IOM uint32_t MCR; /**< UART_REG_MCR, Address offset: 0x10 */ - __IOM uint32_t LSR; /**< UART_REG_LSR, Address offset: 0x14 */ - __IOM uint32_t MSR; /**< UART_REG_MSR, Address offset: 0x18 */ - __IOM uint32_t SCRATCHPAD; /**< UART_REG_SCRATCHPAD, Address offset: 0x1C */ - __IOM uint32_t LPDLL; /**< UART_REG_LPDLL, Address offset: 0x20 */ - __IOM uint32_t LPDLH; /**< UART_REG_LPDLH, Address offset: 0x24 */ - __IOM uint32_t REVERSED0[2]; /**< REVERSED, Address offset: 0x28 */ - union { - __IOM uint32_t SRBR[16]; - __IOM uint32_t STHR[16]; - } SRBR_STHR; /**< UART_REG_SRBR_STHR, Address offset: 0x30 */ - __IOM uint32_t FAR; /**< UART_REG_FAR, Address offset: 0x70 */ - __IOM uint32_t TFR; /**< UART_REG_TFR, Address offset: 0x74 */ - __IOM uint32_t TFW; /**< UART_REG_TFW, Address offset: 0x78 */ - __IOM uint32_t USR; /**< UART_REG_USR, Address offset: 0x7C */ - __IOM uint32_t TFL; /**< UART_REG_TFL, Address offset: 0x80 */ - __IOM uint32_t RFL; /**< UART_REG_RFL, Address offset: 0x84 */ - __IOM uint32_t SRR; /**< UART_REG_SRR, Address offset: 0x88 */ - __IOM uint32_t SRTS; /**< UART_REG_SRTS, Address offset: 0x8C */ - __IOM uint32_t SBCR; /**< UART_REG_SBCR, Address offset: 0x90 */ - __IOM uint32_t SDMAM; /**< UART_REG_SDMAM, Address offset: 0x94 */ - __IOM uint32_t SFE; /**< UART_REG_SFE, Address offset: 0x98 */ - __IOM uint32_t SRT; /**< UART_REG_SRT, Address offset: 0x9C */ - __IOM uint32_t STET; /**< UART_REG_STET, Address offset: 0xA0 */ - __IOM uint32_t HTX; /**< UART_REG_HTX, Address offset: 0xA4 */ - __IOM uint32_t DMASA; /**< UART_REG_DMASA, Address offset: 0xA8 */ - __IOM uint32_t TCR; /**< UART_REG_TCR, Address offset: 0xAC */ - __IOM uint32_t DE_EN; /**< UART_REG_DE_EN, Address offset: 0xB0 */ - __IOM uint32_t RE_EN; /**< UART_REG_RE_EN, Address offset: 0xB4 */ - __IOM uint32_t DET; /**< UART_REG_DET, Address offset: 0xB8 */ - __IOM uint32_t TAT; /**< UART_REG_TAT, Address offset: 0xBC */ - __IOM uint32_t DLF; /**< UART_REG_DLF, Address offset: 0xC0 */ - __IOM uint32_t RAR; /**< UART_REG_RAR, Address offset: 0xC4 */ - __IOM uint32_t TAR; /**< UART_REG_TAR, Address offset: 0xC8 */ - __IOM uint32_t LCR_EXT; /**< UART_REG_LCR_EXT, Address offset: 0xCC */ - __IOM uint32_t REVERSED1[9]; /**< REVERSED, Address offset: 0xD0 */ - __IOM uint32_t CPR; /**< UART_REG_CPR, Address offset: 0xF4 */ - __IOM uint32_t UCV; /**< UART_REG_UCV, Address offset: 0xF8 */ - __IOM uint32_t CTR; /**< UART_REG_CTR, Address offset: 0xFC */ -} uart_regs_t; - -/** - * @brief WDT - */ -typedef struct _wdt_regs { - __IOM uint32_t LOAD; /**< WDT_REG_LOAD, Address offset: 0x000 */ - __IOM uint32_t VALUE; /**< WDT_REG_VALUE, Address offset: 0x004 */ - __IOM uint32_t CTRL; /**< WDT_REG_CONTROL, Address offset: 0x008 */ - __IOM uint32_t INTCLR; /**< WDT_REG_INTCLR, Address offset: 0x00C */ - __IOM uint32_t RIS; /**< WDT_REG_RIS, Address offset: 0x010 */ - __IOM uint32_t MIS; /**< WDT_REG_MIS, Address offset: 0x014 */ - __IOM uint32_t REVERSED[762]; /**< REVERSED, Address offset: 0x018 */ - __IOM uint32_t LOCK; /**< WDT_REG_LOCK, Address offset: 0xC00 */ -} wdt_regs_t; - -/** - * @brief XQSPI - */ -/* XQSPI/Cache Registers */ -typedef struct { - __IOM uint32_t CTRL0; /**< Cache Control 0 Register, Address offset: 0x00 */ - __IOM uint32_t CTRL1; /**< Cache Control 1 Register, Address offset: 0x04 */ - __IM uint32_t HIT_COUNT; /**< Cache hits count, Address offset: 0x08 */ - __IM uint32_t MISS_COUNT; /**< Cache miss count, Address offset: 0x0C */ - __IM uint32_t STAT; /**< Status Register, Address offset: 0x10 */ - __IOM uint32_t BUF_FIRST_ADDR; /**< Preload start address, Address offset: 0x14 */ - __IOM uint32_t BUF_LAST_ADDR; /**< Preload last address, Address offset: 0x18 */ -} CACHE_REGS; - -/* XQSPI/QSPI Registers */ -typedef struct { - __OM uint32_t TX_DATA; /**< Serial Data Transmit, Address offset: 0x00 */ - __IM uint32_t RX_DATA; /**< Serial Data Receive, Address offset: 0x04 */ - __IM uint32_t RESERVED0; /**< RESERVED, Address offset: 0x08 */ - __IOM uint32_t CTRL; /**< Control, Address offset: 0x0C */ - __IOM uint32_t AUX_CTRL; /**< Auxiliary Control, Address offset: 0x10 */ - __IM uint32_t STAT; /**< Status Control, Address offset: 0x14 */ - __IOM uint32_t SLAVE_SEL; /**< Slave Select, Address offset: 0x18 */ - __IOM uint32_t SLAVE_SEL_POL; /**< Slave Select Polarity, Address offset: 0x1C */ - __IOM uint32_t INTEN; /**< Interrupt Enable, Address offset: 0x20 */ - __IM uint32_t INTSTAT; /**< Interrupt Status, Address offset: 0x24 */ - __OM uint32_t INTCLR; /**< Interrupt Clear, Address offset: 0x28 */ - __IM uint32_t TX_FIFO_LVL; /**< TX FIFO Level, Address offset: 0x2C */ - __IM uint32_t RX_FIFO_LVL; /**< RX FIFO Level, Address offset: 0x30 */ - __IM uint32_t RESERVED1; /**< RESERVED, Address offset: 0x34 */ - __IOM uint32_t MSTR_IT_DELAY; /**< Master Inter-transfer Delay, Address offset: 0x38 */ - __IOM uint32_t SPIEN; /**< SPI Enable, Address offset: 0x3C */ - __IOM uint32_t SPI_GP_SET; /**< GPO Set / GPO State, Address offset: 0x40 */ - __IOM uint32_t SPI_GP_CLEAR; /**< GPO Clear / GPI State, Address offset: 0x44 */ - __IM uint32_t RX_DATA0_31; /**< 32-bit LSB word(0~31), Address offset: 0x48 */ - __IM uint32_t RX_DATA32_63; /**< 32-bit LSB word(32~63), Address offset: 0x4C */ - __IM uint32_t RX_DATA64_95; /**< 32-bit LSB word(64~95), Address offset: 0x50 */ - __IM uint32_t RX_DATA96_127; /**< 32-bit MSB word(96~127), Address offset: 0x54 */ - __OM uint32_t P_IV; /**< 32-BIT IV Key, Address offset: 0x58 */ - __IOM uint32_t FLASH_WRITE; /**< use for flash write, Address offset: 0x5C */ - __IOM uint32_t P_KEY_VALID_KPORT; /**< Status bit, Address offset: 0x60 */ - __IOM uint32_t P_RD_KEY_EN_KPORT; /**< Enable read key on keyport, Address offset: 0x64 */ - __IOM uint32_t P_KEY_ADDR; /**< Present key address, Address offset: 0x68 */ - __IOM uint32_t P_KEYPORT_MASK; /**< Present key mask, Address offset: 0x6C */ - __IOM uint32_t BYPASS; /**< Enable Bypass, Address offset: 0x70 */ -} QSPI_REGS; - -/* XQSPI/XIP Registers */ -typedef struct { - __IOM uint32_t CTRL0; /**< XIP Control 0 Register, Address offset: 0x00 */ - __IOM uint32_t CTRL1; /**< XIP Control 1 Register, Address offset: 0x04 */ - __IOM uint32_t CTRL2; /**< XIP Control 2 Register, Address offset: 0x08 */ - __IOM uint32_t CTRL3; /**< XIP Enable Request, Address offset: 0x0C */ - __IOM uint32_t STAT; /**< XIP Enable Output (Stat0), Address offset: 0x10 */ - __IM uint32_t INTEN; /**< Interrupt Enable (Intr0), Address offset: 0x14 */ - __IM uint32_t INTSTAT; /**< Interrupt Status (Intr1), Address offset: 0x18 */ - __IM uint32_t INTREQ; /**< Interrupt Status (Intr2), Address offset: 0x1C */ - __OM uint32_t INTSET; /**< Interrupt Set (Intr3), Address offset: 0x20 */ - __OM uint32_t INTCLR; /**< Interrupt Clear (Intr4), Address offset: 0x24 */ -} XIP_REGS; - -typedef struct _xqspi_regs { - CACHE_REGS CACHE; /**< CACHE Registers, Address offset: 0x000 */ - __IM uint32_t RESERVED0[249]; - QSPI_REGS QSPI; /**< QSPI Registers, Address offset: 0x400 */ - __IM uint32_t RESERVED1[483]; - XIP_REGS XIP; /**< XIP Registers, Address offset: 0xC00 */ -} xqspi_regs_t; - -/** - * @brief EFUSE - */ -typedef struct _efuse_regs { - __IOM uint32_t TPGM; /**< EFUSE_TPGM, Address offset: 0x000 */ - __IOM uint32_t PGENB; /**< EFUSE_PGENB, Address offset: 0x004 */ - __IM uint32_t TEST_MODE; /**< EFUSE_TEST_MODE, Address offset: 0x008 */ - __OM uint32_t OPERATION; /**< EFUSE_OPERATION, Address offset: 0x00C */ - __IM uint32_t STAT; /**< EFUSE_STATUS, Address offset: 0x010 */ - __IOM uint32_t KEY_MASK; /**< EFUSE_KEY_MASK, Address offset: 0x014 */ - __IOM uint32_t CRC_ADDR; /**< EFUSE_CRC_START_ADDR, Address offset: 0x018 */ - __IM uint32_t CRC_OUTPUT; /**< EFUSE_CRC_OUTPUT, Address offset: 0x01C */ - __IOM uint32_t TRIM_ADDR; /**< EFUSE_TRIM_ADDR, Address offset: 0x020 */ - __IOM uint32_t TRIM_LEN; /**< EFUSE_TRIM_LEN, Address offset: 0x024 */ - __IM uint32_t TRIM[14]; /**< EFUSE_TRIM, Address offset: 0x028 */ -} efuse_regs_t; - -/** - * @brief RNG - */ -typedef struct _rng_regs { - __IOM uint32_t CTRL; /**< RNG_CTRL, Address offset: 0x000 */ - __IOM uint32_t STATUS; /**< RNG_STATUS, Address offset: 0x004 */ - __IM uint32_t DATA; /**< RNG_DATA, Address offset: 0x008 */ - __IOM uint32_t RESERVED; /**< RESERVED, Address offset: 0x00C */ - __IM uint32_t LR_STATUS; /**< RNG_LR_STATUS, Address offset: 0x010 */ - __IOM uint32_t CONFIG; /**< RNG_CONFIG, Address offset: 0x014 */ - __IOM uint32_t TSCON; /**< RNG_TSCON, Address offset: 0x018 */ - __IOM uint32_t FROCFG; /**< RNG_FROCFG, Address offset: 0x01C */ - __OM uint32_t USER_SEED; /**< RNG_USER_SEED, Address offset: 0x020 */ - __IOM uint32_t LRCON; /**< RNG_LRCON, Address offset: 0x024 */ -} rng_regs_t; - -/** @} */ /* End of group Peripheral_registers_structures */ - - -/* ==================================== End of section using anonymous unions ==================================== */ -#if defined (__CC_ARM) -#pragma pop -#elif defined (__ICCARM__) -/* leave anonymous unions enabled */ -#elif (__ARMCC_VERSION >= 6010050) -#pragma clang diagnostic pop -#elif defined (__GNUC__) -/* anonymous unions are enabled by default */ -#elif defined (__TMS470__) -/* anonymous unions are enabled by default */ -#elif defined (__TASKING__) -#pragma warning restore -#elif defined (__CSMC__) -/* anonymous unions are enabled by default */ -#else -#warning Not supported compiler type -#endif - - -/* ================================================================================================================= */ -/* ================ Device Specific Peripheral Address Map ================ */ -/* ================================================================================================================= */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ - -#define ROM_BASE ((uint32_t)0x00000000UL) -#define FLASH_BASE ((uint32_t)0x01000000UL) -#define SRAM_BASE ((uint32_t)0x30000000UL) -#define PERIPH_BASE ((uint32_t)0xA0000000UL) - -#define TIMER0_BASE (PERIPH_BASE + 0x00000000UL) -#define TIMER1_BASE (PERIPH_BASE + 0x00001000UL) -#define DUAL_TIMER0_BASE (PERIPH_BASE + 0x00002000UL) -#define DUAL_TIMER1_BASE (PERIPH_BASE + 0x00002020UL) -#define WDT_BASE (PERIPH_BASE + 0x00008000UL) -#define SPIM_BASE (PERIPH_BASE + 0x0000C000UL) -#define SPIS_BASE (PERIPH_BASE + 0x0000C100UL) -#define QSPI0_BASE (PERIPH_BASE + 0x0000C200UL) -#define I2C0_BASE (PERIPH_BASE + 0x0000C300UL) -#define I2C1_BASE (PERIPH_BASE + 0x0000C400UL) -#define AON_BASE (PERIPH_BASE + 0x0000C500UL) -#define UART0_BASE (PERIPH_BASE + 0x0000C600UL) -#define UART1_BASE (PERIPH_BASE + 0x0000C700UL) -#define QSPI1_BASE (PERIPH_BASE + 0x0000C800UL) -#define PWM0_BASE (PERIPH_BASE + 0x0000C900UL) -#define I2S_M_BASE (PERIPH_BASE + 0x0000CA00UL) -#define PWM1_BASE (PERIPH_BASE + 0x0000CC00UL) -#define XQSPI_BASE (PERIPH_BASE + 0x0000D000UL) -#define MCU_SUB_BASE (PERIPH_BASE + 0x0000E000UL) -#define I2S_S_BASE (PERIPH_BASE + 0x0000F000UL) -#define ISO7816_BASE (PERIPH_BASE + 0x0000F200UL) -#define GPIO0_BASE (PERIPH_BASE + 0x00010000UL) -#define GPIO1_BASE (PERIPH_BASE + 0x00011000UL) -#define GPIO2_BASE (PERIPH_BASE + 0x00012000UL) -#define DMA_BASE (PERIPH_BASE + 0x00013000UL) -#define PKC_BASE (PERIPH_BASE + 0x00014000UL) -#define AES_BASE (PERIPH_BASE + 0x00015400UL) -#define HMAC_BASE (PERIPH_BASE + 0x00015800UL) -#define EFUSE_BASE (PERIPH_BASE + 0x00016400UL) -#define RNG_BASE (PERIPH_BASE + 0x00017800UL) - -#define PKC_SPRAM_BASE (PKC_BASE + 0x00000800UL) -#define KRAM_BASE (PERIPH_BASE + 0x00017000UL) -#define EFUSE_STORAGE_BASE (PERIPH_BASE + 0x00016000UL) - -/** @} */ /* End of group Peripheral_memory_map */ - - -/* ================================================================================================================= */ -/* ================ Peripheral declaration ================ */ -/* ================================================================================================================= */ - -/** @addtogroup Peripheral_declaration - * @{ - */ - -#define TIMER0 ((timer_regs_t *)TIMER0_BASE) -#define TIMER1 ((timer_regs_t *)TIMER1_BASE) -#define DUAL_TIMER0 ((dual_timer_regs_t *)DUAL_TIMER0_BASE) -#define DUAL_TIMER1 ((dual_timer_regs_t *)DUAL_TIMER1_BASE) -#define WDT ((wdt_regs_t *)WDT_BASE) -#define SPIM ((ssi_regs_t *)SPIM_BASE) -#define SPIS ((ssi_regs_t *)SPIS_BASE) -#define QSPI0 ((ssi_regs_t *)QSPI0_BASE) -#define QSPI1 ((ssi_regs_t *)QSPI1_BASE) -#define I2C0 ((i2c_regs_t *)I2C0_BASE) -#define I2C1 ((i2c_regs_t *)I2C1_BASE) -#define AON ((aon_regs_t *)AON_BASE) -#define UART0 ((uart_regs_t *)UART0_BASE) -#define UART1 ((uart_regs_t *)UART1_BASE) -#define PWM0 ((pwm_regs_t *)PWM0_BASE) -#define PWM1 ((pwm_regs_t *)PWM1_BASE) -#define I2S_M ((i2s_regs_t *)I2S_M_BASE) -#define I2S_S ((i2s_regs_t *)I2S_S_BASE) -#define ISO7816 ((iso7816_regs_t *)ISO7816_BASE) -#define XQSPI ((xqspi_regs_t *)XQSPI_BASE) -#define MCU_SUB ((mcu_sub_regs_t *)MCU_SUB_BASE) -#define GPIO0 ((gpio_regs_t *)GPIO0_BASE) -#define GPIO1 ((gpio_regs_t *)GPIO1_BASE) -#define GPIO2 ((gpio_regs_t *)GPIO2_BASE) -#define DMA ((dma_regs_t *)DMA_BASE) -#define PKC ((pkc_regs_t *)PKC_BASE) -#define AES ((aes_regs_t *)AES_BASE) -#define HMAC ((hmac_regs_t *)HMAC_BASE) -#define EFUSE ((efuse_regs_t *)EFUSE_BASE) -#define RNG ((rng_regs_t *)RNG_BASE) - -/** @} */ /* End of group Peripheral_declaration */ - -/** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/* ================================================================================================================= */ -/* ================ AES ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for AES_CTRL register *******************/ -#define AES_CTRL_ENABLE_Pos (0U) -#define AES_CTRL_ENABLE_Len (1U) -#define AES_CTRL_ENABLE_Msk (1U << AES_CTRL_ENABLE_Pos) -#define AES_CTRL_ENABLE AES_CTRL_ENABLE_Msk - -#define AES_CTRL_START_NORMAL_Pos (1U) -#define AES_CTRL_START_NORMAL_Len (1U) -#define AES_CTRL_START_NORMAL_Msk (1U << AES_CTRL_START_NORMAL_Pos) -#define AES_CTRL_START_NORMAL AES_CTRL_START_NORMAL_Msk - -#define AES_CTRL_START_DMA_Pos (2U) -#define AES_CTRL_START_DMA_Len (1U) -#define AES_CTRL_START_DMA_Msk (1U << AES_CTRL_START_DMA_Pos) -#define AES_CTRL_START_DMA AES_CTRL_START_DMA_Msk - -#define AES_CTRL_ENABLE_RKEY_Pos (3U) -#define AES_CTRL_ENABLE_RKEY_Len (1U) -#define AES_CTRL_ENABLE_RKEY_Msk (1U << AES_CTRL_ENABLE_RKEY_Pos) -#define AES_CTRL_ENABLE_RKEY AES_CTRL_ENABLE_RKEY_Msk - -/******************* Bit definition for AES_CONFIG register *******************/ -#define AES_CONFIG_KEYMODE_Pos (0U) -#define AES_CONFIG_KEYMODE_Len (2U) -#define AES_CONFIG_KEYMODE_Msk (3U << AES_CONFIG_KEYMODE_Pos) -#define AES_CONFIG_KEYMODE AES_CONFIG_KEYMODE_Msk - -#define AES_CONFIG_ENABLE_FULLMASK_Pos (3U) -#define AES_CONFIG_ENABLE_FULLMASK_Len (1U) -#define AES_CONFIG_ENABLE_FULLMASK_Msk (1U << AES_CONFIG_ENABLE_FULLMASK_Pos) -#define AES_CONFIG_ENABLE_FULLMASK AES_CONFIG_ENABLE_FULLMASK_Msk - -#define AES_CONFIG_ENABLE_ENCRYPTION_Pos (4U) -#define AES_CONFIG_ENABLE_ENCRYPTION_Len (1U) -#define AES_CONFIG_ENABLE_ENCRYPTION_Msk (1U << AES_CONFIG_ENABLE_ENCRYPTION_Pos) -#define AES_CONFIG_ENABLE_ENCRYPTION AES_CONFIG_ENABLE_ENCRYPTION_Msk - -#define AES_CONFIG_LOADSEED_Pos (5U) -#define AES_CONFIG_LOADSEED_Len (1U) -#define AES_CONFIG_LOADSEED_Msk (1U << AES_CONFIG_LOADSEED_Pos) -#define AES_CONFIG_LOADSEED AES_CONFIG_LOADSEED_Msk - -#define AES_CONFIG_FIRSTBLOCK_Pos (6U) -#define AES_CONFIG_FIRSTBLOCK_Len (1U) -#define AES_CONFIG_FIRSTBLOCK_Msk (1U << AES_CONFIG_FIRSTBLOCK_Pos) -#define AES_CONFIG_FIRSTBLOCK AES_CONFIG_FIRSTBLOCK_Msk - -#define AES_CONFIG_ENDIAN_Pos (7U) -#define AES_CONFIG_ENDIAN_Len (1U) -#define AES_CONFIG_ENDIAN_Msk (1U << AES_CONFIG_ENDIAN_Pos) -#define AES_CONFIG_ENDIAN AES_CONFIG_ENDIAN_Msk - -#define AES_CONFIG_OPMODE_Pos (8U) -#define AES_CONFIG_OPMODE_Len (3U) -#define AES_CONFIG_OPMODE_Msk (7U << AES_CONFIG_OPMODE_Pos) -#define AES_CONFIG_OPMODE AES_CONFIG_OPMODE_Msk - -#define AES_CONFIG_KEYTYPE_Pos (11U) -#define AES_CONFIG_KEYTYPE_Len (2U) -#define AES_CONFIG_KEYTYPE_Msk (3U << AES_CONFIG_KEYTYPE_Pos) -#define AES_CONFIG_KEYTYPE AES_CONFIG_KEYTYPE_Msk - -/******************* Bit definition for AES_STATUS register *******************/ -#define AES_STATUS_READY_Pos (0U) -#define AES_STATUS_READY_Len (1U) -#define AES_STATUS_READY_Msk (1U << AES_STATUS_READY_Pos) -#define AES_STATUS_READY AES_STATUS_READY_Msk - -#define AES_STATUS_TRANSDONE_Pos (1U) -#define AES_STATUS_TRANSDONE_Len (1U) -#define AES_STATUS_TRANSDONE_Msk (1U << AES_STATUS_TRANSDONE_Pos) -#define AES_STATUS_TRANSDONE AES_STATUS_TRANSDONE_Msk - -#define AES_STATUS_TRANSERR_Pos (2U) -#define AES_STATUS_TRANSERR_Len (1U) -#define AES_STATUS_TRANSERR_Msk (1U << AES_STATUS_TRANSERR_Pos) -#define AES_STATUS_TRANSERR AES_STATUS_TRANSERR_Msk - -#define AES_STATUS_KEYVALID_Pos (3U) -#define AES_STATUS_KEYVALID_Len (1U) -#define AES_STATUS_KEYVALID_Msk (1U << AES_STATUS_KEYVALID_Pos) -#define AES_STATUS_KEYVALID AES_STATUS_KEYVALID_Msk - -/******************* Bit definition for AES_INTERRUPT register *******************/ -#define AES_INTERRUPT_DONE_Pos (0U) -#define AES_INTERRUPT_DONE_Len (1U) -#define AES_INTERRUPT_DONE_Msk (1U << AES_INTERRUPT_DONE_Pos) -#define AES_INTERRUPT_DONE AES_INTERRUPT_DONE_Msk - -#define AES_INTERRUPT_ENABLE_Pos (1U) -#define AES_INTERRUPT_ENABLE_Len (1U) -#define AES_INTERRUPT_ENABLE_Msk (1U << AES_INTERRUPT_ENABLE_Pos) -#define AES_INTERRUPT_ENABLE AES_INTERRUPT_ENABLE_Msk - -/******************* Bit definition for AES_TRAN_SIZE register *******************/ -#define AES_TRAN_SIZE_Pos (0U) -#define AES_TRAN_SIZE_Len (15U) -#define AES_TRAN_SIZE_Msk (0x00007FFFU) -#define AES_TRAN_SIZE AES_TRAN_SIZE_Msk - -/******************* Bit definition for AES_RSTART_ADDR register *******************/ -#define AES_RSTART_ADDR_Pos (0U) -#define AES_RSTART_ADDR_Len (32U) -#define AES_RSTART_ADDR_Msk (0xFFFFFFFFU) -#define AES_RSTART_ADDR AES_RSTART_ADDR_Msk - -/******************* Bit definition for AES_WSTART_ADDR register *******************/ -#define AES_WSTART_ADDR_Pos (0U) -#define AES_WSTART_ADDR_Len (32U) -#define AES_WSTART_ADDR_Msk (0xFFFFFFFFU) -#define AES_WSTART_ADDR AES_WSTART_ADDR_Msk - -/******************* Bit definition for AES_KEY_ADDR register *******************/ -#define AES_KEY_ADDR_Pos (0U) -#define AES_KEY_ADDR_Len (32U) -#define AES_KEY_ADDR_Msk (0xFFFFFFFFU) -#define AES_KEY_ADDR AES_KEY_ADDR_Msk - -/******************* Bit definition for AES_DATA_OUT register *******************/ -#define AES_DATA_OUT_Pos (0U) -#define AES_DATA_OUT_Len (32U) -#define AES_DATA_OUT_Msk (0xFFFFFFFFU) -#define AES_DATA_OUT AES_DATA_OUT_Msk - -/******************* Bit definition for AES_KEY register *******************/ -#define AES_KEY_Pos (0U) -#define AES_KEY_Len (32U) -#define AES_KEY_Msk (0xFFFFFFFFU) -#define AES_KEY AES_KEY_Msk - -/******************* Bit definition for AES_SEED_IN register *******************/ -#define AES_SEED_IN_Pos (0U) -#define AES_SEED_IN_Len (32U) -#define AES_SEED_IN_Msk (0xFFFFFFFFU) -#define AES_SEED_IN AES_SEED_IN_Msk - -/******************* Bit definition for AES_SEED_OUT register *******************/ -#define AES_SEED_OUT_Pos (0U) -#define AES_SEED_OUT_Len (32U) -#define AES_SEED_OUT_Msk (0xFFFFFFFFU) -#define AES_SEED_OUT AES_SEED_OUT_Msk - -/******************* Bit definition for AES_SEED_IMASK register *******************/ -#define AES_SEED_IMASK_Pos (0U) -#define AES_SEED_IMASK_Len (32U) -#define AES_SEED_IMASK_Msk (0xFFFFFFFFU) -#define AES_SEED_IMASK AES_SEED_IMASK_Msk - -/******************* Bit definition for AES_SEED_OSBOX register *******************/ -#define AES_SEED_OSBOX_Pos (0U) -#define AES_SEED_OSBOX_Len (32U) -#define AES_SEED_OSBOX_Msk (0xFFFFFFFFU) -#define AES_SEED_OSBOX AES_SEED_OSBOX_Msk - -/******************* Bit definition for AES_VECTOR_INIT register *******************/ -#define AES_VECTOR_INIT_Pos (0U) -#define AES_VECTOR_INIT_Len (32U) -#define AES_VECTOR_INIT_Msk (0xFFFFFFFFU) -#define AES_VECTOR_INIT AES_VECTOR_INIT_Msk - -/******************* Bit definition for AES_DATA_IN register *******************/ -#define AES_DATA_IN_Pos (0U) -#define AES_DATA_IN_Len (32U) -#define AES_DATA_IN_Msk (0xFFFFFFFFU) -#define AES_DATA_IN AES_DATA_IN_Msk - - -/* ================================================================================================================= */ -/* ================ AON ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for AON_REG_PWR_RET01 register **********/ -#define AON_PWR_REG01_WAKE_UP_SEL_Pos (24U) -#define AON_PWR_REG01_WAKE_UP_SEL_Len (6U) -#define AON_PWR_REG01_WAKE_UP_SEL_Msk (0x3FU << AON_PWR_REG01_WAKE_UP_SEL_Pos) -#define AON_PWR_REG01_WAKE_UP_SEL AON_PWR_REG01_WAKE_UP_SEL_Msk -#define AON_PWR_REG01_WAKE_UP_SEL_TIMER (0x1U << AON_PWR_REG01_WAKE_UP_SEL_Pos) -#define AON_PWR_REG01_WAKE_UP_SEL_EXTWKUP (0x2U << AON_PWR_REG01_WAKE_UP_SEL_Pos) -#define AON_PWR_REG01_WAKE_UP_SEL_BLE (0x4U << AON_PWR_REG01_WAKE_UP_SEL_Pos) -#define AON_PWR_REG01_WAKE_UP_SEL_CALENDAR (0x8U << AON_PWR_REG01_WAKE_UP_SEL_Pos) -#define AON_PWR_REG01_WAKE_UP_SEL_PMU_BOD_FEDGE (0x10U << AON_PWR_REG01_WAKE_UP_SEL_Pos) -#define AON_PWR_REG01_WAKE_UP_SEL_MSIO_COMP (0x20U << AON_PWR_REG01_WAKE_UP_SEL_Pos) - -#define AON_PWR_REG01_SMC_WAKEUP_REQ_Pos (22U) -#define AON_PWR_REG01_SMC_WAKEUP_REQ_Len (1U) -#define AON_PWR_REG01_SMC_WAKEUP_REQ_Msk (0x1U << AON_PWR_REG01_SMC_WAKEUP_REQ_Pos) -#define AON_PWR_REG01_SMC_WAKEUP_REQ AON_PWR_REG01_SMC_WAKEUP_REQ_Msk - -#define AON_PWR_REG01_XF_TAG_RET_Pos (21U) -#define AON_PWR_REG01_XF_TAG_RET_Len (1U) -#define AON_PWR_REG01_XF_TAG_RET_Msk (0x1U << AON_PWR_REG01_XF_TAG_RET_Pos) -#define AON_PWR_REG01_XF_TAG_RET AON_PWR_REG01_XF_TAG_RET_Msk - -#define AON_PWR_REG01_XF_SCK_CLK_SEL_Pos (18U) -#define AON_PWR_REG01_XF_SCK_CLK_SEL_Len (3U) -#define AON_PWR_REG01_XF_SCK_CLK_SEL_Msk (0x7U << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos) -#define AON_PWR_REG01_XF_SCK_CLK_SEL AON_PWR_REG01_XF_SCK_CLK_SEL_Msk - -#define AON_PWR_REG01_SWD_ENABLE_Pos (17U) -#define AON_PWR_REG01_SWD_ENABLE_Len (1U) -#define AON_PWR_REG01_SWD_ENABLE_Msk (0x7U << AON_PWR_REG01_SWD_ENABLE_Pos) -#define AON_PWR_REG01_SWD_ENABLE AON_PWR_REG01_SWD_ENABLE_Msk - -#define AON_PWR_REG01_BM_REMAP_Pos (13U) -#define AON_PWR_REG01_BM_REMAP_Len (4U) -#define AON_PWR_REG01_BM_REMAP_Msk (0xFU << AON_PWR_REG01_BM_REMAP_Pos) -#define AON_PWR_REG01_BM_REMAP AON_PWR_REG01_BM_REMAP_Msk - -#define AON_PWR_REG01_COMM_CORE_RST_N_Pos (12U) -#define AON_PWR_REG01_COMM_CORE_RST_N_Len (1U) -#define AON_PWR_REG01_COMM_CORE_RST_N_Msk (0x1U << AON_PWR_REG01_COMM_CORE_RST_N_Pos) -#define AON_PWR_REG01_COMM_CORE_RST_N AON_PWR_REG01_COMM_CORE_RST_N_Msk - -#define AON_PWR_REG01_COMM_TIMER_RST_N_Pos (11U) -#define AON_PWR_REG01_COMM_TIMER_RST_N_Len (1U) -#define AON_PWR_REG01_COMM_TIMER_RST_N_Msk (0x1U << AON_PWR_REG01_COMM_TIMER_RST_N_Pos) -#define AON_PWR_REG01_COMM_TIMER_RST_N AON_PWR_REG01_COMM_TIMER_RST_N_Msk - -#define AON_PWR_REG01_ISO_EN_PD_COMM_TIMER_Pos (9U) -#define AON_PWR_REG01_ISO_EN_PD_COMM_TIMER_Len (1U) -#define AON_PWR_REG01_ISO_EN_PD_COMM_TIMER_Msk (0x1U << AON_PWR_REG01_ISO_EN_PD_COMM_TIMER_Pos) -#define AON_PWR_REG01_ISO_EN_PD_COMM_TIMER AON_PWR_REG01_ISO_EN_PD_COMM_TIMER_Msk - -#define AON_PWR_REG01_ISO_EN_PD_COMM_CORE_Pos (8U) -#define AON_PWR_REG01_ISO_EN_PD_COMM_CORE_Len (1U) -#define AON_PWR_REG01_ISO_EN_PD_COMM_CORE_Msk (0x1U << AON_PWR_REG01_ISO_EN_PD_COMM_CORE_Pos) -#define AON_PWR_REG01_ISO_EN_PD_COMM_CORE AON_PWR_REG01_ISO_EN_PD_COMM_CORE_Msk - -#define AON_PWR_REG01_PWR_EN_PD_COMM_TIMER_Pos (7U) -#define AON_PWR_REG01_PWR_EN_PD_COMM_TIMER_Len (1U) -#define AON_PWR_REG01_PWR_EN_PD_COMM_TIMER_Msk (0x1U << AON_PWR_REG01_PWR_EN_PD_COMM_TIMER_Pos) -#define AON_PWR_REG01_PWR_EN_PD_COMM_TIMER AON_PWR_REG01_PWR_EN_PD_COMM_TIMER_Msk - -#define AON_PWR_REG01_PWR_EN_PD_COMM_CORE_Pos (6U) -#define AON_PWR_REG01_PWR_EN_PD_COMM_CORE_Len (1U) -#define AON_PWR_REG01_PWR_EN_PD_COMM_CORE_Msk (0x1U << AON_PWR_REG01_PWR_EN_PD_COMM_CORE_Pos) -#define AON_PWR_REG01_PWR_EN_PD_COMM_CORE AON_PWR_REG01_PWR_EN_PD_COMM_CORE_Msk - -#define AON_PWR_REG01_EFLASH_PAD_EN_Pos (5U) -#define AON_PWR_REG01_EFLASH_PAD_EN_Len (1U) -#define AON_PWR_REG01_EFLASH_PAD_EN_Msk (0x1U << AON_PWR_REG01_EFLASH_PAD_EN_Pos) -#define AON_PWR_REG01_EFLASH_PAD_EN AON_PWR_REG01_EFLASH_PAD_EN_Msk - -#define AON_PWR_REG01_XO_2MHZ_ENA_Pos (4U) -#define AON_PWR_REG01_XO_2MHZ_ENA_Len (1U) -#define AON_PWR_REG01_XO_2MHZ_ENA_Msk (0x1U << AON_PWR_REG01_XO_2MHZ_ENA_Pos) -#define AON_PWR_REG01_XO_2MHZ_ENA AON_PWR_REG01_XO_2MHZ_ENA_Msk - -#define AON_PWR_REG01_XF_XO_DIV1_Pos (3U) -#define AON_PWR_REG01_XF_XO_DIV1_Len (1U) -#define AON_PWR_REG01_XF_XO_DIV1_Msk (0x1U << AON_PWR_REG01_XF_XO_DIV1_Pos) -#define AON_PWR_REG01_XF_XO_DIV1 AON_PWR_REG01_XF_XO_DIV1_Msk - -#define AON_PWR_REG01_SYS_CLK_SEL_Pos (0U) -#define AON_PWR_REG01_SYS_CLK_SEL_Len (3U) -#define AON_PWR_REG01_SYS_CLK_SEL_Msk (0x7U << AON_PWR_REG01_SYS_CLK_SEL_Pos) -#define AON_PWR_REG01_SYS_CLK_SEL AON_PWR_REG01_SYS_CLK_SEL_Msk - -/******************* Bit definition for AON_REG_SNSADC_CFG register **********/ -#define AON_SNSADC_CFG_SNSADC_REG4_Pos (24U) -#define AON_SNSADC_CFG_SNSADC_REG4_Len (8U) -#define AON_SNSADC_CFG_SNSADC_REG4_Msk (0xFFU << AON_SNSADC_CFG_SNSADC_REG4_Pos) -#define AON_SNSADC_CFG_SNSADC_REG4 AON_SNSADC_CFG_SNSADC_REG4_Msk -#define AON_SNSADC_CFG_MAS_RST_Pos (31U) -#define AON_SNSADC_CFG_MAS_RST_Msk (0x1U << AON_SNSADC_CFG_MAS_RST_Pos) -#define AON_SNSADC_CFG_EN_Pos (30U) -#define AON_SNSADC_CFG_EN_Msk (0x1U << AON_SNSADC_CFG_EN_Pos) -#define AON_SNSADC_CFG_REF_SEL_Pos (27U) -#define AON_SNSADC_CFG_REF_SEL_Msk (0x7U << AON_SNSADC_CFG_REF_SEL_Pos) -#define AON_SNSADC_CFG_REF_HP_Pos (24U) -#define AON_SNSADC_CFG_REF_HP_Msk (0x7U << AON_SNSADC_CFG_REF_HP_Pos) - -#define AON_SNSADC_CFG_SNSADC_REG3_Pos (16U) -#define AON_SNSADC_CFG_SNSADC_REG3_Len (8U) -#define AON_SNSADC_CFG_SNSADC_REG3_Msk (0xFFU << AON_SNSADC_CFG_SNSADC_REG3_Pos) -#define AON_SNSADC_CFG_SNSADC_REG3 AON_SNSADC_CFG_SNSADC_REG3_Msk -#define AON_SNSADC_CFG_CHN_P_Pos (19U) -#define AON_SNSADC_CFG_CHN_P_Msk (0x7U << AON_SNSADC_CFG_CHN_P_Pos) -#define AON_SNSADC_CFG_CHN_N_Pos (16U) -#define AON_SNSADC_CFG_CHN_N_Msk (0x7U << AON_SNSADC_CFG_CHN_N_Pos) - -#define AON_SNSADC_CFG_SNSADC_REG2_Pos (8U) -#define AON_SNSADC_CFG_SNSADC_REG2_Len (8U) -#define AON_SNSADC_CFG_SNSADC_REG2_Msk (0xFFU << AON_SNSADC_CFG_SNSADC_REG2_Pos) -#define AON_SNSADC_CFG_SNSADC_REG2 AON_SNSADC_CFG_SNSADC_REG2_Msk -#define AON_SNSADC_CFG_TEMP_EN_Pos (15U) -#define AON_SNSADC_CFG_TEMP_EN_Msk (0x1U << AON_SNSADC_CFG_TEMP_EN_Pos) -#define AON_SNSADC_CFG_VBAT_EN_Pos (14U) -#define AON_SNSADC_CFG_VBAT_EN_Msk (0x1U << AON_SNSADC_CFG_VBAT_EN_Pos) -#define AON_SNSADC_CFG_SINGLE_EN_Pos (13U) -#define AON_SNSADC_CFG_SINGLE_EN_Msk (0x1U << AON_SNSADC_CFG_SINGLE_EN_Pos) -#define AON_SNSADC_CFG_OFS_CAL_EN_Pos (12U) -#define AON_SNSADC_CFG_OFS_CAL_EN_Msk (0x1U << AON_SNSADC_CFG_OFS_CAL_EN_Pos) -#define AON_SNSADC_CFG_DYMAMIC_Pos (8U) -#define AON_SNSADC_CFG_DYMAMIC_Msk (0x7U << AON_SNSADC_CFG_DYMAMIC_Pos) - -#define AON_SNSADC_CFG_SNSADC_REG1_Pos (0U) -#define AON_SNSADC_CFG_SNSADC_REG1_Len (8U) -#define AON_SNSADC_CFG_SNSADC_REG1_Msk (0xFFU << AON_SNSADC_CFG_SNSADC_REG1_Pos) -#define AON_SNSADC_CFG_SNSADC_REG1 AON_SNSADC_CFG_SNSADC_REG1_Msk -#define AON_SNSADC_CFG_REF_VALUE_Pos (0U) -#define AON_SNSADC_CFG_REF_VALUE_Msk (0xFU << AON_SNSADC_CFG_REF_VALUE_Pos) - -/******************* Bit definition for AON_REG_RF_REG_0 register **********/ -#define AON_RF_REG_0_IO_LDO_REG1_Pos (24U) -#define AON_RF_REG_0_IO_LDO_REG1_Len (8U) -#define AON_RF_REG_0_IO_LDO_REG1_Msk (0xFFU << AON_RF_REG_0_IO_LDO_REG1_Pos) -#define AON_RF_REG_0_IO_LDO_REG1 AON_RF_REG_0_IO_LDO_REG1_Msk - -#define AON_RF_REG_0_LPD_REG2_Pos (16U) -#define AON_RF_REG_0_LPD_REG2_Len (8U) -#define AON_RF_REG_0_LPD_REG2_Msk (0xFFU << AON_RF_REG_0_LPD_REG2_Pos) -#define AON_RF_REG_0_LPD_REG2 AON_RF_REG_0_LPD_REG2_Msk - -#define AON_RF_REG_0_LPD_REG1_Pos (8U) -#define AON_RF_REG_0_LPD_REG1_Len (8U) -#define AON_RF_REG_0_LPD_REG1_Msk (0xFFU << AON_RF_REG_0_LPD_REG1_Pos) -#define AON_RF_REG_0_LPD_REG1 AON_RF_REG_0_LPD_REG1_Msk - -#define AON_RF_REG_0_RTC_REG1_Pos (0U) -#define AON_RF_REG_0_RTC_REG1_Len (8U) -#define AON_RF_REG_0_RTC_REG1_Msk (0xFFU << AON_RF_REG_0_RTC_REG1_Pos) -#define AON_RF_REG_0_RTC_REG1 AON_RF_REG_0_RTC_REG1_Msk - -#define AON_RF_REG_0_DYN_CLK_CTRL_Pos (16U) -#define AON_RF_REG_0_DYN_CLK_CTRL_Len (3U) -#define AON_RF_REG_0_DYN_CLK_CTRL_Msk (0x7U << AON_RF_REG_0_DYN_CLK_CTRL_Pos) -#define AON_RF_REG_0_DYN_CLK_CTRL AON_RF_REG_0_DYN_CLK_CTRL_Msk - -#define AON_RF_REG_0_BGAP_STATIC_EN_LV_Pos (19U) -#define AON_RF_REG_0_BGAP_STATIC_EN_LV_Len (1U) -#define AON_RF_REG_0_BGAP_STATIC_EN_LV_Msk (0x1U << AON_RF_REG_0_BGAP_STATIC_EN_LV_Pos) -#define AON_RF_REG_0_BGAP_STATIC_EN_LV_EN (0x1U << AON_RF_REG_0_BGAP_STATIC_EN_LV_Pos) -#define AON_RF_REG_0_BGAP_STATIC_EN_LV_DIS (0x0U << AON_RF_REG_0_BGAP_STATIC_EN_LV_Pos) - -#define AON_RF_REG_0_RCOSC_BIAS_CNTRL_Pos (22) -#define AON_RF_REG_0_RCOSC_BIAS_CNTRL_Len (2U) -#define AON_RF_REG_0_RCOSC_BIAS_CNTRL_Msk (0x03 << AON_RF_REG_0_BGAP_STATIC_EN_LV_Pos) - - -#define AON_RF_REG_0_CTRL_TEMPCO_Pos (13U) -#define AON_RF_REG_0_CTRL_TEMPCO_Len (3U) -#define AON_RF_REG_0_CTRL_TEMPCO_Msk (0x7U << AON_RF_REG_0_CTRL_TEMPCO_Pos) -#define AON_RF_REG_0_CTRL_TEMPCO AON_RF_REG_0_CTRL_TEMPCO_Msk - -#define AON_RF_REG_0_CTRL_RET_Pos (11U) -#define AON_RF_REG_0_CTRL_RET_Len (2U) -#define AON_RF_REG_0_CTRL_RET_Msk (0x3U << AON_RF_REG_0_CTRL_RET_Pos) -#define AON_RF_REG_0_CTRL_RET AON_RF_REG_0_CTRL_RET_Msk - -#define AON_RF_REG_0_CTRL_BGAP_Pos (9U) -#define AON_RF_REG_0_CTRL_BGAP_Len (2U) -#define AON_RF_REG_0_CTRL_BGAP_Msk (0x3U << AON_RF_REG_0_CTRL_BGAP_Pos) -#define AON_RF_REG_0_CTRL_BGAP AON_RF_REG_0_CTRL_BGAP_Msk - -#define AON_RF_REG_0_BGAP_VOLTAGE_EN_Pos (8U) -#define AON_RF_REG_0_BGAP_VOLTAGE_EN_Len (1U) -#define AON_RF_REG_0_BGAP_VOLTAGE_ON (0x1U << AON_RF_REG_0_BGAP_VOLTAGE_EN_Pos) -#define AON_RF_REG_0_BGAP_VOLTAGE_OFF (0x0U << AON_RF_REG_0_BGAP_VOLTAGE_EN_Pos) - -#define AON_RF_REG_0_LPD_REG1_Pos (8U) -#define AON_RF_REG_0_LPD_REG1_Len (8U) -#define AON_RF_REG_0_LPD_REG1_Msk (0xFFU << AON_RF_REG_0_LPD_REG1_Pos) -#define AON_RF_REG_0_LPD_REG1 AON_RF_REG_0_LPD_REG1_Msk - -#define AON_RF_REG_0_RTC_REG1_Pos (0U) -#define AON_RF_REG_0_RTC_REG1_Len (8U) -#define AON_RF_REG_0_RTC_REG1_Msk (0xFFU << AON_RF_REG_0_RTC_REG1_Pos) -#define AON_RF_REG_0_RTC_REG1 AON_RF_REG_0_RTC_REG1_Msk - -/******************* Bit definition for AON_REG_RF_REG_1 register **********/ -#define AON_RF_REG_1_DCDC_REG4_Pos (24U) -#define AON_RF_REG_1_DCDC_REG4_Len (8U) -#define AON_RF_REG_1_DCDC_REG4_Msk (0xFFU << AON_RF_REG_1_DCDC_REG4_Pos) -#define AON_RF_REG_1_DCDC_REG4 AON_RF_REG_1_DCDC_REG4_Msk - -#define AON_RF_REG_1_DCDC_REG3_Pos (16U) -#define AON_RF_REG_1_DCDC_REG3_Len (8U) -#define AON_RF_REG_1_DCDC_REG3_Msk (0xFFU << AON_RF_REG_1_DCDC_REG3_Pos) -#define AON_RF_REG_1_DCDC_REG3 AON_RF_REG_1_DCDC_REG3_Msk - -#define AON_RF_REG_1_EN_INJ_Pos (14U) -#define AON_RF_REG_1_EN_INJ_Msk (0x1 << AON_RF_REG_1_EN_INJ_Pos) -#define AON_RF_REG_1_EN_INJ_ON (0x1 << AON_RF_REG_1_EN_INJ_Pos) -#define AON_RF_REG_1_EN_INJ_OFF (0x0 << AON_RF_REG_1_EN_INJ_Pos) - -#define AON_RF_REG_1_TON_Pos (11U) -#define AON_RF_REG_1_TON_Len (3U) -#define AON_RF_REG_1_TON_Msk (0x7U << AON_RF_REG_1_TON_Pos) -#define AON_RF_REG_1_TON AON_RF_REG_1_TON_Msk - -#define AON_RF_REG_1_DCDC_REG2_Pos (8U) -#define AON_RF_REG_1_DCDC_REG2_Len (8U) -#define AON_RF_REG_1_DCDC_REG2_Msk (0xFFU << AON_RF_REG_1_DCDC_REG2_Pos) -#define AON_RF_REG_1_DCDC_REG2 AON_RF_REG_1_DCDC_REG2_Msk - -#define AON_RF_REG_1_DCDC_REG1_Pos (0U) -#define AON_RF_REG_1_DCDC_REG1_Len (8U) -#define AON_RF_REG_1_DCDC_REG1_Msk (0xFFU << AON_RF_REG_1_DCDC_REG1_Pos) -#define AON_RF_REG_1_DCDC_REG1 AON_RF_REG_1_DCDC_REG1_Msk - -/******************* Bit definition for AON_REG_RF_REG_2 register **********/ -#define AON_RF_REG_2_TON_EN_Pos (17U) -#define AON_RF_REG_2_TON_EN_Msk (0x1U << AON_RF_REG_2_TON_EN_Pos) -#define AON_RF_REG_2_TON_EN_ON (0x1 << AON_RF_REG_2_TON_EN_Pos) -#define AON_RF_REG_2_TON_EN_OFF (0x0 << AON_RF_REG_2_TON_EN_Pos) - -#define AON_RF_REG_2_GP_REG2_Pos (16U) -#define AON_RF_REG_2_GP_REG2_Len (8U) -#define AON_RF_REG_2_GP_REG2_Msk (0xFFU << AON_RF_REG_2_GP_REG2_Pos) -#define AON_RF_REG_2_GP_REG2 AON_RF_REG_2_GP_REG2_Msk - -#define AON_RF_REG_2_GP_REG1_Pos (8U) -#define AON_RF_REG_2_GP_REG1_Len (8U) -#define AON_RF_REG_2_GP_REG1_Msk (0xFFU << AON_RF_REG_2_GP_REG1_Pos) -#define AON_RF_REG_2_GP_REG1 AON_RF_REG_2_GP_REG1_Msk -#define AON_RF_REG_2_EFUSE_VDD_EN (0x4U << AON_RF_REG_2_GP_REG1_Pos) - -#define AON_RF_REG_2_MUX1_REG1_Pos (0U) -#define AON_RF_REG_2_MUX1_REG1_Len (8U) -#define AON_RF_REG_2_MUX1_REG1_Msk (0xFFU << AON_RF_REG_2_MUX1_REG1_Pos) -#define AON_RF_REG_2_MUX1_REG1 AON_RF_REG_2_MUX1_REG1_Msk - -/******************* Bit definition for AON_REG_CALENDAR_TIMER_CTL register **********/ -#define AON_CALENDAR_TIMER_CTL_WRAP_INT_EN_Pos (13U) -#define AON_CALENDAR_TIMER_CTL_WRAP_INT_EN_Len (1U) -#define AON_CALENDAR_TIMER_CTL_WRAP_INT_EN_Msk (0x1U << AON_CALENDAR_TIMER_CTL_WRAP_INT_EN_Pos) -#define AON_CALENDAR_TIMER_CTL_WRAP_INT_EN AON_CALENDAR_TIMER_CTL_WRAP_INT_EN_Msk - -#define AON_CALENDAR_TIMER_CTL_ALARM_INT_EN_Pos (12U) -#define AON_CALENDAR_TIMER_CTL_ALARM_INT_EN_Len (1U) -#define AON_CALENDAR_TIMER_CTL_ALARM_INT_EN_Msk (0x1U << AON_CALENDAR_TIMER_CTL_ALARM_INT_EN_Pos) -#define AON_CALENDAR_TIMER_CTL_ALARM_INT_EN AON_CALENDAR_TIMER_CTL_ALARM_INT_EN_Msk - -#define AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos (8U) -#define AON_CALENDAR_TIMER_CTL_CLK_SEL_Len (3U) -#define AON_CALENDAR_TIMER_CTL_CLK_SEL_Msk (0x7U << AON_CALENDAR_TIMER_CTL_CLK_SEL_Pos) -#define AON_CALENDAR_TIMER_CTL_CLK_SEL AON_CALENDAR_TIMER_CTL_CLK_SEL_Msk - -#define AON_CALENDAR_TIMER_CTL_WRAP_CNT_Pos (4U) -#define AON_CALENDAR_TIMER_CTL_WRAP_CNT_Len (4U) -#define AON_CALENDAR_TIMER_CTL_WRAP_CNT_Msk (0xFU << AON_CALENDAR_TIMER_CTL_WRAP_CNT_Pos) -#define AON_CALENDAR_TIMER_CTL_WRAP_CNT AON_CALENDAR_TIMER_CTL_WRAP_CNT_Msk - -#define AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD_Pos (2U) -#define AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD_Len (1U) -#define AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD_Msk (0x1U << AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD_Pos) -#define AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD AON_CALENDAR_TIMER_CTL_ALARM_VAL_LOAD_Msk - -#define AON_CALENDAR_TIMER_CTL_VAL_LOAD_Pos (1U) -#define AON_CALENDAR_TIMER_CTL_VAL_LOAD_Len (1U) -#define AON_CALENDAR_TIMER_CTL_VAL_LOAD_Msk (0x1U << AON_CALENDAR_TIMER_CTL_VAL_LOAD_Pos) -#define AON_CALENDAR_TIMER_CTL_VAL_LOAD AON_CALENDAR_TIMER_CTL_VAL_LOAD_Msk - -#define AON_CALENDAR_TIMER_CTL_EN_Pos (0U) -#define AON_CALENDAR_TIMER_CTL_EN_Len (1U) -#define AON_CALENDAR_TIMER_CTL_EN_Msk (0x1U << AON_CALENDAR_TIMER_CTL_EN_Pos) -#define AON_CALENDAR_TIMER_CTL_EN AON_CALENDAR_TIMER_CTL_EN_Msk - -/******************* Bit definition for AON_REG_MEM_STD_OVR register **********/ -#define AON_MEM_STD_OVR_MCU_KEYRAM_STDBY_N_Pos (30U) -#define AON_MEM_STD_OVR_MCU_KEYRAM_STDBY_N_Len (1U) -#define AON_MEM_STD_OVR_MCU_KEYRAM_STDBY_N_Msk (0x1U << AON_MEM_STD_OVR_MCU_KEYRAM_STDBY_N_Pos) -#define AON_MEM_STD_OVR_MCU_KEYRAM_STDBY_N AON_MEM_STD_OVR_MCU_KEYRAM_STDBY_N_Msk - -#define AON_MEM_STD_OVR_PMEM_STDBY_N_Pos (29U) -#define AON_MEM_STD_OVR_PMEM_STDBY_N_Len (1U) -#define AON_MEM_STD_OVR_PMEM_STDBY_N_Msk (0x1U << AON_MEM_STD_OVR_PMEM_STDBY_N_Pos) -#define AON_MEM_STD_OVR_PMEM_STDBY_N AON_MEM_STD_OVR_PMEM_STDBY_N_Msk - -#define AON_MEM_STD_OVR_MCU_ICACHE_STDBY_N_Pos (28U) -#define AON_MEM_STD_OVR_MCU_ICACHE_STDBY_N_Len (1U) -#define AON_MEM_STD_OVR_MCU_ICACHE_STDBY_N_Msk (1U << AON_MEM_STD_OVR_MCU_ICACHE_STDBY_N_Pos) -#define AON_MEM_STD_OVR_MCU_ICACHE_STDBY_N AON_MEM_STD_OVR_MCU_ICACHE_STDBY_N_Msk - -#define AON_MEM_STD_OVR_MCU_HTM_STDBY_N_Pos (27U) -#define AON_MEM_STD_OVR_MCU_HTM_STDBY_N_Len (1U) -#define AON_MEM_STD_OVR_MCU_HTM_STDBY_N_Msk (1U << AON_MEM_STD_OVR_MCU_HTM_STDBY_N_Pos) -#define AON_MEM_STD_OVR_MCU_HTM_STDBY_N AON_MEM_STD_OVR_MCU_HTM_STDBY_N_Msk - -#define AON_MEM_STD_OVR_MCU_MEM_STDBY_N_Pos (16U) -#define AON_MEM_STD_OVR_MCU_MEM_STDBY_N_Len (11U) -#define AON_MEM_STD_OVR_MCU_MEM_STDBY_N_Msk (0x7FFU << AON_MEM_STD_OVR_MCU_MEM_STDBY_N_Pos) -#define AON_MEM_STD_OVR_MCU_MEM_STDBY_N AON_MEM_STD_OVR_MCU_MEM_STDBY_N_Msk - -#define AON_MEM_STD_OVR_KEYRAM_ISO_VDD_N_Pos (14U) -#define AON_MEM_STD_OVR_KEYRAM_ISO_VDD_N_Len (1U) -#define AON_MEM_STD_OVR_KEYRAM_ISO_VDD_N_Msk (0x1U << AON_MEM_STD_OVR_KEYRAM_ISO_VDD_N_Pos) -#define AON_MEM_STD_OVR_KEYRAM_ISO_VDD_N AON_MEM_STD_OVR_KEYRAM_ISO_VDD_N_Msk - -#define AON_MEM_STD_OVR_EF_CACHE_ISO_VDD_N_Pos (13U) -#define AON_MEM_STD_OVR_EF_CACHE_ISO_VDD_N_Len (1U) -#define AON_MEM_STD_OVR_EF_CACHE_ISO_VDD_N_Msk (0x1U << AON_MEM_STD_OVR_EF_CACHE_ISO_VDD_N_Pos) -#define AON_MEM_STD_OVR_EF_CACHE_ISO_VDD_N AON_MEM_STD_OVR_EF_CACHE_ISO_VDD_N_Msk - -#define AON_MEM_STD_OVR_HTABLE_ISO_VDD_N_Pos (12U) -#define AON_MEM_STD_OVR_HTABLE_ISO_VDD_N_Len (1U) -#define AON_MEM_STD_OVR_HTABLE_ISO_VDD_N_Msk (0x1U << AON_MEM_STD_OVR_HTABLE_ISO_VDD_N_Pos) -#define AON_MEM_STD_OVR_HTABLE_ISO_VDD_N AON_MEM_STD_OVR_HTABLE_ISO_VDD_N_Msk - -#define AON_MEM_STD_OVR_PMEM_ISO_VDD_N_Pos (11U) -#define AON_MEM_STD_OVR_PMEM_ISO_VDD_N_Len (1U) -#define AON_MEM_STD_OVR_PMEM_ISO_VDD_N_Msk (0x1U << AON_MEM_STD_OVR_PMEM_ISO_VDD_N_Pos) -#define AON_MEM_STD_OVR_PMEM_ISO_VDD_N AON_MEM_STD_OVR_PMEM_ISO_VDD_N_Msk - -#define AON_MEM_STD_OVR_MCU_MEM_ISO_VDD_N_Pos (0U) -#define AON_MEM_STD_OVR_MCU_MEM_ISO_VDD_N_Len (11U) -#define AON_MEM_STD_OVR_MCU_MEM_ISO_VDD_N_Msk (0x7FF << AON_MEM_STD_OVR_MCU_MEM_ISO_VDD_N_Pos) -#define AON_MEM_STD_OVR_MCU_MEM_ISO_VDD_N AON_MEM_STD_OVR_MCU_MEM_ISO_VDD_N_Msk - -/******************* Bit definition for AON_REG_RF_REG_3 register **********/ -#define AON_RF_REG_3_IO_LDO_REG2_Pos (24U) -#define AON_RF_REG_3_IO_LDO_REG2_Len (8U) -#define AON_RF_REG_3_IO_LDO_REG2_Msk (0xFFU << AON_RF_REG_3_IO_LDO_REG2_Pos) -#define AON_RF_REG_3_IO_LDO_REG2 AON_RF_REG_3_IO_LDO_REG2_Msk - -#define AON_RF_REG_3_LDO_5V_REG1_Pos (8U) -#define AON_RF_REG_3_LDO_5V_REG1_Len (8U) -#define AON_RF_REG_3_LDO_5V_REG1_Msk (0xFFU << AON_RF_REG_3_LDO_5V_REG1_Pos) -#define AON_RF_REG_3_LDO_5V_REG1 AON_RF_REG_3_LDO_5V_REG1_Msk - -#define AON_RF_REG_3_RTC_EN_Pos (7U) -#define AON_RF_REG_3_RTC_EN_Len (1U) -#define AON_RF_REG_3_RTC_EN_Msk (0x1U << AON_RF_REG_3_RTC_EN_Pos) -#define AON_RF_REG_3_RTC_EN AON_RF_REG_3_RTC_EN_Msk -#define AON_RF_REG_3_RTC_DIS (0x0U << AON_RF_REG_3_RTC_EN_Pos) - -#define AON_RF_REG_3_BOD_STATIC_LV_Pos (5U) -#define AON_RF_REG_3_BOD_STATIC_LV_Len (1U) -#define AON_RF_REG_3_BOD_STATIC_LV_Msk (0x1U << AON_RF_REG_3_BOD_STATIC_LV_Pos) -#define AON_RF_REG_3_BOD_STATIC_LV_EN (0x1U << AON_RF_REG_3_BOD_STATIC_LV_Pos) -#define AON_RF_REG_3_BOD_STATIC_LV_DIS (0x0U << AON_RF_REG_3_BOD_STATIC_LV_Pos) -#define AON_RF_REG_3_BOD_LVL_CTRL_LV_Pos (2U) -#define AON_RF_REG_3_BOD_LVL_CTRL_LV_Len (3U) -#define AON_RF_REG_3_BOD_LVL_CTRL_LV_Msk (0x7U << AON_RF_REG_3_BOD_LVL_CTRL_LV_Pos) -#define AON_RF_REG_3_BOD_LVL_CTRL_LV AON_RF_REG_3_BOD_LVL_CTRL_LV_Msk -#define AON_RF_REG_3_BOD2_EN_Pos (1U) -#define AON_RF_REG_3_BOD2_EN_Len (1U) -#define AON_RF_REG_3_BOD2_EN_Msk (0x1U << AON_RF_REG_3_BOD2_EN_Pos) -#define AON_RF_REG_3_BOD2_EN (0x1U << AON_RF_REG_3_BOD2_EN_Pos) -#define AON_RF_REG_3_BOD2_DIS (0x0U << AON_RF_REG_3_BOD2_EN_Pos) - -#define AON_RF_REG_3_BOD_EN_Pos (0U) -#define AON_RF_REG_3_BOD_EN_Len (1U) -#define AON_RF_REG_3_BOD_EN_Msk (0x1U << AON_RF_REG_3_BOD_EN_Pos) -#define AON_RF_REG_3_BOD_EN (0x1U << AON_RF_REG_3_BOD_EN_Pos) -#define AON_RF_REG_3_BOD_DIS (0x0U << AON_RF_REG_3_BOD_EN_Pos) - -#define AON_RF_REG_3_BOD_REG1_Pos (0U) -#define AON_RF_REG_3_BOD_REG1_Len (8U) -#define AON_RF_REG_3_BOD_REG1_Msk (0xFFU << AON_RF_REG_3_BOD_REG1_Pos) -#define AON_RF_REG_3_BOD_REG1 AON_RF_REG_3_BOD_REG1_Msk - -/******************* Bit definition for AON_REG_RF_REG_4 register **********/ -#define AON_RF_REG_4_DIG_LDO_REG1_Pos (16U) -#define AON_RF_REG_4_DIG_LDO_REG1_Len (8U) -#define AON_RF_REG_4_DIG_LDO_REG1_Msk (0xFFU << AON_RF_REG_4_DIG_LDO_REG1_Pos) -#define AON_RF_REG_4_DIG_LDO_REG1 AON_RF_REG_4_DIG_LDO_REG1_Msk - -#define AON_RF_REG_4_CLK_PERIOD_Pos (12U) -#define AON_RF_REG_4_CLK_PERIOD_Len (4U) -#define AON_RF_REG_4_CLK_PERIOD_Msk (0xF << AON_RF_REG_4_CLK_PERIOD_Pos) -#define AON_RF_REG_4_CLK_PERIOD AON_RF_REG_4_CLK_PERIOD_Msk - -#define AON_RF_REG_4_DCDC_REG6_Pos (8U) -#define AON_RF_REG_4_DCDC_REG6_Len (8U) -#define AON_RF_REG_4_DCDC_REG6_Msk (0xFFU << AON_RF_REG_4_DCDC_REG6_Pos) -#define AON_RF_REG_4_DCDC_REG6 AON_RF_REG_4_DCDC_REG6_Msk - -#define AON_RF_REG_4_DCDC_REG5_Pos (0U) -#define AON_RF_REG_4_DCDC_REG5_Len (8U) -#define AON_RF_REG_4_DCDC_REG5_Msk (0xFFU << AON_RF_REG_4_DCDC_REG5_Pos) -#define AON_RF_REG_4_DCDC_REG5 AON_RF_REG_4_DCDC_REG5_Msk - -/******************* Bit definition for AON_REG_RF_REG_5 register **********/ -#define AON_RF_REG_5_MUX_REG2_Pos (24U) -#define AON_RF_REG_5_MUX_REG2_Len (8U) -#define AON_RF_REG_5_MUX_REG2_Msk (0xFFU << AON_RF_REG_5_MUX_REG2_Pos) -#define AON_RF_REG_5_MUX_REG2 AON_RF_REG_5_MUX_REG2_Msk - -#define AON_RF_REG_5_MUX_REG1_Pos (16U) -#define AON_RF_REG_5_MUX_REG1_Len (8U) -#define AON_RF_REG_5_MUX_REG1_Msk (0xFFU << AON_RF_REG_5_MUX_REG1_Pos) -#define AON_RF_REG_5_MUX_REG1 AON_RF_REG_5_MUX_REG1_Msk - -#define AON_RF_REG_5_LPD_REG3_Pos (0U) -#define AON_RF_REG_5_LPD_REG3_Len (8U) -#define AON_RF_REG_5_LPD_REG3_Msk (0xFFU << AON_RF_REG_5_LPD_REG3_Pos) -#define AON_RF_REG_5_LPD_REG3 AON_RF_REG_5_LPD_REG3_Msk - -#define AON_RF_REG_5_RCOSC_EN_Pos (7) -#define AON_RF_REG_5_RCOSC_EN_Len (1U) -#define AON_RF_REG_5_RCOSC_EN_Msk (0x01 << AON_RF_REG_5_RCOSC_EN_Pos) -#define AON_RF_REG_5_RCOSC_EN (AON_RF_REG_5_RCOSC_EN_Msk) - -#define AON_RF_REG_5_RCOSC_DELAY_EN_Pos (6) -#define AON_RF_REG_5_RCOSC_DELAY_EN_Len (1U) -#define AON_RF_REG_5_RCOSC_DELAY_EN_Msk (0x01 << AON_RF_REG_5_RCOSC_DELAY_EN_Pos) -#define AON_RF_REG_5_RCOSC_DELAY_EN (0x01 << AON_RF_REG_5_RCOSC_DELAY_EN_Pos) - -#define AON_RF_REG_5_RCOSC_RDIV_DELAY_Pos (3) -#define AON_RF_REG_5_RCOSC_RDIV_DELAY_Len (3U) -#define AON_RF_REG_5_RCOSC_RDIV_DELAY_Msk (0x07 << AON_RF_REG_5_RCOSC_RDIV_DELAY_Pos) -#define AON_RF_REG_5_RCOSC_RDIV_DELAY (AON_RF_REG_5_RCOSC_RDIV_DELAY_Msk) - -#define AON_RF_REG_5_RCOSC_RESN_CNTRL_Pos (0) -#define AON_RF_REG_5_RCOSC_RESN_CNTRL_Len (3U) -#define AON_RF_REG_5_RCOSC_RESN_CNTRL_Msk (0x07 << AON_RF_REG_5_RCOSC_RESN_CNTRL_Pos) -#define AON_RF_REG_5_RCOSC_RESN_CNTRL (AON_RF_REG_5_RCOSC_RESN_CNTRL_Msk) - -/******************* Bit definition for AON_REG_RF_REG_6 register **********/ -#define AON_RF_REG_6_CPLL_REG1_Pos (0U) -#define AON_RF_REG_6_CPLL_REG1_Len (32U) -#define AON_RF_REG_6_CPLL_REG1_Msk (0xFFFFFFFFU) -#define AON_RF_REG_6_CPLL_REG1 AON_RF_REG_6_CPLL_REG1_Msk - -/******************* Bit definition for AON_REG_RF_REG_7 register **********/ -#define AON_RF_REG_7_CPLL_REG2_Pos (0U) -#define AON_RF_REG_7_CPLL_REG2_Len (32U) -#define AON_RF_REG_7_CPLL_REG2_Msk (0xFFFFFFFFU) -#define AON_RF_REG_7_CPLL_REG2 AON_RF_REG_7_CPLL_REG2_Msk - -/******************* Bit definition for AON_REG_RF_REG_8 register **********/ -#define AON_RF_REG_8_XO_REG1_Pos (0U) -#define AON_RF_REG_8_XO_REG1_Len (32U) -#define AON_RF_REG_8_XO_REG1_Msk (0xFFFFFFFFU) -#define AON_RF_REG_8_XO_REG1 AON_RF_REG_8_XO_REG1_Msk - -/******************* Bit definition for AON_REG_RF_REG_9 register **********/ -#define AON_RF_REG_9_XO_REG2_Pos (0U) -#define AON_RF_REG_9_XO_REG2_Len (32U) -#define AON_RF_REG_9_XO_REG2_Msk (0xFFFFFFFFU) -#define AON_RF_REG_9_XO_REG2 AON_RF_REG_9_XO_REG2_Msk - -/******************* Bit definition for AON_REG_MSIO_PAD_CFG_0 register **********/ -#define AON_MSIO_PAD_CFG_0_OE_N_Pos (24U) -#define AON_MSIO_PAD_CFG_0_OE_N_Len (5U) -#define AON_MSIO_PAD_CFG_0_OE_N_Msk (0x1FU << AON_MSIO_PAD_CFG_0_OE_N_Pos) -#define AON_MSIO_PAD_CFG_0_OE_N AON_MSIO_PAD_CFG_0_OE_N_Msk - -#define AON_MSIO_PAD_CFG_0_IE_N_Pos (16U) -#define AON_MSIO_PAD_CFG_0_IE_N_Len (5U) -#define AON_MSIO_PAD_CFG_0_IE_N_Msk (0x1FU << AON_MSIO_PAD_CFG_0_IE_N_Pos) -#define AON_MSIO_PAD_CFG_0_IE_N AON_MSIO_PAD_CFG_0_IE_N_Msk - -#define AON_MSIO_PAD_CFG_0_IN_Pos (8U) -#define AON_MSIO_PAD_CFG_0_IN_Len (5U) -#define AON_MSIO_PAD_CFG_0_IN_Msk (0x1FU << AON_MSIO_PAD_CFG_0_IN_Pos) -#define AON_MSIO_PAD_CFG_0_IN AON_MSIO_PAD_CFG_0_IN_Msk - -#define AON_MSIO_PAD_CFG_0_RE_N_Pos (0U) -#define AON_MSIO_PAD_CFG_0_RE_N_Len (5U) -#define AON_MSIO_PAD_CFG_0_RE_N_Msk (0x1FU << AON_MSIO_PAD_CFG_0_RE_N_Pos) -#define AON_MSIO_PAD_CFG_0_RE_N AON_MSIO_PAD_CFG_0_RE_N_Msk - -/******************* Bit definition for AON_REG_MSIO_PAD_CFG_1 register **********/ -#define AON_MSIO_PAD_CFG_1_ADC_CLK_EN_Pos (31U) -#define AON_MSIO_PAD_CFG_1_ADC_CLK_EN_Len (1U) -#define AON_MSIO_PAD_CFG_1_ADC_CLK_EN_Msk (0x1U << AON_MSIO_PAD_CFG_1_ADC_CLK_EN_Pos) -#define AON_MSIO_PAD_CFG_1_ADC_CLK_EN AON_MSIO_PAD_CFG_1_ADC_CLK_EN_Msk - -#define AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos (28U) -#define AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Len (3U) -#define AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Msk (0x7U << AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Pos) -#define AON_MSIO_PAD_CFG_1_ADC_CLK_SEL AON_MSIO_PAD_CFG_1_ADC_CLK_SEL_Msk - -#define AON_MSIO_PAD_CFG_1_MCU_OVR_Pos (22U) -#define AON_MSIO_PAD_CFG_1_MCU_OVR_Len (5U) -#define AON_MSIO_PAD_CFG_1_MCU_OVR_Msk (0x1FU << AON_MSIO_PAD_CFG_1_MCU_OVR_Pos) -#define AON_MSIO_PAD_CFG_1_MCU_OVR AON_MSIO_PAD_CFG_1_MCU_OVR_Msk - -#define AON_COMM_DEEPSLCNTL_EXTWKUPDSB_Pos (21U) -#define AON_COMM_DEEPSLCNTL_EXTWKUPDSB_Len (1U) -#define AON_COMM_DEEPSLCNTL_EXTWKUPDSB_Msk (0x1U << AON_COMM_DEEPSLCNTL_EXTWKUPDSB_Pos) -#define AON_COMM_DEEPSLCNTL_EXTWKUPDSB AON_COMM_DEEPSLCNTL_EXTWKUPDSB_Msk - -#define AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ_Pos (20U) -#define AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ_Len (1U) -#define AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ_Msk (0x1U << AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ_Pos) -#define AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ AON_COMM_DEEPSLCNTL_SOFT_WAKEUP_REQ_Msk - -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON_Pos (18U) -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON_Len (1U) -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON_Msk (0x1U << AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON_Pos) -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON AON_COMM_DEEPSLCNTL_DEEP_SLEEP_ON_Msk - -#define AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN_Pos (17U) -#define AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN_Len (1U) -#define AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN_Msk (0x1U << AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN_Pos) -#define AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN AON_COMM_DEEPSLCNTL_RADIO_SLEEP_EN_Msk - -#define AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN_Pos (16U) -#define AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN_Len (1U) -#define AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN_Msk (0x1U << AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN_Pos) -#define AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN AON_COMM_DEEPSLCNTL_OSC_SLEEP_EN_Msk - -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT_Pos (15U) -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT_Len (1U) -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT_Msk (0x1U << AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT_Pos) -#define AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT AON_COMM_DEEPSLCNTL_DEEP_SLEEP_STAT_Msk - -#define AON_MSIO_PAD_CFG_1_RTYPE_Pos (8U) -#define AON_MSIO_PAD_CFG_1_RTYPE_Len (5U) -#define AON_MSIO_PAD_CFG_1_RTYPE_Msk (0x1FU << AON_MSIO_PAD_CFG_1_RTYPE_Pos) -#define AON_MSIO_PAD_CFG_1_RTYPE AON_MSIO_PAD_CFG_1_RTYPE_Msk - -#define AON_MSIO_PAD_CFG_1_AE_N_Pos (0U) -#define AON_MSIO_PAD_CFG_1_AE_N_Len (5U) -#define AON_MSIO_PAD_CFG_1_AE_N_Msk (0x1FU << AON_MSIO_PAD_CFG_1_AE_N_Pos) -#define AON_MSIO_PAD_CFG_1_AE_N AON_MSIO_PAD_CFG_1_AE_N_Msk - -/******************* Bit definition for AON_REG_SLP_EVENT register **********/ -#define AON_SLP_EVENT_SLP_TIMER_MODE_Pos (30U) -#define AON_SLP_EVENT_SLP_TIMER_MODE_Len (2U) -#define AON_SLP_EVENT_SLP_TIMER_MODE_Msk (0x3U << AON_SLP_EVENT_SLP_TIMER_MODE_Pos) -#define AON_SLP_EVENT_SLP_TIMER_MODE AON_SLP_EVENT_SLP_TIMER_MODE_Msk -#define AON_SLP_EVENT_SLP_TIMER_MODE_NORMAL (0x0U << AON_SLP_EVENT_SLP_TIMER_MODE_Pos) -#define AON_SLP_EVENT_SLP_TIMER_MODE_SINGLE (0x1U << AON_SLP_EVENT_SLP_TIMER_MODE_Pos) -#define AON_SLP_EVENT_SLP_TIMER_MODE_RELOAD (0x2U << AON_SLP_EVENT_SLP_TIMER_MODE_Pos) -#define AON_SLP_EVENT_SLP_TIMER_MODE_DISABLE (0x3U << AON_SLP_EVENT_SLP_TIMER_MODE_Pos) - -#define AON_SLP_EVENT_EXT_WKUP_STATUS_Pos (16U) -#define AON_SLP_EVENT_EXT_WKUP_STATUS_Len (8U) -#define AON_SLP_EVENT_EXT_WKUP_STATUS_Msk (0xFFU << AON_SLP_EVENT_EXT_WKUP_STATUS_Pos) -#define AON_SLP_EVENT_EXT_WKUP_STATUS AON_SLP_EVENT_EXT_WKUP_STATUS_Msk - -#define AON_SLP_EVENT_CALENDAR_TIMER_WRAP_Pos (9U) -#define AON_SLP_EVENT_CALENDAR_TIMER_WRAP_Len (1U) -#define AON_SLP_EVENT_CALENDAR_TIMER_WRAP_Msk (0x1U << AON_SLP_EVENT_CALENDAR_TIMER_WRAP_Pos) -#define AON_SLP_EVENT_CALENDAR_TIMER_WRAP AON_SLP_EVENT_CALENDAR_TIMER_WRAP_Msk - -#define AON_SLP_EVENT_CALENDAR_TIMER_ALARM_Pos (8U) -#define AON_SLP_EVENT_CALENDAR_TIMER_ALARM_Len (1U) -#define AON_SLP_EVENT_CALENDAR_TIMER_ALARM_Msk (0x1U << AON_SLP_EVENT_CALENDAR_TIMER_ALARM_Pos) -#define AON_SLP_EVENT_CALENDAR_TIMER_ALARM AON_SLP_EVENT_CALENDAR_TIMER_ALARM_Msk - -#define AON_SLP_EVENT_WDT_REBOOT_Pos (6U) -#define AON_SLP_EVENT_WDT_REBOOT_Len (1U) -#define AON_SLP_EVENT_WDT_REBOOT_Msk (0x1U << AON_SLP_EVENT_WDT_REBOOT_Pos) -#define AON_SLP_EVENT_WDT_REBOOT AON_SLP_EVENT_WDT_REBOOT_Msk - -#define AON_SLP_EVENT_PMU_MSIO_COMP_Pos (4U) -#define AON_SLP_EVENT_PMU_MSIO_COMP_Len (1U) -#define AON_SLP_EVENT_PMU_MSIO_COMP_Msk (0x1U << AON_SLP_EVENT_PMU_MSIO_COMP_Pos) -#define AON_SLP_EVENT_PMU_MSIO_COMP AON_SLP_EVENT_PMU_MSIO_COMP_Msk - -#define AON_SLP_EVENT_PMU_BOD_FEDGE_Pos (3U) -#define AON_SLP_EVENT_PMU_BOD_FEDGE_Len (1U) -#define AON_SLP_EVENT_PMU_BOD_FEDGE_Msk (0x1U << AON_SLP_EVENT_PMU_BOD_FEDGE_Pos) -#define AON_SLP_EVENT_PMU_BOD_FEDGE AON_SLP_EVENT_PMU_BOD_FEDGE_Msk - -#define AON_SLP_EVENT_EXTWKUP_Pos (2U) -#define AON_SLP_EVENT_EXTWKUP_Len (1U) -#define AON_SLP_EVENT_EXTWKUP_Msk (0x1U << AON_SLP_EVENT_EXTWKUP_Pos) -#define AON_SLP_EVENT_EXTWKUP AON_SLP_EVENT_EXTWKUP_Msk - -#define AON_SLP_EVENT_TIMER_Pos (1U) -#define AON_SLP_EVENT_TIMER_Len (1U) -#define AON_SLP_EVENT_TIMER_Msk (0x1U << AON_SLP_EVENT_TIMER_Pos) -#define AON_SLP_EVENT_TIMER AON_SLP_EVENT_TIMER_Msk - -#define AON_SLP_EVENT_SMCOSCEN_Pos (0U) -#define AON_SLP_EVENT_SMCOSCEN_Len (1U) -#define AON_SLP_EVENT_SMCOSCEN_Msk (0x1U << AON_SLP_EVENT_SMCOSCEN_Pos) -#define AON_SLP_EVENT_SMCOSCEN AON_SLP_EVENT_SMCOSCEN_Msk - -/******************* Bit definition for AON_REG_WARM_BOOT_TIME register **********/ -#define AON_WARM_BOOT_TIME_TUNE_C_Pos (24U) -#define AON_WARM_BOOT_TIME_TUNE_C_Len (7U) -#define AON_WARM_BOOT_TIME_TUNE_C_Msk (0x7FU << AON_WARM_BOOT_TIME_TUNE_C_Pos) -#define AON_WARM_BOOT_TIME_TUNE_C AON_WARM_BOOT_TIME_TUNE_C_Msk - -#define AON_WARM_BOOT_TIME_DIG_LDO_D_Pos (16U) -#define AON_WARM_BOOT_TIME_DIG_LDO_D_Len (7U) -#define AON_WARM_BOOT_TIME_DIG_LDO_D_Msk (0x7FU << AON_WARM_BOOT_TIME_DIG_LDO_D_Pos) -#define AON_WARM_BOOT_TIME_DIG_LDO_D AON_WARM_BOOT_TIME_DIG_LDO_D_Msk - -#define AON_WARM_BOOT_TIME_COUNTER_B_Pos (8U) -#define AON_WARM_BOOT_TIME_COUNTER_B_Len (7U) -#define AON_WARM_BOOT_TIME_COUNTER_B_Msk (0x7FU << AON_WARM_BOOT_TIME_COUNTER_B_Pos) -#define AON_WARM_BOOT_TIME_COUNTER_B AON_WARM_BOOT_TIME_COUNTER_B_Msk - -#define AON_WARM_BOOT_TIME_COUNTER_A_Pos (0U) -#define AON_WARM_BOOT_TIME_COUNTER_A_Len (7U) -#define AON_WARM_BOOT_TIME_COUNTER_A_Msk (0x7FU << AON_WARM_BOOT_TIME_COUNTER_A_Pos) -#define AON_WARM_BOOT_TIME_COUNTER_A AON_WARM_BOOT_TIME_COUNTER_A_Msk - -/******************* Bit definition for AON_REG_RF_REG_10 register **********/ -#define AON_RF_REG_10_MSIO_0 (0U) -#define AON_RF_REG_10_MSIO_1 (1U) -#define AON_RF_REG_10_MSIO_2 (2U) -#define AON_RF_REG_10_MSIO_3 (3U) -#define AON_RF_REG_10_MSIO_4 (4U) -#define AON_RF_REG_10_VTEMP (5U) -#define AON_RF_REG_10_VBATT (6U) -#define AON_RF_REG_10_VREF (7U) - -#define AON_RF_REG_10_XO_BYP_Pos (24U) -#define AON_RF_REG_10_XO_BYP_Len (1U) -#define AON_RF_REG_10_XO_BYP_Msk (0x1U << AON_RF_REG_10_XO_BYP_Pos) -#define AON_RF_REG_10_XO_BYP AON_RF_REG_10_XO_BYP_Msk - -#define AON_RF_REG_10_COMP_REF_CTRL_LV_Pos (16U) -#define AON_RF_REG_10_COMP_REF_CTRL_LV_Len (6U) -#define AON_RF_REG_10_COMP_REF_CTRL_LV_Msk (0x3FU << AON_RF_REG_10_COMP_REF_CTRL_LV_Pos) -#define AON_RF_REG_10_COMP_REF_CTRL_LV AON_RF_REG_10_COMP_REF_CTRL_LV_Msk - -#define AON_RF_REG_10_LPD_REG6_Pos (16U) -#define AON_RF_REG_10_LPD_REG6_Len (8U) -#define AON_RF_REG_10_LPD_REG6_Msk (0xFFU << AON_RF_REG_10_LPD_REG6_Pos) -#define AON_RF_REG_10_LPD_REG6 AON_RF_REG_10_LPD_REG6_Msk - -#define AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Pos (12U) -#define AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Len (3U) -#define AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Msk (0x7U << AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Pos) -#define AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV AON_RF_REG_10_COMP_BATT_LVL_CTRL_LV_Msk - -#define AON_RF_REG_10_ICOMP_CTRL_LV_Pos (8U) -#define AON_RF_REG_10_ICOMP_CTRL_LV_Len (4U) -#define AON_RF_REG_10_ICOMP_CTRL_LV_Msk (0xFU << AON_RF_REG_10_ICOMP_CTRL_LV_Pos) -#define AON_RF_REG_10_ICOMP_CTRL_LV AON_RF_REG_10_ICOMP_CTRL_LV_Msk - -#define AON_RF_REG_10_LPD_REG5_Pos (8U) -#define AON_RF_REG_10_LPD_REG5_Len (8U) -#define AON_RF_REG_10_LPD_REG5_Msk (0xFFU << AON_RF_REG_10_LPD_REG5_Pos) -#define AON_RF_REG_10_LPD_REG5 AON_RF_REG_10_LPD_REG5_Msk - -#define AON_RF_REG_10_WAKE_COMP_EN_Pos (6U) -#define AON_RF_REG_10_WAKE_COMP_EN_Len (1U) -#define AON_RF_REG_10_WAKE_COMP_EN_Msk (0x1U << AON_RF_REG_10_WAKE_COMP_EN_Pos) -#define AON_RF_REG_10_WAKE_COMP_EN AON_RF_REG_10_WAKE_COMP_EN_Msk - -#define AON_RF_REG_10_CHANNEL_SEL_N_Pos (3U) -#define AON_RF_REG_10_CHANNEL_SEL_N_Len (3U) -#define AON_RF_REG_10_CHANNEL_SEL_N_Msk (0x7U << AON_RF_REG_10_CHANNEL_SEL_N_Pos) -#define AON_RF_REG_10_CHANNEL_SEL_N AON_RF_REG_10_CHANNEL_SEL_N_Msk - -#define AON_RF_REG_10_CHANNEL_SEL_P_Pos (0U) -#define AON_RF_REG_10_CHANNEL_SEL_P_Len (3U) -#define AON_RF_REG_10_CHANNEL_SEL_P_Msk (0x7U << AON_RF_REG_10_CHANNEL_SEL_P_Pos) -#define AON_RF_REG_10_CHANNEL_SEL_P AON_RF_REG_10_CHANNEL_SEL_P_Msk - -#define AON_RF_REG_10_LPD_REG4_Pos (0U) -#define AON_RF_REG_10_LPD_REG4_Len (8U) -#define AON_RF_REG_10_LPD_REG4_Msk (0xFFU << AON_RF_REG_10_LPD_REG4_Pos) -#define AON_RF_REG_10_LPD_REG4 AON_RF_REG_10_LPD_REG4_Msk - -/******************* Bit definition for AON_REG_AON_PAD_CTL0 register **************/ -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Pos (28U) -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Len (2U) -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Msk (0x3U << AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Pos) -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Msk -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL_RNG (0x00 << AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Pos) -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL_RTC (0x01 << AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Pos) -#define AON_PAD_CTL0_COMM_TIMER_CLK_SEL_RNG2 (0x03 << AON_PAD_CTL0_COMM_TIMER_CLK_SEL_Pos) - -#define AON_PAD_CTL0_MCU_OVR_Pos (16U) -#define AON_PAD_CTL0_MCU_OVR_Len (8U) -#define AON_PAD_CTL0_MCU_OVR_Msk (0xFFU << AON_PAD_CTL0_MCU_OVR_Pos) -#define AON_PAD_CTL0_MCU_OVR AON_PAD_CTL0_MCU_OVR_Msk - -#define AON_PAD_CTL0_GPO_RTYPE_Pos (8U) -#define AON_PAD_CTL0_GPO_RTYPE_Len (8U) -#define AON_PAD_CTL0_GPO_RTYPE_Msk (0xFFU << AON_PAD_CTL0_GPO_RTYPE_Pos) -#define AON_PAD_CTL0_GPO_RTYPE AON_PAD_CTL0_GPO_RTYPE_Msk - -#define AON_PAD_CTL0_GPO_RE_N_Pos (0U) -#define AON_PAD_CTL0_GPO_RE_N_Len (8U) -#define AON_PAD_CTL0_GPO_RE_N_Msk (0xFFU << AON_PAD_CTL0_GPO_RE_N_Pos) -#define AON_PAD_CTL0_GPO_RE_N AON_PAD_CTL0_GPO_RE_N_Msk - -/******************* Bit definition for AON_REG_MEM_N_SLP_CTL register ****************/ -#define AON_MEM_CTL_DPAD_LE_WKUP_VAL_Pos (25U) -#define AON_MEM_CTL_DPAD_LE_WKUP_VAL_Len (1U) -#define AON_MEM_CTL_DPAD_LE_WKUP_VAL_Msk (0x1U << AON_MEM_CTL_DPAD_LE_WKUP_VAL_Pos) -#define AON_MEM_CTL_DPAD_LE_WKUP_VAL AON_MEM_CTL_DPAD_LE_WKUP_VAL_Msk - -#define AON_MEM_CTL_DPAD_LE_SLP_VAL_Pos (24U) -#define AON_MEM_CTL_DPAD_LE_SLP_VAL_Len (1U) -#define AON_MEM_CTL_DPAD_LE_SLP_VAL_Msk (0x1U << AON_MEM_CTL_DPAD_LE_SLP_VAL_Pos) -#define AON_MEM_CTL_DPAD_LE_SLP_VAL AON_MEM_CTL_DPAD_LE_SLP_VAL_Msk - -#define AON_MEM_CTL_SLP_Pos (16U) -#define AON_MEM_CTL_SLP_Len (7U) -#define AON_MEM_CTL_SLP_Msk (0x7FU << AON_MEM_CTL_SLP_Pos) -#define AON_MEM_CTL_SLP_EN AON_MEM_CTL_SLP_Msk -#define AON_MEM_CTL_SLP_ALL (AON_MEM_CTL_SLP_TRN_OFF_DCDC | \ - AON_MEM_CTL_SLP_TRN_OFF_XO | \ - AON_MEM_CTL_SLP_TRN_OFF_PLL_EN | \ - AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE | \ - AON_MEM_CTL_SLP_TRN_OFF_LDO_EN | \ - AON_MEM_CTL_SLP_TRN_OFF_PLL_RST | \ - AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN) - -#define AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN_Pos (22U) -#define AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN AON_MEM_CTL_SLP_TRN_OFF_IO_LDO_EN_Msk - -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_RST_Pos (21U) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_RST_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_RST_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_PLL_RST_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_RST AON_MEM_CTL_SLP_TRN_OFF_PLL_RST_Msk - -#define AON_MEM_CTL_SLP_TRN_OFF_LDO_EN_Pos (20U) -#define AON_MEM_CTL_SLP_TRN_OFF_LDO_EN_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_LDO_EN_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_LDO_EN_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_LDO_EN AON_MEM_CTL_SLP_TRN_OFF_LDO_EN_Msk - -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE_Pos (19U) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE AON_MEM_CTL_SLP_TRN_OFF_PLL_TUNE_Msk - -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_EN_Pos (18U) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_EN_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_EN_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_PLL_EN_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_PLL_EN AON_MEM_CTL_SLP_TRN_OFF_PLL_EN_Msk - -#define AON_MEM_CTL_SLP_TRN_OFF_XO_Pos (17U) -#define AON_MEM_CTL_SLP_TRN_OFF_XO_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_XO_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_XO_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_XO AON_MEM_CTL_SLP_TRN_OFF_XO_Msk - -#define AON_MEM_CTL_SLP_TRN_OFF_DCDC_Pos (16U) -#define AON_MEM_CTL_SLP_TRN_OFF_DCDC_Len (1U) -#define AON_MEM_CTL_SLP_TRN_OFF_DCDC_Msk (0x1U << AON_MEM_CTL_SLP_TRN_OFF_DCDC_Pos) -#define AON_MEM_CTL_SLP_TRN_OFF_DCDC AON_MEM_CTL_SLP_TRN_OFF_DCDC_Msk - -#define AON_MEM_CTL_MEM_BTRM_Pos (8U) -#define AON_MEM_CTL_MEM_BTRM_Len (4U) -#define AON_MEM_CTL_MEM_BTRM_Msk (0xFU << AON_MEM_CTL_MEM_BTRM_Pos) -#define AON_MEM_CTL_MEM_BTRM AON_MEM_CTL_MEM_BTRM_Msk - -#define AON_MEM_CTL_NON_CRITICAL_MEM_RWM_Pos (6U) -#define AON_MEM_CTL_NON_CRITICAL_MEM_RWM_Len (2U) -#define AON_MEM_CTL_NON_CRITICAL_MEM_RWM_Msk (0x3U << AON_MEM_CTL_NON_CRITICAL_MEM_RWM_Pos) -#define AON_MEM_CTL_NON_CRITICAL_MEM_RWM AON_MEM_CTL_NON_CRITICAL_MEM_RWM_Msk - -#define AON_MEM_CTL_NON_CRITICAL_MEM_WM_Pos (5U) -#define AON_MEM_CTL_NON_CRITICAL_MEM_WM_Len (1U) -#define AON_MEM_CTL_NON_CRITICAL_MEM_WM_Msk (0x1U << AON_MEM_CTL_NON_CRITICAL_MEM_WM_Pos) -#define AON_MEM_CTL_NON_CRITICAL_MEM_WM AON_MEM_CTL_NON_CRITICAL_MEM_WM_Msk - -#define AON_MEM_CTL_NON_CRITICAL_MEM_RM_Pos (4U) -#define AON_MEM_CTL_NON_CRITICAL_MEM_RM_Len (1U) -#define AON_MEM_CTL_NON_CRITICAL_MEM_RM_Msk (0x1U << AON_MEM_CTL_NON_CRITICAL_MEM_RM_Pos) -#define AON_MEM_CTL_NON_CRITICAL_MEM_RM AON_MEM_CTL_NON_CRITICAL_MEM_RM_Msk - -#define AON_MEM_CTL_CRITICAL_MEM_RWM_Pos (2U) -#define AON_MEM_CTL_CRITICAL_MEM_RWM_Len (2U) -#define AON_MEM_CTL_CRITICAL_MEM_RWM_Msk (0x3U << AON_MEM_CTL_CRITICAL_MEM_RWM_Pos) -#define AON_MEM_CTL_CRITICAL_MEM_RWM AON_MEM_CTL_CRITICAL_MEM_RWM_Msk - -#define AON_MEM_CTL_CRITICAL_MEM_WM_Pos (1U) -#define AON_MEM_CTL_CRITICAL_MEM_WM_Len (1U) -#define AON_MEM_CTL_CRITICAL_MEM_WM_Msk (0x1U << AON_MEM_CTL_CRITICAL_MEM_WM_Pos) -#define AON_MEM_CTL_CRITICAL_MEM_WM AON_MEM_CTL_CRITICAL_MEM_WM_Msk - -#define AON_MEM_CTL_CRITICAL_MEM_RM_Pos (0U) -#define AON_MEM_CTL_CRITICAL_MEM_RM_Len (1U) -#define AON_MEM_CTL_CRITICAL_MEM_RM_Msk (0x1U << AON_MEM_CTL_CRITICAL_MEM_RM_Pos) -#define AON_MEM_CTL_CRITICAL_MEM_RM AON_MEM_CTL_CRITICAL_MEM_RM_Msk - -/********************* Bit definition for AON_REG_EXT_WKUP_CTL register ************************************/ -#define AON_EXT_WKUP_CTL_WDT_ALARM_Pos (27U) -#define AON_EXT_WKUP_CTL_WDT_ALARM_Len (5U) -#define AON_EXT_WKUP_CTL_WDT_ALARM_Msk (0x1FU << AON_EXT_WKUP_CTL_WDT_ALARM_Pos) -#define AON_EXT_WKUP_CTL_WDT_ALARM AON_EXT_WKUP_CTL_WDT_ALARM_Msk - -#define AON_EXT_WKUP_CTL_WDT_RUNNING_Pos (26U) -#define AON_EXT_WKUP_CTL_WDT_RUNNING_Len (1U) -#define AON_EXT_WKUP_CTL_WDT_RUNNING_Msk (0x1U << AON_EXT_WKUP_CTL_WDT_RUNNING_Pos) -#define AON_EXT_WKUP_CTL_WDT_RUNNING AON_EXT_WKUP_CTL_WDT_RUNNING_Msk - -#define AON_EXT_WKUP_CTL_WDT_RELOAD_Pos (25U) -#define AON_EXT_WKUP_CTL_WDT_RELOAD_Len (1U) -#define AON_EXT_WKUP_CTL_WDT_RELOAD_Msk (0x1U << AON_EXT_WKUP_CTL_WDT_RELOAD_Pos) -#define AON_EXT_WKUP_CTL_WDT_RELOAD AON_EXT_WKUP_CTL_WDT_RELOAD_Msk - -#define AON_EXT_WKUP_CTL_WDT_EN_Pos (24U) -#define AON_EXT_WKUP_CTL_WDT_EN_Len (1U) -#define AON_EXT_WKUP_CTL_WDT_EN_Msk (0x1U << AON_EXT_WKUP_CTL_WDT_EN_Pos) -#define AON_EXT_WKUP_CTL_WDT_EN AON_EXT_WKUP_CTL_WDT_EN_Msk - -#define AON_EXT_WKUP_CTL_TYPE_Pos (16U) -#define AON_EXT_WKUP_CTL_TYPE_Len (8U) -#define AON_EXT_WKUP_CTL_TYPE_Msk (0xFFU << AON_EXT_WKUP_CTL_TYPE_Pos) -#define AON_EXT_WKUP_CTL_TYPE AON_EXT_WKUP_CTL_TYPE_Msk - -#define AON_EXT_WKUP_CTL_INVERT_Pos (8U) -#define AON_EXT_WKUP_CTL_INVERT_Len (8U) -#define AON_EXT_WKUP_CTL_INVERT_Msk (0xFFU << AON_EXT_WKUP_CTL_INVERT_Pos) -#define AON_EXT_WKUP_CTL_INVERT AON_EXT_WKUP_CTL_INVERT_Msk - -#define AON_EXT_WKUP_CTL_SRC_EN_Pos (0U) -#define AON_EXT_WKUP_CTL_SRC_EN_Len (8U) -#define AON_EXT_WKUP_CTL_SRC_EN_Msk (0xFFU << AON_EXT_WKUP_CTL_SRC_EN_Pos) -#define AON_EXT_WKUP_CTL_SRC_EN AON_EXT_WKUP_CTL_SRC_EN_Msk - -/********************* Bit definition for AON_REG_AON_PAD_CTL1 register ***************************************/ -#define AON_PAD_CTL1_TIMER_READ_SEL_Pos (30U) -#define AON_PAD_CTL1_TIMER_READ_SEL_Len (2U) -#define AON_PAD_CTL1_TIMER_READ_SEL_Msk (0x3U << AON_PAD_CTL1_TIMER_READ_SEL_Pos) -#define AON_PAD_CTL1_TIMER_READ_SEL AON_PAD_CTL1_TIMER_READ_SEL_Msk -#define AON_PAD_CTL1_TIMER_READ_SEL_CAL_TIMER (0x0U << AON_PAD_CTL1_TIMER_READ_SEL_Pos) -#define AON_PAD_CTL1_TIMER_READ_SEL_AON_WDT (0x1U << AON_PAD_CTL1_TIMER_READ_SEL_Pos) -#define AON_PAD_CTL1_TIMER_READ_SEL_SLP_TIMER (0x2U << AON_PAD_CTL1_TIMER_READ_SEL_Pos) -#define AON_PAD_CTL1_TIMER_READ_SEL_CAL_ALARM (0x3U << AON_PAD_CTL1_TIMER_READ_SEL_Pos) - -#define AON_PAD_CTL1_MEM_STDBY_VDDISO_OVR_EN_Pos (25U) -#define AON_PAD_CTL1_MEM_STDBY_VDDISO_OVR_EN_Len (1U) -#define AON_PAD_CTL1_MEM_STDBY_VDDISO_OVR_EN_Msk (0x1U << AON_PAD_CTL1_MEM_STDBY_VDDISO_OVR_EN_Pos) -#define AON_PAD_CTL1_MEM_STDBY_VDDISO_OVR_EN AON_PAD_CTL1_MEM_STDBY_VDDISO_OVR_EN_Msk - -#define AON_PAD_CTL1_O_AON_GPI_Pos (16U) -#define AON_PAD_CTL1_O_AON_GPI_Len (6U) -#define AON_PAD_CTL1_O_AON_GPI_Msk (0x3FU << AON_PAD_CTL1_O_AON_GPI_Pos) -#define AON_PAD_CTL1_O_AON_GPI AON_PAD_CTL1_O_AON_GPI_Msk - -#define AON_PAD_CTL1_AON_GPO_Pos (8U) -#define AON_PAD_CTL1_AON_GPO_Len (8U) -#define AON_PAD_CTL1_AON_GPO_Msk (0xFFU << AON_PAD_CTL1_AON_GPO_Pos) -#define AON_PAD_CTL1_AON_GPO AON_PAD_CTL1_AON_GPO_Msk - -#define AON_PAD_CTL1_AON_GPO_OE_N_Pos (0U) -#define AON_PAD_CTL1_AON_GPO_OE_N_Len (8U) -#define AON_PAD_CTL1_AON_GPO_OE_N_Msk (0xFFU << AON_PAD_CTL1_AON_GPO_OE_N_Pos) -#define AON_PAD_CTL1_AON_GPO_OE_N AON_PAD_CTL1_AON_GPO_OE_N_Msk - -/********************* Bit definition for AON_REG_MEM_PWR_SLP register **************************************/ -#define AON_MEM_PWR_SLP_PD_MCU_KEYRAM_Pos (28U) -#define AON_MEM_PWR_SLP_PD_MCU_KEYRAM_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_KEYRAM_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_KEYRAM_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_KEYRAM AON_MEM_PWR_SLP_PD_MCU_KEYRAM_Msk - -#define AON_MEM_PWR_SLP_PD_PACKET_MEM_Pos (26U) -#define AON_MEM_PWR_SLP_PD_PACKET_MEM_Len (2U) -#define AON_MEM_PWR_SLP_PD_PACKET_MEM_Msk (0x3U << AON_MEM_PWR_SLP_PD_PACKET_MEM_Pos) -#define AON_MEM_PWR_SLP_PD_PACKET_MEM AON_MEM_PWR_SLP_PD_PACKET_MEM_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_ICACHE_Pos (24U) -#define AON_MEM_PWR_SLP_PD_MCU_ICACHE_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_ICACHE_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_ICACHE_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_ICACHE AON_MEM_PWR_SLP_PD_MCU_ICACHE_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_HTM_Pos (22U) -#define AON_MEM_PWR_SLP_PD_MCU_HTM_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_HTM_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_HTM_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_HTM AON_MEM_PWR_SLP_PD_MCU_HTM_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_10_Pos (20U) -#define AON_MEM_PWR_SLP_PD_MCU_10_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_10_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_10_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_10 AON_MEM_PWR_SLP_PD_MCU_10_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_09_Pos (18U) -#define AON_MEM_PWR_SLP_PD_MCU_09_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_09_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_09_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_09 AON_MEM_PWR_SLP_PD_MCU_09_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_08_Pos (16U) -#define AON_MEM_PWR_SLP_PD_MCU_08_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_08_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_08_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_08 AON_MEM_PWR_SLP_PD_MCU_08_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_07_Pos (14U) -#define AON_MEM_PWR_SLP_PD_MCU_07_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_07_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_07_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_07 AON_MEM_PWR_SLP_PD_MCU_07_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_06_Pos (12U) -#define AON_MEM_PWR_SLP_PD_MCU_06_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_06_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_06_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_06 AON_MEM_PWR_SLP_PD_MCU_06_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_05_Pos (10U) -#define AON_MEM_PWR_SLP_PD_MCU_05_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_05_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_05_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_05 AON_MEM_PWR_SLP_PD_MCU_05_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_04_Pos (8U) -#define AON_MEM_PWR_SLP_PD_MCU_04_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_04_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_04_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_04 AON_MEM_PWR_SLP_PD_MCU_04_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_03_Pos (6U) -#define AON_MEM_PWR_SLP_PD_MCU_03_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_03_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_03_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_03 AON_MEM_PWR_SLP_PD_MCU_03_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_02_Pos (4U) -#define AON_MEM_PWR_SLP_PD_MCU_02_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_02_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_02_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_02 AON_MEM_PWR_SLP_PD_MCU_02_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_01_Pos (2U) -#define AON_MEM_PWR_SLP_PD_MCU_01_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_01_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_01_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_01 AON_MEM_PWR_SLP_PD_MCU_01_Msk - -#define AON_MEM_PWR_SLP_PD_MCU_00_Pos (0U) -#define AON_MEM_PWR_SLP_PD_MCU_00_Len (2U) -#define AON_MEM_PWR_SLP_PD_MCU_00_Msk (0x3U << AON_MEM_PWR_SLP_PD_MCU_00_Pos) -#define AON_MEM_PWR_SLP_PD_MCU_00 AON_MEM_PWR_SLP_PD_MCU_00_Msk - -/**************************** Bit definition for AON_REG_MEM_PWR_WKUP register *****************************/ -#define AON_MEM_PWR_WKUP_PD_MCU_KEYRAM_Pos (28U) -#define AON_MEM_PWR_WKUP_PD_MCU_KEYRAM_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_KEYRAM_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_KEYRAM_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_KEYRAM AON_MEM_PWR_WKUP_PD_MCU_KEYRAM_Msk - -#define AON_MEM_PWR_WKUP_PD_PACKET_MEM_Pos (26U) -#define AON_MEM_PWR_WKUP_PD_PACKET_MEM_Len (2U) -#define AON_MEM_PWR_WKUP_PD_PACKET_MEM_Msk (0x3U << AON_MEM_PWR_WKUP_PD_PACKET_MEM_Pos) -#define AON_MEM_PWR_WKUP_PD_PACKET_MEM AON_MEM_PWR_WKUP_PD_PACKET_MEM_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_ICACHE_Pos (24U) -#define AON_MEM_PWR_WKUP_PD_MCU_ICACHE_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_ICACHE_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_ICACHE_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_ICACHE AON_MEM_PWR_WKUP_PD_MCU_ICACHE_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_HTM_Pos (22U) -#define AON_MEM_PWR_WKUP_PD_MCU_HTM_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_HTM_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_HTM_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_HTM AON_MEM_PWR_WKUP_PD_MCU_HTM_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_10_Pos (20U) -#define AON_MEM_PWR_WKUP_PD_MCU_10_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_10_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_10_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_10 AON_MEM_PWR_WKUP_PD_MCU_10_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_09_Pos (18U) -#define AON_MEM_PWR_WKUP_PD_MCU_09_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_09_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_09_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_09 AON_MEM_PWR_WKUP_PD_MCU_09_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_08_Pos (16U) -#define AON_MEM_PWR_WKUP_PD_MCU_08_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_08_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_08_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_08 AON_MEM_PWR_WKUP_PD_MCU_08_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_07_Pos (14U) -#define AON_MEM_PWR_WKUP_PD_MCU_07_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_07_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_07_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_07 AON_MEM_PWR_WKUP_PD_MCU_07_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_06_Pos (12U) -#define AON_MEM_PWR_WKUP_PD_MCU_06_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_06_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_06_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_06 AON_MEM_PWR_WKUP_PD_MCU_06_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_05_Pos (10U) -#define AON_MEM_PWR_WKUP_PD_MCU_05_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_05_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_05_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_05 AON_MEM_PWR_WKUP_PD_MCU_05_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_04_Pos (8U) -#define AON_MEM_PWR_WKUP_PD_MCU_04_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_04_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_04_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_04 AON_MEM_PWR_WKUP_PD_MCU_04_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_03_Pos (6U) -#define AON_MEM_PWR_WKUP_PD_MCU_03_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_03_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_03_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_03 AON_MEM_PWR_WKUP_PD_MCU_03_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_02_Pos (4U) -#define AON_MEM_PWR_WKUP_PD_MCU_02_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_02_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_02_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_02 AON_MEM_PWR_WKUP_PD_MCU_02_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_01_Pos (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_01_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_01_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_01_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_01 AON_MEM_PWR_WKUP_PD_MCU_01_Msk - -#define AON_MEM_PWR_WKUP_PD_MCU_00_Pos (0U) -#define AON_MEM_PWR_WKUP_PD_MCU_00_Len (2U) -#define AON_MEM_PWR_WKUP_PD_MCU_00_Msk (0x3U << AON_MEM_PWR_WKUP_PD_MCU_00_Pos) -#define AON_MEM_PWR_WKUP_PD_MCU_00 AON_MEM_PWR_WKUP_PD_MCU_00_Msk - -/*********************** Bit definition for AON_REG_PWR_RET28 register ***************************/ -#define AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME_Pos (0U) -#define AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME_Len (32U) -#define AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME_Msk (0xFFFFFFFFU) -#define AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME AON_COMM_TMR_DEEPSLWKUP_DEEPSLTIME_Msk - -/*********************** Bit definition for AON_REG_PWR_RET29 register ************************/ -#define AON_COMM_TMR_ENBPRESET_TWEXT_Pos (21U) -#define AON_COMM_TMR_ENBPRESET_TWEXT_Len (11U) -#define AON_COMM_TMR_ENBPRESET_TWEXT_Msk (0x07FFU << AON_COMM_TMR_ENBPRESET_TWEXT_Pos) -#define AON_COMM_TMR_ENBPRESET_TWEXT AON_COMM_TMR_ENBPRESET_TWEXT_Msk - -#define AON_COMM_TMR_ENBPRESET_TWOSC_Pos (10U) -#define AON_COMM_TMR_ENBPRESET_TWOSC_Len (11U) -#define AON_COMM_TMR_ENBPRESET_TWOSC_Msk (0x07FFU << AON_COMM_TMR_ENBPRESET_TWOSC_Pos) -#define AON_COMM_TMR_ENBPRESET_TWOSC AON_COMM_TMR_ENBPRESET_TWOSC_Msk - -#define AON_COMM_TMR_ENBPRESET_TWRM_Pos (0U) -#define AON_COMM_TMR_ENBPRESET_TWRM_Len (10U) -#define AON_COMM_TMR_ENBPRESET_TWRM_Msk (0x03FFU << AON_COMM_TMR_ENBPRESET_TWRM_Pos) -#define AON_COMM_TMR_ENBPRESET_TWRM AON_COMM_TMR_ENBPRESET_TWRM_Msk - -/*********************** Bit definition for AON_REG_PWR_RET31 register *********************************/ -#define AON_PWR_REG31_FPGA_DBG_MUX_SEL_Pos (0U) -#define AON_PWR_REG31_FPGA_DBG_MUX_SEL_Len (2U) -#define AON_PWR_REG31_FPGA_DBG_MUX_SEL_Msk (0x3U << AON_PWR_REG31_FPGA_DBG_MUX_SEL_Pos) -#define AON_PWR_REG31_FPGA_DBG_MUX_SEL AON_PWR_REG31_FPGA_DBG_MUX_SEL_Msk - -/*********************** Bit definition for AON_REG_PSC_CMD register ***************************************/ -#define AON_PSC_CMD_MCU_PWR_BUSY_Pos (1U) -#define AON_PSC_CMD_MCU_PWR_BUSY_Len (1U) -#define AON_PSC_CMD_MCU_PWR_BUSY_Msk (0x1U << AON_PSC_CMD_MCU_PWR_BUSY_Pos) -#define AON_PSC_CMD_MCU_PWR_BUSY AON_PSC_CMD_MCU_PWR_BUSY_Msk - -#define AON_PSC_CMD_MCU_PWR_REQ_Pos (0U) -#define AON_PSC_CMD_MCU_PWR_REQ_Len (1U) -#define AON_PSC_CMD_MCU_PWR_REQ_Msk (0x1U << AON_PSC_CMD_MCU_PWR_REQ_Pos) -#define AON_PSC_CMD_MCU_PWR_REQ AON_PSC_CMD_MCU_PWR_REQ_Msk - -/********************** Bit definition for AON_REG_PSC_CMD_OPC register ************************************/ -#define AON_PSC_CMD_OPC_OPCODE_Pos (0U) -#define AON_PSC_CMD_OPC_OPCODE_Len (8U) -#define AON_PSC_CMD_OPC_OPCODE_Msk (0xFFU << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE AON_PSC_CMD_OPC_OPCODE_Msk -#define AON_PSC_CMD_OPC_OPCODE_LOOPBACK (0x0U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_EF_DIR_ON (0x1U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_32_TIMER_LD (0x2U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_DEEP_SLEEP (0x3U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_EF_DIR_OFF (0x4U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_EXT_CLK (0x5U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_RNG_CLK (0x6U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_RTC_CLK (0x7U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_RNG2_CLK (0x8U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_LD_MEM_SLP_CFG (0x9U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_LD_MEM_WKUP_CFG (0xAU << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_DPAD_LE_HI (0xBU << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_DPAD_LE_LO (0xCU << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_0 (0x10U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_1 (0x11U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_2 (0x12U << AON_PSC_CMD_OPC_OPCODE_Pos) -#define AON_PSC_CMD_OPC_OPCODE_SLP_TIMER_MODE_3 (0x13U << AON_PSC_CMD_OPC_OPCODE_Pos) - -/******************* Bit definition for AON_REG_TIMER_VALUE register **********/ -#define AON_TIMER_VALUE_PWR_CTL_TIMER_32B_Pos (0U) -#define AON_TIMER_VALUE_PWR_CTL_TIMER_32B_Len (32U) -#define AON_TIMER_VALUE_PWR_CTL_TIMER_32B_Msk (0xFFFFFFFFU) -#define AON_TIMER_VALUE_PWR_CTL_TIMER_32B AON_TIMER_VALUE_PWR_CTL_TIMER_32B_Msk - -/********************* Bit definition for AON_REG_TIMER_VAL register **************************************/ -#define AON_TIMER_VAL_READ_Pos (0U) -#define AON_TIMER_VAL_READ_Len (32U) -#define AON_TIMER_VAL_READ_Msk (0xFFFFFFFFU) -#define AON_TIMER_VAL_READ AON_TIMER_VAL_READ_Msk - -/*********************** Bit definition for AON_REG_FPGA_CTRL register *********************************/ -#define AON_REG_FPGA_CTRL_MUX_SEL_Pos (0U) -#define AON_REG_FPGA_CTRL_MUX_SEL_Len (2U) -#define AON_REG_FPGA_CTRL_MUX_SEL_Msk (0x3U << AON_REG_FPGA_CTRL_MUX_SEL_Pos) -#define AON_REG_FPGA_CTRL_MUX_SEL AON_REG_FPGA_CTRL_MUX_SEL_Msk - -#define AON_REG_FPGA_CTRL_EXIST_Pos (4U) -#define AON_REG_FPGA_CTRL_EXIST_Len (1U) -#define AON_REG_FPGA_CTRL_EXIST_Msk (0x1U << AON_REG_FPGA_CTRL_EXIST_Pos) -#define AON_REG_FPGA_CTRL_EXIST AON_REG_FPGA_CTRL_EXIST_Msk - -/********************** Bit definition for AON_REG_ST_CALIB_REG register ***********************************/ -#define AON_ST_CALIB_REG_STCALIB_Pos (0U) -#define AON_ST_CALIB_REG_STCALIB_Len (27U) -#define AON_ST_CALIB_REG_STCALIB_Msk (0x7FFFFFFU << AON_ST_CALIB_REG_STCALIB_Pos) -#define AON_ST_CALIB_REG_STCALIB AON_ST_CALIB_REG_STCALIB_Msk - - -/* ================================================================================================================= */ -/* ================ DMA ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for DMA_SAR register ********************/ -#define DMA_SAR_CSA_Pos (0U) -#define DMA_SAR_CSA_Len (32U) -#define DMA_SAR_CSA_Msk (0xFFFFFFFFU) -#define DMA_SAR_CSA DMA_SAR_CSA_Msk - -/******************* Bit definition for DMA_DAR register ********************/ -#define DMA_DAR_CDA_Pos (0U) -#define DMA_DAR_CDA_Len (32U) -#define DMA_DAR_CDA_Msk (0xFFFFFFFFU) -#define DMA_DAR_CDA DMA_DAR_CDA_Msk - -/******************* Bit definition for DMA_CTLL register *******************/ -#define DMA_CTLL_TT_FC_Pos (20U) -#define DMA_CTLL_TT_FC_Len (2U) -#define DMA_CTLL_TT_FC_Msk (0x3U << DMA_CTLL_TT_FC_Pos) -#define DMA_CTLL_TT_FC DMA_CTLL_TT_FC_Msk -#define DMA_CTLL_TT_FC_M2M (0x0U << DMA_CTLL_TT_FC_Pos) -#define DMA_CTLL_TT_FC_M2P (0x1U << DMA_CTLL_TT_FC_Pos) -#define DMA_CTLL_TT_FC_P2M (0x2U << DMA_CTLL_TT_FC_Pos) -#define DMA_CTLL_TT_FC_P2P (0x3U << DMA_CTLL_TT_FC_Pos) - -#define DMA_CTLL_SRC_MSIZE_Pos (14U) -#define DMA_CTLL_SRC_MSIZE_Len (3U) -#define DMA_CTLL_SRC_MSIZE_Msk (0x7U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE DMA_CTLL_SRC_MSIZE_Msk -#define DMA_CTLL_SRC_MSIZE_1 (0x0U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_4 (0x1U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_8 (0x2U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_16 (0x3U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_32 (0x4U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_64 (0x5U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_128 (0x6U << DMA_CTLL_SRC_MSIZE_Pos) -#define DMA_CTLL_SRC_MSIZE_256 (0x7U << DMA_CTLL_SRC_MSIZE_Pos) - -#define DMA_CTLL_DST_MSIZE_Pos (11U) -#define DMA_CTLL_DST_MSIZE_Len (3U) -#define DMA_CTLL_DST_MSIZE_Msk (0x7U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE DMA_CTLL_DST_MSIZE_Msk -#define DMA_CTLL_DST_MSIZE_1 (0x0U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_4 (0x1U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_8 (0x2U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_16 (0x3U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_32 (0x4U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_64 (0x5U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_128 (0x6U << DMA_CTLL_DST_MSIZE_Pos) -#define DMA_CTLL_DST_MSIZE_256 (0x7U << DMA_CTLL_DST_MSIZE_Pos) - -#define DMA_CTLL_SINC_Pos (9U) -#define DMA_CTLL_SINC_Len (2U) -#define DMA_CTLL_SINC_Msk (0x3U << DMA_CTLL_SINC_Pos) -#define DMA_CTLL_SINC DMA_CTLL_SINC_Msk -#define DMA_CTLL_SINC_INC (0x0U << DMA_CTLL_SINC_Pos) -#define DMA_CTLL_SINC_DEC (0x1U << DMA_CTLL_SINC_Pos) -#define DMA_CTLL_SINC_NO (0x2U << DMA_CTLL_SINC_Pos) - -#define DMA_CTLL_DINC_Pos (7U) -#define DMA_CTLL_DINC_Len (2U) -#define DMA_CTLL_DINC_Msk (0x3U << DMA_CTLL_DINC_Pos) -#define DMA_CTLL_DINC DMA_CTLL_DINC_Msk -#define DMA_CTLL_DINC_INC (0x0U << DMA_CTLL_DINC_Pos) -#define DMA_CTLL_DINC_DEC (0x1U << DMA_CTLL_DINC_Pos) -#define DMA_CTLL_DINC_NO (0x2U << DMA_CTLL_DINC_Pos) - -#define DMA_CTLL_SRC_TR_WIDTH_Pos (4U) -#define DMA_CTLL_SRC_TR_WIDTH_Len (2U) -#define DMA_CTLL_SRC_TR_WIDTH_Msk (0x3U << DMA_CTLL_SRC_TR_WIDTH_Pos) -#define DMA_CTLL_SRC_TR_WIDTH DMA_CTLL_SRC_TR_WIDTH_Msk -#define DMA_CTLL_SRC_TR_WIDTH_8 (0x0U << DMA_CTLL_SRC_TR_WIDTH_Pos) -#define DMA_CTLL_SRC_TR_WIDTH_16 (0x1U << DMA_CTLL_SRC_TR_WIDTH_Pos) -#define DMA_CTLL_SRC_TR_WIDTH_32 (0x2U << DMA_CTLL_SRC_TR_WIDTH_Pos) - -#define DMA_CTLL_DST_TR_WIDTH_Pos (1U) -#define DMA_CTLL_DST_TR_WIDTH_Len (2U) -#define DMA_CTLL_DST_TR_WIDTH_Msk (0x3U << DMA_CTLL_DST_TR_WIDTH_Pos) -#define DMA_CTLL_DST_TR_WIDTH DMA_CTLL_DST_TR_WIDTH_Msk -#define DMA_CTLL_DST_TR_WIDTH_8 (0x0U << DMA_CTLL_DST_TR_WIDTH_Pos) -#define DMA_CTLL_DST_TR_WIDTH_16 (0x1U << DMA_CTLL_DST_TR_WIDTH_Pos) -#define DMA_CTLL_DST_TR_WIDTH_32 (0x2U << DMA_CTLL_DST_TR_WIDTH_Pos) - -#define DMA_CTLL_INT_EN_Pos (0U) -#define DMA_CTLL_INT_EN_Len (1U) -#define DMA_CTLL_INT_EN_Msk (0x1U << DMA_CTLL_INT_EN_Pos) -#define DMA_CTLL_INI_EN DMA_CTLL_INT_EN_Msk - -/******************* Bit definition for DMA_CTLH register *******************/ -#define DMA_CTLH_BLOCK_TS_Pos (0U) -#define DMA_CTLH_BLOCK_TS_Len (12U) -#define DMA_CTLH_BLOCK_TS_Msk (0xFFFU << DMA_CTLH_BLOCK_TS_Pos) -#define DMA_CTLH_BLOCK_TS DMA_CTLH_BLOCK_TS_Msk - -/******************* Bit definition for DMA_CFGL register *******************/ -#define DMA_CFGL_RELOAD_DST_Pos (31U) -#define DMA_CFGL_RELOAD_DST_Len (1U) -#define DMA_CFGL_RELOAD_DST_Msk (0x1U << DMA_CFGL_RELOAD_DST_Pos) -#define DMA_CFGL_RELOAD_DST DMA_CFGL_RELOAD_DST_Msk - -#define DMA_CFGL_RELOAD_SRC_Pos (30U) -#define DMA_CFGL_RELOAD_SRC_Len (1U) -#define DMA_CFGL_RELOAD_SRC_Msk (0x1U << DMA_CFGL_RELOAD_SRC_Pos) -#define DMA_CFGL_RELOAD_SRC DMA_CFGL_RELOAD_SRC_Msk - -#define DMA_CFGL_HS_SEL_SRC_Pos (11U) -#define DMA_CFGL_HS_SEL_SRC_Len (1U) -#define DMA_CFGL_HS_SEL_SRC_Msk (0x1U << DMA_CFGL_HS_SEL_SRC_Pos) -#define DMA_CFGL_HS_SEL_SRC DMA_CFGL_HS_SEL_SRC_Msk - -#define DMA_CFGL_HS_SEL_DST_Pos (10U) -#define DMA_CFGL_HS_SEL_DST_Len (1U) -#define DMA_CFGL_HS_SEL_DST_Msk (0x1U << DMA_CFGL_HS_SEL_DST_Pos) -#define DMA_CFGL_HS_SEL_DST DMA_CFGL_HS_SEL_DST_Msk - -#define DMA_CFGL_FIFO_EMPTY_Pos (9U) -#define DMA_CFGL_FIFO_EMPTY_Len (1U) -#define DMA_CFGL_FIFO_EMPTY_Msk (0x1U << DMA_CFGL_FIFO_EMPTY_Pos) -#define DMA_CFGL_FIFO_EMPTY DMA_CFGL_FIFO_EMPTY_Msk - -#define DMA_CFGL_CH_SUSP_Pos (8U) -#define DMA_CFGL_CH_SUSP_Len (1U) -#define DMA_CFGL_CH_SUSP_Msk (0x1U << DMA_CFGL_CH_SUSP_Pos) -#define DMA_CFGL_CH_SUSP DMA_CFGL_CH_SUSP_Msk - -#define DMA_CFGL_CH_PRIOR_Pos (5U) -#define DMA_CFGL_CH_PRIOR_Len (3U) -#define DMA_CFGL_CH_PRIOR_Msk (0x7U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR DMA_CFGL_CH_PRIOR_Msk -#define DMA_CFGL_CH_PRIOR_0 (0x0U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_1 (0x1U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_2 (0x2U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_3 (0x3U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_4 (0x4U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_5 (0x5U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_6 (0x6U << DMA_CFGL_CH_PRIOR_Pos) -#define DMA_CFGL_CH_PRIOR_7 (0x7U << DMA_CFGL_CH_PRIOR_Pos) - -/******************* Bit definition for DMA_CFGH register ********************/ -#define DMA_CFGH_DST_PER_Pos (11U) -#define DMA_CFGH_DST_PER_Len (4U) -#define DMA_CFGH_DST_PER_Msk (0xFU << DMA_CFGH_DST_PER_Pos) -#define DMA_CFGH_DST_PER DMA_CFGH_DST_PER_Msk - -#define DMA_CFGH_SRC_PER_Pos (7U) -#define DMA_CFGH_SRC_PER_Len (4U) -#define DMA_CFGH_SRC_PER_Msk (0xFU << DMA_CFGH_SRC_PER_Pos) -#define DMA_CFGH_SRC_PER DMA_CFGH_SRC_PER_Msk - -#define DMA_CFGH_PROTCTL_Pos (2U) -#define DMA_CFGH_PROTCTL_Len (3U) -#define DMA_CFGH_PROTCTL_Msk (0x7U << DMA_CFGH_PROTCTL_Pos) -#define DMA_CFGH_PROTCTL DMA_CFGH_PROTCTL_Msk - -#define DMA_CFGH_FIFO_MODE_Pos (2U) -#define DMA_CFGH_FIFO_MODE_Len (1U) -#define DMA_CFGH_FIFO_MODE_Msk (0x1U << DMA_CFGH_FIFO_MODE_Pos) -#define DMA_CFGH_FIFO_MODE DMA_CFGH_FIFO_MODE_Msk - -/******************* Bit definition for DMA_RAW_TFR register *****************/ -#define DMA_RAW_TFR_Pos (0U) -#define DMA_RAW_TFR_Len (8U) -#define DMA_RAW_TFR_Msk (0xFFU << DMA_RAW_TFR_Pos) -#define DMA_RAW_TFR DMA_RAW_TFR_Msk - -/******************* Bit definition for DMA_RAW_BLK register *****************/ -#define DMA_RAW_BLK_Pos (0U) -#define DMA_RAW_BLK_Len (8U) -#define DMA_RAW_BLK_Msk (0xFFU << DMA_RAW_BLK_Pos) -#define DMA_RAW_BLK DMA_RAW_BLK_Msk - -/******************* Bit definition for DMA_RAW_SRC_TRN register *************/ -#define DMA_RAW_SRC_TRN_Pos (0U) -#define DMA_RAW_SRC_TRN_Len (8U) -#define DMA_RAW_SRC_TRN_Msk (0xFFU << DMA_RAW_SRC_TRN_Pos) -#define DMA_RAW_SRC_TRN DMA_RAW_SRC_TRN_Msk - -/******************* Bit definition for DMA_RAW_DST_TRN register *************/ -#define DMA_RAW_DST_TRN_Pos (0U) -#define DMA_RAW_DST_TRN_Len (8U) -#define DMA_RAW_DST_TRN_Msk (0xFFU << DMA_RAW_DST_TRN_Pos) -#define DMA_RAW_DST_TRN DMA_RAW_DST_TRN_Msk - -/******************* Bit definition for DMA_RAW_ERR register *****************/ -#define DMA_RAW_ERR_Pos (0U) -#define DMA_RAW_ERR_Len (8U) -#define DMA_RAW_ERR_Msk (0xFFU << DMA_RAW_ERR_Pos) -#define DMA_RAW_ERR DMA_RAW_ERR_Msk - -/******************* Bit definition for DMA_STAT_TFR register ****************/ -#define DMA_STAT_TFR_Pos (0U) -#define DMA_STAT_TFR_Len (8U) -#define DMA_STAT_TFR_Msk (0xFFUL << DMA_STAT_TFR_Pos) -#define DMA_STAT_TFR DMA_STAT_TFR_Msk - -/******************* Bit definition for DMA_STAT_BLK register ****************/ -#define DMA_STAT_BLK_Pos (0U) -#define DMA_STAT_BLK_Len (8U) -#define DMA_STAT_BLK_Msk (0xFFU << DMA_STAT_BLK_Pos) -#define DMA_STAT_BLK DMA_STAT_BLK_Msk - -/******************* Bit definition for DMA_STAT_SRC_TRN register ************/ -#define DMA_STAT_SRC_TRN_Pos (0U) -#define DMA_STAT_SRC_TRN_Len (8U) -#define DMA_STAT_SRC_TRN_Msk (0xFFU << DMA_STAT_SRC_TRN_Pos) -#define DMA_STAT_SRC_TRN DMA_STAT_SRC_TRN_Msk - -/******************* Bit definition for DMA_STAT_DST_TRN register ************/ -#define DMA_STAT_DST_TRN_Pos (0U) -#define DMA_STAT_DST_TRN_Len (8U) -#define DMA_STAT_DST_TRN_Msk (0xFFU << DMA_STAT_DST_TRN_Pos) -#define DMA_STAT_DST_TRN DMA_STAT_DST_TRN_Msk - -/******************* Bit definition for DMA_STAT_ERR register ****************/ -#define DMA_STAT_ERR_Pos (0U) -#define DMA_STAT_ERR_Len (8U) -#define DMA_STAT_ERR_Msk (0xFFU << DMA_STAT_ERR_Pos) -#define DMA_STAT_ERR DMA_STAT_ERR_Msk - -/******************* Bit definition for DMA_MASK_TFR register ****************/ -#define DMA_MASK_TFR_WE_Pos (8U) -#define DMA_MASK_TFR_WE_Len (8U) -#define DMA_MASK_TFR_WE_Msk (0xFFU << DMA_MASK_TFR_WE_Pos) -#define DMA_MASK_TFR_WE DMA_MASK_TFR_WE_Msk - -#define DMA_MASK_TFR_Pos (0U) -#define DMA_MASK_TFR_Len (8U) -#define DMA_MASK_TFR_Msk (0xFFU << DMA_MASK_TFR_Pos) -#define DMA_MASK_TFR DMA_MASK_TFR_Msk - -/******************* Bit definition for DMA_MASK_BLK register ****************/ -#define DMA_MASK_BLK_WE_Pos (8U) -#define DMA_MASK_BLK_WE_Len (8U) -#define DMA_MASK_BLK_WE_Msk (0xFFU << DMA_MASK_BLK_WE_Pos) -#define DMA_MASK_BLK_WE DMA_MASK_BLK_WE_Msk - -#define DMA_MASK_BLK_Pos (0U) -#define DMA_MASK_BLK_Len (8U) -#define DMA_MASK_BLK_Msk (0xFFU << DMA_MASK_BLK_Pos) -#define DMA_MASK_BLK DMA_MASK_BLK_Msk - -/******************* Bit definition for DMA_MASK_SRC_TRN register ************/ -#define DMA_MASK_SRC_TRN_WE_Pos (8U) -#define DMA_MASK_SRC_TRN_WE_Len (8U) -#define DMA_MASK_SRC_TRN_WE_Msk (0x1U << DMA_MASK_SRC_TRN_WE_Pos) -#define DMA_MASK_SRC_TRN_WE DMA_MASK_SRC_TRN_WE_Msk - -#define DMA_MASK_SRC_TRN_Pos (0U) -#define DMA_MASK_SRC_TRN_Len (8U) -#define DMA_MASK_SRC_TRN_Msk (0xFFU << DMA_MASK_SRC_TRN_Pos) -#define DMA_MASK_SRC_TRN DMA_MASK_SRC_TRN_Msk - -/******************* Bit definition for DMA_MASK_DST_TRN register ************/ -#define DMA_MASK_DST_TRN_WE_Pos (8U) -#define DMA_MASK_DST_TRN_WE_Len (8U) -#define DMA_MASK_DST_TRN_WE_Msk (0xFFU << DMA_MASK_DST_TRN_WE_Pos) -#define DMA_MASK_DST_TRN_WE DMA_MASK_DST_TRN_WE_Msk - -#define DMA_MASK_DST_TRN_Pos (0U) -#define DMA_MASK_DST_TRN_Len (8U) -#define DMA_MASK_DST_TRN_Msk (0xFFU << DMA_MASK_DST_TRN_Pos) -#define DMA_MASK_DST_TRN DMA_MASK_DST_TRN_Msk - -/******************* Bit definition for DMA_MASK_ERR register ****************/ -#define DMA_MASK_ERR_WE_Pos (8U) -#define DMA_MASK_ERR_WE_Len (8U) -#define DMA_MASK_ERR_WE_Msk (0xFFU << DMA_MASK_ERR_WE_Pos) -#define DMA_MASK_ERR_WE DMA_MASK_ERR_WE_Msk - -#define DMA_MASK_ERR_Pos (0U) -#define DMA_MASK_ERR_Len (8U) -#define DMA_MASK_ERR_Msk (0xFFU << DMA_MASK_ERR_Pos) -#define DMA_MASK_ERR DMA_MASK_ERR_Msk - -/******************* Bit definition for DMA_CLR_TFR register *****************/ -#define DMA_CLR_TFR_Pos (0U) -#define DMA_CLR_TFR_Len (8U) -#define DMA_CLR_TFR_Msk (0xFFU << DMA_CLR_TFR_Pos) -#define DMA_CLR_TFR DMA_CLR_TFR_Msk - -/******************* Bit definition for DMA_CLR_BLK register *****************/ -#define DMA_CLR_BLK_Pos (0U) -#define DMA_CLR_BLK_Len (8U) -#define DMA_CLR_BLK_Msk (0xFFU << DMA_CLR_BLK_Pos) -#define DMA_CLR_BLK DMA_CLR_BLK_Msk - -/******************* Bit definition for DMA_CLR_SRC_TRN register *************/ -#define DMA_CLR_SRC_TRN_Pos (0U) -#define DMA_CLR_SRC_TRN_Len (8U) -#define DMA_CLR_SRC_TRN_Msk (0xFFU << DMA_CLR_SRC_TRN_Pos) -#define DMA_CLR_SRC_TRN DMA_CLR_SRC_TRN_Msk - -/******************* Bit definition for DMA_CLR_DST_TRN register *************/ -#define DMA_CLR_DST_TRN_Pos (0U) -#define DMA_CLR_DST_TRN_Len (8U) -#define DMA_CLR_DST_TRN_Msk (0xFFU << DMA_CLR_DST_TRN_Pos) -#define DMA_CLR_DST_TRN DMA_CLR_DST_TRN_Msk - -/******************* Bit definition for DMA_CLR_ERR register *****************/ -#define DMA_CLR_ERR_Pos (0U) -#define DMA_CLR_ERR_Len (8U) -#define DMA_CLR_ERR_Msk (0xFFU << DMA_CLR_ERR_Pos) -#define DMA_CLR_ERR DMA_CLR_ERR_Msk - -/******************* Bit definition for DMA_STATUS_INT register **************/ -#define DMA_STAT_INT_ERR_Pos (4U) -#define DMA_STAT_INT_ERR_Len (1U) -#define DMA_STAT_INT_ERR_Msk (0x1U << DMA_STAT_INT_ERR_Pos) -#define DMA_STAT_INT_ERR DMA_STAT_INT_ERR_Msk - -#define DMA_STAT_INT_DST_Pos (3U) -#define DMA_STAT_INT_DST_Len (1U) -#define DMA_STAT_INT_DST_Msk (0x1U << DMA_STAT_INT_DST_Pos) -#define DMA_STAT_INT_DST DMA_STAT_INT_DST_Msk - -#define DMA_STAT_INT_SRC_Pos (2U) -#define DMA_STAT_INT_SRC_Len (1U) -#define DMA_STAT_INT_SRC_Msk (0x1U << DMA_STAT_INT_SRC_Pos) -#define DMA_STAT_INT_SRC DMA_STAT_INT_SRC_Msk - -#define DMA_STAT_INT_BLK_Pos (1U) -#define DMA_STAT_INT_BLK_Len (1U) -#define DMA_STAT_INT_BLK_Msk (0x1U << DMA_STAT_INT_BLK_Pos) -#define DMA_STAT_INT_BLK DMA_STAT_INT_BLK_Msk - -#define DMA_STAT_INT_TFR_Pos (0U) -#define DMA_STAT_INT_TFR_Len (1U) -#define DMA_STAT_INT_TFR_Msk (0x1U << DMA_STAT_INT_TFR_Pos) -#define DMA_STAT_INT_TFR DMA_STAT_INT_TFR_Msk - -/******************* Bit definition for DMA_REQ_SRC_REG register *************/ -#define DMA_REQ_SRC_WE_Pos (8U) -#define DMA_REQ_SRC_WE_Len (8U) -#define DMA_REQ_SRC_WE_Msk (0xFFU << DMA_REQ_SRC_WE_Pos) -#define DMA_REQ_SRC_WE DMA_REQ_SRC_WE_Msk - -#define DMA_REQ_SRC_Pos (0U) -#define DMA_REQ_SRC_Len (8U) -#define DMA_REQ_SRC_Msk (0xFFU << DMA_REQ_SRC_Pos) -#define DMA_REQ_SRC DMA_REQ_SRC_Msk - -/******************* Bit definition for DMA_REQ_DST_REG register *************/ -#define DMA_REQ_DST_WE_Pos (8U) -#define DMA_REQ_DST_WE_Len (8U) -#define DMA_REQ_DST_WE_Msk (0xFFU << DMA_REQ_DST_WE_Pos) -#define DMA_REQ_DST_WE DMA_REQ_DST_WE_Msk - -#define DMA_REQ_DST_Pos (0U) -#define DMA_REQ_DST_Len (8U) -#define DMA_REQ_DST_Msk (0xFFU << DMA_REQ_DST_Pos) -#define DMA_REQ_DST DMA_REQ_DST_Msk - -/******************* Bit definition for DMA_SGL_REQ_SRC_REG register *********/ -#define DMA_SGL_REQ_SRC_WE_Pos (8U) -#define DMA_SGL_REQ_SRC_WE_Len (8U) -#define DMA_SGL_REQ_SRC_WE_Msk (0xFFU << DMA_SGL_REQ_SRC_WE_Pos) -#define DMA_SGL_REQ_SRC_WE DMA_SGL_REQ_SRC_WE_Msk - -#define DMA_SGL_REQ_SRC_Pos (0U) -#define DMA_SGL_REQ_SRC_Len (8U) -#define DMA_SGL_REQ_SRC_Msk (0xFFU << DMA_SGL_REQ_SRC_Pos) -#define DMA_SGL_REQ_SRC DMA_SGL_REQ_SRC_Msk - -/******************* Bit definition for DMA_SGL_REQ_DST_REG register *********/ -#define DMA_SGL_REQ_DST_WE_Pos (8U) -#define DMA_SGL_REQ_DST_WE_Len (8U) -#define DMA_SGL_REQ_DST_WE_Msk (0xFFU << DMA_SGL_REQ_DST_WE_Pos) -#define DMA_SGL_REQ_DST_WE DMA_SGL_REQ_DST_WE_Msk - -#define DMA_SGL_REQ_DST_Pos (0U) -#define DMA_SGL_REQ_DST_Len (8U) -#define DMA_SGL_REQ_DST_Msk (0xFFU << DMA_SGL_REQ_DST_Pos) -#define DMA_SGL_REQ_DST DMA_SGL_REQ_DST_Msk - -/******************* Bit definition for DMA_LST_SRC_REG register *********/ -#define DMA_LST_SRC_WE_Pos (8U) -#define DMA_LST_SRC_WE_Len (8U) -#define DMA_LST_SRC_WE_Msk (0xFFU << DMA_LST_SRC_WE_Pos) -#define DMA_LST_SRC_WE DMA_LST_SRC_WE_Msk - -#define DMA_LST_SRC_Pos (0U) -#define DMA_LST_SRC_Len (8U) -#define DMA_LST_SRC_Msk (0xFFU << DMA_LST_SRC_Pos) -#define DMA_LST_SRC DMA_LST_SRC_Msk - -/******************* Bit definition for DMA_LST_DST_REG register *********/ -#define DMA_LST_DST_WE_Pos (8U) -#define DMA_LST_DST_WE_Len (8U) -#define DMA_LST_DST_WE_Msk (0xFFU << DMA_LST_DST_WE_Pos) -#define DMA_LST_DST_WE DMA_LST_DST_WE_Msk - -#define DMA_LST_DST_Pos (0U) -#define DMA_LST_DST_Len (8U) -#define DMA_LST_DST_Msk (0xFFU << DMA_LST_DST_Pos) -#define DMA_LST_DST DMA_LST_DST_Msk - -/******************* Bit definition for DMA_CFG_REG register ****************/ -#define DMA_MODULE_CFG_EN_Pos (0U) -#define DMA_MODULE_CFG_EN_Len (1U) -#define DMA_MODULE_CFG_EN_Msk (0x1U << DMA_MODULE_CFG_EN_Pos) -#define DMA_MODULE_CFG_EN DMA_MODULE_CFG_EN_Msk - -/******************* Bit definition for DMA_CH_EN_REG register **************/ -#define DMA_CH_WE_EN_Pos (8U) -#define DMA_CH_WE_EN_Len (8U) -#define DMA_CH_WE_EN_Msk (0xFFU << DMA_CH_WE_EN_Pos) -#define DMA_CH_WE_EN DMA_CH_WE_EN_Msk - -#define DMA_CH_EN_Pos (0U) -#define DMA_CH_EN_Len (8U) -#define DMA_CH_EN_Msk (0xFFU << DMA_CH_EN_Pos) -#define DMA_CH_EN DMA_CH_EN_Msk - - -/* ================================================================================================================= */ -/* ================ DUAL_TIMER ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for DUAL_TIMER_RELOAD register ************/ -#define DUAL_TIMER_RELOAD_RELOAD_Pos (0U) -#define DUAL_TIMER_RELOAD_RELOAD_Len (32U) -#define DUAL_TIMER_RELOAD_RELOAD_Msk (0xFFFFFFFFU) -#define DUAL_TIMER_RELOAD_RELOAD DUAL_TIMER_RELOAD_RELOAD_Msk - -/******************* Bit definition for DUAL_TIMER_VALUE register *************/ -#define DUAL_TIMER_VALUE_VALUE_Pos (0U) -#define DUAL_TIMER_VALUE_VALUE_Len (32U) -#define DUAL_TIMER_VALUE_VALUE_Msk (0xFFFFFFFFU) -#define DUAL_TIMER_VALUE_VALUE DUAL_TIMER_VALUE_VALUE_Msk - -/******************* Bit definition for DUAL_TIMER_CTRL register **************/ -#define DUAL_TIMER_CTRL_EN_Pos (7U) -#define DUAL_TIMER_CTRL_EN_Len (1U) -#define DUAL_TIMER_CTRL_EN_Msk (0x1U << DUAL_TIMER_CTRL_EN_Pos) -#define DUAL_TIMER_CTRL_EN DUAL_TIMER_CTRL_EN_Msk - -#define DUAL_TIMER_CTRL_MODE_Pos (6U) -#define DUAL_TIMER_CTRL_MODE_Len (1U) -#define DUAL_TIMER_CTRL_MODE_Msk (0x1U << DUAL_TIMER_CTRL_MODE_Pos) -#define DUAL_TIMER_CTRL_MODE DUAL_TIMER_CTRL_MODE_Msk - -#define DUAL_TIMER_CTRL_INTEN_Pos (5U) -#define DUAL_TIMER_CTRL_INTEN_Len (1U) -#define DUAL_TIMER_CTRL_INTEN_Msk (0x1U << DUAL_TIMER_CTRL_INTEN_Pos) -#define DUAL_TIMER_CTRL_INTEN DUAL_TIMER_CTRL_INTEN_Msk - -#define DUAL_TIMER_CTRL_PRE_Pos (2U) -#define DUAL_TIMER_CTRL_PRE_Len (2U) -#define DUAL_TIMER_CTRL_PRE_Msk (0x3U << DUAL_TIMER_CTRL_PRE_Pos) -#define DUAL_TIMER_CTRL_PRE DUAL_TIMER_CTRL_PRE_Msk - -#define DUAL_TIMER_CTRL_SIZE_Pos (1U) -#define DUAL_TIMER_CTRL_SIZE_Len (1U) -#define DUAL_TIMER_CTRL_SIZE_Msk (0x1U << DUAL_TIMER_CTRL_SIZE_Pos) -#define DUAL_TIMER_CTRL_SIZE DUAL_TIMER_CTRL_SIZE_Msk - -#define DUAL_TIMER_CTRL_ONESHOT_Pos (0U) -#define DUAL_TIMER_CTRL_ONESHOT_Len (1U) -#define DUAL_TIMER_CTRL_ONESHOT_Msk (0x1U << DUAL_TIMER_CTRL_ONESHOT_Pos) -#define DUAL_TIMER_CTRL_ONESHOT DUAL_TIMER_CTRL_ONESHOT_Msk - -/******************* Bit definition for DUAL_TIMER_INT_CLR register ***********/ -#define DUAL_TIMER_INT_CLR_Pos (0U) -#define DUAL_TIMER_INT_CLR_Len (32U) -#define DUAL_TIMER_INT_CLR_Msk (0xFFFFFFFFU) -#define DUAL_TIMER_INT_CLR DUAL_TIMER_INT_CLR_Msk - -/******************* Bit definition for DUAL_TIMER_RAW_INT_STAT register ******/ -#define DUAL_TIMER_RIS_RTI_Pos (0U) -#define DUAL_TIMER_RIS_RTI_Len (1U) -#define DUAL_TIMER_RIS_RTI_Msk (0x1U << DUAL_TIMER_RIS_RTI_Pos) -#define DUAL_TIMER_RIS_RTI DUAL_TIMER_RIS_RTI_Msk - -/******************* Bit definition for DUAL_TIMER_INT_STAT register **********/ -#define DUAL_TIMER_ISR_TI_Pos (0U) -#define DUAL_TIMER_ISR_TI_Len (1U) -#define DUAL_TIMER_ISR_TI_Msk (0x1U << DUAL_TIMER_ISR_TI_Pos) -#define DUAL_TIMER_ISR_TI DUAL_TIMER_ISR_TI_Msk - -/******************* Bit definition for DUAL_TIMER_BGLOAD register ************/ -#define DUAL_TIMER_BLR_BL_Pos (0U) -#define DUAL_TIMER_BLR_BL_Len (32U) -#define DUAL_TIMER_BLR_BL_Msk (0xFFFFFFFFU) -#define DUAL_TIMER_BLR_BL DUAL_TIMER_BLR_BL_Msk - - -/* ================================================================================================================= */ -/* ================ GPIO ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for GPIO_DATA register ******************/ -#define GPIO_DATA_Pos (0U) -#define GPIO_DATA_Len (16U) -#define GPIO_DATA_Msk (0xFFFFU << GPIO_DATA_Pos) -#define GPIO_DATA GPIO_DATA_Msk /**< Data */ - -/******************* Bit definition for GPIO_DATAOUT register ***************/ -#define GPIO_DATAOUT_Pos (0U) -#define GPIO_DATAOUT_Len (16U) -#define GPIO_DATAOUT_Msk (0xFFFFU << GPIO_DATAOUT_Pos) -#define GPIO_DATAOUT GPIO_DATAOUT_Msk /**< Data Output */ - -/******************* Bit definition for GPIO_OUTENSET register ***************/ -#define GPIO_OUTENSET_Pos (0U) -#define GPIO_OUTENSET_Len (16U) -#define GPIO_OUTENSET_Msk (0xFFFFU << GPIO_OUTENSET_Pos) -#define GPIO_OUTENSET GPIO_OUTENSET_Msk /**< Data Output Enable Set*/ - -/******************* Bit definition for GPIO_OUTENCLR register ***************/ -#define GPIO_OUTENCLR_Pos (0U) -#define GPIO_OUTENCLR_Len (16U) -#define GPIO_OUTENCLR_Msk (0xFFFFU << GPIO_OUTENCLR_Pos) -#define GPIO_OUTENCLR GPIO_OUTENCLR_Msk /**< Data Output Enable Clear */ - -/******************* Bit definition for GPIO_INTENSET register ***************/ -#define GPIO_INTENSET_Pos (0U) -#define GPIO_INTENSET_Len (16U) -#define GPIO_INTENSET_Msk (0xFFFFU << GPIO_INTENSET_Pos) -#define GPIO_INTENSET GPIO_INTENSET_Msk /**< Interrupt Enable Set */ - -/******************* Bit definition for GPIO_INTENCLR register ***************/ -#define GPIO_INTENCLR_Pos (0U) -#define GPIO_INTENCLR_Len (16U) -#define GPIO_INTENCLR_Msk (0xFFFFU << GPIO_INTENCLR_Pos) -#define GPIO_INTENCLR GPIO_INTENCLR_Msk /**< Interrupt Enable clear */ - -/******************* Bit definition for GPIO_INTTYPESET register ***************/ -#define GPIO_INTTYPESET_Pos (0U) -#define GPIO_INTTYPESET_Len (16U) -#define GPIO_INTTYPESET_Msk (0xFFFFU << GPIO_INTTYPESET_Pos) -#define GPIO_INTTYPESET GPIO_INTTYPESET_Msk /**< Interrupt Type Set */ - -/******************* Bit definition for GPIO_INTTYPECLR register ***************/ -#define GPIO_INTTYPECLR_Pos (0U) -#define GPIO_INTTYPECLR_Len (16U) -#define GPIO_INTTYPECLR_Msk (0xFFFFU << GPIO_INTTYPECLR_Pos) -#define GPIO_INTTYPECLR GPIO_INTTYPECLR_Msk /**< Interrupt Type Clear */ - -/******************* Bit definition for GPIO_INTPOLSET register ***************/ -#define GPIO_INTPOLSET_Pos (0U) -#define GPIO_INTPOLSET_Len (16U) -#define GPIO_INTPOLSET_Msk (0xFFFFU << GPIO_INTPOLSET_Pos) -#define GPIO_INTPOLSET GPIO_INTPOLSET_Msk /**< Interrupt Polarity-level Set */ - -/******************* Bit definition for GPIO_INTPOLCLR register ***************/ -#define GPIO_INTPOLCLR_Pos (0U) -#define GPIO_INTPOLCLR_Len (16U) -#define GPIO_INTPOLCLR_Msk (0xFFFFU << GPIO_INTPOLCLR_Pos) -#define GPIO_INTPOLCLR GPIO_INTPOLCLR_Msk /**< Interrupt Polarity-level Clear */ - -/******************* Bit definition for GPIO_INTSTAT register ***************/ -#define GPIO_INTSTAT_Pos (0U) -#define GPIO_INTSTAT_Len (16U) -#define GPIO_INTSTAT_Msk (0xFFFFU << GPIO_INTSTAT_Pos) -#define GPIO_INTSTAT GPIO_INTSTAT_Msk /**< Interrupt Status */ - -/******************* Bit definition for GPIO_MASKLOWBYTE register ***********/ -#define GPIO_MASKLOWBYTE_DATA_Pos (0U) -#define GPIO_MASKLOWBYTE_DATA_Len (8U) -#define GPIO_MASKLOWBYTE_DATA_Msk (0xFFU << GPIO_MASKLOWBYTE_DATA_Pos) -#define GPIO_MASKLOWBYTE_DATA GPIO_MASKLOWBYTE_DATA_Msk /**< Lower 8 bits masked access */ - -/******************* Bit definition for GPIO_MASKLOWBYTE register ***********/ -#define GPIO_MASKHIGHBYTE_DATA_Pos (8U) -#define GPIO_MASKHIGHBYTE_DATA_Len (8U) -#define GPIO_MASKHIGHBYTE_DATA_Msk (0xFFU << GPIO_MASKHIGHBYTE_DATA_Pos) -#define GPIO_MASKHIGHBYTE_DATA GPIO_MASKHIGHBYTE_DATA /**< Higher 8 bits masked access */ - - -/* ================================================================================================================= */ -/* ================ HMAC ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for HMAC_CTRL register ******************/ -#define HMAC_CTRL_ENABLE_Pos (0U) -#define HMAC_CTRL_ENABLE_Len (1U) -#define HMAC_CTRL_ENABLE_Msk (1U << HMAC_CTRL_ENABLE_Pos) -#define HMAC_CTRL_ENABLE HMAC_CTRL_ENABLE_Msk - -#define HMAC_CTRL_START_DMA_Pos (1U) -#define HMAC_CTRL_START_DMA_Len (1U) -#define HMAC_CTRL_START_DMA_Msk (1U << HMAC_CTRL_START_DMA_Pos) -#define HMAC_CTRL_START_DMA HMAC_CTRL_START_DMA_Msk - -#define HMAC_CTRL_ENABLE_RKEY_Pos (2U) -#define HMAC_CTRL_ENABLE_RKEY_Len (1U) -#define HMAC_CTRL_ENABLE_RKEY_Msk (1U << HMAC_CTRL_ENABLE_RKEY_Pos) -#define HMAC_CTRL_ENABLE_RKEY HMAC_CTRL_ENABLE_RKEY_Msk - -#define HMAC_CTRL_LASTTRANSFER_Pos (3U) -#define HMAC_CTRL_LASTTRANSFER_Len (1U) -#define HMAC_CTRL_LASTTRANSFER_Msk (1U << HMAC_CTRL_LASTTRANSFER_Pos) -#define HMAC_CTRL_LASTTRANSFER HMAC_CTRL_LASTTRANSFER_Msk - -/******************* Bit definition for HMAC_CONFIG register ****************/ -#define HMAC_CONFIG_ENABLE_USERHASH_Pos (0U) -#define HMAC_CONFIG_ENABLE_USERHASH_Len (1U) -#define HMAC_CONFIG_ENABLE_USERHASH_Msk (1U << HMAC_CONFIG_ENABLE_USERHASH_Pos) -#define HMAC_CONFIG_ENABLE_USERHASH HMAC_CONFIG_ENABLE_USERHASH_Msk - -#define HMAC_CONFIG_ENDIAN_Pos (1U) -#define HMAC_CONFIG_ENDIAN_Len (1U) -#define HMAC_CONFIG_ENDIAN_Msk (1U << HMAC_CONFIG_ENDIAN_Pos) -#define HMAC_CONFIG_ENDIAN HMAC_CONFIG_ENDIAN_Msk - -#define HMAC_CONFIG_KEYTYPE_Pos (2U) -#define HMAC_CONFIG_KEYTYPE_Len (2U) -#define HMAC_CONFIG_KEYTYPE_Msk (3U << HMAC_CONFIG_KEYTYPE_Pos) -#define HMAC_CONFIG_KEYTYPE HMAC_CONFIG_KEYTYPE_Msk - -#define HMAC_CONFIG_CALCTYPE_Pos (4U) -#define HMAC_CONFIG_CALCTYPE_Len (1U) -#define HMAC_CONFIG_CALCTYPE_Msk (1U << HMAC_CONFIG_CALCTYPE_Pos) -#define HMAC_CONFIG_CALCTYPE HMAC_CONFIG_CALCTYPE_Msk - -#define HMAC_CONFIG_PRIVATE_Pos (5U) -#define HMAC_CONFIG_PRIVATE_Len (1U) -#define HMAC_CONFIG_PRIVATE_Msk (1U << HMAC_CONFIG_PRIVATE_Pos) -#define HMAC_CONFIG_PRIVATE HMAC_CONFIG_PRIVATE_Msk - -/******************* Bit definition for HMAC_STATUS register ****************/ -#define HMAC_STATUS_DATAREADY_SHA_Pos (0U) -#define HMAC_STATUS_DATAREADY_SHA_Len (1U) -#define HMAC_STATUS_DATAREADY_SHA_Msk (1U << HMAC_STATUS_DATAREADY_SHA_Pos) -#define HMAC_STATUS_DATAREADY_SHA HMAC_STATUS_DATAREADY_SHA_Msk - -#define HMAC_STATUS_MESSAGEDONE_DMA_Pos (1U) -#define HMAC_STATUS_MESSAGEDONE_DMA_Len (1U) -#define HMAC_STATUS_MESSAGEDONE_DMA_Msk (1U << HMAC_STATUS_MESSAGEDONE_DMA_Pos) -#define HMAC_STATUS_MESSAGEDONE_DMA HMAC_STATUS_MESSAGEDONE_DMA_Msk - -#define HMAC_STATUS_TRANSERR_DMA_Pos (2U) -#define HMAC_STATUS_TRANSERR_DMA_Len (1U) -#define HMAC_STATUS_TRANSERR_DMA_Msk (1U << HMAC_STATUS_TRANSERR_DMA_Pos) -#define HMAC_STATUS_TRANSERR_DMA HMAC_STATUS_TRANSERR_DMA_Msk - -#define HMAC_STATUS_KEYVALID_Pos (3U) -#define HMAC_STATUS_KEYVALID_Len (1U) -#define HMAC_STATUS_KEYVALID_Msk (1U << HMAC_STATUS_KEYVALID_Pos) -#define HMAC_STATUS_KEYVALID HMAC_STATUS_KEYVALID_Msk - -#define HMAC_STATUS_DATAREADY_HMAC_Pos (4U) -#define HMAC_STATUS_DATAREADY_HMAC_Len (1U) -#define HMAC_STATUS_DATAREADY_HMAC_Msk (1U << HMAC_STATUS_DATAREADY_HMAC_Pos) -#define HMAC_STATUS_DATAREADY_HMAC HMAC_STATUS_DATAREADY_HMAC_Msk - -#define HMAC_STATUS_TRANSDONE_DMA_Pos (5U) -#define HMAC_STATUS_TRANSDONE_DMA_Len (1U) -#define HMAC_STATUS_TRANSDONE_DMA_Msk (1U << HMAC_STATUS_TRANSDONE_DMA_Pos) -#define HMAC_STATUS_TRANSDONE_DMA HMAC_STATUS_TRANSDONE_DMA_Msk - -/******************* Bit definition for HMAC_TRAN_SIZE register *************/ -#define HMAC_TRANSIZE_Pos (0U) -#define HMAC_TRANSIZE_Len (15U) -#define HMAC_TRANSIZE_Msk (0x7FFFU << HMAC_TRANSIZE_Pos) -#define HMAC_TRANSIZE HMAC_TRANSIZE_Msk - -/******************* Bit definition for HMAC_INTERRUPT register *************/ -#define HMAC_INTERRUPT_DONE_Pos (0U) -#define HMAC_INTERRUPT_DONE_Len (1U) -#define HMAC_INTERRUPT_DONE_Msk (1U << HMAC_INTERRUPT_DONE_Pos) -#define HMAC_INTERRUPT_DONE HMAC_INTERRUPT_DONE_Msk - -#define HMAC_INTERRUPT_ENABLE_Pos (1U) -#define HMAC_INTERRUPT_ENABLE_Len (1U) -#define HMAC_INTERRUPT_ENABLE_Msk (1U << HMAC_INTERRUPT_ENABLE_Pos) -#define HMAC_INTERRUPT_ENABLE HMAC_INTERRUPT_ENABLE_Msk - -/******************* Bit definition for HMAC_RSTART_ADDR register ***********/ -#define HMAC_RSTART_ADDR_Pos (0U) -#define HMAC_RSTART_ADDR_Len (32U) -#define HMAC_RSTART_ADDR_Msk (0xFFFFFFFFU << HMAC_RSTART_ADDR_Pos) -#define HMAC_RSTART_ADDR HMAC_RSTART_ADDR_Msk - -/******************* Bit definition for HMAC_WSTART_ADDR register ***********/ -#define HMAC_WSTART_ADDR_Pos (0U) -#define HMAC_WSTART_ADDR_Len (32U) -#define HMAC_WSTART_ADDR_Msk (0xFFFFFFFFU << HMAC_WSTART_ADDR_Pos) -#define HMAC_WSTART_ADDR HMAC_WSTART_ADDR_Msk - -/******************* Bit definition for HMAC_USER_HASH register *************/ -#define HMAC_USERHASH_Pos (0U) -#define HMAC_USERHASH_Len (32U) -#define HMAC_USERHASH_Msk (0xFFFFFFFFU << HMAC_USERHASH_Pos) -#define HMAC_USERHASH HMAC_USERHASH_Msk - -/******************* Bit definition for HMAC_FIFO_OUT register **************/ -#define HMAC_FIFO_OUT_Pos (0U) -#define HMAC_FIFO_OUT_Len (32U) -#define HMAC_FIFO_OUT_Msk (0xFFFFFFFFU << HMAC_FIFO_OUT_Pos) -#define HMAC_FIFO_OUT HMAC_FIFO_OUT_Msk - -/******************* Bit definition for HMAC_MESSAGE_FIFO register **********/ -#define HMAC_FIFO_MESSAGE_Pos (0U) -#define HMAC_FIFO_MESSAGE_Len (32U) -#define HMAC_FIFO_MESSAGE_Msk (0xFFFFFFFFU << HMAC_FIFO_MESSAGE_Pos) -#define HMAC_FIFO_MESSAGE HMAC_FIFO_MESSAGE_Msk - -/******************* Bit definition for HMAC_KEY register *******************/ -#define HMAC_KEY_Pos (0U) -#define HMAC_KEY_Len (32U) -#define HMAC_KEY_Msk (0xFFFFFFFFU << HMAC_KEY_Pos) -#define HMAC_KEY HMAC_KEY_Msk - -/******************* Bit definition for HMAC_KEY_ADDR register **************/ -#define HMAC_KEY_ADDR_Pos (0U) -#define HMAC_KEY_ADDR_Len (32U) -#define HMAC_KEY_ADDR_Msk (0xFFFFFFFFU << HMAC_KEY_ADDR_Pos) -#define HMAC_KEY_ADDR HMAC_KEY_ADDR_Msk - -/******************* Bit definition for HMAC_KPORT_MASK register ************/ -#define HMAC_KPORT_MASK_Pos (0U) -#define HMAC_KPORT_MASK_Len (32U) -#define HMAC_KPORT_MASK_Msk (0xFFFFFFFFU << HMAC_KPORT_MASK_Pos) -#define HMAC_KPORT_MASK HMAC_KPORT_MASK_Msk - - -/* ================================================================================================================= */ -/* ================ I2C ================ */ -/* ================================================================================================================= */ -#define I2C_TXFIFO_SIZE (8U) -#define I2C_RXFIFO_SIZE (8U) - -/******************* Bit definition for IC_CON register *********************/ -#define I2C_CON_BUS_CLR_FEATURE_CTRL_Pos (11U) -#define I2C_CON_BUS_CLR_FEATURE_CTRL_Len (1U) -#define I2C_CON_BUS_CLR_FEATURE_CTRL_Msk (0x1U << I2C_CON_BUS_CLR_FEATURE_CTRL_Pos) -#define I2C_CON_BUS_CLR_FEATURE_CTRL I2C_CON_BUS_CLR_FEATURE_CTRL_Msk - -#define I2C_CON_STOP_DET_IF_MASTER_ACTIVE_Pos (10U) -#define I2C_CON_STOP_DET_IF_MASTER_ACTIVE_Len (1U) -#define I2C_CON_STOP_DET_IF_MASTER_ACTIVE_Msk (0x1U << I2C_CON_STOP_DET_IF_MASTER_ACTIVE_Pos) -#define I2C_CON_STOP_DET_IF_MASTER_ACTIVE I2C_CON_STOP_DET_IF_MASTER_ACTIVE_Msk - -#define I2C_CON_RX_FIFO_FULL_HLD_CTRL_Pos (9U) -#define I2C_CON_RX_FIFO_FULL_HLD_CTRL_Len (1U) -#define I2C_CON_RX_FIFO_FULL_HLD_CTRL_Msk (0x1U << I2C_CON_RX_FIFO_FULL_HLD_CTRL_Pos) -#define I2C_CON_RX_FIFO_FULL_HLD_CTRL I2C_CON_RX_FIFO_FULL_HLD_CTRL_Msk - -#define I2C_CON_TX_EMPTY_CTRL_Pos (8U) -#define I2C_CON_TX_EMPTY_CTRL_Len (1U) -#define I2C_CON_TX_EMPTY_CTRL_Msk (0x1U << I2C_CON_TX_EMPTY_CTRL_Pos) -#define I2C_CON_TX_EMPTY_CTRL I2C_CON_TX_EMPTY_CTRL_Msk - -#define I2C_CON_STOP_DET_IF_ADDRESSED_Pos (7U) -#define I2C_CON_STOP_DET_IF_ADDRESSED_Len (1U) -#define I2C_CON_STOP_DET_IF_ADDRESSED_Msk (0x1U << I2C_CON_STOP_DET_IF_ADDRESSED_Pos) -#define I2C_CON_STOP_DET_IF_ADDRESSED I2C_CON_STOP_DET_IF_ADDRESSED_Msk - -#define I2C_CON_SLV_DIS_Pos (6U) -#define I2C_CON_SLV_DIS_Len (1U) -#define I2C_CON_SLV_DIS_Msk (0x1U << I2C_CON_SLV_DIS_Pos) -#define I2C_CON_SLV_DIS I2C_CON_SLV_DIS_Msk - -#define I2C_CON_RESTART_EN_Pos (5U) -#define I2C_CON_RESTART_EN_Len (1U) -#define I2C_CON_RESTART_EN_Msk (0x1U << I2C_CON_RESTART_EN_Pos) -#define I2C_CON_RESTART_EN I2C_CON_RESTART_EN_Msk - -#define I2C_CON_10BITADDR_MST_Pos (4U) -#define I2C_CON_10BITADDR_MST_Len (1U) -#define I2C_CON_10BITADDR_MST_Msk (0x1U << I2C_CON_10BITADDR_MST_Pos) -#define I2C_CON_10BITADDR_MST I2C_CON_10BITADDR_MST_Msk - -#define I2C_CON_10BITADDR_SLV_Pos (3U) -#define I2C_CON_10BITADDR_SLV_Len (1U) -#define I2C_CON_10BITADDR_SLV_Msk (0x1U << I2C_CON_10BITADDR_SLV_Pos) -#define I2C_CON_10BITADDR_SLV I2C_CON_10BITADDR_SLV_Msk - -#define I2C_CON_SPEED_Pos (1U) -#define I2C_CON_SPEED_Len (2U) -#define I2C_CON_SPEED_Msk (0x3U << I2C_CON_SPEED_Pos) -#define I2C_CON_SPEED I2C_CON_SPEED_Msk -#define I2C_CON_SPEED_STANDARD (0x1U << I2C_CON_SPEED_Pos) -#define I2C_CON_SPEED_FAST (0x2U << I2C_CON_SPEED_Pos) -#define I2C_CON_SPEED_HIGH (0x3U << I2C_CON_SPEED_Pos) - -#define I2C_CON_MST_MODE_Pos (0U) -#define I2C_CON_MST_MODE_Len (1U) -#define I2C_CON_MST_MODE_Msk (0x1U << I2C_CON_MST_MODE_Pos) -#define I2C_CON_MST_MODE I2C_CON_MST_MODE_Msk - -/******************* Bit definition for IC_TAR register *********************/ -#define I2C_TAR_SPECIAL_Pos (11U) -#define I2C_TAR_SPECIAL_Len (1U) -#define I2C_TAR_SPECIAL_Msk (0x1U << I2C_TAR_SPECIAL_Pos) -#define I2C_TAR_SPECIAL I2C_TAR_SPECIAL_Msk - -#define I2C_TAR_GC_OR_START_Pos (10U) -#define I2C_TAR_GC_OR_START_Len (1U) -#define I2C_TAR_GC_OR_START_Msk (0x0U << I2C_TAR_GC_OR_START_Pos) -#define I2C_TAR_GC_OR_START I2C_TAR_GC_OR_START_Msk - -#define I2C_TAR_ADDR_Pos (0U) -#define I2C_TAR_ADDR_Len (10U) -#define I2C_TAR_ADDR_Msk (0x3FFU << I2C_TAR_ADDR_Pos) -#define I2C_TAR_ADDR I2C_TAR_ADDR_Msk -#define I2C_TAR_ADDR_7BIT (0x07FU << I2C_TAR_ADDR_Pos) -#define I2C_TAR_ADDR_10BIT (0x3FFU << I2C_TAR_ADDR_Pos) - -/******************* Bit definition for IC_SAR register *********************/ -#define I2C_SAR_ADDR_Pos (0U) -#define I2C_SAR_ADDR_Len (10U) -#define I2C_SAR_ADDR_Msk (0x3FFU << I2C_SAR_ADDR_Pos) -#define I2C_SAR_ADDR_7BIT (0x07FU << I2C_SAR_ADDR_Pos) -#define I2C_SAR_ADDR_10BIT (0x3FFU << I2C_SAR_ADDR_Pos) - -/******************* Bit definition for IC_HS_MADDR register ****************/ -#define I2C_HS_MADDR_HS_MAR_Pos (0U) -#define I2C_HS_MADDR_HS_MAR_Len (3U) -#define I2C_HS_MADDR_HS_MAR_Msk (0x7U << I2C_HS_MADDR_HS_MAR_Pos) -#define I2C_HS_MADDR_HS_MAR I2C_HS_MADDR_HS_MAR_Msk - -/******************* Bit definition for IC_DATA_CMD register ****************/ -#define I2C_DATA_CMD_RESTART_Pos (10U) -#define I2C_DATA_CMD_RESTART_Len (1U) -#define I2C_DATA_CMD_RESTART_Msk (0x1U << I2C_DATA_CMD_RESTART_Pos) -#define I2C_DATA_CMD_RESTART I2C_DATA_CMD_RESTART_Msk - -#define I2C_DATA_CMD_STOP_Pos (9U) -#define I2C_DATA_CMD_STOP_Len (1U) -#define I2C_DATA_CMD_STOP_Msk (0x1U << I2C_DATA_CMD_STOP_Pos) -#define I2C_DATA_CMD_STOP I2C_DATA_CMD_STOP_Msk - -#define I2C_DATA_CMD_CMD_Pos (8U) -#define I2C_DATA_CMD_CMD_Len (1U) -#define I2C_DATA_CMD_CMD_Msk (0x1U << I2C_DATA_CMD_CMD_Pos) -#define I2C_DATA_CMD_CMD I2C_DATA_CMD_CMD_Msk - -#define I2C_DATA_CMD_DAT_Pos (0U) -#define I2C_DATA_CMD_DAT_Len (8U) -#define I2C_DATA_CMD_DAT_Msk (0xFFU << I2C_DATA_CMD_DAT_Pos) -#define I2C_DATA_CMD_DAT I2C_DATA_CMD_DAT_Msk - -/******************* Bit definition for IC_SS_SCL_HCNT register *************/ -#define I2C_SS_SCL_HCNT_Pos (0U) -#define I2C_SS_SCL_HCNT_Len (16U) -#define I2C_SS_SCL_HCNT_Msk (0xFFFFU << I2C_SS_SCL_HCNT_Pos) -#define I2C_SS_SCL_HCNT I2C_SS_SCL_HCNT_Msk - -/******************* Bit definition for IC_SS_SCL_LCNT register *************/ -#define I2C_SS_SCL_LCNT_Pos (0U) -#define I2C_SS_SCL_LCNT_Len (16U) -#define I2C_SS_SCL_LCNT_Msk (0xFFFFU << I2C_SS_SCL_LCNT_Pos) -#define I2C_SS_SCL_LCNT I2C_SS_SCL_LCNT_Msk - -/******************* Bit definition for IC_FS_SCL_HCNT register *************/ -#define I2C_FS_SCL_HCNT_Pos (0U) -#define I2C_FS_SCL_HCNT_Len (16U) -#define I2C_FS_SCL_HCNT_Msk (0xFFFFU << I2C_FS_SCL_HCNT_Pos) -#define I2C_FS_SCL_HCNT I2C_FS_SCL_HCNT_Msk - -/******************* Bit definition for IC_FS_SCL_LCNT register *************/ -#define I2C_FS_SCL_LCNT_Pos (0U) -#define I2C_FS_SCL_LCNT_Len (16U) -#define I2C_FS_SCL_LCNT_Msk (0xFFFFU << I2C_FS_SCL_LCNT_Pos) -#define I2C_FS_SCL_LCNT I2C_FS_SCL_LCNT_Msk - -/******************* Bit definition for IC_HS_SCL_HCNT register *************/ -#define I2C_HS_SCL_HCNT_Pos (0U) -#define I2C_HS_SCL_HCNT_Len (16U) -#define I2C_HS_SCL_HCNT_Msk (0xFFFFU << I2C_HS_SCL_HCNT_Pos) -#define I2C_HS_SCL_HCNT I2C_HS_SCL_HCNT_Msk - -/******************* Bit definition for IC_HS_SCL_LCNT register *************/ -#define I2C_HS_SCL_LCNT_Pos (0U) -#define I2C_HS_SCL_LCNT_Len (16U) -#define I2C_HS_SCL_LCNT_Msk (0xFFFFU << I2C_HS_SCL_LCNT_Pos) -#define I2C_HS_SCL_LCNT I2C_HS_SCL_LCNT_Msk - -/** Bit definition for IC_INTR_STAT/IC_INTR_MASK/IC_RAW_INTR_STAT register **/ -#define I2C_INTR_ALL (0x3FFFU) - -#define I2C_INTR_MST_ON_HOLD_Pos (13U) -#define I2C_INTR_MST_ON_HOLD_Len (1U) -#define I2C_INTR_MST_ON_HOLD_Msk (0x1U << I2C_INTR_MST_ON_HOLD_Pos) -#define I2C_INTR_MST_ON_HOLD I2C_INTR_MST_ON_HOLD_Msk - -#define I2C_INTR_RESTART_DET_Pos (12U) -#define I2C_INTR_RESTART_DET_Len (1U) -#define I2C_INTR_RESTART_DET_Msk (0x1U << I2C_INTR_RESTART_DET_Pos) -#define I2C_INTR_RESTART_DET I2C_INTR_RESTART_DET_Msk - -#define I2C_INTR_GEN_CALL_Pos (11U) -#define I2C_INTR_GEN_CALL_Len (1U) -#define I2C_INTR_GEN_CALL_Msk (0x1U << I2C_INTR_GEN_CALL_Pos) -#define I2C_INTR_GEN_CALL I2C_INTR_GEN_CALL_Msk - -#define I2C_INTR_START_DET_Pos (10U) -#define I2C_INTR_START_DET_Len (1U) -#define I2C_INTR_START_DET_Msk (0x1U << I2C_INTR_START_DET_Pos) -#define I2C_INTR_START_DET I2C_INTR_START_DET_Msk - -#define I2C_INTR_STOP_DET_Pos (9U) -#define I2C_INTR_STOP_DET_Len (1U) -#define I2C_INTR_STOP_DET_Msk (0x1U << I2C_INTR_STOP_DET_Pos) -#define I2C_INTR_STOP_DET I2C_INTR_STOP_DET_Msk - -#define I2C_INTR_ENABLE_Pos (8U) -#define I2C_INTR_ENABLE_Len (1U) -#define I2C_INTR_ENABLE_Msk (0x1U << I2C_INTR_ENABLE_Pos) -#define I2C_INTR_ENABLE I2C_INTR_ENABLE_Msk - -#define I2C_INTR_RX_DONE_Pos (7U) -#define I2C_INTR_RX_DONE_Len (1U) -#define I2C_INTR_RX_DONE_Msk (0x1U << I2C_INTR_RX_DONE_Pos) -#define I2C_INTR_RX_DONE I2C_INTR_RX_DONE_Msk - -#define I2C_INTR_TX_ABRT_Pos (6U) -#define I2C_INTR_TX_ABRT_Len (1U) -#define I2C_INTR_TX_ABRT_Msk (0x1U << I2C_INTR_TX_ABRT_Pos) -#define I2C_INTR_TX_ABRT I2C_INTR_TX_ABRT_Msk - -#define I2C_INTR_RD_REQ_Pos (5U) -#define I2C_INTR_RD_REQ_Len (1U) -#define I2C_INTR_RD_REQ_Msk (0x1U << I2C_INTR_RD_REQ_Pos) -#define I2C_INTR_RD_REQ I2C_INTR_RD_REQ_Msk - -#define I2C_INTR_TX_EMPTY_Pos (4U) -#define I2C_INTR_TX_EMPTY_Len (1U) -#define I2C_INTR_TX_EMPTY_Msk (0x1U << I2C_INTR_TX_EMPTY_Pos) -#define I2C_INTR_TX_EMPTY I2C_INTR_TX_EMPTY_Msk - -#define I2C_INTR_TX_OVER_Pos (3U) -#define I2C_INTR_TX_OVER_Len (1U) -#define I2C_INTR_TX_OVER_Msk (0x1U << I2C_INTR_TX_OVER_Pos) -#define I2C_INTR_TX_OVER I2C_INTR_TX_OVER_Msk - -#define I2C_INTR_RX_FULL_Pos (2U) -#define I2C_INTR_RX_FULL_Len (1U) -#define I2C_INTR_RX_FULL_Msk (0x1U << I2C_INTR_RX_FULL_Pos) -#define I2C_INTR_RX_FULL I2C_INTR_RX_FULL_Msk - -#define I2C_INTR_RX_OVER_Pos (1U) -#define I2C_INTR_RX_OVER_Len (1U) -#define I2C_INTR_RX_OVER_Msk (0x1U << I2C_INTR_RX_OVER_Pos) -#define I2C_INTR_RX_OVER I2C_INTR_RX_OVER_Msk - -#define I2C_INTR_RX_UNDER_Pos (0U) -#define I2C_INTR_RX_UNDER_Len (1U) -#define I2C_INTR_RX_UNDER_Msk (0x1U << I2C_INTR_RX_UNDER_Pos) -#define I2C_INTR_RX_UNDER I2C_INTR_RX_UNDER_Msk - -/******************* Bit definition for IC_RX_TL register *******************/ -#define I2C_RX_TL_RXTL_Pos (0U) -#define I2C_RX_TL_RXTL_Len (8U) -#define I2C_RX_TL_RXTL_Msk (0xFFU << I2C_RX_TL_RXTL_Pos) -#define I2C_RX_TL_RXTL I2C_RX_TL_RXTL_Msk - -/******************* Bit definition for IC_TX_TL register *******************/ -#define I2C_TX_TL_TXTL_Pos (0U) -#define I2C_TX_TL_TXTL_Len (8U) -#define I2C_TX_TL_TXTL_Msk (0xFFU << I2C_TX_TL_TXTL_Pos) -#define I2C_TX_TL_TXTL I2C_TX_TL_TXTL_Msk - -/******************* Bit definition for IC_ENABLE register ******************/ -#define I2C_ENABLE_ABORT_Pos (1U) -#define I2C_ENABLE_ABORT_Len (1U) -#define I2C_ENABLE_ABORT_Msk (0x1U << I2C_ENABLE_ABORT_Pos) -#define I2C_ENABLE_ABORT I2C_ENABLE_ABORT_Msk - -#define I2C_ENABLE_ENABLE_Pos (0U) -#define I2C_ENABLE_ENABLE_Len (1U) -#define I2C_ENABLE_ENABLE_Msk (0x1U << I2C_ENABLE_ENABLE_Pos) -#define I2C_ENABLE_ENABLE I2C_ENABLE_ENABLE_Msk - -/******************* Bit definition for IC_STATUS register ******************/ -#define I2C_STATUS_SLV_ENABLE_Pos (6U) -#define I2C_STATUS_SLV_ENABLE_Len (1U) -#define I2C_STATUS_SLV_ENABLE_Msk (0x1U << I2C_STATUS_SLV_ENABLE_Pos) -#define I2C_STATUS_SLV_ENABLE I2C_STATUS_SLV_ENABLE_Msk - -#define I2C_STATUS_MST_ENABLE_Pos (5U) -#define I2C_STATUS_MST_ENABLE_Len (1U) -#define I2C_STATUS_MST_ENABLE_Msk (0x1U << I2C_STATUS_MST_ENABLE_Pos) -#define I2C_STATUS_MST_ENABLE I2C_STATUS_MST_ENABLE_Msk - -#define I2C_STATUS_RFF_Pos (4U) -#define I2C_STATUS_RFF_Len (1U) -#define I2C_STATUS_RFF_Msk (0x1U << I2C_STATUS_RFF_Pos) -#define I2C_STATUS_RFF I2C_STATUS_RFF_Msk - -#define I2C_STATUS_RFNE_Pos (3U) -#define I2C_STATUS_RFNE_Len (1U) -#define I2C_STATUS_RFNE_Msk (0x1U << I2C_STATUS_RFNE_Pos) -#define I2C_STATUS_RFNE I2C_STATUS_RFNE_Msk - -#define I2C_STATUS_TFE_Pos (2U) -#define I2C_STATUS_TFE_Len (1U) -#define I2C_STATUS_TFE_Msk (0x1U << I2C_STATUS_TFE_Pos) -#define I2C_STATUS_TFE I2C_STATUS_TFE_Msk - -#define I2C_STATUS_TFNF_Pos (1U) -#define I2C_STATUS_TFNF_Len (1U) -#define I2C_STATUS_TFNF_Msk (0x1U << I2C_STATUS_TFNF_Pos) -#define I2C_STATUS_TFNF I2C_STATUS_TFNF_Msk - -#define I2C_STATUS_ENABLE_Pos (0U) -#define I2C_STATUS_ENABLE_Len (1U) -#define I2C_STATUS_ENABLE_Msk (0x1U << I2C_STATUS_ENABLE_Pos) -#define I2C_STATUS_ENABLE I2C_STATUS_ENABLE_Msk - -/******************* Bit definition for IC_RXFLR register *******************/ -#define I2C_RXFLR_RXFLR_Pos (0U) -#define I2C_RXFLR_RXFLR_Len (8U) -#define I2C_RXFLR_RXFLR_Msk (0xFFU << I2C_RXFLR_RXFLR_Pos) -#define I2C_RXFLR_RXFLR I2C_RXFLR_RXFLR_Msk - -/******************* Bit definition for IC_TXFLR register *******************/ -#define I2C_TXFLR_TXFLR_Pos (0U) -#define I2C_TXFLR_TXFLR_Len (8U) -#define I2C_TXFLR_TXFLR_Msk (0xFFU << I2C_TXFLR_TXFLR_Pos) -#define I2C_TXFLR_TXFLR I2C_TXFLR_TXFLR_Msk - -/******************* Bit definition for IC_SDA_HOLD register *******************/ -#define I2C_SDA_HOLD_RX_HOLD_Pos (16U) -#define I2C_SDA_HOLD_RX_HOLD_Len (16U) -#define I2C_SDA_HOLD_RX_HOLD_Msk (0xFFFFU << I2C_SDA_HOLD_RX_HOLD_Pos) -#define I2C_SDA_HOLD_RX_HOLD I2C_SDA_HOLD_RX_HOLD_Msk - -#define I2C_SDA_HOLD_TX_HOLD_Pos (0U) -#define I2C_SDA_HOLD_TX_HOLD_Len (16U) -#define I2C_SDA_HOLD_TX_HOLD_Msk (0xFFFFU << I2C_SDA_HOLD_TX_HOLD_Pos) -#define I2C_SDA_HOLD_TX_HOLD I2C_SDA_HOLD_TX_HOLD_Msk - -/******************* Bit definition for IC_TX_ABRT_SOURCE register **********/ -#define I2C_TX_ABRT_SRC_TX_FLUSH_CNT_Pos (23U) -#define I2C_TX_ABRT_SRC_TX_FLUSH_CNT_Len (9U) -#define I2C_TX_ABRT_SRC_TX_FLUSH_CNT_Msk (0x1FFU << I2C_TX_ABRT_SRC_TX_FLUSH_CNT_Pos) -#define I2C_TX_ABRT_SRC_TX_FLUSH_CNT I2C_TX_ABRT_SRC_TX_FLUSH_CNT_Msk - -#define I2C_TX_ABRT_SRC_USER_ABRT_Pos (16U) -#define I2C_TX_ABRT_SRC_USER_ABRT_Len (1U) -#define I2C_TX_ABRT_SRC_USER_ABRT_Msk (0x1U << I2C_TX_ABRT_SRC_USER_ABRT_Pos) -#define I2C_TX_ABRT_SRC_USER_ABRT I2C_TX_ABRT_SRC_USER_ABRT_Msk - -#define I2C_TX_ABRT_SRC_SLVRD_INTX_Pos (15U) -#define I2C_TX_ABRT_SRC_SLVRD_INTX_Len (1U) -#define I2C_TX_ABRT_SRC_SLVRD_INTX_Msk (0x1U << I2C_TX_ABRT_SRC_SLVRD_INTX_Pos) -#define I2C_TX_ABRT_SRC_SLVRD_INTX I2C_TX_ABRT_SRC_SLVRD_INTX_Msk - -#define I2C_TX_ABRT_SRC_SLV_ARBLOST_Pos (14U) -#define I2C_TX_ABRT_SRC_SLV_ARBLOST_Len (1U) -#define I2C_TX_ABRT_SRC_SLV_ARBLOST_Msk (0x1U << I2C_TX_ABRT_SRC_SLV_ARBLOST_Pos) -#define I2C_TX_ABRT_SRC_SLV_ARBLOST I2C_TX_ABRT_SRC_SLV_ARBLOST_Msk - -#define I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO_Pos (13U) -#define I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO_Len (1U) -#define I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO_Msk (0x1U << I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO_Pos) -#define I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO I2C_TX_ABRT_SRC_SLVFLUSH_TXFIFO_Msk - -#define I2C_TX_ABRT_SRC_ARB_LOST_Pos (12U) -#define I2C_TX_ABRT_SRC_ARB_LOST_Len (1U) -#define I2C_TX_ABRT_SRC_ARB_LOST_Msk (0x1U << I2C_TX_ABRT_SRC_ARB_LOST_Pos) -#define I2C_TX_ABRT_SRC_ARB_LOST I2C_TX_ABRT_SRC_ARB_LOST_Msk - -#define I2C_TX_ABRT_SRC_MST_DIS_Pos (11U) -#define I2C_TX_ABRT_SRC_MST_DIS_Len (1U) -#define I2C_TX_ABRT_SRC_MST_DIS_Msk (0x1U << I2C_TX_ABRT_SRC_MST_DIS_Pos) -#define I2C_TX_ABRT_SRC_MST_DIS I2C_TX_ABRT_SRC_MST_DIS_Msk - -#define I2C_TX_ABRT_SRC_10B_RD_NORSTRT_Pos (10U) -#define I2C_TX_ABRT_SRC_10B_RD_NORSTRT_Len (1U) -#define I2C_TX_ABRT_SRC_10B_RD_NORSTRT_Msk (0x1U << I2C_TX_ABRT_SRC_10B_RD_NORSTRT_Pos) -#define I2C_TX_ABRT_SRC_10B_RD_NORSTRT I2C_TX_ABRT_SRC_10B_RD_NORSTRT_Msk - -#define I2C_TX_ABRT_SRC_SBYTE_NORSTRT_Pos (9U) -#define I2C_TX_ABRT_SRC_SBYTE_NORSTRT_Len (1U) -#define I2C_TX_ABRT_SRC_SBYTE_NORSTRT_Msk (0x1U << I2C_TX_ABRT_SRC_SBYTE_NORSTRT_Pos) -#define I2C_TX_ABRT_SRC_SBYTE_NORSTRT I2C_TX_ABRT_SRC_SBYTE_NORSTRT_Msk - -#define I2C_TX_ABRT_SRC_HS_NORSTRT_Pos (8U) -#define I2C_TX_ABRT_SRC_HS_NORSTRT_Len (1U) -#define I2C_TX_ABRT_SRC_HS_NORSTRT_Msk (0x1U << I2C_TX_ABRT_SRC_HS_NORSTRT_Pos) -#define I2C_TX_ABRT_SRC_HS_NORSTRT I2C_TX_ABRT_SRC_HS_NORSTRT_Msk - -#define I2C_TX_ABRT_SRC_SBYTE_ACKDET_Pos (7U) -#define I2C_TX_ABRT_SRC_SBYTE_ACKDET_Len (1U) -#define I2C_TX_ABRT_SRC_SBYTE_ACKDET_Msk (0x1U << I2C_TX_ABRT_SRC_SBYTE_ACKDET_Pos) -#define I2C_TX_ABRT_SRC_SBYTE_ACKDET I2C_TX_ABRT_SRC_SBYTE_ACKDET_Msk - -#define I2C_TX_ABRT_SRC_HS_ACKDET_Pos (6U) -#define I2C_TX_ABRT_SRC_HS_ACKDET_Len (1U) -#define I2C_TX_ABRT_SRC_HS_ACKDET_Msk (0x1U << I2C_TX_ABRT_SRC_HS_ACKDET_Pos) -#define I2C_TX_ABRT_SRC_HS_ACKDET I2C_TX_ABRT_SRC_HS_ACKDET_Msk - -#define I2C_TX_ABRT_SRC_GCALL_READ_Pos (5U) -#define I2C_TX_ABRT_SRC_GCALL_READ_Len (1U) -#define I2C_TX_ABRT_SRC_GCALL_READ_Msk (0x1U << I2C_TX_ABRT_SRC_GCALL_READ_Pos) -#define I2C_TX_ABRT_SRC_GCALL_READ I2C_TX_ABRT_SRC_GCALL_READ_Msk - -#define I2C_TX_ABRT_SRC_GCALL_NOACK_Pos (4U) -#define I2C_TX_ABRT_SRC_GCALL_NOACK_Len (1U) -#define I2C_TX_ABRT_SRC_GCALL_NOACK_Msk (0x1U << I2C_TX_ABRT_SRC_GCALL_NOACK_Pos) -#define I2C_TX_ABRT_SRC_GCALL_NOACK I2C_TX_ABRT_SRC_GCALL_NOACK_Msk - -#define I2C_TX_ABRT_SRC_TXDATA_NOACK_Pos (3U) -#define I2C_TX_ABRT_SRC_TXDATA_NOACK_Len (1U) -#define I2C_TX_ABRT_SRC_TXDATA_NOACK_Msk (0x1U << I2C_TX_ABRT_SRC_TXDATA_NOACK_Pos) -#define I2C_TX_ABRT_SRC_TXDATA_NOACK I2C_TX_ABRT_SRC_TXDATA_NOACK_Msk - -#define I2C_TX_ABRT_SRC_10ADDR2_NOACK_Pos (2U) -#define I2C_TX_ABRT_SRC_10ADDR2_NOACK_Len (1U) -#define I2C_TX_ABRT_SRC_10ADDR2_NOACK_Msk (0x1U << I2C_TX_ABRT_SRC_10ADDR2_NOACK_Pos) -#define I2C_TX_ABRT_SRC_10ADDR2_NOACK I2C_TX_ABRT_SRC_10ADDR2_NOACK_Msk - -#define I2C_TX_ABRT_SRC_10ADDR1_NOACK_Pos (1U) -#define I2C_TX_ABRT_SRC_10ADDR1_NOACK_Len (1U) -#define I2C_TX_ABRT_SRC_10ADDR1_NOACK_Msk (0x1U << I2C_TX_ABRT_SRC_10ADDR1_NOACK_Pos) -#define I2C_TX_ABRT_SRC_10ADDR1_NOACK I2C_TX_ABRT_SRC_10ADDR1_NOACK_Msk - -#define I2C_TX_ABRT_SRC_7B_ADDR_NOACK_Pos (0U) -#define I2C_TX_ABRT_SRC_7B_ADDR_NOACK_Len (1U) -#define I2C_TX_ABRT_SRC_7B_ADDR_NOACK_Msk (0x1U << I2C_TX_ABRT_SRC_7B_ADDR_NOACK_Pos) -#define I2C_TX_ABRT_SRC_7B_ADDR_NOACK I2C_TX_ABRT_SRC_7B_ADDR_NOACK_Msk - -/******************* Bit definition for IC_DMA_CR register *******************/ -#define I2C_DMA_CR_TDMAE_Pos (1U) -#define I2C_DMA_CR_TDMAE_Len (1U) -#define I2C_DMA_CR_TDMAE_Msk (0x1U << I2C_DMA_CR_TDMAE_Pos) -#define I2C_DMA_CR_TDMAE I2C_DMA_CR_TDMAE_Msk - -#define I2C_DMA_CR_RDMAE_Pos (0U) -#define I2C_DMA_CR_RDMAE_Len (1U) -#define I2C_DMA_CR_RDMAE_Msk (0x1U << I2C_DMA_CR_RDMAE_Pos) -#define I2C_DMA_CR_RDMAE I2C_DMA_CR_RDMAE_Msk - -/******************* Bit definition for IC_DMA_TDLR register ****************/ -#define I2C_DMA_TDLR_DMATDL_Pos (0U) -#define I2C_DMA_TDLR_DMATDL_Len (8U) -#define I2C_DMA_TDLR_DMATDL_Msk (0xFFU << I2C_DMA_TDLR_DMATDL_Pos) -#define I2C_DMA_TDLR_DMATDL I2C_DMA_TDLR_DMATDL_Msk - -/******************* Bit definition for IC_DMA_RDLR register ****************/ -#define I2C_DMA_RDLR_DMARDL_Pos (0U) -#define I2C_DMA_RDLR_DMARDL_Len (8U) -#define I2C_DMA_RDLR_DMARDL_Msk (0xFFU << I2C_DMA_RDLR_DMARDL_Pos) -#define I2C_DMA_RDLR_DMARDL I2C_DMA_RDLR_DMARDL_Msk - -/******************* Bit definition for IC_SDA_SETUP register ***************/ -#define I2C_SDA_SETUP_SDA_SETUP_Pos (0U) -#define I2C_SDA_SETUP_SDA_SETUP_Len (8U) -#define I2C_SDA_SETUP_SDA_SETUP_Msk (0xFFU << I2C_SDA_SETUP_SDA_SETUP_Pos) -#define I2C_SDA_SETUP_SDA_SETUP I2C_SDA_SETUP_SDA_SETUP_Msk - -/******************* Bit definition for IC_ACK_GENERAL_CALL register ********/ -#define I2C_ACK_GENERAL_CALL_ACK_GC_Pos (0U) -#define I2C_ACK_GENERAL_CALL_ACK_GC_Len (1U) -#define I2C_ACK_GENERAL_CALL_ACK_GC_Msk (0x1U << I2C_ACK_GENERAL_CALL_ACK_GC_Pos) -#define I2C_ACK_GENERAL_CALL_ACK_GC I2C_ACK_GENERAL_CALL_ACK_GC_Msk - -/******************* Bit definition for IC_ENABLE_STATUS register ***********/ -#define I2C_ENABLE_STATUS_SLV_RX_LOST_Pos (2U) -#define I2C_ENABLE_STATUS_SLV_RX_LOST_Len (1U) -#define I2C_ENABLE_STATUS_SLV_RX_LOST_Msk (0x1U << I2C_ENABLE_STATUS_SLV_RX_LOST_Pos) -#define I2C_ENABLE_STATUS_SLV_RX_LOST I2C_ENABLE_STATUS_SLV_RX_LOST_Msk - -#define I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY_Pos (1U) -#define I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY_Len (1U) -#define I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY_Msk (0x1U << I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY_Pos) -#define I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY I2C_ENABLE_STATUS_SLV_DIS_WHL_BUSY_Msk - -#define I2C_ENABLE_STATUS_IC_EN_Pos (0U) -#define I2C_ENABLE_STATUS_IC_EN_Len (1U) -#define I2C_ENABLE_STATUS_IC_EN_Msk (0x1U << I2C_ENABLE_STATUS_IC_EN_Pos) -#define I2C_ENABLE_STATUS_IC_EN I2C_ENABLE_STATUS_IC_EN_Msk - -/******************* Bit definition for IC_FS_SPKLEN register ***************/ -#define I2C_FS_SPKLEN_FS_SPKLEN_Pos (0U) -#define I2C_FS_SPKLEN_FS_SPKLEN_Len (8U) -#define I2C_FS_SPKLEN_FS_SPKLEN_Msk (0xFFU << I2C_FS_SPKLEN_FS_SPKLEN_Pos) -#define I2C_FS_SPKLEN_FS_SPKLEN I2C_FS_SPKLEN_FS_SPKLEN_Msk - -/******************* Bit definition for IC_HS_SPKLEN register ***************/ -#define I2C_HS_SPKLEN_HS_SPKLEN_Pos (0U) -#define I2C_HS_SPKLEN_HS_SPKLEN_Len (8U) -#define I2C_HS_SPKLEN_HS_SPKLEN_Msk (0xFFU << I2C_HS_SPKLEN_HS_SPKLEN_Pos) -#define I2C_HS_SPKLEN_HS_SPKLEN I2C_HS_SPKLEN_HS_SPKLEN_Msk - - -/* ================================================================================================================= */ -/* ================ I2S ================ */ -/* ================================================================================================================= */ -#define I2S_TXFIFO_SIZE (16U) -#define I2S_RXFIFO_SIZE (16U) - -/******************* Bit definition for ENABLE register *********************/ -#define I2S_ENABLE_EN_Pos (0U) -#define I2S_ENABLE_EN_Len (1U) -#define I2S_ENABLE_EN_Msk (0x1U << I2S_ENABLE_EN_Pos) -#define I2S_ENABLE_EN I2S_ENABLE_EN_Msk - -/******************* Bit definition for RBEN register ***********************/ -#define I2S_RBEN_EN_Pos (0U) -#define I2S_RBEN_EN_Len (1U) -#define I2S_RBEN_EN_Msk (0x1U << I2S_RBEN_EN_Pos) -#define I2S_RBEN_EN I2S_RBEN_EN_Msk - -/******************* Bit definition for TBEN register ***********************/ -#define I2S_TBEN_EN_Pos (0U) -#define I2S_TBEN_EN_Len (1U) -#define I2S_TBEN_EN_Msk (0x1U << I2S_TBEN_EN_Pos) -#define I2S_TBEN_EN I2S_TBEN_EN_Msk - -/******************* Bit definition for CLKEN register **********************/ -#define I2S_CLKEN_EN_Pos (0U) -#define I2S_CLKEN_EN_Len (1U) -#define I2S_CLKEN_EN_Msk (0x1U << I2S_CLKEN_EN_Pos) -#define I2S_CLKEN_EN I2S_CLKEN_EN_Msk - -/***************** Bit definition for CLKCONFIG register ********************/ -#define I2S_CLKCONFIG_WSS_Pos (3U) -#define I2S_CLKCONFIG_WSS_Len (2U) -#define I2S_CLKCONFIG_WSS_Msk (0x3U << I2S_CLKCONFIG_WSS_Pos) -#define I2S_CLKCONFIG_WSS I2S_CLKCONFIG_WSS_Msk - -#define I2S_CLKCONFIG_SCLKG_Pos (0U) -#define I2S_CLKCONFIG_SCLKG_Len (3U) -#define I2S_CLKCONFIG_SCLKG_Msk (0x7U << I2S_CLKCONFIG_SCLKG_Pos) -#define I2S_CLKCONFIG_SCLKG I2S_CLKCONFIG_SCLKG_Msk - -/***************** Bit definition for RXFIFO_RST register *******************/ -#define I2S_RXFIFO_RST_Pos (0U) -#define I2S_RXFIFO_RST_Len (1U) -#define I2S_RXFIFO_RST_Msk (0x1U << I2S_RXFIFO_RST_Pos) -#define I2S_RXFIFO_RST I2S_RXFIFO_RST_Msk - -/***************** Bit definition for TXFIFO_RST register *******************/ -#define I2S_TXFIFO_RST_Pos (0U) -#define I2S_TXFIFO_RST_Len (1U) -#define I2S_TXFIFO_RST_Msk (0x1U << I2S_TXFIFO_RST_Pos) -#define I2S_TXFIFO_RST I2S_TXFIFO_RST_Msk - -/******************* Bit definition for DATA_L register *********************/ -#define I2S_DATA_L_Pos (0U) -#define I2S_DATA_L_Len (32U) -#define I2S_DATA_L_Msk (0xFFFFFFFFU) -#define I2S_DATA_L I2S_DATA_L_Msk - -/******************* Bit definition for DATA_R register *********************/ -#define I2S_DATA_R_Pos (0U) -#define I2S_DATA_R_Len (32U) -#define I2S_DATA_R_Msk (0xFFFFFFFFU) -#define I2S_DATA_R I2S_DATA_R_Msk - -/******************** Bit definition for RXEN register **********************/ -#define I2S_RXEN_EN_Pos (0U) -#define I2S_RXEN_EN_Len (1U) -#define I2S_RXEN_EN_Msk (0x1U << I2S_RXEN_EN_Pos) -#define I2S_RXEN_EN I2S_RXEN_EN_Msk - -/******************** Bit definition for TXEN register **********************/ -#define I2S_TXEN_EN_Pos (0U) -#define I2S_TXEN_EN_Len (1U) -#define I2S_TXEN_EN_Msk (0x1U << I2S_TXEN_EN_Pos) -#define I2S_TXEN_EN I2S_TXEN_EN_Msk - -/******************* Bit definition for RXSIZE register *********************/ -#define I2S_RXSIZE_WLEN_Pos (0U) -#define I2S_RXSIZE_WLEN_Len (3U) -#define I2S_RXSIZE_WLEN_Msk (0x7U << I2S_RXSIZE_WLEN_Pos) -#define I2S_RXSIZE_WLEN I2S_RXSIZE_WLEN_Msk - -/******************* Bit definition for TXSIZE register *********************/ -#define I2S_TXSIZE_WLEN_Pos (0U) -#define I2S_TXSIZE_WLEN_Len (3U) -#define I2S_TXSIZE_WLEN_Msk (0x7U << I2S_TXSIZE_WLEN_Pos) -#define I2S_TXSIZE_WLEN I2S_TXSIZE_WLEN_Msk - -/******************* Bit definition for INTSTAT register ********************/ -#define I2S_INTSTAT_TXFO_Pos (5U) -#define I2S_INTSTAT_TXFO_Len (1U) -#define I2S_INTSTAT_TXFO_Msk (0x1U << I2S_INTSTAT_TXFO_Pos) -#define I2S_INTSTAT_TXFO I2S_INTSTAT_TXFO_Msk - -#define I2S_INTSTAT_TXFE_Pos (4U) -#define I2S_INTSTAT_TXFE_Len (1U) -#define I2S_INTSTAT_TXFE_Msk (0x1U << I2S_INTSTAT_TXFE_Pos) -#define I2S_INTSTAT_TXFE I2S_INTSTAT_TXFE_Msk - -#define I2S_INTSTAT_RXFO_Pos (1U) -#define I2S_INTSTAT_RXFO_Len (1U) -#define I2S_INTSTAT_RXFO_Msk (0x1U << I2S_INTSTAT_RXFO_Pos) -#define I2S_INTSTAT_RXFO I2S_INTSTAT_RXFO_Msk - -#define I2S_INTSTAT_RXDA_Pos (0U) -#define I2S_INTSTAT_RXDA_Len (1U) -#define I2S_INTSTAT_RXDA_Msk (0x1U << I2S_INTSTAT_RXDA_Pos) -#define I2S_INTSTAT_RXDA I2S_INTSTAT_RXDA_Msk - -/******************* Bit definition for INTMASK register ********************/ -#define I2S_INTMASK_TXFO_Pos (5U) -#define I2S_INTMASK_TXFO_Len (1U) -#define I2S_INTMASK_TXFO_Msk (0x1U << I2S_INTSTAT_TXFO_Pos) -#define I2S_INTMASK_TXFO I2S_INTSTAT_TXFO_Msk - -#define I2S_INTMASK_TXFE_Pos (4U) -#define I2S_INTMASK_TXFE_Len (1U) -#define I2S_INTMASK_TXFE_Msk (0x1U << I2S_INTSTAT_TXFE_Pos) -#define I2S_INTMASK_TXFE I2S_INTSTAT_TXFE_Msk - -#define I2S_INTMASK_RXFO_Pos (1U) -#define I2S_INTMASK_RXFO_Len (1U) -#define I2S_INTMASK_RXFO_Msk (0x1U << I2S_INTSTAT_RXFO_Pos) -#define I2S_INTMASK_RXFO I2S_INTSTAT_RXFO_Msk - -#define I2S_INTMASK_RXDA_Pos (0U) -#define I2S_INTMASK_RXDA_Len (1U) -#define I2S_INTMASK_RXDA_Msk (0x1U << I2S_INTSTAT_RXDA_Pos) -#define I2S_INTMASK_RXDA I2S_INTSTAT_RXDA_Msk - -/******************** Bit definition for RXOVR register *********************/ -#define I2S_RXOVR_RXCHO_Pos (0U) -#define I2S_RXOVR_RXCHO_Len (1U) -#define I2S_RXOVR_RXCHO_Msk (0x1U << I2S_RXOVR_RXCHO_Pos) -#define I2S_RXOVR_RXCHO I2S_RXOVR_RXCHO_Msk - -/******************** Bit definition for TXOVR register *********************/ -#define I2S_TXOVR_TXCHO_Pos (0U) -#define I2S_TXOVR_TXCHO_Len (1U) -#define I2S_TXOVR_TXCHO_Msk (0x1U << I2S_TXOVR_TXCHO_Pos) -#define I2S_TXOVR_TXCHO I2S_TXOVR_TXCHO_Msk - -/****************** Bit definition for RXFIFO_TL register *******************/ -#define I2S_RXFIFO_TL_Pos (0U) -#define I2S_RXFIFO_TL_Len (4U) -#define I2S_RXFIFO_TL_Msk (0xFU << I2S_RXFIFO_TL_Pos) -#define I2S_RXFIFO_TL I2S_RXFIFO_TL_Msk - -/****************** Bit definition for TXFIFO_TL register *******************/ -#define I2S_TXFIFO_TL_Pos (0U) -#define I2S_TXFIFO_TL_Len (4U) -#define I2S_TXFIFO_TL_Msk (0xFU << I2S_TXFIFO_TL_Pos) -#define I2S_TXFIFO_TL I2S_TXFIFO_TL_Msk - -/**************** Bit definition for RXFIFO_FLUSH register ******************/ -#define I2S_RXFIFO_FLUSH_Pos (0U) -#define I2S_RXFIFO_FLUSH_Len (1U) -#define I2S_RXFIFO_FLUSH_Msk (0x1U << I2S_RXFIFO_FLUSH_Pos) -#define I2S_RXFIFO_FLUSH I2S_RXFIFO_FLUSH_Msk - -/**************** Bit definition for TXFIFO_FLUSH register ******************/ -#define I2S_TXFIFO_FLUSH_Pos (0U) -#define I2S_TXFIFO_FLUSH_Len (1U) -#define I2S_TXFIFO_FLUSH_Msk (0x1U << I2S_TXFIFO_FLUSH_Pos) -#define I2S_TXFIFO_FLUSH I2S_TXFIFO_FLUSH_Msk - -/******************** Bit definition for RXDMA register *********************/ -#define I2S_RXDMA_Pos (0U) -#define I2S_RXDMA_Len (32U) -#define I2S_RXDMA_Msk (0xFFFFFFFFU) -#define I2S_RXDMA I2S_RXDMA_Msk - -/****************** Bit definition for RXDMA_RST register *******************/ -#define I2S_RXDMA_RST_Pos (0U) -#define I2S_RXDMA_RST_Len (1U) -#define I2S_RXDMA_RST_Msk (0x1U << I2S_RXDMA_RST_Pos) -#define I2S_RXDMA_RST I2S_RXDMA_RST_Msk - -/******************** Bit definition for TXDMA register *********************/ -#define I2S_TXDMA_Pos (0U) -#define I2S_TXDMA_Len (32U) -#define I2S_TXDMA_Msk (0xFFFFFFFFU) -#define I2S_TXDMA I2S_TXDMA_Msk - -/****************** Bit definition for TXDMA_RST register *******************/ -#define I2S_TXDMA_RST_Pos (0U) -#define I2S_TXDMA_RST_Len (1U) -#define I2S_TXDMA_RST_Msk (0x1U << I2S_TXDMA_RST_Pos) -#define I2S_TXDMA_RST I2S_TXDMA_RST_Msk - -/****************** Bit definition for I2S_PARAM2 register ******************/ -#define I2S_PARAM2_RXSIZE_3_Pos (10U) -#define I2S_PARAM2_RXSIZE_3_Len (3U) -#define I2S_PARAM2_RXSIZE_3_Msk (0x7U << I2S_PARAM2_RXSIZE_3_Pos) -#define I2S_PARAM2_RXSIZE_3 I2S_PARAM2_RXSIZE_3_Msk - -#define I2S_PARAM2_RXSIZE_2_Pos (7U) -#define I2S_PARAM2_RXSIZE_2_Len (3U) -#define I2S_PARAM2_RXSIZE_2_Msk (0x7U << I2S_PARAM2_RXSIZE_2_Pos) -#define I2S_PARAM2_RXSIZE_2 I2S_PARAM2_RXSIZE_2_Msk - -#define I2S_PARAM2_RXSIZE_1_Pos (3U) -#define I2S_PARAM2_RXSIZE_1_Len (3U) -#define I2S_PARAM2_RXSIZE_1_Msk (0x7U << I2S_PARAM2_RXSIZE_1_Pos) -#define I2S_PARAM2_RXSIZE_1 I2S_PARAM2_RXSIZE_1_Msk - -#define I2S_PARAM2_RXSIZE_0_Pos (0U) -#define I2S_PARAM2_RXSIZE_0_Len (3U) -#define I2S_PARAM2_RXSIZE_0_Msk (0x7U << I2S_PARAM2_RXSIZE_0_Pos) -#define I2S_PARAM2_RXSIZE_0 I2S_PARAM2_RXSIZE_0_Msk - -/****************** Bit definition for I2S_PARAM1 register ******************/ -#define I2S_PARAM1_TXSIZE_3_Pos (25U) -#define I2S_PARAM1_TXSIZE_3_Len (3U) -#define I2S_PARAM1_TXSIZE_3_Msk (0x7U << I2S_PARAM1_TXSIZE_3_Pos) -#define I2S_PARAM1_TXSIZE_3 I2S_PARAM1_TXSIZE_3_Msk - -#define I2S_PARAM1_TXSIZE_2_Pos (22U) -#define I2S_PARAM1_TXSIZE_2_Len (3U) -#define I2S_PARAM1_TXSIZE_2_Msk (0x7U << I2S_PARAM1_TXSIZE_2_Pos) -#define I2S_PARAM1_TXSIZE_2 I2S_PARAM1_TXSIZE_2_Msk - -#define I2S_PARAM1_TXSIZE_1_Pos (19U) -#define I2S_PARAM1_TXSIZE_1_Len (3U) -#define I2S_PARAM1_TXSIZE_1_Msk (0x7U << I2S_PARAM1_TXSIZE_1_Pos) -#define I2S_PARAM1_TXSIZE_1 I2S_PARAM1_TXSIZE_1_Msk - -#define I2S_PARAM1_TXSIZE_0_Pos (16U) -#define I2S_PARAM1_TXSIZE_0_Len (3U) -#define I2S_PARAM1_TXSIZE_0_Msk (0x7U << I2S_PARAM1_TXSIZE_0_Pos) -#define I2S_PARAM1_TXSIZE_0 I2S_PARAM1_TXSIZE_0_Msk - -#define I2S_PARAM1_TXCHN_Pos (9U) -#define I2S_PARAM1_TXCHN_Len (2U) -#define I2S_PARAM1_TXCHN_Msk (0x3U << I2S_PARAM1_TXCHN_Pos) -#define I2S_PARAM1_TXCHN I2S_PARAM1_TXCHN_Msk - -#define I2S_PARAM1_RXCHN_Pos (7U) -#define I2S_PARAM1_RXCHN_Len (2U) -#define I2S_PARAM1_RXCHN_Msk (0x3U << I2S_PARAM1_RXCHN_Pos) -#define I2S_PARAM1_RXCHN I2S_PARAM1_RXCHN_Msk - -#define I2S_PARAM1_RXBLOCK_Pos (6U) -#define I2S_PARAM1_RXBLOCK_Len (1U) -#define I2S_PARAM1_RXBLOCK_Msk (0x1U << I2S_PARAM1_RXBLOCK_Pos) -#define I2S_PARAM1_RXBLOCK I2S_PARAM1_RXBLOCK_Msk - -#define I2S_PARAM1_TXBLOCK_Pos (5U) -#define I2S_PARAM1_TXBLOCK_Len (1U) -#define I2S_PARAM1_TXBLOCK_Msk (0x1U << I2S_PARAM1_TXBLOCK_Pos) -#define I2S_PARAM1_TXBLOCK I2S_PARAM1_TXBLOCK_Msk - -#define I2S_PARAM1_MODE_Pos (4U) -#define I2S_PARAM1_MODE_Len (1U) -#define I2S_PARAM1_MODE_Msk (0x1U << I2S_PARAM1_MODE_Pos) -#define I2S_PARAM1_MODE I2S_PARAM1_MODE_Msk - -#define I2S_PARAM1_FIFO_DEPTH_Pos (2U) -#define I2S_PARAM1_FIFO_DEPTH_Len (2U) -#define I2S_PARAM1_FIFO_DEPTH_Msk (0x3U << I2S_PARAM1_FIFO_DEPTH_Pos) -#define I2S_PARAM1_FIFO_DEPTH I2S_PARAM1_FIFO_DEPTH_Msk - -#define I2S_PARAM1_APB_DATA_WIDTH_Pos (0U) -#define I2S_PARAM1_APB_DATA_WIDTH_Len (2U) -#define I2S_PARAM1_APB_DATA_WIDTH_Msk (0x3U << I2S_PARAM1_APB_DATA_WIDTH_Pos) -#define I2S_PARAM1_APB_DATA_WIDTH I2S_PARAM1_APB_DATA_WIDTH_Msk - -/****************** Bit definition for I2S_VERSION register *****************/ -#define I2S_COMP_VERSION_Pos (0U) -#define I2S_COMP_VERSION_Len (32U) -#define I2S_COMP_VERSION_Msk (0xFFFFFFFFU) -#define I2S_COMP_VERSION I2S_COMP_VERSION_Msk - -/******************* Bit definition for I2S_TYPE register *******************/ -#define I2S_COMP_TYPE_Pos (0U) -#define I2S_COMP_TYPE_Len (32U) -#define I2S_COMP_TYPE_Msk (0xFFFFFFFFU) -#define I2S_COMP_TYPE I2S_COMP_TYPE_Msk - - -/* ================================================================================================================= */ -/* ================ ISO7816 ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for ISO7816_CTRL register *******************/ -#define ISO7816_CTRL_ACTION_POS (0U) -#define ISO7816_CTRL_ACTION_Len (3U) -#define ISO7816_CTRL_ACTION_Msk (0x7UL << ISO7816_CTRL_ACTION_POS) -#define ISO7816_CTRL_ACTION ISO7816_CTRL_ACTION_Msk - -#define ISO7816_CTRL_RX_RETYR_MC_POS (8U) -#define ISO7816_CTRL_RX_RETYR_MC_Len (1U) -#define ISO7816_CTRL_RX_RETYR_MC_Msk (0x1UL << ISO7816_CTRL_RX_RETYR_MC_POS) -#define ISO7816_CTRL_RX_RETYR_MC ISO7816_CTRL_RX_RETYR_MC_Msk - -#define ISO7816_CTRL_TX_RETYR_MC_POS (12U) -#define ISO7816_CTRL_TX_RETYR_MC_Len (1U) -#define ISO7816_CTRL_TX_RETYR_MC_Msk (0x1UL << ISO7816_CTRL_TX_RETYR_MC_POS) -#define ISO7816_CTRL_TX_RETYR_MC ISO7816_CTRL_TX_RETYR_MC_Msk - -#define ISO7816_CTRL_IRQ_DONE_CLR_POS (20U) -#define ISO7816_CTRL_IRQ_DONE_CLR_Len (1U) -#define ISO7816_CTRL_IRQ_DONE_CLR_Msk (0x1UL << ISO7816_CTRL_IRQ_DONE_CLR_POS) -#define ISO7816_CTRL_IRQ_DONE_CLR ISO7816_CTRL_IRQ_DONE_CLR_Msk - -#define ISO7816_CTRL_IRQ_RX_EC_POS (21U) -#define ISO7816_CTRL_IRQ_RX_EC_Len (1U) -#define ISO7816_CTRL_IRQ_RX_EC_Msk (0x1UL << ISO7816_CTRL_IRQ_RX_EC_POS) -#define ISO7816_CTRL_IRQ_RX_EC ISO7816_CTRL_IRQ_RX_EC_Msk - -#define ISO7816_CTRL_IRQ_RETYR_EC_POS (22U) -#define ISO7816_CTRL_IRQ_RETYR_EC_Len (1U) -#define ISO7816_CTRL_IRQ_RETYR_EC_Msk (0x1UL << ISO7816_CTRL_IRQ_RETYR_EC_POS) -#define ISO7816_CTRL_IRQ_RETYR_EC ISO7816_CTRL_IRQ_RETYR_EC_Msk - -#define ISO7816_CTRL_IRQ_DMA_EC_POS (23U) -#define ISO7816_CTRL_IRQ_DMA_EC_Len (1U) -#define ISO7816_CTRL_IRQ_DMA_EC_Msk (0x1UL << ISO7816_CTRL_IRQ_DMA_EC_POS) -#define ISO7816_CTRL_IRQ_DMA_EC ISO7816_CTRL_IRQ_DMA_EC_Msk - -#define ISO7816_CTRL_IRQ_STAT_EC_POS (24U) -#define ISO7816_CTRL_IRQ_STAT_EC_Len (1U) -#define ISO7816_CTRL_IRQ_STAT_EC_Msk (0x1UL << ISO7816_CTRL_IRQ_STAT_EC_POS) -#define ISO7816_CTRL_IRQ_STAT_EC ISO7816_CTRL_IRQ_STAT_EC_Msk - -#define ISO7816_CTRL_IRQ_PRESENCE_CLR_POS (25U) -#define ISO7816_CTRL_IRQ_PRESENCE_CLR_Len (1U) -#define ISO7816_CTRL_IRQ_PRESENCE_CLR_Msk (0x1UL << ISO7816_CTRL_IRQ_PRESENCE_CLR_POS) -#define ISO7816_CTRL_IRQ_PRESENCE_CLR ISO7816_CTRL_IRQ_PRESENCE_CLR_Msk - -#define ISO7816_CTRL_IRQ_TEST_CLR_POS (30U) -#define ISO7816_CTRL_IRQ_TEST_CLR_Len (1U) -#define ISO7816_CTRL_IRQ_TEST_CLR_Msk (0x1UL << ISO7816_CTRL_IRQ_TEST_CLR_POS) -#define ISO7816_CTRL_IRQ_TEST_CLR ISO7816_CTRL_IRQ_TEST_CLR_Msk - -#define ISO7816_CTRL_IRQ_TEST_SET_POS (31U) -#define ISO7816_CTRL_IRQ_TEST_SET_Len (1U) -#define ISO7816_CTRL_IRQ_TEST_SET_Msk (0x1UL << ISO7816_CTRL_IRQ_TEST_SET_POS) -#define ISO7816_CTRL_IRQ_TEST_SET ISO7816_CTRL_IRQ_TEST_SET_Msk - -/******************* Bit definition for ISO7816_STAT register *******************/ -#define ISO7816_INTR_ALL (0x43F00000) - -#define ISO7816_STAT_PWR_STAT_POS (0U) -#define ISO7816_STAT_PWR_STAT_Len (4U) -#define ISO7816_STAT_PWR_STAT_Msk (0xFUL << ISO7816_STAT_PWR_STAT_POS) -#define ISO7816_STAT_PWR_STAT ISO7816_STAT_PWR_STAT_Msk - -#define ISO7816_STAT_IO_STAT_POS (4U) -#define ISO7816_STAT_IO_STAT_Len (3U) -#define ISO7816_STAT_IO_STAT_Msk (0x7UL << ISO7816_STAT_IO_STAT_POS) -#define ISO7816_STAT_IO_STAT ISO7816_STAT_IO_STAT_Msk - -#define ISO7816_STAT_RX_RETRY_MAX_POS (8U) -#define ISO7816_STAT_RX_RETRY_MAX_Len (3U) -#define ISO7816_STAT_RX_RETRY_MAX_Msk (0x7UL << ISO7816_STAT_RX_RETRY_MAX_POS) -#define ISO7816_STAT_RX_RETRY_MAX ISO7816_STAT_RX_RETRY_MAX_Msk - -#define ISO7816_STAT_TX_RETRY_MAX_POS (12U) -#define ISO7816_STAT_TX_RETRY_MAX_Len (3U) -#define ISO7816_STAT_TX_RETRY_MAX_Msk (0x7UL << ISO7816_STAT_TX_RETRY_MAX_POS) -#define ISO7816_STAT_TX_RETRY_MAX ISO7816_STAT_TX_RETRY_MAX_Msk - -#define ISO7816_STAT_BUSY_POS (16U) -#define ISO7816_STAT_BUSY_Len (1U) -#define ISO7816_STAT_BUSY_Msk (0x1UL << ISO7816_STAT_BUSY_POS) -#define ISO7816_STAT_BUSY ISO7816_STAT_BUSY_Msk - -#define ISO7816_STAT_PRESENCE_STAT_POS (17U) -#define ISO7816_STAT_PRESENCE_STAT_Len (1U) -#define ISO7816_STAT_PRESENCE_STAT_Msk (0x1UL << ISO7816_STAT_PRESENCE_STAT_POS) -#define ISO7816_STAT_PRESENCE_STAT ISO7816_STAT_PRESENCE_STAT_Msk - -#define ISO7816_STAT_IRQ_DONE_POS (20U) -#define ISO7816_STAT_IRQ_DONE_Len (1U) -#define ISO7816_STAT_IRQ_DONE_Msk (0x1UL << ISO7816_STAT_IRQ_DONE_POS) -#define ISO7816_STAT_IRQ_DONE ISO7816_STAT_IRQ_DONE_Msk - -#define ISO7816_STAT_IRQ_RX_ERR_POS (21U) -#define ISO7816_STAT_IRQ_RX_ERR_Len (1U) -#define ISO7816_STAT_IRQ_RX_ERR_Msk (0x1UL << ISO7816_STAT_IRQ_RX_ERR_POS) -#define ISO7816_STAT_IRQ_RX_ERR ISO7816_STAT_IRQ_RX_ERR_Msk - -#define ISO7816_STAT_IRQ_RETRY_ERR_POS (22U) -#define ISO7816_STAT_IRQ_RETRY_ERR_Len (1U) -#define ISO7816_STAT_IRQ_RETRY_ERR_Msk (0x1UL << ISO7816_STAT_IRQ_RETRY_ERR_POS) -#define ISO7816_STAT_IRQ_RETRY_ERR ISO7816_STAT_IRQ_RETRY_ERR_Msk - -#define ISO7816_STAT_IRQ_DMA_ERR_POS (23U) -#define ISO7816_STAT_IRQ_DMA_ERR_Len (1U) -#define ISO7816_STAT_IRQ_DMA_ERR_Msk (0x1UL << ISO7816_STAT_IRQ_DMA_ERR_POS) -#define ISO7816_STAT_IRQ_DMA_ERR ISO7816_STAT_IRQ_DMA_ERR_Msk - -#define ISO7816_STAT_IRQ_STAT_ERR_POS (24U) -#define ISO7816_STAT_IRQ_STAT_ERR_Len (1U) -#define ISO7816_STAT_IRQ_STAT_ERR_Msk (0x1UL << ISO7816_STAT_IRQ_STAT_ERR_POS) -#define ISO7816_STAT_IRQ_STAT_ERR ISO7816_STAT_IRQ_STAT_ERR_Msk - -#define ISO7816_STAT_IRQ_PRESENCE_POS (25U) -#define ISO7816_STAT_IRQ_PRESENCE_Len (1U) -#define ISO7816_STAT_IRQ_PRESENCE_Msk (0x1UL << ISO7816_STAT_IRQ_PRESENCE_POS) -#define ISO7816_STAT_IRQ_PRESENCE ISO7816_STAT_IRQ_PRESENCE_Msk - -#define ISO7816_STAT_IRQ_TEST_POS (30U) -#define ISO7816_STAT_IRQ_TEST_Len (1U) -#define ISO7816_STAT_IRQ_TEST_Msk (0x1UL << ISO7816_STAT_IRQ_TEST_POS) -#define ISO7816_STAT_IRQ_TEST ISO7816_STAT_IRQ_TEST_Msk - -/******************* Bit definition for ISO7816_CLK_CFG register *******************/ -#define ISO7816_CLK_CFG_ETU_DIV_POS (0U) -#define ISO7816_CLK_CFG_ETU_DIV_Len (10U) -#define ISO7816_CLK_CFG_ETU_DIV_Msk (0x3FFUL << ISO7816_CLK_CFG_ETU_DIV_POS) -#define ISO7816_CLK_CFG_ETU_DIV ISO7816_CLK_CFG_ETU_DIV_Msk - -#define ISO7816_CLK_CFG_CLK_DIV_POS (16U) -#define ISO7816_CLK_CFG_CLK_DIV_Len (8U) -#define ISO7816_CLK_CFG_CLK_DIV_Msk (0xFFUL << ISO7816_CLK_CFG_CLK_DIV_POS) -#define ISO7816_CLK_CFG_CLK_DIV ISO7816_CLK_CFG_CLK_DIV_Msk - -#define ISO7816_CLK_CFG_CLK_STOP_SEL_POS (31U) -#define ISO7816_CLK_CFG_CLK_STOP_SEL_Len (1U) -#define ISO7816_CLK_CFG_CLK_STOP_SEL_Msk (0x1UL << ISO7816_CLK_CFG_CLK_STOP_SEL_POS) -#define ISO7816_CLK_CFG_CLK_STOP_SEL ISO7816_CLK_CFG_CLK_STOP_SEL_Msk - -/******************* Bit definition for ISO7816_TIMES_CFG register *******************/ -#define ISO7816_TIMES_CFG_GUARD_TIME_POS (0U) -#define ISO7816_TIMES_CFG_GUARD_TIME_Len (10U) -#define ISO7816_TIMES_CFG_GUARD_TIME_Msk (0x3FFUL << ISO7816_TIMES_CFG_GUARD_TIME_POS) -#define ISO7816_TIMES_CFG_GUARD_TIME ISO7816_TIMES_CFG_GUARD_TIME_Msk - -#define ISO7816_TIMES_CFG_WAIT_TIME_POS (12U) -#define ISO7816_TIMES_CFG_WAIT_TIME_Len (18U) -#define ISO7816_TIMES_CFG_WAIT_TIME_Msk (0x3FFFFUL << ISO7816_TIMES_CFG_WAIT_TIME_POS) -#define ISO7816_TIMES_CFG_WAIT_TIME ISO7816_TIMES_CFG_WAIT_TIME_Msk - -/******************* Bit definition for ISO7816_DATA_CFG register *******************/ -#define ISO7816_DATA_CFG_CODING_POS (0U) -#define ISO7816_DATA_CFG_CODING_Len (1U) -#define ISO7816_DATA_CFG_CODING_Msk (0x1UL << ISO7816_DATA_CFG_CODING_POS) -#define ISO7816_DATA_CFG_CODING ISO7816_DATA_CFG_CODING_Msk - -#define ISO7816_DATA_CFG_DETECT_CODING_POS (1U) -#define ISO7816_DATA_CFG_DETECT_CODING_Len (1U) -#define ISO7816_DATA_CFG_DETECT_CODING_Msk (0x1UL << ISO7816_DATA_CFG_DETECT_CODING_POS) -#define ISO7816_DATA_CFG_DETECT_CODING ISO7816_DATA_CFG_DETECT_CODING_Msk - -#define ISO7816_DATA_CFG_RETRY_LIMIT_POS (4U) -#define ISO7816_DATA_CFG_RETRY_LIMIT_Len (3U) -#define ISO7816_DATA_CFG_RETRY_LIMIT_Msk (0x7UL << ISO7816_DATA_CFG_RETRY_LIMIT_POS) -#define ISO7816_DATA_CFG_RETRY_LIMIT ISO7816_DATA_CFG_RETRY_LIMIT_Msk - -/******************* Bit definition for ISO7816_ADDR register *******************/ -#define ISO7816_ADDR_ADDR_FRAC_POS (0U) -#define ISO7816_ADDR_ADDR_FRAC_Len (2U) -#define ISO7816_ADDR_ADDR_FRAC_Msk (0x3UL << ISO7816_ADDR_ADDR_FRAC_POS) -#define ISO7816_ADDR_ADDR_FRAC ISO7816_ADDR_ADDR_FRAC_Msk - -#define ISO7816_ADDR_ADDR_POS (2U) -#define ISO7816_ADDR_ADDR_Len (18U) -#define ISO7816_ADDR_ADDR_Msk (0x3FFFFUL << ISO7816_ADDR_ADDR_POS) -#define ISO7816_ADDR_ADDR ISO7816_ADDR_ADDR_Msk - -/******************* Bit definition for ISO7816_START_ADDR register *******************/ -#define ISO7816_START_ADDR_START_ADDR_POS (2U) -#define ISO7816_START_ADDR_START_ADDR_Len (18U) -#define ISO7816_START_ADDR_START_ADDR_Msk (0x3FFFFUL << ISO7816_START_ADDR_START_ADDR_POS) -#define ISO7816_START_ADDR_START_ADDR ISO7816_START_ADDR_START_ADDR_Msk - -#define ISO7816_START_ADDR_BASE_ADDR_POS (20U) -#define ISO7816_START_ADDR_BASE_ADDR_Len (12U) -#define ISO7816_START_ADDR_BASE_ADDR_Msk (0xFFFUL << ISO7816_START_ADDR_BASE_ADDR_POS) -#define ISO7816_START_ADDR_BASE_ADDR ISO7816_START_ADDR_BASE_ADDR_Msk - -/******************* Bit definition for ISO7816_RX_END_ADDR register *******************/ -#define ISO7816_RX_END_ADDR_RX_END_AF_POS (0U) -#define ISO7816_RX_END_ADDR_RX_END_AF_Len (2U) -#define ISO7816_RX_END_ADDR_RX_END_AF_Msk (0x3UL << ISO7816_RX_END_ADDR_RX_END_AF_POS) -#define ISO7816_RX_END_ADDR_RX_END_AF ISO7816_RX_END_ADDR_RX_END_AF_Msk - -#define ISO7816_RX_END_ADDR_RX_END_ADDR_POS (2U) -#define ISO7816_RX_END_ADDR_RX_END_ADDR_Len (18U) -#define ISO7816_RX_END_ADDR_RX_END_ADDR_Msk (0x3FFFFUL << ISO7816_RX_END_ADDR_RX_END_ADDR_POS) -#define ISO7816_RX_END_ADDR_RX_END_ADDR ISO7816_RX_END_ADDR_RX_END_ADDR_Msk - -/******************* Bit definition for ISO7816_TX_END_ADDR register *******************/ -#define ISO7816_TX_END_ADDR_TX_END_AF_POS (0U) -#define ISO7816_TX_END_ADDR_TX_END_AF_Len (2U) -#define ISO7816_TX_END_ADDR_TX_END_AF_Msk (0x3UL << ISO7816_TX_END_ADDR_TX_END_AF_POS) -#define ISO7816_TX_END_ADDR_TX_END_AF ISO7816_TX_END_ADDR_TX_END_AF_Msk - -#define ISO7816_TX_END_ADDR_TX_END_ADDR_POS (2U) -#define ISO7816_TX_END_ADDR_TX_END_ADDR_Len (18U) -#define ISO7816_TX_END_ADDR_TX_END_ADDR_Msk (0x3FFFFUL << ISO7816_TX_END_ADDR_TX_END_ADDR_POS) -#define ISO7816_TX_END_ADDR_TX_END_ADDR ISO7816_TX_END_ADDR_TX_END_ADDR_Msk - -/* ================================================================================================================= */ -/* ================ MCU_SUB ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for MCU_SUB_REG_SENSE_ADC_FIFO register ****************/ -#define MCU_SUB_SNSADC_FF_DATA_Pos (0U) -#define MCU_SUB_SNSADC_FF_DATA_Len (32U) -#define MCU_SUB_SNSADC_FF_DATA_Msk (0xFFFFFFFFU) -#define MCU_SUB_SNSADC_FF_DATA MCU_SUB_SNSADC_FF_DATA_Msk - -/******************* Bit definition for MCU_SUB_REG_SENSE_FF_THRESH register ****/ -#define MCU_SUB_SNSADC_FF_THRESH_Pos (0U) -#define MCU_SUB_SNSADC_FF_THRESH_Len (6U) -#define MCU_SUB_SNSADC_FF_THRESH_Msk (0x3FU << MCU_SUB_SNSADC_FF_THRESH_Pos) -#define MCU_SUB_SNSADC_FF_THRESH MCU_SUB_SNSADC_FF_THRESH_Msk - -/******************* Bit definition for MCU_SUB_REG_SENSE_ADC_STAT register *****/ -#define MCU_SUB_SNSADC_STAT_VAL_Pos (8U) -#define MCU_SUB_SNSADC_STAT_VAL_Len (1U) -#define MCU_SUB_SNSADC_STAT_VAL_Msk (0x1U << MCU_SUB_SNSADC_STAT_VAL_Pos) -#define MCU_SUB_SNSADC_STAT_VAL MCU_SUB_SNSADC_STAT_VAL_Msk - -#define MCU_SUB_SNSADC_STAT_FF_COUNT_Pos (0U) -#define MCU_SUB_SNSADC_STAT_FF_COUNT_Len (7U) -#define MCU_SUB_SNSADC_STAT_FF_COUNT_Msk (0x7FU << MCU_SUB_SNSADC_STAT_FF_COUNT_Pos) -#define MCU_SUB_SNSADC_STAT_FF_COUNT MCU_SUB_SNSADC_STAT_FF_COUNT_Msk - - -/******************* Bit definition for MCU_SUB_REG_COMM_TMR_DEEPSLPSTAT register ***********/ -#define MCU_SUB_COMM_TMR_DEEPSLPSTAT_DEEPSLDUR_Pos (0U) -#define MCU_SUB_COMM_TMR_DEEPSLPSTAT_DEEPSLDUR_Len (32U) -#define MCU_SUB_COMM_TMR_DEEPSLPSTAT_DEEPSLDUR_Msk (0xFFFFFFFFU) -#define MCU_SUB_COMM_TMR_DEEPSLPSTAT_DEEPSLDUR MCU_SUB_COMM_TMR_DEEPSLPSTAT_DEEPSLDUR_Msk - -/*************** Bit definition for MCU_SUB_REG_DPAD_RE_N_BUS register ********/ -#define MCU_SUB_DPAD_RE_N_BUS_Pos (0U) -#define MCU_SUB_DPAD_RE_N_BUS_Len (32U) -#define MCU_SUB_DPAD_RE_N_BUS_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_RE_N_BUS MCU_SUB_DPAD_RE_N_BUS_Msk - -/************* Bit definition for MCU_SUB_REG_DPAD_RTYP_BUS register **********/ -#define MCU_SUB_DPAD_RTYP_BUS_Pos (0U) -#define MCU_SUB_DPAD_RTYP_BUS_Len (32U) -#define MCU_SUB_DPAD_RTYP_BUS_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_RTYP_BUS MCU_SUB_DPAD_RTYP_BUS_Msk - -/********** Bit definition for MCU_SUB_REG_DPAD_IE_N_BUS register *************/ -#define MCU_SUB_DPAD_IE_N_BUS_Pos (0U) -#define MCU_SUB_DPAD_IE_N_BUS_Len (32U) -#define MCU_SUB_DPAD_IE_N_BUS_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_IE_N_BUS MCU_SUB_DPAD_IE_N_BUS_Msk - -/********** Bit definition for MCU_SUB_REG_MSIO_REG register ******************/ -#define MCU_SUB_MSIO_REG0_PFAST_CS_CTRL_Pos (8U) -#define MCU_SUB_MSIO_REG0_PFAST_CS_CTRL_Len (4U) -#define MCU_SUB_MSIO_REG0_PFAST_CS_CTRL_Msk (0xFU << MCU_SUB_MSIO_REG0_PFAST_CS_CTRL_Pos) -#define MCU_SUB_MSIO_REG0_PFAST_CS_CTRL MCU_SUB_MSIO_REG0_PFAST_CS_CTRL_Msk - -#define MCU_SUB_MSIO_REG0_MSIO_C_Pos (0U) -#define MCU_SUB_MSIO_REG0_MSIO_C_Len (5U) -#define MCU_SUB_MSIO_REG0_MSIO_C_Msk (0x1FU << MCU_SUB_MSIO_REG0_MSIO_C_Pos) -#define MCU_SUB_MSIO_REG0_MSIO_C MCU_SUB_MSIO_REG0_MSIO_C_Msk - -/********** Bit definition for MCU_SUB_REG_BLE_FERP_CTL register ****************/ -#define MUC_SUB_BLE_FERP_CTL_TESTBUS_SEL_Pos (4U) -#define MUC_SUB_BLE_FERP_CTL_TESTBUS_SEL_Len (3U) -#define MUC_SUB_BLE_FERP_CTL_TESTBUS_SEL_Msk (0x7U << MUC_SUB_BLE_FERP_CTL_TESTBUS_SEL_Pos) -#define MUC_SUB_BLE_FERP_CTL_TESTBUS_SEL MUC_SUB_BLE_FERP_CTL_TESTBUS_SEL_Msk - -#define MCU_SUB_BLE_FERP_CTL_FERP_EN_Pos (0U) -#define MCU_SUB_BLE_FERP_CTL_FERP_EN_Len (1U) -#define MCU_SUB_BLE_FERP_CTL_FERP_EN_Msk (0x1U << MCU_SUB_BLE_FERP_CTL_FERP_EN_Pos) -#define MCU_SUB_BLE_FERP_CTL_FERP_EN MCU_SUB_BLE_FERP_CTL_FERP_EN_Msk - -/********** Bit definition for MCU_SUB_REG_DMA_ACC_SEL register ****************/ -#define MCU_SUB_DMA_ACC_SEL_I2C1_I2SS_Pos (1U) -#define MCU_SUB_DMA_ACC_SEL_I2C1_I2SS_Len (1U) -#define MCU_SUB_DMA_ACC_SEL_I2C1_I2SS_Msk (0x1U << MCU_SUB_DMA_ACC_SEL_I2C1_I2SS_Pos) -#define MCU_SUB_DMA_ACC_SEL_I2C1_I2SS MCU_SUB_DMA_ACC_SEL_I2C1_I2SS_Msk - -#define MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM_Pos (0U) -#define MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM_Len (1U) -#define MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM_Msk (0x1U << MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM_Pos) -#define MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM MCU_SUB_DMA_ACC_SEL_QSPI1_I2SM_Msk - -/********** Bit definition for MCU_SUB_REG_SECURITY_RESET register ****************/ -#define MCU_SUB_SECURITY_RESET_PRESENT_Pos (6U) -#define MCU_SUB_SECURITY_RESET_PRESENT_Len (1U) -#define MCU_SUB_SECURITY_RESET_PRESENT_Msk (0x1U << MCU_SUB_SECURITY_RESET_PRESENT_Pos) -#define MCU_SUB_SECURITY_RESET_PRESENT MCU_SUB_SECURITY_RESET_PRESENT_Msk - -#define MCU_SUB_SECURITY_RESET_TRNG_Pos (5U) -#define MCU_SUB_SECURITY_RESET_TRNG_Len (1U) -#define MCU_SUB_SECURITY_RESET_TRNG_Msk (0x1U << MCU_SUB_SECURITY_RESET_TRNG_Pos) -#define MCU_SUB_SECURITY_RESET_TRNG MCU_SUB_SECURITY_RESET_TRNG_Msk - -#define MCU_SUB_SECURITY_RESET_RAMKEY_Pos (4U) -#define MCU_SUB_SECURITY_RESET_RAMKEY_Len (1U) -#define MCU_SUB_SECURITY_RESET_RAMKEY_Msk (0x1U << MCU_SUB_SECURITY_RESET_RAMKEY_Pos) -#define MCU_SUB_SECURITY_RESET_RAMKEY MCU_SUB_SECURITY_RESET_RAMKEY_Msk - -#define MCU_SUB_SECURITY_RESET_EFUSE_Pos (3U) -#define MCU_SUB_SECURITY_RESET_EFUSE_Len (1U) -#define MCU_SUB_SECURITY_RESET_EFUSE_Msk (0x1U << MCU_SUB_SECURITY_RESET_EFUSE_Pos) -#define MCU_SUB_SECURITY_RESET_EFUSE MCU_SUB_SECURITY_RESET_EFUSE_Msk - -#define MCU_SUB_SECURITY_RESET_PKC_Pos (2U) -#define MCU_SUB_SECURITY_RESET_PKC_Len (1U) -#define MCU_SUB_SECURITY_RESET_PKC_Msk (0x1U << MCU_SUB_SECURITY_RESET_PKC_Pos) -#define MCU_SUB_SECURITY_RESET_PKC MCU_SUB_SECURITY_RESET_PKC_Msk - -#define MCU_SUB_SECURITY_RESET_HMAC_Pos (1U) -#define MCU_SUB_SECURITY_RESET_HMAC_Len (1U) -#define MCU_SUB_SECURITY_RESET_HMAC_Msk (0x1U << MCU_SUB_SECURITY_RESET_HMAC_Pos) -#define MCU_SUB_SECURITY_RESET_HMAC MCU_SUB_SECURITY_RESET_HMAC_Msk - -#define MCU_SUB_SECURITY_RESET_AES_Pos (0U) -#define MCU_SUB_SECURITY_RESET_AES_Len (1U) -#define MCU_SUB_SECURITY_RESET_AES_Msk (0x1U << MCU_SUB_SECURITY_RESET_AES_Pos) -#define MCU_SUB_SECURITY_RESET_AES MCU_SUB_SECURITY_RESET_AES_Msk - -/********** Bit definition for MCU_SUB_REG_PMU_ID_REG register *****************/ -#define MCU_SUB_PMU_ID_Pos (0U) -#define MCU_SUB_PMU_ID_Len (8U) -#define MCU_SUB_PMU_ID_Msk (0xFFU << MCU_SUB_PMU_ID_Pos) -#define MCU_SUB_PMU_ID MCU_SUB_PMU_ID_Msk - -/********** Bit definition for MCU_SUB_REG_PWR_AVG_CTL_REG register ************/ -#define MCU_SUB_PWR_AVG_CTL0_TPA_ADC_OUT_Pos (24U) -#define MCU_SUB_PWR_AVG_CTL0_TPA_ADC_OUT_Len (8U) -#define MCU_SUB_PWR_AVG_CTL0_TPA_ADC_OUT_Msk (0xFFU << MCU_SUB_PWR_AVG_CTL0_TPA_ADC_OUT_Pos) -#define MCU_SUB_PWR_AVG_CTL0_TPA_ADC_OUT MCU_SUB_PWR_AVG_CTL0_TPA_ADC_OUT_Msk - -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_ERR_Pos (18U) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_ERR_Len (1U) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_ERR_Msk (0x1U << MCU_SUB_PWR_AVG_CTL0_AVG_PWR_ERR_Pos) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_ERR MCU_SUB_PWR_AVG_CTL0_AVG_PWR_ERR_Msk - -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_RDY_Pos (16U) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_RDY_Len (1U) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_RDY_Msk (0x1U << MCU_SUB_PWR_AVG_CTL0_AVG_PWR_RDY_Pos) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_RDY MCU_SUB_PWR_AVG_CTL0_AVG_PWR_RDY_Msk - -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_Pos (8U) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_Len (8U) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR_Msk (0xFFU << MCU_SUB_PWR_AVG_CTL0_AVG_PWR_Pos) -#define MCU_SUB_PWR_AVG_CTL0_AVG_PWR MCU_SUB_PWR_AVG_CTL0_AVG_PWR_Msk - -#define MCU_SUB_PWR_AVG_CTL0_SAMPL_PWR_Pos (4U) -#define MCU_SUB_PWR_AVG_CTL0_SAMPL_PWR_Len (4U) -#define MCU_SUB_PWR_AVG_CTL0_SAMPL_PWR_Msk (0xFU << MCU_SUB_PWR_AVG_CTL0_SAMPL_PWR_Pos) -#define MCU_SUB_PWR_AVG_CTL0_SAMPL_PWR MCU_SUB_PWR_AVG_CTL0_SAMPL_PWR_Msk - -#define MCU_SUB_PWR_AVG_CTL0_BLE_F_TX_EN_Pos (3U) -#define MCU_SUB_PWR_AVG_CTL0_BLE_F_TX_EN_Len (1U) -#define MCU_SUB_PWR_AVG_CTL0_BLE_F_TX_EN_Msk (0x1 << MCU_SUB_PWR_AVG_CTL0_BLE_F_TX_EN_Pos) -#define MCU_SUB_PWR_AVG_CTL0_BLE_F_TX_EN MCU_SUB_PWR_AVG_CTL0_BLE_F_TX_EN_Msk - -#define MCU_SUB_PWR_AVG_CTL0_ONESHOT_EN_Pos (2U) -#define MCU_SUB_PWR_AVG_CTL0_ONESHOT_EN_Len (1U) -#define MCU_SUB_PWR_AVG_CTL0_ONESHOT_EN_Msk (0x1 << MCU_SUB_PWR_AVG_CTL0_ONESHOT_EN_Pos) -#define MCU_SUB_PWR_AVG_CTL0_ONESHOT_EN MCU_SUB_PWR_AVG_CTL0_ONESHOT_EN_Msk - -#define MCU_SUB_PWR_AVG_CTL0_PWR_AVG_EN_Pos (0U) -#define MCU_SUB_PWR_AVG_CTL0_PWR_AVG_EN_Len (1U) -#define MCU_SUB_PWR_AVG_CTL0_PWR_AVG_EN_Msk (0x1 << MCU_SUB_PWR_AVG_CTL0_PWR_AVG_EN_Pos) -#define MCU_SUB_PWR_AVG_CTL0_PWR_AVG_EN MCU_SUB_PWR_AVG_CTL0_PWR_AVG_EN_Msk - -/********** Bit definition for MCU_SUB_REG_CLK_CAL_CTL_REG0 register ************/ -#define MCU_SUB_CLK_CAL_CTL0_EN_Pos (0U) -#define MCU_SUB_CLK_CAL_CTL0_EN_Len (1U) -#define MCU_SUB_CLK_CAL_CTL0_EN_Msk (0x1U << MCU_SUB_CLK_CAL_CTL0_EN_Pos) -#define MCU_SUB_CLK_CAL_CTL0_EN MCU_SUB_CLK_CAL_CTL0_EN_Msk - -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_EN_Pos (1U) -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_EN_Len (1U) -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_EN_Msk (0x1U << MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_EN_Pos) -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_EN MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_EN_Msk - -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_VAL_Pos (4U) -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_VAL_Len (12U) -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_VAL_Msk (0xFFFU << MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_VAL_Pos) -#define MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_VAL MCU_SUB_CLK_CAL_CTL0_CNT_LOAD_VAL_Msk - -#define MCU_SUB_CLK_CAL_CTL0_STS_CNT_RDY_Pos (16U) -#define MCU_SUB_CLK_CAL_CTL0_STS_CNT_RDY_Len (1U) -#define MCU_SUB_CLK_CAL_CTL0_STS_CNT_RDY_Msk (0x1U << MCU_SUB_CLK_CAL_CTL0_STS_CNT_RDY_Pos) -#define MCU_SUB_CLK_CAL_CTL0_STS_CNT_RDY MCU_SUB_CLK_CAL_CTL0_STS_CNT_RDY_Msk - -/********** Bit definition for MCU_SUB_REG_CLK_CAL_CTL_REG1 register ************/ -#define MCU_SUB_CLK_CAL_CTL1_STS_CNT_VAL_Pos (0U) -#define MCU_SUB_CLK_CAL_CTL1_STS_CNT_VAL_Len (24U) -#define MCU_SUB_CLK_CAL_CTL1_STS_CNT_VAL_Msk (0xFFFFFFU << MCU_SUB_CLK_CAL_CTL1_STS_CNT_VAL_Pos) -#define MCU_SUB_CLK_CAL_CTL1_STS_CNT_VAL MCU_SUB_CLK_CAL_CTL1_STS_CNT_VAL_Msk - -/********** Bit definition for MCU_SUB_REG_DPAD_MUX_CTL_00_07 register **********/ -#define MCU_SUB_DPAD_MUX_CTL_00_07_Pos (0U) -#define MCU_SUB_DPAD_MUX_CTL_00_07_Len (32U) -#define MCU_SUB_DPAD_MUX_CTL_00_07_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_MUX_CTL_00_07 MCU_SUB_DPAD_MUX_CTL_00_07_Msk - -#define MCU_SUB_DPAD_MUX_CTL_SEL_Msk (0xFU) -#define MCU_SUB_DPAD_MUX_CTL_SEL_00 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 0) -#define MCU_SUB_DPAD_MUX_CTL_SEL_01 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 4) -#define MCU_SUB_DPAD_MUX_CTL_SEL_02 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 8) -#define MCU_SUB_DPAD_MUX_CTL_SEL_03 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 12) -#define MCU_SUB_DPAD_MUX_CTL_SEL_04 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 16) -#define MCU_SUB_DPAD_MUX_CTL_SEL_05 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 20) -#define MCU_SUB_DPAD_MUX_CTL_SEL_06 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 24) -#define MCU_SUB_DPAD_MUX_CTL_SEL_07 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 28) - -/********** Bit definition for MCU_SUB_REG_DPAD_MUX_CTL_08_15 register **********/ -#define MCU_SUB_DPAD_MUX_CTL_08_15_Pos (0U) -#define MCU_SUB_DPAD_MUX_CTL_08_15_Len (32U) -#define MCU_SUB_DPAD_MUX_CTL_08_15_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_MUX_CTL_08_15 MCU_SUB_DPAD_MUX_CTL_08_15_Msk - -#define MCU_SUB_DPAD_MUX_CTL_SEL_08 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 0) -#define MCU_SUB_DPAD_MUX_CTL_SEL_09 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 4) -#define MCU_SUB_DPAD_MUX_CTL_SEL_10 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 8) -#define MCU_SUB_DPAD_MUX_CTL_SEL_11 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 12) -#define MCU_SUB_DPAD_MUX_CTL_SEL_12 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 16) -#define MCU_SUB_DPAD_MUX_CTL_SEL_13 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 20) -#define MCU_SUB_DPAD_MUX_CTL_SEL_14 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 24) -#define MCU_SUB_DPAD_MUX_CTL_SEL_15 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 28) - -/********** Bit definition for MCU_SUB_REG_DPAD_MUX_CTL_16_23 register **********/ -#define MCU_SUB_DPAD_MUX_CTL_16_23_Pos (0U) -#define MCU_SUB_DPAD_MUX_CTL_16_23_Len (32U) -#define MCU_SUB_DPAD_MUX_CTL_16_23_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_MUX_CTL_16_23 MCU_SUB_DPAD_MUX_CTL_16_23_Msk - -#define MCU_SUB_DPAD_MUX_CTL_SEL_16 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 0) -#define MCU_SUB_DPAD_MUX_CTL_SEL_17 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 4) -#define MCU_SUB_DPAD_MUX_CTL_SEL_18 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 8) -#define MCU_SUB_DPAD_MUX_CTL_SEL_19 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 12) -#define MCU_SUB_DPAD_MUX_CTL_SEL_20 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 16) -#define MCU_SUB_DPAD_MUX_CTL_SEL_21 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 20) -#define MCU_SUB_DPAD_MUX_CTL_SEL_22 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 24) -#define MCU_SUB_DPAD_MUX_CTL_SEL_23 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 28) - -/********** Bit definition for MCU_SUB_REG_DPAD_MUX_CTL_24_31 register ***********/ -#define MCU_SUB_DPAD_MUX_CTL_24_31_Pos (0U) -#define MCU_SUB_DPAD_MUX_CTL_24_31_Len (32U) -#define MCU_SUB_DPAD_MUX_CTL_24_31_Msk (0xFFFFFFFFU) -#define MCU_SUB_DPAD_MUX_CTL_24_31 MCU_SUB_DPAD_MUX_CTL_24_31_Msk - -#define MCU_SUB_DPAD_MUX_CTL_SEL_24 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 0) -#define MCU_SUB_DPAD_MUX_CTL_SEL_25 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 4) -#define MCU_SUB_DPAD_MUX_CTL_SEL_26 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 8) -#define MCU_SUB_DPAD_MUX_CTL_SEL_27 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 12) -#define MCU_SUB_DPAD_MUX_CTL_SEL_28 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 16) -#define MCU_SUB_DPAD_MUX_CTL_SEL_29 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 20) -#define MCU_SUB_DPAD_MUX_CTL_SEL_30 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 24) -#define MCU_SUB_DPAD_MUX_CTL_SEL_31 (MCU_SUB_DPAD_MUX_CTL_SEL_Msk << 28) - -/********** Bit definition for MCU_SUB_REG_EFUSE_PWR_DELTA0 register ***********/ -#define MCU_SUB_EFUSE_PWR_DELTA0_Pos (0U) -#define MCU_SUB_EFUSE_PWR_DELTA0_Len (16U) -#define MCU_SUB_EFUSE_PWR_DELTA0_Msk (0xFFFFU << MCU_SUB_EFUSE_PWR_DELTA0_Pos) -#define MCU_SUB_EFUSE_PWR_DELTA0 MCU_SUB_EFUSE_PWR_DELTA0_Msk - -#define MCU_SUB_EFUSE_PWR_DELTA1_Pos (16U) -#define MCU_SUB_EFUSE_PWR_DELTA1_Len (16U) -#define MCU_SUB_EFUSE_PWR_DELTA1_Msk (0xFFFFU << MCU_SUB_EFUSE_PWR_DELTA1_Pos) -#define MCU_SUB_EFUSE_PWR_DELTA1 MCU_SUB_EFUSE_PWR_DELTA1_Msk - -/********** Bit definition for MCU_SUB_REG_EFUSE_PWR_DELTA0 register ***********/ -#define MCU_SUB_EFUSE_PWR_DELTA2_Pos (0U) -#define MCU_SUB_EFUSE_PWR_DELTA2_Len (16U) -#define MCU_SUB_EFUSE_PWR_DELTA2_Msk (0xFFFFU << MCU_SUB_EFUSE_PWR_DELTA2_Pos) -#define MCU_SUB_EFUSE_PWR_DELTA2 MCU_SUB_EFUSE_PWR_DELTA2_Msk - -/********** Bit definition for MCU_SUB_REG_EFUSE_PWR_CTRL0 register ***********/ -#define MCU_SUB_EFUSE_PWR_CTL0_EN_Pos (0U) -#define MCU_SUB_EFUSE_PWR_CTL0_EN_Len (1U) -#define MCU_SUB_EFUSE_PWR_CTL0_EN_Msk (0x1U << MCU_SUB_EFUSE_PWR_CTL0_EN_Pos) -#define MCU_SUB_EFUSE_PWR_CTL0_EN MCU_SUB_EFUSE_PWR_CTL0_EN_Msk - -#define MCU_SUB_EFUSE_PWR_CTL0_BGN_Pos (2U) -#define MCU_SUB_EFUSE_PWR_CTL0_BGN_Len (1U) -#define MCU_SUB_EFUSE_PWR_CTL0_BGN_Msk (0x1U << MCU_SUB_EFUSE_PWR_CTL0_BGN_Pos) -#define MCU_SUB_EFUSE_PWR_CTL0_BGN MCU_SUB_EFUSE_PWR_CTL0_BGN_Msk - -#define MCU_SUB_EFUSE_PWR_CTL0_STP_Pos (4U) -#define MCU_SUB_EFUSE_PWR_CTL0_STP_Len (1U) -#define MCU_SUB_EFUSE_PWR_CTL0_STP_Msk (0x1U << MCU_SUB_EFUSE_PWR_CTL0_STP_Pos) -#define MCU_SUB_EFUSE_PWR_CTL0_STP MCU_SUB_EFUSE_PWR_CTL0_STP_Msk - -/********** Bit definition for MCU_SUB_REG_EFUSE_PWR_CTRL1 register ***********/ -#define MCU_SUB_EFUSE_PWR_CTL0_EN_DONE_Pos (0U) -#define MCU_SUB_EFUSE_PWR_CTL0_EN_DONE_Len (1U) -#define MCU_SUB_EFUSE_PWR_CTL0_EN_DONE_Msk (0x1U << MCU_SUB_EFUSE_PWR_CTL0_EN_DONE_Pos) -#define MCU_SUB_EFUSE_PWR_CTL0_EN_DONE MCU_SUB_EFUSE_PWR_CTL0_EN_DONE_Msk - -#define MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE_Pos (4U) -#define MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE_Len (1U) -#define MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE_Msk (0x1U << MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE_Pos) -#define MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE MCU_SUB_EFUSE_PWR_CTL0_DIS_DONE_Msk - -/********** Bit definition for MCU_SUB_REG_I2S_CLK_CFG register ***********/ -#define MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL_Pos (18U) -#define MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL_Len (1U) -#define MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL_Msk (0x1U << MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL_Pos) -#define MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL MCU_SUB_I2S_CLK_CFG_SRC_CLK_SEL_Msk - -#define MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN_Pos (16U) -#define MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN_Len (1U) -#define MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN_Msk (0x1U << MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN_Pos) -#define MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN MCU_SUB_I2S_CLK_CFG_CLK_DIV_EN_Msk - -#define MCU_SUB_I2S_CLK_CFG_DIV_CNT_Pos (0U) -#define MCU_SUB_I2S_CLK_CFG_DIV_CNT_Len (12U) -#define MCU_SUB_I2S_CLK_CFG_DIV_CNT_Msk (0xFFFU << MCU_SUB_I2S_CLK_CFG_DIV_CNT_Pos) -#define MCU_SUB_I2S_CLK_CFG_DIV_CNT MCU_SUB_I2S_CLK_CFG_DIV_CNT_Msk - -/********** Bit definition for MCU_SUB_REG_AON_PAD_MUX_CTL register ***********/ -#define MCU_SUB_AON_MUX_CTL_00_07_Pos (0U) -#define MCU_SUB_AON_MUX_CTL_00_07_Len (32U) -#define MCU_SUB_AON_MUX_CTL_00_07_Msk (0x00777770U) -#define MCU_SUB_AON_MUX_CTL_00_07 MCU_SUB_AON_MUX_CTL_00_07_Msk - -#define MCU_SUB_AON_MUX_CTL_SEL_Msk (0x7U) -#define MCU_SUB_AON_MUX_CTL_SEL_01 (MCU_SUB_AON_MUX_CTL_SEL_Msk << 4) -#define MCU_SUB_AON_MUX_CTL_SEL_02 (MCU_SUB_AON_MUX_CTL_SEL_Msk << 8) -#define MCU_SUB_AON_MUX_CTL_SEL_03 (MCU_SUB_AON_MUX_CTL_SEL_Msk << 12) -#define MCU_SUB_AON_MUX_CTL_SEL_04 (MCU_SUB_AON_MUX_CTL_SEL_Msk << 16) -#define MCU_SUB_AON_MUX_CTL_SEL_05 (MCU_SUB_AON_MUX_CTL_SEL_Msk << 20) - -/********** Bit definition for MCU_SUB_REG_MSIO_PAD_MUX_CTL register ***********/ -#define MCU_SUB_MSIO_MUX_CTL_00_04_Pos (0U) -#define MCU_SUB_MSIO_MUX_CTL_00_04_Len (32U) -#define MCU_SUB_MSIO_MUX_CTL_00_04_Msk (0x77777U) -#define MCU_SUB_MSIO_MUX_CTL_00_04 MCU_SUB_MSIO_MUX_CTL_00_04_Msk - -#define MCU_SUB_MSIO_MUX_CTL_SEL_Msk (0x7U) -#define MCU_SUB_MSIO_MUX_CTL_SEL_00 (MCU_SUB_MSIO_MUX_CTL_SEL_Msk << 0) -#define MCU_SUB_MSIO_MUX_CTL_SEL_01 (MCU_SUB_MSIO_MUX_CTL_SEL_Msk << 4) -#define MCU_SUB_MSIO_MUX_CTL_SEL_02 (MCU_SUB_MSIO_MUX_CTL_SEL_Msk << 8) -#define MCU_SUB_MSIO_MUX_CTL_SEL_03 (MCU_SUB_MSIO_MUX_CTL_SEL_Msk << 12) -#define MCU_SUB_MSIO_MUX_CTL_SEL_04 (MCU_SUB_MSIO_MUX_CTL_SEL_Msk << 16) - -/********** Bit definition for MCU_SUB_REG_MCU_SUBSYS_CG_CTRL_0 register ***********/ -#define MCU_SUB_WFI_MSK_HCLK_0 (0xFFFU) - -#define MCU_SUB_WFI_I2S_S_HCLK_Pos (11U) -#define MCU_SUB_WFI_I2S_S_HCLK_Len (1U) -#define MCU_SUB_WFI_I2S_S_HCLK_Msk (0x01 << MCU_SUB_WFI_I2S_S_HCLK_Pos) -#define MCU_SUB_WFI_I2S_S_HCLK MCU_SUB_WFI_I2S_S_HCLK_Msk - -#define MCU_SUB_WFI_SERIAL_HCLK_Pos (10U) -#define MCU_SUB_WFI_SERIAL_HCLK_Len (1U) -#define MCU_SUB_WFI_SERIAL_HCLK_Msk (0x01 << MCU_SUB_WFI_SERIAL_HCLK_Pos) -#define MCU_SUB_WFI_SERIAL_HCLK MCU_SUB_WFI_SERIAL_HCLK_Msk - -#define MCU_SUB_WFI_APB_SUB_HCLK_Pos (9U) -#define MCU_SUB_WFI_APB_SUB_HCLK_Len (1U) -#define MCU_SUB_WFI_APB_SUB_HCLK_Msk (0x01 << MCU_SUB_WFI_APB_SUB_HCLK_Pos) -#define MCU_SUB_WFI_APB_SUB_HCLK MCU_SUB_WFI_APB_SUB_HCLK_Msk - -#define MCU_SUB_WFI_BLE_BRG_HCLK_Pos (8U) -#define MCU_SUB_WFI_BLE_BRG_HCLK_Len (1U) -#define MCU_SUB_WFI_BLE_BRG_HCLK_Msk (0x01 << MCU_SUB_WFI_BLE_BRG_HCLK_Pos) -#define MCU_SUB_WFI_BLE_BRG_HCLK MCU_SUB_WFI_BLE_BRG_HCLK_Msk - -#define MCU_SUB_WFI_DMA_HCLK_Pos (7U) -#define MCU_SUB_WFI_DMA_HCLK_Len (1U) -#define MCU_SUB_WFI_DMA_HCLK_Msk (0x01 << MCU_SUB_WFI_DMA_HCLK_Pos) -#define MCU_SUB_WFI_DMA_HCLK MCU_SUB_WFI_DMA_HCLK_Msk - -#define MCU_SUB_WFI_GPIO_HCLK_Pos (6U) -#define MCU_SUB_WFI_GPIO_HCLK_Len (1U) -#define MCU_SUB_WFI_GPIO_HCLK_Msk (0x01 << MCU_SUB_WFI_GPIO_HCLK_Pos) -#define MCU_SUB_WFI_GPIO_HCLK MCU_SUB_WFI_GPIO_HCLK_Msk - -#define MCU_SUB_WFI_SNSADC_HCLK_Pos (5U) -#define MCU_SUB_WFI_SNSADC_HCLK_Len (1U) -#define MCU_SUB_WFI_SNSADC_HCLK_Msk (0x01 << MCU_SUB_WFI_SNSADC_HCLK_Pos) -#define MCU_SUB_WFI_SNSADC_HCLK MCU_SUB_WFI_SNSADC_HCLK_Msk - -#define MCU_SUB_WFI_ROM_HCLK_Pos (4U) -#define MCU_SUB_WFI_ROM_HCLK_Len (1U) -#define MCU_SUB_WFI_ROM_HCLK_Msk (0x01 << MCU_SUB_WFI_ROM_HCLK_Pos) -#define MCU_SUB_WFI_ROM_HCLK MCU_SUB_WFI_ROM_HCLK_Msk - -#define MCU_SUB_WFI_PWM_HCLK_Pos (3U) -#define MCU_SUB_WFI_PWM_HCLK_Len (1U) -#define MCU_SUB_WFI_PWM_HCLK_Msk (0x01 << MCU_SUB_WFI_PWM_HCLK_Pos) -#define MCU_SUB_WFI_PWM_HCLK MCU_SUB_WFI_PWM_HCLK_Msk - -#define MCU_SUB_WFI_HTB_HCLK_Pos (2U) -#define MCU_SUB_WFI_HTB_HCLK_Len (1U) -#define MCU_SUB_WFI_HTB_HCLK_Msk (0x01 << MCU_SUB_WFI_HTB_HCLK_Pos) -#define MCU_SUB_WFI_HTB_HCLK MCU_SUB_WFI_HTB_HCLK_Msk - -#define MCU_SUB_WFI_SIM_HCLK_Pos (1U) -#define MCU_SUB_WFI_SIM_HCLK_Len (1U) -#define MCU_SUB_WFI_SIM_HCLK_Msk (0x01 << MCU_SUB_WFI_SIM_HCLK_Pos) -#define MCU_SUB_WFI_SIM_HCLK MCU_SUB_WFI_SIM_HCLK_Msk - -#define MCU_SUB_WFI_SECU_HCLK_Pos (0U) -#define MCU_SUB_WFI_SECU_HCLK_Len (1U) -#define MCU_SUB_WFI_SECU_HCLK_Msk (0x01 << MCU_SUB_WFI_SECU_HCLK_Pos) -#define MCU_SUB_WFI_SECU_HCLK MCU_SUB_WFI_SECU_HCLK_Msk - -/********** Bit definition for MCU_SUB_REG_MCU_SUBSYS_CG_CTRL_1 register ***********/ -#define MCU_SUB_FORCE_MSK_HCLK_0 (0xFFFU) - -#define MCU_SUB_FORCE_I2S_S_HCLK_Pos (11U) -#define MCU_SUB_FORCE_I2S_S_HCLK_Len (1U) -#define MCU_SUB_FORCE_I2S_S_HCLK_Msk (0x01 << MCU_SUB_FORCE_I2S_S_HCLK_Pos) -#define MCU_SUB_FORCE_I2S_S_HCLK MCU_SUB_FORCE_I2S_S_HCLK_Msk - -#define MCU_SUB_FORCE_SERIAL_HCLK_Pos (10U) -#define MCU_SUB_FORCE_SERIAL_HCLK_Len (1U) -#define MCU_SUB_FORCE_SERIAL_HCLK_Msk (0x01 << MCU_SUB_FORCE_SERIAL_HCLK_Pos) -#define MCU_SUB_FORCE_SERIAL_HCLK MCU_SUB_FORCE_SERIAL_HCLK_Msk - -#define MCU_SUB_FORCE_APB_SUB_HCLK_Pos (9U) -#define MCU_SUB_FORCE_APB_SUB_HCLK_Len (1U) -#define MCU_SUB_FORCE_APB_SUB_HCLK_Msk (0x01 << MCU_SUB_FORCE_APB_SUB_HCLK_Pos) -#define MCU_SUB_FORCE_APB_SUB_HCLK MCU_SUB_FORCE_APB_SUB_HCLK_Msk - -#define MCU_SUB_FORCE_BLE_BRG_HCLK_Pos (8U) -#define MCU_SUB_FORCE_BLE_BRG_HCLK_Len (1U) -#define MCU_SUB_FORCE_BLE_BRG_HCLK_Msk (0x01 << MCU_SUB_FORCE_BLE_BRG_HCLK_Pos) -#define MCU_SUB_FORCE_BLE_BRG_HCLK MCU_SUB_FORCE_BLE_BRG_HCLK_Msk - -#define MCU_SUB_FORCE_DMA_HCLK_Pos (7U) -#define MCU_SUB_FORCE_DMA_HCLK_Len (1U) -#define MCU_SUB_FORCE_DMA_HCLK_Msk (0x01 << MCU_SUB_FORCE_DMA_HCLK_Pos) -#define MCU_SUB_FORCE_DMA_HCLK MCU_SUB_FORCE_DMA_HCLK_Msk - -#define MCU_SUB_FORCE_GPIO_HCLK_Pos (6U) -#define MCU_SUB_FORCE_GPIO_HCLK_Len (1U) -#define MCU_SUB_FORCE_GPIO_HCLK_Msk (0x01 << MCU_SUB_FORCE_GPIO_HCLK_Pos) -#define MCU_SUB_FORCE_GPIO_HCLK MCU_SUB_FORCE_GPIO_HCLK_Msk - -#define MCU_SUB_FORCE_SNSADC_HCLK_Pos (5U) -#define MCU_SUB_FORCE_SNSADC_HCLK_Len (1U) -#define MCU_SUB_FORCE_SNSADC_HCLK_Msk (0x01 << MCU_SUB_FORCE_SNSADC_HCLK_Pos) -#define MCU_SUB_FORCE_SNSADC_HCLK MCU_SUB_FORCE_SNSADC_HCLK_Msk - -#define MCU_SUB_FORCE_ROM_HCLK_Pos (4U) -#define MCU_SUB_FORCE_ROM_HCLK_Len (1U) -#define MCU_SUB_FORCE_ROM_HCLK_Msk (0x01 << MCU_SUB_FORCE_ROM_HCLK_Pos) -#define MCU_SUB_FORCE_ROM_HCLK MCU_SUB_FORCE_ROM_HCLK_Msk - -#define MCU_SUB_FORCE_PWM_HCLK_Pos (3U) -#define MCU_SUB_FORCE_PWM_HCLK_Len (1U) -#define MCU_SUB_FORCE_PWM_HCLK_Msk (0x01 << MCU_SUB_FORCE_PWM_HCLK_Pos) -#define MCU_SUB_FORCE_PWM_HCLK MCU_SUB_FORCE_PWM_HCLK_Msk - -#define MCU_SUB_FORCE_HTB_HCLK_Pos (2U) -#define MCU_SUB_FORCE_HTB_HCLK_Len (1U) -#define MCU_SUB_FORCE_HTB_HCLK_Msk (0x01 << MCU_SUB_FORCE_HTB_HCLK_Pos) -#define MCU_SUB_FORCE_HTB_HCLK MCU_SUB_FORCE_HTB_HCLK_Msk - -#define MCU_SUB_FORCE_SIM_HCLK_Pos (1U) -#define MCU_SUB_FORCE_SIM_HCLK_Len (1U) -#define MCU_SUB_FORCE_SIM_HCLK_Msk (0x01 << MCU_SUB_FORCE_SIM_HCLK_Pos) -#define MCU_SUB_FORCE_SIM_HCLK MCU_SUB_FORCE_SIM_HCLK_Msk - -#define MCU_SUB_FORCE_SECU_HCLK_Pos (0U) -#define MCU_SUB_FORCE_SECU_HCLK_Len (1U) -#define MCU_SUB_FORCE_SECU_HCLK_Msk (0x01 << MCU_SUB_FORCE_SECU_HCLK_Pos) -#define MCU_SUB_FORCE_SECU_HCLK MCU_SUB_FORCE_SECU_HCLK_Msk - -/********** Bit definition for MCU_SUB_REG_MCU_SUBSYS_CG_CTRL_2 register ***********/ -#define MCU_SUB_FORCE_MSK_HCLK_1 (0x00070000U) - -#define MCU_SUB_FORCE_SRAM_HCLK_Pos (18U) -#define MCU_SUB_FORCE_SRAM_HCLK_Len (1U) -#define MCU_SUB_FORCE_SRAM_HCLK_Msk (0x1UL << MCU_SUB_FORCE_SRAM_HCLK_Pos) -#define MCU_SUB_FORCE_SRAM_HCLK MCU_SUB_FORCE_SRAM_HCLK_Msk - -#define MCU_SUB_FORCE_XF_XQSPI_HCLK_Pos (17U) -#define MCU_SUB_FORCE_XF_XQSPI_HCLK_Len (1U) -#define MCU_SUB_FORCE_XF_XQSPI_HCLK_Msk (0x1UL << MCU_SUB_FORCE_XF_XQSPI_HCLK_Pos) -#define MCU_SUB_FORCE_XF_XQSPI_HCLK MCU_SUB_FORCE_XF_XQSPI_HCLK_Msk - -#define MCU_SUB_FORCE_AON_MCUSUB_HCLK_Pos (16U) -#define MCU_SUB_FORCE_AON_MCUSUB_HCLK_Len (1U) -#define MCU_SUB_FORCE_AON_MCUSUB_HCLK_Msk (0x1UL << MCU_SUB_FORCE_AON_MCUSUB_HCLK_Pos) -#define MCU_SUB_FORCE_AON_MCUSUB_HCLK MCU_SUB_FORCE_AON_MCUSUB_HCLK_Msk - -#define MCU_SUB_WFI_MSK_HCLK_1 (0x00000007U) - -#define MCU_SUB_WFI_SRAM_HCLK_Pos (2U) -#define MCU_SUB_WFI_SRAM_HCLK_Len (1U) -#define MCU_SUB_WFI_SRAM_HCLK_Msk (0x1UL << MCU_SUB_WFI_SRAM_HCLK_Pos) -#define MCU_SUB_WFI_SRAM_HCLK MCU_SUB_WFI_SRAM_HCLK_Msk - -#define MCU_SUB_WFI_XF_XQSPI_HCLK_Pos (1U) -#define MCU_SUB_WFI_XF_XQSPI_HCLK_Len (1U) -#define MCU_SUB_WFI_XF_XQSPI_HCLK_Msk (0x1UL << MCU_SUB_WFI_XF_XQSPI_HCLK_Pos) -#define MCU_SUB_WFI_XF_XQSPI_HCLK MCU_SUB_WFI_XF_XQSPI_HCLK_Msk - -#define MCU_SUB_WFI_AON_MCUSUB_HCLK_Pos (0U) -#define MCU_SUB_WFI_AON_MCUSUB_HCLK_Len (1U) -#define MCU_SUB_WFI_AON_MCUSUB_HCLK_Msk (0x1UL << MCU_SUB_WFI_AON_MCUSUB_HCLK_Pos) -#define MCU_SUB_WFI_AON_MCUSUB_HCLK MCU_SUB_WFI_AON_MCUSUB_HCLK_Msk - -/********** Bit definition for MCU_SUB_REG_MCU_PERIPH_GC register ***********/ -#define MCU_SUB_FORCE_MSK_HCLK_2 (0x0A01FF00U) -#define MCU_SUB_WFI_MSK_HCLK_2 (0x05000000U) -#define MCU_SUB_FORCE_XQSPI_DIV4_PCLK_Pos (27U) -#define MCU_SUB_FORCE_XQSPI_DIV4_PCLK_Len (1U) -#define MCU_SUB_FORCE_XQSPI_DIV4_PCLK_Msk (0x1UL << MCU_SUB_FORCE_XQSPI_DIV4_PCLK_Pos) -#define MCU_SUB_FORCE_XQSPI_DIV4_PCLK MCU_SUB_FORCE_XQSPI_DIV4_PCLK_Msk - -#define MCU_SUB_WFI_XQSPI_DIV4_PCLK_Pos (26U) -#define MCU_SUB_WFI_XQSPI_DIV4_PCLK_Len (1U) -#define MCU_SUB_WFI_XQSPI_DIV4_PCLK_Msk (0x1UL << MCU_SUB_WFI_XQSPI_DIV4_PCLK_Pos) -#define MCU_SUB_WFI_XQSPI_DIV4_PCLK MCU_SUB_WFI_XQSPI_DIV4_PCLK_Msk - -#define MCU_SUB_FORCE_SECU_DIV4_PCLK_Pos (25U) -#define MCU_SUB_FORCE_SECU_DIV4_PCLK_Len (1U) -#define MCU_SUB_FORCE_SECU_DIV4_PCLK_Msk (0x1UL << MCU_SUB_FORCE_SECU_DIV4_PCLK_Pos) -#define MCU_SUB_FORCE_SECU_DIV4_PCLK MCU_SUB_FORCE_SECU_DIV4_PCLK_Msk - -#define MCU_SUB_WFI_SECU_DIV4_PCLK_Pos (24U) -#define MCU_SUB_WFI_SECU_DIV4_PCLK_Len (1U) -#define MCU_SUB_WFI_SECU_DIV4_PCLK_Msk (0x1UL << MCU_SUB_WFI_SECU_DIV4_PCLK_Pos) -#define MCU_SUB_WFI_SECU_DIV4_PCLK MCU_SUB_WFI_SECU_DIV4_PCLK_Msk - -#define MCU_SUB_FORCE_I2S_HCLK_Pos (16U) -#define MCU_SUB_FORCE_I2S_HCLK_Len (1U) -#define MCU_SUB_FORCE_I2S_HCLK_Msk (0x1UL << MCU_SUB_FORCE_I2S_HCLK_Pos) -#define MCU_SUB_FORCE_I2S_HCLK MCU_SUB_FORCE_I2S_HCLK_Msk - -#define MCU_SUB_FORCE_QSPI1_HCLK_Pos (15U) -#define MCU_SUB_FORCE_QSPI1_HCLK_Len (1U) -#define MCU_SUB_FORCE_QSPI1_HCLK_Msk (0x1UL << MCU_SUB_FORCE_QSPI1_HCLK_Pos) -#define MCU_SUB_FORCE_QSPI1_HCLK MCU_SUB_FORCE_QSPI1_HCLK_Msk - -#define MCU_SUB_FORCE_QSPI0_HCLK_Pos (14U) -#define MCU_SUB_FORCE_QSPI0_HCLK_Len (1U) -#define MCU_SUB_FORCE_QSPI0_HCLK_Msk (0x1UL << MCU_SUB_FORCE_QSPI0_HCLK_Pos) -#define MCU_SUB_FORCE_QSPI0_HCLK MCU_SUB_FORCE_QSPI0_HCLK_Msk - -#define MCU_SUB_FORCE_SPIS_HCLK_Pos (13U) -#define MCU_SUB_FORCE_SPIS_HCLK_Len (1U) -#define MCU_SUB_FORCE_SPIS_HCLK_Msk (0x1UL << MCU_SUB_FORCE_SPIS_HCLK_Pos) -#define MCU_SUB_FORCE_SPIS_HCLK MCU_SUB_FORCE_SPIS_HCLK_Msk - -#define MCU_SUB_FORCE_SPIM_HCLK_Pos (12U) -#define MCU_SUB_FORCE_SPIM_HCLK_Len (1U) -#define MCU_SUB_FORCE_SPIM_HCLK_Msk (0x1UL << MCU_SUB_FORCE_SPIM_HCLK_Pos) -#define MCU_SUB_FORCE_SPIM_HCLK MCU_SUB_FORCE_SPIM_HCLK_Msk - -#define MCU_SUB_FORCE_I2C1_HCLK_Pos (11U) -#define MCU_SUB_FORCE_I2C1_HCLK_Len (1U) -#define MCU_SUB_FORCE_I2C1_HCLK_Msk (0x1UL << MCU_SUB_FORCE_I2C1_HCLK_Pos) -#define MCU_SUB_FORCE_I2C1_HCLK MCU_SUB_FORCE_I2C1_HCLK_Msk - -#define MCU_SUB_FORCE_I2C0_HCLK_Pos (10U) -#define MCU_SUB_FORCE_I2C0_HCLK_Len (1U) -#define MCU_SUB_FORCE_I2C0_HCLK_Msk (0x1UL << MCU_SUB_FORCE_I2C0_HCLK_Pos) -#define MCU_SUB_FORCE_I2C0_HCLK MCU_SUB_FORCE_I2C0_HCLK_Msk - -#define MCU_SUB_FORCE_UART1_HCLK_Pos (9U) -#define MCU_SUB_FORCE_UART1_HCLK_Len (1U) -#define MCU_SUB_FORCE_UART1_HCLK_Msk (0x1UL << MCU_SUB_FORCE_UART1_HCLK_Pos) -#define MCU_SUB_FORCE_UART1_HCLK MCU_SUB_FORCE_UART1_HCLK_Msk - -#define MCU_SUB_FORCE_UART0_HCLK_Pos (8U) -#define MCU_SUB_FORCE_UART0_HCLK_Len (1U) -#define MCU_SUB_FORCE_UART0_HCLK_Msk (0x1UL << MCU_SUB_FORCE_UART0_HCLK_Pos) -#define MCU_SUB_FORCE_UART0_HCLK MCU_SUB_FORCE_UART0_HCLK_Msk - -#define MCU_SUB_I2S_LP_EN_Pos (2U) -#define MCU_SUB_I2S_LP_EN_Len (1U) -#define MCU_SUB_I2S_LP_EN_Msk (0x1UL << MCU_SUB_I2S_LP_EN_Pos) -#define MCU_SUB_I2S_LP_EN MCU_SUB_I2S_LP_EN_Msk - -#define MCU_SUB_UART_LP_PCLK_EN_Pos (1U) -#define MCU_SUB_UART_LP_PCLK_EN_Len (1U) -#define MCU_SUB_UART_LP_PCLK_EN_Msk (0x1UL << MCU_SUB_UART_LP_PCLK_EN_Pos) -#define MCU_SUB_UART_LP_PCLK_EN MCU_SUB_UART_LP_PCLK_EN_Msk - -#define MCU_SUB_UART_LP_SCLK_EN_Pos (0U) -#define MCU_SUB_UART_LP_SCLK_EN_Len (1U) -#define MCU_SUB_UART_LP_SCLK_EN_Msk (0x1UL << MCU_SUB_UART_LP_SCLK_EN_Pos) -#define MCU_SUB_UART_LP_SCLK_EN MCU_SUB_UART_LP_SCLK_EN_Msk - -/********** Bit definition for MCU_SUB_REG_BLE_DSLEEP_CORR_EN register ***********/ -#define MCU_SUB_BLE_DSLEEP_CORR_EN_Pos (0U) -#define MCU_SUB_BLE_DSLEEP_CORR_EN_Len (2U) -#define MCU_SUB_BLE_DSLEEP_CORR_EN_Msk (0x3U << MCU_SUB_BLE_DSLEEP_CORR_EN_Pos) -#define MCU_SUB_BLE_DSLEEP_CORR_HW_EN (0x02 << MCU_SUB_BLE_DSLEEP_CORR_EN_Pos) -#define MCU_SUB_BLE_DSLEEP_CORR_SW_EN (0x01 << MCU_SUB_BLE_DSLEEP_CORR_EN_Pos) - -/********** Bit definition for MCU_SUB_REG_BLE_DSLEEP_HW_TIM_CORR register ***********/ -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_CLK_PERIOD_Pos (12U) -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_CLK_PERIOD_Len (18U) -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_CLK_PERIOD_Msk (0x3FFFFU << MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_CLK_PERIOD_Pos) -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_CLK_PERIOD MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_CLK_PERIOD_Msk - -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_DELAY_Pos (0U) -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_DELAY_Len (9U) -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_DELAY_Msk (0x1FFU << MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_DELAY_Pos) -#define MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_DELAY MCU_SUB_BLE_DSLEEP_HW_TIM_CORR_DELAY_Msk - -/* ================================================================================================================= */ -/* ================ PKC ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for PKC_CTRL register *******************/ -#define PKC_CTRL_EN_Pos (0U) -#define PKC_CTRL_EN_Len (1U) -#define PKC_CTRL_EN_Msk (0x1U << PKC_CTRL_EN_Pos) -#define PKC_CTRL_EN PKC_CTRL_EN_Msk - -#define PKC_CTRL_START_Pos (1U) -#define PKC_CTRL_START_Len (1U) -#define PKC_CTRL_START_Msk (0x1U << PKC_CTRL_START_Pos) -#define PKC_CTRL_START PKC_CTRL_START_Msk - -#define PKC_CTRL_SWCTRL_Pos (4U) -#define PKC_CTRL_SWCTRL_Len (1U) -#define PKC_CTRL_SWCTRL_Msk (0x1U << PKC_CTRL_SWCTRL_Pos) -#define PKC_CTRL_SWCTRL PKC_CTRL_SWCTRL_Msk - -#define PKC_CTRL_SWRST_Pos (8U) -#define PKC_CTRL_SWRST_Len (1U) -#define PKC_CTRL_SWRST_Msk (0x1U << PKC_CTRL_SWRST_Pos) -#define PKC_CTRL_SWRST PKC_CTRL_SWRST_Msk - -/******************* Bit definition for PKC_CONFIG0 register ****************/ -#define PKC_CONFIG0_KPTR_Pos (0U) -#define PKC_CONFIG0_KPTR_Len (9U) -#define PKC_CONFIG0_KPTR_Msk (0x000001FFU) -#define PKC_CONFIG0_KPTR PKC_CONFIG0_KPTR_Msk - -#define PKC_CONFIG0_RPTR_Pos (16U) -#define PKC_CONFIG0_RPTR_Len (9U) -#define PKC_CONFIG0_RPTR_Msk (0x01FF0000U) -#define PKC_CONFIG0_RPTR PKC_CONFIG0_RPTR_Msk - -/******************* Bit definition for PKC_CONFIG1 register ****************/ -#define PKC_CONFIG1_PPTR_Pos (0U) -#define PKC_CONFIG1_PPTR_Len (9U) -#define PKC_CONFIG1_PPTR_Msk (0x000001FFU) -#define PKC_CONFIG1_PPTR PKC_CONFIG1_PPTR_Msk - -#define PKC_CONFIG1_RSQPTR_Pos (16U) -#define PKC_CONFIG1_RSQPTR_Len (9U) -#define PKC_CONFIG1_RSQPTR_Msk (0x01FF0000U) -#define PKC_CONFIG1_RSQPTR PKC_CONFIG1_RSQPTR_Msk - -/******************* Bit definition for PKC_CONFIG2 register ****************/ -#define PKC_CONFIG2_GXPTR_Pos (0U) -#define PKC_CONFIG2_GXPTR_Len (9U) -#define PKC_CONFIG2_GXPTR_Msk (0x000001FFU) -#define PKC_CONFIG2_GXPTR PKC_CONFIG2_GXPTR_Msk - -#define PKC_CONFIG2_GYPTR_Pos (16U) -#define PKC_CONFIG2_GYPTR_Len (9U) -#define PKC_CONFIG2_GYPTR_Msk (0x01FF0000U) -#define PKC_CONFIG2_GYPTR PKC_CONFIG2_GYPTR_Msk - -/******************* Bit definition for PKC_CONFIG3 register ****************/ -#define PKC_CONFIG3_GZPTR_Pos (0U) -#define PKC_CONFIG3_GZPTR_Len (9U) -#define PKC_CONFIG3_GZPTR_Msk (0x000001FFU) -#define PKC_CONFIG3_GZPTR PKC_CONFIG3_GZPTR_Msk - -#define PKC_CONFIG3_R0XPTR_Pos (16U) -#define PKC_CONFIG3_R0XPTR_Len (9U) -#define PKC_CONFIG3_R0XPTR_Msk (0x01FF0000U) -#define PKC_CONFIG3_R0XPTR PKC_CONFIG3_R0XPTR_Msk - -/******************* Bit definition for PKC_CONFIG4 register ****************/ -#define PKC_CONFIG4_R0YPTR_Pos (0U) -#define PKC_CONFIG4_R0YPTR_Len (9U) -#define PKC_CONFIG4_R0YPTR_Msk (0x000001FFU) -#define PKC_CONFIG4_R0YPTR PKC_CONFIG4_R0YPTR_Msk - -#define PKC_CONFIG4_R0ZPTR_Pos (16U) -#define PKC_CONFIG4_R0ZPTR_Len (9U) -#define PKC_CONFIG4_R0ZPTR_Msk (0x01FF0000U) -#define PKC_CONFIG4_R0ZPTR PKC_CONFIG4_R0ZPTR_Msk - -/******************* Bit definition for PKC_CONFIG5 register ****************/ -#define PKC_CONFIG5_R1XPTR_Pos (0U) -#define PKC_CONFIG5_R1XPTR_Len (9U) -#define PKC_CONFIG5_R1XPTR_Msk (0x000001FFU) -#define PKC_CONFIG5_R1XPTR PKC_CONFIG5_R1XPTR_Msk - -#define PKC_CONFIG5_R1YPTR_Pos (16U) -#define PKC_CONFIG5_R1YPTR_Len (9U) -#define PKC_CONFIG5_R1YPTR_Msk (0x01FF0000U) -#define PKC_CONFIG5_R1YPTR PKC_CONFIG5_R1YPTR_Msk - -/******************* Bit definition for PKC_CONFIG6 register ****************/ -#define PKC_CONFIG6_R1ZPTR_Pos (0U) -#define PKC_CONFIG6_R1ZPTR_Len (9U) -#define PKC_CONFIG6_R1ZPTR_Msk (0x000001FFU) -#define PKC_CONFIG6_R1ZPTR PKC_CONFIG6_R1ZPTR_Msk - -#define PKC_CONFIG6_TMP1PTR_Pos (16U) -#define PKC_CONFIG6_TMP1PTR_Len (9U) -#define PKC_CONFIG6_TMP1PTR_Msk (0x01FF0000U) -#define PKC_CONFIG6_TMP1PTR PKC_CONFIG6_TMP1PTR_Msk - -/******************* Bit definition for PKC_CONFIG7 register ****************/ -#define PKC_CONFIG7_TMP2PTR_Pos (0U) -#define PKC_CONFIG7_TMP2PTR_Len (9U) -#define PKC_CONFIG7_TMP2PTR_Msk (0x000001FFU) -#define PKC_CONFIG7_TMP2PTR PKC_CONFIG7_TMP2PTR_Msk - -#define PKC_CONFIG7_TMP3PTR_Pos (16U) -#define PKC_CONFIG7_TMP3PTR_Len (9U) -#define PKC_CONFIG7_TMP3PTR_Msk (0x01FF0000U) -#define PKC_CONFIG7_TMP3PTR PKC_CONFIG7_TMP3PTR_Msk - -/******************* Bit definition for PKC_CONFIG8 register ****************/ -#define PKC_CONFIG8_TMP4PTR_Pos (0U) -#define PKC_CONFIG8_TMP4PTR_Len (9U) -#define PKC_CONFIG8_TMP4PTR_Msk (0x000001FFU) -#define PKC_CONFIG8_TMP4PTR PKC_CONFIG8_TMP4PTR_Msk - -#define PKC_CONFIG8_TMP5PTR_Pos (16U) -#define PKC_CONFIG8_TMP5PTR_Len (9U) -#define PKC_CONFIG8_TMP5PTR_Msk (0x01FF0000U) -#define PKC_CONFIG8_TMP5PTR PKC_CONFIG8_TMP5PTR_Msk - -/******************* Bit definition for PKC_CONFIG9 register ****************/ -#define PKC_CONFIG9_TMP6PTR_Pos (0U) -#define PKC_CONFIG9_TMP6PTR_Len (9U) -#define PKC_CONFIG9_TMP6PTR_Msk (0x000001FFU) -#define PKC_CONFIG9_TMP6PTR PKC_CONFIG9_TMP6PTR_Msk - -#define PKC_CONFIG9_CONST1PTR_Pos (16U) -#define PKC_CONFIG9_CONST1PTR_Len (9U) -#define PKC_CONFIG9_CONST1PTR_Msk (0x01FF0000U) -#define PKC_CONFIG9_CONST1PTR PKC_CONFIG9_CONST1PTR_Msk - -/******************* Bit definition for PKC_CONFIG10 register ****************/ -#define PKC_CONFIG10_X1PTR_Pos (0U) -#define PKC_CONFIG10_X1PTR_Len (9U) -#define PKC_CONFIG10_X1PTR_Msk (0x000001FFU) -#define PKC_CONFIG10_X1PTR PKC_CONFIG10_X1PTR_Msk - -#define PKC_CONFIG10_X2PTR_Pos (16U) -#define PKC_CONFIG10_X2PTR_Len (9U) -#define PKC_CONFIG10_X2PTR_Msk (0x01FF0000U) -#define PKC_CONFIG10_X2PTR PKC_CONFIG10_X2PTR_Msk - -/******************* Bit definition for PKC_CONFIG11 register ****************/ -#define PKC_CONFIG11_MITMPPTR_Pos (0U) -#define PKC_CONFIG11_MITMPPTR_Len (9U) -#define PKC_CONFIG11_MITMPPTR_Msk (0x000001FFU) -#define PKC_CONFIG11_MITMPPTR PKC_CONFIG11_MITMPPTR_Msk - -#define PKC_CONFIG11_TMPKPTR_Pos (16U) -#define PKC_CONFIG11_TMPKPTR_Len (9U) -#define PKC_CONFIG11_TMPKPTR_Msk (0x01FF0000U) -#define PKC_CONFIG11_TMPKPTR PKC_CONFIG11_TMPKPTR_Msk - -/******************* Bit definition for PKC_CONFIG12 register ****************/ -#define PKC_CONFIG12_APTR_Pos (0U) -#define PKC_CONFIG12_APTR_Len (9U) -#define PKC_CONFIG12_APTR_Msk (0x000001FFU) -#define PKC_CONFIG12_APTR PKC_CONFIG12_APTR_Msk - -#define PKC_CONFIG12_BPTR_Pos (16U) -#define PKC_CONFIG12_BPTR_Len (9U) -#define PKC_CONFIG12_BPTR_Msk (0x01FF0000U) -#define PKC_CONFIG12_BPTR PKC_CONFIG12_BPTR_Msk - -/******************* Bit definition for PKC_CONFIG13 register ****************/ -#define PKC_CONFIG13_CONSTQ_Pos (0U) -#define PKC_CONFIG13_CONSTQ_Len (32U) -#define PKC_CONFIG13_CONSTQ_Msk (0xFFFFFFFFU) -#define PKC_CONFIG13_CONSTQ PKC_CONFIG13_CONSTQ_Msk - -/******************* Bit definition for PKC_SW_CTRL register *****************/ -#define PKC_SW_CTRL_OPSTART_Pos (0U) -#define PKC_SW_CTRL_OPSTART_Len (1U) -#define PKC_SW_CTRL_OPSTART_Msk (0x1U << PKC_SW_CTRL_OPSTART_Pos) -#define PKC_SW_CTRL_OPSTART PKC_SW_CTRL_OPSTART_Msk - -#define PKC_SW_CTRL_OPMODE_Pos (4U) -#define PKC_SW_CTRL_OPMODE_Len (3U) -#define PKC_SW_CTRL_OPMODE_Msk (0x7U << PKC_SW_CTRL_OPMODE_Pos) -#define PKC_SW_CTRL_OPMODE PKC_SW_CTRL_OPMODE_Msk - -#define PKC_SW_CTRL_STARTDM_Pos (8U) -#define PKC_SW_CTRL_STARTDM_Len (1U) -#define PKC_SW_CTRL_STARTDM_Msk (0x1U << PKC_SW_CTRL_STARTDM_Pos) -#define PKC_SW_CTRL_STARTDM PKC_SW_CTRL_STARTDM_Msk - -#define PKC_SW_CTRL_RANDEN_Pos (9U) -#define PKC_SW_CTRL_RANDEN_Len (1U) -#define PKC_SW_CTRL_RANDEN_Msk (0x1U << PKC_SW_CTRL_RANDEN_Pos) -#define PKC_SW_CTRL_RANDEN PKC_SW_CTRL_RANDEN_Msk - -/******************* Bit definition for PKC_SW_CONFIG0 register ************/ -#define PKC_SW_CONFIG0_MMAPTR_Pos (0U) -#define PKC_SW_CONFIG0_MMAPTR_Len (9U) -#define PKC_SW_CONFIG0_MMAPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG0_MMAPTR PKC_SW_CONFIG0_MMAPTR_Msk - -#define PKC_SW_CONFIG0_MMBPTR_Pos (16U) -#define PKC_SW_CONFIG0_MMBPTR_Len (9U) -#define PKC_SW_CONFIG0_MMBPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG0_MMBPTR PKC_SW_CONFIG0_MMBPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG1 register ************/ -#define PKC_SW_CONFIG1_MMPPTR_Pos (0U) -#define PKC_SW_CONFIG1_MMPPTR_Len (9U) -#define PKC_SW_CONFIG1_MMPPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG1_MMPPTR PKC_SW_CONFIG1_MMPPTR_Msk - -#define PKC_SW_CONFIG1_MMCPTR_Pos (16U) -#define PKC_SW_CONFIG1_MMCPTR_Len (9U) -#define PKC_SW_CONFIG1_MMCPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG1_MMCPTR PKC_SW_CONFIG1_MMCPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG2 register ************/ -#define PKC_SW_CONFIG2_MASAPTR_Pos (0U) -#define PKC_SW_CONFIG2_MASAPTR_Len (9U) -#define PKC_SW_CONFIG2_MASAPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG2_MASAPTR PKC_SW_CONFIG2_MASAPTR_Msk - -#define PKC_SW_CONFIG2_MASBPTR_Pos (16U) -#define PKC_SW_CONFIG2_MASBPTR_Len (9U) -#define PKC_SW_CONFIG2_MASBPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG2_MASBPTR PKC_SW_CONFIG2_MASBPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG3 register ************/ -#define PKC_SW_CONFIG3_MASPPTR_Pos (0U) -#define PKC_SW_CONFIG3_MASPPTR_Len (9U) -#define PKC_SW_CONFIG3_MASPPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG3_MASPPTR PKC_SW_CONFIG3_MASPPTR_Msk - -#define PKC_SW_CONFIG3_MASCPTR_Pos (16U) -#define PKC_SW_CONFIG3_MASCPTR_Len (9U) -#define PKC_SW_CONFIG3_MASCPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG3_MASCPTR PKC_SW_CONFIG3_MASCPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG4 register ************/ -#define PKC_SW_CONFIG4_MIUPTR_Pos (0U) -#define PKC_SW_CONFIG4_MIUPTR_Len (9U) -#define PKC_SW_CONFIG4_MIUPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG4_MIUPTR PKC_SW_CONFIG4_MIUPTR_Msk - -#define PKC_SW_CONFIG4_MIVPTR_Pos (16U) -#define PKC_SW_CONFIG4_MIVPTR_Len (9U) -#define PKC_SW_CONFIG4_MIVPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG4_MIVPTR PKC_SW_CONFIG4_MIVPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG5 register ************/ -#define PKC_SW_CONFIG5_MIX1PTR_Pos (0U) -#define PKC_SW_CONFIG5_MIX1PTR_Len (9U) -#define PKC_SW_CONFIG5_MIX1PTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG5_MIX1PTR PKC_SW_CONFIG5_MIX1PTR_Msk - -#define PKC_SW_CONFIG5_MIX2PTR_Pos (16U) -#define PKC_SW_CONFIG5_MIX2PTR_Len (9U) -#define PKC_SW_CONFIG5_MIX2PTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG5_MIX2PTR PKC_SW_CONFIG5_MIX2PTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG6 register ************/ -#define PKC_SW_CONFIG6_MITMPPTR_Pos (0U) -#define PKC_SW_CONFIG6_MITMPPTR_Len (9U) -#define PKC_SW_CONFIG6_MITMPPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG6_MITMPPTR PKC_SW_CONFIG6_MITMPPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG7 register ************/ -#define PKC_SW_CONFIG7_WORDLEN_Pos (0U) -#define PKC_SW_CONFIG7_WORDLEN_Len (6U) -#define PKC_SW_CONFIG7_WORDLEN_Msk (0x0000003FU) -#define PKC_SW_CONFIG7_WORDLEN PKC_SW_CONFIG7_WORDLEN_Msk - -/******************* Bit definition for PKC_SW_CONFIG8 register ************/ -#define PKC_SW_CONFIG8_MIKOUT_Pos (0U) -#define PKC_SW_CONFIG8_MIKOUT_Len (13U) -#define PKC_SW_CONFIG8_MIKOUT_Msk (0x00001FFFU) -#define PKC_SW_CONFIG8_MIKOUT PKC_SW_CONFIG8_MIKOUT_Msk - -/******************* Bit definition for PKC_SW_CONFIG9 register ************/ -#define PKC_SW_CONFIG9_DMRNGSEED_Pos (0U) -#define PKC_SW_CONFIG9_DMRNGSEED_Len (32U) -#define PKC_SW_CONFIG9_DMRNGSEED_Msk (0xFFFFFFFFU) -#define PKC_SW_CONFIG9_DMRNGSEED PKC_SW_CONFIG9_DMRNGSEED_Msk - -/******************* Bit definition for PKC_SW_CONFIG10 register ************/ -#define PKC_SW_CONFIG10_BMAPTR_Pos (0U) -#define PKC_SW_CONFIG10_BMAPTR_Len (9U) -#define PKC_SW_CONFIG10_BMAPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG10_BMAPTR PKC_SW_CONFIG10_BMAPTR_Msk - -#define PKC_SW_CONFIG10_BMBPTR_Pos (16U) -#define PKC_SW_CONFIG10_BMBPTR_Len (9U) -#define PKC_SW_CONFIG10_BMBPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG10_BMBPTR PKC_SW_CONFIG10_BMBPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG11 register ************/ -#define PKC_SW_CONFIG11_BMCPTR_Pos (0U) -#define PKC_SW_CONFIG11_BMCPTR_Len (9U) -#define PKC_SW_CONFIG11_BMCPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG11_BMCPTR PKC_SW_CONFIG11_BMCPTR_Msk - -#define PKC_SW_CONFIG11_BAAPTR_Pos (16U) -#define PKC_SW_CONFIG11_BAAPTR_Len (9U) -#define PKC_SW_CONFIG11_BAAPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG11_BAAPTR PKC_SW_CONFIG11_BAAPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG12 register ************/ -#define PKC_SW_CONFIG12_BABPTR_Pos (0U) -#define PKC_SW_CONFIG12_BABPTR_Len (9U) -#define PKC_SW_CONFIG12_BABPTR_Msk (0x000001FFU) -#define PKC_SW_CONFIG12_BABPTR PKC_SW_CONFIG12_BABPTR_Msk - -#define PKC_SW_CONFIG12_BACPTR_Pos (16U) -#define PKC_SW_CONFIG12_BACPTR_Len (9U) -#define PKC_SW_CONFIG12_BACPTR_Msk (0x01FF0000U) -#define PKC_SW_CONFIG12_BACPTR PKC_SW_CONFIG12_BACPTR_Msk - -/******************* Bit definition for PKC_SW_CONFIG13 register ************/ -#define PKC_SW_CONFIG13_RANDSEED_Pos (0U) -#define PKC_SW_CONFIG13_RANDSEED_Len (32U) -#define PKC_SW_CONFIG13_RANDSEED_Msk (0xFFFFFFFFU) -#define PKC_SW_CONFIG13_RANDSEED PKC_SW_CONFIG13_RANDSEED_Msk - -/******************* Bit definition for PKC_INT_STATUS register ************/ -#define PKC_INTSTAT_DONE_Pos (0U) -#define PKC_INTSTAT_DONE_Len (1U) -#define PKC_INTSTAT_DONE_Msk (0x1U << PKC_INTSTAT_DONE_Pos) -#define PKC_INTSTAT_DONE PKC_INTSTAT_DONE_Msk - -#define PKC_INTSTAT_ERR_Pos (1U) -#define PKC_INTSTAT_ERR_Len (1U) -#define PKC_INTSTAT_ERR_Msk (0x1U << PKC_INTSTAT_ERR_Pos) -#define PKC_INTSTAT_ERR PKC_INTSTAT_ERR_Msk - -#define PKC_INTSTAT_BAOVF_Pos (2U) -#define PKC_INTSTAT_BAOVF_Len (1U) -#define PKC_INTSTAT_BAOVF_Msk (0x1U << PKC_INTSTAT_BAOVF_Pos) -#define PKC_INTSTAT_BAOVF PKC_INTSTAT_BAOVF_Msk - -/******************* Bit definition for PKC_INT_ENABLE register ************/ -#define PKC_INTEN_DONE_Pos (0U) -#define PKC_INTEN_DONE_Len (1U) -#define PKC_INTEN_DONE_Msk (0x1U << PKC_INTEN_DONE_Pos) -#define PKC_INTEN_DONE PKC_INTEN_DONE_Msk - -#define PKC_INTEN_ERR_Pos (1U) -#define PKC_INTEN_ERR_Len (1U) -#define PKC_INTEN_ERR_Msk (0x1U << PKC_INTEN_ERR_Pos) -#define PKC_INTEN_ERR PKC_INTEN_ERR_Msk - -#define PKC_INTEN_BAOVF_Pos (2U) -#define PKC_INTEN_BAOVF_Len (1U) -#define PKC_INTEN_BAOVF_Msk (0x1U << PKC_INTEN_BAOVF_Pos) -#define PKC_INTEN_BAOVF PKC_INTEN_BAOVF_Msk - -/******************* Bit definition for PKC_WORK_STATUS register ***********/ -#define PKC_WORKSTAT_BUSY_Pos (0U) -#define PKC_WORKSTAT_BUSY_Len (1U) -#define PKC_WORKSTAT_BUSY_Msk (0x1U << PKC_WORKSTAT_BUSY_Pos) -#define PKC_WORKSTAT_BUSY PKC_WORKSTAT_BUSY_Msk - -/******************* Bit definition for PKC_DUMMY0 register ****************/ -#define PKC_DUMMY0_DUMMY0_Pos (0U) -#define PKC_DUMMY0_DUMMY0_Len (32U) -#define PKC_DUMMY0_DUMMY0_Msk (0xFFFFFFFFU) -#define PKC_DUMMY0_DUMMY0 PKC_DUMMY0_DUMMY0_Msk - -/******************* Bit definition for PKC_DUMMY1 register ****************/ -#define PKC_DUMMY1_DUMMY1_Pos (0U) -#define PKC_DUMMY1_DUMMY1_Len (32U) -#define PKC_DUMMY1_DUMMY1_Msk (0xFFFFFFFFU) -#define PKC_DUMMY1_DUMMY1 PKC_DUMMY1_DUMMY1_Msk - -/******************* Bit definition for PKC_DUMMY2 register ****************/ -#define PKC_DUMMY2_DUMMY2_Pos (0U) -#define PKC_DUMMY2_DUMMY2_Len (32U) -#define PKC_DUMMY2_DUMMY2_Msk (0xFFFFFFFFU) -#define PKC_DUMMY2_DUMMY2 PKC_DUMMY2_DUMMY2_Msk - - -/* ================================================================================================================= */ -/* ================ PWM ================ */ -/* ================================================================================================================= */ - -/******************* Bit definition for PWM_MODE register *******************/ -#define PWM_MODE_EN_Pos (0U) -#define PWM_MODE_EN_Len (1U) -#define PWM_MODE_EN_Msk (0x1U << PWM_MODE_EN_Pos) -#define PWM_MODE_EN PWM_MODE_EN_Msk - -#define PWM_MODE_PAUSE_Pos (1U) -#define PWM_MODE_PAUSE_Len (1U) -#define PWM_MODE_PAUSE_Msk (0x1U << PWM_MODE_PAUSE_Pos) -#define PWM_MODE_PAUSE PWM_MODE_PAUSE_Msk - -#define PWM_MODE_BREATHEN_Pos (2U) -#define PWM_MODE_BREATHEN_Len (1U) -#define PWM_MODE_BREATHEN_Msk (0x1U << PWM_MODE_BREATHEN_Pos) -#define PWM_MODE_BREATHEN PWM_MODE_BREATHEN_Msk - -#define PWM_MODE_DPENA_Pos (3U) -#define PWM_MODE_DPENA_Len (1U) -#define PWM_MODE_DPENA_Msk (0x1U << PWM_MODE_DPENA_Pos) -#define PWM_MODE_DPENA PWM_MODE_DPENA_Msk - -#define PWM_MODE_DPENB_Pos (4U) -#define PWM_MODE_DPENB_Len (1U) -#define PWM_MODE_DPENB_Msk (0x1U << PWM_MODE_DPENB_Pos) -#define PWM_MODE_DPENB PWM_MODE_DPENB_Msk - -#define PWM_MODE_DPENC_Pos (5U) -#define PWM_MODE_DPENC_Len (1U) -#define PWM_MODE_DPENC_Msk (0x1U << PWM_MODE_DPENC_Pos) -#define PWM_MODE_DPENC PWM_MODE_DPENC_Msk - -/******************* Bit definition for PWM_UPDATE register *****************/ -#define PWM_UPDATE_SAG_Pos (0U) -#define PWM_UPDATE_SAG_Len (1U) -#define PWM_UPDATE_SAG_Msk (0x1U << PWM_UPDATE_SAG_Pos) -#define PWM_UPDATE_SAG PWM_UPDATE_SAG_Msk - -#define PWM_UPDATE_SA_Pos (1U) -#define PWM_UPDATE_SA_Len (1U) -#define PWM_UPDATE_SA_Msk (0x1U << PWM_UPDATE_SA_Pos) -#define PWM_UPDATE_SA PWM_UPDATE_SA_Msk - -#define PWM_UPDATE_SSPRD_Pos (8U) -#define PWM_UPDATE_SSPRD_Len (1U) -#define PWM_UPDATE_SSPRD_Msk (0x1U << PWM_UPDATE_SSPRD_Pos) -#define PWM_UPDATE_SSPRD PWM_UPDATE_SSPRD_Msk - -#define PWM_UPDATE_SSCMPA0_Pos (9U) -#define PWM_UPDATE_SSCMPA0_Len (1U) -#define PWM_UPDATE_SSCMPA0_Msk (0x1U << PWM_UPDATE_SSCMPA0_Pos) -#define PWM_UPDATE_SSCMPA0 PWM_UPDATE_SSCMPA0_Msk - -#define PWM_UPDATE_SSCMPA1_Pos (10U) -#define PWM_UPDATE_SSCMPA1_Len (1U) -#define PWM_UPDATE_SSCMPA1_Msk (0x1U << PWM_UPDATE_SSCMPA1_Pos) -#define PWM_UPDATE_SSCMPA1 PWM_UPDATE_SSCMPA1_Msk - -#define PWM_UPDATE_SSCMPB0_Pos (11U) -#define PWM_UPDATE_SSCMPB0_Len (1U) -#define PWM_UPDATE_SSCMPB0_Msk (0x1U << PWM_UPDATE_SSCMPB0_Pos) -#define PWM_UPDATE_SSCMPB0 PWM_UPDATE_SSCMPB0_Msk - -#define PWM_UPDATE_SSCMPB1_Pos (12U) -#define PWM_UPDATE_SSCMPB1_Len (1U) -#define PWM_UPDATE_SSCMPB1_Msk (0x1U << PWM_UPDATE_SSCMPB1_Pos) -#define PWM_UPDATE_SSCMPB1 PWM_UPDATE_SSCMPB1_Msk - -#define PWM_UPDATE_SSCMPC0_Pos (13U) -#define PWM_UPDATE_SSCMPC0_Len (1U) -#define PWM_UPDATE_SSCMPC0_Msk (0x1U << PWM_UPDATE_SSCMPC0_Pos) -#define PWM_UPDATE_SSCMPC0 PWM_UPDATE_SSCMPC0_Msk - -#define PWM_UPDATE_SSCMPC1_Pos (14U) -#define PWM_UPDATE_SSCMPC1_Len (1U) -#define PWM_UPDATE_SSCMPC1_Msk (0x1U << PWM_UPDATE_SSCMPC1_Pos) -#define PWM_UPDATE_SSCMPC1 PWM_UPDATE_SSCMPC1_Msk - -#define PWM_UPDATE_SSPAUSE_Pos (15U) -#define PWM_UPDATE_SSPAUSE_Len (1U) -#define PWM_UPDATE_SSPAUSE_Msk (0x1U << PWM_UPDATE_SSPAUSE_Pos) -#define PWM_UPDATE_SSPAUSE PWM_UPDATE_SSPAUSE_Msk - -#define PWM_UPDATE_SSBRPRD_Pos (16U) -#define PWM_UPDATE_SSBRPRD_Len (1U) -#define PWM_UPDATE_SSBRPRD_Msk (0x1U << PWM_UPDATE_SSBRPRD_Pos) -#define PWM_UPDATE_SSBRPRD PWM_UPDATE_SSBRPRD_Msk - -#define PWM_UPDATE_SSHOLD_Pos (17U) -#define PWM_UPDATE_SSHOLD_Len (1U) -#define PWM_UPDATE_SSHOLD_Msk (0x1U << PWM_UPDATE_SSHOLD_Pos) -#define PWM_UPDATE_SSHOLD PWM_UPDATE_SSHOLD_Msk - -#define PWM_UPDATE_SSAQCTRL_Pos (18U) -#define PWM_UPDATE_SSAQCTRL_Len (1U) -#define PWM_UPDATE_SSAQCTRL_Msk (0x1U << PWM_UPDATE_SSAQCTRL_Pos) -#define PWM_UPDATE_SSAQCTRL PWM_UPDATE_SSAQCTRL_Msk - -/******************* Bit definition for PWM_PRD register ********************/ -#define PWM_PRD_PRD_Pos (0U) -#define PWM_PRD_PRD_Len (32U) -#define PWM_PRD_PRD_Msk (0xFFFFFFFFU) -#define PWM_PRD_PRD PWM_PRD_PRD_Msk - -/******************* Bit definition for PWM_CMPA0 register ******************/ -#define PWM_CMPA0_CMPA0_Pos (0U) -#define PWM_CMPA0_CMPA0_Len (32U) -#define PWM_CMPA0_CMPA0_Msk (0xFFFFFFFFU) -#define PWM_CMPA0_CMPA0 PWM_CMPA0_CMPA0_Msk - -/******************* Bit definition for PWM_CMPA1 register ******************/ -#define PWM_CMPA1_CMPA1_Pos (0U) -#define PWM_CMPA1_CMPA1_Len (32U) -#define PWM_CMPA1_CMPA1_Msk (0xFFFFFFFFU) -#define PWM_CMPA1_CMPA1 PWM_CMPA1_CMPA1_Msk - -/******************* Bit definition for PWM_CMPB0 register ******************/ -#define PWM_CMPB0_CMPB0_Pos (0U) -#define PWM_CMPB0_CMPB0_Len (32U) -#define PWM_CMPB0_CMPB0_Msk (0xFFFFFFFFU) -#define PWM_CMPB0_CMPB0 PWM_CMPB0_CMPB0_Msk - -/******************* Bit definition for PWM_CMPB1 register ******************/ -#define PWM_CMPB1_CMPB1_Pos (0U) -#define PWM_CMPB1_CMPB1_Len (32U) -#define PWM_CMPB1_CMPB1_Msk (0xFFFFFFFFU) -#define PWM_CMPB1_CMPB1 PWM_CMPB1_CMPB1_Msk - -/******************* Bit definition for PWM_CMPC0 register ******************/ -#define PWM_CMPC0_CMPC0_Pos (0U) -#define PWM_CMPC0_CMPC0_Len (32U) -#define PWM_CMPC0_CMPC0_Msk (0xFFFFFFFFU) -#define PWM_CMPC0_CMPC0 PWM_CMPC0_CMPC0_Msk - -/******************* Bit definition for PWM_CMPC1 register ******************/ -#define PWM_CMPC1_CMPC1_Pos (0U) -#define PWM_CMPC1_CMPC1_Len (32U) -#define PWM_CMPC1_CMPC1_Msk (0xFFFFFFFFU) -#define PWM_CMPC1_CMPC1 PWM_CMPC1_CMPC1_Msk - -/******************* Bit definition for PWM_AQCTRL register *****************/ -#define PWM_AQCTRL_A0_Pos (0U) -#define PWM_AQCTRL_A0_Len (2U) -#define PWM_AQCTRL_A0_Msk (0x3U << PWM_AQCTRL_A0_Pos) -#define PWM_AQCTRL_A0 PWM_AQCTRL_A0_Msk - -#define PWM_AQCTRL_A1_Pos (2U) -#define PWM_AQCTRL_A1_Len (2U) -#define PWM_AQCTRL_A1_Msk (0x3U << PWM_AQCTRL_A1_Pos) -#define PWM_AQCTRL_A1 PWM_AQCTRL_A1_Msk - -#define PWM_AQCTRL_B0_Pos (4U) -#define PWM_AQCTRL_B0_Len (2U) -#define PWM_AQCTRL_B0_Msk (0x3U << PWM_AQCTRL_B0_Pos) -#define PWM_AQCTRL_B0 PWM_AQCTRL_B0_Msk - -#define PWM_AQCTRL_B1_Pos (6U) -#define PWM_AQCTRL_B1_Len (2U) -#define PWM_AQCTRL_B1_Msk (0x3U << PWM_AQCTRL_B1_Pos) -#define PWM_AQCTRL_B1 PWM_AQCTRL_B1_Msk - -#define PWM_AQCTRL_C0_Pos (8U) -#define PWM_AQCTRL_C0_Len (2U) -#define PWM_AQCTRL_C0_Msk (0x3U << PWM_AQCTRL_C0_Pos) -#define PWM_AQCTRL_C0 PWM_AQCTRL_C0_Msk - -#define PWM_AQCTRL_C1_Pos (10U) -#define PWM_AQCTRL_C1_Len (2U) -#define PWM_AQCTRL_C1_Msk (0x3U << PWM_AQCTRL_C1_Pos) -#define PWM_AQCTRL_C1 PWM_AQCTRL_C1_Msk - -/******************* Bit definition for PWM_BRPRD register ******************/ -#define PWM_BRPRD_BRPRD_Pos (0U) -#define PWM_BRPRD_BRPRD_Len (32U) -#define PWM_BRPRD_BRPRD_Msk (0xFFFFFFFFU) -#define PWM_BRPRD_BRPRD PWM_BRPRD_BRPRD_Msk - -/******************* Bit definition for PWM_HOLD register *******************/ -#define PWM_HOLD_HOLD_Pos (0U) -#define PWM_HOLD_HOLD_Len (24U) -#define PWM_HOLD_HOLD_Msk (0x00FFFFFFU) -#define PWM_HOLD_HOLD PWM_HOLD_HOLD_Msk - - -/* ================================================================================================================= */ -/* ================ SSI ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for SSI_CTRL0 register ******************/ -#define SSI_CTRL0_SSTEN_Pos (24U) -#define SSI_CTRL0_SSTEN_Len (1U) -#define SSI_CTRL0_SSTEN_Msk (0x1U << SSI_CTRL0_SSTEN_Pos) -#define SSI_CTRL0_SSTEN SSI_CTRL0_SSTEN_Msk - -#define SSI_CTRL0_SPIFRF_Pos (21U) -#define SSI_CTRL0_SPIFRF_Len (2U) -#define SSI_CTRL0_SPIFRF_Msk (0x3U << SSI_CTRL0_SPIFRF_Pos) -#define SSI_CTRL0_SPIFRF SSI_CTRL0_SPIFRF_Msk - -#define SSI_CTRL0_DFS32_Pos (16U) -#define SSI_CTRL0_DFS32_Len (5U) -#define SSI_CTRL0_DFS32_Msk (0x1FU << SSI_CTRL0_DFS32_Pos) -#define SSI_CTRL0_DFS32 SSI_CTRL0_DFS32_Msk - -#define SSI_CTRL0_CFS_Pos (12U) -#define SSI_CTRL0_CFS_Len (4U) -#define SSI_CTRL0_CFS_Msk (0xFU << SSI_CTRL0_CFS_Pos) -#define SSI_CTRL0_CFS SSI_CTRL0_CFS_Msk - -#define SSI_CTRL0_SRL_Pos (11U) -#define SSI_CTRL0_SRL_Len (1U) -#define SSI_CTRL0_SRL_Msk (0x1U << SSI_CTRL0_SRL_Pos) -#define SSI_CTRL0_SRL SSI_CTRL0_SRL_Msk - -#define SSI_CTRL0_SLVOE_Pos (10U) -#define SSI_CTRL0_SLVOE_Len (1U) -#define SSI_CTRL0_SLVOE_Msk (0x1U << SSI_CTRL0_SLVOE_Pos) -#define SSI_CTRL0_SLVOE SSI_CTRL0_SLVOE_Msk - -#define SSI_CTRL0_TMOD_Pos (8U) -#define SSI_CTRL0_TMOD_Len (2U) -#define SSI_CTRL0_TMOD_Msk (0x3U << SSI_CTRL0_TMOD_Pos) -#define SSI_CTRL0_TMOD SSI_CTRL0_TMOD_Msk - -#define SSI_CTRL0_SCPOL_Pos (7U) -#define SSI_CTRL0_SCPOL_Len (1U) -#define SSI_CTRL0_SCPOL_Msk (0x1U << SSI_CTRL0_SCPOL_Pos) -#define SSI_CTRL0_SCPOL SSI_CTRL0_SCPOL_Msk - -#define SSI_CTRL0_SCPHA_Pos (6U) -#define SSI_CTRL0_SCPHA_Len (1U) -#define SSI_CTRL0_SCPHA_Msk (0x1U << SSI_CTRL0_SCPHA_Pos) -#define SSI_CTRL0_SCPHA SSI_CTRL0_SCPHA_Msk - -#define SSI_CTRL0_FRF_Pos (4U) -#define SSI_CTRL0_FRF_Len (2U) -#define SSI_CTRL0_FRF_Msk (0x3U << SSI_CTRL0_FRF_Pos) -#define SSI_CTRL0_FRF SSI_CTRL0_FRF_Msk - -#define SSI_CTRL1_NDF_Pos (0U) -#define SSI_CTRL1_NDF_Len (16U) -#define SSI_CTRL1_NDF_Msk (0xFFFFU << SSI_CTRL1_NDF_Pos) -#define SSI_CTRL1_NDF SSI_CTRL1_NDF_Msk - -/******************* Bit definition for SSI_SSIEN register ******************/ -#define SSI_SSIEN_EN_Pos (0U) -#define SSI_SSIEN_EN_Len (1U) -#define SSI_SSIEN_EN_Msk (0x1U << SSI_SSIEN_EN_Pos) -#define SSI_SSIEN_EN SSI_SSIEN_EN_Msk - -/******************* Bit definition for SSI_MWC register ********************/ -#define SSI_MWC_MHS_Pos (2U) -#define SSI_MWC_MHS_Len (1U) -#define SSI_MWC_MHS_Msk (0x1U << SSI_MWC_MHS_Pos) -#define SSI_MWC_MHS SSI_MWC_MHS_Msk - -#define SSI_MWC_MDD_Pos (1U) -#define SSI_MWC_MDD_Len (1U) -#define SSI_MWC_MDD_Msk (0x1U << SSI_MWC_MDD_Pos) -#define SSI_MWC_MDD SSI_MWC_MDD_Msk - -#define SSI_MWC_MWMOD_Pos (0U) -#define SSI_MWC_MWMOD_Len (1U) -#define SSI_MWC_MWMOD_Msk (0x1U << SSI_MWC_MWMOD_Pos) -#define SSI_MWC_MWMOD SSI_MWC_MWMOD_Msk - -/******************* Bit definition for SSI_SE register *********************/ -#define SSI_SE_SLAVE1_Pos (1U) -#define SSI_SE_SLAVE1_Len (1U) -#define SSI_SE_SLAVE1_Msk (0x1U << SSI_SE_SLAVE1_Pos) -#define SSI_SE_SLAVE1 SSI_SE_SLAVE1_Msk - -#define SSI_SE_SLAVE0_Pos (0U) -#define SSI_SE_SLAVE0_Len (1U) -#define SSI_SE_SLAVE0_Msk (0x1U << SSI_SE_SLAVE0_Pos) -#define SSI_SE_SLAVE0 SSI_SE_SLAVE0_Msk - -/******************* Bit definition for SSI_BAUD register *******************/ -#define SSI_BAUD_SCKDIV_Pos (0U) -#define SSI_BAUD_SCKDIV_Len (16U) -#define SSI_BAUD_SCKDIV_Msk (0xFFFFUL << SSI_BAUD_SCKDIV_Pos) -#define SSI_BAUD_SCKDIV SSI_BAUD_SCKDIV_Msk - -/******************* Bit definition for SSI_TXFTL register ******************/ -#define SSI_TXFTL_TFT_Pos (0U) -#define SSI_TXFTL_TFT_Len (3U) -#define SSI_TXFTL_TFT_Msk (0x7U << SSI_TXFTL_TFT_Pos) -#define SSI_TXFTL_TFT SSI_TXFTL_TFT_Msk - -/******************* Bit definition for SSI_RXFTL register ******************/ -#define SSI_RXFTL_RFT_Pos (0U) -#define SSI_RXFTL_RFT_Len (3U) -#define SSI_RXFTL_RFT_Msk (0x7U << SSI_RXFTL_RFT_Pos) -#define SSI_RXFTL_RFT SSI_RXFTL_RFT_Msk - -/******************* Bit definition for SSI_TXFL register *******************/ -#define SSI_TXFL_TXTFL_Pos (0U) -#define SSI_TXFL_TXTFL_Len (4U) -#define SSI_TXFL_TXTFL_Msk (0xFU << SSI_TXFL_TXTFL_Pos) -#define SSI_TXFL_TXTFL SSI_TXFL_TXTFL_Msk - -/******************* Bit definition for SSI_RXFL register *******************/ -#define SSI_RXFL_RXTFL_Pos (0U) -#define SSI_RXFL_RXTFL_Len (4U) -#define SSI_RXFL_RXTFL_Msk (0xFU << SSI_RXFL_RXTFL_Pos) -#define SSI_RXFL_RXTFL SSI_RXFL_RXTFL_Msk - -/******************* Bit definition for SSI_STAT register *******************/ -#define SSI_STAT_DCOL_Pos (6U) -#define SSI_STAT_DCOL_Len (1U) -#define SSI_STAT_DCOL_Msk (0x1U << SSI_STAT_DCOL_Pos) -#define SSI_STAT_DCOL SSI_STAT_DCOL_Msk - -#define SSI_STAT_TXE_Pos (5U) -#define SSI_STAT_TXE_Len (1U) -#define SSI_STAT_TXE_Msk (0x1U << SSI_STAT_TXE_Pos) -#define SSI_STAT_TXE SSI_STAT_TXE_Msk - -#define SSI_STAT_RFF_Pos (4U) -#define SSI_STAT_RFF_Len (1U) -#define SSI_STAT_RFF_Msk (0x1U << SSI_STAT_RFF_Pos) -#define SSI_STAT_RFF SSI_STAT_RFF_Msk - -#define SSI_STAT_RFNE_Pos (3U) -#define SSI_STAT_RFNE_Len (1U) -#define SSI_STAT_RFNE_Msk (0x1U << SSI_STAT_RFNE_Pos) -#define SSI_STAT_RFNE SSI_STAT_RFNE_Msk - -#define SSI_STAT_TFE_Pos (2U) -#define SSI_STAT_TFE_Len (1U) -#define SSI_STAT_TFE_Msk (0x1U << SSI_STAT_TFE_Pos) -#define SSI_STAT_TFE SSI_STAT_TFE_Msk - -#define SSI_STAT_TFNF_Pos (1U) -#define SSI_STAT_TFNF_Len (1U) -#define SSI_STAT_TFNF_Msk (0x1U << SSI_STAT_TFNF_Pos) -#define SSI_STAT_TFNF SSI_STAT_TFNF_Msk - -#define SSI_STAT_BUSY_Pos (0U) -#define SSI_STAT_BUSY_Len (1U) -#define SSI_STAT_BUSY_Msk (0x1U << SSI_STAT_BUSY_Pos) -#define SSI_STAT_BUSY SSI_STAT_BUSY_Msk - -/******************* Bit definition for SSI_INTMASK register ****************/ -#define SSI_INTMASK_MSTIM_Pos (5U) -#define SSI_INTMASK_MSTIM_Len (1U) -#define SSI_INTMASK_MSTIM_Msk (0x1U << SSI_INTMASK_MSTIM_Pos) -#define SSI_INTMASK_MSTIM SSI_INTMASK_MSTIM_Msk - -#define SSI_INTMASK_RXFIM_Pos (4U) -#define SSI_INTMASK_RXFIM_Len (1U) -#define SSI_INTMASK_RXFIM_Msk (0x1U << SSI_INTMASK_RXFIM_Pos) -#define SSI_INTMASK_RXFIM SSI_INTMASK_RXFIM_Msk - -#define SSI_INTMASK_RXOIM_Pos (3U) -#define SSI_INTMASK_RXOIM_Len (1U) -#define SSI_INTMASK_RXOIM_Msk (0x1U << SSI_INTMASK_RXOIM_Pos) -#define SSI_INTMASK_RXOIM SSI_INTMASK_RXOIM_Msk - -#define SSI_INTMASK_RXUIM_Pos (2U) -#define SSI_INTMASK_RXUIM_Len (1U) -#define SSI_INTMASK_RXUIM_Msk (0x1U << SSI_INTMASK_RXUIM_Pos) -#define SSI_INTMASK_RXUIM SSI_INTMASK_RXUIM_Msk - -#define SSI_INTMASK_TXOIM_Pos (1U) -#define SSI_INTMASK_TXOIM_Len (1U) -#define SSI_INTMASK_TXOIM_Msk (0x1U << SSI_INTMASK_TXOIM_Pos) -#define SSI_INTMASK_TXOIM SSI_INTMASK_TXOIM_Msk - -#define SSI_INTMASK_TXEIM_Pos (0U) -#define SSI_INTMASK_TXEIM_Len (1U) -#define SSI_INTMASK_TXEIM_Msk (0x1U << SSI_INTMASK_TXEIM_Pos) -#define SSI_INTMASK_TXEIM SSI_INTMASK_TXEIM_Msk - -/******************* Bit definition for SSI_INTSTAT register ****************/ -#define SSI_INTSTAT_MSTIS_Pos (5U) -#define SSI_INTSTAT_MSTIS_Len (1U) -#define SSI_INTSTAT_MSTIS_Msk (0x1U << SSI_INTSTAT_MSTIS_Pos) -#define SSI_INTSTAT_MSTIS SSI_INTSTAT_MSTIS_Msk - -#define SSI_INTSTAT_RXFIS_Pos (4U) -#define SSI_INTSTAT_RXFIS_Len (1U) -#define SSI_INTSTAT_RXFIS_Msk (0x1U << SSI_INTSTAT_RXFIS_Pos) -#define SSI_INTSTAT_RXFIS SSI_INTSTAT_RXFIS_Msk - -#define SSI_INTSTAT_RXOIS_Pos (3U) -#define SSI_INTSTAT_RXOIS_Len (1U) -#define SSI_INTSTAT_RXOIS_Msk (0x1U << SSI_INTSTAT_RXOIS_Pos) -#define SSI_INTSTAT_RXOIS SSI_INTSTAT_RXOIS_Msk - -#define SSI_INTSTAT_RXUIS_Pos (2U) -#define SSI_INTSTAT_RXUIS_Len (1U) -#define SSI_INTSTAT_RXUIS_Msk (0x1U << SSI_INTSTAT_RXUIS_Pos) -#define SSI_INTSTAT_RXUIS SSI_INTSTAT_RXUIS_Msk - -#define SSI_INTSTAT_TXOIS_Pos (1U) -#define SSI_INTSTAT_TXOIS_Len (1U) -#define SSI_INTSTAT_TXOIS_Msk (0x1U << SSI_INTSTAT_TXOIS_Pos) -#define SSI_INTSTAT_TXOIS SSI_INTSTAT_TXOIS_Msk - -#define SSI_INTSTAT_TXEIS_Pos (0U) -#define SSI_INTSTAT_TXEIS_Len (1U) -#define SSI_INTSTAT_TXEIS_Msk (0x1U << SSI_INTSTAT_TXEIS_Pos) -#define SSI_INTSTAT_TXEIS SSI_INTSTAT_TXEIS_Msk - -/******************* Bit definition for SSI_RAW_INTSTAT register ************/ -#define SSI_RAW_INTSTAT_MSTIR_Pos (5U) -#define SSI_RAW_INTSTAT_MSTIR_Len (1U) -#define SSI_RAW_INTSTAT_MSTIR_Msk (0x1U << SSI_RAW_INTSTAT_MSTIR_Pos) -#define SSI_RAW_INTSTAT_MSTIR SSI_RAW_INTSTAT_MSTIR_Msk - -#define SSI_RAW_INTSTAT_RXFIR_Pos (4U) -#define SSI_RAW_INTSTAT_RXFIR_Len (1U) -#define SSI_RAW_INTSTAT_RXFIR_Msk (0x1U << SSI_RAW_INTSTAT_RXFIR_Pos) -#define SSI_RAW_INTSTAT_RXFIR SSI_RAW_INTSTAT_RXFIR_Msk - -#define SSI_RAW_INTSTAT_RXOIR_Pos (3U) -#define SSI_RAW_INTSTAT_RXOIR_Len (1U) -#define SSI_RAW_INTSTAT_RXOIR_Msk (0x1U << SSI_RAW_INTSTAT_RXOIR_Pos) -#define SSI_RAW_INTSTAT_RXOIR SSI_RAW_INTSTAT_RXOIR_Msk - -#define SSI_RAW_INTSTAT_RXUIR_Pos (2U) -#define SSI_RAW_INTSTAT_RXUIR_Len (1U) -#define SSI_RAW_INTSTAT_RXUIR_Msk (0x1U << SSI_RAW_INTSTAT_RXUIR_Pos) -#define SSI_RAW_INTSTAT_RXUIR SSI_RAW_INTSTAT_RXUIR_Msk - -#define SSI_RAW_INTSTAT_TXOIR_Pos (1U) -#define SSI_RAW_INTSTAT_TXOIR_Len (1U) -#define SSI_RAW_INTSTAT_TXOIR_Msk (0x1U << SSI_RAW_INTSTAT_TXOIR_Pos) -#define SSI_RAW_INTSTAT_TXOIR SSI_RAW_INTSTAT_TXOIR_Msk - -#define SSI_RAW_INTSTAT_TXEIR_Pos (0U) -#define SSI_RAW_INTSTAT_TXEIR_Len (1U) -#define SSI_RAW_INTSTAT_TXEIR_Msk (0x1U << SSI_RAW_INTSTAT_TXEIR_Pos) -#define SSI_RAW_INTSTAT_TXEIR SSI_RAW_INTSTAT_TXEIR_Msk - -/******************* Bit definition for SSI_TXOIC register ******************/ -#define SSI_TXOIC_TXOIC_Pos (0U) -#define SSI_TXOIC_TXOIC_Len (1U) -#define SSI_TXOIC_TXOIC_Msk (0x1U << SSI_TXOIC_TXOIC_Pos) -#define SSI_TXOIC_TXOIC SSI_TXOIC_TXOIC_Msk - -/******************* Bit definition for SSI_RXOIC register ******************/ -#define SSI_RXOIC_RXOIC_Pos (0U) -#define SSI_RXOIC_RXOIC_Len (1U) -#define SSI_RXOIC_RXOIC_Msk (0x1U << SSI_RXOIC_RXOIC_Pos) -#define SSI_RXOIC_RXOIC SSI_RXOIC_RXOIC_Msk - -#define SSI_RXUIC_RXUIC_Pos (0U) -#define SSI_RXUIC_RXUIC_Len (1U) -#define SSI_RXUIC_RXUIC_Msk (0x1U << SSI_RXUIC_RXUIC_Pos) -#define SSI_RXUIC_RXUIC SSI_RXUIC_RXUIC_Msk - -/******************* Bit definition for SSI_MSTIC register ******************/ -#define SSI_MSTIC_MSTIC_Pos (0U) -#define SSI_MSTIC_MSTIC_Len (1U) -#define SSI_MSTIC_MSTIC_Msk (0x1U << SSI_MSTIC_MSTIC_Pos) -#define SSI_MSTIC_MSTIC SSI_MSTIC_MSTIC_Msk - -/******************* Bit definition for SSI_INTCLR register ******************/ -#define SSI_INTCLR_INTCLR_Pos (0U) -#define SSI_INTCLR_INTCLR_Len (1U) -#define SSI_INTCLR_INTCLR_Msk (0x1U << SSI_INTCLR_INTCLR_Pos) -#define SSI_INTCLR_INTCLR SSI_INTCLR_INTCLR_Msk - -/******************* Bit definition for SSI_DMAC register *******************/ -#define SSI_DMAC_TDMAE_Pos (1U) -#define SSI_DMAC_TDMAE_Len (1U) -#define SSI_DMAC_TDMAE_Msk (0x1U << SSI_DMAC_TDMAE_Pos) -#define SSI_DMAC_TDMAE SSI_DMAC_TDMAE_Msk - -#define SSI_DMAC_RDMAE_Pos (0U) -#define SSI_DMAC_RDMAE_Len (1U) -#define SSI_DMAC_RDMAE_Msk (0x1U << SSI_DMAC_RDMAE_Pos) -#define SSI_DMAC_RDMAE SSI_DMAC_RDMAE_Msk - -/******************* Bit definition for SSI_DMATDL register *****************/ -#define SSI_DMATDL_DMATDL_Pos (0U) -#define SSI_DMATDL_DMATDL_Len (4U) -#define SSI_DMATDL_DMATDL_Msk (0xFU << SSI_DMATDL_DMATDL_Pos) -#define SSI_DMATDL_DMATDL SSI_DMATDL_DMATDL_Msk - -#define SSI_DMARDL_DMARDL_Pos (0U) -#define SSI_DMARDL_DMARDL_Len (4U) -#define SSI_DMARDL_DMARDL_Msk (0xFU << SSI_DMARDL_DMARDL_Pos) -#define SSI_DMARDL_DMARDL SSI_DMARDL_DMARDL_Msk - -/******************* Bit definition for SSI_IDCODE register *****************/ -#define SSI_IDCODE_ID_Pos (0U) -#define SSI_IDCODE_ID_Len (32U) -#define SSI_IDCODE_ID_Msk (0xFFFFFFFFU) -#define SSI_IDCODE_ID SSI_IDCODE_ID_Msk - -/******************* Bit definition for SSI_COMP register *******************/ -#define SSI_COMP_VERSION_Pos (0U) -#define SSI_COMP_VERSION_Len (32U) -#define SSI_COMP_VERSION_Msk (0xFFFFFFFFU) -#define SSI_COMP_VERSION SSI_COMP_VERSION_Msk - -/******************* Bit definition for SSI_DATA register *******************/ -#define SSI_DATA_REG_Pos (0U) -#define SSI_DATA_REG_Len (32U) -#define SSI_DATA_REG_Msk (0xFFFFFFFFU) -#define SSI_DATA_REG SSI_DATA_REG_Msk - -/******************* Bit definition for SSI_RX register *********************/ -#define SSI_RX_SAMPLEDLY_Pos (0U) -#define SSI_RX_SAMPLEDLY_Len (8U) -#define SSI_RX_SAMPLEDLY_Msk (0xFFU << SSI_RX_SAMPLEDLY_Pos) -#define SSI_RX_SAMPLEDLY SSI_RX_SAMPLEDLY_Msk - -/******************* Bit definition for SSI_SCTRL0 register *****************/ -#define SSI_SCTRL0_WAITCYCLES_Pos (11U) -#define SSI_SCTRL0_WAITCYCLES_Len (5U) -#define SSI_SCTRL0_WAITCYCLES_Msk (0x1FU << SSI_SCTRL0_WAITCYCLES_Pos) -#define SSI_SCTRL0_WAITCYCLES SSI_SCTRL0_WAITCYCLES_Msk - -#define SSI_SCTRL0_INSTL_Pos (8U) -#define SSI_SCTRL0_INSTL_Len (2U) -#define SSI_SCTRL0_INSTL_Msk (0x03U << SSI_SCTRL0_INSTL_Pos) -#define SSI_SCTRL0_INSTL SSI_SCTRL0_INSTL_Msk - -#define SSI_SCTRL0_ADDRL_Pos (2U) -#define SSI_SCTRL0_ADDRL_Len (4U) -#define SSI_SCTRL0_ADDRL_Msk (0x0FU << SSI_SCTRL0_ADDRL_Pos) -#define SSI_SCTRL0_ADDRL SSI_SCTRL0_ADDRL_Msk - -#define SSI_SCTRL0_TRANSTYPE_Pos (0U) -#define SSI_SCTRL0_TRANSTYPE_Len (2U) -#define SSI_SCTRL0_TRANSTYPE_Msk (0x03U << SSI_SCTRL0_TRANSTYPE_Pos) -#define SSI_SCTRL0_TRANSTYPE SSI_SCTRL0_TRANSTYPE_Msk - - -/* ================================================================================================================= */ -/* ================ TIMER ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for TIMER_CTRL register *******************/ -#define TIMER_CTRL_INTEN_Pos (3U) -#define TIMER_CTRL_INTEN_Len (1U) -#define TIMER_CTRL_INTEN_Msk (0x1U << TIMER_CTRL_INTEN_Pos) -#define TIMER_CTRL_INTEN TIMER_CTRL_INTEN_Msk - -#define TIMER_CTRL_EN_Pos (0U) -#define TIMER_CTRL_EN_Len (1U) -#define TIMER_CTRL_EN_Msk (0x1U << TIMER_CTRL_EN_Pos) -#define TIMER_CTRL_EN TIMER_CTRL_EN_Msk - -/******************* Bit definition for TIMER_VALUE register ******************/ -#define TIMER_VALUE_VALUE_Pos (0U) -#define TIMER_VALUE_VALUE_Len (32U) -#define TIMER_VALUE_VALUE_Msk (0xFFFFFFFFU) -#define TIMER_VALUE_VALUE TIMER_VALUE_VALUE_Msk - -/******************* Bit definition for TIMER_RELOAD register *****************/ -#define TIMER_RELOAD_RELOAD_Pos (0U) -#define TIMER_RELOAD_RELOAD_Len (32U) -#define TIMER_RELOAD_RELOAD_Msk (0xFFFFFFFFU) -#define TIMER_RELOAD_RELOAD TIMER_RELOAD_RELOAD_Msk - -/******************* Bit definition for TIMER_RELOAD register *****************/ -#define TIMER_INT_STAT_Pos (0U) -#define TIMER_INT_STAT_Len (1U) -#define TIMER_INT_STAT_Msk (0x1U << TIMER_INT_STAT_Pos) -#define TIMER_INT_STAT TIMER_INT_STAT_Msk - - -/* ================================================================================================================= */ -/* ================ UART ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for UART_RBR register *******************/ -#define UART_RBR_RBR_Pos (0U) -#define UART_RBR_RBR_Len (8U) -#define UART_RBR_RBR_Msk (0xFFU << UART_RBR_RBR_Pos) -#define UART_RBR_RBR UART_RBR_RBR_Msk /**< Receive Buffer Register */ - -/******************* Bit definition for UART_DLL register *******************/ -#define UART_DLL_DLL_Pos (0U) -#define UART_DLL_DLL_Len (8U) -#define UART_DLL_DLL_Msk (0xFFU << UART_DLL_DLL_Pos) -#define UART_DLL_DLL UART_DLL_DLL_Msk /**< Divisor Latch (Low) */ - -/******************* Bit definition for UART_THR register *******************/ -#define UART_THR_THR_Pos (0U) -#define UART_THR_THR_Len (8U) -#define UART_THR_THR_Msk (0xFFU << UART_THR_THR_Pos) -#define UART_THR_THR UART_THR_THR_Msk /**< Transmit Holding Register */ - -/******************* Bit definition for UART_DLH register *******************/ -#define UART_DLH_DLH_Pos (0U) -#define UART_DLH_DLH_Len (8U) -#define UART_DLH_DLH_Msk (0xFFU << UART_DLH_DLH_Pos) -#define UART_DLH_DLH UART_DLH_DLH_Msk /**< Divisor Latch (High) */ - -/******************* Bit definition for UART_IER register *******************/ -#define UART_IER_PTIME_Pos (7U) -#define UART_IER_PTIME_Len (1U) -#define UART_IER_PTIME_Msk (0x1U << UART_IER_PTIME_Pos) -#define UART_IER_PTIME UART_IER_PTIME_Msk /**< Programmable THRE Interrupt - Mode Enable */ - -#define UART_IER_ELCOLR_Pos (4U) -#define UART_IER_ELCOLR_Len (1U) -#define UART_IER_ELCOLR_Msk (0x1U << UART_IER_ELCOLR_Pos) -#define UART_IER_ELCOLR UART_IER_ELCOLR_Msk /**< Enable Auto Clear LSR Register - by read RBR/LSR, read only */ - -#define UART_IER_EDSSI_Pos (3U) -#define UART_IER_EDSSI_Len (1U) -#define UART_IER_EDSSI_Msk (0x1U << UART_IER_EDSSI_Pos) -#define UART_IER_EDSSI UART_IER_EDSSI_Msk /**< Enable Modem Status Interrupt */ - -#define UART_IER_ERLS_Pos (2U) -#define UART_IER_ERLS_Len (1U) -#define UART_IER_ERLS_Msk (0x1U << UART_IER_ERLS_Pos) -#define UART_IER_ERLS UART_IER_ERLS_Msk /**< Enable Receiver Line Status - Interrupt */ - -#define UART_IER_ETBEI_Pos (1U) -#define UART_IER_ETBEI_Len (1U) -#define UART_IER_ETBEI_Msk (0x1U << UART_IER_ETBEI_Pos) -#define UART_IER_ETBEI UART_IER_ETBEI_Msk /**< Enable Transmit Holding Register - Empty Interrupt */ - -#define UART_IER_ERBFI_Pos (0U) -#define UART_IER_ERBFI_Len (1U) -#define UART_IER_ERBFI_Msk (0x1U << UART_IER_ERBFI_Pos) -#define UART_IER_ERBFI UART_IER_ERBFI_Msk /**< Enable Received Data - Available Interrupt */ - -/******************* Bit definition for UART_FCR register *******************/ -#define UART_TXFIFO_SIZE 128 -#define UART_RXFIFO_SIZE 128 - -#define UART_FCR_RT_Pos (6U) -#define UART_FCR_RT_Len (2U) -#define UART_FCR_RT_Msk (0x3U << UART_FCR_RT_Pos) -#define UART_FCR_RT UART_FCR_RT_Msk /**< RCVR Trigger */ -#define UART_FCR_RT_CHAR_1 (0x0U << UART_FCR_RT_Pos) /**< RX FIFO 1 Char */ -#define UART_FCR_RT_QUARTER_FULL (0x1U << UART_FCR_RT_Pos) /**< RX FIFO Quater Full*/ -#define UART_FCR_RT_HALF_FULL (0x2U << UART_FCR_RT_Pos) /**< RX FIFO Half Full */ -#define UART_FCR_RT_FULL_2 (0x3U << UART_FCR_RT_Pos) /**< RX FIFO 2 less than Full */ - -#define UART_FCR_TET_Pos (4U) -#define UART_FCR_TET_Len (2U) -#define UART_FCR_TET_Msk (0x3U << UART_FCR_TET_Pos) -#define UART_FCR_TET UART_FCR_TET_Msk /**< TX Empty Trigger */ -#define UART_FCR_TET_EMPTY (0x0U << UART_FCR_TET_Pos) /**< TX FIFO Empty */ -#define UART_FCR_TET_CHAR_2 (0x1U << UART_FCR_TET_Pos) /**< TX FIFO 2 chars */ -#define UART_FCR_TET_QUARTER_FULL (0x2U << UART_FCR_TET_Pos) /**< TX FIFO Quater Full */ -#define UART_FCR_TET_HALF_FULL (0x3U << UART_FCR_TET_Pos) /**< TX FIFO Half Full */ - -#define UART_FCR_XFIFOR_Pos (2U) -#define UART_FCR_XFIFOR_Len (1U) -#define UART_FCR_XFIFOR_Msk (0x1U << UART_FCR_XFIFOR_Pos) -#define UART_FCR_XFIFOR UART_FCR_XFIFOR_Msk /**< XMIT FIFO Reset */ - -#define UART_FCR_RFIFOR_Pos (1U) -#define UART_FCR_RFIFOR_Len (1U) -#define UART_FCR_RFIFOR_Msk (0x1U << UART_FCR_RFIFOR_Pos) -#define UART_FCR_RFIFOR UART_FCR_RFIFOR_Msk /**< RCVR FIFO Reset */ - -#define UART_FCR_FIFOE_Pos (0U) -#define UART_FCR_FIFOE_Len (1U) -#define UART_FCR_FIFOE_Msk (0x1U << UART_FCR_FIFOE_Pos) -#define UART_FCR_FIFOE UART_FCR_FIFOE_Msk /**< FIFO Enable */ - -/******************* Bit definition for UART_IIR register *******************/ -#define UART_IIR_IID_Pos (0U) -#define UART_IIR_IID_Len (4U) -#define UART_IIR_IID_Msk (0xFU << UART_IIR_IID_Pos) -#define UART_IIR_IID UART_IIR_IID_Msk /**< Interrupt ID */ -#define UART_IIR_IID_MS (0x0U << UART_IIR_IID_Pos) /**< Modem Status */ -#define UART_IIR_IID_NIP (0x1U << UART_IIR_IID_Pos) /**< No Interrupt Pending */ -#define UART_IIR_IID_THRE (0x2U << UART_IIR_IID_Pos) /**< THR Empty */ -#define UART_IIR_IID_RDA (0x4U << UART_IIR_IID_Pos) /**< Received Data Available */ -#define UART_IIR_IID_RLS (0x6U << UART_IIR_IID_Pos) /**< Receiver Line Status */ -#define UART_IIR_IID_CTO (0xCU << UART_IIR_IID_Pos) /**< Character Timeout */ - -/******************* Bit definition for UART_LCR register *******************/ -#define UART_LCR_DLAB_Pos (7U) -#define UART_LCR_DLAB_Len (1U) -#define UART_LCR_DLAB_Msk (0x1U << UART_LCR_DLAB_Pos) -#define UART_LCR_DLAB UART_LCR_DLAB_Msk /**< Divisor Latch Access */ - -#define UART_LCR_BC_Pos (6U) -#define UART_LCR_BC_Len (1U) -#define UART_LCR_BC_Msk (0x1U << UART_LCR_BC_Pos) -#define UART_LCR_BC UART_LCR_BC_Msk /**< Break Control */ - -#define UART_LCR_PARITY_Pos (3U) -#define UART_LCR_PARITY_Len (3U) -#define UART_LCR_PARITY_Msk (0x7U << UART_LCR_PARITY_Pos) -#define UART_LCR_PARITY UART_LCR_PARITY_Msk /**< Parity,SP,EPS,PEN bits */ -#define UART_LCR_PARITY_NONE (0x0U << UART_LCR_PARITY_Pos) /**< Parity none */ -#define UART_LCR_PARITY_ODD (0x1U << UART_LCR_PARITY_Pos) /**< Parity odd */ -#define UART_LCR_PARITY_EVEN (0x3U << UART_LCR_PARITY_Pos) /**< Parity even */ -#define UART_LCR_PARITY_SP0 (0x5U << UART_LCR_PARITY_Pos) /**< Parity stick 0 */ -#define UART_LCR_PARITY_SP1 (0x7U << UART_LCR_PARITY_Pos) /**< Parity stick 1 */ - -#define UART_LCR_STOP_Pos (2U) -#define UART_LCR_STOP_Msk (0x1U << UART_LCR_STOP_Pos) -#define UART_LCR_STOP UART_LCR_STOP_Msk /**< Stop bit */ -#define UART_LCR_STOP_1 (0x0U << UART_LCR_STOP_Pos) /**< Stop bit 1 */ -#define UART_LCR_STOP_1_5 (0x1U << UART_LCR_STOP_Pos) /**< Stop bit 1.5 (DLS = 0) */ -#define UART_LCR_STOP_2 (0x1U << UART_LCR_STOP_Pos) /**< Stop bit 2 (DLS != 0) */ - -#define UART_LCR_DLS_Pos (0U) -#define UART_LCR_DLS_Msk (0x3U << UART_LCR_DLS_Pos) -#define UART_LCR_DLS UART_LCR_DLS_Msk /**< Data Length Select */ -#define UART_LCR_DLS_5 (0x0U << UART_LCR_DLS_Pos) /**< Data bits 5 */ -#define UART_LCR_DLS_6 (0x1U << UART_LCR_DLS_Pos) /**< Data bits 6 */ -#define UART_LCR_DLS_7 (0x2U << UART_LCR_DLS_Pos) /**< Data bits 7 */ -#define UART_LCR_DLS_8 (0x3U << UART_LCR_DLS_Pos) /**< Data bits 8 */ - -/******************* Bit definition for UART_MCR register *******************/ -#define UART_MCR_AFCE_Pos (5U) -#define UART_MCR_AFCE_Len (1U) -#define UART_MCR_AFCE_Msk (0x1U << UART_MCR_AFCE_Pos) -#define UART_MCR_AFCE UART_MCR_AFCE_Msk /**< Auto flow contrl enable */ - -#define UART_MCR_LOOPBACK_Pos (4U) -#define UART_MCR_LOOPBACK_Len (1U) -#define UART_MCR_LOOPBACK_Msk (0x1U << UART_MCR_LOOPBACK_Pos) -#define UART_MCR_LOOPBACK UART_MCR_LOOPBACK_Msk /**< LoopBack */ - -#define UART_MCR_RTS_Pos (1U) -#define UART_MCR_RTS_Len (1U) -#define UART_MCR_RTS_Msk (0x1U << UART_MCR_RTS_Pos) -#define UART_MCR_RTS UART_MCR_RTS_Msk /**< Request To Send */ - -/******************* Bit definition for UART_LSR register *******************/ -#define UART_LSR_RFE_Pos (7U) -#define UART_LSR_RFE_Len (1U) -#define UART_LSR_RFE_Msk (0x1U << UART_LSR_RFE_Pos) -#define UART_LSR_RFE UART_LSR_RFE_Msk /**< Receiver FIFO Error */ - -#define UART_LSR_TEMT_Pos (6U) -#define UART_LSR_TEMT_Len (1U) -#define UART_LSR_TEMT_Msk (0x1U << UART_LSR_TEMT_Pos) -#define UART_LSR_TEMT UART_LSR_TEMT_Msk /**< Transmitter Empty */ - -#define UART_LSR_THRE_Pos (5U) -#define UART_LSR_THRE_Len (1U) -#define UART_LSR_THRE_Msk (0x1U << UART_LSR_THRE_Pos) -#define UART_LSR_THRE UART_LSR_THRE_Msk /**< Transmit Holding Register Empty */ - -#define UART_LSR_BI_Pos (4U) -#define UART_LSR_BI_Len (1U) -#define UART_LSR_BI_Msk (0x1U << UART_LSR_BI_Pos) -#define UART_LSR_BI UART_LSR_BI_Msk /**< Break Interrupt */ - -#define UART_LSR_FE_Pos (3U) -#define UART_LSR_FE_Len (1U) -#define UART_LSR_FE_Msk (0x1U << UART_LSR_FE_Pos) -#define UART_LSR_FE UART_LSR_FE_Msk /**< Framing Error */ - -#define UART_LSR_PE_Pos (2U) -#define UART_LSR_PE_Len (1U) -#define UART_LSR_PE_Msk (0x1U << UART_LSR_PE_Pos) -#define UART_LSR_PE UART_LSR_PE_Msk /**< Parity Error */ - -#define UART_LSR_OE_Pos (1U) -#define UART_LSR_OE_Len (1U) -#define UART_LSR_OE_Msk (0x1U << UART_LSR_OE_Pos) -#define UART_LSR_OE UART_LSR_OE_Msk /**< Overrun error */ - -#define UART_LSR_DR_Pos (0U) -#define UART_LSR_DR_Msk (0x1U << UART_LSR_DR_Pos) -#define UART_LSR_DR UART_LSR_DR_Msk /**< Data Ready */ - -/******************* Bit definition for UART_MSR register *******************/ -#define UART_MSR_CTS_Pos (4U) -#define UART_MSR_CTS_Len (1U) -#define UART_MSR_CTS_Msk (0x1U << UART_MSR_CTS_Pos) -#define UART_MSR_CTS UART_MSR_CTS_Msk /**< Clear To Send */ - -#define UART_MSR_DCTS_Pos (0U) -#define UART_MSR_DCTS_Len (1U) -#define UART_MSR_DCTS_Msk (0x1U << UART_MSR_DCTS_Pos) -#define UART_MSR_DCTS UART_MSR_DCTS_Msk /**< Delta Clear To Send */ - -/******************* Bit definition for UART_USR register *******************/ -#define UART_USR_RFF_Pos (4U) -#define UART_USR_RFF_Len (1U) -#define UART_USR_RFF_Msk (0x1U << UART_USR_RFF_Pos) -#define UART_USR_RFF UART_USR_RFF_Msk /**< Receive FIFO Full */ - -#define UART_USR_RFNE_Pos (3U) -#define UART_USR_RFNE_Len (1U) -#define UART_USR_RFNE_Msk (0x1U << UART_USR_RFNE_Pos) -#define UART_USR_RFNE UART_USR_RFNE_Msk /**< Receive FIFO Not Empty */ - -#define UART_USR_TFE_Pos (2U) -#define UART_USR_TFE_Len (1U) -#define UART_USR_TFE_Msk (0x1U << UART_USR_TFE_Pos) -#define UART_USR_TFE UART_USR_TFE_Msk /**< Transmit FIFO Empty */ - -#define UART_USR_TFNF_Pos (1U) -#define UART_USR_TFNF_Len (1U) -#define UART_USR_TFNF_Msk (0x1U << UART_USR_TFNF_Pos) -#define UART_USR_TFNF UART_USR_TFNF_Msk /**< Transmit FIFO Not Full */ - -/******************* Bit definition for UART_TFL register *******************/ -/* Transmit FIFO Level bits */ -#define UART_TFL_TFL_Pos (0U) -#define UART_TFL_TFL_Len (7U) -#define UART_TFL_TFL_Msk (0x7FU << UART_TFL_TFL_Pos) -#define UART_TFL_TFL UART_TFL_TFL_Msk /**< Transmit FIFO Level */ - -/******************* Bit definition for UART_RFL register *******************/ -/* Receive FIFO Level bits */ -#define UART_RFL_RFL_Pos (0U) -#define UART_RFL_RFL_Len (7U) -#define UART_RFL_RFL_Msk (0x7FU << UART_RFL_RFL_Pos) -#define UART_RFL_RFL UART_RFL_RFL_Msk /**< Receive FIFO Level */ - -/******************* Bit definition for UART_SRR register *******************/ -/* XMIT FIFO Reset bit */ -#define UART_SRR_XFR_Pos (2U) -#define UART_SRR_XFR_Len (1U) -#define UART_SRR_XFR_Msk (0x1U << UART_SRR_XFR_Pos) -#define UART_SRR_XFR UART_SRR_XFR_Msk /**< XMIT FIFO Reset */ - -/* RCVR FIFO Reset bit */ -#define UART_SRR_RFR_Pos (1U) -#define UART_SRR_RFR_Len (1U) -#define UART_SRR_RFR_Msk (0x1U << UART_SRR_RFR_Pos) -#define UART_SRR_RFR UART_SRR_RFR_Msk /**< RCVR FIFO Reset */ - -/* UART Reset Enable bit */ -#define UART_SRR_UR_Pos (0U) -#define UART_SRR_UR_Len (1U) -#define UART_SRR_UR_Msk (0x1U << UART_SRR_UR_Pos) -#define UART_SRR_UR UART_SRR_UR_Msk /**< UART Reset */ - -/******************* Bit definition for UART_SRTS register *******************/ -#define UART_SRTS_SRTS_Pos (0U) -#define UART_SRTS_SRTS_Len (1U) -#define UART_SRTS_SRTS_Msk (0x1U << UART_SRTS_SRTS_Pos) -#define UART_SRTS_SRTS UART_SRTS_SRTS_Msk /**< Shadow Request to Send */ - -/******************* Bit definition for UART_SBCR register *******************/ -#define UART_SBCR_SBCR_Pos (0U) -#define UART_SBCR_SBCR_Len (1U) -#define UART_SBCR_SBCR_Msk (0x1U << UART_SBCR_SBCR_Pos) -#define UART_SBCR_SBCR UART_SBCR_SBCR_Msk /**< Shadow Break Control */ - -/******************* Bit definition for UART_SFE register *******************/ -#define UART_SFE_SFE_Pos (0U) -#define UART_SFE_SFE_Len (1U) -#define UART_SFE_SFE_Msk (0x1U << UART_SFE_SFE_Pos) -#define UART_SFE_SFE UART_SFE_SFE_Msk /**< Shadow FIFO Enable */ - -/******************* Bit definition for UART_SRT register *******************/ -#define UART_SRT_SRT_Pos (0U) -#define UART_SRT_SRT_Len (2U) -#define UART_SRT_SRT_Msk (0x3U << UART_SRT_SRT_Pos) -#define UART_SRT_SRT UART_SRT_SRT_Msk -#define UART_SRT_SRT_CHAR_1 (0x0U << UART_SRT_SRT_Pos) /**< RX FIFO 1 Char */ -#define UART_SRT_SRT_QUARTER_FULL (0x1U << UART_SRT_SRT_Pos) /**< RX FIFO Quater Full*/ -#define UART_SRT_SRT_HALF_FULL (0x2U << UART_SRT_SRT_Pos) /**< RX FIFO Half Full */ -#define UART_SRT_SRT_FULL_2 (0x3U << UART_SRT_SRT_Pos) /**< RX FIFO 2 less than Full */ - -/******************* Bit definition for UART_STET register *******************/ -#define UART_STET_STET_Pos (0U) -#define UART_STET_STET_Len (2U) -#define UART_STET_STET_Msk (0x3U << UART_STET_STET_Pos) -#define UART_STET_STET UART_STET_STET_Msk -#define UART_STET_STET_EMPTY (0x0U << UART_STET_STET_Pos) /**< TX FIFO Empty */ -#define UART_STET_STET_CHAR_2 (0x1U << UART_STET_STET_Pos) /**< TX FIFO 2 chars */ -#define UART_STET_STET_QUARTER_FULL (0x2U << UART_STET_STET_Pos) /**< TX FIFO Quater Full */ -#define UART_STET_STET_HALF_FULL (0x3U << UART_STET_STET_Pos) /**< TX FIFO Half Full */ - -/******************* Bit definition for UART_HTX register *******************/ -#define UART_HTX_HTX_Pos (0U) -#define UART_HTX_HTX_Len (1U) -#define UART_HTX_HTX_Msk (0x1U << UART_HTX_HTX_Pos) -#define UART_HTX_HTX UART_HTX_HTX_Msk /**< Halt TX */ - -/******************* Bit definition for UART_DLF register *******************/ -#define UART_DLF_DLF_Pos (0U) -#define UART_DLF_DLF_Len (1U) -#define UART_DLF_DLF_Msk (0x1U << UART_DLF_DLF_Pos) -#define UART_DLF_DLF UART_DLF_DLF_Msk /**< Fractional part of divisor */ - - -/* ================================================================================================================= */ -/* ================ WDT ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for WDT_CTRL register ********************/ -#define WDT_CTRL_INTEN_Pos (0U) -#define WDT_CTRL_INTEN_Len (1U) -#define WDT_CTRL_INTEN_Msk (0x1U << WDT_CTRL_INTEN_Pos) -#define WDT_CTRL_INTEN WDT_CTRL_INTEN_Msk /**< Interrupt Enable */ - -#define WDT_CTRL_RSTEN_Pos (1U) -#define WDT_CTRL_RSTEN_Len (1U) -#define WDT_CTRL_RSTEN_Msk (0x1U << WDT_CTRL_RSTEN_Pos) -#define WDT_CTRL_RSTEN WDT_CTRL_RSTEN_Msk /**< Reset Enable */ - -/******************* Bit definition for WDT_INTCLR register ********************/ -#define WDT_INTCLR_Pos (0U) -#define WDT_INTCLR_Len (1U) -#define WDT_INTCLR_Msk (0x1U << WDT_INTCLR_Pos) -#define WDT_INTCLR WDT_INTCLR_Msk /**< Interrupt status clear */ - -/******************* Bit definition for WDT_MIS register ********************/ -#define WDT_MIS_INTSTAT_Pos (0U) -#define WDT_MIS_INTSTAT_Len (1U) -#define WDT_MIS_INTSTAT_Msk (0x1U << WDT_MIS_INTSTAT_Pos) -#define WDT_MIS_INTSTAT WDT_MIS_INTSTAT_Msk /**< Interrupt status */ - - -/* ================================================================================================================= */ -/* ================ XQSPI ================ */ -/* ================================================================================================================= */ -/******************* Bit definition for XQSPI_CACHE_CTRL0 register **********/ -#define XQSPI_CACHE_CTRL0_CLK_FORCE_EN_Pos (7U) -#define XQSPI_CACHE_CTRL0_CLK_FORCE_EN_Len (4U) -#define XQSPI_CACHE_CTRL0_CLK_FORCE_EN_Msk (0xFU << XQSPI_CACHE_CTRL0_CLK_FORCE_EN_Pos) -#define XQSPI_CACHE_CTRL0_CLK_FORCE_EN XQSPI_CACHE_CTRL0_CLK_FORCE_EN_Msk - -#define XQSPI_CACHE_CTRL0_BUF_DIS_Pos (6U) -#define XQSPI_CACHE_CTRL0_BUF_DIS_Len (1U) -#define XQSPI_CACHE_CTRL0_BUF_DIS_Msk (0x1U << XQSPI_CACHE_CTRL0_BUF_DIS_Pos) -#define XQSPI_CACHE_CTRL0_BUF_DIS XQSPI_CACHE_CTRL0_BUF_DIS_Msk - -#define XQSPI_CACHE_CTRL0_DIS_SEQ_Pos (5U) -#define XQSPI_CACHE_CTRL0_DIS_SEQ_Len (1U) -#define XQSPI_CACHE_CTRL0_DIS_SEQ_Msk (0x1U << XQSPI_CACHE_CTRL0_DIS_SEQ_Pos) -#define XQSPI_CACHE_CTRL0_DIS_SEQ XQSPI_CACHE_CTRL0_DIS_SEQ_Msk - -#define XQSPI_CACHE_CTRL0_HITMISS_Pos (4U) -#define XQSPI_CACHE_CTRL0_HITMISS_Len (1U) -#define XQSPI_CACHE_CTRL0_HITMISS_Msk (0x1U << XQSPI_CACHE_CTRL0_HITMISS_Pos) -#define XQSPI_CACHE_CTRL0_HITMISS XQSPI_CACHE_CTRL0_HITMISS_Msk - -#define XQSPI_CACHE_CTRL0_FIFO_Pos (3U) -#define XQSPI_CACHE_CTRL0_FIFO_Len (1U) -#define XQSPI_CACHE_CTRL0_FIFO_Msk (0x1U << XQSPI_CACHE_CTRL0_FIFO_Pos) -#define XQSPI_CACHE_CTRL0_FIFO XQSPI_CACHE_CTRL0_FIFO_Msk - -#define XQSPI_CACHE_CTRL0_FLUSH_Pos (1U) -#define XQSPI_CACHE_CTRL0_FLUSH_Len (1U) -#define XQSPI_CACHE_CTRL0_FLUSH_Msk (0x1U << XQSPI_CACHE_CTRL0_FLUSH_Pos) -#define XQSPI_CACHE_CTRL0_FLUSH XQSPI_CACHE_CTRL0_FLUSH_Msk - -#define XQSPI_CACHE_CTRL0_DIS_Pos (0U) -#define XQSPI_CACHE_CTRL0_DIS_Len (1U) -#define XQSPI_CACHE_CTRL0_DIS_Msk (0x1U << XQSPI_CACHE_CTRL0_DIS_Pos) -#define XQSPI_CACHE_CTRL0_DIS XQSPI_CACHE_CTRL0_DIS_Msk - -/******************* Bit definition for XQSPI_CACHE_CTRL1 register **********/ -#define XQSPI_CACHE_CTRL1_DBGMUX_EN_Pos (4U) -#define XQSPI_CACHE_CTRL1_DBGMUX_EN_Len (1U) -#define XQSPI_CACHE_CTRL1_DBGMUX_EN_Msk (0x1U << XQSPI_CACHE_CTRL1_DBGMUX_EN_Pos) -#define XQSPI_CACHE_CTRL1_DBGMUX_EN XQSPI_CACHE_CTRL1_DBGMUX_EN_Msk - -#define XQSPI_CACHE_CTRL1_DBGBUS_SEL_Pos (0U) -#define XQSPI_CACHE_CTRL1_DBGBUS_SEL_Len (4U) -#define XQSPI_CACHE_CTRL1_DBGBUS_SEL_Msk (0xFU << XQSPI_CACHE_CTRL1_DBGBUS_SEL_Pos) -#define XQSPI_CACHE_CTRL1_DBGBUS_SEL XQSPI_CACHE_CTRL1_DBGBUS_SEL_Msk - -/******************* Bit definition for XQSPI_CACHE_HITCOUNT register *******/ -#define XQSPI_CACHE_HITCOUNT_Pos (0U) -#define XQSPI_CACHE_HITCOUNT_Len (32U) -#define XQSPI_CACHE_HITCOUNT_Msk (0xFFFFFFFFU) -#define XQSPI_CACHE_HITCOUNT XQSPI_CACHE_HITCOUNT_Msk - -/******************* Bit definition for XQSPI_CACHE_MISSCOUNT register ******/ -#define XQSPI_CACHE_MISSCOUNT_Pos (0U) -#define XQSPI_CACHE_MISSCOUNT_Len (32U) -#define XQSPI_CACHE_MISSCOUNT_Msk (0xFFFFFFFFU) -#define XQSPI_CACHE_MISSCOUNT XQSPI_CACHE_MISSCOUNT_Msk - -/******************* Bit definition for XQSPI_CACHE_STAT register ***********/ -#define XQSPI_CACHE_BUF_BUSY_Pos (2U) -#define XQSPI_CACHE_BUF_BUSY_Len (1U) -#define XQSPI_CACHE_BUF_BUSY_Msk (0x1U << XQSPI_CACHE_BUF_BUSY_Pos) -#define XQSPI_CACHE_BUF_BUSY XQSPI_CACHE_BUF_BUSY_Msk - -#define XQSPI_CACHE_BUF_ADDR_REACHED_Pos (1U) -#define XQSPI_CACHE_BUF_ADDR_REACHED_Len (1U) -#define XQSPI_CACHE_BUF_ADDR_REACHED_Msk (0x1U << XQSPI_CACHE_BUF_ADDR_REACHED_Pos) -#define XQSPI_CACHE_BUF_ADDR_REACHED XQSPI_CACHE_BUF_ADDR_REACHED_Msk - -#define XQSPI_CACHE_STAT_Pos (0U) -#define XQSPI_CACHE_STAT_Len (1U) -#define XQSPI_CACHE_STAT_Msk (0x1U << XQSPI_CACHE_STAT_Pos) -#define XQSPI_CACHE_STAT XQSPI_CACHE_STAT_Msk - -/******************* Bit definition for XQSPI_CACHE_BUF_FIRST_ADDR register ***********/ -#define XQSPI_CACHE_BUF_FISRT_ADDR_Pos (0U) -#define XQSPI_CACHE_BUF_FISRT_ADDR_Len (32U) -#define XQSPI_CACHE_BUF_FISRT_ADDR_Msk (0xFFFFFFFFU) -#define XQSPI_CACHE_BUF_FISRT_ADDR XQSPI_CACHE_BUF_FISRT_ADDR_Msk - -/******************* Bit definition for XQSPI_CACHE_BUF_LAST_ADDR register ***********/ -#define XQSPI_CACHE_BUF_LAST_ADDR_Pos (0U) -#define XQSPI_CACHE_BUF_LAST_ADDR_Len (32U) -#define XQSPI_CACHE_BUF_LAST_ADDR_Msk (0xFFFFFFFFU) -#define XQSPI_CACHE_BUF_LAST_ADDR XQSPI_CACHE_BUF_LAST_ADDR_Msk - -/******************* Bit definition for XQSPI_XIP_CFG register **************/ -#define XQSPI_XIP_CFG_CMD_Pos (0U) -#define XQSPI_XIP_CFG_CMD_Len (8U) -#define XQSPI_XIP_CFG_CMD_Msk (0xFFU << XQSPI_XIP_CFG_CMD_Pos) -#define XQSPI_XIP_CFG_CMD XQSPI_XIP_CFG_CMD_Msk - -#define XQSPI_XIP_CFG_LE32_Pos (8U) -#define XQSPI_XIP_CFG_LE32_Len (1U) -#define XQSPI_XIP_CFG_LE32_Msk (0x1U << XQSPI_XIP_CFG_LE32_Pos) -#define XQSPI_XIP_CFG_LE32 XQSPI_XIP_CFG_LE32_Msk - -#define XQSPI_XIP_CFG_ADDR4_Pos (7U) -#define XQSPI_XIP_CFG_ADDR4_Len (1U) -#define XQSPI_XIP_CFG_ADDR4_Msk (0x1U << XQSPI_XIP_CFG_ADDR4_Pos) -#define XQSPI_XIP_CFG_ADDR4 XQSPI_XIP_CFG_ADDR4_Msk - -#define XQSPI_XIP_CFG_CPOL_Pos (6U) -#define XQSPI_XIP_CFG_CPOL_Len (1U) -#define XQSPI_XIP_CFG_CPOL_Msk (0x1U << XQSPI_XIP_CFG_CPOL_Pos) -#define XQSPI_XIP_CFG_CPOL XQSPI_XIP_CFG_CPOL_Msk - -#define XQSPI_XIP_CFG_CPHA_Pos (5U) -#define XQSPI_XIP_CFG_CPHA_Len (1U) -#define XQSPI_XIP_CFG_CPHA_Msk (0x1U << XQSPI_XIP_CFG_CPHA_Pos) -#define XQSPI_XIP_CFG_CPHA XQSPI_XIP_CFG_CPHA_Msk - -#define XQSPI_XIP_CFG_SS_Pos (1U) -#define XQSPI_XIP_CFG_SS_Len (4U) -#define XQSPI_XIP_CFG_SS_Msk (0xFU << XQSPI_XIP_CFG_SS_Pos) -#define XQSPI_XIP_CFG_SS XQSPI_XIP_CFG_SS_Msk - -#define XQSPI_XIP_CFG_HPEN_Pos (0U) -#define XQSPI_XIP_CFG_HPEN_Len (1U) -#define XQSPI_XIP_CFG_HPEN_Msk (0x1U << XQSPI_XIP_CFG_HPEN_Pos) -#define XQSPI_XIP_CFG_HPEN XQSPI_XIP_CFG_HPEN_Msk - -#define XQSPI_XIP_CFG_ENDDUMMY_Pos (12U) -#define XQSPI_XIP_CFG_ENDDUMMY_Len (2U) -#define XQSPI_XIP_CFG_ENDDUMMY_Msk (0x3U << XQSPI_XIP_CFG_ENDDUMMY_Pos) -#define XQSPI_XIP_CFG_ENDDUMMY XQSPI_XIP_CFG_ENDDUMMY_Msk - -#define XQSPI_XIP_CFG_DUMMYCYCLES_Pos (8U) -#define XQSPI_XIP_CFG_DUMMYCYCLES_Len (4U) -#define XQSPI_XIP_CFG_DUMMYCYCLES_Msk (0xFU << XQSPI_XIP_CFG_DUMMYCYCLES_Pos) -#define XQSPI_XIP_CFG_DUMMYCYCLES XQSPI_XIP_CFG_DUMMYCYCLES_Msk - -#define XQSPI_XIP_CFG_HPMODE_Pos (0U) -#define XQSPI_XIP_CFG_HPMODE_Len (8U) -#define XQSPI_XIP_CFG_HPMODE_Msk (0xFFUL << XQSPI_XIP_CFG_HPMODE_Pos) -#define XQSPI_XIP_CFG_HPMODE XQSPI_XIP_CFG_HPMODE_Msk - -/******************* Bit definition for XQSPI_XIP_EN register ***************/ -#define XQSPI_XIP_EN_REQ_Pos (0U) -#define XQSPI_XIP_EN_REQ_Len (1U) -#define XQSPI_XIP_EN_REQ_Msk (0x1U << XQSPI_XIP_EN_REQ_Pos) -#define XQSPI_XIP_EN_REQ XQSPI_XIP_EN_REQ_Msk - -#define XQSPI_XIP_EN_OUT_Pos (0U) -#define XQSPI_XIP_EN_OUT_Len (1U) -#define XQSPI_XIP_EN_OUT_Msk (0x1U << XQSPI_XIP_EN_OUT_Pos) -#define XQSPI_XIP_EN_OUT XQSPI_XIP_EN_OUT_Msk - -/******************* Bit definition for XQSPI_XIP_INT0 register *************/ -#define XQSPI_XIP_INT_EN_Pos (0U) -#define XQSPI_XIP_INT_EN_Len (1U) -#define XQSPI_XIP_INT_EN_Msk (0x1U << XQSPI_XIP_INT_EN_Pos) -#define XQSPI_XIP_INT_EN XQSPI_XIP_INT_EN_Msk - -/******************* Bit definition for XQSPI_XIP_INT1 register *************/ -#define XQSPI_XIP_INT_STAT_Pos (0U) -#define XQSPI_XIP_INT_STAT_Len (1U) -#define XQSPI_XIP_INT_STAT_Msk (0x1U << XQSPI_XIP_INT_STAT_Pos) -#define XQSPI_XIP_INT_STAT XQSPI_XIP_INT_STAT_Msk - -/******************* Bit definition for XQSPI_XIP_INT2 register *************/ -#define XQSPI_XIP_INT_REQ_Pos (0U) -#define XQSPI_XIP_INT_REQ_Len (1U) -#define XQSPI_XIP_INT_REQ_Msk (0x1U << XQSPI_XIP_INT_REQ_Pos) -#define XQSPI_XIP_INT_REQ XQSPI_XIP_INT_REQ_Msk - -/******************* Bit definition for XQSPI_XIP_INT3 register *************/ -#define XQSPI_XIP_INT_SET_Pos (0U) -#define XQSPI_XIP_INT_SET_Len (1U) -#define XQSPI_XIP_INT_SET_Msk (0x1U << XQSPI_XIP_INT_SET_Pos) -#define XQSPI_XIP_INT_SET XQSPI_XIP_INT_SET_Msk - -/******************* Bit definition for XQSPI_XIP_INT4 register *************/ -#define XQSPI_XIP_INT_CLR_Pos (0U) -#define XQSPI_XIP_INT_CLR_Len (1U) -#define XQSPI_XIP_INT_CLR_Msk (0x1U << XQSPI_XIP_INT_CLR_Pos) -#define XQSPI_XIP_INT_CLR XQSPI_XIP_INT_CLR_Msk - -/******************* Bit definition for XQSPI_QSPI_STAT register ************/ -#define XQSPI_QSPI_STAT_RXFULL_Pos (7U) -#define XQSPI_QSPI_STAT_RXFULL_Len (1U) -#define XQSPI_QSPI_STAT_RXFULL_Msk (0x1U << XQSPI_QSPI_STAT_RXFULL_Pos) -#define XQSPI_QSPI_STAT_RXFULL XQSPI_QSPI_STAT_RXFULL_Msk - -#define XQSPI_QSPI_STAT_RXWMARK_Pos (6U) -#define XQSPI_QSPI_STAT_RXWMARK_Len (1U) -#define XQSPI_QSPI_STAT_RXWMARK_Msk (0x1U << XQSPI_QSPI_STAT_RXWMARK_Pos) -#define XQSPI_QSPI_STAT_RXWMARK XQSPI_QSPI_STAT_RXWMARK_Msk - -#define XQSPI_QSPI_STAT_RXEMPTY_Pos (5U) -#define XQSPI_QSPI_STAT_RXEMPTY_Len (1U) -#define XQSPI_QSPI_STAT_RXEMPTY_Msk (0x1U << XQSPI_QSPI_STAT_RXEMPTY_Pos) -#define XQSPI_QSPI_STAT_RXEMPTY XQSPI_QSPI_STAT_RXEMPTY_Msk - -#define XQSPI_QSPI_STAT_TXFULL_Pos (4U) -#define XQSPI_QSPI_STAT_TXFULL_Len (1U) -#define XQSPI_QSPI_STAT_TXFULL_Msk (0x1U << XQSPI_QSPI_STAT_TXFULL_Pos) -#define XQSPI_QSPI_STAT_TXFULL XQSPI_QSPI_STAT_TXFULL_Msk - -#define XQSPI_QSPI_STAT_TXWMARK_Pos (3U) -#define XQSPI_QSPI_STAT_TXWMARK_Len (1U) -#define XQSPI_QSPI_STAT_TXWMARK_Msk (0x1U << XQSPI_QSPI_STAT_TXWMARK_Pos) -#define XQSPI_QSPI_STAT_TXWMARK XQSPI_QSPI_STAT_TXWMARK_Msk - -#define XQSPI_QSPI_STAT_TXEMPTY_Pos (2U) -#define XQSPI_QSPI_STAT_TXEMPTY_Len (1U) -#define XQSPI_QSPI_STAT_TXEMPTY_Msk (0x1U << XQSPI_QSPI_STAT_TXEMPTY_Pos) -#define XQSPI_QSPI_STAT_TXEMPTY XQSPI_QSPI_STAT_TXEMPTY_Msk - -#define XQSPI_QSPI_STAT_XFERIP_Pos (0U) -#define XQSPI_QSPI_STAT_XFERIP_Len (1U) -#define XQSPI_QSPI_STAT_XFERIP_Msk (0x1U << XQSPI_QSPI_STAT_XFERIP_Pos) -#define XQSPI_QSPI_STAT_XFERIP XQSPI_QSPI_STAT_XFERIP_Msk - -/******************* Bit definition for XQSPI_QSPI_FIFO register ************/ -#define XQSPI_QSPI_FIFO_TX_Pos (0U) -#define XQSPI_QSPI_FIFO_TX_Len (32U) -#define XQSPI_QSPI_FIFO_TX_Msk (0xFFFFFFFFU) -#define XQSPI_QSPI_FIFO_TX XQSPI_QSPI_FIFO_TX_Msk - -#define XQSPI_QSPI_FIFO_RX_Pos (0U) -#define XQSPI_QSPI_FIFO_RX_Len (32U) -#define XQSPI_QSPI_FIFO_RX_Msk (0xFFFFFFFFU) -#define XQSPI_QSPI_FIFO_RX XQSPI_QSPI_FIFO_RX_Msk - -/******************* Bit definition for XQSPI_QSPI_CTRL register ************/ -#define XQSPI_QSPI_CTRL_TXWMARK_Pos (14U) -#define XQSPI_QSPI_CTRL_TXWMARK_Len (2U) -#define XQSPI_QSPI_CTRL_TXWMARK_Msk (0x3U << XQSPI_QSPI_CTRL_TXWMARK_Pos) -#define XQSPI_QSPI_CTRL_TXWMARK XQSPI_QSPI_CTRL_TXWMARK_Msk - -#define XQSPI_QSPI_CTRL_RXWMARK_Pos (12U) -#define XQSPI_QSPI_CTRL_RXWMARK_Len (2U) -#define XQSPI_QSPI_CTRL_RXWMARK_Msk (0x3U << XQSPI_QSPI_CTRL_RXWMARK_Pos) -#define XQSPI_QSPI_CTRL_RXWMARK XQSPI_QSPI_CTRL_RXWMARK_Msk - -#define XQSPI_QSPI_CTRL_MWAITEN_Pos (11U) -#define XQSPI_QSPI_CTRL_MWAITEN_Len (1U) -#define XQSPI_QSPI_CTRL_MWAITEN_Msk (0x1U << XQSPI_QSPI_CTRL_MWAITEN_Pos) -#define XQSPI_QSPI_CTRL_MWAITEN XQSPI_QSPI_CTRL_MWAITEN_Msk - -#define XQSPI_QSPI_CTRL_DMA_Pos (10U) -#define XQSPI_QSPI_CTRL_DMA_Len (1U) -#define XQSPI_QSPI_CTRL_DMA_Msk (0x1U << XQSPI_QSPI_CTRL_DMA_Pos) -#define XQSPI_QSPI_CTRL_DMA XQSPI_QSPI_CTRL_DMA_Msk - -#define XQSPI_QSPI_CTRL_MASTER_Pos (5U) -#define XQSPI_QSPI_CTRL_MASTER_Len (1U) -#define XQSPI_QSPI_CTRL_MASTER_Msk (0x1U << XQSPI_QSPI_CTRL_MASTER_Pos) -#define XQSPI_QSPI_CTRL_MASTER XQSPI_QSPI_CTRL_MASTER_Msk - -#define XQSPI_QSPI_CTRL_CPOL_Pos (4U) -#define XQSPI_QSPI_CTRL_CPOL_Len (1U) -#define XQSPI_QSPI_CTRL_CPOL_Msk (0x1U << XQSPI_QSPI_CTRL_CPOL_Pos) -#define XQSPI_QSPI_CTRL_CPOL XQSPI_QSPI_CTRL_CPOL_Msk - -#define XQSPI_QSPI_CTRL_CPHA_Pos (3U) -#define XQSPI_QSPI_CTRL_CPHA_Len (1U) -#define XQSPI_QSPI_CTRL_CPHA_Msk (0x1U << XQSPI_QSPI_CTRL_CPHA_Pos) -#define XQSPI_QSPI_CTRL_CPHA XQSPI_QSPI_CTRL_CPHA_Msk - -#define XQSPI_QSPI_CTRL_MSB1ST_Pos (2U) -#define XQSPI_QSPI_CTRL_MSB1ST_Len (1U) -#define XQSPI_QSPI_CTRL_MSB1ST_Msk (0x1U << XQSPI_QSPI_CTRL_MSB1ST_Pos) -#define XQSPI_QSPI_CTRL_MSB1ST XQSPI_QSPI_CTRL_MSB1ST_Msk - -#define XQSPI_QSPI_CTRL_CONTXFER_Pos (0U) -#define XQSPI_QSPI_CTRL_CONTXFER_Len (1U) -#define XQSPI_QSPI_CTRL_CONTXFER_Msk (0x1U << XQSPI_QSPI_CTRL_CONTXFER_Pos) -#define XQSPI_QSPI_CTRL_CONTXFER XQSPI_QSPI_CTRL_CONTXFER_Msk - -/******************* Bit definition for XQSPI_QSPI_AUXCTRL register *********/ -#define XQSPI_QSPI_AUXCTRL_CONTXFERX_Pos (7U) -#define XQSPI_QSPI_AUXCTRL_CONTXFERX_Len (1U) -#define XQSPI_QSPI_AUXCTRL_CONTXFERX_Msk (0x1U << XQSPI_QSPI_AUXCTRL_CONTXFERX_Pos) -#define XQSPI_QSPI_AUXCTRL_CONTXFERX XQSPI_QSPI_AUXCTRL_CONTXFERX_Msk - -#define XQSPI_QSPI_AUXCTRL_BITSIZE_Pos (4U) -#define XQSPI_QSPI_AUXCTRL_BITSIZE_Len (3U) -#define XQSPI_QSPI_AUXCTRL_BITSIZE_Msk (0x7U << XQSPI_QSPI_AUXCTRL_BITSIZE_Pos) -#define XQSPI_QSPI_AUXCTRL_BITSIZE XQSPI_QSPI_AUXCTRL_BITSIZE_Msk - -#define XQSPI_QSPI_AUXCTRL_INHIBITDIN_Pos (3U) -#define XQSPI_QSPI_AUXCTRL_INHIBITDIN_Len (1U) -#define XQSPI_QSPI_AUXCTRL_INHIBITDIN_Msk (0x1U << XQSPI_QSPI_AUXCTRL_INHIBITDIN_Pos) -#define XQSPI_QSPI_AUXCTRL_INHIBITDIN XQSPI_QSPI_AUXCTRL_INHIBITDIN_Msk - -#define XQSPI_QSPI_AUXCTRL_INHIBITDOUT_Pos (2U) -#define XQSPI_QSPI_AUXCTRL_INHIBITDOUT_Len (1U) -#define XQSPI_QSPI_AUXCTRL_INHIBITDOUT_Msk (0x1U << XQSPI_QSPI_AUXCTRL_INHIBITDOUT_Pos) -#define XQSPI_QSPI_AUXCTRL_INHIBITDOUT XQSPI_QSPI_AUXCTRL_INHIBITDOUT_Msk - -#define XQSPI_QSPI_AUXCTRL_QMODE_Pos (0U) -#define XQSPI_QSPI_AUXCTRL_QMODE_Len (2U) -#define XQSPI_QSPI_AUXCTRL_QMODE_Msk (0x3U << XQSPI_QSPI_AUXCTRL_QMODE_Pos) -#define XQSPI_QSPI_AUXCTRL_QMODE XQSPI_QSPI_AUXCTRL_QMODE_Msk - -/******************* Bit definition for XQSPI_QSPI_SS register **************/ -#define XQSPI_QSPI_SS_OUT3_Pos (3U) -#define XQSPI_QSPI_SS_OUT3_Len (1U) -#define XQSPI_QSPI_SS_OUT3_Msk (0x1U << XQSPI_QSPI_SS_OUT3_Pos) -#define XQSPI_QSPI_SS_OUT3 XQSPI_QSPI_SS_OUT3_Msk - -#define XQSPI_QSPI_SS_OUT2_Pos (2U) -#define XQSPI_QSPI_SS_OUT2_Len (1U) -#define XQSPI_QSPI_SS_OUT2_Msk (0x1U << XQSPI_QSPI_SS_OUT2_Pos) -#define XQSPI_QSPI_SS_OUT2 XQSPI_QSPI_SS_OUT2_Msk - -#define XQSPI_QSPI_SS_OUT1_Pos (1U) -#define XQSPI_QSPI_SS_OUT1_Len (1U) -#define XQSPI_QSPI_SS_OUT1_Msk (0x1U << XQSPI_QSPI_SS_OUT1_Pos) -#define XQSPI_QSPI_SS_OUT1 XQSPI_QSPI_SS_OUT1_Msk - -#define XQSPI_QSPI_SS_OUT0_Pos (0U) -#define XQSPI_QSPI_SS_OUT0_Len (1U) -#define XQSPI_QSPI_SS_OUT0_Msk (0x1U << XQSPI_QSPI_SS_OUT0_Pos) -#define XQSPI_QSPI_SS_OUT0 XQSPI_QSPI_SS_OUT0_Msk - -/******************* Bit definition for XQSPI_QSPI_SS_POL register **********/ -#define XQSPI_QSPI_SS_POL3_Pos (3U) -#define XQSPI_QSPI_SS_POL3_Len (1U) -#define XQSPI_QSPI_SS_POL3_Msk (0x1U << XQSPI_QSPI_SS_POL3_Pos) -#define XQSPI_QSPI_SS_POL3 XQSPI_QSPI_SS_POL3_Msk - -#define XQSPI_QSPI_SS_POL2_Pos (2U) -#define XQSPI_QSPI_SS_POL2_Len (1U) -#define XQSPI_QSPI_SS_POL2_Msk (0x1U << XQSPI_QSPI_SS_POL2_Pos) -#define XQSPI_QSPI_SS_POL2 XQSPI_QSPI_SS_POL2_Msk - -#define XQSPI_QSPI_SS_POL1_Pos (1U) -#define XQSPI_QSPI_SS_POL1_Len (1U) -#define XQSPI_QSPI_SS_POL1_Msk (0x1U << XQSPI_QSPI_SS_POL1_Pos) -#define XQSPI_QSPI_SS_POL1 XQSPI_QSPI_SS_POL1_Msk - -#define XQSPI_QSPI_SS_POL0_Pos (0U) -#define XQSPI_QSPI_SS_POL0_Len (1U) -#define XQSPI_QSPI_SS_POL0_Msk (0x1U << XQSPI_QSPI_SS_POL0_Pos) -#define XQSPI_QSPI_SS_POL0 XQSPI_QSPI_SS_POL0_Msk - -/******************* Bit definition for XQSPI_QSPI_INT_EN register **********/ -#define XQSPI_QSPI_INT_EN_Pos (0U) -#define XQSPI_QSPI_INT_EN_Len (7U) -#define XQSPI_QSPI_INT_EN_Msk (0x7FUL << XQSPI_QSPI_INT_EN_Pos) -#define XQSPI_QSPI_INT_EN XQSPI_QSPI_INT_EN_Msk - -/******************* Bit definition for XQSPI_QSPI_INT_STAT register ********/ -#define XQSPI_QSPI_INT_STAT_Pos (0U) -#define XQSPI_QSPI_INT_STAT_Len (7U) -#define XQSPI_QSPI_INT_STAT_Msk (0x7FUL << XQSPI_QSPI_INT_STAT_Pos) -#define XQSPI_QSPI_INT_STAT XQSPI_QSPI_INT_STAT_Msk - -/******************* Bit definition for XQSPI_QSPI_INT_CLR register *********/ -#define XQSPI_QSPI_INT_CLR_Pos (0U) -#define XQSPI_QSPI_INT_CLR_Len (7U) -#define XQSPI_QSPI_INT_CLR_Msk (0x7FUL << XQSPI_QSPI_INT_CLR_Pos) -#define XQSPI_QSPI_INT_CLR XQSPI_QSPI_INT_CLR_Msk - -/******************* Bit definition for XQSPI Interrupt Bit Mapping *********/ -#define XQSPI_QSPI_GPI_HI_PULSE1_Pos (6U) -#define XQSPI_QSPI_GPI_HI_PULSE1_Len (1U) -#define XQSPI_QSPI_GPI_HI_PULSE1_Msk (0x1U << XQSPI_QSPI_GPI_HI_PULSE1_Pos) -#define XQSPI_QSPI_GPI_HI_PULSE0_Pos (5U) -#define XQSPI_QSPI_GPI_HI_PULSE0_Len (1U) -#define XQSPI_QSPI_GPI_HI_PULSE0_Msk (0x1U << XQSPI_QSPI_GPI_HI_PULSE0_Pos) -#define XQSPI_QSPI_XFER_DPULSE_Pos (4U) -#define XQSPI_QSPI_XFER_DPULSE_Len (1U) -#define XQSPI_QSPI_XFER_DPULSE_Msk (0x1U << XQSPI_QSPI_XFER_DPULSE_Pos) -#define XQSPI_QSPI_RX_FPULSE_Pos (3U) -#define XQSPI_QSPI_RX_FPULSE_Len (1U) -#define XQSPI_QSPI_RX_FPULSE_Msk (0x1U << XQSPI_QSPI_RX_FPULSE_Pos) -#define XQSPI_QSPI_RX_WPULSE_Pos (2U) -#define XQSPI_QSPI_RX_WPULSE_Len (1U) -#define XQSPI_QSPI_RX_WPULSE_Msk (0x1U << XQSPI_QSPI_RX_WPULSE_Pos) -#define XQSPI_QSPI_TX_WPULSE_Pos (1U) -#define XQSPI_QSPI_TX_WPULSE_Len (1U) -#define XQSPI_QSPI_TX_WPULSE_Msk (0x1U << XQSPI_QSPI_TX_WPULSE_Pos) -#define XQSPI_QSPI_TX_EPULSE_Pos (0U) -#define XQSPI_QSPI_TX_EPULSE_Len (1U) -#define XQSPI_QSPI_TX_EPULSE_Msk (0x1U << XQSPI_QSPI_TX_EPULSE_Pos) - -/******************* Bit definition for XQSPI_QSPI_TXFIFOLVL register *******/ -#define XQSPI_QSPI_TXFIFOLVL_Pos (0U) -#define XQSPI_QSPI_TXFIFOLVL_Len (7U) -#define XQSPI_QSPI_TXFIFOLVL_Msk (0x7FUL << XQSPI_QSPI_TXFIFOLVL_Pos) -#define XQSPI_QSPI_TXFIFOLVL XQSPI_QSPI_TXFIFOLVL_Msk - -/******************* Bit definition for XQSPI_QSPI_RXFIFOLVL register *******/ -#define XQSPI_QSPI_RXFIFOLVL_Pos (0U) -#define XQSPI_QSPI_RXFIFOLVL_Len (7U) -#define XQSPI_QSPI_RXFIFOLVL_Msk (0x7FUL << XQSPI_QSPI_RXFIFOLVL_Pos) -#define XQSPI_QSPI_RXFIFOLVL XQSPI_QSPI_RXFIFOLVL_Msk - -/******************* Bit definition for XQSPI_QSPI_MWAIT register ***********/ -#define XQSPI_QSPI_MWAIT_MWAIT_Pos (0U) -#define XQSPI_QSPI_MWAIT_MWAIT_Len (8U) -#define XQSPI_QSPI_MWAIT_MWAIT_Msk (0xFFUL << XQSPI_QSPI_MWAIT_MWAIT_Pos) -#define XQSPI_QSPI_MWAIT_MWAIT XQSPI_QSPI_MWAIT_MWAIT_Msk - -/******************* Bit definition for XQSPI_QSPI_EN register **************/ -#define XQSPI_QSPI_EN_EN_Pos (0U) -#define XQSPI_QSPI_EN_EN_Len (1U) -#define XQSPI_QSPI_EN_EN_Msk (0x1U << XQSPI_QSPI_EN_EN_Pos) -#define XQSPI_QSPI_EN_EN XQSPI_QSPI_EN_EN_Msk - -/******************* Bit definition for XQSPI_QSPI_GPOSET_GPOSET register ***/ -#define XQSPI_QSPI_GPOSET_GPOSET_Pos (0U) -#define XQSPI_QSPI_GPOSET_GPOSET_Len (8U) -#define XQSPI_QSPI_GPOSET_GPOSET_Msk (0xFFUL << XQSPI_QSPI_GPOSET_GPOSET_Pos) -#define XQSPI_QSPI_GPOSET_GPOSET XQSPI_QSPI_GPOSET_GPOSET_Msk - -/******************* Bit definition for XQSPI_QSPI_GPOCLR_GPOCLR register ***/ -#define XQSPI_QSPI_GPOCLR_GPOCLR_Pos (0U) -#define XQSPI_QSPI_GPOCLR_GPOCLR_Len (8U) -#define XQSPI_QSPI_GPOCLR_GPOCLR_Msk (0xFFUL << XQSPI_QSPI_GPOCLR_GPOCLR_Pos) -#define XQSPI_QSPI_GPOCLR_GPOCLR XQSPI_QSPI_GPOCLR_GPOCLR_Msk - -/******************* Bit definition for XQSPI_QSPI_FLASH_WRITE register ***/ -#define XQSPI_QSPI_FLASH_WRITE_Pos (0U) -#define XQSPI_QSPI_FLASH_WRITE_Len (1U) -#define XQSPI_QSPI_FLASH_WRITE_Msk (0xFFUL << XQSPI_QSPI_FLASH_WRITE_Pos) -#define XQSPI_QSPI_FLASH_WRITE XQSPI_QSPI_FLASH_WRITE_Msk - -/******************* Bit definition for XQSPI_QSPI_PRESENT_BYPASS register ***/ -#define XQSPI_QSPI_PRESENT_BYPASS_Pos (0U) -#define XQSPI_QSPI_PRESENT_BYPASS_Len (1U) -#define XQSPI_QSPI_PRESENT_BYPASS_Msk (0xFFUL << XQSPI_QSPI_PRESENT_BYPASS_Pos) -#define XQSPI_QSPI_PRESENT_BYPASS XQSPI_QSPI_PRESENT_BYPASS_Msk - -/* =============================================================================================================== */ -/* ================ EFUSE ================ */ -/* =============================================================================================================== */ -/******************* Bit definition for EFUSE_TPGM register **********/ -#define EFUSE_TPGM_TIME_Pos (0U) -#define EFUSE_TPGM_TIME_Len (12U) -#define EFUSE_TPGM_TIME_Msk (0xFFFUL << EFUSE_TPGM_TIME_Pos) -#define EFUSE_TPGM_TIME EFUSE_TPGM_TIME_Msk - -#define EFUSE_TPGM_MAIN_OR_BACKUP_Pos (12U) -#define EFUSE_TPGM_MAIN_OR_BACKUP_Len (1U) -#define EFUSE_TPGM_MAIN_OR_BACKUP_Msk (0x1UL << EFUSE_TPGM_MAIN_OR_BACKUP_Pos) -#define EFUSE_TPGM_MAIN_OR_BACKUP EFUSE_TPGM_MAIN_OR_BACKUP_Msk - -#define EFUSE_TPGM_CRC_CHECK_LEN_Pos (16U) -#define EFUSE_TPGM_CRC_CHECK_LEN_Len (6U) -#define EFUSE_TPGM_CRC_CHECK_LEN_Msk (0x3FUL << EFUSE_TPGM_CRC_CHECK_LEN_Pos) -#define EFUSE_TPGM_CRC_CHECK_LEN EFUSE_TPGM_CRC_CHECK_LEN_Msk - -#define EFUSE_TPGM_WRITE_INTERVAL_Pos (24U) -#define EFUSE_TPGM_WRITE_INTERVAL_Len (8U) -#define EFUSE_TPGM_WRITE_INTERVAL_Msk (0xFFUL << EFUSE_TPGM_WRITE_INTERVAL_Pos) -#define EFUSE_TPGM_WRITE_INTERVAL EFUSE_TPGM_WRITE_INTERVAL_Msk - -/******************* Bit definition for EFUSE_PGENB register **********/ -#define EFUSE_PGENB_SIG_Pos (0U) -#define EFUSE_PGENB_SIG_Len (1U) -#define EFUSE_PGENB_SIG_Msk (0x1UL << EFUSE_PGENB_SIG_Pos) -#define EFUSE_PGENB_SIG EFUSE_PGENB_SIG_Msk - -/******************* Bit definition for EFUSE_TEST_MODE register **********/ -#define EFUSE_TEST_MODE_Pos (0U) -#define EFUSE_TEST_MODE_Len (16U) -#define EFUSE_TEST_MODE_Msk (0xFFFFUL << EFUSE_TEST_MODE_Pos) -#define EFUSE_TEST_MODE EFUSE_TEST_MODE_Msk - -/******************* Bit definition for EFUSE_OPERATION register **********/ -#define EFUSE_OPER_WRITE_KEYRAM_Pos (0U) -#define EFUSE_OPER_WRITE_KEYRAM_Len (1U) -#define EFUSE_OPER_WRITE_KEYRAM_Msk (0x1UL << EFUSE_OPER_WRITE_KEYRAM_Pos) -#define EFUSE_OPER_WRITE_KEYRAM EFUSE_OPER_WRITE_KEYRAM_Msk - -#define EFUSE_OPER_INIT_CHECK_Pos (1U) -#define EFUSE_OPER_INIT_CHECK_Len (1U) -#define EFUSE_OPER_INIT_CHECK_Msk (0x1UL << EFUSE_OPER_INIT_CHECK_Pos) -#define EFUSE_OPER_INIT_CHECK EFUSE_OPER_INIT_CHECK_Msk - -#define EFUSE_OPER_CRC_CHECK_Pos (2U) -#define EFUSE_OPER_CRC_CHECK_Len (1U) -#define EFUSE_OPER_CRC_CHECK_Msk (0x1UL << EFUSE_OPER_CRC_CHECK_Pos) -#define EFUSE_OPER_CRC_CHECK EFUSE_OPER_CRC_CHECK_Msk - -#define EFUSE_OPER_READ_TRIM_Pos (3U) -#define EFUSE_OPER_READ_TRIM_Len (1U) -#define EFUSE_OPER_READ_TRIM_Msk (0x1UL << EFUSE_OPER_READ_TRIM_Pos) -#define EFUSE_OPER_READ_TRIM EFUSE_OPER_READ_TRIM_Msk - -#define EFUSE_OPER_RD_TEST_MODE_Pos (4U) -#define EFUSE_OPER_RD_TEST_MODE_Len (1U) -#define EFUSE_OPER_RD_TEST_MODE_Msk (0x1UL << EFUSE_OPER_RD_TEST_MODE_Pos) -#define EFUSE_OPER_RD_TEST_MODE EFUSE_OPER_RD_TEST_MODE_Msk - -/******************* Bit definition for EFUSE_STATUS register **********/ -#define EFUSE_STATUS_WRITE_KEYRAM_BUSY_Pos (0U) -#define EFUSE_STATUS_WRITE_KEYRAM_BUSY_Len (1U) -#define EFUSE_STATUS_WRITE_KEYRAM_BUSY_Msk (0x1UL << EFUSE_STATUS_WRITE_KEYRAM_BUSY_Pos) -#define EFUSE_STATUS_WRITE_KEYRAM_BUSY EFUSE_STATUS_WRITE_KEYRAM_BUSY_Msk - -#define EFUSE_STATUS_READ_TRIM_DONE_Pos (1U) -#define EFUSE_STATUS_READ_TRIM_DONE_Len (1U) -#define EFUSE_STATUS_READ_TRIM_DONE_Msk (0x1UL << EFUSE_STATUS_READ_TRIM_DONE_Pos) -#define EFUSE_STATUS_READ_TRIM_DONE EFUSE_STATUS_READ_TRIM_DONE_Msk - -#define EFUSE_STATUS_TRIM_CRC_SUCCESS_Pos (2U) -#define EFUSE_STATUS_TRIM_CRC_SUCCESS_Len (1U) -#define EFUSE_STATUS_TRIM_CRC_SUCCESS_Msk (0x1UL << EFUSE_STATUS_TRIM_CRC_SUCCESS_Pos) -#define EFUSE_STATUS_TRIM_CRC_SUCCESS EFUSE_STATUS_TRIM_CRC_SUCCESS_Msk - -#define EFUSE_STATUS_INIT_DONE_Pos (3U) -#define EFUSE_STATUS_INIT_DONE_Len (1U) -#define EFUSE_STATUS_INIT_DONE_Msk (0x1UL << EFUSE_STATUS_INIT_DONE_Pos) -#define EFUSE_STATUS_INIT_DONE EFUSE_STATUS_INIT_DONE_Msk - -#define EFUSE_STATUS_INIT_SUCCESS_Pos (4U) -#define EFUSE_STATUS_INIT_SUCCESS_Len (1U) -#define EFUSE_STATUS_INIT_SUCCESS_Msk (0x1UL << EFUSE_STATUS_INIT_SUCCESS_Pos) -#define EFUSE_STATUS_INIT_SUCCESS EFUSE_STATUS_INIT_SUCCESS_Msk - -#define EFUSE_STATUS_CRC_CHECK_DONE_Pos (5U) -#define EFUSE_STATUS_CRC_CHECK_DONE_Len (1U) -#define EFUSE_STATUS_CRC_CHECK_DONE_Msk (0x1UL << EFUSE_STATUS_CRC_CHECK_DONE_Pos) -#define EFUSE_STATUS_CRC_CHECK_DONE EFUSE_STATUS_CRC_CHECK_DONE_Msk - -#define EFUSE_STATUS_WRITE_DONE_Pos (6U) -#define EFUSE_STATUS_WRITE_DONE_Len (1U) -#define EFUSE_STATUS_WRITE_DONE_Msk (0x1UL << EFUSE_STATUS_WRITE_DONE_Pos) -#define EFUSE_STATUS_WRITE_DONE EFUSE_STATUS_WRITE_DONE_Msk - -#define EFUSE_STATUS_TEST_MODE_DONE_Pos (7U) -#define EFUSE_STATUS_TEST_MODE_DONE_Len (1U) -#define EFUSE_STATUS_TEST_MODE_DONE_Msk (0x1UL << EFUSE_STATUS_TEST_MODE_DONE_Pos) -#define EFUSE_STATUS_TEST_MODE_DONE EFUSE_STATUS_TEST_MODE_DONE_Msk - -/******************* Bit definition for EFUSE_KEY_MASK register **********/ -#define EFUSE_KEY_MASK_Pos (0U) -#define EFUSE_KEY_MASK_Len (32U) -#define EFUSE_KEY_MASK_Msk (0x1UL << EFUSE_KEY_MASK_Pos) -#define EFUSE_KEY_MASK EFUSE_KEY_MASK_Msk - -/******************* Bit definition for EFUSE_CRC_START_ADDR register **********/ -#define EFUSE_CRC_START_CHECK_ADDR_Pos (0U) -#define EFUSE_CRC_START_CHECK_ADDR_Len (32U) -#define EFUSE_CRC_START_CHECK_ADDR_Msk (0xFFFFFFFFU) -#define EFUSE_CRC_START_CHECK_ADDR EFUSE_CRC_START_CHECK_ADDR_Msk - -/******************* Bit definition for EFUSE_CRC_OUTPUT register **********/ -#define EFUSE_CRC_OUTPUT_VALUE_Pos (0U) -#define EFUSE_CRC_OUTPUT_VALUE_Len (32U) -#define EFUSE_CRC_OUTPUT_VALUE_Msk (0xFFFFFFFFU) -#define EFUSE_CRC_OUTPUT_VALUE EFUSE_CRC_OUTPUT_VALUE_Msk - -/******************* Bit definition for EFUSE_TRIM_ADDR register **********/ -#define EFUSE_TRIM_START_ADDR_Pos (0U) -#define EFUSE_TRIM_START_ADDR_Len (32U) -#define EFUSE_TRIM_START_ADDR_Msk (0xFFFFFFFFU) -#define EFUSE_TRIM_START_ADDR EFUSE_TRIM_START_ADDR_Msk - -/******************* Bit definition for EFUSE_TRIM_LEN register **********/ -#define EFUSE_TRIM_LENGTH_Pos (0U) -#define EFUSE_TRIM_LENGTH_Len (5U) -#define EFUSE_TRIM_LENGTH_Msk (0x1FU << EFUSE_TRIM_LENGTH_Pos) -#define EFUSE_TRIM_LENGTH EFUSE_TRIM_LENGTH_Msk - -/******************* Bit definition for EFUSE_TRIM register **************/ -#define EFUSE_TRIM_Pos (0U) -#define EFUSE_TRIM_Len (32U) -#define EFUSE_TRIM_Msk (0xFFFFFFFFU) -#define EFUSE_TRIM EFUSE_TRIM_Msk - -/* =============================================================================================================== */ -/* ================ RNG ================ */ -/* =============================================================================================================== */ -/******************* Bit definition for RNG_CTRL register **********/ -#define RNG_CTRL_RUN_EN_Pos (0U) -#define RNG_CTRL_RUN_EN_Len (1U) -#define RNG_CTRL_RUN_EN_Msk (0x1UL << RNG_CTRL_RUN_EN_Pos) -#define RNG_CTRL_RUN_EN RNG_CTRL_RUN_EN_Msk - -/******************* Bit definition for RNG_STATUS register **********/ -#define RNG_STATUS_READY_Pos (0U) -#define RNG_STATUS_READY_Len (1U) -#define RNG_STATUS_READY_Msk (0x1UL << RNG_STATUS_READY_Pos) -#define RNG_STATUS_READY RNG_STATUS_READY_Msk - -/******************* Bit definition for RNG_DATA register **********/ -#define RNG_DATA_VALUE_Pos (0U) -#define RNG_DATA_VALUE_Len (32U) -#define RNG_DATA_VALUE_Msk (0xFFFFFFFF) -#define RNG_DATA_VALUE RNG_DATA_VALUE_Msk - -/******************* Bit definition for RNG_LR_STATUS register *********/ -#define RNG_LR_STATUS_FLAG_Pos (0U) -#define RNG_LR_STATUS_FLAG_Len (1U) -#define RNG_LR_STATUS_FLAG_Msk (0x1UL << RNG_LR_STATUS_FLAG_Pos) -#define RNG_LR_STATUS_FLAG RNG_LR_STATUS_FLAG_Msk -#define RNG_LR_STATUS_CNT_Pos (1U) -#define RNG_LR_STATUS_CNT_Len (8U) -#define RNG_LR_STATUS_CNT_Msk (0xFFUL << RNG_LR_STATUS_CNT_Pos) -#define RNG_LR_STATUS_CNT RNG_LR_STATUS_CNT_Msk - -/******************* Bit definition for RNG_CONFIG register ************/ -#define RNG_CONFIG_OUT_MODE_Pos (0U) -#define RNG_CONFIG_OUT_MODE_Len (4U) -#define RNG_CONFIG_OUT_MODE_Msk (0xFUL << RNG_CONFIG_OUT_MODE_Pos) -#define RNG_CONFIG_OUT_MODE RNG_CONFIG_OUT_MODE_Msk -#define RNG_CONFIG_LFSR_XOR_SEL_Pos (4U) -#define RNG_CONFIG_LFSR_XOR_SEL_Len (3U) -#define RNG_CONFIG_LFSR_XOR_SEL_Msk (0x7UL << RNG_CONFIG_LFSR_XOR_SEL_Pos) -#define RNG_CONFIG_LFSR_XOR_SEL RNG_CONFIG_LFSR_XOR_SEL_Msk -#define RNG_CONFIG_POST_MODE_Pos (7U) -#define RNG_CONFIG_POST_MODE_Len (2U) -#define RNG_CONFIG_POST_MODE_Msk (0x3UL << RNG_CONFIG_POST_MODE_Pos) -#define RNG_CONFIG_POST_MODE RNG_CONFIG_POST_MODE_Msk -#define RNG_CONFIG_LFSR_MODE_Pos (9U) -#define RNG_CONFIG_LFSR_MODE_Len (1U) -#define RNG_CONFIG_LFSR_MODE_Msk (0x1UL << RNG_CONFIG_LFSR_MODE_Pos) -#define RNG_CONFIG_LFSR_MODE RNG_CONFIG_LFSR_MODE_Msk -#define RNG_CONFIG_LFSR_SEED_SEL_Pos (10U) -#define RNG_CONFIG_LFSR_SEED_SEL_Len (3U) -#define RNG_CONFIG_LFSR_SEED_SEL_Msk (0x7UL << RNG_CONFIG_LFSR_SEED_SEL_Pos) -#define RNG_CONFIG_LFSR_SEED_SEL RNG_CONFIG_LFSR_SEED_SEL_Msk -#define RNG_CONFIG_IRQ_EN_Pos (13U) -#define RNG_CONFIG_IRQ_EN_Len (1U) -#define RNG_CONFIG_IRQ_EN_Msk (0x1UL << RNG_CONFIG_IRQ_EN_Pos) -#define RNG_CONFIG_IRQ_EN RNG_CONFIG_IRQ_EN_Msk -#define RNG_CONFIG_FRO_EN_Pos (15U) -#define RNG_CONFIG_FRO_EN_Len (1U) -#define RNG_CONFIG_FRO_EN_Msk (0x1UL << RNG_CONFIG_FRO_EN_Pos) -#define RNG_CONFIG_FRO_EN RNG_CONFIG_FRO_EN_Msk - -/******************* Bit definition for RNG_TSCON register *************/ -#define RNG_TSCON_TRDY_TIME_Pos (0U) -#define RNG_TSCON_TRDY_TIME_Len (8U) -#define RNG_TSCON_TRDY_TIME_Msk (0xFUL << RNG_TSCON_TRDY_TIME_Pos) -#define RNG_TSCON_TRDY_TIME RNG_TSCON_TRDY_TIME_Msk -#define RNG_TSCON_FRO_CHAIN_Pos (11U) -#define RNG_TSCON_FRO_CHAIN_Len (4U) -#define RNG_TSCON_FRO_CHAIN_Msk (0xFUL << RNG_TSCON_FRO_CHAIN_Pos) -#define RNG_TSCON_FRO_CHAIN RNG_TSCON_FRO_CHAIN_Msk - -/******************* Bit definition for RNG_FROCFG register *************/ -#define RNG_FROCFG_CHAINE_EN_Pos (0U) -#define RNG_FROCFG_CHAINE_EN_Len (8U) -#define RNG_FROCFG_CHAINE_EN_Msk (0xFFUL << RNG_FROCFG_CHAINE_EN_Pos) -#define RNG_FROCFG_CHAINE_EN RNG_FROCFG_CHAINE_EN_Msk -#define RNG_FROCFG_TEST_IN_Pos (8U) -#define RNG_FROCFG_TEST_IN_Len (8U) -#define RNG_FROCFG_TEST_IN_Msk (0xFFUL << RNG_FROCFG_TEST_IN_Pos) -#define RNG_FROCFG_TEST_IN RNG_FROCFG_TEST_IN_Msk - -/******************* Bit definition for RNG_USER_SEED register *************/ -#define RNG_USER_SEED_Pos (0U) -#define RNG_USER_SEED_Len (16U) -#define RNG_USER_SEED_Msk (0xFFUL << RNG_USER_SEED_Pos) -#define RNG_USER_SEED RNG_USER_SEED_Msk - -/******************* Bit definition for RNG_LRCON register *****************/ -#define RNG_LRCON_TEST_EN_Pos (0U) -#define RNG_LRCON_TEST_EN_Len (1U) -#define RNG_LRCON_TEST_EN_Msk (0x1UL << RNG_LRCON_TEST_EN_Pos) -#define RNG_LRCON_TEST_EN RNG_LRCON_TEST_EN_Msk -#define RNG_LRCON_TEST_LIMIT_Pos (1U) -#define RNG_LRCON_TEST_LIMIT_Len (5U) -#define RNG_LRCON_TEST_LIMIT_Msk (0x1FUL << RNG_LRCON_TEST_LIMIT_Pos) -#define RNG_LRCON_TEST_LIMIT RNG_LRCON_TEST_LIMIT_Msk - -/** @} */ /* End of group Peripheral_Registers_Bits_Definition */ - -/** @addtogroup Exported_macros - * @{ - */ -/****************************** GPIO instances ********************************/ -static inline uint32_t IS_GPIO_ALL_INSTANCE(gpio_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == GPIO0) || ((__INSTANCE__) == GPIO1)); -} - -/****************************** I2C instances *********************************/ -static inline uint32_t IS_I2C_ALL_INSTANCE(i2c_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == I2C0) || ((__INSTANCE__) == I2C1)); -} - -/****************************** I2S instances *********************************/ -static inline uint32_t IS_I2S_ALL_INSTANCE(i2s_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == I2S_M) || ((__INSTANCE__) == I2S_S)); -} - -/****************************** UART instances ********************************/ -static inline uint32_t IS_UART_ALL_INSTANCE(uart_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == UART0) || ((__INSTANCE__) == UART1)); -} - -/******************** UART instances : Support of DMA *************************/ -static inline uint32_t IS_UART_DMA_INSTANCE(uart_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == UART0)); -} - -/****************************** TIM instances *********************************/ -static inline uint32_t IS_UART_TIM_INSTANCE(timer_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == TIMER0) || ((__INSTANCE__) == TIMER1)); -} - -/****************************** DUAL TIM instances ****************************/ -static inline uint32_t IS_DUAL_TIM_ALL_INSTANCE(dual_timer_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == DUAL_TIMER0) || ((__INSTANCE__) == DUAL_TIMER1)); -} - -/****************************** PWM instances *********************************/ -static inline uint32_t IS_PWM_ALL_INSTANCE(pwm_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == PWM0) || ((__INSTANCE__) == PWM1)); -} - -/****************************** WDT instances *********************************/ -static inline uint32_t IS_WDT_ALL_INSTANCE(wdt_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == WDT)); -} - -/****************************** SPI instances *********************************/ -static inline uint32_t IS_SPI_ALL_INSTANCE(ssi_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == SPIM) || ((__INSTANCE__) == SPIS)); -} - -/****************************** QSPI instances ********************************/ -static inline uint32_t IS_QSPI_ALL_INSTANCE(ssi_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == QSPI0) || ((__INSTANCE__) == QSPI1)); -} - -/****************************** PKC instances *********************************/ -static inline uint32_t IS_PKC_ALL_INSTANCE(pkc_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == PKC)); -} - -/****************************** AES Instances *********************************/ -static inline uint32_t IS_AES_ALL_INSTANCE(aes_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == AES)); -} - -/****************************** HMAC Instances ********************************/ -static inline uint32_t IS_HMAC_ALL_INSTANCE(hmac_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == HMAC)); -} - -/****************************** XQSPI Instances *******************************/ -static inline uint32_t IS_XQSPI_ALL_INSTANCE(xqspi_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == XQSPI)); -} - -/****************************** EFUSE Instances *******************************/ -static inline uint32_t IS_EFUSE_ALL_INSTANCE(efuse_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == EFUSE)); -} - -/****************************** RNG Instances *******************************/ -static inline uint32_t IS_RNG_ALL_INSTANCE(rng_regs_t *__INSTANCE__) -{ - return (((__INSTANCE__) == RNG)); -} - -/** @} */ /* End of group Exported_macros */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GR551xx_H__ */ - -/** @} */ /* End of group GR551xx */ - -/** @} */ /* End of group CMSIS_Device */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr55xx.h b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr55xx.h deleted file mode 100755 index 44b0d87..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/gr55xx.h +++ /dev/null @@ -1,223 +0,0 @@ -/**************************************************************************//** - * @file gr55xx.h - * @brief CMSIS Cortex-M# Core Peripheral Access Layer Header File for - * Device GR55xx - * @version V1.00 - * @date 12. June 2018 - ******************************************************************************/ -/* - * Copyright (c) 2016-2018, Shenzhen Huiding Technology Co., Ltd - * - * 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. - */ - -/** @addtogroup CMSIS_Device - * @{ - */ - -/** @addtogroup GR55xx - * @{ - */ - -#ifndef __GR55xx_H__ -#define __GR55xx_H__ -#ifndef CFG_LAYER_TAG_SDK -#ifndef CFG_LAYER_TAG_ROM -#include "custom_config.h" -#endif -#endif - -/** @addtogroup Library_configuration_section - * @{ - */ - -/** - * @brief GR55 Family - */ -#if !defined (GR55) -#define GR55 -#endif /* GR55 */ - -/* Uncomment the line below according to the target GR55 device used in your - application - */ -#if !defined (GR551xx) -#define GR551xx -#endif - -/** @} */ - -/** @addtogroup Device_Included - * @{ - */ -#if defined(GR551xx) -#include "gr551xx.h" - -#define GR55XX_RAM_ADDRESS 0x30000000 -#define GR55XX_FLASH_ADDRESS 0x01000000 -#define GR55XX_ALIAS_ADDRESS 0x00800000 -#else -#error "Please select first the target GR55xx device used in your application (in gr551xx.h file)" -#endif - -/** @} */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup Exported_types - * @{ - */ - -typedef enum { - RESET = 0, - SET = !RESET -} flag_status_t, it_status_t; - -typedef enum { - DISABLE = 0, - ENABLE = !DISABLE -} functional_state_t; -static inline uint32_t IS_FUNCTIONAL_STATE(uint32_t STATE) -{ - return (((STATE) == DISABLE) || ((STATE) == ENABLE)); -} - -typedef enum { - ERROR = 0, - SUCCESS = !ERROR -} error_status_t; - -/** @} */ - -/** @addtogroup Exported_macros - * @{ - */ -#ifndef SET_BITS -#define SET_BITS(REG, BIT) ((REG) |= (BIT)) -#endif - -#ifndef CLEAR_BITS -#define CLEAR_BITS(REG, BIT) ((REG) &= ~(BIT)) -#endif - -#ifndef READ_BITS -#define READ_BITS(REG, BIT) ((REG) & (BIT)) -#endif - -#ifndef CLEAR_REG -#define CLEAR_REG(REG) ((REG) = (0x0)) -#endif - -#ifndef WRITE_REG -#define WRITE_REG(REG, VAL) ((REG) = (VAL)) -#endif - -#ifndef READ_REG -#define READ_REG(REG) ((REG)) -#endif - -#ifndef MODIFY_REG -#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) -#endif - -#ifndef POSITION_VAL -#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) -#endif - -#ifndef UNUSED -#define UNUSED(x) ((void)(x)) -#endif - -#ifndef SECTION_RAM_CODE -#if (!defined(ROM_RUN_IN_FLASH)) && defined(CFG_LAYER_TAG_ROM) -#define SECTION_RAM_CODE -#else -#if defined ( __ICCARM__ ) -#define SECTION_RAM_CODE __ramfunc -#else -/**< To prevent doxygen from misidentifying the function name */ -#define SECTION_RAM_CODE __attribute__((section("RAM_CODE"))) -#endif -#endif -#endif - -#ifndef TINY_RAM_SECTION -#if defined(GR5515_D) || defined(GR5515_E) -#define TINY_RAM_SECTION SECTION_RAM_CODE -#else -#if defined ( __ICCARM__ ) -#define TINY_RAM_SECTION __ramfunc -#else -/**< To prevent doxygen from misidentifying the function name */ -#define TINY_RAM_SECTION __attribute__((section("TINY_RAM_SPACE"))) -#endif -#endif -#endif - -/** @brief Disable interrupts globally in the system(apart from the NMI). - * This macro must be used in conjunction with the @ref GLOBAL_EXCEPTION_ENABLE macro - * since this last one will close the brace that the current macro opens. This means - * that both macros must be located at the same scope level. - */ -#define GLOBAL_EXCEPTION_DISABLE() \ -do { \ - uint32_t __l_irq_rest = __get_PRIMASK(); \ - __set_PRIMASK(1) - - -/** @brief Restore interrupts from the previous global disable(apart from the NMI). - * @sa GLOBAL_EXCEPTION_ENABLE - */ -#define GLOBAL_EXCEPTION_ENABLE() \ - if (__l_irq_rest == 0) \ - { \ - __set_PRIMASK(0); \ - } \ - else \ - { \ - __set_PRIMASK(1); \ - } \ -} while (0) -/** @} */ - -/** Array serial numbers are uniformly defined by macros. - * Do not use magic numbers. - */ -#define ITEM_0 0 -#define ITEM_1 1 -#define ITEM_2 2 -#define ITEM_3 3 -#define ITEM_4 4 -#define ITEM_5 5 -#define ITEM_6 6 -#define ITEM_7 7 -#define ITEM_8 8 -#define ITEM_9 9 -#define ITEM_10 10 -#define ITEM_11 11 - -#define ITEM_16 16 - -#ifdef __cplusplus -} -#endif - -#endif /* __GR55xx_H__ */ - -/** @} */ - -/** @} */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/scatter_common.h b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/scatter_common.h deleted file mode 100755 index fe9e024..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/scatter_common.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - **************************************************************************************** - * - * @file scatter_common.h - * - * @brief decalare the symbols in scatter_common.sct. - * - * - **************************************************************************************** - */ -/* - * Copyright (c) 2024 GOODIX. - * 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. - */ - -#ifndef __SCATTER_COMMON_H__ -#define __SCATTER_COMMON_H__ -#include -#include -#include "flash_scatter_config.h" - -#if (0 == CONN_BUF_SIZE) -#define STACK_HEAP_INIT(heaps_table) \ -uint8_t env_heap_buf[ENV_HEAP_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t att_db_heap_buf[ATT_DB_HEAP_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t ke_msg_heap_buf[KE_MSG_HEAP_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t non_ret_heap_buf[NON_RET_HEAP_SIZE]__attribute__((aligned (32))) = {0}; \ -stack_heaps_table_t heaps_table = { (uint32_t *)env_heap_buf, \ - (uint32_t *)att_db_heap_buf, \ - (uint32_t *)ke_msg_heap_buf, \ - (uint32_t *)non_ret_heap_buf, \ - ENV_HEAP_SIZE, \ - ATT_DB_HEAP_SIZE, \ - KE_MSG_HEAP_SIZE, \ - NON_RET_HEAP_SIZE, \ - (uint8_t *)NULL, \ - 0, \ - (uint8_t *)NULL, \ - 0, \ - (uint8_t *)NULL, \ - 0} -#else -#define STACK_HEAP_INIT(heaps_table) \ -uint8_t prf_buf[PRF_BUF_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t bond_buf[BOND_BUF_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t conn_buf[CONN_BUF_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t env_heap_buf[ENV_HEAP_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t att_db_heap_buf[ATT_DB_HEAP_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t ke_msg_heap_buf[KE_MSG_HEAP_SIZE] __attribute__((aligned (32))) = {0}; \ -uint8_t non_ret_heap_buf[NON_RET_HEAP_SIZE]__attribute__((aligned (32))) = {0}; \ -stack_heaps_table_t heaps_table = { (uint32_t *)env_heap_buf, \ - (uint32_t *)att_db_heap_buf, \ - (uint32_t *)ke_msg_heap_buf, \ - (uint32_t *)non_ret_heap_buf, \ - ENV_HEAP_SIZE, \ - ATT_DB_HEAP_SIZE, \ - KE_MSG_HEAP_SIZE, \ - NON_RET_HEAP_SIZE, \ - (uint8_t *)prf_buf, \ - PRF_BUF_SIZE, \ - (uint8_t *)bond_buf, \ - BOND_BUF_SIZE, \ - (uint8_t *)conn_buf, \ - CONN_BUF_SIZE} -#endif // (0 == CONN_BUF_SIZE) -#endif // __SCATTER_COMMON_H__ diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/system_gr55xx.h b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/system_gr55xx.h deleted file mode 100755 index 545e5ee..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/include/system_gr55xx.h +++ /dev/null @@ -1,168 +0,0 @@ -/**************************************************************************//** - * @file system_gr55xx.h - * @brief CMSIS Cortex-M# Device Peripheral Access Layer Header File for - * Device GR55xx - * @version V1.00 - * @date 12. June 2018 - ******************************************************************************/ -/* - * Copyright (c) 2024 GOODIX. - * 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. - */ - -#ifndef __SYSTEM_GR55xx_H__ -#define __SYSTEM_GR55xx_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define CLK_64M 64000000 -#define CLK_48M 48000000 -#define CLK_32M 32000000 -#define CLK_24M 24000000 -#define CLK_16M 16000000 - -typedef enum { - XO_S16M_CLK = 2, - CPLL_S16M_CLK = 4, - CPLL_T24M_CLK = 3, - CPLL_T32M_CLK = 5, - CPLL_F48M_CLK = 1, - CPLL_S64M_CLK = 0, - CLK_TYPE_NUM = 6, -} mcu_clock_type_t; - -typedef enum { - QSPI_64M_CLK = 0, - QSPI_48M_CLK = 1, - QSPI_32M_CLK = 2, - QSPI_24M_CLK = 3, - QSPI_16M_CLK = 4, - QSPI_CLK_TYPE_NUM = 5, -} qspi_clock_type_t; - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief GR55xx Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ - -/* ================================================================================================================= */ -/* ================ Interrupt Number Definition ================ */ -/* ================================================================================================================= */ -typedef enum IRQn { -/* ================================== ARM Cortex-M# Specific Interrupt Numbers =================================== */ - - NonMaskableInt_IRQn = -14, /**< -14 Non maskable Interrupt, cannot be stopped or preempted */ - HardFault_IRQn = -13, /**< -13 Hard Fault, all classes of Fault */ - MemoryManagement_IRQn = -12, /**< -12 Memory Management, MPU mismatch, including Access Violation - and No Match */ - BusFault_IRQn = -11, /**< -11 Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory - related Fault */ - UsageFault_IRQn = -10, /**< -10 Usage Fault, i.e. Undef Instruction, Illegal State Transition */ - SVCall_IRQn = -5, /**< -5 System Service Call via SVC instruction */ - DebugMonitor_IRQn = -4, /**< -4 Debug Monitor */ - PendSV_IRQn = -2, /**< -2 Pendable request for system service */ - SysTick_IRQn = -1, /**< -1 System Tick Timer */ - -/* ====================================== Specific Interrupt Numbers ==================================== */ - WDT_IRQn = 0, /**< Watchdog Timer Interrupt */ - BLE_SDK_IRQn = 1, /**< BLE_SDK_SCHEDULE Interrupt */ - BLE_IRQn = 2, /**< BLE Interrupt */ - DMA_IRQn = 3, /**< DMA Interrupt */ - SPI_M_IRQn = 4, /**< SPI_M Interrupt */ - SPI_S_IRQn = 5, /**< SPI_S Interrupt */ - EXT0_IRQn = 6, /**< EXT0 Interrupt */ - EXT1_IRQn = 7, /**< EXT1 Interrupt */ - TIMER0_IRQn = 8, /**< Timer0 Interrupt */ - TIMER1_IRQn = 9, /**< Timer1 Interrupt */ - DUAL_TIMER_IRQn = 10, /**< Dual_Timer Interrupt */ - QSPI0_IRQn = 11, /**< QSPI0 Interrupt */ - UART0_IRQn = 12, /**< UART0 Interrupt */ - UART1_IRQn = 13, /**< UART1 Interrupt */ - I2C0_IRQn = 14, /**< I2C0 Interrupt */ - I2C1_IRQn = 15, /**< I2C1 Interrupt */ - AES_IRQn = 16, /**< AES Interrupt */ - HMAC_IRQn = 17, /**< HMAC Interrupt */ - EXT2_IRQn = 18, /**< EXT2 Interrupt */ - RNG_IRQn = 19, /**< RNG Interrupt */ - PMU_IRQn = 20, /**< PMU Interrupt */ - PKC_IRQn = 21, /**< PKC Interrupt */ - XQSPI_IRQn = 22, /**< XQSPI Interrupt */ - QSPI1_IRQn = 23, /**< QSPI1 Interrupt */ - PWR_CMD_IRQn = 24, /**< POWER CMD ACK Interrupt */ - BLESLP_IRQn = 25, /**< BLE Sleep Interrupt */ - SLPTIMER_IRQn = 26, /**< Sleep Timer Interrupt */ - COMP_EXT_IRQn = 27, /**< Comparator and External Wakeup Interrupt */ - AON_WDT_IRQn = 28, /**< Always on Watchdog Interrupt */ - I2S_M_IRQn = 29, /**< I2S_M Interrupt */ - I2S_S_IRQn = 30, /**< I2S_S Interrupt */ - ISO7816_IRQn = 31, /**< ISO7816 Interrupt */ - PRESENT_IRQn = 32, /**< Presnet Done Interrupt */ - CALENDAR_IRQn = 33, /**< AON Calendar Timer Interrupt */ - MAX_NUMS_IRQn = 34, /**< Last Interrupt */ -} IRQn_Type; - -/** @} */ /* End of group Peripheral _interrupt_number_definition */ - -/* ================================================================================================================= */ -/* ================ Processor and Core Peripheral Section ================ */ -/* ================================================================================================================= */ - -/* =================================== Start of section using anonymous unions =================================== */ - -/* ====================== Configuration of the ARM Cortex-M4 Processor and Core Peripherals ====================== */ -#define __CM4_REV 0x0001U /* Core revision r0p1 */ -#define __MPU_PRESENT 1 /* MPU present */ -#define __VTOR_PRESENT 1 /* VTOR present */ -#define __NVIC_PRIO_BITS 8 /* Number of Bits used for Priority Levels */ -#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1 /* FPU present */ - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - -/** @brief Setup the microcontroller system. - - Initialize the System and update the SystemCoreClock variable. - */ -extern void SystemInit(void); - -/** \brief Update SystemCoreClock variable. - - Updates the SystemCoreClock with current core Clock - retrieved from cpu registers. - */ -extern void SystemCoreSetClock(mcu_clock_type_t clock); - -/** \brief Get SystemCoreClock variable. - - Get the SystemCoreClock with current core Clock - retrieved from cpu registers. - */ -extern void SystemCoreGetClock(mcu_clock_type_t *clock); - - -extern void SystemCoreUpdateClock(void); - - -#ifdef __cplusplus -} -#endif - -#endif /* __SYSTEM_GR55xx_H__ */ diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/interrupt_gr55xx.c b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/interrupt_gr55xx.c deleted file mode 100755 index bec1c6c..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/interrupt_gr55xx.c +++ /dev/null @@ -1,246 +0,0 @@ -/** - ***************************************************************************************** - * - * @file interrupt_gr55xx.c - * - * @brief Interrupt Service Routines. - * - ***************************************************************************************** - - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ***************************************************************************************** - */ - -/* - * INCLUDE FILES - ***************************************************************************************** - */ -#include "gr55xx_sys.h" -#include "gr55xx_hal.h" -#include "custom_config.h" -#include "gr55xx_rom_symbol.h" - -/******************************************************************************/ -/* Cortex-M4F Processor Interruption and Exception Handlers */ -/* Add here the Interrupt Handler for the BLE peripheral(s) */ -/******************************************************************************/ - -/** - **************************************************************************************** - * @brief SVC Interrupt Handler - * @retval void - **************************************************************************************** - */ -#if defined ( __CC_ARM ) -#ifndef GR5515_E -SECTION_RAM_CODE __asm void SVC_Handler (void) -{ - PRESERVE8 - IMPORT SVC_handler_proc - - TST LR, #4 ; - Called from Handler Mode? - MRSNE R12, PSP ; - Yes, use PSP - MOVEQ R12, SP ; - No, use MSP - PUSH {R0-R3, LR} - MOV R0, R12 - BL SVC_handler_proc - MOV R12, R0 - POP {R0-R3, LR} - CMP R12, #0 - BLXNE R12 - BX LR ; - RETI - SVC_Dead - B SVC_Dead ; - None Existing SVC - ALIGN -} -#endif -#elif defined ( __GNUC__ ) -#elif defined (__ICCARM__) - -SECTION_RAM_CODE uint32_t SVC_handler_proc(uint32_t *svc_args) -{ - uint16_t svc_cmd; - uint32_t svc_func_addr; - uint32_t func_addr = 0; - svc_func_addr = svc_args[ITEM_6]; - svc_cmd = *((uint16_t*)svc_func_addr-1); - if ((svc_cmd<=0xDFFF)&&(svc_cmd>=0xDF00)) { - func_addr = (uint32_t)SVC_Table[svc_cmd&(0xFF)]; - return func_addr ; - } else { - func_addr=get_patch_rep_addr(svc_func_addr); - svc_args[ITEM_6] = func_addr; - return 0; - } -} - -SECTION_RAM_CODE void __attribute__((naked))SVC_Handler (void) -{ - asm volatile ( - "TST R14,#4\n\t" - "IT NE\n\t" - "MRSNE R12, PSP\n\t" - "IT EQ\n" - "MOVEQ R12, SP \n\t" - "PUSH {R0-R3,LR} \n\t" - "MOV R0, R12 \n\t" - "BL SVC_handler_proc \n\t" - "MOV R12, R0 \n\t" - "POP {R0-R3, LR} \n\t" - "CMP R12, #0\n\t" - "IT NE\n\t" - "BLXNE R12\n\t" - "BX LR\n\t"); -} -#endif - -/** - **************************************************************************************** - * @brief hardfault Interrupt Handler - * @retval void - **************************************************************************************** - */ -#if defined ( __CC_ARM ) - -SECTION_RAM_CODE __WEAK void cortex_backtrace_fault_handler(void) -{ - while (1) {} -} - -SECTION_RAM_CODE __asm void HardFault_Handler (void) -{ -#if SYS_FAULT_TRACE_ENABLE - PRESERVE8 - IMPORT cortex_backtrace_fault_handler - MOV r0, lr - MOV r1, sp - BL cortex_backtrace_fault_handler -#endif - Fault_Loop - BL Fault_Loop - ALIGN -} - -#if DEBUG_MONITOR -uint32_t R4_R11_REG[8]; -void print_callstack_handler(uint32_t sp) -{ - printf("================================\r\n"); - printf(" r0: %08x r1: %08x\r\n", ((uint32_t *)sp)[ITEM_0], ((uint32_t *)sp)[ITEM_1]); - printf(" r2: %08x r3: %08x\r\n", ((uint32_t *)sp)[ITEM_2], ((uint32_t *)sp)[ITEM_3]); - printf(" r4: %08x r5: %08x\r\n", R4_R11_REG[ITEM_0], R4_R11_REG[ITEM_1]); - printf(" r6: %08x r7: %08x\r\n", R4_R11_REG[ITEM_2], R4_R11_REG[ITEM_3]); - printf(" r8: %08x r9: %08x\r\n", R4_R11_REG[ITEM_4], R4_R11_REG[ITEM_5]); - printf(" r10:%08x r11:%08x\r\n", R4_R11_REG[ITEM_6], R4_R11_REG[ITEM_7]); - printf(" r12:%08x lr: %08x\r\n", ((uint32_t *)sp)[ITEM_4], ((uint32_t *)sp)[ITEM_5]); - printf(" pc: %08x xpsr: %08x\r\n", ((uint32_t *)sp)[ITEM_6], ((uint32_t *)sp)[ITEM_7]); - printf("================================\r\n"); -} - -__asm void DebugMon_Handler(void) -{ - PRESERVE8 - IMPORT print_callstack_handler - IMPORT R4_R11_REG - LDR R0, = R4_R11_REG - STMIA R0!, {R4-R11} - MOV R0, SP - MOV r12, lr - BL print_callstack_handler - BX r12 - ALIGN -} -#endif - -#elif defined ( __GNUC__ ) - -SECTION_RAM_CODE __WEAK void hardfault_trace_handler(unsigned int *args) -{ - while (1) {} -} - -SECTION_RAM_CODE void __attribute__((naked))HardFault_Handler (void) -{ - __asm("TST LR, #4\n"); - __asm("ITE EQ\n"); - __asm("MRSEQ R0, MSP\n"); - __asm("MRSNE R0, PSP\n"); - __asm("BL hardfault_trace_handler\n"); - while (1) {} -} - -#endif - -/** - **************************************************************************************** - * @brief MemManage fault Interrupt Handler - * @retval void - **************************************************************************************** - */ -SECTION_RAM_CODE void MemManage_Handler(void) -{ - while (1) {} -} - -/** - **************************************************************************************** - * @brief Bus Fault Interrupt Handler - * @retval void - **************************************************************************************** - */ -SECTION_RAM_CODE void BusFault_Handler(void) -{ - while (1) {} -} - -/** - **************************************************************************************** - * @brief UsageFault Interrupt Handler - * @retval void - **************************************************************************************** - */ -SECTION_RAM_CODE void UsageFault_Handler(void) -{ - while (1) {} -} - -/** - **************************************************************************************** - * @brief sleep timer Interrupt Handler - * @retval void - **************************************************************************************** - */ -SECTION_RAM_CODE void SLPTIMER_IRQHandler(void) -{ - hal_pwr_sleep_timer_irq_handler(); -} diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/platform_gr55xx.c b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/platform_gr55xx.c deleted file mode 100755 index 6e4d753..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/platform_gr55xx.c +++ /dev/null @@ -1,313 +0,0 @@ -/** - ******************************************************************************* - * - * @file platform_gr55xx.c - * - * @brief Platform Initialization Routines. - * - ******************************************************************************* - - * @attention - #####Copyright (c) 2019 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -/* - * INCLUDE FILES - ******************************************************************************* - */ -#include "gr55xx_hal_cortex.h" -#include "gr55xx.h" -#include "gr55xx_sys.h" -#include "gr55xx_ll_pwr.h" -#include "hal_flash.h" -#include "platform_sdk.h" -#include "pmu_calibration.h" -#include "boards.h" -#include "custom_config.h" -#include "patch.h" -#include "patch_tab.h" -#include "gr55xx_ll_gpio.h" -#include "gr55xx_rom_symbol.h" - -// NOTE: SVC #0 is reserved for freertos, DO NOT USE IT! -#define SVC_TABLE_NUM_MAX 4 - -#define PMU_CALIBRATION_DURATION_MS (30000) - -#define FLASH_CS (LL_GPIO_PIN_2) /* XQSPI flash CS */ -#define FLASH_CLK (LL_GPIO_PIN_4) /* XQSPI flash CLK */ -#define FLASH_IO_0 (LL_GPIO_PIN_7) /* XQSPI flash IO0 */ -#define FLASH_IO_1 (LL_GPIO_PIN_6) /* XQSPI flash IO1 */ -#define FLASH_IO_2 (LL_GPIO_PIN_5) /* XQSPI flash IO2 (WP) */ -#define FLASH_IO_3 (LL_GPIO_PIN_3) /* XQSPI flash IO3 (HOLD) */ -static inline void HAL_EXFLASH_IO_PULL_SET(uint32_t PIN, uint32_t PULL) -{ - ll_gpio_set_pin_pull(GPIO1, PIN, PULL); -} - -static uint32_t SVC_TABLE_USER_SPACE[SVC_TABLE_NUM_MAX] __attribute__((section("SVC_TABLE"))); - -#if (CFG_LCP_SUPPORT && (CHIP_TYPE == 0)) -static uint8_t lcp_buf[280] __attribute__((section (".ARM.__at_0x00820000"), zero_init)); -#endif - -#ifdef GR5515_E -static uint8_t s_nvds_cache[4096]; -#endif - -static void nvds_setup(void) -{ -#ifdef GR5515_E - g_nvds_buf = (uint8_t *)&s_nvds_cache; -#endif - -#ifdef NVDS_START_ADDR - uint8_t err_code = nvds_init(NVDS_START_ADDR, NVDS_NUM_SECTOR); -#else - uint8_t err_code = nvds_init(0, NVDS_NUM_SECTOR); -#endif - - switch (err_code) { - case NVDS_FAIL: - case NVDS_STORAGE_ACCESS_FAILED: { - uint32_t start_addr = nvds_get_start_addr(); - uint32_t sector_size = hal_flash_sector_size(); - if (hal_flash_erase(start_addr, NVDS_NUM_SECTOR * sector_size)) { - err_code = nvds_init(start_addr, NVDS_NUM_SECTOR); - if (NVDS_SUCCESS == err_code) { - break; - } - } - /* Flash fault, cannot startup. - * Output log via UART or Dump an error code to flash. */ - while (1) {} - } - case NVDS_SUCCESS: - break; - default: - /* Illegal NVDS Parameters. - * Please check the start address and number of sectors. */ - while (1) {} - } -} - -void ble_sdk_env_init(void) -{ - // register the msg handler for patch - uint16_t msg_cnt = sizeof(msg_tab) / sizeof(msg_tab_item_t); - reg_msg_patch_tab(msg_tab, msg_cnt); - -#if CFG_MAX_CONNECTIONS - ble_con_env_init(); -#endif - -#if CFG_MAX_SCAN - ble_scan_env_init(); -#endif - -#if CFG_MAX_ADVS - ble_adv_env_init(); -#endif -} - -static void BLE_power_check(void) -{ - if ((AON->PWR_RET01 & AON_PWR_REG01_PWR_EN_PD_COMM_TIMER) || - (AON->PWR_RET01 & AON_PWR_REG01_PWR_EN_PD_COMM_CORE)) { - ll_pwr_enable_comm_core_reset(); - ll_pwr_enable_comm_timer_reset(); - ll_pwr_disable_comm_core_power(); - ll_pwr_disable_comm_timer_power(); - /* Reserve System Cold Fully Reset Method. */ - } -} - -static void system_calibration(void) -{ - system_pmu_calibration_init(PMU_CALIBRATION_DURATION_MS); - - system_pmu_deinit(); - SystemCoreSetClock((mcu_clock_type_t)SYSTEM_CLOCK); - system_pmu_init((mcu_clock_type_t)SYSTEM_CLOCK); - - // recover the default setting by temperature, should be called in the end - pmu_calibration_handler(NULL); - - /* RTC calibration function */ -#if !CFG_LPCLK_INTERNAL_EN - rtc_calibration(); -#endif - - /* rng calibration */ -#ifndef GR5515_E - rng_calibration(); -#endif -} - -static void exflash_io_pull_config(void) -{ - /* XQSPI IO configuration needs to match Flash. - The default configuration can match most Flash */ - HAL_EXFLASH_IO_PULL_SET(FLASH_CS, LL_GPIO_PULL_UP); - HAL_EXFLASH_IO_PULL_SET(FLASH_CLK, LL_GPIO_PULL_NO); - HAL_EXFLASH_IO_PULL_SET(FLASH_IO_0, LL_GPIO_PULL_UP); /* MOSI */ - HAL_EXFLASH_IO_PULL_SET(FLASH_IO_1, LL_GPIO_PULL_UP); /* MISO */ - HAL_EXFLASH_IO_PULL_SET(FLASH_IO_2, LL_GPIO_PULL_UP); /* WP */ - HAL_EXFLASH_IO_PULL_SET(FLASH_IO_3, LL_GPIO_PULL_UP); /* HOLD */ -} - -void platform_init(void) -{ - /* if BLE not fully power off, reset and power off it manually */ - BLE_power_check(); - - /* Clear All Wakeup Event When Cold Boot */ - ll_pwr_clear_wakeup_event(LL_PWR_WKUP_EVENT_ALL); - for (uint8_t i = 0; i < MAX_NUMS_IRQn; i++) { - NVIC_ClearPendingIRQ((IRQn_Type)(i)); - } - -#ifdef EXFLASH_WAKEUP_DELAY - warm_boot_set_exflash_readid_delay(EXFLASH_WAKEUP_DELAY * ITEM_5); - run_mode_t run_mode = (run_mode_t)(SYSTEM_CLOCK); - uint16_t osc_time = ble_wakeup_osc_time_get(run_mode) + (EXFLASH_WAKEUP_DELAY * ITEM_5); - ble_wakeup_osc_time_set(run_mode, osc_time); -#endif - - /* enable protection. */ -#ifndef GR5515_E - platform_init_push(); -#endif - - /* set sram power state. */ - mem_pwr_mgmt_init(); - - if (!hal_flash_init()) { - /* Flash fault, cannot startup. - * Output log via UART or Dump an error code to flash. */ - while (1) {} - } - -#if (defined(GR5515_E) && defined(ROM_RUN_IN_FLASH)) || !defined(GR5515_E) - platform_flash_enable_quad(); -#endif - - platform_flash_protection(FLASH_PROTECT_PRIORITY); - - /* nvds module init process. */ - nvds_setup(); - - /* To choose the System clock source and set the accuracy of OSC. */ -#if CFG_LPCLK_INTERNAL_EN - platform_clock_init_rng((mcu_clock_type_t)SYSTEM_CLOCK, RNG_OSC_CLK2, CFG_LF_ACCURACY_PPM, 0); -#else - platform_clock_init((mcu_clock_type_t)SYSTEM_CLOCK, RTC_OSC_CLK, CFG_LF_ACCURACY_PPM, 0); -#endif - - /* Register the SVC Table. */ - svc_table_register(SVC_TABLE_USER_SPACE); - -#if ENCRYPT_ENABLE - fpb_register_patch_init_func(fpb_encrypt_mode_patch_enable); -#else - fpb_register_patch_init_func(fpb_patch_enable); -#endif - - /* platform init process. */ - platform_sdk_init(); - -#if ENCRYPT_ENABLE - dfu_cmd_handler_replace_for_encrypt(); -#endif - - system_calibration(); - -#if (CFG_LCP_SUPPORT && (CHIP_TYPE == 0)) - gdx_lcp_buf_init((uint32_t)lcp_buf); -#endif - - exflash_io_pull_config(); - - /* disable protection. */ -#ifndef GR5515_E - platform_init_pop(); -#endif - - return; -} - -#if defined ( __GNUC__ ) -void __main(void) -{ - __asm("ldr r1, =__etext\n"); - __asm("ldr r2, =__data_start__\n"); - __asm("ldr r3, =__data_end__\n"); - __asm(".L_loop1:\n"); - __asm("cmp r2, r3\n"); - __asm("ittt lt\n"); - __asm("ldrlt r0, [r1], #4\n"); - __asm("strlt r0, [r2], #4\n"); - __asm("blt .L_loop1\n"); - __asm("ldr r1, =__bss_start__\n"); - __asm("ldr r2, =__bss_end__\n"); - __asm("movs r0, 0\n"); - __asm(".L_loop3:\n"); - __asm("cmp r1, r2\n"); - __asm("itt lt\n"); - __asm("strlt r0, [r1], #4\n"); - __asm("blt .L_loop3\n"); - system_platform_init(); - main(); -} -#endif - -#if defined ( __CC_ARM ) -//lint -e{10} -//lint -e{10,144} -void $Sub$$main(void) -{ - system_platform_init(); - $Super$$main(); -} -#endif - -#if defined ( __ICCARM__ ) - -void __main(void) -{ - __iar_program_start(); -} - -int __low_level_init(void) -{ - // call IAR table copy function. - __iar_data_init3(); - system_platform_init(); - return 0; -} -#endif diff --git a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/system_gr55xx.c b/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/system_gr55xx.c deleted file mode 100755 index 5766a06..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/toolchain/gr551x/source/system_gr55xx.c +++ /dev/null @@ -1,234 +0,0 @@ -/**************************************************************************//** - * @file system_gr55xx.c - * @brief CMSIS Device System Source File for - * Device GR55xx - * @version V1.00 - * @date 12. June 2018 - ******************************************************************************/ -/* - * Copyright (c) 2018 GOODIX. 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. - */ - -#include -#include "gr55xx.h" -#include "gr55xx_sys.h" -#include "gr55xx_hal.h" -#include "platform_sdk.h" -#include "custom_config.h" -#include "gr55xx_rom_symbol.h" - -/*---------------------------------------------------------------------------- - WEAK Functions - *----------------------------------------------------------------------------*/ -__WEAK void sdk_init(void) -{ - /* Prevent unused argument(s) compilation warning */ - return; -} -__WEAK void rom_init(void) -{ - /* Prevent unused argument(s) compilation warning */ - return; -} - -/*---------------------------------------------------------------------------- - Define clocks - *----------------------------------------------------------------------------*/ -#define SOFTWARE_REG_WAKEUP_FLAG_POS (8) -static inline void REG_PL_WR(uint32_t addr, uint32_t value) -{ - (*((volatile uint32_t *)(addr))) = (value); -} -static inline uint32_t REG_PL_RD(uint32_t addr) -{ - return (*((volatile uint32_t *)(addr))); -} - -#define SCB_CPACR_BASE_NUM 3UL -static inline uint32_t READ_VERSION_ADDR(void) -{ - return REG_PL_RD(0x45004); -} -#define CALIB_LP_CYCLE_COUNT 20 - -#define REGION_TABLE_LIMIT 0x0007e9c0 -#define REGION_TABLE_BASE 0x0007e990 -#define SCATTERLOAD_COPY 0x00062d05 -#define SCATTERLOAD_ZEROINIT 0x00062d21 -#define DFU_DATA_START_ADDR (0x800000 + 0x4000) - -typedef struct { - uint32_t rom_addr; - uint32_t ram_addr; - uint32_t len; - uint32_t fun; -} sactter_copy_info_t; - -volatile uint32_t g_app_msp_addr; /* record app msp address */ - -static const uint32_t systemClock[CLK_TYPE_NUM] = { - CLK_64M, /* CPLL_S64M_CLK */ - CLK_48M, /* CPLL_F48M_CLK */ - CLK_16M, /* XO_S16M_CLK */ - CLK_24M, /* CPLL_T24M_CLK */ - CLK_16M, /* CPLL_S16M_CLK */ - CLK_32M, /* CPLL_T32M_CLK */ -}; - -// xqspi clock table by sys_clk_type -const uint32_t mcu_clk_2_qspi_clk[CLK_TYPE_NUM] = { - [CPLL_S64M_CLK] = QSPI_64M_CLK, - [CPLL_F48M_CLK] = QSPI_48M_CLK, - [CPLL_T32M_CLK] = QSPI_32M_CLK, - [CPLL_T24M_CLK] = QSPI_24M_CLK, - [CPLL_S16M_CLK] = QSPI_16M_CLK, - [XO_S16M_CLK] = QSPI_16M_CLK, -}; - -/*---------------------------------------------------------------------------- - System Core Clock Variable - *----------------------------------------------------------------------------*/ -uint32_t SystemCoreClock = CLK_64M; /* System Core Clock Frequency as 64Mhz */ - -// lint -e{2,10,48,63} -// The previous line of comment is to inhibit PC-Lint errors for next code block. -void SystemCoreSetClock(mcu_clock_type_t clock_type) -{ - if (clock_type >= CLK_TYPE_NUM) - return; // input parameter is out of range - - if ((AON->PWR_RET01 & AON_PWR_REG01_SYS_CLK_SEL) != clock_type) { - uint32_t temp = AON->PWR_RET01 & (~(AON_PWR_REG01_SYS_CLK_SEL | AON_PWR_REG01_XF_SCK_CLK_SEL)); - // When a 16M or 64M clock is switched to another clock, it needs to be switched to 32M first. - AON->PWR_RET01 = (temp | (CPLL_T32M_CLK << AON_PWR_REG01_SYS_CLK_SEL_Pos) | - (QSPI_32M_CLK << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos)); - - __asm ("nop;nop;nop;nop;"); - temp = AON->PWR_RET01 & (~(AON_PWR_REG01_SYS_CLK_SEL | AON_PWR_REG01_XF_SCK_CLK_SEL)); - AON->PWR_RET01 = (temp | (clock_type << AON_PWR_REG01_SYS_CLK_SEL_Pos) | - (mcu_clk_2_qspi_clk[clock_type] << AON_PWR_REG01_XF_SCK_CLK_SEL_Pos)); - } - - SystemCoreClock = systemClock[clock_type]; - - // update sleep parameters by system clock. - pwr_mgmt_update_wkup_param(); - - return; -} - -void SystemCoreGetClock(mcu_clock_type_t *clock_type) -{ - *clock_type = (mcu_clock_type_t)(AON->PWR_RET01 & AON_PWR_REG01_SYS_CLK_SEL); -} - -void SystemCoreUpdateClock(void) -{ - SystemCoreClock = systemClock[AON->PWR_RET01 & AON_PWR_REG01_SYS_CLK_SEL]; -} - -static inline uint32_t get_wakeup_flag(void) -{ - return (AON->SOFTWARE_2 & (1 << SOFTWARE_REG_WAKEUP_FLAG_POS)); -} - -void set_msp(void) -{ -#ifndef DRIVER_TEST -#ifdef APP_CODE_RUN_ADDR - __DMB(); - __set_MSP(REG_PL_RD(APP_CODE_RUN_ADDR)); - __DSB(); -#endif -#endif -} - -static void sdk_init_patch(void) -{ - sactter_copy_info_t sactter_copy_info = {0}; - - for (int i = 0; i < (REGION_TABLE_LIMIT - REGION_TABLE_BASE) / (sizeof(sactter_copy_info_t)); i++) { - memcpy_s((void *)&sactter_copy_info, sizeof (sactter_copy_info), \ - (void *)(REGION_TABLE_BASE + i * sizeof(sactter_copy_info_t)), sizeof(sactter_copy_info_t)); - - if ((sactter_copy_info.fun + 1) == SCATTERLOAD_COPY) { - if (sactter_copy_info.ram_addr == DFU_DATA_START_ADDR) { - continue; - } - memcpy_s((void *)(sactter_copy_info.ram_addr), sactter_copy_info.len, \ - (void *)(sactter_copy_info.rom_addr), sactter_copy_info.len); - } else { - if ((sactter_copy_info.fun + 1) == SCATTERLOAD_ZEROINIT) { - memset_s((void *)(sactter_copy_info.ram_addr), sactter_copy_info.len, 0, sactter_copy_info.len); - } - } - } -} - -void SystemInit(void) -{ -#if (__FPU_USED == 1) - SCB->CPACR |= ((SCB_CPACR_BASE_NUM << ITEM_10*ITEM_2) | /* set CP10 Full Access */ - (SCB_CPACR_BASE_NUM << ITEM_11*ITEM_2) ); /* set CP11 Full Access */ -#endif - -#ifdef UNALIGNED_SUPPORT_DISABLE - SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; -#endif - - if (COLD_BOOT == get_wakeup_flag()) { -#if defined(GR5515_D) - sdk_init_patch(); -#endif - } - - return; -} - -void system_platform_init(void) -{ -#if (!defined(ROM_RUN_IN_FLASH)) && defined(GR5515_E) - sdk_init(); -#else -#if defined(GR5515_E) - rom_init(); -#endif -#endif - - platform_init(); - - /* record app msp */ - g_app_msp_addr = REG_PL_RD(APP_CODE_RUN_ADDR); - - return; -} - -void main_init(void) -{ - uint32_t boot_flag = get_wakeup_flag(); - if (COLD_BOOT == boot_flag) { - __main(); - } else { - __DMB(); - SCB->VTOR = (uint32_t)(uintptr_t)ArchGetHwiFrom(); - __DSB(); - pwr_mgmt_warm_boot(); - while (1) {} - } - // Never execute here -} - diff --git a/gr551x/sdk_liteos/liteos_m/los_port_pm.c b/gr551x/sdk_liteos/liteos_m/los_port_pm.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/liteos_m/los_port_pm.h b/gr551x/sdk_liteos/liteos_m/los_port_pm.h deleted file mode 100644 index dcb2961..0000000 --- a/gr551x/sdk_liteos/liteos_m/los_port_pm.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - **************************************************************************************** - * - * @file los_port_pm.h - * - * @brief Power Management related internal API - * - **************************************************************************************** - * @attention - #####Copyright (c) 2023 GOODIX - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GOODIX nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - **************************************************************************************** - */ - -#ifndef __LOS_PORT_PM_H__ -#define __LOS_PORT_PM_H__ - -#include - -void ultra_wfi(void); - -uint32_t get_remain_sleep_dur(void); - -void warm_boot_second(void); - -#endif // __LOS_PORT_PM_H__ \ No newline at end of file diff --git a/gr551x/sdk_liteos/liteos_m/target_config.h b/gr551x/sdk_liteos/liteos_m/target_config.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/platform/BUILD.gn b/gr551x/sdk_liteos/platform/BUILD.gn deleted file mode 100755 index cc199fe..0000000 --- a/gr551x/sdk_liteos/platform/BUILD.gn +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2021 GOODIX. -# 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. - -import("//kernel/liteos_m/liteos.gni") -module_name = get_path_info(rebase_path("."), "name") -module_group(module_name) { - modules = [ - "main", - "startup", - "system", - "uart", - ] -} diff --git a/gr551x/sdk_liteos/platform/linker/gr5515.ld.tmpl b/gr551x/sdk_liteos/platform/linker/gr5515.ld.tmpl old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/platform/main/BUILD.gn b/gr551x/sdk_liteos/platform/main/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/platform/startup/BUILD.gn b/gr551x/sdk_liteos/platform/startup/BUILD.gn deleted file mode 100755 index 9d54e68..0000000 --- a/gr551x/sdk_liteos/platform/startup/BUILD.gn +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2021 GOODIX. -# 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. - -import("//kernel/liteos_m/liteos.gni") - -kernel_module("platform_startup") { - sources = [ "startup_gr55xx.s" ] -} diff --git a/gr551x/sdk_liteos/platform/startup/gr551x.ld b/gr551x/sdk_liteos/platform/startup/gr551x.ld deleted file mode 100755 index aad5618..0000000 --- a/gr551x/sdk_liteos/platform/startup/gr551x.ld +++ /dev/null @@ -1,249 +0,0 @@ -/**************************************************************************//** - * @file gr551x.ld - * @brief Linker script for GR551X Device - * @version V1.00 - * @date 10. September 2021 - * - * @note - * - ******************************************************************************/ -/* - * Copyright (c) 2021 GOODIX. - * 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. - */ - -/* Entry Point */ -ENTRY(Reset_Handler) - -_Min_Heap_Size = 0x800; /* required amount of heap */ -_Min_Stack_Size = 0x2000; /* required amount of stack */ - -/* Highest address of the user mode stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ -_sstack = _estack - _Min_Stack_Size; - -/* Memories definition */ -MEMORY -{ - FPB_RAM (xrw) : ORIGIN = 0x30004000, LENGTH = 0x20 - RAM (xrw) : ORIGIN = 0x00804400, LENGTH = 239K - FLASH (rx) : ORIGIN = 0x0100B000, LENGTH = 950K -} - -/* Sections */ -SECTIONS -{ - /* The startup code into "FLASH" Rom type memory */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - _stext = .; - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - __zinitcall_bsp_start = .; - KEEP (*(.zinitcall.bsp0.init)) - KEEP (*(.zinitcall.bsp1.init)) - KEEP (*(.zinitcall.bsp2.init)) - KEEP (*(.zinitcall.bsp3.init)) - KEEP (*(.zinitcall.bsp4.init)) - __zinitcall_bsp_end = .; - __zinitcall_device_start = .; - KEEP (*(.zinitcall.device0.init)) - KEEP (*(.zinitcall.device1.init)) - KEEP (*(.zinitcall.device2.init)) - KEEP (*(.zinitcall.device3.init)) - KEEP (*(.zinitcall.device4.init)) - __zinitcall_device_end = .; - __zinitcall_core_start = .; - KEEP (*(.zinitcall.core0.init)) - KEEP (*(.zinitcall.core1.init)) - KEEP (*(.zinitcall.core2.init)) - KEEP (*(.zinitcall.core3.init)) - KEEP (*(.zinitcall.core4.init)) - __zinitcall_core_end = .; - __zinitcall_sys_service_start = .; - KEEP (*(.zinitcall.sys.service0.init)) - KEEP (*(.zinitcall.sys.service1.init)) - KEEP (*(.zinitcall.sys.service2.init)) - KEEP (*(.zinitcall.sys.service3.init)) - KEEP (*(.zinitcall.sys.service4.init)) - __zinitcall_sys_service_end = .; - __zinitcall_sys_feature_start = .; - KEEP (*(.zinitcall.sys.feature0.init)) - KEEP (*(.zinitcall.sys.feature1.init)) - KEEP (*(.zinitcall.sys.feature2.init)) - KEEP (*(.zinitcall.sys.feature3.init)) - KEEP (*(.zinitcall.sys.feature4.init)) - __zinitcall_sys_feature_end = .; - __zinitcall_run_start = .; - KEEP (*(.zinitcall.run0.init)) - KEEP (*(.zinitcall.run1.init)) - KEEP (*(.zinitcall.run2.init)) - KEEP (*(.zinitcall.run3.init)) - KEEP (*(.zinitcall.run4.init)) - __zinitcall_run_end = .; - __zinitcall_app_service_start = .; - KEEP (*(.zinitcall.app.service0.init)) - KEEP (*(.zinitcall.app.service1.init)) - KEEP (*(.zinitcall.app.service2.init)) - KEEP (*(.zinitcall.app.service3.init)) - KEEP (*(.zinitcall.app.service4.init)) - __zinitcall_app_service_end = .; - __zinitcall_app_feature_start = .; - KEEP (*(.zinitcall.app.feature0.init)) - KEEP (*(.zinitcall.app.feature1.init)) - KEEP (*(.zinitcall.app.feature2.init)) - KEEP (*(.zinitcall.app.feature3.init)) - KEEP (*(.zinitcall.app.feature4.init)) - __zinitcall_app_feature_end = .; - __zinitcall_test_start = .; - KEEP (*(.zinitcall.test0.init)) - KEEP (*(.zinitcall.test1.init)) - KEEP (*(.zinitcall.test2.init)) - KEEP (*(.zinitcall.test3.init)) - KEEP (*(.zinitcall.test4.init)) - __zinitcall_test_end = .; - __zinitcall_exit_start = .; - KEEP (*(.zinitcall.exit0.init)) - KEEP (*(.zinitcall.exit1.init)) - KEEP (*(.zinitcall.exit2.init)) - KEEP (*(.zinitcall.exit3.init)) - KEEP (*(.zinitcall.exit4.init)) - __zinitcall_exit_end = .; - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data into "FLASH" Rom type memory */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - - .ARM : { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - - .init_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - - .fini_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - .hdf_drivers_entry : - { - _hdf_drivers_start = .; - KEEP(*(.hdf.driver)) - _hdf_drivers_end = .; - } >FLASH - - /* Used by the startup to initialize data */ - _sidata = LOADADDR(.data); - __etext = .; - - /* Initialized data sections into "RAM" Ram type memory */ - .data : - { - . = ALIGN(4); - __data_start__ = . ; /* create a global symbol at data start */ - KEEP (*(.vector)) /* make the vector at the data begining, and it will meet the needs of VTOR */ - . = ALIGN(4); - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - *(.RamFunc) /* .RamFunc sections */ - *(.RamFunc*) /* .RamFunc* sections */ - *(RAM_CODE) /* .RamFunc sections */ - *(.ramfunc) /* .RamFunc sections */ - *(TINY_RAM_SPACE) - . = ALIGN(4); - __data_end__ = . ;/* define a global symbol at data end */ - } >RAM AT> FLASH - - /* Uninitialized data section into "RAM" Ram type memory */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss section */ - __bss_start__ = .; /* define a global symbol at bss start */ - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - __bss_end__ = .; /* define a global symbol at bss end */ - } >RAM - - . = ALIGN(16); - __los_heap_addr_start__ = .; - __los_heap_addr_end__ = ORIGIN(RAM) + LENGTH(RAM) - _Min_Stack_Size - _Min_Heap_Size - 1; - - .fpb : - { - . = ALIGN(0x100); - *(FPB) - } >FPB_RAM AT> FLASH - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/gr551x/sdk_liteos/platform/startup/startup_gr55xx.s b/gr551x/sdk_liteos/platform/startup/startup_gr55xx.s deleted file mode 100755 index 5aa3185..0000000 --- a/gr551x/sdk_liteos/platform/startup/startup_gr55xx.s +++ /dev/null @@ -1,292 +0,0 @@ -/**************************************************************************//** - * @file startup_gr55xx.s - * @brief CMSIS Cortex-M ARMv7-M based Core Device Startup File for - * Device GR55xx - * @version V1.00 - * @date 10. September 2021 - * - * @note - * - ******************************************************************************/ -/* - * Copyright (c) 2021 GOODIX. - * 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. - */ - - .syntax unified - .cpu cortex-m4 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -.global SystemInit -.global main_init - -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr sp, =_estack /* set stack pointer */ - bl SystemInit - -/* Call the application's entry point.*/ - bl main_init - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -*******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - /* External Interrupts */ - .word WDT_IRQHandler - .word BLE_SDK_Handler - .word BLE_IRQHandler - .word DMA_IRQHandler - .word SPI_M_IRQHandler - .word SPI_S_IRQHandler - .word EXT0_IRQHandler - .word EXT1_IRQHandler - .word TIMER0_IRQHandler - .word TIMER1_IRQHandler - .word DUAL_TIMER_IRQHandler - .word QSPI0_IRQHandler - .word UART0_IRQHandler - .word UART1_IRQHandler - .word I2C0_IRQHandler - .word I2C1_IRQHandler - .word AES_IRQHandler - .word HMAC_IRQHandler - .word EXT2_IRQHandler - .word RNG_IRQHandler - .word PMU_IRQHandler - .word PKC_IRQHandler - .word XQSPI_IRQHandler - .word QSPI1_IRQHandler - .word PWR_CMD_IRQHandler - .word BLESLP_IRQHandler - .word SLPTIMER_IRQHandler - .word COMP_IRQHandler - .word AON_WDT_IRQHandler - .word I2S_M_IRQHandler - .word I2S_S_IRQHandler - .word ISO7816_IRQHandler - .word PRESENT_IRQHandler - .word CALENDAR_IRQHandler - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WDT_IRQHandler - .thumb_set WDT_IRQHandler,Default_Handler - - .weak BLE_SDK_Handler - .thumb_set BLE_SDK_Handler,Default_Handler - - .weak BLE_IRQHandler - .thumb_set BLE_IRQHandler,Default_Handler - - .weak DMA_IRQHandler - .thumb_set DMA_IRQHandler,Default_Handler - - .weak SPI_M_IRQHandler - .thumb_set SPI_M_IRQHandler,Default_Handler - - .weak SPI_S_IRQHandler - .thumb_set SPI_S_IRQHandler,Default_Handler - - .weak EXT0_IRQHandler - .thumb_set EXT0_IRQHandler,Default_Handler - - .weak EXT1_IRQHandler - .thumb_set EXT1_IRQHandler,Default_Handler - - .weak TIMER0_IRQHandler - .thumb_set TIMER0_IRQHandler,Default_Handler - - .weak TIMER1_IRQHandler - .thumb_set TIMER1_IRQHandler,Default_Handler - - .weak DUAL_TIMER_IRQHandler - .thumb_set DUAL_TIMER_IRQHandler,Default_Handler - - .weak QSPI0_IRQHandler - .thumb_set QSPI0_IRQHandler,Default_Handler - - .weak UART0_IRQHandler - .thumb_set UART0_IRQHandler,Default_Handler - - .weak UART1_IRQHandler - .thumb_set UART1_IRQHandler,Default_Handler - - .weak I2C0_IRQHandler - .thumb_set I2C0_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak AES_IRQHandler - .thumb_set AES_IRQHandler,Default_Handler - - .weak HMAC_IRQHandler - .thumb_set HMAC_IRQHandler,Default_Handler - - .weak EXT2_IRQHandler - .thumb_set EXT2_IRQHandler,Default_Handler - - .weak RNG_IRQHandler - .thumb_set RNG_IRQHandler,Default_Handler - - .weak PMU_IRQHandler - .thumb_set PMU_IRQHandler,Default_Handler - - .weak PKC_IRQHandler - .thumb_set PKC_IRQHandler,Default_Handler - - .weak XQSPI_IRQHandler - .thumb_set XQSPI_IRQHandler,Default_Handler - - .weak QSPI1_IRQHandler - .thumb_set QSPI1_IRQHandler,Default_Handler - - .weak PWR_CMD_IRQHandler - .thumb_set PWR_CMD_IRQHandler,Default_Handler - - .weak BLESLP_IRQHandler - .thumb_set BLESLP_IRQHandler,Default_Handler - - .weak SLPTIMER_IRQHandler - .thumb_set SLPTIMER_IRQHandler,Default_Handler - - .weak COMP_IRQHandler - .thumb_set COMP_IRQHandler,Default_Handler - - .weak AON_WDT_IRQHandler - .thumb_set AON_WDT_IRQHandler,Default_Handler - - .weak I2S_M_IRQHandler - .thumb_set I2S_M_IRQHandler,Default_Handler - - .weak I2S_S_IRQHandler - .thumb_set I2S_S_IRQHandler,Default_Handler - - .weak ISO7816_IRQHandler - .thumb_set ISO7816_IRQHandler,Default_Handler - - .weak PRESENT_IRQHandler - .thumb_set PRESENT_IRQHandler,Default_Handler - - .weak CALENDAR_IRQHandler - .thumb_set CALENDAR_IRQHandler,Default_Handler - - .global SVC_handler_proc - .section .ramfunc - .type SVC_Handler, %function - .global SVC_Handler -SVC_Handler: - TST R14,$4 - IT NE - MRSNE R12,PSP - IT EQ - MOVEQ R12,SP - PUSH {R0-R3,LR} - MOV R0, R12 - BL SVC_handler_proc - MOV R12, R0 - POP {R0-R3,LR} - CMP R12,$0 - IT NE - BLXNE R12 - BX LR - -/*****END OF FILE****/ - - diff --git a/gr551x/sdk_liteos/platform/system/uart.c b/gr551x/sdk_liteos/platform/system/uart.c old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/platform/system/uart.h b/gr551x/sdk_liteos/platform/system/uart.h old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/platform/uart/BUILD.gn b/gr551x/sdk_liteos/platform/uart/BUILD.gn deleted file mode 100755 index 2be1d14..0000000 --- a/gr551x/sdk_liteos/platform/uart/BUILD.gn +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2021 GOODIX. -# 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. - -import("//kernel/liteos_m/liteos.gni") - -config("public") { - include_dirs = [ "." ] -} - -kernel_module("platform_uart") { - sources = [ "uart.c" ] -} diff --git a/gr551x/sdk_liteos/platform/uart/uart.c b/gr551x/sdk_liteos/platform/uart/uart.c deleted file mode 100755 index d282cb6..0000000 --- a/gr551x/sdk_liteos/platform/uart/uart.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2021 GOODIX. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "gr55xx.h" -#include "app_log.h" -#include "los_sem.h" -#include "uart.h" - -#define UART_TX_TIMEOUT 1000 -#define HILOG_IDX 2 - -static UINT32 rxSemHandle; -static bool uart_initialized = false; - -static void uart_callback(app_uart_evt_t *p_evt) -{ - if ((p_evt->type == APP_UART_EVT_RX_DATA) || - (p_evt->type == APP_UART_EVT_ERROR)) { - LOS_SemPost(rxSemHandle); -#if (LOSCFG_USE_SHELL == 1) - (void)LOS_EventWrite(&g_shellInputEvent, 0x1); -#endif - } -} - -void bsp_uart_init(void) -{ - app_uart_tx_buf_t uart_buffer; - app_uart_params_t uart_param; - - LOS_BinarySemCreate(0, &rxSemHandle); - - uart_buffer.tx_buf = NULL; - uart_buffer.tx_buf_size = 0; - - uart_param.id = LOG_UART_ID; - uart_param.init.baud_rate = LOG_UART_BAUDRATE; - uart_param.init.data_bits = UART_DATABITS_8; - uart_param.init.stop_bits = UART_STOPBITS_1; - uart_param.init.parity = UART_PARITY_NONE; - uart_param.init.hw_flow_ctrl = UART_HWCONTROL_NONE; - uart_param.init.rx_timeout_mode = UART_RECEIVER_TIMEOUT_ENABLE; - uart_param.pin_cfg.rx.type = LOG_UART_RX_IO_TYPE; - uart_param.pin_cfg.rx.pin = LOG_UART_RX_PIN; - uart_param.pin_cfg.rx.mux = LOG_UART_RX_PINMUX; - uart_param.pin_cfg.rx.pull = LOG_UART_RX_PULL; - uart_param.pin_cfg.tx.type = LOG_UART_TX_IO_TYPE; - uart_param.pin_cfg.tx.pin = LOG_UART_TX_PIN; - uart_param.pin_cfg.tx.mux = LOG_UART_TX_PINMUX; - uart_param.pin_cfg.tx.pull = LOG_UART_TX_PULL; - uart_param.use_mode.type = APP_UART_TYPE_INTERRUPT; - app_uart_init(&uart_param, uart_callback, &uart_buffer); -#if (LOSCFG_USE_SHELL == 1) - (void)LOS_EventWrite(&g_shellInputEvent, 0x1); -#endif - uart_initialized = true; -} - -#if APP_LOG_PORT == 0 -void bsp_uart_send(uint8_t *p_data, uint16_t length) -{ - if (uart_initialized != true) { - return; - } - - app_uart_transmit_sync(LOG_UART_ID, p_data, length, UART_TX_TIMEOUT); -} - -void bsp_uart_flush(void) -{ - app_uart_flush(LOG_UART_ID); -} -#elif APP_LOG_PORT == 1 -__WEAK unsigned SEGGER_RTT_Write(unsigned BufferIndex, const uint8_t* pBuffer, unsigned NumBytes) -{ - return 0; -} - -void bsp_segger_rtt_send(uint8_t *p_data, uint16_t length) -{ - SEGGER_RTT_Write(0, (void*)p_data, length); -} -#elif APP_LOG_PORT == 2 -#error "ITM log is not supported" -#endif // APP_LOG_UART == 0 - -void bsp_log_init(void) -{ - app_log_init_t log_init; - - log_init.filter.level = APP_LOG_LVL_DEBUG; - log_init.fmt_set[APP_LOG_LVL_ERROR] = APP_LOG_FMT_ALL & (~APP_LOG_FMT_TAG); - log_init.fmt_set[APP_LOG_LVL_WARNING] = APP_LOG_FMT_LVL; - log_init.fmt_set[APP_LOG_LVL_INFO] = APP_LOG_FMT_LVL; - log_init.fmt_set[APP_LOG_LVL_DEBUG] = APP_LOG_FMT_LVL; - -#if APP_LOG_PORT == 0 - bsp_uart_init(); - app_log_init(&log_init, bsp_uart_send, bsp_uart_flush); -#elif APP_LOG_PORT == 1 - app_log_init(&log_init, bsp_segger_rtt_send, NULL); -#endif // (APP_LOG_PORT == 0) - app_assert_init(); -} - -int HiLogWriteInternal(const char *buffer, size_t bufLen) -{ - size_t len = bufLen; - if (!buffer) { - return -1; - } - // because it's called as HiLogWriteInternal(buf, strlen(buf) + 1) - if (len < HILOG_IDX) { - return 0; - } - if (buffer[len - HILOG_IDX] != '\n') { - *((char *)buffer + bufLen - 1) = '\n'; - } else { - len--; - } -#if APP_LOG_PORT == 0 - int ret = app_uart_transmit_sync(LOG_UART_ID, buffer, bufLen, UART_TX_TIMEOUT); -#elif APP_LOG_PORT == 1 - int ret = 0; - bsp_segger_rtt_send(buffer, bufLen); -#endif // APP_LOG_PORT == 0 - - return ret; -} - -void _putchar(char character) -{ -#if APP_LOG_PORT == 0 - bsp_uart_send(&character, 1); -#elif APP_LOG_PORT == 1 - bsp_segger_rtt_send(&character, 1); -#endif // APP_LOG_PORT -} - -uint8_t UartGetc(void) -{ - uint8_t ch = 0; - - if (uart_initialized != true) { - return; - } - app_uart_receive_async(LOG_UART_ID, &ch, 1); - LOS_SemPend(rxSemHandle, LOS_WAIT_FOREVER); - return ch; -} diff --git a/gr551x/sdk_liteos/platform/uart/uart.h b/gr551x/sdk_liteos/platform/uart/uart.h deleted file mode 100755 index 98df6f8..0000000 --- a/gr551x/sdk_liteos/platform/uart/uart.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021 GOODIX. - * 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. - */ - -#ifndef __UART_H -#define __UART_H - -#include "los_event.h" -#include "los_compiler.h" -#include "app_io.h" -#include "app_uart.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define LOG_UART_ID APP_UART_ID_0 -#define LOG_UART_BAUDRATE 115200 -#define LOG_UART_TX_IO_TYPE APP_IO_TYPE_NORMAL -#define LOG_UART_RX_IO_TYPE APP_IO_TYPE_NORMAL -#define LOG_UART_TX_PIN APP_IO_PIN_10 -#define LOG_UART_RX_PIN APP_IO_PIN_11 -#define LOG_UART_TX_PINMUX APP_IO_MUX_2 -#define LOG_UART_RX_PINMUX APP_IO_MUX_2 -#define LOG_UART_TX_PULL APP_IO_PULLUP -#define LOG_UART_RX_PULL APP_IO_PULLUP - -/**< Size of app uart tx buffer. */ -#define UART_TX_BUFF_SIZE 0x2000 - -extern EVENT_CB_S g_shellInputEvent; - -void bsp_log_init(void); -uint8_t UartGetc(void); -void _putchar(char character); - -#ifdef __cplusplus -} -#endif - -#endif /* __UART_H */ diff --git a/gr551x/sdk_liteos/third_party_adapter/mbedtls/BUILD.gn b/gr551x/sdk_liteos/third_party_adapter/mbedtls/BUILD.gn old mode 100644 new mode 100755 diff --git a/gr551x/sdk_liteos/third_party_adapter/mbedtls/config/mbedtls_config_gr551x.h b/gr551x/sdk_liteos/third_party_adapter/mbedtls/config/mbedtls_config_gr551x.h old mode 100644 new mode 100755 diff --git a/gr551x/tools/bin_create.py b/gr551x/tools/bin_create.py deleted file mode 100755 index 9872119..0000000 --- a/gr551x/tools/bin_create.py +++ /dev/null @@ -1,406 +0,0 @@ -# Copyright (c) 2021 GOODIX. -# 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. - -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# author: zhangqf - -""" -This module use arm-none-eabi-xxx function to deal the xxx.elf file. we recept two parameters, and the -format of the usage: bin_create.py input_file.elf out_file.bin. Thanks for use this module -""" - -import os -from os import path -import sys -import sys -import time -import re -import os -import json - -CUSTOM_CONFIG = "../../../device/soc/goodix/gr551x/sdk_liteos/config/custom_config.h" - -BufSize = 1024 -PatternValue = 0x4744 -BleToolVersion = "v1.0" -NumberOfOneLine = 0x10 -MaxCommentsLen = 12 - -tool_usage = """\n -BLE Tool Usage: -after_build.py --mode=gen_fw --cfg=config_file --bin=xxx.bin --out_dir=example_dir --app_name=xxx [--dap]\n -""" - -OPT_MODE_INVALID = 1 -OPT_MODE_GEN = 2 -OPT_MODE_MERGE_BIN = 3 -OPT_MODE_HEX2BIN = 4 -OPT_MODE_BIN2HEX = 5 -OPT_MODE_ENC = 6 -OPT_MODE_SPLIT_ROM = 7 - -XIP_SPEED_64M = 0 -XIP_SPEED_48M = 1 -XIP_SPEED_32M = 2 -XIP_SPEED_24M = 3 -XIP_SPEED_16M = 4 - -SYS_CLK_64M = 0 -SYS_CLK_48M = 1 -SYS_CLK_32M = 5 -SYS_CLK_24M = 3 -SYS_CLK_XO16M = 2 -SYS_CLK_16M = 4 - -BIN2HEX_RES_OK = 0 -BIN2HEX_RES_BIN_FILE_NOT_EXIST = 1 -BIN2HEX_RES_HEX_FILE_PATH_ERROR = 2 - -HEX2BIN_RES_OK = 0 -HEX2BIN_RES_DATA_TOO_LONG = 1 -HEX2BIN_RES_DATA_TOO_SHORT = 2 -HEX2BIN_RES_NO_COLON = 3 -HEX2BIN_RES_TYPE_ERROR = 4 -HEX2BIN_RES_LENGTH_ERROR = 5 -HEX2BIN_RES_CHECK_ERROR = 6 -HEX2BIN_RES_HEX_FILE_NOT_EXIST = 7 -HEX2BIN_RES_BIN_FILE_PATH_ERROR = 8 -HEX2BIN_RES_WRITE_ERROR = 9 -HEX2BIN_RES_HEX_FILE_NO_END = 10 - -class BootInfo(): - def __init__(self): - self.bin_size = 0 - self.check_sum = 0 - self.load_addr = 0 - self.run_addr = 0 - self.xqspi_xip_cmd = 0 - self.xqspi_speed = 0 # bit: 0..3 clock speed - self.code_copy_mode = 0 # bit: 4 code copy mode - self.boot_clk = 0 # bit: 5..7 reserved - self.check_image = 0 # bit: 8 check image - self.boot_delay = 0 - self.is_dap_boot = 0 # bit:11 check if boot dap mode - self.reserved = 0 # bit: 24 reserved - - def to_bytes(self): - boot_config = self.xqspi_speed ^ (self.code_copy_mode << 4) ^ (self.boot_clk << 5) ^ \ - (self.check_image << 8) ^ (self.boot_delay << 9) ^ \ - (self.is_dap_boot << 10) ^ (self.reserved << 11) - load_addr = int(self.load_addr, base=16) - run_addr = int(self.run_addr, base=16) - items = [self.bin_size, self.check_sum, load_addr, run_addr, self.xqspi_xip_cmd, boot_config] - boot_info_byte = list(map(lambda item: item.to_bytes(4, byteorder='little', signed=False), items)) - return boot_info_byte - - -class ImgInfo(): - def __init__(self): - self.pattern = 0 - self.version = 0 - self.boot_info = BootInfo() - self.comments = [] - self.reserved = [] - - def to_bytes(self): - img_info_byte = [] - img_info_byte.append(self.pattern.to_bytes(2, byteorder='little', signed=False)) - img_info_byte.append(int(self.version, base=16).to_bytes(2, byteorder='little', signed=False)) - boot_info_byte = self.boot_info.to_bytes() - img_info_byte += boot_info_byte - return img_info_byte - -class BootInfoEnc(): - def __init__(self): - self.CP = [0 for x in range(60)] - self.cfg = 0 - self.swd = 0 - self.enc = 0 - self.CRC = 0 - self.key_bin = [0 for x in range(168)] - - def to_bytes(self): - boot_info_enc_byte = [] - boot_info_enc_byte += list(map(lambda item: item.to_bytes(1, byteorder='little', signed=False), self.CP)) - boot_info_enc_byte.append(self.cfg.to_bytes(4, byteorder='little', signed=False)) - boot_info_enc_byte.append(self.swd.to_bytes(2, byteorder='little', signed=False)) - boot_info_enc_byte.append(self.enc.to_bytes(2, byteorder='little', signed=False)) - boot_info_enc_byte.append(self.CRC.to_bytes(4, byteorder='little', signed=False)) - boot_info_enc_byte += list(map(lambda item: item.to_bytes(1, byteorder='little', signed=False), self.key_bin)) - return boot_info_enc_byte - - -class UtilityFunc(): - def __init__(self): - pass - - def get_spec_macro_arg_str(self, file_path, macro_str): - # print("get_spec_macro_arg_str") - with open(file_path, "r+", encoding="utf-8") as f_r: - lines = f_r.readlines() - # arg_cache = None - for line in lines: - if "#define" in line: - line = line[7:] - # print(line) - arg_head = line.split()[0] - # print(arg_head) - if arg_head == macro_str: - # arg_cache.append(line.split()[1]) - # print(arg_cache) - return line.split()[1] - else: - continue - else: - continue - # arg_cache.append('') - return '' - - def do_pad_with_bin(self, bin_file): - if bin_file: - bin_size = os.path.getsize(bin_file) - add_size = 16 - bin_size % 16 if bin_size % 16 != 0 else 0 - # print(bin_size, add_size) - - with open(bin_file, "ab") as f_w: - for i in range(add_size): - fill_value = 0x00 - f_w.write(fill_value.to_bytes(1, byteorder='little', signed=False)) - return True - return False - - def check_image_sum(self, data, len): - check_sum = 0 - for i in range(len): - check_sum += data[i] - return check_sum - - -class GenFirmware(): - def __init__(self): - self.utilityFunc = UtilityFunc() - self.boot_info = BootInfo() - - self.config_file = '' - self.input_bin = '' - self.out_dir = '' - self.app_name = '' - self.dap_mode = '' - - def opt_gen_mode_handler(self): - # print("gen_firmware") - run_mode = 0x0b - hex_addr = 0x01000000 - boot_clock = SYS_CLK_XO16M - - xqspi_mode = 0 - sdk_version = 0 - is_dap_boot = 0 - code_copy_mode = 0 - - macro_values = ["APP_CODE_RUN_ADDR", "APP_CODE_LOAD_ADDR", "VERSION", "BOOT_CLOCK", "BOOT_CHECK_IMAGE", - "BOOT_LONG_TIME", "COMMENTS"] - - arg_caches = list(map(lambda x: self.utilityFunc.get_spec_macro_arg_str(self.config_file, x), macro_values)) - - if arg_caches[3] != '': - boot_clock = arg_caches[3] - - if boot_clock == 0: # 64MHz - xqspi_mode = XIP_SPEED_64M - elif boot_clock == 1: # 48MHz - xqspi_mode = XIP_SPEED_48M - elif boot_clock == 2 or boot_clock == 4: - xqspi_mode = XIP_SPEED_16M - elif boot_clock == 3: - xqspi_mode = XIP_SPEED_24M - elif boot_clock == 5: - xqspi_mode = XIP_SPEED_32M - - # 16 bytes alignment - self.utilityFunc.do_pad_with_bin(self.input_bin) - - if arg_caches[2] != '': - sdk_version = arg_caches[2] - - # fill the boot info - self.boot_info.bin_size = 0x00000000 - self.boot_info.check_sum = 0x00000000 - if arg_caches[0] != '': - self.boot_info.run_addr = arg_caches[0] - if arg_caches[1] != '': - self.boot_info.load_addr = arg_caches[1] - self.boot_info.xqspi_xip_cmd = run_mode - self.boot_info.xqspi_speed = xqspi_mode & 0x0F - self.boot_info.code_copy_mode = code_copy_mode & 0x01 - self.boot_info.boot_clk = boot_clock & 0x07 - if arg_caches[4] != '': - self.boot_info.check_image = int(arg_caches[4]) & 0x01 - if arg_caches[5] != '': - self.boot_info.boot_delay = int(arg_caches[5]) & 0x01 - self.boot_info.is_dap_boot = int(is_dap_boot) & 0x01 - - info_bin_file = os.path.join(self.out_dir, "info.bin") - header_bin_file = os.path.join(self.out_dir, "header.bin") - - if not self.gen_fw_info_file(self.input_bin, info_bin_file): - print("Generate info files fail\n") - return False - # fill the image info - self.img_info = ImgInfo() - self.img_info.pattern = PatternValue - self.img_info.version = sdk_version - self.img_info.boot_info = self.boot_info - if arg_caches[6] != '': - if arg_caches[6][0] == '"': - arg_caches[6] = arg_caches[6][1:] - if arg_caches[6][-1] == '"': - arg_caches[6] = arg_caches[6][:-2] - self.img_info.comments = arg_caches[6] - else: - self.img_info.comments = self.app_name[0:MaxCommentsLen] - # print(self.img_info.comments) - - if not self.gen_fw_header_bin(header_bin_file, info_bin_file): - print("Generate header bin fail!\n") - return False - - out_app_fw_bin = os.path.join(self.out_dir, "{}.bin".format(self.app_name)) # ? - self.gen_app_fw_bin(out_app_fw_bin, header_bin_file, self.input_bin) - - # if os.path.exists(self.input_bin): - # os.remove(self.input_bin) - - if os.path.exists(info_bin_file): - os.remove(info_bin_file) - - if os.path.exists(header_bin_file): - os.remove(header_bin_file) - - - def gen_fw_info_file(self, input_bin, output_info_bin): - bin_size = os.path.getsize(input_bin) - - with open(input_bin, "rb") as f_r: - buf = f_r.read() - - self.boot_info.bin_size = bin_size - self.boot_info.check_sum = self.utilityFunc.check_image_sum(buf, bin_size) - - print("---------------------------------------------------------------") - print("bin_size = 0x%08x," %(self.boot_info.bin_size)) - print("check_sum = 0x%08x," %(self.boot_info.check_sum)) - print("load_addr = {},".format(self.boot_info.load_addr)) - print("run_addr = {},".format(self.boot_info.run_addr)) - print("xqspi_xip_cmd = 0x%02x," %(self.boot_info.xqspi_xip_cmd)) - print("xqspi_speed = 0x%02x," %(self.boot_info.xqspi_speed)) - print("code_copy_mode = 0x%02x," %(self.boot_info.code_copy_mode)) - print("boot_clk = 0x%02x," %(self.boot_info.boot_clk)) - print("check_image = 0x%02x," %(self.boot_info.check_image)) - print("boot_delay = 0x%02x," %(self.boot_info.boot_delay)) - print("---------------------------------------------------------------") - - with open(output_info_bin, "wb") as f_w: - bin_info_byte = self.boot_info.to_bytes() - for x in bin_info_byte: - f_w.write(x) - return True - - def gen_fw_header_bin(self, header_bin, info_bin): - with open(header_bin, "wb") as f_w: - img_info_byte = self.img_info.to_bytes() - for x in img_info_byte: - f_w.write(x) - for i in range(len(self.img_info.comments)): - f_w.write(self.img_info.comments[i].encode('utf-8')) - if (len(self.img_info.comments) < MaxCommentsLen): - for i in range(MaxCommentsLen - len(self.img_info.comments)): - pad=' '; - f_w.write(str(pad).encode('utf-8')) - for i in range(8): - a = 0 - f_w.write(a.to_bytes(1, byteorder='little', signed=False)) - return True - return False - - def gen_app_fw_bin(self, app_fw_bin, header_bin, ori_app_bin): - ori_app_bin_size = os.path.getsize(ori_app_bin) - - with open(app_fw_bin, "wb") as f_w: - with open(ori_app_bin, "rb") as f_r_1: - temp_buf_1 = f_r_1.read() - f_w.write(temp_buf_1) - if ori_app_bin_size % 16: - for i in range(16 - ori_app_bin_size % 16): - fill_value = 0x00 - f_w.write(fill_value.to_bytes(1, byteorder='little', signed=False)) - - with open(header_bin, "rb") as f_r_2: - temp_buf_3 = f_r_2.read() - f_w.write(temp_buf_3) - -class MainFunc(): - def __init__(self, argc, argv): - self.argc = argc - self.argv = argv - - self.utilityFunc = UtilityFunc() - - def deal_input_cmd(self, opt_mode, input): - if opt_mode == OPT_MODE_GEN: - - out_dir = os.path.dirname(input) - bin_file_name = os.path.basename(input) - tmp = bin_file_name.split('.') - targe_name = "OHOS_Image_BootInfo" - self.opt_gen_param = GenFirmware() - self.opt_gen_param.config_file = CUSTOM_CONFIG - self.opt_gen_param.input_bin = input - self.opt_gen_param.out_dir = out_dir - self.opt_gen_param.app_name = targe_name - return self.opt_gen_param.opt_gen_mode_handler() - - -def main(input = ""): - TIME = time.strftime("%H:%M:%S") - DATE = time.strftime("%d %h %Y") - print("Goodix BLE Tools {} [build time: {}, {}]".format(BleToolVersion, TIME, DATE)) - - mainFunc = MainFunc(0, 0) - opt_mode = OPT_MODE_GEN - - if opt_mode == OPT_MODE_INVALID: - print(tool_usage) - sys.exit(0) - - mainFunc.deal_input_cmd(opt_mode, input) - -def make_bin(input_file = "", output_file = "", list_file=""): - shell_script = '''arm-none-eabi-objcopy -O binary -S {src_file} {dst_file}'''.format(src_file = input_file, dst_file = output_file) - cmd_output = os.system(shell_script) - - main(output_file) - - # shell_script = '''arm-none-eabi-size {src_file} - # arm-none-eabi-objdump -D {src_file} > {list_file}'''.format(src_file = input_file, dst_file = output_file, - # list_file=list_file) - # cmd_output = os.system(shell_script) - - return - -if __name__ == "__main__": - input_file = sys.argv[1] - output_file = sys.argv[2] - list_file = sys.argv[3] - make_bin(input_file, output_file, list_file) From dea2e3de074655823d9706c646d5a219a2b486d8 Mon Sep 17 00:00:00 2001 From: zhaoxingyu Date: Fri, 21 Jun 2024 14:20:20 +0800 Subject: [PATCH 2/4] fix OAT issue Signed-off-by: zhaoxingyu --- .../arch/arm/cortex-m/gcc/startup_gr55xx.s | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s index 2eec798..912decf 100755 --- a/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s +++ b/gr551x/sdk_liteos/gr551x_sdk/platform/arch/arm/cortex-m/gcc/startup_gr55xx.s @@ -1,24 +1,21 @@ /**************************************************************************//** * @file startup_ARMCM4.s * @brief CMSIS Core Device Startup File for - * ARMCM4 Device Series + * GR551x Series * @version V5.00 * @date 02. March 2016 ******************************************************************************/ /* - * Copyright (c) 2009-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. + * Copyright (c) 2024 GOODIX. + * 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 + * 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. + * 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. */ From dc0798e50d7eeb5eed3dd5df2ed81bc81a09ee76 Mon Sep 17 00:00:00 2001 From: zhaoxingyu Date: Fri, 21 Jun 2024 14:44:54 +0800 Subject: [PATCH 3/4] remove unused files Signed-off-by: zhaoxingyu --- .../gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds | 0 .../gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds | 0 .../gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds mode change 100755 => 100644 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds mode change 100755 => 100644 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds old mode 100755 new mode 100644 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds old mode 100755 new mode 100644 diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s old mode 100755 new mode 100644 From f97b794256672e8e2a00554d9ff538e9f9d4fcce Mon Sep 17 00:00:00 2001 From: zhaoxingyu Date: Fri, 21 Jun 2024 14:57:29 +0800 Subject: [PATCH 4/4] remove unused files Signed-off-by: zhaoxingyu --- .../soc/linker/gcc/gcc_linker_gr5513.lds | 116 ----------- .../soc/linker/gcc/gcc_linker_gr5515.lds | 116 ----------- .../platform/soc/linker/gcc/startup_gr55xx.s | 193 ------------------ 3 files changed, 425 deletions(-) delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds delete mode 100644 gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds deleted file mode 100644 index d981917..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5513.lds +++ /dev/null @@ -1,116 +0,0 @@ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x01002000, LENGTH = (0x00800000 -0x00002000) - RAM (rwx) : ORIGIN = 0x30000000 +0x4000, LENGTH = (0x00020000 -0x4000) -} - -GROUP(libgcc.a libc.a libm.a libnosys.a) -ENTRY(Reset_Handler) - -SECTIONS -{ - .text : - { - KEEP(*(.vectors)) - __Vectors_End = .; - __Vectors_Size = __Vectors_End - __Vectors; - __end__ = .; - . = ALIGN(0x200); - KEEP(*(.app_info)) - *( .text*) - KEEP(*(.init)) - KEEP(*(.fini)) - *crtbegin.o(.ctors) - *crtbegin?.o(.ctors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) - *(SORT(.ctors.*)) - *(.ctors) - *crtbegin.o(.dtors) - *crtbegin?.o(.dtors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) - *(SORT(.dtors.*)) - *(.dtors) - *(.rodata*) - KEEP(*(.eh_frame*)) - } > FLASH - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > FLASH - - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > FLASH - - __exidx_end = .; - __etext = .; - - .data : AT (__etext) - { - __data_start__ = .; - *(vtable) - *(.data*) - *(.ramfunc) - *(RAM_CODE) - *(TINY_RAM_SPACE) - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; - } > RAM - - .my_section : - { - . = ALIGN(32); - *(FPB*) - } > RAM - - .bss : - { - . = ALIGN(4); - __bss_start__ = .; - *(.bss*) - *(COMMON) - . = ALIGN(4); - __bss_end__ = .; - } > RAM - - .heap (COPY): - { - __HeapBase = .; - __end__ = .; - end = __end__; - KEEP(*(.heap*)) - __HeapLimit = .; - } > RAM - - .stack_dummy (COPY): - { - KEEP(*(.stack*)) - } > RAM - - __StackTop = ORIGIN(RAM) + LENGTH(RAM); - __StackLimit = __StackTop - SIZEOF(.stack_dummy); - - __sstack = __StackLimit; - __estack = __StackTop; - - PROVIDE(__stack = __StackTop); - ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") -} diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds deleted file mode 100644 index 60a2a07..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/gcc_linker_gr5515.lds +++ /dev/null @@ -1,116 +0,0 @@ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x01002000, LENGTH = (0x00800000 -0x00002000) - RAM (rwx) : ORIGIN = 0x30000000 +0x4000, LENGTH = (0x00040000 -0x4000) -} - -GROUP(libgcc.a libc.a libm.a libnosys.a) -ENTRY(Reset_Handler) - -SECTIONS -{ - .text : - { - KEEP(*(.vectors)) - __Vectors_End = .; - __Vectors_Size = __Vectors_End - __Vectors; - __end__ = .; - . = ALIGN(0x200); - KEEP(*(.app_info)) - *( .text*) - KEEP(*(.init)) - KEEP(*(.fini)) - *crtbegin.o(.ctors) - *crtbegin?.o(.ctors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) - *(SORT(.ctors.*)) - *(.ctors) - *crtbegin.o(.dtors) - *crtbegin?.o(.dtors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) - *(SORT(.dtors.*)) - *(.dtors) - *(.rodata*) - KEEP(*(.eh_frame*)) - } > FLASH - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > FLASH - - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > FLASH - - __exidx_end = .; - __etext = .; - - .data : AT (__etext) - { - __data_start__ = .; - *(vtable) - *(.data*) - *(.ramfunc) - *(RAM_CODE) - *(TINY_RAM_SPACE) - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - KEEP(*(.jcr*)) - . = ALIGN(4); - __data_end__ = .; - } > RAM - - .my_section : - { - . = ALIGN(32); - *(FPB*) - } > RAM - - .bss : - { - . = ALIGN(4); - __bss_start__ = .; - *(.bss*) - *(COMMON) - . = ALIGN(4); - __bss_end__ = .; - } > RAM - - .heap (COPY): - { - __HeapBase = .; - __end__ = .; - end = __end__; - KEEP(*(.heap*)) - __HeapLimit = .; - } > RAM - - .stack_dummy (COPY): - { - KEEP(*(.stack*)) - } > RAM - - __StackTop = ORIGIN(RAM) + LENGTH(RAM); - __StackLimit = __StackTop - SIZEOF(.stack_dummy); - - __sstack = __StackLimit; - __estack = __StackTop; - - PROVIDE(__stack = __StackTop); - ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") -} diff --git a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s b/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s deleted file mode 100644 index b32864d..0000000 --- a/gr551x/sdk_liteos/gr551x_sdk/platform/soc/linker/gcc/startup_gr55xx.s +++ /dev/null @@ -1,193 +0,0 @@ -/**************************************************************************//** - * @file startup_ARMCM4.s - * @brief CMSIS Core Device Startup File for - * ARMCM4 Device Series - * @version V5.00 - * @date 02. March 2016 - ******************************************************************************/ -/* - * Copyright (c) 2009-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 - * - * 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. - */ - - .syntax unified - .arch armv7-m - - .section .stack - .align 3 -//#ifdef __STACK_SIZE -// .equ Stack_Size, __STACK_SIZE -//#else - .equ Stack_Size, 0x00004000 -//#endif - .globl __StackTop - .globl __StackLimit -__StackLimit: - .space Stack_Size - .size __StackLimit, . - __StackLimit -__StackTop: - .size __StackTop, . - __StackTop - - .section .heap - .align 3 -#ifdef __HEAP_SIZE - .equ Heap_Size, __HEAP_SIZE -#else - .equ Heap_Size, 0x00000100 -#endif - .globl __HeapBase - .globl __HeapLimit -__HeapBase: - .if Heap_Size - .space Heap_Size - .endif - .size __HeapBase, . - __HeapBase -__HeapLimit: - .size __HeapLimit, . - __HeapLimit - - .section .vectors - .align 2 - .globl __Vectors -__Vectors: - .long __StackTop /* Top of Stack */ - .long Reset_Handler /* Reset Handler */ - .long NMI_Handler /* NMI Handler */ - .long HardFault_Handler /* Hard Fault Handler */ - .long MemManage_Handler /* MPU Fault Handler */ - .long BusFault_Handler /* Bus Fault Handler */ - .long UsageFault_Handler /* Usage Fault Handler */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long SVC_Handler /* SVCall Handler */ - .long DebugMon_Handler /* Debug Monitor Handler */ - .long 0 /* Reserved */ - .long PendSV_Handler /* PendSV Handler */ - .long SysTick_Handler /* SysTick Handler */ - - /* External interrupts */ - .long WDT_IRQHandler /* 0: Watchdog Timer */ - .long BLE_SDK_Handler /* 1: Reserved */ - .long BLE_IRQHandler /* 2: BLE */ - .long DMA_IRQHandler /* 3: DMA */ - .long SPI_M_IRQHandler /* 4: SPI_M */ - .long SPI_S_IRQHandler /* 5: SPI_S */ - .long EXT0_IRQHandler /* 6: GPIO0 */ - .long EXT1_IRQHandler /* 7: GPIO1 */ - .long TIMER0_IRQHandler /* 8: TIMER0 */ - .long TIMER1_IRQHandler /* 9: TIMER1 */ - .long DUAL_TIMER_IRQHandler /* 10: DUAL_TIMER0/DUAL_TIMER1 */ - .long QSPI0_IRQHandler /* 11: QSPI0 */ - .long UART0_IRQHandler /* 12: UART0 */ - .long UART1_IRQHandler /* 13: UART1 */ - .long I2C0_IRQHandler /* 14: I2C0 */ - .long I2C1_IRQHandler /* 15: I2C1 */ - .long AES_IRQHandler /* 16: AES */ - .long HMAC_IRQHandler /* 17: HMAC */ - .long EXT2_IRQHandler /* 18: GPIO2 */ - .long RNG_IRQHandler /* 19: TRNG Interrupt */ - .long PMU_IRQHandler /* 20: PMU */ - .long PKC_IRQHandler /* 21: PKC */ - .long XQSPI_IRQHandler /* 22: XQSPI */ - .long QSPI1_IRQHandler /* 23: QSPI1 */ - .long PWR_CMD_IRQHandler /* 24: PWR_CMD */ - .long BLESLP_IRQHandler /* 25: BLE Sleep */ - .long SLPTIMER_IRQHandler /* 26: Sleep Timer */ - .long COMP_IRQHandler /* 27: COMP Wakeup */ - .long AON_WDT_IRQHandler /* 28: AON_WDT */ - .long I2S_M_IRQHandler /* 29: I2S_M */ - .long I2S_S_IRQHandler /* 30: I2S_S */ - .long ISO7816_IRQHandler /* 31: ISO7816 */ - .long PRESENT_IRQHandler /* 32: PRESENT */ - .long CALENDAR_IRQHandler /* 33: CALENDAR */ - - .size __Vectors, . - __Vectors - - .text - .thumb - .thumb_func - .align 2 - .globl Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - - bl SystemInit - - bl main_init - - .pool - .size Reset_Handler, . - Reset_Handler - - .align 1 - .thumb_func - .weak Default_Handler - .type Default_Handler, %function -Default_Handler: - b . - .size Default_Handler, . - Default_Handler - -/* Macro to define default handlers. Default handler - * will be weak symbol and just dead loops. They can be - * overwritten by other handlers */ - .macro def_irq_handler handler_name - .weak \handler_name - .set \handler_name, Default_Handler - .endm - - def_irq_handler NMI_Handler - def_irq_handler HardFault_Handler - def_irq_handler MemManage_Handler - def_irq_handler BusFault_Handler - def_irq_handler UsageFault_Handler - def_irq_handler SVC_Handler - def_irq_handler DebugMon_Handler - def_irq_handler PendSV_Handler - def_irq_handler SysTick_Handler - - def_irq_handler WDT_IRQHandler - def_irq_handler DMA_IRQHandler - def_irq_handler SPI_M_IRQHandler - def_irq_handler SPI_S_IRQHandler - def_irq_handler EXT0_IRQHandler - def_irq_handler EXT1_IRQHandler - def_irq_handler TIMER0_IRQHandler - def_irq_handler TIMER1_IRQHandler - def_irq_handler DUAL_TIMER_IRQHandler - def_irq_handler QSPI0_IRQHandler - def_irq_handler UART0_IRQHandler - def_irq_handler UART1_IRQHandler - def_irq_handler I2C0_IRQHandler - def_irq_handler I2C1_IRQHandler - def_irq_handler AES_IRQHandler - def_irq_handler HMAC_IRQHandler - def_irq_handler EXT2_IRQHandler - def_irq_handler RNG_IRQHandler - def_irq_handler PMU_IRQHandler - def_irq_handler PKC_IRQHandler - def_irq_handler XQSPI_IRQHandler - def_irq_handler QSPI1_IRQHandler - def_irq_handler PWR_CMD_IRQHandler - def_irq_handler SLPTIMER_IRQHandler - def_irq_handler COMP_IRQHandler - def_irq_handler AON_WDT_IRQHandler - def_irq_handler I2S_M_IRQHandler - def_irq_handler I2S_S_IRQHandler - def_irq_handler ISO7816_IRQHandler - def_irq_handler PRESENT_IRQHandler - def_irq_handler CALENDAR_IRQHandler - - .end

  • XsV-)wp1P(I7V);%zZ9{1{xW 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%0DB2d+?&NwXH-Y`p0vA+`o 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