当前位置: 技术问答>linux和unix
IO 映射问题
来源: 互联网 发布时间:2016-08-02
本文导语: 1 arm 采用统一编址,所以IO和内存是一样? 2 arm-linux里面(比如说S3C2440)IO访问时,直接使用静态映射地址,初始化里面给出映射表? 可我看源代码中: camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C244...
1 arm 采用统一编址,所以IO和内存是一样?
2 arm-linux里面(比如说S3C2440)IO访问时,直接使用静态映射地址,初始化里面给出映射表?
可我看源代码中:
camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);这不是动态分配吗?
2 arm-linux里面(比如说S3C2440)IO访问时,直接使用静态映射地址,初始化里面给出映射表?
可我看源代码中:
camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);这不是动态分配吗?
|
既可以静态映射 也可以动态映射。。
camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);
这个是动态映射。动态映射,可以随便什么时候映射,
#define S3C2410_PA_GPIO (0x56000000)
#define S3C24XX_VA_GPIO ((S3C2410_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART)
这个是静态映射, 但是静态映射,必须要修改 静态映射表,然后才能使用上面的静态映射,不是随便映射的。
以2440 为例子:
mach-smdk2440.c 文件中
static struct map_desc smdk2440_iodesc[] __initdata = {
/* ISA IO Space map (memory space selected by A24) */
{
.virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = __phys_to_pfn(S3C2410_CS2),
.length = 0x10000,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
.pfn = __phys_to_pfn(S3C2410_CS2 + (1
camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);
这个是动态映射。动态映射,可以随便什么时候映射,
#define S3C2410_PA_GPIO (0x56000000)
#define S3C24XX_VA_GPIO ((S3C2410_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART)
这个是静态映射, 但是静态映射,必须要修改 静态映射表,然后才能使用上面的静态映射,不是随便映射的。
以2440 为例子:
mach-smdk2440.c 文件中
static struct map_desc smdk2440_iodesc[] __initdata = {
/* ISA IO Space map (memory space selected by A24) */
{
.virtual = (u32)S3C24XX_VA_ISA_WORD,
.pfn = __phys_to_pfn(S3C2410_CS2),
.length = 0x10000,
.type = MT_DEVICE,
}, {
.virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
.pfn = __phys_to_pfn(S3C2410_CS2 + (1