您的位置首页>企业动态>

基于SEP4O2O的Linux frame buffer驱动

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解基于SEP4O2O的Linux frame buffer驱动问题。基于SEP4O2O的Linux帧缓冲驱动设计。

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解基于SEP4O2O的Linux frame buffer驱动问题。

基于SEP4O2O的Linux帧缓冲驱动设计。

随着世界经济的快速发展,液晶显示屏被广泛应用于手机、掌上电脑、金融终端等电子产品中。在嵌入式电子领域,Linux操作系统占据了越来越大的市场份额。因此,本文提出在嵌入式Linux平台上实现液晶显示器的功能,并详细描述了基于SEP4020微处理器的液晶显示器帧缓冲驱动程序的设计。

1液晶显示原理1.1液晶显示器(LCD)的类型根据驱动方式可分为静态驱动、简单矩阵驱动和有源矩阵驱动。其中,简单矩阵型又可细分为扭曲向列型(TN)和超扭曲向列型(STN),而有源矩阵则以薄膜晶体管(TFT)为主。TN型技术是最基础的LCD,其他种类的LCD都是在TN型的基础上改进而来的。TN LCD显示质量差,颜色单一,对比度低,响应速度慢,因此主要用于显示简单的字符和字符,如电子表和电子计算器。STN LCD的显示原理与TN类似,但不同的是TN型液晶分子将入射光旋转90,而STN可以将入射光旋转180到270。STN改善了TN的窄视角,提高了对比度。显示质量高于TN。在TFT LCD中,晶体管矩阵根据显示信号开启或关闭液晶分子的电压,使液晶分子的轴变成“亮”或“暗”对比度,从而避免了显示器对电场效应的依赖。因此,TFTLCD的显示质量优于TN/stn,画面显示的对比度可以达到150: 1以上,响应速度接近30毫秒甚至更快。适用于PDA、笔记本电脑、数码相机、MP4等。1.2液晶屏时序图图1是液晶屏的典型时序图。在时序图中,VFRAME是帧同步信号,VLINE是行同步信号,VCLK是像素时钟信号(用于锁存图像数据的像素时钟),VM是数据有效标志信号,VD是图像数据信号。

VFRAME发送的每一个脉冲,都是一个帧同步信号,意味着开始发送新的一屏图像数据。作为行同步信号,VLINE发送的每个脉冲表示开始发送新的图像数据行。帧同步和行同步的开始和结束必须有回扫时间。

硬件平台本次设计采用的硬件平台基于东南大学国家ASIC系统工程中心开发的SEP4020微处理器开发板。微处理器采用0.18 m标准CMOS工艺设计,内嵌ASIX CORE(与ARM720T兼容的32位RISC core,带8 kB指令数据缓存和全功能MMU),采用冯诺依曼结构。液晶控制模块(LCDC)集成在处理器中,兼容AMBA规格,具有AHB MASTER和AHB SLAVE接口,分别用于读取待显示的数据和软件配置。软件配置后,LCDC可以独立工作,无需内核再次参与,节省了内核的处理时间。工作流程是启用LCDC后申请系统总线,获取总线使用权后读取待显示的数据。数据经过相应的算法处理后,得到满足时序要求的信号,并发送给LCDC显示驱动器。LCDC使用嵌入式直接存储器存取进行数据操作,并配备了深度为16的32位先进先出,用于缓冲显示数据。支持1、2、4位STN灰度显示和16位TFT彩色显示,分辨率软件可配置。需要配置的相关寄存器有:SSA为屏幕启动寄存器;尺寸是屏幕尺寸寄存器;聚合酶链反应为面板配置寄存器;HCR是一个水平配置寄存器;VCR为垂直配置寄存器:PWMR为对比度控制器;LECR是使能控制寄存器;DMACR是DMA控制寄存器。

3李inux驱动软件的设计与实现3.1介绍驱动核心结构3.1.1。FB _ jnfo结构帧缓冲设备最关键的数据结构之一是fb info结构,它包含帧缓冲设备的属性和操作的完整描述,定义如下:

由于篇幅有限,仅列出部分成员,其中fb_var_screeninfo记录了用户可以修改的显示控制器参数,包括屏幕分辨率和每像素位数等。Fb_fix_screeninfo记录用户不能修改的显示控制器参数;Cmap是当前颜色表;Fb_ops是帧缓冲操作的功能集;Screen_base是帧缓冲区的虚拟基址;I预映射的虚拟内存大小;伪调色板是一个伪16色颜色表。3.1.2.FB _ OPS结构这个结构是一个指向底层操作的函数的指针,需要由驱动开发者来编写和填充。一些成员的定义如下。

Fb_check_var()用于调整变量参数,并将其修整为硬件支持的值;Fb_set_par()根据屏幕参数设置读写LCD控制器的寄存器,使LCD控制器进入相应的工作状态,用户设置的屏幕参数在硬件上有效;fsetcolreg()成员函数实现了伪颜色表和颜色表的填充。3.1.3.FB _ var _ screeninfo这个结构定义了用户可以修改的显示控制器的参数,部分成员如下:

在这种结构中,xres是屏幕上水平像素的数量;Yres是屏幕的垂直宽度:bits_per_pixel定义每个像素由多少位表示;Pixclock定义像素时钟;left_margin表示线切换中同步和绘制之间的延迟;Right_margin表示线路切换中从绘制到同步的延迟;Upper_margin表示帧切换中从同步到绘图的延迟;Lower_margin表示帧切换中从绘制到同步的延迟;Hsyn_len表示水平同步的长度;Vsync_len表示垂直同步的长度。3.2 Linux帧缓冲设备和的模块加载。

卸载函数 由于LCD控制器被集成在SOC芯片上作为一个独立的硬件模块,也就是platform_device而存在,因此本驱动中包含平台驱动。首先我们要定义platform_driver结构体:

定义了此结构体之后,在帧缓冲设备的模块加载函数sep4020fb_init(void)中,我们只需要使用函数platform_driver_register(&sep4020fb_driver)注册平台驱动,而其余大部分的初始化工作移交到平台驱动的探测函数sep4020fb_probe中完成。 在函数sep4020fb_probe(struct platform_device*pdev)中,首先要申请SEP4020的帧缓冲信息结构体:structsep4020fb_info*info,在此结构体中,成员sep4020fb_ma c h_i n f o记录了seP4020帧缓存的机器信息,sep4020fb_hw包含了sep4020微处理器LCD控制器所涉及到的所有寄存器的信息,screen_dma表示帧缓存的物理地址,而screen_cpu代表了帧缓存的虚拟地址。之后要为sep4020fb_mach_info申请内存空间,申请完毕之后就要初始化fb_info结构体中的固定和可变参数,即填充fb_var_screeninfo var和fb_fix_screeninfo fix成员。首先通过fb_info一>fbops=&sep4020fb_ops将为sep4020微处理器定义的函数操作结构体赋予帧缓存信息结构体中对应的成员,sep4020fb_ops定义了指向底层操作的一系列函数,本文将在后面详细介绍;由于本课题选用的液晶屏为320×240TFT彩屏,所以fb_info->var.xres赋值为320,fb_info一>var.yres赋值为240,fb_info一>var.bits_per_pixel赋值为16,这样就可以算出帧缓存的长度为320×240×16/8个字节,将此值赋给fbinfo->fix.smem_len成员。

完成可变参数和固定参数的填充之后,要为本驱动申请中断资源,具体函数为requesTIrq(irq,sep4020fb_irq,SA INTERRUPT,pdev一>name,info),irq为请求的中断号,sep4020fb_irq为中断处理服务子程序,SA_INTERRUPT表示为一个快速中断处理,在执行中断的过程中禁止所有在当前处理器上的其他中断。申请中断完毕之后,就要完成本驱动关键步骤,调用sep4020fb_map_video_memory()函数申请显示缓冲区。在该函数中,首先调用PAGE_ALIGN()函数对齐申请的缓冲区的大小,使即将申请的显示缓冲区大小为页的整数倍;然后调用函数dma_all oc_writecombine(fbi->dev,fbi一>map_size,&fbi一>map_dma,GFP_KERNEL), 分配一块写合并的内存区域作为帧缓存,函数返回值为申请的帧缓存的起始位置的虚拟地址,fbi一>map_dma代表的是该位置的物理地址,fbi一>map_si ze为此内存区的大小。 完成上面的工作之后,驱动程序在就有了一块内存区域作为帧缓冲,向此区域写入数据就能显示在液晶屏上。后面还要调用sep4020fb_init_registers(info)函数初始化L C D控制器的寄存器;然后调用sep4020fb_check_var(&fbinfo一>var,fbinfo)检查可变参数,最后调用register_framebuffer(fbinfo)注册帧缓冲设备。3.3 提供给应用程序的接口 本驱动设计定义了如下几个接口供应用程序调用:fb_ioctl,fb_blank,fb_fillrect. 部分代码如下:

sep4020_blank函数主要实现了将液晶屏清屏的功能。 sep4020fb_fillrect函数实现了填充液晶屏一块矩形区域的功能。 sep4020fb_ioctl函数则为上层应用提供了更多的功能,部分可供上层调用的命令如下: FBIOGET_VSCREENINFO表示用户获取屏幕的可变参数; FBIOPUT_VSCREENINFO表示用户设置可变的屏幕参数; FBIOGET_FSCREENINFO表示用户获得屏幕的固定参数; FBIOBLANK表示调用sep4020fb_blank函数清空液晶屏; FBIOPUTCMAP表示设置屏幕的颜色表; FBIOGETCMAP表示获得颜色表。3.4 用户空间对帧缓冲设备进行访问 驱动程序经过编译并加载为模块后,成为/dev/fb0设备,在应用程序中,操作/dev/fb0一般遵循如下步骤:1)打开/dev/fb0设备文件;2)调用ioctl()操作取得屏幕的参数,如屏幕分辨率和每个像素所占的比特数,进而计算出显示缓冲区的大小;3)将屏幕缓冲区映射到用户空间;4)映射之后就可以向缓冲区写入或者读出数据,进行绘图了。

4 测试与结论 根据前面论述的步骤向屏幕缓冲区写入数据,将每个像素的值设为0xF0F0,在屏幕上显示如下图像:

测试结果显示,在本课题驱动模块的支持下,可以向屏幕缓冲区写入数据并正确地在屏幕上显示出来,工作完全正常。本文所提出的设计方案已经应用在本单位某产品上。

基于SEP4O2O的Linux frame buffer驱动设计

随着世界经济的迅速发展,液晶显示屏广泛应用于手机、PDA、金融终端等电子产品上,而在嵌入式电子领域,Linux操作系统占有越来越大的市场份额。因而本文提出在嵌入式Linux平台上实现液晶显示器的功能,详细叙述了液晶显示屏在SEP4020微处理器为基础的平台上的Framebuffer驱动程序设计。

1 液晶显示器原理1.1 液晶显示器种类 液晶显示器(LCD)根据驱动方式可以分为静态驱动、简单矩阵驱动以及主动矩阵驱动三种。其中,简单矩阵型又可以再分为扭转向列(TN)和超扭转式向列型(STN)两种,而主动矩阵则以薄膜式晶体管(TFT)为主流。 TN型技术是LCD中最基本的,其他种类的LCD都以TN型为基础改进而得。TN型LCD显示质量很差,色彩单一、对比度低,反应速度很慢,故主要应用于简单的数字符与文字的显示,如电子表以及电子计算器等。STN LCD的显示原理与TN类似,区别在于TN型的液晶分子将入射光旋转90°,而STN可将入射光旋转180°到270°。STN改善了TN视角狭小的缺点,并提高了对比度,显示品质较TN高。 TFT型LCD中,晶体管矩阵依显示信号开启或者关闭液晶分子的电压,使液晶分子轴转向而成"亮"或者"暗"的对比,避免了显示器对电场效应的依靠。因此,TFTLCD显示质量较TN/STN更佳,画面显示对比度可达150:1以上,反应速度逼近30ms甚至更快,适用于PDA、笔记本电脑、数码相机、MP4等。1.2 液晶显示器时序 图1为LCD的典型时序图。时序图中VFRAME为帧同步信号,VLINE为行同步信号,VCLK为像素时钟信号(用于锁存图像数据的像素时钟),VM为数据有效标志信号,VD为图像的数据信号。

作为帧同步信号的VFRAME,每发出一个脉冲,都意味着新的一屏图像数据开始发送。而作为行同步信号的VLINE,每发出一个脉冲都表明新的一行图像资料开始发送。在帧同步以及行同步的头尾都必须留有回扫时间。

2 硬件平台 本设计采用的硬件平台是基于东南大学国家专用集成电路系统工程中心研发的SEP4020微处理器的开发板。该处理器是使用0.18μ m标准CMOS的工艺设计,内嵌ASIX CORE(32位RISC内核兼容ARM720T,带8 kB指令数据cache和全功能MMU),采用冯诺依曼结构的一款微处理器。该处理器集成了液晶控制模块(LCDC),此模块兼容AMBA规范,有AHB MASTER和AHB SLAVE接口,分别用于读取需要显示的数据和软件配置。经过软件配置后,LCDC能自己独立工作,而不再需要内核的再次参与,从而节省内核的处理时间。工作过程是LCDC使能后申请系统总线,获得总线使用权后读取需要显示的数据,数据经过相应算法的处理就得到满足时序要求的信号,送到LCDC显示驱动器。 LCDC使用内嵌的DMA方式进行数据操作,配备一个深度为16的32位FIFO用于缓存显示数据,支持1、2、4位的STN灰度显示和16位TFT彩色显示,分辨率软件可配置。相关的需要配置的寄存器有: SSA为屏幕起始寄存器;SIZE为屏幕尺寸寄存器;PCR为面板配置寄存器;HCR为水平配置寄存器;VCR为垂直配置寄存器:PWMR为对比度控制器;LECR为使能控制寄存器;DMACR为DMA控制寄存器。

3 L i nux驱动软件设计实现3.1 驱动核心结构体的介绍3.1.1.fb_jnfo结构体 帧缓冲设备最关键的一个数据结构体是fb info结构体,其中包含了关于帧缓冲设备属性和操作的完整描述,定义如下:

限于篇幅,只列出了部分成员,其中fb_var_screeninfo记录用户可以修改的显示控制器参数,包括屏幕分辨率和每个像素的比特数等;fb_fix_screeninfo记录用户不能修改的显示控制器参数;cmap为目前的颜色表;fb_ops为帧缓冲操作函数集;screen_base为帧缓冲的虚拟基地址;i oremapped的虚拟内存大小;pseudo_palette为伪16色的颜色表。3.1.2.fb_ops结构体 本结构体为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写填充的,部分成员定义如下

fb_check_var ()用于调整可变参数,并修整为硬件支持的值;fb_set_par()则根据屏幕参数设置具体读写LCD控制器的寄存器以使得LCD控制器进入相应的工作状态,使用户设置的屏幕参数在硬件上有效;f bsetcolreg ()成员函数实现伪颜色表和颜色表的填充。3.1.3.fb_var_screeni nfo 本结构体定义了用户可以修改的显示控制器参数,部分成员如下:

本结构体中,xres为屏幕的水平像素数;yres为屏幕垂直宽度:bits_per_pixel定义每个像素由多少个位表示;pixclock定义了像素时钟;left_margin是表示行切换中从同步到绘图之间的延迟;right_margin表示行切换中从绘图到同步之间的延迟;upper_margin表示帧切换中从同步到绘图之间的延迟;lower_margin表示帧切换中从绘图到同步之间的延迟;hsyn_len表示水平同步的长度;vsync_len表示垂直同步的长度。3.2 Linux帧缓冲设备的模块加载和卸载函数 由于LCD控制器被集成在SOC芯片上作为一个独立的硬件模块,也就是platform_device而存在,因此本驱动中包含平台驱动。首先我们要定义platform_driver结构体:

定义了此结构体之后,在帧缓冲设备的模块加载函数sep4020fb_init(void)中,我们只需要使用函数platform_driver_register(&sep4020fb_driver)注册平台驱动,而其余大部分的初始化工作移交到平台驱动的探测函数sep4020fb_probe中完成。 在函数sep4020fb_probe(struct platform_device*pdev)中,首先要申请SEP4020的帧缓冲信息结构体:structsep4020fb_info*info,在此结构体中,成员sep4020fb_ma c h_i n f o记录了seP4020帧缓存的机器信息,sep4020fb_hw包含了sep4020微处理器LCD控制器所涉及到的所有寄存器的信息,screen_dma表示帧缓存的物理地址,而screen_cpu代表了帧缓存的虚拟地址。之后要为sep4020fb_mach_info申请内存空间,申请完毕之后就要初始化fb_info结构体中的固定和可变参数,即填充fb_var_screeninfo var和fb_fix_screeninfo fix成员。首先通过fb_info一>fbops=&sep4020fb_ops将为sep4020微处理器定义的函数操作结构体赋予帧缓存信息结构体中对应的成员,sep4020fb_ops定义了指向底层操作的一系列函数,本文将在后面详细介绍;由于本课题选用的液晶屏为320×240TFT彩屏,所以fb_info->var.xres赋值为320,fb_info一>var.yres赋值为240,fb_info一>var.bits_per_pixel赋值为16,这样就可以算出帧缓存的长度为320×240×16/8个字节,将此值赋给fbinfo->fix.smem_len成员。

完成可变参数和固定参数的填充之后,要为本驱动申请中断资源,具体函数为requesTIrq(irq,sep4020fb_irq,SA INTERRUPT,pdev一>name,info),irq为请求的中断号,sep4020fb_irq为中断处理服务子程序,SA_INTERRUPT表示为一个快速中断处理,在执行中断的过程中禁止所有在当前处理器上的其他中断。申请中断完毕之后,就要完成本驱动关键步骤,调用sep4020fb_map_video_memory()函数申请显示缓冲区。在该函数中,首先调用PAGE_ALIGN()函数对齐申请的缓冲区的大小,使即将申请的显示缓冲区大小为页的整数倍;然后调用函数dma_all oc_writecombine(fbi->dev,fbi一>map_size,&fbi一>map_dma,GFP_KERNEL), 分配一块写合并的内存区域作为帧缓存,函数返回值为申请的帧缓存的起始位置的虚拟地址,fbi一>map_dma代表的是该位置的物理地址,fbi一>map_si ze为此内存区的大小。 完成上面的工作之后,驱动程序在就有了一块内存区域作为帧缓冲,向此区域写入数据就能显示在液晶屏上。后面还要调用sep4020fb_init_registers(info)函数初始化L C D控制器的寄存器;然后调用sep4020fb_check_var(&fbinfo一>var,fbinfo)检查可变参数,最后调用register_framebuffer(fbinfo)注册帧缓冲设备。3.3 提供给应用程序的接口 本驱动设计定义了如下几个接口供应用程序调用:fb_ioctl,fb_blank,fb_fillrect. 部分代码如下:

sep4020_blank函数主要实现了将液晶屏清屏的功能。 sep4020fb_fillrect函数实现了填充液晶屏一块矩形区域的功能。 sep4020fb_ioctl函数则为上层应用提供了更多的功能,部分可供上层调用的命令如下: FBIOGET_VSCREENINFO表示用户获取屏幕的可变参数; FBIOPUT_VSCREENINFO表示用户设置可变的屏幕参数; FBIOGET_FSCREENINFO表示用户获得屏幕的固定参数; FBIOBLANK表示调用sep4020fb_blank函数清空液晶屏; FBIOPUTCMAP表示设置屏幕的颜色表; FBIOGETCMAP表示获得颜色表。3.4 用户空间对帧缓冲设备进行访问 驱动程序经过编译并加载为模块后,成为/dev/fb0设备,在应用程序中,操作/dev/fb0一般遵循如下步骤:1)打开/dev/fb0设备文件;2)调用ioctl()操作取得屏幕的参数,如屏幕分辨率和每个像素所占的比特数,进而计算出显示缓冲区的大小;3)将屏幕缓冲区映射到用户空间;4)映射之后就可以向缓冲区写入或者读出数据,进行绘图了。

4 测试与结论 根据前面论述的步骤向屏幕缓冲区写入数据,将每个像素的值设为0xF0F0,在屏幕上显示如下图像:

测试结果显示,在本课题驱动模块的支持下,可以向屏幕缓冲区写入数据并正确地在屏幕上显示出来,工作完全正常。本文所提出的设计方案已经应用在本单位某产品上。

技术专区 Alexa语音服务软件扩展STM32Cube结合DNN API驱动未来神经网络应用的解决方案针对于高端移动通信和汽车市场的四集群设计一款基于帧捕捉的开源图形调试器应用设计即将成为标准配置的最新安全技术:后视摄像系统
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。