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. Asp.Net Mvc 使用WebUploader 多图片上传

    来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...

  2. 在线浏览PDF之PDF.JS (附demo)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#skill 下载地址:http://mozilla.gith ...

  3. HTML文档声明

    前面的话   HTML文档通常以类型声明开始,该声明将帮助浏览器确定其尝试解析和显示的HTML文档类型.本文将详细介绍文档声明DOCTYPE 特点   文档声明必须是HTML文档的第一行.且顶格显示, ...

  4. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  5. MVC如何使用开源分页插件shenniu.pager.js

    最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...

  6. 一篇文章看懂TPCx-BB(大数据基准测试工具)源码

    TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...

  7. PHP之使用网络函数和协议函数

    使用其他Web站点的数据 <html> <head> <title> Stock Quote From NASDAQ </title> </hea ...

  8. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  9. es6小白学习笔记(一)

    1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...

  10. FineBI:一个简单易用的自助BI工具

    过去,有关企业数据分析的重担都压在IT部门,传统BI分析更多面向的是具有IT背景的人员.但随着业务分析需求的增加,很多公司都希望为业务用户提供自助分析服务,将分析工作落实到业务人员手中.但同时,分析工 ...