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
 */

 

时间: 2024-10-12 15:42:36

I.MX6 Linux mipi配置数据合成的相关文章

I.MX6 Linux I2C device&amp; driver hacking

/******************************************************************************************* * I.MX6 Linux I2C device& driver hacking * 声明: * 1. 本文主要是对Linux I2C驱动进行代码跟踪,主要是为了能够对I2C驱动框架有个全面的了解: * 2. 本文源代码来自myzr_android4_2_2_1_1_0.tar.bz2: * 3. 如果你有兴趣,

Linux网络配置的基础配置

1 linux网络配置介绍 网络是属于内核的功能,给linux的 主机网卡配置地址的时候,地址是属于内核的,而不是网卡 1.1 DNS 解析其他主机的主机名.一般需要两个,另一个备用(备用DNS的使用不是当第一个服务器解析不成功时使用备用,而是当第一个服务器连不上时时才使用,所以一般都是把响应快的放在第一位 1.2 网络接口类型 Loopback本地回环接口,本地回环接口存在的意义:即本机既做服务器端又做客户端时,自己跟自己联系时所用到的,这个数据报文在自身的内存中就能够完成,不用发布到网络 以

linux 路由配置——route命令

使用下面的 route 命令可以查看 Linux 内核路由表. # route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 route 命令的输出项说明 输出项 说明 Destination

如何在 CentOS Linux 中配置 MariaDB 复制

如何在 CentOS Linux 中配置 MariaDB 复制 这是一个创建数据库重复版本的过程.复制过程不仅仅是复制一个数据库,同时也包括从主节点到一个从节点的更改同步.但这并不意味着从数据库就是和主数据库完全相同的副本,因为复制可以配置为只复制表结构.行或者列,这叫做局部复制.复制保证了特定的配置对象在不同的数据库之间保持一致. Mariadb 复制概念 备份 :复制可以用来进行数据库备份.例如,当你做了主->从复制.如果主节点数据丢失(比如硬盘损坏),你可以从从节点中恢复你的数据库. 扩展

IBM SmartCloud init启动时通过使用启动脚本来使用配置数据

IBM SmartCloud init(一个 IBM SmartCloud 支持包)是从开源 cloud-init 包上获得灵感而开发出来的第一个启动脚本.它最初是采用 ICON bundle 的形式在 Image Construction and Composition Tools (ICON) 和 IBM SmartCloud Provisioning 1.2 之间的集成上下文中开发的,后来扩展成为 IBM SmartCloud Provisioning 2.1 中的一个关键组件. IBM

如何在 Linux 上配置点对点 VPN

如何在 Linux 上配置点对点 VPN 一个传统的 VPN(如 OpenVPN.PPTP)由一个 VPN 服务器和一个或多个连接到这台服务器的客户端组成.当任意两个 VPN 客户端彼此通信时,VPN 服务器需要中继它们之间的 VPN 数据流量.这样一个中心辐射型的 VPN 拓扑结构存在的问题是,当连接的客户端增多以后,VPN 服务器很容易成为一个性能上的瓶颈.从某种意义上来说,中心化的 VPN 服务器也同样成为一个单点故障的来源,也就是当 VPN 服务器出现故障的时候,整个 VPN 都将无法被

如何使用 Docker 快速配置数据科学开发环境?

如何使用 Docker 快速配置数据科学开发环境? 数据科学开发环境配置起来让人头疼,会碰到包版本不一致.错误信息不熟悉和编译时间漫长等问题.这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难.而且这也是一个完全不常见的准入门槛. 还好,过去几年中出现了能够通过搭建孤立的环境来解决这个问题的技术.本文中我们就要介绍的这种技术名叫Docker.Docker能让开发者简单.快速地搭建数据科学开发环境,并支持使用例如Jupyter notebooks等工具进行数据探索. 要使用Docker,我

I.MX6 Android 5.1 快速合成系统

/**************************************************************************** * I.MX6 Android 5.1 快速合成系统 * 说明: * Android源代码编译系统是一件很痛苦的事,主要是在修改了一些很小的东西,但 * 要重新编译,要等很久才能编译完,如使用了mmm编译完,只是要打包一下system.img * 就行了,没必要去做那么多检查编译工作,所以这里跟一下系统合成原来,再精简 * 一下,做一个快速合

I.MX6 Linux udev porting

/*********************************************************************** * I.MX6 Linux udev porting * 声明: * 在嵌入式产品上,我们可以使用mdev来解决热插拔的问题,同时也经常看到 * udev,所以尝试来移植一下,但是最终发现她会丢失内核阶段产生的uevent, * 这导致无法生成内核阶段产生的设备节点,目前采用了mdev来做完成内核阶段的 * 设备节点生成,之后使用udev完成热插拔,这