Added LampArray control.
Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
parent
fb3fe339dc
commit
bc76fc1c3f
|
@ -1,3 +1,12 @@
|
|||
[submodule "SDK"]
|
||||
path = SDK
|
||||
url = https://github.com/STMicroelectronics/STM32CubeL4.git
|
||||
[submodule "lib/tinyusb"]
|
||||
path = lib/tinyusb
|
||||
url = https://github.com/hathach/tinyusb.git
|
||||
[submodule "lib/freertos"]
|
||||
path = lib/freertos
|
||||
url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git
|
||||
[submodule "lib/lcd"]
|
||||
path = lib/lcd
|
||||
url = https://git.minori.work/Embedded_Drivers/epd-spi.git
|
||||
|
|
|
@ -9,31 +9,54 @@ enable_language(ASM)
|
|||
set(TARGET_LDSCRIPT_FLASH "${CMAKE_SOURCE_DIR}/MX_Generated/STM32L496VGTx_FLASH.ld")
|
||||
|
||||
set(TARGET_SOURCES
|
||||
"lib/tinyusb/src/class/cdc/cdc_device.c"
|
||||
"lib/tinyusb/src/class/hid/hid_device.c"
|
||||
"lib/tinyusb/src/device/usbd.c"
|
||||
"lib/tinyusb/src/device/usbd_control.c"
|
||||
"lib/tinyusb/src/tusb.c"
|
||||
"lib/tinyusb/src/common/tusb_fifo.c"
|
||||
"lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c"
|
||||
"MX_Generated/Core/Src/dma.c"
|
||||
"MX_Generated/Core/Src/gpio.c"
|
||||
"MX_Generated/Core/Src/main.c"
|
||||
"MX_Generated/Core/Src/spi.c"
|
||||
"MX_Generated/Core/Src/stm32l4xx_hal_msp.c"
|
||||
"MX_Generated/Core/Src/stm32l4xx_hal_timebase_tim.c"
|
||||
"MX_Generated/Core/Src/stm32l4xx_it.c"
|
||||
"MX_Generated/Core/Src/system_stm32l4xx.c"
|
||||
"MX_Generated/Core/Src/usart.c"
|
||||
"MX_Generated/startup_stm32l496xx.s"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c"
|
||||
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c"
|
||||
"src/app_lcd_impl.c"
|
||||
"src/app_lighting.c"
|
||||
"src/app_syscalls.c"
|
||||
"src/app_tusb.c"
|
||||
"src/main.c"
|
||||
)
|
||||
|
||||
set(TARGET_C_DEFINES
|
||||
"CFG_TUSB_MCU=OPT_MCU_STM32L4"
|
||||
"STM32L496xx"
|
||||
"USE_HAL_DRIVER"
|
||||
"USE_FULL_LL_DRIVER"
|
||||
)
|
||||
|
||||
set(TARGET_C_INCLUDES
|
||||
"lib/tinyusb/src"
|
||||
"MX_Generated/Core/Inc"
|
||||
"SDK/Drivers/CMSIS/Core/Include"
|
||||
"SDK/Drivers/CMSIS/Device/ST/STM32L4xx/Include"
|
||||
|
@ -46,6 +69,8 @@ set(TARGET_LIBS
|
|||
"c"
|
||||
"m"
|
||||
"nosys"
|
||||
"freertos_kernel"
|
||||
"epd-spi"
|
||||
)
|
||||
|
||||
# Shared library and linker script search paths
|
||||
|
@ -71,6 +96,18 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-common -fno-builtin -f
|
|||
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
|
||||
|
||||
# FreeRTOS
|
||||
set(FREERTOS_PORT "GCC_ARM_CM4F" CACHE STRING "")
|
||||
set(FREERTOS_HEAP "4" CACHE STRING "")
|
||||
|
||||
add_library(freertos_config INTERFACE)
|
||||
target_include_directories(freertos_config SYSTEM INTERFACE include)
|
||||
|
||||
add_subdirectory(lib/freertos)
|
||||
|
||||
add_subdirectory(lib/lcd)
|
||||
|
||||
|
||||
# Shared sources, includes and definitions
|
||||
add_compile_definitions(${TARGET_C_DEFINES})
|
||||
include_directories(${TARGET_C_INCLUDES})
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file dma.h
|
||||
* @brief This file contains all the function prototypes for
|
||||
* the dma.c file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __DMA_H__
|
||||
#define __DMA_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* DMA memory to memory transfer handles -------------------------------------*/
|
||||
extern DMA_HandleTypeDef hdma_memtomem_dma1_channel4;
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_DMA_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DMA_H__ */
|
||||
|
|
@ -57,6 +57,24 @@ void Error_Handler(void);
|
|||
/* USER CODE END EFP */
|
||||
|
||||
/* Private defines -----------------------------------------------------------*/
|
||||
#define LCD_CS_Pin GPIO_PIN_4
|
||||
#define LCD_CS_GPIO_Port GPIOA
|
||||
#define LCD_SCK_Pin GPIO_PIN_5
|
||||
#define LCD_SCK_GPIO_Port GPIOA
|
||||
#define LCD_DC_Pin GPIO_PIN_6
|
||||
#define LCD_DC_GPIO_Port GPIOA
|
||||
#define LCD_DI_Pin GPIO_PIN_7
|
||||
#define LCD_DI_GPIO_Port GPIOA
|
||||
#define LCD_RST_Pin GPIO_PIN_2
|
||||
#define LCD_RST_GPIO_Port GPIOB
|
||||
#define LCD_BLK_Pin GPIO_PIN_7
|
||||
#define LCD_BLK_GPIO_Port GPIOE
|
||||
#define STLK_RX_Pin GPIO_PIN_10
|
||||
#define STLK_RX_GPIO_Port GPIOB
|
||||
#define STLK_TX_Pin GPIO_PIN_11
|
||||
#define STLK_TX_GPIO_Port GPIOB
|
||||
#define USB_SW_Pin GPIO_PIN_5
|
||||
#define USB_SW_GPIO_Port GPIOB
|
||||
#define LED1_Pin GPIO_PIN_6
|
||||
#define LED1_GPIO_Port GPIOB
|
||||
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file spi.h
|
||||
* @brief This file contains all the function prototypes for
|
||||
* the spi.c file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __SPI_H__
|
||||
#define __SPI_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_SPI1_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SPI_H__ */
|
||||
|
|
@ -74,12 +74,12 @@
|
|||
/*#define HAL_SD_MODULE_ENABLED */
|
||||
/*#define HAL_SMBUS_MODULE_ENABLED */
|
||||
/*#define HAL_SMARTCARD_MODULE_ENABLED */
|
||||
/*#define HAL_SPI_MODULE_ENABLED */
|
||||
#define HAL_SPI_MODULE_ENABLED
|
||||
/*#define HAL_SRAM_MODULE_ENABLED */
|
||||
/*#define HAL_SWPMI_MODULE_ENABLED */
|
||||
/*#define HAL_TIM_MODULE_ENABLED */
|
||||
#define HAL_TIM_MODULE_ENABLED
|
||||
/*#define HAL_TSC_MODULE_ENABLED */
|
||||
/*#define HAL_UART_MODULE_ENABLED */
|
||||
#define HAL_UART_MODULE_ENABLED
|
||||
/*#define HAL_USART_MODULE_ENABLED */
|
||||
/*#define HAL_WWDG_MODULE_ENABLED */
|
||||
/*#define HAL_EXTI_MODULE_ENABLED */
|
||||
|
@ -232,7 +232,7 @@
|
|||
#define USE_HAL_SD_REGISTER_CALLBACKS 0U
|
||||
#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U
|
||||
#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U
|
||||
#define USE_HAL_SPI_REGISTER_CALLBACKS 0U
|
||||
#define USE_HAL_SPI_REGISTER_CALLBACKS 1U
|
||||
#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U
|
||||
#define USE_HAL_TIM_REGISTER_CALLBACKS 0U
|
||||
#define USE_HAL_TSC_REGISTER_CALLBACKS 0U
|
||||
|
|
|
@ -51,10 +51,10 @@ void HardFault_Handler(void);
|
|||
void MemManage_Handler(void);
|
||||
void BusFault_Handler(void);
|
||||
void UsageFault_Handler(void);
|
||||
void SVC_Handler(void);
|
||||
void DebugMon_Handler(void);
|
||||
void PendSV_Handler(void);
|
||||
void SysTick_Handler(void);
|
||||
void DMA1_Channel3_IRQHandler(void);
|
||||
void DMA1_Channel4_IRQHandler(void);
|
||||
void TIM7_IRQHandler(void);
|
||||
/* USER CODE BEGIN EFP */
|
||||
|
||||
/* USER CODE END EFP */
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usart.h
|
||||
* @brief This file contains all the function prototypes for
|
||||
* the usart.c file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __USART_H__
|
||||
#define __USART_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
extern UART_HandleTypeDef hlpuart1;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_LPUART1_UART_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __USART_H__ */
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file dma.c
|
||||
* @brief This file provides code for the configuration
|
||||
* of all the requested memory to memory DMA transfers.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "dma.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Configure DMA */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
DMA_HandleTypeDef hdma_memtomem_dma1_channel4;
|
||||
|
||||
/**
|
||||
* Enable DMA controller clock
|
||||
* Configure DMA for memory to memory transfers
|
||||
* hdma_memtomem_dma1_channel4
|
||||
*/
|
||||
void MX_DMA_Init(void)
|
||||
{
|
||||
|
||||
/* DMA controller clock enable */
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
|
||||
/* Configure DMA request hdma_memtomem_dma1_channel4 on DMA1_Channel4 */
|
||||
hdma_memtomem_dma1_channel4.Instance = DMA1_Channel4;
|
||||
hdma_memtomem_dma1_channel4.Init.Request = DMA_REQUEST_0;
|
||||
hdma_memtomem_dma1_channel4.Init.Direction = DMA_MEMORY_TO_MEMORY;
|
||||
hdma_memtomem_dma1_channel4.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_memtomem_dma1_channel4.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_memtomem_dma1_channel4.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||
hdma_memtomem_dma1_channel4.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||
hdma_memtomem_dma1_channel4.Init.Mode = DMA_NORMAL;
|
||||
hdma_memtomem_dma1_channel4.Init.Priority = DMA_PRIORITY_LOW;
|
||||
if (HAL_DMA_Init(&hdma_memtomem_dma1_channel4) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* DMA1_Channel3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 6, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
|
||||
/* DMA1_Channel4_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 6, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
|
@ -40,10 +40,42 @@ void MX_GPIO_Init(void)
|
|||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
/* GPIO Ports Clock Enable */
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(LCD_BLK_GPIO_Port, LCD_BLK_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOB, USB_SW_Pin|LED1_Pin, GPIO_PIN_SET);
|
||||
|
||||
/*Configure GPIO pin : PtPin */
|
||||
GPIO_InitStruct.Pin = LCD_DC_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(LCD_DC_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : PBPin PBPin */
|
||||
GPIO_InitStruct.Pin = LCD_RST_Pin|USB_SW_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PtPin */
|
||||
GPIO_InitStruct.Pin = LCD_BLK_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(LCD_BLK_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PtPin */
|
||||
GPIO_InitStruct.Pin = LED1_Pin;
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#include "dma.h"
|
||||
#include "usart.h"
|
||||
#include "spi.h"
|
||||
#include "gpio.h"
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
|
@ -116,6 +119,27 @@ void SystemClock_Config(void)
|
|||
|
||||
/* USER CODE END 4 */
|
||||
|
||||
/**
|
||||
* @brief Period elapsed callback in non blocking mode
|
||||
* @note This function is called when TIM7 interrupt took place, inside
|
||||
* HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
|
||||
* a global variable "uwTick" used as application time base.
|
||||
* @param htim : TIM handle
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
{
|
||||
/* USER CODE BEGIN Callback 0 */
|
||||
|
||||
/* USER CODE END Callback 0 */
|
||||
if (htim->Instance == TIM7) {
|
||||
HAL_IncTick();
|
||||
}
|
||||
/* USER CODE BEGIN Callback 1 */
|
||||
|
||||
/* USER CODE END Callback 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function is executed in case of error occurrence.
|
||||
* @retval None
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file spi.c
|
||||
* @brief This file provides code for the configuration
|
||||
* of the SPI instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "spi.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
SPI_HandleTypeDef hspi1;
|
||||
DMA_HandleTypeDef hdma_spi1_tx;
|
||||
|
||||
/* SPI1 init function */
|
||||
void MX_SPI1_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN SPI1_Init 0 */
|
||||
|
||||
/* USER CODE END SPI1_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN SPI1_Init 1 */
|
||||
|
||||
/* USER CODE END SPI1_Init 1 */
|
||||
hspi1.Instance = SPI1;
|
||||
hspi1.Init.Mode = SPI_MODE_MASTER;
|
||||
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
|
||||
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
|
||||
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
|
||||
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
|
||||
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
|
||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
|
||||
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
||||
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
|
||||
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
hspi1.Init.CRCPolynomial = 7;
|
||||
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
|
||||
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
|
||||
if (HAL_SPI_Init(&hspi1) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN SPI1_Init 2 */
|
||||
|
||||
/* USER CODE END SPI1_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
||||
{
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
if(spiHandle->Instance==SPI1)
|
||||
{
|
||||
/* USER CODE BEGIN SPI1_MspInit 0 */
|
||||
|
||||
/* USER CODE END SPI1_MspInit 0 */
|
||||
/* SPI1 clock enable */
|
||||
__HAL_RCC_SPI1_CLK_ENABLE();
|
||||
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
/**SPI1 GPIO Configuration
|
||||
PA4 ------> SPI1_NSS
|
||||
PA5 ------> SPI1_SCK
|
||||
PA7 ------> SPI1_MOSI
|
||||
*/
|
||||
GPIO_InitStruct.Pin = LCD_CS_Pin|LCD_SCK_Pin|LCD_DI_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* SPI1 DMA Init */
|
||||
/* SPI1_TX Init */
|
||||
hdma_spi1_tx.Instance = DMA1_Channel3;
|
||||
hdma_spi1_tx.Init.Request = DMA_REQUEST_1;
|
||||
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);
|
||||
|
||||
/* USER CODE BEGIN SPI1_MspInit 1 */
|
||||
|
||||
/* USER CODE END SPI1_MspInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
|
||||
{
|
||||
|
||||
if(spiHandle->Instance==SPI1)
|
||||
{
|
||||
/* USER CODE BEGIN SPI1_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END SPI1_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_SPI1_CLK_DISABLE();
|
||||
|
||||
/**SPI1 GPIO Configuration
|
||||
PA4 ------> SPI1_NSS
|
||||
PA5 ------> SPI1_SCK
|
||||
PA7 ------> SPI1_MOSI
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, LCD_CS_Pin|LCD_SCK_Pin|LCD_DI_Pin);
|
||||
|
||||
/* SPI1 DMA DeInit */
|
||||
HAL_DMA_DeInit(spiHandle->hdmatx);
|
||||
/* USER CODE BEGIN SPI1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END SPI1_MspDeInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
|
@ -0,0 +1,137 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file stm32l4xx_hal_timebase_tim.c
|
||||
* @brief HAL time base based on the hardware TIM.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32l4xx_hal.h"
|
||||
#include "stm32l4xx_hal_tim.h"
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
TIM_HandleTypeDef htim7;
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief This function configures the TIM7 as a time base source.
|
||||
* The time source is configured to have 1ms time base with a dedicated
|
||||
* Tick interrupt priority.
|
||||
* @note This function is called automatically at the beginning of program after
|
||||
* reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
|
||||
* @param TickPriority: Tick interrupt priority.
|
||||
* @retval HAL status
|
||||
*/
|
||||
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||
{
|
||||
RCC_ClkInitTypeDef clkconfig;
|
||||
uint32_t uwTimclock, uwAPB1Prescaler;
|
||||
|
||||
uint32_t uwPrescalerValue;
|
||||
uint32_t pFLatency;
|
||||
HAL_StatusTypeDef status = HAL_OK;
|
||||
|
||||
/* Enable TIM7 clock */
|
||||
__HAL_RCC_TIM7_CLK_ENABLE();
|
||||
|
||||
/* Get clock configuration */
|
||||
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
|
||||
|
||||
/* Get APB1 prescaler */
|
||||
uwAPB1Prescaler = clkconfig.APB1CLKDivider;
|
||||
/* Compute TIM7 clock */
|
||||
if (uwAPB1Prescaler == RCC_HCLK_DIV1)
|
||||
{
|
||||
uwTimclock = HAL_RCC_GetPCLK1Freq();
|
||||
}
|
||||
else
|
||||
{
|
||||
uwTimclock = 2UL * HAL_RCC_GetPCLK1Freq();
|
||||
}
|
||||
|
||||
/* Compute the prescaler value to have TIM7 counter clock equal to 1MHz */
|
||||
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
|
||||
|
||||
/* Initialize TIM7 */
|
||||
htim7.Instance = TIM7;
|
||||
|
||||
/* Initialize TIMx peripheral as follow:
|
||||
|
||||
+ Period = [(TIM7CLK/1000) - 1]. to have a (1/1000) s time base.
|
||||
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
|
||||
+ ClockDivision = 0
|
||||
+ Counter direction = Up
|
||||
*/
|
||||
htim7.Init.Period = (1000000U / 1000U) - 1U;
|
||||
htim7.Init.Prescaler = uwPrescalerValue;
|
||||
htim7.Init.ClockDivision = 0;
|
||||
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
|
||||
status = HAL_TIM_Base_Init(&htim7);
|
||||
if (status == HAL_OK)
|
||||
{
|
||||
/* Start the TIM time Base generation in interrupt mode */
|
||||
status = HAL_TIM_Base_Start_IT(&htim7);
|
||||
if (status == HAL_OK)
|
||||
{
|
||||
/* Enable the TIM7 global Interrupt */
|
||||
HAL_NVIC_EnableIRQ(TIM7_IRQn);
|
||||
/* Configure the SysTick IRQ priority */
|
||||
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
|
||||
{
|
||||
/* Configure the TIM IRQ priority */
|
||||
HAL_NVIC_SetPriority(TIM7_IRQn, TickPriority, 0U);
|
||||
uwTickPrio = TickPriority;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = HAL_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Return function status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Suspend Tick increment.
|
||||
* @note Disable the tick increment by disabling TIM7 update interrupt.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_SuspendTick(void)
|
||||
{
|
||||
/* Disable TIM7 update Interrupt */
|
||||
__HAL_TIM_DISABLE_IT(&htim7, TIM_IT_UPDATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Resume Tick increment.
|
||||
* @note Enable the tick increment by Enabling TIM7 update interrupt.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_ResumeTick(void)
|
||||
{
|
||||
/* Enable TIM7 Update interrupt */
|
||||
__HAL_TIM_ENABLE_IT(&htim7, TIM_IT_UPDATE);
|
||||
}
|
||||
|
|
@ -47,6 +47,8 @@
|
|||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
void app_tusb_irq_handler(void);
|
||||
|
||||
/* USER CODE END PFP */
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
|
@ -55,6 +57,9 @@
|
|||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern DMA_HandleTypeDef hdma_memtomem_dma1_channel4;
|
||||
extern DMA_HandleTypeDef hdma_spi1_tx;
|
||||
extern TIM_HandleTypeDef htim7;
|
||||
|
||||
/* USER CODE BEGIN EV */
|
||||
|
||||
|
@ -138,19 +143,6 @@ void UsageFault_Handler(void)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles System service call via SWI instruction.
|
||||
*/
|
||||
void SVC_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SVCall_IRQn 0 */
|
||||
|
||||
/* USER CODE END SVCall_IRQn 0 */
|
||||
/* USER CODE BEGIN SVCall_IRQn 1 */
|
||||
|
||||
/* USER CODE END SVCall_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Debug monitor.
|
||||
*/
|
||||
|
@ -164,33 +156,6 @@ void DebugMon_Handler(void)
|
|||
/* USER CODE END DebugMonitor_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Pendable request for system service.
|
||||
*/
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN PendSV_IRQn 0 */
|
||||
|
||||
/* USER CODE END PendSV_IRQn 0 */
|
||||
/* USER CODE BEGIN PendSV_IRQn 1 */
|
||||
|
||||
/* USER CODE END PendSV_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles System tick timer.
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SysTick_IRQn 0 */
|
||||
|
||||
/* USER CODE END SysTick_IRQn 0 */
|
||||
HAL_IncTick();
|
||||
/* USER CODE BEGIN SysTick_IRQn 1 */
|
||||
|
||||
/* USER CODE END SysTick_IRQn 1 */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* STM32L4xx Peripheral Interrupt Handlers */
|
||||
/* Add here the Interrupt Handlers for the used peripherals. */
|
||||
|
@ -198,6 +163,52 @@ void SysTick_Handler(void)
|
|||
/* please refer to the startup file (startup_stm32l4xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 channel3 global interrupt.
|
||||
*/
|
||||
void DMA1_Channel3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Channel3_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Channel3_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi1_tx);
|
||||
/* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Channel3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 channel4 global interrupt.
|
||||
*/
|
||||
void DMA1_Channel4_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Channel4_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_memtomem_dma1_channel4);
|
||||
/* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Channel4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM7 global interrupt.
|
||||
*/
|
||||
void TIM7_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM7_IRQn 0 */
|
||||
|
||||
/* USER CODE END TIM7_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim7);
|
||||
/* USER CODE BEGIN TIM7_IRQn 1 */
|
||||
|
||||
/* USER CODE END TIM7_IRQn 1 */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
void OTG_FS_IRQHandler(void) {
|
||||
app_tusb_irq_handler();
|
||||
}
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file usart.c
|
||||
* @brief This file provides code for the configuration
|
||||
* of the USART instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "usart.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
UART_HandleTypeDef hlpuart1;
|
||||
|
||||
/* LPUART1 init function */
|
||||
|
||||
void MX_LPUART1_UART_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN LPUART1_Init 0 */
|
||||
|
||||
/* USER CODE END LPUART1_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN LPUART1_Init 1 */
|
||||
|
||||
/* USER CODE END LPUART1_Init 1 */
|
||||
hlpuart1.Instance = LPUART1;
|
||||
hlpuart1.Init.BaudRate = 460800;
|
||||
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
|
||||
hlpuart1.Init.StopBits = UART_STOPBITS_1;
|
||||
hlpuart1.Init.Parity = UART_PARITY_NONE;
|
||||
hlpuart1.Init.Mode = UART_MODE_TX_RX;
|
||||
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
|
||||
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
|
||||
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN LPUART1_Init 2 */
|
||||
|
||||
/* USER CODE END LPUART1_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
{
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
|
||||
if(uartHandle->Instance==LPUART1)
|
||||
{
|
||||
/* USER CODE BEGIN LPUART1_MspInit 0 */
|
||||
|
||||
/* USER CODE END LPUART1_MspInit 0 */
|
||||
|
||||
/** Initializes the peripherals clock
|
||||
*/
|
||||
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
|
||||
PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
|
||||
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
/* LPUART1 clock enable */
|
||||
__HAL_RCC_LPUART1_CLK_ENABLE();
|
||||
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
/**LPUART1 GPIO Configuration
|
||||
PB10 ------> LPUART1_RX
|
||||
PB11 ------> LPUART1_TX
|
||||
*/
|
||||
GPIO_InitStruct.Pin = STLK_RX_Pin|STLK_TX_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USER CODE BEGIN LPUART1_MspInit 1 */
|
||||
|
||||
/* USER CODE END LPUART1_MspInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
|
||||
{
|
||||
|
||||
if(uartHandle->Instance==LPUART1)
|
||||
{
|
||||
/* USER CODE BEGIN LPUART1_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END LPUART1_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_LPUART1_CLK_DISABLE();
|
||||
|
||||
/**LPUART1 GPIO Configuration
|
||||
PB10 ------> LPUART1_RX
|
||||
PB11 ------> LPUART1_TX
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, STLK_RX_Pin|STLK_TX_Pin);
|
||||
|
||||
/* USER CODE BEGIN LPUART1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END LPUART1_MspDeInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
|
@ -2,36 +2,113 @@
|
|||
CAD.formats=[]
|
||||
CAD.pinconfig=Project naming
|
||||
CAD.provider=
|
||||
Dma.MEMTOMEM.1.Direction=DMA_MEMORY_TO_MEMORY
|
||||
Dma.MEMTOMEM.1.Instance=DMA1_Channel4
|
||||
Dma.MEMTOMEM.1.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||
Dma.MEMTOMEM.1.MemInc=DMA_MINC_ENABLE
|
||||
Dma.MEMTOMEM.1.Mode=DMA_NORMAL
|
||||
Dma.MEMTOMEM.1.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||
Dma.MEMTOMEM.1.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.MEMTOMEM.1.Priority=DMA_PRIORITY_LOW
|
||||
Dma.MEMTOMEM.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
Dma.Request0=SPI1_TX
|
||||
Dma.Request1=MEMTOMEM
|
||||
Dma.RequestsNb=2
|
||||
Dma.SPI1_TX.0.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.SPI1_TX.0.Instance=DMA1_Channel3
|
||||
Dma.SPI1_TX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.SPI1_TX.0.MemInc=DMA_MINC_ENABLE
|
||||
Dma.SPI1_TX.0.Mode=DMA_NORMAL
|
||||
Dma.SPI1_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.SPI1_TX.0.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.SPI1_TX.0.Priority=DMA_PRIORITY_LOW
|
||||
Dma.SPI1_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||
File.Version=6
|
||||
GPIO.groupedBy=
|
||||
GPIO.groupedBy=Group By Peripherals
|
||||
KeepUserPlacement=false
|
||||
LPUART1.BaudRate=460800
|
||||
LPUART1.IPParameters=BaudRate,WordLength
|
||||
LPUART1.WordLength=UART_WORDLENGTH_8B
|
||||
Mcu.CPN=STM32L496VGT6
|
||||
Mcu.Family=STM32L4
|
||||
Mcu.IP0=NVIC
|
||||
Mcu.IP1=RCC
|
||||
Mcu.IP2=SYS
|
||||
Mcu.IPNb=3
|
||||
Mcu.IP0=DMA
|
||||
Mcu.IP1=LPUART1
|
||||
Mcu.IP2=NVIC
|
||||
Mcu.IP3=RCC
|
||||
Mcu.IP4=SPI1
|
||||
Mcu.IP5=SYS
|
||||
Mcu.IPNb=6
|
||||
Mcu.Name=STM32L496V(E-G)Tx
|
||||
Mcu.Package=LQFP100
|
||||
Mcu.Pin0=PB6
|
||||
Mcu.Pin1=VP_SYS_VS_Systick
|
||||
Mcu.PinsNb=2
|
||||
Mcu.Pin0=PA4
|
||||
Mcu.Pin1=PA5
|
||||
Mcu.Pin10=VP_SYS_VS_tim7
|
||||
Mcu.Pin2=PA6
|
||||
Mcu.Pin3=PA7
|
||||
Mcu.Pin4=PB2
|
||||
Mcu.Pin5=PE7
|
||||
Mcu.Pin6=PB10
|
||||
Mcu.Pin7=PB11
|
||||
Mcu.Pin8=PB5
|
||||
Mcu.Pin9=PB6
|
||||
Mcu.PinsNb=11
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32L496VGTx
|
||||
MxCube.Version=6.9.2
|
||||
MxDb.Version=DB.6.0.92
|
||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.DMA1_Channel3_IRQn=true\:6\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA1_Channel4_IRQn=true\:6\:0\:true\:false\:true\:true\:true\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.ForceEnableDMAVector=true
|
||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
|
||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
|
||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
|
||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
|
||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:false\:true\:false
|
||||
NVIC.TIM7_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
|
||||
NVIC.TimeBase=TIM7_IRQn
|
||||
NVIC.TimeBaseIP=TIM7
|
||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
PA4.GPIOParameters=GPIO_Label
|
||||
PA4.GPIO_Label=LCD_CS
|
||||
PA4.Mode=NSS_Signal_Hard_Output
|
||||
PA4.Signal=SPI1_NSS
|
||||
PA5.GPIOParameters=GPIO_Label
|
||||
PA5.GPIO_Label=LCD_SCK
|
||||
PA5.Locked=true
|
||||
PA5.Mode=TX_Only_Simplex_Unidirect_Master
|
||||
PA5.Signal=SPI1_SCK
|
||||
PA6.GPIOParameters=GPIO_Label
|
||||
PA6.GPIO_Label=LCD_DC
|
||||
PA6.Locked=true
|
||||
PA6.Signal=GPIO_Output
|
||||
PA7.GPIOParameters=GPIO_Label
|
||||
PA7.GPIO_Label=LCD_DI
|
||||
PA7.Mode=TX_Only_Simplex_Unidirect_Master
|
||||
PA7.Signal=SPI1_MOSI
|
||||
PB10.GPIOParameters=GPIO_Label
|
||||
PB10.GPIO_Label=STLK_RX
|
||||
PB10.Locked=true
|
||||
PB10.Mode=Asynchronous
|
||||
PB10.Signal=LPUART1_RX
|
||||
PB11.GPIOParameters=GPIO_Label
|
||||
PB11.GPIO_Label=STLK_TX
|
||||
PB11.Locked=true
|
||||
PB11.Mode=Asynchronous
|
||||
PB11.Signal=LPUART1_TX
|
||||
PB2.GPIOParameters=GPIO_Label
|
||||
PB2.GPIO_Label=LCD_RST
|
||||
PB2.Locked=true
|
||||
PB2.Signal=GPIO_Output
|
||||
PB5.GPIOParameters=PinState,GPIO_Label
|
||||
PB5.GPIO_Label=USB_SW
|
||||
PB5.Locked=true
|
||||
PB5.PinState=GPIO_PIN_SET
|
||||
PB5.Signal=GPIO_Output
|
||||
PB6.GPIOParameters=PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
|
||||
PB6.GPIO_Label=LED1
|
||||
PB6.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
|
||||
|
@ -39,6 +116,10 @@ PB6.GPIO_PuPd=GPIO_NOPULL
|
|||
PB6.Locked=true
|
||||
PB6.PinState=GPIO_PIN_SET
|
||||
PB6.Signal=GPIO_Output
|
||||
PE7.GPIOParameters=GPIO_Label
|
||||
PE7.GPIO_Label=LCD_BLK
|
||||
PE7.Locked=true
|
||||
PE7.Signal=GPIO_Output
|
||||
PinOutPanel.RotationAngle=0
|
||||
ProjectManager.AskForMigrate=true
|
||||
ProjectManager.BackupPrevious=false
|
||||
|
@ -63,20 +144,21 @@ ProjectManager.ProjectBuild=false
|
|||
ProjectManager.ProjectFileName=STM32L496VGTx.ioc
|
||||
ProjectManager.ProjectName=STM32L496VGTx
|
||||
ProjectManager.ProjectStructure=
|
||||
ProjectManager.RegisterCallBack=
|
||||
ProjectManager.RegisterCallBack=SPI
|
||||
ProjectManager.StackSize=0x400
|
||||
ProjectManager.TargetToolchain=Makefile
|
||||
ProjectManager.ToolChainLocation=
|
||||
ProjectManager.UAScriptAfterPath=
|
||||
ProjectManager.UAScriptBeforePath=
|
||||
ProjectManager.UnderRoot=false
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true
|
||||
RCC.ADCFreq_Value=16000000
|
||||
RCC.AHBFreq_Value=80000000
|
||||
RCC.APB1Freq_Value=80000000
|
||||
RCC.APB1TimFreq_Value=80000000
|
||||
RCC.APB2Freq_Value=80000000
|
||||
RCC.APB2TimFreq_Value=80000000
|
||||
RCC.CK48CLockSelection=RCC_USBCLKSOURCE_HSI48
|
||||
RCC.CortexFreq_Value=80000000
|
||||
RCC.DFSDMFreq_Value=80000000
|
||||
RCC.FCLKCortexFreq_Value=80000000
|
||||
|
@ -89,7 +171,7 @@ RCC.I2C1Freq_Value=80000000
|
|||
RCC.I2C2Freq_Value=80000000
|
||||
RCC.I2C3Freq_Value=80000000
|
||||
RCC.I2C4Freq_Value=80000000
|
||||
RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value
|
||||
RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CK48CLockSelection,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value
|
||||
RCC.LPTIM1Freq_Value=80000000
|
||||
RCC.LPTIM2Freq_Value=80000000
|
||||
RCC.LPUART1Freq_Value=80000000
|
||||
|
@ -108,10 +190,10 @@ RCC.PLLSAI1RoutputFreq_Value=16000000
|
|||
RCC.PLLSAI2PoutputFreq_Value=16000000
|
||||
RCC.PLLSAI2RoutputFreq_Value=16000000
|
||||
RCC.PWRFreq_Value=80000000
|
||||
RCC.RNGFreq_Value=16000000
|
||||
RCC.RNGFreq_Value=48000000
|
||||
RCC.SAI1Freq_Value=16000000
|
||||
RCC.SAI2Freq_Value=16000000
|
||||
RCC.SDMMCFreq_Value=16000000
|
||||
RCC.SDMMCFreq_Value=48000000
|
||||
RCC.SWPMI1Freq_Value=80000000
|
||||
RCC.SYSCLKFreq_VALUE=80000000
|
||||
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
|
||||
|
@ -120,11 +202,19 @@ RCC.UART5Freq_Value=80000000
|
|||
RCC.USART1Freq_Value=80000000
|
||||
RCC.USART2Freq_Value=80000000
|
||||
RCC.USART3Freq_Value=80000000
|
||||
RCC.USBFreq_Value=16000000
|
||||
RCC.USBFreq_Value=48000000
|
||||
RCC.VCOInputFreq_Value=4000000
|
||||
RCC.VCOOutputFreq_Value=160000000
|
||||
RCC.VCOSAI1OutputFreq_Value=32000000
|
||||
RCC.VCOSAI2OutputFreq_Value=32000000
|
||||
VP_SYS_VS_Systick.Mode=SysTick
|
||||
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
||||
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4
|
||||
SPI1.CalculateBaudRate=20.0 MBits/s
|
||||
SPI1.DataSize=SPI_DATASIZE_8BIT
|
||||
SPI1.Direction=SPI_DIRECTION_2LINES
|
||||
SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize,VirtualNSS
|
||||
SPI1.Mode=SPI_MODE_MASTER
|
||||
SPI1.VirtualNSS=VM_NSSHARD
|
||||
SPI1.VirtualType=VM_MASTER
|
||||
VP_SYS_VS_tim7.Mode=TIM7
|
||||
VP_SYS_VS_tim7.Signal=SYS_VS_tim7
|
||||
board=custom
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 0c633e6b9fa1abb6947f989c974cf5c24a0ee361
|
|
@ -0,0 +1,113 @@
|
|||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
/* Ensure stdint is only used by the compiler, and not the assembler. */
|
||||
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
|
||||
#include <stdint.h>
|
||||
extern uint32_t SystemCoreClock;
|
||||
#endif
|
||||
|
||||
/* General configuration */
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
|
||||
#define configCPU_CLOCK_HZ (SystemCoreClock)
|
||||
#define configTICK_RATE_HZ 1000
|
||||
#define configMAX_PRIORITIES 8
|
||||
#define configMINIMAL_STACK_SIZE 128
|
||||
#define configMAX_TASK_NAME_LEN 16
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
#define configUSE_TASK_NOTIFICATIONS 1
|
||||
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configUSE_RECURSIVE_MUTEXES 1
|
||||
#define configUSE_COUNTING_SEMAPHORES 0
|
||||
#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */
|
||||
#define configQUEUE_REGISTRY_SIZE 10
|
||||
#define configUSE_QUEUE_SETS 0
|
||||
#define configUSE_TIME_SLICING 0
|
||||
#define configUSE_NEWLIB_REENTRANT 1
|
||||
#define configENABLE_BACKWARD_COMPATIBILITY 0
|
||||
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5
|
||||
#define configSTACK_DEPTH_TYPE uint16_t
|
||||
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define configUSE_TICKLESS_IDLE 1
|
||||
#else
|
||||
#define configUSE_TICKLESS_IDLE 0
|
||||
#endif
|
||||
|
||||
/* Memory allocation related definitions. */
|
||||
#define configSUPPORT_STATIC_ALLOCATION 0
|
||||
#define configSUPPORT_DYNAMIC_ALLOCATION 1
|
||||
#define configTOTAL_HEAP_SIZE (32 * 1024)
|
||||
#define configAPPLICATION_ALLOCATED_HEAP 0
|
||||
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
|
||||
|
||||
/* Hook function related definitions. */
|
||||
#define configUSE_IDLE_HOOK 0
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCHECK_FOR_STACK_OVERFLOW 0
|
||||
#define configUSE_MALLOC_FAILED_HOOK 0
|
||||
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
|
||||
|
||||
/* Run time and task stats gathering related definitions. */
|
||||
#define configGENERATE_RUN_TIME_STATS 0
|
||||
#define configUSE_TRACE_FACILITY 0
|
||||
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
|
||||
|
||||
/* Co-routine related definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES 1
|
||||
|
||||
/* Software timer related definitions. */
|
||||
#define configUSE_TIMERS 1
|
||||
#define configTIMER_TASK_PRIORITY 3
|
||||
#define configTIMER_QUEUE_LENGTH 10
|
||||
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
|
||||
|
||||
/* Define to trap errors during development. */
|
||||
#define configASSERT( x ) if( ( x ) == 0 ) for(;;) { }
|
||||
|
||||
/* Optional functions - most linkers will remove unused functions anyway. */
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_xResumeFromISR 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
#define INCLUDE_xTaskGetSchedulerState 1
|
||||
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
||||
#define INCLUDE_xTaskGetIdleTaskHandle 0
|
||||
#define INCLUDE_eTaskGetState 0
|
||||
#define INCLUDE_xEventGroupSetBitFromISR 1
|
||||
#define INCLUDE_xTimerPendFunctionCall 0
|
||||
#define INCLUDE_xTaskAbortDelay 0
|
||||
#define INCLUDE_xTaskGetHandle 0
|
||||
#define INCLUDE_xTaskResumeFromISR 1
|
||||
|
||||
|
||||
/* Port-specific settings */
|
||||
|
||||
#ifdef __NVIC_PRIO_BITS
|
||||
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
|
||||
#define configPRIO_BITS __NVIC_PRIO_BITS
|
||||
#else
|
||||
#define configPRIO_BITS 4 /* 16 priority levels */
|
||||
#endif
|
||||
|
||||
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
|
||||
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
|
||||
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
|
||||
#define vPortSVCHandler SVC_Handler
|
||||
#define xPortPendSVHandler PendSV_Handler
|
||||
#define xPortSysTickHandler SysTick_Handler
|
||||
|
||||
/* A header file that defines trace macro can be included here. */
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef APP_LCD_IMPL_H
|
||||
#define APP_LCD_IMPL_H
|
||||
|
||||
#include "epd-spi/epd_common.h"
|
||||
|
||||
int app_lcd_impl_init(void);
|
||||
epd_ret_t app_lcd_impl_write_command(void *handle, uint8_t *command, uint32_t len);
|
||||
epd_ret_t app_lcd_impl_write_data(void *handle, const uint8_t *data, uint32_t len);
|
||||
epd_ret_t app_lcd_impl_reset(void *handle);
|
||||
epd_ret_t app_lcd_impl_delay(void *handle, uint32_t msec);
|
||||
epd_ret_t app_lcd_impl_backlight(void *handle, uint8_t on);
|
||||
|
||||
#endif // APP_LCD_IMPL_H
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef APP_LIGHTING_H
|
||||
#define APP_LIGHTING_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int app_lighting_init(void);
|
||||
uint16_t app_lighting_get_array_attributes(uint8_t *buffer);
|
||||
uint16_t app_lighting_get_lamp_attributes(uint8_t *buffer);
|
||||
void app_lighting_set_lamp_attributes_req(const uint8_t *buffer);
|
||||
void app_lighting_set_lamp_multi_update(const uint8_t *buffer);
|
||||
void app_lighting_set_lamp_range_update(const uint8_t *buffer);
|
||||
void app_lighting_set_lamp_array_control(const uint8_t *buffer);
|
||||
|
||||
#endif // APP_LIGHTING_H
|
|
@ -0,0 +1,6 @@
|
|||
#ifndef APP_TUSB_H
|
||||
#define APP_TUSB_H
|
||||
|
||||
int app_tusb_init(void);
|
||||
|
||||
#endif // APP_TUSB_H
|
|
@ -0,0 +1,317 @@
|
|||
#ifndef APP_TUSB_DESCRIPTORS_H
|
||||
#define APP_TUSB_DESCRIPTORS_H
|
||||
|
||||
#define APP_TUSB_VID (0x1FC9U)
|
||||
#define APP_TUSB_PID (0xAFFFU)
|
||||
|
||||
#define APP_TUSB_STRING_ID_LANG (0x00U)
|
||||
#define APP_TUSB_STRING_ID_MFG (0x01U)
|
||||
#define APP_TUSB_STRING_ID_PRODUCT (0x02U)
|
||||
#define APP_TUSB_STRING_ID_SERIAL (0x03U)
|
||||
|
||||
#define HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION (0x59U)
|
||||
|
||||
enum {
|
||||
HID_USAGE_LIGHTING_LAMP_ARRAY = 0x01,
|
||||
HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT = 0x02,
|
||||
HID_USAGE_LIGHTING_LAMP_COUNT = 0x03,
|
||||
HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS = 0x04,
|
||||
HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS = 0x05,
|
||||
HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS = 0x06,
|
||||
HID_USAGE_LIGHTING_LAMP_ARRAY_KIND = 0x07,
|
||||
HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,
|
||||
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT = 0x20,
|
||||
HID_USAGE_LIGHTING_LAMP_ID = 0x21,
|
||||
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT = 0x22,
|
||||
HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS = 0x23,
|
||||
HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS = 0x24,
|
||||
HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS = 0x25,
|
||||
HID_USAGE_LIGHTING_LAMP_PURPOSES = 0x26,
|
||||
HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS = 0x27,
|
||||
HID_USAGE_LIGHTING_RED_LEVEL_COUNT = 0x28,
|
||||
HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT = 0x29,
|
||||
HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT = 0x2A,
|
||||
HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT = 0x2B,
|
||||
HID_USAGE_LIGHTING_IS_PROGRAMMABLE = 0x2C,
|
||||
HID_USAGE_LIGHTING_INPUT_BINDING = 0x2D,
|
||||
HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT = 0x50,
|
||||
HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL = 0x51,
|
||||
HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL = 0x52,
|
||||
HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL = 0x53,
|
||||
HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL = 0x54,
|
||||
HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS = 0x55,
|
||||
HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT = 0x60,
|
||||
HID_USAGE_LIGHTING_LAMP_ID_START = 0x61,
|
||||
HID_USAGE_LIGHTING_LAMP_ID_END = 0x62,
|
||||
HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT = 0x70,
|
||||
HID_USAGE_LIGHTING_AUTONOMOUS_MODE = 0x71,
|
||||
};
|
||||
|
||||
/* clang-format off */
|
||||
|
||||
// HID Lighting and Illumination Report Descriptor Template
|
||||
// - 1st parameter is report id (required)
|
||||
// Creates 6 report ids for lighting HID usages in the following order:
|
||||
// report_id+0: HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT
|
||||
// report_id+1: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT
|
||||
// report_id+2: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT
|
||||
// report_id+3: HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT
|
||||
// report_id+4: HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT
|
||||
// report_id+5: HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT
|
||||
#define TUD_HID_REPORT_DESC_LIGHTING(report_id) \
|
||||
HID_USAGE_PAGE ( HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_APPLICATION ), /* Lamp Array Attributes Report */ \
|
||||
HID_REPORT_ID (report_id ) \
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 65535, 3 ),\
|
||||
HID_REPORT_SIZE ( 16 ),\
|
||||
HID_REPORT_COUNT ( 1 ),\
|
||||
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_KIND ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
|
||||
HID_REPORT_SIZE ( 32 ),\
|
||||
HID_REPORT_COUNT ( 5 ),\
|
||||
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_COLLECTION_END , /* Lamp Attributes Request Report */ \
|
||||
HID_REPORT_ID ( report_id + 1 ) \
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 65535, 3 ),\
|
||||
HID_REPORT_SIZE ( 16 ),\
|
||||
HID_REPORT_COUNT ( 1 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_COLLECTION_END , /* Lamp Attributes Response Report */ \
|
||||
HID_REPORT_ID ( report_id + 2 ) \
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 65535, 3 ),\
|
||||
HID_REPORT_SIZE ( 16 ),\
|
||||
HID_REPORT_COUNT ( 1 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_PURPOSES ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
|
||||
HID_REPORT_SIZE ( 32 ),\
|
||||
HID_REPORT_COUNT ( 5 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_LEVEL_COUNT ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_IS_PROGRAMMABLE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INPUT_BINDING ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 255, 2 ),\
|
||||
HID_REPORT_SIZE ( 8 ),\
|
||||
HID_REPORT_COUNT ( 6 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_COLLECTION_END , /* Lamp Multi-Update Report */ \
|
||||
HID_REPORT_ID ( report_id + 3 ) \
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX ( 8 ),\
|
||||
HID_REPORT_SIZE ( 8 ),\
|
||||
HID_REPORT_COUNT ( 2 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 65535, 3 ),\
|
||||
HID_REPORT_SIZE ( 16 ),\
|
||||
HID_REPORT_COUNT ( 8 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 255, 2 ),\
|
||||
HID_REPORT_SIZE ( 8 ),\
|
||||
HID_REPORT_COUNT ( 32 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_COLLECTION_END , /* Lamp Range Update Report */ \
|
||||
HID_REPORT_ID ( report_id + 4 ) \
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX ( 8 ),\
|
||||
HID_REPORT_SIZE ( 8 ),\
|
||||
HID_REPORT_COUNT ( 1 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_START ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_END ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 65535, 3 ),\
|
||||
HID_REPORT_SIZE ( 16 ),\
|
||||
HID_REPORT_COUNT ( 2 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX_N ( 255, 2 ),\
|
||||
HID_REPORT_SIZE ( 8 ),\
|
||||
HID_REPORT_COUNT ( 4 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_COLLECTION_END , /* Lamp Array Control Report */ \
|
||||
HID_REPORT_ID ( report_id + 5 ) \
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT ),\
|
||||
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
|
||||
HID_USAGE ( HID_USAGE_LIGHTING_AUTONOMOUS_MODE ),\
|
||||
HID_LOGICAL_MIN ( 0 ),\
|
||||
HID_LOGICAL_MAX ( 1 ),\
|
||||
HID_REPORT_SIZE ( 8 ),\
|
||||
HID_REPORT_COUNT ( 1 ),\
|
||||
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
|
||||
HID_COLLECTION_END ,\
|
||||
HID_COLLECTION_END
|
||||
|
||||
/* clang-format on */
|
||||
|
||||
enum {
|
||||
REPORT_ID_CONSUMER = 1,
|
||||
REPORT_ID_LIGHTING_LAMP_ARRAY_ATTRIBUTES, // 2
|
||||
REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_REQUEST, // 3
|
||||
REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_RESPONSE, // 4
|
||||
REPORT_ID_LIGHTING_LAMP_MULTI_UPDATE, // 5
|
||||
REPORT_ID_LIGHTING_LAMP_RANGE_UPDATE, // 6
|
||||
REPORT_ID_LIGHTING_LAMP_ARRAY_CONTROL, // 7
|
||||
REPORT_ID_COUNT,
|
||||
};
|
||||
|
||||
static const tusb_desc_device_t s_tud_desc_dev = {
|
||||
.bLength = sizeof(tusb_desc_device_t),
|
||||
.bDescriptorType = TUSB_DESC_DEVICE,
|
||||
.bcdUSB = 0x0200,
|
||||
.bDeviceClass = 0x00,
|
||||
.bDeviceSubClass = 0x00,
|
||||
.bDeviceProtocol = 0x00,
|
||||
.bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
|
||||
|
||||
.idVendor = APP_TUSB_VID,
|
||||
.idProduct = APP_TUSB_PID,
|
||||
.bcdDevice = 0x0100,
|
||||
|
||||
.iManufacturer = 0x01,
|
||||
.iProduct = 0x02,
|
||||
.iSerialNumber = 0x03,
|
||||
|
||||
.bNumConfigurations = 0x01,
|
||||
};
|
||||
|
||||
static const uint8_t s_tud_desc_hid_report[] = {
|
||||
TUD_HID_REPORT_DESC_CONSUMER(HID_REPORT_ID(1)),
|
||||
TUD_HID_REPORT_DESC_LIGHTING(REPORT_ID_LIGHTING_LAMP_ARRAY_ATTRIBUTES),
|
||||
};
|
||||
|
||||
static const uint8_t s_tud_desc_configuration[] = {
|
||||
TUD_CONFIG_DESCRIPTOR(1, 1, 0, (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN), 0x00, 500),
|
||||
TUD_HID_DESCRIPTOR(0, 0, HID_ITF_PROTOCOL_NONE, sizeof(s_tud_desc_hid_report), 0x81, CFG_TUD_HID_EP_BUFSIZE, 5),
|
||||
};
|
||||
|
||||
static const uint16_t s_tud_desc_string_lang[] = {
|
||||
((TUSB_DESC_STRING << 8U) | 4), /* 1 * 2 + 2 */
|
||||
0x0409U,
|
||||
};
|
||||
|
||||
static const uint16_t s_tud_desc_string_mfg[] = {
|
||||
((TUSB_DESC_STRING << 8U) | 16), /* 7 * 2 + 2 */
|
||||
'T',
|
||||
'i',
|
||||
'n',
|
||||
'y',
|
||||
'U',
|
||||
'S',
|
||||
'B',
|
||||
};
|
||||
|
||||
static const uint16_t s_tud_desc_string_product[] = {
|
||||
((TUSB_DESC_STRING << 8U) | 30), /* 14 * 2 + 2 */
|
||||
'T',
|
||||
'i',
|
||||
'n',
|
||||
'y',
|
||||
'U',
|
||||
'S',
|
||||
'B',
|
||||
' ',
|
||||
'D',
|
||||
'e',
|
||||
'v',
|
||||
'i',
|
||||
'c',
|
||||
'e',
|
||||
};
|
||||
|
||||
static const uint16_t s_tud_desc_string_serial[] = {
|
||||
((TUSB_DESC_STRING << 8U) | 30), /* 14 * 2 + 2 */
|
||||
'A',
|
||||
'B',
|
||||
'C',
|
||||
'D',
|
||||
'E',
|
||||
'F',
|
||||
'G',
|
||||
'1',
|
||||
'2',
|
||||
'3',
|
||||
'4',
|
||||
'5',
|
||||
'6',
|
||||
'7',
|
||||
};
|
||||
|
||||
static const uint16_t s_tud_desc_string_unknown[] = {
|
||||
((TUSB_DESC_STRING << 8U) | 2),
|
||||
};
|
||||
|
||||
#endif // APP_TUSB_DESCRIPTORS_H
|
|
@ -0,0 +1,79 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
#ifndef LAMP_ARRAY_HID_STRUCTS_H
|
||||
#define LAMP_ARRAY_HID_STRUCTS_H
|
||||
|
||||
typedef struct {
|
||||
uint8_t red;
|
||||
uint8_t green;
|
||||
uint8_t blue;
|
||||
uint8_t intensity;
|
||||
} __attribute__((packed, aligned(1))) LampColor;
|
||||
|
||||
typedef struct {
|
||||
uint32_t x;
|
||||
uint32_t y;
|
||||
uint32_t z;
|
||||
} __attribute__((packed, aligned(1))) Position;
|
||||
|
||||
typedef struct {
|
||||
uint16_t lampCount;
|
||||
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t depth;
|
||||
|
||||
uint32_t lampArrayKind;
|
||||
uint32_t minUpdateInterval;
|
||||
} __attribute__((packed, aligned(1))) LampArrayAttributesReport;
|
||||
|
||||
typedef struct {
|
||||
uint16_t lampId;
|
||||
} __attribute__((packed, aligned(1))) LampAttributesRequestReport;
|
||||
|
||||
#define LAMP_PURPOSE_CONTROL 0x01
|
||||
#define LAMP_PURPOSE_ACCENT 0x02
|
||||
#define LAMP_PURPOSE_BRANDING 0x04
|
||||
#define LAMP_PURPOSE_STATUS 0x08
|
||||
#define LAMP_PURPOSE_ILLUMINATION 0x10
|
||||
#define LAMP_PURPOSE_PRESENTATION 0x20
|
||||
|
||||
typedef struct {
|
||||
uint16_t lampId;
|
||||
|
||||
Position lampPosition;
|
||||
|
||||
uint32_t updateLatency;
|
||||
uint32_t lampPurposes;
|
||||
|
||||
uint8_t redLevelCount;
|
||||
uint8_t greenLevelCount;
|
||||
uint8_t blueLevelCount;
|
||||
uint8_t intensityLevelCount;
|
||||
|
||||
uint8_t isProgrammable;
|
||||
uint8_t inputBinding;
|
||||
} __attribute__((packed, aligned(1))) LampAttributesResponseReport;
|
||||
|
||||
typedef struct {
|
||||
uint8_t lampCount;
|
||||
uint8_t flags;
|
||||
uint16_t lampIds[8];
|
||||
|
||||
LampColor colors[8];
|
||||
} __attribute__((packed, aligned(1))) LampMultiUpdateReport;
|
||||
|
||||
typedef struct {
|
||||
uint8_t flags;
|
||||
uint16_t lampIdStart;
|
||||
uint16_t lampIdEnd;
|
||||
|
||||
LampColor color;
|
||||
} __attribute__((packed, aligned(1))) LampRangeUpdateReport;
|
||||
|
||||
typedef struct {
|
||||
uint8_t autonomousMode;
|
||||
} __attribute__((packed, aligned(1))) LampArrayControlReport;
|
||||
|
||||
#endif
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Ha Thach (tinyusb.org)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _TUSB_CONFIG_H_
|
||||
#define _TUSB_CONFIG_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Board Specific Configuration
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
// RHPort number used for device can be defined by board.mk, default to port 0
|
||||
#ifndef BOARD_TUD_RHPORT
|
||||
#define BOARD_TUD_RHPORT 0
|
||||
#endif
|
||||
|
||||
// RHPort max operational speed can defined by board.mk
|
||||
#ifndef BOARD_TUD_MAX_SPEED
|
||||
#define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// COMMON CONFIGURATION
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
// defined by compiler flags for flexibility
|
||||
#ifndef CFG_TUSB_MCU
|
||||
#error CFG_TUSB_MCU must be defined
|
||||
#endif
|
||||
|
||||
#ifndef CFG_TUSB_OS
|
||||
#define CFG_TUSB_OS OPT_OS_FREERTOS
|
||||
#endif
|
||||
|
||||
#ifndef CFG_TUSB_DEBUG
|
||||
#define CFG_TUSB_DEBUG 0
|
||||
#endif
|
||||
|
||||
// Enable Device stack
|
||||
#define CFG_TUD_ENABLED 1
|
||||
|
||||
// Default is max speed that hardware controller could support with on-chip PHY
|
||||
#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED
|
||||
|
||||
/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
|
||||
* Tinyusb use follows macros to declare transferring memory so that they can be put
|
||||
* into those specific section.
|
||||
* e.g
|
||||
* - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") ))
|
||||
* - CFG_TUSB_MEM_ALIGN : __attribute__ ((aligned(4)))
|
||||
*/
|
||||
#ifndef CFG_TUSB_MEM_SECTION
|
||||
#define CFG_TUSB_MEM_SECTION
|
||||
#endif
|
||||
|
||||
#ifndef CFG_TUSB_MEM_ALIGN
|
||||
#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4)))
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// DEVICE CONFIGURATION
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
#ifndef CFG_TUD_ENDPOINT0_SIZE
|
||||
#define CFG_TUD_ENDPOINT0_SIZE 64
|
||||
#endif
|
||||
|
||||
//------------- CLASS -------------//
|
||||
#define CFG_TUD_CDC 0
|
||||
#define CFG_TUD_MSC 0
|
||||
#define CFG_TUD_HID 1
|
||||
#define CFG_TUD_MIDI 0
|
||||
#define CFG_TUD_VENDOR 0
|
||||
|
||||
//------------ CDC --------------//
|
||||
|
||||
#define CFG_TUD_CDC_RX_BUFSIZE 64
|
||||
#define CFG_TUD_CDC_TX_BUFSIZE 64
|
||||
|
||||
// HID buffer size Should be sufficient to hold ID (if any) + Data
|
||||
#define CFG_TUD_HID_EP_BUFSIZE 64
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _TUSB_CONFIG_H_ */
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 0264280230aa6a828247b5f05bf57e33f1994581
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 7d0de59c3bba1766cc7d2417e5ae11d5a0f82372
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 10558acac6658d1480a6a6c025e006f2a6f4e212
|
|
@ -0,0 +1,102 @@
|
|||
/* FreeRTOS */
|
||||
#include "FreeRTOS.h"
|
||||
#include "semphr.h"
|
||||
#include "task.h"
|
||||
|
||||
/* HAL */
|
||||
#include "stm32l4xx_hal.h"
|
||||
|
||||
/* MX */
|
||||
#include "dma.h"
|
||||
#include "gpio.h"
|
||||
#include "spi.h"
|
||||
|
||||
/* LCD */
|
||||
#include "epd-spi/driver/lcd_st7789.h"
|
||||
|
||||
#define SET_DC(x) HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, x)
|
||||
#define SET_RST(x) HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, x)
|
||||
#define SET_BLK(x) HAL_GPIO_WritePin(LCD_BLK_GPIO_Port, LCD_BLK_Pin, x)
|
||||
|
||||
static SemaphoreHandle_t s_spi_dma_semaphore = NULL;
|
||||
|
||||
static void app_lcd_spi_evt_callback(SPI_HandleTypeDef *hspi);
|
||||
|
||||
int app_lcd_impl_init(void) {
|
||||
SET_BLK(GPIO_PIN_RESET);
|
||||
SET_DC(GPIO_PIN_SET);
|
||||
SET_RST(GPIO_PIN_SET);
|
||||
|
||||
HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_COMPLETE_CB_ID, app_lcd_spi_evt_callback);
|
||||
|
||||
s_spi_dma_semaphore = xSemaphoreCreateBinary();
|
||||
if (s_spi_dma_semaphore == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
epd_ret_t app_lcd_impl_write_command(void *handle, uint8_t *command, uint32_t len) {
|
||||
HAL_StatusTypeDef ret;
|
||||
|
||||
SET_DC(GPIO_PIN_RESET);
|
||||
ret = HAL_SPI_Transmit(&hspi1, command, 0x01, 1000);
|
||||
if (ret != HAL_OK) {
|
||||
return EPD_FAIL;
|
||||
}
|
||||
|
||||
if (len > 1) {
|
||||
SET_DC(GPIO_PIN_SET);
|
||||
ret = HAL_SPI_Transmit(&hspi1, &command[1], len - 1, 1000);
|
||||
if (ret != HAL_OK) {
|
||||
return EPD_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
return EPD_OK;
|
||||
}
|
||||
|
||||
epd_ret_t app_lcd_impl_write_data(void *handle, const uint8_t *data, uint32_t len) {
|
||||
HAL_StatusTypeDef ret;
|
||||
|
||||
SET_DC(GPIO_PIN_SET);
|
||||
ret = HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)data, len);
|
||||
if (ret != HAL_OK) {
|
||||
return EPD_FAIL;
|
||||
}
|
||||
|
||||
xSemaphoreTake(s_spi_dma_semaphore, portMAX_DELAY);
|
||||
|
||||
return EPD_OK;
|
||||
}
|
||||
|
||||
epd_ret_t app_lcd_impl_reset(void *handle) {
|
||||
SET_RST(GPIO_PIN_RESET);
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
SET_RST(GPIO_PIN_SET);
|
||||
|
||||
return EPD_OK;
|
||||
}
|
||||
|
||||
epd_ret_t app_lcd_impl_delay(void *handle, uint32_t msec) {
|
||||
vTaskDelay(pdMS_TO_TICKS(msec));
|
||||
|
||||
return EPD_OK;
|
||||
}
|
||||
|
||||
epd_ret_t app_lcd_impl_backlight(void *handle, uint8_t on) {
|
||||
if (on) {
|
||||
SET_BLK(GPIO_PIN_SET);
|
||||
} else {
|
||||
SET_BLK(GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
return EPD_OK;
|
||||
}
|
||||
|
||||
static void app_lcd_spi_evt_callback(SPI_HandleTypeDef *hspi) {
|
||||
BaseType_t hp_woken = pdFALSE;
|
||||
xSemaphoreGiveFromISR(s_spi_dma_semaphore, &hp_woken);
|
||||
portYIELD_FROM_ISR(hp_woken);
|
||||
}
|
|
@ -0,0 +1,224 @@
|
|||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/* FreeRTOS */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
#include "semphr.h"
|
||||
#include "task.h"
|
||||
|
||||
/* HAL */
|
||||
#include "stm32l4xx_hal.h"
|
||||
|
||||
/* MX */
|
||||
#include "dma.h"
|
||||
|
||||
/* LCD */
|
||||
#include "epd-spi/panel/lcd_h144c121d.h"
|
||||
|
||||
/* App */
|
||||
#include "app_lcd_impl.h"
|
||||
#include "illumination/LampArrayHidStructs.h"
|
||||
|
||||
#define APP_LAMP_COUNT 64
|
||||
#define APP_LAMP_QUEUE_LENGTH 64
|
||||
|
||||
#define APP_LCD_BUF_WIDTH 30
|
||||
#define APP_LCD_BUF_HEIGHT 30
|
||||
|
||||
typedef enum {
|
||||
APP_LAMP_UPDATE_SINGLE,
|
||||
APP_LAMP_UPDATE_MULTI,
|
||||
} app_lighting_update_cmd_t;
|
||||
|
||||
typedef struct {
|
||||
app_lighting_update_cmd_t cmd;
|
||||
uint8_t lamp_id_start;
|
||||
uint8_t lamp_id_end;
|
||||
uint16_t color_565;
|
||||
} app_lighting_q_item_t;
|
||||
|
||||
static uint16_t s_active_lamp_id = 0U;
|
||||
static Position s_lamp_pos[APP_LAMP_COUNT];
|
||||
static uint8_t s_lamp_buf[APP_LCD_BUF_WIDTH * APP_LCD_BUF_HEIGHT * 2];
|
||||
|
||||
static QueueHandle_t s_lamp_update_queue = NULL;
|
||||
static SemaphoreHandle_t s_memory_fill_semaphore = NULL;
|
||||
|
||||
static lcd_st7789_t s_lcd = {
|
||||
.cb =
|
||||
{
|
||||
.write_command_cb = app_lcd_impl_write_command,
|
||||
.write_data_cb = app_lcd_impl_write_data,
|
||||
.reset_cb = app_lcd_impl_reset,
|
||||
.backlight_cb = app_lcd_impl_backlight,
|
||||
.delay_cb = app_lcd_impl_delay,
|
||||
},
|
||||
.user_data = NULL,
|
||||
};
|
||||
|
||||
static void app_lighting_fill_callback(DMA_HandleTypeDef *hdma);
|
||||
static void app_lighting_control_task(void *parameters);
|
||||
|
||||
int app_lighting_init(void) {
|
||||
if (app_lcd_impl_init() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (lcd_st7789_init(&s_lcd, &lcd_h144c121d_panel_config) != EPD_OK) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
s_lamp_update_queue = xQueueCreate(APP_LAMP_QUEUE_LENGTH, sizeof(app_lighting_q_item_t));
|
||||
if (s_lamp_update_queue == NULL) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
s_memory_fill_semaphore = xSemaphoreCreateBinary();
|
||||
if (s_memory_fill_semaphore == NULL) {
|
||||
return -4;
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < APP_LAMP_COUNT; i++) {
|
||||
s_lamp_pos[i].x = (i % 8) * 10000;
|
||||
s_lamp_pos[i].y = (i / 8) * 10000;
|
||||
s_lamp_pos[i].z = 2500;
|
||||
}
|
||||
|
||||
HAL_DMA_RegisterCallback(&hdma_memtomem_dma1_channel4, HAL_DMA_XFER_CPLT_CB_ID, app_lighting_fill_callback);
|
||||
|
||||
if (xTaskCreate(app_lighting_control_task, "LC", 512, NULL, 3, NULL) != pdPASS) {
|
||||
return -5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t app_lighting_get_array_attributes(uint8_t *buffer) {
|
||||
LampArrayAttributesReport report = {
|
||||
.lampCount = APP_LAMP_COUNT,
|
||||
.width = 80000,
|
||||
.height = 80000,
|
||||
.depth = 5000,
|
||||
.lampArrayKind = 0x0A,
|
||||
};
|
||||
|
||||
memcpy(buffer, &report, sizeof(LampArrayAttributesReport));
|
||||
return sizeof(report);
|
||||
}
|
||||
|
||||
uint16_t app_lighting_get_lamp_attributes(uint8_t *buffer) {
|
||||
LampAttributesResponseReport report = {
|
||||
.lampId = s_active_lamp_id, // LampId
|
||||
.lampPosition = s_lamp_pos[s_active_lamp_id], // Lamp position
|
||||
.updateLatency = 33000, // Lamp update interval
|
||||
.lampPurposes = LAMP_PURPOSE_ACCENT, // Lamp purpose
|
||||
.redLevelCount = 255, // Red level count
|
||||
.blueLevelCount = 255, // Blue level count
|
||||
.greenLevelCount = 255, // Green level count
|
||||
.intensityLevelCount = 1, // Intensity
|
||||
.isProgrammable = 1, // Is Programmable
|
||||
};
|
||||
|
||||
memcpy(buffer, &report, sizeof(LampAttributesResponseReport));
|
||||
|
||||
s_active_lamp_id++;
|
||||
if (s_active_lamp_id == APP_LAMP_COUNT) {
|
||||
s_active_lamp_id = 0;
|
||||
}
|
||||
|
||||
return sizeof(report);
|
||||
}
|
||||
|
||||
void app_lighting_set_lamp_attributes_req(const uint8_t *buffer) {
|
||||
LampAttributesRequestReport *report = (LampAttributesRequestReport *)buffer;
|
||||
|
||||
s_active_lamp_id = report->lampId;
|
||||
}
|
||||
|
||||
void app_lighting_set_lamp_multi_update(const uint8_t *buffer) {
|
||||
LampMultiUpdateReport *report = (LampMultiUpdateReport *)buffer;
|
||||
|
||||
for (int i = 0; i < report->lampCount; i++) {
|
||||
uint16_t color_565 = 0U;
|
||||
color_565 |= ((report->colors[i].red >> 3) & 0x1F) << 11U;
|
||||
color_565 |= ((report->colors[i].green >> 2) & 0x3F) << 5U;
|
||||
color_565 |= ((report->colors[i].blue) >> 3) & 0x1F;
|
||||
|
||||
app_lighting_q_item_t lc_qi = {
|
||||
.cmd = APP_LAMP_UPDATE_SINGLE,
|
||||
.color_565 = color_565,
|
||||
.lamp_id_start = report->lampIds[i],
|
||||
};
|
||||
|
||||
xQueueSend(s_lamp_update_queue, &lc_qi, pdMS_TO_TICKS(20));
|
||||
}
|
||||
}
|
||||
|
||||
void app_lighting_set_lamp_range_update(const uint8_t *buffer) {
|
||||
LampRangeUpdateReport *report = (LampRangeUpdateReport *)buffer;
|
||||
|
||||
uint16_t color_565 = 0U;
|
||||
color_565 |= ((report->color.red >> 3) & 0x1F) << 11U;
|
||||
color_565 |= ((report->color.green >> 2) & 0x3F) << 5U;
|
||||
color_565 |= ((report->color.blue) >> 3) & 0x1F;
|
||||
|
||||
app_lighting_q_item_t lc_qi = {
|
||||
.cmd = APP_LAMP_UPDATE_MULTI,
|
||||
.color_565 = color_565,
|
||||
.lamp_id_start = report->lampIdStart,
|
||||
.lamp_id_end = report->lampIdEnd,
|
||||
};
|
||||
xQueueSend(s_lamp_update_queue, &lc_qi, pdMS_TO_TICKS(20));
|
||||
}
|
||||
|
||||
void app_lighting_set_lamp_array_control(const uint8_t *buffer) {
|
||||
}
|
||||
|
||||
static void app_lighting_fill_lcd_block(uint16_t color, uint8_t *buf) {
|
||||
uint16_t color_swapped = ((color & 0xFFU) << 8U) | (color >> 8U);
|
||||
|
||||
HAL_DMA_Start_IT(&hdma_memtomem_dma1_channel4, (uint32_t)&color_swapped, (uint32_t)buf,
|
||||
(APP_LCD_BUF_WIDTH * APP_LCD_BUF_HEIGHT));
|
||||
|
||||
xSemaphoreTake(s_memory_fill_semaphore, portMAX_DELAY);
|
||||
}
|
||||
|
||||
static void app_lighting_update_lamp(uint8_t id, const uint8_t *buf) {
|
||||
epd_coord_t coord = {
|
||||
.x_start = (id % 8) * APP_LCD_BUF_WIDTH,
|
||||
.x_end = ((id % 8) * APP_LCD_BUF_WIDTH + APP_LCD_BUF_WIDTH - 1),
|
||||
.y_start = (id / 8) * APP_LCD_BUF_HEIGHT,
|
||||
.y_end = ((id / 8) * APP_LCD_BUF_HEIGHT + APP_LCD_BUF_HEIGHT - 1),
|
||||
};
|
||||
|
||||
lcd_st7789_load(&s_lcd, &coord, buf);
|
||||
}
|
||||
|
||||
static void app_lighting_fill_callback(DMA_HandleTypeDef *hdma) {
|
||||
BaseType_t hp_woken = pdFALSE;
|
||||
xSemaphoreGiveFromISR(s_memory_fill_semaphore, &hp_woken);
|
||||
portYIELD_FROM_ISR(hp_woken);
|
||||
}
|
||||
|
||||
static void app_lighting_control_task(void *parameters) {
|
||||
app_lighting_q_item_t lc_qi;
|
||||
|
||||
lcd_st7789_enable_display(&s_lcd, true);
|
||||
|
||||
for (;;) {
|
||||
xQueueReceive(s_lamp_update_queue, &lc_qi, portMAX_DELAY);
|
||||
app_lighting_fill_lcd_block(lc_qi.color_565, s_lamp_buf);
|
||||
|
||||
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
||||
|
||||
if (lc_qi.cmd == APP_LAMP_UPDATE_SINGLE) {
|
||||
app_lighting_update_lamp(lc_qi.lamp_id_start, s_lamp_buf);
|
||||
} else {
|
||||
for (int i = lc_qi.lamp_id_start; i < (lc_qi.lamp_id_end + 1); i++) {
|
||||
app_lighting_update_lamp(i, s_lamp_buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "usart.h"
|
||||
|
||||
int _write(int fd, char *buf, int count) {
|
||||
HAL_UART_Transmit(&hlpuart1, (uint8_t *)buf, count, 1000);
|
||||
|
||||
return count;
|
||||
}
|
|
@ -0,0 +1,155 @@
|
|||
#include "tusb.h"
|
||||
|
||||
/* HAL */
|
||||
#include "stm32l4xx_hal.h"
|
||||
|
||||
/* App */
|
||||
#include "app_lighting.h"
|
||||
#include "app_tusb.h"
|
||||
#include "app_tusb_descriptors.h"
|
||||
|
||||
static void app_tusb_task(void *parameters);
|
||||
static int app_tusb_peripheral_init(void);
|
||||
|
||||
int app_tusb_init(void) {
|
||||
if (app_tusb_peripheral_init() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
|
||||
NVIC_EnableIRQ(OTG_FS_IRQn);
|
||||
|
||||
if (tud_init(BOARD_TUD_RHPORT) == false) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (xTaskCreate(app_tusb_task, "TU", 1024, NULL, 4, NULL) != pdPASS) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void app_tusb_irq_handler(void) {
|
||||
tud_int_handler(BOARD_TUD_RHPORT);
|
||||
}
|
||||
|
||||
static void app_tusb_task(void *parameters) {
|
||||
for (;;) {
|
||||
tud_task();
|
||||
}
|
||||
}
|
||||
|
||||
static int app_tusb_peripheral_init(void) {
|
||||
RCC_OscInitTypeDef osc_init = {0};
|
||||
|
||||
osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
|
||||
osc_init.HSI48State = RCC_HSI48_ON;
|
||||
if (HAL_RCC_OscConfig(&osc_init) != HAL_OK) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
RCC_PeriphCLKInitTypeDef peri_clk_init = {0};
|
||||
|
||||
peri_clk_init.PeriphClockSelection = RCC_PERIPHCLK_USB;
|
||||
peri_clk_init.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
|
||||
|
||||
if (HAL_RCCEx_PeriphCLKConfig(&peri_clk_init) != HAL_OK) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
|
||||
HAL_PWREx_EnableVddUSB();
|
||||
|
||||
GPIO_InitTypeDef gpio_init = {0};
|
||||
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
|
||||
/* USB DP/DM pins */
|
||||
gpio_init.Pin = GPIO_PIN_11 | GPIO_PIN_12;
|
||||
gpio_init.Mode = GPIO_MODE_AF_PP;
|
||||
gpio_init.Pull = GPIO_NOPULL;
|
||||
gpio_init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
gpio_init.Alternate = GPIO_AF10_OTG_FS;
|
||||
HAL_GPIO_Init(GPIOA, &gpio_init);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TinyUSB Descriptor Callbacks */
|
||||
|
||||
uint8_t const *tud_descriptor_device_cb(void) {
|
||||
return (const uint8_t *)&s_tud_desc_dev;
|
||||
}
|
||||
|
||||
uint8_t const *tud_descriptor_configuration_cb(uint8_t index) {
|
||||
return s_tud_desc_configuration;
|
||||
}
|
||||
|
||||
uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
|
||||
switch (index) {
|
||||
case APP_TUSB_STRING_ID_LANG:
|
||||
return s_tud_desc_string_lang;
|
||||
break;
|
||||
case APP_TUSB_STRING_ID_MFG:
|
||||
return s_tud_desc_string_mfg;
|
||||
break;
|
||||
case APP_TUSB_STRING_ID_PRODUCT:
|
||||
return s_tud_desc_string_product;
|
||||
break;
|
||||
case APP_TUSB_STRING_ID_SERIAL:
|
||||
return s_tud_desc_string_serial;
|
||||
break;
|
||||
default:
|
||||
return s_tud_desc_string_unknown;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t const *tud_hid_descriptor_report_cb(uint8_t instance) {
|
||||
return s_tud_desc_hid_report;
|
||||
}
|
||||
|
||||
uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer,
|
||||
uint16_t reqlen) {
|
||||
switch (report_id) {
|
||||
case REPORT_ID_LIGHTING_LAMP_ARRAY_ATTRIBUTES: {
|
||||
return app_lighting_get_array_attributes(buffer);
|
||||
break;
|
||||
}
|
||||
case REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_RESPONSE: {
|
||||
return app_lighting_get_lamp_attributes(buffer);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer,
|
||||
uint16_t bufsize) {
|
||||
switch (report_id) {
|
||||
case REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_REQUEST: {
|
||||
app_lighting_set_lamp_attributes_req(buffer);
|
||||
break;
|
||||
}
|
||||
case REPORT_ID_LIGHTING_LAMP_MULTI_UPDATE: {
|
||||
app_lighting_set_lamp_multi_update(buffer);
|
||||
break;
|
||||
}
|
||||
case REPORT_ID_LIGHTING_LAMP_RANGE_UPDATE: {
|
||||
app_lighting_set_lamp_range_update(buffer);
|
||||
}
|
||||
case REPORT_ID_LIGHTING_LAMP_ARRAY_CONTROL: {
|
||||
app_lighting_set_lamp_array_control(buffer);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
41
src/main.c
41
src/main.c
|
@ -1,19 +1,56 @@
|
|||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* FreeRTOS */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "timers.h"
|
||||
|
||||
/* MX */
|
||||
#include "dma.h"
|
||||
#include "gpio.h"
|
||||
#include "main.h"
|
||||
#include "spi.h"
|
||||
#include "usart.h"
|
||||
|
||||
/* App */
|
||||
#include "app_lighting.h"
|
||||
#include "app_tusb.h"
|
||||
|
||||
void SystemClock_Config(void);
|
||||
|
||||
static void app_delayed_start(TimerHandle_t tmr_handle);
|
||||
|
||||
int main(void) {
|
||||
/* HAL */
|
||||
HAL_Init();
|
||||
SystemClock_Config();
|
||||
MX_GPIO_Init();
|
||||
MX_LPUART1_UART_Init();
|
||||
MX_DMA_Init();
|
||||
MX_SPI1_Init();
|
||||
|
||||
TimerHandle_t tmr = xTimerCreate("INIT_T", pdMS_TO_TICKS(50), pdFALSE, NULL, app_delayed_start);
|
||||
if (tmr == NULL) {
|
||||
goto dead_loop;
|
||||
}
|
||||
|
||||
xTimerStart(tmr, 0);
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
dead_loop:
|
||||
for (;;) {
|
||||
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
||||
HAL_Delay(500);
|
||||
__WFI();
|
||||
}
|
||||
}
|
||||
|
||||
static void app_delayed_start(TimerHandle_t tmr_handle) {
|
||||
if (app_lighting_init() < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (app_tusb_init() < 0) {
|
||||
return;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue