diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 2baf543f1333e10031e9d830d20a0a81050ef238..cf4e1bc945d74afa1b2208c24c51a890fc988ba0 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -48,7 +48,7 @@ typedef unsigned int size_t; #define API_DISP_RECT 0x16 #define API_DISP_CIRC 0x17 #define API_DISP_PIXEL 0x18 -#define API_DISP_UPDATE_FB 0x19 +#define API_DISP_FRAMEBUFFER 0x19 #define API_FILE_OPEN 0x30 #define API_FILE_CLOSE 0x31 @@ -291,12 +291,10 @@ API(API_DISP_CLOSE, int epic_disp_close()); API(API_DISP_UPDATE, int epic_disp_update()); /** - * HACKHACKACHK + * Returns the back framebuffer (the display buffer that's currently inactive + * that will be shown after the next call to ``epic_disp_update``. */ -API(API_DISP_UPDATE_FB, - int epic_disp_update_fb( - void *framebuffer) - ); +API(API_DISP_FRAMEBUFFER, uint16_t *epic_disp_framebuffer()); /** * Prints a string into the display framebuffer diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index 5228453f1097ca7848e16b77fb45caaff6a6cd12..2cabe397901796cdb99645be915509892d353173 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -125,16 +125,9 @@ int epic_disp_update() } } -int epic_disp_update_fb( - void *framebuffer -) { - int cl = check_lock(); - if (cl < 0) { - return cl; - } else { - LCD_Set((uint8_t *)framebuffer, 160*80*2); - return 0; - } +uint16_t *epic_disp_framebuffer() +{ + return (uint16_t*) LCD_Framebuffer(); } int epic_disp_open() diff --git a/lib/card10/display.c b/lib/card10/display.c index e1d66276646f480cde27c063f162d7bd85dd6138..9db6e29e0bc8c86c4f3a1e05347bed18f4c8aedc 100644 --- a/lib/card10/display.c +++ b/lib/card10/display.c @@ -1,5 +1,6 @@ #include "LCD/LCD_Driver.h" #include "GUI_DEV/GUI_Paint.h" +#include "GUI_DEV/DEV_Config.h" #include "gpio.h" #include "tmr.h" @@ -81,6 +82,8 @@ void display_set_reset_pin(uint8_t state) void display_init(void) { + lcd_irq_init(); + if (!portexpander_detected()) { // Open-drain MAX77650_setDRV(false); diff --git a/lib/gfx/GUI_DEV/DEV_Config.c b/lib/gfx/GUI_DEV/DEV_Config.c index 5c1e4b22bb971126cc8ab0f6ce3599ab828c4a3f..7a09c400cd166fb976751ba43c81217552132407 100644 --- a/lib/gfx/GUI_DEV/DEV_Config.c +++ b/lib/gfx/GUI_DEV/DEV_Config.c @@ -39,7 +39,7 @@ static spi_req_t req = {.rx_data = NULL, .bits=8, .width = SPI17Y_WIDTH_1, .ssel = 0, .deass = 1, .ssel_pol = SPI17Y_POL_LOW, .tx_num = 0, .rx_num = 0}; /********************************************************************************/ -void lcd_write(uint8_t *data, int size, lcd_write_cb_t wr_callback) +void lcd_write_async(uint8_t *data, int size, lcd_write_cb_t wr_callback) { req.tx_data = data; req.len = size; @@ -47,3 +47,19 @@ void lcd_write(uint8_t *data, int size, lcd_write_cb_t wr_callback) SPI_MasterTransAsync(SPI, &req); } +void lcd_write(uint8_t *data, int size) +{ + req.tx_data = data; + req.len = size; + SPI_MasterTrans(SPI, &req); +} + +void lcd_irq_init(void) +{ + NVIC_EnableIRQ(SPI2_IRQn); +} + +void SPI2_IRQHandler(void) +{ + SPI_Handler(SPI); +} diff --git a/lib/gfx/GUI_DEV/DEV_Config.h b/lib/gfx/GUI_DEV/DEV_Config.h index 5e4ed5f7c4d0001852bc0a64d5c69745b7b71e9c..7308bf02b353322fc972888bcad850c6e4cbca26 100644 --- a/lib/gfx/GUI_DEV/DEV_Config.h +++ b/lib/gfx/GUI_DEV/DEV_Config.h @@ -59,9 +59,11 @@ extern const gpio_cfg_t DEV_DC_PIN; /** * SPI **/ -void lcd_write(uint8_t* data, int size, lcd_write_cb_t wr_callback); +void lcd_write(uint8_t* data, int size); +void lcd_write_async(uint8_t* data, int size, lcd_write_cb_t wr_callback); void display_set_reset_pin(uint8_t state); -#define DEV_SPI_WRITE(_dat) lcd_write(&_dat, 1, NULL) +void lcd_irq_init(void); +#define DEV_SPI_WRITE(_dat) lcd_write(&_dat, 1) #define DEV_RESET_LOW() display_set_reset_pin(0) #define DEV_RESET_HIGH() display_set_reset_pin(1) /** diff --git a/lib/gfx/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c index a75582d346e48e5e0eb3d41279fa2f26601fb873..a6c50e5a5e19639f1dc9721c37a3983bcf170057 100644 --- a/lib/gfx/LCD/LCD_Driver.c +++ b/lib/gfx/LCD/LCD_Driver.c @@ -29,11 +29,6 @@ ******************************************************************************/ #include "LCD_Driver.h" -typedef union { - uint8_t fb[LCD_HEIGHT][LCD_WIDTH][2]; - uint8_t raw[LCD_HEIGHT * LCD_WIDTH * 2]; -} frame_t; - static frame_t frames[2]; static uint8_t active_frame; static uint8_t update_in_progress; @@ -328,7 +323,7 @@ static void LCD_Set(uint8_t *data, int len) LCD_SetCursor(0, 0, 160 - 1, 80 - 1); DEV_Digital_Write(DEV_DC_PIN, 1); update_in_progress = 1; - lcd_write(data, len, update_cb); + lcd_write_async(data, len, update_cb); } int LCD_Update(void) @@ -341,3 +336,6 @@ int LCD_Update(void) return 0; } +frame_t *LCD_Framebuffer(void) { + return frame(); +} diff --git a/lib/gfx/LCD/LCD_Driver.h b/lib/gfx/LCD/LCD_Driver.h index 6e4f3ed947f57c1ccbd4d8221b4c722947e50573..aff3b575291b6e5114da8317aedf8be764c96276 100644 --- a/lib/gfx/LCD/LCD_Driver.h +++ b/lib/gfx/LCD/LCD_Driver.h @@ -35,6 +35,10 @@ #define LCD_WIDTH 160 //LCD width #define LCD_HEIGHT 80 //LCD height +typedef union { + uint8_t fb[LCD_HEIGHT][LCD_WIDTH][2]; + uint8_t raw[LCD_HEIGHT * LCD_WIDTH * 2]; +} frame_t; void LCD_WriteData_Byte(UBYTE da); void LCD_WriteData_Word(UWORD da); @@ -52,5 +56,6 @@ void LCD_ClearWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD U * 1 - an update was already in progress */ int LCD_Update(void); +frame_t *LCD_Framebuffer(void); #endif