14 #include "stm32469i_discovery_lcd.h" 16 #define LCD_WIDTH 800 // 幅 17 #define LCD_HEIGHT 480 // 高さ 19 #define __ATTR_FRAMEBUFFER __attribute__ ((section(".extram"))) __attribute__ ((aligned (4))) 20 unsigned char lcd_f_buffer_main[LCD_WIDTH * LCD_HEIGHT * 4] __ATTR_FRAMEBUFFER;
21 unsigned char lcd_f_buffer_sub [LCD_WIDTH * LCD_HEIGHT * 4] __ATTR_FRAMEBUFFER;
23 LTDC_HandleTypeDef hltdc_discovery;
24 DSI_HandleTypeDef hdsi_discovery;
26 static void init_framebuf(
void)
30 for(p=&lcd_f_buffer_main[0];
31 p<&lcd_f_buffer_main[LCD_WIDTH * LCD_HEIGHT * 4];
36 for(p=&lcd_f_buffer_sub[0];
37 p<&lcd_f_buffer_sub[LCD_WIDTH * LCD_HEIGHT * 4];
43 extern LTDC_HandleTypeDef hltdc_eval;
44 extern DSI_HandleTypeDef hdsi_eval;
45 DSI_VidCfgTypeDef hdsivideo_handle;
49 DSI_PLLInitTypeDef dsiPllInit;
50 DSI_PHY_TimerTypeDef PhyTimings;
51 static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
52 uint32_t LcdClock = 19200;
54 uint32_t laneByteClk_kHz = 0;
80 hdsi_eval.Instance = DSI;
82 HAL_DSI_DeInit(&(hdsi_eval));
84 #if !defined(USE_STM32469I_DISCO_REVA) 85 dsiPllInit.PLLNDIV = 125;
86 dsiPllInit.PLLIDF = DSI_PLL_IN_DIV2;
87 dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1;
89 dsiPllInit.PLLNDIV = 100;
90 dsiPllInit.PLLIDF = DSI_PLL_IN_DIV5;
91 dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1;
93 laneByteClk_kHz = 62500;
96 hdsi_eval.Init.NumberOfLanes = DSI_TWO_DATA_LANES;
99 hdsi_eval.Init.TXEscapeCkdiv = laneByteClk_kHz/15620;
101 HAL_DSI_Init(&(hdsi_eval), &(dsiPllInit));
104 VSA = OTM8009A_480X800_VSYNC;
105 VBP = OTM8009A_480X800_VBP;
106 VFP = OTM8009A_480X800_VFP;
107 HSA = OTM8009A_480X800_HSYNC;
108 HBP = OTM8009A_480X800_HBP;
109 HFP = OTM8009A_480X800_HFP;
110 HACT = OTM8009A_800X480_WIDTH;
111 VACT = OTM8009A_800X480_HEIGHT;
113 hdsivideo_handle.VirtualChannelID = LCD_OTM8009A_ID;
114 hdsivideo_handle.ColorCoding = LCD_DSI_PIXEL_DATA_FMT_RBG888;
115 hdsivideo_handle.VSPolarity = DSI_VSYNC_ACTIVE_HIGH;
116 hdsivideo_handle.HSPolarity = DSI_HSYNC_ACTIVE_HIGH;
117 hdsivideo_handle.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH;
118 hdsivideo_handle.Mode = DSI_VID_MODE_BURST;
119 hdsivideo_handle.NullPacketSize = 0xFFF;
120 hdsivideo_handle.NumberOfChunks = 0;
121 hdsivideo_handle.PacketSize = HACT;
122 hdsivideo_handle.HorizontalSyncActive = (HSA * laneByteClk_kHz) / LcdClock;
123 hdsivideo_handle.HorizontalBackPorch = (HBP * laneByteClk_kHz) / LcdClock;
124 hdsivideo_handle.HorizontalLine = ((HACT + HSA + HBP + HFP) * laneByteClk_kHz) / LcdClock;
125 hdsivideo_handle.VerticalSyncActive = VSA;
126 hdsivideo_handle.VerticalBackPorch = VBP;
127 hdsivideo_handle.VerticalFrontPorch = VFP;
128 hdsivideo_handle.VerticalActive = VACT;
131 hdsivideo_handle.LPCommandEnable = DSI_LP_COMMAND_ENABLE;
135 hdsivideo_handle.LPLargestPacketSize = 16;
139 hdsivideo_handle.LPVACTLargestPacketSize = 0;
144 hdsivideo_handle.LPHorizontalFrontPorchEnable = DSI_LP_HFP_ENABLE;
145 hdsivideo_handle.LPHorizontalBackPorchEnable = DSI_LP_HBP_ENABLE;
146 hdsivideo_handle.LPVerticalActiveEnable = DSI_LP_VACT_ENABLE;
147 hdsivideo_handle.LPVerticalFrontPorchEnable = DSI_LP_VFP_ENABLE;
148 hdsivideo_handle.LPVerticalBackPorchEnable = DSI_LP_VBP_ENABLE;
149 hdsivideo_handle.LPVerticalSyncActiveEnable = DSI_LP_VSYNC_ENABLE;
152 HAL_DSI_ConfigVideoMode(&(hdsi_eval), &(hdsivideo_handle));
155 PhyTimings.ClockLaneHS2LPTime = 35;
156 PhyTimings.ClockLaneLP2HSTime = 35;
157 PhyTimings.DataLaneHS2LPTime = 35;
158 PhyTimings.DataLaneLP2HSTime = 35;
159 PhyTimings.DataLaneMaxReadTime = 0;
160 PhyTimings.StopWaitTime = 10;
161 HAL_DSI_ConfigPhyTimer(&hdsi_eval, &PhyTimings);
170 hltdc_eval.Init.HorizontalSync = (HSA - 1);
171 hltdc_eval.Init.AccumulatedHBP = (HSA + HBP - 1);
172 hltdc_eval.Init.AccumulatedActiveW = (HACT + HSA + HBP - 1);
173 hltdc_eval.Init.TotalWidth = (HACT + HSA + HBP + HFP - 1);
176 hltdc_eval.LayerCfg->ImageWidth = HACT;
177 hltdc_eval.LayerCfg->ImageHeight = VACT;
185 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
186 PeriphClkInitStruct.PLLSAI.PLLSAIN = 192;
187 PeriphClkInitStruct.PLLSAI.PLLSAIR = 5;
188 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
189 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
192 hltdc_eval.Init.Backcolor.Blue = 0;
193 hltdc_eval.Init.Backcolor.Green = 0;
194 hltdc_eval.Init.Backcolor.Red = 0;
195 hltdc_eval.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
196 hltdc_eval.Instance = LTDC;
199 HAL_LTDC_StructInitFromVideoConfig(&(hltdc_eval), &(hdsivideo_handle));
202 HAL_LTDC_Init(&hltdc_eval);
207 HAL_DSI_Start(&(hdsi_eval));
209 #if !defined(DATA_IN_ExtSDRAM) 215 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
225 OTM8009A_Init(OTM8009A_FORMAT_RGB888, OTM8009A_ORIENTATION_LANDSCAPE);
232 static void Display_DSIIF_Init(
void)
235 BSP_LCD_DisplayOff();
237 BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_BACKGROUND, (uint32_t)lcd_f_buffer_sub);
238 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_BACKGROUND);
239 BSP_LCD_Clear(LCD_COLOR_BLACK);
241 BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_FOREGROUND, (uint32_t)lcd_f_buffer_main);
242 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_FOREGROUND);
243 BSP_LCD_Clear(LCD_COLOR_BLACK);
245 BSP_LCD_SetColorKeying(1, 0);
247 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_BACKGROUND);
251 static int lcd_register(
struct st_device *dev,
char *param)
257 Display_DSIIF_Init();
263 static int lcd_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
269 BSP_LCD_SetLayerAddress(1, (uint32_t)lcd_f_buffer_main);
273 BSP_LCD_SetLayerAddress(1, (uint32_t)lcd_f_buffer_sub);
289 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
299 .height = LCD_HEIGHT,
302 .frame_buf_ptr = { 0, 0 },
308 .explan =
"STM32F469I-Discovery LCD",
309 .info = (
void *)&lcd_info,
310 .register_dev = lcd_register,
#define VCOLORDEP_32
32ビットカラー
#define IOCMD_VIDEO_CLEAR
全画面初期化
画像表示デバイスドライバ ioctl 用マクロ定義
unsigned short type
ビデオデバイスタイプ(VIDEOTYPE_*)
unsigned int mem_size
フレームバッファメモリサイズ
#define IOCMD_VIDEO_SETDISPFRAME
表示フレーム番号を設定する
#define VIDEOTYPE_FRAMEBUF
カラーフレームバッファ(描画同期無し)
unsigned char * frame_buf_ptr[MAX_FRAMEBUF]
フレームバッファポインタ
#define DEF_DEV_NAME_VIDEO
標準ビデオデバイス名
static uint8_t LCD_Init(void)
char name[MAX_DEVNAMELRN]
デバイス名文字列