11.5 I/O内存静态映射
在将Linux移植到目标电路板的过程中,有得会建立外围设备I/O内存物理地址到虚拟地址的静态映射,这个映射通过在与电路板对应的map_desc结构体数组中添加新的成员来完成,map_desc结构体的定义:
arch/arm/include/asm/mach/map.h
struct map_desc {
unsigned long virtual; /* 虚拟地址 */
unsigned long pfn; /* __phys_to_pfn(phy_addr) */
unsigned long length; /* 大小 */
unsigned int type; /* 类型 */
};
代码清单11.11 在电路板文件中增加物理地址到虚拟地址的静态映射
static struct map_desc ixdp2x01_io_desc _ _initdata = {
.virtual = IXDP2X01_VIRT_CPLD_BASE,
.pfn = _ _phys_to_pfn(IXDP2X01_PHYS_CPLD_BASE), /*把物理地址转换为页帧号*/
.length = IXDP2X01_CPLD_REGION_SIZE,
.type = MT_DEVICE
};
static void _ _init ixdp2x01_map_io(void)
{
ixp2000_map_io();
iotable_init(&ixdp2x01_io_desc, 1); //建立页映射
}
将Linux操作系统移植到特定平台上,MACHINE_START(或者DT_MACHINE_START)、MACHINE_END宏之间的定义针对特定电路板而设计,其中的map_io()成员函数完成I/O内存的静态映射。
备注:
在一个已经移植好操作系统的内核中,驱动工程师可以对非常规内存区域的I/O内存(外设控制器寄存器、MCU内部集成的外设控制器寄存器等)依照电路板的资源使用情况添加到map_desc数组中,但目前该方法不值得推荐。