Android板级支持与硬件相关子系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 goldfish平台的内核和驱动

↘3.3.1 goldfish平台和内核概述

goldfish是一种虚拟的ARM处理器,在Android的仿真环境中使用。在Linux的内核中,goldfish作为ARM体系结构的一种“机器”。goldfish的内核基于标准的Linux内容,其中增加了Android的专用驱动和组件,goldfish平台板级的移植内容,goldfish中各种模拟硬件设备的驱动程序。

使用git下载goldfish内核的方法如下所示:

    $ git clone https://android.googlesource.com/kernel/goldfish

目前使用的工程名称为kernel/goldfish,另外还有一个名称为kernel/common的工程,表示通用内核,当中的内容有一部分也是类似的。

进入目录后,使用一个稳定版本的方法如下所示:

    $ cd goldfish
    $ git branch -r
      origin/HEAD -> origin/master
      origin/android-goldfish-2.6.29
      origin/android-goldfish-3.4
      origin/linux-goldfish-3.0-wip
      origin/master
    $ git checkout origin/android-goldfish-2.6.29

goldfish平台有两个稳定的版本,分别基于开源的Linux2.6.29和Linux3.4,可以使用不同的分支进行选择。Android平台后续版本的发展实际上和内核版本的关系不大,因此各个版本的内容可以通用。

在goldfish的Linux源代码的根目录中,配置和编译goldfish内核的过程如下所示:

    $ make ARCH=arm goldfish_defconfig .config
    $ make ARCH=arm CROSS_COMPILE=<path>/arm-eabi-

设置和执行过程中,使用goldfish_defconfig作为配置文件,在CROSS_COMPILE=中指定交叉编译工具的路径。

goldfish处理器的编译结果,最后的内容如下所示:

    LD      vmlinux
    SYSMAP  System.map
    SYSMAP  .tmp_System.map
    OBJCOPY arch/arm/boot/Image
    Kernel: arch/arm/boot/Image is ready
    AS      arch/arm/boot/compressed/head.o
    GZIP    arch/arm/boot/compressed/piggy.gz
    AS      arch/arm/boot/compressed/piggy.o
    CC      arch/arm/boot/compressed/misc.o
    LD      arch/arm/boot/compressed/vmlinux
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready

goldfish与ARM平台的其他Linux的编译结果类似,但是没有内核模块(*.ko)。vmlinux是Linux进行编译和连接之后生成的Elf格式的文件,Image是未经过压缩的二进制文件,piggy是一个解压缩程序,zImage是解压缩程序和压缩内核的组合。

在Android源代码的根目录中vmlinux和zImage分别对应Android代码prebuilt中的预编译的arm内核。在仿真器环境中,使用zImage,可以替换prebuilt中的prebuilt/android-arm/目录中的kernel-qemu文件,即可以使用自己编译出来的Linux内核。

↘3.3.2 goldfish体系结构移植

goldfish处理器有ARMv5和ARMv7两个版本,它们分别使用arch/arm/configs/目录中的goldfish_defconfig和goldfish_armv7_defconfig作为其配置文件。

内核配置文件goldfish_defconfig的一些片段如下所示:

    CONFIG_ARM=y
    #
    # System Type
    #
    CONFIG_ARCH_GOLDFISH=y
    #
    # Goldfish Options
    #
    CONFIG_MACH_GOLDFISH=y
    # CONFIG_MACH_GOLDFISH_ARMV7 is not set
    CONFIG_CPU_ARM926T=y

由于goldfish虚拟处理器属于ARM体系结构,因此配置宏CONFIG_ARM需要被使能,配置宏CONFIG_ARCH_GOLDFISH和CONFIG_MACH_GOLDFISH是goldfish处理器这类机器使用的配置宏。CONFIG_CPU_ARM926T表示的实际上是ARMv5体系结构。

goldfish_armv7_defconfig当中使能的宏是CONFIG_MACH_GOLDFISH_ARMV7,没有CONFIG_CPU_ARM926T,但使能了CONFIG_CPU_V7、CONFIG_CPU_VFP等几个与体系结构相关的宏。其他的配置部分,二者则是完全相同的。

配置文件中的几个与Android系统相关的宏如下所示:

    #
    # Android
    #
    CONFIG_ANDROID=y
    CONFIG_ANDROID_BINDER_IPC=y               #  Binder IPC驱动程序
    CONFIG_ANDROID_LOGGER=y                   #  Log记录器驱动程序
    # CONFIG_ANDROID_RAM_CONSOLE is not set   #  Ram控制台
    CONFIG_ANDROID_TIMED_OUTPUT=y             #  定时输出驱动程序框架
    CONFIG_ANDROID_LOW_MEMORY_KILLER=y        #  低内存杀死器
    CONFIG_ANDROID_PMEM=y                     #  物理内存驱动程序
    CONFIG_ASHMEM=y                           #  匿名共享内存驱动程序
    CONFIG_RTC_INTF_ALARM=y
    CONFIG_HAS_WAKELOCK=y                     #  电源管理相关的部分Wakelock和earlysuspend
    CONFIG_HAS_EARLYSUSPEND=y
    CONFIG_WAKELOCK=y
    CONFIG_WAKELOCK_STAT=y
    CONFIG_USER_WAKELOCK=y
    CONFIG_EARLYSUSPEND=y

配置文件中,一些用于配置驱动程序的宏如下所示:

    CONFIG_MTD_GOLDFISH_NAND=y
    CONFIG_KEYBOARD_GOLDFISH_EVENTS=y
    CONFIG_GOLDFISH_TTY=y
    CONFIG_BATTERY_GOLDFISH=y
    CONFIG_FB_GOLDFISH=y
    CONFIG_MMC_GOLDFISH=y
    CONFIG_RTC_DRV_GOLDFISH=y

这些驱动程序实际上是goldfish系统虚拟设备的驱动程序,其中的处理器也是虚拟的,最终由仿真器环境来实现。

goldfish处理器是ARM体系结构的一种“机器”,其代码在arch/arm/mach-goldfish/目录中,其中主要的内容如下所示。

·board-goldfish.c:板级主文件。

·timer.c:定时器部分的实现。

·pm.c:电源管理部分的实现。

·include/mach//:相关的头文件。

arch/arm/mach-goldfish/目录中的Kconfig是goldfish的主配置文件,内容如下所示:

    if ARCH_GOLDFISH
    menu "Goldfish Options"
    config MACH_GOLDFISH
      bool "Goldfish (Virtual Platform)"
      select CPU_ARM926T
    config MACH_GOLDFISH_ARMV7
      bool "Goldfish ARMv7 (Virtual Platform)"
      select CPU_V7
            select VFP
            select VFPv3
            select NEON
    endmenu
    endif

当ARCH_GOLDFISH宏被使能的时候,可以选择两种goldfish处理器,一种由MACH_GOLDFISH表示,一种由宏MACH_GOLDFISH_ARMV7表示。前者是一种ARMv5E体系结构的ARM926处理器,后者是ARMv7体系结构的处理器(即Cortex A),使能了VFP和NEON等特性。

arch/arm/mach-goldfish/目录中Makefile的内容如下所示:

    obj-y                                := pdev_bus.o timer.o switch.o audio.o pm.o
    obj-$(CONFIG_MACH_GOLDFISH)          += board-goldfish.o
    obj-$(CONFIG_MACH_GOLDFISH_ARMV7)    += board-goldfish.o

arch/arm/mach-goldfish/board-goldfish.c是goldfish机器实现的核心文件,机器类型的定义如下所示:

    MACHINE_START(GOLDFISH, "Goldfish")
      .phys_io      = IO_START,
      .io_pg_offst  = ((IO_BASE) >> l8) & 0xfffc,
      .boot_params  = 0x00000l00,
      .map_io       = goldfish_map_io,
      .init_irq     = goldfish_init_irq,
      .init_machine = goldfish_init,
      .timer        = &goldfish_timer,
    MACHINE_END

在MACHINE_START和MACHINE_END之间的内容为机器的信息。这里实现的结构是arch/arm/include/asm/mach/arch.h中定义的struct machine_desc。这里赋值了定时器、物理IO等内容,以及初始化机器、初始化irq、IO映射等函数指针。

在头文件中,hardware.h定义了内存的基地址,irqs.h定义了虚拟中断号。注意:由于goldfish处理器的各部分硬件都是虚拟的,因此其详细的“寄存器地址”在它们各自的驱动实现中定义,而不像实际的硬件使用全局的定义。

pdev_bus.c则是一个特殊的模拟设备注册的文件,它解决的是平台设备和平台驱动的匹配问题。在其内部实现中启用了一个线程(work),在线程循环中自动完成了各个设备的注册(platform_device_register)。

↘3.3.3 goldfish的相关设备驱动

goldfish是虚拟处理器,因此其中的各个设备也是虚拟的,读取虚拟的寄存器地址,并使用虚拟的中断,具体的内容在仿真器的支持环境中实现。这些虚拟设备的驱动程序的实现方式,大都基于Linux标准驱动程序的框架构建。很多虚拟设备使用虚拟的特殊功能寄存器和中断。

1.Framebuffer的驱动程序

goldfish虚拟处理器具有Framebuffer(帧缓冲)的驱动程序。此驱动程序的配置宏为CONFIG_FB_GOLDFISH,相关文件的路径为:drivers/video/goldfishfb.c。

Framebuffer的平台设备和平台驱动的名称是goldfish_fb,在用户空间的设备节点为:/dev/graphics/fb0。此驱动使用RGB565作为颜色空间,虚拟现实的高为实际的高的两倍,支持pan的操作。

2.键盘的驱动程序

goldfish虚拟处理器的输入部分(键盘)的驱动程序是Input驱动当中的Event类型。此驱动程序的配置宏为CONFIG_KEYBOARD_GOLDFISH_EVENTS,相关文件的路径为:drivers/input/keyboard/goldfish_events.c。

输入部分的平台设备和平台驱动的名称是goldfish_events,在用户空间的设备节点为:/dev/input/ event0。此驱动利用仿真器环境从虚拟寄存器中获取主机上的按键,并按照一般的方法传递给系统的其他部分。

3.实时时钟的驱动程序

goldfish虚拟处理器具有实时时钟的驱动程序。此驱动程序的配置宏为CONFIG_RTC_DRV_GOLDFISH,相关文件的路径为:drivers/rtc/rtc-goldfish.c。

实时时钟平台设备和平台驱动的名称是goldfish_rtc,其在用户空间的设备节点为/dev/rtc0,此节点一般不使用。仿真器的虚拟环境触发中断,并填充相关的寄存器,在此驱动程序中取得信息,并作为实时时钟(RTC)的数据。

4.TTY终端的驱动程序

goldfish虚拟处理器具有TTY终端的驱动程序,也就是提供了虚拟串口功能的驱动程序。此驱动程序的配置宏为CONFIG_GOLDFISH_TTY,相关文件的路径为:drivers/char/goldfish_tty.c

TTY平台设备和平台驱动的名称是goldfish_tty,在用户空间有3个设备,节点分别为/dev/ttyS0、/dev/ttyS1和/dev/ttyS2。串口的功能比实际的串口功能要简单得多,进行的是直接对虚拟寄存器的写操作,由仿真器环境根据情况进行处理。

5.NandFlash的驱动程序

goldfish虚拟处理器的NandFlash驱动程序是标准的MTD驱动程序。此驱动程序的配置宏为CONFIG_MTD_GOLDFISH_NAND,相关文件的路径为:drivers/mtd/devices/,其中goldfish_nand.c为实现文件,goldfish_nand_reg.c为虚拟寄存器的定义文件。

NandFlash平台设备和平台驱动的名称是goldfish_nand,并为每个分区构建字符设备和块设备。对于同一个分区,可能有两个字符设备分别用于读/写和只读。此驱动具体的功能均由仿真器环境根据内存的状况来实现。

6.MMC的驱动程序

goldfish虚拟处理器具有的MMC/SD卡的主机驱动程序。此驱动程序的配置宏为CONFIG_MMC_GOLDFISH,相关文件的路径为:drivers/mmc/host/goldfish.c。

MMC平台设备和平台驱动的名称是goldfish_mmc,根据SD卡的情况其中的设备将被识别,仿真器环境的SD卡使用映像文件模拟。

7.电池的驱动程序

goldfish虚拟处理器的电池驱动程序是Power Supply驱动。此驱动程序的配置宏为CONFIG_BATTERY_GOLDFISH,相关文件的路径为:drivers/power/goldfish_battery.c。

电池平台设备和平台驱动的名称是goldfish-battery,对用户空间的接口为sys文件系统。驱动程序中实现了读取属性等几个操作,通过读取虚拟的寄存器得到当前“电池”的信息。

8.音频的驱动程序

goldfish虚拟处理器的音频驱动程序是简易的驱动程序。此驱动程序的配置宏为CONFIG_ARCH_GOLDFISH,相关文件的路径为:drivers/misc/goldfish_audio.c。

音频驱动平台设备和平台驱动的名称是goldfish_audio,其在用户空间的设备节点为/dev/eac,对其进行读/写分别表示录音和放音。在读/写的时候,通过仿真器联系到主机的音频系统,获得声音的输入流和输出流。

9.qemu

QEMU仿真器的部分功能也需要在内核中有一些特殊的“硬件”支持,这些支持也在goldfish处理器的驱动中,两部分功能分别是qemutrace和qemupipe。

qemutrace使用CONFIG_QEMU_TRACE作为配置宏,源代码是drivers/misc/qemutrace/目录中的qemu_trace.c和qemu_trace_sysfs.c。qemutrace平台设备和平台驱动的名称为qemu_trace,它提供给用户空间的接口为Misc设备,设备节点为/dev/qemu_trace,以及sys文件系统的接口/sys/qemu_trace。

qemu_pipe用于为特殊的设备提供非常快速的通信通道,使用CONFIG_QEMU_PIPE作为配置宏,源代码是drivers/misc/qemupipe/目录中的qemu_pipe.c。qemu_pipe平台设备和平台驱动的名称为qemupipe,它提供给用户空间的接口为Misc设备,设备节点为/dev/qemu_pipe。