开放原子开发者工作坊 S5PV210 LCD驱动的分析过程——定位相关源代码

S5PV210 LCD驱动的分析过程——定位相关源代码

S5PV210LCD驱动的分析过程——定位相关源代码本文主要讲述了在拿到一套硬件和相关的内核源代码时,怎样找到特定驱动的源代码相关的文件。使用的硬件环境为TQ210开发板,内核使用3.0.8版本。首先,linux的驱动可以通过makemenuconfig命令来进行配置,通过该命令,我们可以大概了解到这套内核所含了哪些可用的源代码。因此我们可以通过这个命令,来查看源代码...

S5PV210 LCD驱动的分析过程——定位相关源代码

 

本文主要讲述了在拿到一套硬件和相关的内核源代码时,怎样找到特定驱动的源代码相关的文件。使用的硬件环境为TQ210开发板,内核使用3.0.8版本。

首先,linux的驱动可以通过make menuconfig命令来进行配置,通过该命令,我们可以大概了解到这套内核所含了哪些可用的源代码。 

因此我们可以通过这个命令,来查看源代码中包含什么驱动。初步定位驱动程序的位置。以下讲述一下我在没有其它资料的前提下怎么查找S5PV210芯片LCD相关驱动代码的位置的过程(假设你想换一下LCD屏,要改一下该驱动的各种信号的时序和分辨率):
1、执行make menuconfig
执行命令后,查看各个选择,找一下跟LCD有关的选项发现选项如下:
Device Drivers
|_Graphics support
|_*Support for frame bufferdevices
|_*S3C Framebuffer Support
|_Select LCD Type
|_for TQ210-LCD auto detect

关键就是这个Select LCD Type这里 ,里面可以选择很多类型,有7寸的800X480的,有10.4寸的等等。找到这里以后,我们要找出这个配置项会让内核在编译时做什么东东。

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
tristate "S3C Framebuffer support"
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
depends on FB && ARCH_S5PV210
default n
---help---
This enables support for Samsung Display Controller (FIMD)

choice
depends on FB_S3C
prompt "Select LCD Type"
default FB_TQ_AUTO_DETECT
config FB_TQ_AUTO_DETECT
bool "for TQ210-LCD auto detect"
depends on (MACH_TQ210 || MACH_SMDKV210 || MACH_SMDKC110)
---help---
This enables support for Samsung fb auto detect

config FB_S3C_LCD480X272_T43
bool "TQ210-LCD480*272 for 4.3-inch screen"
depends on MACH_SMDKV210 || MACH_SMDKC110 ||MACH_TQ210
select BACKLIGHT_PWM
help
This enables support for TQ210 T43 LCD panel

config FB_S3C_LCD800X480_A70
bool "TQ210-LCD800*480 for 7-inch sreen AT070TN92"
depends on MACH_SMDKV210 || MACH_SMDKC110 ||MACH_TQ210
select BACKLIGHT_PWM
help
This enables support for TQ210-LCD800*480 AT070TN92 WVGA LCD panel

config FB_S3C_LCD800X600_A104
bool "TQ210-LCD800*600 for 10.4-inch screen"
depends on MACH_SMDKV210 || MACH_SMDKC110 ||MACH_TQ210
select BACKLIGHT_PWM
help
This enables support for TQ210 T10 4.8\" WVGA LCD panel

config FB_S3C_VGA1024X768
bool "TQ210-VGA1024*768"
depends on MACH_SMDKV210 || MACH_SMDKC110 ||MACH_TQ210
select BACKLIGHT_PWM
help
This enables support for TQ210 4.8\" WVGA LCD panel
endchoice


这里的"FB_TQ_AUTO_DETECT"、"FB_S3C_LCD480X272_T43“、”FB_S3C_LCD800X480_A70、”FB_S3C_LCD800X600_A104“和”FB_S3C_VGA1024X768“类型是会影响内核的宏定义,我们要把它记下来然后进入下一步的分析。


4、在内核源码根目录下搜索上述几个宏,例如:grep -n -r 'FB_TQ_AUTO_DETECT' *,发现,在mach-tq210.c中有相应的判断,由此可以判定程序执行的位置。

从这里开始,我们已经找到了跟LCD有关的所有代码的位置。
下面我们开始分析一下这些文件中关键代码的位置,讲述一下我的分析过程:
我们发现不管是4寸的屏幕还是7寸的屏幕,即使它们的分辨率不同,内核都是包含了同一个文件“mach-tq210.c"于是我猜想:与屏幕时序和分辨率有关的参数应该是放在mach-tq210.c这个头文件中,用条件编译的方式进行处理。结果打开该文件,确实如此,以下是mach-tq210.c部份代码片段:

#if defined(CONFIG_FB_S3C_LCD800X480_A70)||defined(CONFIG_FB_TQ_AUTO_DETECT)
static struct s3cfb_lcd A70_TN92 = {
.width = 800,
.height = 480,
.bpp = 24,
.freq = 100,
// .clkval_f = 6,
.timing = {
.h_fp = 14,
.h_bp = 27,
.h_sw = 20,
.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,
},
};
#elif defined(CONFIG_FB_S3C_LCD800X600_A104)
……
#endif


以上说这些实际没有涉及太多的技术相关的信息,主要是讲述了一下,当我的源代码没有相关的文档相关的技持时,怎么去分析和修改相关的驱动源代码。现在定位到这些代码以后就可以进行重点分析里面的函数的功能了。

 

转载于:https://blog.51cto.com/7090376/1265350

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐

  • 浏览量 138
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献15条内容