#include #include "FreeRTOS.h" #include "chip.h" #include "board.h" #if LCD_INTERFACE_TYPE == LCD_INTERFACE_MIPI /* Global macro defination */ #define MIPI_WTIRE_DATA 0x70 #define MIPI_WTIRE_COMMAND 0x6c #define ARK_MIPI_WRITEL(reg, val) writel(val, REGS_DSI_BASE + reg); udelay(200) #define ARK_MIPI_READL(reg) readl(REGS_DSI_BASE + reg) /* Mipi panel parameters */ #define LPDT_LPK 0x39 //1cmd + >=2data #define LPDT_SPK 0x15 //1cmd + 1data. #define NORM_LPK 0x05 //1cmd #define MIPI_WIDTH LCD_WIDTH #define MIPI_HEIGHT LCD_HEIGHT #define MIPI_VBP LCD_TIMING_VBP #define MIPI_VFP LCD_TIMING_VFP #define MIPI_VSW LCD_TIMING_VSW #define MIPI_HBP LCD_TIMING_HBP #define MIPI_HFP LCD_TIMING_HFP #define MIPI_HSW LCD_TIMING_HSW #define MIPI_SPEED 460000000 #define MIPI_LANE 4 //1-4LANE #define DISPLAY_MODE 0 //0: nornal mode; 1: test colour bar mode. #define MIPI_NP_POLARITY_INVERSE 0 //0: clk and data NP polarity normal; 1:clk and data NP polarity inverse. //#define MIPI_RESET_GPIO 73 /* End of mipi panel parameters */ #define MIPI_SEND_DATA(arg...) do { \ uint8_t buf[] = {arg}; \ mipi_write_data(buf, sizeof(buf)); \ mdelay(2); \ } while (0) static void mipi_set_speed(uint32_t speed) { speed = speed / 1000000; if ((speed >= 200) && (speed <= 219)) { ARK_MIPI_WRITEL(0xb8, 0x06); } else if((speed >= 220) && (speed <= 239)) { ARK_MIPI_WRITEL(0xb8, 0x26); } else if((speed >= 240) && (speed <= 249)) { ARK_MIPI_WRITEL(0xb8, 0x46); } else if((speed >= 250) && (speed <= 269)) { ARK_MIPI_WRITEL(0xb8, 0x08); } else if((speed >= 270) && (speed <= 299)) { ARK_MIPI_WRITEL(0xb8, 0x28); } else if((speed >= 300) && (speed <= 329)) { ARK_MIPI_WRITEL(0xb8, 0x0a); } else if((speed >= 330) && (speed <= 359)) { ARK_MIPI_WRITEL(0xb8, 0x2a); } else if((speed >= 260) && (speed <= 399)) { ARK_MIPI_WRITEL(0xb8, 0x4a); } else if((speed >= 400) && (speed <= 449)) { ARK_MIPI_WRITEL(0xb8, 0x0c); } else if((speed >= 450) && (speed <= 499)) { ARK_MIPI_WRITEL(0xb8, 0x2c); } else if((speed >= 500) && (speed <= 549)) { ARK_MIPI_WRITEL(0xb8, 0x0e); } else if((speed >= 550) && (speed <= 599)) { ARK_MIPI_WRITEL(0xb8, 0x2e); } else if((speed >= 600) && (speed <= 649)) { ARK_MIPI_WRITEL(0xb8, 0x10); } else if((speed >= 650) && (speed <= 699)) { ARK_MIPI_WRITEL(0xb8, 0x30); } else if((speed >= 700) && (speed <= 749)) { ARK_MIPI_WRITEL(0xb8, 0x12); } else if((speed >= 750) && (speed <= 799)) { ARK_MIPI_WRITEL(0xb8, 0x32); } else if((speed >= 800) && (speed <= 849)) { ARK_MIPI_WRITEL(0xb8, 0x52); } else if((speed >= 850) && (speed <= 899)) { ARK_MIPI_WRITEL(0xb8, 0x72); } else if((speed >= 900) && (speed <= 949)) { ARK_MIPI_WRITEL(0xb8, 0x14); } else if((speed >= 950) && (speed <= 1000)) { ARK_MIPI_WRITEL(0xb8, 0x34); } else { ARK_MIPI_WRITEL(0xb8, 0x2c); } } static int mipi_write_data(const uint8_t *buffer, int length) { uint32_t value = 0; int mult = length / 4; int left = length % 4; int i = 0; if (!buffer || (length <= 0)) { printf("%s: Invalid buffer:%p or length:%d\n", __func__, buffer, length); return -1; } if (length == 1) //only 1cmd. { ARK_MIPI_WRITEL(MIPI_WTIRE_COMMAND, (buffer[0]<<8) | NORM_LPK); } else if (length == 2) //1cmd + 1data. { ARK_MIPI_WRITEL(MIPI_WTIRE_DATA, (buffer[1]<<8) | buffer[0]); ARK_MIPI_WRITEL(MIPI_WTIRE_COMMAND, (length<<8) | LPDT_SPK); } else //1cmd + >=2data. { for (i=0; irgb888; writel(val, REGS_SYSCTL_BASE + SYS_MIPI_CTL); ARK_MIPI_WRITEL(0x04, 0x0); ARK_MIPI_WRITEL(0xa0, 0x0); ARK_MIPI_WRITEL(0x08, 0x17); ARK_MIPI_WRITEL(0x2c, 0x1c); ARK_MIPI_WRITEL(0x9c, 0x09000c); ARK_MIPI_WRITEL(0x94, 0x0); ARK_MIPI_WRITEL(0x98, 0x180014); ARK_MIPI_WRITEL(0xa4, 0x2800+(MIPI_LANE-1)); ARK_MIPI_WRITEL(0x38, 0xbf02); ARK_MIPI_WRITEL(0x0c, 0x0); ARK_MIPI_WRITEL(0x68, 0x000b4700); ARK_MIPI_WRITEL(0x10, 0x5); ARK_MIPI_WRITEL(0x14, 0x00); ARK_MIPI_WRITEL(0x3c, MIPI_WIDTH); ARK_MIPI_WRITEL(0x48, MIPI_HSW); ARK_MIPI_WRITEL(0x4c, MIPI_HBP); ARK_MIPI_WRITEL(0x50, MIPI_WIDTH+MIPI_HSW+MIPI_HBP+MIPI_HFP); ARK_MIPI_WRITEL(0x54, MIPI_VSW); ARK_MIPI_WRITEL(0x58, MIPI_VBP); ARK_MIPI_WRITEL(0x5c, MIPI_VFP); ARK_MIPI_WRITEL(0x60, MIPI_HEIGHT); ARK_MIPI_WRITEL(0x34, 0x1); ARK_MIPI_WRITEL(0x18, 0xa000a); ARK_MIPI_WRITEL(0xc4, 0xffffffff); ARK_MIPI_WRITEL(0xc8, 0xffffffff); ARK_MIPI_WRITEL(0x04, 0x1); ARK_MIPI_WRITEL(0xa0, 0xf); #if MIPI_NP_POLARITY_INVERSE mipi_np_polarity_inv(); #endif ARK_MIPI_WRITEL(0xb8, 0x44); ARK_MIPI_WRITEL(0xb8, 0x10044); ARK_MIPI_WRITEL(0xb4, 0x2); ARK_MIPI_WRITEL(0xb4, 0x0); //ARK_MIPI_WRITEL(0xb8, 0x0C); //MIPI CLK mipi_set_speed(MIPI_SPEED); ARK_MIPI_WRITEL(0xb4, 0x2); ARK_MIPI_WRITEL(0xb4, 0x0); while(!((ARK_MIPI_READL(0xb0) & 0x5) == 0x5)); ARK_MIPI_WRITEL(0x94, 0x1); ARK_MIPI_WRITEL(0x100, 0x1000000); mdelay(200); /* mipi panel init */ mipi_panel_init(); #if DISPLAY_MODE ARK_MIPI_WRITEL(0x38, 0x1bf02); //test mode test mode colour bar #else ARK_MIPI_WRITEL(0x38, 0xbf02); //normal mode #endif ARK_MIPI_WRITEL(0x34, 0x0); } #endif