嵌入式系統項目報告_第1頁
嵌入式系統項目報告_第2頁
嵌入式系統項目報告_第3頁
嵌入式系統項目報告_第4頁
嵌入式系統項目報告_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式系統項目報告項目名稱: 基于 DM3730的Android系統啟動過程分析和 Logo移植i1. 項目開發目的本次項目研究和開發的主要目的如下:(1) 基于DM3730處理器研究Android系統的啟動過程及其主要流程;(2) 基于Android系統的啟動流程init進程深入理解。(3) 移植Android系統啟動過程中的Logo和相關動畫;(4) 修改Android系統的指定桌面,讓系統啟動后直接跳入自己的開發 的應用程序。2. 項目開發內容本次項目需要完成的主要內容有如下幾點:(1) 在Ubuntu11.04上下載Android專用源碼,完成 Android系統的軟 件開發環境的搭建

2、;(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集成開發環境CCS5.14. 項目開發流程4.1項目開發前期準備4.1.1 Andr

3、oid源碼下載和編譯本項目是在Ubuntu宿主機上完成Android源碼的下載和編譯。在此之前 需要完成以下工作,主要包括各種Android開發所需的插件,編譯時所需的基礎庫以及開發調試的minicom終端等。sudo add-apt-repository "deb lucid partner" sudo add-apt-repository "deb-src lucid partner"sudo apt-get updatesudo apt-get install git-core gnupg sun-java6-jdk flex bison gper

4、f libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage expectsudo update-java-alternatives -s java-6-sun下載Android源碼的過程和命令:repo init -u git://rowboat/manifest.git -m init -ugit://rowboat/manifest.git -m TI-And

5、roid-ICS-4.0.3-DevKit-3.0.0.xml repo sync./.repo/repo/repo sync -local-onlyAndroid源碼的編譯:包括環境變量的設定,x-loader、u-boot、Linux Kernel 以及Android文件系統。環境變量:exportPATH=source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATHx-loader 編譯:make CROSS_COMPILE=arm-eabi- distcleanmake CROSS_COMPILE=arm-eabi- omap

6、3evm_configmake CROSS_COMPILE=arm-eabi-u-boot 編譯:make CROSS_COMPILE=arm-eabi- distcleanmake CROSS_COMPILE=arm-eabi- omap3_evm_configmake CROSS_COMPILE=arm-eabi-Linux Kernel 編譯:make ARCH=arm CROSS_COMPILE=arm-eabi- distcleanmake ARCH=armCROSS_COMPILE=arm-eabi-omap3_evm_android_defconfigAndroid文件系統編譯:

7、make TARGET_PRODUCT=omap3evm OMAPES=5.x -j8整個系統編譯過程約3個小時左右,占用空間達12G,因此對PC機的 要求較高。Android文件系統制作:cd /home/gzz/DM3730/source/out/target/product/omap3evmcp -r root/* android_rootfs/cp -r system android_rootfs././././build/tools/mktarball.sh./././host/linux-x86/bin/fs_get_statsandroid_rootfs . rootfs roo

8、tfs.tar.bz2到此為止,整個Android系統的各個部分都編譯和制作完成。4.1.2 EVM板硬件環境的搭建這里說的硬件開發環境的搭建,主要是指將上述編譯好的 Android系統 所需的xloader、u-boot、Linux kernel和文件系統鏡像通過tftp協議下載到 Linux 的 NandFlash 上去。使用如下命令進行鏡像文件的燒錄:OMAP3_EVM # tftp 0x80000000 MLOOMAP3_EVM # nand erase 0x0 0x50000OMAP3_EVM # nandecc hw 2OMAP3_EVM # nand write 0x800000

9、00 0x0 0x50000通過以上主要內容,順利完成項目開發所需的軟硬件開發環境的搭建, 為后續項目的順利進行打下了良好的基礎。44.2 Android啟動init進程和init.rc文件的解析Android中的內核啟動后,kernel會啟動第一個用戶級別的進程:init, 它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始 運行,并已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一 個用戶級別的進程,完成系統的引導。init始終是第一個進程,位丁 /sbin/init 下面。而init.rc是init進程啟動讀取的第一個文件,該文件時一個配置 Android 系統所

10、需要啟動的服務和相關Android應用程序最初始化的配置。因為它與Android啟動的界面有直接的聯系,所以為了項目的順利進行, 有必要先對其進行理解和熟悉。分析init進程需要結合init.rc進行,在這里主要通過分析部分代碼,做 合理的解釋。Init進程的源代碼位丁 Android源碼的system/core/init/init.c下 面,由丁代碼過丁龐大這里不在粘貼。1. uevent 進程if (!strcmp(basename(argv0), "ueventd")return ueventd_main(argc, argv);這個函數是取出 argv中的第一個參數

11、,比如 /sbin/ueventd ,貝U basename 為 ueventd 。 android系統第一次啟動的進程名init,所以該函數ueventd_main 不執行,該函數的真正執行在 init啟動service ueventd /sbin/ueventd 后,fork出一個子進程, execve啟動/sbin/ueventd 后,實際上該函數是對 init的符合鏈接,也就是 ueventd 進 程執行起來后執行的代碼還是init.c中的main,因此不同的進程名會去執行相同的main函數。ueventd_main函數的主要功能:在Linux系統中現在都使用 uevent機制來管理設

12、備的 熱插拔事件,給用戶空間權利來完成一些設備文件節點的創建。這種機制是建立 在socket的通信機制上,用戶空間和內核驅動進行交互,詳細的機制沒有去了解過。是linux2.6的版本中常用的機制。比如驅動出現device_create等時,會向用戶空間報告一個uevent事件,用戶空間由uevent進程解析后去創建設備節點。2.init.rc的解析INFO("reading config filen");init_parse_config_file("/init.rc");init.rc是一個配置文件,內部有許多的語言規則,所有語言會在init_pars

13、e_config_file中進行解析。調用流程如下init_parse_config_file >read_file >parse_config.parse_config (源代碼略)。通過對這個文件的解析,會啟動 Android的應用程序,使得 Android進入Java的世界54.3 Android啟動Log。和動畫移植在這里主要對Android系統的3個畫面進行移植,一是 Linux內核在啟 動加載Frambuffer幀緩沖驅動時會調用一個函數完成Linux的Logo圖標的顯示。二是Android的第一個init用戶進程啟動會調用函數完成一個圖片的 顯示。三是 Android

14、系統中Java應用程序啟動時顯示出來的動畫效果 bootanimation 。4.3.1 Android啟動第一個 Logo圖標移植Android系統是基丁 Linux內核設計而成的,Linux下使用幀緩沖 (Framebuffer)的概念來表示一個顯示接口,通俗理解就表示一塊 LCD。幀 緩沖區的相關驅動在內核啟動時調用fbmem_init,在該函數中主要完成使用register_chrdev來注冊了一個名稱為fb的字符設備,最后調用函數class_create 在/sys/class目錄下創建了一個graphics目錄等。同樣的驅動加載中會調用硬 件平臺相關LCD的驅動初始化函數omapf

15、b_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函數準備需要顯示的 Log。數據源,在 fbcon_switch 使用 fb_show_logo 來顯示 Logo。本項目中需要將一張Jpg的圖片作為Logo樣

16、式的圖標顯示在LCD上面。 實現的步驟如下:1. 為了能讓這部分的 Logo圖標能夠正常顯示,需要在編譯時對.config 文件添加一定的配置:CONFIG_FRAMEBUFFER_CONSOLECONFIG_LOGOCONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY完成這些配置之后的Logo才可以正常顯示,否則內核在啟動驅動加載 時,顯示Logo圖標的函數不會執行相關的操作。2. jpg圖標的格式轉換。Linux啟動圖標格式不直接支持jpg格式,主要支持ppm、pbm格式的圖 像文件,因此需要先將圖像進行適當的轉換:1)使用gimp image軟件隨意修改圖片

17、的像素大小2) 使用終端命令完成 convert xxx.jpg xxx.png3) 使用如下命令完成最終的轉換(被轉換的文件必須是png格式)# pngtopnm xxx.png > xxx.pnm# pnmquant 224 xxx.pnm > xxx224.pnm最終生成一張xxxx224.pnm格式的圖像文件。完成圖片的準備工作后,需要修改部分Linux內核的源碼,具體的操作如下進行:a. 對Makefile文件做一定的修改添加如下內容:obj-$(CONFIG_LOGO_ICS_CLUT224) +=logo_ics_clut224.b. 對logo.c等源文件做一定的修

18、改添加如下內容:#ifdef CONFIG_LOGO_ICS_CLUT224logo = &logo_ics_clut224; /gzzprintk("depth=%d,logo=logo_ics_clut224n”,depth);/by gzz#endifc. 修改部分代碼讓圖片顯示在 LCD在正中問主要修改部分在fb_show_logo_line,這個函數實現Logo圖標的完全顯 示。image.dx = 0;image.dy = y;image.dx = (info->var.xres/2) -(logo->width/2);image.dy = (info

19、->var.yres/2) -(logo->height/2); /by gzzimage.width = logo->width;/140image.height = logo->height;/153在這個函數中,要顯示的圖像信息都保存在里image結構體中,同時Logo 圖像顯示的右上角放在image.dx,image.d焰個坐標上。這里可以通過修改這 對坐標值,完成位置的修改。比如這里配置的是顯示在LCD(480*640)的正中 問。通過以上a,b.c三個步驟可以實現將任意一張圖片作為Logo圖像顯示在自己的LCD上,給出一個良好的用戶效果。74.3.2 And

20、roid啟動第二個圖標移植第二個圖標的顯示主要和init進程有關系。在init進程中會有一個 console_init_action函數來完成這個圖標的顯示,這里直接給出部分代碼來解 析如下:static int console_init_action(int nargs, char *args)(int fd;char tmpPROP_VALUE_MAX;if (console0) snprintf(tmp, sizeof(tmp), "/dev/%s", console);console_name = strdup(tmp);fd = open(console_name

21、, O_RDWR);if (fd >= 0)have_console = 1;close(fd);if( load_565rle_image(INIT_IMAGE_FILE) ) fd = open("/dev/tty0”, O_WRONLY);if (fd >= 0) const char *msg;msg = "n""n""n""n""n""n""n" / console is 40 cols x 30 lines"n&

22、quot;"n""n""n""n""n""n""A N D R O I D "write(fd, msg, strlen(msg);close(fd);return 0;8a初始化控制臺。init進程在啟動的時候,會解析內核的啟動參數(保存 在文件/proc/cmdline中)。如果發現內核的啟動參數中包含有了一個名稱為 “androidboot.consoie勺屬性,那么 就會將這個屆性 的值保存在字符數組 console中。這樣我們就可以通過設備文件

23、/dev/<console球訪問系統的控制 臺。如果內核的啟動參數沒有包含名稱為“androidboot.consoie勺屬性,那么默認就通過設備文件/dev/console來訪問系統的控制臺。如果能夠成功地打開 設備文件/dev/<console城者/dev/console,那么就說明系統支持訪問控制臺, 因此,全局變量have_console6勺就會被設置為1。b. 顯示第二個開機畫面。顯示第二個開機畫面是通過調用函數 load_565rle_image來實現的。在調用函數load_565rle_image的時候,指定的 開機畫面文件為INIT_IMAGE_FILE。INIT_

24、IMAGE_FILE 是一個宏,定義在 system/core/init/init.h 文件中,如下所示:#define INIT_IMAGE_FILE "/initlogo.rle"圖像文件initlogo.rle保存的第二個開機畫面的圖像格式是565rle的。rle的全稱是run-length encoding,翻譯為游程編碼或者行程長度編碼,它可以使 用4個字節來描述一個連續的具有相同顏色值的序歹0。在 rle565格式,前面 2個字節中用來描述序列的個數,而后面2個字節用來描述一個具體的顏色, 其中,顏色的RGB值分別占5位、6位和5位。c. 制作initlogo.

25、rle文件。準備一張png格式的文件,使用Ubuntu自帶的 圖片轉換工具執行如下命令:convert -depth 8 android_logo.png rgb:android_logo.raw使用 android編譯后的 rgb2565工具,在 android/out/host/linux-x86/bin 目 錄下(android為當前源碼所在目錄),轉換命令如下:rgb2565 -rle < android_logo.raw > initlogo.rle 0通過以上步驟就完成了代碼的移植和圖片的制作,最后只需要將 initlogo.rle文件拷貝到Android的文件系統下面

26、,重新啟動就可以看到圖片 的正常顯示。4.3.3 Android啟動第三個動畫移植考慮到第三個啟動的動畫位于 Android的Java層,因此代碼量相當龐大, 因此只寫如何替換啟動動畫來實現我們預期的效果。第三個開機畫面是由應用程序bootanimation來負責顯示的。應用程序bootanimation在啟動腳本init.rc中被配置成了一個服務,如下所示:.service bootanim /system/bin/bootanimationuser graphicsgroup graphicsdisabledoneshot應用程序bootanimation的用戶和用戶組名稱分別被設置為gr

27、aphics注意,用來啟動應用程序bootanimation的服務是disable的,即init進程在啟 動的時候,不會主動將應用程序bootanimation啟動起來。當SurfaceFlinger服務啟動的時候,它會通過修改系統屆性ctl.start的值來通知init進程啟動應 用程序bootanimation,以便可以顯示第三個開機畫面, 而當System進程將系 統中的關鍵服務都啟動起來之后,ActivityManagerService服務就會通知 SurfaceFlinger服務來修改系統屆性ctl.stop的值,以便可以通知init進程停止 執行應用程序bootanimation,

28、即停止顯示第三個開機畫面。Android的所有版本都可以添加一個bootanimation.zip文件。內容包括part文件夾 和desc.txt。前者的文件夾下面存放的是連續的png格式文件,后者desc.txt里面是播放信息設置,其內容和格式如下: 480 720 15 p 1 0 part1 p 0 0 part2其中480 800是指顯示的分辨率寬和高,15是圖像播放的幀數。p后面 的數字分別指播放次數 0和播放時間。Android系統啟動時會文件系統如下目錄查找:#defineUSER_BOOTANIMATION_FILE "/data/local/bootanimatio

29、n.zip" #defineSYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"只需要將制作好的動畫文件放到指定的目錄即可實現自己設計的美觀 的動畫以替換默認的開機畫面。到此為止,完成項目所需完成的主要內容:移植完成了三個動畫來替換 系統自帶的圖片,使得產品可以實現更加友好的用戶界面,提高產品的銷量。4.3.4 Android桌面移植這部分的內容主要是完成 Android系統啟動桌面進程的移植,目的是講 這個默認的桌面進程修改為自己所設計的應用進程,使得用戶在使用Android終端設備是可以直接進入自行設計的應用操作界面。既然是移植桌面系統,那么需要修改的就是桌面的源碼,閱讀 Android 系統龐大的源碼,可以發現Android源碼的Home應用程序就是Launcher進 程。Android系統中的應用程序安裝好了以后,SystemServerffl件接下來就要 通過 ActivityManagerService 來啟動 Home 應用程序 Launcher 了,Launcher 在啟動的時候便會通過PackageManagerServicJE系統中已經安裝好的應用程 序以快捷圖標的形式展示在桌面上,這樣用戶就可以使用這些應用程序了。既然作為Home應用程序有這樣的優先級

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論