X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Flcd_rit128x96.c;h=f917cbb71b1ddf6bde38c264ea1c639e2a35f4da;hb=e8b0472be10fba4ca6baa62d8d483db90e28c06e;hp=216237d82aac25ce48e0755e9174d102c27d7478;hpb=3b1451f6e3161b0f1b16e9be49dd46649b03a9d9;p=bertos.git diff --git a/bertos/drv/lcd_rit128x96.c b/bertos/drv/lcd_rit128x96.c index 216237d8..f917cbb7 100644 --- a/bertos/drv/lcd_rit128x96.c +++ b/bertos/drv/lcd_rit128x96.c @@ -35,10 +35,13 @@ * \author Andrea Righi */ +#include "lcd_rit128x96.h" + +#include "hw/hw_rit128x96.h" + #include #include -#include "lcd_rit128x96.h" /* * Hard-coded command initialization sequence. @@ -106,15 +109,11 @@ static const uint8_t horizontal_inc[] = static void lcd_dataWrite(const uint8_t *buf, size_t count) { while (count--) - { LCD_WRITE(*buf++); - /* Dummy read to drain the FIFO */ - (void)LCD_READ(); - } } /* Turn on the OLED display */ -void rit128x96_lcd_on(void) +void rit128x96_on(void) { unsigned int i; @@ -125,36 +124,60 @@ void rit128x96_lcd_on(void) } /* Turn off the OLED display */ -void rit128x96_lcd_off(void) +void rit128x96_off(void) { LCD_SET_COMMAND(); lcd_dataWrite(exit_cmd, sizeof(exit_cmd)); } -/* Refresh a bitmap on screen */ -void rit128x96_lcd_blitBitmap(const Bitmap *bm) +static void lcd_start_blit(uint8_t x, uint8_t y, uint8_t width, uint8_t height) { - uint8_t lcd_row[bm->width / 2]; - uint8_t buffer[8]; - uint8_t mask; - int i, l; + uint8_t buffer[3]; - ASSERT(bm->width == LCD_WIDTH && bm->height == LCD_HEIGHT); + ASSERT((x + width) <= LCD_WIDTH); + ASSERT((y + height) <= LCD_HEIGHT); /* Enter command mode */ LCD_SET_COMMAND(); buffer[0] = 0x15; - buffer[1] = 0; - buffer[2] = (bm->width - 2) / 2; + buffer[1] = x / 2; + buffer[2] = (x + width - 2) / 2; lcd_dataWrite(buffer, 3); buffer[0] = 0x75; - buffer[1] = 0; - buffer[2] = bm->height - 1; + buffer[1] = y; + buffer[2] = y + height - 1; lcd_dataWrite(buffer, 3); lcd_dataWrite((const uint8_t *)&horizontal_inc, sizeof(horizontal_inc)); +} + +/* Refresh a raw image on screen */ +void rit128x96_blitRaw(const uint8_t *data, + uint8_t x, uint8_t y, uint8_t width, uint8_t height) +{ + lcd_start_blit(x, y, width, height); + /* + * Enter data mode and send the encoded image data to the OLED display, + * over the SSI bus. + */ + LCD_SET_DATA(); + while (height--) + { + /* Write an entire row at once */ + lcd_dataWrite(data, width / 2); + data += width / 2; + } +} + +/* Refresh a bitmap on screen */ +void rit128x96_blitBitmap(const Bitmap *bm) +{ + uint8_t lcd_row[bm->width / 2]; + uint8_t mask; + int i, l; + lcd_start_blit(0, 0, bm->width, bm->height); /* * Enter data mode and send the encoded image data to the OLED display, * over the SSI bus. @@ -178,11 +201,11 @@ void rit128x96_lcd_blitBitmap(const Bitmap *bm) } /* Initialize the OLED display */ -void rit128x96_lcd_init(void) +void rit128x96_init(void) { /* Initialize the communication bus */ - lcd_bus_init(); + lcd_rit128x96_hw_bus_init(); /* Turn on the OLED display */ - rit128x96_lcd_on(); + rit128x96_on(); }