




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。linux的lcd驅(qū)動詳細(xì)講解-嵌入式驅(qū)動程序Day12HYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmlTopHYPERLINK/tts6materials/TTS6/EMBED/ESD_V01/DRIVER/DAY12/CASE/01/index.htmllcase1LCD驅(qū)動設(shè)計開發(fā)1LCD驅(qū)動設(shè)計開發(fā)1.1問題通過lcd驅(qū)動開發(fā)掌握linux內(nèi)核framebuffer驅(qū)動開發(fā)通用方法。1.2方案一、
2、幀緩沖(Framebuffer)。幀緩沖(Framebuffer)是Linux為顯示設(shè)備提供的一個接口,Linux抽象出FrameBuffer這個設(shè)備來供用戶態(tài)進(jìn)程實現(xiàn)直接寫屏。Framebuffer機制模仿顯卡的功能,將顯卡硬件結(jié)構(gòu)抽象掉,可以通過Framebuffer的讀寫直接對顯存進(jìn)行操作。用戶可以將Framebuffer看成是顯示內(nèi)存的一個映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。這種操作是抽象的,統(tǒng)一的。用戶不必關(guān)心物理顯存的位置、換頁機制等等具體細(xì)節(jié)。這些都是由Framebuffer設(shè)備驅(qū)動來完成的。Framebuffer本身不具備任何
3、運算數(shù)據(jù)的能力,就只好比是一個暫時存放水的水池。CPU將運算后的結(jié)果放到這個水池,水池再將結(jié)果流到顯示器,中間不會對數(shù)據(jù)做處理。應(yīng)用程序也可以直接讀寫這個水池的內(nèi)容。在應(yīng)用程序中,一般通過將FrameBuffer設(shè)備映射到進(jìn)程地址空間的方式使用,比如下面的程序就打開/dev/fb0設(shè)備,并通過mmap系統(tǒng)調(diào)用進(jìn)行地址映射。FrameBuffer設(shè)備還提供了若干ioctl命令,通過這些命令,可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大?。?、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。二、FrameBuffer在Linux中的實現(xiàn)和機制
4、。Framebuffer對應(yīng)的源文件在linux/drivers/video/目錄下??偟某橄笤O(shè)備文件為fbcon.c,在這個目錄下還有與各種顯卡驅(qū)動相關(guān)的源文件。1.分析Framebuffer設(shè)備驅(qū)動。FrameBuffer設(shè)備驅(qū)動基于如下兩個文件:(1)linux/include/linux/fb.h(2)linux/drivers/video/fbmem.c2.分析這兩個文件。(1)fb.h。幾乎主要的結(jié)構(gòu)都是在這個中文件定義的。這些結(jié)構(gòu)包括:1)fb_var_screeninfo結(jié)構(gòu)體。這個結(jié)構(gòu)描述了顯示卡的特性:_u32是表示unsigned不帶符號的32bits的數(shù)據(jù)類型,其余類推
5、。這是Linux內(nèi)核中所用到的數(shù)據(jù)類型,如果是開發(fā)用戶空間(user-space)的程序,可以根據(jù)具體計算機平臺的情況,用unsignedlong等等來代替。structfb_var_screeninfo_u32xres;/可視區(qū)域_u32yres;_u32xres_virtual;/可視區(qū)域_u32yres_virtual;_u32xoffset;/可視區(qū)域的偏移_u32yoffset;_u32bits_per_pixel;/每一象素的bit數(shù)_u32grayscale;/等于零就成黑白structfb_bitfieldred;structfb_bitfieldgreen;/*elseonl
6、ylengthissignificant*/structfb_bitfieldblue;structfb_bitfieldtransp;/透明_u32nonstd;/不是標(biāo)準(zhǔn)格式_u32activate;/*seeFB_ACTIVATE_*/_u32height;/內(nèi)存中的圖像高度_u32width;/內(nèi)存中的圖像寬度_u32accel_flags;/加速標(biāo)志/時序-_-這些部分就是顯示器的顯示方法_u32pixclock;/*pixelclockinps(picoseconds)*/_u32left_margin;/*timefromsynctopicture*/_u32right_marg
7、in;/*timefrompicturetosync*/_u32upper_margin;/*timefromsynctopicture*/_u32lower_margin;_u32hsync_len;/*lengthofhorizontalsync*/水平可視區(qū)域_u32vsync_len;/*lengthofverticalsync*/垂直可視區(qū)域_u32sync;/*seeFB_SYNC_*/_u32vmode;/*seeFB_VMODE_*/_u32reserved6;/備用以后開發(fā);2)fb_fix_screeninfon結(jié)構(gòu)體。這個結(jié)構(gòu)在顯卡被設(shè)定模式后創(chuàng)建,它描述顯示卡的屬性,并
8、且系統(tǒng)運行時不能被修改;比如FrameBuffer內(nèi)存的起始地址。它依賴于被設(shè)定的模式,當(dāng)一個模式被設(shè)定后,內(nèi)存信息由顯示卡硬件給出,內(nèi)存的位置等信息就不可以修改。structfb_fix_screeninfocharid16;/*identificationstringegTTBuiltin*/IDunsignedlongsmem_start;/*Startofframebuffermem*/內(nèi)存起始/*(physicaladdress)*/物理地址_u32smem_len;/*Lengthofframebuffermem*/內(nèi)存大小_u32type;/*seeFB_TYPE_*/_u32t
9、ype_aux;/*InterleaveforinterleavedPlanes*/插入?yún)^(qū)域?_u32visual;/*seeFB_VISUAL_*/_u16xpanstep;/沒有硬件設(shè)備就為零_u16ypanstep;/*zeroifnohardwarepanning*/_u16ywrapstep;/*zeroifnohardwareywrap*/_u32line_length;/一行的字節(jié)表示unsignedlongmmio_start;/內(nèi)存映射的I/O起始/*(physicaladdress)*/_u32mmio_len;/I/O的大小_u32accel;/*Typeofaccele
10、rationavailable*/可用的加速類型_u16reserved3;/*Reservedforfuturecompatibility*/;3)fb_cmap結(jié)構(gòu)體。描述設(shè)備無關(guān)的顏色映射信息??梢酝ㄟ^FBIOGETCMAP和FBIOPUTCMAP對應(yīng)的ioctl操作設(shè)定或獲取顏色映射信息。structfb_cmap_u32start;/*Firstentry*/第一個入口_u32len;/*Numberofentries*/入口的數(shù)字_u16*red;/*Redvalues*/紅_u16*green;_u16*blue;_u16*transp;/*transparency,canbeN
11、ULL*/透明,可以為零;4)fb_info結(jié)構(gòu)體。定義當(dāng)顯卡的當(dāng)前狀態(tài);fb_info結(jié)構(gòu)僅在內(nèi)核中可見,在這個結(jié)構(gòu)中有一個fb_ops指針,指向驅(qū)動設(shè)備工作所需的函數(shù)集。structfb_infocharmodename40;/默認(rèn)的視頻卡類型kdev_tnode;intflags;intopen;/被打開過么?#defineFBINFO_FLAG_MODULE1/*Low-leveldriverisamodule*/structfb_var_screeninfovar;/現(xiàn)在的視頻信息structfb_fix_screeninfofix;/修正的信息structfb_monspecsmo
12、nspecs;/現(xiàn)在的顯示器模式structfb_cmapcmap;/當(dāng)前優(yōu)先級structfb_ops*fbops;char*screen_base;/物理基址structdisplay*disp;/初始化structvc_data*display_fg;/*Consolevisibleonthisdisplay*/charfontname40;/默認(rèn)的字體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*/修正調(diào)色板/*Fromhereoneverythingisdevicedependent*/現(xiàn)在就可以使用了void*par;5)structfb_ops結(jié)構(gòu)體。用戶應(yīng)用可以使用ioctl()系統(tǒng)調(diào)用來操作設(shè)備,這個結(jié)構(gòu)就是用一支持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設(shè)備驅(qū)動技術(shù)的中心位置。它為上層應(yīng)用程序提供系統(tǒng)調(diào)用也為下一層的特定硬件驅(qū)動提供接口;那些底層硬件驅(qū)動需要用到這兒的接口來向系統(tǒng)內(nèi)核注冊它們自己。fbmem.c為所有支持FrameBuffer的設(shè)備驅(qū)動提供了通用的接口,避免重復(fù)工作。1)全局變量。structfb_info*registered_fbFB_MAX;intnum_registered_fb;這兩變量記錄了所有fb_info結(jié)構(gòu)的實例,fb_info結(jié)構(gòu)描述顯卡的當(dāng)前狀態(tài),所有設(shè)備對應(yīng)的fb_info結(jié)構(gòu)都保存在這個數(shù)組中,當(dāng)一個Fra
19、meBuffer設(shè)備驅(qū)動向系統(tǒng)注冊自己時,其對應(yīng)的fb_info結(jié)構(gòu)就會添加到這個結(jié)構(gòu)中,同時num_registered_fb為自動加1。staticstructconstchar*name;int(*init)(void);int(*setup)(void);fb_drivers_initdata=.;如果FrameBuffer設(shè)備被靜態(tài)鏈接到內(nèi)核,其對應(yīng)的入口就會添加到這個表中;如果是動態(tài)加載的,即使用insmod/rmmod,就不需要關(guān)心這個表。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;這是一個提供給應(yīng)用程序的接口。2)fbmem.c實現(xiàn)了如下函數(shù)。Register_framebuffer(structfb_info*fb_info);unregister_framebuffer(structfb_info*fb_info);這兩個是提供給下層FrameBuffer設(shè)備驅(qū)動的接口,設(shè)備驅(qū)動通過這兩函數(shù)向系統(tǒng)注冊或注銷自己。幾乎底層設(shè)備驅(qū)動所要做的所有事情就是填充fb_info結(jié)構(gòu)然后向系統(tǒng)注冊或注銷它。三、本案例的操作步驟如下。1.修改ma
21、ch-cw210.c源文件,實現(xiàn)LCD設(shè)備的初始化。2.重新編譯內(nèi)核zImage,并將zImage拷貝到/tftpboot下。3.編寫應(yīng)用測試程序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()函數(shù);1)打開Framebuffer設(shè)備文件;2)使用ioctl()系統(tǒng)調(diào)用獲取幀緩沖設(shè)備中設(shè)備無關(guān)的固定參數(shù)信息;3)使用ioctl()系統(tǒng)調(diào)用獲取幀緩沖設(shè)備中設(shè)備無關(guān)的可變參數(shù)信息和特定的顯示模式;4)計算顯示屏幕上所有點需要的字節(jié)數(shù),字節(jié)數(shù)等于
24、分辨率*每個點占據(jù)的字節(jié)數(shù);5)使用函數(shù)mmap()將Framebuffer的顯存映射到用戶空間,使得用戶空間可以直接進(jìn)行讀寫操作;6)根據(jù)色深,操作顯存,在LCD屏上繪制紅色、綠色、藍(lán)色三個區(qū)域;7)使用函數(shù)munmap()解除對顯存的映射;8)關(guān)閉Framebuffer設(shè)備。4.編寫Makefile文件。5.編譯LCD驅(qū)動模塊,并將生成的lcd_test文件拷貝到指定目錄下。6.在TPAD的運行終端上運行應(yīng)用測試程序,測試驅(qū)動程序。1.3實現(xiàn)1.修改mach-cw210.c源文件,實現(xiàn)LCD設(shè)備的初始化。修改/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.重新編譯內(nèi)核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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 育嬰師職業(yè)道德與責(zé)任考核試題及答案
- 精煉2024年系統(tǒng)架構(gòu)設(shè)計師考試知識點總結(jié)試題及答案
- 激光教育培訓(xùn)的需求與市場現(xiàn)狀試題及答案
- 藥劑類考試復(fù)習(xí)的注意事項及試題及答案
- 護(hù)士資格證考試衛(wèi)生知識普及考題及答案
- 教育學(xué)中師試題及答案
- 衛(wèi)生管理證書考試技巧總結(jié)試題及答案
- 老人殘疾測試題及答案
- 教師資格考試全要素復(fù)習(xí)與試題及答案
- 稅務(wù)師考試考場應(yīng)對策略試題及答案
- 2024屆高考二輪復(fù)習(xí)備考 有機化學(xué)基礎(chǔ) 課件(共35張)
- 設(shè)備移機方案報告
- 2022版義務(wù)教育(道德與法治)課程標(biāo)準(zhǔn)(附課標(biāo)解讀)
- 旅游行業(yè)的客戶關(guān)系管理與維護(hù)
- 基于 Unity3D技術(shù)的農(nóng)場體驗游戲的設(shè)計與開發(fā)
- 緬懷革命先烈傳承紅色精神
- 水利工程建設(shè)標(biāo)準(zhǔn)強制性條文實施計劃
- 保安人員職業(yè)素養(yǎng)課件
- 隔熱防水涂料效果及使用指南
- zippo-2017原版年冊圖集(中文版)
- 鐵路車站-鐵路樞紐
評論
0/150
提交評論