I.MX6 Linux mipi配置数据合成
/*************************************************************************** * I.MX6 Linux mipi配置数据合成 * 声明: * 由于现有mipi配置数据不符合I.MX6的配置参数,需要将该参数进行数据转换, * 而这又涉及到对数据处理简单算法,主要是为了验证转换代码可靠性。 * * 2015-12-24 深圳 南山平山村 曾剑锋 **************************************************************************/ #include <stdio.h> #include <string.h> #include <unistd.h> #define REGFLAG_DELAY 0XFFE #define REGFLAG_END_OF_TABLE 0xFFF // END OF REGISTERS MARKER #define DSI_CMD_BUF_MAXSIZE 32 // 嵌入式产品数据存储可能涉及到的大小端 #define BIG_ENDIAN 1 #define LITTLE_ENDIAN 2 struct LCM_setting_table { unsigned cmd; unsigned char count; unsigned char para_list[64]; }; static struct LCM_setting_table lcm_initialization_setting[] = { {0xB9,3,{0xFF,0x83,0x94}}, //Set MIPI {0xBA,6,{0x63,0x03,0x68,0x6B,0xB2,0xC0}}, //Set Power {0xB1,10,{0x48,0x12,0x72,0x09,0x32,0x44,0x71,0x31,0x4F,0x35}}, //Set Display {0xB2,5,{0x65,0x80,0x64,0x05,0x07}}, //Set CYC {0xB4,30,{0x26,0x76,0x26,0x76,0x26,0x26,0x05,0x10,0x86,0x35,0x00,0x3F,0x26,0x76,0x26,0x76,0x26,0x26,0x05,0x10,0x86,0x3F,0x00,0xFF,0x81,0x81,0x81,0x81,0x08,0x01}}, //Set D3 {0xD3,33,{0x00,0x00,0x0F,0x0F,0x01,0x01,0x10,0x10,0x32,0x10,0x00,0x00,0x00,0x32,0x15,0x04,0x05,0x04,0x32,0x15,0x14,0x05,0x14,0x37,0x33,0x04,0x04,0x37,0x00,0x00,0x47,0x05,0x40}}, //Set GIP {0xD5,44,{0x18,0x18,0x25,0x24,0x27,0x26,0x11,0x10,0x15,0x14,0x13,0x12,0x17,0x16,0x01,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x05,0x04,0x03,0x02,0x07,0x06,0x18,0x18,0x18,0x18,0x21,0x20,0x23,0x22,0x18,0x18,0x18,0x18}}, //Set D6 {0xD6,44,{0x18,0x18,0x22,0x23,0x20,0x21,0x12,0x13,0x16,0x17,0x10,0x11,0x14,0x15,0x06,0x07,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x02,0x03,0x04,0x05,0x00,0x01,0x18,0x18,0x18,0x18,0x26,0x27,0x24,0x25,0x18,0x18,0x18,0x18}}, //Set Gamma {0xE0,58,{0x00,0x03,0x0B,0x0E,0x10,0x13,0x17,0x15,0x2D,0x3D,0x51,0x51,0x5E,0x75,0x7C,0x84,0x94,0x9A,0x98,0xA6,0xB2,0x57,0x57,0x5A,0x60,0x64,0x6A,0x72,0x7F,0x00,0x03,0x0B,0x0E,0x10,0x13,0x17,0x15,0x2D,0x3D,0x51,0x51,0x5E,0x75,0x7C,0x84,0x94,0x9A,0x98,0xA6,0xB2,0x57,0x57,0x5A,0x60,0x64,0x6A,0x72,0x7F}}, //Set VCOM {0xB6,2,{0x34,0x34}}, //Set Panel {0xCC,1,{0x0D}}, //Set C0 {0xC0,2,{0x1F,0x31}}, //Set D2 {0xD2,1,{0x88}}, //Set EMI,0xenhance {0xD4,1,{0x02}}, //Set BD {0xBD,1,{0x01}}, //Set Power {0xB1,1,{0x60}}, //Set BD {0xBD,1,{0x00}}, //Set Power,0xOption,0xHX5186,0xMode {0x11,1, {0}}, {REGFLAG_DELAY, 150, {}}, {0xBF,7,{0x40,0x81,0x50,0x00,0x1A,0xFC,0x01}}, {0x29,1, {0}}, {REGFLAG_DELAY, 50, {}}, {REGFLAG_END_OF_TABLE, 0x00, {}} }; /** * 合成数据 * 1. buf:用于存储合成后的数据; * 2. pare_list:用于合成的数据源,是字节数据; * 3. count:调用当前函数时使用pare_list中的字节数; * 4. endianType:合成数据时采用大端、小端的那种。 */ void compoundData(unsigned int *buf, unsigned char *para_list, int count, int endianType) { unsigned int tmp = 0; int i = 0; for ( i = 0; i < count; i++ ) { tmp <<= 8; switch ( endianType ) { case BIG_ENDIAN : tmp |= para_list[count-i-1]; break; default : tmp |= para_list[i]; break; } } *buf = tmp; } static void push_table(struct LCM_setting_table *table, unsigned int count) { int index = 0; int err; int i, j; unsigned int buf[DSI_CMD_BUF_MAXSIZE] = {0}; for (i = 0; i < count; i++) { printf("%02d | length: %03d |", i, table[i].count); unsigned cmd; cmd = table[i].cmd; switch (cmd) { case REGFLAG_DELAY : usleep(table[i].count); break; case REGFLAG_END_OF_TABLE : break; default: printf(" aliquot: %02d | 0x", (table[i].count)/4); /** * 合成数据,buf是整形,每次合成para_list中4个字节。 * 这部分的是合成能够被整除的那一部分的数据,后面对余下的那一部分再进行合成。 */ for ( j = 0; j < ( (table[i].count)/4 ); j++ ) { index = j * 4; compoundData(buf + j, &(table[i].para_list[index]), 4, LITTLE_ENDIAN); //compoundData(buf + j, &(table[i].para_list[index]), 4, BIG_ENDIAN); //控制输出数据格式。 printf("%08x", buf[j]); } /** * 接下来对4取余的余数进行合成 */ index = j * 4; int remainder = table[i].count - index; if ( remainder != 0 ) { compoundData(buf + j, &(table[i].para_list[index]), table[i].count - index, LITTLE_ENDIAN); //compoundData(buf + j, &(table[i].para_list[index]), table[i].count - index, BIG_ENDIAN); //控制输出数据格式。 switch ( remainder ) { case 1: printf("%02x", buf[j]); break; case 2: printf("%04x", buf[j]); break; case 3: printf("%06x", buf[j]); break; } } // 对buf进行清空,对下次数据合成造成影响。 bzero(buf, DSI_CMD_BUF_MAXSIZE); //memset(buf, 0, DSI_CMD_BUF_MAXSIZE); break; } printf("\n\r"); } } int main( int argc, char** argv ) { push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table)); } /** * 输出结果: * 00 | length: 003 | aliquot: 00 | 0xff8394 * 01 | length: 006 | aliquot: 01 | 0x6303686bb2c0 * 02 | length: 010 | aliquot: 02 | 0x48127209324471314f35 * 03 | length: 005 | aliquot: 01 | 0x6580640507 * 04 | length: 030 | aliquot: 07 | 0x26762676262605108635003f2676267626260510863f00ff818181810801 * 05 | length: 033 | aliquot: 08 | 0x00000f0f0101101032100000003215040504321514051437330404370000470540 * 06 | length: 044 | aliquot: 11 | 0x1818252427261110151413121716010018181818181818181818050403020706181818182120232218181818 * 07 | length: 044 | aliquot: 11 | 0x1818222320211213161710111415060718181818181818181818020304050001181818182627242518181818 * 08 | length: 058 | aliquot: 14 | 0x00030b0e101317152d3d51515e757c84949a98a6b257575a60646a727f00030b0e101317152d3d51515e757c84949a98a6b257575a60646a727f * 09 | length: 002 | aliquot: 00 | 0x3434 * 10 | length: 001 | aliquot: 00 | 0x0d * 11 | length: 002 | aliquot: 00 | 0x1f31 * 12 | length: 001 | aliquot: 00 | 0x88 * 13 | length: 001 | aliquot: 00 | 0x02 * 14 | length: 001 | aliquot: 00 | 0x01 * 15 | length: 001 | aliquot: 00 | 0x60 * 16 | length: 001 | aliquot: 00 | 0x00 * 17 | length: 001 | aliquot: 00 | 0x00 * 18 | length: 150 | * 19 | length: 007 | aliquot: 01 | 0x408150001afc01 * 20 | length: 001 | aliquot: 00 | 0x00 * 21 | length: 050 | * 22 | length: 000 | * * shell returned 23 * * Press ENTER or type command to continue */