sdk例程:原子rgb屏移植lvgl - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

说明

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,以及变量定义后,就可以了使用了

效果演示

a33b64098715568a8490146e210a58a 57df17caec41e04be0888a777e34efa dd0660cb4cc414a7ff5cbef660671e5