604 lines
11 KiB
C
604 lines
11 KiB
C
#include "FreeRTOS.h"
|
|
#include "board.h"
|
|
#include "chip.h"
|
|
#include "ark7116.h"
|
|
|
|
#ifdef VIDEO_DECODER_ARK7116
|
|
|
|
#define ARK7116_RST_GPIO 7
|
|
|
|
PanlstaticPara AV1_staticPara[]=
|
|
{
|
|
//GLOBAL
|
|
{0XFD02,0X00},
|
|
{0XFD0A,0X48},
|
|
{0XFD0B,0X1D},
|
|
{0XFD0C,0X33},
|
|
{0XFD0D,0X20},
|
|
{0XFD0E,0X2C},
|
|
{0XFD0F,0X09},
|
|
{0XFD10,0X01},
|
|
{0XFD11,0XFF},
|
|
{0XFD12,0XFF},
|
|
{0XFD13,0XFF},
|
|
{0XFD14,0X02},
|
|
{0XFD15,0X02},
|
|
{0XFD16,0X02},
|
|
{0XFD1A,0X45},
|
|
{0XFD19,0X0A},
|
|
//PWM
|
|
//DECODER
|
|
{0XFE01,0X06},
|
|
{0XFE02,0X00},
|
|
{0XFE06,0X07},
|
|
{0XFE07,0X80},
|
|
{0XFE08,0X0E},
|
|
{0XFE0C,0X10},
|
|
{0XFE0F,0X07},
|
|
{0XFE13,0X16},
|
|
{0XFE14,0X22},
|
|
{0XFE15,0X05},
|
|
{0XFE26,0X0E},
|
|
{0XFE27,0X00},
|
|
{0XFE48,0X87},
|
|
{0XFE54,0X00},
|
|
{0XFE55,0X01},
|
|
{0XFE63,0XC0},
|
|
{0XFE83,0XFF},
|
|
{0XFED5,0X81},
|
|
{0XFED7,0XF7},
|
|
{0XFEDC,0X00},
|
|
{0XFE44,0X20},
|
|
{0XFE45,0X80},
|
|
{0XFE43,0X80},
|
|
{0XFECB,0X00},
|
|
{0XFE56,0X07},
|
|
{0XFEC9,0X01},
|
|
{0XFE46,0X00},
|
|
{0XFE42,0X00},
|
|
{0XFE19,0X82},
|
|
{0XFE1A,0X50},
|
|
{0XFE1B,0X22},
|
|
{0XFE1C,0X61},
|
|
{0XFE1D,0X70},
|
|
//VP
|
|
{0XFFB0,0X67},
|
|
{0XFFB1,0X0F},
|
|
{0XFFB2,0X10},
|
|
{0XFFB3,0X10},
|
|
{0XFFB4,0X10},
|
|
{0XFFB7,0X10},
|
|
{0XFFB8,0X10},
|
|
{0XFFB9,0X22},
|
|
{0XFFBA,0X20},
|
|
{0XFFBB,0XFF},
|
|
{0XFFBC,0X10},
|
|
{0XFFC7,0X31},
|
|
{0XFFC8,0X03},
|
|
{0XFFC9,0X10},
|
|
{0XFFCB,0X80},
|
|
{0XFFCC,0X80},
|
|
{0XFFCD,0X00},
|
|
{0XFFCE,0X10},
|
|
{0XFFCF,0X80},
|
|
{0XFFD0,0X80},
|
|
{0XFFD2,0X4F},
|
|
{0XFFD3,0X80},
|
|
{0XFFD4,0X80},
|
|
{0XFFD7,0X05},
|
|
{0XFFD8,0X80},
|
|
{0XFFE7,0X50},
|
|
{0XFFE8,0X10},
|
|
{0XFFE9,0X22},
|
|
{0XFFEA,0X20},
|
|
{0XFFF0,0X2F},
|
|
{0XFFF1,0XE1},
|
|
{0XFFF2,0XEE},
|
|
{0XFFF3,0XDC},
|
|
{0XFFF4,0XFD},
|
|
{0XFFF5,0X29},
|
|
{0XFFF6,0XF7},
|
|
{0XFFF7,0X9E},
|
|
{0XFFF8,0X10},
|
|
{0XFFF9,0X3D},
|
|
{0XFFFA,0X4E},
|
|
{0XFFFB,0X81},
|
|
{0XFFD5,0X00},
|
|
{0XFFD6,0X35},
|
|
//TCON
|
|
{0XFC00,0X48},
|
|
{0XFC01,0X00},
|
|
{0XFC02,0X00},
|
|
{0XFC09,0X06},
|
|
{0XFC0A,0X33},
|
|
//SCALE
|
|
{0XFC90,0X42},
|
|
{0XFC91,0X00},
|
|
{0XFC92,0X00},
|
|
{0XFC93,0X0C},
|
|
{0XFC94,0X00},
|
|
{0XFC95,0X00},
|
|
{0XFC96,0XE0},
|
|
{0XFC97,0X03},
|
|
{0XFC98,0X00},
|
|
{0XFC99,0X04},
|
|
{0XFC9A,0X57},
|
|
{0XFC9B,0X03},
|
|
{0XFC9C,0X02},
|
|
{0XFC9D,0X00},
|
|
{0XFC9E,0X06},
|
|
{0XFC9F,0X00},
|
|
{0XFCA0,0X23},
|
|
{0XFCA1,0X00},
|
|
{0XFCA2,0X1D},
|
|
{0XFCA3,0X04},
|
|
{0XFCA4,0X06},
|
|
{0XFCA5,0X00},
|
|
{0XFCA6,0X08},
|
|
{0XFCA7,0X00},
|
|
{0XFCA8,0X0A},
|
|
{0XFCA9,0X00},
|
|
{0XFCAA,0X09},
|
|
{0XFCAB,0X01},
|
|
{0XFCAC,0X12},
|
|
{0XFCAD,0X00},
|
|
{0XFCAE,0X00},
|
|
{0XFCAF,0X00},
|
|
{0XFCB0,0X00},
|
|
{0XFCB1,0X00},
|
|
{0XFCB2,0X00},
|
|
{0XFCB3,0X00},
|
|
{0XFCB4,0X00},
|
|
{0XFCB5,0X00},
|
|
{0XFCB7,0X0E},
|
|
{0XFCB8,0X02},
|
|
{0XFCBB,0X3B},
|
|
{0XFCBC,0X01},
|
|
{0XFCBD,0X00},
|
|
{0XFCBE,0X00},
|
|
{0XFCBF,0X0C},
|
|
{0XFCC0,0X00},
|
|
{0XFCC1,0X00},
|
|
{0XFCC2,0X00},
|
|
{0XFCC3,0X04},
|
|
{0XFCC4,0X00},
|
|
{0XFCC5,0X04},
|
|
{0XFCC6,0X60},
|
|
{0XFCC7,0X03},
|
|
{0XFCC8,0X02},
|
|
{0XFCC9,0X00},
|
|
{0XFCCA,0X06},
|
|
{0XFCCB,0X00},
|
|
{0XFCCC,0X28},
|
|
{0XFCCD,0X00},
|
|
{0XFCCE,0XF8},
|
|
{0XFCCF,0X02},
|
|
{0XFCD1,0X00},
|
|
{0XFCD2,0X15},
|
|
{0XFCD3,0X00},
|
|
{0XFCD4,0X0A},
|
|
{0XFCD5,0X00},
|
|
{0XFCD6,0X2F},
|
|
{0XFCD7,0X01},
|
|
{0XFCD8,0X00},
|
|
{0XFCD9,0X07},
|
|
{0XFCDA,0X00},
|
|
{0XFCDB,0X00},
|
|
{0XFCDC,0X00},
|
|
{0XFCDD,0X14},
|
|
{0XFCDE,0X00},
|
|
{0XFCDF,0X00},
|
|
{0XFCE0,0X00},
|
|
{0XFCE1,0X02},
|
|
{0XFCE3,0X01},
|
|
{0XFCE4,0X02},
|
|
{0XFCE7,0X03},
|
|
{0XFCD0,0X0A},
|
|
{0XFCE2,0X00},
|
|
{0XFCB6,0X00},
|
|
{0XFB35,0X00},
|
|
{0XFB89,0X00},
|
|
//GAMMA
|
|
{0XFF00,0X03},
|
|
{0XFF01,0X0F},
|
|
{0XFF02,0X1E},
|
|
{0XFF03,0X2B},
|
|
{0XFF04,0X36},
|
|
{0XFF05,0X40},
|
|
{0XFF06,0X4B},
|
|
{0XFF07,0X55},
|
|
{0XFF08,0X5F},
|
|
{0XFF09,0X69},
|
|
{0XFF0A,0X73},
|
|
{0XFF0B,0X7D},
|
|
{0XFF0C,0X85},
|
|
{0XFF0D,0X8E},
|
|
{0XFF0E,0X96},
|
|
{0XFF0F,0X9F},
|
|
{0XFF10,0XA7},
|
|
{0XFF11,0XAE},
|
|
{0XFF12,0XB6},
|
|
{0XFF13,0XBD},
|
|
{0XFF14,0XC4},
|
|
{0XFF15,0XCA},
|
|
{0XFF16,0XD1},
|
|
{0XFF17,0XD7},
|
|
{0XFF18,0XDD},
|
|
{0XFF19,0XE3},
|
|
{0XFF1A,0XE8},
|
|
{0XFF1B,0XED},
|
|
{0XFF1C,0XF1},
|
|
{0XFF1D,0XF5},
|
|
{0XFF1E,0XF8},
|
|
{0XFF1F,0XFC},
|
|
{0XFF20,0X0F},
|
|
{0XFF21,0X1E},
|
|
{0XFF22,0X2B},
|
|
{0XFF23,0X36},
|
|
{0XFF24,0X40},
|
|
{0XFF25,0X4B},
|
|
{0XFF26,0X55},
|
|
{0XFF27,0X5F},
|
|
{0XFF28,0X69},
|
|
{0XFF29,0X73},
|
|
{0XFF2A,0X7D},
|
|
{0XFF2B,0X85},
|
|
{0XFF2C,0X8E},
|
|
{0XFF2D,0X96},
|
|
{0XFF2E,0X9F},
|
|
{0XFF2F,0XA7},
|
|
{0XFF30,0XAE},
|
|
{0XFF31,0XB6},
|
|
{0XFF32,0XBD},
|
|
{0XFF33,0XC4},
|
|
{0XFF34,0XCA},
|
|
{0XFF35,0XD1},
|
|
{0XFF36,0XD7},
|
|
{0XFF37,0XDD},
|
|
{0XFF38,0XE3},
|
|
{0XFF39,0XE8},
|
|
{0XFF3A,0XED},
|
|
{0XFF3B,0XF1},
|
|
{0XFF3C,0XF5},
|
|
{0XFF3D,0XF8},
|
|
{0XFF3E,0XFC},
|
|
{0XFF3F,0X0F},
|
|
{0XFF40,0X1E},
|
|
{0XFF41,0X2B},
|
|
{0XFF42,0X36},
|
|
{0XFF43,0X40},
|
|
{0XFF44,0X4B},
|
|
{0XFF45,0X55},
|
|
{0XFF46,0X5F},
|
|
{0XFF47,0X69},
|
|
{0XFF48,0X73},
|
|
{0XFF49,0X7D},
|
|
{0XFF4A,0X85},
|
|
{0XFF4B,0X8E},
|
|
{0XFF4C,0X96},
|
|
{0XFF4D,0X9F},
|
|
{0XFF4E,0XA7},
|
|
{0XFF4F,0XAE},
|
|
{0XFF50,0XB6},
|
|
{0XFF51,0XBD},
|
|
{0XFF52,0XC4},
|
|
{0XFF53,0XCA},
|
|
{0XFF54,0XD1},
|
|
{0XFF55,0XD7},
|
|
{0XFF56,0XDD},
|
|
{0XFF57,0XE3},
|
|
{0XFF58,0XE8},
|
|
{0XFF59,0XED},
|
|
{0XFF5A,0XF1},
|
|
{0XFF5B,0XF5},
|
|
{0XFF5C,0XF8},
|
|
{0XFF5D,0XFC},
|
|
{0XFF5E,0XFF},
|
|
{0XFF5F,0XFF},
|
|
{0XFF60,0XFF},
|
|
};
|
|
|
|
/*点屏 PAD MUX 参数*/
|
|
PanlstaticPara AMT_PadMuxStaticPara[]=
|
|
{
|
|
//PAD MUX
|
|
{0XFD30,0X22},
|
|
{0XFD32,0X11},
|
|
{0XFD33,0X11},
|
|
{0XFD34,0X55},
|
|
{0XFD35,0X55},
|
|
{0XFD36,0X55},
|
|
{0XFD37,0X55},
|
|
{0XFD38,0X55},
|
|
{0XFD39,0X55},
|
|
{0XFD3A,0X11},
|
|
{0XFD3B,0X11},
|
|
{0XFD3C,0X44},
|
|
{0XFD3D,0X44},
|
|
{0XFD3E,0X44},
|
|
{0XFD3F,0X44},
|
|
{0XFD40,0X44},
|
|
{0XFD41,0X44},
|
|
{0XFD44,0X01},
|
|
{0XFD45,0X00},
|
|
{0XFD46,0X00},
|
|
{0XFD47,0X00},
|
|
{0XFD48,0X00},
|
|
{0XFD49,0X00},
|
|
{0XFD4A,0X00},
|
|
{0XFD4B,0X00},
|
|
{0XFD50,0X0B},
|
|
{0XFD51,0X55},
|
|
{0XFD52,0X55},
|
|
{0XFD53,0X57},
|
|
{0XFD54,0X57},
|
|
{0XFD55,0X55},
|
|
{0XFD56,0X55},
|
|
{0XFD57,0X55},
|
|
{0XFD58,0X55},
|
|
{0XFD59,0X5D},
|
|
{0XFD5A,0X55},
|
|
};
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
static int ark7116_i2c_write (struct i2c_adapter *adap, UINT16 RegAddr, unsigned int data)
|
|
{
|
|
struct i2c_msg msg;
|
|
int ret = -1;
|
|
u8 retries = 0;
|
|
u8 buf[2];
|
|
UINT8 ucDeviceAddr;
|
|
UINT8 uctmpDeviceAddr;
|
|
UINT8 ucSubAddr;
|
|
|
|
uctmpDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
|
|
ucSubAddr = (UINT8)(RegAddr&0XFF);
|
|
|
|
switch(uctmpDeviceAddr)
|
|
{
|
|
case 0XF9:
|
|
case 0XFD:
|
|
ucDeviceAddr= 0XB0;
|
|
break;
|
|
|
|
case 0XFA:
|
|
ucDeviceAddr= 0XBE;
|
|
break;
|
|
|
|
case 0XFB:
|
|
ucDeviceAddr= 0XB6;
|
|
break;
|
|
|
|
case 0XFC:
|
|
ucDeviceAddr= 0XB8;
|
|
break;
|
|
|
|
case 0XFE:
|
|
ucDeviceAddr= 0XB2;
|
|
break;
|
|
|
|
case 0XFF:
|
|
ucDeviceAddr= 0XB4;
|
|
break;
|
|
|
|
case 0X00:
|
|
ucDeviceAddr = 0XBE;
|
|
break;
|
|
|
|
default:
|
|
ucDeviceAddr= 0XB0;
|
|
break;
|
|
}
|
|
|
|
|
|
buf[0] = (ucSubAddr);
|
|
buf[1] = (data & 0xFF);
|
|
|
|
msg.flags = !I2C_M_RD;
|
|
msg.addr = (ucDeviceAddr>>1);
|
|
msg.len = sizeof(buf);
|
|
msg.buf = buf;
|
|
//printf("msg.addr is %x\n", msg.addr);
|
|
//printf("msg.ucSubAddr is %x\n",buf[0]);
|
|
//printf("msg.data is %x\n", buf[1]);
|
|
while(retries < 10)
|
|
{
|
|
//printf("retries is %x\n", retries);
|
|
ret = i2c_transfer(adap, &msg, 1);
|
|
//printf("ret is %x\n", ret);
|
|
if (ret == 1)
|
|
break;
|
|
retries++;
|
|
vTaskDelay (20);
|
|
}
|
|
|
|
if (retries >= 10)
|
|
{
|
|
printf("%s timeout11\n", __FUNCTION__);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void ARK7116_reset(void)
|
|
{
|
|
gpio_direction_output(ARK7116_RST_GPIO, 0);
|
|
vTaskDelay(10);
|
|
gpio_direction_output(ARK7116_RST_GPIO, 1);
|
|
vTaskDelay(10);
|
|
gpio_direction_output(ARK7116_RST_GPIO, 0);
|
|
vTaskDelay(10);
|
|
}
|
|
|
|
int ConfigSlaveMode(struct i2c_adapter *adap)
|
|
{
|
|
unsigned char AddrBuff[6] = {0xa1,0xa2,0xa3,0xa4,0xa5,0xa6};
|
|
unsigned char DataBuff[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
|
|
unsigned char i;
|
|
|
|
DataBuff[0] = 0X55;
|
|
DataBuff[1] = 0xAA;
|
|
DataBuff[2] = 0X03;
|
|
DataBuff[3] = 0X50; //slave mode
|
|
DataBuff[4] = 0; // crc val
|
|
DataBuff[5] = DataBuff[2]^DataBuff[3]^DataBuff[4];
|
|
|
|
printf("ConfigSlaveMode\n");
|
|
ark7116_i2c_write(adap,MCU_CFG_ADDR,0X40);
|
|
ark7116_i2c_write(adap,RSTN,0X00);
|
|
ark7116_i2c_write(adap,RSTN,0X5A);
|
|
|
|
if(ark7116_i2c_write(adap,BUS_STATUS_ADDR, 0x00) < 0) //I2c Write Start
|
|
return -1;
|
|
|
|
for(i =0;i < 6;i++)
|
|
{
|
|
if(ark7116_i2c_write(adap,AddrBuff[i], DataBuff[i]) < 0)
|
|
return -1;
|
|
}
|
|
|
|
if(ark7116_i2c_write(adap,BUS_STATUS_ADDR, 0x11) < 0) //I2c Write End
|
|
return -1;
|
|
|
|
vTaskDelay (200);
|
|
return 0;
|
|
}
|
|
|
|
int AMT_WriteStaticPara(struct i2c_adapter *adap,PanlstaticPara * dataPt,UINT16 num)
|
|
{
|
|
struct i2c_msg msg;
|
|
int ret = -1;
|
|
u8 retries = 0;
|
|
u8 buf[2];
|
|
u8 ucDeviceAddr;
|
|
u8 uctmpDeviceAddr;
|
|
u8 ucSubAddr;
|
|
u8 ucRegVal;
|
|
|
|
while(num--)
|
|
{
|
|
uctmpDeviceAddr = (unsigned char)(((*dataPt).addr>>8)&0XFF);
|
|
ucSubAddr = (unsigned char)(((*dataPt).addr)&0XFF);
|
|
ucRegVal = (*dataPt).dat;
|
|
|
|
switch(uctmpDeviceAddr)
|
|
{
|
|
case 0XF9:
|
|
case 0XFD:
|
|
ucDeviceAddr= 0XB0;
|
|
break;
|
|
|
|
case 0XFA:
|
|
ucDeviceAddr= 0XBE;
|
|
break;
|
|
|
|
case 0XFB:
|
|
ucDeviceAddr= 0XB6;
|
|
break;
|
|
|
|
case 0XFC:
|
|
ucDeviceAddr= 0XB8;
|
|
break;
|
|
|
|
case 0XFE:
|
|
ucDeviceAddr= 0XB2;
|
|
break;
|
|
|
|
case 0XFF:
|
|
ucDeviceAddr= 0XB4;
|
|
break;
|
|
|
|
case 0X00:
|
|
ucDeviceAddr = 0XBE;
|
|
break;
|
|
|
|
default:
|
|
ucDeviceAddr= 0XB0;
|
|
break;
|
|
}
|
|
|
|
|
|
buf[0] = (ucSubAddr);
|
|
buf[1] = (ucRegVal & 0xFF);
|
|
|
|
msg.flags = !I2C_M_RD;
|
|
msg.addr = (ucDeviceAddr>>1);
|
|
msg.len = sizeof(buf);
|
|
msg.buf = buf;
|
|
|
|
while(retries < 10)
|
|
{
|
|
ret = i2c_transfer(adap, &msg, 1);
|
|
if (ret == 1)
|
|
break;
|
|
retries++;
|
|
vTaskDelay (20);
|
|
}
|
|
|
|
if (retries >= 10)
|
|
{
|
|
return -1;
|
|
}
|
|
dataPt++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void ConfigStaticPara(struct i2c_adapter *adap)
|
|
{
|
|
//CurretSource = CurretSource;
|
|
AMT_WriteStaticPara(adap,AV1_staticPara,sizeof(AV1_staticPara)/sizeof(AV1_staticPara[0]));
|
|
}
|
|
void ConfigPadMuxPara(struct i2c_adapter *adap)
|
|
{
|
|
AMT_WriteStaticPara(adap,AMT_PadMuxStaticPara,
|
|
sizeof(AMT_PadMuxStaticPara)/sizeof(AMT_PadMuxStaticPara[0]));
|
|
}
|
|
|
|
void InitGlobalPara(struct i2c_adapter *adap) //165
|
|
{
|
|
printf("InitGlobalPara\n");
|
|
ark7116_i2c_write(adap,ENH_PLL,0X20);
|
|
ConfigStaticPara(adap);
|
|
ConfigPadMuxPara(adap);
|
|
|
|
ark7116_i2c_write(adap,0xFD0C,0X33);
|
|
ark7116_i2c_write(adap,0xFD14,0X02);
|
|
//黑屏
|
|
ark7116_i2c_write(adap,0xFFCE,0X00);
|
|
ark7116_i2c_write(adap,0xFFCF,0X80);
|
|
ark7116_i2c_write(adap,0xFFD0,0X80);
|
|
ark7116_i2c_write(adap,ENH_PLL,0X2C);
|
|
#if 1 //20190117 增加每次上电初始化完之后复位decoder
|
|
//复位Decoder
|
|
vTaskDelay (200);
|
|
ark7116_i2c_write(adap,DECODER_RST,0X03);
|
|
vTaskDelay (10);
|
|
ark7116_i2c_write(adap,DECODER_RST,0X02);
|
|
#endif
|
|
}
|
|
|
|
int ark7116_init(void)
|
|
{
|
|
struct i2c_adapter *adap = NULL;
|
|
|
|
if (!(adap = i2c_open("i2c1"))) {
|
|
printf("open i2c1 fail.\n");
|
|
return -1;
|
|
}
|
|
|
|
ARK7116_reset();
|
|
|
|
if(ConfigSlaveMode(adap) < 0)
|
|
return -1;
|
|
|
|
InitGlobalPara(adap);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|