首先,內核在啓動時會註冊一個platform_device
在最後調用imx_add_platform_device name = "mxc_ldb"
//調用過程
static void __init mx6_qcorein_board_init(void)
imx6q_add_ldb(&ldb_data);
imx_add_ldb(&imx6q_ldb_data, ldb_data);
return imx_add_platform_device("mxc_ldb", -1,res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
接下來就是driver端了。
kernel_imx/drivers/video/mxc/ldb.c
__init ldb_init(void)
platform_driver_register(&mxcldb_driver)
匹配成功後,調用probe函數。
先看數據結構:
ldb_probe(struct platform_device *pdev)
struct ldb_data *ldb;
ldb = kzalloc(sizeof(struct ldb_data), GFP_KERNEL);
ldb->pdev = pdev;
ldb->disp_ldb = mxc_dispdrv_register(&ldb_drv);
struct mxc_dispdrv_entry *new;
new = kzalloc(sizeof(struct mxc_dispdrv_entry), GFP_KERNEL);
new->drv = drv;
list_add_tail(&new->list, &dispdrv_list);
return (struct mxc_dispdrv_handle *)new;
mxc_dispdrv_setdata(ldb->disp_ldb, ldb);
struct mxc_dispdrv_entry *entry = (struct mxc_dispdrv_entry *)handle;
if (entry) {
entry->priv = data;
return 0;
}
dev_set_drvdata(&pdev->dev, ldb);
(!pdev->dev->p){
error = device_private_init(dev);
if (error)
return error;
}
pdev->dev->p->driver_data = ldb;
return 0;
然後:看看哪裏調用它了。
梳理一下涉及文件:
1、ldb.c是LVDS 驅動的具體實現過程。
2、mxc_dispdrv.c 通用註冊handle接口
3、mxc_ipuv3_fb.c 是imx6具體顯示模塊平臺核心的驅動,最終用於把fb_info結構體註冊到framebuffer驅動核心層中。