Prefacio
Este artículo se centra en la experiencia de la depuración del chip ADV7533 en la plataforma Qualcomm msm8909
Plataforma de hardware: msm8909
Plataforma de software: Android5.0 Android8.0 (ambos han sido ajustados)
Chip IC: ADV7533
Realización de funciones: MIPI a HDMI
Introducción:
ADV7533 es un chip de conversión que puede convertir señales MIPI estándar en señales HDMI.
Es decir, la señal del terminal de control maestro de msm8909 se convierte en señal HDMI y luego se envía a la pantalla HDMI.
Es decir, la señal mipi que se envía originalmente a la pantalla LCD se conecta al chip ADV7533 y luego se envía a la interfaz HDMI.
Tiene las siguientes características:
- Características de recepción de MIPI
- Soporte 2, 3, 4 carriles
- Admite entrada MIPI de 16 bits, 24 bits (predeterminado), 30 bits,
- Velocidad máxima, 800Mz * 4 carriles
- Interfaz de control
- IIC
- Estándar HDMI
- Estándar HDMI v1.3, compatible con V1.0
- Audio
- Nivel lógico 1.8V - 3.3V
- Salida de audio, conversión de salida (no se usa por defecto)
- Soporte de conexión en caliente
- Utilice interrupciones para realizar la detección de conexión en caliente HDMI (no se utiliza de forma predeterminada)
efecto final:
Desde el comienzo del logotipo del pingüino hasta la visualización de la animación de inicio, el escritorio y la activación en la pantalla. Es lo mismo que conectarse a la pantalla LCD MIPI normal.
punto importante:
1. Proceso de revisión general
- Primero adapte un nuevo conjunto de controladores LCD según el proyecto o modifique la configuración de parámetros en el controlador LCD predeterminado.
- Elimine los parámetros de código de inicio redundantes y solo conserve los parámetros para salir de la suspensión, encender la pantalla, entrar en suspensión y apagar la pantalla.
- Ajuste correctamente los parámetros del hombro delantero y trasero y los parámetros de sincronización relacionados
- Agregar controlador LK y kernel ADV7533
- Configure el reloj mipi en modo de alta velocidad
- Configure el reloj mipi en modo continuo
El proceso de configuración aquí se basa en la adición normal de un conjunto de procesos de la unidad LCD. Configure el controlador IIC + ADV7533 en LK y Kernel respectivamente. Tome el nombre del controlador lcd recién agregado rm68200 como ejemplo para describirlo.
2. Modificación de LK
Contiene principalmente 3 partes
- Adaptarse al controlador LCD LK
- Configurar LK IIC
- Agregar controlador LK ADV 7533
2.1 Adaptar el controlador lcd
Configurar macro de control lcd
+#Begin: add by leo for RM68200_720P & adv7533
+LCD_RM68200_720P_SUPPORT_PROJECTS := N1
+ifneq ($(filter $(TARGET_PRODUCT), $(LCD_RM68200_720P_SUPPORT_PROJECTS)),)
+ DEFINES += FEATURE_XXX_LCD_RM68200_720P_SUPPORT=1
+endif
+#End: add by leo for RM68200_720P & adv7533
Modifique la carga del controlador lcd LK (aquí también contiene el archivo de encabezado del controlador adv7533 de lk, para hacer referencia a la función de entrada de adv7533)
Contiene archivos de encabezado lcd y adv7533
bootable/bootloader/lk/target/msm8909/oem_panel.c
+#if FEATURE_XXX_LCD_RM68200_720P_SUPPORT
+#include "include/panel_rm68200_720p_video.h"
+#include "include/mipi_adv7533_dsi2hdmi.h"
+#endif
Configurar la variable de enumeración de ID de lcd
@@ -148,6 +153,9 @@ enum {
#endif
#if DSI2DPI_TC358762
ST7789V_VIDEO_PANEL,
+#endif
+#if FEATURE_XXX_LCD_RM68200_720P_SUPPORT
+ RM68200_720P_VIDEO_PANEL_XXX,
#endif
UNKNOWN_PANEL
};
Declarar la función de entrada adv7533
+#if FEATURE_XXX_LCD_RM68200_720P_SUPPORT
+extern int adv7533_init(void);
+#endif
Según el proyecto, especifique la identificación de lcd y seleccione el controlador de lcd
@@ -337,8 +349,43 @@ static int init_panel_data(struct panel_struct *panelstruct,
panel_id = ST101XBJ05_720P_VIDEO_PANEL_XXX;
#endif
+
+#if FEATURE_XXX_LCD_RM68200_720P_SUPPORT
+ panel_id = RM68200_720P_VIDEO_PANEL_XXX;
+ dprintf(CRITICAL, "select RM68200 720P \n");
+#endif
+
Configure los parámetros del atributo lcd y únase a la función de entrada del controlador ADV7533
+#if FEATURE_XXX_LCD_RM68200_720P_SUPPORT
+ case RM68200_720P_VIDEO_PANEL_XXX:
+ panelstruct->paneldata = &rm68200_720p_video_panel_data;
+ panelstruct->panelres = &rm68200_720p_video_panel_res;
+ panelstruct->color = &rm68200_720p_video_color;
+ panelstruct->videopanel = &rm68200_720p_video_panel;
+ panelstruct->commandpanel = &rm68200_720p_video_command_panel;
+ panelstruct->state = &rm68200_720p_video_state;
+ panelstruct->laneconfig = &rm68200_720p_video_lane_config;
+ panelstruct->paneltiminginfo
+ = &rm68200_720p_video_timing_info;
+ panelstruct->panelresetseq
+ = &rm68200_720p_video_reset_seq;
+ panelstruct->backlightinfo
+ = &rm68200_720p_video_backlight;
+ pinfo->mipi.panel_on_cmds
+ = rm68200_720p_video_on_command;
+ pinfo->mipi.num_of_panel_on_cmds
+ = RM68200_720P_VIDEO_ON_COMMAND;
+ memcpy(phy_db->timing,
+ rm68200_720p_video_timings, TIMING_SIZE);
+ if (adv7533_init() < 0) {
+ dprintf(CRITICAL, "%s leo adv7533_init failed \n", __func__);
+ break;
+ }
+ break;
+#endif
2.2 Configurar LK IIC
Documentos de referencia y blogs
80-nu767-1_h_linux_bam_low-speed_peripherals_configuration_and_debug_guide.pdf
Para obtener contenido más detallado, consulte mi blog anterior.
Se omite el proceso de configuración
2.3 Agregar controlador ADV7533
Agregue mipi_adv7533_dsi2hdmi.c a bootable / bootloader / lk / dev / gcdb / display /
Agregue mipi_adv7533_dsi2hdmi.h a bootable / bootloader / lk / dev / gcdb / display / include /
Configurar mk para compilar el archivo del controlador
bootable/bootloader/lk/dev/gcdb/display/rules.mk
@@ -6,7 +6,8 @@ OBJS += \
$(LOCAL_DIR)/gcdb_display.o \
$(LOCAL_DIR)/gcdb_display_param.o \
$(LOCAL_DIR)/panel_display.o \
- $(LOCAL_DIR)/gcdb_autopll.o
+ $(LOCAL_DIR)/gcdb_autopll.o \
+ $(LOCAL_DIR)/mipi_adv7533_dsi2hdmi.o
Saltar adjunto
3. Modificación del kernel
También contiene principalmente 3 partes
- Adaptarse al controlador LCD del núcleo
- Configurar el nodo IIC del kernel
- Agregar controlador Kernel ADV 7533
3.1 Adaptarse al controlador LCD del núcleo
Contiene archivos de encabezado del controlador lcd
kernel/msm-3.18/arch/arm/boot/dts/xxx/XXX_msm8909-qrd-skue.dtsi
+#include "dsi-panel-rm68200_720p_video.dtsi"
Agregue un nuevo nodo de controlador lcd y modifíquelo a la opción de carga lcd predeterminada.
( Aquí la placa del cliente revisó el lcd del primer control de pin, porque no es el foco, omita la descripción )
+#if 1
+&dsi_rm68200_720p_video {
+ qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
+ qcom,cont-splash-enabled;
+};
+#endif
+
&mdss_dsi0 {
- qcom,dsi-pref-prim-pan = <&dsi_nt35521_720p_vid>;
+ qcom,dsi-pref-prim-pan = <&dsi_rm68200_720p_video>;
pinctrl-names = "mdss_default", "mdss_sleep";
pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
- qcom,platform-reset-gpio = <&msm_gpio 25 0>;
+ qcom,platform-reset-gpio = <&msm_gpio 8 0>;
};
3.2 Configurar el nodo Kernel IIC
Según el diagrama esquemático de la placa base del cliente anterior, IIC es gpio10, gpio11 y la dirección qup es 78ba000.
Desde el diseño de hardware y la descripción de la función gpio, gpio10, gpio11, la configuración predeterminada es SPI0, es necesario proteger la configuración de funciones de SPI y modificarla a la configuración de funciones de IIC-6.
Contiene principalmente dos aspectos
- Proteja el nodo de configuración SPI0 y agregue un nodo de configuración IIC-6
- Escudo configuración pinctrl SPI0, agregue configuración pinctrl IIC-6
- Agregar nodo esclavo ADV7533
Nodo de configuración Shield SPI0
kernel/msm-3.18/arch/arm/boot/dts/XXX/xxx_msm8909.dtsi
@@ -42,10 +42,11 @@
- spi0 = &spi_0; /* SPI0 controller device */
+ // spi0 = &spi_0; /* SPI0 controller device */
+ i2c6 = &i2c_6; /* I2c6 cntroller device for addr7533 */
Nuevo nodo de configuración IIC-6
+ i2c_6: i2c@78ba000 { /* BLSP1 QUP6 */
+ compatible = "qcom,i2c-msm-v2";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg-names = "qup_phys_addr";
+ reg = <0x78ba000 0x1000>;
+ interrupt-names = "qup_irq";
+ interrupts = <0 100 0>;
+ clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
+ <&clock_gcc clk_gcc_blsp1_qup6_i2c_apps_clk>;
+ clock-names = "iface_clk", "core_clk";
+ qcom,clk-freq-out = <100000>;
+ qcom,clk-freq-in = <19200000>;
+ pinctrl-names = "i2c_active", "i2c_sleep";
+ pinctrl-0 = <&i2c_6_active>;
+ pinctrl-1 = <&i2c_6_sleep>;
+ qcom,noise-rjct-scl = <0>;
+ qcom,noise-rjct-sda = <0>;
+ dmas = <&dma_blsp1 14 64 0x20000020 0x20>,
+ <&dma_blsp1 15 32 0x20000020 0x20>;
+ dma-names = "tx", "rx";
+ qcom,master-id = <86>;
+ };
Luego, proteja la configuración pinctrl de SPI-0 y agregue la configuración pinctrl de IIC-6
+#if 0
spi0 {
spi0_default: spi0_default {
mux {
@@ -431,6 +433,7 @@
};
};
};
+#endif
+#if 1
+ pmx_i2c_6 {
+ i2c_6_active: i2c_6_active {
+ mux {
+ pins = "gpio11", "gpio10";
+ function = "blsp_i2c6";
+ };
+ config {
+ pins = "gpio11", "gpio10";
+ drive-strength = <2>; /* 2 MA */
+ bias-disable; /* No PULL */
+ };
+ };
+ i2c_6_sleep: i2c_6_sleep {
+ mux {
+ pins = "gpio11", "gpio10";
+ function = "blsp_i2c6";
+ };
+ config {
+ pins = "gpio11", "gpio10";
+ drive-strength = <2>; /* 2 MA */
+ bias-disable; /* No PULL */
+ };
+ };
+ };
+#endif
Agregar nodo esclavo ADV7533 i2C
+#if 1
+ i2c@78ba000 {
+ adv7533@39 {
+ compatible = "adv,adv7533";
+ reg = <0x39>;
+ adv7533,main-addr = <0x39>;
+ adv7533,cec-dsi-addr = <0x3C>;
+ adv7533,video-mode = <2>;
+ qcom,hdmi-pwr-en = <&msm_gpio 3 0x0>;
+ vdd-supply = <&pm8909_l17>;
+ vcc_i2c-supply = <&pm8909_l6>;
+ };
+ };
+#endif
4. Explicación detallada del proceso de la unidad ADV7533
Prólogo: No importa si el controlador de ADV7533 está en LK o Kernle, la rutina básica es la misma. Se utilizan para obtener los pines básicos de gpio de la configuración para el control de encendido (gpio controla el encendido externo del ldo) y la configuración de interrupciones (no se usa aquí).
Luego escriba la configuración de registro requerida, siempre que ingrese la señal mipi que se ajuste al formato, la señal HDMI se puede convertir con éxito.
4.1 Función de entrada
Función de entrada
int adv7533_init(void)
{
int rev = -1;
int soc_ver = board_soc_version();
// soc_ver shoudle <= BOARD_SOC_VERSION2
dprintf(CRITICAL, "Enter %s soc_ver 0x%x\n", __func__, soc_ver);
mdelay(5);
#if 1
// config adv7533
adv7533_hw_config();
// config i2c-6
i2c6_dev = qup_blsp_i2c_init(BLSP_ID_1, QUP_ID_5, 100000, 19200000);
mdelay(1200);
if (!i2c6_dev) {
dprintf(CRITICAL, "%s Failed to init i2c-6 \n", __func__);
return -1;
}
#endif
// read adv7533 test
rev = adv7533_read_test();
if (rev < 0) {
dprintf(CRITICAL, "adv7533_read_test faile, exit \n");
return rev;
}
// init adv7533 reg
rev = adv7533_write_init_config();
if (rev < 0) {
dprintf(CRITICAL, "adv7533_write_init_config faile, exit \n");
return rev;
}
#if DUMP_ADV7533_REG
dump_adv7533_registers();
#endif
return 0;
}
4.2 Proceso de conducción
Contiene principalmente varias partes:
- Función de configuración de hardware
- Aplicar para configurar IIC
- Leer prueba de dispositivo esclavo ADV7533
- Inicializar ADV7533
4.2.1 Función de configuración de hardware
static void adv7533_hw_config(void)
{
dprintf(CRITICAL, "%s leo enter \n", __func__);
// enable vdd and i2c-supply
regulator_enable(REG_LDO2 | REG_LDO6 | REG_LDO17);
mdelay(5);
// enable adv7533 power
gpio_tlmm_config(3, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA, GPIO_DISABLE);
mdelay(5);
gpio_set(3, GPIO_STATE_HIGH);
mdelay(10);
}
análisis:
LDO2, 6, 17 son la etapa lk y la configuración de encendido ldo relacionada de lcd, configúrelo directamente aquí.
gpio_3 es el control de encendido externo de ADV7533 y debe encenderse primero
gpio_3 controla el encendido de ADV7533, como se muestra en la figura:
4.2.2 Aplicar para configurar IIC
Omitir
4.2.3 Leer prueba de dispositivo esclavo
Omitir
4.2.4 Escribir parámetros de inicialización
Omitir
4.3 asuntos que necesitan atención
- ADV7533 necesita mantener el reloj a alta velocidad en todo momento
- ADV7533 necesita configurar la señal MIPI en modo continuo
ADV7533 necesita mantener el reloj a alta velocidad en todo momento
cargador de arranque \ lk \ dev \ gcdb \ display \ include \ panel_rm68200_720p_video.h de arranque
Set lane_config parámetros, configure mipi CLK hs modo de
/*---------------------------------------------------------------------------*/
/* Lane configuration */
/*---------------------------------------------------------------------------*/
static struct lane_configuration rm68200_720p_video_lane_config = {
3, 0, 1, 1, 1, 0, 1
};
definición de lane_configuration
struct lane_configuration {
uint8_t dsi_lanes;
uint8_t dsi_lanemap;
uint8_t lane0_state;
uint8_t lane1_state;
uint8_t lane2_state;
uint8_t lane3_state;
uint8_t force_clk_lane_hs;
};
ADV7533 necesita configurar la señal MIPI en modo continuo
cargador de arranque \ lk \ dev \ gcdb \ display \ include \ panel_rm68200_720p_video.h de arranque
traffic_mode; configurado en 0 , lo que significa modo continuo
/*---------------------------------------------------------------------------*/
/* Video mode panel information */
/*---------------------------------------------------------------------------*/
static struct videopanel_info rm68200_720p_video_panel = {
1, 0, 0, 0, 1, 1, 0, 0, 0x9
};
videopanel_info definición
struct videopanel_info {
uint8_t hsync_pulse;
uint8_t hfp_power_mode;
uint8_t hbp_power_mode;
uint8_t hsa_power_mode;
uint8_t bllp_eof_power_mode;
uint8_t bllp_power_mode;
uint8_t traffic_mode;
uint8_t dma_delayafter_vsync;
uint32_t bllp_eof_power;
};
cargador de arranque \ lk \ plataforma \ msm_shared \ include \ mipi_dsi.h
#define DSI_NON_BURST_SYNCH_PULSE 0
#define DSI_NON_BURST_SYNCH_EVENT 1
#define DSI_BURST_MODE 2
Por tanto, se aplica lo mismo. El controlador LCD Kernel también necesita configurar estos dos elementos.
kernel \ msm-3.18 \ arch \ arm \ boot \ dts \ XXX \ dsi-panel-rm68200_720p_video.dtsi
qcom,mdss-dsi-traffic-mode = "non_burst_sync_pulse";
qcom,mdss-dsi-force-clock-lane-hs;
4.3.1 modo_trafico MIPI
Definición en Kernel
kernel \ msm-3.18 \ drivers \ video \ msm \ mdss \ mdss_dsi.h
#define DSI_NON_BURST_SYNCH_PULSE 0
#define DSI_NON_BURST_SYNCH_EVENT 1
#define DSI_BURST_MODE 2