Ver código fonte

Add caching for multi-byte transfers (#1247)

* add caching for multi-byte transfers
handle HSPI /CS in examples

* push similar code snippets into macro
Arnim Läuger 8 anos atrás
pai
commit
ae873b70c6

+ 21 - 16
app/modules/ucg.c

@@ -703,6 +703,23 @@ static int lucg_undoScale( lua_State *L )
 }
 
 
+spi_data_type cache;
+uint8_t cached;
+
+#define CACHED_TRANSFER(dat, num) cache = cached = 0;  \
+    while( arg > 0 ) {                                \
+        if (cached == 4) {                                              \
+            platform_spi_transaction( 1, 0, 0, 32, cache, 0, 0, 0 );    \
+            cache = cached = 0;                                         \
+        }                                                               \
+        cache = (cache << num*8) | dat;                                 \
+        cached += num;                                                  \
+        arg--;                                                          \
+    }                                                                   \
+    if (cached > 0) {                                                   \
+        platform_spi_transaction( 1, 0, 0, cached * 8, cache, 0, 0, 0 ); \
+    }
+
 
 static int16_t ucg_com_esp8266_hw_spi(ucg_t *ucg, int16_t msg, uint16_t arg, uint8_t *data)
 {
@@ -754,34 +771,22 @@ static int16_t ucg_com_esp8266_hw_spi(ucg_t *ucg, int16_t msg, uint16_t arg, uin
         break;
 
     case UCG_COM_MSG_REPEAT_1_BYTE:
-        while( arg > 0 ) {
-            platform_spi_send( 1, 8, data[0] );
-            arg--;
-        }
+        CACHED_TRANSFER(data[0], 1);
         break;
 
     case UCG_COM_MSG_REPEAT_2_BYTES:
-        while( arg > 0 ) {
-            platform_spi_send( 1, 8, data[0] );
-            platform_spi_send( 1, 8, data[1] );
-            arg--;
-        }
+        CACHED_TRANSFER((data[0] << 8) | data[1], 2);
         break;
 
     case UCG_COM_MSG_REPEAT_3_BYTES:
         while( arg > 0 ) {
-            platform_spi_send( 1, 8, data[0] );
-            platform_spi_send( 1, 8, data[1] );
-            platform_spi_send( 1, 8, data[2] );
+            platform_spi_transaction( 1, 0, 0, 24, (data[0] << 16) | (data[1] << 8) | data[2], 0, 0, 0 );
             arg--;
         }
         break;
 
     case UCG_COM_MSG_SEND_STR:
-        while( arg > 0 ) {
-            platform_spi_send( 1, 8, *data++ );
-            arg--;
-        }
+        CACHED_TRANSFER(*data++, 1);
         break;
 
     case UCG_COM_MSG_SEND_CD_DATA_SEQUENCE:

+ 3 - 0
lua_examples/ucglib/GraphicsTest.lua

@@ -3,12 +3,15 @@ function init_spi_display()
     -- Hardware SPI CLK  = GPIO14
     -- Hardware SPI MOSI = GPIO13
     -- Hardware SPI MISO = GPIO12 (not used)
+    -- Hardware SPI /CS  = GPIO15 (not used)
     -- CS, D/C, and RES can be assigned freely to available GPIOs
     local cs  = 8 -- GPIO15, pull-down 10k to GND
     local dc  = 4 -- GPIO2
     local res = 0 -- GPIO16
 
     spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
+    -- we won't be using the HSPI /CS line, so disable it again
+    gpio.mode(8, gpio.INPUT, gpio.PULLUP)
 
     -- initialize the matching driver for your display
     -- see app/include/ucg_config.h

+ 8 - 1
lua_examples/ucglib/HelloWorld.lua

@@ -3,13 +3,20 @@ function init_spi_display()
    -- Hardware SPI CLK  = GPIO14
    -- Hardware SPI MOSI = GPIO13
    -- Hardware SPI MISO = GPIO12 (not used)
+   -- Hardware SPI /CS  = GPIO15 (not used)
    -- CS, D/C, and RES can be assigned freely to available GPIOs
    local cs  = 8 -- GPIO15, pull-down 10k to GND
    local dc  = 4 -- GPIO2
    local res = 0 -- GPIO16
 
    spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
-   disp = ucg.ili9341_18x240x320_hw_spi(cs, dc, res)
+   -- we won't be using the HSPI /CS line, so disable it again
+   gpio.mode(8, gpio.INPUT, gpio.PULLUP)
+
+   -- initialize the matching driver for your display
+   -- see app/include/ucg_config.h
+   --disp = ucg.ili9341_18x240x320_hw_spi(cs, dc, res)
+   disp = ucg.st7735_18x128x160_hw_spi(cs, dc, res)
 end
 
 

+ 7 - 0
lua_examples/ucglib/UcgLogo.lua

@@ -3,12 +3,19 @@ function init_spi_display()
     -- Hardware SPI CLK  = GPIO14
     -- Hardware SPI MOSI = GPIO13
     -- Hardware SPI MISO = GPIO12 (not used)
+    -- Hardware SPI /CS  = GPIO15 (not used)
     -- CS, D/C, and RES can be assigned freely to available GPIOs
     local cs  = 8 -- GPIO15, pull-down 10k to GND
     local dc  = 4 -- GPIO2
     local res = 0 -- GPIO16
 
     spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
+    -- we won't be using the HSPI /CS line, so disable it again
+    gpio.mode(8, gpio.INPUT, gpio.PULLUP)
+
+    -- initialize the matching driver for your display
+    -- see app/include/ucg_config.h
+    --disp = ucg.ili9341_18x240x320_hw_spi(cs, dc, res)
     disp = ucg.st7735_18x128x160_hw_spi(cs, dc, res)
 end