在树莓派中开启激动人心的,Linux下使用交叉编译移植U

树莓派 3,下将树莓派系统自动化烧录到 SD 卡,树莓派启动过程

88bifa必发唯一官网 28

编辑:在写完这个这篇文章之后,我在树莓派 3 上基于 Debian 开始打造 64
位的系统。你可以在这里找到。

88bifa必发唯一官网 1

0环境

88bifa必发唯一官网 2

树莓派,随心所欲。

Linux主机OS:Ubuntu14.04
64位,运行在VMware Workstation 10虚拟机

树莓派 3 配有 Broadcom BCM2837 64 位 ARMv8 四核 Cortex A53
处理器,它是一个 64 位
CPU
。如果你有一块,运行以下命令可能会让你感到惊讶:

我最近在 SVPerl (硅谷 Perl 聚会)谈到在树莓派上运行 Perl
语言的时候,有人问我,“我听说树莓派应该使用 Python
,是这样吗?”。我非常乐意回答他,这是个常见误解。树莓派可以支持任何语言:
Python、Perl 和其他树莓派官方软件 Raspbian Linux 初始安装的语言。

树莓派版本:raspberry pi 2 B型.

  1. uname-a
  2. Linux raspberrypi 4.4.34-v7+#930 SMP WedNov2315:20:41 GMT 2016 armv7l GNU/Linux

看似很厉害,其实很简单。树莓派的创造者英国的计算机科学教授 Eben Upton
曾经说过,树莓派名字中的‘派’(pi),是想为了听起来像
Python,因为他喜欢这门语言。他选择了这门语言作为孩子们的启蒙语言。但是他和他的团队做了一个通用计算机。开源软件没给树莓派任何限制。我们想运行什么就运行什么,全凭自己心意。

树莓派OS: Debian Jessie  Raspbian
Jessie

是的,这是一个 32
位内核
。这是因为树莓派基金会还没有为官方的树莓派系统 Raspbian 提供 64
位版本。然而你可以构建一个,多亏了
Electron752 提供的许多补丁。

我在 SVPerl 和这篇文章中还想讲第二点,就是介绍我的 “PiFlash”
脚本。虽然它是用 Perl 写的,但是不需要你有多了解 Perl 就可以在 Linux
下将树莓派系统自动化烧录到 SD 卡。这样对初学者就比较友好,避免他们在烧录
SD
卡时候,偶然擦除了整个硬盘。即使是高级用户也可以从它的自动化工作中受益,包括我,这也是我开发这个工具的原因。在
Windows 和 Mac 下也有类似的工具,但是树莓派网站没有介绍类似工具给 Linux
用户。不过,现在有了。

1树莓派的启动过程

 

开源软件早就有自己造轮子的传统,因为他们总是崇尚“自痒自挠”去解决问题。这种方式在
Eric S 1997 年的论文和 1999
年的书籍《大教堂与集市》中早有提及,它定义了开源软件的方法论。我也是为了满足想我这样的
Linux 用户,所以写了这个脚本。

树莓派1,2,3的启动过程大致相同,主要分为3个阶段:ROM上的GPU
bootloader启动GPU,GPU启动CPU,CPU直接启动内核或通过u-boot启动内核.

构建内核

树莓派基金会维护着它们自己的 Linux
内核分支,它为它们的设备特别裁剪过,同时定期地从上游合并。

我们将会遵照这个页面88bifa必发唯一官网,的指导来构建一个
64 位内核

我们不能使用“本地构建”的方法,因为它需要一块 64
位的树莓派,这个我们明显还没有。因此我们需要交叉编译它,Ubuntu
是推荐的系统。我个人没有 Ubuntu,因此我在一个有 2 个 CPU 的 Ubuntu 16.04
Digital Ocean 实例上构建,这应该花费我
$0.03。如果你也想这么做,你可以通过这个链接得到
$10 的免费额度。或者你可以通过使用 Virtualbox 中的 Ubuntu VM 作为实例。

首先,我们需要一些构建工具以及** aarch64 交叉编译器**:

  1. apt-get update
  2. apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip

接着我们可以下载 Linux 内核源码

  1. gitclone–depth=1-b rpi-4.8.y https://github.com/raspberrypi/linux.git

进入到创建的 git
目录。另外你可以为你的内核添加额外的版本标签,可以通过编辑 Makefile
的开始几行完成:

  1. VERSION =4
  2. PATCHLEVEL =8
  3. SUBLEVEL =13
  4. EXTRAVERSION =+bilal

为了构建它,运行下面的命令:

  1. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
  2. make-j 3 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

第一个应该很快。第二个则会完全不同,我没有精确计时,但是对我来说大概要半个小时。根据你的
CPU 数(nproc * 1.5)调整 -j 标志。

 

 

由于树莓派涉及到GPU的东西不开源,移植u-boot到树莓派并不是真正意义上的bootloader,但是鉴于u-boot广泛的应用,还是很有学习的必要

选择一个 Linux 发行版

在内核编译的时候,我们可以开始准备它的 Linux
发行版了。在本教程中为了简单我使用 Raspbian,即使这是一个只有 32
位的发行版。

如果你想要一直用 64 位系统,你应该选一个有 aarch64
支持的发行版,Debian 有一个健壮的 ARM64
移植版。得到它基本有三种方式:

  • 下载一个预构建的根文件系统,这很可能会如页面中提到的那样给你一个过期的版本。
  • 如果你熟悉
    debootstrap,用它构建你自己的(这回比较棘手,因为它需要一些手工调整,它最初的目的是在已经运行的主机上进行
    chroot,而不是为其他机器构建根文件系统)
  • 我建议使用
    multistrap,这里有一个很好的教程:

回到 Raspbian,我们现在可以下载官方系统,并开始准备了。

打开一个新的 shell 会话并运行下面的命令:

  1. wget-O raspbian.zip https://downloads.raspberrypi.org/raspbian_lite_latest
  2. unzip raspbian.zip

我们用下面的命令审查:

  1. fdisk-l 2016-11-25-raspbian-jessie-lite.img
  2. Disk2016-11-25-raspbian-jessie-lite.img:1.3GiB,1390411776 bytes,2715648 sectors
  3. Units: sectors of 1*512=512 bytes
  4. Sectorsize(logical/physical):512 bytes /512 bytes
  5. I/O size(minimum/optimal):512 bytes /512 bytes
  6. Disklabel type: dos
  7. Disk identifier:0x244b8248
  8. DeviceBootStartEndSectorsSizeIdType
  9. 2016-11-25-raspbian-jessie-lite.img1 819213721512902463M c W95 FAT32 (LBA)
  10. 2016-11-25-raspbian-jessie-lite.img2 137216271564725784321.2G83Linux

我们可以看到它有两个分区。第一个是启动分区,它主要包含了
bootloader、Linux 内核以及少量配置文件。第二个是根分区

我们可以在我们的文件系统上挂载这些分区,从根分区开始:

  1. mount-o loop,offset=702545922016-11-25-raspbian-jessie-lite.img /mnt

offset 取决于扇区大小(512):70254592 = 512 * 137216

接着是启动分区

  1. mount-o loop,offset=4194304,sizelimit=660602882016-11-25-raspbian-jessie-lite.img /mnt/boot

offset :4194304 = 512 * 8192,sizelimit:66060288 = 512 * 129024

树莓派系统现在应该可以在 /mnt 中看到了。我们基本要完成了。

 

下载系统镜像

想要开启树莓派之旅,你首先需要为它下载一个操作系统。我们称之为“系统镜像”文件。一旦你把它下载到你的桌面、手提电脑,或者甚至是另一个树莓派中,我就需要写入或者称之为“烧录”进你的
SD卡。详细情况可以看在线文件。手动做这件事情需要一些功底,你要把系统镜像烧录到整个
SD卡,而不是其中一块分区。系统镜像必须独自包含至少一个分区,因为树莓派引导需要一个
FAT32文件系统分区,系统引导这里开始。除了引导分区,其他分区可以是操作系统内核支持的任何分区类型。

在大部分树莓派中,我们都运行的是某些使用 Linux
内核的发行版。已经有一系列树莓派中常用的系统镜像你可以下载使用。(当然,没什么能阻止你自己造轮子)

树莓派基金会向新手推荐的是“NOOBS”系统。它代表了
“New Out of the Box
System”(新鲜出炉即开即用系统),显然它好像听起来像术语
“noob””(小白),通俗点说就是 “newbie”(菜鸟)。NOOBS 是一个基于树莓派的
Linux
系统,它会给你一个菜单可以在你的树莓派上自动下载安装几个其它的系统镜像。

Raspbian Linux 是
Debian Linux 发行版的树莓派定制版。它是为树莓派开发的正式 Linux
发行版,并且由树莓派基金会维护。几乎所有树莓派驱动和软件都会在 Raspbian
上先试用,然后才会放到其它发行版上。其默认安装博客 Perl。

Ubuntu Linux
(还有其社区版的 Ubuntu MATE)也将树莓派作为其支持 ARM (Advanced RISC
Machines)处理器的平台之一。RISC(Reduced Instruction Set
Computer)Ubuntu 是一个 Debian Linux 的商业化支持的开源分支,它也使用
DEB 包管理器。Perl 也在其中。它仅仅支持 32 位 ARM7 或者 64 位 ARM8
处理器的树莓派 2 和 3。ARM6 的树莓派 1 和 Zero 从未被 Ubuntu
构建过程支持。

Fedora
Linux
支持树莓派2 ,而 Fedora
25 支持 3。 Fedora 是一个隶属于红帽(Red
Hat)的开源项目。Fedora
是个基础,商业版的 RHEL(Red Hat Enterprise
Linux)在其上增加了商业软件包和支持,所以其软件像所有的兼容红帽的发行版一样来自
RPM(Red Hat Package Manager) 软件包。就像其它发行版一样,也包括 Perl。

RISC OS
是一个特别针对 ARM 处理器的单用户操作系统。如果你想要一个比 Linux
系统更加简洁的小型桌面(功能更少),你可以考虑一下。它同样支持 Perl。

RaspBSD 是一个 FreeBSD
的树莓派发行版。它是一个基于 Unix 的系统,而不是 Linux。作为开源 Unix
的一员,它延续了 Unix 的功能,而且和 Linux
有着众多相似之处。包括有类似的开源软件带来的相似的系统环境,包括 Perl。

OSMC,即开源多媒体中心,以及
LibreElec 电视娱乐中心,它们都基于运行 Linux
内核之上的 Kodi 娱乐中心。它是一个小巧、特化的 Linux
系统,所以不要期望它能支持 Perl。

Microsoft Windows IoT
Core
是仅运行在树莓派3上的新成员。你需要微软开发者身份才能下载。而作为一个
Linux 极客,我根本不看它。我的 PiFlash
脚本还不支持它,但如果你找的是它,你可以去看看。

 

树莓派启动过程:

打包内核

内核编译完成后,最后一步包括复制 Linux
内核
以及设备树到启动分区中:

  1. cp arch/arm64/boot/Image/mnt/boot/kernel8.img
  2. cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/

调整 config.txt :

  1. echo“kernel=kernel8.img”>>/mnt/boot/config.txt

安装内核模块 :

  1. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu INSTALL_MOD_PATH=/mnt modules_install
  2. umount/mnt/boot
  3. umount/mnt

就是这样了,用于树莓派 3 的** ARM64 Linux 内核**诞生了!

现在你可以压缩镜像,通过 scp 下载下来,并按照标准的步骤放到你的 SD
卡中。

最后你会得到:

  1. uname-a
  2. Linux raspberrypi 4.8.13+bilal-v8+#1 SMP WedDec1414:09:38 UTC 2016 aarch64 GNU/Linux

via:

作者:Bilal Amarni
译者:geekpi
校对:wxy

本文由 LCTT
原创编译,Linux中国 荣誉推出

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145433.htm

88bifa必发唯一官网 3

PiFlash 脚本

如果你想看看树莓派 SD
卡烧录指导,你可以找到在
Windows 或者 Mac 系统下需要下载的工具来完成烧录任务。但是对于 Linux
系统,只有一系列手工操作建议。我已经手工做过这个太多次,这很容易引发一个开发者的本能去自动化这个过程,这就是
PiFlash 脚本的起源。这有点难,因为 Linux
有太多方法可以配置,但是它们都是基于 Linux 内核的。

我总是觉得,手工操作潜在最大的失误恐怕就是偶然错误地擦除了某个设备,而不是擦除了
SD 卡,然后彻底清除了我本想保留在硬盘的东西。我在 SVPerl
演讲中也说了,我很惊讶地发现在听众中有犯了这种错误(而且不害怕承认)的人。因此,PiFlash
其中一个目的就是保护新手的安全,不会擦除 SD 卡之外的设备。PiFlash
脚本还会拒绝覆写包含了已经挂载的文件系统的设备。

对于有经验的用户,包括我,PiFlash
脚本还提供提供一个简便的自动化服务。下载完系统镜像之后,我不需要必须从
zip格式中解压缩或者提取出系统镜像。PiFlash
可以直接提取它,不管是哪种格式,并且直接烧录到 SD 卡中。

我把 PiFlash
及其指导发布在了
GitHub 上。

命令行用法如下:

  1. piflash [--verbose] input-file output-device
  2. piflash [--verbose]--SDsearch

input-file
参数是你要写入的系统镜像文件,只要是你从树莓派发行版网站下载的镜像都行。output-device
参数是你要写入的 SD 卡的块设备路径。

你也可以使用 --SDsearch 参数列出挂载在系统中 SD 卡设备名称。

可选项 --verbose 可以输出所有的程序状态数据,它在你需要帮助时或者递送
bug 报告和自行排错时很有用。它就是我开发时用的。

下面的例子是我使用该脚本写入仍是 zip 存档的 Raspbian 镜像到位于
/dev/mmcblk0 的 SD 卡:

  1. piflash 2016-11-25-raspbian-jessie.img.zip /dev/mmcblk0

如果你已经指定了 /dev/mmcblk0p1 (SD
卡的第一分区),它会识别到这个分区不是一个正确的位置,并拒绝写入。

在不同的 Linux 系统中怎样去识别哪个设备是 SD 卡是一个技术活。像 mmcblk0
这种在我的笔记本上是基于 PCI 的 SD卡接口。如果我使用了 USB SD
卡接口,它就是 /dev/sdb,这在多硬盘的系统中不好区分。然而,只有少量的
Linux 块设备支持 SD 卡。PiFlash
在这两种情况下都会检查块设备的参数。如果全部失败,它会认为可写入、可移动的,并有着正确物理扇区数量的
USB 驱动器是 SD 卡。

我想这应该能涵盖大部分情况。但是,如果你使用了我不知道的 SD
卡接口呢?我乐意看到你的来信。请在输出信息中加上 --verbos --SDsearch
参数,以便让我可以知道你系统目前的环境。理想情况下,如果 PiFlash
脚本可以被广泛利用,我们可以构建一个开源社区去尽可能的帮助更多的树莓派用户。

 

HOW THE RASPBERRY PI
BOOTS UP

树莓派的 CPAN 模块

CPAN(Comprehensive Perl Archive
Network)是一个世界范围内包含各种 Perl
模块的的下载镜像。它们都是开源的。大量 CPAN
中的模块都是历久弥坚。对于成千上百的任务,你不需要重复造轮子,只要利用别人已经发布的代码就可以了。然后,你还可以提交你的新功能。

尽管树莓派是个五脏俱全的 Linux 系统,支持大部分 CPAN
模块,但是这里我想强调一下专为树莓派硬件开发的东西。一般来说它们都用在测量、控制、机器人方面的嵌入式系统中。你可以通过
GPIO (General-Purpose
Input/Output)针脚将你的树莓派连接到外部电子设备。

可以使用树莓派 GPIO
针脚的模块如下:Device::SMBus、Device::I2C、Rpi::PIGPIO、Rpi::SPI、Rpi::WiringPi、Device::WebIO::RaspberryPI

Device::PiGlow。树莓派支持的嵌入式模块如下:UAV::Pilot::Wumpus::Server::Backend::RaspberryPiI2C、RPI::DHT11(温度/湿度)、RPI::HCSR04(超声波)、App::RPI::EnvUI、RPi::DigiPot::MCP4XXXX、RPI::ADC::ADS、Device::PaPiRus

Device::BCM2835::Timer。

 

树莓派3启动过程概述

例子

这里有些我们在树莓派上可以用 Perl 做的事情的例子。

 

RPi
Software

例一:在 OSMC 使用 PiFlash 播放视频

本例中,你将练习如何设置并运行使用 OSMC 操作系统的树莓派。

  • 到 RaspberryPi.Org 下载区,下载最新的
    OSMC 版本。
  • 将空 SD 卡插入你的 Linux 电脑或者笔记本。树莓派第一代是全尺寸的 SD
    卡,除此以外都在使用 microSD,你也许需要一个通用适配器才能插入它。
  • 在插入前后分别运行 cat /proc/partitions
    命令来看看系统分给硬件的设备名称。它可能像这样 /dev/mmcblk0 或者
    /dev/sdb, 用如下命令将正确的系统镜像烧录到 SD
    卡:piflash OSMC_TGT_rbp2_20170210.img.gz /dev/mmcblk0
  • 弹出 SD 卡,将它插入树莓派中,接上 HDMI 显示器,开机。
  • 当 OSMC 设置完毕,插入一个 USB
    设备,在里面放点视频。出于示范目的,我将使用 youtube-dl
    程序下载两个视频。运行 youtube-dl OHF2xDrq8dY
    (彭博关于英国高新产业,包括树莓派的介绍)还有
    youtube-dl nAvZMgXbE9c (CNet 发表的“排名前五的树莓派项目”)
    。将它们下载到 USB 中,然后卸载移除设备。
  • 将 USB 设备插入到 OSMC 树莓派。点击视频选项进入到外部设备。
  • 只要你能在树莓派中播放视频,那么恭喜你,你已经完成了本次练习。玩的愉快。

 

2移植u-boot到Debian
Jessie系统

例二:随机播放目录中的视频的脚本

这个例子将使用一个脚本在树莓派上的目录中乱序播放视频。根据视频的不同和设备的摆放位置,这可以用作信息亭显示的用途。我写这个脚本用来展示室内体验视频。

  • 设置树莓派引导 Raspbian Linux。连接到 HDMI 监视器。
  • 从 GitHub 上下载 do-video
    脚本。把它放到树莓派中。
  • 跟随该页面的安装指导。最主要的事情就是安装 omxplayer
    包,它可以使用树莓派硬件视频加速功能平滑地播放视频。
  • 在家目录的 Videos 目录下放一些视频。
  • 运行 do-video ,这样,应该就可以播放视频了

 

最初想直接移植u-boot到Raspbian,尝试了多次都失败告终.google上u-boot启动raspberry
pi大都是基于Debian Jessie,所以先照葫芦画瓢试一把.

例三:读取 GPS 数据的脚本

这个例子更加深入,更有针对性。它展示了 Perl
怎么从外部设备中读取数据。在先前例子中出现的我的 GitHub上 “Perl on
Pi”
有一个 gps-read.pl 脚本。它可以通过一系列端口从 GPS 读取
NMEA(国家海洋电子协会)的数据。页面还有教程,包括构建它所使用的
AdaFruit Industries 部分,但是你可以使用任何能输出 NMEA 数据的 GPS。

通过这些任务,我想你应该可以在树莓派上像使用其他语言一样使用
Perl了。希望你喜欢。


作者简介:

Ian Kluft – 上学开始,Ian 就对喜欢编程和飞行。他一直致力于 Unix
的工作。在 Linux 内核发布后的六个月他转向了
Linux。他有计算机科学硕士学位,并且拥有 CSSLP
资格证(认证规范开发流程专家),另一方面,他还是引航员和认证的飞机指令长。作为一个超过二十五年的认证的无线电爱好者,在近些年,他在一些电子设备上陆续做了实验,包括树莓派。


via:

作者:Ian Kluft
译者:Taylor1024
校对:wxy

本文由 LCTT
原创编译,Linux中国 荣誉推出

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-09/146641.htm

88bifa必发唯一官网 4

移植u-boot到树莓派参考例程

(1)最全面的RPi u-boot例程RPi
U-Boot

(2)基于RPi2的例程Booting a Raspberry Pi2, with u-boot and HYP
enabled

(3)基于RPi2,提供现成文件的例程Raspberry Pi 2 – Debian Jessie
and U-Boot

(4)基于mainline u-boot的例程How to compile mainline u-boot for Raspberry
Pi
?

 

MicroSD卡烧写镜像:debian
jessie下载地址

Ubuntu主机上u-boot使用Mainline版本,官网源码 亚马逊下载地址

Ubuntu主机上文件位置如下

88bifa必发唯一官网 588bifa必发唯一官网 6

家目录(/root)下u-boot-2016.09文件夹是解压后的u-boot

家目录(/root)下script_u-boot文件夹是自己写的环境配置,脚本

u-boot-2016.09文件夹如下,可以先读读README

88bifa必发唯一官网 7

script_u-boot文件夹内如下图,从左到右是scr配置文件,环境配置文件,生成u-boot.bin文件,生成scr文件

88bifa必发唯一官网 8

env_gnueabihf_mkimage文件代码如下

 

#添加树莓派的交叉编译工具链路径(主机是64位)
export PATH=$PATH:/root/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

#指定编译目标架构为arm,编译器为PATH路径中的交叉编译器
export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

 

树莓派交叉编译工具链地址

树莓派交叉编译可以参考Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

在后续操作之前先source一下这个文件使配置生效,关闭终端或者重新登陆Ubuntu需要再次source

用echo查看变量,注意使用tab自动补全路径

88bifa必发唯一官网 9

make_ubootbin文件代码如下

#从脚本文件夹切换到u-boot文件夹下
cd /root/u-boot-2016.09

#配置适用于树莓派2的u-boot
make rpi_2_defconfig

#编译
make all

#返回脚本文件夹
cd /root/script_u-boot

 

切换路径是因为执行这个脚本是在script_u-boot文件夹,而make命令执行Makefile是在u-boot-2016.09文件夹,最后切回路径方便后续的source

这里make
rpi_2_defconfig是针对树莓派2板,其它版本树莓派的make
config参考前文的移植u-boot到树莓派参考例程(1)(4)

执行make_ubootbin无报错

88bifa必发唯一官网 10

在u-boot-2016.09文件夹下生成了u-boot.bin

88bifa必发唯一官网 11

把debian
jessie的SD卡通过读卡器插到电脑,注意先选中虚拟机的Ubuntu系统,Ubuntu会自动读取(mount)SD卡

rootfs(根文件系统)分区:

88bifa必发唯一官网 12

firmware(debian
jessie下的启动分区):

88bifa必发唯一官网 13

关于启动分区config.txt bootcode.bin
cmdline.txt start.elf kernel7.img等文件,参考前文的树莓派启动过程

至此可以把u-boot.bin拷到sd卡的firmware(对于debian
jessie系统)

然后在config.txt添加

kernel=u-boot.bin

指定用u-boot.bin启动内核kernel7,config.txt是内核的配置文件,类似电脑的BIOS配置

配置内核的方法:

一种方法是在u-boot阶段手动输入命令,而mainline版本的u-boot不支持usb输入,尝试过例程(1)中的Stephen
Warren版本,也无法输入(问题还有待调查)

另一种是把u-boot中输入的命令写到一个脚本文件,通过mkimage命令将这个脚本生成.scr镜像,然后放到启动分区,u-boot会自动读取脚本来启动内核,这样更简单更容易修改,但是不利于调试错误信息

用第一种方法可以拔出SD卡,在树莓派上配置内核启动,注意在u-boot阶段只能通过HDMI外接显示屏或者串口来查看输出信息.关于串口可以参考RPi
Serial Connection

用第二种方法是在Ubuntu主机上生成boot.scr镜像,先写一个配置文件:在script_u-boot文件夹下新建configure_scr_file,内容如下

 

#设置环境为树莓派2
setenv machid 0x00000c42
#设置打印信息,允许HDMI,允许串口,设置根文件系统路径和类型
setenv bootargs "earlyprintk console=tty0 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait noinitrd"
#保存环境配置
saveenv
#载入内核镜像到MMC0的第一分区
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
#启动内核
bootz ${kernel_addr_r} 

 

以上命令的语法都是u-boot软件规定,关于命令的细节可以参考RPi
U-Boot 
 官方文档U-Bootdoc 
 

然后新建一个脚本make_ubootscr生成scr镜像,make_ubootscr内容如下

#生成boot.scr镜像文件
mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /path/to/script /boot/firmware/boot.scr

/path/to/script是configure_scr_file的路径,替换后如下

mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /root/script_u-boot/configure_scr_file /boot/firmware/boot.scr

source报错,提示未安装mkimage

88bifa必发唯一官网 14

命令找不到通常是未安装软件,或者没添加路径,mkimage应该是包含在u-boot软件中的,由于之前用过树莓派交叉编译工具链的经验,在u-boot-2016.09文件夹的tools文件夹找到了mkimage程序

更通用的是用find命令查找

find 查找路径 -name 文件名

88bifa必发唯一官网 15

看来是没有添加mkimage的路径到环境变量,只需在env_gnueabihf_mkimage添加路径然后source

env_gnueabihf_mkimage修改如下

export PATH=$PATH:/root/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:/root/u-boot-2016.09/tools

export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

88bifa必发唯一官网 16

提示路径不存在

这时就需要了解这条mkimage命令的具体含义了,参考[mkimage

  • Generate image for
    U-Boot]()

/boot/firmware/boot.scr是生成boot.scr文件的路径,如果在树莓派上直接操作这个路径就是启动分区,但是我是在Ubuntu主机操作,SD卡是挂载到Ubuntu主机的路径被改变了

查看块设备可以用命令

lsblk

88bifa必发唯一官网 17

sdb就是SD卡,sdb1是firmware启动分区,sdb2是rootfs文件系统分区

事实上插入SD卡时Ubuntu自动把SD卡mount到了主机的/media路径,所以前面才能对u-boot.bin直接复制粘贴操作

但是想把SD卡的第一分区挂载到其它路径,比如主机的/mnt文件夹下,应该

mount /dev/sdb1 /mnt

注意设备的实际路径和挂载后路径的区别,/dev/xxx才是实际的设备路径

在debian
jessie的树莓派上查看SD卡路径如下

 

这是因为debian
jessie没有自动挂载功能

可以把boot.scr直接生成到firmware下(先在Ubuntu插好SD卡)

mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /root/script_u-boot/configure_scr_file /media/boot/firmware/boot.scr

更推荐生成在其它目录(比如u-boot-2016.09文件夹)再拷到SD卡,最终改为如下,-n是生成的文件名

mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n boot.scr -d /root/script_u-boot/configure_scr_file /root/u-boot-2016.09/boot.scr

成功生成boot.scr

88bifa必发唯一官网 18

在把u-boot.bin
boot.scr拷到SD卡的firmware以后,确认config.txt添加了kernel=u-boot.bin就可以拔出SD卡启动树莓派2了

88bifa必发唯一官网 19

启动过程如下

 88bifa必发唯一官网 20

88bifa必发唯一官网 21

进入登陆界面

88bifa必发唯一官网 22

登陆名(login):root  

密码(password):debian

88bifa必发唯一官网 23

登录成功,至此在debian
jessie上的u-boot移植完成

在主机上交叉编译生成boot.bin,也可以不添加环境变量ARCH,CROSS_COMPILE,直接在make语句指定编译器

make_ubootbin可以改为如下

cd /root/u-boot-2016.09
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- rpi_2_defconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
cd /root/script_u-boot

-j4是采用四核处理器四线程编译,取决于主机CPU WIN7下查看CPU核心数

3移植u-boot到Raspbian
Jessie系统

有了前面的尝试,后面的就水到渠成了

如果直接把刚才生成的u-boot.bin
boot.scr拷到raspbian,在config.txt添加kernel=u-boot.bin

启动后停留在starting kernel…

88bifa必发唯一官网 24

信息显示kernel7已经通过boot.scr读取了,说明问题出在启动内核之后的部分

对比一下debian jessie和raspbian
jessie的分区,文件系统都一样,就是启动分区有差别

debian jessie的启动分区

88bifa必发唯一官网 25

raspbian jessie的启动分区

88bifa必发唯一官网 26

发现raspbian多了一个kernel.img,几个.dtb文件,overlay里面也是.dtb文件

参考RPi
U-Boot后感觉需要加载dtb(Device Tree binary)

修改boot.scr的配置文件(configure_scr_file)的内容如下

setenv machid 0x00000c42
#添加变量fdtfile的值为bcm2709-rpi-2-b.dtb
setenv fdtfile bcm2709-rpi-2-b.dtb
setenv bootargs "earlyprintk console=tty0 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait noinitrd"
saveenv
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
#载入fdtfile的值
fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}
bootz ${kernel_addr_r} - ${fdt_addr_r}

这里添加bcm2709-rpi-2-b.dtb是因为使用树莓派2,如果是其它版本酌情修改

然后source生成boot.scr

source make_ubootbin

将新的boot.scr拷到boot分区,u-boot.bin和之前完全相同,config.txt添加kernel=u-boot.bin

主机上拔出SD卡,启动树莓派

88bifa必发唯一官网 27

 自动登录进入桌面

88bifa必发唯一官网 28

 至此u-boot在raspbian
jessie上移植完成。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135470.htm

88bifa必发唯一官网 29