#include "amt630h.h" #include "board.h" #include "sysctl.h" #include "timer.h" #include "uart.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_MIPI_BASE + reg); udelay(200) #define ARK_MIPI_READL(reg) readl(REGS_MIPI_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)) { if (!buffer) SendUartString("mipi_write_data buffer NULL\n"); if (length <= 0) SendUartString("mipi_write_data data length invalid\n"); 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; i