From 92d50d4d8368e616d4ead3153fae91cc913100a4 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Tue, 13 Feb 2018 23:35:44 -0500 Subject: [PATCH] begin display work --- include/display.h | 13 +++++ src/display.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 15 ++++- 3 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 include/display.h create mode 100644 src/display.c diff --git a/include/display.h b/include/display.h new file mode 100644 index 0000000..8210656 --- /dev/null +++ b/include/display.h @@ -0,0 +1,13 @@ +#ifndef DISPLAY_H_ +#define DISPLAY_H_ + +#include + +#define LCD_WIDTH 480 +#define LCD_HEIGHT 320 + +void dsp_write_data(uint8_t data); +void dsp_set_addr(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); +void dsp_init(void); + +#endif // DISPLAY_H_ diff --git a/src/display.c b/src/display.c new file mode 100644 index 0000000..b5c4ba0 --- /dev/null +++ b/src/display.c @@ -0,0 +1,144 @@ +#include + +#include +#include + +#include + +#define LCD_RD GPIO_PORT(A, 0) +#define LCD_WR GPIO_PORT(A, 1) +#define LCD_RS GPIO_PORT(A, 4) +#define LCD_CS GPIO_PORT(B, 0) +#define LCD_RST GPIO_PORT(C, 1) +#define LCD_D0 GPIO_PORT(A, 9) +#define LCD_D1 GPIO_PORT(C, 7) +#define LCD_D2 GPIO_PORT(A, 10) +#define LCD_D3 GPIO_PORT(B, 3) +#define LCD_D4 GPIO_PORT(B, 5) +#define LCD_D5 GPIO_PORT(B, 4) +#define LCD_D6 GPIO_PORT(B, 10) +#define LCD_D7 GPIO_PORT(A, 8) + +// bbbbbggg gggrrrrr + +void dsp_write_data(uint8_t data) +{ + gpio_dout(LCD_D0, data & 0x01); + gpio_dout(LCD_D1, data & 0x02); + gpio_dout(LCD_D2, data & 0x04); + gpio_dout(LCD_D3, data & 0x08); + gpio_dout(LCD_D4, data & 0x10); + gpio_dout(LCD_D5, data & 0x20); + gpio_dout(LCD_D6, data & 0x40); + gpio_dout(LCD_D7, data & 0x80); + gpio_dout(LCD_WR, 0); + gpio_dout(LCD_WR, 1); +} + +void dsp_write_cmd(uint8_t data) +{ + gpio_dout(LCD_RS, 0); + dsp_write_data(data); + gpio_dout(LCD_RS, 1); +} + +void dsp_set_addr(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + dsp_write_cmd(0x2A); + dsp_write_data(x1 >> 8); + dsp_write_data(x1 & 0xFF); + dsp_write_data(x2 >> 8); + dsp_write_data(x2 & 0xFF); + dsp_write_cmd(0x2B); + dsp_write_data(y1 >> 8); + dsp_write_data(y1 & 0xFF); + dsp_write_data(y2 >> 8); + dsp_write_data(y2 & 0xFF); + dsp_write_cmd(0x2C); // begin writing +} + +void dsp_init(void) +{ + gpio_mode(LCD_CS, OUTPUT); + gpio_mode(LCD_RS, OUTPUT); + gpio_mode(LCD_RD, OUTPUT); + gpio_mode(LCD_WR, OUTPUT); + gpio_mode(LCD_RST, OUTPUT); + gpio_mode(LCD_D0, OUTPUT); + gpio_mode(LCD_D1, OUTPUT); + gpio_mode(LCD_D2, OUTPUT); + gpio_mode(LCD_D3, OUTPUT); + gpio_mode(LCD_D4, OUTPUT); + gpio_mode(LCD_D5, OUTPUT); + gpio_mode(LCD_D6, OUTPUT); + gpio_mode(LCD_D7, OUTPUT); + gpio_dout(LCD_CS, 1); + gpio_dout(LCD_RS, 1); + gpio_dout(LCD_RD, 1); + gpio_dout(LCD_WR, 1); + gpio_dout(LCD_RST, 1); + gpio_dout(LCD_D0, 0); + gpio_dout(LCD_D1, 0); + gpio_dout(LCD_D2, 0); + gpio_dout(LCD_D3, 0); + gpio_dout(LCD_D4, 0); + gpio_dout(LCD_D5, 0); + gpio_dout(LCD_D6, 0); + gpio_dout(LCD_D7, 0); + + delay(50); + gpio_dout(LCD_RST, 0); + delay(15); + gpio_dout(LCD_RST, 1); + delay(15); + + dsp_write_cmd(0x01); // soft reset + delay(50); + + dsp_write_cmd(0xD0); // power setting + dsp_write_data(0x07); + dsp_write_data(0x42); + dsp_write_data(0x18); + dsp_write_cmd(0xD1); // vcom control + dsp_write_data(0x00); + dsp_write_data(0x07); + dsp_write_data(0x10); + dsp_write_cmd(0xD2); // power for normal mode + dsp_write_data(0x01); + dsp_write_data(0x02); + dsp_write_cmd(0xD3); + dsp_write_data(0x01); + dsp_write_data(0x02); + dsp_write_cmd(0xD4); + dsp_write_data(0x01); + dsp_write_data(0x02); + dsp_write_cmd(0xC0); // panel driving setting + dsp_write_data(0x10); + dsp_write_data(0x3B); + dsp_write_data(0x00); + dsp_write_data(0x02); + dsp_write_data(0x11); + dsp_write_cmd(0xC5); // frame rate/inversion ctl + dsp_write_data(0x03); + dsp_write_cmd(0x36); // rot. and stuff + dsp_write_data(0x41); + dsp_write_cmd(0x3A); // set pixel format + dsp_write_data(0x55); + dsp_write_cmd(0x11); + delay(150); + dsp_write_cmd(0x29); // set display on + delay(500); + dsp_write_cmd(0x33); // set scroll area + dsp_write_data(0x00); + dsp_write_data(0x00); + dsp_write_data(LCD_HEIGHT >> 8); + dsp_write_data((LCD_HEIGHT & 0xFF) - 1); + dsp_write_data(0x00); + dsp_write_data(0x00); + dsp_write_cmd(0x37); + dsp_write_data(0x00); + dsp_write_data(0x00); + + dsp_set_addr(0, 0, LCD_WIDTH, LCD_HEIGHT); +} + diff --git a/src/main.c b/src/main.c index 520fccd..74b5497 100644 --- a/src/main.c +++ b/src/main.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -100,9 +101,17 @@ void kmain(void) { asm("cpsie i"); - task_start(lcd_handler, 128); - delay(200); - task_start(task_interpreter, 4096); + dsp_init(); + dsp_set_addr(0, 0, LCD_WIDTH, LCD_HEIGHT); + int w = LCD_WIDTH * LCD_HEIGHT; + do { + dsp_write_data(0);//c >> 8); + dsp_write_data(0);//c & 0xFF); + } while (w--); + + //task_start(lcd_handler, 128); + //delay(200); + //task_start(task_interpreter, 4096); //char *s = initrd_getfile("test.txt");