文档章节

[233]树莓派裸机代码bootloader学习总结

提莫队长
 提莫队长
发布于 2016/08/08 22:57
字数 1161
阅读 873
收藏 0

代码来源:https://github.com/dwelch67/raspberrypi/tree/master/bootloader05

前要:po学渣,想造车轮,于是开始了不归路。

树莓派启动流程(照搬github主原文):

  1. boots off of an on chip rom of some sort
  2. reads the sd card and looks for additional gpu specific boot filesbootcode.bin and start.elf in the root dir of the first partition(fat32 formatted, loader.bin no longer used/required)
  3. in the same dir it looks for config.txt which you can do things likechange the arm speed from the default 700MHz, change the address whereto load kernel.img, and many others
  4. it reads kernel.img the arm boot binary file and copies it to memory
  5. releases reset on the arm such that it runs from the address where the kernel.img data was written.

所以kernel.img会被gpu加载到0x8000的地方,我们要写的代码于是就从这里开始。

file:vectors.s

.globl _start
_start:
    b skip

.space 0x200000-0x8004,0  ;这里将0x8004到0x200000的数据统统填为0

skip:
    mov sp,#0x08000000
    bl notmain
....

为什么填0x8004,原因是0x8000地址开始是要写一个跳转指令,跳转到skip这边来。

所以,原理一下子就明晰了,写代码然后做成kernel.img给gpu加载到内存0x8000的地方并让cpu去执行。

剩下的就是如何组织代码结构的问题了。

github主的方法是,cpu加载他的代码,然后他的代码配置uart,并等待数据传输进来,然后从0x8000这里开始堆放代码数据,最后执行跳转到0x8000执行您传输的数据。

file:periph.c
.......
#define AUX_ENABLES     0x20215004
#define AUX_MU_IO_REG   0x20215040
#define AUX_MU_IER_REG  0x20215044
#define AUX_MU_IIR_REG  0x20215048
#define AUX_MU_LCR_REG  0x2021504C
#define AUX_MU_MCR_REG  0x20215050
#define AUX_MU_LSR_REG  0x20215054
#define AUX_MU_MSR_REG  0x20215058
#define AUX_MU_SCRATCH  0x2021505C
#define AUX_MU_CNTL_REG 0x20215060
#define AUX_MU_STAT_REG 0x20215064
#define AUX_MU_BAUD_REG 0x20215068
.......

github主说uart地址在0x20215000这里开始,树莓派的datasheet却写的是0x7E20 1000(arm pl011)和0x7E21 5000(mini uart)

当然,kernel.img我也没具体运行过,懒。既然mmu也没启用,肯定是github主写错了,要不就是我错了(已解决,看下面的更新)。

然后github主弄了个判断xmodem传输协议(看下面的更新解释)的代码来判断数据传输状态

file:bootloader05.c
//SOH 0x01
//ACK 0x06
//NAK 0x15
//EOT 0x04
.......
if(state==0)
        {
            if(xstring[state]==0x04)
            {
                uart_send(0x06);
                for(ra=0;ra<30;ra++) hexstring(ra);
                hexstring(0x11111111);
                hexstring(0x22222222);
                hexstring(0x33333333);
                uart_flush();
                BRANCHTO(ARMBASE);
                break;
            }
        }
........

当接受的数据块头标识着EOT(我猜全称是end of transmit)时,就完成数据写入,并反馈,然后跳转执行您发送的数据。

由于我要造轮子,所以研究到这还不够。于是打开了bootloader05.list,并打开kernel.img和vectors.o继续研究。

kernel.img与vectors.o前面一部份相同,原因是kernel.img是vectors.o与其他文件一同链接成的(elf文件格式)然后生成的纯代码块(elf应该是linux下一种软件执行标准)。

kernel.img开头就是FE DF 07 EA,这应该就跳转指令,由于大小端的原因(其实我并不知道具体意思...)实际加载到cpu是EA 07 DF FE,对比bootloader05.list即可分析出来。

然后查表,armv7架构arm指令里跳转指令是b,由于有几种处理器都是32位的,所以有个cond这个值用来判断处理器(这句话我瞎编的,我也不知道是干嘛的)。

但后边的1010确实是A,所以应该就是这个指令。07 DF FE 是imm24,是有符号的值,用来表示当前运行地址指针(不知道是什么指针,先不研究)要偏移的量。

参考过的文章:http://blog.csdn.net/logicworldzju/article/details/8923596

更新:

前面的地址问题,我弄明白了。一共有三种地址

  1. ARM virtual addresses (standard Linux kernel only)(这个地址是开启了mmu后的地址)
  2. ARM physical addresses(cpu访问的地址,实际访问时的地址)
  3. Bus addresses(总线地址,arm总线amba连接外围设备,然后芯片厂商将总线上的设备地址转换给cpu能用的地址去访问)

所以,由于没有开启mmu,实际的设备地址在cpu看来应该是从0x7E00 0000偏移到了0x2000 000。

偏移量为0x5E00 0000,所以mini uart的地址是0x7E21 5000 - 0x5E00 0000 = 0x2021 5000。

关于XModem协议

XModem协议介绍:
XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。

这里说的异步文件传输,不知道这个异步到底是个什么异步。看了下这个文章,估计是指每块数据块之间不严格限定时间间隔。

© 著作权归作者所有

提莫队长
粉丝 1
博文 7
码字总数 3196
作品 0
咸宁
程序员
私信 提问
预告:基于树莓派如何开发机器人 | 硬创公开课

此前我们收到读者反馈,想听一节关于如何用树莓派开发机器人。树莓派为学习计算机编程教育设计的一种微型电脑,其系统基于Linux, 只有信用卡大小但视频、音频等功能通通皆有,可谓是“麻雀虽...

金红
2017/02/16
0
0
10 个最值得关注的树莓派博客

如果你正在计划你的下一个树莓派项目,那么这些博客或许有帮助。 网上有很多很棒的树莓派爱好者网站、教程、代码仓库、YouTube 频道和其他资源。以下是我最喜欢的十大树莓派博客,排名不分先...

作者: Ben Nuttall
2018/11/02
0
0
基于树莓派如何开发机器人(附PPT+视频) | 硬创公开课

导语:树莓派是为学习计算机编程教育而设计的一种微型电脑,其系统是基于Linux的, 虽然只有信用卡大小,但视频、音频等功能通通皆有,可谓是“麻雀虽小,五脏俱全”。因此自问世以来,受到了...

金红
2017/03/09
0
0
树莓派使用入门:庆祝树莓派的 14 天

在我们关于树莓派入门系列的第 14 篇也是最后一篇文章中,回顾一下我们学到的所有东西。 派节快乐! 每年的 3 月 14 日,我们这些极客都会庆祝派节。我们用这种方式缩写日期: ,3 月 14 于是...

作者: Anderson Silva
04/16
0
0
如何打开和关闭树莓派(绝对新手)

这篇短文教你如何打开树莓派以及如何在之后正确关闭它。 树莓派是最流行的 SBC(单板计算机)之一。如果你对这个话题感兴趣,我相信你已经有了一个树莓派。我还建议你使用其他树莓派配件来开...

作者: Chinmay
08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
40分钟前
4
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
4
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
13
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
14
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部