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