20 #define LCD_WIDTH 480 // 幅 21 #define LCD_HEIGHT 320 // 高さ 24 static unsigned short lcd_width = LCD_WIDTH;
25 static unsigned short lcd_height = LCD_HEIGHT;
26 static unsigned short fore_color = 0;
27 static unsigned short back_color = 0;
32 static int fmem_stat = FMEM_NOP;
34 #define HX8357_NOP 0x00 35 #define HX8357_SWRESET 0x01 36 #define HX8357_RDDID 0x04 37 #define HX8357_RDDST 0x09 39 #define HX8357B_RDPOWMODE 0x0A 40 #define HX8357B_RDMADCTL 0x0B 41 #define HX8357B_RDCOLMOD 0x0C 42 #define HX8357B_RDDIM 0x0D 43 #define HX8357B_RDDSDR 0x0F 45 #define HX8357_SLPIN 0x10 46 #define HX8357_SLPOUT 0x11 47 #define HX8357B_PTLON 0x12 48 #define HX8357B_NORON 0x13 50 #define HX8357_INVOFF 0x20 51 #define HX8357_INVON 0x21 52 #define HX8357_DISPOFF 0x28 53 #define HX8357_DISPON 0x29 55 #define HX8357_CASET 0x2A 56 #define HX8357_PASET 0x2B 57 #define HX8357_RAMWR 0x2C 58 #define HX8357_RAMRD 0x2E 60 #define HX8357B_PTLAR 0x30 61 #define HX8357_TEON 0x35 62 #define HX8357_TEARLINE 0x44 63 #define HX8357_MADCTL 0x36 64 #define HX8357_COLMOD 0x3A 66 #define HX8357_SETOSC 0xB0 67 #define HX8357_SETPWR1 0xB1 68 #define HX8357B_SETDISPLAY 0xB2 69 #define HX8357_SETRGB 0xB3 70 #define HX8357D_SETCOM 0xB6 72 #define HX8357B_SETDISPMODE 0xB4 73 #define HX8357D_SETCYC 0xB4 74 #define HX8357B_SETOTP 0xB7 75 #define HX8357D_SETC 0xB9 77 #define HX8357B_SET_PANEL_DRIVING 0xC0 78 #define HX8357D_SETSTBA 0xC0 79 #define HX8357B_SETDGC 0xC1 80 #define HX8357B_SETID 0xC3 81 #define HX8357B_SETDDB 0xC4 82 #define HX8357B_SETDISPLAYFRAME 0xC5 83 #define HX8357B_GAMMASET 0xC8 84 #define HX8357B_SETCABC 0xC9 85 #define HX8357_SETPANEL 0xCC 88 #define HX8357B_SETPOWER 0xD0 89 #define HX8357B_SETVCOM 0xD1 90 #define HX8357B_SETPWRNORMAL 0xD2 92 #define HX8357B_RDID1 0xDA 93 #define HX8357B_RDID2 0xDB 94 #define HX8357B_RDID3 0xDC 95 #define HX8357B_RDID4 0xDD 97 #define HX8357D_SETGAMMA 0xE0 99 #define HX8357B_SETGAMMA 0xC8 100 #define HX8357B_SETPANELRELATED 0xE9 102 #define HX8357B_MADCTL_MY 0x80 103 #define HX8357B_MADCTL_MX 0x40 104 #define HX8357B_MADCTL_MV 0x20 105 #define HX8357B_MADCTL_ML 0x10 106 #define HX8357B_MADCTL_RGB 0x00 107 #define HX8357B_MADCTL_BGR 0x08 108 #define HX8357B_MADCTL_MH 0x04 110 static void set_cs(
unsigned int cs)
115 static void reset_hx8357d(
void)
122 static inline void write_reg8(
unsigned char addr,
unsigned char data)
125 (((
long)addr) << 16) | (
long)(data & 0xff), 0);
128 static inline void write_reg16(
unsigned char addr,
unsigned short data)
131 (((
long)addr) << 16) | (
long)(data & 0xffff), 0);
134 static inline void write_reg(
unsigned char addr,
int len,
unsigned char *data)
145 static inline void write_reg32(
unsigned char addr,
unsigned long data)
151 static inline unsigned long read_reg32(
unsigned char addr)
156 static void set_window(
int x1,
int y1,
int x2,
int y2)
158 DKPRINTF(0x01,
"WO %3d %3d %3d %3d\n", x1, y1, x2, y2);
162 write_reg32(HX8357_CASET, ((x1<<16) | x2));
163 write_reg32(HX8357_PASET, ((y1<<16) | y2));
168 static void init_hx8357d(
void)
175 static unsigned char setc[3] = { 0xFF, 0x83, 0x57 };
176 write_reg(HX8357D_SETC, 3, setc);
178 static unsigned char setrgb[4] = { 0x00, 0x00, 0x06, 0x06 };
179 write_reg(HX8357_SETRGB, 4, setrgb);
180 write_reg8(HX8357D_SETCOM, 0x25);
181 write_reg8(HX8357_SETOSC, 0x68);
182 write_reg8(HX8357_SETPANEL, 0x05);
183 static unsigned char setpwr1[6] = { 0x00, 0x15, 0x1C, 0x1C, 0x83, 0xAA };
184 write_reg(HX8357_SETPWR1, 6, setpwr1);
185 static unsigned char setstba[6] = { 0x50, 0x50, 0x01, 0x3C, 0x1E, 0x08 };
186 write_reg(HX8357D_SETSTBA, 6, setstba);
188 static unsigned char setcyc[7] = { 0x02, 0x40, 0x00, 0x2A, 0x2A, 0x0D, 0x78 };
189 write_reg(HX8357D_SETCYC, 7, setcyc);
190 write_reg8(HX8357_COLMOD, 0x55);
192 write_reg8(HX8357_MADCTL, 0x60);
193 write_reg8(HX8357_TEON, 0x00);
194 write_reg16(HX8357_TEARLINE, 0x0002);
202 set_window(0, 0, lcd_width - 1, lcd_height - 1);
205 static void fill_screen(
unsigned short color)
207 set_window(0, 0, lcd_width - 1, lcd_height - 1);
212 fmem_stat = FMEM_WRITE;
218 static int hx8357d_lcd_register(
struct st_device *dev,
char *param)
222 SYSERR_PRINT(
"Cannot open device \"%s\"\n", param);
233 static int hx8357d_lcd_read(
struct st_device *dev,
void *data,
unsigned int size)
237 if(fmem_stat != FMEM_READ) {
240 fmem_stat = FMEM_READ;
254 static int hx8357d_lcd_write(
struct st_device *dev,
const void *data,
unsigned int size)
258 if(fmem_stat != FMEM_WRITE) {
260 fmem_stat = FMEM_WRITE;
273 static int hx8357d_lcd_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
275 DKFPRINTF(0x01,
"com = %08X, arg = %08X\n", com, arg);
289 DKPRINTF(0x01,
"RECT %3d %3d %3d %3d\n", rect->
left, rect->
top, rect->
right, rect->
bottom);
291 fmem_stat = FMEM_NOP;
298 set_window(0, 0, lcd_width - 1, lcd_height - 1);
299 fmem_stat = FMEM_NOP;
319 DKPRINTF(0x01,
"WORD %04X\n", arg);
320 if(fmem_stat != FMEM_WRITE) {
322 fmem_stat = FMEM_WRITE;
331 DKPRINTF(0x01,
"WORD %04X\n", arg);
332 if(fmem_stat != FMEM_WRITE) {
334 fmem_stat = FMEM_WRITE;
357 if(fmem_stat != FMEM_WRITE) {
359 fmem_stat = FMEM_WRITE;
369 int x = ((arg >> 0) & 0xffff);
370 int y = ((arg >> 16) & 0xffff);
374 DKPRINTF(0x01,
"P %3d %3d\n", x, y);
379 set_window(dx, dy, lcd_width - 1, lcd_height - 1);
381 fmem_stat = FMEM_NOP;
382 write_reg16(HX8357_RAMWR, fore_color);
389 if(fmem_stat != FMEM_WRITE) {
391 fmem_stat = FMEM_WRITE;
399 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
406 static int hx8357d_lcd_suspend(
struct st_device *dev)
411 static int hx8357d_lcd_resume(
struct st_device *dev)
419 .height = LCD_HEIGHT,
423 const struct st_device hx8357d_lcd_device = {
425 .explan =
"HX8357D(MAR3520) LCD",
426 .info = (
void *)&lcd_info,
427 .register_dev = hx8357d_lcd_register,
428 .read = hx8357d_lcd_read,
429 .write = hx8357d_lcd_write,
430 .ioctl = hx8357d_lcd_ioctl,
431 .
suspend = hx8357d_lcd_suspend,
432 .
resume = hx8357d_lcd_resume,
#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
ビットパターンを描画する
int suspend(void)
全デバイスを休止状態にする
#define IOCMD_VIO_REPEAT_DATA
描画データ0で指定ドット数描画する
unsigned short type
ビデオデバイスタイプ(VIDEOTYPE_*)
#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 IOCMD_VIO_WRITE_DATA8
コントローラデバイスに8ビットデータを書き込む
int resume(void)
全デバイスを活性化する
#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
全画面を任意の色に描画する