




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章LCD驅(qū)動移植6.1認識LCD相關(guān)硬件原理6.2LCD參數(shù)設(shè)置6.3內(nèi)核LCD驅(qū)動機制6.4Linux2.6.32的LCD驅(qū)動源碼分析6.5移植內(nèi)核中的LCD驅(qū)動第6章LCD驅(qū)動移植6.1認識LCD相關(guān)硬件原理16.1認識LCD相關(guān)硬件原理6.1.1LCD概述6.1.2LCD控制器6.1.3LCD控制器方塊圖6.1.4LCD控制器操作6.1.5LCD控制寄存器6.1認識LCD相關(guān)硬件原理6.1.1LCD概述26.1.1LCD概述LCD(液晶顯示)模塊可以顯示漢字、字符和圖形,同時還具有低壓、低功耗、體積小、重量輕和超薄等很多優(yōu)點。1.LCD顯示屏的分類2.LCD的常用參數(shù)3.LCD的顯示原理6.1.1LCD概述LCD(液晶顯示)模塊可以顯示漢字、31.LCD顯示屏的分類常見的液晶顯示屏按物理結(jié)構(gòu)可分為4種,即扭曲向列型(TN-LCD)、超扭曲向列型(STN-LCD)、雙層超扭曲向列型(DSTN-LCD)和薄膜晶體管型(TFT-LCD)。在寫驅(qū)動程序時要根據(jù)不同類型對LCD控制器進行控制。1.LCD顯示屏的分類常見的液晶顯示屏按物理結(jié)構(gòu)可分為4種,42.LCD的常用參數(shù)市場上的LCD顯示屏從廠家、型號、規(guī)格等來說不盡相同,了解LCD的主要參數(shù)對進行LCD驅(qū)動開發(fā)非常有用,因為寫驅(qū)動程序時就需要對LCD的參數(shù)進行設(shè)置。PPI(PixelPerInch)是指每平方英寸所擁有的像素數(shù)目。分辨率:市面上的分辨率標(biāo)準(zhǔn)多種多樣,主要有VGA、SVGA、UXGA和SXGA+。BPP(BitPerPixel),即每個像素使用多少位來表示其顏色。2.LCD的常用參數(shù)市場上的LCD顯示屏從廠家、型號、規(guī)格等53.LCD的顯示原理一幅圖像被稱為一幀,每幀由多個行排列組成,每行又由多個像素組成,每個像素的色彩使用若干位數(shù)據(jù)來表示。顯示器從屏幕的左上方開始,一行一行地取得每個像素的數(shù)據(jù)并顯示出來,當(dāng)顯示到一行的最右邊時,跳到下一行的最左邊開始顯示下一行;當(dāng)顯示完所有行后,重新跳到左上方開始下一幀的顯示。顯示器沿著“Z”字形的路線進行掃描,同時使用幀掃描信號和行掃描信號來同步每一幀和每一行。3.LCD的顯示原理一幅圖像被稱為一幀,每幀由多個行排列組成66.1.2
LCD控制器LCD控制器的功能是產(chǎn)生控制時序和信號,從而驅(qū)動LCD。用戶只需要通過讀寫LCD控制器的一系列寄存器來完成配置。S3C2440的LCD控制器由一個邏輯單元組成,它的作用是把LCD圖像數(shù)據(jù)從一個位于系統(tǒng)內(nèi)存的buffer傳送到一個外部的LCD驅(qū)動器。LCD控制器還支持1BPP、2BPP、4BPP、8BPP的調(diào)色板TFT彩色屏,并且支持64K色(16BPP)和16M色(24BPP)非調(diào)色板真彩顯示。6.1.2LCD控制器LCD控制器的功能是產(chǎn)生控制時序和76.1.3
LCD控制器方塊圖LCD控制器的接口時序分為STN和TFT兩種。S3C2440的LCD控制器可以同時支持STN和TFT的LCD顯示屏,根據(jù)實際需要對控制器進行不同的設(shè)置可以產(chǎn)生不同的時序。6.1.3LCD控制器方塊圖LCD控制器的接口時序分為S86.1.4LCD控制器操作S3C2440的LCD控制器分STN控制和TFT控制,目前市面上主流的LCD為TFT-LCD。S3C2440的TFTLCD控制器支持1、2、4、8BPP調(diào)色板彩色模式及16BPP、24BPP無調(diào)色板真彩模式。1.24BPP顯示2.16BPP3.8BPP4.256色調(diào)色板6.1.4LCD控制器操作S3C2440的LCD控制器分91.24BPP顯示24BPP顯示模式使用24位表示一個像素點,每種顏色用8比特位來表示。LCD控制器從內(nèi)存中獲得某個像素的24位顏色值后直接通過VD[23:0]數(shù)據(jù)線發(fā)送給LCD驅(qū)動器。VD23222120191817161514131211109876543210RED76543210
GREEN
76543210
BLUE
765432101.24BPP顯示24BPP顯示模式使用24位表示一個像素點102.16BPP16BPP模式用16位來表示一個像素點的值。這16位數(shù)據(jù)的格式分為兩種:5:6:5和5:5:5:1,前者使用高5位表示紅色,中間6位表示綠色,低5位表示藍色;后者用高15位表示紅、綠、藍3種顏色,每種顏色用5位表示,最低位表示透明度。VD23222120191817161514131211109876543210RED43210NC
NC
NCGREEN
543210
BLUE
43210
2.16BPP16BPP模式用16位來表示一個像素點的值。這113.8BPP8BPP顯示模式使用8位來表示一個像素點,然而對3種基色平均下來,每種基色只能使用不到3位的數(shù)據(jù)來表示,即每種基色最多不過8階,這不能表示更豐富的色彩。4字節(jié)可以表示4個8BPP的像素,字節(jié)與像素的對應(yīng)順序也是可以編程選擇的。3.8BPP8BPP顯示模式使用8位來表示一個像素點,然而對124.256色調(diào)色板S3C2440為TFT顯示器提供256色調(diào)色板,調(diào)色板是一塊256×16的內(nèi)存,使用16BPP的格式來表示8BPP模式下各索引值的顏色。INDEX\BitPos1514131211109876543210Address00HR4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B00X4D00040001HR4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B00X4D000404…
FFHR4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B00X4D0007FCNumberofDV232221201915141312111076543
4.256色調(diào)色板S3C2440為TFT顯示器提供256色調(diào)136.1.5
LCD控制寄存器S3C2440提供了LCD控制器,其中有17個控制寄存器,包括LCDCON1~LCDCON5及LCDSADDR1-LCDSADDR3等。1.LCD控制寄存器LCDCON12.LCD控制寄存器LCDCON23.LCD控制寄存器LCDCON34.LCD控制寄存器LCDCON45.LCD控制寄存器LCDCON56.幀內(nèi)存地址寄存器6.1.5LCD控制寄存器S3C2440提供了LCD控制141.LCD控制寄存器LCDCON1LCDCON1用于選擇LCD類型、設(shè)置像素時鐘、使能LCD輸出信號等。功
能位描
述初始狀態(tài)LINECNT(只讀)[27:18]每輸出一個有效行其值減10CLKVAL[17:8]用于設(shè)置VCLK的值STN:VCLK=HCLK/(CLKVAL×2)TFT:VCLK=HCLK/((CLKVAL+1)×2)0MMODE[7]用于設(shè)置VM信號的反轉(zhuǎn)效率,只用于TFT屏0PNRMODE[6:5]設(shè)置LCD的類型00:4位雙掃描(STN)01:4位單掃描(STN)10:8位單掃描(STN)11:TFT屏0BPPMODE[4:1]選擇BPP模式,對于TFT屏1000:1BPP1001:2BPP1010:4BPP1011:8BPP1100:16BPP1101:24BPP(STN)0ENVID[0]信號輸出使能位0:禁止,1:使能01.LCD控制寄存器LCDCON1LCDCON1用于選擇LC152.LCD控制寄存器LCDCON2用于設(shè)置垂直方向各信號的時間參數(shù)。功
能位描
述初始值VBPD[31:24]VSYNC信號之后,還要經(jīng)過(VBPD+1)個HSYNC信號周期才會出現(xiàn)有效行數(shù)據(jù)0LINEVAL[23:14]LCD的行數(shù):(LINEVAL+1)行0VFPD[13:6]一幀中的有效數(shù)據(jù)完成后,到下一個VSYNC信號有效前的無效行數(shù)目:(VFPD+1)0VSPW[5:0]表示VSYNC信號的寬度為(VSPW+1)個HSYNC信號周期,這(VSPW+1)行的數(shù)據(jù)無效02.LCD控制寄存器LCDCON2用于設(shè)置垂直方向各信號的時163.LCD控制寄存器LCDCON3用于設(shè)置水平方向各信號的時間參數(shù)。功
能位描
述初始值HBPD[25:19]HSYNC信號脈沖之后,還要經(jīng)過(HBPD+1)個VCLK信號周期,才出現(xiàn)有效數(shù)據(jù)0HOZVAL[18:8]LCD的水平寬度:(HOZVAL+1)個像素0HFPD[7:0]一行中的有效數(shù)據(jù)完后,到下一個HSYNC信號有效前的無效像素個數(shù):HFPK+103.LCD控制寄存器LCDCON3用于設(shè)置水平方向各信號的時174.LCD控制寄存器LCDCON4對于TFT屏,這個寄存器用來設(shè)置HSYNC信號的脈沖寬度。功
能位描
述初始值MVAL[15:8]STN屏用0HSPW[7:0]表示脈沖寬度為(HSPW+1)個VCLK信號周期0WLH[7:0]STN屏用04.LCD控制寄存器LCDCON4對于TFT屏,這個寄存器用185.LCD控制寄存器LCDCON5用于設(shè)置各個控制信號的極性,并可從中讀取狀態(tài)信息。功
能位描
述初始值VSTATUS[16:15]只讀,垂直狀態(tài)00:處于VSYNC信號脈沖期間01:處于VSYNC信號結(jié)束到行有效之間10:處于行有效期間11:處于行有效結(jié)束到下一個VSYNC信號之間0HSTATUS[14:13]只讀,描述水平狀態(tài)00:處于HSYNC信號脈沖期間01:處于HSYNC信號結(jié)束到像素有效之間10:處于像素有效期間11:處于像素有效結(jié)束到下一個HSYNC信號之間0BPP24BL[12]設(shè)置TFT屏的顯示模式為24BPP時,一個4字節(jié)中哪3個字節(jié)有效。0:低3字節(jié)有效;1:高3字節(jié)有效0FRM565[11]設(shè)置TFT屏的顯示模式為16BPP時,數(shù)據(jù)的格式0:5:5:5:1;1:5:6:50INVVCLK[10]設(shè)置VCLK信號有效沿的極性0:下降沿讀取數(shù)據(jù);1:在上升沿讀取數(shù)據(jù)0INVVLINE[9]設(shè)置VLINE/HSYNC脈沖的極性0:正常極性;1:反轉(zhuǎn)的極性05.LCD控制寄存器LCDCON5用于設(shè)置各個控制信號的極性195.LCD控制寄存器LCDCON5功
能位描
述初始值INVVFRAME[8]設(shè)置VFRAME/VSYNC脈沖的極性0:正常極性;1:反轉(zhuǎn)的極性0INVD[7]設(shè)置VD數(shù)據(jù)線表示數(shù)據(jù)的極性0:正常極性;1:反轉(zhuǎn)的極性0INVVDEN[6]設(shè)置VDEN信號的極性0:正常極性;1:反轉(zhuǎn)的極性0INVPWREN[5]設(shè)置PWREN信號的極性0:正常極性;1:反轉(zhuǎn)的極性0INVLEND[4]設(shè)置LEND信號的極性0:正常極性;1:反轉(zhuǎn)的極性0PWREN[3]LCD_PWREN信號輸出使能0:禁止;1:使能0ENLEND[2]LEND信號輸出使能0:禁止;1:使能0BSWP[1]字節(jié)交換使能0:禁止;1:使能0HWSWP[0]半字交換使能0:禁止;1:使能05.LCD控制寄存器LCDCON5功能位描述206.幀內(nèi)存地址寄存器幀內(nèi)存可以很大,而真正要顯示的區(qū)域稱為視口,它處于幀內(nèi)存之內(nèi)。s3c2440有3個幀內(nèi)存地址寄存器,這3個寄存器用于確定幀內(nèi)存的起始地址,定位視口在幀內(nèi)存的位置。功
能位描
述初始值LCDBANK[29:21]用于保存幀內(nèi)存起始地址的A[30:22],幀內(nèi)存起始地址必須為4M對齊0LCDBASEU[20:0]對于雙掃描,用于表示上半幀的內(nèi)存起始地址對于單掃描,用于表示幀的內(nèi)存起始地址06.幀內(nèi)存地址寄存器幀內(nèi)存可以很大,而真正要顯示的區(qū)域稱為視216.幀內(nèi)存地址寄存器功
能位描
述初始值LCDBASEL[20:0]對于雙掃描,用于保存下半幀的起始地址對于單掃描,用于保存幀的結(jié)束地址其值按如下公式計算:LCDBASEL=CLDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)0功
能位描
述初始值OFFSIZE[21:11]虛擬屏長度表示上一行最后一個數(shù)據(jù)與下一行第一個數(shù)據(jù)間地址差值的一半,即以半字為單位的地址差0PAGEWIDTH[10:0]虛擬屏的寬度,這個值決定視口的寬度,以半字為單位06.幀內(nèi)存地址寄存器功能位描述初始值LCDB226.2LCD參數(shù)設(shè)置LCD驅(qū)動編寫的主要任務(wù)就是根據(jù)所使用的LCD屏正確地設(shè)置對應(yīng)的LCD寄存器參數(shù)。前面已經(jīng)講述了S3C2440LCD各控制寄存器。1.設(shè)置VFRAME、VLINE2.設(shè)置VCLK3.幀速率6.2LCD參數(shù)設(shè)置LCD驅(qū)動編寫的主要任務(wù)就是根據(jù)所使231.設(shè)置VFRAME、VLINEVFRAME和VLINE信號可以根據(jù)液晶屏的尺寸和顯示模式來設(shè)置,它們對應(yīng)LCDCON2寄存器的HOZVAL和LINEVAL值,設(shè)置方法如下:HOZVAL=(水平尺寸/VD數(shù)據(jù)位)-1彩色液晶屏:水平尺寸=3×水平像素點數(shù)VD數(shù)據(jù)位=BBP數(shù)(不分單雙掃描)LINVAL=垂直尺寸-1(單掃描)LINVAL=垂直尺寸/2-1(雙掃描)1.設(shè)置VFRAME、VLINEVFRAME和VLINE信號242.設(shè)置VCLKLCD控制器輸出的VCLK是直接由系統(tǒng)總線(AHB)的工作頻率HCLK直接分頻得到的。VCLK=HCLK/((CLKVAL+1)×
2)2.設(shè)置VCLKLCD控制器輸出的VCLK是直接由系統(tǒng)總線(253.幀速率幀速率就是VSYNC信號的頻率。幀速率與VSYNC、VBPD、VFPD、LINEVAL、HSYNC、HBPD、HFPD、HOZVAL和CLKVAL的域有關(guān),它們是LCDCON1/2/3/4。大多數(shù)LCD驅(qū)動器需要它們合適的幀速率。幀速率按如下公式計算:FrameRate=1/[{(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)}*
{(HSPW+1)+(HBPD+1)+(HFPD+1)+HOZVAL+1}*{2*(CLKVAL+1)/HCLK}]3.幀速率幀速率就是VSYNC信號的頻率。幀速率與VSYNC266.3內(nèi)核LCD驅(qū)動機制6.3.1FrameBuffer概述6.3.2FrameBuffer設(shè)備驅(qū)動的結(jié)構(gòu)6.3內(nèi)核LCD驅(qū)動機制6.3.1FrameBuff276.3.1FrameBuffer概述幀緩沖區(qū)是把顯示設(shè)備抽象成為幀緩沖區(qū)設(shè)備區(qū)。幀緩沖區(qū)允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫和I/O控制等操作。通過專門的設(shè)備結(jié)點可對相應(yīng)的設(shè)備進行訪問。應(yīng)用程序可以將它看成是顯示內(nèi)存的一個引用,將其映射到進程地址空間之后,就可以進行讀寫操作,而讀寫操作可以反映到具體的LCD設(shè)備上。6.3.1FrameBuffer概述幀緩沖區(qū)是把顯示設(shè)備286.3.2FrameBuffer設(shè)備驅(qū)動的結(jié)構(gòu)FrameBuffer設(shè)備驅(qū)動基于兩個文件,linux/include/linux/fb.h和linux/drivers/video/
fbmem.c。其中,fb.h定義了Framebuffer驅(qū)動所要用到的幾乎所有的結(jié)構(gòu)體,這些結(jié)構(gòu)主要包括structfb_info、structfb_var_screeninfo和structfb_fix_screeninfo。下面分別講述這幾個結(jié)構(gòu)體。6.3.2FrameBuffer設(shè)備驅(qū)動的結(jié)構(gòu)Fram291.structfb_infostructfb_info記錄了幀緩沖的全部信息,包括設(shè)置參數(shù)、狀態(tài)、操作函數(shù)指針等。1.structfb_infostructfb_info302.fb_var_screeninfostructfb_var_screeninfo記錄了幀緩沖設(shè)備和指定顯示模式的可修改信息。它包括顯示屏幕的分辨率、每個像素的比特數(shù)和一些時序變量。2.fb_var_screeninfostructfb_v313.fb_fix_screeninfo而fb_fix_screeninfo定義了硬件的不可變屬性,顯示緩沖區(qū)的映射地址也被定義在這里,它表示緩沖區(qū)不應(yīng)該被應(yīng)用程序所改變。3.fb_fix_screeninfo而fb_fix_scr324.fbmem.cfbmem.c是Framebuffer設(shè)備驅(qū)動技術(shù)的關(guān)鍵。它為上層應(yīng)用程序提供系統(tǒng)調(diào)用也為下一層的特定硬件驅(qū)動提供編程接口;那些底層硬件驅(qū)動需要用到這里的接口來向系統(tǒng)內(nèi)核注冊它們自己。4.fbmem.cfbmem.c是Framebuffer設(shè)備336.4Linux2.6.32的LCD驅(qū)動源碼分析6.4.1LCD驅(qū)動開發(fā)的主要工作6.4.2s3c2410fb_init()函數(shù)分析6.4.3s3c2410fb_probe()函數(shù)分析 6.4.4s3c2410fb_remove()函數(shù)分析6.4Linux2.6.32的LCD驅(qū)動源碼分析6.4346.4.1LCD驅(qū)動開發(fā)的主要工作LCD驅(qū)動開發(fā)的工作包括兩個方面,分別是初始化函數(shù)的編寫和填充fb_info結(jié)構(gòu)體中的主要成員函數(shù),下面分別講述。6.4.1LCD驅(qū)動開發(fā)的主要工作LCD驅(qū)動開發(fā)的工作包351.編寫初始化函數(shù)初始化函數(shù)首先初始化各個LCD控制器寄存器,通過寫寄存器來設(shè)置顯示的模式和顏色數(shù),然后在內(nèi)存中分配LCD顯示緩沖區(qū)。最后是初始化一個fb_info結(jié)構(gòu)體,填充其中的成員變量,并調(diào)用register_framebuffer
(&fb_info),將fb_info注冊入內(nèi)核。1.編寫初始化函數(shù)初始化函數(shù)首先初始化各個LCD控制器寄存器362.編寫成員函數(shù)對于嵌入式系統(tǒng)的簡單實現(xiàn),編寫結(jié)構(gòu)fb_info中函數(shù)指針fb_ops對應(yīng)的成員函數(shù)只需要下列3個函數(shù)就可以了。structfb_ops{...int(*fb_get_fix)(structfb_fix_screeninfo*fix,intcon,structfb_info*info);int(*fb_get_var)(structfb_var_screeninfo*var,intcon,structfb_info*info);int(*fb_set_var)(structfb_var_screeninfo*var,intcon,structfb_info*info);...}2.編寫成員函數(shù)對于嵌入式系統(tǒng)的簡單實現(xiàn),編寫結(jié)構(gòu)fb_in376.4.2s3c2410fb_init()函數(shù)分析首先要分析的是s3c2410fb_init()函數(shù),該函數(shù)內(nèi)容相對簡單,在s3c2410fb_init()函數(shù)體內(nèi)只是包裝了對平臺驅(qū)動注冊函數(shù)platform_driver_register()的調(diào)用,它的參數(shù)是&s3c2410fb_driver。這里是向內(nèi)核注冊一個platform設(shè)備驅(qū)動的意思,該platform設(shè)備是LCD設(shè)備。6.4.2s3c2410fb_init()函數(shù)分析首先要386.4.3s3c2410fb_probe()函數(shù)分析799staticint__inits3c24xxfb_probe(structplatform_device*pdev,800enums3c_drv_typedrv_type)801{802structs3c2410fb_info*info;803structs3c2410fb_display*display;804structfb_info*fbinfo;805structs3c2410fb_mach_info*mach_info;806structresource*res;807intret;808intirq;809inti;810intsize;811u32lcdcon1;8126.4.3s3c2410fb_probe()函數(shù)分析79396.4.3s3c2410fb_probe()函數(shù)分析813mach_info=pdev->dev.platform_data;814if(mach_info==NULL){815dev_err(&pdev->dev,816"noplatformdataforlcd,cannotattach\n");817return-EINVAL;818}8196.4.3s3c2410fb_probe()函數(shù)分析81406.4.3s3c2410fb_probe()函數(shù)分析820if(mach_info->default_display>=mach_info->num_displays){821dev_err(&pdev->dev,"defaultis%dbutonly%ddisplays\n",822mach_info->default_display,mach_info->num_displays);823return-EINVAL;824}825826display=mach_info->displays+mach_info->default_display;6.4.3s3c2410fb_probe()函數(shù)分析416.4.3s3c2410fb_probe()函數(shù)分析827828irq=platform_get_irq(pdev,0);829if(irq<0){830dev_err(&pdev->dev,"noirqfordevice\n");831return-ENOENT;832}6.4.3s3c2410fb_probe()函數(shù)分析82426.4.3s3c2410fb_probe()函數(shù)分析833834fbinfo=framebuffer_alloc(sizeof(structs3c2410fb_info),&pdev->dev);835if(!fbinfo)836return-ENOMEM;6.4.3s3c2410fb_probe()函數(shù)分析436.4.3s3c2410fb_probe()函數(shù)分析837838platform_set_drvdata(pdev,fbinfo);839840info=fbinfo->par;841info->dev=&pdev->dev;842info->drv_type=drv_type;6.4.3s3c2410fb_probe()函數(shù)分析446.4.3s3c2410fb_probe()函數(shù)分析843844res=platform_get_resource(pdev,IORESOURCE_MEM,0);845if(res==NULL){846dev_err(&pdev->dev,"failedtogetmemoryregisters\n");847ret=-ENXIO;848gotodealloc_fb;849}850851size=(res->end-res->start)+1;852info->mem=request_mem_region(res->start,size,pdev->name);853if(info->mem==NULL){854dev_err(&pdev->dev,"failedtogetmemoryregion\n");855ret=-ENOENT;856gotodealloc_fb;857}858859info->io=ioremap(res->start,size);860if(info->io==NULL){861dev_err(&pdev->dev,"ioremap()ofregistersfailed\n");862ret=-ENXIO;863gotorelease_mem;864}865866 info->irq_base=info->io+((drv_type==DRV_S3C2412)?S3C2412_LCDINTBASE:S3C2410_LCDINTBASE);6.4.3s3c2410fb_probe()函數(shù)分析84456.4.3s3c2410fb_probe()函數(shù)分析867868dprintk("devinit\n");869870strcpy(fbinfo->fix.id,driver_name);871872/*Stopthevideo*/873lcdcon1=readl(info->io+S3C2410_LCDCON1);874writel(lcdcon1&~S3C2410_LCDCON1_ENVID,info->io+S3C2410_ LCDCON1);875876fbinfo->fix.type=FB_TYPE_PACKED_PIXELS;877fbinfo->fix.type_aux=0;878fbinfo->fix.xpanstep=0;879fbinfo->fix.ypanstep=0;880fbinfo->fix.ywrapstep=0;881fbinfo->fix.accel=FB_ACCEL_NONE;882883fbinfo->var.nonstd=0;884fbinfo->var.activate=FB_ACTIVATE_NOW;885fbinfo->var.accel_flags=0;886fbinfo->var.vmode=FB_VMODE_NONINTERLACED;887888fbinfo->fbops=&s3c2410fb_ops;889fbinfo->flags=FBINFO_FLAG_DEFAULT;890fbinfo->pseudo_palette=&info->pseudo_pal;891892for(i=0;i<256;i++)893info->palette_buffer[i]=PALETTE_BUFF_CLEAR;6.4.3s3c2410fb_probe()函數(shù)分析466.4.3s3c2410fb_probe()函數(shù)分析894895ret=request_irq(irq,s3c2410fb_irq,IRQF_DISABLED,pdev-> name,info);896if(ret){897dev_err(&pdev->dev,"cannotgetirq%d-err%d\n",irq,ret);898ret=-EBUSY;899gotorelease_regs;900}901902info->clk=clk_get(NULL,"lcd");903if(!info->clk||IS_ERR(info->clk)){904printk(KERN_ERR"failedtogetlcdclocksource\n");905ret=-ENOENT;906gotorelease_irq;907}908909clk_enable(info->clk);910dprintk("gotandenabledclock\n");911912msleep(1);6.4.3s3c2410fb_probe()函數(shù)分析476.4.4
s3c2410fb_remove()函數(shù)分析現(xiàn)在解釋s3c2410fb_driver中的最后一個關(guān)鍵函數(shù)s3c2410fb_remove()。顧名思義該函數(shù)要將這個platform設(shè)備從系統(tǒng)中移除,可以推測它的作用應(yīng)該釋放掉所有的資源,包括內(nèi)存空間。中斷線等。和前文一樣,我們在它的實現(xiàn)代碼中一步步解釋。staticints3c2410fb_remove(structplatform_device*pdev){
structfb_info*fbinfo=platform_get_drvdata(pdev);
/*該函數(shù)從platform_device中獲得fb_info信息*/
structs3c2410fb_info*info=fbinfo->par;
//得到私有數(shù)據(jù)
intirq;
s3c2410fb_stop_lcd(info);
6.4.4s3c2410fb_remove()函數(shù)分析現(xiàn)486.5移植內(nèi)核中的LCD驅(qū)動6.5.1LCD硬件電路圖6.5.2修改LCD源碼6.5.3配置內(nèi)核6.5移植內(nèi)核中的LCD驅(qū)動6.5.1LCD硬件電路496.5.1LCD硬件電路圖寫驅(qū)動程序前先了解一下電路連接情況。LCD的像素同步時鐘信號、水平同步信號、垂直同步信號直接連接到LCD的VCLK、VLINE和VFRAME上,用GPG4作為LCD的電源信號直接連接到LCD_PWREN上。6.5.1LCD硬件電路圖寫驅(qū)動程序前先了解一下電路連接506.5.2修改LCD源碼本章用的源碼是linux2.6.32中的LCD驅(qū)動源碼,文件為drivers/video/s3c2410fb.c和drivers/video/s3c2410fb.h。6.5.2修改LCD源碼本章用的源碼是linux2.6.516.5.3配置內(nèi)核做完以上工作,我們就可以對LCD進行配置了。進入內(nèi)核源碼所在的目錄,輸入makemenuconfig進入配置菜單。6.5.3配置內(nèi)核做完以上工作,我們就可以對LCD進行配52第6章LCD驅(qū)動移植6.1認識LCD相關(guān)硬件原理6.2LCD參數(shù)設(shè)置6.3內(nèi)核LCD驅(qū)動機制6.4Linux2.6.32的LCD驅(qū)動源碼分析6.5移植內(nèi)核中的LCD驅(qū)動第6章LCD驅(qū)動移植6.1認識LCD相關(guān)硬件原理536.1認識LCD相關(guān)硬件原理6.1.1LCD概述6.1.2LCD控制器6.1.3LCD控制器方塊圖6.1.4LCD控制器操作6.1.5LCD控制寄存器6.1認識LCD相關(guān)硬件原理6.1.1LCD概述546.1.1LCD概述LCD(液晶顯示)模塊可以顯示漢字、字符和圖形,同時還具有低壓、低功耗、體積小、重量輕和超薄等很多優(yōu)點。1.LCD顯示屏的分類2.LCD的常用參數(shù)3.LCD的顯示原理6.1.1LCD概述LCD(液晶顯示)模塊可以顯示漢字、551.LCD顯示屏的分類常見的液晶顯示屏按物理結(jié)構(gòu)可分為4種,即扭曲向列型(TN-LCD)、超扭曲向列型(STN-LCD)、雙層超扭曲向列型(DSTN-LCD)和薄膜晶體管型(TFT-LCD)。在寫驅(qū)動程序時要根據(jù)不同類型對LCD控制器進行控制。1.LCD顯示屏的分類常見的液晶顯示屏按物理結(jié)構(gòu)可分為4種,562.LCD的常用參數(shù)市場上的LCD顯示屏從廠家、型號、規(guī)格等來說不盡相同,了解LCD的主要參數(shù)對進行LCD驅(qū)動開發(fā)非常有用,因為寫驅(qū)動程序時就需要對LCD的參數(shù)進行設(shè)置。PPI(PixelPerInch)是指每平方英寸所擁有的像素數(shù)目。分辨率:市面上的分辨率標(biāo)準(zhǔn)多種多樣,主要有VGA、SVGA、UXGA和SXGA+。BPP(BitPerPixel),即每個像素使用多少位來表示其顏色。2.LCD的常用參數(shù)市場上的LCD顯示屏從廠家、型號、規(guī)格等573.LCD的顯示原理一幅圖像被稱為一幀,每幀由多個行排列組成,每行又由多個像素組成,每個像素的色彩使用若干位數(shù)據(jù)來表示。顯示器從屏幕的左上方開始,一行一行地取得每個像素的數(shù)據(jù)并顯示出來,當(dāng)顯示到一行的最右邊時,跳到下一行的最左邊開始顯示下一行;當(dāng)顯示完所有行后,重新跳到左上方開始下一幀的顯示。顯示器沿著“Z”字形的路線進行掃描,同時使用幀掃描信號和行掃描信號來同步每一幀和每一行。3.LCD的顯示原理一幅圖像被稱為一幀,每幀由多個行排列組成586.1.2
LCD控制器LCD控制器的功能是產(chǎn)生控制時序和信號,從而驅(qū)動LCD。用戶只需要通過讀寫LCD控制器的一系列寄存器來完成配置。S3C2440的LCD控制器由一個邏輯單元組成,它的作用是把LCD圖像數(shù)據(jù)從一個位于系統(tǒng)內(nèi)存的buffer傳送到一個外部的LCD驅(qū)動器。LCD控制器還支持1BPP、2BPP、4BPP、8BPP的調(diào)色板TFT彩色屏,并且支持64K色(16BPP)和16M色(24BPP)非調(diào)色板真彩顯示。6.1.2LCD控制器LCD控制器的功能是產(chǎn)生控制時序和596.1.3
LCD控制器方塊圖LCD控制器的接口時序分為STN和TFT兩種。S3C2440的LCD控制器可以同時支持STN和TFT的LCD顯示屏,根據(jù)實際需要對控制器進行不同的設(shè)置可以產(chǎn)生不同的時序。6.1.3LCD控制器方塊圖LCD控制器的接口時序分為S606.1.4LCD控制器操作S3C2440的LCD控制器分STN控制和TFT控制,目前市面上主流的LCD為TFT-LCD。S3C2440的TFTLCD控制器支持1、2、4、8BPP調(diào)色板彩色模式及16BPP、24BPP無調(diào)色板真彩模式。1.24BPP顯示2.16BPP3.8BPP4.256色調(diào)色板6.1.4LCD控制器操作S3C2440的LCD控制器分611.24BPP顯示24BPP顯示模式使用24位表示一個像素點,每種顏色用8比特位來表示。LCD控制器從內(nèi)存中獲得某個像素的24位顏色值后直接通過VD[23:0]數(shù)據(jù)線發(fā)送給LCD驅(qū)動器。VD23222120191817161514131211109876543210RED76543210
GREEN
76543210
BLUE
765432101.24BPP顯示24BPP顯示模式使用24位表示一個像素點622.16BPP16BPP模式用16位來表示一個像素點的值。這16位數(shù)據(jù)的格式分為兩種:5:6:5和5:5:5:1,前者使用高5位表示紅色,中間6位表示綠色,低5位表示藍色;后者用高15位表示紅、綠、藍3種顏色,每種顏色用5位表示,最低位表示透明度。VD23222120191817161514131211109876543210RED43210NC
NC
NCGREEN
543210
BLUE
43210
2.16BPP16BPP模式用16位來表示一個像素點的值。這633.8BPP8BPP顯示模式使用8位來表示一個像素點,然而對3種基色平均下來,每種基色只能使用不到3位的數(shù)據(jù)來表示,即每種基色最多不過8階,這不能表示更豐富的色彩。4字節(jié)可以表示4個8BPP的像素,字節(jié)與像素的對應(yīng)順序也是可以編程選擇的。3.8BPP8BPP顯示模式使用8位來表示一個像素點,然而對644.256色調(diào)色板S3C2440為TFT顯示器提供256色調(diào)色板,調(diào)色板是一塊256×16的內(nèi)存,使用16BPP的格式來表示8BPP模式下各索引值的顏色。INDEX\BitPos1514131211109876543210Address00HR4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B00X4D00040001HR4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B00X4D000404…
FFHR4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B00X4D0007FCNumberofDV232221201915141312111076543
4.256色調(diào)色板S3C2440為TFT顯示器提供256色調(diào)656.1.5
LCD控制寄存器S3C2440提供了LCD控制器,其中有17個控制寄存器,包括LCDCON1~LCDCON5及LCDSADDR1-LCDSADDR3等。1.LCD控制寄存器LCDCON12.LCD控制寄存器LCDCON23.LCD控制寄存器LCDCON34.LCD控制寄存器LCDCON45.LCD控制寄存器LCDCON56.幀內(nèi)存地址寄存器6.1.5LCD控制寄存器S3C2440提供了LCD控制661.LCD控制寄存器LCDCON1LCDCON1用于選擇LCD類型、設(shè)置像素時鐘、使能LCD輸出信號等。功
能位描
述初始狀態(tài)LINECNT(只讀)[27:18]每輸出一個有效行其值減10CLKVAL[17:8]用于設(shè)置VCLK的值STN:VCLK=HCLK/(CLKVAL×2)TFT:VCLK=HCLK/((CLKVAL+1)×2)0MMODE[7]用于設(shè)置VM信號的反轉(zhuǎn)效率,只用于TFT屏0PNRMODE[6:5]設(shè)置LCD的類型00:4位雙掃描(STN)01:4位單掃描(STN)10:8位單掃描(STN)11:TFT屏0BPPMODE[4:1]選擇BPP模式,對于TFT屏1000:1BPP1001:2BPP1010:4BPP1011:8BPP1100:16BPP1101:24BPP(STN)0ENVID[0]信號輸出使能位0:禁止,1:使能01.LCD控制寄存器LCDCON1LCDCON1用于選擇LC672.LCD控制寄存器LCDCON2用于設(shè)置垂直方向各信號的時間參數(shù)。功
能位描
述初始值VBPD[31:24]VSYNC信號之后,還要經(jīng)過(VBPD+1)個HSYNC信號周期才會出現(xiàn)有效行數(shù)據(jù)0LINEVAL[23:14]LCD的行數(shù):(LINEVAL+1)行0VFPD[13:6]一幀中的有效數(shù)據(jù)完成后,到下一個VSYNC信號有效前的無效行數(shù)目:(VFPD+1)0VSPW[5:0]表示VSYNC信號的寬度為(VSPW+1)個HSYNC信號周期,這(VSPW+1)行的數(shù)據(jù)無效02.LCD控制寄存器LCDCON2用于設(shè)置垂直方向各信號的時683.LCD控制寄存器LCDCON3用于設(shè)置水平方向各信號的時間參數(shù)。功
能位描
述初始值HBPD[25:19]HSYNC信號脈沖之后,還要經(jīng)過(HBPD+1)個VCLK信號周期,才出現(xiàn)有效數(shù)據(jù)0HOZVAL[18:8]LCD的水平寬度:(HOZVAL+1)個像素0HFPD[7:0]一行中的有效數(shù)據(jù)完后,到下一個HSYNC信號有效前的無效像素個數(shù):HFPK+103.LCD控制寄存器LCDCON3用于設(shè)置水平方向各信號的時694.LCD控制寄存器LCDCON4對于TFT屏,這個寄存器用來設(shè)置HSYNC信號的脈沖寬度。功
能位描
述初始值MVAL[15:8]STN屏用0HSPW[7:0]表示脈沖寬度為(HSPW+1)個VCLK信號周期0WLH[7:0]STN屏用04.LCD控制寄存器LCDCON4對于TFT屏,這個寄存器用705.LCD控制寄存器LCDCON5用于設(shè)置各個控制信號的極性,并可從中讀取狀態(tài)信息。功
能位描
述初始值VSTATUS[16:15]只讀,垂直狀態(tài)00:處于VSYNC信號脈沖期間01:處于VSYNC信號結(jié)束到行有效之間10:處于行有效期間11:處于行有效結(jié)束到下一個VSYNC信號之間0HSTATUS[14:13]只讀,描述水平狀態(tài)00:處于HSYNC信號脈沖期間01:處于HSYNC信號結(jié)束到像素有效之間10:處于像素有效期間11:處于像素有效結(jié)束到下一個HSYNC信號之間0BPP24BL[12]設(shè)置TFT屏的顯示模式為24BPP時,一個4字節(jié)中哪3個字節(jié)有效。0:低3字節(jié)有效;1:高3字節(jié)有效0FRM565[11]設(shè)置TFT屏的顯示模式為16BPP時,數(shù)據(jù)的格式0:5:5:5:1;1:5:6:50INVVCLK[10]設(shè)置VCLK信號有效沿的極性0:下降沿讀取數(shù)據(jù);1:在上升沿讀取數(shù)據(jù)0INVVLINE[9]設(shè)置VLINE/HSYNC脈沖的極性0:正常極性;1:反轉(zhuǎn)的極性05.LCD控制寄存器LCDCON5用于設(shè)置各個控制信號的極性715.LCD控制寄存器LCDCON5功
能位描
述初始值INVVFRAME[8]設(shè)置VFRAME/VSYNC脈沖的極性0:正常極性;1:反轉(zhuǎn)的極性0INVD[7]設(shè)置VD數(shù)據(jù)線表示數(shù)據(jù)的極性0:正常極性;1:反轉(zhuǎn)的極性0INVVDEN[6]設(shè)置VDEN信號的極性0:正常極性;1:反轉(zhuǎn)的極性0INVPWREN[5]設(shè)置PWREN信號的極性0:正常極性;1:反轉(zhuǎn)的極性0INVLEND[4]設(shè)置LEND信號的極性0:正常極性;1:反轉(zhuǎn)的極性0PWREN[3]LCD_PWREN信號輸出使能0:禁止;1:使能0ENLEND[2]LEND信號輸出使能0:禁止;1:使能0BSWP[1]字節(jié)交換使能0:禁止;1:使能0HWSWP[0]半字交換使能0:禁止;1:使能05.LCD控制寄存器LCDCON5功能位描述726.幀內(nèi)存地址寄存器幀內(nèi)存可以很大,而真正要顯示的區(qū)域稱為視口,它處于幀內(nèi)存之內(nèi)。s3c2440有3個幀內(nèi)存地址寄存器,這3個寄存器用于確定幀內(nèi)存的起始地址,定位視口在幀內(nèi)存的位置。功
能位描
述初始值LCDBANK[29:21]用于保存幀內(nèi)存起始地址的A[30:22],幀內(nèi)存起始地址必須為4M對齊0LCDBASEU[20:0]對于雙掃描,用于表示上半幀的內(nèi)存起始地址對于單掃描,用于表示幀的內(nèi)存起始地址06.幀內(nèi)存地址寄存器幀內(nèi)存可以很大,而真正要顯示的區(qū)域稱為視736.幀內(nèi)存地址寄存器功
能位描
述初始值LCDBASEL[20:0]對于雙掃描,用于保存下半幀的起始地址對于單掃描,用于保存幀的結(jié)束地址其值按如下公式計算:LCDBASEL=CLDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)0功
能位描
述初始值OFFSIZE[21:11]虛擬屏長度表示上一行最后一個數(shù)據(jù)與下一行第一個數(shù)據(jù)間地址差值的一半,即以半字為單位的地址差0PAGEWIDTH[10:0]虛擬屏的寬度,這個值決定視口的寬度,以半字為單位06.幀內(nèi)存地址寄存器功能位描述初始值LCDB746.2LCD參數(shù)設(shè)置LCD驅(qū)動編寫的主要任務(wù)就是根據(jù)所使用的LCD屏正確地設(shè)置對應(yīng)的LCD寄存器參數(shù)。前面已經(jīng)講述了S3C2440LCD各控制寄存器。1.設(shè)置VFRAME、VLINE2.設(shè)置VCLK3.幀速率6.2LCD參數(shù)設(shè)置LCD驅(qū)動編寫的主要任務(wù)就是根據(jù)所使751.設(shè)置VFRAME、VLINEVFRAME和VLINE信號可以根據(jù)液晶屏的尺寸和顯示模式來設(shè)置,它們對應(yīng)LCDCON2寄存器的HOZVAL和LINEVAL值,設(shè)置方法如下:HOZVAL=(水平尺寸/VD數(shù)據(jù)位)-1彩色液晶屏:水平尺寸=3×水平像素點數(shù)VD數(shù)據(jù)位=BBP數(shù)(不分單雙掃描)LINVAL=垂直尺寸-1(單掃描)LINVAL=垂直尺寸/2-1(雙掃描)1.設(shè)置VFRAME、VLINEVFRAME和VLINE信號762.設(shè)置VCLKLCD控制器輸出的VCLK是直接由系統(tǒng)總線(AHB)的工作頻率HCLK直接分頻得到的。VCLK=HCLK/((CLKVAL+1)×
2)2.設(shè)置VCLKLCD控制器輸出的VCLK是直接由系統(tǒng)總線(773.幀速率幀速率就是VSYNC信號的頻率。幀速率與VSYNC、VBPD、VFPD、LINEVAL、HSYNC、HBPD、HFPD、HOZVAL和CLKVAL的域有關(guān),它們是LCDCON1/2/3/4。大多數(shù)LCD驅(qū)動器需要它們合適的幀速率。幀速率按如下公式計算:FrameRate=1/[{(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)}*
{(HSPW+1)+(HBPD+1)+(HFPD+1)+HOZVAL+1}*{2*(CLKVAL+1)/HCLK}]3.幀速率幀速率就是VSYNC信號的頻率。幀速率與VSYNC786.3內(nèi)核LCD驅(qū)動機制6.3.1FrameBuffer概述6.3.2FrameBuffer設(shè)備驅(qū)動的結(jié)構(gòu)6.3內(nèi)核LCD驅(qū)動機制6.3.1FrameBuff796.3.1FrameBuffer概述幀緩沖區(qū)是把顯示設(shè)備抽象成為幀緩沖區(qū)設(shè)備區(qū)。幀緩沖區(qū)允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫和I/O控制等操作。通過專門的設(shè)備結(jié)點可對相應(yīng)的設(shè)備進行訪問。應(yīng)用程序可以將它看成是顯示內(nèi)存的一個引用,將其映射到進程地址空間之后,就可以進行讀寫操作,而讀寫操作可以反映到具體的LCD設(shè)備上。6.3.1FrameBuffer概述幀緩沖區(qū)是把顯示設(shè)備806.3.2FrameBuffer設(shè)備驅(qū)動的結(jié)構(gòu)FrameBuffer設(shè)備驅(qū)動基于兩個文件,linux/include/linux/fb.h和linux/drivers/video/
fbmem.c。其中,fb.h定義了Framebuffer驅(qū)動所要用到的幾乎所有的結(jié)構(gòu)體,這些結(jié)構(gòu)主要包括structfb_info、structfb_var_screeninfo和structfb_fix_screeninfo。下面分別講述這幾個結(jié)構(gòu)體。6.3.2FrameBuffer設(shè)備驅(qū)動的結(jié)構(gòu)Fram811.structfb_infostructfb_info記錄了幀緩沖的全部信息,包括設(shè)置參數(shù)、狀態(tài)、操作函數(shù)指針等。1.structfb_infostructfb_info822.fb_var_screeninfostructfb_var_screeninfo記錄了幀緩沖設(shè)備和指定顯示模式的可修改信息。它包括顯示屏幕的分辨率、每個像素的比特數(shù)和一些時序變量。2.fb_var_screeninfostructfb_v833.fb_fix_screeninfo而fb_fix_screeninfo定義了硬件的不可變屬性,顯示緩沖區(qū)的映射地址也被定義在這里,它表示緩沖區(qū)不應(yīng)該被應(yīng)用程序所改變。3.fb_fix_screeninfo而fb_fix_scr844.fbmem.cfbmem.c是Framebuffer設(shè)備驅(qū)動技術(shù)的關(guān)鍵。它為上層應(yīng)用程序提供系統(tǒng)調(diào)用也為下一層的特定硬件驅(qū)動提供編程接口;那些底層硬件驅(qū)動需要用到這里的接口來向系統(tǒng)內(nèi)核注冊它們自己。4.fbmem.cfbmem.c是Framebuffer設(shè)備856.4Linux2.6.32的LCD驅(qū)動源碼分析6.4.1LCD驅(qū)動開發(fā)的主要工作6.4.2s3c2410fb_init()函數(shù)分析6.4.3s3c2410fb_probe()函數(shù)分析 6.4.4s3c2410fb_remove()函數(shù)分析6.4Linux2.6.32的LCD驅(qū)動源碼分析6.4866.4.1LCD驅(qū)動開發(fā)的主要工作LCD驅(qū)動開發(fā)的工作包括兩個方面,分別是初始化函數(shù)的編寫和填充fb_info結(jié)構(gòu)體中的主要成員函數(shù),下面分別講述。6.4.1LCD驅(qū)動開發(fā)的主要工作LCD驅(qū)動開發(fā)的工作包871.編寫初始化函數(shù)初始化函數(shù)首先初始化各個LCD控制器寄存器,通過寫寄存器來設(shè)置顯示的模式和顏色數(shù),然后在內(nèi)存中分配LCD顯示緩沖區(qū)。最后是初始化一個fb_info結(jié)構(gòu)體,填充其中的成員變量,并調(diào)用register_framebuffer
(&fb_info),將fb_info注冊入內(nèi)核。1.編寫初始化函數(shù)初始化函數(shù)首先初始化各個LCD控制器寄存器882.編寫成員函數(shù)對于嵌入式系統(tǒng)的簡單實現(xiàn),編寫結(jié)構(gòu)fb_info中函數(shù)指針fb_ops對應(yīng)的成員函數(shù)只需要下列3個函數(shù)就可以了。structfb_ops{...int(*fb_get_fix)(structfb_fix_screeninfo*fix,intcon,structfb_info*info);int(*fb_get_var)(structfb_var_screeninfo*var,intcon,structfb_info*info);int(*fb_set_var)(structfb_var_screeninfo*var,intcon,structfb_info*info);...}2.編寫成員函數(shù)對于嵌入式系統(tǒng)的簡單實現(xiàn),編寫結(jié)構(gòu)fb_in896.4.2s3c2410fb_init()函數(shù)分析首先要分析的是s3c2410fb_init()函數(shù),該函數(shù)內(nèi)容相對簡單,在s3c2410fb_init()函數(shù)體內(nèi)只是包裝了對平臺驅(qū)動注冊函數(shù)platform_driver_register()的調(diào)用,它的參數(shù)是&s3c2410fb_driver。這里是向內(nèi)核注冊一個platform設(shè)備驅(qū)動的意思,該platform設(shè)備是LCD設(shè)備。6.4.2s3c2410fb_init()函數(shù)分析首先要906.4.3s3c2410fb_probe()函數(shù)分析799staticint__inits3c24xxfb_probe(structplatform_device*pdev,800enums3c_drv_typedrv_type)801{802structs3c2410fb_info*info;803structs3c2410fb_display*display;804structfb_info*fbinfo;805structs3c2410fb_mach_info*mach_info;806structresource*res;807intret;808intirq;809inti;810intsize;811u32lcdcon1;8126.4.3s3c2410fb_probe()函數(shù)分析79916.4.3s3c2410fb_probe()函數(shù)分析813mach_info=pdev->dev.platform_data;814if(mach_info==NULL){815dev_err(&pdev->dev,816"noplatformdataforlcd,cannotattach\n");817return-EINVAL;818}8196.4.3s3c2410fb_probe()函數(shù)分析81926.4.3s3c2410fb_probe()函數(shù)分析820if(mach_info->default_display>=mach_info->num_displays){821dev_err(&pdev->dev,"defaultis%dbutonly%ddisplays\n",822mach_info->default_display,mach_info->num_displays);823return-EINVAL;824}825826display=mach_info->displays+mach_info->default_display;6.4.3s3c2410fb_probe()函數(shù)分析936.4.3s3c2410fb_probe()函數(shù)分析827828irq=platform_get_irq(pdev,0);829if(irq<0){830dev_err(&pdev->dev,"noirqfordevice\n");831return-ENOENT;832}6.4.3s3c2410fb_probe()函數(shù)分析82946.4.3s3c2410fb_probe()函數(shù)分析833834fbinfo=framebuffer_alloc(sizeof(structs3c2410fb_info),&pdev->dev);835if(!fbinfo)836return-ENOMEM;6.4.3s3c2410fb_probe()函數(shù)分析956.4.3s3c2410fb_probe()函數(shù)分析837838platform_set_drvdata(pdev,fbinfo);839840info=fbinfo->par;841info->dev=&pdev->dev;842info->drv_type=drv_type;6.4.3s3c2410fb_p
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子產(chǎn)品租賃合同模板
- 2025北京版的公租房買賣合同樣本
- 2025飯店廚房租賃合同
- 二零二五年度房屋買賣合同附家具家電回購協(xié)議
- 二零二五年度冷鏈物流車輛安全檢測合同
- 二零二五年度房地產(chǎn)抵押權(quán)擔(dān)保合同
- 二零二五年度個人掛靠公司知識產(chǎn)權(quán)運營合同
- 2025年租賃合同(三):租賃違約責(zé)任協(xié)議
- 2025版電機研發(fā)與智能控制技術(shù)集成合同
- 二零二五年度智慧城市建設(shè)項目工程咨詢服務(wù)合同模板
- 余熱發(fā)電運行操作規(guī)程
- 小學(xué)生養(yǎng)成教育實施路徑
- 漁場賣魚銷售合同協(xié)議
- 2025-2030年無線數(shù)字麥克風(fēng)項目商業(yè)計劃書
- 加油員考試試題及答案
- 2025至2030中國甘氨酸市場經(jīng)營形勢及競爭格局發(fā)展研究報告
- 熱電廠施工組織設(shè)計
- 游樂園服務(wù)培訓(xùn)課件
- 2025年深圳高三港澳臺華僑生聯(lián)考物理試卷試題(含答案)
- 公司滅蚊蠅工作方案
- 2025年貴州貴陽市城市建設(shè)投資集團有限公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論