• 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("
    
    ");
        }
    }
    
    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
     */
  • 相关阅读:
    正则判断是否为字母数字汉字
    lucene3.0范围查找TermRangeQuery
    【codecombat】 试玩全攻略 第三关幽灵守卫
    【codecombat】 试玩全攻略
    【codecombat】 试玩全攻略 特别关:不祥的征兆
    【codecombat】 试玩全攻略 第一关kithguard地牢
    【codecombat】 试玩全攻略 第四关 真实姓名
    【codecombat】 试玩全攻略 第二关深藏的宝石
    【codecombat】 试玩全攻略 第五关 高举之剑
    python读书笔记
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/5073879.html
Copyright © 2020-2023  润新知