[国嵌攻略][042][代码搬移不可少]

ARM启动流程

1.处理器内部RAM的大小有限,不能拷贝全部的Bootloader,所以需要用内部RAM BL1的代码来拷贝BL2的代码到内存中。规范的方式的代码搬移的起点是flash,终点是内存。但是由于nand flash还没有初始化,所以先从内部ram中把BL1搬移到内存中。等到初始化nand flash后在采用规范的代码搬移方式。

2.起点SRAM地址:2440 0x00000000,6410 0x0C000000,210 0xD0020000

3.链接起始地址决定了程序第一行代码在内存中出现的位置,链接起始地址做为拷贝的终点

终点DRAM地址:2410 0x30000000,6410 0x50000000,210 0x20000000

代码搬移

copy_from_ram_to_mem:
	//初始化地址
	ldr r1, =RAM_ADDR
	ldr r2, =MEM_ADDR
	add r0, r1, #BOOT_SZIE

	//复制代码
loop:
	ldr r3, [r1], #4
	str r3, [r2], #4
	cmp r1, r0
	bne loop

	mov pc, lr
时间: 2024-10-07 03:13:33

[国嵌攻略][042][代码搬移不可少]的相关文章

[国嵌攻略][155][I2C用户态驱动设计]

用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操作或者一次写操作就是一条消息. EEPROM用户态驱动 IIC通用设备对应/dev/i2c-0设备文件. 1.打开通用设备驱动 2.构造写数据到eeprom的消息 3.使用ioctl写入数据 4.构造从eeprom读数据的消息 5.使用ioctl读出数据 6.关闭设备 配置IIC驱动 make me

[国嵌攻略][073][静态函数库设计]

外部函数 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别 系统调用在Linux内核中位于核心态,而函数库是由工程师提供位于用户态 函数库分类 函数库按照链接方式可以分为静态函数库和动态函数库 存放位置 Linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中以*.so.*方式命名的是动态函数库,而以*.a方式命名的是静态函数库. 静态链接库的特点 程序所要用到的库函数代码在链接时全部被拷贝到程序中.如果有多个进程在内存中同时运行,并且使用了

[国嵌攻略][087][多线程程序设计]

线程概念 1.线程就是轻量级的进程. 2.线程与创建它的进程共享代码段和数据段. 3.线程拥有自己独立的栈. 线程特点 线程可以和进程做相同或不同的工作,但是与进程共享资源. 线程互斥 在实际应用中,多个线程往往会访问同一个数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)互斥机制就是其中一种. thread.c #include <pthread.h> #include <stdio.h> #include <unistd.h> pthr

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][162][USB协议分析]

USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备(例如USB鼠标)插到我们的PC时,主机能够自动识别出我们的USB设备类型.在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型.生产厂商等信息.这些固定格式的数据,我们称之为USB描述符.标准设备有5种USB描述符:设备描述符.配置描述符.接口描述符.端点

[国嵌攻略][050][2440按键中断编程]

程序结构优化 1.把不同的功能放到不同的文件里面 2.一般在bootloader中不使用MMU,所以关掉MMU 按键初始化 1.打开开发板的原理图,找到按键 2.把对应的GPIO配置成中断,对中断源进行初始化 初始化中断控制器 1.SUBMASK和MASK必须要保证没有屏蔽中断,GPIO是不属于子中断,所以不用设置SUBMASK,MODE和Priority保存默认值即可,设置INTMSK(0x4A000008) 2.EINT4_7对应4个中断,分开设置需要设置EINTMASK(0x560000A

[国嵌攻略][043][栈初始化]

栈概念 栈是一种具有后进先出性质的数据组织方式.栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置 满栈和空栈 根据sp指针指向的位置,栈可以分为满栈和空栈: 1.满栈,当堆栈指针sp总是指向最后一个压入堆栈的数据 2.空栈,当堆栈指针sp总是指向下一个将要放入数据的空位置 3.ARM采用满栈 升栈和降栈 根据sp指针移动的方向,栈可以分为升栈和降栈: 1.升栈,随着数据的入栈,sp指针从低地址到高地址移动 2.降栈,随着数据的入栈,sp指针从高地址到低地址移动 3.ARM采用

[国嵌攻略][151][nandflash驱动程序设计]

初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函数. 1.使能时钟 2.进行物理地址到虚拟地址转换 3.硬件纠错初始化 4.搜索nand flash 5.注册分区信息 nand flash读操作 nand flash读写函数位于通用驱动/drivers/mtd/nand/nand_base.c.nand flash的读函数位于nand_read的

[国嵌攻略][062][触摸屏工作原理解析]

触摸屏初始化 1.设置AD转换时钟 ADCCON (1<<14)|(49<<6)   PRSCEN使能 PRSCVL ADC=PCLK/(VAL+1) 2.设置中断屏蔽 2.1.TC中断,当手指接触或移开时会产生的中断 2.2.ADC中断,当ADC转换完成后产生的中断 使能TC中断,屏蔽ADC中断,通过轮询查看ADC中断 INTMSK ~(1<<31) INTSUBMASK ~(1<<9) 3.进入等待中断模式(按下) ADCTSC 0xd3 TC中断处理