在<< 2410的初始化过程>>一文中我们看到了2410下的片上设备如何被添加到系统并和驱动配合使用的, 本文以RTC设备为例详细描述这个过程.
首先在arch/arm/s3c-2410/devs.c下添加静态描述的RTC设备资源及代表RCT设备的platform_device对象.
/* RTC */
static struct resource s3c_rtc_resource[] = { /*RTC资源*/
[0] = {
.start = S3C24XX_PA_RTC, /*RTC寄存器的物理起始地址*/
.end = S3C24XX_PA_RTC + 0xff,
.flags = IORESOURCE_MEM, /*资源类型*/
},
[1] = {
.start = IRQ_RTC, /*中断号*/
.end = IRQ_RTC,
.flags = IORESOURCE_IRQ, /*资源类型*/
},
[2] = {
.start = IRQ_TICK, /*中断号*/
.end = IRQ_TICK,
.flags = IORESOURCE_IRQ /*资源类型*/
}
};
struct platform_device s3c_device_rtc = { /*RTC设备*/
.name = "s3c2410-rtc", /*设备名必须与驱动中的名字一致*/
.id = -1,
.num_resources = ARRAY_SIZE(s3c_rtc_resource),
.resource = s3c_rtc_resource, /*资源*/
};
EXPORT_SYMBOL(s3c_device_rtc);
其中资源中的寄存器地址是物理地址, 在驱动中得到后会用ioremap()来重映射.
接着要把这个RTC设备添加到系统中去, << 2410的初始化过程>>说过初始化时会把smdk_devs[]下的设备都添加到系统中去, 因此我们只要把RTC设备添加到这个数组中去就行了:
Static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
….
& s3c_device_rtc /*加进去就行了*/
}
这样在系统初始化时就会把RTC设备加到系统中去, 之后RTC驱动注册好后, 系统就会为它寻找匹配的设备(匹配的根据就是上文讲的设备名字). 驱动找到设备后也就找到了设备的所有资源(寄存器地址, 中断号), 也就可以通过这些资源来控制设备了. 具体RTC驱动可参考<< 2410下rtc驱动分析>>