树莓派裸机代码之前必做的事情

描述

树莓派4裸机基础教程:芯片启动到代码执行

1.说明

2.树莓派的sd卡

3.config.txt的配置信息

4.小结

1.说明

在做嵌入式开发的时候,每个芯片都有自己的启动方式。在做底层优化的时候,往往也需要关注芯片的启动方式,涉及到启动时间,启动的稳定性问题。所以关注芯片的启动方式非常的重要。在使用电脑的时候,电脑上电后首先会执行BIOS,这个是厂家固化到ROM里面的代码,一般从电脑生产出来到电脑的寿命结束,其中的内容都是不会变的。而系统却可以经常更换,我们可以装Linux系统,也可以装windows系统。这个就是电脑的启动过程。

类比芯片的启动过程,大多数也是如此,比如我们一般描述嵌入式Linux在某些芯片的上的启动流程,首先芯片上电后会执行芯片内部rom的一段固化代码,这段代码会根据拨码开关选择从不同的存储介质中去读取一小段可以执行的代码放到sram中执行。这些存储介质可以是SPI Flash,可以是nand或者nor flash,或者sd卡等等。由于芯片的sram不可能做到非常大,所以第一阶段的代码往往会有限制,比如只允许使用4K内存等等。这段小的代码负责初始化sdram,然后跳转到sdram中去执行代码。由于sdram的成本比sram小许多,所以sdram往往非常的大,接着就是执行正常的程序了。

这些启动方式的选择,都是芯片设计者需要考虑的问题,一方面是成本另一方面是启动的效率问题。在使用芯片的时候,具体看设计者的思路即可。下面来分析一下树莓派4芯片的启动过程。

2.树莓派的sd卡

一般我们使用开发板的时候,很少会见到需要插上sd卡才能启动的,唯有树莓派有这个特殊的操作。那么树莓派的sd卡里面的文件究竟有什么作用呢?

树莓派在设计的时候,为了节省成本,没有使用掉电非易失性存储介质,也就在板子上不能找到相关的flash。这样芯片启动的程序只能放在sd卡里面了。本来U盘启动也是一种方式,但是树莓派4代之前的设计并不是很好,导致这种启动方式不可以使用。树莓派4也有一些尝试,但是目前树莓派4最主流的方式还是使用SD卡启动。

Raspberry Pi 4具有一个SPI连接的EEPROM(4MBits / 512KB)。其中包含用于启动系统的代码,并替换了先前在SD卡的启动分区中找到的bootcode.bin。请注意,如果Pi 4的SD卡的启动分区中存在bootcode.bin,则将其忽略。也就是说在树莓派4的启动方式上,更加的灵活,甚至可以直接去掉SD卡,从网络方式启动应用程序。具体可以看之前的文章

下面来分析一下从sd卡启动系统需要的必要的文件内容。在裸机实验中,一般只需要如下的文件就可以启动了。

树莓派

启动过程可以描述如下:

首先芯片上电后执行first-stage bootloader,这是芯片固化在内部的代码,这个代码的功能是加载sd卡中的bootcode.bin文件。在树莓派4之前的版本都是需要这个文件的,但是在树莓派4上,由于有了SPI的EEPROM,所以SD卡中可以不用存在这个文件。并且启动了GPU。然后将bootcode.bin读取到了128K大小的二级缓存(L2 Cache)中。此时开始执行bootcode.bin代码。该功能用于初始化ram,并且把start4.elf加载到内存中,并且去读取config.txt中的配置信息,设置这些配置信息。上述已经描述了这几个文件的作用,但是经过实际测试发现,这个设备树文件bcm2711-rpi-4-b.dtb文件也是需要的,如果不存在也会影响串口的输出,也就是只会有乱码输出。所以推测start4.elf文件也会去读取设备树文件,然后设置一些基本的参数。毕竟这个文件的大小也可以说明其功能的丰富。

3.config.txt的配置信息

前面说到,start4.elf会读取config.txt中的配置信息,然后去设置相关的配置。先看看最简单的裸机代码启动里设置了哪些配置:

enable_uart=1 arm_64bit=0 core_freq=250 kernel=kernel7.img kernel_address=0x8000

首先enable_uart=1表示使用的是miniUART,树莓派4中,UART控制器有两种,PL011或者mini UART。

Name Type
UART0 PL011
UART1 mini UART
UART2 PL011
UART3 PL011
UART4 PL011
UART5 PL011

这里设置使能UART1作为输出信息,接着需要设置arm的频率core_freq=250。因为串口控制器是需要频率进行使能的。

arm_64bit=0告诉arm要启动的程序是32位的,由于树莓派4上的芯片是cortex-a72,是aarch64架构的,但是也支持向下兼容的32位指令。所以需要告知当前的裸机程序是32位指令集架构。

kernel=kernel7.img表示从start4.elf执行的程序是哪一个,另外kernel_address=0x8000表示需要执行的内存地址。这个地址就是裸机程序在链接时的入口地址。

4.小结

本文主要描述了一个树莓派裸机代码之前所做的事情,这些启动流程是非常值得思考的,每一个步骤都有其设定的含义。剩下的config.txt文件中的配置其实还是有很多可以尝试的,比如修改启动地址,或者去使能某些外设等等。由于目前研究的是最简单的裸机代码,所以这些配置会在以后更高级的功能中慢慢说到。比如比较重要的安全可信技术,也需要修改配置文件。前期理解芯片的启动过程有助于对后面编写裸机代码的分析。

- END -

原文标题:树莓派4裸机基础教程:芯片启动到代码执行

文章出处:【微信公众号:嵌入式IoT】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分