显示模块
d1h的显示模块主要有显示引擎(DE)、各类型控制器(tcon)、输出接口组成。输入图层(layers)由DE处理后,受tcon控制输出到RGB、HDMI等显示接口上。如下图:
内核配置
在内核源码目录下执行 make menuconfig
进入内核图形化配置界面
显示配置
从上图我们就知道,如果需要将一张图片通过HDMI输出到显示器上,需要完成的工作有:
- 准备显示数据layers(读取图片到内存);
- 处理数据(配置DE);
- 由HDMI输出(配置tcon)
下面我们来实施配置,首先从串口终端登录开发板系统
首先挂载debugfs文件系统:
mount -t debugfs none /sys/kernel/debug
进入显示debug配置目录:
cd /sys/kernel/debug/dispdbg/
这个目录下有几个文件,分别介绍下
- name
name有下面几个选项:
disp0/1/2 – 显示通道
lcd0/1/2 – LCD
enhance0/1/2 – 色彩增强模式
smbl0/1/2 – 背光 - command
命令有7个:
switch – 切换显示通道
blank – 显示开关
suspend – 显示进入休眠
resume – 显示从休眠中唤醒
setbl – 背光调节
vsync – 消息开关
getinfo – 查看智能背光的状态 - param
命令参数,参数格式是“type mode”:
echo type mode > param
这里我们选择type = 4,mode = 10。
输入命令:
echo 4 10 > param
每个命令都有自己的参数,switch命令有2个参数:
type ,HDMI对应 4
typedef enum
{
DISP_OUTPUT_TYPE_NONE = 0,
DISP_OUTPUT_TYPE_LCD = 1,
DISP_OUTPUT_TYPE_TV = 2,
DISP_OUTPUT_TYPE_HDMI = 4,
DISP_OUTPUT_TYPE_VGA = 8,
}disp_output_type;
对于mode,这里我随便选择一个10,对应 DISP_TV_MOD_1080P_60HZ
typedef enum
{
DISP_TV_MOD_480I = 0,
DISP_TV_MOD_576I = 1,
DISP_TV_MOD_480P = 2,
DISP_TV_MOD_576P = 3,
DISP_TV_MOD_720P_50HZ = 4,
DISP_TV_MOD_720P_60HZ = 5,
DISP_TV_MOD_1080I_50HZ = 6,
DISP_TV_MOD_1080I_60HZ = 7,
DISP_TV_MOD_1080P_24HZ = 8,
DISP_TV_MOD_1080P_50HZ = 9,
DISP_TV_MOD_1080P_60HZ = 0xa,
DISP_TV_MOD_1080P_24HZ_3D_FP = 0x17,
DISP_TV_MOD_720P_50HZ_3D_FP = 0x18,
DISP_TV_MOD_720P_60HZ_3D_FP = 0x19,
DISP_TV_MOD_1080P_25HZ = 0x1a,
DISP_TV_MOD_1080P_30HZ = 0x1b,
DISP_TV_MOD_PAL = 0xb,
DISP_TV_MOD_PAL_SVIDEO = 0xc,
DISP_TV_MOD_NTSC = 0xe,
DISP_TV_MOD_NTSC_SVIDEO = 0xf,
DISP_TV_MOD_PAL_M = 0x11,
DISP_TV_MOD_PAL_M_SVIDEO = 0x12,
DISP_TV_MOD_PAL_NC = 0x14,
DISP_TV_MOD_PAL_NC_SVIDEO = 0x15,
DISP_TV_MOD_3840_2160P_30HZ = 0x1c,
DISP_TV_MOD_3840_2160P_25HZ = 0x1d,
DISP_TV_MOD_3840_2160P_24HZ = 0x1e,
DISP_TV_MODE_NUM = 0x1f,
}disp_tv_mode;
完成以上配置后,就可以对HDMI进行测试了。
系统里面准备了测试图片,我们指定下:
echo 1 > /sys/class/disp/disp/attr/colorbar
然后开启显示:
echo 1 > start
初始化HDMI
如果每次启动开发板都要配置下HDMI,就太麻烦了。下面写一个shell脚本,然后配置Systemd,有init程序自动启动该shell脚本,完成HDMI的配置。
#!/bin/bash
# 0.挂载debug 节点
mount -t debugfs none /sys/kernel/debug
# 1.进入目录
cd /sys/kernel/debug/dispdbg
# 2.设置 name
echo disp0 > /sys/kernel/debug/dispdbg/name
# 3.设置命令
echo switch > /sys/kernel/debug/dispdbg/command
# 4.设置参数
echo 4 10 > /sys/kernel/debug/dispdbg/param
# 5.启动
echo 1 > start
在System V init系统中(常见于较老的Unix和类Unix系统,如Solaris、HP-UX和一些Linux发行版的早期版本),服务的自启动通常是通过在/etc/init.d/目录下放置启动脚本,并在系统运行级别对应的/etc/rcX.d/(其中X是运行级别,如0-6)目录中创建符号链接来实现的。
以下是如何将你的dispconfig.sh脚本配置为自启的步骤:
将脚本放置在/etc/init.d/目录下:
将你的dispconfig.sh脚本复制到/etc/init.d/目录下。确保脚本具有执行权限:
sudo cp dispconfig.sh /etc/init.d/
sudo chmod +x /etc/init.d/dispconfig.sh
为脚本创建符号链接:
接下来,你需要在适当的运行级别目录中为脚本创建符号链接。例如,如果你希望脚本在系统启动时(运行级别3或5)运行,你可以这样做:
sudo ln -s /etc/init.d/dispconfig.sh /etc/rc3.d/S99dispconfig
sudo ln -s /etc/init.d/dispconfig.sh /etc/rc5.d/S99dispconfig
注意,链接名称以S开头表示这是一个启动脚本,并且数字(在这里是99)决定了它在同一运行级别中脚本的启动顺序。数字越大,启动越晚。如果你想让脚本在其他运行级别也启动,你需要在相应的rcX.d目录中创建链接。
确保脚本兼容System V init:
你的dispconfig.sh脚本需要能够处理一些特定的参数,如start、stop、restart等,以便init系统能够正确地管理它。一个简单的例子可能如下所示:
#!/bin/bash
# /etc/init.d/dispconfig.sh
#
# Simple init script for dispconfig
case "$1" in
start)
echo "Starting dispconfig..."
# 你的启动命令
;;
stop)
echo "Stopping dispconfig..."
# 你的停止命令(如果需要)
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
更新系统服务(如果适用):
在一些系统上,你可能需要更新服务数据库或使用特定的工具来添加或更新服务。这取决于你的具体系统和发行版。
测试脚本:
在更改任何系统配置后,都应该进行测试以确保一切正常。你可以手动运行脚本来测试它是否按预期工作:
sudo /etc/init.d/dispconfig.sh start
然后检查系统日志或脚本输出以确保它已成功启动。
重启系统(可选):
如果你想确保脚本在系统启动时运行,你可以重启系统并检查脚本是否已自动启动。但是,请注意,这可能会导致系统暂时不可用,因此最好在非生产环境中或计划好的维护窗口内执行此操作。