MXC_A39_20240320/SW/components/drivers/bsp/display/driver_nv3041a.c

558 lines
13 KiB
C
Raw Normal View History

2024-03-07 16:46:43 +08:00
#include "driver_display.h"
#include "driver_nv3041a.h"
#include "driver_parallel_interface.h"
extern PARALLEL_HandTypeDef hparallel;
static void WriteComm(uint8_t reg)
{
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer cmd */
Parallel_write_cmd(&hparallel,reg);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
static void WriteData(uint8_t data)
{
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer cmd */
Parallel_write_param(&hparallel,data);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
static void LCD_READ_DATA(uint8_t reg)
{
static uint16_t data=0;
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer cmd */
//Parallel_write_cmd(&hparallel,reg);
// Parallel_read_data_cmd(&hparallel,reg,&data,1);
printf("reg_param:0x%x\r\n",data);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
void display_backlight_set(void)
{
gpio_write_pin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
void display_backlight_clear(void)
{
gpio_write_pin(GPIOA, GPIO_PIN_4, GPIO_PIN_CLEAR);
}
void nv3041a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
{
WriteComm(0x2a);//列地址设置
WriteData(x_s>>8);
WriteData(x_s&0xff);
WriteData(x_e>>8);
WriteData(x_e&0xff);
WriteComm(0x2b);//行地址设置
WriteData(y_s>>8);
WriteData(y_s&0xff);
WriteData(y_e>>8);
WriteData(y_e&0xff);
WriteComm(0x2c);//储存器写
// write_cmd(0x2c);
}
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{
uint16_t i,j,size;
nv3041a_set_window(xsta,xend-1,ysta,yend-1);//设置显示范围
__PARALLEL_CS_SET(hparallel.PARALLELx);
if(hparallel.Init.DataBusSelect == DATA_BUS_8_BIT)
{
size=2;
}else{
size=2;
}
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
// LCD_WR_DATA(color);
/* writer data */
Parallel_write_data(&hparallel,(uint32_t *)&color,size);
}
}
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
void nv3041a_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint32_t frame_size=0;
if (pixel_width == 8) {
frame_size = (pixel_count*4);
}
if (pixel_width == 16) {
// frame_size = SPI_FRAME_SIZE_16BIT;
frame_size = (pixel_count*2);
}
else if (pixel_width == 32) {
frame_size = (pixel_count);
}
__PARALLEL_CS_SET(hparallel.PARALLELx);
//Parallel_write_param(&hparallel,data);
Parallel_write_data(&hparallel,data,(frame_size));
//while(__PARALLEL_IS_BUS_BUSY(hparallel.PARALLELx));
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
}
void nv3041a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
{
uint8_t dma_trans_width=0;
uint32_t dma_sample_count=0;
switch (dma_display_handle.Init.Source_Width) {
case DMA_TRANSFER_WIDTH_32:
//272x480 16
dma_sample_count = pixel_count * pixel_width / 32;
//dma_sample_count=dma_sample_count*4;
break;
case DMA_TRANSFER_WIDTH_16:
dma_sample_count = pixel_count * pixel_width / 16;
// dma_sample_count=dma_sample_count*2;
break;
case DMA_TRANSFER_WIDTH_8:
dma_sample_count = pixel_count * pixel_width / 8;
// dma_sample_count=dma_sample_count;
break;
default:
return;
}
// switch(hparallel.Init.DataBusSelect)
// {
// case DATA_BUS_8_BIT:
// dma_trans_width = 2;
// break;
//
// case DATA_BUS_16_BIT:
// dma_trans_width=2;
// break;
// }
dma_sample_count=dma_sample_count*2;
__PARALLEL_CS_SET(hparallel.PARALLELx);
__PARALLEL_SET_WR_LEN(hparallel.PARALLELx,dma_sample_count);
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&hparallel.PARALLELx->TX_FIFO, (dma_sample_count));
}
void nv3041a_display_dma_isr(void)
{
#if 0
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
// CS Release
__DISPLAY_CS_SET();
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
__SPI_DISABLE(spi_display_handle.SPIx);
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
#endif
//printf("nv3041a_display_dma_isr1\r\n");
while(!( __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY));
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
/* Clear Transfer complete status */
dma_clear_tfr_Status(&dma_display_handle);
/* channel Transfer complete interrupt disable */
dma_tfr_interrupt_disable(&dma_display_handle);
//printf("nv3041a_display_dma_isr2\r\n");
}
#define pixel_size 100*100
uint16_t color_buffer[pixel_size]={0};
void nv3041a_init(void)
{
#define TFT_43 0
display_backlight_clear();
#if TFT_43 == 1
WriteComm(0xff);
WriteData(0xa5);
WriteComm(0xE7);//TE_output_en
WriteData(0x10);
WriteComm(0x35);//TE_ interface_en
WriteData(0x01);
WriteComm(0x3A);
WriteData(0x01);//00---666//01--565
WriteComm(0x40);
WriteData(0x01); //01:IPS/00:TN
WriteComm(0x41);
WriteData(0x03);//01--8bit//03--16bit
WriteComm(0x55);
WriteData(0x01);
WriteComm(0x44);//VBP
WriteData(0x15);//21NVu NV3041A-01
WriteComm(0x45);//VFP
WriteData(0x15);//21
WriteComm(0x7d);//vdds_trim[2:0]
WriteData(0x03);//2.07V
WriteComm(0xc1);//avdd_clp_en avdd_clp[1:0] avcl_clp_en avcl_clp[1:0]
WriteData(0xab);//6.74V/-5.16V
WriteComm(0xc2);//vgh_clp_en vgl_clp[2:0]
WriteData(0x17);
WriteComm(0xc3);//vgl_clp_en vgl_clp[2:0]
WriteData(0x10);//-10.951
WriteComm(0xc6);//avdd_ratio_sel avcl_ratio_sel vgh_ratio_sel[1:0] vgl_ratio_sel[1:0]
WriteData(0x3a);//35
WriteComm(0xc7);//mv_clk_sel[1:0] avdd_clk_sel[1:0] avcl_clk_sel[1:0]
WriteData(0x25); //2e
WriteComm(0xc8);// VGL_CLK_sel
WriteData(0x11);
WriteComm(0x6f);// user_gvdd
WriteData(0x2f);
WriteComm(0x78);// user_gvcl
WriteData(0x4b);
//WriteComm(0x7a);// user_vgsp
//WriteData(0x5f);
//test
WriteComm(0x7a);// user_vgsp
WriteData(0x49);
WriteComm(0xc9);
WriteData(0x00);
//gate_ed
WriteComm(0x51);//gate_st_o[7:0]
//WriteData(0x4b);
WriteData(0x20);
WriteComm(0x52);//gate_ed_o[7:0]
WriteData(0x7c);
WriteComm(0x53);//gate_st_e[7:0]
//WriteData(0x45);
WriteData(0x1c);
WriteComm(0x54);//gate_ed_e[7:0]
WriteData(0x77);
////sorce oldNVu NV3041A-01
WriteComm(0x46);//fsm_hbp_o[5:0]
WriteData(0x0a);
WriteComm(0x47);//fsm_hfp_o[5:0]
WriteData(0x2a);
WriteComm(0x48);//fsm_hbp_e[5:0]
WriteData(0x0a);
WriteComm(0x49);//fsm_hfp_e[5:0]
WriteData(0x1a);
WriteComm(0x56);//src_ld_wd[1:0] src_ld_st[5:0]
WriteData(0x43);
WriteComm(0x57);//pn_cs_en src_cs_st[5:0]
WriteData(0x42);
WriteComm(0x58);//src_cs_p_wd[6:0]
WriteData(0x3c);
WriteComm(0x59);//src_cs_n_wd[6:0]
WriteData(0x64);
WriteComm(0x5a);//src_pchg_st_o[6:0]
WriteData(0x41);
WriteComm(0x5b);//src_pchg_wd_o[6:0]
WriteData(0x3c);
WriteComm(0x5c);//src_pchg_st_e[6:0]
WriteData(0x02);
WriteComm(0x5d);//src_pchg_wd_e[6:0]
WriteData(0x3c);
WriteComm(0x5e);//src_pol_sw[7:0]
WriteData(0x1f);
WriteComm(0x60);//src_op_st_o[7:0]
WriteData(0x80);
WriteComm(0x61);//src_op_st_e[7:0]
WriteData(0x3f);
WriteComm(0x62);//src_op_ed_o[9:8] src_op_ed_e[9:8]
WriteData(0x21);
WriteComm(0x63);//src_op_ed_o[7:0]
WriteData(0x07);
WriteComm(0x64);//src_op_ed_e[7:0]
WriteData(0xe0);
WriteComm(0x65);//chopper
WriteData(0x01);//01-A2,02--A1NVu NV3041A-01
//WriteComm(0x67);
//WriteData(0x33);//01
WriteComm(0xca); //avdd_mux_st_o[7:0]
WriteData(0x20);
WriteComm(0xcb); //avdd_mux_ed_o[7:0]
WriteData(0x52);
WriteComm(0xcc); //avdd_mux_st_e[7:0]
WriteData(0x10);
WriteComm(0xcD); //avdd_mux_ed_e[7:0]
WriteData(0x42);
WriteComm(0xD0); //avcl_mux_st_o[7:0]
WriteData(0x20);
WriteComm(0xD1); //avcl_mux_ed_o[7:0]
WriteData(0x52);
WriteComm(0xD2); //avcl_mux_st_e[7:0]
WriteData(0x10);
WriteComm(0xD3); //avcl_mux_ed_e[7:0]
WriteData(0x42);
WriteComm(0xD4); //vgh_mux_st[7:0]
WriteData(0x0a);
WriteComm(0xD5); //vgh_mux_ed[7:0]
WriteData(0x32);
WriteComm(0xe5); //DVDD_TRIM
WriteData(0x05); //1.65 05
WriteComm(0xe6); //ESD_CTRL
WriteData(0x00);
WriteComm(0x6e); //LVD_en
WriteData(0x14);
//gammma 01
WriteComm(0x80); //gam_vrp0 63
WriteData(0x04);
WriteComm(0xA0); //gam_VRN0 63
WriteData(0x00);
WriteComm(0x81); //gam_vrp1 62
WriteData(0x07);
WriteComm(0xA1); //gam_VRN1 62-
WriteData(0x05);
WriteComm(0x82); //gam_vrp2 61
WriteData(0x06);
WriteComm(0xA2); //gam_VRN2 61-NVu NV3041A-01
WriteData(0x04);
WriteComm(0x83); //gam_vrp3 2
WriteData(0x39);
WriteComm(0xA3); //gam_VRN3 2-
WriteData(0x39);
WriteComm(0x84); //gam_vrp4 1
WriteData(0x3a);
WriteComm(0xA4); //gam_VRN4 1-
WriteData(0x3a);
WriteComm(0x85); //gam_vrp5 0
WriteData(0x3f); //2a~39-0.43
WriteComm(0xA5); //gam_VRN5 0-
WriteData(0x3f);
WriteComm(0x86); //gam_prp0 50
WriteData(0x2c); //33
WriteComm(0xA6); //gam_PRN0 50-
WriteData(0x2a); //2a
//WriteComm(0x87); //gam_prp1 14
//WriteData(0x46); //2d
//WriteComm(0xA7); //gam_PRN1 14-
//WriteData(0x44); //2d
WriteComm(0x87); //gam_prp1 14
WriteData(0x43); //2d
WriteComm(0xA7); //gam_PRN1 14-
WriteData(0x47); //2d
WriteComm(0x88); //gam_pkp0 59
WriteData(0x08); //0b
WriteComm(0xA8); //gam_PKN0 59-
WriteData(0x08); //0b
WriteComm(0x89); //gam_pkp1 57
WriteData(0x0f); //14
WriteComm(0xA9); //gam_PKN1 57-
WriteData(0x0f); //14
WriteComm(0x8a); //gam_pkp2 54
WriteData(0x17); //1a
WriteComm(0xAa); //gam_PKN2 54-
WriteData(0x17); //1a
WriteComm(0x8b); //gam_PKP3 44
WriteData(0x10);
WriteComm(0xAb); //gam_PKN3 44-
WriteData(0x10);
WriteComm(0x8c); //gam_PKP4 38
WriteData(0x16);
WriteComm(0xAc); //gam_PKN4 38-
WriteData(0x16);//NVu NV3041A-01
WriteComm(0x8d); //gam_PKP5 32
WriteData(0x14);
WriteComm(0xAd); //gam_PKN5 32-
WriteData(0x14);
WriteComm(0x8e); //gam_PKP6 26
WriteData(0x11); //16
WriteComm(0xAe); //gam_PKN6 26-
WriteData(0x11); //13
WriteComm(0x8f); //gam_PKP7 20
WriteData(0x14); //1c
WriteComm(0xAf); //gam_PKN7 20-
WriteData(0x14); //0a
WriteComm(0x90); //gam_PKP8 10
WriteData(0x06);
WriteComm(0xB0); //gam_PKN8 10-
WriteData(0x06);
WriteComm(0x91); //gam_PKP9 6
WriteData(0x0f);
WriteComm(0xB1); //gam_PKN9 6-
WriteData(0x0f);
WriteComm(0x92); //gam_PKP10 4
WriteData(0x16);
WriteComm(0xB2); //gam_PKN10 4-
WriteData(0x16);
WriteComm(0xff);
WriteData(0x00);
WriteComm(0x11);
WriteComm(0x36);
WriteData(0x00);
system_delay_us(120*1000);
WriteComm(0x29);
system_delay_us(20*1000);
#else
WriteComm(0xF7);
WriteData(0xA9);
WriteData(0x51);
WriteData(0X2C);
WriteData(0X82);
WriteComm(0xC0);
WriteData(0x0F);
WriteData(0x0f);
// VGH = 5VCI VGL = -3VCI
WriteComm(0xC1);
WriteData(0x47);
WriteComm(0xC5);
WriteData(0x00);
WriteData(0x4D);
WriteData(0x80);
WriteComm(0xB1);
WriteData(0xB0);
WriteData(0X11);
WriteComm(0xB1);
WriteData(0xA0);
WriteComm(0xB4);
WriteData(0x02);
2024-03-09 13:35:12 +08:00
WriteComm(0x36);//旋转180°
// WriteData(0x28);
WriteData(0xE8);
2024-03-07 16:46:43 +08:00
WriteComm(0x3A);
WriteData(0x55); //RGB565
WriteComm(0x20);
WriteData(0x00); //IPS
WriteComm(0xE9);
WriteData(0x00);
WriteComm(0xF7);
WriteData(0xA9);
WriteData(0x51);
WriteData(0x2C);
WriteData(0x82);
WriteComm(0xE0);
WriteData(0x00);
WriteData(0x07);
WriteData(0x0B);
WriteData(0x03);
WriteData(0x0F);
WriteData(0x05);
WriteData(0x30);
WriteData(0x56);
WriteData(0x47);
WriteData(0x04);
WriteData(0x0B);
WriteData(0x0A);
WriteData(0x2D);
WriteData(0x37);
WriteData(0x0F);
WriteComm(0xE1);
WriteData(0x00);
WriteData(0x0E);
WriteData(0x13);
WriteData(0x04);
WriteData(0x11);
WriteData(0x07);
WriteData(0x39);
WriteData(0x45);
WriteData(0x50);
WriteData(0x07);
WriteData(0x10);
WriteData(0x0D);
WriteData(0x32);
WriteData(0x36);
WriteData(0x0F);
WriteComm(0x11);
system_delay_us(120*1000);
// Delay(480);
WriteComm(0x29);
#endif
// LCD_READ_DATA(0x36);
// for(uint32_t i=0;i<pixel_size;i++)
// {
// color_buffer[i]=0xf800;
// }
// nv3041a_set_window(0,240-1,0,320-1);
// __PARALLEL_CS_SET(hparallel.PARALLELx);
// /* writer data */
// Parallel_write_data(&hparallel,(uint32_t *)&color_buffer,(pixel_size));
// __PARALLEL_CS_RELEASE(hparallel.PARALLELx);
// system_delay_us(2000*1000);
#if 0
for(uint32_t i=0;i<pixel_size;i++)
{
color_buffer[i]=0xf800;
}
nv3041a_set_window(0,100-1,0,100-1);
__PARALLEL_CS_SET(hparallel.PARALLELx);
/* writer data */
Parallel_write_data(&hparallel,(uint32_t *)&color_buffer,(pixel_size));
system_delay_us(100);
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
system_delay_us(1000*1000);
#if 0
extern uint32_t *user_get_display_framebuffer(void);
uint16_t *buf = (uint16_t*)user_get_display_framebuffer();
nv3041a_set_window(0,100-1,0,100-1);
for(uint32_t i=0;i<pixel_size;i++)
{
color_buffer[i]=0x001f;
}
nv3041a_display_dma(pixel_size,16,color_buffer);
system_delay_us(2000*1000);
uint16_t color_buf[16]={
0xf800,0x001f,0x01e0,0xffff,0x0fff,
};
static uint8_t index=0;
while(1)
{
for(uint32_t i=0;i<480*272;i++)
{
buf[i]=color_buf[index];
}
++index;
index%=4;
nv3041a_set_window(0,480-1,0,272-1);
nv3041a_display_dma((480*272),16,buf);
system_delay_us(2000*1000);
if(index==0)break;
}
for(uint32_t i=0;i<480*272;i++)
{
buf[i]=0xf800;
}
nv3041a_set_window(0,480-1,0,272-1);
nv3041a_display_dma((480*272),16,buf);
system_delay_us(2000*1000);
#endif
// LCD_Fill(0,0,240,320,0x001f);
// system_delay_us(2000*1000);
// LCD_Fill(0,0,240,320,0x01e0);
// system_delay_us(2000*1000);
// LCD_Fill(0,0,240,320,0xffff);
printf("LCD_Fill\r\n");
#endif
}