当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]引言DVI是Digital Visual Interface(数字视频接口)的缩写。在嵌入式电子领域,像DVI这样的高清接口应用越来越多,很多嵌入式产品采用H.264视频编码技术,支持播放H.264格式

引言

DVI是Digital Visual Interface(数字视频接口)的缩写。在嵌入式电子领域,像DVI这样的高清接口应用越来越多,很多嵌入式产品采用H.264视频编码技术,支持播放H.264格式的720P分辨率的视频文件,这就需要至少1024×768分辨率的显示输出设备。

MX51是飞思卡尔半导体的基于ARM CortexA8内核的高端ARM嵌入式多媒体处理器,支持720P视频多种格式的硬解码,可以用来开发高清机顶盒、上网本等产品,很多情况下需要集成DVI这样的高清视频端子。

在嵌入式电子产品中,Linux操作系统占有越来越多的市场份额。本文采用Linux2.6.28内核和MX51作为系统的软、硬件平台,详细论述了基于framebuffer技术开发DVI显示驱动程序的方法。

1 DVI概述

DVI接口只在一些高端显示器上可以看到,一般常见的液晶显示器只有VGA接口。VGA接口显示的是模拟信号,而DVI接口显示的是数字信号,它传输没有经过压缩的数字信号,最高速率可达4.9 Gbps,对高清视频显示可以达到较好的保真度,减少模拟信号传输时的信号损失。

DVI基于TMDS(Transition Minimized Differential Signaling,转换最小差分信号)技术来传输数字信号,TMDS运用先进的编码算法把8位数据(R、G、B中的每路基色信号)通过最小转换编码为10位数据(包含行场同步信息、时钟信息、数据DE、纠错等),经过DC平衡后,采用差分信号传输数据。DVI和LVDS、TTL相比有较好的电磁兼容性能,可以用低成本的专用电缆实现长距离、高质量的数字信号传输。

2 硬件接口

本设计采用的硬件平台是基于飞思卡尔半导体的MX51多媒体应用处理器开发板。该处理器集成了多种外设接口,其中包括两个液晶显示控制器(LCDC)及其接口,可以连接各类LCD, 分辨率最大支持1280×800像素。通过MX51的LCD1接口,外扩德州仪器公司的TFP410芯片实现DVI视频输出,MX51的高清720P视频解码能力需要较大分辨率的显示输出设备。图1为MX51的LCD1接口与TFP410的连接图。

 

 

图1 LCD1接口与TFP410的连接图

图1中的TX2±、TX1±、TX0±、TXC±信号是DVI视频输出信号4对,8个信号。DATA[23:0]是视频数据输入信号,对应MX51 LCD1的DATA[23:0];DE、VSYNC、HSYNC、IDCK±等时钟信号分别对应LCD1的相应的引脚。SCL、SDA是I2C总线时钟和数据信号,接MX51 I2C接口的2个引脚。以上硬件电路连接,可实现MX51输出高清视频到DVI芯片,再通过外接LCD显示。MX51处理器内部集成的LCD控制器包括如下主要寄存器:

① LSSAR寄存器。设置显示缓冲区的首地址。

② LSR寄存器。设置显示缓冲区的大小。

③ LPCR寄存器。设置像素时钟频率PCD、同步时钟极性FB_SYNC_CLK_INVERT、OE信号极性FB_SYNC_OE_ACT_HIGH、垂直信号时钟极性FB_SYNC_VERT_HIGH_ACT、水平信号时钟极性FB_SYNC_HOR_HIGH_ACT。

④ LHCR寄存器。设置行同步信号的hsync_len、left_margin和right_margin。

⑤ LVCR寄存器。设置帧同步信号的vsync_len、upper_margin和lower_margin。

⑥ LPCCR寄存器。设置屏幕的显示亮度,LPCCR的低8位控制PWM的脉冲高电平占空比,调节范围为0x00~0xFF。

3 Linux的帧缓冲设备

3.1 framebuffer机制

framebuffer(帧缓冲)是出现在Linux2.2.xx之后版本内核的一种驱动程序接口, 在Linux体系中它居于上层应用程序和底层显示设备之间。framebuffer屏蔽了不同显示设备间的差异,将显示设备抽象为帧缓冲区,它是一种供用户态实现直接写屏的抽象设备。framebuffer可以看成是显存的一个映像,用户通过内存映射将其映射到进程的地址空间后,通过对显示缓冲区的读写操作可直接控制LCD的屏幕输出。

frameBuffer设备驱动主要基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c 这两个文件。fb.h中包含了与帧缓冲设备相关的重要的数据结构。fbmem.c是framebuffer机制的核心程序,它为上层应用程序提供了通用接口,同时也为下层特定硬件提供了接口。其内的函数可对具体硬件进行操作,比如对寄存器进行设置,对显示缓冲进行映射等。

3.2 几个重要的数据结构

(1) struct fb_info

这个结构是Linux为帧缓冲区设备定义的驱动层接口,它包含了关于帧缓冲设备属性和操作的完整描述,部分成员定义如下:

struct fb_info{

……

struct fb_var_screeninfo var;

struct fb_fix_screeninfo fix;

struct fb_cmap cmap;

struct fb_ops *fbops;

struct device *dev;

char __iomem *screen_base;

……

}

其中,var记录用户可以修改的显示控制器参数,包括屏幕分辨率和每个像素的位宽等;fix记录用户不能修改的显示控制器参数;cmap为当前的颜色表;fbops指向对底层硬件操作的函数集;dev 表示帧缓冲设备;screen_base为I/O映射的虚拟基地址。

(2) struct fb_ops

该结构提供了指向底层操作的函数指针,其成员函数最终与LCD 控制器硬件打交道,这些函数需要驱动开发者根据LCD 控制器的硬件设置及LCD显示屏的硬件参数进行设计。该结构部分成员定义如下:

struct fb_ops {

……

ssize_t (*fb_read)(struct fb_info *info, char __user *buf,size_t count, loff_t *ppos);//读屏幕缓冲区

ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,size_t count, loff_t *ppos);//写屏幕缓冲区

int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

int (*fb_set_par)(struct fb_info *info);

int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,unsigned blue, unsigned transp, struct fb_info *info);

……

}

[!--empirenews.page--]

其中,fb_check_var用于检查可变的屏幕参数,并调整其为硬件支持的值;fb_set_par根据屏幕参数设置具体读写LCD控制器的寄存器以使其进入相应的工作状态,fb_setcolreg设置color寄存器来实现伪颜色表和颜色表的填充。

(3) struct fb_var_screeninfo

这是fb_info的成员结构体,它记录了帧缓冲设备和指定显示模式的可修改信息,包括屏幕分辨率、每个像素的位宽、帧延时、行延时等。

(4) struct fb_fix_screeninfo

这是fb_info的成员结构体,它描述显示卡的属性,并且在系统运行时不能被修改,例如缓冲区的首地址、长度等。当一种模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可修改。

MX51将LCD控制器直接嵌入到处理器芯片内部,这为嵌入式系统关于显示功能的扩展提供了直接接口。LCD控制器驱动是DVI设备驱动的核心,它是一个标准的framebuffer设备驱动。设计驱动程序,首要的是配置LCD控制器,设置帧缓冲区,这在很大程度上要依赖于上述的数据结构,驱动设计需填写相关结构体并完成系统指定的接口函数。

4 DVI驱动程序设计

4.1 平台驱动

从Linux2.6起引入了一套新的驱动管理和注册机制:platform_device和platform_driver。

设备用platform_device表示,驱动用platform_driver注册。平台设备包括基于端口的设备、外围总线和集成在片上系统中的大多数控制器,作为MX51片上的独立硬件模块。LCD控制器是一个平台设备,因此驱动设计中需包含平台驱动。平台驱动的任务是向系统注册用到的设备,此处包括MX51的LCD控制器和TFP410 DVI视频输出芯片,使得设备驱动加载时可以从系统中查询到相应的设备是已注册的状态,然后执行设备驱动程序中的probe函数。

在arch/arm/mach?mx51/mx51_3stack.c中,设置platform_device结构变量mxc_fb_device和i2c_board_info。结构变量mxc_i2c1_board_info定义LCD控制器和TFP410设备。

调用函数platform_device_register(&mxc_fb_device)和i2c_register_board_info(1, mxc_i2c1_board_info,ARRAY_SIZE(mxc_i2c1_board_info))向系统注册以上设备。

4.2 设备驱动

4.2.1 LCD控制器驱动

LCD控制器驱动是一个标准的帧缓冲设备驱动。首先在drivers/video/mxc/mxc_ipuv3_fb.c中定义全局结构变量mxcfb_driver:

static struct platform_driver mxcfb_driver={

.driver={

.name=MXCFB_NAME,

},

.probe=mxcfb_probe,

.remove=mxcfb_remove,

.suspend=mxcfb_suspend,

.resume=mxcfb_resume,

};

然后,在驱动入口函数mxcfb_init(void)中调用platform_driver_register(&mxcfb_driver)注册驱动,当驱动加载成功后,会自动调用探测函数mxcfb_probe。

mxcfb_probe是驱动设计中的重要函数。主要负责初始化硬件。申请中断、分配framebuffer所需的内存、注册帧缓冲设备等,以下是与framebuffer相关的操作。

① 调用mxcfb_init_fbinfo(&pdev?﹥dev, &mxcfb_ops)函数,在其内通过framebuffer_alloc函数,为mx51帧缓冲信息结构体struct mxcfb_info分配所需空间。参数mxcfb_ops的定义如下:

static struct fb_ops mxcfb_ops={

.owner=THIS_MODULE,

.fb_set_par=mxcfb_set_par,

.fb_check_var=mxcfb_check_var,

.fb_setcolreg=mxcfb_setcolreg,

.fb_pan_display=mxcfb_pan_display,

……

};

mxcfb_ops 定义了指向底层操作的一系列函数,这些函数针对MX51帧缓冲操作,是framebuffer核心驱动操作的具体实现。

② 初始化帧缓冲信息结构体fb_info的固定和可变参数,填充fb_var_screeninfo var和fb_fix_screeninfo fix成员。

定义fbi为struct fb_info 类型的指针,通过fbi?﹥fbops = &mxcfb_ops语句,将已定义的文件操作接口mxcfb_ops赋予fb_info结构的fbops成员。

调用mxcfb_check_var(&fbi?﹥var, fbi)函数,检查和调整fb_info结构中变量var的值。var是一个struct fb_var_screeninfo类型的变量,表示显示控制器参数,其中与显示输出状态有关的信息,如屏幕分辨率等将在后面的DVI驱动中设置。

调用mxcfb_set_fix(fbi)函数,用于填充一个struct fb_fix_screeninfo结构变量fbi?﹥fix,它描述了显示输出设备自身的属性。

③ 调用register_framebuffer(fbi)函数,注册帧缓冲驱动程序,该函数只有一个参数,即前面已定义的、指向struct fb_info结构的指针fbi。

4.2.2DVI设备驱动

LCD控制器将DVI芯片作为它所连接的显示外设,在完成LCD控制器驱动后还需编写DVI设备驱动。在文件drivers/video/mxc/mxcfb_dvi.c中定义驱动结构体:

static struct platform_driver dvi_driver={

.driver={

.name="dvi_tfp410"},

.probe=dvi_probe,

.remove=__devexit_p(dvi_remove),

.suspend=dvi_suspend,

.resume=dvi_resume,

};

然后,在外设驱动入口函数dvi_init(void)中调用platform_driver_register(&dvi_driver)注册DVI驱动,驱动加载后,系统自动调用探测函数dvi_probe,该函数主要实现以下操作:一是指定framebuffer设备,由于MX51 IPU(图像处理单元)支持多个framebuffer设备,此处要确定DVI究竟使用MX51 IPU framebuffer的哪一个设备;二是填充fb_var_screeninfo结构变量var中有关显示输出状态的信息,如屏幕的显示分辨率、画面位置等,为此在程序中定义结构数组video_modes:

static struct fb_videomode video_modes[]={

{

/*1024×768 @ 60 Hz,像素时钟频率为33 MHz */

"DVITFP410", 60, 1024, 768, 33260, 117, 18, 23, 28, 2, 3,

0, FB_VMODE_NONINTERLACED,0,

},

……

};

结构struct fb_videomode用于描述显示输出状态,调用函数“fb_videomode_to_var(&var, &video_modes[0])”将屏幕显示参数转换为var结构变量的相关成员,由于var的部分成员值已在前面LCD控制器驱动中确定,此处完成了对var全部成员的设置。[!--empirenews.page--]

一个frambuffer设备由一个struct fb_info结构表示,本设计用fb_info结构的全局变量registered_fb表示系统注册的frambuffer设备,驱动程序的主要任务之一是填充这个结构变量。LCD控制器驱动与DVI外设驱动之间的信息传递,通过该全局变量实现。

5 DVI驱动测试

首先,通过显示一幅图片测试DVI输出是否正常。通过转换工具(如Image2lcd)把一幅1024×768大小的jpg图片转换为RGB 888分辨率、1024×768的RGB格式的二进制图片。然后键入命令: cp pic.bin /dev/fb0,此时图片显示于屏幕上。接下来,再使用MX51的视频解码测试程序播放一个720P的视频H.264文件,可以看到视频播放清晰流畅,效果很好。

结语

 

经测试,DVI驱动程序在MX51平台上成功实现。framebuffer是Linux提供给用户的一个直接面向显示缓冲区的接口,本设计是一个面向应用的framebuffer驱动,文中给出了DVI驱动的整体架构,对主要模块的设计思想和实现方法进行了详细的介绍。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在FPGA和IC设计领域,经常会面临一个挑战:多个端口同时竞争一个端口的数据。在这种情况下,采用RR调度策略可能是一种解决方案。

关键字: FPGA 嵌入式系统 IC设计

“实现机器人操作系统——电机控制器ROS1驱动程序简介”一文中概述了新型ADI Trinamic™电机控制器(TMC)驱动程序,并讨论了将电机控制器集成到机器人操作系统(ROS)生态系统中的方法。TMC ROS1驱动程序...

关键字: 电机控制器 机器人 嵌入式系统

领先的数据和AI平台SAS Viya运用大语言模型的可解释性和可集成性改善现有流程;SAS Data Maker将在保护敏感数据的同时解决关键挑战 北京2024年4月18日...

关键字: SAS VI 生成式AI MAKER

台湾新竹 – 2024年4月23日 – 著名的微控制器供货商新唐科技公司,与全软件开发生命周期提供跨平台解决方案的全球软件公司Qt Group宣布深化合作,扩展新唐科技人机界面(HMI)平台支持「Qt for MCUs」...

关键字: 微控制器 嵌入式系统 MCU

随着物联网、嵌入式系统以及微控制器技术的飞速发展,微控制器已成为众多智能设备和系统不可或缺的核心组件。而微控制器的正常工作,离不开烧录器的精准操作。C8051F021烧录器,作为一款高效、稳定、易用的微控制器烧录工具,在...

关键字: c8051f021烧录器 联网 嵌入式系统

为增进大家对嵌入式系统的认识,本文将对嵌入式系统、嵌入式系统的特点予以介绍。

关键字: 嵌入式 指数 嵌入式系统

2024年4月18日,国民技术第四代可信计算芯片NS350 v32/v33系列产品正式发布并开始量产供货。NS350 v32/v33是一款高安全、高性能、超值可信密码模块2.0 (TCM 2.0)安全芯片,适用于PC、服...

关键字: PC 服务器平台 嵌入式系统

2024年,嵌入式系统将走向何方?如何才能走在趋势的前沿?从工厂到家电,从医院里昂贵的医疗设备,到随处可见的可穿戴设备,我们身边的联网设备越来越多,生活更加绿色低碳,嵌入式系统功不可没。ST于3月19日成功举办STM32...

关键字: 嵌入式系统 可穿戴设备

在嵌入式系统开发、调试和测试过程中,J-Link作为一种高效的调试工具,为开发者提供了极大的便利。然而,要想充分发挥J-Link的功能,首先需要正确安装其驱动程序。本文将详细介绍J-Link驱动的安装过程,并深入解析其中...

关键字: jlink 嵌入式系统 嵌入式开发

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备
关闭
关闭