打开hdmi的调试信息
①在内核中打开宏CONFIG_OMAP2_DSS_DEBUG_SUPPORT
②将dss_debug的初值赋值为 1
误区:我开始的时候在#include dss.h 前边将上#define DEBUG 以为就能打印~ ~
HDMI 带宽
1.0 版本就设定为最高 4.96Gbps
晶振频率:最初制定时范围从 25MHz-165MHz 之间
一个 TMDS 通道每秒最多能传输 165MHz× 10bit=1.65Gbit
3 个 TMDS通道一秒就可以传输 1.65× 3=4.95Gbit
再加上控制数据,用标准方法表示就是 4.96Gbps 的带宽
HDMI接口具有热插拔功能,发送设备检测到 HPD 信号为低时, 去读取 EDID 的数据,来确认接收装置是否出现变化,
EDID数据决定了接收端显示设备的属性
omap平台dss中个人觉得两个比较核心的函数
omap_dss_register_device();
omap_dss_register_driver();
module_init(omap_dss_init)调用以下过程 //linux/drivers/video/omap2/dss/core.c
omap_dss_register_drivers
static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
hdmi_init_platform_driver
omapdss_hdmihw_probe
hdmi_panel_init();
omap_dss_register_driver
hdmi_probe_pdata
r = omap_dss_register_device(dssdev, &pdev->dev, i);
hdmi.c中有三个数组,可能hdmi接口的屏幕还有分类的情况 ,后边再补充
static const struct hdmi_config cea_timings[] = {
static const struct hdmi_config vesa_timings[] = {
static const struct hdmi_config s3d_timings[] = {
hdmi_power_on
gpio_set_value(hdmi.ls_oe_gpio, 1);
//全文件搜ls_oe_gpio
可以在Board-omap4panda.c (kernel-tilt\arch\arm\mach-omap2): .ls_oe_gpio = HDMI_GPIO_LS_OE,
然后可以在board-omap4panda.c中找到HDMI_GPIO_LS_OE的使能脚定义
//board-omap4panda.c
#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
#define HDMI_GPIO_HPD 63 /* Hotplug detect */
作为HDMI的中断
hdmi_init_display () //drivers/video/omap2/dss/hdmi.c
struct gpio gpios[] = {
/* CT_CP_HPD_GPIO must be always ON for HPD detection to work */
{ hdmi.ct_cp_hpd_gpio, GPIOF_OUT_INIT_HIGH, "hdmi_ct_cp_hpd" },
{ hdmi.ls_oe_gpio, GPIOF_OUT_INIT_LOW, "hdmi_ls_oe" },
{ hdmi.hpd_gpio, GPIOF_DIR_IN, "hdmi_hpd" },
};
在调试oled的时候发现以下打印
①在内核中打开宏CONFIG_OMAP2_DSS_DEBUG_SUPPORT
②将dss_debug的初值赋值为 1
误区:我开始的时候在#include dss.h 前边将上#define DEBUG 以为就能打印~ ~
HDMI 带宽
1.0 版本就设定为最高 4.96Gbps
晶振频率:最初制定时范围从 25MHz-165MHz 之间
一个 TMDS 通道每秒最多能传输 165MHz× 10bit=1.65Gbit
3 个 TMDS通道一秒就可以传输 1.65× 3=4.95Gbit
再加上控制数据,用标准方法表示就是 4.96Gbps 的带宽
HDMI接口具有热插拔功能,发送设备检测到 HPD 信号为低时, 去读取 EDID 的数据,来确认接收装置是否出现变化,
EDID数据决定了接收端显示设备的属性
omap平台dss中个人觉得两个比较核心的函数
omap_dss_register_device();
omap_dss_register_driver();
module_init(omap_dss_init)调用以下过程 //linux/drivers/video/omap2/dss/core.c
omap_dss_register_drivers
static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
hdmi_init_platform_driver
omapdss_hdmihw_probe
hdmi_panel_init();
omap_dss_register_driver
hdmi_probe_pdata
r = omap_dss_register_device(dssdev, &pdev->dev, i);
hdmi.c中有三个数组,可能hdmi接口的屏幕还有分类的情况 ,后边再补充
static const struct hdmi_config cea_timings[] = {
static const struct hdmi_config vesa_timings[] = {
static const struct hdmi_config s3d_timings[] = {
hdmi_power_on
gpio_set_value(hdmi.ls_oe_gpio, 1);
//全文件搜ls_oe_gpio
可以在Board-omap4panda.c (kernel-tilt\arch\arm\mach-omap2): .ls_oe_gpio = HDMI_GPIO_LS_OE,
然后可以在board-omap4panda.c中找到HDMI_GPIO_LS_OE的使能脚定义
//board-omap4panda.c
#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
#define HDMI_GPIO_HPD 63 /* Hotplug detect */
作为HDMI的中断
hdmi_init_display () //drivers/video/omap2/dss/hdmi.c
struct gpio gpios[] = {
/* CT_CP_HPD_GPIO must be always ON for HPD detection to work */
{ hdmi.ct_cp_hpd_gpio, GPIOF_OUT_INIT_HIGH, "hdmi_ct_cp_hpd" },
{ hdmi.ls_oe_gpio, GPIOF_OUT_INIT_LOW, "hdmi_ls_oe" },
{ hdmi.hpd_gpio, GPIOF_DIR_IN, "hdmi_hpd" },
};
在调试oled的时候发现以下打印
正常显示内核打印:omapdss CORE: bus_match. dev display0/chipsee_dpi_panel, drv hdmi_panel
异常显示内核打印:omapdss CORE: bus_match. dev display2/chipsee_dpi_panel, drv hdmi_panel
在内核代码中搜索bus_match关键字 发现
omap_dss_register_device -> dev_set_name(&dssdev->dev, "display%d", disp_num);
在board-omap4panda.c的static struct omap_dss_device *omap4_panda_dss_devices[] 数组中调整成员的顺序就可以改变名字内核中的打印display*
//成功显示的内核打印 omapdss DISPC: hsync 31406Hz, vsync 59Hz----------------------在不能显示的里边没有响应的一行
在内核中搜索hsync 后再搜Hz, 找到以下匹配的一行:
./drivers/video/omap2/dss/dispc.c: DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt);
if (dispc_mgr_is_lcd(channel)) {。。。。。 DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt);。。。。。}
所以想到channel不对
再检查内核中相关channel的打印
正常显示的内核打印:[ 4.938232] omapdss DISPC: channel 2 xres 720 yres 480
非正常显示内核打印:[ 8.755889] omapdss DISPC: channel 1 xres 1024 yres 768
channel的类型为enum omap_channel {
OMAP_DSS_CHANNEL_LCD = 0,
OMAP_DSS_CHANNEL_DIGIT = 1, //非正常打印
OMAP_DSS_CHANNEL_LCD2 = 2, //可以正常打印的通道
};
OMAP_DSS_CHANNEL_LCD = 0,
OMAP_DSS_CHANNEL_DIGIT = 1, //非正常打印
OMAP_DSS_CHANNEL_LCD2 = 2, //可以正常打印的通道
};
具体的含义对应图:OMAP4460_TRM_vK.pdf (p2180)Figure 10-37. DISPC Architecture Overview