最近使用一块mipi屏驱动,厂家发了上下电序列的程序,但跟设备树里能用的不一样,怎么把这段程序转换成设备树可读的上下电序列?

最近使用一块mipi屏驱动,厂家发了上下电序列的程序,但跟设备树里能用的不一样,怎么把这段程序转换成设备树可读的上下电序列?



/**************************************************/        
// I2C power module controller        
/**************************************************/ 

void DisplayOn()
{
  Set_POWER(1,1,1,1);//1.8V ON, 2.8V ON, 5V ON, BL ON
 
}


//
void PowerOffSequence()
{
    DCS_Short_Write_NP(0x28);
    Delay(200);
    DCS_Short_Write_NP(0x10);
    Delay(100);
    Set_STANDBY();//Video transfer stop
    Delay(50);


    //Delay(10000);  
    //Delay(10000);
    //Delay(10000);




    Set_RESET(1,0);//MIPI RESET 1, LCD RESET 0
    Delay(50);
    Set_RESET(0,0);//MIPI RESET 0, LCD RESET 0
    Delay(50);

    Set_POWER(1,1,0,1);//1.8V ON, 2.8V ON, 5V OFF, BL ON
    Delay(50);

    Set_BOOST(5.00, 5.00, 0x81, 50);//VDD, VEE, OFF:VDD->VEE, 10ms
    Delay(50);

    Set_POWER(1,0,0,1);//1.8V ON, 2.8V OFF, 5V OFF, BL ON
    Delay(100);
    Set_POWER(0,0,0,0);//1.8V OFF, 2.8V OFF, 5V OFF, BL OFF

}

/**************************************************/        
// Read function (Option)        
/**************************************************/ 
//
void ReadOperation()
{
    //Clean memory: BUFFER    
    memset(0);//BUFFER size: 8 Bytes

    //Read value to BUFFER
    DCS_Short_Read_NP(0xDA, 1, BUFFER+0);
    DCS_Short_Read_NP(0xDB, 1, BUFFER+1);
    DCS_Short_Read_NP(0xDC, 1,BUFFER+2);
}


void main()
{

    //Delay(100);
    Set_POWER(1,0,0,0);//1.8V ON, 2.8V OFF, 5V OFF, BL OFF
    Delay(500);

    Set_POWER(1,1,1,0);//1.8V ON, 2.8V ON, 5V ON, BL OFF
    Delay(500);

    Set_BOOST(5.00,5.00,0x01,50);
    Delay(50);

    Set_RESET(1,0);//MIPI RESET 1, LCD RESET 0
    Delay(200);
    Set_RESET(1,1);//MIPI RESET 1, LCD RESET 1
    Delay(200);

    SSD_LANE(4,0);


    /**************************************************/        
    //LCDD (Peripheral) Setting        
      /**************************************************/    
//NV3051F +CTC3.45(ZH035IA-01A)2lane
SSD_SEND(0x01,0xFF,0x30);
SSD_SEND(0x01,0xFF,0x52);
SSD_SEND(0x01,0xFF,0x01);
SSD_SEND(0x01,0xE3,0x00);
SSD_SEND(0x01,0x40,0x0A);
//SSD_SEND(0x01,0x20,0x90);
SSD_SEND(0x01,0x03,0x40);
SSD_SEND(0x01,0x04,0x00);
SSD_SEND(0x01,0x05,0x03);
SSD_SEND(0x01,0x24,0x12);
SSD_SEND(0x01,0x25,0x1E);
SSD_SEND(0x01,0x26,0x6F);
SSD_SEND(0x01,0x27,0x52);
SSD_SEND(0x01,0x28,0x67);
SSD_SEND(0x01,0x29,0x01);
SSD_SEND(0x01,0x2A,0xDF);
SSD_SEND(0x01,0x37,0x9C);
SSD_SEND(0x01,0x38,0xA7);
SSD_SEND(0x01,0x39,0x53);
SSD_SEND(0x01,0x44,0x00);
SSD_SEND(0x01,0x49,0x3C);
SSD_SEND(0x01,0x59,0xFE);
SSD_SEND(0x01,0x5C,0x00);
SSD_SEND(0x01,0x80,0x20);
SSD_SEND(0x01,0x91,0x77);
SSD_SEND(0x01,0x92,0x77);
SSD_SEND(0x01,0xA0,0x55);
SSD_SEND(0x01,0xA1,0x50);
SSD_SEND(0x01,0xA4,0x9C);
SSD_SEND(0x01,0xA7,0x02);
SSD_SEND(0x01,0xA8,0x01);
SSD_SEND(0x01,0xA9,0x01);
SSD_SEND(0x01,0xAA,0xFC);
SSD_SEND(0x01,0xAB,0x28);
SSD_SEND(0x01,0xAC,0x06);
SSD_SEND(0x01,0xAD,0x06);
SSD_SEND(0x01,0xAE,0x06);
SSD_SEND(0x01,0xAF,0x03);
SSD_SEND(0x01,0xB0,0x08);
SSD_SEND(0x01,0xB1,0x26);
SSD_SEND(0x01,0xB2,0x28);
SSD_SEND(0x01,0xB3,0x28);
SSD_SEND(0x01,0xB4,0x33);
SSD_SEND(0x01,0xB5,0x08);
SSD_SEND(0x01,0xB6,0x26);
SSD_SEND(0x01,0xB7,0x08);
SSD_SEND(0x01,0xB8,0x26);
SSD_SEND(0x01,0xFF,0x30);
SSD_SEND(0x01,0xFF,0x52);
SSD_SEND(0x01,0xFF,0x02);
SSD_SEND(0x01,0xB0,0x0B);
SSD_SEND(0x01,0xB1,0x16);
SSD_SEND(0x01,0xB2,0x17);
SSD_SEND(0x01,0xB3,0x2C);
SSD_SEND(0x01,0xB4,0x32);
SSD_SEND(0x01,0xB5,0x3B);
SSD_SEND(0x01,0xB6,0x29);
SSD_SEND(0x01,0xB7,0x40);
SSD_SEND(0x01,0xB8,0x0D);
SSD_SEND(0x01,0xB9,0x05);
SSD_SEND(0x01,0xBA,0x12);
SSD_SEND(0x01,0xBB,0x10);
SSD_SEND(0x01,0xBC,0x12);
SSD_SEND(0x01,0xBD,0x15);
SSD_SEND(0x01,0xBE,0x19);
SSD_SEND(0x01,0xBF,0x0E);
SSD_SEND(0x01,0xC0,0x16);
SSD_SEND(0x01,0xC1,0x0A);
SSD_SEND(0x01,0xD0,0x0C);
SSD_SEND(0x01,0xD1,0x17);
SSD_SEND(0x01,0xD2,0x14);
SSD_SEND(0x01,0xD3,0x2E);
SSD_SEND(0x01,0xD4,0x32);
SSD_SEND(0x01,0xD5,0x3C);
SSD_SEND(0x01,0xD6,0x22);
SSD_SEND(0x01,0xD7,0x3D);
SSD_SEND(0x01,0xD8,0x0D);
SSD_SEND(0x01,0xD9,0x07);
SSD_SEND(0x01,0xDA,0x13);
SSD_SEND(0x01,0xDB,0x13);
SSD_SEND(0x01,0xDC,0x11);
SSD_SEND(0x01,0xDD,0x15);
SSD_SEND(0x01,0xDE,0x19);
SSD_SEND(0x01,0xDF,0x10);
SSD_SEND(0x01,0xE0,0x17);
SSD_SEND(0x01,0xE1,0x0A);
SSD_SEND(0x01,0xFF,0x30);
SSD_SEND(0x01,0xFF,0x52);
SSD_SEND(0x01,0xFF,0x03);
SSD_SEND(0x01,0x00,0x2A);
SSD_SEND(0x01,0x01,0x2A);
SSD_SEND(0x01,0x02,0x2A);
SSD_SEND(0x01,0x03,0x2A);
SSD_SEND(0x01,0x04,0x61);
SSD_SEND(0x01,0x05,0x80);
SSD_SEND(0x01,0x06,0xC7);
SSD_SEND(0x01,0x07,0x01);
SSD_SEND(0x01,0x08,0x82);
SSD_SEND(0x01,0x09,0x83);
SSD_SEND(0x01,0x30,0x2A);
SSD_SEND(0x01,0x31,0x2A);
SSD_SEND(0x01,0x32,0x2A);
SSD_SEND(0x01,0x33,0x2A);
SSD_SEND(0x01,0x34,0xA1);
SSD_SEND(0x01,0x35,0xC5);
SSD_SEND(0x01,0x36,0x80);
SSD_SEND(0x01,0x37,0x23);
SSD_SEND(0x01,0x40,0x82);
SSD_SEND(0x01,0x41,0x83);
SSD_SEND(0x01,0x42,0x80);
SSD_SEND(0x01,0x43,0x81);
SSD_SEND(0x01,0x44,0x55);
SSD_SEND(0x01,0x45,0xE6);
SSD_SEND(0x01,0x46,0xE5);
SSD_SEND(0x01,0x47,0x55);
SSD_SEND(0x01,0x48,0xE8);
SSD_SEND(0x01,0x49,0xE7);
SSD_SEND(0x01,0x50,0x02);
SSD_SEND(0x01,0x51,0x01);
SSD_SEND(0x01,0x52,0x04);
SSD_SEND(0x01,0x53,0x03);
SSD_SEND(0x01,0x54,0x55);
SSD_SEND(0x01,0x55,0xEA);
SSD_SEND(0x01,0x56,0xE9);
SSD_SEND(0x01,0x57,0x55);
SSD_SEND(0x01,0x58,0xEC);
SSD_SEND(0x01,0x59,0xEB);
SSD_SEND(0x01,0x7E,0x02);
SSD_SEND(0x01,0x7F,0x80);
SSD_SEND(0x01,0xE0,0x5A);
SSD_SEND(0x01,0xB1,0x00);
SSD_SEND(0x01,0xB4,0x0E);
SSD_SEND(0x01,0xB5,0x0F);
SSD_SEND(0x01,0xB6,0x04);
SSD_SEND(0x01,0xB7,0x07);
SSD_SEND(0x01,0xB8,0x06);
SSD_SEND(0x01,0xB9,0x05);
SSD_SEND(0x01,0xBA,0x0F);
SSD_SEND(0x01,0xC7,0x00);
SSD_SEND(0x01,0xCA,0x0E);
SSD_SEND(0x01,0xCB,0x0F);
SSD_SEND(0x01,0xCC,0x04);
SSD_SEND(0x01,0xCD,0x07);
SSD_SEND(0x01,0xCE,0x06);
SSD_SEND(0x01,0xCF,0x05);
SSD_SEND(0x01,0xD0,0x0F);
SSD_SEND(0x01,0x81,0x0F);
SSD_SEND(0x01,0x84,0x0E);
SSD_SEND(0x01,0x85,0x0F);
SSD_SEND(0x01,0x86,0x07);
SSD_SEND(0x01,0x87,0x04);
SSD_SEND(0x01,0x88,0x05);
SSD_SEND(0x01,0x89,0x06);
SSD_SEND(0x01,0x8A,0x00);
SSD_SEND(0x01,0x97,0x0F);
SSD_SEND(0x01,0x9A,0x0E);
SSD_SEND(0x01,0x9B,0x0F);
SSD_SEND(0x01,0x9C,0x07);
SSD_SEND(0x01,0x9D,0x04);
SSD_SEND(0x01,0x9E,0x05);
SSD_SEND(0x01,0x9F,0x06);
SSD_SEND(0x01,0xA0,0x00);
SSD_SEND(0x01,0xFF,0x30);
SSD_SEND(0x01,0xFF,0x52);
SSD_SEND(0x01,0xFF,0x02);
SSD_SEND(0x01,0x01,0x01);
SSD_SEND(0x01,0x02,0xDA);
SSD_SEND(0x01,0x03,0xBA);
SSD_SEND(0x01,0x04,0xA8);
SSD_SEND(0x01,0x05,0x9A);
SSD_SEND(0x01,0x06,0x70);
SSD_SEND(0x01,0x07,0xFF);
SSD_SEND(0x01,0x08,0x91);
SSD_SEND(0x01,0x09,0x90);
SSD_SEND(0x01,0x0A,0xFF);
SSD_SEND(0x01,0x0B,0x8F);
SSD_SEND(0x01,0x0C,0x60);
SSD_SEND(0x01,0x0D,0x58);
SSD_SEND(0x01,0x0E,0x48);
SSD_SEND(0x01,0x0F,0x38);
SSD_SEND(0x01,0x10,0x2B);
SSD_SEND(0x01,0xFF,0x30);
SSD_SEND(0x01,0xFF,0x52);
SSD_SEND(0x01,0xFF,0x00);
SSD_SEND(0x01,0x36,0x02);
SSD_SEND(0x01,0x3A,0x70);

DCS_Short_Write_NP(0x11);

 Delay(100);

DCS_Short_Write_NP(0x29);    
Delay(200);
  
SSD_MODE(2,1);

}

  • 看下这篇博客,也许你就懂了,链接:【极简数据结构】快速了解并实现顺序表,速通玩家的最爱
  • 除此之外, 这篇博客: 【极简数据结构】快速了解并实现顺序表,速通玩家的最爱中的 🔱对头插函数和尾插函数的优化 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • SeqListInsert函数可以在任意pos位置插入数据,当然包括了头部和尾部。因此我们可以在头插和尾插函数中复用SeqListInsert函数。真是妙极了!

    头插函数复用SeqListInsert函数

    //顺序表 头插(复用SeqListInsert函数)
    void SeqListPushFront(SL* psl, SLDataType x) 
    {
    	SeqListInsert(psl, 0, x);
    }
    

    尾插函数复用SeqListInsert函数

    //顺序表 尾插(复用SeqListInsert函数
    void SeqListPushBack(SL* psl, SLDataType x) 
    {
    	SeqListInsert(psl, psl->size, x);
    }
    

在设备树中描述上下电序列的方法是通过定义屏幕的供电节点和resets节点,以及定义其属性来实现的。以下是如何将上下电序列转换为设备树中可读的属性:

1.首先,查看屏幕的文档,确定屏幕的电源和reset节点名称,以及需要的属性,如电压、延迟时间等。

2.在设备树中,为电源和reset节点分别定义节点。节点名称可以是任何名称,只要在设备树中唯一即可。

3.为电源和reset节点定义属性,这些属性包括电压、延迟时间等信息。例如:

power-supply {
    compatible = "supply-regulator";
    regulator-name = "panel_vdd";
    regulator-min-microvolt = <1800000>;
    regulator-max-microvolt = <1800000>;
    regulator-always-on;
};

reset {
    compatible = "gpio-reset";
    reset-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
    reset-delay-us = <50000>;
};


4.修改驱动代码,以使用定义的电源和reset节点。这包括使用属性来设置电压、延迟时间等信息,如:

// Turn on the panel power
regulator = devm_regulator_get(&pdev->dev, "panel_vdd");
if (IS_ERR(regulator)) {
    dev_err(&pdev->dev, "failed to get panel_vdd regulator\n");
    return PTR_ERR(regulator);
}

ret = regulator_enable(regulator);
if (ret) {
    dev_err(&pdev->dev, "failed to enable panel_vdd regulator: %d\n", ret);
    return ret;
}

// Reset the panel
gpio_reset = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(gpio_reset)) {
    dev_err(&pdev->dev, "failed to get reset gpio: %ld\n", PTR_ERR(gpio_reset));
    return PTR_ERR(gpio_reset);
}

usleep_range(50000, 100000);
gpiod_set_value_cansleep(gpio_reset, 1);
usleep_range(50000, 100000);
gpiod_set_value_cansleep(gpio_reset, 0);
usleep_range(50000, 100000);


通过这些步骤,将原始的上下电序列转换为设备树中可读的属性,可以让设备树更好地描述屏幕的供电和复位要求,使驱动更易于编写和维护。