测试配置HDMI输出流程
根据我的步骤,这里先测试下hdmi硬件,先看下输出是否正常。
- 先配置设备树
- 查看/home/allwinner/Desktop/tina-d1-h/lichee/linux-5.4/arch/riscv/boot/dts/sunxi/sun20iw1p1.dtsi,如下将status设置为"okay",开启disp
disp: disp@5000000 {
compatible = "allwinner,sunxi-disp";
reg = <0x0 0x05000000 0x0 0x3fffff>, /* de0 */
<0x0 0x05460000 0x0 0xfff>, /*display_if_top*/
<0x0 0x05461000 0x0 0xfff>, /* tcon-lcd0 */
<0x0 0x05470000 0x0 0xfff>, /* tcon-tv */
<0x0 0x05450000 0x0 0x1fff>; /* dsi0*/
/* interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>,tcon-lcd0
<GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>,tcon-tv
<GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;dsi*/
interrupts-extended = <&plic0 106 IRQ_TYPE_LEVEL_HIGH>,
<&plic0 107 IRQ_TYPE_LEVEL_HIGH>,
<&plic0 108 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_DE0>,
<&ccu CLK_DE0>,
<&ccu CLK_BUS_DE0>,
<&ccu CLK_BUS_DE0>,
<&ccu CLK_BUS_DPSS_TOP0>,
<&ccu CLK_BUS_DPSS_TOP0>,
<&ccu CLK_MIPI_DSI>,
<&ccu CLK_BUS_MIPI_DSI>,
<&ccu CLK_TCON_LCD0>,
<&ccu CLK_TCON_TV>,
<&ccu CLK_BUS_TCON_LCD0>,
<&ccu CLK_BUS_TCON_TV>,
<&ccu CLK_MIPI_DSI>,
<&ccu CLK_BUS_MIPI_DSI>;
clock-names = "clk_de0",
"clk_de1",
"clk_bus_de0",
"clk_bus_de1",
"clk_bus_dpss_top0",
"clk_bus_dpss_top1",
"clk_mipi_dsi0",
"clk_bus_mipi_dsi0",
"clk_tcon0",
"clk_tcon1",/*tcon-tv actually*/
"clk_bus_tcon0",
"clk_bus_tcon1",/*tcon-tv actually*/
"clk_mipi_dsi0",
"clk_bus_mipi_dsi0";
resets = <&ccu RST_BUS_DE0>,
<&ccu RST_BUS_DE0>,
<&ccu RST_BUS_DPSS_TOP0>,
<&ccu RST_BUS_DPSS_TOP0>,
<&ccu RST_BUS_MIPI_DSI>,
<&ccu RST_BUS_TCON_LCD0>,
<&ccu RST_BUS_TCON_TV>,
<&ccu RST_BUS_LVDS0>;
reset-names = "rst_bus_de0",
"rst_bus_de1",
"rst_bus_dpss_top0",
"rst_bus_dpss_top1",
"rst_bus_mipi_dsi0",
"rst_bus_tcon0",
"rst_bus_tcon1",
"rst_bus_lvds0";
assigned-clocks = <&ccu CLK_DE0>,
<&ccu CLK_MIPI_DSI>,
<&ccu CLK_TCON_LCD0>,
<&ccu CLK_TCON_TV>;
assigned-clock-parents = <&ccu CLK_PLL_PERIPH0_2X>,
<&ccu CLK_PLL_PERIPH0>,
<&ccu CLK_PLL_VIDEO0_4X>,
<&ccu CLK_PLL_VIDEO1_4X>;
assigned-clock-rates = <300000000>,
<150000000>,
<0>,
<0>;
boot_disp = <0>;
boot_disp1 = <0>;
boot_disp2 = <0>;
fb_base = <0>;
iommus = <&mmu_aw 2 0>;
status = "okay";
};
将hdmi的status设置为"okay",如下:
hdmi: hdmi@5500000 {
compatible = "allwinner,sunxi-hdmi";
reg = <0x0 0x05500000 0x0 0xfffff>;
interrupts-extended = <&plic0 93 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_HDMI>,
<&ccu CLK_HDMI_24M>,
<&ccu CLK_HDMI_CEC>,
<&ccu CLK_TCON_TV>;
clock-names = "clk_bus_hdmi",
"clk_ddc",
"clk_cec",
"clk_tcon_tv";
resets = <&ccu RST_BUS_HDMI_SUB>,
<&ccu RST_BUS_HDMI_MAIN>;
reset-names = "rst_bus_sub",
"rst_bus_main";
assigned-clocks = <&ccu CLK_HDMI_CEC>;
assigned-clock-parents = <&ccu CLK_HDMI_CEC_32K>;
assigned-clock-rates = <0>;
status = "okay";
};
- 查看板级dts,路径:/home/allwinner/Desktop/tina-d1-h/device/config/chips/d1-h/configs/nezha/board.dts
根据需要将HDMI设置如下:
&hdmi {
hdmi_used = <1>;
hdmi_power_cnt = <0>;
hdmi_cts_compatibility = <1>;
hdmi_hdcp_enable = <1>;
hdmi_hdcp22_enable = <0>;
hdmi_cec_support = <1>;
hdmi_cec_super_standby = <0>;
ddc_en_io_ctrl = <0>;
power_io_ctrl = <0>;
};
一些主要参数说明:
参数 | 说明 |
---|---|
hdmi_cec_super_standby | 开启此功能可以使系统休眠时, cec 不休眠,接收端可以通过 cec唤醒发送端; |
hdmi_hdcp_enable | 当需要开启 hdcp 时,必须置 1 该参数; |
hdmi_hdcp22_enable | 置 0 时,只开启 hdcp1.4 功能,置 1 时,开启 hdcp2.2 的功能; |
ddc_en_io_ctrl | 控制是否使用 ddc contrl io 功能(即下面的 ddc_io_ctrl 引脚配置),由硬件平台决定。 |
ddc_control_io | 在 hdmi 插入时输出 1,在 hdmi 拔出时输出 0,可以使 ddc 的光电特性更加符合 CTS 测试的要求。 |
- 修改config文件,
- 执行make menuconfig
.config - Tina Configuration
> Kernel modules > Video Support ────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────── Video Support ───────────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus ----). Highlighted letters are hotkeys. │
│ Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> for Search. │
│ Legend: [*] built-in [ ] excluded <M> module < > module capable │
│ │
│ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ < > kmod-backlight-pwm................................. PWM Backlight support │ │
│ │ < > kmod-fb.............................................. Framebuffer support │ │
│ │ < > kmod-fb-cfb-copyarea.............. Framebuffer software copy area support │ │
│ │ < > kmod-fb-cfb-fillrect...... Framebuffer software rectangle filling support │ │
│ │ < > kmod-fb-cfb-imgblt............... Framebuffer software image blit support │ │
│ │ < > kmod-fb-sys-fops.................... Framebuffer software sys ops support │ │
│ │ < > kmod-fbcon................................... Framebuffer Console support │ │
│ │ < > kmod-ge8300-km-opencl............................... GE8300 Device Driver │ │
│ │ -*- kmod-sunxi-disp....................................... sunxi-disp support │ │
│ │ <*> kmod-sunxi-g2d......................................... sunxi-g2d support │ │
│ │ <*> kmod-sunxi-hdmi....................................... sunxi-hdmi support │ │
│ │ <*> kmod-sunxi-uvc......................................... sunxi-uvc support │ │
│ │ < > kmod-sunxi-vin......................................... sunxi-vin support │ │
│ │ < > kmod-video-core...................................... Video4Linux support
保存退出
- 执行make kernel_menuconfig,选中如下
.config - Linux/riscv 5.4.61 Kernel Configuration
> Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi ────────────────────────────────────────────
┌───────────────────────────────────────────────── Video support for sunxi ──────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus ----). Highlighted letters are hotkeys. │
│ Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> for Search. │
│ Legend: [*] built-in [ ] excluded <M> module < > module capable │
│ │
│ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ [ ] Framebuffer Console Support(sunxi) │ │
│ │ <*> DISP Driver Support(sunxi-disp2) │ │
│ │ DISP2 Framebuffer rotation support (Disable rotation) ---> │ │
│ │ [*] Framebuffer show bootlogo from lzma file │ │
│ │ < > HDMI Driver Support(sunxi-disp2) │ │
│ │ <*> HDMI2.0 Driver Support(sunxi-disp2) ---- │ │
│ │ HDMI2.0 PHY SELECT. (Allwinner PHY) ---> │ │
│ │ < > HDMI EP952 Driver Support(sunxi-disp2) │ │
│ │ [ ] HDMI2.0 HDCP ---- │ │
│ │ [*] HDMI2.0 CEC ---> │ │
│ │ [ ] new frequency spread spectrum(hershey) of sunxi │ │
│ │ < > TV Driver Support(sunxi-disp2) │ │
│ │ < > VDPO Driver Support(sunxi-disp2) │ │
│ │ < > EDP Driver Support(sunxi-disp2) │ │
│ │ [ ] boot colorbar Support for disp driver(sunxi-disp2) │ │
│ │ [*] debugfs support for disp driver(sunxi-disp2) │ │
│ │ [ ] composer support for disp driver(sunxi-disp2) │ │
│ │ [ ] ESD detect support for LCD panel │ │
│ │ < > Framebuffer implementaion without display hardware of AW │ │
│ │ [ ] Enable LCD_FB FB_DEFERRED_IO │ │
│ │ LCD panels select ---> │ │
│ │ Display engine feature select ---> │ │
│ │ │ │
│ │ │ │
│ │ │ │
保存退出
make,然后pack打包,最后烧录完成,这时,按照默认sdk的配置,hdmi这里应该还是黑的
用串口终端(我这里用的是MobaXterm,很全的一款终端调试工具)打开板子的调试串口,波特率呢选1152000,
等待日志停下来,然后在终端回车,进入root的shell下
root@TinaLinux:/#
这时可以查看模块状态
root@TinaLinux:/# cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 300000000 hz, ref_fps:58
mgr0: 480x800 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] iommu[1]
dmabuf: cache[0] cache max[0] umap skip[0] umap skip max[34]
lcd output backlight(100) fps:59.1 480x 800
err:1 skip:191 irq:2871 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[ 0] fb[ 480, 800; 480, 800; 480, 800] crop[ 0, 0, 480, 800] frame[ 0, 0, 480, 800] addr[ffc00000, 0, 0] flags[0x 0] trd[0,0]
depth[ 0] r
可以看到当前默认是lcd输出,前面开启了debugfs,那尝试用命令切换到HDMI输出看看能不能行
cd /sys/kernel/debug/dispdbg切换到dspdbg目录
目录下有以下参数
command dbglvl info name param start
根据文档描述呢,参数定义如下
参数 | 描述 |
---|---|
name | disp0/1/2 //表示显示通道0/1/2 |
command | switch切换显示通道,blank关闭显示 |
param | type mode,其中type 0(none),1(lcd),2(tv),4(hdmi),8(vga);mode对应disp_tv_mode |
start | 1 执行命令 |
从disp_tv_mode参数看,测试屏幕是1080P,对应mode值为DISP_TV_MOD_1080P_60HZ = 0xa,也就是10,那么命令就是 |
echo disp0 > name;echo switch > command; echo 4 10 > param;echo 1 > start
回车,此时输出如下:
[ 799.576040] disp 0, type 4, mode10
[ 799.580705] lcd_close_flow
[ 799.583929] lcd_bl_close
[ 799.587063] lcd_panel_exit
[ 799.752110] lcd_power_off
[ 799.932136] [HDMI receive params]: tv mode: 0xa format:0x1 data bits:0x0 eotf:0x4 cs:0x101 dvi_hdmi:2 range:2 scan:0 aspect_ratio:8
[ 799.945491] [HDMI2 error]: sink do not support this mode:16
[ 800.962142] disp_al_manager_apply ouput_type:0
[ 800.967271] disp_al_hdmi_cfg
[ 801.081913] HDMI Audio Enable Successfully
[ 801.086640] [DISP] disp_device_attached_and_enable,line:233:
[ 801.086647] attached ok, mgr0<-->dev0
[ 801.097246] [DISP] disp_device_attached_and_enable,line:236:
[ 801.097256] type:4,mode:10,fmt:yuv444,bits:8bits,eotf:4,cs:257 dvi_hdmi:2, range:2 scan:0 ratio:8
说明执行成功,可以用上面查看模块的命令看一下,执行cat /sys/class/disp/disp/attr/sys
这是输出:
screen 0:
de_rate 300000000 hz, ref_fps:60
mgr0: 1920x1080 fmt[yuv444] cs[0x101] range[limit] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] iommu[1]
dmabuf: cache[0] cache max[0] umap skip[0] umap skip max[34]
hdmi output mode(10) fps:60.6 1920x1080
err:1 skip:193 irq:47406 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[ 0] fb[ 480, 800; 480, 800; 480, 800] crop[ 0, 0, 480, 800] frame[ 0, 0, 480, 800] addr[ffc00000, 0, 0] flags[0x 0] trd[0,0]
depth[ 0]
但是切换成功,依然黑屏,因为没有内容,还好有colorbar测试,执行如下命令
echo 1 > /sys/class/disp/disp/attr/colorbar
此时能看到屏幕上的色条,说明HDMI输出正常,不过有个问题,能不能默认输出HDMI呢?这个肯定可以的,要不咋用呢
- 设置HDMI为默认输出屏
这里回到前面修改设备树那里,默认输出由设备树配置
路径/home/allwinner/Desktop/tina-d1-h/device/config/chips/d1-h/configs/nezha/board.dts,修改disp部分,下面是原来的
&disp {
disp_init_enable = <1>;
disp_mode = <0>;
screen0_output_type = <1>;
screen0_output_mode = <4>;
screen1_output_type = <3>;
screen1_output_mode = <10>;
screen1_output_format = <0>;
screen1_output_bits = <0>;
screen1_output_eotf = <4>;
screen1_output_cs = <257>;
screen1_output_dvi_hdmi = <2>;
screen1_output_range = <2>;
screen1_output_scan = <0>;
screen1_output_aspect_ratio = <8>;
dev0_output_type = <1>;
dev0_output_mode = <4>;
dev0_screen_id = <0>;
dev0_do_hpd = <0>;
dev1_output_type = <4>;
dev1_output_mode = <10>;
dev1_screen_id = <1>;
dev1_do_hpd = <1>;
def_output_dev = <0>;
hdmi_mode_check = <1>;
fb0_format = <0>;
fb0_width = <0>;
fb0_height = <0>;
fb1_format = <0>;
fb1_width = <0>;
fb1_height = <0>;
chn_cfg_mode = <1>;
disp_para_zone = <1>;
/*VCC-LCD*/
/* dc1sw-supply = <®_dc1sw>;*/
/*VCC-DSI*/
/* eldo3-supply = <®_eldo3>;*/
/*VCC-PD*/
/* dcdc1-supply = <®_dcdc1>;*/
};
说明在disp上面,也贴出来
参数 | 描述 |
---|---|
disp_mode | (0:screen0<screen0,fb0>) |
screenx_output_type | (0:none; 1:lcd; 2:tv; 3:hdmi;5:vdpo) |
screenx_output_mode | (used for hdmi output, 0:480i 1:576i 2:480p 3:576p 4:720p50,5:720p60 6:1080i50 7:1080i60 8:1080p24 9:1080p50 10:1080p60) |
screenx_output_format | (for hdmi, 0:RGB 1:yuv444 2:yuv422 3:yuv420) |
screenx_output_bits | (for hdmi, 0:8bit 1:10bit 2:12bit 2:16bit) |
screenx_output_eotf | (for hdmi, 0:reserve 4:SDR 16:HDR10 18:HLG) |
screenx_output_cs | (for hdmi, 0:undefined 257:BT709 260:BT601 263:BT2020) |
screenx_output_dvi_hdmi | (for hdmi, 0:undefined 1:dvi mode 2:hdmi mode) |
screen0_output_range | (for hdmi, 0:default 1:full 2:limited) |
screen0_output_scan | (for hdmi, 0:no data 1:overscan 2:underscan) |
screen0_output_aspect_ratio | (for hdmi, 8-same as original picture 9-4:3 10-16:9 11-14:9) |
fbx format | (4:RGB655 5:RGB565 6:RGB556 7:ARGB1555 8:RGBA5551 9:RGB888 10:ARGB8888 12:ARGB4444) |
fbx pixel sequence | (0:ARGB 1:BGRA 2:ABGR 3:RGBA) |
fb0_scaler_mode_enable | (scaler mode enable, used FE) |
fbx_width,fbx_height | (framebuffer horizontal/vertical pixels, fix to output resolution while equal 0) |
lcdx_backlight | (lcd init backlight,the range:[0,256],default:197 |
lcdx_yy | (lcd init screen bright/contrast/saturation/hue, value:0~100, default:50/50/57/50) |
lcd0_contrast | (LCD contrast, 0~100) |
lcd0_saturation | (LCD saturation, 0~100) |
lcd0_hue | (LCD hue, 0~100) |
framebuffer software rotation setting: | |
disp_rotation_used | (0:disable; 1:enable,you must set fbX_width to lcd_y,set fbX_height to lcd_x) |
degreeX | (X:screen index; 0:0 degree; 1:90 degree; 3:270 degree) |
degreeX_Y | (X:screen index; Y:layer index 0~15; 0:0 degree; 1:90 degree; 3:270 degree) |
devX_output_type | config output type in bootGUI framework in UBOOT-2018. (0:none; 1:lcd; 2:tv; 4:hdmi;) |
devX_output_mode | config output resolution(see include/video/sunxi_display2.h) of bootGUI framework in UBOOT-2018 |
devX_screen_id | config display index of bootGUI framework in UBOOT-2018 |
devX_do_hpd | whether do hpd detectation or not in UBOOT-2018 |
chn_cfg_mode | Hardware DE channel allocation config. 0:single display with 6 channel, 1:dual display with 4 channel in main display and 2 channel in second display, 2:dual display with 3 channel in main display and 3 channel in second in display. |
根据上面,修改如下 |
&disp {
disp_init_enable = <1>;
disp_mode = <0>;
screen1_output_type = <1>;
screen1_output_mode = <4>;
screen0_output_type = <3>;
screen0_output_mode = <10>;
screen0_output_format = <0>;
screen0_output_bits = <0>;
screen0_output_eotf = <4>;
screen0_output_cs = <257>;
screen0_output_dvi_hdmi = <2>;
screen0_output_range = <2>;
screen0_output_scan = <0>;
screen0_output_aspect_ratio = <8>;
/*
; dev1_output_type = <1>;
; dev1_output_mode = <4>;
; dev1_screen_id = <1>;
; dev1_do_hpd = <0>;
*/
dev0_output_type = <4>;
dev0_output_mode = <10>;
dev0_screen_id = <0>;
dev0_do_hpd = <1>;
def_output_dev = <0>;
hdmi_mode_check = <1>;
fb0_format = <0>;
fb0_width = <0>;
fb0_height = <0>;
fb1_format = <0>;
fb1_width = <0>;
fb1_height = <0>;
chn_cfg_mode = <1>;
disp_para_zone = <1>;
/*VCC-LCD*/
/* dc1sw-supply = <®_dc1sw>;*/
/*VCC-DSI*/
/* eldo3-supply = <®_eldo3>;*/
/*VCC-PD*/
/* dcdc1-supply = <®_dcdc1>;*/
};
然后对于uboot-board.dts里disp同样的修改(路径:/home/allwinner/Desktop/tina-d1-h/device/config/chips/d1-h/configs/nezha/uboot-board.dts)
经过上面配置,已经可以开机显示在hdmi上了,但是开机部分会有花屏,得设置boot时,加载logo,前面make kernel_menuconfig,我已经选中了[*] Framebuffer show bootlogo from lzma file,但是不会开机加载,需要额外设置下,如下
执行make kernel_menuconfig,将下面bootlogo选中
.config - Linux/riscv 5.4.61 Kernel Configuration
> Device Drivers > Graphics support ─────────────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────────────────────────────────── Graphics support ─────────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus ----). Highlighted letters are hotkeys. │
│ Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> for Search. │
│ Legend: [*] built-in [ ] excluded <M> module < > module capable │
│ │
│ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ [ ] Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---- │ │
│ │ [ ] Enable DisplayPort CEC-Tunneling-over-AUX HDMI support │ │
│ │ ARM devices ---- │ │
│ │ ACP (Audio CoProcessor) Configuration ---- │ │
│ │ Frame buffer Devices ---> │ │
│ │ Backlight & LCD device support ---> │ │
│ │ Console display driver support ---> │ │
│ │ [*] Bootup logo ---> │ │
│ │ │ │
│ │
此时已经可以开机加载logo了,但是默认的logo图片是竖屏的哪吒,我的hdmi是横屏,显示依然花屏,所以得替换掉,logo路径在/home/allwinner/Desktop/tina-d1-h/device/config/chips/d1-h/configs/nezha/configs/bootlogo.bmp,替换一个bmp就行
最后make,pack,将生成的img文件烧录,应该就ok了