static int init_display(struct fbtft_par *par) { /* turn off sleep mode */ write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE); mdelay(120); /* set pixel format to RGB-565 */ write_reg(par, MIPI_DCS_SET_PIXEL_FORMAT, MIPI_DCS_PIXEL_FMT_16BIT); write_reg(par, PORCTRL, 0x08, 0x08, 0x00, 0x22, 0x22); /* * VGH = 13.26V * VGL = -10.43V */ write_reg(par, GCTRL, 0x35); /* * VDV and VRH register values come from command write * (instead of NVM) */ write_reg(par, VDVVRHEN, 0x01, 0xFF); /* * VAP = 4.1V + (VCOM + VCOM offset + 0.5 * VDV) * VAN = -4.1V + (VCOM + VCOM offset + 0.5 * VDV) */ write_reg(par, VRHS, 0x0B); /* VDV = 0V */ write_reg(par, VDVS, 0x20); /* VCOM = 0.9V */ write_reg(par, VCOMS, 0x20); /* VCOM offset = 0V */ write_reg(par, VCMOFSET, 0x20); /* * AVDD = 6.8V * AVCL = -4.8V * VDS = 2.3V */ write_reg(par, PWCTRL1, 0xA4, 0xA1); write_reg(par, MIPI_DCS_SET_DISPLAY_ON); return 0; }解释一下这段代码
时间: 2024-04-02 13:33:19 浏览: 175
这段代码是用于初始化 LCD 显示参数的函数。在函数中,首先通过发送 MIPI_DCS_EXIT_SLEEP_MODE 命令来唤醒 LCD 显示屏,然后将像素格式设置为 RGB-565,接着设置一些电压值和寄存器值,最后通过发送 MIPI_DCS_SET_DISPLAY_ON 命令将 LCD 显示屏打开。具体来说,PORCTRL 寄存器用于设置 LCD 的时序控制;GCTRL 寄存器用于设置液晶驱动电压;VDVVRHEN 寄存器用于设置 VDV 和 VRH 寄存器值的来源;VRHS 寄存器用于设置 VAP 和 VAN 的电压;VDVS 寄存器用于设置 VDV 的电压;VCOMS 寄存器用于设置 VCOM 的电压;VCMOFSET 寄存器用于设置 VCOM offset 的值;PWCTRL1 寄存器用于设置 AVDD、AVCL 和 VDS 的电压值。
相关问题
static int init_display(struct fbtft_par *par) { // 初始化 LCD 显示参数的函数,传入参数为设备信息结构体指针 write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE); // 发送唤醒命令,将 LCD 显示屏从睡眠模式中唤醒 mdelay(120); // 延时 120 毫秒 write_reg(par, MIPI_DCS_SET_PIXEL_FORMAT, MIPI_DCS_PIXEL_FMT_16BIT); // 设置像素格式为 RGB-565 write_reg(par, PORCTRL, 0x08, 0x08, 0x00, 0x22, 0x22); // 配置 PORCTRL 寄存器,用于设置 LCD 的时序控制 write_reg(par, GCTRL, 0x35); // 配置 GCTRL 寄存器,用于设置液晶驱动电压 write_reg(par, VDVVRHEN, 0x01, 0xFF); // 配置 VDVVRHEN 寄存器,用于设置 VDV 和 VRH 寄存器值的来源 write_reg(par, VRHS, 0x0B); // 配置 VRHS 寄存器,用于设置 VAP 和 VAN 的电压 write_reg(par, VDVS, 0x20); // 配置 VDVS 寄存器,用于设置 VDV 的电压 write_reg(par, VCOMS, 0x20); // 配置 VCOMS 寄存器,用于设置 VCOM 的电压 write_reg(par, VCMOFSET, 0x20); // 配置 VCMOFSET 寄存器,用于设置 VCOM offset 的值 write_reg(par, PWCTRL1, 0xA4, 0xA1); // 配置 PWCTRL1 寄存器,用于设置 AVDD、AVCL 和 VDS 的电压值 write_reg(par, MIPI_DCS_SET_DISPLAY_ON); // 发送打开命令,将 LCD 显示屏打开 return 0; // 返回 0,表示函数执行成功 }我使用这段代码初始化st7789后发现黑色和白色调转了怎么解决
你可以尝试修改像素格式为 RGB-565 反转,即将 MIPI_DCS_PIXEL_FMT_16BIT 改为 MIPI_DCS_PIXEL_FMT_16BIT_REV,代码如下:
```
write_reg(par, MIPI_DCS_SET_PIXEL_FORMAT, MIPI_DCS_PIXEL_FMT_16BIT_REV); // 设置像素格式为 RGB-565 反转
```
如果还是不能解决问题,可能需要检查硬件连接,或者根据具体的 LCD 显示屏型号查找相应的初始化参数进行调整。
int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len) { struct spi_transfer t = { .tx_buf = buf, .len = len, }; struct spi_message m; fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len, "%s(len=%d): ", __func__, len); if (!par->spi) { dev_err(par->info->device, "%s: par->spi is unexpectedly NULL\n", __func__); return -1; } spi_message_init(&m); if (par->txbuf.dma && buf == par->txbuf.buf) { t.tx_dma = par->txbuf.dma; m.is_dma_mapped = 1; } spi_message_add_tail(&t, &m); return spi_sync(par->spi, &m); }逐行注释
// This function is used to write data to the display using SPI communication
int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len) {
// Create a SPI transfer struct with the buffer and length provided
struct spi_transfer t = {
.tx_buf = buf, // Pointer to the transmit buffer
.len = len, // Length of the transmit buffer in bytes
};
// Create a SPI message struct
struct spi_message m;
// Print the buffer contents in hexadecimal format for debugging purposes
fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
"%s(len=%d): ", __func__, len);
// Check if the SPI device pointer is valid
if (!par->spi) {
dev_err(par->info->device,
"%s: par->spi is unexpectedly NULL\n", __func__);
return -1; // Return an error code if the pointer is NULL
}
// Initialize the SPI message struct
spi_message_init(&m);
// If DMA mode is enabled and the buffer pointer is the same as the transmit buffer
if (par->txbuf.dma && buf == par->txbuf.buf) {
t.tx_dma = par->txbuf.dma; // Set the DMA address of the transmit buffer
m.is_dma_mapped = 1; // Set the DMA flag in the SPI message struct
}
// Add the SPI transfer to the SPI message
spi_message_add_tail(&t, &m);
// Synchronously transfer the SPI message using the SPI device
return spi_sync(par->spi, &m);
}
阅读全文