diff --git a/bootloader/targets/f5/api-hal/api-hal-i2c.c b/bootloader/targets/f5/api-hal/api-hal-i2c.c new file mode 100644 index 00000000..999a200d --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal-i2c.c @@ -0,0 +1,85 @@ +#include + +#include +#include +#include +#include + +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); +} diff --git a/bootloader/targets/f5/api-hal/api-hal-i2c.h b/bootloader/targets/f5/api-hal/api-hal-i2c.h new file mode 100644 index 00000000..a3e14681 --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal-i2c.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +#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 diff --git a/bootloader/targets/f5/api-hal/api-hal-light.c b/bootloader/targets/f5/api-hal/api-hal-light.c new file mode 100644 index 00000000..425018a1 --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal-light.c @@ -0,0 +1,43 @@ +#include +#include + +#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; + } +} \ No newline at end of file diff --git a/bootloader/targets/f5/api-hal/api-hal-light.h b/bootloader/targets/f5/api-hal/api-hal-light.h new file mode 100644 index 00000000..1d571f06 --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal-light.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void api_hal_light_init(); + +void api_hal_light_set(Light light, uint8_t value); + +#ifdef __cplusplus +} +#endif diff --git a/bootloader/targets/f5/api-hal/api-hal-resources.h b/bootloader/targets/f5/api-hal/api-hal-resources.h new file mode 100644 index 00000000..78ebaa9c --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal-resources.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +#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 diff --git a/bootloader/targets/f5/api-hal/api-hal.c b/bootloader/targets/f5/api-hal/api-hal.c new file mode 100644 index 00000000..2d3afc71 --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal.c @@ -0,0 +1,6 @@ +#include + +void api_hal_init() { + api_hal_i2c_init(); + api_hal_light_init(); +} \ No newline at end of file diff --git a/bootloader/targets/f5/api-hal/api-hal.h b/bootloader/targets/f5/api-hal/api-hal.h new file mode 100644 index 00000000..9230b28a --- /dev/null +++ b/bootloader/targets/f5/api-hal/api-hal.h @@ -0,0 +1,6 @@ +#pragma once + +#include +#include + +void api_hal_init(); \ No newline at end of file diff --git a/bootloader/targets/f5/target.c b/bootloader/targets/f5/target.c index 639d1e5c..f3461bf4 100644 --- a/bootloader/targets/f5/target.c +++ b/bootloader/targets/f5/target.c @@ -9,6 +9,8 @@ #include #include +#include + // 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(); diff --git a/bootloader/targets/f5/target.mk b/bootloader/targets/f5/target.mk index 3acf372f..c2aef017 100644 --- a/bootloader/targets/f5/target.mk +++ b/bootloader/targets/f5/target.mk @@ -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) diff --git a/firmware/targets/api-hal-include/api-hal-i2c.h b/firmware/targets/api-hal-include/api-hal-i2c.h index 4048a422..755cf292 100644 --- a/firmware/targets/api-hal-include/api-hal-i2c.h +++ b/firmware/targets/api-hal-include/api-hal-i2c.h @@ -2,7 +2,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -10,6 +10,16 @@ extern "C" { 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_unlock(); diff --git a/firmware/targets/f4/Inc/i2c.h b/firmware/targets/f4/Inc/i2c.h deleted file mode 100644 index afce630a..00000000 --- a/firmware/targets/f4/Inc/i2c.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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****/ diff --git a/firmware/targets/f4/Inc/main.h b/firmware/targets/f4/Inc/main.h index 1211e630..d5ec149f 100644 --- a/firmware/targets/f4/Inc/main.h +++ b/firmware/targets/f4/Inc/main.h @@ -97,8 +97,6 @@ void Error_Handler(void); #define RFID_PULL_Pin GPIO_PIN_8 #define RFID_PULL_GPIO_Port GPIOA #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_GPIO_Port GPIOC #define RFID_RF_IN_Pin GPIO_PIN_5 @@ -129,8 +127,6 @@ void Error_Handler(void); #define SPI_D_MOSI_GPIO_Port GPIOB #define DISPLAY_DI_Pin GPIO_PIN_6 #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_GPIO_Port GPIOA #define PC10_Pin GPIO_PIN_10 diff --git a/firmware/targets/f4/Src/i2c.c b/firmware/targets/f4/Src/i2c.c deleted file mode 100644 index badd682f..00000000 --- a/firmware/targets/f4/Src/i2c.c +++ /dev/null @@ -1,120 +0,0 @@ -/** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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****/ diff --git a/firmware/targets/f4/Src/main.c b/firmware/targets/f4/Src/main.c index 8b68d032..33016589 100644 --- a/firmware/targets/f4/Src/main.c +++ b/firmware/targets/f4/Src/main.c @@ -5,7 +5,6 @@ #include "aes.h" #include "comp.h" #include "crc.h" -#include "i2c.h" #include "pka.h" #include "rf.h" #include "rng.h" @@ -31,7 +30,6 @@ int main(void) MX_GPIO_Init(); MX_ADC1_Init(); - MX_I2C1_Init(); MX_RTC_Init(); MX_SPI1_Init(); MX_SPI2_Init(); diff --git a/firmware/targets/f4/api-hal/api-hal-i2c.c b/firmware/targets/f4/api-hal/api-hal-i2c.c index c8e8fe79..087af97e 100644 --- a/firmware/targets/f4/api-hal/api-hal-i2c.c +++ b/firmware/targets/f4/api-hal/api-hal-i2c.c @@ -1,4 +1,5 @@ #include +#include #include osMutexId_t api_hal_i2c_mutex = NULL; @@ -8,6 +9,35 @@ void api_hal_i2c_init() { 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() { furi_check(osMutexAcquire(api_hal_i2c_mutex, osWaitForever) == osOK); } diff --git a/firmware/targets/f4/api-hal/api-hal-resources.h b/firmware/targets/f4/api-hal/api-hal-resources.h index 8f257b52..e5081e43 100644 --- a/firmware/targets/f4/api-hal/api-hal-resources.h +++ b/firmware/targets/f4/api-hal/api-hal-resources.h @@ -3,10 +3,20 @@ #include "main.h" #include +#include +#include + #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 Related Constants */ #define INPUT_DEBOUNCE_TICKS 20 diff --git a/firmware/targets/f5/Inc/i2c.h b/firmware/targets/f5/Inc/i2c.h deleted file mode 100644 index afce630a..00000000 --- a/firmware/targets/f5/Inc/i2c.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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****/ diff --git a/firmware/targets/f5/Inc/main.h b/firmware/targets/f5/Inc/main.h index 6e7a453a..d4a8c537 100644 --- a/firmware/targets/f5/Inc/main.h +++ b/firmware/targets/f5/Inc/main.h @@ -99,8 +99,6 @@ void Error_Handler(void); #define RFID_PULL_Pin GPIO_PIN_8 #define RFID_PULL_GPIO_Port GPIOA #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_GPIO_Port GPIOC #define RFID_RF_IN_Pin GPIO_PIN_5 @@ -131,8 +129,6 @@ void Error_Handler(void); #define SPI_D_MOSI_GPIO_Port GPIOB #define DISPLAY_DI_Pin GPIO_PIN_6 #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_GPIO_Port GPIOA #define VIBRO_Pin GPIO_PIN_10 diff --git a/firmware/targets/f5/Src/gpio.c b/firmware/targets/f5/Src/gpio.c index d1797788..f1d32952 100644 --- a/firmware/targets/f5/Src/gpio.c +++ b/firmware/targets/f5/Src/gpio.c @@ -67,7 +67,7 @@ void MX_GPIO_Init(void) HAL_GPIO_WritePin(DISPLAY_DI_GPIO_Port, DISPLAY_DI_Pin, GPIO_PIN_RESET); /*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 */ 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 */ 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.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); /*Configure GPIO pin : PtPin */ diff --git a/firmware/targets/f5/Src/i2c.c b/firmware/targets/f5/Src/i2c.c deleted file mode 100644 index badd682f..00000000 --- a/firmware/targets/f5/Src/i2c.c +++ /dev/null @@ -1,120 +0,0 @@ -/** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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****/ diff --git a/firmware/targets/f5/Src/main.c b/firmware/targets/f5/Src/main.c index 3d4fa871..8fb1b2c1 100644 --- a/firmware/targets/f5/Src/main.c +++ b/firmware/targets/f5/Src/main.c @@ -5,7 +5,6 @@ #include "aes.h" #include "comp.h" #include "crc.h" -#include "i2c.h" #include "pka.h" #include "rf.h" #include "rng.h" @@ -31,7 +30,6 @@ int main(void) MX_GPIO_Init(); MX_ADC1_Init(); - MX_I2C1_Init(); MX_RTC_Init(); MX_SPI1_Init(); MX_SPI2_Init(); diff --git a/firmware/targets/f5/api-hal/api-hal-i2c.c b/firmware/targets/f5/api-hal/api-hal-i2c.c index c8e8fe79..087af97e 100644 --- a/firmware/targets/f5/api-hal/api-hal-i2c.c +++ b/firmware/targets/f5/api-hal/api-hal-i2c.c @@ -1,4 +1,5 @@ #include +#include #include osMutexId_t api_hal_i2c_mutex = NULL; @@ -8,6 +9,35 @@ void api_hal_i2c_init() { 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() { furi_check(osMutexAcquire(api_hal_i2c_mutex, osWaitForever) == osOK); } diff --git a/firmware/targets/f5/api-hal/api-hal-resources.h b/firmware/targets/f5/api-hal/api-hal-resources.h index 8f257b52..e5081e43 100644 --- a/firmware/targets/f5/api-hal/api-hal-resources.h +++ b/firmware/targets/f5/api-hal/api-hal-resources.h @@ -3,10 +3,20 @@ #include "main.h" #include +#include +#include + #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 Related Constants */ #define INPUT_DEBOUNCE_TICKS 20 diff --git a/lib/drivers/bq25896.c b/lib/drivers/bq25896.c index 56d2652d..9aea4ce8 100644 --- a/lib/drivers/bq25896.c +++ b/lib/drivers/bq25896.c @@ -1,7 +1,8 @@ -#include -#include +#include "bq25896.h" +#include "bq25896_reg.h" -#include +#include +#include uint8_t bit_reverse(uint8_t b) { 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 ret; with_api_hal_i2c(bool, &ret, (){ - if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ25896_ADDRESS, &address, 1, 2000) != HAL_OK) { - return false; - } - if (HAL_I2C_Master_Receive(&POWER_I2C, BQ25896_ADDRESS, data, size, 2000) != HAL_OK) { - return false; - } + api_hal_i2c_trx( + POWER_I2C, BQ25896_ADDRESS, + &address, 1, data, size + ); return true; }); return ret; @@ -33,9 +32,7 @@ bool bq25896_write_reg(uint8_t address, uint8_t* data) { uint8_t buffer[2] = { address, *data }; bool ret; with_api_hal_i2c(bool, &ret, (){ - if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ25896_ADDRESS, buffer, 2, 2000) != HAL_OK) { - return false; - } + api_hal_i2c_tx(POWER_I2C, BQ25896_ADDRESS, buffer, 2); return true; }); return ret; diff --git a/lib/drivers/bq27220.c b/lib/drivers/bq27220.c index ca016b1a..bba7eaef 100644 --- a/lib/drivers/bq27220.c +++ b/lib/drivers/bq27220.c @@ -1,21 +1,18 @@ -#include -#include +#include "bq27220.h" +#include "bq27220_reg.h" -#include +#include #include uint16_t bq27220_read_word(uint8_t address) { - uint8_t data[2] = { address }; + uint8_t buffer[2] = { address }; uint16_t ret; with_api_hal_i2c(uint16_t, &ret, (){ - if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ27220_ADDRESS, data, 1, 2000) != HAL_OK) { - return BQ27220_ERROR; - } - - if (HAL_I2C_Master_Receive(&POWER_I2C, BQ27220_ADDRESS, data, 2, 2000) != HAL_OK) { - return BQ27220_ERROR; - } - return *(uint16_t*)data; + api_hal_i2c_trx( + POWER_I2C, BQ27220_ADDRESS, + buffer, 1, buffer, 2 + ); + return *(uint16_t*)buffer; }); return ret; } @@ -23,13 +20,11 @@ uint16_t bq27220_read_word(uint8_t address) { bool bq27220_control(uint16_t control) { bool ret; with_api_hal_i2c(bool, &ret, (){ - uint8_t data[3]; - data[0] = CommandControl; - data[1] = (control>>8) & 0xFF; - data[2] = control & 0xFF; - if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ27220_ADDRESS, data, 3, 2000) != HAL_OK) { - return false; - } + uint8_t buffer[3]; + buffer[0] = CommandControl; + buffer[1] = (control>>8) & 0xFF; + buffer[2] = control & 0xFF; + api_hal_i2c_tx(POWER_I2C, BQ27220_ADDRESS, buffer, 3); return true; }); return ret; diff --git a/lib/drivers/lp5562.c b/lib/drivers/lp5562.c index 9fe6bfdf..2bd9e6a3 100644 --- a/lib/drivers/lp5562.c +++ b/lib/drivers/lp5562.c @@ -1,34 +1,14 @@ #include "lp5562.h" #include "lp5562_reg.h" -#include +#include #include -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) { uint8_t buffer[2] = { address, *data }; bool ret; with_api_hal_i2c(bool, &ret, (){ - if (HAL_I2C_Master_Transmit(&POWER_I2C, LP5562_ADDRESS, buffer, 2, 2000) != HAL_OK) { - return false; - } + api_hal_i2c_tx(POWER_I2C, LP5562_ADDRESS, buffer, 2); return true; }); return ret;