I /O de memoria asignación estática map

  

En el Linux portado a la placa de destino en el proceso, a menudo crear I periférica /O dirección de memoria virtual a una asignación estática dirección física:

//utilizado estructura struct map_desc {unsigned long virtual; //dirección virtual PFN largo sin signo; //__ phys_to_pfn (dirección física), es la página de número de trama física longitud largo sin signo; //tamaño unsigned int tipo; //tipo};


este es el nivel de map_io plat:

/* mesa de apoyo CPUs apoyado:

en el linux /arch /brazo /plat-S5P /cpu.c en el tipo de CPU * /const static char name_s5pv210 [] = " S5PV210 /S5PC110 "; cpu_ids cpu_table struct estáticas [] __initdata = {{.idcode = 0x43110000, .idmask = 0xfffff000, .map_io = s5pv210_map_io, //esto es el mach nivel los map_io.init_clocks = s5pv210_init_clocks, .init_uarts = s5pv210_init_uarts, .init = s5pv210_init, .name = name_s5pv210,}};

/* mínimo mapeo IO * /static struct map_desc s5p_iodesc [] __initdata = {{. virtual = (unsigned long) S5P_VA_CHIPID, .pfn = __phys_to_pfn (S5P_PA_CHIPID),. longitud = SZ_4K, //tamaño de página ARM es 4K, por lo que esta longitud debe ser un múltiplo de la .type 4K = MT_DEVICE,}, {.virtual = (unsigned long) S3C_VA_SYS, .pfn = __phys_to_pfn (S5P_PA_SYSCON),. Length = SZ_64K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S3C_VA_UART, .pfn = __phys_to_pfn (S3C_PA_UART),. length = SZ_4K, .type = MT_DEVICE,}, {.virtual = (unsigned long) VA_VIC0,. PFN = __phys_to_pfn (S5P_PA_VIC0),. length = SZ_16K, .type = MT_DEVICE,}, {.virtual = (unsigned long) VA_VIC1, .pfn = __phys_to_pfn (S5P_PA_VIC1),. length = SZ_16K, .type = MT_DEVICE,}, { .virtual = (unsigned long) S3C_VA_TIMER, .pfn = __phys_to_pfn (S5P_PA_TIMER),. length = SZ_16K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S5P_VA_GPIO, .pfn = __phys_to_pfn (S5P_PA_GPIO),. length = SZ_4K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S3C_VA_WATCHDOG, .pfn = __phys_to_pfn (S5P_PA_WDT),. length = SZ_4K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S3C_VA_OTG,. PFN = __phys_to_pfn (S5P_PA_OTG),. length = SZ_1M, .type = MT_DEVICE,}, {.virtual = (l unsigned ong) S3C_VA_OTGPHY, .pfn = __phys_to_pfn (S5P_PA_OTGPHY), longitud = SZ_1M, .type = MT_DEVICE,}};.


void __init s5p_init_io (struct map_desc tamaño * mach_desc, int, __iomem void * cpuid_addr) {/* inicializar los descriptores io que necesitamos para la inicialización * /iotable_init (s5p_iodesc, ARRAY_SIZE (s5p_iodesc)); //en última instancia, establecen la función del mapa de la página (aquí principalmente es un nivel map_io plat)

CÓDIGO ID = __raw_readl (cpuid_addr); s3c_init_cpu (CÓDIGO ID, cpu_ids, ARRAY_SIZE (cpu_ids)); //esta función con el tiempo se llame por map_io nivel mach}


/kernel /arch /brazo /mach-S5PV210 /mach-smdkv210.c en los que: //inicializar la placa llamado static void __init smdkv210_map_io (void) {s5p_init_io (NULL, 0, S5P_VA_CHIPID); .....} MACHINE_START (SMDKV210, " smdkv210 ".) phys_io = S3C_PA_UART &0xfff00000, .io_pg_offst = (((U32) S3C_VA_UART) > > 18) &0xFFFC, .boot_params = S5P_PA_SDRAM + 0x100, .fixup = s5pv210_fixup, .init_irq = s5pv210_init_irq, .map_io = smdkv210_map_io, .init_machine = smdkv210_machine_ init, .Timer = &s5p_systimer, MACHINE_END


A partir de entonces, cuando se accede a través del controlador de dispositivo estática asignada memoria de E /S, que corresponde directamente a la dirección virtual más el desplazamiento sin la necesidad de utilizar ioremap (). Pero traté ioremap () es también posible, no sabemos que está mal? ? ?







complementaria map_io adjuntar (a nivel de mach ):

en el linux /arch /brazo /mach-S5PV210 /cpu.c en:

/* asignaciones IO iniciales * /static struct map_desc s5pv210_iodesc [] __initdata = {{.virtual = (unsigned long) S5P_VA_SYSTIMER, .pfn = __phys_to_pfn (S5PV210_PA_SYSTIMER),. length = SZ_1M, .type = MT_DEVICE,}, {.virtual = (unsigned long) VA_VIC2, .pfn = __phys_to_pfn (S5PV210_PA_VIC2),. length = SZ_16K,. type = MT_DEVICE,}, {.virtual = (unsigned long) VA_VIC3, .pfn = __phys_to_pfn (S5PV210_PA_VIC3),. length = SZ_16K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S5P_VA_SROMC, .pfn = __phys_to_pfn (S5PV210_PA_SROMC),. length = SZ_4K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S5P_VA_AUDSS, .pfn = __phys_to_pfn (S5PV210_PA_AUDSS),. length = SZ_1M, .type = MT_DEVICE,}, {.virtual = (unsigned long) S5P_VA_DMC0, .pfn = __phys_to_pfn (S5PV210_PA_DMC0),. length = SZ_4K, .type = MT_DEVICE,}, {.virtual = (unsigned long) S5P_VA_DMC1, .pfn = __phys_to_pfn (S5PV210_PA_DMC1),. le ngth = SZ_4K, .type = MT_DEVICE,}};

/* ** s5pv210_map_io registro de la CPU estándar áreas IO * /void __init s5pv210_map_io (void) {iotable_init (s5pv210_iodesc, ARRAY_SIZE (s5pv210_iodesc));}

Copyright © Conocimiento de Windows All Rights Reserved