首先,内核在启动时会注册一个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驱动核心层中。