static int __init s3c24xxfb_probe(struct platform_device *pdev,enum s3c_drv_type drv_type)
{
/**
s3c2410fb_info这个结构体主要将一些零散的全局变量,打包成一个结构体
他的成员有:
struct clk *clk; //时钟结构体
struct resource *mem; //保存设备资源
void __iomem *io; //保存虚拟地址
void __iomem *irq_base;//保存中断号
......
*/
struct s3c2410fb_info * info;
struct s3c2410fb_display *display;
/**
很重要的结构体,每一个framebuffer驱动对应一个fb_info
是lcd驱动的核心。后面会详细说
*/
struct fb_info *fbinfo;
struct s3c2410fb_mach_info *mach_info;
struct resource *res;
int ret;
int irq;
int i;
int size;
u32 lcdcon1;
/**
看,如果mach_info 为空了,那么程序就会出错退出了,
那么,s3c2410fb_mach_info 是再什么时候 放到pdev->dev.platform_data中的呢?
在/arch/arm/mach_s3c2440/mach_smdk2440.c文件中有一个函数smdk2440_machine_init()
static void __init smdk2440_machine_init(void)
{
在这个函数中,将s3c2410fb_mach_info 放入到了s3c_device_lcd.dev.platform_data中。
看看它的源码是怎么样实现的,下面还有附有一张图
s3c24xx_fb_set_platdata(&smdk2440_fb_info)
{
struct s3c2410fb_mach_info *npd;
npd = kmalloc(sizeof(*npd), GFP_KERNEL);为s3c2410fb_mach_info分配内存空间
if (npd) {
memcpy(npd, pd, sizeof(*npd));
将传入的s3c2410fb_mach_info结构放入到 s3c_device_lcd.dev.platform_data中,
后面的probe函数会取出这个s3c2410fb_mach_info
s3c_device_lcd.dev.platform_data = npd;
} else {
printk(KERN_ERR "no memory for LCD platform data\n");
}
}
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
smdk_machine_init();
}
*/
mach_info = pdev->dev.platform_data;
if (mach_info == NULL) {
dev_err(&pdev->dev,"no platform data for lcd, cannot attach\n");
return -EINVAL;
}
}
lcd probe函数 赏析
最新推荐文章于 2024-04-09 00:56:05 发布