嵌入式Linux学习笔记—fastboot烧写Android
本系列為本人在自學過程中的學習筆記,如有錯誤歡迎大家指正。
學習資料為訊為ITOP4412開發板。
fastboot燒寫Android
1、主要工具
OTG 接口燒寫方式也叫 fastboot 燒寫方式。
硬件:開發板、OTG線。
軟件:文件夾“USB_fastboot_tool” 工具。
鏡像組合: Uboot 鏡像“u-boot-iTOP-4412.bin” 、 內核鏡像“zImage” 、文件系統“ramdisk-uboot.img”和“system.img”。
文件說明
1.“USB_fastboot_tool”是一個刷機工具,我把它理解為刷機腳本。flashtool不需要解鎖bootload,通常刷寫的是.img鏡像文件。
2.Uboot 鏡像“u-boot-iTOP-4412.bin。uboot,就是bootloader。在嵌入式Linux系統中最先啟動的是uboot。uboot用于啟動后檢測內存,存儲等設備,并且設置處理器等設備的時鐘等。最后引導內核,把zImage內核文件拷貝到內存,并去運行。
3.內核鏡像“zImage” 。驅動都在內核當中,內核負責對各種外設進行驅動初始化,比如SPI、藍牙、以太網等。內核運行到最后掛載文件系統。
4.文件系統“ramdisk-uboot.img”和“system.img”。ramdisk.img,system.img,userdata.img是由Android 源碼編譯后生成的三個鏡像文件。ramdisk.img是根文件系統,system.img包括了主要的包、庫等文件,userdata.img包括了一些用戶數據。
ramdisk根文件系統中包含一些對于啟動android的很重要的文件,比如內核啟動完后加載的第一個進程init、一些重要的配置文件等,總之它控制著整個android的啟動。根據 init.rc,init.goldfish.rc來初始化并裝載系統庫、程序等直到開機完成。
system.img文件是system目錄的一個映像,類似于linux的根文件系統的映像,放著android的應用程序,配置文件,字體等。
2、命令分析
教程如下
進入uboot模式 – 上電,啟動開發板,超級終端中,按“回車”鍵(一上電就按),進入 uboot模式
?分區命令,超級終端中,輸入命令:
– 輸入分區命令“fdisk -c 0”
? 格式化命令,超級終端中輸入命令:
– fatformat mmc 0:1
– ext3format mmc 0:2
– ext3format mmc 0:3
– ext3format mmc 0:4
? 連接命令,超級終端中輸入命令:
– fastboot
運行“platform-tools”文件夾中的文件“cmd.exe”,打開 windows命令行
?燒寫命令,在windows命令行輸入 – 燒寫uboot命令(不建議燒寫,已經有了):
– fastboot.exe flash bootloader u-boot-iTOP-4412.bin
– 燒寫zImage內核命令:
–fastboot.exe flash kernel zImage
– 輸入燒寫ramdisk 命令:
– fastboot.exe flash ramdisk ramdisk-uboot.img
– 輸入燒寫system 文件系統命令:
– fastboot.exe flash system system.img
– 輸入擦除命令:
– fastboot -w
– 輸入重啟開發板命令:
– fastboot reboot
? 輸入重啟命令之后,開發板重啟,超級終端打印啟動信息,第一次 Android啟動需要解壓和安裝一些初始化文件,花費的時間長一點。 這些文件初始化一次之后,再次啟動速度就會快一點。
2.1、格式化命令分析
作用:對eMMC的設備的格式化。
fdisk -c 0
fatformat mmc 0:1
//對mmc 0設備的第一分區格式作fat格式化
ext3format mmc 0:2
ext3format mmc 0:3
ext3format mmc 0:4
//上面三個指令是分別對eMMC的分區2,3,4作ext3格式化。
利用vscode的全局搜索功能搜索fdisk,找到fdisk相關的函數,如下所示
int do_fdisk(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {if ( argc == 3 || argc ==6 ) //判斷參數個數{//判斷參數的第二個參數是否為"-c",如果為"-c"就執行格式化分區命令if ( strcmp(argv[1], "-c") == 0 )return create_mmc_fdisk(argc, argv);//如果為"-p",就打印當前分區信息else if ( strcmp(argv[1], "-p") == 0 )return print_mmc_part_info(argc, argv);}else //如果參數個數不正確,就打印錯誤提示信息,結束{printf("Usage:\nfdisk <-p> <device_num>\n");printf("fdisk <-c> <device_num> [<sys. part size(MB)> <user part size> <cache part size>]\n");}return 0; }當我們輸入fdisk -c 0時,參數個數為3,滿足要求,進入下一層判斷,由于第二個參數為"-c",所以會執行格式化分區命令。分區具體是如何創建的,可參考create_mmc_fdisk函數。
第二個命令是fatformat mmc 0:1,利用vscode的全局搜索功能搜索fatformat,在cmd_fat.c這個文件中找到了一個相關的函數,如下所示
int do_fat_format(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {int dev = 0;int part = 1;char *ep;block_dev_desc_t *dev_desc = NULL;//判斷參數個數是是否正確if (argc < 2) {printf ("usage : fatformat <interface> <dev[:part]>\n");return(0);}//獲取設備區塊號dev = (int)simple_strtoul (argv[2], &ep, 16);//獲取設備號dev_desc = get_dev(argv[1], dev);//如果設備號不存在,則輸出錯誤信息if (dev_desc == NULL) {puts ("\n ** Invalid boot device **\n");return 1;}//初始化設備init_part(dev_desc); //mj fixed the bug//這里需要先去上網了解一下simple_stroul的功能,ep指向":xxx"這樣一個字符串,下面就是判斷":"后面的數字是否滿足要求if (*ep) {if (*ep != ':') {puts ("\n ** Invalid boot device, use 'dev[:part]' **\n");return 1;}part = (int)simple_strtoul(++ep, NULL, 16);if (part > 4 || part <1) {puts ("** Partition Number should be 1 ~ 4 **\n");}}//打印開始格式化提示信息printf("Start format MMC&d partition&d ...\n", dev, part);//開始格式化,如果對具體是如何格式化的感興趣,可以去這個fat_format_device里面看看if (fat_format_device(dev_desc, part) != 0) {printf("Format failure!!!\n");}return 0; }下面的幾個ext3format和fatformat差不多,格式化相關設備號的相關分區。
2.2、燒寫命令分析
教程中燒寫命令摘錄如下
在超級終端界面輸入
fastboot
然后在PC的cmd命令行下輸入fastboot.exe的一系列命令:fastboot.exe flash bootloader u-boot-iTOP-4412.bin
fastboot.exe flash kernel zImage
fastboot.exe flash ramdisk ramdisk-uboot.img
fastboot.exe flash system system.img
fastboot -w
fastboot reboot
這里來看下fastboot命令,用到的燒寫命令為如下高亮部分。
可用命令:
1.update <文件名> 從官方update.zip升級系統.該update.zip必須是官方的
2.flashall ‘flash boot’ +‘flash system’
3.flash <分區名> [ <文件名> ].如:fastboot flash system system.img 將文件寫入分區.文件必須正確.
4.erase <分區名> 清空一個分區.如,fastboot erase system
5.getvar <參數名> 顯示一個啟動參數.如:fastboot getver:version(查看版本號)
6.boot <內核文件> [ <ramdisk文件> ] 將電腦上的內核下載到手機并用該內核啟動系統.
7.flash:raw boot <內核文件> [ <ramdisk文件> ] 創建boot.img并下載到手機啟動系統.
8.devices 列出所有與電腦連接的設備.
9.reboot 正常啟動系統
10.reboot-bootloader 啟動系統到hboot
選項
-w 清空用戶數據分區和緩存分區.
-s <串口號> 指定要操作的設備的串口號
-p <產品名> 指定要操作的設備的產品名.比如hero,bravo,dream…
-c <命令行> 用命令行替換系統的啟動命令行.
補充
當我們反復調試安卓系統的時候重復輸入這些燒錄命令會比較麻煩,我們建立一個腳本用來自動燒錄。
建一個腳本用于燒錄內核和系統鏡像存放在“platform-tools”文件夾中,腳本名稱:auto_fastboot_ALL.bat,腳本內容:
fastboot.exe flash kernel zImage
fastboot.exe flash ramdisk ramdisk-uboot.img
fastboot.exe flash system system.img
fastboot -w
fastboot reboot
以后就可以自動燒錄了。
1.開終端,輸入fastboot
2.雙擊運行腳本 auto_fastboot_ALL.bat
3.等待燒錄完成。
美滋滋
參考
1.https://www.cnblogs.com/YinShijia/p/12018460.html
2.https://blog.csdn.net/MENGHUANBEIKE/article/details/56009674?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158676275519725211944265%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158676275519725211944265&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-blog_SOOPENSEARCH-1
總結
以上是生活随笔為你收集整理的嵌入式Linux学习笔记—fastboot烧写Android的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页设计面试题
- 下一篇: 基于SpringBoot的websock