mini2440启动代码分析

合集下载

mini2440调试进不了中断解决方案

mini2440调试进不了中断解决方案

ldr r0,=SRCPND str r1,[r0] ldr r0,=INTPND str r1,[r0] ldr r0,=INTSUBMSK ldr r1,=0x7fff @all sub interrupt disable, 2002/04/10 str r1,[r0] @@@设置频率 mov r1, #CLK_CTL_BASE ldr r2, clock_locktime str r2, [r1, #oLOCKTIME] mov r1, #CLK_CTL_BASE ldr r2, clkdivn_value str r2, [r1, #oCLKDIVN] mrc p15, 0, r1, c1, c0, 0 @ read ctrl register orr r1, r1, #0xc0000000 @ Asynchronous mcr p15, 0, r1, c1, c0, 0 @ write ctrl register mov r1, #CLK_CTL_BASE ldr r2, mpll_value @ clock default str r2, [r1, #oMPLLCON] @@@@初始化串口 InitUART: @set GPIO for UART mov r1, #GPIO_CTL_BASE add r1, r1, #oGPIO_H ldr r2, gpio_con_uart str r2, [r1, #oGPIO_CON] ldr r2, gpio_up_uart str r2, [r1, #oGPIO_UP] ldr r1, SerBase mov r2, #0x0 str r2, [r1, #oUFCON] str r2, [r1, #oUMCON] mov r2, #0x3 str r2, [r1, #oULCON] ldr r2, =0x245 str r2, [r1, #oUCON] .equ UART_BRD , ((UART_PCLK / (UART_BAUD_RATE*16)) - 1) mov r2, #UART_BRD str r2, [r1, #oUBRDIV] mov r3, #100 InitUART1:

Mini2440通过NFS启动系统

Mini2440通过NFS启动系统

Mini2440通过NFS启动系统一开始学习linux嵌入式就是一个摸索的过程,前面似懂非懂的完成了u-boot以及内核的基本功能移植,并且编译、下载至mini2440内存运行,流程走到了文件系统。

参照技术手册,想先移植文件系统,通过NFS启动。

环境介绍:windows xp,超级终端串口连接开发板Vmvare6+redhat9虚拟机IP:192.168.1.24 Submask:255.255.255.0 Gateway192.168.1.1主机IP:192.168.1.100 Submask:255.255.255.0 Gateway192.168.1.1网友发布的虚拟机NFS配置方法:1、miniarm2440说明书第202页中的 /etc/exports ,内容中的/opt/FriendARM/MINI2440/root_nfs *(rw,sync,no_root_sqush) ,将MINI2440应改为mini2440;2、vmware连网要改为桥接方式,VM->settings->Hardware->Netwaor Adapter,在右边将Network Connection,改为Bridged,3、vmware中Edit->Virtual Network Editor->Host Virtual Network Mapping中的 VMnet0选为你的计算机网卡。

4、网卡设置,计算机上网网卡IP:192.168.1.100,子网掩码:255.255.255.0,网关:192.168.1.1,DNS:192.168.1.1redhat9.0中网卡设计IP:192.168.1.24,子网掩码:255.255.255.0,网关:192.168.1.1,DNS:192.168.1.15、进入超级终端Supervivi 后,用以下指令Supervivi>param set linux_cmd_line "console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.24:/opt/FriendlyARM/mini2440/root_nfsip=192.168.1.70:192.168.1.24:192.168.1.24:255.255.255.0:sbc244 :eth0:off" 就可以引导了按照这个配置后产生问题:开发板在上电后在串口输入param set linux_cmd_line "console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.24:/home/jiaxinxu/mini2440/root_nfsip=192.168.1.70:192.168.1.24:192.168.1.24:255.255.255.0:sbc244 :eth0:off" 后板子会启动并通过NFS加载文件系统:PC机上的/opt//mini2440/root_nfs但是上电后卡在Looking up port RPC 100003/2 ON 192.168.1.2处portmap: server 192.168.1.24 not responding, timed outRoot-NFS: Unable to get mountd port number from server, using default网上搜遍了相关介绍的文章,不得其解。

配置NFS服务器启动mini2440

配置NFS服务器启动mini2440

NFS启动mini2440本文仅是学习的总结,仅供参考。

首先对NFS启动系统有一个感性的认识,NFS就是Network File System网络文件系统,通过NFS启动系统就是文件系统实际在宿主机上,有很大的硬盘空间。

在目标机上可以打开宿主机上的目录,看上去就相当于windows中的文件共享,别人共享的目录你在自己的电脑上可以查看,可以打开里面的文件,就像在你电脑上一样。

接下来开始吧。

硬件连接,串口线连接电脑和mini2440,还有网线把mini2440的网络端口与电脑的网络端口连接。

系统为红帽企业版五第一步:首先查看电脑或虚拟机里是否安装了NFS服务器。

运行# setup,将出现系统配置菜单如图首先进入Firewall configuration中把防火墙关了,把selinux设置成disable,不详细介绍接下来选择系统服务system services回车进入后如图查看有没有[]nfs项,有的话就说明已经安装了NFS服务器。

没有的话在系统光盘,或者是下载的镜像文件中找到NFS服务器的安装包,安装上就行了。

第二步:配置NFS服务器,要修改/etc/exports文件# vi /etc/exports加入允许被其他计算机访问的目录和访问权限原文见可能是空白的,在首行加入如下代码/nfsroot/rootfs 192.168.1.*(rw,sync,no_root_squash)1./nfsroot/rootfs:允许被其他计算机访问的目录,这里是安装文件系统的目录2.192.168.1.*:被允许访问该目录的客户端的地址,这里配置凡是与虚拟机ip(192.168.1.100)处于同一网段的客户机都可以访问3.rw:权限可读可写4.sync:同步写磁盘(async:资料会先暂存与内存当中,而非直接写入硬盘)5.no_root_squash:表示客户端root用户对该目录具备写权限第三步:启动NFS服务器,使用如下命令# /etc/init.d/nfs start或是重启NFS用如下命令# /etc/init.d/nfs restart如上图所示说明NFS服务器正常启动了,接下来制作根文件系统,可参考国嵌实验手册,不详细介绍。

mini2440 root_qtopia

mini2440 root_qtopia

mini2440 root_qtopia 文件系统启动过程分析(转载)对于mini2440最新的root_qtopia文件系统启动过程,我在这里做了一些简单的分析,和大家分享一下经验,不足之处也请大家及时指出。

其实,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启。

由于默认的内核命令行上有init=/linuxrc, 因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc。

这是一个指向/bin/busybox的链接,也就是说,系统起来后运行的第一个程序也就是busybox 本身。

这种情况下,busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox 源代码init/init.c中的parse_inittab()函数)。

而事实上,root_qtopia中并没有/etc/inittab这个配置文件,根据busybox的逻辑,它将生成默认的配置复制代码1. static void parse_inittab(void)2. {3. #if ENABLE_FEATURE_USE_INITTAB4. char *token[4];5. parser_t *parser = config_open2("/etc/inittab", fopen_for_read);6.7. if (parser == NULL)8. #endif9. {10. /* No inittab file -- set up some default behavior */11. /* Reboot on Ctrl-Alt-Del */12. new_init_action(CTRLALTDEL, "reboot", "");13. /* Umount all filesystems on halt/reboot */14. new_init_action(SHUTDOWN, "umount -a -r", "");15. /* Swapoff on halt/reboot */16. if (ENABLE_SWAPONOFF)17. new_init_action(SHUTDOWN, "swapoff -a", "");18. /* Prepare to restart init when a QUIT is received */19. new_init_action(RESTART, "init", "");20. /* Askfirst shell on tty1-4 */21. new_init_action(ASKFIRST, bb_default_login_shell, "");22. //TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users23. new_init_action(ASKFIRST, bb_default_login_shell, VC_2);24. new_init_action(ASKFIRST, bb_default_login_shell, VC_3);25. new_init_action(ASKFIRST, bb_default_login_shell, VC_4);26. /* sysinit */27. new_init_action(SYSINIT, INIT_SCRIPT, "");28. return;29. }其中,最重要的一个,就是new_init_action(SYSINIT, INIT_SCRIPT, ""),也就决定了接下去初始化的脚本是INIT_SCRIPT所定义的值。

MINI2440串口测试代码分析

MINI2440串口测试代码分析
Mini2440 有三个串口, USRT0,UART1,UART3。 对串口的操作有三种:串口初始化,串口接收,串口发送 1 串口初始化 1)串口初始化函数 void Uart_Init(int pclk,int baud) { int i; if(pclk == 0) pclk = PCLK; //UART channel 0 FIFO control register, FIFO disable //UART channel 1 FIFO control register, FIFO disable //UART channel 2 FIFO control register, FIFO disable //UART chaneel 0 MODEM control register, AFC disable //UART chaneel 1 MODEM control register, AFC disable //Line control register : Normal,No parity,1 stop,8 bits //正常模式,无校验位,每帧一个停止位,8 位数据 [9] [8] [7] [6] [5] [1:0] Rx Int, Rx Time Out, Rx err, Loop-back, Send break, 1 01 PCLK Level 01 Pulse Disable Generate Normal 0 , 0 1 0 Tx Int, rUFCON0 = 0x0; rUFCON1 = 0x0; rUFCON2 = 0x0; rUMCON0 = 0x0; rUMCON1 = 0x0; //UART0 rULCON0 = 0x3; // [4] [10] [3:2] // Clock Sel, // 0 Normal , // 0

mini2440裸板烧写u-boot

mini2440裸板烧写u-boot

1.J-Link commander:如果没有发现检测到CPU,就在里面执行usb命令连接JLink,再执行r命令识别处理器(复位)2.3 下载运行特制的程序对于S3C2410、S3C2440处理器,它们内部有4K的SRAM,当使用Nor Flash启动时,地址为0x40000000;当使用Nand Flash启动时,地址为0。

对于S3C2410、S3C2440开发板,一般都外接64M的SDRAM。

SDRAM能被使用之前,需要经过初始化。

所以,先把一个init.bin下载到内部SRAM去运行,它执行SDRAM的初始化;然后再下载一个比较大的程序,比如u-boot到SDRAM去动行,它将实现对Nor、Nand Flash的操作。

以下是在J-Link commander里的命令,假设init.bin、u-boot.bin在e:盘下。

1. speed 12000 //设置TCK为12M,下载程序时会很快2. 下载并运行init.bin,这是用来初始化SDRAM的2.1 如果是NAND启动:(跳线打到NAND)loadbin e:\init.bin 0setpc 0g2.2 如果是Nor启动:(跳线打到NOR)loadbin e:\init.bin 0x40000000setpc 0x40000000g3. 下载特制的uboot:hloadbin e:\u-boot.bin 0x33f80000 链接地址setpc 0x33f80000g同理可以通过J-link下载其他程序文件:hloadbinyour_file.bin 0x30000000g这时,你的文件已经被下载到SDRAM 0x30000000去了。

5.使用u-boot烧写Flash(1).通过u-boot烧写到Nor Flash:在u-boot里执行:protect off all // 解锁erase 0 2ffff // 擦除从0地址开始的大小为0x30000的NOR Flash扇区(大小为可擦除块的整数倍,可以运行flash info命令查看)cp.b 0x30000000 0 30000 // 把前面下载到0x30000000的程序烧写到NOR去(2).通过u-boot烧写到Nand Flash:在u-boot里执行:nand erase 0 30000 // 擦除从0地址开始的大小为0x30000的Nnad Flash扇区nand write.jffs2 30000000 0 30000 // 把前面下载到0x30000000的程序烧写到Nand去注意,上面用的2ffff、30000等数字是192K,如果你的程序比较小,请自行设置。

mini2440 nandflash操作总结

mini2440 nandflash操作总结

Mini2440 nand flash 操作总结首先要感谢CSDN论坛的赵春江老师的文章。

这篇文章基本上是他文章的内容。

百度上搜“CSDN 赵春江”就能找到。

一:硬件连接Nand flash操作对于自己编写mini2440启动代非常关键。

因为一般来说,嵌入式系统都有一片nand flash用来作为存储器。

所以掌握nand flash 的操作非常的必要和关键。

在操作之前,首先应该对nand flash 的硬件上有一定的了解。

我的mini2440板子自带的是K9F1G08U0A。

大小是128M。

其芯片上的重要引脚如下:I/O0~I/O7:数据总线,用于nandflash的所有命令,地址的输入,和数据的双向传输.CE:芯片使能引脚CLE (Command Latch Enable):命令锁存允许引脚ALE(Address Latch Enable):地址锁存允许引脚WE/:写芯片允许引脚RE/:读芯片允许引脚RB:状态读取引脚(低电平表示忙;高电平表示空闲)其他引脚:诸如电源之类因为S3C2440硬件自带有nand flash控制器,所以具有相对应的引脚可以和nand flash 芯片连接。

系统总线引脚DA TA0~DA TA7:直接与I/O0~I/O7相连接nFCE/GPA22 :直接与CE引脚相连CLE/GPA17:直接与CLE引脚相连ALE/GPA18 :直接与ALE引脚相连nFWE/GPA19:直接与WE/引脚相连nFRE/GPA20 :直接与WE/引脚相连FRnB:直接与RB引脚相连除此之外,S3C2440还有另外几个引脚用于配置nandflash控制器。

比如页大小,地址周期数等等。

这些引脚主要有如下:OM[1:0] ; NCON ; GPG13 ; GPG14 ; GPG15。

他们的配置方式在S3C2440说明书上已经很详细。

所以综上所述,S3C2440 与nandflash(K9F1G08U0A)的硬件连接图如下所示:二:nand flsah 工作原理简介Nand flash 主要是用于大容量的存储。

u-boot-2008.10移植到mini2440详解及源代码

u-boot-2008.10移植到mini2440详解及源代码

u-boot-2008.10移植到mini2440详解及源代码u-boot移植到mini2440过程及源代码这篇文章写于2008.12.28日,主要记录了我移植u-boot-2008.10的过程,并附上了移植好的patch文件。

移植好的u-boot-2008.10适用友善公司的mini2440和阳初公司的yc2410。

其它的开发板,可能要根据相应的电路配置做稍许修改。

我的移植是使用非nand-leagcy方法的,移植好的u-boot-2008.10功能除了基本功能外,加上了yaffs1映像的写入功能,加入了从nand flash启动的功能,改善了一些操作感受,往nand写入数据时,可以显示进度。

在使用上要注意的是使用nandwirte.yaffs命令写入yaffs1映像时,文件长度参数一定要与yaffs1映像的大小完全一致,否则有可能产生假坏块。

我的开发环境是vmware,kubuntu8.04。

交叉编译是用crosstool0.43编译生成的arm-linux-gcc 4.1.0,libc2.3.2。

(本人也成功移植了linux2.6.27.9到mini2440开发板上,请看我另一篇文章/rat%5Flinux/blog/item/0275c60155b18a80e950cdfc.html)一直想自已移植一套u-boot,但因为工作忙,一直都没有做,最近时间比较多,买了一套友善之臂的mini2440开发板,此板电路与该公司之前的QQ2440基本一至。

而该开发板自带的u-boot的移植的还不很完善,于是下决心自已移植u-boot。

要移植就用最新版的u-boot 移植,于是决定在u-boot.2008.10版上进行移植,此版是2008年10月的新版,于之前的版本有较大改动,所以版本号也没有延续以前的编号方式,而改为2008.10。

我的移植目的,是要能同时持S3C2440,S3C2410(手中还有一块阳初公司出的S3C2410开发板),从nand flash 启动u-boot,因为目前大多数应用都是只有nand flash的,所以没打算从nor flash启动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mini2440启动代码分析嵌入式_WK 2010年11月22日分析;=========================================;分析注释字体颜色:颜色;代码中宏变量颜色:颜色定义的常量的颜色:颜色;代码中关键字颜色:颜色其中一段代码用“=====“分隔开;=========================================; NAME: 2440INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks 配置内存,中断,堆载; Initialize C-variables 设定 C-变数初值; HISTORY:; 2002.02.25:kwtark: ver 0.0; 2002.03.20:purnnamu: Add some functions for testing STOP, Sleep mode;为测试停止增加一些功能,睡眠模态; 2003.03.14:DonGo: Modified for 2440.;=========================================;GET类似于C语言的include,option.inc文件内定义了一些全局变量,memcfg.inc文件内定义了关于内存bank的符号和数字常量,2440addr.inc文件内定义了用于汇编的s3c2440寄存器变量和地址,用GET来引入一些头文件GET option.incGET memcfg.inc ;内存的配置GET 2440addr.inc ;2440中地址的配置;=========================================;内存的刷新格式BIT_SELFREFRESH EQU(1<<22);=========================================;定义的一些模式;Pre-defined constantsUSERMODE EQU 0x10 用户模式FIQMODE EQU 0x11 快速中断模式IRQMODE EQU 0x12 中断模式SVCMODE EQU 0x13 管理模式ABORTMODE EQU 0x17 终止模式UNDEFMODE EQU 0x1b 未定义模式MODEMASK EQU 0x1f ;相关掩码CPSR中的I位和F位置1,表示禁止任何中断NOINT EQU 0xc0;=========================================; 堆栈的位置UserStack EQU (_STACK_BASEADDRESS-0x3800);0x33ff4800 ~;((stack_baseaddress 开始地址)—0x3800) →UserStackSVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~;=========================================;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used. 检查编译器;[ | ] 是ARM汇编控制伪指令,就是IF ELSE ENDIF,GBLL THUMBCODE 全局定义thumb code[ {CONFIG} = 16 配置是16位THUMBCODE SETL{TRUE} 设置THUMB态为真CODE32|THUMBCODE S ETL{FALSE} CODE 要是32 THUMB为假];=========================================;宏定义,在后面出现MOV_PC_LR时,这个宏会被自动展开该宏的作用是跳出子程序,返回被调用处MACRO宏定义开始MOV_PC_LR →宏名定义一个MOV_PC_LR的宏[ THUMBCODE 如果是THUMB状态跳转到LRbx lr| mov pc,lr 是ARM态把LR存放到PC中]MEND宏定义结束;=========================================;该宏定义的作用是有条件地(当Z=1时)跳出子程序,返回被调用处MACROMOVEQ_PC_LR →宏名定义宏MOVEQ_PC_LR[ THUMBCODEbxeq lr|moveq pc,lr]MEND;=========================================;;两个蓝色背景的是可替代的变量加有$符号分别用箭头指出替代的位置;MACRO$HandlerLabel HANDLER$HandleLabel$HandlerLabelsub sp,sp,#4 ; 减堆栈用来存储跳转的地址stmfd sp!,{r0}; (lr does not push because it return to original address) 把寄存器中的数压入满减的堆栈ldr r0,=$HandleLabel; 加载HANDLELABEL的地址ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stackldmfd sp!,{r0,pc} ;出栈时把黄色部分弹出来低位给低寄存器把$HandleLabel地址给了PCROM的起始位置ROM的结束位置RAM的起始位置ZI的起始位置MMU的函数,用于设置时钟IMPORT Main ; The main entry of mon programIMPORT CopyProgramFromNand ;导入用于复制从Nand Flash中的映像文件到SDRAM 中的函数;=========================================;定义初始化代码段AREA Init,CODE,READONLYENTRYEXPORT__ENTRY声明_ENTRY为外部标号;=========================================;在0x0处的异常中断是复位异常中断,是上电后执行的第一条指令;变量ENDIAN_CHANGE 用于标记是否要从小端模式改变为大端模式,因为编译器初始模式是小端模式,如果要用大端模式,就要事先把该变量设置为TRUE,否则为FLASE;变量ENTRY_BUS_WIDTH用于设置总线的宽度,因为用16位和8位宽度来表示32位数据时,在大端模式下,数据的含义是不同的.;由于要考虑到大端和小端模式,以及总线的宽度,因此该处看似较复杂,其实只是一条跳转指令:当为大端模式时,跳转到ChangeBigEndian函数处,否则跳转到ResetHandler函数处ResetEntryChangeBigEndian[ ENTRY_BUS_WIDTH=32DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0 得到CP15中的寄存器C1,放入r0中DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian;执行orr r0,r0,#0x80,置r0中的第7位为1,表示选择大端模式DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0 ;执行mcr p15,0,r0,c1,c0,0,把r0写入CP15中的寄存器C1][ ENTRY_BUS_WIDTH=16DCD 0x0f10ee11DCD 0x0080e380DCD 0x0f10ee01][ ENTRY_BUS_WIDTH=8DCD 0x100f11eeDCD 0x800080e3DCD 0x100f01ee]DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.DCD 0xffffffffDCD 0xffffffffDCD 0xffffffffDCD 0xffffffffb ResetHandler;=========================================;当系统进入异常中断后,由存放在0x0~0x1C处的中断向量地址中的跳转指令,跳转到此处相应的位置,并由事先定义好的宏定义再次跳转到相应的中断服务程序中;宏的调用HANDLER是宏名HandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabort;=========================================;下面这段代码是用于处理非向量中断,即由软件程序来判断到底发生了哪种中断,然后跳转到相应地中断服务程序中;具体地说就是,当发生中断时,会置INTOFFSET寄存器相应的位为1,然后通过查表(见该程序末端部分的中断向量表),找到相对应的中断入口地址;观察中断向量表,会发现它与INTOFFSET寄存器中的中断源正好相对应,即向量表的顺序与INTOFFSET寄存器中的中断源的由小到大的顺序一致,因此我们可以用基址加变址的方式很容易找到相对应的中断入口地址。

其中基址为向量表的首个中断源地址,变址为INTOFFSET寄存器的值乘以4(因为系统是用4个字节单元来存放一个中断向量)IsrIRQ ;Interrupt Request,即是“中断请求”sub sp,sp,#4 ;在栈中留出4个字节空间,以便保存中断入口地址stmfd sp!,{r8-r9} ;由于要用到r8和r9,因此保存这两个寄存器内的值ldr r9,=INTOFFSET ;把INTOFFSET寄存器地址装入r9内ldr r9,[r9] ;读取INTOFFSET寄存器内容ldr r8,=HandleEINT0 ;得到中断向量表的基址add r8,r8,r9,lsl #2 ;用基址加变址的方式得到中断向量表的地址ldr r8,[r8] ;得到中断服务程序入口地址str r8,[sp,#8] ;使中断服务程序入口地址入栈ldmfd sp!,{r8-r9,pc} ;使r8,r9和入口地址出栈,并跳到中断服务程序中;=========================================;定义一个数据缓冲池,供ldr伪指令使用LTORG声请一个文字池;=======; ENTRY;板子上电和复位后,程序开始从位于0x00执行b ResetHandler,程序跳转到这里执行;=======ResetHandlerldr r0,=WTCON ;关闭电子狗ldr r1,=0x0str r1,[r0]ldr r0,=INTMSKldr r1,=0xffffffff ;关闭所有中断str r1,[r0]ldr r0,=INTSUBMSKldr r1,=0x7fff ;关闭所有子中断str r1,[r0];由于启动文件是无法仿真的,因此为了判断该文件中语句的正确与否,往往在需要观察的地方加上一段点亮LED的程序,这样就可以知道程序是否已经执行到此处;下面方括号内的程序就是点亮LED的小程序[ {TRUE};rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);; Led_Displayldr r0,=GPBCONldr r1,=0x00555555str r1,[r0]ldr r0,=GPBDATldr r1,=0x07festr r1,[r0]];=========================================;下列程序是用于设置系统时钟频率;To reduce PLL lock time, adjust the LOCKTIME register.;设置PLL的锁定时间常数,以得到一定时间的延时ldr r0,=LOCKTIMEldr r1,=0xffffffstr r1,[r0][ PLL_ON_START; Added for confirm clock divide. for 2440.; Setting value Fclk:Hclk:Pclk 设定三个时钟的值Fclk:Hclk:Pclkldr r0,=CLKDIVNldr r1,=CLKDIV_VAL ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.str r1,[r0]; MMU_SetAsyncBusMode and MMU_SetFastBusMode over 4K, so do not call here; call it after copy; [ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1. ;设置时钟模式为异步模式; bl MMU_SetAsyncBusMode; |; bl MMU_SetFastBusMode ; default value.; ];=========================================;program has not been copied, so use these directly没有被拷贝过所以只用这个[ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1. 设置时钟模式为异步模式mrc p15,0,r0,c1,c0,0orr r0,r0,#0xc0000000;R1_nF:OR:R1_iAmcr p15,0,r0,c1,c0,0| ;否则设置时钟模式为快速总线模式mrc p15,0,r0,c1,c0,0bic r0,r0,#0xc0000000;R1_iA:OR:R1_nFmcr p15,0,r0,c1,c0,0];=========================================;按照手册中的计算公式,确定MDIV、PDIV和SDIV;得到当系统输入时钟频率为12MHz的情况下,UCLK输出频率为48MHz;Configure UPLL 配置UPLLldr r0,=UPLLCONldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)str r1,[r0]nop ;Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed. 在设置UPLL后保证7个时钟的延迟保证写入nopnopnopnopnopnop;=========================================;Configure MPLL 配置MPLLldr r0,=MPLLCONldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=16.9344MHzstr r1,[r0]];=========================================;从SLEEP模式下被唤醒,类似于RESET引脚被触发,因此它也要从0x0处开始执行;Check if the boot is caused by the wake-up from SLEEP mode.;检查BOOT是否从睡眠状态变醒ldr r1,=GSTATUS2ldr r0,[r1]tst r0,#0x2 ; 检查GSTATUS2寄存器的第1位;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.bne WAKEUP_SLEEP ;被唤醒跳转;=========================================;设置一个被唤醒复位后的起始点地址标号,可以把它保存到GSTATUS3中;导出该地址标号,以便在C语言程序中使用EXPORT StartPointAfterSleepWakeUpStartPointAfterSleepWakeUp;关于内存控制寄存器一共有以BWSCON为开始的连续放置的13个寄存器,我们要一次性批量完成这13个寄存器的配置;因此开辟一段以SMRDATA为地址起始点的13个字单元空间,按顺序放入要写入的13个寄存器内容;Set memory control registers;ldr r0,=SMRDATAadrl r0, SMRDATA ;得到SMRDATA空间的首地址ldr r1,=BWSCON ; 得到BWSCON的地址add r2, r0, #52 ; 得到SMRDATA空间的末地址;完成13个字数据的复制ldr r3, [r0], #4str r3, [r1], #4cmp r2, r0bne %B0;=========================================;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;; When EINT0 is pressed, Clear SDRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check if EIN0 button is pressed e;检查EIN0按钮是否被按下ldr r0,=GPFCONldr r1,=0x0str r1,[r0] ; GPFCON=0,F口为输入ldr r0,=GPFUPldr r1,=0xffstr r1,[r0]ldr r1,=GPFDATldr r0,[r1] ; 读取F口数据bic r0,r0,#(0x1e<<1) ; 仅保留第1位数据,其他清0tst r0,#0x1 ; 判断第1位bne %F1 ; 不为0表示按钮没有被按下,则向前跳转,不执行清空SDRAM ;=========================================; Clear SDRAM Start 清除SDRAMldr r0,=GPFCONldr r1,=0x55aastr r1,[r0] ; GPF7~4为输出,GPF3~0为中断; ldr r0,=GPFUP; ldr r1,=0xff ; 上拉功能无效; str r1,[r0]ldr r0,=GPFDATldr r1,=0x0str r1,[r0] ;LED=****mov r1,#0mov r2,#0mov r3,#0mov r4,#0mov r5,#0mov r6,#0mov r7,#0mov r8,#0ldr r9,=0x4000000 ;64MB RAMldr r0,=0x30000000 ;RAM首地址stmia r0!,{r1-r8}subs r9,r9,#32bne %B0;Clear SDRAM End SDRAM清除结束;=========================================1;Initialize stacksbl InitStacks;===========================================================;下面的代码为把ROM中的数据复制到RAM中ldr r0, =BWSCONldr r0, [r0]ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot 读取OM[1:0]引脚状态;为0表示从NAND Flash启动,不为0则从NOR Flash启动bne copy_proc_beg ;do not read nand flashadr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot OM[1:0] == 0,从NAND Flash启动cmp r0, #0 ;if use Multi-ice,bne copy_proc_beg ;do not read nand flash for boot;nop;===========================================================nand_boot_beg[ {TRUE}bl CopyProgramFromNand ;复制NAND Flash到SDRAM|mov r5, #NFCONF;set timing valueldr r0, =(7<<12)|(7<<8)|(7<<4)str r0, [r5];enable controlldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0) str r0, [r5, #4]bl ReadNandIDmov r6, #0ldr r0, =0xec73cmp r5, r0beq %F1ldr r0, =0xec75cmp r5, r0beq %F1mov r6, #11bl ReadNandStatusmov r8, #0ldr r9, =ResetEntry2ands r0, r8, #0x1fbne %F3mov r0, r8bl CheckBadBlkcmp r0, #0addne r8, r8, #32bne %F43mov r0, r8mov r1, r9bl ReadNandPageadd r9, r9, #512add r8, r8, #14cmp r8, #5120bcc %B2mov r5, #NFCONF ;DsNandFlashldr r0, [r5, #4]bic r0, r0, #1str r0, [r5, #4]]ldr pc, =copy_proc_beg;===========================================================copy_proc_begadr r0, ResetEntryldr r2, BaseOfROMcmp r0, r2 ; 比较程序入口地址与连接器定义的RO基地址ldreq r0, TopOfROM ; 如果相等,把RO尾地址读取到r0中beq InitRam ; 如果相等,则跳转ldr r3, TopOfROM ; 否则,把RO尾地址读取到r3中;下列循环体为在程序入口地址与连接器定义的RO基地址不相等的情况下,把程序复制到RAM中ldmia r0!, {r4-r7}stmia r2!, {r4-r7}cmp r2, r3bcc %B0;修正非字对齐的情况sub r2, r2, r3sub r0, r0, r2InitRamldr r2, BaseOfBSSldr r3, BaseOfZero;下面循环体为复制已初始化的全局变量cmp r2, r3ldrcc r1, [r0], #4strcc r1, [r2], #4bcc %B0;下面循环体是为未初始化的全局变量赋值为0mov r0, #0ldr r3, EndOfBSS1cmp r2, r3strcc r0, [r2], #4bcc %B1ldr pc, =%F2 ;goto compiler address2; [ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1. 设置时钟模式为异步模式; bl MMU_SetAsyncBusMode; |; bl MMU_SetFastBusMode ; 设置时钟模式为快速总线模式; ];bl Led_Test;===========================================================;普通中断处理,当普通中断发生时,执行的是IsrIRQ; Setup IRQ handlerldr r0,=HandleIRQ ;This routine is neededldr r1,=IsrIRQ ;if there is not 'subs pc,lr,#4' at 0x18, 0x1cstr r1,[r0]; ;Copy and paste RW data/zero initialized data; ldr r0, =|Image$$RO$$Limit| ; Get pointer to ROM data; ldr r1, =|Image$$RW$$Base| ; and RAM copy; ldr r3, =|Image$$ZI$$Base|;; ;Zero init base => top of initialised data; cmp r0, r1 ; Check that they are different; beq %F2;1; cmp r1, r3 ; Copy init data; ldrcc r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4; strcc r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4; bcc %B1;2; ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment; mov r2, #0;3; cmp r3, r1 ; Zero init; strcc r2, [r3], #4; bcc %B3;完成最基本的初始化任务,跳转到由C语言撰写的Main()函数内继续执行其他程序,这里不能写main,因为写了main,系统会自动为我们完成一些初始化工作,而这些工作在这段程序中是由我们显式地人为完成的[ :LNOT:THUMBCODEbl Main ;Do not use main() because ......;ldr pc, =Main ;b .][ THUMBCODE ;for start-up code for Thumb modeorr lr,pc,#1bx lrCODE16bl Main ;Do not use main() because ......b .CODE32];=========================================InitStacks 初始化堆栈;Do not use DRAM,such as stmfd,ldmfd......;SVCstack is initialized before;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1';改变CPSR中M控制位,切换到相应的处理器模式下,为各自模式下的SP赋值mrs r0,cpsrbic r0,r0,#MODEMASKorr r1,r0,#UNDEFMODE|NOINTmsr cpsr_cxsf,r1 ;UndefModeldr sp,=UndefStack ; UndefStack=0x33FF_5C00orr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortModeldr sp,=AbortStack ; AbortStack=0x33FF_6000orr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;IRQModeldr sp,=IRQStack ; IRQStack=0x33FF_7000orr r1,r0,#FIQMODE|NOINTmsr cpsr_cxsf,r1 ;FIQModeldr sp,=FIQStack ; FIQStack=0x33FF_8000bic r0,r0,#MODEMASK|NOINTorr r1,r0,#SVCMODEmsr cpsr_cxsf,r1 ;SVCModeldr sp,=SVCStack ; SVCStack=0x33FF_5800;USER mode has not be initialized.;系统模式和用户模式共用一个栈空间,因此不用再重复设置用户模式堆栈; 系统复位后进入的是SVC模式,而且各种模式下的lr不同,因此要想从该函数内返回,要首先切换到SVC模式,再使用lr,这样可以正确返回了mov pc,lr;The LR register will not be valid if the current mode is not SVC mode.;===========================================================[ {TRUE}|ReadNandIDmov r7,#NFCONFldr r0,[r7,#4] ;NFChipEn();bic r0,r0,#2str r0,[r7,#4]mov r0,#0x90 ;WrNFCmd(RdIDCMD);strb r0,[r7,#8]mov r4,#0 ;WrNFAddr(0);strb r4,[r7,#0xc]1 ;while(NFIsBusy());ldr r0,[r7,#0x20]tst r0,#1beq %B1ldrb r0,[r7,#0x10] ;id = RdNFDat()<<8;mov r0,r0,lsl #8ldrb r1,[r7,#0x10] ;id |= RdNFDat();orr r5,r1,r0ldr r0,[r7,#4] ;NFChipDs();orr r0,r0,#2str r0,[r7,#4]mov pc,lr;=========================================ReadNandStatus 读取NAND状态mov r7,#NFCONFldr r0,[r7,#4] ;NFChipEn();bic r0,r0,#2str r0,[r7,#4]mov r0,#0x70 ;WrNFCmd(QUERYCMD);strb r0,[r7,#8]ldrb r1,[r7,#0x10] ;r1 = RdNFDat();ldr r0,[r7,#4] ;NFChipDs();orr r0,r0,#2str r0,[r7,#4]mov pc,lr;=========================================WaitNandBusy NAND正忙等待mov r0,#0x70 ;WrNFCmd(QUERYCMD);mov r1,#NFCONFstrb r0,[r1,#8]1 ;while(!(RdNFDat()&0x40));ldrb r0,[r1,#0x10]tst r0,#0x40beq %B1mov r0,#0 ;WrNFCmd(READCMD0);strb r0,[r1,#8]mov pc,lr;=========================================;检查内存的坏区CheckBadBlkmov r7, lrmov r5, #NFCONFbic r0,r0,#0x1f ;addr &= ~0x1f;ldr r1,[r5,#4] ;NFChipEn()bic r1,r1,#2mov r1,#0x50 ;WrNFCmd(READCMD2)strb r1,[r5,#8]mov r1, #5;6 ;6->5strb r1,[r5,#0xc] ;WrNFAddr(5);(6) 6->5strb r0,[r5,#0xc] ;WrNFAddr(addr)mov r1,r0,lsr #8 ;WrNFAddr(addr>>8)strb r1,[r5,#0xc]cmp r6,#0 ;if(NandAddr)movne r0,r0,lsr #16 ;WrNFAddr(addr>>16)strneb r0,[r5,#0xc]; bl WaitNandBusy ;WaitNFBusy();do not use WaitNandBusy, after WaitNandBusy will read part A!mov r0, #1001subs r0, r0, #1bne %B12ldr r0, [r5, #0x20]tst r0, #1beq %B2ldrb r0, [r5,#0x10] ;RdNFDat()sub r0, r0, #0xffmov r1,#0 ;WrNFCmd(READCMD0)strb r1,[r5,#8]ldr r1,[r5,#4] ;NFChipDs()orr r1,r1,#2str r1,[r5,#4]mov pc, r7;=========================================ReadNandPagemov r7,lrmov r4,r1mov r5,#NFCONFldr r1,[r5,#4] ;NFChipEn()bic r1,r1,#2mov r1,#0 ;WrNFCmd(READCMD0)strb r1,[r5,#8]strb r1,[r5,#0xc] ;WrNFAddr(0)strb r0,[r5,#0xc] ;WrNFAddr(addr)mov r1,r0,lsr #8 ;WrNFAddr(addr>>8)strb r1,[r5,#0xc]cmp r6,#0 ;if(NandAddr)movne r0,r0,lsr #16 ;WrNFAddr(addr>>16)strneb r0,[r5,#0xc]ldr r0,[r5,#4] ;InitEcc()orr r0,r0,#0x10str r0,[r5,#4]bl WaitNandBusy ;WaitNFBusy()mov r0,#0 ;for(i=0; i<512; i++)1ldrb r1,[r5,#0x10] ;buf[i] = RdNFDat()strb r1,[r4,r0]add r0,r0,#1bic r0,r0,#0x10000cmp r0,#0x200bcc %B1ldr r0,[r5,#4] ;NFChipDs()orr r0,r0,#2str r0,[r5,#4]mov pc,r7];=========================================================== LTORG;GCS0->SST39VF1601;GCS1->16c550;GCS2->IDE;GCS3->CS8900;GCS4->DM9000;GCS5->CF Card;GCS6->SDRAM;GCS7->unused;=========================================;连续13个内存控制寄存器的定义空间SMRDATA DATA; Memory configuration should be optimized for best performance; The following parameter is not optimized.; Memory access cycle parameter strategy; 1) The memory settings is safe parameters even at HCLK=75Mhz.; 2) SDRAM refresh period is for HCLK<=75Mhz.DCD(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON <<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))DCD((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_P MC)) ;GCS0DCD((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_P MC)) ;GCS1DCD((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_P MC)) ;GCS2DCD((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_P MC)) ;GCS3DCD((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_P MC)) ;GCS4DCD((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_P MC)) ;GCS5DCD((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6DCD((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7DCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)DCD0x32 ;SCLK power saving mode, BANKSIZE 128M/128MDCD0x30 ;MRSR6 CL=3clkDCD0x30 ;MRSR7 CL=3clkBaseOfROM DCD |Image$$RO$$Base|TopOfROM DCD |Image$$RO$$Limit|BaseOfBSS DCD |Image$$RW$$Base|BaseOfZero DCD |Image$$ZI$$Base|EndOfBSS DCD |Image$$ZI$$Limit|;=========================================;重新使数据字对齐ALIGN;Function for entering power down mode; 1. SDRAM should be in self-refresh mode.; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.; 4. The I-cache may have to be turned on.; 5. The location of the following code may have not to be changed.;=========================================;掉电模式函数;void EnterPWDN(int CLKCON);EnterPWDNmov r2,r0 ;r2=rCLKCON r0为该函数输入参数clkcontst r0,#0x8 ; 判断clkcon中的第3位,是否要切换到SLEEP模式bne ENTER_SLEEP ; 切换到SLEEP模式;=========================================;设置SDRAM为自刷新方式ENTER_STOP 停止入口ldr r0,=REFRESHldr r3,[r0] ;r3=rREFRESHmov r1, r3orr r1, r1, #BIT_SELFREFRESHstr r1, [r0] ;Enable SDRAM self-refresh;等待一段时间mov r1,#16 ;wait until self-refresh is issued. may not be needed.0 subs r1,r1,#1bne %B0ldr r0,=CLKCON ;enter STOP mode.str r2,[r0] ;置第2位,进入IDLE模式mov r1,#320 subs r1,r1,#1 ;1) wait until the STOP mode is in effect.bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off ; Entering SLEEP mode, only the reset by wake-up is available. ;从IDLE模式下被唤醒,系统从该处继续执行,取消SDRAM自刷新方式ldr r0,=REFRESH ;exit from SDRAM self refresh mode.str r3,[r0]MOV_PC_LR ;一个宏定义;=========================================ENTER_SLEEP ;睡眠模式;NOTE.;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.;设置SDRAM为自刷新方式ldr r0,=REFRESHldr r1,[r0] ;r1=rREFRESHorr r1, r1, #BIT_SELFREFRESHstr r1, [r0] ;Enable SDRAM self-refreshmov r1,#16 ;Wait until self-refresh is issued,which may not be needed.0 subs r1,r1,#1bne %B0;在进入SLEEP模式之前,配置必要的时钟和OFFREFRESHldr r1,=MISCCRldr r0,[r1]orr r0,r0,#(7<<17) ;Set SCLK0=0, SCLK1=0, SCKE=0.str r0,[r1]ldr r0,=CLKCON ; Enter sleep modestr r2,[r0] ;置第3位,进入SLEEP模式b . ;CPU will die here.;=========================================;从SLEEP模式下被唤醒函数WAKEUP_SLEEP ;唤醒睡眠;Release SCLKn after wake-up from the SLEEP mode.;设置时钟和OFFREFRESHldr r1,=MISCCRldr r0,[r1]bic r0,r0,#(7<<17) ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.str r0,[r1];配置内存控制寄存器;Set memory control registersldr r0,=SMRDATA ;be careful!ldr r1,=BWSCON ;BWSCON Addressadd r2, r0, #52 ;End address of SMRDATAldr r3, [r0], #4str r3, [r1], #4cmp r2, r0bne %B0; GSTATUS3存放着想要从SLEEP模式唤醒后的执行地址mov r1,#2560 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.bne %B0ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after SLEEP wake-up ldr r0,[r1]mov pc,r0 ; 跳转到GSTATUS3存放的地址处;===================================================================== ; Clock division test; Assemble code, because VSYNC time is very short;===================================================================== EXPORT CLKDIV124EXPORT CLKDIV144CLKDIV124ldr r0, = CLKDIVNldr r1, = 0x3 ; 0x3 = 1:2:4str r1, [r0]; wait until clock is stablenopnopnopnopnopldr r0, = REFRESHldr r1, [r0]bic r1, r1, #0xffbic r1, r1, #(0x7<<8)orr r1, r1, #0x470 ; REFCNT135str r1, [r0]nopnopnopnopnopmov pc, lrCLKDIV144ldr r0, = CLKDIVNldr r1, = 0x4 ; 0x4 = 1:4:4str r1, [r0]; wait until clock is stablenopnopnopnopnopldr r0, = REFRESHldr r1, [r0]bic r1, r1, #0xffbic r1, r1, #(0x7<<8)orr r1, r1, #0x630 ; REFCNT675 - 1520str r1, [r0]nopnopnopnopnopmov pc, lrALIGN;中断向量表AREA RamData, DATA, READWRITE;^是MAP的同义词,#是FIELD的同义词^_ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00 HandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4;Do not use the label 'IntVectorTable',;The value of IntVectorTable is different with the address you think it may be. ;IntVectorTable;@0x33FF_FF20HandleEINT0 # 4HandleEINT1 # 4HandleEINT2 # 4HandleEINT3 # 4HandleEINT4_7 # 4HandleEINT8_23 # 4HandleCAM # 4 ; Added for 2440. HandleBATFLT # 4HandleTICK # 4HandleWDT # 4HandleTIMER0 # 4HandleTIMER1 # 4HandleTIMER2 # 4HandleTIMER3 # 4HandleTIMER4 # 4HandleUART2 # 4;@0x33FF_FF60HandleLCD # 4HandleDMA0 # 4HandleDMA1 # 4HandleDMA2 # 4HandleDMA3 # 4HandleMMC # 4HandleSPI0 # 4HandleUART1 # 4HandleNFCON # 4 ; Added for 2440. HandleUSBD # 4HandleUSBH # 4HandleIIC # 4HandleUART0 # 4HandleSPI1 # 4HandleRTC # 4HandleADC # 4;@0x33FF_FFA0END。

相关文档
最新文档