嵌入式开发(s5pv210)——u-boot中如何确定启动方式(代码片段)

代二毛 代二毛     2023-01-24     245

关键词:

1、嵌入式设备确认启动方式

设备确认启动方式分为硬件方式和软件方式,硬件方式是通过芯片某几个引脚的高低电平来决定启动方式;软件方式就是通过代码设置来决定启动方式。
(1)硬件方式:比如S5PV210芯片,通过拨码开关去设置芯片引脚的高低电平来设置启动方式,要改启动方式必须要硬件上进行设置,芯片在启动时检查引脚的电平从而决定去何种启动介质中读取启动代码;
(2)软件方式:比如X86架构的芯片用bios启动,在设备启动时进入bios界面,可以修改启动顺序。PC电脑也是用的bios,感兴趣可以去看看关于启动顺序的设置。

2、uboot中对启动方式的判断

2.1、汇编部分代码

		/* 读取启动方式,也就是读取om引脚的状态*/
        ldr	r0, =PRO_ID_BASE
        ldr	r1, [r0,#OMR_OFFSET]
        bic	r2, r1, #0xffffffc1
		
		/* NAND BOOT */
		省略掉NAND BOOT部分的判断

		/* SD/MMC BOOT */
		cmp     r2, #0xc
		moveq   r3, #BOOT_MMCSD	

		/* NOR BOOT */
		cmp     r2, #0x14
		moveq   r3, #BOOT_NOR
		
		/* Uart BOOTONG failed */
		cmp     r2, #(0x1<<4)
		moveq   r3, #BOOT_SEC_DEV
		
		/*将r3寄存器的值保存到[INF_REG_BASE+INF_REG3_OFFSET]地址处*/
		ldr	r0, =INF_REG_BASE
		str	r3, [r0, #INF_REG3_OFFSET]  
		
		#if defined(CONFIG_EVT1)
		/* If BL1 was copied from SD/MMC CH2 */
		ldr	r0, =0xD0037488
		ldr	r1, [r0]
		ldr	r2, =0xEB200000
		cmp	r1, r2
		beq     mmcsd_boot
		#endif

		ldr	r0, =INF_REG_BASE
		ldr	r1, [r0, #INF_REG3_OFFSET]
		cmp	r1, #BOOT_NAND		/* 0x0 => boot device is nand */
		beq	nand_boot
		cmp	r1, #BOOT_ONENAND	/* 0x1 => boot device is onenand */
		beq	onenand_boot
		cmp     r1, #BOOT_MMCSD
		beq     mmcsd_boot
		cmp     r1, #BOOT_NOR
		beq     nor_boot
		cmp     r1, #BOOT_SEC_DEV
		beq     mmcsd_boot
		mmcsd_boot:
		bl      movi_bl2_copy
		b       after_copy

1.读取[PRO_ID_BASE+ OMR_OFFSET]地址处的数据,然后取bit1-bit5赋值给r2;(假设r2的值是0xc,SD卡启动方式)
2.将r2做比较从而判断当前是哪种启动方式,于是得知当前是 SD/MMC BOOT,r3=#BOOT_MMCSD;
3.将r3的数据写到[INF_REG_BASE+INF_REG3_OFFSET]地址处保存起来;
4.将0xD0037488地址处的数据读取出来,如果值为0xEB200000就跳转到mmcsd_boot处执行,跳过后面的步骤;
5.将第三步保存在[INF_REG_BASE+INF_REG3_OFFSET]地址处的数据读取出来保存在r1;
6.r1的值为#BOOT_MMCSD,于是最终跳转到mmcsd_boot处执行;
7.movi_bl2_copy是一个C语言函数,主要作用就是重定位BL2;
8.after_copy就是启动代码的剩余部分;

2.2、特殊地址[PRO_ID_BASE+ OMR_OFFSET]

[PRO_ID_BASE+ OMR_OFFSET]=0xE0000004,是一个寄存器的地址,该寄存器的值是硬件根据OM引脚的设置而自动填充的,这个值反映的是OM引脚的接法,也就是当前我们选择的启动介质是什么。通过判断该寄存器的bit1-bit5就可以知道该去何种启动介质读取启动代码。

2.3、特殊地址[D0037488]和[0xD0037F98]

这两个地址是SD卡启动相关的,参考博客《ARM芯片开发(S5PV210芯片)——SD卡启动》

2.4、movi_bl2_copy函数详解

typedef u32(*copy_sd_mmc_to_mem)(u32 channel, u32 start_block, u16 block_size, u32 *trg, u32 init);

void movi_bl2_copy(void)

	ulong ch;
	ch = *(volatile u32 *)(0xD0037488);
	copy_sd_mmc_to_mem copy_bl2 =
	    (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

	#if defined(CONFIG_SECURE_BOOT)
	ulong rv;
	#endif

	u32 ret;
	if (ch == 0xEB000000) 
		ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);
	
	else if (ch == 0xEB200000) 
		ret = copy_bl2(2, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);
	
	else
		return;

	if (ret == 0)
		while (1);
	else
		return;

该函数作用是重定位bl2:
1.将0xD0037488地址处的数据赋值给ch,;
2.将0xD0037F98强制转换成函数指针,这是从SD/MMC中拷贝数据到内存的函数;
3.通过比较ch的值判断出当前是从SD卡通道2还是通道0启动,从而去对应的通道读取数据;
4.copy_bl2函数功能就是从SD卡某个通道的某个扇区开始读取n个块到某个地址处,具体都可以在函数参数里指定。

嵌入式开发(s5pv210)——u-boot中开启mmu(代码片段)

1、MMU介绍在uboot阶段并不是必须要开启MMU(内存管理单元),在没开启MMU前使用的是物理地址,开启MMU后使用的是虚拟地址。MMU就是在物理内存和应用程序之间添加了一个层次,专门用来管理内存,这样写应用程序... 查看详情

嵌入式开发(s5pv210)——u-boot的链接脚本分析(代码片段)

1、脚本内容OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")/*OUTPUT_FORMAT("elf32-arm","elf32-arm","elf32-arm")*/OUTPUT_ARCH(arm)ENTRY(_s 查看详情

嵌入式开发(s5pv210)——u-boot的顶层mkconfig文件分析(代码片段)

mkconfig文件的调用#第一步:SRCTREE是源码的路径,也就是顶层的目录MKCONFIG :=$(SRCTREE)/mkconfigexportMKCONFIG#第二步:配置#$(@:_config=):作用是将x210_sd_config的_config去掉,得到x210_sdx210_sd_c 查看详情

嵌入式开发(s5pv210)——u-boot的不同来源和目录结构

1、u-boot的不同来源和联系uboot的来源大致有三个途径:uboot官网下载、Soc厂商提供、开发板厂商提供。假设某个厂商推出新的Soc,Soc厂商的工程师会去uboot的官网下载uboot,然后把此款Soc的开发板的uboot移植上去并开源&... 查看详情

嵌入式开发(s5pv210)——u-boot启动过程中三次设置栈(代码片段)

1、多次设置栈的原因无论是汇编代码还是C语言代码,当涉及函数嵌套调用时都需要用栈来保存函数返回地址,所以必须设置栈。多次设置栈的原因是,uboot不同的启动阶段可用的内存空间是不同的。最开始只有IRAM可... 查看详情

嵌入式开发(s5pv210)——u-boot的顶层config.mk分析(代码片段)

1、config.mk的作用config.mk的作用是配置uboot编译的,比如配置交叉编译工具链,链接地址,编译选项,指定头文件路径等,但是config.mk的配置是建立在顶层mkconfig、主Makefile等配置之上的。2、config.mk的调用#loadothe... 查看详情

嵌入式开发(s5pv210)——u-boot的头文件包含问题(代码片段)

前言uboot和kernel的头文件包含比一般的程序更复杂,将头文件的路径用链接来表示,这样的用意是为了程序的可移植性。uboot是高度可移植的,不同的配置和编译指令可以编译出不同Soc和开发板的程序,其中源码是... 查看详情

第一章之s5pv210启动顺序

我所使用的开发板是:友善之臂smart210,cpu为s5pv210.u-boot版本是:u-boot-2012-101,首先在u-boot中配置相对应的开发板的配置文件#makes5p_goni_config2,设事先编译好的交叉编译器放在Makefile中添加上去,打开Makefile在67行补充CROSS_COMPILE?=arm-linux-... 查看详情

嵌入式开发综述

0、嵌入式系统开发流程:   1、S5PV210内部结构图2、S5PV210系统启动三阶段正解     根据S5PV210芯片手册第6章所述S5PV210consistsof64KBROMand96KBSRAMasinternalmemory(意思210芯片有两块片上内存,ROM:64KB,SRAM:96KB),并... 查看详情

嵌入式开发(s5pv210)——adc和触摸屏

1、ADC介绍ADC(analogdigitalconverter)就是AD转换,把模拟量转换为数字量。CPU本身是数字的、离散的,而外部世界却是模拟的、连续的,所以外界的信息是不能直接被计算机进行处理,需要先将模拟量转换为数字量... 查看详情

s5pv210移植minigui3.0.12

...包,在MiniGui官网可以下载http://www.minigui.org/zhcn/【已放在嵌入式软件组资料共享文件夹】---------------- 查看详情

嵌入式开发(s5pv210)——lcd显示器

LCD介绍1.LCD(LiquidCrystalDisplay)俗称液晶,这种材料的一大特点就是在电信号的驱动下液晶分子进行旋转,旋转会影响透光性,不同的透光性会透过不同的颜色的光,于是我们便看到显示屏上五颜六色的画面。2.LCD是... 查看详情

s5pv210开发板连接虚拟机的网络设置(代码片段)

1、前言用PC机进行嵌入式设备开发,会在pc机上安装虚拟机来运行linux系统,其中就涉及到开发板和虚拟机的通信问题。本文介绍的就是如何正确的设置网络,开发板通过有线网络与虚拟机通信。如果不知道如何设置... 查看详情

tiny210(s5pv210)移植u-boot(基于2014.4版本号)——移植u-boot.bin(打印串口控制台)

...信息打印。在上节。我们看到调用relocate_code重定位。在u-boot的帮助文档doc/README.arm-relocation中对重定位有说明。u-boot为了生成位置无关码,在链接时指定了-pie选项,这个选项在u-boot-2014.04/arch/arm/config.mk中指定: 查看详情

在s5pv210的开发板上使用串口收发信息

 参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先准备一个安装好Linux的开发板  使用 xshell工具连接开发板 ,winscp工具连接开发板 , 准备一个Ubuntu 32位,装上交叉编译链。。使用下... 查看详情

在s5pv210的开发板上点亮一个led灯

 参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先准备一个安装好Linux的开发板  使用 xshell工具连接开发板 ,winscp工具连接开发板 , 准备一个Ubuntu 32位,装上交叉编译链。。使用下... 查看详情

嵌入式s5pv210的启动流程

S5PV210的启动流程S5PV210上电后执行iROM中的固化代码,即BL0(Bootloader0)。这个代码是厂家出厂前烧写好的,不提供源代码,但提供相应的功能说明,比如进行一些时钟初始化、设备控制器初始化和启动相关... 查看详情

s5pv210|微处理器启动流程(代码片段)

...载到IRAM,然后BL1在IRAM中运行并将BL2加载到SDRAM,BL2加载嵌入式操作系统。BL是BootLoader的简称。S5PV210上电将从IROM处执行固化的启动代码BL0,它对时钟等初始化、对启动设置进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(地... 查看详情