在fb驱动中。首先分析的是。找到驱动框架,可以看出内核中可以将驱动框架定死在内核中,也可以是内核进行模块化。(在这个驱动中,lcd的驱动框架是定死在内核中的)驱动框架提供驱动开发的接口,有内核维护的大神们操作。驱动工程师所要做的就是利用留出来的接口进行驱动框架进行驱动编写。
首先在s3cfb.c中找到驱动代码程序。可知LCD的驱动利用platform平台总线进行编写。platform_driver和platform_device进行probe函数。其中platform_device是在内核初始化的时候进行注册(mach-x210中的smdkc110_machine_init函数中进行注册。)。所以当驱动进行注册的时候,就回去执行probe函数
,匹配方式一般是根据名字来进行匹配。
在mach-x210中进行设备注册的时候#ifdef CONFIG_FB_S3C /&s3c_device_fb,根据宏定义来判定。追踪
s3c_device_fb进入到devs.c中找到platform_device(此时的设备中没有platform_data),它的platform_data是利用本文件中s3cfb_set_platdata函数,在smdkc110_machine_init进行设置的(可以根据s3cfb_set_platdata找到具体的硬件所在的地方【在smdkc110_machine_init中调用s3cfb_set_platdata(&ek070tn93_fb_data);】在该函数中如果没有设置具体的硬件platform_data就会使用默认的);
此时就应该得知ek070tn93_fb_data,为具体硬件的platform_data。
在mach-x210中:
static struct s3c_platform_fb ek070tn93_fb_data __initdata = {
.hw_ver = 0x62,
.nr_wins = 5,
.default_win = CONFIG_FB_S3C_DEFAULT_WINDOW,
.swap = FB_SWAP_WORD | FB_SWAP_HWORD,
.lcd = &ek070tn93,
.cfg_gpio = ek070tn93_cfg_gpio,
.backlight_on = ek070tn93_backlight_on,
.backlight_onoff = ek070tn93_backlight_off,
.reset_lcd = ek070tn93_reset_lcd,
};
其中.lcd = &ek070tn93,继续追踪可知
static struct s3cfb_lcd ek070tn93 = {
.width = S5PV210_LCD_WIDTH,
.height = S5PV210_LCD_HEIGHT,
.bpp = 32,
.freq = 60,
.timing = {
.h_fp = 40,
.h_bp = 88,
.h_sw = 128,
.v_fp = 1,
.v_fpe = 1,
.v_bp = 23,
.v_bpe = 1,
.v_sw = 4,
},
.polarity = {
.rise_vclk = 1,
.inv_hsync = 1,
.inv_vsync = 1,
.inv_vden = 0,
},
};
就找到具体的硬件所在了。此时platform_device就是完整的硬件信息包含。在probe函数中在进行数据传递。(其实修改显示器的内容就是S5PV210_LCD_WIDTH追踪进行修改即可)。