Android系统级深入开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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)通过名称相匹配。