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:
		
							parent
							
								
									056e6ffa9c
								
							
						
					
					
						commit
						38011e88f3
					
				
							
								
								
									
										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_ll_gpio.h> | ||||||
| #include <stm32wbxx_hal_flash.h> | #include <stm32wbxx_hal_flash.h> | ||||||
| 
 | 
 | ||||||
|  | #include <api-hal.h> | ||||||
|  | 
 | ||||||
| // Boot request enum
 | // Boot request enum
 | ||||||
| #define BOOT_REQUEST_NONE 0x00000000 | #define BOOT_REQUEST_NONE 0x00000000 | ||||||
| #define BOOT_REQUEST_DFU 0xDF00B000 | #define BOOT_REQUEST_DFU 0xDF00B000 | ||||||
| @ -21,45 +23,33 @@ | |||||||
| #define BOOT_USB_DP_PIN LL_GPIO_PIN_12 | #define BOOT_USB_DP_PIN LL_GPIO_PIN_12 | ||||||
| #define BOOT_USB_PIN (BOOT_USB_DM_PIN | BOOT_USB_DP_PIN) | #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) { | void target_led_control(char* c) { | ||||||
|     target_led_set_red(0x00); |     api_hal_light_set(LightRed, 0x00); | ||||||
|     target_led_set_green(0x00); |     api_hal_light_set(LightGreen, 0x00); | ||||||
|     target_led_set_blue(0x00); |     api_hal_light_set(LightBlue, 0x00); | ||||||
|     do { |     do { | ||||||
|         if(*c == 'R') { |         if(*c == 'R') { | ||||||
|             target_led_set_red(0xFF); |             api_hal_light_set(LightRed, 0xFF); | ||||||
|         } else if(*c == 'G') { |         } else if(*c == 'G') { | ||||||
|             target_led_set_green(0xFF); |             api_hal_light_set(LightGreen, 0xFF); | ||||||
|         } else if(*c == 'B') { |         } else if(*c == 'B') { | ||||||
|             target_led_set_blue(0xFF); |             api_hal_light_set(LightBlue, 0xFF); | ||||||
|         } else if(*c == '.') { |         } else if(*c == '.') { | ||||||
|             LL_mDelay(125); |             LL_mDelay(125); | ||||||
|             target_led_set_red(0x00); |             api_hal_light_set(LightRed, 0x00); | ||||||
|             target_led_set_green(0x00); |             api_hal_light_set(LightGreen, 0x00); | ||||||
|             target_led_set_blue(0x00); |             api_hal_light_set(LightBlue, 0x00); | ||||||
|             LL_mDelay(125); |             LL_mDelay(125); | ||||||
|         } else if(*c == '-') { |         } else if(*c == '-') { | ||||||
|             LL_mDelay(250); |             LL_mDelay(250); | ||||||
|             target_led_set_red(0x00); |             api_hal_light_set(LightRed, 0x00); | ||||||
|             target_led_set_green(0x00); |             api_hal_light_set(LightGreen, 0x00); | ||||||
|             target_led_set_blue(0x00); |             api_hal_light_set(LightBlue, 0x00); | ||||||
|             LL_mDelay(250); |             LL_mDelay(250); | ||||||
|         } else if(*c == '|') { |         } else if(*c == '|') { | ||||||
|             target_led_set_red(0x00); |             api_hal_light_set(LightRed, 0x00); | ||||||
|             target_led_set_green(0x00); |             api_hal_light_set(LightGreen, 0x00); | ||||||
|             target_led_set_blue(0x00); |             api_hal_light_set(LightBlue, 0x00); | ||||||
|         } |         } | ||||||
|         c++; |         c++; | ||||||
|     } while(*c != 0); |     } while(*c != 0); | ||||||
| @ -73,6 +63,7 @@ void clock_init() { | |||||||
| void gpio_init() { | void gpio_init() { | ||||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); |     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_GPIOB); | ||||||
|  |     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); | ||||||
|     // USB D+
 |     // USB D+
 | ||||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_MODE_OUTPUT); |     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); |     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() { | void target_init() { | ||||||
|     clock_init(); |     clock_init(); | ||||||
|     gpio_init(); |     gpio_init(); | ||||||
|  |     api_hal_init(); | ||||||
|  |     target_led_control("RGB"); | ||||||
|     rtc_init(); |     rtc_init(); | ||||||
|     usb_wire_reset(); |     usb_wire_reset(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,9 +14,13 @@ LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs | |||||||
| 
 | 
 | ||||||
| CUBE_DIR		= ../lib/STM32CubeWB | 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 | 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/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_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/Include | ||||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/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 | 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) | ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) | ||||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | ||||||
| CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <i2c.h> | #include <api-hal-resources.h> | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| @ -10,6 +10,16 @@ extern "C" { | |||||||
| 
 | 
 | ||||||
| void api_hal_i2c_init(); | 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 | ||||||
|  | ); | ||||||
|  | 
 | ||||||
| void api_hal_i2c_lock(); | void api_hal_i2c_lock(); | ||||||
| 
 | 
 | ||||||
| void api_hal_i2c_unlock(); | void api_hal_i2c_unlock(); | ||||||
|  | |||||||
| @ -1,54 +0,0 @@ | |||||||
| /**
 |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @file    i2c.h |  | ||||||
|   * @brief   This file contains all the function prototypes for |  | ||||||
|   *          the i2c.c file |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @attention |  | ||||||
|   * |  | ||||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. |  | ||||||
|   * All rights reserved.</center></h2> |  | ||||||
|   * |  | ||||||
|   * This software component is licensed by ST under Ultimate Liberty license |  | ||||||
|   * SLA0044, the "License"; You may not use this file except in compliance with |  | ||||||
|   * the License. You may obtain a copy of the License at: |  | ||||||
|   *                             www.st.com/SLA0044 |  | ||||||
|   * |  | ||||||
|   ****************************************************************************** |  | ||||||
|   */ |  | ||||||
| /* Define to prevent recursive inclusion -------------------------------------*/ |  | ||||||
| #ifndef __I2C_H__ |  | ||||||
| #define __I2C_H__ |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /* Includes ------------------------------------------------------------------*/ |  | ||||||
| #include "main.h" |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN Includes */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END Includes */ |  | ||||||
| 
 |  | ||||||
| extern I2C_HandleTypeDef hi2c1; |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN Private defines */ |  | ||||||
| 
 |  | ||||||
| #define POWER_I2C hi2c1 |  | ||||||
| 
 |  | ||||||
| /* USER CODE END Private defines */ |  | ||||||
| 
 |  | ||||||
| void MX_I2C1_Init(void); |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN Prototypes */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END Prototypes */ |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #endif /* __I2C_H__ */ |  | ||||||
| 
 |  | ||||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |  | ||||||
| @ -97,8 +97,6 @@ void Error_Handler(void); | |||||||
| #define RFID_PULL_Pin GPIO_PIN_8 | #define RFID_PULL_Pin GPIO_PIN_8 | ||||||
| #define RFID_PULL_GPIO_Port GPIOA | #define RFID_PULL_GPIO_Port GPIOA | ||||||
| #define RFID_PULL_EXTI_IRQn EXTI9_5_IRQn | #define RFID_PULL_EXTI_IRQn EXTI9_5_IRQn | ||||||
| #define I2C_SCL_Pin GPIO_PIN_9 |  | ||||||
| #define I2C_SCL_GPIO_Port GPIOA |  | ||||||
| #define CC1101_G0_Pin GPIO_PIN_4 | #define CC1101_G0_Pin GPIO_PIN_4 | ||||||
| #define CC1101_G0_GPIO_Port GPIOC | #define CC1101_G0_GPIO_Port GPIOC | ||||||
| #define RFID_RF_IN_Pin GPIO_PIN_5 | #define RFID_RF_IN_Pin GPIO_PIN_5 | ||||||
| @ -129,8 +127,6 @@ void Error_Handler(void); | |||||||
| #define SPI_D_MOSI_GPIO_Port GPIOB | #define SPI_D_MOSI_GPIO_Port GPIOB | ||||||
| #define DISPLAY_DI_Pin GPIO_PIN_6 | #define DISPLAY_DI_Pin GPIO_PIN_6 | ||||||
| #define DISPLAY_DI_GPIO_Port GPIOC | #define DISPLAY_DI_GPIO_Port GPIOC | ||||||
| #define I2C_SDA_Pin GPIO_PIN_10 |  | ||||||
| #define I2C_SDA_GPIO_Port GPIOA |  | ||||||
| #define DISPLAY_BACKLIGHT_Pin GPIO_PIN_15 | #define DISPLAY_BACKLIGHT_Pin GPIO_PIN_15 | ||||||
| #define DISPLAY_BACKLIGHT_GPIO_Port GPIOA | #define DISPLAY_BACKLIGHT_GPIO_Port GPIOA | ||||||
| #define PC10_Pin GPIO_PIN_10 | #define PC10_Pin GPIO_PIN_10 | ||||||
|  | |||||||
| @ -1,120 +0,0 @@ | |||||||
| /**
 |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @file    i2c.c |  | ||||||
|   * @brief   This file provides code for the configuration |  | ||||||
|   *          of the I2C instances. |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @attention |  | ||||||
|   * |  | ||||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. |  | ||||||
|   * All rights reserved.</center></h2> |  | ||||||
|   * |  | ||||||
|   * This software component is licensed by ST under Ultimate Liberty license |  | ||||||
|   * SLA0044, the "License"; You may not use this file except in compliance with |  | ||||||
|   * the License. You may obtain a copy of the License at: |  | ||||||
|   *                             www.st.com/SLA0044 |  | ||||||
|   * |  | ||||||
|   ****************************************************************************** |  | ||||||
|   */ |  | ||||||
| 
 |  | ||||||
| /* Includes ------------------------------------------------------------------*/ |  | ||||||
| #include "i2c.h" |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN 0 */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END 0 */ |  | ||||||
| 
 |  | ||||||
| I2C_HandleTypeDef hi2c1; |  | ||||||
| 
 |  | ||||||
| /* I2C1 init function */ |  | ||||||
| void MX_I2C1_Init(void) |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
|   hi2c1.Instance = I2C1; |  | ||||||
|   hi2c1.Init.Timing = 0x10707DBC; |  | ||||||
|   hi2c1.Init.OwnAddress1 = 0; |  | ||||||
|   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; |  | ||||||
|   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; |  | ||||||
|   hi2c1.Init.OwnAddress2 = 0; |  | ||||||
|   hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; |  | ||||||
|   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; |  | ||||||
|   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; |  | ||||||
|   if (HAL_I2C_Init(&hi2c1) != HAL_OK) |  | ||||||
|   { |  | ||||||
|     Error_Handler(); |  | ||||||
|   } |  | ||||||
|   /** Configure Analogue filter
 |  | ||||||
|   */ |  | ||||||
|   if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) |  | ||||||
|   { |  | ||||||
|     Error_Handler(); |  | ||||||
|   } |  | ||||||
|   /** Configure Digital filter
 |  | ||||||
|   */ |  | ||||||
|   if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) |  | ||||||
|   { |  | ||||||
|     Error_Handler(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
|   GPIO_InitTypeDef GPIO_InitStruct = {0}; |  | ||||||
|   if(i2cHandle->Instance==I2C1) |  | ||||||
|   { |  | ||||||
|   /* USER CODE BEGIN I2C1_MspInit 0 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspInit 0 */ |  | ||||||
| 
 |  | ||||||
|     __HAL_RCC_GPIOA_CLK_ENABLE(); |  | ||||||
|     /**I2C1 GPIO Configuration
 |  | ||||||
|     PA9     ------> I2C1_SCL |  | ||||||
|     PA10     ------> I2C1_SDA |  | ||||||
|     */ |  | ||||||
|     GPIO_InitStruct.Pin = I2C_SCL_Pin|I2C_SDA_Pin; |  | ||||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; |  | ||||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; |  | ||||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |  | ||||||
|     GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; |  | ||||||
|     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |  | ||||||
| 
 |  | ||||||
|     /* I2C1 clock enable */ |  | ||||||
|     __HAL_RCC_I2C1_CLK_ENABLE(); |  | ||||||
|   /* USER CODE BEGIN I2C1_MspInit 1 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspInit 1 */ |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
|   if(i2cHandle->Instance==I2C1) |  | ||||||
|   { |  | ||||||
|   /* USER CODE BEGIN I2C1_MspDeInit 0 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspDeInit 0 */ |  | ||||||
|     /* Peripheral clock disable */ |  | ||||||
|     __HAL_RCC_I2C1_CLK_DISABLE(); |  | ||||||
| 
 |  | ||||||
|     /**I2C1 GPIO Configuration
 |  | ||||||
|     PA9     ------> I2C1_SCL |  | ||||||
|     PA10     ------> I2C1_SDA |  | ||||||
|     */ |  | ||||||
|     HAL_GPIO_DeInit(I2C_SCL_GPIO_Port, I2C_SCL_Pin); |  | ||||||
| 
 |  | ||||||
|     HAL_GPIO_DeInit(I2C_SDA_GPIO_Port, I2C_SDA_Pin); |  | ||||||
| 
 |  | ||||||
|   /* USER CODE BEGIN I2C1_MspDeInit 1 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspDeInit 1 */ |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN 1 */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END 1 */ |  | ||||||
| 
 |  | ||||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |  | ||||||
| @ -5,7 +5,6 @@ | |||||||
| #include "aes.h" | #include "aes.h" | ||||||
| #include "comp.h" | #include "comp.h" | ||||||
| #include "crc.h" | #include "crc.h" | ||||||
| #include "i2c.h" |  | ||||||
| #include "pka.h" | #include "pka.h" | ||||||
| #include "rf.h" | #include "rf.h" | ||||||
| #include "rng.h" | #include "rng.h" | ||||||
| @ -31,7 +30,6 @@ int main(void) | |||||||
| 
 | 
 | ||||||
|     MX_GPIO_Init(); |     MX_GPIO_Init(); | ||||||
|     MX_ADC1_Init(); |     MX_ADC1_Init(); | ||||||
|     MX_I2C1_Init(); |  | ||||||
|     MX_RTC_Init(); |     MX_RTC_Init(); | ||||||
|     MX_SPI1_Init(); |     MX_SPI1_Init(); | ||||||
|     MX_SPI2_Init(); |     MX_SPI2_Init(); | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include <api-hal-i2c.h> | #include <api-hal-i2c.h> | ||||||
|  | #include <stm32wbxx_ll_i2c.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| 
 | 
 | ||||||
| osMutexId_t api_hal_i2c_mutex = NULL; | osMutexId_t api_hal_i2c_mutex = NULL; | ||||||
| @ -8,6 +9,35 @@ void api_hal_i2c_init() { | |||||||
|     furi_check(api_hal_i2c_mutex); |     furi_check(api_hal_i2c_mutex); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 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); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void api_hal_i2c_lock() { | void api_hal_i2c_lock() { | ||||||
|     furi_check(osMutexAcquire(api_hal_i2c_mutex, osWaitForever) == osOK); |     furi_check(osMutexAcquire(api_hal_i2c_mutex, osWaitForever) == osOK); | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,10 +3,20 @@ | |||||||
| #include "main.h" | #include "main.h" | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| 
 | 
 | ||||||
|  | #include <stm32wbxx.h> | ||||||
|  | #include <stm32wbxx_ll_gpio.h> | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #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 Related Constants */ | /* Input Related Constants */ | ||||||
| #define INPUT_DEBOUNCE_TICKS 20 | #define INPUT_DEBOUNCE_TICKS 20 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,54 +0,0 @@ | |||||||
| /**
 |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @file    i2c.h |  | ||||||
|   * @brief   This file contains all the function prototypes for |  | ||||||
|   *          the i2c.c file |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @attention |  | ||||||
|   * |  | ||||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. |  | ||||||
|   * All rights reserved.</center></h2> |  | ||||||
|   * |  | ||||||
|   * This software component is licensed by ST under Ultimate Liberty license |  | ||||||
|   * SLA0044, the "License"; You may not use this file except in compliance with |  | ||||||
|   * the License. You may obtain a copy of the License at: |  | ||||||
|   *                             www.st.com/SLA0044 |  | ||||||
|   * |  | ||||||
|   ****************************************************************************** |  | ||||||
|   */ |  | ||||||
| /* Define to prevent recursive inclusion -------------------------------------*/ |  | ||||||
| #ifndef __I2C_H__ |  | ||||||
| #define __I2C_H__ |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /* Includes ------------------------------------------------------------------*/ |  | ||||||
| #include "main.h" |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN Includes */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END Includes */ |  | ||||||
| 
 |  | ||||||
| extern I2C_HandleTypeDef hi2c1; |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN Private defines */ |  | ||||||
| 
 |  | ||||||
| #define POWER_I2C hi2c1 |  | ||||||
| 
 |  | ||||||
| /* USER CODE END Private defines */ |  | ||||||
| 
 |  | ||||||
| void MX_I2C1_Init(void); |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN Prototypes */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END Prototypes */ |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #endif /* __I2C_H__ */ |  | ||||||
| 
 |  | ||||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |  | ||||||
| @ -99,8 +99,6 @@ void Error_Handler(void); | |||||||
| #define RFID_PULL_Pin GPIO_PIN_8 | #define RFID_PULL_Pin GPIO_PIN_8 | ||||||
| #define RFID_PULL_GPIO_Port GPIOA | #define RFID_PULL_GPIO_Port GPIOA | ||||||
| #define RFID_PULL_EXTI_IRQn EXTI9_5_IRQn | #define RFID_PULL_EXTI_IRQn EXTI9_5_IRQn | ||||||
| #define I2C_SCL_Pin GPIO_PIN_9 |  | ||||||
| #define I2C_SCL_GPIO_Port GPIOA |  | ||||||
| #define CC1101_G0_Pin GPIO_PIN_4 | #define CC1101_G0_Pin GPIO_PIN_4 | ||||||
| #define CC1101_G0_GPIO_Port GPIOC | #define CC1101_G0_GPIO_Port GPIOC | ||||||
| #define RFID_RF_IN_Pin GPIO_PIN_5 | #define RFID_RF_IN_Pin GPIO_PIN_5 | ||||||
| @ -131,8 +129,6 @@ void Error_Handler(void); | |||||||
| #define SPI_D_MOSI_GPIO_Port GPIOB | #define SPI_D_MOSI_GPIO_Port GPIOB | ||||||
| #define DISPLAY_DI_Pin GPIO_PIN_6 | #define DISPLAY_DI_Pin GPIO_PIN_6 | ||||||
| #define DISPLAY_DI_GPIO_Port GPIOC | #define DISPLAY_DI_GPIO_Port GPIOC | ||||||
| #define I2C_SDA_Pin GPIO_PIN_10 |  | ||||||
| #define I2C_SDA_GPIO_Port GPIOA |  | ||||||
| #define SD_CD_Pin GPIO_PIN_15 | #define SD_CD_Pin GPIO_PIN_15 | ||||||
| #define SD_CD_GPIO_Port GPIOA | #define SD_CD_GPIO_Port GPIOA | ||||||
| #define VIBRO_Pin GPIO_PIN_10 | #define VIBRO_Pin GPIO_PIN_10 | ||||||
|  | |||||||
| @ -67,7 +67,7 @@ void MX_GPIO_Init(void) | |||||||
|   HAL_GPIO_WritePin(DISPLAY_DI_GPIO_Port, DISPLAY_DI_Pin, GPIO_PIN_RESET); |   HAL_GPIO_WritePin(DISPLAY_DI_GPIO_Port, DISPLAY_DI_Pin, GPIO_PIN_RESET); | ||||||
| 
 | 
 | ||||||
|   /*Configure GPIO pin Output Level */ |   /*Configure GPIO pin Output Level */ | ||||||
|   HAL_GPIO_WritePin(GPIOC, DISPLAY_CS_Pin|SD_CS_Pin, GPIO_PIN_SET); |   HAL_GPIO_WritePin(GPIOC, DISPLAY_CS_Pin, GPIO_PIN_SET); | ||||||
| 
 | 
 | ||||||
|   /*Configure GPIO pin Output Level */ |   /*Configure GPIO pin Output Level */ | ||||||
|   HAL_GPIO_WritePin(CC1101_CS_GPIO_Port, CC1101_CS_Pin, GPIO_PIN_SET); |   HAL_GPIO_WritePin(CC1101_CS_GPIO_Port, CC1101_CS_Pin, GPIO_PIN_SET); | ||||||
| @ -163,9 +163,10 @@ void MX_GPIO_Init(void) | |||||||
| 
 | 
 | ||||||
|   /*Configure GPIO pin : PtPin */ |   /*Configure GPIO pin : PtPin */ | ||||||
|   GPIO_InitStruct.Pin = SD_CS_Pin; |   GPIO_InitStruct.Pin = SD_CS_Pin; | ||||||
|   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||||
|   GPIO_InitStruct.Pull = GPIO_NOPULL; |   GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||||
|   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||||
|  |   GPIO_InitStruct.Alternate = GPIO_AF6_LSCO; | ||||||
|   HAL_GPIO_Init(SD_CS_GPIO_Port, &GPIO_InitStruct); |   HAL_GPIO_Init(SD_CS_GPIO_Port, &GPIO_InitStruct); | ||||||
| 
 | 
 | ||||||
|   /*Configure GPIO pin : PtPin */ |   /*Configure GPIO pin : PtPin */ | ||||||
|  | |||||||
| @ -1,120 +0,0 @@ | |||||||
| /**
 |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @file    i2c.c |  | ||||||
|   * @brief   This file provides code for the configuration |  | ||||||
|   *          of the I2C instances. |  | ||||||
|   ****************************************************************************** |  | ||||||
|   * @attention |  | ||||||
|   * |  | ||||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. |  | ||||||
|   * All rights reserved.</center></h2> |  | ||||||
|   * |  | ||||||
|   * This software component is licensed by ST under Ultimate Liberty license |  | ||||||
|   * SLA0044, the "License"; You may not use this file except in compliance with |  | ||||||
|   * the License. You may obtain a copy of the License at: |  | ||||||
|   *                             www.st.com/SLA0044 |  | ||||||
|   * |  | ||||||
|   ****************************************************************************** |  | ||||||
|   */ |  | ||||||
| 
 |  | ||||||
| /* Includes ------------------------------------------------------------------*/ |  | ||||||
| #include "i2c.h" |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN 0 */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END 0 */ |  | ||||||
| 
 |  | ||||||
| I2C_HandleTypeDef hi2c1; |  | ||||||
| 
 |  | ||||||
| /* I2C1 init function */ |  | ||||||
| void MX_I2C1_Init(void) |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
|   hi2c1.Instance = I2C1; |  | ||||||
|   hi2c1.Init.Timing = 0x10707DBC; |  | ||||||
|   hi2c1.Init.OwnAddress1 = 0; |  | ||||||
|   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; |  | ||||||
|   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; |  | ||||||
|   hi2c1.Init.OwnAddress2 = 0; |  | ||||||
|   hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; |  | ||||||
|   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; |  | ||||||
|   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; |  | ||||||
|   if (HAL_I2C_Init(&hi2c1) != HAL_OK) |  | ||||||
|   { |  | ||||||
|     Error_Handler(); |  | ||||||
|   } |  | ||||||
|   /** Configure Analogue filter
 |  | ||||||
|   */ |  | ||||||
|   if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) |  | ||||||
|   { |  | ||||||
|     Error_Handler(); |  | ||||||
|   } |  | ||||||
|   /** Configure Digital filter
 |  | ||||||
|   */ |  | ||||||
|   if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) |  | ||||||
|   { |  | ||||||
|     Error_Handler(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
|   GPIO_InitTypeDef GPIO_InitStruct = {0}; |  | ||||||
|   if(i2cHandle->Instance==I2C1) |  | ||||||
|   { |  | ||||||
|   /* USER CODE BEGIN I2C1_MspInit 0 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspInit 0 */ |  | ||||||
| 
 |  | ||||||
|     __HAL_RCC_GPIOA_CLK_ENABLE(); |  | ||||||
|     /**I2C1 GPIO Configuration
 |  | ||||||
|     PA9     ------> I2C1_SCL |  | ||||||
|     PA10     ------> I2C1_SDA |  | ||||||
|     */ |  | ||||||
|     GPIO_InitStruct.Pin = I2C_SCL_Pin|I2C_SDA_Pin; |  | ||||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; |  | ||||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; |  | ||||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |  | ||||||
|     GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; |  | ||||||
|     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |  | ||||||
| 
 |  | ||||||
|     /* I2C1 clock enable */ |  | ||||||
|     __HAL_RCC_I2C1_CLK_ENABLE(); |  | ||||||
|   /* USER CODE BEGIN I2C1_MspInit 1 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspInit 1 */ |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
|   if(i2cHandle->Instance==I2C1) |  | ||||||
|   { |  | ||||||
|   /* USER CODE BEGIN I2C1_MspDeInit 0 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspDeInit 0 */ |  | ||||||
|     /* Peripheral clock disable */ |  | ||||||
|     __HAL_RCC_I2C1_CLK_DISABLE(); |  | ||||||
| 
 |  | ||||||
|     /**I2C1 GPIO Configuration
 |  | ||||||
|     PA9     ------> I2C1_SCL |  | ||||||
|     PA10     ------> I2C1_SDA |  | ||||||
|     */ |  | ||||||
|     HAL_GPIO_DeInit(I2C_SCL_GPIO_Port, I2C_SCL_Pin); |  | ||||||
| 
 |  | ||||||
|     HAL_GPIO_DeInit(I2C_SDA_GPIO_Port, I2C_SDA_Pin); |  | ||||||
| 
 |  | ||||||
|   /* USER CODE BEGIN I2C1_MspDeInit 1 */ |  | ||||||
| 
 |  | ||||||
|   /* USER CODE END I2C1_MspDeInit 1 */ |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* USER CODE BEGIN 1 */ |  | ||||||
| 
 |  | ||||||
| /* USER CODE END 1 */ |  | ||||||
| 
 |  | ||||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |  | ||||||
| @ -5,7 +5,6 @@ | |||||||
| #include "aes.h" | #include "aes.h" | ||||||
| #include "comp.h" | #include "comp.h" | ||||||
| #include "crc.h" | #include "crc.h" | ||||||
| #include "i2c.h" |  | ||||||
| #include "pka.h" | #include "pka.h" | ||||||
| #include "rf.h" | #include "rf.h" | ||||||
| #include "rng.h" | #include "rng.h" | ||||||
| @ -31,7 +30,6 @@ int main(void) | |||||||
| 
 | 
 | ||||||
|     MX_GPIO_Init(); |     MX_GPIO_Init(); | ||||||
|     MX_ADC1_Init(); |     MX_ADC1_Init(); | ||||||
|     MX_I2C1_Init(); |  | ||||||
|     MX_RTC_Init(); |     MX_RTC_Init(); | ||||||
|     MX_SPI1_Init(); |     MX_SPI1_Init(); | ||||||
|     MX_SPI2_Init(); |     MX_SPI2_Init(); | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include <api-hal-i2c.h> | #include <api-hal-i2c.h> | ||||||
|  | #include <stm32wbxx_ll_i2c.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| 
 | 
 | ||||||
| osMutexId_t api_hal_i2c_mutex = NULL; | osMutexId_t api_hal_i2c_mutex = NULL; | ||||||
| @ -8,6 +9,35 @@ void api_hal_i2c_init() { | |||||||
|     furi_check(api_hal_i2c_mutex); |     furi_check(api_hal_i2c_mutex); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 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); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void api_hal_i2c_lock() { | void api_hal_i2c_lock() { | ||||||
|     furi_check(osMutexAcquire(api_hal_i2c_mutex, osWaitForever) == osOK); |     furi_check(osMutexAcquire(api_hal_i2c_mutex, osWaitForever) == osOK); | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,10 +3,20 @@ | |||||||
| #include "main.h" | #include "main.h" | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| 
 | 
 | ||||||
|  | #include <stm32wbxx.h> | ||||||
|  | #include <stm32wbxx_ll_gpio.h> | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #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 Related Constants */ | /* Input Related Constants */ | ||||||
| #define INPUT_DEBOUNCE_TICKS 20 | #define INPUT_DEBOUNCE_TICKS 20 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| #include <bq25896.h> | #include "bq25896.h" | ||||||
| #include <bq25896_reg.h> | #include "bq25896_reg.h" | ||||||
| 
 | 
 | ||||||
| #include <api-hal.h> | #include <api-hal-i2c.h> | ||||||
|  | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| uint8_t bit_reverse(uint8_t b) { | uint8_t bit_reverse(uint8_t b) { | ||||||
|    b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; |    b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; | ||||||
| @ -13,12 +14,10 @@ uint8_t bit_reverse(uint8_t b) { | |||||||
| bool bq25896_read(uint8_t address, uint8_t* data, size_t size) { | bool bq25896_read(uint8_t address, uint8_t* data, size_t size) { | ||||||
|     bool ret; |     bool ret; | ||||||
|     with_api_hal_i2c(bool, &ret, (){ |     with_api_hal_i2c(bool, &ret, (){ | ||||||
|         if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ25896_ADDRESS, &address, 1, 2000) != HAL_OK) { |         api_hal_i2c_trx( | ||||||
|             return false; |             POWER_I2C, BQ25896_ADDRESS, | ||||||
|         } |             &address, 1, data, size | ||||||
|         if (HAL_I2C_Master_Receive(&POWER_I2C, BQ25896_ADDRESS, data, size, 2000) != HAL_OK) { |         ); | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         return true; |         return true; | ||||||
|     }); |     }); | ||||||
|     return ret; |     return ret; | ||||||
| @ -33,9 +32,7 @@ bool bq25896_write_reg(uint8_t address, uint8_t* data) { | |||||||
|     uint8_t buffer[2] = { address, *data }; |     uint8_t buffer[2] = { address, *data }; | ||||||
|     bool ret; |     bool ret; | ||||||
|     with_api_hal_i2c(bool, &ret, (){ |     with_api_hal_i2c(bool, &ret, (){ | ||||||
|         if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ25896_ADDRESS, buffer, 2, 2000) != HAL_OK) { |         api_hal_i2c_tx(POWER_I2C, BQ25896_ADDRESS, buffer, 2); | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         return true; |         return true; | ||||||
|     }); |     }); | ||||||
|     return ret; |     return ret; | ||||||
|  | |||||||
| @ -1,21 +1,18 @@ | |||||||
| #include <bq27220.h> | #include "bq27220.h" | ||||||
| #include <bq27220_reg.h> | #include "bq27220_reg.h" | ||||||
| 
 | 
 | ||||||
| #include <api-hal.h> | #include <api-hal-i2c.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
| uint16_t bq27220_read_word(uint8_t address) { | uint16_t bq27220_read_word(uint8_t address) { | ||||||
|     uint8_t data[2] = { address }; |     uint8_t buffer[2] = { address }; | ||||||
|     uint16_t ret; |     uint16_t ret; | ||||||
|     with_api_hal_i2c(uint16_t, &ret, (){ |     with_api_hal_i2c(uint16_t, &ret, (){ | ||||||
|         if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ27220_ADDRESS, data, 1, 2000) != HAL_OK) { |         api_hal_i2c_trx( | ||||||
|             return BQ27220_ERROR; |             POWER_I2C, BQ27220_ADDRESS,  | ||||||
|         } |             buffer, 1, buffer, 2 | ||||||
| 
 |         ); | ||||||
|         if (HAL_I2C_Master_Receive(&POWER_I2C, BQ27220_ADDRESS, data, 2, 2000) != HAL_OK) { |         return *(uint16_t*)buffer; | ||||||
|             return BQ27220_ERROR; |  | ||||||
|         } |  | ||||||
|         return *(uint16_t*)data; |  | ||||||
|     }); |     }); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| @ -23,13 +20,11 @@ uint16_t bq27220_read_word(uint8_t address) { | |||||||
| bool bq27220_control(uint16_t control) { | bool bq27220_control(uint16_t control) { | ||||||
|     bool ret; |     bool ret; | ||||||
|     with_api_hal_i2c(bool, &ret, (){ |     with_api_hal_i2c(bool, &ret, (){ | ||||||
|         uint8_t data[3]; |         uint8_t buffer[3]; | ||||||
|         data[0] = CommandControl; |         buffer[0] = CommandControl; | ||||||
|         data[1] = (control>>8) & 0xFF; |         buffer[1] = (control>>8) & 0xFF; | ||||||
|         data[2] = control & 0xFF; |         buffer[2] = control & 0xFF; | ||||||
|         if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ27220_ADDRESS, data, 3, 2000) != HAL_OK) { |         api_hal_i2c_tx(POWER_I2C, BQ27220_ADDRESS, buffer, 3); | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         return true; |         return true; | ||||||
|     }); |     }); | ||||||
|     return ret; |     return ret; | ||||||
|  | |||||||
| @ -1,34 +1,14 @@ | |||||||
| #include "lp5562.h" | #include "lp5562.h" | ||||||
| #include "lp5562_reg.h" | #include "lp5562_reg.h" | ||||||
| 
 | 
 | ||||||
| #include <api-hal.h> | #include <api-hal-i2c.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| 
 | 
 | ||||||
| bool lp5562_read(uint8_t address, uint8_t* data, size_t size) { |  | ||||||
|     bool ret; |  | ||||||
|     with_api_hal_i2c(bool, &ret, (){ |  | ||||||
|         if (HAL_I2C_Master_Transmit(&POWER_I2C, LP5562_ADDRESS, &address, 1, 2000) != HAL_OK) { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         if (HAL_I2C_Master_Receive(&POWER_I2C, LP5562_ADDRESS, data, size, 2000) != HAL_OK) { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         return true; |  | ||||||
|     }); |  | ||||||
|     return ret; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool lp5562_read_reg(uint8_t address, uint8_t* data) { |  | ||||||
|     return lp5562_read(address, data, 1); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool lp5562_write_reg(uint8_t address, uint8_t *data) { | bool lp5562_write_reg(uint8_t address, uint8_t *data) { | ||||||
|     uint8_t buffer[2] = { address, *data }; |     uint8_t buffer[2] = { address, *data }; | ||||||
|     bool ret; |     bool ret; | ||||||
|     with_api_hal_i2c(bool, &ret, (){ |     with_api_hal_i2c(bool, &ret, (){ | ||||||
|         if (HAL_I2C_Master_Transmit(&POWER_I2C, LP5562_ADDRESS, buffer, 2, 2000) != HAL_OK) { |         api_hal_i2c_tx(POWER_I2C, LP5562_ADDRESS, buffer, 2); | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         return true; |         return true; | ||||||
|     }); |     }); | ||||||
|     return ret; |     return ret; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく