aboutsummaryrefslogtreecommitdiffstats
path: root/boards/base/STM32F746-Discovery/board_STM32LTDC.h
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2015-07-13 16:40:06 +1000
committerinmarket <andrewh@inmarket.com.au>2015-07-13 16:40:06 +1000
commitea0f9922e7b265ac8b6321a6e6de33b56b049a28 (patch)
tree01607d657fe231aeccec62e1d8676b179f6eac0a /boards/base/STM32F746-Discovery/board_STM32LTDC.h
parent8449863ad030068e00e48fbf4483af53d161c616 (diff)
parent8b60b516231dee99f9e5df6b3398b4279568f6bb (diff)
downloaduGFX-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.h288
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 */