sdk例程模板2:SPI_QSPI_MCU屏驱动层LVGL接口 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

说明

  • 底层需要实现4个函数即可:lcd_rst, write_command, write_command_data, write_data
  • 注意write_command_data和write_data的length需要是u32长度

main.c

#include "ACZ702_Lib/COMMON.h"
#include "lvgl/lvgl.h"
#include "lvgl/examples/porting/lv_port_disp_template.h"
#include "lvgl/examples/porting/lv_port_indev_template.h"
#include "lvgl/demos/lv_demos.h"

//GPIO2, V1扩展板
#define PS_DCX (54+0)
#define PS_RSTN (54+1)
#define PL_DCX (54+2)
#define PL_RSTN (54+3)

int main_ps_emio(void)
{
    PS_GPIO_Init(); //初始化PS端MIO和EMIO
    PS_GPIO_SetMode(PS_DCX, OUTPUT, 1);
    PS_GPIO_SetMode(PS_RSTN, OUTPUT, 1); 
    PS_GPIO_SetMode(PL_DCX, OUTPUT, 1);
    PS_GPIO_SetMode(PL_RSTN, OUTPUT, 1); 
}

void lcd_rst()
{
	PS_GPIO_SetPort(PL_RSTN,0);
	usleep(100*1000);
	PS_GPIO_SetPort(PL_RSTN,1);
	usleep(100*1000);
}

void write_command(u8 cmd)
{
	// PS_GPIO_SetPort(PL_DCX,0);
	// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, &cmd, 1);
}

void write_command_data(u8 cmd, u8 *pdata, u32 length)
{
	// PS_GPIO_SetPort(PL_DCX,0);
	// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, &cmd, 1);
	// usleep(1);

	// PS_GPIO_SetPort(PL_DCX,1);
	// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, pdata, length);	
}

void write_data(u8 *pdata, u32 length)
{
	// PS_GPIO_SetPort(PL_DCX,1);
	// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, pdata, length);
}

/**************************************************************************************/
/**************************************************************************************/
void lcd_init()
{
	write_command(0x11);
	usleep(100*1000);
	write_command(0x21);

	u8 data=0x55;
	write_command_data(0x3a, &data, 1);

	write_command(0x29);
}


#define LCD_X_SIZE 240
#define LCD_Y_SIZE 240
void lcdqspi_fill_block(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t color)
{
	u8 xwin_list[]={(x0>>8)&0xff, x0&0xff, (x1>>8)&0xff, x1&0xff};
	u8 ywin_list[]={(y0>>8)&0xff, y0&0xff, (y1>>8)&0xff, y1&0xff};
	write_command_data(0x2a, xwin_list, 4);
	write_command_data(0x2b, ywin_list, 4);

	u32 length=(x1-x0)*(y1-y0);
	write_command(0x2c);
	while(length--){
		u8 color_list[]={(color>>8)&0xff, color&0xff};
		write_data(color_list,2);
	}
}

void lcdqspi_clear(uint32_t color)
{
    lcdqspi_fill_block(0, 0, LCD_X_SIZE - 1, LCD_Y_SIZE - 1, color);
}


void lcdqspi_fill_pcolor(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint16_t *pcolor)
{
	u8 xwin_list[]={(x0>>8)&0xff, x0&0xff, (x1>>8)&0xff, x1&0xff};
	u8 ywin_list[]={(y0>>8)&0xff, y0&0xff, (y1>>8)&0xff, y1&0xff};
	write_command_data(0x2a, xwin_list, 4);
	write_command_data(0x2b, ywin_list, 4);

	u32 length=(x1-x0)*(y1-y0);
	write_command(0x2c);

	// while(length--){
	// 	//u8 color_list[]={(*pcolor>>8)&0xff, *pcolor&0xff};
	// 	//write_data(color_list,2);
	// 	write_data((u8 *)pcolor,2);
	// 	pcolor++;
	// }
	write_data((u8 *)pcolor,2*length);
}


void ScuTimer_IRQ_Handler(void *CallBackRef)
{
	/* ↓↓↓用户处理↓↓↓ */
	lv_tick_inc(1);
	/* ↑↑↑结束处理↑↑↑ */
    XScuTimer_ClearInterruptStatus(&ScuTimer);
}


int mainx(void)
{
	Xil_DCacheDisable();

	/* 私有定时器初始化 */
	ScuGic_Init();
	ScuTimer_Int_Init(1000);


	//初始化SPI0,设为主机模式,64分频
	AXI_SPI_Init(&AXI_SPI0, XPAR_SPI_0_DEVICE_ID, XSP_MASTER_OPTION|XSP_CLK_ACTIVE_LOW_OPTION|XSP_CLK_PHASE_1_OPTION);

	main_ps_emio();
	lcd_rst();
	lcd_init();


		/* lvgl初始化 */
	lv_init();
	// lv_port_disp_init();
	// lv_port_indev_init();

	/* 创建demo */
	//lv_demo_printer();
	//lv_demo_keypad_encoder();
	// lv_demo_widgets();
	//lv_demo_stress();
	//lv_demo_benchmark();

	/* 死循环 */
	for ( ; ; ) {
		lv_task_handler();
		usleep(5 * 1000);
	}
	
	return 0;
}