s3c2440 linux lcd驅(qū)動解讀
s3c2440 linux lcd驅(qū)動解讀
驅(qū)動層即s3c2410fb.c定義platform_driver 如下面文件定義了s3c2410fb_driver:
linuxlinux-2.6.29driversvideoS3c2410fb.c
static struct platform_driver s3c2410fb_driver = {
.probe= s3c2410fb_probe,
.remove= s3c2410fb_remove,
.suspend= s3c2410fb_suspend,
.resume= s3c2410fb_resume,
.driver= {
.name= "s3c2410-lcd",
.owner= THIS_MODULE,
},
};
plat層定義device, 如下面文件定義了 s3c_device_lcd
linuxlinux-2.6.29archarmplat-s3c24xxDevs.c
struct platform_device s3c_device_lcd = {
.name= "s3c2410-lcd",
.id= -1,
.num_resources= ARRAY_SIZE(s3c_lcd_resource),
.resource= s3c_lcd_resource,
.dev= {
.dma_mask= &s3c_device_lcd_dmamask,
.coherent_dma_mask= 0xffffffffUL
}
};
因?yàn)閮?nèi)核配置是針對s3c2440芯片的, s3c2440自帶lcd控制器,因此內(nèi)核已經(jīng)知道有s3c_device_lcd這個device存在, 驅(qū)動為device服務(wù),driver通過
platform_driver_register(&s3c2410fb_driver)
告訴內(nèi)核驅(qū)動的存在,內(nèi)核根據(jù) driver.name 找到 device, 然后把device的信息通過 platform_device *pdev 這個參數(shù)傳遞給driver下掛著的各個功能函數(shù),從而使驅(qū)動完成使命.
驅(qū)動函數(shù)s3c24xxfb_probe 所引用到的參數(shù) mach_info, 即pdev->dev.platform_data 在 mach-mini2440.c里定義如下
static struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
.displays= &mini2440_lcd_cfg,
.num_displays= 1,
.default_display = 0,
.gpccon =0xaa955699,
.gpccon_mask =0xffc003cc,
.gpcup =0x0000ffff,
.gpcup_mask =0xffffffff,
.gpdcon =0xaa95aaa1,
.gpdcon_mask =0xffc0fff0,
.gpdup =0x0000faff,
.gpdup_mask =0xffffffff,
.lpcsel= 0xf82,
};
驅(qū)動根據(jù) lcd device 信息建立一塊buffer, 然后把這塊buffer作為一個設(shè)備通過 ret = register_buffer(fbinfo) 注冊到linux設(shè)備管理系統(tǒng)中, linux在 /dev 下生成一個叫 fb 的節(jié)點(diǎn), GUI就對這個 fb 節(jié)點(diǎn)操作.