前言
本文著重介紹 ADV7533 芯片在高通 msm8909 平臺上調通的經驗
硬體平臺:msm8909
軟體平臺:Android5.0 Android8.0 (均已經調通)
芯片IC:ADV7533
功能實作:MIPI 轉HDMI
簡介:
ADV7533 是一款能夠將標準MIPI信號轉換為HDMI 信號的轉換芯片,
即從msm8909的主控端信號,轉換成HDMI信號后輸出到HDMI 顯示幕上,
即原本輸出到LCD的mipi信號,去連接到ADV7533 芯片上,然后輸出到HDMI介面,
有以下幾個特點:
- MIPI 接收特性
- 支持2、3、4 lane
- 支持 MIPI輸入16bit、24bit(默認)、30bit、
- 最大速率,800Mz *4 lane
- 控制介面
- IIC
- HDMI標準
- HDMI v1.3 標準,兼容V1.0
- Audio
- 邏輯電平 1.8V – 3.3V
- 音頻輸出、輸出轉換(默認不用)
- 熱插拔支持
- 利用中斷實作HDMI熱插拔檢測(默認不用)
最終效果:
從企鵝Logo開始顯示,到開機影片、桌面、息屏喚醒都顯示正常,和接普通的MIPI LCD螢屏顯示一樣,
注意點:
- LK 需要配置IIC 和初始化ADV7533
- MIPI時鐘全程使用高速模式
- 使用時鐘連續模式
1. 總體修改流程
- 先在專案基礎上適配新的一套LCD的驅動,或者在默認的LCD驅動上修改引數配置,
- 去除多余的 init-code 引數,只保留退出休眠、開啟顯示,進入休眠、關閉顯示的引數,
- 適當調整前后肩引數及相關的 Timing 引數
- 增加LK和kernel的ADV7533 驅動
- 設定mipi時鐘為高速模式
- 設定mipi時鐘為連續模式
這里的配置流程為,在正常的新增一套LCD驅動流程的基礎上,在LK和Kernel分別配置IIC + ADV7533 驅動,以這里新增lcd 驅動名字為rm68200為例,進行講述,
2. LK 修改
主要包含3部分
- 適配LK LCD驅動
- 配置LK IIC
- 增加LK ADV 7533 驅動
2.1 適配 lcd 驅動
配置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
修改LK lcd驅動加載(這里也包含了lk的adv7533驅動的頭檔案,要參考adv7533的入口函式)
包含lcd和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
配置 lcd的 ID 列舉變數
@@ -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
};
宣告adv7533 入口函式
+#if FEATURE_XXX_LCD_RM68200_720P_SUPPORT
+extern int adv7533_init(void);
+#endif
根據專案,指定lcd id,選擇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
+
配置 lcd 屬性引數和 加入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 配置LK IIC
參考檔案和博客
80-nu767-1_h_linux_bam_low-speed_peripherals_configuration_and_debug_guide.pdf
https://blog.csdn.net/eliot_shao/article/details/53351759
更詳細的內容,參考我的上一篇博客
https://blog.csdn.net/FANG_YISHAO/article/details/113180983
配置程序略過
2.3 增加ADV7533驅動
增加 mipi_adv7533_dsi2hdmi.c 到 bootable/bootloader/lk/dev/gcdb/display/
增加 mipi_adv7533_dsi2hdmi.h 到bootable/bootloader/lk/dev/gcdb/display/include/
配置 mk編譯驅動檔案
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
附件略過
3. Kernel 修改
也是主要包含3部分
- 適配Kernel LCD驅動
- 配置Kernel IIC 節點
- 增加Kernel ADV 7533 驅動
3.1 適配Kernel LCD驅動
包含 lcd 驅動頭檔案
kernel/msm-3.18/arch/arm/boot/dts/xxx/XXX_msm8909-qrd-skue.dtsi
+#include "dsi-panel-rm68200_720p_video.dtsi"
新增 lcd 驅動節點,并修改為默認的lcd 加載選項,
(這里客戶的主板修改了lcd的rst引腳控制,由于不是重點,略過描述)
+#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 配置 Kernel IIC 節點
由前面客戶主板原理圖得知,IIC 是 gpio10、gpio11,qup 地址為78ba000,
從硬體設計和gpio功能描述,gpio10、gpio11,默認配置為SPI0,需要屏蔽掉SPI的功能配置,修改為IIC-6的功能配置,
主要包含兩方面
- 屏蔽SPI0 配置節點,新增IIC-6 配置節點
- 屏蔽SPI0 pinctrl 配置,新增IIC-6 pinctrl 配置
- 添加 ADV7533 從設備節點
屏蔽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 */
新增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>;
+ };
然后,屏蔽SPI-0的pinctrl配置,新增IIC-6的pinctrl配置
+#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
添加 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. ADV7533 驅動流程詳解
前言: ADV7533的驅動無論是在LK 還是Kernle,基本套路都是一樣的,都是獲取配置基本的gpio腳,用于上電控制(gpio控制外部ldo上電),中斷配置(這里不用),
然后寫入需要的暫存器配置,只要輸入符合格式的mipi信號,就能成功轉換出HDMI 信號,
4.1 入口函式
入口函式
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 驅動流程
主要包含幾部分:
- 硬體配置函式
- 申請配置IIC
- 讀ADV7533從設備測驗
- 初始化ADV7533
4.2.1 硬體配置函式
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);
}
分析:
LDO2、6、17 是lk 階段,lcd 的相關的ldo 上電配置,這里直接先配置好,
gpio_3 是ADV7533 的外部上電控制,需要先上電
gpio_3 控制ADV7533 上電,如圖:
![]()


4.2.2 申請配置IIC
略過
4.2.3 讀從設備測驗
略過
4.2.4 寫入初始化引數
略過
4.3 注意事項
- ADV7533 需要全程保持時鐘高速
- ADV7533 需要配置MIPI 信號為連續模式
ADV7533 需要全程保持時鐘高速
bootable\bootloader\lk\dev\gcdb\display\include\panel_rm68200_720p_video.h
設定 lane_config 引數,配置 mipi clk hs 模式
/*---------------------------------------------------------------------------*/
/* Lane configuration */
/*---------------------------------------------------------------------------*/
static struct lane_configuration rm68200_720p_video_lane_config = {
3, 0, 1, 1, 1, 0, 1
};
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 需要配置MIPI 信號為連續模式
bootable\bootloader\lk\dev\gcdb\display\include\panel_rm68200_720p_video.h
traffic_mode; 配置為0,即為連續模式
/*---------------------------------------------------------------------------*/
/* Video mode panel information */
/*---------------------------------------------------------------------------*/
static struct videopanel_info rm68200_720p_video_panel = {
1, 0, 0, 0, 1, 1, 0, 0, 0x9
};
videopanel_info 定義
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;
};
bootable\bootloader\lk\platform\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
因此,同理,LCD Kernel 驅動也要配置這兩項,
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 MIPI traffic_mode
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253563.html
標籤:其他
