La guía de depuración de la pantalla LCD Allwinner Tina Linux admite MIPI DSI RGB LVDS I8080 SPI y otras interfaces, y la placa de desarrollo es compatible con Baiwen.com T113 D1-H Nezha DongshanPI-D1s V853

imagen-20221123145359081
imagen-20221123145359081
imagen-20221123145359081
imagen-20221123145359081
imagen-20221123145359081

1. Información general

  • Propósito de la redacción
    Este documento presentará el método de depuración de LCD en el módulo Display Engine de la plataforma Sunxi.
  1. Métodos de depuración de LCD y métodos de depuración.
  2. Escritura del controlador LCD.
  3. Explicación de cada atributo bajo el nodo lcd0.
  4. Configuración típica de la interfaz LCD.

Ámbito de aplicación: configuración de parámetros de pantalla LCD en la plataforma sunxi DE1.0/DE2.0.

2 Introducción a términos relacionados

Tabla 2-1: Términos relacionados con LCD
el término explicar
SUNXI Serie Allwinner de plataformas de hardware SoC
LCD Pantalla de cristal líquido
MIPI Interfaz de procesador de la industria móvil
DSI Mostrar interfaz serie, mostrar interfaz serie
I8080 Interfaz Intel 8080LCD
RGB Esto se refiere a una interfaz LCD que envía componentes RGB sin ninguna codificación.
LVDS Señalización diferencial de bajo voltaje Una interfaz LCD caracterizada por transmisión diferencial y de bajo voltaje

3 especificaciones de circuitos integrados

Especificaciones relacionadas con la interfaz LCD:

  1. Admite pantalla dual y pantalla diferencial. Es decir, el contenido de la pantalla puede ser diferente, la resolución de la pantalla puede ser diferente y la interfaz de la pantalla también puede ser diferente.

  2. Admite interfaz MIPI-DSI, cantidad uno. La resolución máxima admitida es 1920x1200@60, el ancho y el alto no deben exceder los 2048 y el reloj de píxeles no debe exceder los 180MHz.

  3. Admite interfaz RGB, cantidad 2. Entre ellos, la pantalla principal admite RGB666 paralelo y la pantalla secundaria admite RGB888 en paralelo. La interfaz RGB paralela admite una resolución máxima de 1920x1200 @ 60, y el ancho y alto no deben exceder 2048, como

Se admiten relojes Prime que no superen los 180 MHz. O dos interfaces RGB en serie, la resolución máxima de RGB en serie no supera 800*480@60

  1. Admite dos interfaces LVDS de doble enlace, que admiten una resolución máxima de 1920 x 1200 @ 60, un ancho y alto que no superan los 2048 y un reloj de píxeles que no supera los 180 MHz. O 4 conexiones LVDS de enlace único

puerto, la resolución admite hasta 1366*768@60.

  1. Dos interfaces I8080. La resolución admite hasta 800*480@60.

  2. La interfaz LVDS admite la visualización simultánea de señales. Cada dos interfaces LVDS de enlace único deben conectarse a la misma pantalla con la misma interfaz LVDS, y se enviarán los mismos datos a las dos pantallas para garantizar la misma señal. entonces

Teóricamente el T509 puede lograr 4 pantallas, de las cuales las dos primeras y las dos últimas pueden tener diferentes resoluciones, las resoluciones entre las dos deben ser iguales y deben estar conectadas a la misma pantalla LCD.

ilustrar

En un escenario de múltiples pantallas, las interfaces anteriores se pueden combinar libremente, excepto que se debe usar MIPI-DSI en la pantalla principal.

Habilidad

Una interfaz LVDS de doble enlace tiene un total de 20 líneas. Se puede dividir en dos interfaces LVDS de enlace único, asumiendo lvds0 y lvds1. Al seleccionar un enlace único para visualización, se debe seleccionar lvds0.

4 Introducción al módulo

4.1 Pasos para agregar el controlador de pantalla

  1. Para Linux 4.9 y versiones inferiores, es necesario modificar un total de tres lugares (es decir, los primeros tres elementos a continuación). Para Linux 5.4, es necesario modificar cuatro lugares. Para obtener más detalles, consulte la ubicación del código fuente del controlador de pantalla. .

• Repositorio de código fuente de Linux.

• Repositorio de código fuente de uboot. También hay controladores de pantalla en uboot, cuyo propósito es mostrar el logotipo.

• Almacén de configuración dts a nivel de placa. El propósito es configurar algunos parámetros de configuración LCD comunes a través de board.dts. Para Linux 4.9, esta configuración tiene efecto tanto en el kernel como en uboot. Para Linux-5.4, consulte el siguiente artículo.

• Para Linux5.4, es necesario configurar un almacén de configuración dts a nivel de placa específico de uboot adicional.

  1. Asegúrese de que la configuración del kernel del marco de visualización Allwinner esté habilitada; consulte las instrucciones de configuración de menuconfig.

  2. Prepare los siguientes materiales e información con anticipación:

• Manual de pantalla. Describe principalmente la información básica y características eléctricas de la pantalla, etc., y la solicita al fabricante de la pantalla.

• Manual del controlador IC. Describe principalmente la información detallada de la pantalla IC. Aquí principalmente se explica detalladamente cada comando, lo cual es útil para nuestra inicialización y personalización, solicítelo al fabricante de la pantalla.

• Información de sincronización de pantalla. Por favor, solicítelo al fabricante de la pantalla. Consulte la descripción del parámetro de sincronización de pantalla para obtener más información.

• Código de inicialización de pantalla. , consulte al fabricante de la pantalla. Generalmente, las pantallas DSI e I8080 requieren comandos de inicialización para inicializar la pantalla.

• Multímetro. Ajustar la pantalla no puede evitar medir voltajes relevantes.

  1. Antes de agregar el controlador de pantalla, primero debe comprenderlo. Consulte el desglose del controlador de pantalla.

  2. Localice el tipo de pantalla a través de la información del paso 3 y luego seleccione un controlador de pantalla existente del mismo tipo como plantilla para agregar el controlador de pantalla o modificarlo directamente.

  3. Modifique panel.c y panel.h en el directorio del controlador de pantalla. Agregue el puntero variable que acaba de agregar strcut_lcd_panel a la variable de estructura global panel_array. Se agregó el sonido strcut lcd_panel en panel.h

brillante.

  1. Modifique el Makefile. Agregue el controlador de pantalla .o que acaba de agregar a disp-objs en el archivo Makefile en el nivel superior del directorio del controlador de pantalla LCD.

  2. Modifique lcd0 en board.dts. Puede consultar la interfaz RGB, la interfaz MIPI-DSI, la interfaz I8080 y la interfaz LVDS, que presenta las configuraciones típicas de varias interfaces. Descripción de los parámetros de hardware, este capítulo contiene todas las secciones lcd0

Haga clic en las propiedades configurables para obtener una explicación detallada.

  1. Compile uboot, kernel, paquete y programa. Tenga en cuenta que los diferentes SDK tienen diferentes métodos de compilación y algunos SDK no compilan uboot de forma predeterminada.
  2. depurar. A través de métodos de depuración, podemos localizar inicialmente el problema y existen preguntas frecuentes que también son útiles para el ajuste de la pantalla.

4.2 Instrucciones del controlador de pantalla

4.2.1 Ubicación del código fuente del controlador de pantalla

Núcleo de la versión Linux 3.4:

linux3-4/drivers/video/sunxi/disp2/disp/lcd/

Núcleo de la versión Linux 3.10:

linux3-10/drivers/video/sunxi/disp2/disp/lcd/

Kernel Linux versión 4.9 y superior:

linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/

uboot-2014:

brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd

uboot-2018:

brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd

Configuración a nivel de placa, donde "modelo de chip", como R818, y "nombre de placa", como demostración, reemplácelo de acuerdo con la situación real.

dispositivo/config/chips/modelo de chip/configs/nombre de la placa/board.dts

Configuración a nivel de placa Uboot utilizada para Linux5.4:

dispositivo/config/chips/modelo de chip/configs/nombre de la placa/uboot-board.dts

Configuración a nivel de placa del kernel utilizada para Linux 5.4:

dispositivo/config/chips/modelo de chip/configs/nombre de la placa/linux-5.4/board.dts

4.2.2 instrucciones de configuración de menuconfig

Los códigos relacionados con la pantalla LCD se incluyen en el módulo del controlador disp. Ingrese al directorio raíz del kernel y ejecute make ARCH=arm menuconfig o make ARCH=arm64 menuconfig (plataforma de 64 bits) para ingresar a la interfaz de configuración principal.

fideos. y sigue estos pasos:

Plataformas correspondientes DE1.0: R6 (linux-3.10), R16 (linux-3.4).

Plataformas correspondientes DE2.0: excepto R6 y R16.

imagen-20221129102051729

Figura 4-1: Diagrama de configuración de menuconfig DE1.0

imagen-20221129102107009

Figura 4-2: Diagrama de configuración de configuración del menú DE2.0

Tomando R40 como ejemplo, el directorio de configuración específico es: Controladores de dispositivo->Soporte de gráficos->Soporte para dispositivos frame buffer->Soporte de video para sunxi -> Soporte de controlador DISP (sunxi-disp2).

4.2.3 Descomposición del controlador de pantalla

En la ubicación del código fuente del controlador de pantalla, se divide principalmente en cuatro tipos de archivos:

  1. panel.c y panel.h, cuando el usuario agrega un nuevo controlador de pantalla, estos dos archivos deben modificarse y la variable de estructura de pantalla debe agregarse a la variable de estructura global panel_array.

  2. lcd_source.c y lcd_source.h, estos dos archivos implementan las interfaces de funciones utilizadas por el controlador de pantalla, como el interruptor de encendido, gpio, interfaz de lectura y escritura dsi, etc. Los usuarios no necesitan modificarlos, solo necesitan usarlos. .

  3. controlador de pantalla. Además de los archivos fuente mencionados anteriormente, generalmente un archivo c y un archivo h representan un controlador de pantalla.

  4. En el nivel superior de la ubicación del código fuente del controlador de pantalla, hay un archivo Makefile que el usuario debe modificar.

Podemos abrir drivers/video/fbdev/sunxi/disp2/disp/lcd/default_panel.c como ejemplo del controlador de pantalla al final del archivo.

struct __lcd_panel default_panel = {
    /* panel driver name, must mach the lcd_drv_name in board.dts */
    .name = "default_lcd",
        .func = {
        .cfg_panel_info = LCD_cfg_panel_info,
        .cfg_open_flow = LCD_open_flow,
        .cfg_close_flow = LCD_close_flow,
        }
    ,
};

El nombre de miembro de la variable global default_panel debe ser coherente con lcd_driver_name, lo que está relacionado con si el controlador puede encontrar el archivo especificado.

Lo siguiente es la inicialización del miembro func, donde se implementan principalmente tres funciones de devolución de llamada. LCD_cfg_panel_info, LCD_open_flow y LCD_close_flow.

El proceso de encender y apagar la pantalla es el proceso de encender y apagar la pantalla, que es la secuencia de encendido y la secuencia de apagado en el manual de la pantalla o el manual del controlador IC.

El proceso de operación para cambiar la pantalla se muestra en la siguiente figura.

Entre ellas, LCD_open_flow y LCD_close_flow se denominan funciones de proceso de cambio de pantalla, y las funciones en el cuadro, como LCD_power_on, se denominan funciones de paso de cambio de pantalla.

Para pantallas LCD que no requieren operaciones de inicialización, como pantallas lvds, pantallas RGB, etc., las funciones LCD_panel_init y LCD_panel_exit pueden estar vacías.

imagen-20221129102353374

Figura 4-3: Proceso de cambio de pantalla LCD

Función: LCD_open_flow

Función: La función LCD_open_flow solo se llamará una vez durante la inicialización del sistema. Ejecutar cada LCD_OPEN_FUNC significa registrar la función de paso de apertura de pantalla correspondiente. Regístrese primero y ejecute primero, pero no se ejecuta inmediatamente.

Ejecute la función de paso de apertura de pantalla.

prototipo:

static s32 LCD_open_flow(u32 sel)

Las funciones comúnmente utilizadas son:

static __s32 LCD_open_flow(__u32 sel)
{
    LCD_OPEN_FUNC(sel, LCD_power_on,10);
    LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
    LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 100);
    LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
    return 0;
}

Como arriba, llamar a LCD_OPEN_FUNC cuatro veces registra cuatro funciones de devolución de llamada, correspondientes a cuatro procesos de apertura de pantalla. Regístrese primero y ejecute primero. De hecho, corresponde al usuario decidir cuántas funciones registrar, siempre que sea razonable.

  1. LCD_power_on significa encender la fuente de alimentación de la pantalla LCD y luego retrasarla durante 10 ms; este paso se usa generalmente para encender la fuente de alimentación relacionada con la pantalla LCD y los pines relacionados, como el pin de reinicio. Aquí, generalmente se utilizan la descripción de la función de control de potencia y el control de pines.

Descripción de la función a operar.

  1. LCD_panel_init es la pantalla de inicialización, y luego se retrasa 50 ms; para las pantallas que no requieren inicialización, este paso se puede omitir. Esta función generalmente se usa para enviar comandos de inicialización a la pantalla para la inicialización de la pantalla. Si es una pantalla DSI, mira la fase DSI.

Con respecto a la descripción de la función, si es una pantalla I8080, use la descripción de la función de la interfaz I8080. Si se trata de otras situaciones como i2c o spi, puede usar la inicialización de la interfaz serial iic/spi, o puede usar GPIO para simular.

  1. sunxi_lcd_tcon_enable activa TCON y retrasa 100 ms; este paso es fijo y significa comenzar a enviar señales de imagen.

  2. LCD_bl_open enciende la luz de fondo y luego retrasa 0 ms. Encienda la luz de fondo después de completar los primeros tres pasos, para que no vea parpadeos. Consulte la descripción de la función de control de retroiluminación para conocer las funciones que se utilizan generalmente aquí.

Como se muestra a continuación, este es un diagrama de secuencia de encendido típico en el manual de pantalla. Cuando escribimos el controlador de pantalla, también debemos prestar atención al retraso.

imagen-20221129102545133

Figura 4-4: encendido

Función: LCD_OPEN_FUNC

Función: Registre la función del paso de apertura de pantalla en el proceso de apertura de pantalla. Recuerde, esto es registro, no ejecución.

prototipo:

void LCD_OPEN_FUNC(__u32 sel, LCD_FUNC func, __u32 delay)

Descripción de parámetros:

func es un puntero de función, su tipo es: void (*LCD_FUNC) (__u32 sel) Las funciones definidas por el usuario también deben usar una forma unificada. Por ejemplo:

void user_defined_func(__u32 sel)
{
    //do something
}

El retraso es el tiempo de retraso después de ejecutar este paso, la unidad de tiempo es milisegundos.

El segundo parámetro de LCD_OPEN_FUNC es la duración del retardo de los dos pasos antes y después, la unidad es ms. Tenga en cuenta que el valor aquí debe completarse de acuerdo con las regulaciones del manual de la pantalla. Completar aleatoriamente puede causar una inicialización anormal de la pantalla o El tiempo de cambio de pantalla expirará.

largo, afectando la experiencia del usuario.

Correspondiente a LCD_open_flow es LCD_close_flow, que se utiliza para registrar la función de cierre de pantalla. Utilice LCD_CLOSE_FUNC para registrar la función. Regístrese primero y ejecute primero. Aquí, la función de devolución de llamada solo se registra y no se ejecuta inmediatamente.

DE ACUERDO.

static s32 LCD_close_flow(u32 sel)
{
    /* close lcd backlight, and delay 0ms */
    LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);
    /* close lcd controller, and delay 0ms */
    LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 50);
    /* open lcd power, than delay 200ms */
    LCD_CLOSE_FUNC(sel, LCD_panel_exit, 100);
    /* close lcd power, and delay 500ms */
    LCD_CLOSE_FUNC(sel, LCD_power_off, 0);
    return 0;
}
  1. Primero apague la luz de fondo, para que el usuario no vea el proceso de parpadeo durante todo el proceso de apagado de la pantalla.

  2. Es necesario cerrar TCON, lo que significa dejar de enviar datos. Retraso otros 50 ms.

  3. Ejecute el código de apagado de la pantalla y espere 200 ms (este paso se puede omitir para las pantallas que no requieren inicialización).

  4. Finalmente apague la alimentación y retrase 0 ms.

La siguiente figura es un diagrama típico de sincronización de pantalla apagada.

imagen-20221129102917140

Figura 4-5: apagado

Función: LCD_cfg_panel_info

Función: Parámetros extendidos de TCON configurados, como la función gamma y la función de mapeo de color.

prototipo:

static void LCD_cfg_panel_info(__panel_extend_para_t * info)

Los parámetros extendidos de TCON solo se pueden configurar en el archivo de pantalla. Para la definición de los parámetros, consulte los parámetros relacionados con el efecto de visualización.

Si se requiere corrección de gamma o mapeo de color, establezca el parámetro de habilitación del módulo correspondiente en 1 en board.dts, lcd_gamma_en, lcd_cmap_en, y complete 3 tablas de coeficientes, lcd_gamma_tbl,

lcd_cmap_tbl, la parte del código se muestra a continuación. Nota: gamma, la plantilla proporciona 18 valores de puntos de inflexión y luego interpola todos los valores (255). Si crees que no está lo suficientemente detallado, puedes agregarlo a la tabla correspondiente.

niño. El tamaño de cmap_tbl es fijo y el tamaño de la tabla no se puede reducir ni aumentar.

La entrada final de la tabla gamma generada se compone de tres valores gamma, rgb, cada uno de los cuales ocupa 8 bits. En la plantilla proporcionada actualmente, los tres valores gamma son iguales.

static void LCD_cfg_panel_info(struct panel_extend_para *info)
{
    u32 i = 0, j = 0;
    u32 items;
    u8 lcd_gamma_tbl[][2] = {
        /* {input value, corrected value} */
        {0, 0},
        {15, 15},
        {30, 30},
        {45, 45},
        {60, 60},
        {75, 75},
        {90, 90},
        {105, 105},
        {120, 120},
        {135, 135},
        {150, 150},
        {165, 165},
        {180, 180},
        {195, 195},
        {210, 210},
        {225, 225},
        {240, 240},
        {255, 255},
    };
    u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
        {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
        {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
        },
        {
        {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
        {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
        {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
        },
    };
    items = sizeof(lcd_gamma_tbl) / 2;
    for (i = 0; i < items - 1; i++) {
    	u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
        for (j = 0; j < num; j++) {
            u32 value = 0;
            value =
            lcd_gamma_tbl[i][1] +
            ((lcd_gamma_tbl[i + 1][1] -
            lcd_gamma_tbl[i][1]) * j) / num;
            info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
            (value << 16) + (value << 8) + value;
        }
    }
    info->lcd_gamma_tbl[255] =
        (lcd_gamma_tbl[items - 1][1] << 16) +
        (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
    memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
}
4.2.4 Descripción de la función de retardo

Nombre: sunxi_lcd_delay_ms / sunxi_lcd_delay_us

Función: Función de retardo, respectivamente nivel de milisegundos/retardo de nivel de microsegundos.

Ejemplo: s32 sunxi_lcd_delay_ms(u32 ms) / s32 sunxi_lcd_delay_us(u32 us)

4.2.5 Descripción de la función de habilitación de datos de imagen

Nombre: sunxi_lcd_tcon_enable / sunxi_lcd_tcon_disable

Función: Encienda el controlador LCD y comience a actualizar la pantalla LCD. Apague el controlador LCD y deje de actualizar los datos.

Ejemplo:void sunxi_lcd_tcon_enable(u32 screen_id)

anular sunxi_lcd_tcon_disable (u32 screen_id)

4.2.6 Descripción de la función de control de retroiluminación

Ejemplo: sunxi_lcd_backlight_enable / sunxi_lcd_backlight_disable

Función: enciende/apaga la luz de fondo, operando el gpio configurado por lcd_bl en board.dts. Ver lcd_bl_en.

Ejemplo:void sunxi_lcd_backlight_enable(u32 screen_id)

void sunxi_lcd_backlight_disable (u32 screen_id)

Nombre: sunxi_lcd_pwm_enable / sunxi_lcd_pwm_disable

Función: enciende/apaga el controlador pwm. Cuando se enciende, el pwm emitirá la forma de onda pwm. Correspondiente al pwm correspondiente a lcd_pwm_ch.

Ejemplo: s32 sunxi_lcd_pwm_enable (u32 screen_id)

s32 sunxi_lcd_pwm_disable (u32 screen_id)

4.2.7 Descripción de la función de control de potencia

Nombre: sunxi_lcd_power_enable / sunxi_lcd_power_disable

Función: Enciende/apaga la alimentación de la pantalla LCD, la operación es lcd_power/lcd_power1/lcd_power2 en board.dts (pwr_id identifica el índice de potencia).

Ejemplo: void sunxi_lcd_power_enable(u32 screen_id, u32 pwr_id)

anular sunxi_lcd_power_disable (u32 screen_id, u32 pwr_id)

  1. pwr_id = 0: corresponde a lcd_power en board.dts.
  2. pwr_id = 1: corresponde a lcd_power1 en board.dts.
  3. pwr_id = 2: corresponde a lcd_power2 en board.dts.
  4. pwr_id = 3: corresponde a lcd_power3 en board.dts.

Función: sunxi_lcd_pin_cfg

Función: Configurar LCD IO.

Ejemplo: s32 sunxi_lcd_pin_cfg (u32 screen_id, u32 bon)

Descripción: Configure los pines data/clk y otros pines del lcd, correspondientes a lcdd0-lcdd23/lcddclk/lcdde/lcdhsync/lcdvsync en board.dts.

Dado que dsi es un pin dedicado, la pantalla de la interfaz dsi no necesita configurar este conjunto de pines en board.dts, pero los pines correspondientes también se activarán y desactivarán en esta interfaz de función.

Bon: 1: significa activado, 0: significa configurado para desactivar el estado.

4.2.8 Descripción de funciones relacionadas con DSI

La mayoría de las pantallas MIPI DSI deben inicializarse, utilizando el modo LP del canal DSI-D0 para la inicialización. Las funciones de interfaz proporcionadas se describen a continuación:

Nombre: sunxi_lcd_dsi_clk_enable / sunxi_lcd_dsi_clk_disble

Función: Sólo se utiliza en la pantalla de la interfaz dsi. Habilita/deshabilita la salida de señal de reloj de alta velocidad de dsi. Debe llamarse durante la inicialización.

Ejemplo: s32 sunxi_lcd_dsi_clk_enable(u32 scree_id)

s32 sunxi_lcd_dsi_clk_disable (u32 scree_id)

Función: sunxi_lcd_dsi_dcs_wr

Función: operación de escritura dcs en la pantalla.

Ejemplo:__s32 sunxi_lcd_dsi_dcs_wr(__u32 sel,__u8 cmd,__u8* para_p,__u32 para_num)

Descripción de parámetros:

• cmd: dcs escribe el contenido del comando.

• para_p: dirección inicial del parámetro del comando de escritura dcs.

• para_num: el número de parámetros para el comando de escritura dcs, en bytes.

Función: sunxi_lcd_dsi_dcs_wr_2para

Función: operación de escritura dcs en la pantalla.Este comando toma dos parámetros.

Ejemplo:__s32 sunxi_lcd_dsi_dcs_wr_2para(__u32 sel,__u8 cmd,__u8 para1,__u8 para2)

Descripción de parámetros:

• cmd: dcs escribe el contenido del comando.

• para1: El contenido del primer parámetro del comando de escritura dcs.

• para2: El contenido del segundo parámetro del comando de escritura dcs.

sunxi_dsi_dcs_wr_0para,sunxi_dsi_dcs_wr_1para,sunxi_dsi_dcs_wr_3para,sunxi_dsi_dcs_wr_4para,

La definición de sunxi_dsi_dcs_wr_5para es similar a la de dsi_dcs_wr_2para, la diferencia es la cantidad de parámetros.

Función: sunxi_lcd_dsi_dcs_read

Función: operación de lectura dsi.

Ejemplo: s32 sunxi_lcd_dsi_dcs_read(u32 sel, u8 cmd, u8 resultado, u32 num_p)

Descripción de parámetros:

• sel, mostrar identificación.

• cmd, el registro a leer.

• resultado, una matriz utilizada para almacenar la interfaz de lectura. El usuario debe asegurarse de que haya suficiente espacio para guardar la interfaz de lectura.

• num_p, el puntero se utiliza para almacenar el número de bytes a leer y el usuario debe asegurarse de que no sea un puntero nulo.

4.2.9 Descripción de la función de la interfaz I8080

El controlador de pantalla proporciona 5 funciones de interfaz para su uso. como sigue:

Función: sunxi_lcd_cpu_write

Función: Establece el registro especificado de la pantalla de la CPU al valor especificado.

Ejemplo: void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)

El contenido de la función es:

Void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)
{
    sunxi_lcd_cpu_write_index(sel, index);
    sunxi_lcd_cpu_wirte_data(sel, data);
}

Se implementan dos operaciones de escritura en el bus 8080.

sunxi_lcd_cpu_write_index implementa la primera operación de escritura. En este momento, el pin PIN RS (A1) es de nivel bajo y el contenido de datos en los datos del bus es el valor del índice del parámetro.

Sunxi_lcd_cpu_wirte_data implementa la segunda operación de escritura. En este momento, el pin PIN RS (A1) es de nivel alto y el contenido de datos en los datos del bus es el valor de los datos del parámetro.

Función: sunxi_lcd_cpu_write_index

Función: establece la pantalla de la CPU en el registro especificado.

prototipo:

void sunxi_lcd_cpu_write_index(__u32 sel,__u32 index)

Consulte sunxi_lcd_cpu_write para obtener instrucciones específicas.

Función: sunxi_lcd_cpu_write_data

Función: Establece el valor del registro de pantalla de la CPU al valor especificado.

prototipo:

void Sunxi_lcd_cpu_write_data(__u32 sel, __u32 data);

Función: tcon0_cpu_rd_24b_data

Función: operación de lectura.

prototipo:

s32 tcon0_cpu_rd_24b_data(u32 sel, u32 index, u32 *data, u32 size)

Descripción de parámetros:

• sel: identificación de visualización.

• índice: el registro a leer.

• datos: se utiliza para almacenar el puntero de matriz de la interfaz de lectura, el usuario debe asegurarse de que tenga suficiente espacio para almacenar datos.

• tamaño: Número de bytes a leer.

4.2.10 Descripción de la función de control de pines

Función: sunxi_lcd_gpio_set_value

Función: El pin LCD_GPIO PIN emite un nivel alto o bajo.

Ejemplo: s32 sunxi_lcd_gpio_set_value(u32 screen_id, u32 io_index, u32 value)

Descripción de parámetros:

• io_index = 0: Corresponde a lcd_gpio_0 en board.dts.

• io_index = 1: Corresponde a lcd_gpio_1 en board.dts.

• io_index = 2: Corresponde a lcd_gpio_2 en board.dts.

• io_index = 3: Corresponde a lcd_gpio_3 en board.dts.

• valor = 0: corresponde al nivel bajo de salida IO.

• Valor = 1: Corresponde al nivel alto de salida IO.

Solo se usa cuando el GPIO está definido como salida.

Función: sunxi_lcd_gpio_set_direction

Función: Configure el pin LCD_GPIO PIN en modo de entrada o salida.

prototipo:

s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direction);

Descripción de parámetros:

• io_index = 0: Corresponde a lcd_gpio_0 en board.dts.

• io_index = 1: Corresponde a lcd_gpio_1 en board.dts.

• io_index = 2: Corresponde a lcd_gpio_2 en board.dts.

• io_index = 3: Corresponde a lcd_gpio_3 en board.dts.

• dirección = 0: La IO correspondiente se configura como entrada.

• dirección = 1: La IO correspondiente se establece en salida.

Algunas pantallas necesitan ser inicializadas. En la función de paso de apertura de pantalla, correspondiente a la función LCD_panel_init, se proporcionan varios métodos para inicializar la pantalla.

Para la pantalla DSI, se inicializa a través del canal DSI-D0. Para la pantalla de la CPU, se inicializa a través del bus 8080 y utiliza LCDIO (PD, PH). En este método de inicialización, los bits de pin de su bus

La definición de configuración es consistente con la pantalla de la CPU.

Las siguientes interfaces están definidas e implementadas en lcd_source.c y lcd_source.h cuyas rutas se mencionan en la descomposición del controlador de pantalla.

4.2.11 Inicialización mediante la interfaz serie iic/spi

El acceso del dispositivo iic/spi a la interfaz serie debe registrarse en el controlador de pantalla.

Utilice hardware spi para detectar o transferir IC para inicializar, como se muestra en el siguiente fragmento de código.

Primero llame a la función spi_init para inicializar el hardware spi. La función spi_init se puede dividir en varios pasos. Primero, obtenga el maestro; de acuerdo con la conexión real del hardware, seleccione spi (spi1 está seleccionado en el código). Si esto

Si el paso arroja un error que indica que spi no está configurado correctamente, comuníquese con la persona a cargo del controlador spi. El segundo paso es configurar el dispositivo spi, que incluye la velocidad máxima, el modo de transmisión spi y la cantidad de bits contenidos en cada palabra. Finalmente llame a spi_setup para completar

La relación entre maestro y dispositivo.

comm_out es un ejemplo de transferencia spi y el núcleo es la función spi_sync_transfer.

static int spi_init(void)
{
    int ret = -1;
    struct spi_master *master;
    master = spi_busnum_to_master(1);
    if (!master) {
        lcd_fb_wrn("fail to get master\n");
        goto OUT
    }
    spi_device = spi_alloc_device(master);
    if (!spi_device) {
        lcd_fb_wrn("fail to get spi device\n");
        goto OUT;
    }
spi_device->bits_per_word = 8;
    spi_device->max_speed_hz = 60000000; /*50MHz*/
    spi_device->mode = SPI_MODE_0;
    ret = spi_setup(spi_device);
    if (ret) {
        lcd_fb_wrn("Faile to setup spi\n");
        goto FREE;
    }
	lcd_fb_inf("Init spi1:bits_per_word:%d max_speed_hz:%d mode:%d\n",
        spi_device->bits_per_word, spi_device->max_speed_hz,
        spi_device->mode);
	ret = 0;
	goto OUT;
FREE:
    spi_master_put(master);
    kfree(spi_device);
    spi_device = NULL;
OUT:
    return ret;
}
static int comm_out(unsigned int sel, unsigned char cmd)
{
    struct spi_transfer t;
    if (!spi_device)
    	return -1;
    DC(sel, 0);
    memset(&t, 0, sizeof(struct spi_transfer));
    t.tx_buf = &cmd;
    t.len = 1;
    t.bits_per_word = 8;
    t.speed_hz = 24000000;
    return spi_sync_transfer(spi_device, &t, 1);
}

Utilice el hardware i2c para inicializar la pantalla LCD y el adaptador IC. La función principal para inicializar el hardware i2c es i2c_add_driver, y lo que debe hacer es inicializar su parámetro struct i2c_driver.

it66121_id contiene el nombre del dispositivo y el índice del bus i2c (i2c0, i2c1...).

it66121_i2c_probe Si puede ingresar a esta función, puede comenzar a usar i2c. En el segmento de código, solo el parámetro cilent que se necesitará más adelante se asigna a una variable de puntero global.

it66121_match, esta es la tabla de coincidencias de dts. Dado que está agregando un controlador a disp2, la tabla de coincidencias aquí es la tabla de coincidencias de disp2. Esta tabla está relacionada con si se puede usar i2c. Por favor, preste atención.

Complete el formulario incorrecto.
La función tv_i2c_detect es muy crítica aquí. Esta función se llama antes que la función de sonda. Solo después de que se llame con éxito se puede comenzar a usar i2c. La llamada de strlcpy significa éxito.

normal_i2c es la lista de direcciones del dispositivo esclavo, completada con la dirección del dispositivo esclavo de la pantalla LCD o IC de transferencia y el índice i2c.

Si puede comenzar a usar I2C depende de si se llama a la función de sonda.

Usar i2c_smbus_write_byte_data o i2c_smbus_read_byte_data para leer y escribir puede satisfacer la mayoría de los escenarios.

#define IT66121_SLAVE_ADDR 0x4c
#define IT66121_I2C_ID 0
static const struct i2c_device_id it66121_id[] = {
    { "IT66121", IT66121_I2C_ID },
    { /* END OF LIST */ }
};
MODULE_DEVICE_TABLE(i2c, it66121_id);
static int it66121_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    this_client = client;
    return 0;
}
static const struct of_device_id it66121_match[] = {
    {.compatible = "allwinner,sun8iw10p1-disp",},
    {.compatible = "allwinner,sun50i-disp",},
    {.compatible = "allwinner,sunxi-disp",},
    {},
};
static int tv_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
{
    const char *type_name = "IT66121";
    if (IT66121_I2C_ID == client->adapter->nr) {
    	strlcpy(info->type, type_name, 20);
    } else
		pr_warn("%s:%d wrong i2c id:%d, expect id is :%d\n", __func__, __LINE__,
    		client->adapter->nr, IT66121_I2C_ID);
    return 0;
}
static unsigned short normal_i2c[] = {IT66121_SLAVE_ADDR, I2C_CLIENT_END};
static struct i2c_driver it66121_i2c_driver = {
    .class = I2C_CLASS_HWMON,
    .id_table = it66121_id,
    .probe = it66121_i2c_probe,
    .remove = it66121_i2c_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = "IT66121",
        .of_match_table = it66121_match,
    },
    .detect = tv_i2c_detect,
    .address_list = normal_i2c,
};
static void LCD_panel_init(u32 sel)
{
    int ret = -1;
    ret = i2c_add_driver(&it66121_i2c_driver);
    if (ret) {
        pr_warn("Add it66121_i2c_driver fail!\n");
        return;
    }
    //start init chip with i2c
}
void it6612_twi_write_byte(it6612_reg_set* reg)
{
    u8 rdata = 0;
    u8 tmp = 0;
    rdata = i2c_smbus_read_byte_data(this_client, reg->offset);
    tmp = (rdata & (~reg->mask))|(reg->mask&reg->value);
    i2c_smbus_write_byte_data(this_client, reg->offset, tmp);
}
4.2.12 Precauciones del controlador de pantalla U-boot

Los pasos para escribir controladores de pantalla en U-boot son los mismos que los del kernel, y los archivos de ruta del código están organizados de la misma manera. Aquí están las cosas a las que debe prestar atención.

1. Para acelerar la velocidad de visualización de U-boot, se adoptan llamadas asincrónicas entre varias funciones que abren la pantalla. El principio es utilizar la interrupción del temporizador para llamar regularmente a la función de apertura de la pantalla. Por lo tanto, en este caso, el El marco bootGUI está cargado y

No significa que se complete la apertura de la pantalla, pero cuando vea la pantalla LCD abierta terminará de imprimir.

Sugerencia: para aprovechar las ventajas de las llamadas asincrónicas, especifique el retraso requerido al registrar la devolución de llamada. Por ejemplo, el siguiente retraso de 10 ms utiliza la devolución de llamada asincrónica del temporizador. Durante este tiempo de 10 ms, uboot

Puede hacer otras cosas para lograr el propósito de las llamadas asincrónicas.

LCD_OPEN_FUNC(sel, LCD_power_on,10);

2. Las funciones sunxi_lcd_power_enable y sunxi_lcd_pin_cfg no se pueden llamar fuera de LCD_power_on; de lo contrario, uboot será anormal.

Estrictamente hablando, solo se puede llamar en la primera función de devolución de llamada registrada con LCD_OPEN_FUNC.

4.3 Interfaz RGB

4.3.1 Descripción general

A continuación se presentan los ejemplos de configuración y RGB de la plataforma Allwinner. En cuanto a la explicación detallada de cada atributo debajo de lcd0, consulte la descripción del parámetro de hardware.

La interfaz RGB también se denomina interfaz HV (sincronización horizontal y sincronización vertical) en la plataforma Allwinner.

Para inicialización de pantalla RGB:

Algunas pantallas LCD admiten funciones avanzadas como gamma, configuración de formato de píxeles, etc., pero el protocolo RGB en sí no admite transmisiones que no sean datos de imagen, por lo que la pantalla LCD no se puede configurar a través de los pines RGB.

Entonces, si obtiene una pantalla de interfaz RGB, no necesita un comando de inicialización o la pantalla proporcionará pines adicionales para que el SoC configure, como SPI e I2C.

4.3.2 pines de interfaz RGB

imagen-20221129104718608

Figura 4-6: pines RGB

Para conocer los pines y funciones de SoC específicos (funciones de multiplexación de pines) de los pines anteriores, consulte la tabla de mux de pines. Los nombres de las funciones de multiplexación de pines generalmente comienzan con "LCDX_", donde X es un número.

El número de pines de datos no es necesariamente 24. RGB se subdivide en varias interfaces, que se seleccionan configurando lcd_hv_if.

Tabla 4-1: Clasificación de la interfaz RGB
ancho de bits ciclo de reloj Cuente la cantidad y el formato del color.
24 bits 1 ciclo 16,7 millones de colores, RGB888
18 bits 1 ciclo 262.000 colores, RGB666
16 bits 1 ciclo 65.000 colores, RGB565
6 bits 3 ciclos 262.000 colores, RGB666
6 bits 3 ciclos 65.000 colores, RGB565

ilustrar

El significado del número de ciclos de reloj: significa cuántos ciclos de reloj se necesitan para enviar un píxel.

Cuando el ciclo de reloj es 1, llamamos a esta interfaz RGB una interfaz paralela. En otros casos, es una interfaz en serie. El principio más general es que cualquier interfaz que requiera múltiples ciclos de reloj para enviar un píxel es en serie.

interfaz.

¿Cómo juzgar si se admite el ancho de bits de 24 bits? La forma más sencilla es contar el número de pines de datos en la tabla pinmux. Si hay 24 pines, admite 24 bits. Si solo hay 18 pines, admite 18 bits.

Conexión de hardware

Para interfaces RGB paralelas, cuando el ancho de bits es menor a 24, la conexión de hardware debe optar por conectar los bits altos en cada componente y abandonar los bits bajos, el motivo de esto es perder una menor cantidad de colores.

Para la interfaz RGB en serie, la conexión de hardware puede consultar las columnas de sincronización RGB en el diagrama de configuración de pines RGB e I8080.

La interfaz RGB tiene dos métodos de sincronización. Según la experiencia, intente utilizar el segundo método. Asegúrese de que el pin DE esté conectado al hardware.

  1. Sincronización H+Sincronización V
  2. DE (Habilitación de datos)
4.3.3 Ejemplo de configuración de interfaz RGB paralela

Cuando configuramos la interfaz RGB paralela, no es necesario distinguir entre 24 bits, 18 bits y 16 bits en la configuración. Para conocer el ancho máximo de bits, consulte la tabla de pin mux. Si la pantalla LCD admite un ancho de bits que es más ancho que el que admite el SoC

Si el ancho de la broca es pequeño, por supuesto sólo puedes elegir el más pequeño.

Debido a que no requiere inicialización, hay muy pocos problemas con la interfaz RGB. Concéntrese en la racionalidad de la sincronización de la pantalla LCD, es decir, la racionalidad de los atributos de lcd_ht, lcd_hspw, lcd_hbp, lcd_vt, lcd_vspw y lcd_vbp.

sexo.

El siguiente es un ejemplo típico de configuración de placa de interfaz RGB paralela.dts, en el que se utilizan líneas en blanco para dividir la configuración en varias partes.

  1. La primera parte determina si se usa la configuración y qué controlador de pantalla usar. lcd_driver_name determina qué controlador de pantalla usar para la inicialización. Aquí está default_lcd, que está configurado para configuraciones que no requieren inicialización.

pantalla rgb

  1. La segunda parte determina si la siguiente configuración es una configuración RGB paralela.

  2. La tercera parte determina el tiempo de transmisión del módulo LCD en el SoC. Verifique la descripción del parámetro de tiempo de pantalla.

  3. La cuarta parte determina la luz de fondo (pwm y lcd_bl_en). Consulte los parámetros relacionados con la retroiluminación.

  4. La quinta parte es la configuración de la parte del efecto de visualización. Si no es RGB de 24 bits, generalmente debe configurar lcd_frm.

  5. La sexta parte es la fuente de alimentación y la configuración de pines. Se debe decidir si utilizar RGB666 o RGB888 en función de la tabla pinmux real. Si el chip solo tiene 18 datos rgb, solo puede ser rgb18. Consulte la fuente de alimentación y los pines.

parámetro.

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "default_lcd";
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <0>;
    /* part 3 */
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_x = <800>;
    lcd_y = <480>;
    lcd_dclk_freq = <33>;
    lcd_hbp = <46>;
    lcd_ht = <1055>;
    lcd_hspw = <0>;
    lcd_vbp = <23>;
    lcd_vt = <525>;
    lcd_vspw = <0>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <10000>;
    lcd_pwm_pol = <1>;
    lcd_bl_en = <&pio PD 27 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    /* part 5 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    pinctrl-0 = <&rgb24_pins_a>;
    pinctrl-1 = <&rgb24_pins_b>;
};

4.3.4 Configuración típica de la interfaz RGB serie

El RGB serial es relativo al RGB paralelo. No significa que solo use una línea para enviar datos. Siempre que se puedan usar múltiples ciclos de reloj para enviar los datos de un píxel, entonces dicha interfaz RGB es RGB serial.

Al igual que la interfaz RGB paralela, la interfaz RGB serie específica no es necesaria y no se puede reflejar en la configuración, lo único que hay que hacer es conectar el hardware correctamente.

El siguiente es un ejemplo típico de configuración de una placa de interfaz RGB en serie.dts. Tiene solo 8 pines de datos. Se utilizan líneas en blanco para dividir la configuración en varias partes.

  1. La primera parte determina si se usa la configuración y qué controlador de pantalla usar. lcd_driver_name determina qué controlador de pantalla usar para la inicialización.

  2. La División 2 determina que la siguiente configuración es una configuración RGB en serie.

  3. La tercera parte determina el tiempo de transmisión del módulo LCD en el SoC. Verifique la descripción del parámetro de tiempo de pantalla.

Consejos Lo que
hay que tener en cuenta aquí es que para esta interfaz, el SoC requiere un total de tres ciclos para enviar un píxel, por lo que cuando configuramos el tiempo, debemos cumplir con lcd_dclk_freq 3=lcd_ht lcd_vt 60 , o

lcd_dclk_freq=lcd_ht 3 lcd_vt 60 es 3 veces lcd_ht o 3 veces lcd_dclk_freq.

  1. La cuarta parte determina la luz de fondo. Eso es pwm y lcd_bl_en. Consulte los parámetros relacionados con la retroiluminación.

  2. La quinta parte es la configuración del efecto de visualización.

  3. Parte 6: Definición de pines y fuentes de alimentación. Consulte la fuente de alimentación y los parámetros del pin.

ilustrar

El IC del controlador LCD en el siguiente ejemplo es stv7789v, que debe inicializarse. El protocolo de interfaz inicializado es SPI, por lo que hay varias configuraciones de pines SPI más. GPIO se usa en el controlador para simular el protocolo SPI, así que aquí están las configuraciones

función gpio.

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "st7789v";
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <8>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <320>;
    lcd_width = <108>;
    lcd_height = <64>;
    lcd_dclk_freq = <19>;
    lcd_hbp = <120>;
    ;10 + 20 + 10 + 240*3 = 760 real set 1000
    lcd_ht = <850>;
    lcd_hspw = <2>;
    lcd_vbp = <13>;
    lcd_vt = <373>;
    lcd_vspw = <2>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PB 1 1 0 3 1>;
    lcd_bright_curve_en = <1>;
    /* part 5 */
    lcd_frm = <1>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_hv_srgb_seq = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_rb_swap = <0>;
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    /*reset */
    lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
    /* cs */
    lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
    /*sda */
    lcd_gpio_2 = <&pio PD 13 1 0 3 0>;
    /*sck */
    lcd_gpio_3 = <&pio PD 12 1 0 3 0>;
    pinctrl-0 = <&rgb8_pins_a>;
    pinctrl-1 = <&rgb8_pins_b>;
};

4.4 Interfaz MIPI-DSI

4.4.1 Descripción general

MIPI-DSI, interfaz serie de pantalla de interfaz de procesador de la industria móvil, es la interfaz serie de pantalla de interfaz de procesador de la industria móvil.

Los usuarios necesitan saber:

  1. El modo de comando, similar a la interfaz MPU, requiere GRAM dentro del IC para el almacenamiento en búfer.

  2. Modo de vídeo. Al igual que en la interfaz RGB, no hay GRAM, por lo que es necesario enviar datos constantemente al panel. El modo de vídeo se divide en tres submodos.

• Modo sin ráfagas con pulsos de sincronización

• Modo sin ráfagas con eventos de sincronización

• Modo de ráfaga. El entendimiento simple es que la relación de datos efectiva es mayor y la eficiencia de transmisión es mayor.

  1. carril significa un par de pasadores diferenciales.
4.4.2 Pines MIPI-DSI

Los pines MIPI-DSI están dedicados en la mayoría de los circuitos integrados y no es necesario configurarlos en board.dtsi, siempre que el hardware esté conectado.

Sin embargo, los pines DSI de algunos IC no están dedicados y se reutilizan con pines de otras funciones. En este caso, es necesario configurar pinctrl-0 y pinctrl-1.

Los pines de mipi-dsi son diferenciales y se dividen en dos tipos de pines, uno es un pin de reloj y el otro es un pin de datos. El número de pines de datos es variable y la unidad de cantidad es el carril. Cada carril de pines en realidad contiene dos lineas.

En términos generales, la cantidad de carriles mencionada en el manual de la pantalla LCD se refiere a la cantidad de pines de datos, excluyendo los pines de reloj. Por ejemplo, una pantalla MIPI-DSI de 4 carriles tiene un total de (4+1)*2 pines.

4.4.3 Fuente de alimentación MIPI-DSI

Generalmente, hay una fuente de alimentación que suministra el módulo MIPI-DSI. Puede considerarlo como alimentación de pin o alimentación de módulo. Diferentes IC pueden tener diferentes requisitos de voltaje para esta fuente de alimentación. Una vez que se determina el modelo de IC, los requisitos de voltaje de este fuente de alimentación

Si el voltaje de este circuito se cambia sin autorización, el módulo puede volverse anormal.

imagen-20221129105502705

Figura 4-7: pinmux
4.4.4 Determinar si se admite una determinada pantalla MIPI-DSI

1. Limitación de resolución. Hay un límite de velocidad en el carril y podemos obtener el límite de resolución máximo. La fórmula de cálculo es la siguiente: siempre que lane_speed no exceda la velocidad especificada en la especificación IC anterior, es teóricamente compatible.

Por favor verifique las especificaciones del IC.

velocidad_carril=lcd_vt * lcd_ht * fps * bit_por_píxel / número_carril / 1e9

• Unidad: Gbps.

• fps: La frecuencia de actualización esperada, que se puede conocer en el manual de la pantalla, suele ser 60. Consulte lcd_dclk_freq.

• bit_per_pixel: el número de bits contenidos en cada píxel, normalmente 24 o 18, se establece mediante lcd_dsi_format.

• lane_num: Número de carril, establecido por lcd_dsi_lane.

• 1e9:1000000000 escrito en notación científica.

  1. Al elegir una resolución, debe considerar el ancho de banda del sistema y las capacidades DE. Por lo tanto, incluso si la interfaz admite esta resolución, es posible que no sea compatible con todo el sistema. Por ejemplo, el hardware elige una resolución de alta velocidad para ahorrar costos.

Obviamente, no es realista utilizar una memoria DDR muy lenta y al mismo tiempo querer elegir una pantalla de alta resolución.

  1. límite de número de carriles. La mayoría de los circuitos integrados Allwinner admiten hasta 4 carriles de MIPI-DSI. Si ve una pantalla con más de 4 carriles, definitivamente no lo admitirá. Algunos IC admiten hasta 8 carriles, por lo que debes elegir este modelo.

IC。

  1. El estándar MIPI-DSI no es compatible. Por favor verifique las especificaciones del IC.
4.4.5 Calcular la frecuencia del carril de reloj MIPI-DSI

Utilice un osciloscopio para medir la señal del reloj MIPI-DSI y determinar si su frecuencia satisface las necesidades de la pantalla.

Primero, podemos calcular la frecuencia de la señal CLK teórica a partir del reloj de píxeles y el número de carril dados, de la siguiente manera:

Freq_dsi_clk = (Dclk * colordepth * 3 / lane ) / 2
  1. Freq_dsi_clk: La frecuencia del pin del reloj dsi que queremos medir. La unidad es MHz.
  2. Dclk: reloj de píxeles. Calculado a partir de la fórmula lcd_ht lcd_vt fps/1e6.
  3. Profundidad de color: Profundidad de color, generalmente 8 o 6.
  4. Multiplicar por 3 significa que hay 3 componentes RGB.
  5. Carril: Número de carril de dsi.
  6. Dividido por 2: porque el reloj dsi se muestrea en ambos bordes.
4.4.6 Ejemplo de configuración de pantalla del modo Vídeo MIPI-DSI

La mayoría de las pantallas MIPI-DSI están configuradas en modo vídeo.

El siguiente es un ejemplo típico de configuración de board.dts para el modo de vídeo MIPI-DSI, en el que se utilizan líneas en blanco para dividir la configuración en varias partes.

  1. La primera parte determina si se usa la configuración y qué controlador de pantalla usar. lcd_driver_name determina qué controlador de pantalla usar para la inicialización.
  2. La segunda parte es determinar que la configuración es una interfaz dsi y que la interfaz dsi usa el modo de video.
  3. La tercera parte determina el tiempo de transmisión del módulo LCD en el SoC. Verifique la descripción del parámetro de tiempo de pantalla.
  4. La cuarta parte, configuraciones relacionadas con la luz de fondo. Consulte los parámetros relacionados con la retroiluminación.
  5. Parte 5, configuración detallada de la interfaz dsi.
  6. La sexta parte muestra la configuración relacionada con los efectos.
  7. Parte 7, configuración de pines y energía. Consulte la fuente de alimentación y los parámetros del pin.
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "k101im2qa04";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <0>;
    /* part 3 */
    lcd_x = <800>;
    lcd_y = <1280>;
    lcd_width = <135>;
    lcd_height = <216>;
    lcd_dclk_freq = <68>;
    lcd_hbp = <36>;
    lcd_ht = <854>;
    lcd_hspw = <18>;
    lcd_vbp = <12>;
    lcd_vt = <1320>;
    lcd_vspw = <4>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PB 8 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    /* part 5 */
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    /* part 6 */
    lcd_frm = <0>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_pin_power = "dcdc1";
    lcd_pin_power1 = "eldo3";
    lcd_power = "dc1sw";
    lcd_gpio_0 = <&pio PD 22 1 0 3 1>;
    pinctrl-0 = <&dsi4lane_pins_a>;
    pinctrl-1 = <&dsi4lane_pins_b>;
};
4.4.7 Ejemplo de configuración de pantalla de ultra alta resolución MIPI-DSI

Según el nivel de resolución, se suele dividir en varios modos de configuración. Resolución de 1080p e inferior: simplemente configure lcd_dsi_if para controlar. El modo comando es generalmente una pantalla de baja resolución, mientras que el modo video

Y el modo ráfaga es para alta resolución. Si la resolución alcanza los 2k, se requieren configuraciones adicionales.

Una pantalla con una resolución de 2k o superior en realidad requiere hasta 8 líneas de datos para mostrarse normalmente. Cuatro de las líneas envían píxeles impares en una imagen y la otra imagen envía píxeles impares.

ilustrar

Tenga en cuenta que solo algunos circuitos integrados admiten resolución ultraalta; consulte la parte MIPI-DSI de las especificaciones del chip para obtener más detalles.

El siguiente es un ejemplo de configuración de board.dts MIPI-DSI de alta y ultra alta resolución (superior a 2k), en el que se utilizan líneas en blanco para dividir la configuración en varias partes.

  1. La primera parte determina si se usa la configuración y qué controlador de pantalla usar. lcd_driver_name determina qué controlador de pantalla usar para la inicialización.
  2. La segunda parte es determinar que la configuración es una interfaz dsi y que la interfaz dsi usa el modo de video.
  3. La tercera parte determina el tiempo de transmisión del módulo LCD en el SoC. Verifique la descripción del parámetro de tiempo de pantalla.
  4. La cuarta parte, configuraciones relacionadas con la retroiluminación, consulte los parámetros relacionados con la retroiluminación.
  5. Parte 5, configuración detallada de la interfaz dsi.

Explique que
la razón por la que lcd_dsi_lane todavía está configurado en 4 carriles es porque esto es para establecer el número de carriles para un dsi, y esta pantalla requiere dos dsi. En total son 8 carriles.

En este momento, las tres opciones lcd_tcon_mode, lcd_dsi_port_num y lcd_tcon_en_odd_even_div deben configurarse especialmente. Haga clic para ver el significado específico. Si es una pantalla con una resolución de 1080p o menos (use solo

4lane o inferior), estas tres configuraciones se pueden establecer en 0 de forma predeterminada.
6. La sexta parte muestra los ajustes de la parte de efectos.
7. La séptima parte es la configuración de pines y fuente de alimentación. Configure según el diagrama del circuito. Consulte la fuente de alimentación y los parámetros del pin.

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "lq101r1sx03";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <0>;
    /* part 3 */
    lcd_x = <2560>;
    lcd_y = <1600>;
    lcd_width = <216>;
    lcd_height = <135>;
    lcd_dclk_freq = <268>;
    lcd_hbp = <80>;
    lcd_ht = <2720>;
    lcd_hspw = <32>;
    lcd_vbp = <37>;
    lcd_vt = <1646>;
    lcd_vspw = <6>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PH 10 1 0 3 1>;
    /* part 5 */
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_port_num = <1>;
    lcd_tcon_mode = <4>;
    lcd_tcon_en_odd_even_div = <1>;
    /* part 6 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_power = "vcc18-lcd";
    lcd_power1 = "vcc33-lcd";
    lcd_pin_power = "vcc-pd";
    lcd_gpio_0 = <&pio PH 11 1 0 3 1>;
    lcd_gpio_1 = <&pio PH 12 1 0 3 1>;
};
4.4.8 Ejemplo de configuración de pantalla del modo Comando MIPI-DSI

La pantalla DSI en modo Comando es similar a la interfaz I8080. La pantalla tiene RAM en su interior para almacenamiento en búfer y procesamiento de imágenes. En este caso, generalmente es necesario usar el pin te de la pantalla para activar la interrupción vsync, por lo que es diferente. de otros tipos de DSI.

La diferencia con la pantalla es que el pin lcd_vsync debe configurarse aquí. El pin te de la pantalla está conectado a lcd_vsync y lcd_dsi_te está configurado en 1.

La configuración del pin te es muy crítica. En términos generales, si la pantalla tiene un pin te, debe estar conectado. De lo contrario, la pantalla se romperá al mostrar imágenes dinámicas y el software no podrá resolverlo, lo que resulta directamente en la el hardware final no se puede producir en masa.

fruta.

Aquí solo enumeramos las diferencias clave con el modo de vídeo MIPI-DSI. Para obtener más información, consulte la sección anterior.

  1. La primera parte determina si se usa la configuración y qué controlador de pantalla usar. lcd_driver_name determina qué controlador de pantalla usar para la inicialización.
  2. La segunda parte determina que la configuración es una interfaz dsi y lcd_dsi_if se establece en 1 para indicar el modo de comando.
  3. La tercera parte determina el tiempo de transmisión del módulo LCD en el SoC. Verifique la descripción del parámetro de tiempo de pantalla.
  4. La cuarta parte, configuraciones relacionadas con la luz de fondo. Consulte los parámetros relacionados con la retroiluminación.
  5. Parte 5, configuración detallada de la interfaz dsi. lcd_dsi_te, configurarlo en 1 aquí significa habilitar el disparador.
  6. La sexta parte muestra la configuración relacionada con los efectos.
  7. Parte 7, configuración de pines y energía. lcd_vsync, aquí está el pin te. En el hardware, este pin debe estar conectado al pin te de la pantalla. En el software, debe configurarse en la función vsync. Consulte la fuente de alimentación y los parámetros del pin.
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "h245qbn02";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <1>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <432>;
    lcd_width = <52>;
    lcd_height = <52>;
    lcd_dclk_freq = <18>;
    lcd_hbp = <96>;
    lcd_ht = <480>;
    lcd_hspw = <2>;
    lcd_vbp = <21>;
    lcd_vt = <514>;
    lcd_vspw = <2>;
    /* part 4 */
    lcd_backlight = <100>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bright_curve_en = <0>;
    lcd_bl_en = <&pio PB 3 1 0 3 1>;
    /* part 5 */
    lcd_dsi_lane = <1>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <1>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_power = "axp233_dc1sw"
    lcd_power1 = "axp233_eldo1"
    lcd_gpio_0 = <&pio PB 2 1 0 3 0>;
    lcd_vsync = <&pio PD 21 2 0 3 0>;
};
4.4.9 Ejemplo de configuración de pantalla dual MIPI-DSI VR

La escena real son dos pantallas físicas, cada pantalla es de 1080p y cada pantalla tiene 4 carriles. Se requiere que cada una de las dos pantallas muestre la mitad izquierda y derecha de un cuadro de imagen. Debido a la relación de aspecto, las pantallas horizontales y verticales y capacidades de procesamiento DE, factor,

Un DE+ un tcon+ dos DSI ya no es suficiente, se deben usar dos tcon para controlar un dsi cada uno, sin embargo, las dos pantallas deben estar sincronizadas, lo que requiere el uso del modo de sincronización de los dos tcon.

  1. LCD0 está marcado como tcon esclavo, que es controlado por el tcon maestro (lcd_tcon_mode está configurado).

  2. LCD1 está marcado como master tcon y es responsable de todos los interruptores de alimentación, retroiluminación y pines de las dos pantallas.

  3. Encienda los pines, la fuente de alimentación, etc. en LCD1. Primero se enciende LCD0 y se inicializan los registros del módulo correspondiente, pero la fuente de alimentación no se enciende. Luego, encienda LCD1. Cuando LCD1 esté habilitado, LCD0 se encenderá. activado para enviar datos juntos. Haz esto al mismo tiempo

Encendido y apagado.

ilustrar

Nota: solo unos pocos circuitos integrados admiten este modo

&lcd0 {
    lcd_used = <1>;
    lcd_driver_name = "lpm025m475a";
    ;lcd_bl_0_percent = <0>;
    ;lcd_bl_40_percent = <23>;
    ;lcd_bl_100_percent = <100>;
    lcd_backlight = <50>;
    lcd_if = <4>;
    lcd_x = <1080>;
    lcd_y = <1920>;
    lcd_width = <31>;
    lcd_height = <56>;
    lcd_dclk_freq = <141>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <20000>;
    lcd_pwm_pol = <0>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <100>;
    lcd_ht = <1212>;
    lcd_hspw = <5>;
    lcd_vbp = <8>;
    lcd_vt = <1936>;
    lcd_vspw = <2>;
    lcd_dsi_if = <0>;
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_eotp = <0>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_dsi_port_num = <0>;
    lcd_tcon_mode = <3>;
    lcd_slave_stop_pos = <0>;
    lcd_sync_pixel_num = <0>;
    lcd_sync_line_num = <0>;
    };
&lcd1 {
    lcd_used = <1>;
    lcd_driver_name = "lpm025m475a";
    ;lcd_bl_0_percent = <0>;
    ;lcd_bl_40_percent = <23>;
    ;lcd_bl_100_percent = <100>;
    lcd_backlight = <50>;
    lcd_if = <4>;
    lcd_x = <1080>;
    lcd_y = <1920>;
    lcd_width = <31>;
    lcd_height = <56>;
    lcd_dclk_freq = <141>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <20000>;
    lcd_pwm_pol = <0>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <100>;
    lcd_ht = <1212>;
    lcd_hspw = <5>;
    lcd_vbp = <8>;
    lcd_vt = <1936>;
    lcd_vspw = <2>;
    lcd_dsi_if = <0>;
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_eotp = <0>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_dsi_port_num = <0>;
    lcd_tcon_mode = <1>;
    lcd_tcon_slave_num = <0>;
    lcd_slave_stop_pos = <0>;
    lcd_sync_pixel_num = <0>;
    lcd_sync_line_num = <0>;
    lcd_bl_en = <&pio PH 10 1 0 3 1>;
    lcd_power = "vcc-dsi";
    lcd_power1 = "vcc18-lcd";
    lcd_power2 = "vcc33-lcd";
    lcd_gpio_0 = <&pio PH 8 1 0 3 1>;
    lcd_gpio_1 = <&pio PH 11 1 0 3 1>;
    lcd_gpio_2 = <&pio PH 12 1 0 3 1>;
    lcd_pin_power = "vcc-ph"
};

4.5 Interfaz I8080

4.5.1 Descripción general

La interfaz de pantalla Intel 8080 (también conocida como interfaz MCU) es un protocolo muy antiguo y generalmente se utiliza en pantallas con resoluciones muy pequeñas.

Línea de señal:

• Señal de selección de chip CS, determina si el chip funciona.

• Señal de selección de registro RS, bajo significa seleccionar índice o registro de estado, alto significa seleccionar registro de control. En escenarios reales, generalmente está conectado al pin LCD_DE (pin de habilitación de datos) del SoC.

• /WR (bajo significa escribir datos) señal de distinción del comando de datos, que es la señal de reloj de escritura, generalmente conectada al pin LCD_CLK del SoC.

• La señal de lectura de datos /RD (bajo significa leer datos), que es la señal de reloj de lectura, generalmente está conectada al pin LCD_HSYNC del SoC.

• RESET Restablece la pantalla LCD (use el comando fijo serie 0 1 0 para restablecer).

• Datos Bus de datos para transmisión bidireccional.

Las interfaces de ancho de bits de datos basadas en I8080 son 8/9/16/18. ¿Qué pines están conectados a la referencia? Incluso si el ancho de bits es el mismo, los pines conectados son diferentes. Otro factor a considerar es el formato RGB.

  1. RGB565, hay un total de 65K colores.

  2. RGB666, un total de 262K colores.

  3. 9 bits está fijado en 262K.

Aprenda del manual de la pantalla: ancho de bits de datos, suma del número de colores, consulte el diagrama de configuración de pines RGB e I8080 para la conexión del hardware.

4.5.2 Ejemplo de configuración típica de la pantalla de interfaz I8080

下面是典型是一个RGB565 的,位宽为8 位的I8080 接口的屏的board.dts 配置示例

​ 1.第一部分,决定该配置是否使用,以及使用哪个屏驱动,lcd_driver_name 决定了用哪个屏驱动来初始化。

​ 2.第二部分,决定该配置是I8080 接口,而且是8bit/2cycle 格式RGB565。

技巧
为什么叫做8bit/2cycle RGB565 呢,首先它的格式是RGB565,也就是一个像素是16bit,然后它是8bit 的位宽,就需要两个时钟周期才能发完一个像素,所以才

叫2 cycle。

  1. 第三部分,决定了SoC 中的LCD 模块发送时序,请查看屏时序参数说明。这里比较特殊的是设置像素时钟要满足以下公式:lcd_dclk_freq2>=lcd_htlcd_vtfps,或者lcd_dclk_freq=lcd_ht
    2lcd_vt
    60, 也就是要么双倍lcd_ht要么双倍lcd_dclk_freq。

  2. 第四部分,背光相关的设置。请看背光相关参数。

  3. 第五部分,cpu 接口的详细设置。这里使能了lcd_cpu_te和lcd_cpu_mode,意思是使用te触发和规定了触发间隔。这是非常关键的设置。

  4. 第六部分,显示效果相关的设置。这里使能了lcd_frm也是比较关键的设置,详细意思点击查看。

  5. 第七部分,管脚和电源设置。这里为了用te 触发,同样需要设置lcd_vsync,该脚功能定义已经包括在pinctrl-0 中。这里自定义了一组管脚。参考RGB 和

I8080 管脚配置示意图,通过确定I8080 的位宽,像素格式(颜色数量),在表中确定需要连接哪些管脚。请看电源和管脚参数。

&pio {
    I8080_8bit_pins_a: I8080_8bit@0 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,function = "I8080_8bit";
        allwinner,muxsel = <2>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
    };
    I8080_8bit_pins_b: I8080_8bit@1 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,function = "I8080_8bit_suspend";
        allwinner,muxsel = <7>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
	};
};
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "s2003t46g";
    /* part 2 */
    lcd_if = <1>;
    lcd_cpu_if = <14>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <320>;
    lcd_width = <108>;
    lcd_height = <64>;
    lcd_dclk_freq = <16>;
    lcd_hbp = <20>;
    lcd_ht = <298>;
    lcd_hspw = <10>;
    lcd_vbp = <8>;
    lcd_vt = <336>;
    lcd_vspw = <4>;
    /* part 4 */
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bright_curve_en = <1>;
    /* part 5 */
    lcd_cpu_mode = <1>;
    lcd_cpu_te = <1>;
    /* part 6 */
    lcd_frm = <1>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_rb_swap = <0>;
    /* part 7 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    ;reset pin
    lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
    ;cs pin
    lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
    pinctrl-0 = <&I8080_8bit_pins_a>;
    pinctrl-1 = <&I8080_8bit_pins_a>;
};

4.6 LVDS 接口

4.6.1 概述

LVDS significa Señalización diferencial de bajo voltaje, que es una interfaz de señal diferencial de bajo voltaje.

4.6.2 Configuración típica de enlace único LVDS

Para la interfaz LVDS, los pines lvds correspondientes a lcd0 y los pines lvds correspondientes a lcd1 son fijos y diferentes.

Dado que el protocolo lvds no tiene la capacidad de transmitir datos, generalmente el lado de la pantalla no necesita ninguna inicialización, solo es necesario inicializar el lado SoC. Entonces, el nombre del controlador lcd aquí sigue siendo "lcd predeterminado", por supuesto que puedes

Se realiza una optimización especial para el retraso del inicio de la inicialización.

El siguiente es un ejemplo típico de configuración de board.dts para una pantalla lvds de enlace único, en el que se utilizan líneas en blanco para dividir la configuración en varias partes.

  1. La primera parte determina si se usa la configuración y qué controlador de pantalla usar. lcd_driver_name determina qué
    controlador de pantalla usar para la inicialización.

  2. La segunda parte es decidir si la configuración es una interfaz lvds y un enlace único.
    Consejos
    Si es una pantalla Dual Link, además de cambiar lcd_lvds_if a 1, también se deben mover los pines de lcd1 hacia abajo, es decir, se deben configurar un total de PD0 a PD9 y PD10 a

Un total de veinte pines de PD19 son funciones de pines lvds (función 3). Por supuesto, el tiempo de la pantalla también debe cambiarse según la pantalla.

  1. La tercera parte determina el tiempo de transmisión del módulo LCD en el SoC. Verifique la descripción del parámetro de tiempo de pantalla.

  2. La cuarta parte, configuraciones relacionadas con la luz de fondo. Consulte los parámetros relacionados con la retroiluminación.

  3. Parte 5, configuración detallada de la interfaz lvds.

  4. La sexta parte muestra la configuración relacionada con los efectos.

  5. Parte 7, configuración de pines y energía. Consulte la fuente de alimentación y los parámetros del pin.

&lcd0 {
    /* part 1 */
    lcd_used = 1
    lcd_driver_name = "default_lcd";
    /* part 2 */
    lcd_if = 3
    lcd_lvds_if = 0
    /* part 3 */
    lcd_x = 1280
    lcd_y = 800
    lcd_width = 150
    lcd_height = 94
    lcd_dclk_freq = 70
    lcd_hbp = 20
    lcd_ht = 1418
    lcd_hspw = 10
    lcd_vbp = 10
    lcd_vt = 814
    lcd_vspw = 5
    /* part 4 */
    lcd_pwm_used = 1
    lcd_pwm_ch = 0
    lcd_pwm_freq = 50000
    lcd_pwm_pol = 0
    lcd_pwm_max_limit = 255
    lcd_backlight = 50
    lcd_bright_curve_en = 0
    lcd_bl_en = <&pio PD 21 1 0 3 1>;
    /* part 5 */
    lcd_lvds_colordepth = 1
    lcd_lvds_mode = 0
    /* part 6 */
    lcd_frm = 1
    lcd_hv_clk_phase = 0
    lcd_hv_sync_polarity= 0
    lcd_gamma_en = 0
    lcd_cmap_en = 0
    /* part 7 */
    lcd_power = "vcc-lcd"
    pinctrl-0 = <&lvds0_pins_a>;
    pinctrl-1 = <&lvds0_pins_b>;
};

4.6.3 Configuración típica de doble enlace LVDS

Si la pantalla Dual Link:

  1. lcd_lvds_if se establece en 1 (escenario 1) o 2 (escenario 2).
  2. En términos de configuración de pines, también cambió de 4 carriles de datos a 8 carriles de datos, incluidos un total de 20 pines en el carril clk.

Escenario 1, conectando físicamente una pantalla con 8 líneas de datos, el SoC transmite la mitad de los píxeles, píxeles impares o píxeles pares a cada 4 líneas.

&lcd1 {
    lcd_used = <1>;
    lcd_driver_name = "bp101wx1";
    lcd_backlight = <50>;
    lcd_if = <3>;
    lcd_x = <2560>;
    lcd_y = <800>;
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_dclk_freq = <138>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <2>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <40>;
    lcd_ht = <2836>;
    lcd_hspw = <20>;
    lcd_vbp = <10>;
    lcd_vt = <814>;
    lcd_vspw = <5>;
    lcd_lvds_if = <1>;
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode = <0>;
    lcd_frm = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_fsync_en = <0>;
    lcd_fsync_act_time = <1000>;
    lcd_fsync_dis_time = <1000>;
    lcd_fsync_pol = <0>;
    deu_mode = <0>;
    lcdgamma4iep = <22>;
    smart_color = <90>;
    lcd_bl_en = <&pio PJ 27 1 0 3 1>;
    lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
    lcd_pin_power = "bldo5";
    lcd_power = "dc1sw";
    pinctrl-0 = <&lcd1_lvds2link_pins_a>;
    pinctrl-1 = <&lcd1_lvds2link_pins_b>;
};

Escenario 2 (compatible con algunos IC). Dos pantallas están conectadas físicamente. Cada pantalla tiene 4 carriles. Las dos pantallas son del mismo modelo, con la misma resolución y temporización. En este momento, algunos IC admiten el envío de todos los píxeles a cada pantalla. ,lograr

Pantalla dual (visualización dual en la señal), tenga en cuenta que en este momento, la sincronización de la pantalla LCD es la sincronización de una pantalla y lcd_lvds_if es 2.

lcd1: lcd1@01c0c001 {
    lcd_used = <1>;
    lcd_driver_name = "bp101wx1";
    lcd_backlight = <50>;
    lcd_if = <3>;
    lcd_x = <1280>;
    lcd_y = <800>;
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_dclk_freq = <70>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <2>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <20>;
    lcd_ht = <1418>;
    lcd_hspw = <10>;
    lcd_vbp = <10>;
    lcd_vt = <814>;
    lcd_vspw = <5>;
    lcd_lvds_if = <2>;
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode = <0>;
    lcd_frm = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_fsync_en = <0>;
    lcd_fsync_act_time = <1000>;
    lcd_fsync_dis_time = <1000>;
    lcd_fsync_pol = <0>;
    deu_mode = <0>;
    lcdgamma4iep = <22>;
    smart_color = <90>;
    lcd_bl_en = <&pio PJ 27 1 0 3 1>;
    lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
    lcd_pin_power = "bldo5";
    lcd_power = "dc1sw";
    pinctrl-0 = <&lcd1_lvds2link_pins_a>;
    pinctrl-1 = <&lcd1_lvds2link_pins_a>;
};

4.7 Diagrama de configuración de pines RGB e I8080

imagen-20221129120014562

Figura 4-8: pinmux

4.8 Notas sobre la migración de sys_config.fex a board.dtsi

Por estandarización y otras razones, algunas plataformas implementan la configuración en board.dtsi. A continuación se describen las precauciones para modificar board.dtsi.

4.8.1 Definición de pines

Al configurar una pantalla RGB o LVDS, no hay necesidad de definiciones complejas, no es necesario saber qué pines deben configurarse y no es necesario el nodo lcd0_suspend. donde está el nombre rgb24_pins_a

Una vez definido, puede usarlo directamente. Generalmente, las configuraciones disponibles directamente para las pantallas LCD se indicarán en los comentarios. Puede usar platform-pinctrl en el directorio del kernel arch/arm/boot/dts o arch/arm64/boot/ dts.dtsi texto

Encuéntrelo en el archivo.

ejemplo:

pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//休眠时候的定义,io_disable

Por supuesto, también puedes personalizar un par de pies y escribirlos en board.dtsi, siempre y cuando el nombre no repita el nombre existente.

En aras de la estandarización, mantendremos nombres consistentes en todas las plataformas, donde el sufijo a significa que el pin está habilitado y b significa que io_disable se usa cuando el dispositivo está apagado.

Las siguientes definiciones de pines están disponibles actualmente:

Tabla 4-2: Mostrar tabla de nombres de pines
Nombre del pin describir
rgb24_pins_a y rgb24_pins_b Interfaz de pantalla RGB y el ancho de bits de datos es 24, RGB888
rgb18_pins_a y rgb18_pins_b Interfaz de pantalla RGB y el ancho de bits de datos es 16, RGB666
lvds0_pins_a y lvds0_pins_b Interfaz LVDS de enlace único Definición de 0 pines (pantalla principal lcd0)
lvds1_pins_a y lvds1_pins_b Interfaz LVDS de enlace único Definición de 1 pin (pantalla principal lcd0)
lvds2link_pins_a y lvds2link_pins_b Definición de pin de interfaz LVDS de doble enlace (pantalla principal lcd0)
lvds2_pins_a y lvds2_pins_b Interfaz LVDS de enlace único Definición de 0 pines (pantalla principal lcd1)
lvds3_pins_a y lvds3_pins_b Interfaz LVDS de enlace único Definición de 1 pin (pantalla principal lcd1)
lcd1_lvds2link_pins_a y lcd1_lvds2link_pins_b Definición de pin de interfaz LVDS de doble enlace (pantalla principal LCD1)
dsi4lane_pins_a y dsi4lane_pins_b Definición de pin de interfaz de pantalla DSI, 4 carriles, si es otro número de carril, solo
4.8.2 Definición de fuente de alimentación

No es necesario prestar atención a la definición de la fuente de alimentación en el SDK anterior. Puede asignar directamente la cadena de alias de axp a un atributo como lcd_power. Sin embargo, en el nuevo SDK, si necesita utilizar una determinada fuente de alimentación, debe debe primero

Se define en el nodo disp y la cadena utilizada en la parte lcd debe ser coherente con la definida en disp. Por ejemplo, el siguiente ejemplo:

disp: disp@01000000 {
    disp_init_enable = <1>;
    disp_mode = <0>;
    /* VCC-LCD */
    dc1sw-supply = <&reg_sw>;
    /* VCC-LVDS and VCC-HDMI */
    bldo1-supply = <&reg_bldo1>;
    /* VCC-TV */
    cldo4-supply = <&reg_cldo4>;
};

Entre ellos, "-supply" es fijo y la cadena anterior es arbitraria, pero se recomienda elegir un nombre significativo. Los siguientes como <®_sw> deben encontrarse en el nodo regulator0 de board.dtsi.

Luego, en el nodo lcd0, si desea utilizar reg_sw, simplemente escríbalo de la siguiente manera: dc1sw corresponde a dc1sw-supply.

lcd_power=”dc1sw”

Dado que también hay un controlador axp y un controlador de pantalla en u-boot, leen la misma configuración que el kernel. Para que sean compatibles entre sí, existen las siguientes restricciones al nombrar.

En u-boot 2018, el controlador axp solo reconoce nombres definidos en el chip axp como bldo1, por lo que al nombrar xxxsupply, es mejor nombrarlo de acuerdo con la definición del chip axp.

4.8.3 Otras precauciones

board.dtsi puede contener solo lcd0 pero no lcd1, o solo tv0 pero no tv1. Si desea agregarlo en este momento, debe consultar la plataforma correspondiente en el directorio del kernel arch/arm/boot/dts o arch/ arm64/boot/dts.

Archivo .dtsi. Lo más crítico es que la cadena de direcciones después de @ debe ser coherente con la definición en el kernel, por ejemplo:

lcd1: lcd1@01c0c000

5 Descripción de los parámetros de hardware

5.1 Descripción de los parámetros de la interfaz LCD

5.1.1 nombre_controlador_LCD

El nombre del controlador de la pantalla LCD (cadena) debe corresponder al nombre del controlador de la pantalla.

5.1.2 nombre_modelo_lcd

El nombre del modelo de pantalla LCD, opcional, se puede utilizar en el mismo controlador de pantalla para distinguir aún más diferentes pantallas.

5.1.3 lcd_si

Interfaz LCD

El significado correspondiente de establecer el valor correspondiente es:

0:HV RGB接口
1:CPU/I80接口
2:Reserved
3:LVDS接口
4:DSI接口
5.1.4 lcd_hv_if

Interfaz del panel LCD HV

Este parámetro solo es válido cuando lcd_if=0. Defina varios tipos de interfaz en la pantalla de sincronización RGB.

El significado correspondiente de establecer el valor correspondiente es:

0:Parallel RGB
8:Serial RGB
10:Dummy RGB
11:RGB Dummy
12:Serial YUV (CCIR656)
5.1.5 lcd_hv_clk_fase

Panel LCD HV Fase del reloj

Este parámetro solo es válido cuando lcd_if=0. Defina la relación de fase entre el reloj y los datos de la pantalla de sincronización RGB. Hay un total de 4 fases disponibles para el ajuste.

El significado correspondiente de establecer el valor correspondiente es:

0: 0 degree
1: 90 degree
2: 180 degree
3: 270 degree
5.1.6 lcd_hv_sync_polaridad

Panel LCD HV Señales de sincronización Polaridad

Este parámetro solo es válido cuando lcd_if=0. Defina la polaridad de hsync y vsync para la pantalla de sincronización RGB.

El significado correspondiente de establecer el valor correspondiente es:

0:vsync active low,hsync active low
1:vsync active high,hsync active low
2:vsync active low,hsync active high
3:vsync active high,hsync active high
5.1.7 lcd_hv_srgb_seq

Panel LCD HV Secuencia de salida RGB en serie

Este parámetro solo es válido cuando lcd_if=0 y lcd_hv_if=8 (Serial RGB).

Defina el orden de salida RGB para filas impares:

0: Odd lines R-G-B; Even line R-G-B
1: Odd lines B-R-G; Even line R-G-B
2: Odd lines G-B-R; Even line R-G-B
4: Odd lines R-G-B; Even line B-R-G
5: Odd lines B-R-G; Even line B-R-G
6: Odd lines G-B-R; Even line B-R-G
8: Odd lines R-G-B; Even line B-R-G
9: Odd lines B-R-G; Even line G-B-R
10: Odd lines G-B-R; Even line G-B-R
5.1.8 lcd_hv_syuv_seq

Panel LCD HV Secuencia de salida YUV serie

Este parámetro solo es válido cuando lcd_if=0 y lcd_hv_if=12 (Serial YUV).

Defina el formato de salida YUV:

0:YUYV
1:YVYU
2:UYVY
3:VYUY
5.1.9 lcd_hv_syuv_fdly

Panel LCD HV Retardo de línea Serial YUV F

Este parámetro solo es válido cuando lcd_if=0 y lcd_hv_if=12 (Serial YUV).

Defina el número de líneas que F se retrasa en relación con las líneas válidas al codificar CCIR656:

0:F toggle right after active video line
1:Delay 2 lines (CCIR PAL)
2:Delay 3 lines (CCIR NTSC)
5.1.10 lcd_cpu_si

Interfaz del panel LCD de la CPU

Este parámetro solo es válido cuando lcd_if = 1. Para conocer la sincronización específica, consulte las columnas de la CPU en el diagrama de configuración de pines RGB e I8080.

El significado correspondiente de establecer el valor correspondiente es:

0:18bit/1cycle (RGB666)
2: 16bit/3cycle (RGB666)
4:16bit/2cycle (RGB666)
6:16bit/2cycle (RGB666)
8:16bit/1cycle (RGB565)
10:9bit/1cycle (RGB666)
12:8bit/3cycle (RGB666)
14:8bit/2cycle (RGB565)
5.1.11 lcd_cpu_te

Efecto desgarro del panel LCD de la CPU

El significado correspondiente de establecer el valor correspondiente es que cuando se establece en 0, el tiempo del intervalo de actualización es lcd_ht × lcd_vt; cuando se establece en 1 o 2, el tiempo del intervalo de actualización es de dos pulsos:

Efecto desgarro del panel LCD de la CPU

El significado correspondiente de establecer el valor correspondiente es que cuando se establece en 0, el tiempo del intervalo de actualización es lcd_ht × lcd_vt; cuando se establece en 1 o 2, el tiempo del intervalo de actualización es de dos pulsos:

0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge
5.1.12 lcd_lvds_if

Interfaz del panel LCD LVDS

El significado correspondiente de establecer el valor correspondiente es:

0:Single Link( 1 clock pair+3/4 data pair)
1:Dual Link(8 data lane,每4条lane接受一半像素,奇数像素或者偶数像素)
2: Dual Link (每4条lane接受全部像素,常用于物理双屏,且两个屏一样)

El escenario donde lcd_lvds_if es igual a 2 es conectar dos pantallas idénticas y luego las dos pantallas muestran el mismo contenido. En este momento, otros tiempos de la pantalla LCD solo necesitan completar el tiempo de una pantalla.

5.1.13 lcd_lvds_colorprofundidad

Profundidad de color del panel LCD LVDS

El significado correspondiente de establecer el valor correspondiente es:

0:8bit per color(4 data pair)
1:6bit per color(3 data pair)

5.1.14 modo_lvds_lvd

Modo LCD LVDS

Este parámetro solo es válido cuando lcd_lvds_bitwidth=0.

El significado correspondiente de establecer el valor correspondiente es (consulte la figura a continuación):

0:NS mode
1:JEIDA mode

imagen-20221129173201413

Figura 5-1: modo lvds
5.1.15 lcd_dsi_if

Interfaz del panel LCD MIPI DSI

Este parámetro solo es válido cuando lcd_if=4. Defina dos tipos de pantallas MIPI DSI.

El significado correspondiente de establecer el valor correspondiente es:

0:Video mode
1:Command mode
2:video burst mode

Nota: La pantalla LCD en modo Video actualiza la pantalla en tiempo real, con definiciones de parámetros de tiempo como ht y hbp; la pantalla en modo Comando tiene un búfer de visualización en la pantalla y generalmente tiene un pin TE.

5.1.16 lcd_dsi_lane

Número de carril de datos del panel Lcd MIPI DSI

Este parámetro solo es válido cuando lcd_if=4.

El significado correspondiente de establecer el valor correspondiente es:

1:1 data lane
2:2 data lane
3:3 data lane
4:4 data lane
5.1.17 formato_lcd_dsi

Formato de píxeles de datos del panel Lcd MIPI DSI

Este parámetro solo es válido cuando lcd_if=4.

El significado correspondiente de establecer el valor correspondiente es:

0:Package Pixel Stream, 24bit RGB
1:Loosely Package Pixel Stream, 18bit RGB
2:Package Pixel Stream, 18bit RGB
3:Package Pixel Stream, 16bit RGB
5.1.18 lcd_dsi_la

Panel Lcd MIPI DSI Efecto Lágrima

Este parámetro solo es válido cuando lcd_if=4.

El significado correspondiente de establecer el valor correspondiente es:

0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge

Nota: Cuando se establece en 0, el tiempo del intervalo de actualización es lcd_ht × lcd_vt; cuando se establece en 1 o 2, el tiempo del intervalo de actualización es de dos pulsos.

La función de esto es enviar una señal desde el extremo de la pantalla al extremo del SoC para la señal de sincronización. Si esta variable está habilitada, la interrupción de visualización dentro del SoC será activada por este pin externo.

5.1.19 lcd_dsi_port_num

Cantidad de puertos de pantalla DSI

Este parámetro solo es válido cuando lcd_if=4.

El significado correspondiente de establecer el valor correspondiente es:

0:一个port
1:两个port

Una función de esta opción es que cuando una única pantalla LCD tiene 8 carriles, si solo es necesario inicializar un controlador IC, esta configuración es 1. Si es necesario inicializar ambos controladores IC, configúrelo en 0. Y utilice las funciones definidas en lcd_source.c para la inicialización.

5.1.20 modo_tcon_lcd

Modo Tcon

Este parámetro solo es válido cuando lcd_if=4.

El significado correspondiente de establecer el valor correspondiente es:

0:normal mode
1:tcon master mode(在第一次发送数据同步)
2::tcon master mode(每一帧都同步)
3:tcon slave mode(依靠master mode来启动)
4:one tcon driver two dsi(8条lane)
5.1.21 lcd_slave_tcon_num
5.1.21 lcd_slave_tcon_num

Número de serie del Slave Tcon

Este parámetro solo es válido cuando lcd_if=4 y lcd_tcon_mode son iguales a 1 o 2. Se utiliza para indicarle a tcon en modo maestro cuál es el número de secuencia del tcon esclavo.

El significado correspondiente de establecer el valor correspondiente es:

0:tcon_lcd0
1:tcon_lcd1
5.1.22 lcd_tcon_en_odd_even_div

Este parámetro solo es válido cuando lcd_if=4 y lcd_tcon_mode=4.

El significado correspondiente de establecer el valor correspondiente es:

0:tcon将一帧图像分左右两半来发送给两个DSI模块
1:tcon将一帧图像分奇偶像素来发给两个DSI模块
5.1.23 lcd_sync_pixel_num

Este parámetro solo es válido cuando lcd_if=4 y lcd_tcon_mode son iguales a 2 o 3.

Establezca el píxel inicial de sincronización desde tcon.

Entero: no más que lcd_ht

5.1.24 lcd_sync_line_num

Este parámetro solo es válido cuando lcd_if=4 y lcd_tcon_mode son iguales a 2 o 3.

Establezca la línea de inicio de sincronización desde tcon.

Entero: no más que lcd_vt

5.1.25 modo_cpu_lcd

Modo CPU LCD, control.

El significado correspondiente de establecer el valor correspondiente es que cuando se establece en 0, el tiempo del intervalo de actualización es lcd_ht × lcd_vt; cuando se establece en 1 o 2, el tiempo del intervalo de actualización es de dos pulsos:

0:中断自动根据时序,由场消隐信号内部触发。
1:中断根据数据Block的counter触发或者由外部te触发。
5.1.26 lcd_fsync_en

La pantalla LCD habilita la función fsync, que se utiliza para activar el sensor para generar imágenes para la sincronización. Algunos circuitos integrados la admiten.

0:disable
1:enable
5.1.27 lcd_fsync_act_time

Función fsync de LCD, duración del tiempo de nivel efectivo, unidad: el número de relojes de píxeles.

0~lcd_ht-1
5.1.28 lcd_fsync_dis_time

Función fsync de LCD, longitud de tiempo de nivel no válido, unidad: el número de relojes de píxeles.

0~lcd_ht-1
5.1.29 lcd_fsync_pol

La polaridad de los niveles activos de la función fsync de la pantalla LCD.

0:有效电平为低
1:有效电平为高

5.2 Descripción del parámetro de sincronización de pantalla

Los siguientes parámetros son muy críticos para el ajuste de la pantalla y determinan el tiempo de los datos enviados por el extremo emisor (SoC). Dado que implica depurar el remitente y el receptor, excepto la resolución y el tamaño, los demás valores no son absolutamente incorrectos.

Sí, dos pantallas con la misma resolución y la misma interfaz pueden tener valores diferentes.

Las formas de obtenerlo son las siguientes:

  1. Pregúntele al fabricante de la pantalla LCD.
  2. Encuéntrelo en el manual de la pantalla o en el manual del controlador IC (solicite estos documentos al fabricante de la pantalla), como se muestra en la siguiente figura.

imagen-20221129174730302

Figura 5-2: lcd_info1

imagen-20221129174744511

Figura 5-3: lcd_info2
  1. Si no puede hacerlo bien en los dos primeros pasos, puede configurarlo según los estándares vesa, principalmente los estándares DMT y CVT.

Entre ellos, DMT se refiere a "VESA y estándares y pautas industriales para la sincronización del monitor de pantalla de computadora (DMT)" Descargue el estándar, que contiene varias resoluciones de uso común.

momento. El CVT se refiere al "Estándar VESA Coordinated Video Timings (CVT)", que proporciona una fórmula general para calcular el tiempo de una resolución, frecuencia de actualización y otros parámetros específicos.

Puede descargar esta hoja de Excel para calcular el generador de sincronización de video coordinado VESA.

De las dos fórmulas siguientes, no necesitamos configurar los parámetros lcd_hfp y lcd_vfp, porque el controlador calculará automáticamente lcd_hfp y lcd_vfp en función de varios otros parámetros conocidos.

lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp
lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp
5.2.1 lcd_x

El número de píxeles horizontales de la pantalla, que es el ancho de la resolución de la pantalla.

5.2.2 lcd_y

El número de líneas verticales de la pantalla, que es la resolución de pantalla más alta.

5.2.3 lcd_ht

Tiempo total horizontal

Se refiere al número total de ciclos dclk seguidos. Vea abajo:

imagen-20221129175141962

Figura 5-4: pantalla LCD
5.2.4 lcd_hbp

Porche trasero horizontal

Se refiere al número de ciclos dclk entre filas válidas, el inicio de la señal de sincronización de filas (hsync) y el inicio de los datos válidos, incluido el área de la señal de sincronización. Vea la imagen de arriba. Tenga en cuenta que el segmento hspw está incluido.

Tenga en cuenta
que contiene el segmento hspw, es decir, lcd_hbp=hbp real+hspw real

5.2.5 lcd_hspw

Ancho de pulso de sincronización horizontal

Se refiere al ancho de la señal de sincronización horizontal. La unidad es el tiempo de 1 dclk (es decir, el tiempo de 1 ciclo de datos). Vea la imagen de arriba.

5.2.6 lcd_vt

Tiempo total vertical

Se refiere al número total de líneas en un campo. Vea abajo:

imagen-20221129182148157

Figura 5-5: lcdvt
5.2.7 lcd_vbp

Porche trasero vertical

Se refiere al número de líneas entre el inicio de la señal de sincronización de campo (vsync) y el inicio de la línea de datos válida, incluida el área de la señal de sincronización de campo.

ilustrar

Contiene el segmento vspw, es decir, lcd_vbp=actual vbp+actual vspw

5.2.8 lcd_vspw

Ancho de pulso de sincronización vertical

Se refiere al ancho de la señal de sincronización de campo. La unidad es fila. Vea la imagen de arriba.

5.2.9 lcd_dclk_freq

Frecuencia de reloj de puntos

Frecuencia de transmisión de píxeles de transmisión. La unidad es MHz.

fps = (lcd_dclk_freq×1000×1000) / (ht×vt)。

Este valor se calcula según la siguiente fórmula:

lcd_dclk_freq=lcd_ht lcd_vt fps

Aviso:

  1. Los siguientes tres parámetros se obtienen del manual de la pantalla y los fps generalmente son 60.
  2. Si se trata de una interfaz en serie, se necesitan de 2 a 3 ciclos para enviar un píxel.
lcd_dclk_freq * cycles = lcd_ht*lcd_vt*fps

o

lcd_dclk_freq = lcd_ht*cycles*lcd_vt*fps
5.2.10 ancho_LCD

Ancho del panel LCD en mm

Este parámetro describe el ancho físico de la pantalla LCD, en mm. Se utiliza para calcular ppp.

5.2.11 altura_lcd

Altura del panel LCD en mm.

Este parámetro describe la altura física de la pantalla LCD, en mm. Se utiliza para calcular ppp.

5.3 Parámetros relacionados con la retroiluminación

Actualmente, el ajuste de retroiluminación PWM se utiliza ampliamente. El principio es utilizar el efecto de parpadeo de alta frecuencia producido por los interruptores de pulso PWM para engañar al ojo humano y ajustar el brillo ajustando el ciclo de trabajo.

5.3.1 lcd_pwm_usado

Si se debe utilizar pwm.

Este parámetro identifica si se debe utilizar pwm para el control del brillo de la retroiluminación.

5.3.2 lcd_pwm_ch

canal pwm utilizado

Este parámetro identifica el canal Pwm utilizado. Aquí se refiere a qué canal pwm del SoC se utiliza. Puede saberlo mirando el esquema de conexión.

5.3.3 frecuencia_pwm_lcd

Frecuencia de retroiluminación LCD PWM

Este parámetro configura la frecuencia de la señal PWM en Hz.

Nota:
La frecuencia no debe ser demasiado baja, de lo contrario se verá fácilmente el parpadeo, y la frecuencia no debe ser demasiado rápida, de lo contrario el efecto de ajuste de la luz de fondo será deficiente. Algunos manuales en pantalla indicarán el rango de frecuencia PWM permitido; siga el rango fijo del manual en pantalla para realizar la configuración.
Es fácil ver el parpadeo con un brillo bajo, lo cual es un fenómeno normal, como se sabe actualmente que es el caso de las luces de fondo PWM.

5.3.4 lcd_pwm_pol

Retroiluminación LCD Polaridad PWM

Este parámetro configura la polaridad del ciclo de trabajo de la señal PWM. El significado correspondiente de establecer el valor correspondiente es:

0:active high
1:active low
5.3.5 lcd_pwm_max_limit

Límite máximo de retroiluminación LCD PWM, expresado en valor de brillo

Por ejemplo, 150 significa que la luz de fondo solo se puede ajustar hasta 150, y el valor de brillo en el rango de 0-255 se asignará linealmente al rango de 0-150. Se utiliza para controlar el brillo máximo de la retroiluminación y ahorrar consumo de energía.

5.3.6 lcd_bl_es

Pin de habilitación de retroiluminación, opcional, vea si hay uno en el diagrama esquemático.Se utiliza para habilitar o deshabilitar el voltaje del circuito de retroiluminación.

Ejemplo: lcd_bl_en = puerto:PD24<1><2><1>

Significado: Encienda la retroiluminación de la pantalla LCD cuando el PD24 emita un nivel alto; bájelo, el valor predeterminado es un nivel alto

• El primer paréntesis angular: asignación de función, se emite 1;

• El segundo corchete angular: resistencia incorporada; si se usa 0, indica el estado de alta impedancia de la resistencia interna, si es 1, significa que la resistencia interna se levanta y si es 2, significa que La resistencia interna baja. El uso predeterminado representa el estado predeterminado, es decir, la resistencia está encendida

jalar. Otros datos no son válidos.

• El tercer corchete angular: capacidad de conducción; la capacidad de conducción predeterminada de la tabla es el nivel 1

• El cuarto paréntesis angular: nivel; 0 es nivel bajo, 1 es nivel alto.

El controlador de pantalla debe llamar a la interfaz correspondiente para controlar el encendido y apagado.

ilustrar

En términos generales, el nivel alto está habilitado. Bajo esta premisa, se recomienda configurar la resistencia interna en pull-down para evitar el pull-up causado por el hardware, lo que hace que la luz de fondo se encienda antes de tiempo. Complete el nivel predeterminado como nivel alto, que es lo que ha mostrado uboot.

Pantalla de grado a núcleo, suave y sin parpadeos.

5.3.7 lcd_bl_n_percent

Valor de mapeo de retroiluminación, n es (0-100)

Esta función es para pantallas LCD con brillo no lineal. Ajusta el cambio de brillo de acuerdo con la curva de brillo configurada para hacer que el cambio de brillo sea más lineal.

Por ejemplo, lcd_bl_50_percent = 60 significa que el valor de brillo del 50% se ajusta al 60%, es decir, el brillo aumenta en un 10% con respecto al valor original.

ilustrar

La modificación inadecuada de esta propiedad puede provocar un efecto de ajuste deficiente de la retroiluminación.

5.3.8 retroiluminación lcd

Valor predeterminado de retroiluminación, 0-255.

Este atributo determina el brillo durante la etapa de visualización del logotipo en uboot. Al ingresar al kernel, se lee la configuración guardada para determinar el brillo.

ilustrar

En la etapa de visualización del logotipo, en términos generales, se requiere un brillo relativamente brillante, y esta es la práctica en la industria.

5.4 Parámetros relacionados con el efecto de visualización

5.4.1 lcd_frm

Modulador de velocidad de fotogramas LCD

FRM es para resolver el problema de profundidad de color causado por la reducción de PIN.

El significado correspondiente de esta configuración de parámetro es:

0:RGB888 -- RGB888 direct
1:RGB888 -- RGB666 dither
2:RGB888 -- RGB565 dither

El formato de píxeles de algunas pantallas LCD es una profundidad de color de 18 bits (RGB666) o una profundidad de color de 16 bits (RGB565). Se recomienda activar la función FRM y compensar la profundidad de color mediante difuminado, para que la pantalla alcance 24 Profundidad de color de bits (RGB888)

Efecto. Como se muestra en la figura siguiente, la figura superior es una pantalla LCD con una profundidad de color de RGB66, y la figura inferior es la pantalla después de activar el tramado. Después de activar el tramado, el gradiente de color es excesivamente suave.

imagen-20221130172026584

Figura 5-6: lcd_frm abierto

imagen-20221130172041420

Figura 5-7: cierre lcd_frm
5.4.2 lcd_gamma_es

Habilitación de corrección gamma LCD

El significado correspondiente de establecer el valor correspondiente es:

0:Lcd的Gamma校正功能关闭
1:Lcd的Gamma校正功能开启

Cuando se establece en 1, es necesario asignar lcd_gamma_tbl[256] en el controlador de pantalla.

5.4.3 lcd_cmap_es

Habilitar mapa de color LCD

El significado correspondiente de establecer el valor correspondiente es:

0:Lcd的色彩映射功能关闭
1:Lcd的色彩映射功能开启

Cuando se establece en 1, la tabla de mapa de colores Lcd debe asignarse a lcd_cmap_tbl [2][3][4].

Cada píxel tiene tres unidades: R, G y B. Cada cuatro píxeles constituyen una selección, con un total de 12 opciones. La primera dimensión de la matriz representa las filas pares e impares, la segunda dimensión representa el RGB del píxel y la tercera dimensión representa el número de píxel.

El contenido de representa el contenido asignado a la ubicación.

LCD CMAP es una función de salida de mapeo para píxeles. Solo es necesario configurar las pantallas LCD con disposiciones especiales de píxeles.

LCD CMAP define 4 píxeles en cada fila como una unidad total, y cada píxel se divide en 3 unidades pequeñas de R, G y B, para un total de 12 unidades pequeñas. Defina la relación de mapeo a través de lcd_cmap_tbl, y cada pequeña unidad de salida puede ser

Está previsto que se asigne a una de las 12 unidades pequeñas.

__u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0,LCD_CMAP_B1,LCD_CMAP_G2,LCD_CMAP_B3},
        {LCD_CMAP_B0,LCD_CMAP_R1,LCD_CMAP_B2,LCD_CMAP_R3},
        {LCD_CMAP_R0,LCD_CMAP_G1,LCD_CMAP_R2,LCD_CMAP_G3},
    },
    {
        {LCD_CMAP_B3,LCD_CMAP_G2,LCD_CMAP_B1,LCD_CMAP_G0},
        {LCD_CMAP_R3,LCD_CMAP_B2,LCD_CMAP_R1,LCD_CMAP_B0},
        {LCD_CMAP_G3,LCD_CMAP_R2,LCD_CMAP_G1,LCD_CMAP_R0},
    },
};

Como arriba, las tres líneas superiores representan la disposición de los píxeles de las filas impares y las tres líneas inferiores representan la disposición de los píxeles de las filas pares.

Cada cuatro píxeles es una unidad, la primera columna representa el primer mapa de píxeles de cada cuatro píxeles, la segunda columna representa el segundo mapa de píxeles de cada cuatro píxeles, y así sucesivamente.

Como se definió anteriormente, el formato de salida de píxeles es el que se muestra en la siguiente figura.

imagen-20221130172721739

Figura 5-8: cmap
5.4.4 lcd_rb_swap

Reemplace el componente R y el componente B en el RGB del módulo tcon.

0:不变
1:调换R分量和B分量

5.5 Fuente de alimentación y parámetros de pin

5.5.1 Descripción general

Si es necesario utilizar una determinada fuente de alimentación, se debe definir en el nodo [disp] y la cadena utilizada en la parte [lcd] debe ser coherente con la definida en disp. Por ejemplo, el siguiente ejemplo:

disp: disp@01000000 {
    disp_init_enable = <1>;
    disp_mode = <0>;
    /* VCC-LCD */
    dc1sw-supply = <&reg_sw>;
    /* VCC-LVDS and VCC-HDMI */
    bldo1-supply = <&reg_bldo1>;
    /* VCC-TV */
    cldo4-supply = <&reg_cldo4>;
};

Entre ellos, -supply es fijo y la cadena anterior a -supply es arbitraria, pero se recomienda elegir un nombre significativo. El <®_sw> después de = debe encontrarse en el nodo regulator0 de board.dtsi.

Luego, en el nodo lcd0, si desea usar reg_sw, simplemente escríbalo de la siguiente manera, dc1sw corresponde a dc1sw-supply.

lcd_power=”dc1sw”

Dado que u-boot también tiene un controlador axp, un controlador de pantalla y un kernel, todos leen la misma configuración. Para que sean compatibles entre sí, existen las siguientes restricciones al nombrar:

En u-boot 2018, el controlador axp solo reconoce nombres definidos en el chip axp como bldo1, por lo que al nombrar xxxsupply, es mejor nombrarlo de acuerdo con la definición del chip axp.

5.5.2 potencia_lcd

Véanse las consideraciones descritas anteriormente.

示例:lcd_power = “vcc-lcd”

Configure el nombre del regulador. Después de la configuración, el controlador de pantalla debe llamar a la interfaz correspondiente para el control de encendido y apagado.

Nota: Si hay varias fuentes de alimentación que deben encenderse, defina lcd_power1, lcd_power2, etc.

5.5.3 lcd_pin_power

El uso de lcd_power es el mismo, la diferencia es que después de que el usuario lo configura, no es necesario operarlo en el controlador de pantalla, sino que el marco del controlador lo habilita antes que el controlador de pantalla y lo deshabilita después del controlador de pantalla.

示例:lcd_pin_power = “vcc-pd”

Nota: Si se requieren varios grupos, agregue lcd_pin_power1, lcd_pin_power2, etc. Además de lcddx, la fuente de alimentación aquí también puede ser la fuente de alimentación del pin correspondiente a pwm.

5.5.4 lcd_gpio_0
示例:lcd_gpio_0 = port:PD25<0><0><default><0>

Significado: el pin lcd_gpio_0 es PD25.

• Primer paréntesis angular: asignación de funciones, 0 es entrada, 1 es salida.

• El segundo corchete angular: resistencia incorporada; si se usa 0, indica el estado de alta impedancia de la resistencia interna, si es 1, significa que la resistencia interna se levanta y si es 2, significa que La resistencia interna baja. El uso predeterminado representa el estado predeterminado, es decir, la resistencia está encendida

jalar. Otros datos no son válidos.

• El tercer corchete angular: capacidad de accionamiento; la capacidad de accionamiento de la mesa predeterminada es el nivel 1.

• El cuarto corchete angular: indica el valor predeterminado, es decir, cuando se configura como salida, el nivel de salida del pin, 0 es nivel bajo, 1 es nivel alto.

El controlador de pantalla necesita llamar a la interfaz correspondiente para controlar el menú desplegable y desplegable. Consulte la descripción de la función de control de pin.

Nota: Si hay varios pines gpio que deben controlarse, defina lcd_gpio_0, lcd_gpio_1, etc.

5.5.5 lcddx

Ejemplo: lcdd0 = puerto:PD00<3><0>

Significado: este pin de lcdd0, es decir, PD0, está configurado como salida LVDS.

• El primer paréntesis angular: asignación de funciones; 0 es entrada, 1 es salida, 2 es salida LCD, 3 es salida de interfaz LVDS y 7 es deshabilitación.

• El segundo corchete angular: resistencia incorporada; si se usa 0, indica el estado de alta impedancia de la resistencia interna, si es 1, significa que la resistencia interna se levanta y si es 2, significa que La resistencia interna baja. El uso predeterminado representa el estado predeterminado, es decir, la resistencia está encendida

jalar. Otros datos no son válidos.

• El tercer corchete angular: capacidad de accionamiento; la capacidad de accionamiento de la mesa predeterminada es el nivel 1.

• El cuarto corchete angular: indica el valor predeterminado, es decir, cuando se configura como salida, el nivel de salida del pin, 0 es nivel bajo, 1 es nivel alto.

La configuración del PIN LCD es la siguiente:

Cuando la pantalla LCD es una pantalla HV RGB o una pantalla CPU/I80, el puerto IO correspondiente debe definirse como salida LCD (si es salida 0, el primer corchete angular es 2; si es salida 1, el primer corchete angular es 3).

Para correspondencia de IO específica, consulte el manual del usuario para la configuración.

Todas las IO del PIN LCD pueden no definirse mediante comentarios y el controlador de pantalla no inicializa las IO de comentarios.

El controlador de pantalla debe llamar a la interfaz correspondiente para controlar el encendido y apagado.

Nota: No es necesario que se llame lcdd0. Cambiarlo a otro nombre no tendrá ningún impacto en el controlador. Esto es solo por conveniencia de la memoria.

5.5.6 pinctrl-0 y pinctrl-1

Al configurar el nodo lcd0, cuando necesita configurar la reutilización de pines, solo necesita asignar pinctrl-0 y pinctrl-1. Puede usar los pines definidos de antemano o puede usar sus propios pines definidos de antemano. Generalmente disponible

Para encontrar la definición en el directorio del kernel arch/arm/boot/dts o arch/arm64/boot/dts: platform-pinctrl.dtsi.

ejemplo:

pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//休眠时候的定义,io_disable
Tabla 5-1: Nombres de pines definidos de antemano
Nombre del pin describir
rgb24_pins_a y rgb24_pins_b Interfaz de pantalla RGB y el ancho de bits de datos es 24, RGB888
rgb18_pins_a y rgb18_pins_b Interfaz de pantalla RGB y el ancho de bits de datos es 16, RGB666
lvds0_pins_a y lvds0_pins_b Interfaz LVDS de enlace único Definición de 0 pines (pantalla principal lcd0)
lvds1_pins_a y lvds1_pins_b Interfaz LVDS de enlace único Definición de 1 pin (pantalla principal lcd0)
lvds2link_pins_a y lvds2link_pins_b Definición de pin de interfaz LVDS de doble enlace (pantalla principal lcd0)
lvds2_pins_a y lvds2_pins_b Interfaz LVDS de enlace único Definición de 0 pines (pantalla principal lcd1)
lvds3_pins_a y lvds3_pins_b Interfaz LVDS de enlace único Definición de 1 pin (pantalla principal lcd1)
lcd1_lvds2link_pins_a y lcd1_lvds2link_pins_b Definición de pin de interfaz LVDS de doble enlace (pantalla principal LCD1)
dsi4lane_pins_a y dsi4lane_pins_b Definición de pin de interfaz de pantalla DSI de 4 carriles

Personaliza un par de pies

Escrito en board.dtsi, siempre que el nombre no repita el nombre existente, primero determine si el pin que necesita usar pertenece al dominio de la CPU grande o al dominio de la CPU pequeña, y utilícelo para determinar si la definición del pin debe ser colocarse en pio (cpu grande

dominio) o bajo r_pio (dominio de CPU pequeña).

ejemplo:

&pio {
    I8080_8bit_pins_a: I8080_8bit@0 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
            PD19", "PD20", "PD21";
            allwinner,function = "I8080_8bit";
            allwinner,muxsel = <2>;
            allwinner,drive = <3>;
            allwinner,pull = <0>;
        };
        I8080_8bit_pins_b: I8080_8bit@1 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
            allwinner,function = "I8080_8bit_suspend";
            allwinner,muxsel = <7>;
            allwinner,drive = <3>;
            allwinner,pull = <0>;
    };
};

• pines, pines específicos.

• pname, nombre del pin, elíjalo casualmente.

• function, el nombre de la función pin, elíjalo casualmente.

• muxsel, selección de función de pin. Seleccione la función correspondiente según la especificación del puerto.

• unidad, capacidad de la unidad, cuanto mayor sea el valor, mayor será la capacidad de la unidad.

• tirar, tirar hacia arriba y hacia abajo. Si se usa 0, indica que la resistencia interna está en un estado de alta impedancia. Si es 1, significa que la resistencia interna está subiendo. Si se usa 2, significa que la resistencia interna está tirando hacia abajo. El uso de default representa el estado predeterminado, que es un pull-up de resistencia. Otros números

Los datos no son válidos.

为了规范,我们将在所有平台保持一致的名字,其中后缀为a 为管脚使能,b 的为io_disable 用于设备关闭时。

有时候,你需要用两组不同功能的管脚,可以像下面这样定义即可。

pinctrl-0 = <&rgb24_pins_a>, <&xxx_pins_a>;
pinctrl-1 = <&rgb24_pins_b>, <&xxx_pins_b>;//休眠时候的定义,io_disable

5.6 ESD 静电检测自动恢复功能

这个功能在linux4.9 以及linux 3.10 sunxi-product 分支上实现了,如果需要这个功能,需要完成以下步骤。

首先打开如下内核配置:

imagen-20221130174114112

图5-9: ESD 内核配置

修改屏驱动,实现三个回调函数:

如下示例,在屏he0801a068 上添加esd 相关的回调函数。
(linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/he0801a068.c)。

imagen-20221130174231109

图5-10: ESD 屏驱动添加函数

esd_check 函数原型:

S32 esd_check(u32 sel)

作用:是给上层反馈当前屏的状态。

返回值:如果屏正常的话就返回0,不正常的话就返回非0。

sel:显示索引。

由于屏的类型接口众多,不同屏检测屏的状态各异,一般来说是通过驱动接口读取屏的内部信息(id 或者其它寄存器),如果获取正常则认为屏是正常的,获取失

败则认为屏是异常的。比如下面dsi 屏的做法:

imagen-20221130174303084

图5-11: ESD 屏驱动函数实现

此外,一般情况下,也会通过dsi 接口读取0x0A 命令(获取power 模式)来判断屏是否正常。

sunxi_lcd_dsi_dcs_read(sel, 0x0A, result, &num)

imagen-20221130174341400

图5-12: ESD MIPI 状态寄存器

reset_panel 函数原型:

s32 reset_panel(u32 sel)

作用:当屏幕异常的时候所需要的复位操作。

返回值:复位成功就是0,复位失败非0。

sel:显示索引。

每个屏的初始化都不同,顺序步骤都不一样,总的来说就是执行部分或者完整的屏驱动里面的close_flow 和open_flow 所定义的回调函数。根据实际情况灵活编写

这个函数。

值得注意的是:某些dsi 屏中,需要至少执行过一次sunxi_lcd_dsi_clk_disable(dsi 高速时钟禁止)和sunxi_lcd_dsi_clk_enable(高速时钟使能),否则可能导致

dsi 的读函数异常。

下图是复位函数示例:

imagen-20221130174745808

图5-13: ESD 复位函数1

set_esd_info 函数原型:

s32 set_esd_info(struct disp_lcd_esd_info *p_info)

作用:控制esd 检测的具体行为。比如间隔多长时间检测一次,复位的级别,以及检测函数被调用的位置。

返回值:成功设置返回0,否则非0。

p_info:需要设置的esd 行为结构体。

示例:下面图所示,每隔60 次显示中断检测一次(调用esd_check 函数,如果显示帧率是60fps 的话,那么就是1 秒一次),然后将在显示中断处理函数里面执行

检测函数,由esd_check_func_pos 成员决定调用esd_check 函数的位置,如果是0 则在中断之外执行检测函数,之所以有这个选项是因为显示中断资源(中断处

理时间)是非常珍贵的资源,关系到显示帧率的问题。下图中的level 为1 表示复位全志SoC 的LCD 相关模块以及reset_panel 里面的操作,level 为0 的时候表示

仅仅执行reset_panel 里面的操作。

imagen-20221130174832573

图5-14: ESD 设置信息函数

可以通过cat /sys/class/disp/disp/attr/sys 获取当前的esd info。

screen 0:
de_rate 594000000 hz, ref_fps:60
mgr0: 2560x1600 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] unblank err[0]
force_sync[0]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
capture: dis req[0] runing[0] done[0,0]
lcd output(enable) backlight( 50) fps:60.9 esd level(1) freq(300) pos(1)
reset(244) 2560x1600
err:0 skip:0 skip T.O:50 irq:73424 vsync:0 vsync_skip:0
BUF en ch[1] lyr[0] z[0] prem[N] fbd[N] a[globl 255] fmt[ 0] fb
[2560,1600;2560,1600;2560,1600] crop[ 0, 0,2560,1600] frame[ 0, 0,2560,1600]
addr[98100000,00000000,00000000] right[00000000,00000000,00000000] flags[0x00] trd[0,0]
depth[ 0]
acquire: 0, 25.5 fps
release: 0, 25.5 fps
display: 0, 25.5 fps

esd level(1) freq(300) pos(1) reset(244)

esd levele 和freq 和pos 的意思请看上面set_esd_info 函数原型的解释。

Reset 后面的数字表示屏复位的次数(也就是esd 导致屏挂掉之后,并且成功检测到并复位的次数)。

此功能可能遇到的问题。

  1. 打静电挂了,但是读出来的值仍然是正确的,此问题无解。

  2. Dsi 读操作卡住了,卡在中断里面了。此问题可能和DSI 的lp 模式下的速率有关系,而lp 的速率又和dclk 的频率有关系。此时可以尝试修改de_dsi_28.c() 文件

中的dsi_basic_cfg 函数,如下图所示红框所示的寄存器值,这个寄存器是Lp 模式时钟分频值,一般来说这个值越小,lp 速率越快,尝试改小看是否还会卡

住。

imagen-20221130175036108

图5-15: Lp 模式时钟分频值

6 调试方法

系统起来之后可以读取sysfs 一些信息,来协助调试。

6.1 加快调试速度的方法

很明显,如果你在安卓上调试LCD 屏会比较不方便,安卓编译时间和安卓固件都太过巨大,每次修改内核后,可能都要经过10 几分钟都才能验证,这样效率就太

低下了,可用采用如下方法:

  1. 使用linux 固件而不是安卓固件。SDK 是支持仅仅编译linux 固件,一般是配置lichee 或者longan 的时候选择linux,打包的时候,用lichee 或者longan 根目录

下的build.sh 来打包就行。因为linux 内核小得多,编译更快,更方便调试。

  1. 使用内核来调试LCD 屏。我们知道Uboot 和内核都需要添加LCD 驱动,这样才能快速显示logo,但是uboot 并不方便调试,所以有时候我们需要把uboot 的

显示驱动关掉,专心调试内核的LCD 驱动,调好之后才移植到uboot,另外这样做的一个优点是,我可以非常方便的修改lcd timing 而不需要重烧固件。就是

利用uboot 命令的fdt 命令修改device tree。
比如说:

fdt set lcd0 lcd_hbp <40>

更多命令见fdt help。

如何关闭uboot 显示呢,一般是在uboot 源码路径下inlcude/configs/平台.h 中,注释掉CONFIG_SUNXI_MODULE_DISPLAY 即可,如果是uboot 2018 则是注释

掉configs/平台_defconfig 中CONFIG_DISP2_SUNXI。

6.2 查看显示信息

以下信息是所有信息中最重要的。

cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 297000000 hz, ref_fps:60
mgr0: 1280x800 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0]
unblank direct_show[false]
lcd output backlight( 50) fps:60.9 1280x 800
err:0 skip:31 irq:1942 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[0] prem[N] a[globl 255] fmt[ 8] fb[1280, 800;1280,
800;1280, 800] crop[ 0, 0,1280, 800] frame[ 0, 0,1280, 800] addr[ 0,
0, 0] flags[0x 0] trd[0,0]

lcd output

表示当前显示接口是LCD 输出。

1280x800

表示当前LCD 的分辨率,与board.dts 中lcd0 的设置一样。

ref_fps:60

是根据你在board.dts的lcd0填的时序算出来的理论值。

fps:60.9

后面的数值是实时统计的,正常来说应该是在60(期望的fps) 附近,如果差太多则不正常,重新检查屏时序,和在屏驱动的初始化序列是否有被调用到。

irq:1942

这是vsync 中断的次数,每加1 都代表刷新了一帧,正常来说是一秒60(期望的fps)次,重复cat sys,如果无变化,则异常。

BUF

开头的表示图层信息,一行BUF 表示一个图层,如果一个BUF 都没有出现,那么将是黑屏,不过和屏驱动本身关系就不大了,应该查看应用层& 框架层。

err:0

这个表示缺数,如果数字很大且一直变化,屏幕会花甚至全黑,全红等。

skip:31

这个表示跳帧的数量,如果这个数值很大且一直变化,有可能卡顿,如果数字与irq 后面的数字一样,说明每一帧都跳,会黑屏(有背光)。

6.3 查看电源信息

查看axp 某一路电源是否有enable 可以通过下面命令查看。当然这个只是软件的,实际还是用万用表量为准。

cat /sys/class/regulator/dump
pmu1736_ldoio2 : disabled 0 700000 supply_name:
pmu1736_ldoio1 : disabled 0 700000 supply_name:
pmu1736_dc1sw : enabled 1 3300000 supply_name: vcc-lcd
pmu1736_cpus : enabled 0 900000 supply_name:
pmu1736_cldo4 : disabled 0 700000 supply_name:
pmu1736_cldo3 : disabled 0 700000 supply_name:
pmu1736_cldo2 : enabled 1 3300000 supply_name: vcc-pf
pmu1736_cldo1 : disabled 0 700000 supply_name:
pmu1736_bldo5 : enabled 2 1800000 supply_name: vcc-cpvin vcc-pc
pmu1736_bldo4 : disabled 0 700000 supply_name:
pmu1736_bldo3 : disabled 0 700000 supply_name:
pmu1736_bldo2 : disabled 0 700000 supply_name:
pmu1736_bldo1 : disabled 0 700000 supply_name:
pmu1736_aldo5 : enabled 0 2500000 supply_name:
pmu1736_aldo4 : enabled 0 3300000 supply_name:
pmu1736_aldo3 : enabled 1 1800000 supply_name: avcc
pmu1736_aldo2 : enabled 0 1800000 supply_name:
pmu1736_aldo1 : disabled 0 700000 supply_name:
pmu1736_rtc : enabled 0 1800000 supply_name:
pmu1736_dcdc6 : disabled 0 500000 supply_name:
pmu1736_dcdc5 : enabled 0 1480000 supply_name:
pmu1736_dcdc4 : enabled 1 900000 supply_name: vdd-sys
pmu1736_dcdc3 : enabled 0 900000 supply_name:
pmu1736_dcdc2 : enabled 0 1160000 supply_name:
pmu1736_dcdc1 : enabled 4 3300000 supply_name: vcc-emmc vcc-io vcc-io vcc-io

6.4 查看pwm 信息

pwm 的用处这里是提供背光电源。

cat /sys/kernel/debug/pwm
platform/7020c00.s_pwm, 1 PWM device
pwm-0 ((null) ): period: 0 ns duty: 0 ns polarity: normal
platform/300a000.pwm, 2 PWM devices
pwm-0 (lcd ): requested enabled period: 20000 ns duty: 3984 ns polarity:
normal
pwm-1 ((null) ): period: 0 ns duty: 0 ns polarity: normal

上面的“requested enabled” 表示请求并且使能了,括号里面的lcd 表示是由lcd 申请的。

6.5 查看管脚信息

cat /sys/kernel/debug/pinctrl/pio/pinmux-pins
pin 227 (PH3): twi1 (GPIO UNCLAIMED) function io_disabled group PH3
pin 228 (PH4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 229 (PH5): (MUX UNCLAIMED) pio:229
pin 230 (PH6): (MUX UNCLAIMED) pio:230
pin 231 (PH7): (MUX UNCLAIMED) pio:231

上面的信息我们知道PH5,PH6 这些IO 被申请为普通GPIO 功能,而PH3 被申请为twi1。

6.6 查看时钟信息

cat /sys/kernel/debug/clk/clk_summary

这个命令可以看哪个时钟是否使能,然后频率是多少。

与显示相关的是tcon,pll_video,mipi 等等。

cat /sys/kernel/debug/clk/clk_summary | grep tcon
cat /sys/kernel/debug/clk/clk_summary | grep pll_video
cat /sys/kernel/debug/clk/clk_summary | grep mipi

6.7 查看接口自带colorbar

显示是一整条链路,中间任何一个环节出错,最终的表现都是显示异常,图像显示异常几个可能

原因:

  1. 图像本身异常。
  2. 图像经过DE(Display Engine)后异常。
  3. 图像经过接口模块后异常。这是我们关注的点。

有一个简单的方法可以初步判断,接口模块(tcon 和dsi 等)可以自己输出内置的一些patten(比如说彩条、灰阶图、棋盘图等),当接口输出这些内置patten

的时候,如果这时候显示就异常,这说明了:

  1. LCD 的驱动或者配置有问题。
  2. LCD 屏由于外部环境导致显示异常。

显示自带patten 的方式:

在linux-4.9 及其以上版本的内核,disp 的sysfs 中有一个attr 可以直接操作显示:

echo X > /sys/class/disp/disp/attr/colorbar

上面的操作是显示colorbar,其中的X 可以是0 到8,对应的含义如下图所示:

imagen-20221130180522997

图6-1: colorbar

如果有多个显示设备,想让第二个显示设备显示colorbar 的话,那么先:

echo 1 > /sys/class/disp/disp/attr/disp

然后再执行上面操作。

如果没有这个attr 的话,可以直接操作寄存器,也就是操作tcon 寄存器的040 偏移的最低3位。

在linux 下,cd /sys/class/sunxi_dump 然后:

echo 0x06511040 > dump;cat dump

这样会打印当前tcon 的040 偏移寄存器的值,然后在上面值的基础上修改最低3 位为上图的值即可,修改方式示例:

echo 0x06511040 0x800001f1 > write

注意tcon 的基地址不一定是0x06511000,不同平台不一样,请参考SoC 文档获取tcon 的基地址。

6.8 DE 截屏

显示出现异常的时候,有可能是下面三个原因:

  1. SoC 端屏接口模块+LCD 屏出现了问题。
  2. 图像经过SoC 端图像合成模块(DE)处理后出现了问题。
  3. 图像源本身就有问题。
    本节介绍,确认图像源本身没问题的前提下,如何进一步确认是否经过DE 处理之后图像是否有问题。

语法:

echo 屏幕索引> /sys/class/disp/disp/attr/disp
echo 路径/bmp文件名> /sys/class/disp/disp/attr/capture_dump

第一个echo 的作用是确定捕捉哪个显示的,“屏幕索引” 可选取值是0 或者1。

第二个echo 作用是生成截屏bmp 文件,确保“路径” 是可写的,有剩余空间的。

比如:

echo 0 > /sys/class/disp/disp/attr/disp
echo /data/xx.bmp > /sys/class/disp/disp/attr/capture_dump

这样就会在/data 目录下生成screen 0 的bmp 截图,文件名是xx.bmp。

除了bmp 之外,还支持保存raw 数据,包括RGB 和YUV 颜色空间,它们以后缀来区分,用法

如下:

# 截取yuv420p颜色空间的raw数据。
echo /data/xx.yuv420_p > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_uvuv颜色空间的raw数据。
echo /data/xx.yuv420_sp_uvuv > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_vuvu颜色空间的raw数据。
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_vuvu颜色空间的raw数据。
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# 截取argb8888颜色空间的raw数据。
echo /data/xx.argb8888 > /sys/class/disp/disp/attr/capture_dump
# 截取abgr8888颜色空间的raw数据。
echo /data/xx.abgr8888 > /sys/class/disp/disp/attr/capture_dump
# 截取rgb888颜色空间的raw数据。
echo /data/xx.rgb888 > /sys/class/disp/disp/attr/capture_dump
# 截取bgr888颜色空间的raw数据。
echo /data/xx.bgr888 > /sys/class/disp/disp/attr/capture_dump
# 截取rgba8888颜色空间的raw数据。
echo /data/xx.rgba8888 > /sys/class/disp/disp/attr/capture_dump
# 截取bgra8888颜色空间的raw数据。
echo /data/xx.bgra8888 > /sys/class/disp/disp/attr/capture_dump

注意:这个功能只有linux-4.9 以及后续的内核才支持这个功能。

7 FAQ

7.1 屏显示异常

总结过往经验,绝大部分屏显异常都是由于上下电时序和timing 不合理导致。

请看屏时序参数说明和屏驱动分解。

7.2 黑屏-无背光

问题表现:完全黑屏,背光也没有。

有两种可能:

  1. 屏驱动添加失败。驱动没有加载屏驱动,导致背光电源相关函数没有运行到。这个你可以通过调试方法定位下。
  2. pwm 配置和背光电路的问题,pwm 的信息可以看pwm 信息和背光相关参数,另外就是直接测量下硬件测量下相关管脚和电压。

7.3 黑屏-有背光

黑屏但是有背光,可能有多种原因导致,请依次按以下步骤检查:

  1. 没送图层。如果应用没有送任何图层那么表现的现象就是黑屏,通过查看显示信息一小节可以确定有没有送图层。如果确定没有图层,可以通过查看接口自带

colorbar,确认屏能否正常显示。

  1. SoC 端的显示接口模块没有供电。SoC 端模块没有供电自然无法传输视频信号到屏上。一般SoC 端模块供电的axp 名字叫做vcc-lcd,vcc-dsi,vcc33-lcd,

vcc18-dsi 等。

  1. 复位脚没有复位。如果有复位脚,请确保硬件连接正确,确保复位脚的复位操作有放到屏驱动中。

  2. board.dts 中lcd0 有严重错误。第一个是lcd 的timing 太离谱,请严格按照屏手册中的提示来写!参考屏时序参数说明。第二个就是,接口类型搞错,比如接

的DSI 屏,配置却写成LVDS 的。

  1. 屏的初始化命令不对。包括各个步骤先后顺序,延时等,这个时候请找屏厂确认初始化命令。

7.4 闪屏

分为几种:

  1. 屏的整体在闪。

这个最大可能是背光电路的电压不稳定,检查电压。

  1. 屏部分在闪,而且是概率性。

board.dts 中的时序填写不合理。

  1. 屏上由一个矩形区域在闪。

屏极化导致,需要关机放一边再开机则不会。

7.5 条形波纹

有些LCD 屏的像素格式是18bit 色深(RGB666)或16bit 色深(RGB565),建议打开FRM功能,通过dither 的方式弥补色深,使显示达到24bit 色深(RGB888)

的效果。如下图所示,上图是色深为RGB66 的LCD 屏显示,下图是打开dither 后的显示,打开dither 后色彩渐变的地方过度平滑。

设置[lcd0] 的lcd_frm 属性可以改善这种现象。请看lcd_frm解释。

7.6 背光太亮或者太暗

请看背光相关参数。

7.7 重启断电测试屏异常

花屏的第一个原因是fps 过高,超过屏的限制:

FPS 异常是一件非常严重的事情,关系到整个操作系统的稳定,如果fps 过高会造成系统带宽增加,送显流程异常,fps 过高还会造成LCD 屏花屏不稳定,容易造

成LCD 屏损坏,FPS 过低则造成用户体验过差。

  1. 通过查看查看显示信息一节,可以得知现在的实时统计的fps。

  2. 如果fps 离正常值差很多,首先检查board.dts 中[lcd0] 节点,所填信息必须满足下面公式。

lcd_dclk_freq*num_of_pixel_clk=lcd_ht*lcd_vt*fps /1e9

其中,num_of_pixel_clk 通常为1,表示发送一个像素所需要的时钟周期为1 一个,低分辨率的MCU 和串行接口通常需要2 到3 个时钟周期才能发送完一个像素。

如果上面填写没有错,通过查看查看时钟信息一节可以确认下几个主要时钟的频率信息,把这些信息和board.dts 发给维护者进一步分析。

7.8 RGB 接口或者I8080 接口显示抖动有花纹

  1. 改大时钟管脚的管脚驱动能力
    参考lcd_gpio_0一小节和pinctrl-0 和pinctrl-1,修改驱动能力,改大。

还有另外一种写法,比如原来是:

lcdclk = port:PD18<2><0><2><default>

可以改成:

lcdclk = port:PD18<2><0><3><default>
  1. 修改时钟相位,也就是修改lcd_hv_clk_phase。由于发送端和接收端时钟相位的不同导致接收端解错若干位。

7.9 LCD 屏出现极化和残影

何谓液晶极化现象:实际上就是液晶电介质极化。就是在外界电场作用下,电介质内部沿电场方向产生感应偶极矩,在电解质表明出现极化电荷的现象叫做电介质

的极化。

通俗的讲就是在液晶面板施加一定电压后,会聚集大量电荷,当电压消失的时候,这些聚集的电荷也要释放,但由于介电效应,这些聚集的电荷不会立刻释放消

失,这些不会马上消失的惰性电荷造成了液晶的DC 残留从而形成了极化现象。

几种常见的液晶极化现象

  1. 液晶长期静止某个画面的时候,切换到灰阶画面的时候出现屏闪,屏闪一段时间后消失。这种现象属于残留电荷放电的过程。

  2. 液晶长期静止某个画面的时候,出现四周发黑中间发白的现象,业内称为黑白电视框异常。

  3. 非法关机的时候,重新上电会出现屏闪,屏闪一定时间后消失。与第一种原因相同。

  4. 残影现象:当液晶静止在一个画面比较久的情况下,切换其他画面出现的镜像残留。残影的本质来说是液晶DC 残留电荷导致,某种意义来说也属于液晶极化

现象。

针对液晶屏出现极化和残影现象,有如下对策。

  1. 调整vcom 电压大小。
    VCOM 是液晶分子偏转的参考电压,要求要稳定,对液晶显示有直接影响,具体的屏不同的话也是不同的。电压的具体值是根据输入的数据以及Vcom 电压大

小来确定的,用来显示各种不同灰阶,也就是实现彩色显示GAMMA。Gamma 电压是用来控制显示器的灰阶的,一般情况下分为G0~G14,不同的Gamma

电压与Vcom 电压之间的压差造成液晶旋转角度不同从而形成亮度的差异,Vcom 电压最好的状况是位于G0 和G14 的中间值,这样液晶屏的闪烁状况会最

好。

调节vcom 电压的方式,如果屏管脚有vcom 管脚,直接调整相关电路,如果屏driver IC 提供寄存器接口,可以通过寄存器接口来调整大小。

  1. 严格按照屏规定的上下电时序来对屏进行开关屏。许多极化残影现象并非长时间显示静止显示某个画面导致的,而是由于关机或者关屏时没有严格按照下电时

序导致的,比如该关的电没关,或者延时不够。

8 总结

La depuración de la pantalla LCD es en realidad un proceso de depuración del chip emisor (Allwinner SoC) y el chip receptor (controlador IC en la pantalla LCD):

  1. Para agregar un controlador de pantalla, consulte los pasos para agregar un controlador de pantalla y las instrucciones del controlador de pantalla.
  2. Lea atentamente el manual de la pantalla y el manual del controlador IC.
  3. Lea atentamente la descripción de los parámetros de hardware.
  4. Asegúrese de que todos los pines de alimentación requeridos por la pantalla LCD sean normales.

Supongo que te gusta

Origin blog.csdn.net/thisway_diy/article/details/128458756
Recomendado
Clasificación