diff options
| author | guo <[email protected]> | 2021-10-26 07:50:40 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-10-26 07:50:40 +0800 |
| commit | c8ee4cc67dd1815d1b0ead1bcd24156da6ab87de (patch) | |
| tree | 1f392373790a657725dd47def54196a42b1e57f5 /bsp/tkm32F499/drivers | |
| parent | ab36707b681ad8d3374e1d6a01fdeab309de80e7 (diff) | |
| parent | 8a180d5dd31bced87082af4ee819e5b1fa79211d (diff) | |
Merge pull request #5182 from NU-LL/tkm32f499
Diffstat (limited to 'bsp/tkm32F499/drivers')
| -rw-r--r-- | bsp/tkm32F499/drivers/Kconfig | 154 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/SConscript | 30 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/board.c | 96 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/board.h | 38 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/drv_gpio.c | 577 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/drv_gpio.h | 21 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/drv_lcd.c | 298 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/drv_log.h | 27 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/drv_uart.c | 254 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/drv_uart.h | 30 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/lcd/lcd.c | 1184 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/lcd/lcd.h | 75 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/lcd_port.h | 34 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/linker_scripts/link.icf | 34 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/linker_scripts/link.lds | 137 | ||||
| -rw-r--r-- | bsp/tkm32F499/drivers/linker_scripts/link.sct | 16 |
16 files changed, 3005 insertions, 0 deletions
diff --git a/bsp/tkm32F499/drivers/Kconfig b/bsp/tkm32F499/drivers/Kconfig new file mode 100644 index 0000000000..4e7e9a19d6 --- /dev/null +++ b/bsp/tkm32F499/drivers/Kconfig @@ -0,0 +1,154 @@ +menu "Hardware Drivers Config" + +config SOC_SERIES_TKM32F4 + bool + default y + +config SOC_TKM32F499 + bool + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + select SOC_SERIES_TKM32F4 + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (uart1)" + select BSP_USING_UART + select BSP_USING_UART1 + default y + + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1 PA9/10(T/R)" + default y + + config BSP_USING_UART2 + bool "Enable UART2 PA2/3(T/R)" + default n + endif + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 0 175 + default 22 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 175 + default 23 + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + + config BSP_USING_TIM3 + bool "Enable TIM3" + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + + config BSP_USING_LCD + bool "Enable LCD" + select BSP_USING_GPIO + select BSP_USING_PWM + select BSP_USING_PWM2 + select BSP_USING_PWM2_CH1 + default n + + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/tkm32F499/drivers/SConscript b/bsp/tkm32F499/drivers/SConscript new file mode 100644 index 0000000000..e8e9e7de78 --- /dev/null +++ b/bsp/tkm32F499/drivers/SConscript @@ -0,0 +1,30 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() + +# add the general drivers. +src = Split(""" +board.c +""") + +# add serial driver code +if GetDepend('RT_USING_SERIAL'): + src += ['drv_uart.c'] + +# add gpio driver code +if GetDepend(['RT_USING_PIN']): + src += ['drv_gpio.c'] + +# add lcd driver code +if GetDepend(['BSP_USING_LCD']): + src += Glob('./lcd/*.c') + src += ['drv_lcd.c'] + +CPPPATH = [cwd] +CPPPATH += [cwd+'/lcd'] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/tkm32F499/drivers/board.c b/bsp/tkm32F499/drivers/board.c new file mode 100644 index 0000000000..6e5eb5791d --- /dev/null +++ b/bsp/tkm32F499/drivers/board.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2017-2019, MindMotion AE Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-02 spaceman first version + */ +#include <rtthread.h> +#include <rthw.h> +#include <board.h> +#include <drv_uart.h> +// extern uint32_t SystemCoreClock; +// extern void SystemInit(void); + +#ifdef RT_USING_FINSH +#include <finsh.h> +static void reboot(uint8_t argc, char **argv) +{ + rt_hw_cpu_reset(); +} +MSH_CMD_EXPORT(reboot, Reboot System); +#endif /* RT_USING_FINSH */ + +static void bsp_clock_config(void) +{ + RemapVtorTable(); + SystemClk_HSEInit(RCC_PLLMul_20);//启动PLL时钟,12MHz*20=240MHz + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2:2,全局性函数,仅需设置一次 + + uint32_t sysclk = 0; + getSystemClock(&sysclk); + + SysTick_Config(sysclk / RT_TICK_PER_SECOND); + SysTick->CTRL |= 0x00000004UL; +} + +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +void rt_hw_us_delay(rt_uint32_t us) +{ + rt_uint32_t ticks; + rt_uint32_t told, tnow, tcnt = 0; + rt_uint32_t reload = SysTick->LOAD; + + ticks = us * reload / (1000000 / RT_TICK_PER_SECOND); + told = SysTick->VAL; + while (1) + { + tnow = SysTick->VAL; + if (tnow != told) + { + if (tnow < told) + { + tcnt += told - tnow; + } + else + { + tcnt += reload - tnow + told; + } + told = tnow; + if (tcnt >= ticks) + { + break; + } + } + } +} + +void rt_hw_board_init() +{ + bsp_clock_config(); +#if defined(RT_USING_HEAP) + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + // volatile uint16_t i=0; + // rt_hw_uart_init(); + // i = UINT16_MAX; + // while(i--); //wait for a while after uart initiated. +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif +} diff --git a/bsp/tkm32F499/drivers/board.h b/bsp/tkm32F499/drivers/board.h new file mode 100644 index 0000000000..eb5390829a --- /dev/null +++ b/bsp/tkm32F499/drivers/board.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017-2019, MindMotion AE Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-02 spaceman first version + */ + +#ifndef BOARD_H__ +#define BOARD_H__ +#include <rtthread.h> +#include <rtdevice.h> +#include <hal_device.h> +#include "sys.h" + + + +#define SRAM_SIZE (8 * 1024 * 1024) +// #define SRAM_BASE ((uint32_t)0x70000000) + + +#define SRAM_END (T_SDRAM_BASE + SRAM_SIZE) +#ifdef __CC_ARM + extern int Image$$RW_IRAM1$$ZI$$Limit; + #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ + #pragma section = "HEAP" + #define HEAP_BEGIN (__segment_end("HEAP")) +#else + extern int __bss_end; + #define HEAP_BEGIN ((void *)&__bss_end) +#endif +#define HEAP_END SRAM_END +#define HEAP_SIZE (HEAP_END - (rt_uint32_t)HEAP_BEGIN) +extern void rt_hw_board_init(void); +#endif diff --git a/bsp/tkm32F499/drivers/drv_gpio.c b/bsp/tkm32F499/drivers/drv_gpio.c new file mode 100644 index 0000000000..2fe9418d72 --- /dev/null +++ b/bsp/tkm32F499/drivers/drv_gpio.c @@ -0,0 +1,577 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-02 spaceman first version + */ +#include <rtthread.h> +#include <rtdevice.h> +#include <board.h> +#include <rthw.h> +#include <drv_gpio.h> + +#ifdef RT_USING_PIN + +#define TKM32_PIN(index, rcc, gpio, gpio_index) { index, RCC_##rcc##Periph_GPIO##gpio, GPIO##gpio, GPIO_Pin_##gpio_index, \ + ((rt_base_t)__TKM32_PORT(gpio)-(rt_base_t)GPIOA_BASE)/(0x0400UL), gpio_index} +#define TKM32_PIN_DEFAULT {-1, 0, 0, 0, 0, 0} +/* TKM32 GPIO driver */ +struct pin_index +{ + int index; + uint32_t rcc; + GPIO_TypeDef *gpio; + uint32_t pin; + uint8_t port_source; + uint8_t pin_source; +}; +static const struct pin_index tkm32_pin_map[] = +{ + TKM32_PIN_DEFAULT, + TKM32_PIN(0, AHB, A, 0), + TKM32_PIN(1, AHB, A, 1), + TKM32_PIN(2, AHB, A, 2), + TKM32_PIN(3, AHB, A, 3), + TKM32_PIN(4, AHB, A, 4), + TKM32_PIN(5, AHB, A, 5), + TKM32_PIN(6, AHB, A, 6), + TKM32_PIN(7, AHB, A, 7), + TKM32_PIN(8, AHB, A, 8), + TKM32_PIN(9, AHB, A, 9), + TKM32_PIN(10, AHB, A, 10), + TKM32_PIN(11, AHB, A, 11), + TKM32_PIN(12, AHB, A, 12), + TKM32_PIN(13, AHB, A, 13), + TKM32_PIN(14, AHB, A, 14), + TKM32_PIN(15, AHB, A, 15), + TKM32_PIN(16, AHB, B, 0), + TKM32_PIN(17, AHB, B, 1), + TKM32_PIN(18, AHB, B, 2), + TKM32_PIN(19, AHB, B, 3), + TKM32_PIN(20, AHB, B, 4), + TKM32_PIN(21, AHB, B, 5), + TKM32_PIN(22, AHB, B, 6), + TKM32_PIN(23, AHB, B, 7), + TKM32_PIN(24, AHB, B, 8), + TKM32_PIN(25, AHB, B, 9), + TKM32_PIN(26, AHB, B, 10), + TKM32_PIN(27, AHB, B, 11), + TKM32_PIN(28, AHB, B, 12), + TKM32_PIN(29, AHB, B, 13), + TKM32_PIN(30, AHB, B, 14), + TKM32_PIN(31, AHB, B, 15), + TKM32_PIN(32, AHB, C, 0), + TKM32_PIN(33, AHB, C, 1), + TKM32_PIN(34, AHB, C, 2), + TKM32_PIN(35, AHB, C, 3), + TKM32_PIN(36, AHB, C, 4), + TKM32_PIN(37, AHB, C, 5), + TKM32_PIN(38, AHB, C, 6), + TKM32_PIN(39, AHB, C, 7), + TKM32_PIN(40, AHB, C, 8), + TKM32_PIN(41, AHB, C, 9), + TKM32_PIN(42, AHB, C, 10), + TKM32_PIN(43, AHB, C, 11), + TKM32_PIN(44, AHB, C, 12), + TKM32_PIN(45, AHB, C, 13), + TKM32_PIN(46, AHB, C, 14), + TKM32_PIN(47, AHB, C, 15), + TKM32_PIN(48, AHB, D, 0), + TKM32_PIN(49, AHB, D, 1), + TKM32_PIN(50, AHB, D, 2), + TKM32_PIN(51, AHB, D, 3), + TKM32_PIN(52, AHB, D, 4), + TKM32_PIN(53, AHB, D, 5), + TKM32_PIN(54, AHB, D, 6), + TKM32_PIN(55, AHB, D, 7), + TKM32_PIN(56, AHB, D, 8), + TKM32_PIN(57, AHB, D, 9), + TKM32_PIN(58, AHB, D, 10), + TKM32_PIN(59, AHB, D, 11), + TKM32_PIN(60, AHB, D, 12), + TKM32_PIN(61, AHB, D, 13), + TKM32_PIN(62, AHB, D, 14), + TKM32_PIN(63, AHB, D, 15), + TKM32_PIN(64, AHB, E, 0), + TKM32_PIN(65, AHB, E, 1), + TKM32_PIN(66, AHB, E, 2), + TKM32_PIN(67, AHB, E, 3), + TKM32_PIN(68, AHB, E, 4), + TKM32_PIN(69, AHB, E, 5), + TKM32_PIN(70, AHB, E, 6), + TKM32_PIN(71, AHB, E, 7), + TKM32_PIN(72, AHB, E, 8), + TKM32_PIN(73, AHB, E, 9), + TKM32_PIN(74, AHB, E, 10), + TKM32_PIN(75, AHB, E, 11), + TKM32_PIN(76, AHB, E, 12), + TKM32_PIN(77, AHB, E, 13), + TKM32_PIN(78, AHB, E, 14), + TKM32_PIN(79, AHB, E, 15), + TKM32_PIN(80, AHB, E, 16), + TKM32_PIN(81, AHB, E, 17), + TKM32_PIN(82, AHB, E, 18), + TKM32_PIN(83, AHB, E, 19), + TKM32_PIN(84, AHB, E, 20), + TKM32_PIN(85, AHB, E, 21), + TKM32_PIN(86, AHB, E, 22), + TKM32_PIN(87, AHB, E, 23), +}; + +struct pin_irq_map +{ + rt_uint16_t pinbit; + rt_uint32_t irqbit; + enum IRQn irqno; +}; +const struct pin_irq_map tkm32_pin_irq_map[] = +{ + {GPIO_Pin_0, EXTI_Line0, EXTI0_IRQn }, + {GPIO_Pin_1, EXTI_Line1, EXTI1_IRQn }, + {GPIO_Pin_2, EXTI_Line2, EXTI2_IRQn }, + {GPIO_Pin_3, EXTI_Line3, EXTI3_IRQn }, + {GPIO_Pin_4, EXTI_Line4, EXTI4_IRQn }, + {GPIO_Pin_5, EXTI_Line5, EXTI9_5_IRQn }, + {GPIO_Pin_6, EXTI_Line6, EXTI9_5_IRQn }, + {GPIO_Pin_7, EXTI_Line7, EXTI9_5_IRQn }, + {GPIO_Pin_8, EXTI_Line8, EXTI9_5_IRQn }, + {GPIO_Pin_9, EXTI_Line9, EXTI9_5_IRQn }, + {GPIO_Pin_10, EXTI_Line10, EXTI15_10_IRQn}, + {GPIO_Pin_11, EXTI_Line11, EXTI15_10_IRQn}, + {GPIO_Pin_12, EXTI_Line12, EXTI15_10_IRQn}, + {GPIO_Pin_13, EXTI_Line13, EXTI15_10_IRQn}, + {GPIO_Pin_14, EXTI_Line14, EXTI15_10_IRQn}, + {GPIO_Pin_15, EXTI_Line15, EXTI15_10_IRQn}, +}; +struct rt_pin_irq_hdr tkm32_pin_irq_hdr_tab[] = +{ + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, +}; +#define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) +const struct pin_index *get_pin(uint8_t pin) +{ + const struct pin_index *index; + + if (pin+1 < ITEM_NUM(tkm32_pin_map)) + { + index = &tkm32_pin_map[pin+1]; + if (index->gpio == 0) + index = RT_NULL; + } + else + { + index = RT_NULL; + } + + return index; +}; + +void tkm32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value) +{ + const struct pin_index *index; + + index = get_pin(pin); + if (index == RT_NULL) + { + return; + } + if (value == PIN_LOW) + { + GPIO_ResetBits(index->gpio, index->pin); + } + else + { + GPIO_SetBits(index->gpio, index->pin); + } +} + +int tkm32_pin_read(rt_device_t dev, rt_base_t pin) +{ + int value; + const struct pin_index *index; + + value = PIN_LOW; + index = get_pin(pin); + if (index == RT_NULL) + { + return PIN_LOW; + } + if (GPIO_ReadInputDataBit(index->gpio, index->pin) == Bit_RESET) + { + value = PIN_LOW; + } + else + { + value = PIN_HIGH; + } + return value; +} + +void tkm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) +{ + const struct pin_index *index; + GPIO_InitTypeDef GPIO_InitStructure; + + index = get_pin(pin); + if (index == RT_NULL) + { + return; + } + /* GPIO Periph clock enable */ + RCC_AHBPeriphClockCmd(index->rcc, ENABLE); + /* Configure GPIO_InitStructure */ + GPIO_InitStructure.GPIO_Pin = index->pin; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + if (mode == PIN_MODE_OUTPUT) + { + /* output setting */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + } + else if (mode == PIN_MODE_OUTPUT_OD) + { + /* output setting: od. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; + } + else if (mode == PIN_MODE_INPUT) + { + /* input setting: not pull. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + } + else if (mode == PIN_MODE_INPUT_PULLUP) + { + /* input setting: pull up. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + } + else + { + /* input setting:default. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; + } + GPIO_Init( index->gpio, &GPIO_InitStructure); + GPIO_PinAFConfig(index->gpio, index->pin, GPIO_AF_GPIO); +} +rt_inline rt_int32_t bit2bitno(rt_uint32_t bit) +{ + int i; + for (i = 0; i < 32; i++) + { + if ((0x01 << i) == bit) + { + return i; + } + } + return -1; +} +rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit) +{ + rt_int32_t mapindex = bit2bitno(pinbit); + if (mapindex < 0 || mapindex >= ITEM_NUM(tkm32_pin_irq_map)) + { + return RT_NULL; + } + return &tkm32_pin_irq_map[mapindex]; +}; +rt_err_t tkm32_pin_attach_irq(struct rt_device *device, rt_int32_t pin, + rt_uint32_t mode, void (*hdr)(void *args), void *args) +{ + const struct pin_index *index; + rt_base_t level; + rt_int32_t irqindex = -1; + + index = get_pin(pin); + if (index == RT_NULL) + { + return -RT_ENOSYS; + } + irqindex = bit2bitno(index->pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(tkm32_pin_irq_map)) + { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + if (tkm32_pin_irq_hdr_tab[irqindex].pin == pin && + tkm32_pin_irq_hdr_tab[irqindex].hdr == hdr && + tkm32_pin_irq_hdr_tab[irqindex].mode == mode && + tkm32_pin_irq_hdr_tab[irqindex].args == args + ) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + if (tkm32_pin_irq_hdr_tab[irqindex].pin != -1) + { + rt_hw_interrupt_enable(level); + return -RT_EBUSY; + } + tkm32_pin_irq_hdr_tab[irqindex].pin = pin; + tkm32_pin_irq_hdr_tab[irqindex].hdr = hdr; + tkm32_pin_irq_hdr_tab[irqindex].mode = mode; + tkm32_pin_irq_hdr_tab[irqindex].args = args; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} +rt_err_t tkm32_pin_detach_irq(struct rt_device *device, rt_int32_t pin) +{ + const struct pin_index *index; + rt_base_t level; + rt_int32_t irqindex = -1; + + index = get_pin(pin); + if (index == RT_NULL) + { + return RT_ENOSYS; + } + irqindex = bit2bitno(index->pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(tkm32_pin_irq_map)) + { + return RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + if (tkm32_pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + tkm32_pin_irq_hdr_tab[irqindex].pin = -1; + tkm32_pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + tkm32_pin_irq_hdr_tab[irqindex].mode = 0; + tkm32_pin_irq_hdr_tab[irqindex].args = RT_NULL; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} +rt_err_t tkm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, + rt_uint32_t enabled) +{ + const struct pin_index *index; + const struct pin_irq_map *irqmap; + rt_base_t level; + rt_int32_t irqindex = -1; + GPIO_InitTypeDef GPIO_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + EXTI_InitTypeDef EXTI_InitStructure; + + index = get_pin(pin); + if (index == RT_NULL) + { + return -RT_ENOSYS; + } + if (enabled == PIN_IRQ_ENABLE) + { + irqindex = bit2bitno(index->pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(tkm32_pin_irq_map)) + { + return -RT_ENOSYS; + } + level = rt_hw_interrupt_disable(); + if (tkm32_pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return -RT_ENOSYS; + } + irqmap = &tkm32_pin_irq_map[irqindex]; + /* GPIO Periph clock enable */ + RCC_AHBPeriphClockCmd(index->rcc, ENABLE); + /* Configure GPIO_InitStructure */ + GPIO_InitStructure.GPIO_Pin = index->pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(index->gpio, &GPIO_InitStructure); + + NVIC_InitStructure.NVIC_IRQChannel = irqmap->irqno; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + // GPIO_EXTILineConfig(index->port_source, index->pin_source); + // EXTI_InitStructure.EXTI_Line = irqmap->irqbit; + // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + switch (tkm32_pin_irq_hdr_tab[irqindex].mode) + { + case PIN_IRQ_MODE_RISING: + Ex_NVIC_Config(index->port_source, index->pin_source, 2); + // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + break; + case PIN_IRQ_MODE_FALLING: + Ex_NVIC_Config(index->port_source, index->pin_source, 1); + // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; + break; + case PIN_IRQ_MODE_RISING_FALLING: + Ex_NVIC_Config(index->port_source, index->pin_source, 3); + // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + break; + } + // EXTI_InitStructure.EXTI_LineCmd = ENABLE; + // EXTI_Init(&EXTI_InitStructure); + rt_hw_interrupt_enable(level); + } + else if (enabled == PIN_IRQ_DISABLE) + { + irqmap = get_pin_irq_map(index->pin); + if (irqmap == RT_NULL) + { + return -RT_ENOSYS; + } + EXTI_InitStructure.EXTI_Line = irqmap->irqbit; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = DISABLE; + EXTI_Init(&EXTI_InitStructure); + } + else + { + return -RT_ENOSYS; + } + + return RT_EOK; +} +const static struct rt_pin_ops _tkm32_pin_ops = +{ + tkm32_pin_mode, + tkm32_pin_write, + tkm32_pin_read, + tkm32_pin_attach_irq, + tkm32_pin_detach_irq, + tkm32_pin_irq_enable, + RT_NULL, +}; + +int rt_hw_pin_init(void) +{ + int result; + + result = rt_device_pin_register("pin", &_tkm32_pin_ops, RT_NULL); + return result; +} +INIT_BOARD_EXPORT(rt_hw_pin_init); + +rt_inline void pin_irq_hdr(int irqno) +{ + EXTI_ClearITPendingBit(tkm32_pin_irq_map[irqno].irqbit); + if (tkm32_pin_irq_hdr_tab[irqno].hdr) + { + tkm32_pin_irq_hdr_tab[irqno].hdr(tkm32_pin_irq_hdr_tab[irqno].args); + } +} +void EXTI0_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(0); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(1); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(2); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(3); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(4); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI9_5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + if (EXTI_GetITStatus(EXTI_Line5) != RESET) + { + pin_irq_hdr(5); + } + if (EXTI_GetITStatus(EXTI_Line6) != RESET) + { + pin_irq_hdr(6); + } + if (EXTI_GetITStatus(EXTI_Line7) != RESET) + { + pin_irq_hdr(7); + } + if (EXTI_GetITStatus(EXTI_Line8) != RESET) + { + pin_irq_hdr(8); + } + if (EXTI_GetITStatus(EXTI_Line9) != RESET) + { + pin_irq_hdr(9); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI15_10_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + if (EXTI_GetITStatus(EXTI_Line10) != RESET) + { + pin_irq_hdr(10); + } + if (EXTI_GetITStatus(EXTI_Line11) != RESET) + { + pin_irq_hdr(11); + } + if (EXTI_GetITStatus(EXTI_Line12) != RESET) + { + pin_irq_hdr(12); + } + if (EXTI_GetITStatus(EXTI_Line13) != RESET) + { + pin_irq_hdr(13); + } + if (EXTI_GetITStatus(EXTI_Line14) != RESET) + { + pin_irq_hdr(14); + } + if (EXTI_GetITStatus(EXTI_Line15) != RESET) + { + pin_irq_hdr(15); + } + /* leave interrupt */ + rt_interrupt_leave(); +} + +#endif /* RT_USING_PIN */ diff --git a/bsp/tkm32F499/drivers/drv_gpio.h b/bsp/tkm32F499/drivers/drv_gpio.h new file mode 100644 index 0000000000..1f52cacba5 --- /dev/null +++ b/bsp/tkm32F499/drivers/drv_gpio.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-02 spaceman first version + */ +#ifndef DRV_GPIO_H__ +#define DRV_GPIO_H__ + +#define __TKM32_PORT(port) GPIO##port##_BASE + +#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__TKM32_PORT(PORTx) - (rt_base_t)GPIOA_BASE)/(0x0400UL) )) + PIN) + + + +int rt_hw_pin_init(void); + +#endif diff --git a/bsp/tkm32F499/drivers/drv_lcd.c b/bsp/tkm32F499/drivers/drv_lcd.c new file mode 100644 index 0000000000..0857d5210d --- /dev/null +++ b/bsp/tkm32F499/drivers/drv_lcd.c @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-14 spaceman first version + */ + +#include <board.h> + +#ifdef BSP_USING_LCD +#include <lcd_port.h> +#include "lcd.h" +#include "drv_gpio.h" + +#define DRV_DEBUG +#define LOG_TAG "drv.lcd" +#include <drv_log.h> + +#define LCD_DEVICE(dev) (struct drv_lcd_device*)(dev) + + +static __align(256) volatile rt_uint32_t LTDC_Buf1[LCD_WIDTH * LCD_HEIGHT] = {0x00}; +static __align(256) volatile rt_uint32_t LTDC_Buf2[LCD_WIDTH * LCD_HEIGHT] = {0x00}; + + +struct drv_lcd_device +{ + struct rt_device parent; + + struct rt_device_graphic_info lcd_info; + + struct rt_semaphore lcd_lock; + + /* 0:front_buf is being used 1: back_buf is being used*/ + rt_uint8_t cur_buf; + rt_uint8_t *front_buf; + rt_uint8_t *back_buf; +}; + +struct drv_lcd_device _lcd; + +static rt_err_t drv_lcd_init(struct rt_device *device) +{ + struct drv_lcd_device *lcd = LCD_DEVICE(device); + /* nothing, right now */ + lcd = lcd; + return RT_EOK; +} + +static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args) +{ + struct drv_lcd_device *lcd = LCD_DEVICE(device); + + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + { + /* update */ + if (_lcd.cur_buf) + { + /* back_buf is being used */ + _lcd.lcd_info.framebuffer = _lcd.back_buf; + /* Configure the color frame buffer start address */ + LTDC->DP_SWT = 0; + _lcd.cur_buf = 0; + } + else + { + /* front_buf is being used */ + _lcd.lcd_info.framebuffer = _lcd.front_buf; + /* Configure the color frame buffer start address */ + LTDC->DP_SWT = 1; + _lcd.cur_buf = 1; + } + rt_sem_take(&_lcd.lcd_lock, RT_TICK_PER_SECOND / 20); + } + break; + + case RTGRAPHIC_CTRL_GET_INFO: + { + struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args; + + RT_ASSERT(info != RT_NULL); + info->pixel_format = lcd->lcd_info.pixel_format; + info->bits_per_pixel = LCD_BITS_PER_PIXEL; + info->width = lcd->lcd_info.width; + info->height = lcd->lcd_info.height; + info->framebuffer = lcd->lcd_info.framebuffer; + } + break; + } + + return RT_EOK; +} + + + + + +rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd) +{ + LCD_Initial((rt_uint32_t)lcd->front_buf, (rt_uint32_t)lcd->back_buf); + return RT_EOK; +} +#if defined(LCD_BACKLIGHT_USING_PWM) +void turn_on_lcd_backlight(void) +{ + struct rt_device_pwm *pwm_dev; + + /* turn on the LCD backlight */ + pwm_dev = (struct rt_device_pwm *)rt_device_find(LCD_PWM_DEV_NAME); + /* pwm frequency:100K = 10000ns */ + rt_pwm_set(pwm_dev, LCD_PWM_DEV_CHANNEL, 10000, 10000); + rt_pwm_enable(pwm_dev, LCD_PWM_DEV_CHANNEL); +} +#elif defined(LCD_BACKLIGHT_USING_GPIO) +void turn_on_lcd_backlight(void) +{ + rt_pin_mode(LCD_BL_GPIO_NUM, PIN_MODE_OUTPUT); + rt_pin_mode(LCD_DISP_GPIO_NUM, PIN_MODE_OUTPUT); + + rt_pin_write(LCD_DISP_GPIO_NUM, PIN_HIGH); + rt_pin_write(LCD_BL_GPIO_NUM, PIN_HIGH); +} +#else +void turn_on_lcd_backlight(void) +{ + +} +#endif + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops lcd_ops = +{ + drv_lcd_init, + RT_NULL, + RT_NULL, + RT_NULL, + RT_NULL, + drv_lcd_control +}; +#endif + + +void Lcd_ColorBox(struct drv_lcd_device *lcd, rt_uint16_t xStart, rt_uint16_t yStart, rt_uint16_t xLong, rt_uint16_t yLong, rt_uint32_t Color) +{ + rt_uint16_t i, j; + rt_uint32_t temp; + rt_uint32_t *LTDC_Buf = (rt_uint32_t *)lcd->lcd_info.framebuffer; + temp = lcd->lcd_info.height * xStart; + for (i = 0; i < yLong; i++) + { + for (j = 0; j < xLong; j++) + LTDC_Buf[yStart + i + lcd->lcd_info.height * j + temp] = Color; + } + lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); +} + +void LCD_Fill_Pic(struct drv_lcd_device *lcd, rt_uint16_t x, rt_uint16_t y, rt_uint16_t pic_H, rt_uint16_t pic_V, rt_uint32_t *pic) +{ + rt_uint32_t *LTDC_Buf = (rt_uint32_t *)lcd->lcd_info.framebuffer; + rt_uint16_t i, j; + rt_uint32_t Xstart, k = 0; + Xstart = lcd->lcd_info.height * x; + for (i = 0; i < pic_V; i++) + { + for (j = 0; j < pic_H; j++) + LTDC_Buf[Xstart + i + lcd->lcd_info.height * j + y] = pic[k++]; + } +} + +void DrawPixel(struct drv_lcd_device *lcd, rt_uint16_t x, rt_uint16_t y, int Color) +{ + rt_uint32_t *LTDC_Buf = (rt_uint32_t *)lcd->lcd_info.framebuffer; + LTDC_Buf[y + lcd->lcd_info.height * x] = Color; +} + + + + +int drv_lcd_hw_init(void) +{ + rt_err_t result = RT_EOK; + struct rt_device *device = &_lcd.parent; + + /* memset _lcd to zero */ + rt_memset(&_lcd, 0x00, sizeof(_lcd)); + + /* init lcd_lock semaphore */ + result = rt_sem_init(&_lcd.lcd_lock, "lcd_lock", 0, RT_IPC_FLAG_FIFO); + if (result != RT_EOK) + { + LOG_E("init semaphore failed!\n"); + result = -RT_ENOMEM; + goto __exit; + } + + /* config LCD dev info */ + _lcd.lcd_info.height = LCD_HEIGHT; + _lcd.lcd_info.width = LCD_WIDTH; + _lcd.lcd_info.bits_per_pixel = LCD_BITS_PER_PIXEL; + _lcd.lcd_info.pixel_format = LCD_PIXEL_FORMAT; + + /* malloc memory for Triple Buffering */ + _lcd.back_buf = (rt_uint8_t *)LTDC_Buf1; + _lcd.front_buf = (rt_uint8_t *)LTDC_Buf2; + _lcd.lcd_info.framebuffer = _lcd.back_buf; + if (_lcd.lcd_info.framebuffer == RT_NULL || _lcd.back_buf == RT_NULL || _lcd.front_buf == RT_NULL) + { + LOG_E("init frame buffer failed!\n"); + result = -RT_ENOMEM; + goto __exit; + } + + /* memset buff to 0xFF */ + rt_memset(_lcd.back_buf, 0xFF, LCD_BUF_SIZE); + rt_memset(_lcd.front_buf, 0xFF, LCD_BUF_SIZE); + + device->type = RT_Device_Class_Graphic; +#ifdef RT_USING_DEVICE_OPS + device->ops = &lcd_ops; +#else + device->init = drv_lcd_init; + device->control = drv_lcd_control; +#endif + + /* register lcd device */ + rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR); + + /* init stm32 LTDC */ + if (stm32_lcd_init(&_lcd) != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + else + { + turn_on_lcd_backlight(); + } + LOG_D("lcd register successful!"); + +__exit: + if (result != RT_EOK) + { + rt_sem_detach(&_lcd.lcd_lock); + } + return result; +} +INIT_DEVICE_EXPORT(drv_lcd_hw_init); + +#ifdef DRV_DEBUG +#ifdef FINSH_USING_MSH +int lcd_test() +{ + struct drv_lcd_device *lcd; + lcd = (struct drv_lcd_device *)rt_device_find("lcd"); + if(lcd == RT_NULL) + { + LOG_E("find lcd device failed!\n"); + return -1; + } + rt_uint32_t *LTDC_Buf = RT_NULL; + + LOG_D("red"); + /* red */ + LTDC_Buf = (rt_uint32_t *)lcd->lcd_info.framebuffer; + for (int i = 0; i < LCD_BUF_SIZE / 4; i++) + LTDC_Buf[i] = Red; + lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); + rt_thread_mdelay(1000); + LOG_D("green"); + /* green */ + LTDC_Buf = (rt_uint32_t *)lcd->lcd_info.framebuffer; + for (int i = 0; i < LCD_BUF_SIZE / 4; i++) + LTDC_Buf[i] = Green; + lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); + rt_thread_mdelay(1000); + LOG_D("blue"); + /* blue */ + LTDC_Buf = (rt_uint32_t *)lcd->lcd_info.framebuffer; + for (int i = 0; i < LCD_BUF_SIZE / 4; i++) + LTDC_Buf[i] = Blue; + lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); + + return 0; +} +MSH_CMD_EXPORT(lcd_test, lcd_test); + + + + + +#endif /* FINSH_USING_MSH */ +#endif /* DRV_DEBUG */ +#endif /* BSP_USING_LCD */ diff --git a/bsp/tkm32F499/drivers/drv_log.h b/bsp/tkm32F499/drivers/drv_log.h new file mode 100644 index 0000000000..3fe511789b --- /dev/null +++ b/bsp/tkm32F499/drivers/drv_log.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-15 SummerGift first version + */ + +/* + * NOTE: DO NOT include this file on the header file. + */ + +#ifndef LOG_TAG +#define DBG_TAG "drv" +#else +#define DBG_TAG LOG_TAG +#endif /* LOG_TAG */ + +#ifdef DRV_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ + +#include <rtdbg.h> diff --git a/bsp/tkm32F499/drivers/drv_uart.c b/bsp/tkm32F499/drivers/drv_uart.c new file mode 100644 index 0000000000..336367d9be --- /dev/null +++ b/bsp/tkm32F499/drivers/drv_uart.c @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-02 spaceman first version + */ +#include <rtthread.h> +#include <rtdevice.h> +#include <board.h> +#include "drv_uart.h" + +#ifdef RT_USING_SERIAL + +//#define DRV_DEBUG +#define LOG_TAG "drv.uart" +#include <drv_log.h> + +#if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \ + !defined(BSP_USING_UART4) +#error "Please define at least one BSP_USING_UARTx" +/* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */ +#endif + + +/* UART1 */ +#define UART1_GPIO_TX GPIO_Pin_9 +#define UART1_GPIO_RX GPIO_Pin_10 +#define UART1_GPIO_AF GPIO_AF_UART_1 +#define UART1_GPIO GPIOA + +/* UART2 */ +#define UART2_GPIO_TX GPIO_Pin_2 +#define UART2_GPIO_RX GPIO_Pin_3 +#define UART2_GPIO_AF GPIO_AF_UART_2345 +#define UART2_GPIO GPIOA + + +static rt_err_t tkm32_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + struct tkm32_uart *uart; + UART_InitTypeDef UART_InitStructure; + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + uart = (struct tkm32_uart *)serial->parent.user_data; + UART_InitStructure.UART_BaudRate = cfg->baud_rate; + if (cfg->data_bits == DATA_BITS_8) + UART_InitStructure.UART_WordLength = UART_WordLength_8b; + if (cfg->stop_bits == STOP_BITS_1) + UART_InitStructure.UART_StopBits = UART_StopBits_1; + else if (cfg->stop_bits == STOP_BITS_2) + UART_InitStructure.UART_StopBits = UART_StopBits_2; + UART_InitStructure.UART_Parity = UART_Parity_No; + UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None; + UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; + UART_Init(uart->uart, &UART_InitStructure); + /* Enable UART */ + UART_Cmd(uart->uart, ENABLE); + return RT_EOK; +} + +static rt_err_t tkm32_uart_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct tkm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct tkm32_uart *)serial->parent.user_data; + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + NVIC_DisableIRQ(uart->irq); + UART_ITConfig(uart->uart, UART_IT_RXIEN, DISABLE); + break; + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + NVIC_EnableIRQ(uart->irq); + /* enable interrupt */ + UART_ITConfig(uart->uart, UART_IT_RXIEN, ENABLE); + break; + } + return RT_EOK; +} + +static int tkm32_uart_putc(struct rt_serial_device *serial, char c) +{ + struct tkm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct tkm32_uart *)serial->parent.user_data; + while ((uart->uart->CSR & UART_IT_TXIEN) == 0); + uart->uart->TDR = (c & (uint16_t)0x00FF); + return 1; +} + +static int tkm32_uart_getc(struct rt_serial_device *serial) +{ + int ch; + struct tkm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct tkm32_uart *)serial->parent.user_data; + ch = -1; + if (uart->uart->CSR & UART_FLAG_RXAVL) + { + ch = uart->uart->RDR & 0xff; + } + return ch; +} + +static const struct rt_uart_ops tkm32_uart_ops = +{ + tkm32_uart_configure, + tkm32_uart_control, + tkm32_uart_putc, + tkm32_uart_getc, +}; + +#if defined(BSP_USING_UART1) +/* UART1 device driver structure */ +static struct tkm32_uart uart1; +struct rt_serial_device serial1; +void UART1_IRQHandler(void) +{ + struct tkm32_uart *uart; + uart = &uart1; + /* enter interrupt */ + rt_interrupt_enter(); + if (UART_GetITStatus(uart->uart, UART_IT_RXIEN) != RESET) + { + UART_ClearITPendingBit(uart->uart, UART_IT_RXIEN); + rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND); + } + if (UART_GetITStatus(uart->uart, UART_IT_TXIEN) != RESET) + { + /* clear interrupt */ + UART_ClearITPendingBit(uart->uart, UART_IT_TXIEN); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) +/* UART2 device driver structure */ +static struct tkm32_uart uart2; +struct rt_serial_device serial2; +void UART2_IRQHandler(void) +{ + struct tkm32_uart *uart; + uart = &uart2; + /* enter interrupt */ + rt_interrupt_enter(); + if (UART_GetITStatus(uart->uart, UART_IT_RXIEN) != RESET) + { + UART_ClearITPendingBit(uart->uart, UART_IT_RXIEN); + rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND); + } + if (UART_GetITStatus(uart->uart, UART_IT_TXIEN) != RESET) + { + /* clear interrupt */ + UART_ClearITPendingBit(uart->uart, UART_IT_TXIEN); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART2 */ + +#ifdef BSP_USING_UART1 +static void UART1PINconfigStepA(void) +{ + /* Enable UART clock */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); +} + +static void UART1PINconfigStepB(void) +{ + + GPIO_InitTypeDef GPIO_InitStructure; + /* Configure USART Rx/tx PIN */ + GPIO_InitStructure.GPIO_Pin = UART1_GPIO_TX; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(UART1_GPIO, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = UART1_GPIO_RX; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(UART1_GPIO, &GPIO_InitStructure); + GPIO_PinAFConfig(UART1_GPIO, UART1_GPIO_TX | UART1_GPIO_RX, UART1_GPIO_AF); + UART_ClearITPendingBit(UART1, 0xFF); +} +#endif + +#ifdef BSP_USING_UART2 +static void UART2PINconfigStepA(void) +{ + /* Enable UART clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); +} + +static void UART2PINconfigStepB(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + /* Configure USART Rx/tx PIN */ + GPIO_InitStructure.GPIO_Pin = UART2_GPIO_TX; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(UART2_GPIO, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = UART2_GPIO_RX; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(UART2_GPIO, &GPIO_InitStructure); + GPIO_PinAFConfig(UART2_GPIO, UART2_GPIO_TX | UART2_GPIO_RX, UART2_GPIO_AF); + UART_ClearITPendingBit(UART2, 0xFF); +} +#endif + +int rt_hw_uart_init(void) +{ + struct tkm32_uart *uart; + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; +#ifdef BSP_USING_UART1 + UART1PINconfigStepA(); + uart = &uart1; + uart->uart = UART1; + uart->irq = UART1_IRQn; + config.baud_rate = BAUD_RATE_115200; + serial1.ops = &tkm32_uart_ops; + serial1.config = config; + /* register UART1 device */ + rt_hw_serial_register(&serial1, "uart1", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX, + uart); + UART1PINconfigStepB(); +#endif /* BSP_USING_UART1 */ + +#ifdef BSP_USING_UART2 + UART2PINconfigStepA(); + uart = &uart2; + uart->uart = UART2; + uart->irq = UART2_IRQn; + config.baud_rate = BAUD_RATE_115200; + serial2.ops = &tkm32_uart_ops; + serial2.config = config; + /* register UART2 device */ + rt_hw_serial_register(&serial2, "uart2", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX, + uart); + UART2PINconfigStepB(); +#endif /* BSP_USING_UART2 */ + return 0; +} +INIT_BOARD_EXPORT(rt_hw_uart_init); + +#endif /* RT_USING_SERIAL */ diff --git a/bsp/tkm32F499/drivers/drv_uart.h b/bsp/tkm32F499/drivers/drv_uart.h new file mode 100644 index 0000000000..4615c9db3d --- /dev/null +++ b/bsp/tkm32F499/drivers/drv_uart.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-02 spaceman first version + */ + +#ifndef DRV_UART_H__ +#define DRV_UART_H__ + +#include <rtthread.h> +#include "rtdevice.h" +#include <rthw.h> + + +int rt_hw_uart_init(void); + +/* uart driver */ +struct tkm32_uart +{ + UART_TypeDef *uart; + IRQn_Type irq; +}; + + + +#endif diff --git a/bsp/tkm32F499/drivers/lcd/lcd.c b/bsp/tkm32F499/drivers/lcd/lcd.c new file mode 100644 index 0000000000..abfd677c9d --- /dev/null +++ b/bsp/tkm32F499/drivers/lcd/lcd.c @@ -0,0 +1,1184 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-14 spaceman first version + */ + +#include "lcd.h" + +// __align(256) rt_uint32_t LTDC_Buf[XSIZE_PHYS * YSIZE_PHYS]; + +volatile void LCD_delay(volatile int time) //简单软件延时 +{ + // volatile rt_uint32_t i; + // while (time--) + // for (i = 500; i > 0; i--) + // ; + rt_thread_mdelay(time); +} +void LTDC_Clock_Set(void) //设置LTDC时钟 +{ + RCC->AHB1ENR |= 1 << 31; + RCC->CR |= 1 << 28; + RCC->PLLDCKCFGR = 0x1 << 16; //分频系数 0~3 --> 2,4,6,8 + RCC->PLLLCDCFGR = 6 << 6; //倍频系数 +} +void GPIO_RGB_INIT(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量 + + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE, ENABLE); + + //DE=PB4, PCLK=PB5, HSYNC=PB6, VSYNC=PB7 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + //lcd_reset:PD6 LCD_Black_Light On Off :PD8 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + // GPIO模拟SPI初始化液晶屏 SPI_SDA SPI_DCLK LCD_SPI_CS + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_9 | GPIO_Pin_11; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOB, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, GPIO_AF_LTDC); //PB4~7复用为LTDC的同步信号线 + GPIO_PinAFConfig(GPIOE, GPIO_Pin_All, GPIO_AF_LTDC); //GPIOE所有的IO全部复用为LTDC的数据线 +} +static void LCD_Reset(void) +{ + //注意,现在科学发达,有的屏不用复位也行 + LCD_RST(0); + LCD_delay(200); + LCD_RST(1); + LCD_delay(200); +} +void set_resolutionXX(LCD_FORM_TypeDef *LCD_FORM) +{ + rt_uint32_t aHorStart; + rt_uint32_t aHorEnd; + rt_uint32_t aVerStart; + rt_uint32_t aVerEnd; + + aHorStart = LCD_FORM->blkHorEnd + 1; + aHorEnd = aHorStart + LCD_FORM->aHorLen; + aVerStart = LCD_FORM->blkVerEnd + 1; + aVerEnd = aVerStart + LCD_FORM->aVerLen; + + LTDC->P_HOR = aHorEnd; //总宽度 + LTDC->HSYNC = (LCD_FORM->sHsyncStart << 16) | LCD_FORM->sHsyncEnd; //水平同步信号起始和结束,位于背景色中间 + LTDC->A_HOR = (aHorStart << 16) | aHorEnd; //水平激活起始和结束 + LTDC->A_HOR_LEN = LCD_FORM->aHorLen; //水平激活域宽度 + LTDC->BLK_HOR = (0 << 16) | LCD_FORM->blkHorEnd; //背景开始和结束宽度0~激活地址 + LTDC->P_VER = aVerEnd; + LTDC->VSYNC = (LCD_FORM->sVsyncStart << 16) | LCD_FORM->sVsyncEnd; + LTDC->A_VER = (aVerStart << 16) | aVerEnd; + LTDC->A_VER_LEN = LCD_FORM->aVerLen; + LTDC->BLK_VER = (0 << 16) | LCD_FORM->blkVerEnd; +} + +void Set_LCD_Timing_to_LTDC(rt_uint32_t LTDC_Buf1, rt_uint32_t LTDC_Buf2) +{ + LCD_FORM_TypeDef LCD_FORM; + LTDC->OUT_EN = 0; + LTDC->DP_ADDR0 = LTDC_Buf1; //第0层地址 + LTDC->DP_ADDR1 = LTDC_Buf2;//第一层地址 + LTDC->BLK_DATA = 0x0000; //背景色 + + LCD_FORM.sHsyncStart = 0x2; //水平激活起始 + LCD_FORM.sHsyncEnd = 0x3; //水平激活结束 + LCD_FORM.aHorLen = 480 - 1; //水平分辨率 + LCD_FORM.blkHorEnd = 0xf; //水平消隐 + + LCD_FORM.sVsyncStart = 0x2; //垂直激活起始 + LCD_FORM.sVsyncEnd = 0x3; //垂直激活结束 + LCD_FORM.aVerLen = 800 - 1; //垂直分辨率 + LCD_FORM.blkVerEnd = 0xF; //垂直消隐 + + set_resolutionXX(&LCD_FORM); + + LTDC->VI_FORMAT = 0; + LTDC->POL_CTL = 0x8 + 3; + LTDC->OUT_EN |= 0x107; +} +void LTDC_IRQHandler(void) +{ + LTDC->INTR_CLR = 2; + LTDC->DP_SWT ^= 1; //连续显示两幅图片 + if (LTDC->DP_SWT != 0) + { + // fun_test(SDRAM_RGB_ADD); + } + else + { + // fun_test(SDRAM_RGB_ADD+SDRAM_RGB_OFFSET); + } + // if(LTDC->INTR_STA & 2) + // { + + // } +} + +void LCD_WriteByteSPI(unsigned char byte) +{ + unsigned char n; + + for (n = 0; n < 8; n++) + { + if (byte & 0x80) + SPI_SDA(1) + else + SPI_SDA(0) + byte <<= 1; + + SPI_DCLK(0); + SPI_DCLK(1); + } +} +void SPI_WriteComm(rt_uint16_t CMD) +{ + LCD_SPI_CS(0); + LCD_WriteByteSPI(0X20); + LCD_WriteByteSPI(CMD >> 8); + LCD_WriteByteSPI(0X00); + LCD_WriteByteSPI(CMD); + + LCD_SPI_CS(1); +} +void SPI_WriteData(rt_uint16_t tem_data) +{ + LCD_SPI_CS(0); + LCD_WriteByteSPI(0x40); + LCD_WriteByteSPI(tem_data); + LCD_SPI_CS(1); +} +void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend) +{ + SPI_WriteComm(0x2a00); + SPI_WriteData(Xstart >> 8); + SPI_WriteComm(0x2a01); + SPI_WriteData(Xstart & 0xff); + SPI_WriteComm(0x2a02); + SPI_WriteData(Xend >> 8); + SPI_WriteComm(0x2a03); + SPI_WriteData(Xend & 0xff); + + SPI_WriteComm(0x2b00); + SPI_WriteData(Ystart >> 8); + SPI_WriteComm(0x2b01); + SPI_WriteData(Ystart & 0xff); + SPI_WriteComm(0x2b02); + SPI_WriteData(Yend >> 8); + SPI_WriteComm(0x2b03); + SPI_WriteData(Yend & 0xff); + + SPI_WriteComm(0x2c00); + // for(Xstart=0;Xstart<1000;Xstart++)SPI_WriteData(0x55); +} +void Lcd_Initialize(void) +{ + LCD_SPI_CS(1); + LCD_delay(20); + LCD_SPI_CS(0); + LCD_Reset(); + + //ENABLE PAGE 1 + SPI_WriteComm(0xF000); + SPI_WriteData(0x55); + SPI_WriteComm(0xF001); + SPI_WriteData(0xAA); + SPI_WriteComm(0xF002); + SPI_WriteData(0x52); + SPI_WriteComm(0xF003); + SPI_WriteData(0x08); + SPI_WriteComm(0xF004); + SPI_WriteData(0x01); + + //GAMMA SETING RED + SPI_WriteComm(0xD100); + SPI_WriteData(0x00); + SPI_WriteComm(0xD101); + SPI_WriteData(0x00); + SPI_WriteComm(0xD102); + SPI_WriteData(0x1b); + SPI_WriteComm(0xD103); + SPI_WriteData(0x44); + SPI_WriteComm(0xD104); + SPI_WriteData(0x62); + SPI_WriteComm(0xD105); + SPI_WriteData(0x00); + SPI_WriteComm(0xD106); + SPI_WriteData(0x7b); + SPI_WriteComm(0xD107); + SPI_WriteData(0xa1); + SPI_WriteComm(0xD108); + SPI_WriteData(0xc0); + SPI_WriteComm(0xD109); + SPI_WriteData(0xee); + SPI_WriteComm(0xD10A); + SPI_WriteData(0x55); + SPI_WriteComm(0xD10B); + SPI_WriteData(0x10); + SPI_WriteComm(0xD10C); + SPI_WriteData(0x2c); + SPI_WriteComm(0xD10D); + SPI_WriteData(0x43); + SPI_WriteComm(0xD10E); + SPI_WriteData(0x57); + SPI_WriteComm(0xD10F); + SPI_WriteData(0x55); + SPI_WriteComm(0xD110); + SPI_WriteData(0x68); + SPI_WriteComm(0xD111); + SPI_WriteData(0x78); + SPI_WriteComm(0xD112); + SPI_WriteData(0x87); + SPI_WriteComm(0xD113); + SPI_WriteData(0x94); + SPI_WriteComm(0xD114); + SPI_WriteData(0x55); + SPI_WriteComm(0xD115); + SPI_WriteData(0xa0); + SPI_WriteComm(0xD116); + SPI_WriteData(0xac); + SPI_WriteComm(0xD117); + SPI_WriteData(0xb6); + SPI_WriteComm(0xD118); + SPI_WriteData(0xc1); + SPI_WriteComm(0xD119); + SPI_WriteData(0x55); + SPI_WriteComm(0xD11A); + SPI_WriteData(0xcb); + SPI_WriteComm(0xD11B); + SPI_WriteData(0xcd); + SPI_WriteComm(0xD11C); + SPI_WriteData(0xd6); + SPI_WriteComm(0xD11D); + SPI_WriteData(0xdf); + SPI_WriteComm(0xD11E); + SPI_WriteData(0x95); + SPI_WriteComm(0xD11F); + SPI_WriteData(0xe8); + SPI_WriteComm(0xD120); + SPI_WriteData(0xf1); + SPI_WriteComm(0xD121); + SPI_WriteData(0xfa); + SPI_WriteComm(0xD122); + SPI_WriteData(0x02); + SPI_WriteComm(0xD123); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD124); + SPI_WriteData(0x0b); + SPI_WriteComm(0xD125); + SPI_WriteData(0x13); + SPI_WriteComm(0xD126); + SPI_WriteData(0x1d); + SPI_WriteComm(0xD127); + SPI_WriteData(0x26); + SPI_WriteComm(0xD128); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD129); + SPI_WriteData(0x30); + SPI_WriteComm(0xD12A); + SPI_WriteData(0x3c); + SPI_WriteComm(0xD12B); + SPI_WriteData(0x4A); + SPI_WriteComm(0xD12C); + SPI_WriteData(0x63); + SPI_WriteComm(0xD12D); + SPI_WriteData(0xea); + SPI_WriteComm(0xD12E); + SPI_WriteData(0x79); + SPI_WriteComm(0xD12F); + SPI_WriteData(0xa6); + SPI_WriteComm(0xD130); + SPI_WriteData(0xd0); + SPI_WriteComm(0xD131); + SPI_WriteData(0x20); + SPI_WriteComm(0xD132); + SPI_WriteData(0x0f); + SPI_WriteComm(0xD133); + SPI_WriteData(0x8e); + SPI_WriteComm(0xD134); + SPI_WriteData(0xff); + //GAMMA SETING GREEN + SPI_WriteComm(0xD200); + SPI_WriteData(0x00); + SPI_WriteComm(0xD201); + SPI_WriteData(0x00); + SPI_WriteComm(0xD202); + SPI_WriteData(0x1b); + SPI_WriteComm(0xD203); + SPI_WriteData(0x44); + SPI_WriteComm(0xD204); + SPI_WriteData(0x62); + SPI_WriteComm(0xD205); + SPI_WriteData(0x00); + SPI_WriteComm(0xD206); + SPI_WriteData(0x7b); + SPI_WriteComm(0xD207); + SPI_WriteData(0xa1); + SPI_WriteComm(0xD208); + SPI_WriteData(0xc0); + SPI_WriteComm(0xD209); + SPI_WriteData(0xee); + SPI_WriteComm(0xD20A); + SPI_WriteData(0x55); + SPI_WriteComm(0xD20B); + SPI_WriteData(0x10); + SPI_WriteComm(0xD20C); + SPI_WriteData(0x2c); + SPI_WriteComm(0xD20D); + SPI_WriteData(0x43); + SPI_WriteComm(0xD20E); + SPI_WriteData(0x57); + SPI_WriteComm(0xD20F); + SPI_WriteData(0x55); + SPI_WriteComm(0xD210); + SPI_WriteData(0x68); + SPI_WriteComm(0xD211); + SPI_WriteData(0x78); + SPI_WriteComm(0xD212); + SPI_WriteData(0x87); + SPI_WriteComm(0xD213); + SPI_WriteData(0x94); + SPI_WriteComm(0xD214); + SPI_WriteData(0x55); + SPI_WriteComm(0xD215); + SPI_WriteData(0xa0); + SPI_WriteComm(0xD216); + SPI_WriteData(0xac); + SPI_WriteComm(0xD217); + SPI_WriteData(0xb6); + SPI_WriteComm(0xD218); + SPI_WriteData(0xc1); + SPI_WriteComm(0xD219); + SPI_WriteData(0x55); + SPI_WriteComm(0xD21A); + SPI_WriteData(0xcb); + SPI_WriteComm(0xD21B); + SPI_WriteData(0xcd); + SPI_WriteComm(0xD21C); + SPI_WriteData(0xd6); + SPI_WriteComm(0xD21D); + SPI_WriteData(0xdf); + SPI_WriteComm(0xD21E); + SPI_WriteData(0x95); + SPI_WriteComm(0xD21F); + SPI_WriteData(0xe8); + SPI_WriteComm(0xD220); + SPI_WriteData(0xf1); + SPI_WriteComm(0xD221); + SPI_WriteData(0xfa); + SPI_WriteComm(0xD222); + SPI_WriteData(0x02); + SPI_WriteComm(0xD223); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD224); + SPI_WriteData(0x0b); + SPI_WriteComm(0xD225); + SPI_WriteData(0x13); + SPI_WriteComm(0xD226); + SPI_WriteData(0x1d); + SPI_WriteComm(0xD227); + SPI_WriteData(0x26); + SPI_WriteComm(0xD228); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD229); + SPI_WriteData(0x30); + SPI_WriteComm(0xD22A); + SPI_WriteData(0x3c); + SPI_WriteComm(0xD22B); + SPI_WriteData(0x4a); + SPI_WriteComm(0xD22C); + SPI_WriteData(0x63); + SPI_WriteComm(0xD22D); + SPI_WriteData(0xea); + SPI_WriteComm(0xD22E); + SPI_WriteData(0x79); + SPI_WriteComm(0xD22F); + SPI_WriteData(0xa6); + SPI_WriteComm(0xD230); + SPI_WriteData(0xd0); + SPI_WriteComm(0xD231); + SPI_WriteData(0x20); + SPI_WriteComm(0xD232); + SPI_WriteData(0x0f); + SPI_WriteComm(0xD233); + SPI_WriteData(0x8e); + SPI_WriteComm(0xD234); + SPI_WriteData(0xff); + + //GAMMA SETING BLUE + SPI_WriteComm(0xD300); + SPI_WriteData(0x00); + SPI_WriteComm(0xD301); + SPI_WriteData(0x00); + SPI_WriteComm(0xD302); + SPI_WriteData(0x1b); + SPI_WriteComm(0xD303); + SPI_WriteData(0x44); + SPI_WriteComm(0xD304); + SPI_WriteData(0x62); + SPI_WriteComm(0xD305); + SPI_WriteData(0x00); + SPI_WriteComm(0xD306); + SPI_WriteData(0x7b); + SPI_WriteComm(0xD307); + SPI_WriteData(0xa1); + SPI_WriteComm(0xD308); + SPI_WriteData(0xc0); + SPI_WriteComm(0xD309); + SPI_WriteData(0xee); + SPI_WriteComm(0xD30A); + SPI_WriteData(0x55); + SPI_WriteComm(0xD30B); + SPI_WriteData(0x10); + SPI_WriteComm(0xD30C); + SPI_WriteData(0x2c); + SPI_WriteComm(0xD30D); + SPI_WriteData(0x43); + SPI_WriteComm(0xD30E); + SPI_WriteData(0x57); + SPI_WriteComm(0xD30F); + SPI_WriteData(0x55); + SPI_WriteComm(0xD310); + SPI_WriteData(0x68); + SPI_WriteComm(0xD311); + SPI_WriteData(0x78); + SPI_WriteComm(0xD312); + SPI_WriteData(0x87); + SPI_WriteComm(0xD313); + SPI_WriteData(0x94); + SPI_WriteComm(0xD314); + SPI_WriteData(0x55); + SPI_WriteComm(0xD315); + SPI_WriteData(0xa0); + SPI_WriteComm(0xD316); + SPI_WriteData(0xac); + SPI_WriteComm(0xD317); + SPI_WriteData(0xb6); + SPI_WriteComm(0xD318); + SPI_WriteData(0xc1); + SPI_WriteComm(0xD319); + SPI_WriteData(0x55); + SPI_WriteComm(0xD31A); + SPI_WriteData(0xcb); + SPI_WriteComm(0xD31B); + SPI_WriteData(0xcd); + SPI_WriteComm(0xD31C); + SPI_WriteData(0xd6); + SPI_WriteComm(0xD31D); + SPI_WriteData(0xdf); + SPI_WriteComm(0xD31E); + SPI_WriteData(0x95); + SPI_WriteComm(0xD31F); + SPI_WriteData(0xe8); + SPI_WriteComm(0xD320); + SPI_WriteData(0xf1); + SPI_WriteComm(0xD321); + SPI_WriteData(0xfa); + SPI_WriteComm(0xD322); + SPI_WriteData(0x02); + SPI_WriteComm(0xD323); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD324); + SPI_WriteData(0x0b); + SPI_WriteComm(0xD325); + SPI_WriteData(0x13); + SPI_WriteComm(0xD326); + SPI_WriteData(0x1d); + SPI_WriteComm(0xD327); + SPI_WriteData(0x26); + SPI_WriteComm(0xD328); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD329); + SPI_WriteData(0x30); + SPI_WriteComm(0xD32A); + SPI_WriteData(0x3c); + SPI_WriteComm(0xD32B); + SPI_WriteData(0x4A); + SPI_WriteComm(0xD32C); + SPI_WriteData(0x63); + SPI_WriteComm(0xD32D); + SPI_WriteData(0xea); + SPI_WriteComm(0xD32E); + SPI_WriteData(0x79); + SPI_WriteComm(0xD32F); + SPI_WriteData(0xa6); + SPI_WriteComm(0xD330); + SPI_WriteData(0xd0); + SPI_WriteComm(0xD331); + SPI_WriteData(0x20); + SPI_WriteComm(0xD332); + SPI_WriteData(0x0f); + SPI_WriteComm(0xD333); + SPI_WriteData(0x8e); + SPI_WriteComm(0xD334); + SPI_WriteData(0xff); + + //GAMMA SETING RED + SPI_WriteComm(0xD400); + SPI_WriteData(0x00); + SPI_WriteComm(0xD401); + SPI_WriteData(0x00); + SPI_WriteComm(0xD402); + SPI_WriteData(0x1b); + SPI_WriteComm(0xD403); + SPI_WriteData(0x44); + SPI_WriteComm(0xD404); + SPI_WriteData(0x62); + SPI_WriteComm(0xD405); + SPI_WriteData(0x00); + SPI_WriteComm(0xD406); + SPI_WriteData(0x7b); + SPI_WriteComm(0xD407); + SPI_WriteData(0xa1); + SPI_WriteComm(0xD408); + SPI_WriteData(0xc0); + SPI_WriteComm(0xD409); + SPI_WriteData(0xee); + SPI_WriteComm(0xD40A); + SPI_WriteData(0x55); + SPI_WriteComm(0xD40B); + SPI_WriteData(0x10); + SPI_WriteComm(0xD40C); + SPI_WriteData(0x2c); + SPI_WriteComm(0xD40D); + SPI_WriteData(0x43); + SPI_WriteComm(0xD40E); + SPI_WriteData(0x57); + SPI_WriteComm(0xD40F); + SPI_WriteData(0x55); + SPI_WriteComm(0xD410); + SPI_WriteData(0x68); + SPI_WriteComm(0xD411); + SPI_WriteData(0x78); + SPI_WriteComm(0xD412); + SPI_WriteData(0x87); + SPI_WriteComm(0xD413); + SPI_WriteData(0x94); + SPI_WriteComm(0xD414); + SPI_WriteData(0x55); + SPI_WriteComm(0xD415); + SPI_WriteData(0xa0); + SPI_WriteComm(0xD416); + SPI_WriteData(0xac); + SPI_WriteComm(0xD417); + SPI_WriteData(0xb6); + SPI_WriteComm(0xD418); + SPI_WriteData(0xc1); + SPI_WriteComm(0xD419); + SPI_WriteData(0x55); + SPI_WriteComm(0xD41A); + SPI_WriteData(0xcb); + SPI_WriteComm(0xD41B); + SPI_WriteData(0xcd); + SPI_WriteComm(0xD41C); + SPI_WriteData(0xd6); + SPI_WriteComm(0xD41D); + SPI_WriteData(0xdf); + SPI_WriteComm(0xD41E); + SPI_WriteData(0x95); + SPI_WriteComm(0xD41F); + SPI_WriteData(0xe8); + SPI_WriteComm(0xD420); + SPI_WriteData(0xf1); + SPI_WriteComm(0xD421); + SPI_WriteData(0xfa); + SPI_WriteComm(0xD422); + SPI_WriteData(0x02); + SPI_WriteComm(0xD423); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD424); + SPI_WriteData(0x0b); + SPI_WriteComm(0xD425); + SPI_WriteData(0x13); + SPI_WriteComm(0xD426); + SPI_WriteData(0x1d); + SPI_WriteComm(0xD427); + SPI_WriteData(0x26); + SPI_WriteComm(0xD428); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD429); + SPI_WriteData(0x30); + SPI_WriteComm(0xD42A); + SPI_WriteData(0x3c); + SPI_WriteComm(0xD42B); + SPI_WriteData(0x4A); + SPI_WriteComm(0xD42C); + SPI_WriteData(0x63); + SPI_WriteComm(0xD42D); + SPI_WriteData(0xea); + SPI_WriteComm(0xD42E); + SPI_WriteData(0x79); + SPI_WriteComm(0xD42F); + SPI_WriteData(0xa6); + SPI_WriteComm(0xD430); + SPI_WriteData(0xd0); + SPI_WriteComm(0xD431); + SPI_WriteData(0x20); + SPI_WriteComm(0xD432); + SPI_WriteData(0x0f); + SPI_WriteComm(0xD433); + SPI_WriteData(0x8e); + SPI_WriteComm(0xD434); + SPI_WriteData(0xff); + + //GAMMA SETING GREEN + SPI_WriteComm(0xD500); + SPI_WriteData(0x00); + SPI_WriteComm(0xD501); + SPI_WriteData(0x00); + SPI_WriteComm(0xD502); + SPI_WriteData(0x1b); + SPI_WriteComm(0xD503); + SPI_WriteData(0x44); + SPI_WriteComm(0xD504); + SPI_WriteData(0x62); + SPI_WriteComm(0xD505); + SPI_WriteData(0x00); + SPI_WriteComm(0xD506); + SPI_WriteData(0x7b); + SPI_WriteComm(0xD507); + SPI_WriteData(0xa1); + SPI_WriteComm(0xD508); + SPI_WriteData(0xc0); + SPI_WriteComm(0xD509); + SPI_WriteData(0xee); + SPI_WriteComm(0xD50A); + SPI_WriteData(0x55); + SPI_WriteComm(0xD50B); + SPI_WriteData(0x10); + SPI_WriteComm(0xD50C); + SPI_WriteData(0x2c); + SPI_WriteComm(0xD50D); + SPI_WriteData(0x43); + SPI_WriteComm(0xD50E); + SPI_WriteData(0x57); + SPI_WriteComm(0xD50F); + SPI_WriteData(0x55); + SPI_WriteComm(0xD510); + SPI_WriteData(0x68); + SPI_WriteComm(0xD511); + SPI_WriteData(0x78); + SPI_WriteComm(0xD512); + SPI_WriteData(0x87); + SPI_WriteComm(0xD513); + SPI_WriteData(0x94); + SPI_WriteComm(0xD514); + SPI_WriteData(0x55); + SPI_WriteComm(0xD515); + SPI_WriteData(0xa0); + SPI_WriteComm(0xD516); + SPI_WriteData(0xac); + SPI_WriteComm(0xD517); + SPI_WriteData(0xb6); + SPI_WriteComm(0xD518); + SPI_WriteData(0xc1); + SPI_WriteComm(0xD519); + SPI_WriteData(0x55); + SPI_WriteComm(0xD51A); + SPI_WriteData(0xcb); + SPI_WriteComm(0xD51B); + SPI_WriteData(0xcd); + SPI_WriteComm(0xD51C); + SPI_WriteData(0xd6); + SPI_WriteComm(0xD51D); + SPI_WriteData(0xdf); + SPI_WriteComm(0xD51E); + SPI_WriteData(0x95); + SPI_WriteComm(0xD51F); + SPI_WriteData(0xe8); + SPI_WriteComm(0xD520); + SPI_WriteData(0xf1); + SPI_WriteComm(0xD521); + SPI_WriteData(0xfa); + SPI_WriteComm(0xD522); + SPI_WriteData(0x02); + SPI_WriteComm(0xD523); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD524); + SPI_WriteData(0x0b); + SPI_WriteComm(0xD525); + SPI_WriteData(0x13); + SPI_WriteComm(0xD526); + SPI_WriteData(0x1d); + SPI_WriteComm(0xD527); + SPI_WriteData(0x26); + SPI_WriteComm(0xD528); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD529); + SPI_WriteData(0x30); + SPI_WriteComm(0xD52A); + SPI_WriteData(0x3c); + SPI_WriteComm(0xD52B); + SPI_WriteData(0x4a); + SPI_WriteComm(0xD52C); + SPI_WriteData(0x63); + SPI_WriteComm(0xD52D); + SPI_WriteData(0xea); + SPI_WriteComm(0xD52E); + SPI_WriteData(0x79); + SPI_WriteComm(0xD52F); + SPI_WriteData(0xa6); + SPI_WriteComm(0xD530); + SPI_WriteData(0xd0); + SPI_WriteComm(0xD531); + SPI_WriteData(0x20); + SPI_WriteComm(0xD532); + SPI_WriteData(0x0f); + SPI_WriteComm(0xD533); + SPI_WriteData(0x8e); + SPI_WriteComm(0xD534); + SPI_WriteData(0xff); + + //GAMMA SETING BLUE + SPI_WriteComm(0xD600); + SPI_WriteData(0x00); + SPI_WriteComm(0xD601); + SPI_WriteData(0x00); + SPI_WriteComm(0xD602); + SPI_WriteData(0x1b); + SPI_WriteComm(0xD603); + SPI_WriteData(0x44); + SPI_WriteComm(0xD604); + SPI_WriteData(0x62); + SPI_WriteComm(0xD605); + SPI_WriteData(0x00); + SPI_WriteComm(0xD606); + SPI_WriteData(0x7b); + SPI_WriteComm(0xD607); + SPI_WriteData(0xa1); + SPI_WriteComm(0xD608); + SPI_WriteData(0xc0); + SPI_WriteComm(0xD609); + SPI_WriteData(0xee); + SPI_WriteComm(0xD60A); + SPI_WriteData(0x55); + SPI_WriteComm(0xD60B); + SPI_WriteData(0x10); + SPI_WriteComm(0xD60C); + SPI_WriteData(0x2c); + SPI_WriteComm(0xD60D); + SPI_WriteData(0x43); + SPI_WriteComm(0xD60E); + SPI_WriteData(0x57); + SPI_WriteComm(0xD60F); + SPI_WriteData(0x55); + SPI_WriteComm(0xD610); + SPI_WriteData(0x68); + SPI_WriteComm(0xD611); + SPI_WriteData(0x78); + SPI_WriteComm(0xD612); + SPI_WriteData(0x87); + SPI_WriteComm(0xD613); + SPI_WriteData(0x94); + SPI_WriteComm(0xD614); + SPI_WriteData(0x55); + SPI_WriteComm(0xD615); + SPI_WriteData(0xa0); + SPI_WriteComm(0xD616); + SPI_WriteData(0xac); + SPI_WriteComm(0xD617); + SPI_WriteData(0xb6); + SPI_WriteComm(0xD618); + SPI_WriteData(0xc1); + SPI_WriteComm(0xD619); + SPI_WriteData(0x55); + SPI_WriteComm(0xD61A); + SPI_WriteData(0xcb); + SPI_WriteComm(0xD61B); + SPI_WriteData(0xcd); + SPI_WriteComm(0xD61C); + SPI_WriteData(0xd6); + SPI_WriteComm(0xD61D); + SPI_WriteData(0xdf); + SPI_WriteComm(0xD61E); + SPI_WriteData(0x95); + SPI_WriteComm(0xD61F); + SPI_WriteData(0xe8); + SPI_WriteComm(0xD620); + SPI_WriteData(0xf1); + SPI_WriteComm(0xD621); + SPI_WriteData(0xfa); + SPI_WriteComm(0xD622); + SPI_WriteData(0x02); + SPI_WriteComm(0xD623); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD624); + SPI_WriteData(0x0b); + SPI_WriteComm(0xD625); + SPI_WriteData(0x13); + SPI_WriteComm(0xD626); + SPI_WriteData(0x1d); + SPI_WriteComm(0xD627); + SPI_WriteData(0x26); + SPI_WriteComm(0xD628); + SPI_WriteData(0xaa); + SPI_WriteComm(0xD629); + SPI_WriteData(0x30); + SPI_WriteComm(0xD62A); + SPI_WriteData(0x3c); + SPI_WriteComm(0xD62B); + SPI_WriteData(0x4A); + SPI_WriteComm(0xD62C); + SPI_WriteData(0x63); + SPI_WriteComm(0xD62D); + SPI_WriteData(0xea); + SPI_WriteComm(0xD62E); + SPI_WriteData(0x79); + SPI_WriteComm(0xD62F); + SPI_WriteData(0xa6); + SPI_WriteComm(0xD630); + SPI_WriteData(0xd0); + SPI_WriteComm(0xD631); + SPI_WriteData(0x20); + SPI_WriteComm(0xD632); + SPI_WriteData(0x0f); + SPI_WriteComm(0xD633); + SPI_WriteData(0x8e); + SPI_WriteComm(0xD634); + SPI_WriteData(0xff); + + //AVDD VOLTAGE SETTING + SPI_WriteComm(0xB000); + SPI_WriteData(0x05); + SPI_WriteComm(0xB001); + SPI_WriteData(0x05); + SPI_WriteComm(0xB002); + SPI_WriteData(0x05); + //AVEE VOLTAGE SETTING + SPI_WriteComm(0xB100); + SPI_WriteData(0x05); + SPI_WriteComm(0xB101); + SPI_WriteData(0x05); + SPI_WriteComm(0xB102); + SPI_WriteData(0x05); + + //AVDD Boosting + SPI_WriteComm(0xB600); + SPI_WriteData(0x34); + SPI_WriteComm(0xB601); + SPI_WriteData(0x34); + SPI_WriteComm(0xB603); + SPI_WriteData(0x34); + //AVEE Boosting + SPI_WriteComm(0xB700); + SPI_WriteData(0x24); + SPI_WriteComm(0xB701); + SPI_WriteData(0x24); + SPI_WriteComm(0xB702); + SPI_WriteData(0x24); + //VCL Boosting + SPI_WriteComm(0xB800); + SPI_WriteData(0x24); + SPI_WriteComm(0xB801); + SPI_WriteData(0x24); + SPI_WriteComm(0xB802); + SPI_WriteData(0x24); + //VGLX VOLTAGE SETTING + SPI_WriteComm(0xBA00); + SPI_WriteData(0x14); + SPI_WriteComm(0xBA01); + SPI_WriteData(0x14); + SPI_WriteComm(0xBA02); + SPI_WriteData(0x14); + //VCL Boosting + SPI_WriteComm(0xB900); + SPI_WriteData(0x24); + SPI_WriteComm(0xB901); + SPI_WriteData(0x24); + SPI_WriteComm(0xB902); + SPI_WriteData(0x24); + //Gamma Voltage + SPI_WriteComm(0xBc00); + SPI_WriteData(0x00); + SPI_WriteComm(0xBc01); + SPI_WriteData(0xa0); //vgmp=5.0 + SPI_WriteComm(0xBc02); + SPI_WriteData(0x00); + SPI_WriteComm(0xBd00); + SPI_WriteData(0x00); + SPI_WriteComm(0xBd01); + SPI_WriteData(0xa0); //vgmn=5.0 + SPI_WriteComm(0xBd02); + SPI_WriteData(0x00); + //VCOM Setting + SPI_WriteComm(0xBe01); + SPI_WriteData(0x3d); //3 + //ENABLE PAGE 0 + SPI_WriteComm(0xF000); + SPI_WriteData(0x55); + SPI_WriteComm(0xF001); + SPI_WriteData(0xAA); + SPI_WriteComm(0xF002); + SPI_WriteData(0x52); + SPI_WriteComm(0xF003); + SPI_WriteData(0x08); + SPI_WriteComm(0xF004); + SPI_WriteData(0x00); + //Vivid Color Function Control + SPI_WriteComm(0xB400); + SPI_WriteData(0x10); + //Z-INVERSION + SPI_WriteComm(0xBC00); + SPI_WriteData(0x05); + SPI_WriteComm(0xBC01); + SPI_WriteData(0x05); + SPI_WriteComm(0xBC02); + SPI_WriteData(0x05); + + //*************** add on 20111021**********************// + SPI_WriteComm(0xB700); + SPI_WriteData(0x22); //GATE EQ CONTROL + SPI_WriteComm(0xB701); + SPI_WriteData(0x22); //GATE EQ CONTROL + + SPI_WriteComm(0xC80B); + SPI_WriteData(0x2A); //DISPLAY TIMING CONTROL + SPI_WriteComm(0xC80C); + SPI_WriteData(0x2A); //DISPLAY TIMING CONTROL + SPI_WriteComm(0xC80F); + SPI_WriteData(0x2A); //DISPLAY TIMING CONTROL + SPI_WriteComm(0xC810); + SPI_WriteData(0x2A); //DISPLAY TIMING CONTROL + //*************** add on 20111021**********************// + //PWM_ENH_OE =1 + SPI_WriteComm(0xd000); + SPI_WriteData(0x01); + //DM_SEL =1 + SPI_WriteComm(0xb300); + SPI_WriteData(0x10); + //VBPDA=07h + SPI_WriteComm(0xBd02); + SPI_WriteData(0x07); + //VBPDb=07h + SPI_WriteComm(0xBe02); + SPI_WriteData(0x07); + //VBPDc=07h + SPI_WriteComm(0xBf02); + SPI_WriteData(0x07); + //ENABLE PAGE 2 + SPI_WriteComm(0xF000); + SPI_WriteData(0x55); + SPI_WriteComm(0xF001); + SPI_WriteData(0xAA); + SPI_WriteComm(0xF002); + SPI_WriteData(0x52); + SPI_WriteComm(0xF003); + SPI_WriteData(0x08); + SPI_WriteComm(0xF004); + SPI_WriteData(0x02); + //SDREG0 =0 + SPI_WriteComm(0xc301); + SPI_WriteData(0xa9); + //DS=14 + SPI_WriteComm(0xfe01); + SPI_WriteData(0x94); + //OSC =60h + SPI_WriteComm(0xf600); + SPI_WriteData(0x60); + //TE ON + SPI_WriteComm(0x3500); + SPI_WriteData(0x00); + + SPI_WriteComm(0x3600); + SPI_WriteData(0x0048); + SPI_WriteComm(0x1100); + LCD_delay(120); + + SPI_WriteComm(0x2900); + + SPI_WriteComm(0x2c00); + SPI_WriteComm(0x3c00); +} +void LCD_Initial(rt_uint32_t LTDC_Buf1, rt_uint32_t LTDC_Buf2) //LCD初始化函数 +{ + GPIO_RGB_INIT(); //初始化液晶屏相关GPIO + LCD_Reset(); //复位液晶屏 + + LTDC_Clock_Set(); + Set_LCD_Timing_to_LTDC(LTDC_Buf1, LTDC_Buf2); + Lcd_Initialize(); + Lcd_Light_ON; //打开背光 +} + + + +/********************************************** +函数名:Lcd矩形填充函数 + +入口参数:xStart x方向的起始点 + ySrart y方向的终止点 + xLong 要选定矩形的x方向长度 + yLong 要选定矩形的y方向长度 +返回值:无 +***********************************************/ +// void Lcd_ColorBox(rt_uint16_t xStart, rt_uint16_t yStart, rt_uint16_t xLong, rt_uint16_t yLong, rt_uint32_t Color) +// { +// rt_uint16_t i, j; +// rt_uint32_t temp; +// temp = YSIZE_PHYS * xStart; +// for (i = 0; i < yLong; i++) +// { +// for (j = 0; j < xLong; j++) +// LTDC_Buf[yStart + i + YSIZE_PHYS * j + temp] = Color; +// } + +// // rt_uint16_t i,j; +// // rt_uint32_t temp; +// // temp = XSIZE_PHYS*yStart; +// // for(i=0;i<yLong;i++) +// // { +// // for(j=0;j<xLong;j++) +// // LTDC_Buf[xStart+j+XSIZE_PHYS*i+temp]=Color; +// // } +// } + +/****************************************** +函数名:Lcd图像填充 +功能:向Lcd指定位置填充图像 +入口参数: + (x,y): 图片左上角起始坐标 + (pic_H,pic_V): 图片的宽高 + pic 指向存储图片数组的指针 +LCD_Fill_Pic(400,100,320,480,(rt_uint32_t*)gImage_MM_T035); +******************************************/ +// void LCD_Fill_Pic(rt_uint16_t x, rt_uint16_t y, rt_uint16_t pic_H, rt_uint16_t pic_V, rt_uint32_t *pic) +// { +// rt_uint16_t i, j; +// rt_uint32_t Xstart, k = 0; +// Xstart = YSIZE_PHYS * x; +// for (i = 0; i < pic_V; i++) +// { +// for (j = 0; j < pic_H; j++) +// LTDC_Buf[Xstart + i + YSIZE_PHYS * j + y] = pic[k++]; +// } + +// // rt_uint16_t i,j; +// // rt_uint32_t Ystart,k=0; +// // Ystart = YSIZE_PHYS*y; +// // for(i=0;i<pic_V;i++) +// // { +// // for(j=0;j<pic_H;j++) +// // LTDC_Buf[x+j+YSIZE_PHYS*i+Ystart]=pic[k++]; +// // } +// } +//=============== 在x,y 坐标上打一个颜色为Color的点 =============== +// void DrawPixel(rt_uint16_t x, rt_uint16_t y, int Color) +// { +// LTDC_Buf[y + YSIZE_PHYS * x] = Color; +// // LTDC_Buf[x+XSIZE_PHYS*y] = Color; +// } +/**********8*16字体 ASCII码 显示************* +(x,y): 显示字母的起始坐标 +num: 要显示的字符:" "--->"~" +fColor 前景色 +bColor 背景色 +flag: 有背景色(1)无背景色(0) +*********************************************/ +// void SPILCD_ShowChar(unsigned short x, unsigned short y, unsigned char num, unsigned int fColor, unsigned int bColor, unsigned char flag) +// { +// unsigned char temp; +// unsigned int pos, i, j; + +// num = num - ' '; //得到偏移后的值 +// i = num * 16; +// for (pos = 0; pos < 16; pos++) +// { +// temp = nAsciiDot[i + pos]; //调通调用ASCII字体 +// for (j = 0; j < 8; j++) +// { +// if (temp & 0x80) +// DrawPixel(x + j, y, fColor); +// else if (flag) +// DrawPixel(x + j, y, bColor); //如果背景色标志flag为1 +// temp <<= 1; +// } +// y++; +// } +// } + +/**********写一个16x16的汉字***************** +(x,y): 显示汉字的起始坐标 +c[2]: 要显示的汉字 +fColor 前景色 +bColor 背景色 +flag: 有背景色(1)无背景色(0) +*********************************************/ +// void PutGB1616(unsigned short x, unsigned short y, unsigned char c[2], unsigned int fColor, unsigned int bColor, unsigned char flag) +// { +// unsigned int i, j, k; +// unsigned short m; +// for (k = 0; k < 64; k++) +// { //64标示自建汉字库中的个数,循环查询内码 +// if ((codeGB_16[k].Index[0] == c[0]) && (codeGB_16[k].Index[1] == c[1])) +// { +// for (i = 0; i < 32; i++) +// { +// m = codeGB_16[k].Msk[i]; +// for (j = 0; j < 8; j++) +// { +// if ((m & 0x80) == 0x80) +// { +// DrawPixel(x + j, y, fColor); +// } +// else +// { +// if (flag) +// DrawPixel(x + j, y, bColor); +// } +// m = m << 1; +// } +// if (i % 2) +// { +// y++; +// x = x - 8; +// } +// else +// x = x + 8; +// } +// } +// } +// } +/**********显示一串字***************** +(x,y): 字符串的起始坐标 +*s: 要显示的字符串指针 +fColor 前景色 +bColor 背景色 +flag: 有背景色(1)无背景色(0) +*********************************************/ +// void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor, unsigned char flag) +// { +// unsigned char l = 0; +// while (*s) +// { +// if (*s < 0x80) +// { +// SPILCD_ShowChar(x + l * 8, y, *s, fColor, bColor, flag); +// s++; +// l++; +// } +// else +// { +// PutGB1616(x + l * 8, y, (unsigned char *)s, fColor, bColor, flag); +// s += 2; +// l += 2; +// } +// } +// } diff --git a/bsp/tkm32F499/drivers/lcd/lcd.h b/bsp/tkm32F499/drivers/lcd/lcd.h new file mode 100644 index 0000000000..ba925eb896 --- /dev/null +++ b/bsp/tkm32F499/drivers/lcd/lcd.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-14 spaceman first version + */ + +#include <board.h> + +// #define XSIZE_PHYS 800 +// #define YSIZE_PHYS 480 +// extern __align(256) rt_uint32_t LTDC_Buf[XSIZE_PHYS*YSIZE_PHYS]; +#define LCD_SPI_CS(a) \ + if (a) \ + GPIOB->BSRR = GPIO_Pin_11; \ + else \ + GPIOB->BRR = GPIO_Pin_11; +#define SPI_DCLK(a) \ + if (a) \ + GPIOB->BSRR = GPIO_Pin_9; \ + else \ + GPIOB->BRR = GPIO_Pin_9; +#define SPI_SDA(a) \ + if (a) \ + GPIOB->BSRR = GPIO_Pin_0; \ + else \ + GPIOB->BRR = GPIO_Pin_0; + +#define LCD_RST(a) \ + if (a) \ + GPIOD->BSRR = GPIO_Pin_6; \ + else \ + GPIOD->BRR = GPIO_Pin_6; +#define Set_Rst GPIOD->BSRR = GPIO_Pin_6 +#define Clr_Rst GPIOD->BRR = GPIO_Pin_6 +#define Lcd_Light_ON GPIOD->BSRR = GPIO_Pin_8 //PD8为高电平 背光打开 +#define Lcd_Light_OFF GPIOD->BRR = GPIO_Pin_8 //PD8为低电平 背光关闭 + +//************* 24位色(1600万色)定义 *************// +#define White 0xFFFFFF +#define Black 0x000000 +#define Blue 0xFF0000 +#define Blue2 0xFF3F3F +#define Red 0x0000FF +#define Magenta 0xFF00FF +#define Green 0x00FF00 +#define Cyan 0xFFFF00 +#define Yellow 0x00FFFF + +//************* 16位色定义 *************// +//#define White 0xFFFF +//#define Black 0x0000 +//#define Blue 0x001F +//#define Blue2 0x051F +//#define Red 0xF800 +//#define Magenta 0xF81F +//#define Green 0x07E0 +//#define Cyan 0x7FFF +//#define Yellow 0xFFE0 + + + +void LCD_Initial(rt_uint32_t LTDC_Buf1, rt_uint32_t LTDC_Buf2); //LCD初始化函数 +// volatile void LCD_delay(volatile int time); +// void WriteComm(unsigned char CMD); +// void WriteData(rt_uint32_t dat); +// void LCD_WR_REG(rt_uint16_t Index,rt_uint16_t CongfigTemp); +// void Lcd_ColorBox(rt_uint16_t xStart,rt_uint16_t yStart,rt_uint16_t xLong,rt_uint16_t yLong,rt_uint32_t Color); +//void SPILCD_DrawLine(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,unsigned short color); +//void SPILCD_ShowChar(unsigned short x,unsigned short y,unsigned char num, unsigned int fColor, unsigned int bColor,unsigned char flag) ; +// void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor,unsigned char flag); +// void LCD_Fill_Pic(rt_uint16_t x, rt_uint16_t y,rt_uint16_t pic_H, rt_uint16_t pic_V, rt_uint32_t* pic); diff --git a/bsp/tkm32F499/drivers/lcd_port.h b/bsp/tkm32F499/drivers/lcd_port.h new file mode 100644 index 0000000000..e11e757b93 --- /dev/null +++ b/bsp/tkm32F499/drivers/lcd_port.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-14 spaceman first version + */ + +#ifndef __LCD_PORT_H__ +#define __LCD_PORT_H__ + +/* TK043F1508 RM68120 5 inch screen, 800 * 480 */ +#define LCD_WIDTH 800 +#define LCD_HEIGHT 480 +#define LCD_BITS_PER_PIXEL 32 +#define LCD_BUF_SIZE (LCD_WIDTH * LCD_HEIGHT * LCD_BITS_PER_PIXEL / 8) +#define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB565 + +#define LCD_HSYNC_WIDTH 96 +#define LCD_VSYNC_HEIGHT 2 +#define LCD_HBP 10 +#define LCD_VBP 10 +#define LCD_HFP 10 +#define LCD_VFP 10 + +#define LCD_BACKLIGHT_USING_GPIO +#define LCD_BL_GPIO_NUM -1 +#define LCD_DISP_GPIO_NUM -1 + +/* TK043F1508 RM68120 5 inch screen, 800 * 480 */ + +#endif /* __LCD_PORT_H__ */ diff --git a/bsp/tkm32F499/drivers/linker_scripts/link.icf b/bsp/tkm32F499/drivers/linker_scripts/link.icf new file mode 100644 index 0000000000..a2e05e53a6 --- /dev/null +++ b/bsp/tkm32F499/drivers/linker_scripts/link.icf @@ -0,0 +1,34 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+define symbol __ICFEDIT_region_IROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_IROM_end__ = 0x0001FFFF;
+define symbol __ICFEDIT_region_IRAM_start__ = 0x20000000;
+define symbol __ICFEDIT_region_IRAM_end__ = 0x20004FFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x0800;
+define symbol __ICFEDIT_size_proc_stack__ = 0x0;
+define symbol __ICFEDIT_size_heap__ = 0x0800;
+/**** End of ICF editor section. ###ICF###*/
+define memory mem with size = 4G;
+define region IROM_region = mem:[from __ICFEDIT_region_IROM_start__ to __ICFEDIT_region_IROM_end__];
+define region IRAM_region = mem:[from __ICFEDIT_region_IRAM_start__ to __ICFEDIT_region_IRAM_end__];
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in IROM_region { readonly };
+place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
diff --git a/bsp/tkm32F499/drivers/linker_scripts/link.lds b/bsp/tkm32F499/drivers/linker_scripts/link.lds new file mode 100644 index 0000000000..aad42bdb39 --- /dev/null +++ b/bsp/tkm32F499/drivers/linker_scripts/link.lds @@ -0,0 +1,137 @@ +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 128k /* 128KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 20k /* 8K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); + + . = ALIGN(4); + _etext = .; + } > CODE = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > CODE + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >DATA + + .stack : + { + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >DATA + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > DATA + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/tkm32F499/drivers/linker_scripts/link.sct b/bsp/tkm32F499/drivers/linker_scripts/link.sct new file mode 100644 index 0000000000..b2d98ef44a --- /dev/null +++ b/bsp/tkm32F499/drivers/linker_scripts/link.sct @@ -0,0 +1,16 @@ +; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x70020000 0x00200000 { ; load region size_region
+ ER_IROM1 0x70020000 0x00200000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ .ANY (+XO)
+ }
+ RW_IRAM1 0x70220000 0x005DFFFF { ; RW data
+ .ANY (+RW +ZI)
+ }
+}
+
|
