5.2 MSM体系结构的移植
MSM处理器的Linux的移植部分,主要内容在以下目录中:
arch/arm/mach-msm/ :MSM平台部分移植的核心部分。
其中包含了qdsp5和qdsp6这两个目录,它们分别是5代DSP和6代DSP在应用处理器端的相关内核代码。
arch/arm/mach-msm/include/mach/为MSM平台头文件的目录,可以在内核空间中被其他部分引用。
arch/arm/mach-msm/目录中的Makefile,其主要内容如下所示:
obj-y += io.o irq.o timer.o dma.o memory.o obj-$(CONFIG_ARCH_MSM_SCORPION) += sirc.o obj-y += devices.o obj-y += proc_comm.o obj-y += vreg.o obj-y += pmic.o obj-$(CONFIG_ARCH_MSM_ARM11) += acpuclock-arm11.o idle.o obj-$(CONFIG_ARCH_MSM_SCORPION) += acpuclock-scorpion.o idle-v7.o obj-$(CONFIG_ARCH_MSM_SCORPION) += arch-init-scorpion.o obj-y += clock.o obj-y += gpio.o generic_gpio.o obj-y += nand_partitions.o obj-$(CONFIG_MSM_FIQ_SUPPORT) += fiq_glue.o obj-$(CONFIG_MACH_TROUT) += board-trout-rfkill.o obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o obj-$(CONFIG_MSM_SMD) += smd_tty.o smd_qmi.o obj-$(CONFIG_MSM_SMD) += last_radio_log.o obj-$(CONFIG_MSM_ONCRPCROUTER) += smd_rpcrouter.o obj-$(CONFIG_MSM_ONCRPCROUTER) += smd_rpcrouter_device.o obj-$(CONFIG_MSM_ONCRPCROUTER) += smd_rpcrouter_servers.o obj-$(CONFIG_MSM_RPCSERVERS) += rpc_server_dog_keepalive.o obj-$(CONFIG_MSM_RPCSERVERS) += rpc_server_time_remote.o obj-$(CONFIG_MSM_ADSP) += qdsp5/ obj-$(CONFIG_MSM_QDSP6) += qdsp6/ obj-$(CONFIG_MSM_HW3D) += hw3d.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_CPU_FREQ) += cpufreq.o # 不同板定义的相关内容,省略
MSM处理器既有ARM11(属于ARMv6)体系结构的MSM7k,也有SCORPION体系结构(属于ARMv7)的QSD8k,因此其不同的方面在Makefile中对此做出了区分。在为mahimahi板构建的系统中,CONFIG_ARCH_MSM_SCORPION,CONFIG_MSM_QDSP6, CONFIG_MACH_SWORDFISH和CONFIG_MACH_MAHIMAHI等几个宏均为真。
board-mahimahi.c是MSM的机器实现的核心文件,机器类型的定义如下所示:
MACHINE_START(MAHIMAHI, "mahimahi") #ifdef CONFIG_MSM_DEBUG_UART .phys_io = MSM_DEBUG_UART_PHYS, .io_pg_offst = ((MSM_DEBUG_UART_BASE) >> 18) & 0xfffc, #endif .boot_params = 0x20000100, .fixup = mahimahi_fixup, .map_io = mahimahi_map_io, .init_irq = msm_init_irq, .init_machine= mahimahi_init, .timer = &msm_timer, MACHINE_END
在MACHINE_START和MACHINE_END之间的内容为机器的信息,实际上是结构struct machine_desc。这里赋值了影射IO、初始化irq、初始化机器等函数指针。mahimahi_map_io,mahimahi init_irq,mahimahi_init都是在同文件中实现的初始化函数。msm_timer是为当前机器实现的定时器。
在board-mahimahi.c中还定义了各种平台设备(platform_device)。例如:RAM控制台平台设备的内容如下所示:
static struct resource ram_console_resources[] = { { .start = MSM_RAM_CONSOLE_BASE, .end= MSM_RAM_CONSOLE_BASE + MSM_RAM_CONSOLE_SIZE - 1, .flags = IORESOURCE_MEM, }, }; static struct platform_device ram_console_device = { .name = "ram_console", .id = -1, .num_resources = ARRAY_SIZE(ram_console_resources), .resource = ram_console_resources, };
这些平台设备(platform_device)和各个驱动程序程序中的平台驱动(platform_driver)通过名称相匹配。