S3C2440上LCD驱动.docx
S3C2440上1.CD驱动(FrameBUffer)实例开发讲解(一)一、开发环境主机:VWare-Fedora9二、背景学问1. 1.a)工作的硬件需求,要使一块1.CD正常的显示文字或图像,不仅须要1.CD驱动器,而且还须要相应的1.CD限制器。在通常状况下,生产厂商把1.CD驱动器会以COF/COG的形式与1.CD玻璃基板制作在起,而1.CD限制器则是由外部的电路来实现,现在许多的MCU内部都案成了1.CD限制器,如S3C2410/2440等。通过1.CD限制器就可以产生1.CD骄动落所须要的限制信号来限制STN/TFT屏了。2. S3C2440内部1.cD限制器结构图,SystemBus1.PC3600tsaMingcontrollogicunitfor1.TS35OQ1-PD1or1.T335001.CC3600isatimingcontrollogicunitfor1.TS351PE1or1.TSa5OQ1我们依据数据手册来描述下这个集成在S3C2440内部的1.CD限制器:a:1.CD限制器由REGBANK、1.CDCDMA、TIMEGEN.VlDPRCS寄存得组成:b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置1.CD限制器的:c:1.CDCDYA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到1.CD驱动器,通过运用这个DMA通道,视频数据在不须要CP1.的干预的状况下显示在1.CD屏上:d:VIDPRCS接收来自1.CDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口YD23:0传送视频数据到1.CD驱动器:e:TlMEGEN由可编程的逻辑组成,他生成1.CD驱动器须要的限制信号,比如VSYNC、HSYNC.VC1.K和1.END等等,而这些限制信号又与REGBANK寄存器组中的1.CDCOW/2/3/4/5的配置亲密相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的1.CD驱动器(即不同的STNT11屏)。3. 常见TFT屏工作时序分析:TFT屏工作时序图1.CD供应的外部接口信号:VSYNC/VFRAME/STV.垂直同步信号(TFT)/帧同步信号(STN)/SECTH信号;HSYNC/V1.INE/CPV.水平同步信号(TFT)/行同步脉冲信号(STN)/SECTl-T信号;VC1.K/1.CD_HC1.K.象素时钟信号CnTSTN)/SECTrT信号;VD23:0:1.CD像素数据输出端口(TFT/STN/SECTFT):VDEN/VWTPi数据使能信号(TFT)/1.CD驱动沟通偏置信号(SN/SECTFT信号;1.END/STH:行结束信号(TFn/SECTFT信号;1.CD_1.PC0E»SECTFTOE信号:1.a1.1.PCREV:SECTFTREV信号;1.CD.U>CREVBtSECTFTREVB信号。全部显示器显示图像的原理都是从上到下,从左到右的。这是什么意思呢?这么说吧,一副图像可以看做是一个矩形,由许多排列整齐的点一行一行组成,这些且称之为像整那么这幅图在1.eD上的显示原理就是:Ai显示指针从矩形左上角的第一行第一个点起先,一个点一个点的在1.CD上显示,在上面的时序图上用时间线表示就为VC1.K,我们称之为像素时钟信号;Bt当显示指针始终显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为11.ine;Ct接卜来显示指针又回到矩形的左边从其次行起先显示,留意,显示指针在从第行的右边回到其次行的左边是须要肯定的时间的,我们称之为行切换:D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把-副图显示完成。因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC;Et然而,1.CD的显示并不是对一副图像快速的显示一下,为J'持续和稳定的在1.CD上显示,就须要切换到另一幅图上(另一幅图可以和上一副图一样或者不样,目的只是为了将图像持续的显示在1.CD上)。那么这一副一副的图像就称之为帧,在时序图上就表示为1Frame,因此从时序图上可以看出11.ine只是1Frame中的一行:F.同样的,在帧与帧切换之间也是须要挎定的时间的,我们称之为帧切换,那么1.CD整个显示的过程在时间线上看,就可.表示为时序图上的VSYNCe上面时序图上.各时钟延时参数的含义如下:(这些参数的值1.CD产生J.商会供应相理的数据手册1.VBPD(verticalbackporch).表示在帧图像起先时,垂直同步信号以后的无效的行数,对应驱动中的UPPCrmargin:VFBD(verticalfrontporch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的IOWerjnargin:VSPf(verticalsyncpulsewidth)表示垂直同步脉冲的宽度,用行数计算,对应驱动中山VSyncen;HBPD(horizontalbackporch);表示从水平同步信号起先到一行的有效数据起先之间的VC1.K的个数,对应驱动中的ICftmargin;HF11)(horizontalfrontPOrth)t表示行的有效数据结束到下个水平同步信号起先之间的YC1.K的个数,对应驱动中的rightmargin:HSPI(horizonUlsyncpulsewidth)t表示水平同步信号的宽度,用VC1.K计算,对应驱动中的hsynclen:对于以上这些参数的值将分别保存到REGBANK寄存罂组中的1.CDCONI/2/3/4/5寄存器中:(对寄存器的操作请查看S3c2440数据手册1.CD部分)1XDC0N1:17-8位C1.KVA1.65位扫描模式(对于STN屏:4位单/双扫、8位单扫)4-1位色位模式(IBPP、8BPP、16BPP等)1.CDC0N2:3124位VBPD23-14位1.lNEVA1.136位VFPD5-O位VSPW1.CDC0N3:2519位HBPD18-8位HOZVA1.7-0位HFPD1.a)CON4:7-0位HSpW1.CDC0N5:4.幢线冲(FraTOBUffer):帧缓冲是1.inUX为显示设备供应的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过FrUmeBUffer定义好的接口访问这些图形设备,从而不用去关切详细的硬件细微环节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。下面来看一下在不同色位模式下缓冲区与显示点的对应关系:三、慎畿冲(FraBeBUffer)设答驱动结构:就纵冲设备为标准的字符型设备,在1.inUX中主设备号29.定义在includMir三major.h中的FBMUoR,次设备弓定义帧援冲的个数,公人允许有32个FralIIeBUfrer,定义在/include/IinUXfb,h中的FBMAX.对应于文件系统下devfbd设各文件.1 .慎缓冲设备驱动在1.inUX子系统中的结构如下:用广空Iii应用程序内移空间fbmcn.CfiIjoperation*结构体fbr«adOft-wt<O£b_nn»pO£bioctlOXXXfb.Cre>ster-fr«»ebu£ferO*'fb-infoVUnreCISter-EranebuffervtrC*fl>qps结构体£b_check_ver()ft_set_parO内核空间爰件1.CD控制器帧缓冲设备驱动程序结构图我们从上面这幅图存,帧爆冲设住在1.inUX中也可以看做是一个完整的子系统,大体由fbncm.c和XXXfb.c组成.向上给陶用程序供陶完善的设备文件操作接口(即对FrameUuffer设备进行read,Vrit、ioctl等操作),接口在1.inUX供应的fb<neB1.C文件中实现:向下供应了硬件悚作的接门,只是这些接111.inux并没有供应实现,因为这要依据详细的1.CD限制瑞硬件进行设置.所以这就是我们要做的事情(即xxxfb.c部分的实现).2 ,(疑冲相关的要数据结构:从帧缓冲设备张动程序结构看,该驱动主要跟fbinfo结构体有关,该结构体记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及对底层硬件操作的函数指针.在1.inUX中,每一个帧缓冲设备都必需对应一个fbjnfo,fbinf。在linux"b.h中的定义如下:(只列出重要的一些)structfbinfo(intnode;intflags:structfb_varscreeninfovar;*1.CD可2航Jtfr4ir珈4*/.涉奴:<JPJ*/structfbfixscreeninfofix;*I.CD固a:参数结构体*/structfbmonspecsmonspecs:'*1.CD显,-,ItuXlljj./J<SrWHt*/structworkstructqueue:flh4t/Kl7fak/>ClI-J1M>'J个/structfbpix11appixnap;structfbPiXmaPsprite;structfb-cmapcmap;*图像硬件mapper*/*光标硬件mapper*/*当前的颜色表structfbvideonode*mo<e;/*当前的显示模式*/Uifdef#endif#fdef*cndifCONFIG_FB_BACK1.1GHTstructbacklightdevice*bldev:structmutexblCUrVejnutex;u8blcurveFBBACK1.IGHT.1.EVE1.S;Co虾IGFB.DEFERREDIOstructdelayedwork<leferred_workStrUClfbdeerredio*fbdefio;/“对应的背光设备*/背光调整*/;#ifdef#cndif大小*/structfb_ops*fbops;structdevice*<levice:structdevice*dev;intclass_flag:CONFIG_FBTI1.EBl.i11iNGstructfb_tile_ops*tileops;char_io<nem*screen_base;unsignedlongSCreen_size;void*pseudo-palette:#<lefineWefine;FBlNFOSTATERUNNING0FBINFOSTATE_SUSPENDED1u32state;void*fbconj>ar;void*par;其中,比较要的成员有SlrUClfbvar.screeninfoviustructfb_fix_screeninfofix和StrUCtfb_ops*fbops,他们也都是结构体。下面我心一个个的来看。fbvarSCrCeninf。结构体主要记录用户可以修改的限制器的参数,比如屏障的辨别率和每个像索的比特数等,该结构体定义如下:structfb_var_screeninfou32xres;/*可见屏幕一行有多少个像素点*/u32yres:/*可见屏幕例有多少个像素点*/u32Xresvirtual;*虚拟屏幕一行有多少个像素点*/u32yresvirtual:/*虚拟屏幕-列有多少个像素点*/u32xoffset;/*虚拟到可见屏幕之间的行偏移*/u32yoffset;/*虚拟到可见屏幕之间的列偏移*/u32bits_Per_PiXel/*每个像素的位数即BPP*/u32grayscale:/*非0时,指的是灰度/structfb_bitfieldred;*fb缓存的R位域*/structfb_bitfieldgreen;*fb缓存的G位域*/structfb_bitfieldblue;*fb缓存的B位域*/structfbbitfieldlransp;/*透亮度*/*!=O非标准像nonstd:u32素格式*/_u32u32u32u32activate:height:width:accelflags:/*定时:除了pixclock本身外,u32pixclock:秒)*/*高度*/*宽度*/其他的都以像素时钟为单位*/*像盍时钟(皮/*行切换,从同步到绘图之间的延迟*/一u32之间的延迟*/u32之间的延迟*/.u32之间的延迟*/u32rightmargin:uppermargin;lowermargin:hsyncIen;*/u32vsyncIen:/*行切换,/*帧切换,/*帧切换,从绘图到同步从同步到绘图从绘图到同步/*水平同步的长度/*垂直同步的长度u32Ieftjnargin;u32u32u32sync;vmode;rot.it:u32reserved5;/*保留*/;而fbfixSCreeninro结构体又主要记录用户不行以修改的限制器的参数,比如屏幕缓冲区的物理地址和长度等,该结构体的定义如卜丁structfb_fix_screeninfocharid16:*字符串形式的标示符*/unsignedlongSmemstart;*fb缓存的起先位置*/u32smcm_len;*fb缓存的长度_u32type;/#FBTYPE*/_u32typeaux;/*分界*/u32visual;/*看VIS1.A1.*/ul6xpansIep;/*©如没有硬件panning就赋值为O*/ul6ypanstep:/*假如没有硬件panning就赋值为O*/ul6ywrapsIep;/*假如没有硬件ywrap用.赋值为O*/u32line,length:/*一行的字节数*/unsignedlongnunio_start:/*内存映射【0的起先位置*/u32iwnio_len:/*内存映射IO的长度*/u32accel:ul6reserved3;/*保留*/;fb。”结构体是对底层硬件操作的函数指针,该结构体中定义了对硬件的操作有:(这里只列出了常用的操作)structfb_opsstructmodule*owner:检杳可变参数并进行设置int(*fb_checkvar)(structfb_var_SCrCeninfO*var,structfb_info*info):依据设置的值进行更新,使之有效int(*fb_set_par)(structfb_info*info):设置颜色寄存器ini(*fbsetcolreg)(unsignedregno,unsignedred,unsignedgreen,unsignedblue,unsignedtransp,struetfb_info*info):/FiXlzJ*_*«t.Iint(*fb_blank)(intblank,structfbinfo*info);void(*fb_fiIlrect)(structfb_info*info,conststruCtfb_fiIlrect*rect);void(*fbcopyarea)(structfbinfo*info,conststructfb_copyarea*region):void(*fbin<geblit)(structfbinfo*info,conststructfbimage*imae);H3 .帧线冲设备作为平台设备,在S3C2440中,1.CD限制器被集成在芯片的内部作为一个相对独立的单元,所以1.inUX把它看做是一个平台设备,故在内核代码archamPIat-S3c24xxde,s.c中定义有1.CD相关的平台设备及资源,代码如下:/1.CD(/1.CD限staticstruct0=resources3cIcdresource(=/限制器10端口起先地.start-S3C24XX_PA_1.CD,限制器IO端口结.end=S3C24XX_PA_I.CD+束地址.flags-IORESOURCE_MEM,S3C24XXSZ.1.CD-1,标B!为1.CD限制器10月:口,在驱动牛;引用这,,1=)卜就表示引用IO端口(.start-IRQ_1.CD,.end=IRQ_1.CD,.flagsUIORESOURCE_IRQ1标识为1.CD中断staticu64s3cdevice.leddmamusk=Oxffffff11J1.;structplatformdevices3cdeviceCd-.name=*s3c2410-lcd1.CD设备名.id=-1,.numresources-ARRAYSIZE(s3c_lcd_resource),.resource=s3c_lcd_rosource,源.dmamask=&s3cdevicelcd_dmamask,.coherentdmamask-OxffffffffU1.);EXPORTSYMBO1.(s3cdeviceled);ruchSBldk2440.C的smdk2440devices口中添加到平台设备列表中除此之外,1.inux还在archannach-s3c2410includemachfb.h中为1.CD平华设备定义了,个SM241OfbmaChinf。结构体,该结构体主要是记录1.CD的硬件参数信息(比如该结构体的s3c211(IfMiSPIay成员结构中施用F记录1.CD的屏幕尺寸、屏格信息、可变的屏卷参数、1.CD配置寄存器等).这样在写骤动的时候就干脆运用这个结构体“下Iftl,我们来看一下内核是民如运用这个结构体的.在archarBmach-s3c2440aach-smdk2440.c中定义有?*1.CDdriverinfo*/1.CD硬件的配置信息,留意这里我运用的1.CD是NEC3.5寸TFT屏,这些参数要依据详细的1.CD屏进行设匿staticstructs3c2410fbdisplaysmdk2440lc<l_cfg_initdata=/这个地方的设置是配置1.CD寄存器5,这些宏定义在regsTcd.h中,计算后二进制为:,然后比照数据手册卜1.CDC0N5的各位来看,留意是从右边起先.Icdcon5=S3C24101.CDC0N5FRM565S3C24101.CDC0N5INVV1.INE|S3C24101.CDC0N5IWVFRAMES3C24101.CDC(W5IMRENS3C24101.CDC0N5IWSW1),.type=S3C2410_1.CDC0M_TFT,*NEC3.5',/.width=240,i;-E.height=320,Ml:,以下一些参数在上面的时序图分析中讲到过,各参数的值请跟据详细的1.CD屏数据手册结合上面时序分析来设定.Pixclock=100000,.XreS=240.yres=320,可心.bpp=16,JeftJnargin=19,.right_margin=36.hsync_len=5,.Upperjnargin-1,.IoWerjnargin-5,.vsync_len=1,N;,-:J'.;staticstructs3c2410fb_mach_infosmdk2440fbinfo_initdata=.displays=&smdk2440_lcd_cfg,定义的配巴信息.num_displays=1,.defaUIjdiSPlay=0,.gpccon=0xaaaa555a,"将GPC0、GPCl配置成1.END和VC1.K,将GPC8-15配宜成YDo-7,其他配置成殷输出【0口.gpccon_mask=Oxffffffff,.gpcup=OxOOOOffff,/,l:GPlOC的上拉功能.gpcuPjnaSk=Oxffffffff,.gpdcon=OXaaaaaaaaj/将GPDOT5配置成VD8-23.gpdconm<sk=Oxffffffff,.gpdup=OXoooOfTff,禁止GPIOD的上拉功能.gpdup_mask=Oxffffffff,.Ipcsel=OX0,这个是三星TFT屏的参数,这里不用;留意:可能有许多架友不知道上面红色部分的参数是做什么的,其值又是怎么设置的?其实它是跟你的开发板1.CD限制器亲密相关的,看了下面两幅图信任就也许知道他们是干什么用的:ZZZswWSSMIZm-NW1.CDDATA1.CDCTR1.一1122VTVmPceN2VDO二二二VIA*vJrV1.6VD1»UIUrvN4VD2VDZCjrCiURlVD3VUJ.MVllV1>4GPC12VT、«Dl、3VD4P2VD5VIJi1.IJVTVbU>'iJM6VO6V5>vflHvi、*tra>'<P3VD7VUIJtVlf>ZWVkR2VD8VUakJr1.n>VvfGZW1M5VD9cp'DtjD1jV111,P11N5VDIo、lIvAJrl*VDuSD3VT1C:Df<R3VDIlP4VD121.1JlrUv-Di3(iPD5Usbtxdni,rI4mn/cvr%DiR4VD13P5VD14VIJ4vrU,ODIDrIVnIqP11"T'CRfR11N6VDIS»WI.kJrlVi6GPDSSPIMIS01v11i*ru>rSmmalIM7VD16T4VD17UIkl70rlV11J3lIVnIRm>ntvpiiKR5VD181.zIPKJi1./IV1.IIVUJVJV1QfCUDY11P1TSVD19MJt1./lI1.1DDKA1.JrJVD2<iPD121.SBRXDNlVf、,I1P111l.t!QttDY111P6VD20R6VD21、U,VJrUIJ1.dKDIVI、,mCCI11P11IdN7VD22、U,In»,31./wD23nSSDGPDISU5VD23S3C244OXGPCCONBitDescriptionGPDCON0PC15PI30)00Input01Output10=VD(7)11ReservedGPDl5GPC14(2928)00=Input01=Output10=VD611=ReservedGPDU0PC13(272600三Input01三OutputIO=VD(5)11-ReservedGPD13GPC12PS24)OO=InUt01Output10=VO(4)11RettrvedGPD12GPC11(2322)00=Input01=OutputIONVDPl11-ReservedGP011GPCWPI20)00Input01"Output10-VD(2l11-RsrvdGPD10GPC9(1918)00三Input01三Output10=VD(1)11RMrvdGP09GPC811716J00InptM01Output10三VD0)11ReservedGP0GPC74100Input01Output10三1.CD1.PCREV611三ReservedGP07GPC6(1312)00三Input01三Output10三1.CDe1.PCREV11=ReservedGP06GPC511110)Oo=InMt01=Output10=1.CD-1.PCOE11=ReservedGPDSGPC4P00=Input01=OutputW=VM11=I2SSDIGPD4GPC376)Oo=InIxX01=Output10=VFRAME11=ReservedGPGPC2P4100=Input01=OutputW=WINE11=ReservedGPD2GPC1P2J00三Input01=Output10三VClK11三ReservedOPOIGPCO11000Input01Output10-1.END11-RtwnrtdGPOO上面第一幅图是开发板原理图的1.CD限制器部分,其次幅图是S3c2440数据手册中IO端口C和IO端口D限制器部分。原理图中运用了GPaM5和GPDoI5来用做1.CD限制器VD0-VD23的数据端口,又分别运用GPC0、GpCI端口用做1.CD限制罂的1.END和VC1.K信号,对于GPC2-7则是用做STN屏或者三星专业TFT屏的相关信号。然而,S3C2440的各个10口并不是单一的功能,都是笑用端口,要运用他们首先要为他们进行配置。所以上面红色部分的参数就是把GPC和GPD的部分端口配置成1.CD限制功能模式。从以上讲解并描述的内容来看,要使1.CD限制器支持其他的1.CD.屏,正要的是依据1.a)的数据手册修改以上这些颦数的值,下面,我归再发一下在印动中是假如中用到s3c2410fbmachinf。结构体的(窗意上面讲的是在内核中如何运用的).在WJCh-Sadk2440.c中有:/S3C2440初始化函数staticvoid_initSmdk2410JnaChine_init(Void)(/调用该函数将上而定义的1.Cl)硬件信息保存到平台数据中s3c24xx11>setplaldata(As11dk2440fbinfo);s3ci2csetpla(data(M1.1.):PIatfonn_add.devices(Smdk2440devices,ARRAYSIZE(smdk2440devices);sn<lkmachineinitO;-Is3c24xx_fb_set_pIatdata定义在plat-s3c24xxdevs.c中:void_inits3c24xxfb_set_platdata(structs3c2410fbmach_info*pd)structs3c2410fbmuchino*rtpd;npd=kma11oc(sizeof(*npd),GFPJ(ERNE1.);if(npd)11wjmcpy(np<l,pd,sizeof(*npd);/这里就是将内核中定义的63c2410fbmachjnfo结构体数据保存到1.eD平台数据中,所以在写驱动的时候就可以干施在平台数据中获得s3c2dlfbmachinfo结构体的数据(即1.CD各种参数信息)进行s3cdeviceled.dev.platformdata=npd:elsePrintk(KERN_ERR"no<11)oryfor.CDplatformdatan");这里再讲一个小学问:不知大家有没有留意,在平台设备驱动中,platformdata可以保存着自平台设备实例的数据,但这些数据的类型都是不同的,为什么都可以保存?这就要看看PIatfOrn1.data的定义,定义在linxdevice.h中,void*plalfOnndaIa是一个void类型的指针,在1.inux中Void可保存任何数据类里。开发环境 主机:VMWare-Fedora9 开发板: aif三>上物S3C240上1.CD上动(Fm-BafCr)实例开堂详解一四、慎星冲(FraBeBUffer)设备驱动实例代码:、建立驱动文件,三y2440.1c<1.c,依就是驱动程序的最基本结构,FrameBUffer驱动的初妫化和即款部分及其他,如下,# include<1inux/kernel.h># include<linuxmodule.h>CineIude<1inux/errno.h>Cincludc<1inux/init.h>4include<1inux/patform_device.h># include<linux<lmamapping.h>¥include<1inux/fb.h>Cincludc<1inuxclk.h># include<1inux/interrupt.h># include<linux11m.h># include<linuxslab.h># include<1inux/delay.h># inc1UdC<asmirq.h># include<asmio.h># inc1ude<asmdiv64.h>include<machregs-lcd.h>Gncludc<machregs-gpio.h># incIude<machfb.h># include<linuxp<.h>*ErameBuffCr设备名称*/staticchardrivername=*my2440led*:*定义一个结构体用来维护驱动程序中各函数中用到的变量先别看结构体要定义这些成员,到各函数运用的地方就明白了*/structmy2440fbvar(intlcd_irq_no;structelk*lcd_clock:的1.CD时钟*/structresource*lc<lmem;void_iomem*lcdbase;*/structdevice*dev;structs3c2410fb_hwregs;s3c2410fbhw定义在machs3c2410/includenachfb.h中*/*定义个数组来充当调色板,据数据F册描述,TFT屏色位模式为8BPP时,调色板(颜色表)的长度为256,调色板起始地址为0«DOOOlOo*/32palettebuffer256;u32pseudopal;UnSignedintpaletteready;;*用做清空调色板(颜色衣)*/UdefinePA1.ETTE_B1.FF_C1.EAR(0x80000000)*1.CD平台驱动结构体,平台骤劭结构体定义在Platformdevice,h中,该结构体成员接口的数在第步中实现*/staticstructplatformdriverledfb_driver-(.probe=lcd_fb_probe,*lrameBuffer设备探测*/.remove=_devexit_p(1cd_fb_remove),r设备移除*/.suspend-ICC1.fb.suspend,*FrameBuffer设备挂起*/.resume=lcd_fb_resumG,*Fr<meBuffer设备复原*/.driver(率留意这里的名称肯定要和系统中定义平台设需的地方样,这样才能把平台设备与该平台设备的驱动关联起来*/.name="s3c241OTc<,.owner=THISJK)DU1.E,;staticint_initledinit(void)/a:1.inux,帧缓冲设备被看做是平台设备,所以这里注册平台设备*/returnplatformdriverregister(&lcdfb_driver);staticvoid_exitlcd_exit(void)*注销平台设备*/plalormdriverUnregisler(filedbdriver);module_init(ledinit);moduleexit(ledexit);MODU1.E_1.ICENSE(GP7):MODU1.EAUTHOR("IIuangMODU1.E_DEsCRIPTlON("*:”田I.CDla11eBufeDtiver,);、1.a)平台设冬各按口函数的实现,/1.CDFralBeBUffer设备探测的实现,留意这里运用一个_devinil宏,到Irdfhremove捺I由勃atm的tfl方湛解*/staticint_devinitledfbprobe(struelplatformdevice*pdev)inti:intret;structresource*res:1.CD资源*/structfb_info*fbinfo:fbinfo结构体/s1rueIs3c2410bmachinfo*machinfo;得的平台设备数据*/structmy2440fb_var*fbvar:结构体*/structs3c2410bdisplay"display;