Linux内核驱动(一) U-Boot

原创 2017年01月02日 22:19:28

以下内容是经过各种搜刮整理作为自己的学习资料,若有侵权请及时提醒我!

一、Bootloader简介及工作模式

Bootloader是系统上电后第一个运行的代码,通过Bootloader进行引导内核,挂载根文件系统U-Boot是一个通用的免费开放源码的Bootloader程序。

Bootloader是基于特定硬件平台来实现的,不同的处理器架构有不同的BootloaderBootloader不但依赖于cpu的体系结构,还依赖于嵌入式系统板级设备的配置。对于2块不同的板子而言,即使他们使用的是相同的处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也需要修改Bootloader的源程序。

U-Boot的工作模式有启动加载模式(自主模式)和下载模式(开发模式)。启动加载模式Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统FLASH中加载到SDRAM中运行,整个过程是自动的下载模式就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。

一个嵌入式的存储设备通过通常包括四个分区:

第一分区:存放u-boot

第二个分区:存放着u-boot要传给系统内核的参数

第三个分区:是系统内核(kernel

第四个分区:是根文件系统

如图所示:

二、Bootloader启动(以6410为例)

 

S3C6410X芯片手册03-SystemController  P123列出了S3C6410所支持的几种启动模式。首先介绍一下和启动模式相关的硬件管脚:

OM[4:0]选择启动设备及时钟源。OM[0]0选择XXTlpll,为1选择XEXTCLK

GPN[15:13]用于识别所支持的Nandflash的类型,包括Page的类型和地址周期。

XSELNAND选择Nand启动或者是OneNand启动。0OneNand1Nand

从表中可以看出,S3C6410好像并不支持Nandflash启动,因为Boot Device中没有Nandflash设备。当OM[4:0]0000x/0001x/0010x/0011x的时候,Boot DeviceReserved

S3C6400 User Manual中也有这么一张表,描述了s3c6400的启动模式,具体S3C6400的启动模式也是在第3System Controller,在第107页的表,如图:

 

 

S3C6410的表对照一下就会发现,两个处理器的启动模式是兼容的,所以S3C6410应该兼容S3C6400的启动模式,只不过SamsungS3C6410 User Manual中隐藏了S3C6400中所支持Nandflash启动模式,目的可能是Samsung不希望在S3C6410中使用Nandflash启动,而要推崇IROM的启动模式。

下面总结一下S3C6410所支持的启动模式:

1. NOR Flash启动

通过Nor Flash启动,此时OM[4:1]01000101,对应8bit16bit

2. Nand Flash启动

虽然在S3C6410 User Manual中没有提到,但是也是支持的,从S3C6400 User Manual可以找到。OM[4:1]四个硬件管脚决定了Nandflash启动,以及支持的Nandflash的类型,包括大Page和小Page,地址周期为345。当然,XSELNAND管脚也要为1

3. OneNAND启动

首先XSELNAND管脚为0,其次OM[4:1]0110,为OneNand启动模式。

4. MODEM启动

OM[4:1]0111的时候,为MODEM启动。S3C6410通过MODEM接口下载boot代码到内部RAM中,然后进行引导。

5. IROM启动

OM[4:1]1111的时候,从Internal ROM中启动,此时GPN[15:13]用于识别设备的类型。这种模式以前没见过,这里具体介绍一下。

IROM模式可以支持MoviNandSD/MMCiNandOneNandNand等。关于IROM的引导,具体过程如图:

 

步骤:

(1) 处理器上电后,当OM[4:1]=1111时,运行iROM中的程序,这个程序被称为Bootloader0(BL0),它会做一些初始化的工作。

(2) 然后根据GPN[15:13]的管脚设置,iROM程序选择从相应的设备(SD/MMC/OneNand/Nand)中的指定区域读取4KB的程序到SteppingStone中运行,这段代码被称为Bootloader1(BL1)

(3)BL1可以初始化系统时钟,UARTSDRAM等设备,然后拷贝Bootloader2(BL2)SDRAM中。

(4)跳转到SDRAM中的BL2,继续运行,BL2可以支持更强大的功能,可以将OS加载到SDRAM中,然后运行OS

整个过程中,IROM是最先被运行的,它会首先做一些初始化,具体IROM的流程如下:

a. 禁用Watch-dog

b. 初始化TCM

c. 初始化设备拷贝函数,用于拷贝BL1SteppingStone

d. 初始化栈区域

e. 初始化PLL

f. 初始化指令Cache

g. 初始化堆区域

h. 拷贝BL1SteppingStone

i. 验证BL1

j. 跳转到SteppingStone中运行

 

硬件电路来看,OK6410是通过一个八位拨码开关来实现S3C6410启动模式的选择的。 其中EINT13-EINT15 分别接到S3C6410GPN13-GPN15脚,用于识别所支持的Nandflash的类型,包括Page的类型和地址周期


NAND Flash启动

 

NAND flash启动选择的是:0011,支持的NAND flash为大页,周期为5

SD卡启动

 

 

总结,Bootloader的启动方式主要有网络启动方式磁盘启动方式Flash启动方式

1、网络启动方式


1  Bootloader网络启动方式示意图

如图1所示,里面主机和目标板,他们中间通过网络来连接,首先目标板的DHCP/BIOS通过BOOTP服务来为Bootloader分配IP地址,配置网络参数,这样才能支持网络传输功能。我们使用的u-boot可以直接设置网络参数,因此这里就不用使用DHCP的方式动态分配IP了。接下来目标板的Bootloader通过TFTP服务将内核映像下载到目标板上,然后通过网络文件系统来建立主机与目标板之间的文件通信过程,之后的系统更新通常也是使用Boot Loader的这种工作模式。工作于这种模式下的Boot Loader通常都会向它的终端用户提供一个简单的命令行接口。

2、磁盘启动方式

这种方式主要是用在台式机和服务器上的,这些计算机都使用BIOS引导,并且使用磁盘作为存储介质,这里面两个重要的用来启动linux的有LILOGRUB,这里就不再具体说明了。

3Flash启动方式

这是我们最常用的方式。FlashNOR FlashNAND Flash两种。NOR Flash可以支持随机访问,所以代码可以直接在Flash上执行,Bootloader一般是存储在Flash芯片上的。另外Flash上还存储着参数、内核映像和文件系统。这种启动方式与网络启动方式之间的不同之处就在于,在网络启动方式中,内核映像和文件系统首先是放在主机上的,然后经过网络传输下载进目标板的,而这种启动方式中内核映像和文件系统则直接是放在Flash中的,这两点在我们u-boot的使用过程中都用到了。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Linux内核驱动(二) U-Boot 2

一、分析U-Boot代码 步骤:1.通过smb在Winddows下打开uboot文件夹,复制其路径,将其映射为网络驱动器 2.打开SourceInsight添加U-Boot工程代码   ...

u-boot启动linux内核

1、 U_BOOT_CMD(    bootm, CFG_MAXARGS, 1,do_bootm,   "bootm   - boot application image from memo...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Linux内核驱动(一) U-Boot

以下内容是经过各种搜刮整理作为自己的学习资料,若有侵权请及时提醒我! 一、Bootloader简介及工作模式 Bootloader是系统上电后第一个运行的代码,通过Bootloader进行引导内核...

(六) u-boot 启动内核解析

一、我们从上一节命令解析可以知道,u-boot启动启动Linux内核有两种方法:第一种u-boot等待无空格按下自启内核: s = getenv ("bootcmd"); if (bootde...

uboot 分析之 启动流程

uboot的启动流程: 看一幅图: 1.第一阶段:start.s的内容: 点击(此处)折叠或打开 #include @该文件是第二...

Uncompressing Linux..... done, booting the kernel.

内核启动卡在Uncompressing Linux..... done, booting the kernel.这好像是个老生常谈的问题了。成因在网上也罗列了很多种,可这次我碰到的,却没百度出解决方法...

S5PV210(TQ210)学习笔记——内核移植与文件系统构建

由于之前做过2440和6410,鉴于时间原因,这里暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习。内核移植其实很简单,因为内核是linus率领的linux内核开发团队...

内核启动分析(一)——u-boot启动内核

我们可以看到在,start_armboot()函数的最后,在一个无限循环中调用了函数main_loop(),该函数在common/main.c文件中被定义,我们可以看到下面的一段代码: ...

uboot如何启动内核?

uboot如何启动内核?   1、操作系统运行起来后分为两内核层和应用层。两层的权限不同,内核可以直接访问硬件,而应用层对硬件的访问遭到了限制。 (uboot的镜像是u-boot.bin,Linux的...

u-boot nand 驱动

上一片写了一个u-boot命令saveenv的实现。里面使用到的nand_write等函数。那就来学习一些u-boot里nand flash 的驱动。 在学习nand flash驱动之前,我们要先熟悉...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)