NanoPC-T2制作刷机包
anoPC-T2制作刷机包
前提:到友善的wiki中,仔细看编译uboot、内核、制作刷机包的教程。
准备工作:
1、 虚拟机Ubuntu安装,并安装n多软件可以支撑编译内核等等。
2、 安装交叉编译器,参考wiki-8.1。
3、 下载友善修改好的uboot、内核源代码,debian_nanopi2、sd-fuse_nanopi2等制作刷机包的脚本,友善有两套代码:
Uboot2014,和linux-3.4.y是配套使用,没有使用设备树.
Uboot2016和linux-4.4.y是配套使用,使用设备树.
4、 下载友善已经制作好的刷机包,也可以使用sd-fuse_nanopi2自己制作(最好使用这种方法,里面有东西后面用到)。
我使用的源码版本是uboot2014和linux-3.4.y,文件系统是busybox-1.30.0,具体分析就不多说了,直接来操作:
第一步-编译:
到友善的git上去下载对应得源码包(最好使用git拉取,直接下载好像会出错,选好分支不然编译会失败)
以上只用到了部分,全是用git拉取后,压缩的包,备份起来,下载是真的慢。
解压出来(具体命令自己百度)
分别是文件系统,kernel,刷机包工具、uboot
进入uboot_nanopi2目录下,直接编译,大概不到一分钟,就ok了,具体命令wiki上有,
进入linux-3.4.y目录下,直接编译,时间大概5分钟,具体命令wiki上有,
make nanopi2_linux_defconfig
make uImage -j12 (PC机cpu多核可以使用jn 的命令)
进入busybox目录下,直接编译,时间大概10分钟,可以百度下具体做法。
make menuconfig
设置完交叉工具链的前缀后,保存退出,直接make,
执行make install
至于剩下的拷贝库文件,创建各种文件等等,就自行百度就可以解决, 或者直接看韦东山老师的教程,写的很详细。其中一点:脚本里面的串口设备名称是ttyAMA0,不要写错了,要不然会出错。
第二步-分析官方的二进制文件分布
进入sd-fuse_s5p4418目录下,文件和文件夹如下:
fusing.sh mkimage.sh prebuilt README.md tools,最好先看下readme,先了解下。
首先执行脚本mkimage.sh,跟一个参数android(也可以是其他的,分析下脚本就知道了)
./mkimage.sh android
虚拟机必须联网,因为需要下载一些东西,我提前下载好了,也可以把脚本中的链接复制到迅雷中下载,然后再拷到虚拟机解压在当前目录下,也是可以的。android-lollipop-images.tgz,解压在当前文件夹。
进入文件夹,可以看到很多文件:
2ndboot.bin bootloader env.conf partmap.txt userdata.img
boot.img cache.img info.conf system.img
其中2ndboot.bin是s5p4418官方的,看不到源码,猜测就是一个自举文件。
bootloader 就是uboot生成的文件
boot.img 是kernel和类似于ramdisk的小文件系统。
Cache.img system.img userdata.img是安卓的文件,我暂时没有去管它。
剩下两个.conf文件是一些环境变量,最后一个文件partmap.txt对我们有很大的参考价值
# sd0 partition map
# flash= <device>.<dev no>:<partition>:<fstype>:<start>,<length>
# support device : eeprom, nand, mmc
# support fstype : 2nd, boot, raw, fat, ext4, ubi
#
flash=mmc,0:2ndboot:2nd:0x200,0x7e00:2ndboot.bin;
flash=mmc,0:bootloader:boot:0x8000,0x77000:bootloader;
flash=mmc,0:boot:fat:0x000100000,0x004000000:boot.img;
flash=mmc,0:system:ext4:0x04100000,0x2F200000:system.img;
flash=mmc,0:cache:ext4:0x33300000,0x1AC00000:cache.img;
flash=mmc,0:misc:emmc:0x4E000000,0x00800000;
flash=mmc,0:recovery:emmc:0x4E900000,0x01600000;
flash=mmc,0:userdata:ext4:0x50000000,0x0:userdata.img;
文件直接把刷机包的分区和地址写好了,但是我们不知道bootloader是否和我们编译好的完全一样,其中的boot.img又是由那些文件组成的?我们就需要分析这些。
脚本执行完毕后,会生成一个s5p4418-android-lollipop-20190420.img文件,我们需要分析这个文件,看下官方是怎么做的。
把刚做好的刷机包、android-lollipop-images.tgz解压出来的文件、我们编译好的uboot和uImage拷贝到PC上,对比文件,看下有那些差异。
首先看刷机包,使用分区助手看下分区情况:
Boot分区,有uImage,root.img.gz,ramdisk-recovery.img等等文件
System分区和其他分区是安卓文件系统,对我们没什么价值,就不看了。
分析分区,我们知道第一个分区放的是kernel和ramdisk这样的文件系统,第二个分区放的是文件系统。可以对比下boot分区下的uImage和我们编译的有什么大的差异(其实官方仅仅把它放在里面而已)
接下来对比uboot,发现BootLoader就是uboot,没有什么大的差异。
从上面的分析,可以得出友善官方规划的刷机包分区其实和partmap.txt中的分区是一一对应的,那么我们是不是可以测试下,看是否可以成功做出最小的刷机包512M(可以参考下韦东山老师关于友善neo的视频(免费),里面讲的比较好)。
截取partmap.txt中和我们相关的分区部分,我规划了一个分区,没装visio,不能画图,只有写下来
flash=mmc,0:2ndboot:2nd:0x200,0x7e00:2ndboot.bin;
flash=mmc,0:bootloader:boot:0x8000,0x77000:bootloader;
flash=mmc,0:boot:fat:0x000100000,0x004000000:boot.img;
flash=mmc,0:system:ext4:0x04100000,0x2F200000:system.img;
SD卡的一个小知识:SD卡的分区信息放在前512B中,而一般SD卡的最小擦除单元刚好是512B=0x200=1 sector;(也可能不是sector)
2ndboot.bin 0x200 = 1 sector
Bootloader 0x8000 =64 sector
boot.img 第一个分区-格式fat 20M
文件系统 第二个分区-格式ext4 256-20M(我们暂时先分区,等内核可以跑起来再说)
进入我们的linux目录下,新建build目录,把2ndboot.bin,我们自己编译的u-boot.bin,uImage拷贝到build目录下。
一下操作可以百度下它的意思,我就不细说了,注意空格:
dd if=/dev/zero of=fs_nanopc_256M.img bs=1M count=256
losetup /dev/loop0 fs_nanopc_256M.img
fdisk /dev/loop0 //参看分区表,直接按回车代表默认属性,+20M代表第一个分区是20M,第二个分区直接回车代表剩余空间全部分配给第二个分区,最好w,代表写入分区表,
可以输入p查看分区情况
分区完后,写入分区文件系统格式:
partprobe /dev/loop0
mkfs.fat /dev/loop0p1
mkfs.ext4 /dev/loop0p2
拷贝文件到img文件中:
dd if=2ndboot.bin of=/dev/loop0 bs=512 seek=1
dd if=u-boot.bin of=/dev/loop0 bs=512 seek=64
现在我们的uboot已经放入到刷机包中,我们可以把这个刷机包烧写到SD卡中测试了,文件只有512M,烧写不超过1分钟,预计uboot可以启动。然而我们发现,串口输出可以预估的不一样,如下:
串口打印出这些信息,说明2ndboot.bin已经执行了,但是uboot没启动。
分析可能:
我们下载的android目录下的bootloader和我们编译的一样,是不是脚本执行过程中往里面添加了一些东西???
看下脚本,但是感觉友善这个脚本写的有点乱,也没看出什么来,所以我接直接粗暴的方式对比文件:到0x8000的位置,看使用官方的脚本制作的刷机包s5p4418-android-lollipop-xxx.img,和我们的uboot有什么不一样
发现uboot并不是放在0x8000的地址上,而是放在0x8200的地址上,而且0x8000-0x8200之间还有一些数据,暂时不知道具体含义。
使用粗暴的做法,直接创建一个bin文件,把0x8000-0x8200的内容放到里面,
再次修改我们的分区信息:
2ndboot.bin 0x200 = 1 sector
head.bin 0x8000 = 64 sector
Bootloader 0x8200 =65 sector
boot.img 第一个分区-格式fat 20M
文件系统 第二个分区-格式ext4 256-20M(我们暂时先分区,等内核可以跑起来再说)
修改我们的刷机包:
dd if=2ndboot.bin of=/dev/loop0 bs=512 seek=1
dd if=head.bin of=/dev/loop0 bs=512 seek=64
dd if=u-boot.bin of=/dev/loop0 bs=512 seek=65
顺便把内核也放到里面:
mount /dev/loop0p1 /mnt
cp uImage /mnt
umount /mnt
重新烧写SD卡,启动:
Uboot正常启动,但是内核没有加载,看下默认的环境变量,有很多设置不符合我们现在的情况,修改如下
setenv bootdelay 5
setenv kernel uImage
setenv bootargs console=ttyAMA0,115200n8 root=/dev/mmcblk1p2 rootfstype=ext4 rootwait init=/sbin/init loglevel=7 printk.time=1 consoleblank=0 bootdev=2
setenv bootcmd $bloader 0x48000000 $bootfile
set bloader ext4load mmc 0:1
但是我们发现设置后,无法加载ext2文件系统,我们在分区时,boot的文件系统是fat的,但是uboot并没有支持fat文件系统,我们在分区助手里面看到boot分区也是ext4的,所以我们应该修改boot分区的文件系统为ext4
再次制作:
losetup -d /dev/loop0 //首先卸载设备
rm fs_nanopc_256M.img //删除未完善的刷机包
重复刚才的步骤:
dd if=/dev/zero of=fs_nanopc_256M.img bs=1M count=256
losetup /dev/loop0 fs_nanopc_256M.img
fdisk /dev/loop0
partprobe /dev/loop0
mkfs.ext4 /dev/loop0p1
mkfs.ext4 /dev/loop0p2
把所有需要的文件全部写入到刷机包中
dd if=2ndboot.bin of=/dev/loop0 bs=512 seek=1
dd if=head.bin of=/dev/loop0 bs=512 seek=64
dd if=u-boot.bin of=/dev/loop0 bs=512 seek=65
mount /dev/loop0p1 /mnt //挂载第一个分区到
cp uImage /mnt
umount /mnt
mount /dev/loop0p2 /mnt //挂载第二个分区
cp ../imgForNanopi2/fs_nanopi2/* -rfd /mnt/ //复制文件系统到第二个分区,使用rfd的参数
umount /mnt
losetup -d /dev/loop0
重新烧写测试:
设置环境变量:
setenv bootdelay 5
setenv kernel uImage
setenv bootargs console=ttyAMA0,115200n8 root=/dev/mmcblk1p2 rootfstype=ext4 rootwait init=/sbin/init loglevel=7 printk.time=1 consoleblank=0 bootdev=2
setenv bootcmd $bloader 0x48000000 $bootfile
set bloader ext4load mmc 0:1
因为控制台设置环境变量不能有分号,所以,现在不能自动启动内核,需要我们手动
run bootcmd
bootm
进入了熟悉的界面,说明我们只做刷机包已经成功了。关于uboot环境变量的设置,最好修改uboot源码,修改宏定义。
但是实际操作中,并没有这么顺利,还是有很多问题:
1、 uboot的环境变量,有些官方写死了,就算是我们修改了,重启就恢复了
2、 boot分区下的ramdisK文件系统,有什么用?我暂时没去管它
3、 官方代码更新了,相应的脚本等等一些文件并没有及时更新,
已经很晚了,就不写了!有事不要找我,没事更不要找我!!!
NanoPC-T2制作刷机包的更多相关文章
- E6全部刷机包
此版本号基于R533_G_11.11.10P_GSZMCAUT679DA01B_LP064DA_T679DA_S005_E001_P002_R001_G004_1FF.sbf制作耳机接听或挂机正常内置 ...
- 索尼 LT26I刷机包 X.I.D 增加官方风格 GF A3.9.4 各方面完美
ROM介 FX_GF_A系列是具有官方风格的.稳定的.流畅的.省电的.新功能体验的.最悦耳音效体验的ROM. FX_GF_A更新日志 ☆ GF_3.9.4 更新信息 ☆ 更新播放器 ☆ 更新adsp数 ...
- 华为P7电信4G版刷机包 EMUI2.3 官方B125 第3版 精简 ROOT
ROM介绍 基于底包至 B125 SP03解包制作 增加自己订制的超美丽EMUI 2.3专用的全局主题 自调刷机脚本,全部权限完美百分百与官方原版相贴合. 加入Root权限并使用SuperSU 2.0 ...
- 三星note3 N900刷机包 4.4.2 ZSUDNE3 官方原汁原味 稳定流畅
ROM介绍 此ROM基于最新的4.4.2 ZSUDNE3 制作,加入一些必要功能,其它性能基本与官方无差距,各方面感觉都非常不错了.此ROM本人自用,所以制作风格有点个人倾向.不论什么建议或者问题欢迎 ...
- 三星N900(note3)刷机包 颓废N0.8.1 修复已知BUG 集成谷歌服务
ROM介绍 8.1更新信息:攻克了来电后点击HOME出现SECPHONE已经停止的问题 去掉了桌面隐藏信息的选项,官方最新底包暂不支持这功能 增加了网友们须要验证的谷歌服务(不须要的同学同步什么的都关 ...
- 联想VIBE UI 固件ROM刷机包集合
固件下载_联想乐问吧http://ask.lenovomobile.com/?c-157.html 联想VIBE UI 固件ROM刷机包集合 悬赏分:0 解决时间:2014/09/12 15: ...
- oppo X907刷机包 COLOROS 1.0 正式版公布 安卓4.2.2
ROM介绍 本版本号将是X907史上最好的一版本号 全新COLOROS的UI 更新全局手势板操作 优化高速启动应用 安全保障中心也是一直採用COLOROS组成的 COLOROS 1.0给用户带来在线音 ...
- u8818 G300的官方rom刷机包及详细的刷机方法
之前看到有些机友在找华为u8818的官方rom固件包,在这里我给大家分享一下这个手机的官方原版的固件rom包吧,有2.3的,也有4.0的,大家可以根据自己的需求来下载. 华为U8818官方2.3固件: ...
- 努比亚 Z5 mini刷机包 omni4.4.2改动V4.0 自用版 精简 MIUI特效
ROM介绍: 第一版: 1.基于lwang适配的omni4.4.2第二版改动,少量精简改动 2.设置加入"自启项管理",体验更快.更顺滑 3.替换特效为XUI特效 4.改动host ...
随机推荐
- C#反射的一些经验[转载]
写代码的时候经常需要分析已有类型的信息例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能总结了一点点经验以ClassA a; 为例1. 通过typeof(ClassA) 或者 a.Get ...
- Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1. 安装MySQL ODBC驱动程序 O ...
- Linux CentOS7下svn+tomcat9.0+maven3.3+jenkins实现web项目自动构建与远程发布
CentOS7下svn+tomcat9.0+maven3.3+jenkins实现web项目自动构建与远程发布 by:授客 QQ:1033553122 目录 一. 实践环境. 1 二. 安装 ...
- vue与原生混合开发
前段时间,做了一个混合开发的项目,主要是以vue框架开发h5页面,使用cordova作为中间沟通桥梁,实现了h5与安卓.iOS的混合开发,由于从事iOS开发,h5也是刚接触不久,很多深入原理还不太清楚 ...
- JavaScript Data.parse()转化时间戳安卓和ISO不兼容
Data.parse()获取时间戳,在Android是没有问题的,但是在ISO就不行了,原因在于转化成时间戳的时间格式不一样. Android的格式是如“2017-12-12 12:12:12”,IS ...
- CSS3 中的 box-sizing属性
语法: box-sizing: content-text | border-box | inherit; content-box(默认): 宽度和高度分别应用元素的内容框:在宽度和高度之外绘制元素的内 ...
- Prometheus Node_exporter 之 Network Netstat ICMP
Network Netstat ICMP /proc/net/snmp 1. ICMP Errors 1 type: GraphUnit: shortLabel: Messages out (-) / ...
- [Spark Core] Spark 实现气温统计
0. 说明 聚合气温数据,聚合出 MAX . MIN . AVG 1. Spark Shell 实现 1.1 MAX 分步实现 # 加载文档 val rdd1 = sc.textFile(" ...
- 【require.js】模块化开发
一.Require.js及AMD Require.js:是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一. AMD(Asynchronous Module Definit ...
- MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术
二进制日志文件Binlog的格式主要有三种: 1.Statement:基于SQL语句级别的Binlog,每条修改数据的SQL都会保存到Binlog里面. 2.ROW:基于行级别,每一行数据的变化都会记 ...