《嵌入式系统项目报告.doc》由会员分享,可在线阅读,更多相关《嵌入式系统项目报告.doc(14页珍藏版)》请在金锄头文库上搜索。
1、嵌入式系统工程报告工程名称:基于 DM3730 的 Android 系统启动过程分析和 Logo 移植101. 工程开发目的本次工程争辩和开发的主要目的如下:(1) 基于 DM3730 处理器争辩 Android 系统的启动过程及其主要流程;(2) 基于 Android 系统的启动流程 init 进程深入理解。(3) 移植 Android 系统启动过程中的 Logo 和相关动画;(4) 修改 Android 系统的指定桌面,让系统启动后直接跳入自己的开发的应用程序。2. 工程开发内容本次工程需要完成的主要内容有如下几点:1在 Ubuntu11.04 上下载 Android 专用源码,完成 An
2、droid 系统的软件开发环境的搭建;(2) 在 EVM37x 开发板上搭建 Android 系统的硬件开发环境;(3) Android 系统的 init 进程和 init.rc 文件简洁解析;(4) Android 系统启动的动画和 Logo 的修改;(5) Android 系统桌面源码的修改,实现直接调入自己的应用程序。3. 工程开发软硬件设备(1) 硬件平台:TI 高性能处理器 DM3730,TI 核心开发板 EM/AM37xx EVM 板(2) 操作系统:Android ICS4.0.3(3) PC 端的开发平台:Ubuntu11.04(4) 开发所需的 IDE :TI 集成开发环境
3、CCS5.14. 工程开发流程4.1 工程开发前期预备4.1.1 Android 源码下载和编译本工程是在 Ubuntu 宿主机上完成 Android 源码的下载和编译。在此之前需要完成以下工作,主要包括各种 Android 开发所需的插件,编译时所需的根底库以及开发调试的 minicom 终端等。sudo add-apt-repository “deb :/archive.canonical / lucid partner“ sudo add-apt-repository “deb-src :/archive.canonical /ubuntu lucid partner“sudo apt-
4、get updatesudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-devzlib1g-dev minicom tftpd uboot-mkimage expect sudo update-java-alternatives -s java-6-sunrepo init -u git:/gitorious.org/rowboat/manifest.git -m
5、 init -u git:/gitorious.org/rowboat/manifest.git -m TI-Android-ICS-4.0.3-DevKit-3.0.0.xmlrepo sync./.repo/repo/repo sync local-only下载 Android 源码的过程和命令:Android 源码的编译:包括环境变量的设定,x-loader、u-boot、Linux KernelexportPATH=source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH以及 Android 文件系统。环境变量:x-loa
6、der 编译:make CROSS_COMPILE=arm-eabi- distcleanmake CROSS_COMPILE=arm-eabi- omap3evm_config make CROSS_COMPILE=arm-eabi-make CROSS_COMPILE=arm-eabi- distcleanmake CROSS_COMPILE=arm-eabi- omap3_evm_config make CROSS_COMPILE=arm-eabi-u-boot 编译:make ARCH=arm CROSS_COMPILE=arm-eabi- distclean make ARCH=ar
7、mCROSS_COMPILE=arm-eabi-omap3_evm_android_defconfigLinux Kernel 编译:make TARGET_PRODUCT=omap3evm OMAPES=5.x -j8Android 文件系统编译:整个系统编译过程约 3 个小时左右,占用空间达 12G,因此对 PC 机的要求较高。cd /home/gzz/DM3730/source/out/target/product/omap3evm cp -r root/* android_rootfs/cp -r system android_rootfs././././build/tools/mkt
8、arball.sh./././host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2Android 文件系统制作:到此为止,整个 Android 系统的各个局部都编译和制作完成。4.1.2 EVM 板硬件环境的搭建这里说的硬件开发环境的搭建,主要是指将上述编译好的 Android 系统所需的 xloader、u-boot、Linux kernel 和文件系统镜像通过 tftp 协议下载到Linux 的 NandFlash 上去。使用如下命令进展镜像文件的烧录:OMAP3_EVM # tftp 0x800000
9、00 MLOOMAP3_EVM # nand erase 0x0 0x50000 OMAP3_EVM # nandecc hw 2OMAP3_EVM # nand write 0x80000000 0x0 0x50000通过以上主要内容,顺当完成工程开发所需的软硬件开发环境的搭建, 为后续工程的顺当进展打下了良好的根底。4.2 Android 启动 init进程和 init.rc文件的解析Android 中的内核启动后,kernel 会启动第一个用户级别的进程: init, 它是一个由内核启动的用户级进程。内核自行启动已经被载入内存,开头运行,并已初始化全部的设备驱动程序和数据构造等之后,就通
10、过启动一个用户级别的进程,完成系统的引导。init 始终是第一个进程,位于/sbin/init 下面。而 init.rc是 init进程启动读取的第一个文件,该文件时一个配置 Android 系统所需要启动的效劳和相关 Android 应用程序最初始化的配置。由于它与 Android 启动的界面有直接的联系,所以为了工程的顺当进展, 有必要先对其进展理解和生疏。分析 init 进程需要结合 init.rc 进展,在这里主要通过分析局部代码,做合理的解释。Init 进程的源代码位于 Android 源码的 system/core/init/init.c 下面,由于代码过于浩大这里不在粘贴。1.
11、uevent 进程if (!strcmp(basename(argv0), “ueventd“) return ueventd_main(argc, argv);这个函数是取出 argv 中的第一个参数,比方/sbin/ueventd,则basename 为ueventd。android 系统第一次启动的进程名init,所以该函数ueventd_main 不执行,该函数的真正执行在 init 启动service ueventd /sbin/ueventd 后,fork 出一个子进程, execve 启动/sbin/ueventd 后,实际上该函数是对init 的符合链接,也就是ueventd
12、进程执行起来后执行的代码还是init.c 中的main,因此不同的进程名会去执行一样的 main函数。ueventd_main 函数的主要功能:在 Linux 系统中现在都使用 uevent 机制来治理设备的 热插拔大事,给用户空间权利来完成一些设备文件节点的创立。这种机制是建立在 socket 的通信机制上,用户空间和内核驱动进展交互,具体的机制没有去了解过。是 linux2.6 的版本中常用的机制。比方驱动消灭 device_create 等时,会向用户空间报告一个 uevent 大事,用户空间由uevent 进程解析后去创立设备节点。2.init.rc 的解析INFO(“reading
13、config filen“); init_parse_config_file(“/init.rc“);init.rc 是一个配置文件,内部有很多的语言规章,全部语言会在 init_parse_config_file中进展解析。调用流程如下 init_parse_config_fileread_fileparse_config. parse_config源代码略。通过对这个文件的解析,会启动 Android 的应用程序,使得 Android 进入 Java 的世界。4.3 Android 启动 Logo 和动画移植在这里主要对 Android 系统的 3 个画面进展移植,一是 Linux 内核在
14、启动加载 Frambuffer 帧缓冲驱动时会调用一个函数完成 Linux 的 Logo 图标的显示。二是 Android 的第一个 init 用户进程启动会调用函数完成一个图片的显示。三是 Android 系统中 Java 应用程 序启动时显 示出来的 动画效果bootanimation。4.3.1 Android 启动第一个 Logo 图标移植Android 系统是基于 Linux 内核设计而成的, Linux 下使用帧 缓冲Framebuffer)的概念来表示一个显示接口,通俗理解就表示一块 LCD。帧缓冲区的相关驱动在内核启动时调用 fbmem_init,在该函数中主要完成使用regi
15、ster_chrdev来注册了一个名称为fb的字符设备,最终调用函数 class_create 在/sys/class 名目下创立了一个 graphics 名目等。同样的驱动加载中会调用硬件平台相关 LCD 的驱动初始化函数 omapfb_init。这个函数会针对对个 fb,完成相关节点的创立在 /dev/graphics/fb0,fb1.等。主设备号为 29 一旦完成创立,会调用 fb_notifier_call_chain,函数通知把握 fb 的 console 理解为把握台).每一个 fb 都会对应于一个 console 来把握。而 Logo 的显示启动,就是在 fbcon_init 和 fbcon_switch 中来完成的。在fbcon_init 中使用 fbcon_prepare_logo 函数预备需要显示的 Logo 数据源,在fbcon_switch 使用 fb_show_logo 来显示 Logo。本工程中需要将一张Jpg的图片作为Logo 样式的图标显示在LCD 上面。实现的步骤如下:1. 为了能让这局部的 Logo 图标能够正常显示,需要在编译时对.config文件