最近使用一块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);
通过这些步骤,将原始的上下电序列转换为设备树中可读的属性,可以让设备树更好地描述屏幕的供电和复位要求,使驱动更易于编写和维护。