s3c6410 LCD驅動的分析過程(1)

首先,linux的驅動可以通過make menuconfig命令來進行配置,通過該命令,我們可以大概瞭解到這套內核所含了哪些可用的源代碼。

因此我們可以通過這個命令,來查看源代碼中包含什麼驅動。初步定位驅動程序的位置。以下講述一下我在沒有其它資料的前提下怎麼查找s3c6410芯片LCD相關驅動代碼的位置的過程(假設你想換一下LCD屏,要改一下該驅動的各種信號的時序和分辨率):
1、執行make menuconfig
執行命令後,查看各個選擇,找一下跟LCD有關的選項發現選項如下:
Device Drivers
|_Graphics support
  |_*Support for frame bufferdevices
  |_*S3C Framebuffer Support
  |_Select LCD Type(4.3 i...800x480)
關鍵就是這個Select LCD Type這裏,裏面可以選擇很多類型,有7寸的800X480的,有10寸的等等。找到這裏以後,我們要找出這個配置項會讓內核在編譯時做什麼東東。


2、查看源代碼目錄的driver/KConfig文件(關於KConfig的格式可以自己上網查一下,《Linux驅動開發入門與實踐》P89頁也有講述),通過大概的查看與分析,定位到"driver/video/KConfig"文件。然後在該文件中用“查找”的方法,找一下自己關心的配置項的配置信息(比如我們可以查一下Select LCD Type)。這時我們會發現找不到這個關鍵字。那麼我們可以再試一下找這個配置項附近的一些其它配置項,如它上兩行的“Support for frame buffer”選項。
找這些其它的配置項是爲了大概定位到我們所需的配置項的位置。大概定位以後,我們再往下查找一下附近的"source"關鍵字,看以下引入了哪些文件。我們需要看的配置項有可能就在這些文件裏。通過這個方式,我找到了我關心的配置項“Select LCD Type”的內容在"driver/video/samsung/KConfig"文件中。


3、定位到我們的配置項後,我們把這個配置項聲明的宏定義給記錄下來。例如:以下這些是我們關心的配置項的部份內容:

config FB_S3C_EXT
tristate "S3C Framebuffer Support (eXtended)"
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
depends on FB && (ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX)


default y if VIDEO_SAMSUNG
---help---
TBA


choice
depends on FB_S3C_EXT
prompt "Select LCD Type"
default FB_S3C_EXT_TFT480272


config FB_S3C_EXT_TFT480272
boolean "4.3 inch 480x272 TFT LCD"
select TOUCHSCREEN_IF
help
 4.3 inch 480x272 TFT LCD


config FB_S3C_EXT_TFT800480
boolean "7 inch 800x480 TFT LCD - A70"
select TOUCHSCREEN_IF
help
 7 inch 800x480 TFT LCD


config FB_S3C_EXT_S70T800480
boolean "7 inch 800x480 TFT LCD - S70"
select TOUCHSCREEN_IF
help
 7 inch 800x480 TFT LCD


config FB_S3C_EXT_W50I800480
boolean "5 inch 800x480 TFT LCD - W50i"
select TOUCHSCREEN_IF
help
 5 inch 800x480 TFT LCD


config FB_S3C_EXT_T240320
boolean "3.5 inch 240X320 Toppoly LCD"
select TOUCHSCREEN_IF
help
 3.5 inch 240X320 Toppoly LCD


這裏的"FB_S3C_EXT"和"FB_S3C_EXT_TFT_LCD類型"是會影響內核的宏定義,我們要把它記下來然後進入下一步的分析。



4、查看與KConfig文件同一目錄下的makefile。查找“obj+宏定義=...”,這樣可以瞭解到,選擇了這此配置項以後會增加哪些文件到內核。然後我們就可以重點分析這些源代碼了。我們查看Makefile裏的內容不多,關鍵點是這幾句:
obj-$(CONFIG_FB_S3C_EXT)+= s3cfb.o
obj-$(CONFIG_FB_S3C_EXT) += s3cfb_spi.o
obj-$(CONFIG_PLAT_S3C64XX) += s3cfb_fimd4x.o
……
#以下這些跟分辨率有關的都在同一個文件裏
obj-$(CONFIG_FB_S3C_EXT_TFT480272) += s3c_mini6410.o
obj-$(CONFIG_FB_S3C_EXT_TFT800480) += s3c_mini6410.o
obj-$(CONFIG_FB_S3C_EXT_S70T800480) += s3c_mini6410.o
……


從這裏開始,我們已經找到了跟LCD有關的所有代碼的位置。
下面我們開始分析一下這些文個把中關鍵代碼的位置,講述一下我的分析過程:
我們發現不管是4寸的屏幕還是7寸的屏幕,即使它們的分辨率不同,內核都是包含了同一個文件“s3c_mini6410.c”於是我猜想:與屏幕時序和分辨率有關的參數應該是放在s3c_mini6410.h這個頭文件中,用條件編譯的方式進行處理。結果打開該文件,確實如此,以下是s3c_mini6410.h部份代碼片段:


#if defined(CONFIG_FB_S3C_EXT_TFT480272)


#define S3CFB_LCD_TYPE "N43"
#define S3CFB_VBP (0x03)/* back porch */
#define S3CFB_VFP (0x02)/* front porch */
#define S3CFB_VSW (0x02)/* vsync width */
#define S3CFB_HBP (0x2d)/* back porch */
#define S3CFB_HFP (0x04)/* front porch */
#define S3CFB_HSW (0x06)/* hsync width */


#define S3CFB_HRES 480/* horizon pixel  x resolition */
#define S3CFB_VRES 272/* line cnt       y resolution */


#define S3CFB_CLKVAL 11
#define S3CFB_VIDCON1 (S3C_VIDCON1_IVCLK_RISE_EDGE)


//------------------------------------------------------------------------------
#elif defined(CONFIG_FB_S3C_EXT_TFT800480)


#define S3CFB_LCD_TYPE "A70"
#define S3CFB_VBP (0x1d)/* back porch */
#define S3CFB_VFP (0x11)/* front porch */
#define S3CFB_VSW (0x18)/* vsync width */
#define S3CFB_HBP (0x28)/* back porch */
#define S3CFB_HFP (0x28)/* front porch */
#define S3CFB_HSW (0x30)/* hsync width */


#define S3CFB_HRES 800/* horizon pixel  x resolition */
#define S3CFB_VRES 480/* line cnt       y resolution */


#define S3CFB_CLKVAL 3/* ~33.25 MHz */
#define S3CFB_VIDCON1 (S3C_VIDCON1_IHSYNC_INVERT | S3C_VIDCON1_IVSYNC_INVERT)


//------------------------------------------------------------------------------
#elif defined(CONFIG_FB_S3C_EXT_S70T800480)
…………
……
#endif


下一步,我們再分析一下上面定義這些宏的作用,我的分析過程是這樣的:
1、打開s3c_mini6410.c,查找一下這些宏哪裏用到,結果發現上面的這些宏都是“s3cfb_set_fimd_info”函數裏被用到了。這些函數利用這些宏設置了一個s3cfb_fimd的外部變量。到這一步存在幾個疑問:
a)這個變量的聲明在哪裏?
b)這個變量的定義在哪裏(它的完整結構是怎麼樣的)?
2、抱着第一點的疑問,我們查看s3c_mini6410.c 引用的頭文件,一個一個進行重點分析,我找到“s3cfb.h”中,定義了s3cfb_fimd_info_t結構。並且聲明瞭一個外部變量:
extern s3cfb_fimd_info_t s3cfb_fimd;
於是我再查看了一下,s3cfb.c看看該文件中有沒有真正地定義這個s3cfb_fimd變量,結果發現s3cfb.c文件中沒有這個變量。
3、打不到文件,我們再回頭想一下makefile文件中,包含了哪些特定的文件——還有"s3cfb_fimd4x.c"呢。我打開該文件,確實找到了這個變量的定義。


以上說這些實際沒有涉及太多的技術相關的信息,主要是講述了一下,當我的源代碼沒有相關的文檔相關的技持時,怎麼去分析和修改相關的驅動源代碼。現在定位到這些代碼以後就可以進行重點分析裏面的函數的功能了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章