平台设备注册的分析:/*做下面的资源需要看芯片手册,看原理图*/
---------------------------------------------------------
arch/arm/plat-s3c24xx/devs.c /*大部分的设备控制器资源在这里定义的*/
/* LCD Controller */
static struct resource s3c_lcd_resource[] = {
[0] = {
.start = S3C24XX_PA_LCD,
.end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_LCD,
.end = IRQ_LCD,
.flags = IORESOURCE_IRQ,
}
};
static u64 s3c_device_lcd_dmamask = 0xffffffffUL;
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
}
};
/*上面只是定义一些资源,我们需要注册到平台设备链表上去*/
arch/arm/mach-s3c2410/mach-smdk2410.c
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_sdi
};
static void __init smdk2410_init(void)
{
s3c24xx_fb_set_platdata(&smdk2410_lcdcfg);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
......................
}
platform_add_devices/*这个函数里面干了什么*/
-----------------------------------------------------------------------------------
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
platform_device_register/*这个函数目的是讲我们的设备资源加载到设备链表中,怎么加载*/
int platform_device_register(struct platform_device * pdev)
{
//设备属性的初始化
device_initialize(&pdev->dev);
//将设备添加到Platfrom中
return platform_device_add(pdev);
}
platform_device_add
pdev->dev.bus = &platform_bus_type;
...........
ret = device_add(&pdev->dev); /*开始加载*/
...................../*将设备资源加入到设备链表*/
bus_attach_device(dev); /*找驱动去匹配*/
ret = device_attach(dev);
/*搜寻总线上驱动链表中的每个驱动,并调用__device_attach*/
ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
__device_attach:/*跟驱动那边调用的是同一个函数,它里面会调用总线结构体里面的match函数,根据名字来匹配*/
------------------------------------------------------------------------------