tag 标签: mx51

相关博文
  • 热度 16
    2014-3-22 11:21
    955 次阅读|
    0 个评论
    引言 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相比有较好的电磁兼容性能,可以用低成本的专用电缆实现长距离、高质量的数字信号传输。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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 是视频数据输入信号,对应MX51 LCD1的DATA ;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。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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); 其中,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控制器,设置帧缓冲区,这在很大程度上要依赖于上述的数据结构,驱动设计需填写相关结构体并完成系统指定的接口函数。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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))向系统注册以上设备。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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.2 DVI设备驱动 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 )”将屏幕显示参数转换为var结构变量的相关成员,由于var的部分成员值已在前面LCD控制器驱动中确定,此处完成了对var全部成员的设置。 一个frambuffer设备由一个struct fb_info结构表示,本设计用fb_info结构的全局变量registered_fb表示系统注册的frambuffer设备,驱动程序的主要任务之一是填充这个结构变量。LCD控制器驱动与DVI外设驱动之间的信息传递,通过该全局变量实现。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: 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驱动的整体架构,对主要模块的设计思想和实现方法进行了详细的介绍。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试
  • 热度 18
    2014-3-22 09:06
    1038 次阅读|
    0 个评论
    引言 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相比有较好的电磁兼容性能,可以用低成本的专用电缆实现长距离、高质量的数字信号传输。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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 是视频数据输入信号,对应MX51 LCD1的DATA ;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。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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); 其中,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控制器,设置帧缓冲区,这在很大程度上要依赖于上述的数据结构,驱动设计需填写相关结构体并完成系统指定的接口函数。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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))向系统注册以上设备。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试 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.2 DVI设备驱动 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 )”将屏幕显示参数转换为var结构变量的相关成员,由于var的部分成员值已在前面LCD控制器驱动中确定,此处完成了对var全部成员的设置。 一个frambuffer设备由一个struct fb_info结构表示,本设计用fb_info结构的全局变量registered_fb表示系统注册的frambuffer设备,驱动程序的主要任务之一是填充这个结构变量。LCD控制器驱动与DVI外设驱动之间的信息传递,通过该全局变量实现。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: 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驱动的整体架构,对主要模块的设计思想和实现方法进行了详细的介绍。 【分页导航】 第1页: DVI概述 第2页: 硬件接口 第3页: Linux的帧缓冲设备 第4页: DVI驱动程序设计(1) 第5页: DVI驱动程序设计(2) 第6页: DVI驱动测试
  • 热度 18
    2011-11-18 14:35
    2282 次阅读|
    1 个评论
      继成功推出基于i.MX27 i.MX31 i.MX35 i.MX37等系列开发板之后,辰汉电子最新推出大受追捧的i.MX515开发板:i.MX51 MPK1。基于Freescale i.MX515嵌入式多媒体微处理器,为智能本(SmartBook)、MID等手持上网终端市场注入了新的活力。 i.MX515能以较低的功耗驱动高性能的处理内核及丰富的多媒体性能,以较低的系统成本为产品要求越来越高的多媒体终端市场提供了最前沿的解决方案。以ARM Cortex A8为核心构架;工作主频面对不同的行业要求可以扩展至800M—1.2GHz;拥有32K的指令缓存和数据缓存以及256K的二级缓存,是之前ARM11产品的2倍 ;同时集成了几乎全系多媒体硬件加速单元:3D和2D图形加速的OpenGL ES 2.0和OpenVG 1.1;多格式(H.264/H.263/Mpeg-4/Mpeg-2/VC-1/DivX等)高清HD 720P视频解码模块和多格式标清D1分辨率的视频编码模块,并且支持720P模拟视频信号的直接输出。DVFS(Dynamic Volt Frequency Scalling)和SmartSpeed技术则为以上优秀的性能提供了功率管理保障。 i.MX515开发板i.MX51 MPK1以较高的集成度和丰富的外设接口为客户面对系统要求较高的产品提供了良好的设计基础,从功能接口的设置及元器件的选型等各方面做了产品级的优化设计,帮助客户快速将产品推向市场。 i.MX51 MPK1 主要功能接口: l 多种显示接口支持:1)DVI高清视频输出接口(同时可以支持VGA显示输出)
  • 热度 11
    2010-2-21 15:26
    2484 次阅读|
    1 个评论
    基于飞思卡尔 MX51 和 android2.0 打造新一代嵌入式产品(上篇)           无锡矽太恒科电子有限公司 http://www.ihanker.com   葛新征   飞思卡尔半导体于 2009 年发布了采用 ARM Cortex A8 核心的 MX51 处理器,该处理器出色的性能和极高的性价比迅速引起业界的关注。虽然飞思卡尔不是第一家发布 Cortex A8 嵌入式处理器的公司,但是综合现有的几款 Cortex A8 处理器的技术参数,我们可以发现, MX51 是性能最强,性价比最出色的一款芯片。 MX51 是飞思卡尔向高端嵌入式产品进军的开山巨作,是跨时代的一款芯片。 下面我们首先看一下 MX51 芯片的功能框图: MX51 的主要技术指标: l          采用 ARM Cortex A8 内核, ARM V7 架构,内部集成向量浮点运算单元。 l          支持 Mobile DDR 和 DDR2 内存,总线频率可达 200MHz 。 l          支持 MLC 大容量 NAND Flash ,支持硬件 ECC 。 l          支持双显示屏,主显示屏最大分辨率为 1280x800 ,次显示屏分辨率最大为 800x600 。 l          支持两个摄像头。 l          支持高速 USB 2.0 和高速以太网接口, CPU 内部集成 USB PHY 和以太网 MAC 控制器。 l          CPU 内部集成 VPU ,支持 H.264/H.263/MPEG4/MPEG2/DIVX/RMVB/MJPEG 等硬件编解码,解码最大支持以上格式的 720P 分辨率,编码最大支持 D1 分辨率。 l          CPU 内部集成 GPU, 硬件支持 2D/3D 加速,支持 OpenGL ES 2.0 和 OpenVG1.1 。支持 27Mtri/s 。 l          CPU 内部集成 IPU ,硬件支持图像处理,缩放 / 旋转 / 转换等。 l          内部集成 TVOUT ,可直接输出到电视机。 l          支持 DVFS 动态调节核电压和 CPU 主频。 l          支持 RTIC, SCC, SAHARA 等硬件加密功能。 下面我们就嵌入式产品开发工程师关心的问题,对 MX51 和其他 ARM Cortex A8 处理 器做一些比较。 首先是高清视频解码能力,产品开发人员往往非常关心自己选择的软硬件平台,原厂是否提供完整的多媒体软件方案。矽太恒科的 MX51 开发板 D901 为客户提供所有完整的软件包,可以把芯片的最佳性能淋漓尽致地发挥出来。开发板配套的 BSP 包括 linux2.6.28 版本的所有驱动,以及完整的 android2.0 源码,您可以节省自己去 google android 网站下载源码的时间, BSP 还包括针对 MX51 硬件的 android2.0 patch 补丁包,通过这些补丁,开发人员可以方便地运行所有 MX51 芯片支持的功能。 MX51 包含的 VPU 单元支持硬件视频编解码,而且支持的视频格式非常丰富,比如 MPEG2 、 DIVX 和 RMVB 的 720P 视频解码,三星的 Cortex A8 芯片 S5PC100 就都不支持。特别是 RMVB, 目前国内网络用户下载的电影格式 90% 以上都是 RMVB 格式, MX51 拥有支持 RMVB 高清视频解码能力是非常难得的。 下面是 MX51 android2.0 平台支持的音视频多媒体文件格式:    除了以上开放的音视频格式的支持之外, MX51 android2.0 平台还支持以下在第三方授权许可下的视频格式:        从上面两个表格可以看出,很多开放人员非常关心的文件格式, MX51 都能很好的支持:一个是 rm 和 rmvb ,前面已经说过,目前绝大多数的网络视频都是 rmvb 格式;一个是 flv 格式,也就是 FLASH 视频,这是 YouTube 、 土豆网等所有的在线视频网站都采用的格式,支持 flv 格式的硬解码真是太棒了!还有一个就是 mkv 格式,目前高清视频是很火的, mkv 就是高清视频最常用的文件格式,也就是说,你从网上下载到一个高清电影,可以直接用基于 MX51 平台的设备播放,非常酷,非常方便,呵呵。 因此,可以用 MX51 芯片开发的产品非常多,手持式产品可以加一个迷你 HDMI 接口,既可以在小屏幕 LCD 上播放视频,在家的时候也可以通过 HDMI 接上已经普及的高清液晶电视,直接在液晶电视上看高清大片。采用 MX51 开发高清机顶盒,也是非常合适的。车载多媒体产品用 MX51 也非常合适, MX51 系列芯片其中就包括一款汽车版的 MX516 芯片, MX516 是专门针对汽车市场的,对 MPEG2 硬解码的支持使得采用 MX51 的 IVR 产品可以流畅的播放 DVD 碟片。 尽可以展开您丰富的想象,凡是和宽带网络 、 无线网络 、 高清视频有关的产品采用 MX51 都是非常好的选择。在此,俺就不一一赘述了。   上面讲了这么多,都是在夸 MX51 的超凡的多媒体性能。接下来,开发人员最关心的可能就是低功耗了,嵌入式产品特别是手持设备,当然,功耗是非常非常重要的,性能达到要求的同时功耗那当然是越低越好了。幸运的是,您选择 MX51 真是没有看走眼, MX51 的功耗真的是非常低。和 Intel 的凌动 Atom ,俺真都不好意思比了, Atom 跑 1.6GHz ,解码高清视频那是非常吃力的,功耗更是高的令人咋舌:高达 13W 以上,而 MX51 仅仅需要一个零头: 3W 左右,当然,我说的是采用同样的 LCD 屏幕了(比如 10 寸屏)。如果单独把 CPU 拉出来溜溜,那 MX51 的优势就更明显了,做高清 720P 视频解码, MX51 CPU 功耗仅仅 400mW , CPU 占有率低于百分之十,而 Atom 肯定是超出 10W 以上,接近百分之百的 CPU 占有率,功耗是 20 多倍的差距啊,朋友们!那可就有消费者问了,既然你把 MX51 夸的天花乱坠,为什么现在的上网本百分之九十都是用的英特尔的凌动呢?唉!还不都是被 Windows 害的,微软和英特尔的 Wintel 联盟那可是坚不可摧,而广大的消费者又都习惯了 Windows XP 的操作习惯, Windows 上的软体也是无与伦比的丰富,所以,英特尔才在上网本领域继续称霸了啊。 可是,风水也该轮流转转了,这么肥的油水谷歌也眼馋啊,自从推出了 android 操作系统之后,开发高端嵌入式产品可就柳暗花明又一村了。不仅上网本可以用 android ,还可以用 android 开发其他形形色色的嵌入式产品,不在微软一棵树上吊死,还不用交钱,多好! 和 Atom 比功耗,俺都有点不好意思了,接着有位看客说了:和 Atom 比算什么真本事,有本事拿 MX51 和其他的 ARM Cortex A8 处理器比比呢? 这下给俺还真出了难题了:且看下回分解。     (欢迎转载,但请注明出处,以及保留原作者信息)