为使OPi Zero Plus支持U盘启动,需要在板载的SPI Flash当中刷入uboot。在这个过程当中绕了很多弯路,特此记录

最终操作步骤见文末

网上的教程仅使用sudo modprobe spi-sunxi、sudo modprobe spi-dev就使得/dev/下出现了SPI设备,而在Armbian系统当中却无效,遂怀疑需要使用官方系统
___
思路 :配置官方系统→打开SPI功能→写入uboot→测试U盘启动
___
选用的镜像是ubuntu_desktop_xenial_zeroplus_H5_V0_1.img,更新于2017-08-14

一、刷入系统

推荐使用Etcher写入镜像,因为官方有免安装版本的Etcher可以直接打开使用
下载下来的压缩包需解压两次才可得到最终的img文件(.rar→.xz→.img)

二、使用parted命令扩展分区

官方系统不会自动将分区扩展至整个内存卡,需手动使用parted命令调整
输入sudo parted -l查看当前磁盘信息,记录内存卡对应的设备名(/dev/mmcblk?)以及ext4分区对应的编号(一般是2)
然后输入sudo parted +设备名,例如sudo parted /dev/mmcblk0,进入parted
再输入resizepart并回车,在询问Partition number?时输入对应分区编号并回车,询问End?时输入100%并回车,最后重启,即可将分区扩展至整个内存卡

三、更新软件包

用系统自带的nano或者vim文本编辑器修改/etc/apt/sources.list文件,将原始数据全部用#注释掉后替换为国内软件源,最后执行sudo apt update和sudo apt upgrade更新软件包即可

四、解决开机等待时间过长问题

更新软件包后开机可能会卡在以下步骤,需等待5分钟之后才能继续启动

[*** ] A start job is running for Raise network interfaces

(该启动信息仅在通过串口连接香橙派时可见,若使用ssh连接,则体现为开机后需等待5分钟才可使用ssh)
解决方法:在更新软件包后或之后成功登录进入系统后用文本编辑器打开/lib/systemd/system/networking.service
通常情况下能看到文件开头如下:

[Unit]
Description=Raise network interfaces
Documentation=man:interfaces(5)
DefaultDependencies=no
Wants=network.target
……

此时跳转至文件尾部,将TimeoutStartSec=5min更改为TimeoutStartSec=10,保存并退出即可

五、打开SPI功能(失败)

根据网上的资料,成功执行sudo modprobe spi-sunxi,但仍然无法看到spi设备

查错:

通过其他资料得知SPI功能需要通过sunxi-tools编辑系统文件才能打开
同时在官方系统当中未找到/usr/lib下的uboot镜像,遂放弃,决定在Armbian中进行后续操作

思路 :编译安装zlib→安装其它组件→编译安装sunxi-tools→编辑系统文件→打开SPI功能→写入uboot→测试U盘启动

一、安装zlib

sudo wget http://www.zlib.net/zlib-1.2.11.tar.gz
sudo tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
sudo ./configure
sudo make
sudo make install

二、安装其它组件

sudo apt install pkg-config libusb build-essential

三、下载并编译sunxi-tools

git clone https://github.com/linux-sunxi/sunxi-tools
cd sunxi-tools
sudo make
sudo make install

改进:

后来发现有现成sunxi-tools可供安装

思路 :安装sunxi-tools→复制script.bin→用sunxi-tools中的bin2fex进行转换并编辑→覆盖原script.bin,启动SPI功能→写入uboot→测试U盘启动

一、直接安装sunxi-tools

sudo apt install sunxi-tools

二、修改/media/boot/script.bin以启动SPI功能(失败)

boot分区挂载于根目录中而不是/media/中,且boot分区内无任何类似script.bin的文件

查错:

经搜索得知,使用Legacy kernel时才会使用FEX/script.bin来控制硬件功能,而当前Armbian使用的mainline Linux kernel则使用设备树(.dtb文件)来控制硬件功能。遂查询在当前内核当中打开SPI的方法

思路 :修改armbianEnv.txt→启动SPI模块→写入uboot→测试U盘启动

一、查询所支持的硬件功能并启用

参考资料

先使用sudo find /boot/dtb/ -name "*overlay*"命令查找说明文件(以README开头),根据硬件型号选择README.sun50i-h5-overlays并查看,发现如下内容

……
### spi-spidev

Activates SPIdev device node (/dev/spidevX.Y) for userspace SPI access,
where X is the bus number and Y is the CS number

SPI 0 pins (MOSI, MISO, SCK, CS): PC0, PC1, PC2, PC3
SPI 1 pins (MOSI, MISO, SCK, CS): PA15, PA16, PA14, PA13

Parameters:

param_spidev_spi_bus (int)
SPI bus to activate SPIdev support on
Required
Supported values: 0, 1

param_spidev_spi_cs (int)
SPI chip select number
Optional
Default: 0
Supported values: 0, 1
Using chip select 1 requires using "spi-add-cs1" overlay

param_spidev_max_freq (int)
Maximum SPIdev frequency
Optional
Default: 1000000
Range: 3000 - 100000000
……

从中得知配置启动spi-spidev时必须配置参数param_spidev_spi_bus,其余参数为可选项

打开/boot/armbianEnv.txt,在overlays=的后面加上spi-spidev(用空格与前项分隔开),并在文件末尾添上一行
param_spidev_spi_bus=0
保存文件并重启

二、查找内核功能并启用

参照之前资料的内容以及错误提示,输入sudo find /lib/modules/xxx/kernel -name "spi"找到了该文件

/lib/modules/4.19.57-sunxi64/kernel/drivers/spi/spidev.ko

遂输入sudo modprobe spidev启用该功能,后可在/dev/中找到spidev0.0,成功打开SPI功能

改进:

过程中搜索资料发现在Armbian系统中可使用armbian-config直接开启SPI功能

思路 :直接启动SPI功能→写入uboot→测试U盘启动

一、直接使用armbian-config启动SPI

方法如下:
输入sudo armbian-config→选中System并回车→选中Hardware并回车→选中spi-spidev,用空格选中→左右方向键选中Save并回车→左右方向键选中Back并回车→选中Reboot并回车
等待重启完成即可

二、写入uboot

先输入sudo apt install flashrom安装刷写工具

资料得知uboot镜像为/usr/lib/linux-u-boot-orangepizero_5.31_armhf/u-boot-sunxi-with-spl.bin
其中linux-u-boot-orangepizero_5.31_armhf取决于当前系统版本
我找到的镜像文件为/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/sunxi-spl.bin
通过以下命令刷入

cd
dd if=/dev/zero count=2048 bs=1K | tr '\000' '\377' > spi.img
dd if=/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/sunxi-spl.bin of=spi.img bs=1k conv=notrunc
sudo flashrom -p linux_spi:dev=/dev/spidev0.0 -c MX25L1605 -w spi.img

(dd命令的文件目录根据bin文件实际位置调整)
最后显示

Erase/write done.
Verifying flash... VERIFIED.

刷写镜像成功

三、测试U盘启动(失败)

关机,拔出SD卡,插上预先写入了系统镜像的U盘,插电启动
串口输出如下:

U-Boot SPL 2019.04-armbian (May 08 2019 - 17:52:07 +0200)
DRAM: 512 MiB
Trying to boot from sunxi SPI

然后就一直卡在这个界面不进入系统

查错:

1.怀疑U盘系统镜像有误

重新刷入最新的Armbian_5.83镜像,重试,仍然无法开机

2.怀疑系统自带的镜像文件错误

进入系统,使用以下命令重装相关包

sudo apt remove linux-u-boot-orangepizeroplus-next
sudo apt install linux-u-boot-orangepizeroplus-next

重装后重复上述二、三步,仍然无法启动

3.怀疑找错了镜像文件

原因:
1.在刷入镜像文件以前,无内存卡插电启动系统时串口无输出,刷入镜像文件以后,无卡插电启动时有上述串口输出,且刷入空镜像文件后,无卡启动时的串口输出又会消失
说明系统是从SPI Flash当中启动的

2.资料当中使用dd命令共向spi.img当中写入了300KB左右的数据,而使用我找的bin文件却只写入了30KB左右的数据

3.我找到的bin文件为sunxi-spl.bin,末尾是spl而不是spi,说明此文件可能不是为了写入SPI Flash而专门设计的,且原教程中的文件名为u-boot-sunxi-with-spl.bin,英文含义不同

综上,推测找错了镜像文件的可能性很大


思路 :直接启动SPI功能→查找/生成uboot镜像文件→写入uboot→测试U盘启动
___

一、直接使用armbian-config启动SPI

方法见上

二、查找/生成uboot镜像文件

在目录/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/当中找到了u-boot.itb,猜测该文件可用于生成uboot镜像
查阅资料1以及资料2得知sunxi-spl.bin和u-boot.itb共同直接构成启动所需的uboot镜像
结合之前单独刷写sunxi-spl.bin时串口输出有部分启动内容的情况,猜测需将u-boot.itb直接刷写至sunxi-spl.bin后

输入ls -l /usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/得知sunxi-spl.bin占用32768个字节
查阅资料1
以及资料2,得知dd命令中用bs指定读写块的大小(单位为字节),用seek指定跳过多少块进行写入(单位为块)

输入命令如下:

cd
dd if=/dev/zero count=2048 bs=1K | tr '\000' '\377' > spi.img
dd if=/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/sunxi-spl.bin of=spi.img bs=1k conv=notrunc
dd if=/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/u-boot.itb of=spi.img bs=1 seek=32768 conv=notrunc

三、写入uboot

输入以下命令

sudo flashrom -p linux_spi:dev=/dev/spidev0.0 -c MX25L1605 -w spi.img

四、测试U盘启动(部分失败)

按照先前步骤,在一个金士顿U盘上启动失败,在一个闪迪U盘上启动成功
前者的串口输出中有如下内容

EHCI timed out on TD
……
Verifying Checksum ... Bad Data CRC
Ramdisk image is corrupt or invalid
SCRIPT FAILED: continuing...

后者的串口输出中对应内容如下

Verifying Checksum ... OK
## Flattened Device Tree blob at 4fa00000
Booting using the fdt blob at 0x4fa00000

经查询,U盘有坏道可能导致无法成功启动

最终方案:

直接启动SPI功能→生成uboot镜像文件→安装flashrom→写入uboot→测试U盘启动
___

1.直接使用armbian-config启动SPI

输入sudo armbian-config→选中System并回车→选中Hardware并回车→选中spi-spidev,用空格激活→左右方向键选中Save并回车→左右方向键选中Back并回车→选中Reboot并回车
等待重启完成即可

重启后输入ls /dev,可在设备列表当中看到一个名为spidev0.0的设备

2.生成uboot镜像文件

输入apt search linux-u-boot-orangepizeroplus,查看以下两个包是否有[installed]字样

linux-u-boot-orangepizeroplus-dev
linux-u-boot-orangepizeroplus-next

若两者没有出现[installed](情况少见),则输入sudo apt install linux-u-boot-orangepizeroplus-next,等待安装完成后进入下一步
其中任意一个包有[installed],则执行以下命令

cd
dd if=/dev/zero count=2048 bs=1K | tr '\000' '\377' > spi.img
dd if=/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/sunxi-spl.bin of=spi.img bs=1k conv=notrunc
dd if=/usr/lib/linux-u-boot-next-orangepizeroplus_5.85_arm64/u-boot.itb of=spi.img bs=1 seek=32768 conv=notrunc

其中linux-u-boot-next-orangepizeroplus_5.85_arm64用自己系统中的对应路径去替换,方法是输入ls /usr/lib,查看名字以linux-u-boot开头的文件夹
之后在用户目录下会有一个大小为2097152字节的spi.img文件

3.安装flashrom

输入sudo apt install flashrom

4.写入uboot

输入sudo flashrom -p linux_spi:dev=/dev/spidev0.0 -c MX25L1605 -w spi.img

过程中可能出现Erasing and writing flash chip... FAILED和ERASE FAILED!
但只要最后显示

Erase/write done.
Verifying flash... VERIFIED.

则说明写入成功

5.测试U盘启动

先挑一块质量好的U盘,使用Etcher向U盘写入Armbian的镜像文件
香橙派关机拔电源,取出内存卡,将写好的U盘插入香橙派,插电开机启动即可
___

后记:

/usr/lib/下有一个u-boot目录,里面的platform_install.sh对于如何生成uboot镜像文件也有参考价值

2019.07.06

给OPi Zero Plus添加USB启动功能的更多相关文章

  1. Android 4.4 Kitkat 使能 USB adb 功能

    背景 在 Linux-3.8 以后,Android 的内核分支,便去掉了 f_adb,改使用 USB function FS,在用户空间实现 USB adb 功能.这篇文章依据原作者的 Google+ ...

  2. 如何打开USB OTG功能:

    一.检查HW原理图,确认是否支持OTG功能(vbus是否供上电,IDDIG pin连接是否正确)二.若HW确认支持OTG功能,则按照以下方法分别打开USB OTG功能及实现挂载: 如何打开USB OT ...

  3. 为SRS流媒体服务器添加HLS加密功能(附源码)

    为SRS流媒体服务器添加HLS加密功能(附源码) 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的叫做 ...

  4. 用汇编语言给XP记事本添加“自动保存”功能 good

    [文章标题]: 用汇编语言给XP记事本添加“自动保存”功能 [文章作者]: newjueqi [作者邮箱]:zengjiansheng1@126.com [作者QQ]:190678908 [使用工具] ...

  5. IDA反汇编EXE添加一个启动时的消息框

    IDA反汇编EXE添加一个启动时的消息框 上一篇文章介绍了用OD反汇编EXE添加一个启动时的消息框,这篇文章也是实现同样的效果,这边主要的思路还是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转 ...

  6. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  7. 百度地图API 批量添加 带检索功能的信息窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Linux添加开机启动命令

    1.vi /etc/rc.d/rc.local 添加要启动的命令 如: service php-fpm start  //这样,开机就自动启动了php扩展 2. crontab -e   //是写定时 ...

  9. react.js 之 批量添加与删除功能

    最近做的CMS需要用到批量添加图片的功能:在添加文件的容器盒子内,有两个内容,分别是:添加按钮与被添加的选择文件组件. 结构分析: 被添加的组件,我们称为:UploadQiNiuFiles(七牛文件上 ...

随机推荐

  1. Orleans 文档记录

    Orleans 官方文档:官方文档 http://dotnet.github.io/orleans/index.html Orleans 中文文档:中文文档 https://orleanscn.git ...

  2. 搞清楚Spring Cloud架构原理的这4个点,轻松应对面试

    前言 现在分布式系统基本上都是标配了,如果你现在还在玩儿单机,没有接触过这些东西的话,权当是为你打开一扇新的大门吧. 大的单体项目 以前我们做单机系统的时候,所有的代码都在一个项目里面,只是不同的模块 ...

  3. java面试题干货51-95

    51.类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断: try { throw new ExampleB("b") } catc ...

  4. CCF-CSP题解 201612-4 压缩编码

    \(CSP\)也考\(DP\)的嘛...想了两小时贪心的我在宿舍凌乱... 还是智障+老花啊...这不是一道区间合并裸题嘛...石子合并啊... 再看看这\(3s\)的时限,\(O(n^3)\)都够了 ...

  5. 剑指Offer-46.孩子们的游戏(圆圈中最后剩下的数)(C++/Java)

    题目: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定 ...

  6. 转自自己的关于落谷计数器【p1239】的题解

    本蒟蒻写这道题用了两天半里大概五六个小时.(我太弱了) 然后这篇题解将写写我经历的沟沟坎坎,详细的分析一下, 但是由于它很长,因此一定还有多余的地方,比如说我的 预处理,可能比较多余.但是我觉得,信息 ...

  7. [ASP.NET Core 3框架揭秘] 文件系统[3]:物理文件系统

    ASP.NET Core应用中使用得最多的还是具体的物理文件,比如配置文件.View文件以及作为Web资源的静态文件.物理文件系统由定义在NuGet包"Microsoft.Extension ...

  8. [ASP.NET Core 3框架揭秘] 依赖注入[7]:服务消费

    包含服务注册信息的IServiceCollection集合最终被用来创建作为依赖注入容器的IServiceProvider对象.当需要消费某个服务实例的时候,我们只需要指定服务类型调用IService ...

  9. Python:数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

  10. GeoSpark入门-可视化

        GeoSpark是一种用于大规模空间数据处理的集群计算. GeoSpark通过一组out-of-the-box空间弹性分布式数据集( SRDDs ) 扩展 Apache Spark,它可以跨机 ...