展锐UIS8850 外接LCD屏 ST7735S 驱动
1. 首先配置全局的 target
CONFIG_LCD_SUPPORT=y CONFIG_SUPPORT_LCD_GC9305=n CONFIG_SUPPORT_LCD_GC9306=n CONFIG_SUPPORT_LCD_ST7735S=y
这里遇到一个问题,如果同时出现了下面两行,对同一个配置开关,最后结果是未设置
CONFIG_SUPPORT_LCD_ST7789h2=y
# CONFIG_SUPPORT_LCD_ST7789h2 is not set
2. 代码中有两套LCD 的驱动,用的 V2版本,增加一个 st7735s 的驱动,从st7789h2 拷贝一份即可
3. 在这份文件中修改,注意选8位EGB565, 4线SPI,方向选正常,宽度高度等
const drvLcdPanelDesc_t gLcdSt7735SDesc = { .ops = { .probe = prvSt7735SProbe, .init = prvSt7735SInit, .blit_prepare = prvSt7735SBlitPrepare, }, .name = "St7735S", .dev_id = 0x858552, .reset_us = 20 * 1000, .init_delay_us = 100 * 1000, .width = 128, .height = 160, .out_fmt = DRV_LCD_OUT_FMT_8BIT_RGB565, .dir = DRV_LCD_DIR_NORMAL, .line_mode = DRV_LCD_SPI_4WIRE, #ifdef CONFIG_8850_FPGA_BOARD .fmark_enabled = false, #else .fmark_enabled = true, #endif .fmark_delay = 0x18000, #ifdef CONFIG_8850_FPGA_BOARD .freq = 10 * 1000000, .frame_us = (unsigned)(11200000 / 28.0), #else .freq = 50 * 1000000, .frame_us = (unsigned)(1000000 / 28.0), #endif };
4. 去掉读ID 的过程
static bool prvSt7735SProbe(void *d) { const drvLcdPanelDesc_t *desc = drvLcdGetDesc(d); OSI_LOGI(0x100089ce, "St7735S probe"); //qhq ID值直接返回1, 屏不用读取ID //return prvSt7735SReadId(d) == desc->dev_id; prvSt7735SReadId(d); return true; //qhq }
5. panel_desc.c 里面添加 st7735s 的句柄
6. 上层应用
void atCmdHandleLLCD(atCommand_t *cmd) { static drvLcd_t *gLcd; uint8_t command = 1; drvLcdInitV2(); gLcd = drvLcdGetByname(DRV_NAME_LCD1); if (gLcd == NULL) { } if (!drvLcdOpenV2(gLcd)) { } drvLcdPanelInfo_t panel_info; if (!drvLcdGetPanelInfo(gLcd, &panel_info)) { } drvLcdSetBackLightEnable(gLcd, true); if(command == 1) { drvLcdFill(gLcd, 0xf800, NULL, false); // 红色 } else if(command == 2) { drvLcdFill(gLcd, 0x07e0, NULL, false); // 绿色 } else { drvLcdFill(gLcd, 0x01f, NULL, false); // 蓝色 } }
7. 硬件接法,实际测试不接CS,原因未知
8. 测试效果
9. 总结,8位 RGB565 和 16位 RGB565 不一样,要注意,CS引脚不要接,接上有奇怪的问题。接下来的工作是移植 Little VGL.