在s3c2410_wdt.c中
有一行
request_mem_region(res->start, size, pdev->name)
而
在devs.c中
static struct resource s3c_wdt_resource[] = {
[0] = {
.start = S3C24XX_PA_WATCHDOG,
.end = S3C24XX_PA_WATCHDOG + S3C24XX_SZ_WATCHDOG - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_WDT,
.end = IRQ_WDT,
.flags = IORESOURCE_IRQ,
}
}
在arch/arm/mach-s3c2410/include/mach/map.h
#define S3C24XX_PA_WATCHDOG S3C2410_PA_WATCHDOG
在/arch/arm/plat-s3c24xx/include/mach/map.h
#define S3C2410_PA_WATCHDOG (0x53000000)
即上面行代码要申请0x53000000开始的一段size大小的内存地址空间以访问watchdog
从s3c2440/s3c2410手册上获知
watchdog的寄存器地址本来就是从0x53000000开始的一段内存区域
比如WTCON 0x53000000,WTDAwatchdog 0x53000004,WTCNT 0x53000008等,就是说这些io内存的物理地址都是已经被cpu定义好的了,即使不去request_mem_region,watchdog那些寄存器的物理地址也是从这里开始的,即在驱动程序中访问watchdog就必须去访问这部分物理地址(的ioremap之后的虚拟地址)。
难道内核会把0x53000000这个地址空间分配给别的寄存器吗?
不知道request_mem_region用意为何?
s3c2440的地址空间中,从4千8百万到5b00001c这段地址都是已经分配好的了,用于特殊寄存器的寻址,
访问某个地址就是访问一个已定的寄存器。
寄存器的地址是不变的,寄存器不属于标准内存,而是属于I/O内存。只是这些寄存器的地址要拿到linux内核中使用的话,要经过一系列的处理,这是Linux使用I/O内存方式。
至于怎样处理的,跟计算机平台,使用的总线以及页表有关,很复杂的。
看下LDD3下面的I/O操作内容吧。