uboot车载系统装不了软件

uboot车载系统装不了软件,第1张

您好,Uboot车载系统是一种嵌入式 *** 作系统,它只能运行特定的应用程序,不能安装任何软件。如果您想在Uboot车载系统上运行其他应用程序,可以尝试使用Linux或Android *** 作系统。

本人用的android平台用的bootloader用的是uboot,貌似大多数手持设备平台都不用这个,因为功能过于强大用不上,反而显得太复杂了。不知道这个平台开发者是怎么想的。既然用了那就来分析一下,顺便修改一下其中的几个小问题,以符合我们的要求。

uboot等同于其他所有的bootloader程序,从根本上讲是一个稍复杂的裸机程序,是最底层的东西,要分析裸机程序我们要从它的连接文件开始。连 接文件(lds文件)定义了程序编译之后整个连接过程,这样我们就可以找到这个程序的第一句汇编代码,进而来下一步分析。uboot的链接文件代码在 android\bootable\bootloader\uboot-imx\u-bootlds

[cpp] view plaincopy

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //文件输出格式

OUTPUT_ARCH(arm)

ENTRY(_start) //首地址标示符

SECTIONS

{

= 0x00000000; //其实地址0

= ALIGN(4); //4字节对齐

text : //代码段

{

board/freescale/mx6q_sabresd/flash_headero (textflasheader) //第一个文件是board/freescale/mx6q_sabresd/flash_headero

cpu/arm_cortexa8/starto //第二个cpu/arm_cortexa8/starto

board/freescale/mx6q_sabresd/libmx6q_sabresda (text)

lib_arm/libarma (text)

net/libneta (text)

drivers/mtd/libmtda (text)

drivers/mmc/libmmca (text)

= DEFINED(env_offset) env_offset : ;

common/env_embeddedo(text)

(text) //剩余的所有代码

}

= ALIGN(4);

rodata : { (SORT_BY_ALIGNMENT(SORT_BY_NAME(rodata))) } //readonly data 段

= ALIGN(4);

data : { (data) } //所有的readonly data

= ALIGN(4);

got : { (got) }

= ;

__u_boot_cmd_start = ; //u_boot_cmd段,里面是所有uboot命令的一个列表

u_boot_cmd : { (u_boot_cmd) }

__u_boot_cmd_end = ;

= ALIGN(4);

_end_of_copy = ;

__bss_start = ; //bss段 就是内存数据段

bss : { (bss) }

_end = ;

}

从上面的代码可以看出我们编译生成的二进制应用程序组成是:代码段->rodata段->uboot命令列表->bss段。我们启动这个应用程序时候是从,0地址开始的,因此我们来看

board/freescale/mx6q_sabresd/flash_headers这个文件。

这个文件中除了分配内存和宏定义的伪汇编指令以外,真正执行的命令有一条

[cpp] view plaincopy

section "textflasheader", "x"

b _start

org CONFIG_FLASH_HEADER_OFFSET

也就是说,这个文件一执行就直接跳到_start 位置处。_start 在android\bootable\bootloader\uboot-imx\cpu\arm_cortexa8\ startS中,因此我们来看这个文件代码

[cpp] view plaincopy

globl _start

_start: b reset

这里直接跳转的reset中接下来看

[csharp] view plaincopy

reset:

/

set the cpu to SVC32 mode cpu设置成32位管理模式

/

mrs r0, cpsr

bic r0, r0, #0x1f

orr r0, r0, #0xd3

msr cpsr,r0

#if (CONFIG_OMAP34XX) //因为我们的cpu不是ompa的 所以这段不会编译

#endif

/ the mask ROM code should have PLL and others stable /

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

这里接下来执行cpu_init_crit

[csharp] view plaincopy

/

CPU_init_critical registers

setup important registers

setup memory timing

/

cpu_init_crit:

/

Invalidate L1 I/D

/

mov r0, #0 @ set up for MCR

mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs

mcr p15, 0, r0, c7, c5, 0 @ invalidate icache

/

disable MMU stuff and caches //关闭mmu

/

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00002000 @ clear bits 13 (--V-)

bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)

orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align

orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB

mcr p15, 0, r0, c1, c0, 0

/

Jump to board specific initialization

The Mask ROM will have already initialized

basic memory Go here to bump up clock rate and handle

wake up conditions

/

mov ip, lr @ persevere link reg across call

bl lowlevel_init @ go setup pll,mux,memory//执行lowlevel_init这个函数代码在

@\bootloader\uboot-imx\board\freescale\mx6q_sabresd\lowlevel_initS中

@主要对时钟,外部ram,rom等进行了初始化代码不贴了。

mov lr, ip @ restore link

mov pc, lr @ back to my caller

初始化完成后,接下来执行

[csharp] view plaincopy

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

relocate: @ relocate U-Boot to RAM 将uboot重新定位到内存中

adr r0, _start @ r0 <- current position of code

ldr r1, _TEXT_BASE @ test if we run from flash or RAM

cmp r0, r1 @ don't reloc during debug测试当前代码是否已经在内存中

beq stack_setup @如果在的话就直接跳转到stack_setup

ldr r2, _armboot_start @如果不在的话,加载_armboot_start地址到r2中。_armboot_start是uboot执行的主体c函数。

ldr r3, _bss_start

sub r2, r3, r2 @ r2 <- size of armboot计算bss_start-armboot_start 保存到R2中,也就是uboot的总大小

add r2, r0, r2 @ r2 <- source end address 计算出uboot代码和rodata地址

copy_loop: @ copy 32 bytes at a time //开始拷贝

ldmia r0!, {r3 - r10} @ copy from source address [r0]

stmia r1!, {r3 - r10} @ copy to target address [r1]

cmp r0, r2 @ until source end addreee [r2]

ble copy_loop

#endif / CONFIG_SKIP_RELOCATE_UBOOT /

uboot是引导程序,android是系统,两者之间是两个独立工程,使用Uboot的目的只是为了引导Andriod的Linux内核和ramdisk(如果有需要使用ramdisk的话)。如果uboot通过屏蔽通过 h文件中拿掉一些宏定义,使uboot编译通过。那么Andriod编译时候,也应该对一下宏进行屏蔽。

你的采纳是我前进的动力!

记得好评和采纳,答题不易,互相帮助,

手机提问的朋友在客户端右上角评价点满意即可

如果你认可我的回答,请及时点击采纳为满意回答按钮

xboot不仅仅是一款功能强大、可移植性强、代码复用率高的嵌入式系统bootloader,而且还是一款SOC片上系统应用软件执行引擎,无需复杂的 *** 作系统,APP上电直接执行。 一次编写,到处运行,不仅仅是个口号,而且还是xboot存在的唯一原因。

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

以上就是关于uboot车载系统装不了软件全部的内容,包括:uboot车载系统装不了软件、android怎么进入uboot、您好,uboot里面支持的芯片是不是就不需要对uboot进行修改而只要把编译好的uboot烧入到nand去等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10071570.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存