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));}
Sobre el modelo de dispositivo de Linux en línea, hay algunas discusiones. Algunas cosas que solía
Las instrucciones de LDM /STM se utilizan principalmente para la protección de campo, la replicación
Git como el sistema de control de versiones distribuido más avanzado del mundo (nadie), probablement
Webalizer bajo Linux es un guión de análisis de registros de Internet más populares, por supuesto, t
Comandos de actualización y consulta de Linux detalles de chkconfig
Crisis financiera de Linux de Mandriva Nuevos inversores se acercan
Sangría y reemplazo del bloque VIM
En Symfony2 Nginx tutorial de configuración
La red PXE + TFTP + DHCP arranca e instala automáticamente Linux
Borrar el registro de información operacional bajo Linux
Tome el sistema de facturación con clusters Linux
Una descripción detallada del uso del comando strace en Linux
Linux modifica el bloqueo de asignación del teclado a ctrl
Visualización del método de memoria utilizado por un programa en Linux
XP instalación manual del protocolo IPv6
¿Cómo hace el PC portátil HP del sistema Winxp para hacer retroceder el controlador?
Cómo ver los archivos ocultos en el sistema Windows8
Win10 cómo usar la marca de agua Win10 al tutorial de marca de agua
¿Cómo resolver la ocupación de "espacio de nombres" de la política de grupo de Win10?
¿Cómo hacer que mi cuerda del mundo? ¿Cuál es el uso de mi cuerda del mundo
El mouse de escritorio remoto QQ bajo Win7 a menudo hace clic en inexacto cómo hacerlo
Cómo crear una tarjeta de red virtual en Windows 8
Tutorial de instalación de archivos de juegos de imágenes de unidades virtuales
Cómo ver la carpeta correspondiente de la papelera de reciclaje en Windows 7