[FL-1196] Targets: add F6 (#427)
* Targets: add F6 * F6: Update linker script for use with internal storage * F6: synchronize with F5, add all changes arriving in V9 board, update cube project. Github workflow: add multi-target build, add F6 to build targets. * CI: fix full assembly * CI: better artifact naming scheme * CI: fix artifacts wildcard * F6: Swap C10 - A15, vibro and sdcard detect pins
This commit is contained in:
		
							
								
								
									
										137
									
								
								bootloader/targets/f6/api-hal/api-hal-i2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								bootloader/targets/f6/api-hal/api-hal-i2c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| #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> | ||||
| #include <stm32wbxx_ll_cortex.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 = POWER_I2C_SCL_Pin | POWER_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 = POWER_I2C_TIMINGS; | ||||
|     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); | ||||
| } | ||||
|  | ||||
| bool api_hal_i2c_tx( | ||||
|     I2C_TypeDef* instance, | ||||
|     uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     uint8_t size, | ||||
|     uint32_t timeout) { | ||||
|     uint32_t time_left = timeout; | ||||
|     bool ret = true; | ||||
|  | ||||
|     while(LL_I2C_IsActiveFlag_BUSY(instance)) | ||||
|         ; | ||||
|  | ||||
|     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) || size > 0) { | ||||
|         if(LL_I2C_IsActiveFlag_TXIS(instance)) { | ||||
|             LL_I2C_TransmitData8(instance, (*data)); | ||||
|             data++; | ||||
|             size--; | ||||
|             time_left = timeout; | ||||
|         } | ||||
|  | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             if(--time_left == 0) { | ||||
|                 ret = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     LL_I2C_ClearFlag_STOP(instance); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| bool api_hal_i2c_rx( | ||||
|     I2C_TypeDef* instance, | ||||
|     uint8_t address, | ||||
|     uint8_t* data, | ||||
|     uint8_t size, | ||||
|     uint32_t timeout) { | ||||
|     uint32_t time_left = timeout; | ||||
|     bool ret = true; | ||||
|  | ||||
|     while(LL_I2C_IsActiveFlag_BUSY(instance)) | ||||
|         ; | ||||
|  | ||||
|     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) || size > 0) { | ||||
|         if(LL_I2C_IsActiveFlag_RXNE(instance)) { | ||||
|             *data = LL_I2C_ReceiveData8(instance); | ||||
|             data++; | ||||
|             size--; | ||||
|             time_left = timeout; | ||||
|         } | ||||
|  | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             if(--time_left == 0) { | ||||
|                 ret = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     LL_I2C_ClearFlag_STOP(instance); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| bool 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, | ||||
|     uint32_t timeout) { | ||||
|     if(api_hal_i2c_tx(instance, address, tx_data, tx_size, timeout) && | ||||
|        api_hal_i2c_rx(instance, address, rx_data, rx_size, timeout)) { | ||||
|         return true; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								bootloader/targets/f6/api-hal/api-hal-i2c.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								bootloader/targets/f6/api-hal/api-hal-i2c.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <api-hal-resources.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| void api_hal_i2c_init(); | ||||
|  | ||||
| bool api_hal_i2c_tx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     const uint8_t size, | ||||
|     uint32_t timeout); | ||||
|  | ||||
| bool api_hal_i2c_rx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     uint8_t* data, | ||||
|     const uint8_t size, | ||||
|     uint32_t timeout); | ||||
|  | ||||
| bool 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, | ||||
|     uint32_t timeout); | ||||
|  | ||||
| #define with_api_hal_i2c(type, pointer, function_body)        \ | ||||
|     {                                                         \ | ||||
|         *pointer = ({ type __fn__ function_body __fn__; })(); \ | ||||
|     } | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										43
									
								
								bootloader/targets/f6/api-hal/api-hal-light.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								bootloader/targets/f6/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/f6/api-hal/api-hal-light.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								bootloader/targets/f6/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 | ||||
							
								
								
									
										42
									
								
								bootloader/targets/f6/api-hal/api-hal-resources.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								bootloader/targets/f6/api-hal/api-hal-resources.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define POWER_I2C_SCL_Pin LL_GPIO_PIN_9 | ||||
| #define POWER_I2C_SCL_GPIO_Port GPIOA | ||||
| #define POWER_I2C_SDA_Pin LL_GPIO_PIN_10 | ||||
| #define POWER_I2C_SDA_GPIO_Port GPIOA | ||||
|  | ||||
| #define POWER_I2C I2C1 | ||||
| /* Timing register value is computed with the STM32CubeMX Tool, | ||||
|   * Fast Mode @100kHz with I2CCLK = 64 MHz, | ||||
|   * rise time = 0ns, fall time = 0ns | ||||
|   */ | ||||
| #define POWER_I2C_TIMINGS 0x10707DBC | ||||
|  | ||||
| /* 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/f6/api-hal/api-hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								bootloader/targets/f6/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/f6/api-hal/api-hal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								bootloader/targets/f6/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(); | ||||
		Reference in New Issue
	
	Block a user