




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 UBOOT 的情况分析百科名片本词条主要介绍 U-BootU-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。目录简介目录结构主要功能编辑本段简介U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其
2、目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系
3、列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk以下简称W.D本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。选择U-Boot的理由: 开放源码; 支持多种嵌入式操作系统内核,如L
4、inux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; 较高的可靠性和稳定性; 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; 较为丰富的开发调试文档与强大的网络技术支持;编辑本段目录结构* board 目标板相关文件,主要包含SDRAM、FLASH驱动;* common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;*
5、cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;* driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)* doc U-Boot的说明文档;* examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;* include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;* lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;* net 与网络功能
6、相关的文件目录,如bootp,nfs,tftp;* post 上电自检文件目录。尚有待于进一步完善;* rtc RTC驱动程序;* tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;编辑本段主要功能U-Boot可支持的主要功能列表* 系统引导 支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统* 支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;* 基本辅助功能 强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤* Linux支持最为强劲;* 支持目标板环境参数多种存储方式,如FLASH、NV
7、RAM、EEPROM;* CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好;* 设备驱动 串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;* 上电自检功能 SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;* 特殊功能 XIP内核引导;Uboot 启动流程简介收藏尊重原创前面把内核的引导启动整理了 想想顺便把uboot也看看吧 = 3=uboot版本 : 1.3.0-rc3 由朗成的weibing进行了修改以提供板子的nand引导启动功能板子 : AT2440EVB在分析启动代
8、码之前先看一下S3C2440的NAND启动:在配置NAND启动模式之后,S3C2440上电会先将NAND中的0x0 - 0x1000共4096字节的数据拷贝到位于Bank0中的Boot Internal SRAM上Bank0如下图:可以看出Boot Internal SRAM为4KB大小,也正是因为Boot Internal SRAM只有4KB大小,所以只能从NAND中拷贝4K的内容 = 3= 这个Boot Internal SRAM是配置为NAND FLASH启动模式才有的这4K内容是什么呢? 这就要看Uboot的镜像文件中是如何进行连接的了连接脚本在board/smdk2440/u-boo
9、t.lds中,如下SECTIONS.=0x;.=ALIGN(4);.text: cpu/arm920t/start.o(.text) cpu/arm920t/s3c24x0/nand_read.o(.text)*(.text).=ALIGN(4);.rodata:*(.rodata).=ALIGN(4);.data:*(.data).=ALIGN(4);.got:*(.got).=.;_u_boot_cmd_start=.;.u_boot_cmd:*(.u_boot_cmd)_u_boot_cmd_end=.;.=ALIGN(4);_bss_start=.;.bss:*(.bss)_end=.
10、;.text为代码段,可以看出cpu/arm920t/start.o在代码段的最前面,所以会先执行start.o中的代码连接完成后的镜像文件的前4K如下cpu/arm920t/start.o(.text).text 0x33f80000 0x4e0 cpu/arm920t/start.o0x33f80050 IRQ_STACK_START0x33f80048 _bss_start0x33f8004c _bss_end0x33f80044 _armboot_start0x33f80000 _start0x33f80054 FIQ_STACK_STARTcpu/arm920t/s3c24x0/na
11、nd_read.o(.text).text 0x33f804e0 0x1b8 cpu/arm920t/s3c24x0/nand_read.o0x33f804e0 nand_read_ll*(.text).text 0x33f80698 0x64 board/smdk2440/libsmdk2440.a(lowlevel_init.o)0x33f8069c lowlevel_init.text 0x33f806fc 0x280 cpu/arm920t/libarm920t.a(interrupts.o)0x33f80934 do_fiq0x33f80880 do_undefined_instru
12、ction0x33f80744 show_regs0x33f80958 do_irq0x33f80728 bad_mode0x33f808c8 do_prefetch_abort0x33f8070c disable_interrupts0x33f80910 do_not_used0x33f808ec do_data_abort0x33f808a4 do_software_interrupt0x33f806fc enable_interrupts.text 0x33f8097c 0x250 cpu/arm920t/s3c24x0/libs3c24x0.a(interrupts.o)0x33f80
13、aa4 set_timer0x33f80a20 reset_timer0x33f8097c interrupt_init0x33f80ba0 get_tbclk0x33f80a90 get_timer0x33f809f0 reset_timer_masked0x33f80a24 get_timer_masked0x33f80ab4 udelay0x33f80b10 udelay_masked0x33f80bac reset_cpu0x33f80b8c get_ticks.text 0x33f80bcc 0x150 cpu/arm920t/s3c24x0/libs3c24x0.a(speed.o
14、)0x33f80c4c get_HCLK0x33f80cec get_PCLK0x33f80c44 get_FCLK0x33f80d14 get_UCLK.text 0x33f80d1c 0x1e8 cpu/arm920t/s3c24x0/libs3c24x0.a(cmd_s3c24xx.o)0x33f80d8c do_s3c24xx.text 0x33f80f04 0xdc cpu/arm920t/s3c24x0/libs3c24x0.a(serial.o)0x33f80f04 serial_setbrg0x33f80fa8 serial_tstc0x33f80f80 serial_putc
15、0x33f80f58 serial_init0x33f80fb8 serial_puts0x33f80f68 serial_getc.text 0x33f80fe0 0x140 lib_arm/libarm.a(_divsi3.o)0x33f80fe0 _divsi3如何设置从0x33f80000开始呢?这是链接的时候指定的在根目录下面的config.mk中有下面一句LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)关键就是其中的-Ttext $(TEXT_BASE),这句指明了代码段的起始地址而
16、TEXT_BASE在board/smdk2440/config.mk中定义 TEXT_BASE = 0x33F8 0000为什么是0x33F8 0000呢?这是将NAND中Uboot拷贝到RAM中的起始地址,所以在代码拷贝到RAM之前不能使用绝对地址来寻址数据,只能用相对地址在以下将用虚拟地址来指Uboot在RAM中的地址,也就是0x33F8 0000现在来看代码cpu/arm920t/start.S_start:b start_codeldrpc,_undefined_instructionldrpc,_software_interruptldrpc,_prefetch_abortldrpc
17、,_data_abortldrpc,_not_usedldrpc,_irqldrpc,_fiqb start_code在虚拟地址0x33F8 0000处 , 拷贝到Boot Internal SRAM后则位于0x0处,所以b start_code是第一条执行的指令,start_code在cpu/arm920t/start.S中代码如下:/读取CPSR寄存器的内容到R0mrsr0,cpsr/清除R0中的0 - 4 这5个位后保存到R0中/也就是清除用户模式位bicr0,r0,#0x1f/置R0的0 1 4 6 7 位为真/也就是选择SVC模式/关闭中断和快速中断orrr0,r0,#0xd3/将R
18、0中的值保存到CPSR上msrcpsr,r0#definepWTCON0x#defineINTMSK0x4A/* Interupt-Controller base addresses */#defineINTSUBMSK0x4A00001C#defineLOCKTIME0x4c#defineMPLLCON 0x4c#defineUPLLCON 0x4c#defineCLKDIVN0x4C/* clock divisor register */#defineINTSUBMSK_val0xffff#defineMPLLCON_val(18412)+(24)+2)/*406M*/#defineUPL
19、LCON_val (6012)+(44)+2)/* 47M */#defineCLKDIVN_val7/* FCLK:HCLK:PCLK = 1:3:6 */#defineCAMDIVN0x4C/取得看门狗寄存器的地址ldr r0,=pWTCON/将R1寄存器清0mov r1,#0x0/将看门狗寄存器清0str r1,r0/* * mask all IRQs by setting all bits in the INTMR - default */设R1寄存器为0xFFFF FFFFmovr1,#0xffffffff/读取中断屏蔽寄存器的地址ldrr0,=INTMSK/将中断屏蔽寄存器中的位全
20、设1,屏蔽所有中断strr1,r0/# define INTSUBMSK_val0xffff/设R1寄存器为0xFFFFldrr1,=INTSUBMSK_val/读取辅助中断屏蔽寄存器的地址ldrr0,=INTSUBMSK/将辅助中断屏蔽寄中的11个中断信号屏蔽掉strr1,r0/# define LOCKTIME0x4c/读取PLL锁频计数器寄存器地址到R0中ldr r0,=LOCKTIME/将R1设为0x00FF FFFFldr r1,=0xffffff/M_LTIME为0xFFFF/U_LTIME为0x00FFstr r1,r0/* FCLK:HCLK:PCLK = 1:2:4 */*
21、default FCLK is 120 MHz ! */# define CLKDIVN0x4C/* clock divisor register */读取时钟分频寄存器的地址ldrr0,=CLKDIVN/# define CLKDIVN_val7 /* FCLK:HCLK:PCLK = 1:3:6 */将R1设为0x7movr1,#CLKDIVN_va/PDIVN - 1: PCLK has the clock same as the HCLK/2./HDIVN - 11 : HCLK = FCLK/3 when CAMDIVN8 = 0./ HCLK = FCLK/6 when CAMDI
22、VN8 = 1.strr1,r0/* Make sure we get FCLK:HCLK:PCLK = 1:3:6 */# define CAMDIVN0x4C/读取摄像头时钟分频寄存器的地址ldr r0,=CAMDIVN/将R1设为0mov r1,#0/将摄像头时钟分频寄存器清0str r1,r0/* Clock asynchronous mode */MRC p15, 0, Rd, c1, c0, 0 ; read control register/读取控制寄存器中的值到R1中mrc p15,0,r1,c1,c0,0/31 iA bit Asynchronous clock select
23、/30 nF bit notFastBus selectorr r1,r1,#0xc/MCR p15, 0, Rd, c1, c0, 0 ; write control register/将R1中的值写到控制寄存器中mcr p15,0,r1,c1,c0,0/# define UPLLCON 0x4c/读取UPLL设置寄存器的地址到R0中ldrr0,=UPLLCON/# define UPLLCON_val (60 12) + (4 4) + 2) /* 47M */ldrr1,=UPLLCON_val/将R1中的值写入UPLL设置寄存器中strr1,r0/ARM920T为5级流水线,需要至少5
24、个周期来让指令生效nopnopnopnopnopnopnopnop/读取MPLL设置寄存器的地址到R0中ldrr0,=MPLLCON/# define MPLLCON_val(184 12) + (2 4) + 2)/*406M*/ldrr1,=MPLLCON_val/将R1中的值写入MPLL设置寄存器中strr1,r0#defineGPJCON 0xD0#defineGPJDAT 0xD4#defineGPJUP 0xD8/跳转到cpu_init_crit处执行/并将下一条指令的地址写入LR寄存器中blcpu_init_critcpu_init_crit在cpu/arm920t/start.
25、S中代码如下:cpu_init_crit:/* * flush v4 I/D caches */将R0寄存器置0movr0,#0/Invalidate ICache and DCache SBZ MCR p15,0,Rd,c7,c7,0/禁止指令和数据cachemcrp15,0,r0,c7,c7,0/* flush v3/v4 cache */Invalidate TLB(s) SBZ MCR p15,0,Rd,c8,c7,0mcrp15,0,r0,c8,c7,0/* flush v4 TLB */* * disable MMU stuff and caches */MRC p15, 0, R
26、d, c1, c0, 0 ; read control registermrcp15,0,r0,c1,c0,0/清除8 9 13 这3个位/8 - System protection/9 - ROM protection/13 - Base location of exception registers - 0 = Low addresses = 0x.bicr0,r0,#0x/ clear bits 13, 9:8 (-V- -RS)/清除0 1 2 7 这4个位/ 0 - MMU enable - 0 = MMU disabled./ 1 - Alignment fault enable
27、- 0 = Fault checking disabled./ 2 - DCache enable - 0 = DCache disabled./ 7 - Endianness - 0 = Little-endian operation.bicr0,r0,#0x/ clear bits 7, 2:0 (B- -CAM)/设置位1为真/ 1 - Alignment fault enable - 1 = Fault checking enabled.orrr0,r0,#0x/ set bit 2 (A) Align/设置位12为真/12 - ICache enable - 1 = ICache e
28、nabled.orrr0,r0,#0x/ set bit 12 (I) I-Cache/MCR p15, 0, Rd, c1, c0, 0 ; write control registermcrp15,0,r0,c1,c0,0/将返回地址保存到IP中movip,lr/跳转到lowlevel_init中执行bllowlevel_initcpu_init_crit在cpu/arm920t/start.S中代码如下:.globl lowlevel_init/读取下面标号为SMRDATA处的地址到R0中ldr r0,=SMRDATA/读取上面标号为_TEXT_BASE处的地址内容到R1中/也就是取得T
29、EXT_BASE的值到R1中ldrr1,_TEXT_BASE/计算SMRDATA的相对地址保存到R0中/SMRDATA为虚拟地址,而TEXT_BASE为虚拟地址的起始地址/而现在Uboot的起始地址并不为虚拟地址/TEXT_BASE为0x33F8 0000,SMRDATA为0x33F8 06C8/而现在程序运行在起始地址为0x0000 0000的地方/所以需要计算以0x0000 0000为标准的相对地址subr0,r0,r1/取得带宽与等待状态控制寄存器地址到R1中ldrr1,=BWSCON/* Bus Width Status Controller */一共需要设置13个寄存器,每个寄存器4
30、字节add r2,r0,#13*40:/读取R0所指的项的值到R3中后R0自加4字节ldr r3,r0,#4/将R3中的值保存到R1所指的地址中后R1自加4字节str r3,r1,#4/比较R0和R2是否相等,相等则说明13个寄存器全部设置完毕cmp r2,r0/不等则跳转到上面标号为0处的地址继续执行bne 0b/跳回到返回地址中继续执行movpc,lr.ltorg/* the literal pools origin */SMRDATA:.word(0+(B1_BWSCON4)+(B2_BWSCON8)+(B3_BWSCON12)+(B4_BWSCON16)+(B5_BWSCON20)+(
31、B6_BWSCON24)+(B7_BWSCON28).word(B0_Tacs13)+(B0_Tcos11)+(B0_Tacc8)+(B0_Tcoh6)+(B0_Tah4)+(B0_Tacp2)+(B0_PMC).word(B1_Tacs13)+(B1_Tcos11)+(B1_Tacc8)+(B1_Tcoh6)+(B1_Tah4)+(B1_Tacp2)+(B1_PMC).word(B2_Tacs13)+(B2_Tcos11)+(B2_Tacc8)+(B2_Tcoh6)+(B2_Tah4)+(B2_Tacp2)+(B2_PMC).word(B3_Tacs13)+(B3_Tcos11)+(B3_T
32、acc8)+(B3_Tcoh6)+(B3_Tah4)+(B3_Tacp2)+(B3_PMC).word(B4_Tacs13)+(B4_Tcos11)+(B4_Tacc8)+(B4_Tcoh6)+(B4_Tah4)+(B4_Tacp2)+(B4_PMC).word(B5_Tacs13)+(B5_Tcos11)+(B5_Tacc8)+(B5_Tcoh6)+(B5_Tah4)+(B5_Tacp2)+(B5_PMC).word(B6_MT15)+(B6_Trcd2)+(B6_SCAN).word(B7_MT15)+(B7_Trcd2)+(B7_SCAN).word(REFEN23)+(TREFMD22
33、)+(Trp20)+(Trc18)+(Tchr16)+REFCNT).word 0x32.word 0x30 .word 0x30执行mov pc, lr后将返回到cpu_init_crit中剩下来还有2条指令/恢复返回地址到LRmovlr,ip/跳转到返回地址movpc,lr执行完毕之后将返回到start_code中执行接下来的代码代码如下:/#define GPJCON 0xD0/取得J端口控制寄存器的地址到R0中LDR R0,=GPJCON/将R1设置为0x1 5555LDR R1,=0x15555/将R1中的值保存到J端口控制寄存器/GPJ0 - 01 - Output/GPJ1 -
34、01 - Output/GPJ2 - 01 - Output/GPJ3 - 01 - Output/GPJ4 - 01 - OutputSTR R1,R0/#define GPJUP0xD8/取得J端口上拉功能寄存器的地址到R0中LDR R0,=GPJUP/将R1设置为0x1FLDR R1,=0x1f/将R1中的值保存到J端口上拉功能寄存器/禁止GPJ0 - GPJ4的上拉功能STR R1,R0/#define GPJDAT 0xD4/取得J端口数据寄存器的地址到R0中LDR R0,=GPJDAT/将R1设为0x0LDR R1,=0x00/将R1中的值保存到J端口数据寄存器/将J端口数据寄存器
35、清0STR R1,R0/下面是NAND数据拷贝过程/relocate:copy_myself:/#define S3C2440_NAND_BASE0x4E/取得Nand Flash设置寄存器的地址movr1,#S3C2440_NAND_BASE/将R2设为0xFFF0ldrr2,=0xfff0/ initial value tacls=3,rph0=7,rph1=7/#define oNFCONF0x00/读取Nand Flash设置寄存器中的值到R3中ldrr3,r1,#oNFCONF/将R3或上R2后保存到R3中orrr3,r3,r2/将R3中的值保存到Nand Flash设置寄存器中/T
36、WRPH0 - 111 - Duration = HCLK * (TWRPH0 + 1)/TACLS - 11 - Duration = HCLK * TACLSstrr3,r1,#oNFCONF/#define oNFCONT0x04/读取Nand Flash控制寄存器中的值到R3中ldrr3,r1,#oNFCONT/将R3的0位置1orrr3,r3,#1/ enable nand controller/将R3中的值保存到Nand Flash控制寄存器中/Mode - 1:Nand Flash Controller Enablestrr3,r1,#oNFCONT/读取虚拟起始地址到R0中ld
37、rr0,_TEXT_BASE/* upper 128 KiB: relocated uboot */预留malloc所需要的空间subr0,r0,#CFG_MALLOC_LEN/* malloc area */预留bdinfo所需要的空间subr0,r0,#CFG_GBL_DATA_SIZE/* bdinfo */预留中断和快速中断向量表空间subr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)/预留12字节给中断栈subsp,r0,#12/* leave 3 words for abort-stack */ copy u-boot to R
38、AM/读取虚拟起始地址到R0中,作为目标地址ldrr0,_TEXT_BASE/将R1设为0,作为源地址mov r1,#0x0/将UBOOT大小的值保存在R2中,作为数据大小movr2,#CFG_UBOOT_SIZE/跳转到nand_read_ll处执行/并将下一条指令的地址保存在LR中blnand_read_llnand_read_ll的原型为int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)之前设置的R0 R1 R2为它的3个参数R0 - bufR1 - start_addrR2 - sizenan
39、d_read_ll的代码在cpu/arm920t/s3c24x0/nand_read.c中intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)inti,j;/检测源地址和大小是否在NandFlash的边界上if(start_addr&NAND_BLOCK_MASK)|(size&NAND_BLOCK_MASK)/不在边界上则返回-1表示出错return-1;/* invalid alignment */* chip Enable */ #define nand_select()(NFCONT &= (1 1)/置NAN
40、D Flash控制寄存器中除Reg_nCE外所有的位为1/Reg_nCE - NAND FLASH Memory nFCE signal control/0 - Force nFCE to low (Enable chip select)nand_select();/ #define nand_clear_RnB()(NFSTAT |= (1 2)/置NAND Flash操作状态寄存器中的RnB_TransDetect位为1/When RnB low to high transition is occurred, this value set and issue interrupt if en
41、abled./To clear this value write 1/1: RnB transition is detectednand_clear_RnB();for(i=0;i10;i+);/从源地址的首地址开始历便所要拷贝的数据大小for(i=start_addr;i(start_addr+size);)/检测地址是否在NAND Flash的边界上if(start_addr%NAND_BLOCK_SIZE=0)/检测是否为坏块if(is_bad_block(i)/* Bad block */向后延伸一个存储块i+=NAND_BLOCK_SIZE;size+=NAND_BLOCK_SIZE
42、;/跳到下一块continue;j=nand_read_page_ll(buf,i);/指向下一块i+=j;buf+=j;/LED_FLASH();/* chip Disable */ #define nand_deselect()(NFCONT |= (1 1)/置Reg_nCE位为1/NAND Flash Memory nFCE signal control/1: Force nFCE to High(Disable chip select)nand_deselect();return0;nand_read_ll将Uboot从NAND中拷贝到RAM中拷贝完成后将返回到start_code接
43、下来的代码如下:/检测R0是否为0,R0为nand_read_ll的返回值tstr0,#0x0/为0则说明无错,跳转到ok_nand_read处执行beqok_nand_readok_nand_read:/将R0设为0movr0,#0/ldrr1, =0x33f00000/将R1设为虚拟地址起始处ldrr1,_TEXT_BASE/检测0x400个字节movr2,#0x400/ 4 bytes * 1024 = 4K-bytesgo_next:/读取R0处地址的数据到R3中/然后R0自加4字节ldrr3,r0,#4/读取R1处地址的数据到R4中/然后R1自加4字节ldrr4,r1,#4/比较R3和R4的数据是否相等/也就是检测Boot Internal SRAM和RAM中的数据是否相等/以保证数据无错teqr3,r4/不等则跳转到notmatchbnenotmatch/相等则R2自减4subsr2,r2,#4/当R2为0则跳转到done_nand_readbeqdone_nand_read/R2不为0则跳转回go_next继续检测bnego_nextdone_nand_read: LDR R0,=GPJDAT LDR R1,=0x2 STR R1,R0stack_setup:/读取虚拟起始地址到R0中ldrr0,_TEXT_BASE/* upper 128 KiB: r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学习网络技术的正确方式试题及答案
- 计算机二级MySQL语言应用规范试题及答案
- 后勤装备运行管理制度
- 公司往来文件管理制度
- 宿舍天台物资管理制度
- 培训基地门禁管理制度
- 公司注册商标管理制度
- 小区物业车库管理制度
- 出租工位平台管理制度
- 员工待岗轮休管理制度
- 快手信息流广告优化师(初级)认证考试题库(附答案)
- 2023-2024年外卖骑手行业现状及发展趋势研究报告
- 染料敏化太阳能电池材料课件
- 建工集团全资子公司负责人年度经营业绩考核办法
- 2025年湖北省武汉市高考数学模拟试卷(附答案解析)
- 融汇画方网络准入设备技术白皮书
- 道口抓拍系统施工方案
- 三星堆-巴蜀与青铜文化的见证
- 人工智能导论(天津大学)知到智慧树章节答案
- 详尽的施工方案
- DB3305T 323-2024政府储备粮绿色仓储技术规范
评论
0/150
提交评论