| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167 |
- #include "FreeRTOS.h"
- #include "board.h"
- #include "chip.h"
- #include "Ark7116M.h"
- #ifdef VIDEO_DECODER_ARK7116M
- #define ARK7116M_RST_GPIO 110
- #define _ARK7116M_DRV_C_
- #define I2C_ACCESS_LOOP_TIME 20
- #define I2C_NON_ACK 1
- typedef struct _PanlstaticPara
- {
- unsigned int addr;
- unsigned char dat;
- }PanlstaticPara;
- PanlstaticPara Ark7116M_staticPara[]=
- {
- //GLOBAL
- {0XFD02,0X00},
- {0XFD0A,0X30},
- {0XFD0B,0X27},
- {0XFD0C,0X33},
- {0XFD0D,0XE0},
- {0XFD0E,0X2C},
- {0XFD0F,0X06},
- {0XFD10,0X04},
- {0XFD11,0XFF},
- {0XFD12,0XFF},
- {0XFD13,0XFF},
- {0XFD14,0X02},
- {0XFD15,0X02},
- {0XFD16,0X02},
- {0XFD1A,0X45},
- {0XFD19,0X02},
- //DECODER
- {0XFE00,0X80},
- {0XFE01,0X02},
- {0XFE06,0X02},
- {0XFE07,0X80},
- {0XFE0C,0X01},
- {0XFE0F,0X07},
- {0XFE13,0X16},
- {0XFE14,0X22},
- {0XFE15,0X05},
- {0XFE48,0X07},
- {0XFE54,0X40},
- {0XFE55,0X0A},
- {0XFE63,0XC0},
- {0XFE83,0XBF},
- {0XFED5,0XB1},
- {0XFED7,0XF7},
- {0XFEDC,0X00},
- {0XFE44,0X20},
- {0XFE45,0X80},
- {0XFE43,0X80},
- {0XFE56,0X07},
- {0XFEC9,0X01},
- {0XFE46,0X00},
- {0XFE42,0X00},
- {0XFE47,0X8A},
-
- //VP
- {0XFFB0,0X67},
- {0XFFB1,0X0F},
- {0XFFB2,0X10},
- {0XFFB3,0X10},
- {0XFFB4,0X10},
- {0XFFB7,0X10},
- {0XFFB8,0X10},
- {0XFFB9,0X22},
- {0XFFBA,0X20},
- {0XFFBB,0X22},
- {0XFFBC,0X20},
- {0XFFC7,0X31},
- {0XFFC8,0X03},
- {0XFFC9,0X10},
- {0XFFCB,0X80},
- {0XFFCC,0X80},
- {0XFFCD,0X2D},
- {0XFFCE,0X13},
- {0XFFCF,0XDD},
- {0XFFD0,0X72},
- {0XFFD2,0X4F},
- {0XFFD3,0X80},
- {0XFFD4,0X80},
- {0XFFD5,0X00},
- {0XFFD6,0X30},
- {0XFFD7,0X05},
- {0XFFD8,0X80},
- {0XFFE7,0X50},
- {0XFFE8,0X10},
- {0XFFE9,0X22},
- {0XFFEA,0X20},
- {0XFFF0,0X33},
- {0XFFF1,0XE7},
- {0XFFF2,0XE7},
- {0XFFF3,0XE0},
- {0XFFF4,0XFD},
- {0XFFF5,0X33},
- {0XFFF6,0XED},
- {0XFFF7,0XDF},
- {0XFFF8,0XEC},
- {0XFFF9,0XFD},
- {0XFFFA,0X33},
- {0XFFFB,0X81},
- //TCON
- {0XFC00,0X40},
- {0XFC01,0X00},
- {0XFC02,0X00},
- {0XFC09,0X00},
- {0XFC0A,0X00},
- //SCALE
- {0XFC90,0X02},
- {0XFC91,0X00},
- {0XFC92,0X00},
- {0XFC93,0X0C},
- {0XFC94,0X00},
- {0XFC95,0X00},
- {0XFC96,0XFF},
- {0XFC97,0X03},
- {0XFC98,0XFF},
- {0XFC99,0X03},
- {0XFC9A,0X5A},
- {0XFC9B,0X03},
- {0XFC9C,0X01},
- {0XFC9D,0X00},
- {0XFC9E,0X06},
- {0XFC9F,0X00},
- {0XFCA0,0X20},
- {0XFCA1,0X00},
- {0XFCA2,0XF2},
- {0XFCA3,0X02},
- {0XFCA4,0X01},
- {0XFCA5,0X00},
- {0XFCA6,0X03},
- {0XFCA7,0X00},
- {0XFCA8,0X0A},
- {0XFCA9,0X00},
- {0XFCAA,0XFB},
- {0XFCAB,0X00},
- {0XFCAC,0X00},
- {0XFCAD,0X01},
- {0XFCAE,0X00},
- {0XFCAF,0X00},
- {0XFCB0,0X00},
- {0XFCB1,0X14},
- {0XFCB2,0X00},
- {0XFCB3,0X00},
- {0XFCB4,0X00},
- {0XFCB5,0X00},
- {0XFCB7,0X06},
- {0XFCB8,0X01},
- {0XFCBB,0X38},
- {0XFCBC,0X01},
- {0XFCBD,0X00},
- {0XFCBE,0X00},
- {0XFCBF,0X0C},
- {0XFCC0,0X00},
- {0XFCC1,0X00},
- {0XFCC2,0XFF},
- {0XFCC3,0X03},
- {0XFCC4,0XFF},
- {0XFCC5,0X03},
- {0XFCC6,0X60},
- {0XFCC7,0X03},
- {0XFCC8,0X01},
- {0XFCC9,0X00},
- {0XFCCA,0X06},
- {0XFCCB,0X00},
- {0XFCCC,0X20},
- {0XFCCD,0X00},
- {0XFCCE,0XF2},
- {0XFCCF,0X02},
- {0XFCD1,0X00},
- {0XFCD2,0X03},
- {0XFCD3,0X00},
- {0XFCD4,0X0E},
- {0XFCD5,0X00},
- {0XFCD6,0X2F},
- {0XFCD7,0X01},
- {0XFCD8,0X00},
- {0XFCD9,0X08},
- {0XFCDA,0X00},
- {0XFCDB,0X00},
- {0XFCDC,0X00},
- {0XFCDD,0X00},
- {0XFCDE,0X00},
- {0XFCDF,0X00},
- {0XFCE0,0X00},
- {0XFCE1,0X00},
- {0XFCE3,0X11},
- {0XFCE4,0X02},
- {0XFCD0,0X01},
- {0XFCE2,0X03},
- {0XFCB6,0X02},
- {0XFB35,0X00},
- {0XFB89,0X00},
- //PAD MUX
- {0XFD30,0X22},
- {0XFD32,0X00},
- {0XFD33,0X00},
- {0XFD34,0X44},
- {0XFD35,0X40},
- {0XFD36,0X44},
- {0XFD37,0X44},
- {0XFD38,0X44},
- {0XFD39,0X44},
- {0XFD3A,0X00},
- {0XFD3B,0X00},
- {0XFD3C,0X00},
- {0XFD3D,0X00},
- {0XFD3E,0X00},
- {0XFD3F,0X00},
- {0XFD40,0X00},
- {0XFD41,0X00},
- {0XFD44,0X01},
- {0XFD45,0X00},
- {0XFD46,0X00},
- {0XFD47,0X00},
- {0XFD48,0X00},
- {0XFD49,0X00},
- {0XFD4A,0X00},
- {0XFD4B,0X00},
- {0XFD50,0X0B},
- {0XFD51,0X00},
- {0XFD52,0X00},
- {0XFD53,0XFC},
- {0XFD54,0XFF},
- {0XFD55,0XFF},
- {0XFD56,0X03},
- {0XFD57,0X00},
- {0XFD58,0X00},
- {0XFD59,0X00},
- {0XFD5A,0X00},
-
- //GAMMA
- {0XFF00,0X03},
- {0XFF01,0X0C},
- {0XFF02,0X15},
- {0XFF03,0X1D},
- {0XFF04,0X25},
- {0XFF05,0X2D},
- {0XFF06,0X36},
- {0XFF07,0X3E},
- {0XFF08,0X46},
- {0XFF09,0X4E},
- {0XFF0A,0X56},
- {0XFF0B,0X5E},
- {0XFF0C,0X66},
- {0XFF0D,0X6E},
- {0XFF0E,0X76},
- {0XFF0F,0X7D},
- {0XFF10,0X85},
- {0XFF11,0X8C},
- {0XFF12,0X93},
- {0XFF13,0X9B},
- {0XFF14,0XA2},
- {0XFF15,0XA9},
- {0XFF16,0XB0},
- {0XFF17,0XB7},
- {0XFF18,0XBF},
- {0XFF19,0XC6},
- {0XFF1A,0XCE},
- {0XFF1B,0XD6},
- {0XFF1C,0XDE},
- {0XFF1D,0XE6},
- {0XFF1E,0XEE},
- {0XFF1F,0XF7},
- {0XFF20,0X0C},
- {0XFF21,0X15},
- {0XFF22,0X1D},
- {0XFF23,0X25},
- {0XFF24,0X2D},
- {0XFF25,0X36},
- {0XFF26,0X3E},
- {0XFF27,0X46},
- {0XFF28,0X4E},
- {0XFF29,0X56},
- {0XFF2A,0X5E},
- {0XFF2B,0X66},
- {0XFF2C,0X6E},
- {0XFF2D,0X76},
- {0XFF2E,0X7D},
- {0XFF2F,0X85},
- {0XFF30,0X8C},
- {0XFF31,0X93},
- {0XFF32,0X9B},
- {0XFF33,0XA2},
- {0XFF34,0XA9},
- {0XFF35,0XB0},
- {0XFF36,0XB7},
- {0XFF37,0XBF},
- {0XFF38,0XC6},
- {0XFF39,0XCE},
- {0XFF3A,0XD6},
- {0XFF3B,0XDE},
- {0XFF3C,0XE6},
- {0XFF3D,0XEE},
- {0XFF3E,0XF7},
- {0XFF3F,0X0C},
- {0XFF40,0X15},
- {0XFF41,0X1D},
- {0XFF42,0X25},
- {0XFF43,0X2D},
- {0XFF44,0X36},
- {0XFF45,0X3E},
- {0XFF46,0X46},
- {0XFF47,0X4E},
- {0XFF48,0X56},
- {0XFF49,0X5E},
- {0XFF4A,0X66},
- {0XFF4B,0X6E},
- {0XFF4C,0X76},
- {0XFF4D,0X7D},
- {0XFF4E,0X85},
- {0XFF4F,0X8C},
- {0XFF50,0X93},
- {0XFF51,0X9B},
- {0XFF52,0XA2},
- {0XFF53,0XA9},
- {0XFF54,0XB0},
- {0XFF55,0XB7},
- {0XFF56,0XBF},
- {0XFF57,0XC6},
- {0XFF58,0XCE},
- {0XFF59,0XD6},
- {0XFF5A,0XDE},
- {0XFF5B,0XE6},
- {0XFF5C,0XEE},
- {0XFF5D,0XF7},
- {0XFF5E,0XFF},
- {0XFF5F,0XFF},
- {0XFF60,0XFF},
- };
- #define STATIC_NUM 307
- #if 0
- void Ark_WriteReg(UINT RegAddr,UCHAR RegVal)
- {
- UCHAR XDATA ucLoop;
- UCHAR XDATA ucDeviceAddr;
- UCHAR XDATA uctmpDeviceAddr;
- UCHAR XDATA ucSubAddr;
- ucLoop = I2C_ACCESS_LOOP_TIME; /*循环20次等待ACK*/
- uctmpDeviceAddr = (UCHAR)((RegAddr>>8)&0XFF); /*设备地址*/
- ucSubAddr = (UCHAR)(RegAddr&0XFF); /*寄存器地址*/
- switch(uctmpDeviceAddr)
- {
- 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;
- }
- while(ucLoop--)
- {
- I2CStart(); /*I2C开始*/
- I2CWrite(ucDeviceAddr);
- if(ACKCheck()==I2C_NON_ACK) /*没有读到ACK,继续下一次*/
- {
- continue;
- }
-
- I2CWrite(ucSubAddr);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- I2CWrite(RegVal);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- break;
- }
- I2CStop(); /*I2C结束*/
- }
- #else
- static int ark7116M_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 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;
- }
- #endif
- static int i2c_write_byte (struct i2c_adapter *adapter,unsigned int slvaddr, unsigned int addr, char rxdata)
- {
- struct i2c_msg msg;
- int ret = -1;
- u8 retries = 0;
- u8 buf[2];
- u8 data = rxdata;
- buf[0] = (addr & 0xFF);
- buf[1] = (data & 0xFF);
- msg.flags = !I2C_M_RD;
- msg.addr = (unsigned char)(slvaddr >> 1);
- msg.len = sizeof(buf);
- msg.buf = buf;
- while(retries < 5)
- {
- ret = i2c_transfer(adapter, &msg, 1);
- if (ret == 1)
- break;
- retries++;
- }
- if (retries >= 5)
- {
- printf("%s timeout\n", __FUNCTION__);
- return -1;
- }
- return 0;
- }
- static int i2c_read_byte(struct i2c_adapter *adapter,unsigned int slvaddr, unsigned int addr,char *rxdata)
- {
- struct i2c_msg msgs[2];
- int retries = 0;
- int ret = -1;
- u8 buf = addr & 0xFF;
- msgs[0].flags = !I2C_M_RD;
- msgs[0].addr = (unsigned char)(slvaddr >> 1);
- msgs[0].len = 1;
- msgs[0].buf = &buf;
- msgs[1].flags = I2C_M_RD;
- msgs[1].addr = (unsigned char)(slvaddr >> 1);
- msgs[1].len = 1;
- msgs[1].buf = (uint8_t *)rxdata;
- while(retries < 5)
- {
- ret = i2c_transfer(adapter, msgs, 2);
- if(ret == 2)
- break;
- retries++;
- }
- if (retries >= 5)
- {
- printf( "%s timeout\n", __FUNCTION__);
- return 0;
- }
- return msgs[1].len;
- }
- #if 0
- void Ark_WriteStaticPara(PanlstaticPara * dataPt,UINT num)
- {
- UCHAR XDATA ucLoop;
- UCHAR XDATA ucDeviceAddr;
- UCHAR XDATA uctmpDeviceAddr;
- UCHAR XDATA ucSubAddr;
- UCHAR XDATA ucRegVal;
- while(num--)
- {
- ucLoop = I2C_ACCESS_LOOP_TIME;
- uctmpDeviceAddr = (UCHAR)((((*dataPt).addr)>>8)&0XFF);
- ucSubAddr = (UCHAR)(((*dataPt).addr)&0XFF);
- ucRegVal = (*dataPt).dat;
-
- switch(uctmpDeviceAddr)
- {
- 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;
- }
- while(ucLoop--)
- {
- I2CStart();
- Delay(2);
- I2CWrite(ucDeviceAddr);
- Delay(1);
- if(ACKCheck()==I2C_NON_ACK)
- {
- continue;
- }
- I2CWrite(ucSubAddr);
- Delay(1);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- I2CWrite(ucRegVal);
- Delay(1);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- break;
-
- }
- dataPt++;
- }
- I2CStop();
- }
- #else
- int ark7116M_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 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;
- }
- #endif
- unsigned char Ark_ReadReg(struct i2c_adapter *adap,unsigned int RegAddr)
- {
- unsigned char ucLoop;
- unsigned char ucRegVal;
- unsigned char ucDeviceAddr;
- unsigned char uctmpDeviceAddr;
- unsigned char ucSubAddr;
- ucLoop = I2C_ACCESS_LOOP_TIME;
- uctmpDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
- ucSubAddr = (unsigned char)(RegAddr&0XFF);
- switch(uctmpDeviceAddr)
- {
-
- 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;
- }
-
- i2c_read_byte(adap,uctmpDeviceAddr, ucSubAddr,&ucRegVal);
- return(ucRegVal);
- }
- #if 0
- void Ark_mipiRegWrite(UINT RegAddr,UCHAR RegVal)
- {
- UCHAR XDATA ucLoop;
- UCHAR XDATA ucDeviceAddr;
- UCHAR XDATA ucSubAddr;
- ucLoop = I2C_ACCESS_LOOP_TIME; /*循环20次等待ACK*/
- ucDeviceAddr = (UCHAR)((RegAddr>>8)&0XFF); /*设备地址*/
- ucSubAddr = (UCHAR)(RegAddr&0XFF); /*寄存器地址*/
- while(ucLoop--)
- {
- I2CStart(); /*I2C开始*/
- I2CWrite(ucDeviceAddr);
- if(ACKCheck()==I2C_NON_ACK)/*没有读到ACK,继续下一次*/
- {
- continue;
- }
-
- I2CWrite(ucSubAddr);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- I2CWrite(RegVal);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- break;
- }
- I2CStop(); /*I2C结束*/
- }
- #else
- static int Ark_mipiRegWrite (struct i2c_adapter *adap, UINT16 RegAddr, unsigned char 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);
-
- buf[0] = (ucSubAddr);
- buf[1] = (data & 0xFF);
- msg.flags = !I2C_M_RD;
- msg.addr = (uctmpDeviceAddr>>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 < 20)
- {
- //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 >= 20)
- {
- printf("%s timeout11\n", __FUNCTION__);
- return -1;
- }
- return 0;
- }
- #endif
- #if 0
- UCHAR Ark_mipiRegRead(UINT RegAddr)
- {
- UCHAR XDATA ucLoop;
- UCHAR XDATA ucRegVal;
- UCHAR XDATA ucDeviceAddr;
- UCHAR XDATA ucSubAddr;
- ucLoop = I2C_ACCESS_LOOP_TIME;
- ucDeviceAddr = (UCHAR)((RegAddr>>8)&0XFF);
- ucSubAddr = (UCHAR)(RegAddr&0XFF);
- while(ucLoop--)
- {
- I2CStart();
- I2CWrite(ucDeviceAddr);
- if(ACKCheck()==I2C_NON_ACK)
- {
- continue;
- }
- I2CWrite(ucSubAddr);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- I2CStart();
- I2CWrite(ucDeviceAddr|0X01);
- if(ACKCheck()== I2C_NON_ACK)
- {
- continue;
- }
- ucRegVal = I2CRead();
- NACKSend();
- break;
- }
- I2CStop();
- return(ucRegVal);
- }
- #else
- unsigned char Ark_mipiRegRead(struct i2c_adapter *adap,unsigned int RegAddr)
- {
- unsigned char ucLoop;
- unsigned char ucRegVal;
- unsigned char ucDeviceAddr;
- unsigned char ucSubAddr;
- unsigned int retries = 0;
- int ret = -1;
- char data=0;
- ucLoop = I2C_ACCESS_LOOP_TIME;
- ucDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
- ucSubAddr = (unsigned char)(RegAddr&0XFF);
- while(retries < I2C_ACCESS_LOOP_TIME)
- {
- ret = i2c_read_byte(adap,ucDeviceAddr, ucSubAddr,&data);
- if(ret == 1)
- break;
- retries++;
- }
- if(retries >= I2C_ACCESS_LOOP_TIME)
- {
- printf("%s i2c read dev:%x addr:%x error\n",__func__,ucDeviceAddr,ucSubAddr);
- ret = -1;
- }
- if(ret < 0)
- return 0xFF;
- else
- return data;
- }
- #endif
- //void ConfigDecoderStaticPara(void)
- int ConfigDecoderStaticPara(struct i2c_adapter *adap)
- { unsigned char data;
- printf("7116M ConfigDecoderPara\n");
- // Ark_WriteStaticPara(Ark7116M_staticPara,STATIC_NUM);
- ark7116M_WriteStaticPara(adap,Ark7116M_staticPara,STATIC_NUM);
-
- // Ark_WriteReg(0xFEA0,0X03);//DECODER RESET
- ark7116M_i2c_write(adap,0xFEA0,0X03);
- mdelay(50);
- // Ark_WriteReg(0xFEA0,0X02);
- ark7116M_i2c_write(adap,0xFEA0,0X02);
- }
- void Ark7116M_reset(void)
- {
- gpio_direction_output(ARK7116M_RST_GPIO, 1);
- vTaskDelay(10);
- gpio_direction_output(ARK7116M_RST_GPIO, 0);
- vTaskDelay(10);
- }
- void 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("7116M ConfigSlaveMode\n");
- // Ark_WriteReg(0xC6,0X40);
- // Ark_WriteReg(0xAF, 0x00); //I2c Write Start
- ark7116M_i2c_write(adap,0xC6,0X40);
-
- ark7116M_i2c_write(adap,0xAF, 0x00);
- for(i =0;i < 6;i++)
- {
- // Ark_WriteReg(AddrBuff[i], DataBuff[i]);
- ark7116M_i2c_write(adap,AddrBuff[i], DataBuff[i]);
- }
- // Ark_WriteReg(0xAF, 0x11); //I2c Write End
- ark7116M_i2c_write(adap,0xFEA0,0X03);
- vTaskDelay (200);
- }
- void mipiphyreg_write(struct i2c_adapter *adap,unsigned char addr,unsigned char phy)
- {
- printf("mipiphyreg_write \n");
-
- Ark_mipiRegWrite(adap,0xA24D,0x00);
- Ark_mipiRegWrite(adap,0xA24F,0x01);
- Ark_mipiRegWrite(adap,0xA24D,0x02);
- Ark_mipiRegWrite(adap,0xA24E,addr);
- Ark_mipiRegWrite(adap,0xA24D,0x00);
- Ark_mipiRegWrite(adap,0xA24F,0x00);
- Ark_mipiRegWrite(adap,0xA24E,phy);
- Ark_mipiRegWrite(adap,0xA24D,0x02);
- Ark_mipiRegWrite(adap,0xA24D,0x00);
- }
- void Ark7116M_mipi_init(struct i2c_adapter *adap)
- {
- unsigned char phy_status;
- printf("Ark7116m_mipi_init start \n");
- Ark_mipiRegWrite(adap,0xA00F,0x07);
-
- Ark_mipiRegWrite(adap,0xA004,0x01); /*奇偶场标志放入指定行使能*/
-
- Ark_mipiRegWrite(adap,0xA007,0x06);
- Ark_mipiRegWrite(adap,0xA008,0x05);
-
- #if 0 // PAL 720x288
- Ark_mipiRegWrite(0xA009,0x20); /*奇偶场标志所在行设定*/
- Ark_mipiRegWrite(0xA00A,0x01);
- #else // NTSC 720x240
- Ark_mipiRegWrite(adap,0xA009,0xF0); /*奇偶场标志所在行设定*/
- Ark_mipiRegWrite(adap,0xA00A,0x00);
- #endif
-
- Ark_mipiRegWrite(adap,0xA260,0x1E);
- Ark_mipiRegWrite(adap,0xA261,0x00);
- Ark_mipiRegWrite(adap,0xA265,0x00);
- Ark_mipiRegWrite(adap,0xA264,0x02);
- Ark_mipiRegWrite(adap,0xA263,0xD0);
- Ark_mipiRegWrite(adap,0xA26F,0x00);
- Ark_mipiRegWrite(adap,0xA26E,0x00);
- Ark_mipiRegWrite(adap,0xA26D,0x01);
- //Ark_mipiRegWrite(0xA26C,0x38); //PAL
- Ark_mipiRegWrite(adap,0xA26C,0x08); //NTSC
-
- Ark_mipiRegWrite(adap,0xA240,0x00);
- Ark_mipiRegWrite(adap,0xA240,0x04);
- Ark_mipiRegWrite(adap,0xA240,0x05);
- Ark_mipiRegWrite(adap,0xA240,0x07);
- Ark_mipiRegWrite(adap,0xA241,0x00);
- Ark_mipiRegWrite(adap,0xA245,0x02);
- #if 1 // TEST PATTERN COLOR BAR
- Ark_mipiRegWrite(adap,0xA223,0x1E);
- Ark_mipiRegWrite(adap,0xA226,0x02);
- Ark_mipiRegWrite(adap,0xA225,0xD0);
- Ark_mipiRegWrite(adap,0xA227,0x0A);
- Ark_mipiRegWrite(adap,0xA229,0x0A);
- Ark_mipiRegWrite(adap,0xA22C,0x02);
- Ark_mipiRegWrite(adap,0xA22B,0xf8);
- Ark_mipiRegWrite(adap,0xA22D,0x02);
- Ark_mipiRegWrite(adap,0xA22F,0x0A);
- Ark_mipiRegWrite(adap,0xA231,0x0A);
- Ark_mipiRegWrite(adap,0xA233,0xE0);
- Ark_mipiRegWrite(adap,0xA234,0x01);
- Ark_mipiRegWrite(adap,0xA220,0x01);
- #endif
-
- mipiphyreg_write(adap,0xA244,0x06);
- mipiphyreg_write(adap,0xA219,0x30);
- mipiphyreg_write(adap,0xA217,0x02);
- mipiphyreg_write(adap,0xA218,0x17);
- mipiphyreg_write(adap,0xA218,0x80);
- mipiphyreg_write(adap,0xA210,0x89);
- mipiphyreg_write(adap,0xA211,0x12);
- mipiphyreg_write(adap,0xA212,0xC2);
-
- Ark_mipiRegWrite(adap,0xA243,0x00);
- Ark_mipiRegWrite(adap,0xA200,0x01);
-
- while(1)
- {
- mdelay(50);
- phy_status = Ark_mipiRegRead(adap,0xA24B); //phy status
- printf(" phy status = %x\r\n",phy_status);
- if((phy_status & 0x03) == 0x03)
- {
- printf("Ark7116m_mipi_init OK \n");
- break;
- }
- }
-
- mdelay(50);
- Ark_mipiRegWrite(adap,0xA243,0x01);
-
- Ark_mipiRegWrite(adap,0xA003,0x01); // Data EN
- printf("0xA003>>>>>0x%x\n",Ark_mipiRegRead(adap,0xA003));
-
- }
- unsigned char ARK7116M_ResolutionDetect(struct i2c_adapter *adap)
- {
- unsigned char video_format = 0;
- unsigned char Camera_Video_Format = 0xff;
-
- video_format = Ark_ReadReg(adap,0xFE2A);
- if((video_format&07) == 0x00)
- {
- Camera_Video_Format = PAL;
- }else if((video_format&07) == 0x01){
- Camera_Video_Format = NTSC;
- }else{
- Camera_Video_Format = NULL_SYS;
- }
- return Camera_Video_Format;
- }
- void InitArk7116MChip(struct i2c_adapter *adap)
- {
-
- printf("InitArk7116MChip start\n");
-
- Ark7116M_reset(); // 110脚 硬件复位
- ConfigSlaveMode(adap); // 配置从模式
- ConfigDecoderStaticPara(adap); // 配置静态参数
-
- Ark7116M_mipi_init(adap); // 初始化mipi 模块
-
- printf("InitArk7116Chip end\n");
-
- }
- int ark7116M_init(void)
- {
- struct i2c_adapter *adap = NULL;
- if (!(adap = i2c_open("i2c0"))) {
- printf("open i2c0 fail.\n");
- return -1;
- }
-
- InitArk7116MChip(adap);
- return 0;
- }
- #endif
|