API HAL: takeover i2c initialization and abstraction. Update I2C drivers to match new api. Back port API HAL to bootloader and enable light support for F5. (#356)
Co-authored-by: coreglitch <mail@s3f.ru>
This commit is contained in:
		
							
								
								
									
										85
									
								
								bootloader/targets/f5/api-hal/api-hal-i2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								bootloader/targets/f5/api-hal/api-hal-i2c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| #include <api-hal-i2c.h> | ||||
|  | ||||
| #include <stm32wbxx_ll_bus.h> | ||||
| #include <stm32wbxx_ll_i2c.h> | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
|  | ||||
| void api_hal_i2c_init() { | ||||
|     LL_I2C_InitTypeDef I2C_InitStruct = {0}; | ||||
|     LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|  | ||||
|     LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); | ||||
|  | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|     GPIO_InitStruct.Pin = I2C_SCL_Pin | I2C_SDA_Pin; | ||||
|     GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; | ||||
|     GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; | ||||
|     GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; | ||||
|     GPIO_InitStruct.Alternate = LL_GPIO_AF_4; | ||||
|     LL_GPIO_Init(GPIOA, &GPIO_InitStruct); | ||||
|  | ||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|  | ||||
|     I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; | ||||
|     I2C_InitStruct.Timing = 0x10707DBC; | ||||
|     I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; | ||||
|     I2C_InitStruct.DigitalFilter = 0; | ||||
|     I2C_InitStruct.OwnAddress1 = 0; | ||||
|     I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; | ||||
|     I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; | ||||
|     LL_I2C_Init(I2C1, &I2C_InitStruct); | ||||
|     LL_I2C_EnableAutoEndMode(I2C1); | ||||
|     LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); | ||||
|     LL_I2C_DisableOwnAddress2(I2C1); | ||||
|     LL_I2C_DisableGeneralCall(I2C1); | ||||
|     LL_I2C_EnableClockStretching(I2C1); | ||||
| } | ||||
|  | ||||
| void api_hal_i2c_tx(I2C_TypeDef* instance, uint8_t address, const uint8_t* data, uint8_t size) { | ||||
|     LL_I2C_HandleTransfer( | ||||
|         instance, | ||||
|         address, | ||||
|         LL_I2C_ADDRSLAVE_7BIT, | ||||
|         size, | ||||
|         LL_I2C_MODE_AUTOEND, | ||||
|         LL_I2C_GENERATE_START_WRITE); | ||||
|  | ||||
|     while(!LL_I2C_IsActiveFlag_STOP(instance)) { | ||||
|         if(LL_I2C_IsActiveFlag_TXIS(instance)) { | ||||
|             LL_I2C_TransmitData8(instance, (*data++)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     LL_I2C_ClearFlag_STOP(instance); | ||||
| } | ||||
|  | ||||
| void api_hal_i2c_rx(I2C_TypeDef* instance, uint8_t address, uint8_t* data, uint8_t size) { | ||||
|     LL_I2C_HandleTransfer( | ||||
|         instance, | ||||
|         address, | ||||
|         LL_I2C_ADDRSLAVE_7BIT, | ||||
|         size, | ||||
|         LL_I2C_MODE_AUTOEND, | ||||
|         LL_I2C_GENERATE_START_READ); | ||||
|  | ||||
|     while(!LL_I2C_IsActiveFlag_STOP(instance)) { | ||||
|         if(LL_I2C_IsActiveFlag_RXNE(instance)) { | ||||
|             *data++ = LL_I2C_ReceiveData8(instance); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     LL_I2C_ClearFlag_STOP(instance); | ||||
| } | ||||
|  | ||||
| void api_hal_i2c_trx( | ||||
|     I2C_TypeDef* instance, | ||||
|     uint8_t address, | ||||
|     const uint8_t* tx_data, | ||||
|     uint8_t tx_size, | ||||
|     uint8_t* rx_data, | ||||
|     uint8_t rx_size) { | ||||
|     api_hal_i2c_tx(instance, address, tx_data, tx_size); | ||||
|     api_hal_i2c_rx(instance, address, rx_data, rx_size); | ||||
| } | ||||
							
								
								
									
										40
									
								
								bootloader/targets/f5/api-hal/api-hal-i2c.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								bootloader/targets/f5/api-hal/api-hal-i2c.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <api-hal-resources.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| void api_hal_i2c_init(); | ||||
|  | ||||
| void api_hal_i2c_tx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     const uint8_t size); | ||||
|  | ||||
| void api_hal_i2c_rx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     uint8_t* data, | ||||
|     const uint8_t size); | ||||
|  | ||||
| void api_hal_i2c_trx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* tx_data, | ||||
|     const uint8_t tx_size, | ||||
|     uint8_t* rx_data, | ||||
|     const uint8_t rx_size); | ||||
|  | ||||
| #define with_api_hal_i2c(type, pointer, function_body)        \ | ||||
|     {                                                         \ | ||||
|         *pointer = ({ type __fn__ function_body __fn__; })(); \ | ||||
|     } | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										43
									
								
								bootloader/targets/f5/api-hal/api-hal-light.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								bootloader/targets/f5/api-hal/api-hal-light.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| #include <api-hal-light.h> | ||||
| #include <lp5562.h> | ||||
|  | ||||
| #define LED_CURRENT_RED 50 | ||||
| #define LED_CURRENT_GREEN 50 | ||||
| #define LED_CURRENT_BLUE 50 | ||||
| #define LED_CURRENT_WHITE 150 | ||||
|  | ||||
| void api_hal_light_init() { | ||||
|     lp5562_reset(); | ||||
|  | ||||
|     lp5562_set_channel_current(LP5562ChannelRed, LED_CURRENT_RED); | ||||
|     lp5562_set_channel_current(LP5562ChannelGreen, LED_CURRENT_GREEN); | ||||
|     lp5562_set_channel_current(LP5562ChannelBlue, LED_CURRENT_BLUE); | ||||
|     lp5562_set_channel_current(LP5562ChannelWhite, LED_CURRENT_WHITE); | ||||
|  | ||||
|     lp5562_set_channel_value(LP5562ChannelRed, 0x00); | ||||
|     lp5562_set_channel_value(LP5562ChannelGreen, 0x00); | ||||
|     lp5562_set_channel_value(LP5562ChannelBlue, 0x00); | ||||
|     lp5562_set_channel_value(LP5562ChannelWhite, 0x00); | ||||
|  | ||||
|     lp5562_enable(); | ||||
|     lp5562_configure(); | ||||
| } | ||||
|  | ||||
| void api_hal_light_set(Light light, uint8_t value) { | ||||
|     switch(light) { | ||||
|     case LightRed: | ||||
|         lp5562_set_channel_value(LP5562ChannelRed, value); | ||||
|         break; | ||||
|     case LightGreen: | ||||
|         lp5562_set_channel_value(LP5562ChannelGreen, value); | ||||
|         break; | ||||
|     case LightBlue: | ||||
|         lp5562_set_channel_value(LP5562ChannelBlue, value); | ||||
|         break; | ||||
|     case LightBacklight: | ||||
|         lp5562_set_channel_value(LP5562ChannelWhite, value); | ||||
|         break; | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										17
									
								
								bootloader/targets/f5/api-hal/api-hal-light.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								bootloader/targets/f5/api-hal/api-hal-light.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <api-hal-resources.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| void api_hal_light_init(); | ||||
|  | ||||
| void api_hal_light_set(Light light, uint8_t value); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										37
									
								
								bootloader/targets/f5/api-hal/api-hal-resources.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								bootloader/targets/f5/api-hal/api-hal-resources.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define I2C_SCL_Pin LL_GPIO_PIN_9 | ||||
| #define I2C_SCL_GPIO_Port GPIOA | ||||
| #define I2C_SDA_Pin LL_GPIO_PIN_10 | ||||
| #define I2C_SDA_GPIO_Port GPIOA | ||||
|  | ||||
| #define POWER_I2C I2C1 | ||||
|  | ||||
| /* Input Keys */ | ||||
| typedef enum { | ||||
|     InputKeyUp, | ||||
|     InputKeyDown, | ||||
|     InputKeyRight, | ||||
|     InputKeyLeft, | ||||
|     InputKeyOk, | ||||
|     InputKeyBack, | ||||
| } InputKey; | ||||
|  | ||||
| /* Light */ | ||||
| typedef enum { | ||||
|     LightRed, | ||||
|     LightGreen, | ||||
|     LightBlue, | ||||
|     LightBacklight, | ||||
| } Light; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										6
									
								
								bootloader/targets/f5/api-hal/api-hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								bootloader/targets/f5/api-hal/api-hal.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #include <api-hal.h> | ||||
|  | ||||
| void api_hal_init() { | ||||
|     api_hal_i2c_init(); | ||||
|     api_hal_light_init(); | ||||
| } | ||||
							
								
								
									
										6
									
								
								bootloader/targets/f5/api-hal/api-hal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								bootloader/targets/f5/api-hal/api-hal.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <api-hal-i2c.h> | ||||
| #include <api-hal-light.h> | ||||
|  | ||||
| void api_hal_init(); | ||||
| @@ -9,6 +9,8 @@ | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_hal_flash.h> | ||||
|  | ||||
| #include <api-hal.h> | ||||
|  | ||||
| // Boot request enum | ||||
| #define BOOT_REQUEST_NONE 0x00000000 | ||||
| #define BOOT_REQUEST_DFU 0xDF00B000 | ||||
| @@ -21,45 +23,33 @@ | ||||
| #define BOOT_USB_DP_PIN LL_GPIO_PIN_12 | ||||
| #define BOOT_USB_PIN (BOOT_USB_DM_PIN | BOOT_USB_DP_PIN) | ||||
|  | ||||
| void target_led_set_red(uint8_t value) { | ||||
| } | ||||
|  | ||||
| void target_led_set_green(uint8_t value) { | ||||
| } | ||||
|  | ||||
| void target_led_set_blue(uint8_t value) { | ||||
| } | ||||
|  | ||||
| void target_led_set_backlight(uint8_t value) { | ||||
| } | ||||
|  | ||||
| void target_led_control(char* c) { | ||||
|     target_led_set_red(0x00); | ||||
|     target_led_set_green(0x00); | ||||
|     target_led_set_blue(0x00); | ||||
|     api_hal_light_set(LightRed, 0x00); | ||||
|     api_hal_light_set(LightGreen, 0x00); | ||||
|     api_hal_light_set(LightBlue, 0x00); | ||||
|     do { | ||||
|         if(*c == 'R') { | ||||
|             target_led_set_red(0xFF); | ||||
|             api_hal_light_set(LightRed, 0xFF); | ||||
|         } else if(*c == 'G') { | ||||
|             target_led_set_green(0xFF); | ||||
|             api_hal_light_set(LightGreen, 0xFF); | ||||
|         } else if(*c == 'B') { | ||||
|             target_led_set_blue(0xFF); | ||||
|             api_hal_light_set(LightBlue, 0xFF); | ||||
|         } else if(*c == '.') { | ||||
|             LL_mDelay(125); | ||||
|             target_led_set_red(0x00); | ||||
|             target_led_set_green(0x00); | ||||
|             target_led_set_blue(0x00); | ||||
|             api_hal_light_set(LightRed, 0x00); | ||||
|             api_hal_light_set(LightGreen, 0x00); | ||||
|             api_hal_light_set(LightBlue, 0x00); | ||||
|             LL_mDelay(125); | ||||
|         } else if(*c == '-') { | ||||
|             LL_mDelay(250); | ||||
|             target_led_set_red(0x00); | ||||
|             target_led_set_green(0x00); | ||||
|             target_led_set_blue(0x00); | ||||
|             api_hal_light_set(LightRed, 0x00); | ||||
|             api_hal_light_set(LightGreen, 0x00); | ||||
|             api_hal_light_set(LightBlue, 0x00); | ||||
|             LL_mDelay(250); | ||||
|         } else if(*c == '|') { | ||||
|             target_led_set_red(0x00); | ||||
|             target_led_set_green(0x00); | ||||
|             target_led_set_blue(0x00); | ||||
|             api_hal_light_set(LightRed, 0x00); | ||||
|             api_hal_light_set(LightGreen, 0x00); | ||||
|             api_hal_light_set(LightBlue, 0x00); | ||||
|         } | ||||
|         c++; | ||||
|     } while(*c != 0); | ||||
| @@ -73,6 +63,7 @@ void clock_init() { | ||||
| void gpio_init() { | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); | ||||
|     // USB D+ | ||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_MODE_OUTPUT); | ||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); | ||||
| @@ -122,6 +113,8 @@ void usb_wire_reset() { | ||||
| void target_init() { | ||||
|     clock_init(); | ||||
|     gpio_init(); | ||||
|     api_hal_init(); | ||||
|     target_led_control("RGB"); | ||||
|     rtc_init(); | ||||
|     usb_wire_reset(); | ||||
|  | ||||
|   | ||||
| @@ -14,9 +14,13 @@ LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs | ||||
|  | ||||
| CUBE_DIR		= ../lib/STM32CubeWB | ||||
|  | ||||
| # ST HAL | ||||
| CFLAGS			+=  -DUSE_FULL_LL_DRIVER | ||||
| ASM_SOURCES		+= $(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Source/Templates/gcc/startup_stm32wb55xx_cm4.s | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Source/Templates/system_stm32wbxx.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_utils.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_gpio.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_i2c.c | ||||
|  | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Include | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Include | ||||
| @@ -24,6 +28,16 @@ CFLAGS			+= -I$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Inc | ||||
|  | ||||
| LDFLAGS			+= -T$(TARGET_DIR)/stm32wb55xx_flash_cm4.ld | ||||
|  | ||||
| # Drivers | ||||
| DRIVERS_DIR		= ../lib/drivers | ||||
| CFLAGS			+= -I$(DRIVERS_DIR) | ||||
| C_SOURCES		+= $(wildcard $(DRIVERS_DIR)/*.c) | ||||
|  | ||||
| # API-HAL | ||||
| CFLAGS			+= -I$(TARGET_DIR)/api-hal | ||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/api-hal/*.c) | ||||
|  | ||||
|  | ||||
| ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) | ||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | ||||
| CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user