GadgetSeed  0.9.6
stm32f769i-disc_lcd.c
[詳解]
1 /** @file
2  @brief STM32F769I Discovery LCD ドライバ
3 
4  @date 2017.01.08
5  @author Takashi SHUDO
6 */
7 
8 #include "device.h"
9 #include "device/video_ioctl.h"
10 #include "timer.h"
11 #include "tkprintf.h"
12 #include "graphics.h"
13 
14 #include "stm32f769i_discovery_lcd.h"
15 
16 #define LCD_WIDTH 800 // 幅
17 #define LCD_HEIGHT 480 // 高さ
18 
19 #define __ATTR_FRAMEBUFFER __attribute__ ((section(".extram"))) __attribute__ ((aligned (4)))
20 unsigned char lcd_f_buffer_main[LCD_WIDTH * LCD_HEIGHT * 2] __ATTR_FRAMEBUFFER;
21 unsigned char lcd_f_buffer_sub [LCD_WIDTH * LCD_HEIGHT * 2] __ATTR_FRAMEBUFFER;
22 
23 LTDC_HandleTypeDef hltdc_discovery;
24 DSI_HandleTypeDef hdsi_discovery;
25 
26 static void init_framebuf(void)
27 {
28  unsigned char *p;
29 
30  for(p=&lcd_f_buffer_main[0];
31  p<&lcd_f_buffer_main[LCD_WIDTH * LCD_HEIGHT * 2];
32  p++) {
33  *p = 0; // Black
34  }
35 
36  for(p=&lcd_f_buffer_sub[0];
37  p<&lcd_f_buffer_sub[LCD_WIDTH * LCD_HEIGHT * 2];
38  p++) {
39  *p = 0; // Black
40  }
41 }
42 
43 static void Display_DSIIF_Init(void)
44 {
45  LCD_LayerCfgTypeDef Layercfg;
46 
47  BSP_LCD_Init();
48 
49  /* Layer Init */
50  Layercfg.WindowX0 = 0;
51  Layercfg.WindowX1 = LCD_WIDTH-1;
52  Layercfg.WindowY0 = 0;
53  Layercfg.WindowY1 = LCD_HEIGHT-1;
54  Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
55  Layercfg.FBStartAdress = (uint32_t)lcd_f_buffer_main;
56  Layercfg.Alpha = 255;
57  Layercfg.Alpha0 = 0;
58  Layercfg.Backcolor.Blue = 0;
59  Layercfg.Backcolor.Green = 0;
60  Layercfg.Backcolor.Red = 0;
61  Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
62  Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
63  Layercfg.ImageWidth = LCD_WIDTH;
64  Layercfg.ImageHeight = LCD_HEIGHT;
65  HAL_LTDC_ConfigLayer(&hltdc_discovery, &Layercfg, 0);
66 }
67 
68 static int lcd_register(struct st_device *dev, char *param)
69 {
70  ((struct st_video_info *)(dev->info))->frame_buf_ptr[0] = lcd_f_buffer_main;
71  ((struct st_video_info *)(dev->info))->frame_buf_ptr[1] = lcd_f_buffer_sub;
72  ((struct st_video_info *)(dev->info))->mem_size = sizeof(lcd_f_buffer_main);
73 
74  Display_DSIIF_Init();
75  init_framebuf();
76 
77  return 0;
78 }
79 
80 static int lcd_ioctl(struct st_device *dev, unsigned int com, unsigned int arg, void *param)
81 {
82  switch(com) {
84  switch(arg) {
85  case 0:
86  BSP_LCD_SetLayerAddress(0, (uint32_t)lcd_f_buffer_main);
87  break;
88 
89  case 1:
90  BSP_LCD_SetLayerAddress(0, (uint32_t)lcd_f_buffer_sub);
91  break;
92 
93  default:
94  return -1;
95  break;
96  }
97  break;
98 
99  case IOCMD_VIDEO_CLEAR:
100  {
101  init_framebuf();
102  }
103  break;
104 
105  default:
106  SYSERR_PRINT("Unknow command %08lX arg %08lX\n", com, arg);
107  return -1;
108  }
109 
110  return 0;
111 }
112 
113 static struct st_video_info lcd_info = {
115  .width = LCD_WIDTH,
116  .height = LCD_HEIGHT,
117  .color_depth = VCOLORDEP_16,
118  .frame_num = 2,
119  .frame_buf_ptr = { 0, 0 },
120  .mem_size = 0,
121 };
122 
123 const struct st_device lcd_device = {
125  .explan = "STM32F769I-Discovery LCD",
126  .info = (void *)&lcd_info,
127  .register_dev = lcd_register,
128  .ioctl = lcd_ioctl,
129 };
void * info
デバイス情報データポインタ
Definition: device.h:28
#define IOCMD_VIDEO_CLEAR
全画面初期化
Definition: video_ioctl.h:52
画像表示デバイスドライバ ioctl 用マクロ定義
画像表示デバイス情報
Definition: video_ioctl.h:30
カーネルタイマ
unsigned short type
ビデオデバイスタイプ(VIDEOTYPE_*)
Definition: video_ioctl.h:31
カーネル用機能限定printf
#define VCOLORDEP_16
16ビットカラー
Definition: video_ioctl.h:26
unsigned int mem_size
フレームバッファメモリサイズ
Definition: video_ioctl.h:37
#define IOCMD_VIDEO_SETDISPFRAME
表示フレーム番号を設定する
Definition: video_ioctl.h:47
#define VIDEOTYPE_FRAMEBUF
カラーフレームバッファ(描画同期無し)
Definition: video_ioctl.h:21
unsigned char * frame_buf_ptr[MAX_FRAMEBUF]
フレームバッファポインタ
Definition: video_ioctl.h:36
#define DEF_DEV_NAME_VIDEO
標準ビデオデバイス名
Definition: video_ioctl.h:16
デバイスドライバAPI
デバイスドライバ構造体
Definition: device.h:25
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26
グラフィックライブラリ