eps32-s3使用i8080例程驱动NT35510,8080的16位并口,出现色差

Moderator: ESP_Bob

eatfisheveryday
Posts: 1
Joined: Tue May 28, 2024 10:32 am

eps32-s3使用i8080例程驱动NT35510,8080的16位并口,出现色差

Postby eatfisheveryday » Wed May 29, 2024 1:44 am

本人小白一个,使用官方例程驱动NT35510,8080的16位并口,颜色显示不对。而后修改了nt35510的初始化函数(panel_nt35510_init函数),发现8位并口屏幕能正常显示,但是16位并口显示的颜色color_data高低字节相反,最后修改panel_nt35510_draw_bitmap函数,手动进行颜色高低字节交换,16位并口颜色能正常显示,但是这样的话显示的速度又太慢了,请问有什么可以配置有关颜色高低字节交换地方或者修改某些宏实现吗?

初始化就不写上来了,很长.....

以下为修改的panel_nt35510_draw_bitmap函数,使颜色高低字节交换:
  1. static esp_err_t panel_nt35510_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end,
  2.                                            const void *color_data)
  3. {
  4.     nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base);
  5.     assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position");
  6.     esp_lcd_panel_io_handle_t io = nt35510->io;
  7.    
  8.     x_start += nt35510->x_gap;
  9.     x_end += nt35510->x_gap;
  10.     y_start += nt35510->y_gap;
  11.     y_end += nt35510->y_gap;
  12.    
  13.     // define an area of frame memory where MCU can access
  14.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 0, (uint16_t[]) {
  15.         (x_start >> 8) & 0xFF,
  16.     }, 2), TAG, "io tx param failed");
  17.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 1, (uint16_t[]) {
  18.         x_start & 0xFF,
  19.     }, 2), TAG, "io tx param failed");
  20.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 2, (uint16_t[]) {
  21.         ((x_end - 1) >> 8) & 0xFF,
  22.     }, 2), TAG, "io tx param failed");
  23.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 3, (uint16_t[]) {
  24.         (x_end - 1) & 0xFF,
  25.     }, 2), TAG, "io tx param failed");
  26.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 0, (uint16_t[]) {
  27.         (y_start >> 8) & 0xFF,
  28.     }, 2), TAG, "io tx param failed");
  29.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 1, (uint16_t[]) {
  30.         y_start & 0xFF,
  31.     }, 2), TAG, "io tx param failed");
  32.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 2, (uint16_t[]) {
  33.         ((y_end - 1) >> 8) & 0xFF,
  34.     }, 2), TAG, "io tx param failed");
  35.     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 3, (uint16_t[]) {
  36.         (y_end - 1) & 0xFF,
  37.     }, 2), TAG, "io tx param failed");
  38.     // transfer frame buffer
  39.     size_t len = (x_end - x_start) * (y_end - y_start) * nt35510->fb_bits_per_pixel / 8;
  40.  
  41.  
  42. //****************start***************************************************************************************
  43.  
  44.     // 为交换后的数据创建一个新缓冲区
  45.     uint16_t *swapped_color_data = malloc(len);
  46.     if (!swapped_color_data) {
  47.         return ESP_ERR_NO_MEM;
  48.     }
  49.  
  50.     // 对颜色数据进行高低字节交换
  51.     const uint16_t *src = (const uint16_t *)color_data;
  52.     for (size_t i = 0; i < len / 2; i++) { // len / 2 因为 len 是以字节为单位,而我们处理的是 16 位数据
  53.         swapped_color_data[i] = (src[i] >> 8) | (src[i] << 8);
  54.     }
  55.  
  56.     // 发送交换后的颜色数据
  57.     esp_err_t err = esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR << 8, swapped_color_data, len);
  58.     if (err != ESP_OK) {
  59.         free(swapped_color_data);
  60.         return err;
  61.     }
  62.  
  63.     free(swapped_color_data);
  64.  
  65. //*****************end**************************************************************************************
  66.  
  67.     return ESP_OK;
  68. }

Who is online

Users browsing this forum: No registered users and 10 guests