0环境

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

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

树莓派OS: Debian Jessie  Raspbian Jessie

1树莓派的启动过程

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

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

树莓派启动过程:

HOW THE RASPBERRY PI BOOTS UP

树莓派3启动过程概述

RPi Software

2移植u-boot到Debian Jessie系统

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

移植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主机上文件位置如下

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

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

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

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

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-

树莓派交叉编译工具链地址https://github.com/raspberrypi/tools

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

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

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

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无报错

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

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

rootfs(根文件系统)分区:

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

关于启动分区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 : ${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

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

更通用的是用find命令查找

find 查找路径 -name 文件名

看来是没有添加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-

提示路径不存在

这时就需要了解这条mkimage命令的具体含义了,参考mkimage - Generate image for U-Boot

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

查看块设备可以用命令

lsblk

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

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

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

mount /dev/sdb1 /mnt

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

在运行原版debian jessie的树莓派2上查看SD卡挂载路径如下

debian jessie把SD卡两个分区mmcblk0p1,mmcblk0p2分别挂载到/root和根目录

可以把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

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

启动过程如下

进入登陆界面

登陆名(login):root

密码(password):debian

登录成功,至此在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系统

有了前面的尝试,后面的就水到渠成了.raspbian jessie我用的2015年的官网镜像,新版应该区别不大 raspbian下载

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

启动后停留在starting kernel...

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

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

debian jessie的启动分区

raspbian jessie的启动分区

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

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

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

setenv machid 0x00000c42
#添加变量fdtfile的值为bcm2709-rpi--b.dtb
setenv fdtfile bcm2709-rpi--b.dtb
setenv bootargs "earlyprintk console=tty0 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait noinitrd"
saveenv
fatload mmc : ${kernel_addr_r} kernel7.img
#载入fdtfile的值
fatload mmc : ${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卡,启动树莓派

自动登录进入桌面

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

本文允许转载,转载请声明原文地址http://www.cnblogs.com/cursorhu/p/5896800.html

Linux主机上使用交叉编译移植u-boot到树莓派的更多相关文章

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

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  2. 解决Linux主机上的 远程MySQL客户端无法连接的问题

    无法连接到 MySQL 数据库可能的原因有: 1. PHP 无法连接 MySQL 可能是 PHP 配置不正确,没加上连接 MySQL 的功能. 2. MySQL 软件包升级,但没有升级数据库,或安装 ...

  3. 如何在linux主机上运行/调试 arm/mips架构的binary

    如何在linux主机上运行/调试 arm/mips架构的binary 原文链接M4x@10.0.0.55 本文中用于展示的binary分别来自Jarvis OJ上pwn的add,typo两道题 写这篇 ...

  4. 通过SecureCRT向远程Linux主机上传和下载文件

    有时候直接在Linux服务器上通过 wget 或 curl 工具下截比较大的网络文件时会比较慢,这时我们通常会改用在Windows平台通过迅雷等更加现代化的下载功具下好目标文件(迅雷开会员才能更高速的 ...

  5. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  6. Linux主机上发布java web应用

    1.链接远程主机命令 ssh user@hostname 如: shh root@192.168.1.1 2.查看主机操作系统版本 uname -a 3.linux系统安装mysql a)检查是否安装 ...

  7. Linux学习-Linux 主机上的用户讯息传递

    查询使用者: w, who, last, lastlog 如果你想要知道目前已登入在系统上面的用户呢?可以透过 w 或 who 来查询喔!如下范例所示: [root@study ~]# w 01:49 ...

  8. 批处理:Windows主机通过FTP下载远程Linux主机上文件

    问题:在Windows上怎么写个批处理把多个文件FTP依次下载到本地某个目录. 批处理脚本示例: @echo off title Download db files. Don't close it!! ...

  9. 在Linux主机上搭建SVN,用于同步提交修改,实现本地提交线上预览(SVN Hook功能实现)

    原文地址: http://blog.csdn.net/ROVAST/article/details/44887707?ref=myread 注:上文中钩子使用中有错误,正确的使用如下,上文中忘记了up ...

随机推荐

  1. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  2. gradle学习笔记(1)

    1. 安装     (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site:     (2) 添加环境变量:             1) 变量名:GRADLE_HOM ...

  3. Android和JavaScript相互调用的方法

    转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(70)-微信公众平台开发-成为开发者

    系列目录 前言: 一.阅读这段系列之前,你必须花半天时间大致阅读微信公众平台的API文档,我尽量以简短快速的语言与大家分享一个过程 二.借助微信公众平台SDK Senparc.Weixin for C ...

  5. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  6. AutoMapper的介绍与使用(一)

    软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...

  7. python 数据类型 ----字典

    字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...

  8. webpack学习总结

    前言 在还未接触webpack,就有几个疑问: 1. webpack本质上是什么? 2. 跟异步模块加载有关系吗? 3. 可否生成多个文件,一定是一个? 4. 被引用的文件有其他异步加载模块怎么办? ...

  9. Linux C语言解析并显示.bmp格式图片

    /************************* *bmp.h文件 *************************/ #ifndef __BMP_H__ #define __BMP_H__ # ...

  10. Zephyr OS 简介

    最新发布的开源 Zephyr Project™(Zephyr 项目)是一款小型且可伸缩的实时操作系统,尤其适用于资源受限的系统,可支持多种架构:该系统高度开源,对于开发人员社区完全开放,开发人员可根据 ...