新路程----海思 uboot(1)

2024-09-04 00:58
文章标签 uboot 海思 路程

本文主要是介绍新路程----海思 uboot(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看start.s吧

.globl _start  //.global声明_start为全局符号,_start就会被连接器链接到,也就是链接脚本中的入口地址了。
_start: b	reset   //跳转到reset  下面的代码是设置arm的异常向量表ldr	pc, _undefined_instruction  //把label后的数据或者指令内容赋值给pcldr	pc, _software_interruptldr	pc, _prefetch_abortldr	pc, _data_abortldr	pc, _not_usedldr	pc, _irqldr	pc, _fiq
8种异常分别占用4个字节,因此每种异常入口处都填写一条跳转指令,直接跳转到相应的异常处理函数中,reset异常是直接跳转到reset函数,其他7种异常是用ldr将处理函数入口地址加载到pc中。
_undefined_instruction: .word undefined_instruction
_software_interrupt:	.word software_interrupt
_prefetch_abort:	.word prefetch_abort
_data_abort:		.word data_abort
_not_used:		.word not_used
_irq:			.word irq
_fiq:			.word fiq
_pad:			.word 0x12345678 /* now 16*4=64 */
__blank_zone_start:
.fill 1024*4,1,0
__blank_zone_end:.globl _blank_zone_start
_blank_zone_start:
.word __blank_zone_start.globl _blank_zone_end
_blank_zone_end:
.word __blank_zone_end.balignl 16,0xdeadbeef  //接下来定义的_end_vect中用.balignl来指定接下来的代码要16字节对齐,空缺的用0xdeadbeef,方便更加高效的访问内存。
接下来看第二段

	mov r0, pc, lsr#28    // pc中的内容逻辑右移28位后 再传送到 R0cmp r0, #8      // r0减去立即数8 并根据结果设置CPSR程序状态寄存器的标志位bleq    relocateldr     r0, _blank_zone_startldr     r1, _TEXT_BASEsub     r0, r0, r1      // r0=r0-r1adrl    r1, _start   //伪指令----中等范围的地址读取add     r0, r0, r1  //r0=r0+r1mov     r1, #0          /* flags: 0->normal 1->pm */ 清零bl      init_registers  //当程序无条件跳转到标号 init_registers  处执行时,同时将当前的 PC 值保存到 R14 中ldr	sp, =STACK_TRAINING //STACK_TRAINING 运行地址赋值为pc
#ifdef  CONFIG_SVB_ENABLEbl	start_svb
#endif#ifdef CONFIG_DDR_TRAINING_V300ldr	r0, =REG_BASE_SCTLbl	start_ddr_training       /* DDR training */
#endif#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:@copy arm exception table in 0 addressadrl	r0, _startmov	r1, #0mov	r2, #0x100		/* copy arm Exception table to 0 addr */add     r2, r0, r2
copy_exception_table:ldmia   r0!, {r3 - r10}
//LDMIA R0!,{R1-R4}  

                               ;R1<----[R0] ;R2<----[R0+4] ;R3<----[R0+8] ;R4<----[R0+12]     

stmia r1!, {r3 - r10} 将R3-R9的数据存储到R1指向的地址上,R1值更新cmp r0, r2ble copy_exception_table@ relocate U-Boot to RAMadrl r0, _start @ r0 <- current position of codeldr r1, _TEXT_BASE @ test if we run from flash or RAMcmp r0, r1 @ don't reloc during debug

第三段

	ldr	r0, _armboot_start		@ get data regions start@ move past malloc poolsub	r0, r0, #(CONFIG_SYS_MALLOC_LEN)@ move past gbl and a couplesub	r0, r0, #(CONFIG_SYS_GBL_DATA_SIZE + 8)@ spots for abort stackstr	lr, [r0]			@ save caller lr in position 0将r1寄存器的值,传送到地址值为r0的(存储器)内存中@ of saved stackmrs	r0, spsr			@ get the spsr   MRS指令用于将状态寄存器的内容读到通用寄存器中  程序状态保存寄存器 SPSR用于保存CPSR的状态
str	lr, [r0, #4]			@ save spsr in position 1 of @ saved stackldr	r0, [r13]			@ restore r0add	r13, r13, #4			@ pop stack entry.endm.macro get_irq_stack			@ setup IRQ stackldr	sp, IRQ_STACK_START.endm.macro get_fiq_stack			@ setup FIQ stackldr	sp, FIQ_STACK_START.endm/** exception handlers*/.align	5
undefined_instruction:get_bad_stackbad_save_user_regsbl	do_undefined_instruction.align	5
software_interrupt:get_bad_stack_swibad_save_user_regsbl	do_software_interrupt.align	5
prefetch_abort:get_bad_stackbad_save_user_regsbl	do_prefetch_abort.align	5
data_abort:get_bad_stackbad_save_user_regsbl	do_data_abort.align	5
not_used:get_bad_stackbad_save_user_regsbl	do_not_used#ifdef CONFIG_USE_IRQ.align	5
irq:get_irq_stackirq_save_user_regsbl	do_irqirq_restore_user_regs.align	5
fiq:get_fiq_stack/* someone ought to write a more effective fiq_save_user_regs */irq_save_user_regsbl	do_fiqirq_restore_user_regs#else.align	5
irq:get_bad_stackbad_save_user_regsbl	do_irq.align	5
fiq:get_bad_stackbad_save_user_regsbl	do_fiq
其他部分参考链接http://blog.csdn.net/skyflying2012/article/details/25804209

这篇关于新路程----海思 uboot(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134546

相关文章

笔记整理—uboot番外(6)针对x210的网卡说明

对于x210而言,在三星中与九鼎官方的uboot都默认使用了二号串口。详见CONFIG_SERIALn(n=1~4)。         更改串口后,应先插回原串口,进行iROM打印,内部iNnad校验核失败的信息,之后再插入其串口进行启动。         修改CCONFIG_NETMASK等多个宏可以修改默认的网络环境。在进行完成修改后,如果依旧没进行改变,则应对iNand

PetaLinux Linux Uboot 源码路径

在很早以前的版本,直接在创建的工程下面就可以找到内核源码和uboot源码。后面的版本采用的是网络下载编译,诸如2018.3 编译完成自动删除,如果想保留,可以在创建的工程下面 $ vim ./project-spec/meta-user/conf/petalinuxbsp.conf 加入RM_WORK_EXCLUDE += "linux-xlnx"RM_WORK_EXCLUDE += "u

新路程------imx6的uart小结(1)

imx6用的是RS485,今天看看这个接口是怎么初始化的。 首先在./arch/arm/mach-mx6/board-mx6q_sabresd.c里找uart的相关信息 在static void __init mx6_sabresd_board_init(void)肯定会有初始化的相关信息 gpio_request(SABRESD_EPDC_PWRSTAT, "uart

新路程------imx6 lvds ioctl

最近有个需求,做一些接口给上层应用调用 于是看了一下驱动,linux有一套标准的framebuffer机制让我们做接口,就是fb_ioctl 首先看对应的framebuffer驱动,在之前的ldb.c中,确实配置了对应的fb_info结构体,但是要修改这个结构体的参数并不需要在ldb.c中做,在mxc_ipuv3_fb.c里 static struct fb_ops mxcfb_ops

新路程------英飞凌imx6的lvds驱动

最近拿到一块开发版,打算在lvds上做些小修改,之前也接触过一点驱动,但是现在的驱动框架看起来和之前的有点差异。 关于lcd的参数信息请参考这篇文章 http://blog.csdn.net/longxiaowu/article/details/24319933  lvds的驱动在framebuffer驱动之下,也就是上层应用只知道有个framebuffer设备也就是dev/fb,而至于下

新路程------编译海思代码遇到的问题

问题如下,解决方案就在问题下方,我的ubuntu版本是14.04 ********************************************************************** “mkimage” command not found – U-Boot images will not be built sudo apt-get install u-boot-

新路程--------安装海思Hi3516A/Hi3516D SDK出现问题

搞板子首先要配置开发环境,这个编译的要求不高,所以虚拟机就可以搞定了,于是我就在windows上装了vm然后安装了虚拟机 vm的版本是11,ubuntu的版本是12.04,别的我没试过,至少可以保证这两个是ok的。    然后装sdk,根据使用说明来,先copy sdk到home目录下(哪个目录应该无所谓,为了方便起见放在了home里),然后点击那个sdk.unpack,结果出问题了

新路程------hi3516a的uart rts cts功能

有位前辈写了以gpio方式控制rts,在驱动内核中修改http://blog.csdn.net/edw200/article/details/52251385?locationNum=4   就是在发送前拉高,发送后拉低,但是这样要计算时间,比较麻烦,而且不同的波特率容易时间计算不准确,所以还是应该由上层把这个事做了,也就是用ioctl的形式来做,这样比较安全放心。        r

新路程------hi3516a 在应用层对寄存器的操作

由于在应用层没法用writel,所以参考himm.c写了一个设置,代码如下: void uart1_rtsn_high(void) {     void * pMem  = NULL;   pMem = memmap(0x201d0010, DEFAULT_MD_LEN);   *(U32*)pMem = 0xff; } 文件名是rs485.c,但是用arm-hisiv300-linux

新路程------hi3516a uart1 rs485

我选用的转换ic 是SN65HVD82 ,控制DE和RE控制输出还是接收 是UART1_RTSN/GPIO9_2/UART3_RXD 控制 himm 0x200f0078    0x00 #SET DIR AS OUT  himm 0x201d0400    0x84 #SET DIR AS LOW himm 0x201d0010    0x00 然后看看uart1的设置是否正常,跑