本系列为本人在自学过程中的学习笔记,如有错误欢迎大家指正。
学习资料为讯为ITOP4412开发板。
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的应用程序,配置文件,字体等。
教程如下
进入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启动需要解压和安装一些初始化文件,花费的时间长一点。 这些文件初始化一次之后,再次启动速度就会快一点。
作用:对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 \n");
printf("fdisk [ ]\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 \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 [ ] 将电脑上的内核下载到手机并用该内核启动系统.
7.flash:raw boot [ ] 创建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
作者:江北区冷漠铁锤