GadgetSeed  0.9.6
stm32f746g-disc_lcd.c
[詳解]
1 /** @file
2  @brief STM32F746G-Discovery LCD ドライバ
3 
4  @date 2017.02.12
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 "stm32746g_discovery_lcd.h"
15 
16 #define LCD_WIDTH 480 // 幅
17 #define LCD_HEIGHT 272 // 高さ
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 static void init_framebuf(void)
24 {
25  unsigned char *p;
26 
27  for(p=&lcd_f_buffer_main[0];
28  p<&lcd_f_buffer_main[LCD_WIDTH * LCD_HEIGHT * 2];
29  p++) {
30  *p = 0; // Black
31  }
32 
33  for(p=&lcd_f_buffer_sub[0];
34  p<&lcd_f_buffer_sub[LCD_WIDTH * LCD_HEIGHT * 2];
35  p++) {
36  *p = 0; // Black
37  }
38 }
39 
40 static int lcd_register(struct st_device *dev, char *param)
41 {
42  ((struct st_video_info *)(dev->info))->frame_buf_ptr[0] = lcd_f_buffer_main;
43  ((struct st_video_info *)(dev->info))->frame_buf_ptr[1] = lcd_f_buffer_sub;
44  ((struct st_video_info *)(dev->info))->mem_size = sizeof(lcd_f_buffer_main);
45 
46  BSP_LCD_Init();
47  BSP_LCD_LayerRgb565Init(0, (uint32_t)lcd_f_buffer_main);
48  init_framebuf();
49  BSP_LCD_DisplayOn();
50 
51  return 0;
52 }
53 
54 static int lcd_ioctl(struct st_device *dev, unsigned int com, unsigned int arg, void *param)
55 {
56  switch(com) {
58  switch(arg) {
59  case 0:
60  BSP_LCD_SetLayerAddress(0, (uint32_t)lcd_f_buffer_main);
61  break;
62 
63  case 1:
64  BSP_LCD_SetLayerAddress(0, (uint32_t)lcd_f_buffer_sub);
65  break;
66 
67  default:
68  return -1;
69  break;
70  }
71  break;
72 
73  case IOCMD_VIDEO_CLEAR:
74  {
75  init_framebuf();
76  }
77  break;
78 
79  default:
80  SYSERR_PRINT("Unknow command %08lX arg %08lX\n", com, arg);
81  return -1;
82  }
83 
84  return 0;
85 }
86 
87 static struct st_video_info lcd_info = {
89  .width = LCD_WIDTH,
90  .height = LCD_HEIGHT,
91  .color_depth = VCOLORDEP_16,
92  .frame_num = 2,
93  .frame_buf_ptr = { 0, 0 },
94  .mem_size = 0,
95 };
96 
97 const struct st_device lcd_device = {
99  .explan = "STM32F746G-Discovery LCD",
100  .info = (void *)&lcd_info,
101  .register_dev = lcd_register,
102  .ioctl = lcd_ioctl,
103 };
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
グラフィックライブラリ