diff options
Diffstat (limited to 'src/tft.c')
-rw-r--r-- | src/tft.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/tft.c b/src/tft.c new file mode 100644 index 0000000..d0c7d8f --- /dev/null +++ b/src/tft.c @@ -0,0 +1,138 @@ +#include <tft.h> +#include <hardware.h> +#include <zeta.h> + +void +_delay_ms(uint8_t ms); + +/* + * Driver for the ILI9341 TFT Chip + */ + +static inline void +tft_soft_reset(void) +{ + tft_ctrl = SWRESET; +} + +static inline void +tft_enable_ext_cmd(void) +{ + tft_ctrl = SETEXTC; + tft_data = 0xFF; + tft_data = 0x83; + tft_data = 0x57; +} + +static inline void +tft_memory_access_ctrl(uint8_t bits) +{ + tft_ctrl = MADCTL; + tft_data = bits; +} + +static inline void +tft_sleep_out(void) { + tft_ctrl = SLPOUT; +} + +static inline void +tft_display_on(void) +{ + tft_ctrl = DISPON; +} + +static inline void +tft_pixel_format(uint8_t dbi, uint8_t dpi) +{ + tft_ctrl = COLMOD; + tft_data = (dpi << 4) | dbi; +} + +static inline void +tft_set_rgb_interface(void) +{ + tft_ctrl = SETRGB; + tft_data = 0x00; + tft_data = 0x00; + tft_data = 0x06; + tft_data = 0x06; +} + +static inline void +tft_set_col_addr(uint16_t start, uint16_t end) +{ + tft_ctrl = CASET; + tft_data = start >> 8; + tft_data = start & 0xFF; + tft_data = end >> 8; + tft_data = end & 0xFF; +} + +static inline void +tft_set_page_addr(uint16_t start, uint16_t end) +{ + tft_ctrl = PASET; + tft_data = start >> 8; + tft_data = start & 0xFF; + tft_data = end >> 8; + tft_data = end & 0xFF; +} + +void +tft_set_area(unsigned int x, unsigned int y, unsigned int w, unsigned int h) +{ + tft_set_col_addr(x, x + w - 1); + tft_set_page_addr(y, y + h - 1); +} + +enum memory_access { + // MY MX MV ML | BGR SS X X + MV = 0x20, // 1: landscape 0 <= x < 480; 0 <= y < 320 + MX = 0x40, // MV = 0: Invert X; MV = 1: Invert Y + MY = 0x80, // MV = 0: Invert Y; MV = 1: Invert X + ML = 0x10 +}; + +void +clear_screen(void) +{ + DI; + tft_set_col_addr(0, TFT_WIDTH - 1); + tft_set_page_addr(0, TFT_HEIGHT - 1); + + tft_ctrl = RAMWR; + for (u16 i = 0; i < TFT_HEIGHT; ++i) { + for (u16 j = 0; j < TFT_WIDTH; ++j) { + tft_data = 0x00; + tft_data = 0x00; + tft_data = 0x00; + } + } + EI; +} + +void +tft_init(void) +{ + _delay_ms(200); + + tft_soft_reset(); + tft_enable_ext_cmd(); + + _delay_ms(250); + + tft_set_rgb_interface(); + + tft_pixel_format(BIT18, BIT18); + + tft_memory_access_ctrl(MV | 0x0C); + tft_sleep_out(); + + _delay_ms(150); + + tft_display_on(); + + _delay_ms(50); + clear_screen(); +} |