sdk例程:原子rgb屏移植lvgl - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
说明
- 程序是参考的毕站上的大佬发的例程,基于原子的zynq7020板子。《基于ZYNQ-7010/7020 LVGL官方demo演示》
https://www.bilibili.com/video/BV1if4y1R7bx/?buvid=XY2C8E02E43E8C023C58D7D3CE28078A4DEA3&from_spmid=search.search-result.0.0&is_story_h5=false&mid=j765VWVh1rgLdD9cMp549w%3D%3D&p=1&plat_id=114&share_from=ugc&share_medium=android&share_plat=android&share_session_id=5847addb-dc46-4bb0-89a0-3b8246b10f13&share_source=WEIXIN&share_tag=s_i&spmid=united.player-video-detail.0.0×tamp=1717066994&unique_k=cuC6eZ6&up_id=149397806
littleVGL官方demo演示 硬件平台:基于正点原子领航者ZYNQ-7010/7020开发板 LCD参数:正点原子7寸800x480电容触摸屏 工程源代码:https://pan.baidu.com/s/1ddU2_agzwD2Mfgcxjn2BSg 提取码:2s1l
- 显示一下子就点亮了,很简单
- 原程序,采用的是硬件i2c,发现兼容性很差,触摸不灵,识别不到tp硬件。折腾了很久,后来换成原子的ZYNQ_SDK_7020例程中34_touch_draw_lcd例程,用gpio模拟i2c就好了。
- 修改后的例程:LVGL_7020_Soft_I2C
修改点说明
- 硬件设计上,注意emio的gpio, 一共用了5个,分别是:scl, sda, tp_rst, tp_int, lcd_bl
#set_property IOSTANDARD LVCMOS33 [get_ports {gpio0_tri_io[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {gpio0_tri_io[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {gpio0_tri_io[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {gpio0_tri_io[0]}]
#set_property PACKAGE_PIN J15 [get_ports {gpio0_tri_io[0]}]
#set_property PACKAGE_PIN Y16 [get_ports {gpio0_tri_io[1]}]
#set_property PACKAGE_PIN Y17 [get_ports {gpio0_tri_io[2]}]
#set_property PACKAGE_PIN V18 [get_ports {gpio0_tri_io[3]}]
#set_property PULLUP true [get_ports {gpio0_tri_io[0]}]
#set_property PULLDOWN true [get_ports {gpio0_tri_io[1]}]
#set_property PULLUP true [get_ports {gpio0_tri_io[2]}]
#set_property PULLUP true [get_ports {gpio0_tri_io[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports i2c0_scl_io]
#set_property IOSTANDARD LVCMOS33 [get_ports i2c0_sda_io]
#set_property PULLUP true [get_ports i2c0_scl_io]
#set_property PULLUP true [get_ports i2c0_sda_io]
#set_property PACKAGE_PIN M19 [get_ports i2c0_scl_io]
#set_property PACKAGE_PIN L16 [get_ports i2c0_sda_io]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[14]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgb_data_tri_io[0]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[15]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[14]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[13]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[12]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[11]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[10]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[9]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[8]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[7]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[6]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[5]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[4]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[3]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[2]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[1]}]
set_property PULLDOWN true [get_ports {rgb_data_tri_io[0]}]
set_property PACKAGE_PIN H18 [get_ports {rgb_data_tri_io[0]}]
set_property PACKAGE_PIN F19 [get_ports {rgb_data_tri_io[1]}]
set_property PACKAGE_PIN F20 [get_ports {rgb_data_tri_io[2]}]
set_property PACKAGE_PIN G19 [get_ports {rgb_data_tri_io[3]}]
set_property PACKAGE_PIN G20 [get_ports {rgb_data_tri_io[4]}]
set_property PACKAGE_PIN H16 [get_ports {rgb_data_tri_io[5]}]
set_property PACKAGE_PIN H17 [get_ports {rgb_data_tri_io[6]}]
set_property PACKAGE_PIN B19 [get_ports {rgb_data_tri_io[7]}]
set_property PACKAGE_PIN A20 [get_ports {rgb_data_tri_io[8]}]
set_property PACKAGE_PIN C20 [get_ports {rgb_data_tri_io[9]}]
set_property PACKAGE_PIN B20 [get_ports {rgb_data_tri_io[10]}]
set_property PACKAGE_PIN F17 [get_ports {rgb_data_tri_io[11]}]
set_property PACKAGE_PIN E17 [get_ports {rgb_data_tri_io[12]}]
set_property PACKAGE_PIN D18 [get_ports {rgb_data_tri_io[13]}]
set_property PACKAGE_PIN E18 [get_ports {rgb_data_tri_io[14]}]
set_property PACKAGE_PIN E19 [get_ports {rgb_data_tri_io[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_de]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_hsync]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_vsync]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_clk]
set_property PACKAGE_PIN J16 [get_ports lcd_de]
set_property PACKAGE_PIN H20 [get_ports lcd_hsync]
set_property PACKAGE_PIN K16 [get_ports lcd_vsync]
set_property PACKAGE_PIN J20 [get_ports lcd_clk]
set_property -dict {PACKAGE_PIN L19 IOSTANDARD LVCMOS33} [get_ports lcd_rstn]
##lcd_bl
#set_property -dict {PACKAGE_PIN K19 IOSTANDARD LVCMOS33} [get_ports gpio0_tri_io[0]]
## ct_int
#set_property -dict {PACKAGE_PIN M20 IOSTANDARD LVCMOS33} [get_ports gpio0_tri_io[2]]
## ct_rst
#set_property -dict {PACKAGE_PIN J19 IOSTANDARD LVCMOS33} [get_ports gpio0_tri_io[3]]
#lcd_scl:
set_property -dict {PACKAGE_PIN M19 IOSTANDARD LVCMOS33} [get_ports {gpio0_tri_io[0]}]
#lcd_sda:
set_property -dict {PACKAGE_PIN L16 IOSTANDARD LVCMOS33} [get_ports {gpio0_tri_io[1]}]
#CT_RST
set_property -dict {PACKAGE_PIN J19 IOSTANDARD LVCMOS33} [get_ports {gpio0_tri_io[2]}]
#CT_INT
set_property -dict {PACKAGE_PIN M20 IOSTANDARD LVCMOS33} [get_ports {gpio0_tri_io[3]}]
#lcd_bl
set_property -dict {PACKAGE_PIN K19 IOSTANDARD LVCMOS33} [get_ports gpio0_tri_io[4]]
set_property PULLUP true [get_ports {GPIO_EMIO_tri_io[1]}]
#其余不用的输入/输出可以不分配引脚,并避免报错
set_property IOSTANDARD LVCMOS33 [get_ports *]
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]
软件修改点
- main.c中打开背光部分
/* 打开LCD背光 */
gpio_cfg = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
XGpioPs_CfgInitialize(&gpio, gpio_cfg, gpio_cfg->BaseAddr);
XGpioPs_SetDirectionPin(&gpio, 58, 1);
XGpioPs_SetOutputEnablePin(&gpio, 58, 1);
XGpioPs_WritePin(&gpio, 58, 1);
- lv_port_disp_init()函数主要是设置显示接口,不用修改。大佬的显示是没有问题的。
- lv_port_indev_init()函数主要是设置touch,要重点修改。要换成原子的34_touch_draw_lcd例程中的touch
void lv_port_indev_init(void)
{
/* Here you will find example implementation of input devices supported by LittelvGL:
* - Touchpad
* - Mouse (with cursor support)
* - Keypad (supports GUI usage only with key)
* - Encoder (supports GUI usage only with: left, right, push)
* - Button (external buttons to press points on the screen)
*
* The `..._read()` function are only examples.
* You should shape them according to your hardware
*/
lv_indev_drv_t indev_drv;
read_cb cb_ptr;
/*------------------
* Touchpad
* -----------------*/
emio_init();
/*Initialize your touchpad if you have*/
switch(lcd_id) {
case 0:
case 1:
case 5: {
GT9147_Init();
cb_ptr = gt9xx_touch_read;
}
break;
case 2:
case 4:
default: {
FT5206_Init();
cb_ptr = ft5x26_touch_read;
}
break;
}
/*Register a touchpad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = cb_ptr;
indev_touchpad = lv_indev_drv_register(&indev_drv);
}
- 在gt9147.c文件中,增加并实现int gt9xx_read(int16_t *x, int16_t *y)函数
int gt9xx_read(int16_t *x, int16_t *y)
{
uint8_t buf[10] = {0};
/*Save the pressed coordinates and the state*/
GT9147_RD_Reg(0x814E, buf, 6); // 璇诲彇鍧愭爣鏁版嵁
buf[6] = 0x0;
GT9147_WR_Reg(0x814E, &buf[6], 1); // 娓卛c鐘舵�乥uf
if ( (buf[0] & 0x80) && (buf[0] & 0x0F) ) {
*x = (buf[3] << 8) | buf[2];
*y = (buf[5] << 8) | buf[4];
return 1;
}
else
return 0;
}
- 修改必要的头文件include,以及变量定义后,就可以了使用了
效果演示