467 lines
12 KiB
C
467 lines
12 KiB
C
|
#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)
|
||
|
{
|
||
|
display_backlight_clear();
|
||
|
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);
|
||
|
|
||
|
// 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);
|
||
|
|
||
|
#endif
|
||
|
printf("LCD_Fill\r\n");
|
||
|
|
||
|
}
|