版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。linux的lcd驱动详细讲解-嵌入式驱动程序Day12HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlTopHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmllcase1LCD驱动设计开发1LCD驱动设计开发1.1问题通过lcd驱动开发掌握linux内核framebuffer驱动开发通用方法。1.2方案一、
2、帧缓冲(Framebuffer)。帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。Framebuffer本身不具备任何
3、运算数据的能力,就只好比是一个暂时存放水的水池。CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理。应用程序也可以直接读写这个水池的内容。在应用程序中,一般通过将FrameBuffer设备映射到进程地址空间的方式使用,比如下面的程序就打开/dev/fb0设备,并通过mmap系统调用进行地址映射。FrameBuffer设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。二、FrameBuffer在Linux中的实现和机制
4、。Framebuffer对应的源文件在linux/drivers/video/目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。1.分析Framebuffer设备驱动。FrameBuffer设备驱动基于如下两个文件:(1)linux/include/linux/fb.h(2)linux/drivers/video/fbmem.c2.分析这两个文件。(1)fb.h。几乎主要的结构都是在这个中文件定义的。这些结构包括:1)fb_var_screeninfo结构体。这个结构描述了显示卡的特性:_u32是表示unsigned不带符号的32bits的数据类型,其余类推
5、。这是Linux内核中所用到的数据类型,如果是开发用户空间(user-space)的程序,可以根据具体计算机平台的情况,用unsignedlong等等来代替。structfb_var_screeninfo_u32xres;/可视区域_u32yres;_u32xres_virtual;/可视区域_u32yres_virtual;_u32xoffset;/可视区域的偏移_u32yoffset;_u32bits_per_pixel;/每一象素的bit数_u32grayscale;/等于零就成黑白structfb_bitfieldred;structfb_bitfieldgreen;/*elseonl
6、ylengthissignificant*/structfb_bitfieldblue;structfb_bitfieldtransp;/透明_u32nonstd;/不是标准格式_u32activate;/*seeFB_ACTIVATE_*/_u32height;/内存中的图像高度_u32width;/内存中的图像宽度_u32accel_flags;/加速标志/时序-_-这些部分就是显示器的显示方法_u32pixclock;/*pixelclockinps(picoseconds)*/_u32left_margin;/*timefromsynctopicture*/_u32right_marg
7、in;/*timefrompicturetosync*/_u32upper_margin;/*timefromsynctopicture*/_u32lower_margin;_u32hsync_len;/*lengthofhorizontalsync*/水平可视区域_u32vsync_len;/*lengthofverticalsync*/垂直可视区域_u32sync;/*seeFB_SYNC_*/_u32vmode;/*seeFB_VMODE_*/_u32reserved6;/备用以后开发;2)fb_fix_screeninfon结构体。这个结构在显卡被设定模式后创建,它描述显示卡的属性,并
8、且系统运行时不能被修改;比如FrameBuffer内存的起始地址。它依赖于被设定的模式,当一个模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。structfb_fix_screeninfocharid16;/*identificationstringegTTBuiltin*/IDunsignedlongsmem_start;/*Startofframebuffermem*/内存起始/*(physicaladdress)*/物理地址_u32smem_len;/*Lengthofframebuffermem*/内存大小_u32type;/*seeFB_TYPE_*/_u32t
9、ype_aux;/*InterleaveforinterleavedPlanes*/插入区域?_u32visual;/*seeFB_VISUAL_*/_u16xpanstep;/没有硬件设备就为零_u16ypanstep;/*zeroifnohardwarepanning*/_u16ywrapstep;/*zeroifnohardwareywrap*/_u32line_length;/一行的字节表示unsignedlongmmio_start;/内存映射的I/O起始/*(physicaladdress)*/_u32mmio_len;/I/O的大小_u32accel;/*Typeofaccele
10、rationavailable*/可用的加速类型_u16reserved3;/*Reservedforfuturecompatibility*/;3)fb_cmap结构体。描述设备无关的颜色映射信息。可以通过FBIOGETCMAP和FBIOPUTCMAP对应的ioctl操作设定或获取颜色映射信息。structfb_cmap_u32start;/*Firstentry*/第一个入口_u32len;/*Numberofentries*/入口的数字_u16*red;/*Redvalues*/红_u16*green;_u16*blue;_u16*transp;/*transparency,canbeN
11、ULL*/透明,可以为零;4)fb_info结构体。定义当显卡的当前状态;fb_info结构仅在内核中可见,在这个结构中有一个fb_ops指针,指向驱动设备工作所需的函数集。structfb_infocharmodename40;/默认的视频卡类型kdev_tnode;intflags;intopen;/被打开过么?#defineFBINFO_FLAG_MODULE1/*Low-leveldriverisamodule*/structfb_var_screeninfovar;/现在的视频信息structfb_fix_screeninfofix;/修正的信息structfb_monspecsmo
12、nspecs;/现在的显示器模式structfb_cmapcmap;/当前优先级structfb_ops*fbops;char*screen_base;/物理基址structdisplay*disp;/初始化structvc_data*display_fg;/*Consolevisibleonthisdisplay*/charfontname40;/默认的字体devfs_handle_tdevfs_handle;/*Devfshandlefornewname*/devfs_handle_tdevfs_lhandle;/兼容int(*changevar)(int);/告诉console变量修改了
13、int(*switch_con)(int,structfb_info*);/告诉fb选择consolesint(*updatevar)(int,structfb_info*);/*tellfbtoupdatethevars*/告诉fb更新变量void(*blank)(int,structfb_info*);/*tellfbto(un)blankthescreen*/告诉fb使用黑白模式(或者不黑)/*arg=0:unblank*/arg0的时候黑白模式/*arg0:VESAlevel(arg-1)*/arg0时候选择VESA模式void*pseudo_palette;/*Fakepalette
14、of16colorsandthecursorscolorfornonpalettemode*/修正调色板/*Fromhereoneverythingisdevicedependent*/现在就可以使用了void*par;5)structfb_ops结构体。用户应用可以使用ioctl()系统调用来操作设备,这个结构就是用一支持ioctl()的这些操作的。structfb_ops/*open/releaseandusagemarking*/structmodule*owner;int(*fb_open)(structfb_info*info,intuser);int(*fb_release)(st
15、ructfb_info*info,intuser);/*getnonsettableparameters*/int(*fb_get_fix)(structfb_fix_screeninfo*fix,intcon,structfb_info*info);/*getsettableparameters*/int(*fb_get_var)(structfb_var_screeninfo*var,intcon,structfb_info*info);/*setsettableparameters*/int(*fb_set_var)(structfb_var_screeninfo*var,intcon,
16、structfb_info*info);/*getcolormap*/int(*fb_get_cmap)(structfb_cmap*cmap,intkspc,intcon,structfb_info*info);/*setcolormap*/int(*fb_set_cmap)(structfb_cmap*cmap,intkspc,intcon,structfb_info*info);/*pandisplay(optional)*/int(*fb_pan_display)(structfb_var_screeninfo*var,intcon,structfb_info*info);/*perf
17、ormfbspecificioctl(optional)*/int(*fb_ioctl)(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg,intcon,structfb_info*info);/*performfbspecificmmap*/int(*fb_mmap)(structfb_info*info,structfile*file,structvm_area_struct*vma);/*switchto/fromrasterimagemode*/int(*fb_rasterimg)(structfb_inf
18、o*info,intstart);(2)fbmem.c。fbmem.c处于Framebuffer设备驱动技术的中心位置。它为上层应用程序提供系统调用也为下一层的特定硬件驱动提供接口;那些底层硬件驱动需要用到这儿的接口来向系统内核注册它们自己。fbmem.c为所有支持FrameBuffer的设备驱动提供了通用的接口,避免重复工作。1)全局变量。structfb_info*registered_fbFB_MAX;intnum_registered_fb;这两变量记录了所有fb_info结构的实例,fb_info结构描述显卡的当前状态,所有设备对应的fb_info结构都保存在这个数组中,当一个Fra
19、meBuffer设备驱动向系统注册自己时,其对应的fb_info结构就会添加到这个结构中,同时num_registered_fb为自动加1。staticstructconstchar*name;int(*init)(void);int(*setup)(void);fb_drivers_initdata=.;如果FrameBuffer设备被静态链接到内核,其对应的入口就会添加到这个表中;如果是动态加载的,即使用insmod/rmmod,就不需要关心这个表。staticstructfile_operationsfb_ops=owner:THIS_MODULE,read:fb_read,write:
20、fb_write,ioctl:fb_ioctl,mmap:fb_mmap,open:fb_open,release:fb_release;这是一个提供给应用程序的接口。2)fbmem.c实现了如下函数。Register_framebuffer(structfb_info*fb_info);unregister_framebuffer(structfb_info*fb_info);这两个是提供给下层FrameBuffer设备驱动的接口,设备驱动通过这两函数向系统注册或注销自己。几乎底层设备驱动所要做的所有事情就是填充fb_info结构然后向系统注册或注销它。三、本案例的操作步骤如下。1.修改ma
21、ch-cw210.c源文件,实现LCD设备的初始化。2.重新编译内核zImage,并将zImage拷贝到/tftpboot下。3.编写应用测试程序lcd_test.c。(1)定义宏和变量;HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlcopyHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmltextHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/
22、DAY12/CASE/01/index.htmlpop-up#defineCOLOR_RED0 x000000FF#defineCOLOR_GREEN0 x0000FF00#defineCOLOR_BLUE0 x00FF0000intfdfb=-1;structfb_fix_screeninfofbfix=0;structfb_var_screeninfofbvar=0;longscreensize=0;int*fb32=NULL;intx=0;inty=0;longlocation=0;#defineCOLOR_RED0 x000000FF#defineCOLOR_GREEN0 x0000F
23、F00#defineCOLOR_BLUE0 x00FF0000intfdfb=-1;structfb_fix_screeninfofbfix=0;structfb_var_screeninfofbvar=0;longscreensize=0;int*fb32=NULL;intx=0;inty=0;longlocation=0;(2)编写main()函数;1)打开Framebuffer设备文件;2)使用ioctl()系统调用获取帧缓冲设备中设备无关的固定参数信息;3)使用ioctl()系统调用获取帧缓冲设备中设备无关的可变参数信息和特定的显示模式;4)计算显示屏幕上所有点需要的字节数,字节数等于
24、分辨率*每个点占据的字节数;5)使用函数mmap()将Framebuffer的显存映射到用户空间,使得用户空间可以直接进行读写操作;6)根据色深,操作显存,在LCD屏上绘制红色、绿色、蓝色三个区域;7)使用函数munmap()解除对显存的映射;8)关闭Framebuffer设备。4.编写Makefile文件。5.编译LCD驱动模块,并将生成的lcd_test文件拷贝到指定目录下。6.在TPAD的运行终端上运行应用测试程序,测试驱动程序。1.3实现1.修改mach-cw210.c源文件,实现LCD设备的初始化。修改/home/tarena/workdir/tools/cw210_kernel_/
25、arch/arm/mach-s5pv210/目录下的mach-cw210.c源文件。HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlcopyHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmltextHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlpop-up$cd/home/tarena/workdi
26、r/tools/cw210_kernel_/arch/arm/mach-s5pv210/$vimach-cw210.c$cd/home/tarena/workdir/tools/cw210_kernel_/arch/arm/mach-s5pv210/$vimach-cw210.c添加源代码如下:HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlcopyHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.html
27、textHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlpop-up#elifdefined(CONFIG_FB_AT070TN92)staticstructs3cfb_lcdlte480wv=.width=800,.height=480,.bpp=24,.freq=28,.clkval_f=6,/3/27,/HBPD/14,/HFPD/20,/10,/HSPW.timing=.h_fp=14,/210,.h_bp=27,/16,.h_sw=20,/30,.v_fp=22,.v_fpe=1,.v
28、_bp=10,.v_bpe=1,.v_sw=13,.polarity=.rise_vclk=0,.inv_hsync=1,.inv_vsync=1,.inv_vden=0,;staticvoidlte480wv_cfg_gpio(structplatform_device*pdev)inti;for(i=0;i8;i+)s3c_gpio_cfgpin(S5PV210_GPF0(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF0(i),S3C_GPIO_PULL_NONE);for(i=0;i8;i+)s3c_gpio_cfgpin(S5PV210_
29、GPF1(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF1(i),S3C_GPIO_PULL_NONE);for(i=0;i8;i+)s3c_gpio_cfgpin(S5PV210_GPF2(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF2(i),S3C_GPIO_PULL_NONE);for(i=0;i4;i+)s3c_gpio_cfgpin(S5PV210_GPF3(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF3(i),S3C_GPIO_PULL
30、_NONE);/*mDNIeSEL:whyweshallwrite0 x2?*/writel(0 x2,S5P_MDNIE_SEL);/*drivestrengthtomax*/writel(0 xffffffff,S5PV210_GPF0_BASE+0 xc);writel(0 xffffffff,S5PV210_GPF1_BASE+0 xc);writel(0 xffffffff,S5PV210_GPF2_BASE+0 xc);writel(0 x000000ff,S5PV210_GPF3_BASE+0 xc);staticintlte480wv_backlight_on(structpl
31、atform_device*pdev)interr;err=gpio_request(S5PV210_GPD0(0),GPD0);if(err)printk(KERN_ERRfailedtorequestGPD0forlcdbacklightcontroln);returnerr;gpio_direction_output(S5PV210_GPD0(0),1);#ifdefined(CONFIG_FB_S3C_VGA640480)|defined(CONFIG_FB_AT070TN92)|defined(CONFIG_FB_S3C_VGA800600)s3c_gpio_cfgpin(S5PV2
32、10_GPD0(0),/*S5PV210_GPD_0_0_TOUT_0*/1);#elses3c_gpio_cfgpin(S5PV210_GPD0(0),S5PV210_GPD_0_0_TOUT_0);#endifgpio_free(S5PV210_GPD0(0);return0;staticintlte480wv_backlight_off(structplatform_device*pdev,intonoff)interr;err=gpio_request(S5PV210_GPD0(0),GPD0);if(err)printk(KERN_ERRfailedtorequestGPD0forl
33、cdbacklightcontroln);returnerr;gpio_direction_output(S5PV210_GPD0(0),1);#ifdefined(CONFIG_FB_S3C_VGA640480)|defined(CONFIG_FB_AT070TN92)|defined(CONFIG_FB_S3C_VGA800600)s3c_gpio_cfgpin(S5PV210_GPD0(0),/*S5PV210_GPD_0_0_TOUT_0*/1);#elses3c_gpio_cfgpin(S5PV210_GPD0(0),S5PV210_GPD_0_0_TOUT_0);#endifgpi
34、o_free(S5PV210_GPD0(0);return0;staticintlte480wv_backlight_off(structplatform_device*pdev,intonoff)interr;err=gpio_request(S5PV210_GPD0(0),GPD0);if(err)printk(KERN_ERRfailedtorequestGPD0forlcdbacklightcontroln);returnerr;gpio_direction_output(S5PV210_GPD0(0),0);gpio_free(S5PV210_GPD0(0);return0;stat
35、icintlte480wv_reset_lcd(structplatform_device*pdev)return0;staticstructs3c_platform_fblte480wv_fb_data_initdata=.hw_ver=0 x62,.nr_wins=5,.default_win=CONFIG_FB_S3C_DEFAULT_WINDOW,.swap=FB_SWAP_WORD|FB_SWAP_HWORD,.lcd=<e480wv,.cfg_gpio=lte480wv_cfg_gpio,.backlight_on=lte480wv_backlight_on,.backligh
36、t_onoff=lte480wv_backlight_off,.reset_lcd=lte480wv_reset_lcd,;staticvoid_initsmdkc110_machine_init(void)s3cfb_set_platdata(<e480wv_fb_data);#elifdefined(CONFIG_FB_AT070TN92)staticstructs3cfb_lcdlte480wv=.width=800,.height=480,.bpp=24,.freq=28,.clkval_f=6,/3/27,/HBPD/14,/HFPD/20,/10,/HSPW.timing=.h
37、_fp=14,/210,.h_bp=27,/16,.h_sw=20,/30,.v_fp=22,.v_fpe=1,.v_bp=10,.v_bpe=1,.v_sw=13,.polarity=.rise_vclk=0,.inv_hsync=1,.inv_vsync=1,.inv_vden=0,;staticvoidlte480wv_cfg_gpio(structplatform_device*pdev)inti;for(i=0;i8;i+)s3c_gpio_cfgpin(S5PV210_GPF0(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF0(i),
38、S3C_GPIO_PULL_NONE);for(i=0;i8;i+)s3c_gpio_cfgpin(S5PV210_GPF1(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF1(i),S3C_GPIO_PULL_NONE);for(i=0;i8;i+)s3c_gpio_cfgpin(S5PV210_GPF2(i),S3C_GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF2(i),S3C_GPIO_PULL_NONE);for(i=0;i4;i+)s3c_gpio_cfgpin(S5PV210_GPF3(i),S3C_
39、GPIO_SFN(2);s3c_gpio_setpull(S5PV210_GPF3(i),S3C_GPIO_PULL_NONE);/*mDNIeSEL:whyweshallwrite0 x2?*/writel(0 x2,S5P_MDNIE_SEL);/*drivestrengthtomax*/writel(0 xffffffff,S5PV210_GPF0_BASE+0 xc);writel(0 xffffffff,S5PV210_GPF1_BASE+0 xc);writel(0 xffffffff,S5PV210_GPF2_BASE+0 xc);writel(0 x000000ff,S5PV2
40、10_GPF3_BASE+0 xc);staticintlte480wv_backlight_on(structplatform_device*pdev)interr;err=gpio_request(S5PV210_GPD0(0),GPD0);if(err)printk(KERN_ERRfailedtorequestGPD0forlcdbacklightcontroln);returnerr;gpio_direction_output(S5PV210_GPD0(0),1);#ifdefined(CONFIG_FB_S3C_VGA640480)|defined(CONFIG_FB_AT070T
41、N92)|defined(CONFIG_FB_S3C_VGA800600)s3c_gpio_cfgpin(S5PV210_GPD0(0),/*S5PV210_GPD_0_0_TOUT_0*/1);#elses3c_gpio_cfgpin(S5PV210_GPD0(0),S5PV210_GPD_0_0_TOUT_0);#endifgpio_free(S5PV210_GPD0(0);return0;staticintlte480wv_backlight_off(structplatform_device*pdev,intonoff)interr;err=gpio_request(S5PV210_G
42、PD0(0),GPD0);if(err)printk(KERN_ERRfailedtorequestGPD0forlcdbacklightcontroln);returnerr;gpio_direction_output(S5PV210_GPD0(0),1);#ifdefined(CONFIG_FB_S3C_VGA640480)|defined(CONFIG_FB_AT070TN92)|defined(CONFIG_FB_S3C_VGA800600)s3c_gpio_cfgpin(S5PV210_GPD0(0),/*S5PV210_GPD_0_0_TOUT_0*/1);#elses3c_gpi
43、o_cfgpin(S5PV210_GPD0(0),S5PV210_GPD_0_0_TOUT_0);#endifgpio_free(S5PV210_GPD0(0);return0;staticintlte480wv_backlight_off(structplatform_device*pdev,intonoff)interr;err=gpio_request(S5PV210_GPD0(0),GPD0);if(err)printk(KERN_ERRfailedtorequestGPD0forlcdbacklightcontroln);returnerr;gpio_direction_output
44、(S5PV210_GPD0(0),0);gpio_free(S5PV210_GPD0(0);return0;staticintlte480wv_reset_lcd(structplatform_device*pdev)return0;staticstructs3c_platform_fblte480wv_fb_data_initdata=.hw_ver=0 x62,.nr_wins=5,.default_win=CONFIG_FB_S3C_DEFAULT_WINDOW,.swap=FB_SWAP_WORD|FB_SWAP_HWORD,.lcd=<e480wv,.cfg_gpio=lte48
45、0wv_cfg_gpio,.backlight_on=lte480wv_backlight_on,.backlight_onoff=lte480wv_backlight_off,.reset_lcd=lte480wv_reset_lcd,;staticvoid_initsmdkc110_machine_init(void)s3cfb_set_platdata(<e480wv_fb_data);HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.html隐藏HYPERLINK/tts6materials/
46、TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.html代码2.重新编译内核zImage,并将zImage拷贝到/tftpboot下。HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlcopyHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmltextHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12
47、/CASE/01/index.htmlpop-up$cd/home/tarena/workdir/tools/cw210_kernel_/$makezImage$cparch/arm/boot/zImage/tftpboot$cd/home/tarena/workdir/tools/cw210_kernel_/$makezImage$cparch/arm/boot/zImage/tftpboot3.编写测试程序lcd_test.c编辑lcd_test.c源文件。HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/ind
48、ex.htmlcopyHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmltextHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlpop-up$vilcd_test.c$vilcd_test.clcd_test.c源代码如下:HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlcopyHYPERLINK/t
49、ts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmltextHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlpop-up#include#include#include#include#include#defineCOLOR_RED0 x000000FF#defineCOLOR_GREEN0 x0000FF00#defineCOLOR_BLUE0 x00FF0000intfdfb=-1;structfb_fix_scree
50、ninfofbfix=0;structfb_var_screeninfofbvar=0;longscreensize=0;int*fb32=NULL;intx=0;inty=0;longlocation=0;intmain(intargc,char*argv)/openframebufferdevicefdfb=open(argv1,O_RDWR);if(0fdfb)printf(Failuretoopenframebufferdevice:/dev/fb0!n);exit(-1);printf(Successtoopenframebufferdevice:/dev/fb0!n);/getfi
51、xedscreeninformationif(ioctl(fdfb,FBIOGET_FSCREENINFO,&fbfix)printf(Failuretogetfixedscreeninformation!n);exit(-2);printf(Successtogetfixedscreeninformation!n);/getvariblescreeninformationif(ioctl(fdfb,FBIOGET_VSCREENINFO,&fbvar)printf(Failuretogetvariblescreeninformation!n);exit(-3);printf(Successt
52、ogetvariblescreeninformation!n);/calculatethenumberofbytesforscreensizescreensize=fbvar.xres*fbvar.yres*(fbvar.bits_per_pixel/8);printf(sceeninfo.xres=%d,screeninfo.yres=%d,screeninfo.bits_per_pixel=%dbpp,screensize=%d!n,fbvar.xres,fbvar.yres,fbvar.bits_per_pixel,screensize);/mmapframebuffertoproces
53、smemoryspacefb32=(int*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fdfb,0);if(NULL=fb32)printf(Failuretomapframebufferdevicememorytoprocesssmemory!n);exit(-4);printf(Successtomapframebufferdevicememorytoprocesssmemory!n);/drawpixelif(8=fbvar.bits_per_pixel)printf(Starting8bppframebuffertest.n)
54、;elseif(16=fbvar.bits_per_pixel)printf(Starting16bppframebuffertest.n);elseif(24=fbvar.bits_per_pixel)printf(Starting24bppframebuffertest.n);elseprintf(Supporting32bpp!n);/drawredcolorareaprintf(StartingtoshowREDarea!n);for(y=0;yfbvar.yres/3;y+)for(x=0;xfbvar.xres;x+)*(fb32+y*fbvar.xres+x)=COLOR_RED
55、;/drawgreencolorareaprintf(StartingtoshowGREENarea!n);for(y=(fbvar.yres/3);y(fbvar.yres*2/3);y+)for(x=0;xfbvar.xres;x+)*(fb32+y*fbvar.xres+x)=COLOR_GREEN;/drawbluecolorareaprintf(StartingtoshowBLUEarea!n);for(y=(fbvar.yres*2/3);yfbvar.yres;y+)for(x=0;xfbvar.xres;x+)*(fb32+y*fbvar.xres+x)=COLOR_BLUE;
56、/unmapframebuffermemorymunmap(fb32,screensize);printf(Finishedtodemotooperateframebuffer!n);/closedevicehandleclose(fdfb);return0;#include#include#include#include#include#defineCOLOR_RED0 x000000FF#defineCOLOR_GREEN0 x0000FF00#defineCOLOR_BLUE0 x00FF0000intfdfb=-1;structfb_fix_screeninfofbfix=0;stru
57、ctfb_var_screeninfofbvar=0;longscreensize=0;int*fb32=NULL;intx=0;inty=0;longlocation=0;intmain(intargc,char*argv)/openframebufferdevicefdfb=open(argv1,O_RDWR);if(0fdfb)printf(Failuretoopenframebufferdevice:/dev/fb0!n);exit(-1);printf(Successtoopenframebufferdevice:/dev/fb0!n);/getfixedscreeninformat
58、ionif(ioctl(fdfb,FBIOGET_FSCREENINFO,&fbfix)printf(Failuretogetfixedscreeninformation!n);exit(-2);printf(Successtogetfixedscreeninformation!n);/getvariblescreeninformationif(ioctl(fdfb,FBIOGET_VSCREENINFO,&fbvar)printf(Failuretogetvariblescreeninformation!n);exit(-3);printf(Successtogetvariblescreen
59、information!n);/calculatethenumberofbytesforscreensizescreensize=fbvar.xres*fbvar.yres*(fbvar.bits_per_pixel/8);printf(sceeninfo.xres=%d,screeninfo.yres=%d,screeninfo.bits_per_pixel=%dbpp,screensize=%d!n,fbvar.xres,fbvar.yres,fbvar.bits_per_pixel,screensize);/mmapframebuffertoprocessmemoryspacefb32=
60、(int*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fdfb,0);if(NULL=fb32)printf(Failuretomapframebufferdevicememorytoprocesssmemory!n);exit(-4);printf(Successtomapframebufferdevicememorytoprocesssmemory!n);/drawpixelif(8=fbvar.bits_per_pixel)printf(Starting8bppframebuffertest.n);elseif(16=fbvar.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论