24 #define LCD_WIDTH 320 // 幅 25 #define LCD_HEIGHT 240 // 高さ 27 #define LCD_ROTATION 0 // 0:240x320, 1:320x240 32 static unsigned short lcd_width = LCD_WIDTH;
33 static unsigned short lcd_height = LCD_HEIGHT;
34 static unsigned short fore_color = 0;
35 static unsigned short back_color = 0;
39 static int fmem_stat = FMEM_NOP;
41 #define ILI9341_SOFTRESET 0x01 42 #define ILI9341_DISPLAYOFF 0x28 43 #define ILI9341_POWERCONTROL1 0xc0 44 #define ILI9341_POWERCONTROL2 0xc1 45 #define ILI9341_VCOMCONTROL1 0xc5 46 #define ILI9341_VCOMCONTROL2 0xc7 47 #define ILI9341_MEMCONTROL 0x36 48 #define ILI9341_PIXELFORMAT 0x3a 49 #define ILI9341_FRAMECONTROL 0xb1 50 #define ILI9341_ENTRYMODE 0xb7 51 #define ILI9341_SLEEPOUT 0x11 52 #define ILI9341_DISPLAYON 0x29 53 #define ILI9341_COLADDRSET 0x2a 54 #define ILI9341_PAGEADDRSET 0x2b 55 #define ILI9341_MEMORYWRITE 0x2c 56 #define ILI9341_MEMORYREAD 0x2e 57 #define ILI9341_READID4 0xd3 59 #define ILI9341_MADCTL_MY 0x80 60 #define ILI9341_MADCTL_MX 0x40 61 #define ILI9341_MADCTL_MV 0x20 62 #define ILI9341_MADCTL_RGB 0x00 63 #define ILI9341_MADCTL_BGR 0x08 65 static void set_cs(
unsigned int cs)
70 static void reset_ili9341(
void)
77 static inline void write_reg8(
unsigned char addr,
unsigned char data)
80 (((
int)addr) << 16) | (
int)(data & 0xff), 0);
83 static inline void write_reg16(
unsigned char addr,
unsigned short data)
86 (((
int)addr) << 16) | (
int)(data & 0xffff), 0);
89 static inline void write_reg32(
unsigned char addr,
unsigned int data)
95 static inline unsigned int read_reg32(
unsigned char addr)
100 static void set_window(
int x1,
int y1,
int x2,
int y2)
104 DKPRINTF(0x01,
"WI %3d %3d %3d %3d\n", x1, y1, x2, y2);
114 x1 = LCD_WIDTH - 1 - y2;
116 x2 = LCD_WIDTH - 1 - t;
122 x1 = LCD_WIDTH - 1 - x2;
123 x2 = LCD_WIDTH - 1 - t;
125 y1 = LCD_HEIGHT - 1 - y2;
126 y2 = LCD_HEIGHT - 1 - t;
133 y1 = LCD_HEIGHT - 1 - x2;
135 y2 = LCD_HEIGHT - 1 - t;
141 DKPRINTF(0x01,
"WO %3d %3d %3d %3d\n", x1, y1, x2, y2);
145 write_reg32(ILI9341_COLADDRSET, ((x1<<16) | x2));
146 write_reg32(ILI9341_PAGEADDRSET, ((y1<<16) | y2));
153 static void init_ili9341(
void)
159 write_reg8(ILI9341_SOFTRESET, 0);
161 write_reg8(ILI9341_DISPLAYOFF, 0);
163 unsigned int id4 = read_reg32(ILI9341_READID4);
166 write_reg8(ILI9341_POWERCONTROL1, 0x23);
167 write_reg8(ILI9341_POWERCONTROL2, 0x10);
168 write_reg16(ILI9341_VCOMCONTROL1, 0x2B2B);
169 write_reg8(ILI9341_VCOMCONTROL2, 0xC0);
170 write_reg8(ILI9341_MEMCONTROL, ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR);
171 write_reg8(ILI9341_PIXELFORMAT, 0x55);
172 write_reg16(ILI9341_FRAMECONTROL, 0x001B);
174 write_reg8(ILI9341_ENTRYMODE, 0x07);
177 write_reg8(ILI9341_SLEEPOUT, 0);
179 write_reg8(ILI9341_DISPLAYON, 0);
184 set_window(0, 0, lcd_width - 1, lcd_height - 1);
187 static void fill_screen(
unsigned short color)
189 set_window(0, 0, lcd_width - 1, lcd_height - 1);
194 fmem_stat = FMEM_WRITE;
200 static int ili9341_lcd_register(
struct st_device *dev,
char *param)
204 SYSERR_PRINT(
"Cannot open device \"%s\"\n", param);
215 static int ili9341_lcd_read(
struct st_device *dev,
void *data,
unsigned int size)
219 if(fmem_stat != FMEM_READ) {
222 fmem_stat = FMEM_READ;
236 static int ili9341_lcd_write(
struct st_device *dev,
const void *data,
unsigned int size)
240 if(fmem_stat != FMEM_WRITE) {
242 fmem_stat = FMEM_WRITE;
255 static int ili9341_lcd_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
257 DKPRINTF(0x01,
"LCD %08X %08X\n", com, arg);
271 DKPRINTF(0x01,
"RECT %3d %3d %3d %3d\n", rect->
left, rect->
top, rect->
right, rect->
bottom);
273 fmem_stat = FMEM_NOP;
280 set_window(0, 0, lcd_width - 1, lcd_height - 1);
281 fmem_stat = FMEM_NOP;
301 DKPRINTF(0x01,
"WRITE_WORD %04X\n", arg);
302 if(fmem_stat != FMEM_WRITE) {
304 fmem_stat = FMEM_WRITE;
313 DKPRINTF(0x01,
"WORD %04X\n", arg);
314 if(fmem_stat != FMEM_WRITE) {
316 fmem_stat = FMEM_WRITE;
339 if(fmem_stat != FMEM_WRITE) {
341 fmem_stat = FMEM_WRITE;
351 int x = ((arg >> 0) & 0xffff);
352 int y = ((arg >> 16) & 0xffff);
356 DKPRINTF(0x01,
"P %3d %3d\n", x, y);
364 dx = LCD_WIDTH - 1 - y;
369 set_window(dx, dy, lcd_width - 1, lcd_height - 1);
371 fmem_stat = FMEM_NOP;
372 write_reg16(ILI9341_MEMORYWRITE, fore_color);
379 if(fmem_stat != FMEM_WRITE) {
381 fmem_stat = FMEM_WRITE;
389 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
398 #if (LCD_ROTATION == 1) 403 .height = LCD_HEIGHT,
408 const struct st_device ili9341_lcd_device = {
410 .explan =
"ILI9341(K60) LCD",
411 .info = (
void *)&lcd_info,
412 .register_dev = ili9341_lcd_register,
413 .read = ili9341_lcd_read,
414 .write = ili9341_lcd_write,
415 .ioctl = ili9341_lcd_ioctl,
#define IOCTL(ioctl)
ioctlコマンド
#define IOCMD_VIDEO_NOLOCK_WRITE_WORD
2バイト表示データを転送する(MUTEXロックは無視)
#define IOCMD_VIO_READ_DATA8
コントローラデバイスから8ビットデータを読み出す
#define IOCMD_VIO_WRITE_REG16
コントローラデバイスのレジスタに16ビットデータを書き込む
#define IOCMD_VIO_REPEAT_BITS
指定のビットデータを描画データ0、1で描画する
#define IOCMD_VIDEO_CLEAR
全画面初期化
#define IOCMD_VIO_LOCK_BUS
バスをMUTEXロックする
#define IOCMD_VIO_WRITE_DATA16
コントローラデバイスに16ビットデータを書き込む
画像表示デバイスドライバ ioctl 用マクロ定義
#define IOCMD_VIDEO_UNLOCK_DEVICE
デバイスをMUTEXアンロックする
#define IOCMD_VIO_SET_RESET
デバイスのリセットを設定する
#define IOCMD_VIDEO_SETRECT
描画データ転送範囲を矩形で設定する
#define IOCMD_VIO_WRITE_COMMAND
コントローラデバイスにコマンドを書き込む
struct st_device * open_device(char *name)
デバイスをオープンする
#define IOCMD_VIDEO_REPEAT_DATA
指定ドット数分フォアカラーで描画する
int write_device(struct st_device *dev, const void *buf, unsigned int count)
デバイスにデータを書き込む
int read_device(struct st_device *dev, void *buf, unsigned int count)
デバイスよりデータを読み出す
#define VIDEOTYPE_CMDDRAW
コマンドによる描画(フレームバッファなし)
#define IOCMD_VIO_READ_REG32
コントローラデバイスのレジスタより32ビットデータを読み出す
#define IOCMD_VIDEO_DRAW_PIXEL
フォアカラーで1ドット描画する
#define IOCMD_VIDEO_DRAW_BITS
ビットパターンを描画する
#define IOCMD_VIO_REPEAT_DATA
描画データ0で指定ドット数描画する
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
unsigned short type
ビデオデバイスタイプ(VIDEOTYPE_*)
#define LCD_ROTATION
!!#define LCD_ROTATION 1 // 0:240x320, 1:320x240
#define IOCMD_VIO_SET_WRITEDATA0
描画データ0を設定する
#define IOCMD_VIO_NOLOCK_WRITE_DATA16
コントローラデバイスに16ビットデータを書き込む(ロックは無視)
#define IOCMD_VIO_SET_WRITEDATA1
描画データ1を設定する
#define IOCMD_VIO_SET_CS
CSを設定する
void wait_time(unsigned int time)
指定時間待つ
#define IOCMD_VIO_WRITE_DATA32
コントローラデバイスに32ビットデータを書き込む
#define VCOLORDEP_16
16ビットカラー
#define IOCMD_VIDEO_LOCK_DEVICE
デバイスをMUTEXロックする
#define IOCMD_VIDEO_RESETRECT
描画データ転送範囲を全表示範囲にする
#define IOCMD_VIDEO_SET_BACKCOLOR
バックカラーを設定する
#define IOCMD_VIO_UNLOCK_BUS
バスをMUTEXアンロックする
#define DEF_DEV_NAME_VIDEO
標準ビデオデバイス名
#define IOCMD_VIO_WRITE_REG8
コントローラデバイスのレジスタに8ビットデータを書き込む
#define IOCMD_VIDEO_WRITE_WORD
2バイト表示データを転送する(未使用)
int ioctl_device(struct st_device *dev, unsigned int com, unsigned int arg, void *param)
デバイスを制御する
char name[MAX_DEVNAMELRN]
デバイス名文字列
#define IOCMD_VIDEO_SET_FORECOLOR
フォアカラーを設定する
#define IOCMD_VIDEO_BCKLIGHT
バックライトを制御する(未使用)
#define IOCMD_VIDEO_FILL
全画面を任意の色に描画する