Depuración de plataforma Qualcomm ADV7533

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:

  1. Características de recepción de MIPI
    1. Soporte 2, 3, 4 carriles
    2. Admite entrada MIPI de 16 bits, 24 bits (predeterminado), 30 bits,
    3. Velocidad máxima, 800Mz * 4 carriles
  2. Interfaz de control
    1. IIC
  3. Estándar HDMI
    1. Estándar HDMI v1.3, compatible con V1.0
  4. Audio
    1. Nivel lógico 1.8V - 3.3V
    2. Salida de audio, conversión de salida (no se usa por defecto)
  5. Soporte de conexión en caliente
    1. 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. LK necesita configurar IIC e inicializar ADV7533
  2. El reloj MIPI utiliza el modo de alta velocidad en todo
  3. Usar modo continuo de reloj

 

1. Proceso de revisión general

  1. 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.
  2. 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.
  3. Ajuste correctamente los parámetros del hombro delantero y trasero y los parámetros de sincronización relacionados
  4. Agregar controlador LK y kernel ADV7533
  5. Configure el reloj mipi en modo de alta velocidad
  6. 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

  1. Adaptarse al controlador LCD LK
  2. Configurar LK IIC
  3. 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

  https://blog.csdn.net/eliot_shao/article/details/53351759

Para obtener contenido más detallado, consulte mi blog anterior.

  https://blog.csdn.net/FANG_YISHAO/article/details/113180983

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

  1. Adaptarse al controlador LCD del núcleo
  2. Configurar el nodo IIC del kernel
  3. 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

  1. Proteja el nodo de configuración SPI0 y agregue un nodo de configuración IIC-6
  2. Escudo configuración pinctrl SPI0, agregue configuración pinctrl IIC-6
  3. 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:

  1. Función de configuración de hardware
  2. Aplicar para configurar IIC
  3. Leer prueba de dispositivo esclavo ADV7533
  4. 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

  1. ADV7533 necesita mantener el reloj a alta velocidad en todo momento
  2. 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

 

Supongo que te gusta

Origin blog.csdn.net/FANG_YISHAO/article/details/113183494
Recomendado
Clasificación