diff options
author | inmarket <andrewh@inmarket.com.au> | 2015-07-13 16:40:06 +1000 |
---|---|---|
committer | inmarket <andrewh@inmarket.com.au> | 2015-07-13 16:40:06 +1000 |
commit | ea0f9922e7b265ac8b6321a6e6de33b56b049a28 (patch) | |
tree | 01607d657fe231aeccec62e1d8676b179f6eac0a /boards/base/STM32F746-Discovery/board_STM32LTDC.h | |
parent | 8449863ad030068e00e48fbf4483af53d161c616 (diff) | |
parent | 8b60b516231dee99f9e5df6b3398b4279568f6bb (diff) | |
download | uGFX-ea0f9922e7b265ac8b6321a6e6de33b56b049a28.tar.gz uGFX-ea0f9922e7b265ac8b6321a6e6de33b56b049a28.tar.bz2 uGFX-ea0f9922e7b265ac8b6321a6e6de33b56b049a28.zip |
Merge branch 'master' into Alternate_Raw32_Scheduler
Diffstat (limited to 'boards/base/STM32F746-Discovery/board_STM32LTDC.h')
-rw-r--r-- | boards/base/STM32F746-Discovery/board_STM32LTDC.h | 288 |
1 files changed, 213 insertions, 75 deletions
diff --git a/boards/base/STM32F746-Discovery/board_STM32LTDC.h b/boards/base/STM32F746-Discovery/board_STM32LTDC.h index 151a19ca..059e7e9d 100644 --- a/boards/base/STM32F746-Discovery/board_STM32LTDC.h +++ b/boards/base/STM32F746-Discovery/board_STM32LTDC.h @@ -39,94 +39,225 @@ static const ltdcConfig driverCfg = { LTDC_UNUSED_LAYER_CONFIG // Foreground layer config }; -/** - * @brief LCD special pins - */ -/* Display enable pin */ -#define LCD_DISP_PIN GPIO_PIN_12 -#define LCD_DISP_GPIO_PORT GPIOI - -/* Backlight control pin */ -#define LCD_BL_CTRL_PIN GPIO_PIN_3 -#define LCD_BL_CTRL_GPIO_PORT GPIOK - /* Display timing */ #define RK043FN48H_FREQUENCY_DIVIDER 5 -static void SetBoardPinDirectionsForLCD(void) +static void configureLcdPins(void) { - GPIO_InitTypeDef gpio_init_structure; - - // Enable GPIOs clock */ - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOI_CLK_ENABLE(); // Display pin - __HAL_RCC_GPIOJ_CLK_ENABLE(); - __HAL_RCC_GPIOK_CLK_ENABLE(); // BL pin - - //*** LTDC Pins configuration - // GPIOE configuration - gpio_init_structure.Pin = GPIO_PIN_4; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOE, &gpio_init_structure); - - // GPIOG configuration - gpio_init_structure.Pin = GPIO_PIN_12; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF9_LTDC; - HAL_GPIO_Init(GPIOG, &gpio_init_structure); - - // GPIOI LTDC alternate configuration - gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | \ - GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOI, &gpio_init_structure); - - // GPIOJ configuration - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \ - GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \ - GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \ - GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOJ, &gpio_init_structure); - - // GPIOK configuration - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \ - GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOK, &gpio_init_structure); - - // LCD_DISP GPIO configuration - gpio_init_structure.Pin = LCD_DISP_PIN; /* LCD_DISP pin has to be manually controlled */ - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(LCD_DISP_GPIO_PORT, &gpio_init_structure); - - // LCD_BL_CTRL GPIO configuration - gpio_init_structure.Pin = LCD_BL_CTRL_PIN; /* LCD_BL_CTRL pin has to be manually controlled */ - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(LCD_BL_CTRL_GPIO_PORT, &gpio_init_structure); + GPIO_InitTypeDef gpio_init_structure; + + // Enable GPIOs clock + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; // GPIOE + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN; // GPIOG + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOIEN; // GPIOI + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOJEN; // GPIOJ + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOKEN; // GPIOK + + // PI15: LCD_R0 + GPIOI->MODER |= GPIO_MODER_MODER15_1; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_15; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_0 | GPIO_OSPEEDER_OSPEEDR15_1; + GPIOI->AFR[1] |= (0b1110 << 4*7); + + // PJ0: LCD_R1 + GPIOJ->MODER |= GPIO_MODER_MODER0_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_0; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR0_1; + GPIOJ->AFR[0] |= (0b1110 << 4*0); + + // PJ1: LCD_R2 + GPIOJ->MODER |= GPIO_MODER_MODER1_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_1; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1_0 | GPIO_OSPEEDER_OSPEEDR1_1; + GPIOJ->AFR[0] |= (0b1110 << 4*1); + + // PJ2: LCD_R3 + GPIOJ->MODER |= GPIO_MODER_MODER2_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_2; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2_0 | GPIO_OSPEEDER_OSPEEDR2_1; + GPIOJ->AFR[0] |= (0b1110 << 4*2); + + // PJ3: LCD_R4 + GPIOJ->MODER |= GPIO_MODER_MODER3_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_3; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3_0 | GPIO_OSPEEDER_OSPEEDR3_1; + GPIOJ->AFR[0] |= (0b1110 << 4*3); + + // PJ4: LCD_R5 + GPIOJ->MODER |= GPIO_MODER_MODER4_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_4; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4_0 | GPIO_OSPEEDER_OSPEEDR4_1; + GPIOJ->AFR[0] |= (0b1110 << 4*4); + + // PJ5: LCD_R6 + GPIOJ->MODER |= GPIO_MODER_MODER5_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_5; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5_0 | GPIO_OSPEEDER_OSPEEDR5_1; + GPIOJ->AFR[0] |= (0b1110 << 4*5); + + // PJ6: LCD_R7 + GPIOJ->MODER |= GPIO_MODER_MODER6_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_6; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR6_1; + GPIOJ->AFR[0] |= (0b1110 << 4*6); + + // PJ7: LCD_G0 + GPIOJ->MODER |= GPIO_MODER_MODER7_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_7; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_0 | GPIO_OSPEEDER_OSPEEDR7_1; + GPIOJ->AFR[0] |= (0b1110 << 4*7); + + // PJ8: LCD_G1 + GPIOJ->MODER |= GPIO_MODER_MODER8_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_8; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8_0 | GPIO_OSPEEDER_OSPEEDR8_1; + GPIOJ->AFR[1] |= (0b1110 << 4*0); + + // PJ9: LCD_G2 + GPIOJ->MODER |= GPIO_MODER_MODER9_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_9; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9_0 | GPIO_OSPEEDER_OSPEEDR9_1; + GPIOJ->AFR[1] |= (0b1110 << 4*1); + + // PJ10: LCD_G3 + GPIOJ->MODER |= GPIO_MODER_MODER10_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_10; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_0 | GPIO_OSPEEDER_OSPEEDR10_1; + GPIOJ->AFR[1] |= (0b1110 << 4*2); + + // PJ11: LCD_G4 + GPIOJ->MODER |= GPIO_MODER_MODER11_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_11; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11_0 | GPIO_OSPEEDER_OSPEEDR11_1; + GPIOJ->AFR[1] |= (0b1110 << 4*3); + + // PK0: LCD_G5 + GPIOK->MODER |= GPIO_MODER_MODER0_0; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_0; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR0_1; + GPIOK->AFR[0] |= (0b1110 << 4*0); + + // PK1: LCD_G6 + GPIOK->MODER |= GPIO_MODER_MODER1_1; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_1; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1_0 | GPIO_OSPEEDER_OSPEEDR1_1; + GPIOK->AFR[0] |= (0b1110 << 4*1); + + // PK2: LCD_G7 + GPIOK->MODER |= GPIO_MODER_MODER2_1; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_2; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2_0 | GPIO_OSPEEDER_OSPEEDR2_1; + GPIOK->AFR[0] |= (0b1110 << 4*2); + + // PE4: LCD_B0 + GPIOE->MODER |= GPIO_MODER_MODER4_1; + GPIOE->OTYPER &=~ GPIO_OTYPER_OT_4; + GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4_0 | GPIO_OSPEEDER_OSPEEDR4_1; + GPIOE->AFR[0] |= (0b1110 << 4*4); + + // PJ13: LCD_B1 + GPIOJ->MODER |= GPIO_MODER_MODER13_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_13; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_0 | GPIO_OSPEEDER_OSPEEDR13_1; + GPIOJ->AFR[1] |= (0b1110 << 4*5); + + // PJ14: LCD_B2 + GPIOJ->MODER |= GPIO_MODER_MODER14_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_14; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_0 | GPIO_OSPEEDER_OSPEEDR14_1; + GPIOJ->AFR[1] |= (0b1110 << 4*6); + + // PJ15: LCD_B3 + GPIOJ->MODER |= GPIO_MODER_MODER15_1; + GPIOJ->OTYPER &=~ GPIO_OTYPER_OT_15; + GPIOJ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_0 | GPIO_OSPEEDER_OSPEEDR15_1; + GPIOJ->AFR[1] |= (0b1110 << 4*7); + + // PG12: LCD_B4 + GPIOG->MODER |= GPIO_MODER_MODER12_1; + GPIOG->OTYPER &=~ GPIO_OTYPER_OT_12; + GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12_0 | GPIO_OSPEEDER_OSPEEDR12_1; + GPIOG->AFR[1] |= (0b1110 << 4*4); + + // PK4: LCD_B5 + GPIOK->MODER |= GPIO_MODER_MODER4_1; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_4; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4_0 | GPIO_OSPEEDER_OSPEEDR4_1; + GPIOK->AFR[0] |= (0b1110 << 4*4); + + // PK5: LCD_B6 + GPIOK->MODER |= GPIO_MODER_MODER5_1; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_5; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5_0 | GPIO_OSPEEDER_OSPEEDR5_1; + GPIOK->AFR[0] |= (0b1110 << 4*5); + + // PK6: LCD_B7 + GPIOK->MODER |= GPIO_MODER_MODER6_1; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_6; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR6_1; + GPIOK->AFR[0] |= (0b1110 << 4*6); + + // PK7: LCD_DE + GPIOK->MODER |= GPIO_MODER_MODER7_1; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_7; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_0 | GPIO_OSPEEDER_OSPEEDR7_1; + GPIOK->AFR[0] |= (0b1110 << 4*7); + + // PI9: LCD_VSYNC + GPIOI->MODER |= GPIO_MODER_MODER9_1; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_9; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9_0 | GPIO_OSPEEDER_OSPEEDR9_1; + GPIOI->AFR[1] |= (0b1110 << 4*1); + + // PI10: LCD_VSYNC + GPIOI->MODER |= GPIO_MODER_MODER10_1; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_10; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_0 | GPIO_OSPEEDER_OSPEEDR10_1; + GPIOI->AFR[1] |= (0b1110 << 4*2); + + // PI13: LCD_INT + GPIOI->MODER |= GPIO_MODER_MODER13_1; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_13; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_0 | GPIO_OSPEEDER_OSPEEDR13_1; + GPIOI->AFR[1] |= (0b1110 << 4*5); + + // PI14: LCD_CLK + GPIOI->MODER |= GPIO_MODER_MODER14_1; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_14; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_0 | GPIO_OSPEEDER_OSPEEDR14_1; + GPIOI->AFR[1] |= (0b1110 << 4*6); + + // PI8: ??? + GPIOI->MODER |= GPIO_MODER_MODER8_1; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_8; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8_0 | GPIO_OSPEEDER_OSPEEDR8_1; + GPIOI->AFR[1] |= (0b1110 << 4*0); + + // PI12: LCD_DISP_PIN + GPIOI->MODER |= GPIO_MODER_MODER12_0; + GPIOI->OTYPER &=~ GPIO_OTYPER_OT_12; + GPIOI->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12_0 | GPIO_OSPEEDER_OSPEEDR12_1; + + // PK3: LCD_BL_CTRL + GPIOK->MODER |= GPIO_MODER_MODER3_0; + GPIOK->OTYPER &=~ GPIO_OTYPER_OT_3; + GPIOK->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3_0 | GPIO_OSPEEDER_OSPEEDR3_1; } static inline void init_board(GDisplay *g) { - // As we are not using multiple displays we set g->board to NULL as we don't use it. + // As we are not using multiple displays we set g->board to NULL as we don't use it g->board = 0; switch(g->controllerdisplay) { case 0: // Set pin directions - SetBoardPinDirectionsForLCD(); + configureLcdPins(); // Enable the display and turn on the backlight - HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); - HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); + GPIOI->ODR |= (1 << 12); // PowerOn + GPIOK->ODR |= (1 << 3); // Backlight on #define STM32_SAISRC_NOCLOCK (0 << 23) /**< No clock. */ #define STM32_SAISRC_PLL (1 << 23) /**< SAI_CKIN is PLL. */ @@ -158,13 +289,20 @@ static inline void init_board(GDisplay *g) { } } -static inline void post_init_board(GDisplay *g) { +static inline void post_init_board(GDisplay* g) { (void) g; } -static inline void set_backlight(GDisplay *g, uint8_t percent) { +static inline void set_backlight(GDisplay* g, uint8_t percent) { (void) g; - (void) percent; + + // ST was stupid enought not to hook this up to a pin that + // is able to act as PWM output... + if (percent <= 0) { + GPIOK->ODR &=~ (1 << 3); // Backlight off + } else { + GPIOK->ODR |= (1 << 3); // Backlight on + } } #endif /* _GDISP_LLD_BOARD_H */ |