From 1c4ad79c00b1a7b46f65025bf92805d40cbd5185 Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Fri, 9 Mar 2018 12:40:12 +0800 Subject: [PATCH] Examples/spi_master: spiffier graphics --- .../spi_master/main/Kconfig.projbuild | 9 ++ .../peripherals/spi_master/main/component.mk | 3 + .../spi_master/main/decode_image.c | 153 ++++++++++++++++++ .../spi_master/main/decode_image.h | 14 ++ .../peripherals/spi_master/main/image.jpg | Bin 0 -> 67106 bytes .../spi_master/main/pretty_effect.c | 61 +++++++ .../spi_master/main/pretty_effect.h | 22 +++ .../spi_master/main/spi_master_example_main.c | 69 ++++---- 8 files changed, 303 insertions(+), 28 deletions(-) create mode 100644 examples/peripherals/spi_master/main/decode_image.c create mode 100644 examples/peripherals/spi_master/main/decode_image.h create mode 100644 examples/peripherals/spi_master/main/image.jpg create mode 100644 examples/peripherals/spi_master/main/pretty_effect.c create mode 100644 examples/peripherals/spi_master/main/pretty_effect.h diff --git a/examples/peripherals/spi_master/main/Kconfig.projbuild b/examples/peripherals/spi_master/main/Kconfig.projbuild index 8424d3f315..2a278f4334 100644 --- a/examples/peripherals/spi_master/main/Kconfig.projbuild +++ b/examples/peripherals/spi_master/main/Kconfig.projbuild @@ -14,4 +14,13 @@ config LCD_TYPE_ILI9341 bool "ILI9341 (WROVER Kit v1 or DevKitJ v1)" endchoice +config LCD_OVERCLOCK + bool + prompt "Run LCD at higher clock speed than allowed" + default "n" + help + The ILI9341 and ST7789 specify that the maximum clock speed for the SPI interface is 10MHz. However, + in practice the driver chips work fine with a higher clock rate, and using that gives a better framerate. + Select this to try using the out-of-spec clock rate. + endmenu diff --git a/examples/peripherals/spi_master/main/component.mk b/examples/peripherals/spi_master/main/component.mk index 4d3b30caf3..4ffe9e8ca2 100644 --- a/examples/peripherals/spi_master/main/component.mk +++ b/examples/peripherals/spi_master/main/component.mk @@ -3,3 +3,6 @@ # # (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + +#Compile image file into the resulting firmware binary +COMPONENT_EMBED_FILES := image.jpg diff --git a/examples/peripherals/spi_master/main/decode_image.c b/examples/peripherals/spi_master/main/decode_image.c new file mode 100644 index 0000000000..1e3c18c8c9 --- /dev/null +++ b/examples/peripherals/spi_master/main/decode_image.c @@ -0,0 +1,153 @@ +/* SPI Master example: jpeg decoder. + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + + +/* +The image used for the effect on the LCD in the SPI master example is stored in flash +as a jpeg file. This file contains the decode_image routine, which uses the tiny JPEG +decoder library in ROM to decode this JPEG into a format that can be sent to the display. + +Keep in mind that the decoder library cannot handle progressive files (will give +``Image decoder: jd_prepare failed (8)`` as an error) so make sure to save in the correct +format if you want to use a different image file. +*/ + + +#include "decode_image.h" +#include "rom/tjpgd.h" +#include "esp_log.h" +#include + +//Reference the binary-included jpeg file +extern const uint8_t image_jpg_start[] asm("_binary_image_jpg_start"); +extern const uint8_t image_jpg_end[] asm("_binary_image_jpg_end"); +//Define the height and width of the jpeg file. Make sure this matches the actual jpeg +//dimensions. +#define IMAGE_W 336 +#define IMAGE_H 256 + + +const char *TAG="ImageDec"; + + +//Data that is passed from the decoder function to the infunc/outfunc functions. +typedef struct { + const unsigned char *inData; //Pointer to jpeg data + int inPos; //Current position in jpeg data + uint16_t **outData; //Array of IMAGE_H pointers to arrays of IMAGE_W 16-bit pixel values + int outW; //Width of the resulting file + int outH; //Height of the resulting file +} JpegDev; + + +//Input function for jpeg decoder. Just returns bytes from the inData field of the JpegDev structure. +static UINT infunc(JDEC *decoder, BYTE *buf, UINT len) +{ + //Read bytes from input file + JpegDev *jd=(JpegDev*)decoder->device; + if (buf!=NULL) memcpy(buf, jd->inData+jd->inPos, len); + jd->inPos+=len; + return len; +} + +//Output function. Re-encodes the RGB888 data from the decoder as big-endian RGB565 and +//stores it in the outData array of the JpegDev structure. +static UINT outfunc(JDEC *decoder, void *bitmap, JRECT *rect) +{ + JpegDev *jd=(JpegDev*)decoder->device; + uint8_t *in=(uint8_t*)bitmap; + for (int y=rect->top; y<=rect->bottom; y++) { + for (int x=rect->left; x<=rect->right; x++) { + //We need to convert the 3 bytes in `in` to a rgb565 value. + uint16_t v=0; + v|=((in[0]>>3)<<11); + v|=((in[1]>>2)<<5); + v|=((in[2]>>3)<<0); + //The LCD wants the 16-bit value in big-endian, so swap bytes + v=(v>>8)|(v<<8); + jd->outData[y][x]=v; + in+=3; + } + } + return 1; +} + +//Size of the work space for the jpeg decoder. +#define WORKSZ 3100 + +//Decode the embedded image into pixel lines that can be used with the rest of the logic. +esp_err_t decode_image(uint16_t ***pixels) +{ + char *work=NULL; + int r; + JDEC decoder; + JpegDev jd; + *pixels=NULL; + esp_err_t ret=ESP_OK; + + + //Alocate pixel memory. Each line is an array of IMAGE_W 16-bit pixels; the `*pixels` array itself contains pointers to these lines. + *pixels=calloc(IMAGE_H, sizeof(uint16_t*)); + if (*pixels==NULL) { + ESP_LOGE(TAG, "Error allocating memory for lines"); + ret=ESP_ERR_NO_MEM; + goto err; + } + for (int i=0; i +#include "esp_err.h" + +/** + * @brief Decode the jpeg ``image.jpg`` embedded into the program file into pixel data. + * + * @param pixels A pointer to a pointer for an array of rows, which themselves are an array of pixels. + * Effectively, you can get the pixel data by doing ``decode_image(&myPixels); pixelval=myPixels[ypos][xpos];`` + * @return - ESP_ERR_NOT_SUPPORTED if image is malformed or a progressive jpeg file + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on succesful decode + */ +esp_err_t decode_image(uint16_t ***pixels); \ No newline at end of file diff --git a/examples/peripherals/spi_master/main/image.jpg b/examples/peripherals/spi_master/main/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..803ca2cdca464f387a97af7042f9f4ed040a7f18 GIT binary patch literal 67106 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 +#include "pretty_effect.h" +#include "decode_image.h" + +uint16_t **pixels; + +//Grab a rgb16 pixel from the esp32_tiles image +static inline uint16_t get_bgnd_pixel(int x, int y) +{ + //Image has an 8x8 pixel margin, so we can also resolve e.g. [-3, 243] + x+=8; + y+=8; + return pixels[y][x]; +} + + +//This variable is used to detect the next frame. +static int prev_frame=-1; + +//Instead of calculating the offsets for each pixel we grab, we pre-calculate the valueswhenever a frame changes, then re-use +//these as we go through all the pixels in the frame. This is much, much faster. +static int8_t xofs[320], yofs[240]; +static int8_t xcomp[320], ycomp[240]; + +//Calculate the pixel data for a set of lines (with implied line size of 320). Pixels go in dest, line is the Y-coordinate of the +//first line to be calculated, linect is the amount of lines to calculate. Frame increases by one every time the entire image +//is displayed; this is used to go to the next frame of animation. +void pretty_effect_calc_lines(uint16_t *dest, int line, int frame, int linect) +{ + if (frame!=prev_frame) { + //We need to calculate a new set of offset coefficients. Take some random sines as offsets to make everything + //look pretty and fluid-y. + for (int x=0; x<320; x++) xofs[x]=sin(frame*0.15+x*0.06)*4; + for (int y=0; y<240; y++) yofs[y]=sin(frame*0.1+y*0.05)*4; + for (int x=0; x<320; x++) xcomp[x]=sin(frame*0.11+x*0.12)*4; + for (int y=0; y<240; y++) ycomp[y]=sin(frame*0.07+y*0.15)*4; + prev_frame=frame; + } + for (int y=line; y +#include "esp_err.h" + + +/** + * @brief Calculate the effect for a bunch of lines. + * + * @param dest Destination for the pixels. Assumed to be LINECT * 320 16-bit pixel values. + * @param line Starting line of the chunk of lines. + * @param frame Current frame, used for animation + * @param linect Amount of lines to calculate + */ +void pretty_effect_calc_lines(uint16_t *dest, int line, int frame, int linect); + + +/** + * @brief Initialize the effect + * + * @return ESP_OK on success, an error from the jpeg decoder otherwise. + */ +esp_err_t pretty_effect_init(); diff --git a/examples/peripherals/spi_master/main/spi_master_example_main.c b/examples/peripherals/spi_master/main/spi_master_example_main.c index c6f472d26f..77bfe5fa97 100644 --- a/examples/peripherals/spi_master/main/spi_master_example_main.c +++ b/examples/peripherals/spi_master/main/spi_master_example_main.c @@ -16,14 +16,12 @@ #include "soc/gpio_struct.h" #include "driver/gpio.h" +#include "pretty_effect.h" /* This code displays some fancy graphics on the 320x240 LCD on an ESP-WROVER_KIT board. - It is not very fast, even when the SPI transfer itself happens at 8MHz and with DMA, because - the rest of the code is not very optimized. Especially calculating the image line-by-line - is inefficient; it would be quicker to send an entire screenful at once. This example does, however, - demonstrate the use of both spi_device_transmit as well as spi_device_queue_trans/spi_device_get_trans_result - as well as pre-transmit callbacks. + This example demonstrates the use of both spi_device_transmit as well as + spi_device_queue_trans/spi_device_get_trans_result and pre-transmit callbacks. Some info about the ILI9341/ST7789V: It has an C/D line, which is connected to a GPIO here. It expects this line to be low for a command and high for data. We use a pre-transmit callback here to control that @@ -40,6 +38,9 @@ #define PIN_NUM_RST 18 #define PIN_NUM_BCKL 5 +//To speed up transfers, every SPI transfer sends a bunch of lines. This define specifies how many. More means more memory use, +//but less overhead for setting up / finishing transfers. Make sure 240 is dividable by this. +#define PARALLEL_LINES 16 /* The LCD needs a bunch of command/argument values to be initialized. They are stored in this struct. @@ -182,11 +183,11 @@ void lcd_init(spi_device_handle_t spi) if ( lcd_id == 0 ) { //zero, ili lcd_detected_type = LCD_TYPE_ILI; - printf("ILI9341 detected...\n"); + printf("ILI9341 detected.\n"); } else { // none-zero, ST lcd_detected_type = LCD_TYPE_ST; - printf("ST7789V detected...\n"); + printf("ST7789V detected.\n"); } #ifdef CONFIG_LCD_TYPE_AUTO @@ -197,12 +198,12 @@ void lcd_init(spi_device_handle_t spi) #elif defined( CONFIG_LCD_TYPE_ILI9341 ) printf("kconfig: force CONFIG_LCD_TYPE_ILI9341.\n"); lcd_type = LCD_TYPE_ILI; -#endif +#endif if ( lcd_type == LCD_TYPE_ST ) { printf("LCD ST7789V initialization.\n"); lcd_init_cmds = st_init_cmds; } else { - printf("LCD ILI9341 initialization.\n"); + printf("LCD ILI9341 initialization.\n"); lcd_init_cmds = ili_init_cmds; } @@ -221,11 +222,11 @@ void lcd_init(spi_device_handle_t spi) } -//To send a line we have to send a command, 2 data bytes, another command, 2 more data bytes and another command +//To send a set of lines we have to send a command, 2 data bytes, another command, 2 more data bytes and another command //before sending the line data itself; a total of 6 transactions. (We can't put all of this in just one transaction //because the D/C line needs to be toggled in the middle.) //This routine queues these commands up so they get sent as quickly as possible. -static void send_line(spi_device_handle_t spi, int ypos, uint16_t *line) +static void send_lines(spi_device_handle_t spi, int ypos, uint16_t *linedata) { esp_err_t ret; int x; @@ -256,11 +257,11 @@ static void send_line(spi_device_handle_t spi, int ypos, uint16_t *line) trans[2].tx_data[0]=0x2B; //Page address set trans[3].tx_data[0]=ypos>>8; //Start page high trans[3].tx_data[1]=ypos&0xff; //start page low - trans[3].tx_data[2]=(ypos+1)>>8; //end page high - trans[3].tx_data[3]=(ypos+1)&0xff; //end page low + trans[3].tx_data[2]=(ypos+PARALLEL_LINES)>>8; //end page high + trans[3].tx_data[3]=(ypos+PARALLEL_LINES)&0xff; //end page low trans[4].tx_data[0]=0x2C; //memory write - trans[5].tx_buffer=line; //finally send the line data - trans[5].length=320*2*8; //Data length, in bits + trans[5].tx_buffer=linedata; //finally send the line data + trans[5].length=320*2*8*PARALLEL_LINES; //Data length, in bits trans[5].flags=0; //undo SPI_TRANS_USE_TXDATA flag //Queue all transactions. @@ -294,28 +295,31 @@ static void send_line_finish(spi_device_handle_t spi) //while the previous one is being sent. static void display_pretty_colors(spi_device_handle_t spi) { - uint16_t line[2][320]; - int x, y, frame=0; + uint16_t *lines[2]; + //Allocate memory for the pixel buffers + for (int i=0; i<2; i++) { + lines[i]=heap_caps_malloc(320*PARALLEL_LINES*sizeof(uint16_t), MALLOC_CAP_DMA); + assert(lines[i]!=NULL); + } + int frame=0; //Indexes of the line currently being sent to the LCD and the line we're calculating. int sending_line=-1; int calc_line=0; while(1) { frame++; - for (y=0; y<240; y++) { + for (int y=0; y<240; y+=PARALLEL_LINES) { //Calculate a line. - for (x=0; x<320; x++) { - line[calc_line][x]=((x<<3)^(y<<3)^(frame+x*y)); - } + pretty_effect_calc_lines(lines[calc_line], y, frame, PARALLEL_LINES); //Finish up the sending process of the previous line, if any if (sending_line!=-1) send_line_finish(spi); //Swap sending_line and calc_line sending_line=calc_line; calc_line=(calc_line==1)?0:1; //Send the line we currently calculated. - send_line(spi, y, line[sending_line]); - //The line is queued up for sending now; the actual sending happens in the - //background. We can go on to calculate the next line as long as we do not + send_lines(spi, y, lines[sending_line]); + //The line set is queued up for sending now; the actual sending happens in the + //background. We can go on to calculate the next line set as long as we do not //touch line[sending_line]; the SPI sending process is still reading from that. } } @@ -330,10 +334,15 @@ void app_main() .mosi_io_num=PIN_NUM_MOSI, .sclk_io_num=PIN_NUM_CLK, .quadwp_io_num=-1, - .quadhd_io_num=-1 + .quadhd_io_num=-1, + .max_transfer_sz=PARALLEL_LINES*320*2+8 }; spi_device_interface_config_t devcfg={ - .clock_speed_hz=10*1000*1000, //Clock out at 10 MHz +#ifdef CONFIG_LCD_OVERCLOCK + .clock_speed_hz=26*1000*1000, //Clock out at 26 MHz +#else + .clock_speed_hz=10*1000*1000, //Clock out at 10 MHz +#endif .mode=0, //SPI mode 0 .spics_io_num=PIN_NUM_CS, //CS pin .queue_size=7, //We want to be able to queue 7 transactions at a time @@ -341,12 +350,16 @@ void app_main() }; //Initialize the SPI bus ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1); - assert(ret==ESP_OK); + ESP_ERROR_CHECK(ret); //Attach the LCD to the SPI bus ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi); - assert(ret==ESP_OK); + ESP_ERROR_CHECK(ret); //Initialize the LCD lcd_init(spi); + //Initialize the effect displayed + ret=pretty_effect_init(); + ESP_ERROR_CHECK(ret); + //Go do nice stuff. display_pretty_colors(spi); }