FreeCalypso > hg > fc-selenite
diff src/cs/drivers/drv_app/r2d/lcds/c139/r2d_task_i.c @ 0:b6a5e36de839
src/cs: initial import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 04:39:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/drivers/drv_app/r2d/lcds/c139/r2d_task_i.c Sun Jul 15 04:39:26 2018 +0000 @@ -0,0 +1,80 @@ +#include "r2d/lcds/c139/colors.h" + +void c139_uwire_xmit(UINT16 cmd) +{ + * (volatile UINT16 *) TDR = cmd << 7; + * (volatile UINT16 *) CSR |= NB_BITS_WR_9 + CS_CMD + START ; // transmit command data + while (((* (volatile UINT16 *) CSR) & CSRB) != 0 ); // wait for end of WRITE + * (volatile UINT16 *) CSR &= ~CS_CMD; // clears Chip Select +} + +void c139_lcd_ctrl_cmd(UINT8 cmd, UINT8 param) +{ + c139_uwire_xmit(cmd); + c139_uwire_xmit(param | 0x100); +} + +void c139_set_lcd_addr_region(UINT8 xstart, UINT8 xend, + UINT8 ystart, UINT8 yend) +{ + c139_lcd_ctrl_cmd(0x10, xstart); + c139_lcd_ctrl_cmd(0x11, ystart); + c139_lcd_ctrl_cmd(0x12, xend); + c139_lcd_ctrl_cmd(0x13, yend); + c139_lcd_ctrl_cmd(0x14, xstart); + c139_lcd_ctrl_cmd(0x15, ystart); +} + +void c139_lcd_send_pix(UINT16 pixval) +{ + c139_uwire_xmit((pixval >> 8) | 0x100); + c139_uwire_xmit((pixval & 0xFF) | 0x100); +} + +void r2d_lcd_power_on(void) +{ +} + +void r2d_lcd_power_off(void) +{ +} + +static int get_pix_from_sw_fb(UINT32 *fb, UINT16 x, UINT16 y) +{ + UINT32 *p, mask; + UINT16 yword, ybit; + + /* mirroring */ + x = R2D_WIDTH - 1 - x; + y = R2D_HEIGHT - 1 - y; + yword = y >> 5; + ybit = y & 31; + p = fb + x * R2D_MWHEIGHT + yword; + mask = 1 << ybit; + if (*p & mask) + return(1); + else + return(0); +} + +void r2d_refresh(void) +{ + UINT16 x, y; + UINT32 *fb; + + fb = r2d_g_framebuffer->p_memory_words; + + /* set the LCD up to refresh the 84x48 area */ + c139_set_lcd_addr_region(6, 89, 8, 55); + /* send the pixels */ + for (y = 0; y < R2D_HEIGHT; y++) { + for (x = 0; x < R2D_WIDTH; x++) { + if (get_pix_from_sw_fb(fb, x, y)) + c139_lcd_send_pix(LCD16_COLOR_BLACK); + else + c139_lcd_send_pix(LCD16_COLOR_WHITE); + } + } + + r2d_reinit_update_region(); +}