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制作刷机包的更多相关文章

  1. E6全部刷机包

    此版本号基于R533_G_11.11.10P_GSZMCAUT679DA01B_LP064DA_T679DA_S005_E001_P002_R001_G004_1FF.sbf制作耳机接听或挂机正常内置 ...

  2. 索尼 LT26I刷机包 X.I.D 增加官方风格 GF A3.9.4 各方面完美

    ROM介 FX_GF_A系列是具有官方风格的.稳定的.流畅的.省电的.新功能体验的.最悦耳音效体验的ROM. FX_GF_A更新日志 ☆ GF_3.9.4 更新信息 ☆ 更新播放器 ☆ 更新adsp数 ...

  3. 华为P7电信4G版刷机包 EMUI2.3 官方B125 第3版 精简 ROOT

    ROM介绍 基于底包至 B125 SP03解包制作 增加自己订制的超美丽EMUI 2.3专用的全局主题 自调刷机脚本,全部权限完美百分百与官方原版相贴合. 加入Root权限并使用SuperSU 2.0 ...

  4. 三星note3 N900刷机包 4.4.2 ZSUDNE3 官方原汁原味 稳定流畅

    ROM介绍 此ROM基于最新的4.4.2 ZSUDNE3 制作,加入一些必要功能,其它性能基本与官方无差距,各方面感觉都非常不错了.此ROM本人自用,所以制作风格有点个人倾向.不论什么建议或者问题欢迎 ...

  5. 三星N900(note3)刷机包 颓废N0.8.1 修复已知BUG 集成谷歌服务

    ROM介绍 8.1更新信息:攻克了来电后点击HOME出现SECPHONE已经停止的问题 去掉了桌面隐藏信息的选项,官方最新底包暂不支持这功能 增加了网友们须要验证的谷歌服务(不须要的同学同步什么的都关 ...

  6. 联想VIBE UI 固件ROM刷机包集合

    固件下载_联想乐问吧http://ask.lenovomobile.com/?c-157.html 联想VIBE UI 固件ROM刷机包集合 悬赏分:0     解决时间:2014/09/12 15: ...

  7. oppo X907刷机包 COLOROS 1.0 正式版公布 安卓4.2.2

    ROM介绍 本版本号将是X907史上最好的一版本号 全新COLOROS的UI 更新全局手势板操作 优化高速启动应用 安全保障中心也是一直採用COLOROS组成的 COLOROS 1.0给用户带来在线音 ...

  8. u8818 G300的官方rom刷机包及详细的刷机方法

    之前看到有些机友在找华为u8818的官方rom固件包,在这里我给大家分享一下这个手机的官方原版的固件rom包吧,有2.3的,也有4.0的,大家可以根据自己的需求来下载. 华为U8818官方2.3固件: ...

  9. 努比亚 Z5 mini刷机包 omni4.4.2改动V4.0 自用版 精简 MIUI特效

    ROM介绍: 第一版: 1.基于lwang适配的omni4.4.2第二版改动,少量精简改动 2.设置加入"自启项管理",体验更快.更顺滑 3.替换特效为XUI特效 4.改动host ...

随机推荐

  1. struts2、ajax实现前后端交互

    跳过struts2环境搭建部分,或者可以看我的博客(http://www.cnblogs.com/zhangky/p/8436472.html),里面有写,很详细. 需要导入的jar包(struts官 ...

  2. Dynamics 365Online Server-Side OAuth身份认证

    在上篇演示了在html页面中通过调用online的OAuth身份验证后再通过web api取10条客户数据并展示,本篇继续讲述如何在server-side程序中调用online的OAuth认证再通过w ...

  3. iOS设计模式-原型模式

    | 导语 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 通过深复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象.这个指定的对象可被称为“原型”对象,也就是通过复制原型 ...

  4. Python Django框架笔记(二):创建应用和django 管理

    #前提是已经创建项目 (一)      创建应用 使用命令,在项目中创建一个应用(blog自定义) python manage.py startapp blog 创建完成后,可以看到下面几个文件 文件 ...

  5. 团队项目个人进展——Day06

    一.昨天工作总结 冲刺第六天,深入学习了小程序官方文档,并看了几节小程序教程的视频 二.遇到的问题 对文档中的内容只是熟悉,理解并运用起来还存在问题 三.今日工作规划 学习微信小程序中WebSocke ...

  6. 使用托管快照创建作为 Azure 托管磁盘存储的 VHD 的副本

    创建快照 创建 OS 或数据磁盘 VHD 的快照,以便将其用作备份或用于排查 VM 问题. 快照是 VHD 的完整只读副本. 使用 Azure 门户创建快照 登录到 Azure 门户. 首先在左上角单 ...

  7. Safari中的Date

    在js中处理Date时,发现Safari和其他浏览器的支持方式不一致 1.例如:2017-01-01 12:00:00 在其他浏览器中,使用这个格式的字符串进行new Date操作没有问题,但是在Sa ...

  8. MySQL安全策略

    0.导读 MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证MySQL的数据安全? MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证M ...

  9. 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘

    MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...

  10. C#读取AD域用户信息

    private const string domainName = "本机IP地址或域名"; private const string adAdmin = "管理员帐号& ...