单板选择NandFlash启动,则硬件上电后,系统会自己主动将NandFlash中的前4K内容复制到STEPSTONE即4K SRAM中。然后从SRAM中的0X0地址启动。

基于mini2440的简易bootloader制作方法在上一篇文章中有提到。它编译出的boot.bin仅仅有1.96KB,小于STEPSTONE的4KB。因此我们能够考虑将bootloader从nandflash复制到内存这一步给省略掉。

一、编辑start.S:

.text
.global _start
_start: /* close the watchdog */
ldr r0, =0x53000000
mov r1, #0
str r1, [r0]
/* close the watchdog */
@关闭看门狗
@数据手冊:WTCON 0x53000000 R/W Watchdog timer control register /* set the clock */
ldr r0, =0x4c000014
mov r1, #0x03; @ FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
str r1, [r0] mrc p15, 0, r1, c1, c0, 0 /* read */
orr r1, r1, #0xc0000000 /* set asynchronous bus mode */
mcr p15, 0, r1, c1, c0, 0 /* write */ ldr r0, =0x4c000004
ldr r1, =((0x5c<<12)|(0x01<<4)|(0x02)) @MPLL:200MHz
str r1, [r0]
/* set the clock */
@设置系统时钟
@假设HDIVN不是0,CPU的总线模式应该设置成asynchronous bus mode /* enable the ICACHE */
mrc p15, 0, r0, c1, c0, 0 @ read control register
orr r0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write back
/* enable the ICACHE */
@使能快速缓存,为系统提速,此段可不要,但程序运行速度要慢 /* init the SDRAM */
ldr r0, =0x48000000 @MEM_CTL_BASE
adr r1, config /* sdram config address */
add r3, r0, #(52) @13*4
1:
ldr r2, [r1], #4
str r2, [r0], #4
cmp r0, r3
bne 1b
/* init the SDRAM */
@初始化SDRAM
@依据数据手冊对与SDRAM有关的13个寄存器进行配置 /* relocate */
ldr sp, =0x34000000
bl nand_init /* mov r0, #0
ldr r1, =_start
ldr r2, =__bss_start
sub r2, r2, r1 bl copy_code_to_sdram */
bl clear_bss
/* relocate */
@把bootloader本身的代码从nandflash复制到它的链接地址去 /* go to main */
ldr lr, =halt
ldr pc, =main
halt:
b halt
/* go to main */
@跳转到main函数运行 config:
.long 0x22011110 @BWSCON
.long 0x00000700 @BANKCON0
.long 0x00000700 @BANKCON1
.long 0x00000700 @BANKCON2
.long 0x00000700 @BANKCON3
.long 0x00000700 @BANKCON4
.long 0x00000700 @BANKCON5
.long 0x00018005 @BANKCON6
.long 0x00018005 @BANKCON7
.long 0x008C04F4 @REFRESH
.long 0x000000B1 @BANKSIZE
.long 0x00000030 @MRSRB6
.long 0x00000030 @MRSRB7

凝视掉:

/*	mov r0, #0
ldr r1, =_start
ldr r2, =__bss_start
sub r2, r2, r1 bl copy_code_to_sdram */

二、编辑boot.lds:

SECTIONS {
. = 0x00000000;
.text : { *(.text) } . = ALIGN(4);
.rodata : {*(.rodata*)} . = ALIGN(4);
.data : { *(.data) } . = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) *(COMMON) }
__bss_end = .;
}

将0x33f80000改为0x00000000。

三、make之后将生成的boot.bin下载到nandflash中。能够成功引导内核。

最新文章

  1. siblings 使用
  2. GPRS Sniffing Tutorial
  3. Unit Test with VS.NET
  4. uboot 网络不通问题解决一例1
  5. Java入门(6)——集合、基本数据类型和引用数据类型的相互转换
  6. 仿IOS7日期选择控件(新)
  7. Oracle 11g一步步安装详解
  8. 对混合数值,字符,null的字段进行排序
  9. Python基础知识点小结
  10. GitHub下载单个文件
  11. 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙
  12. JVM总括:目录
  13. 五、compose 部署 GitLab 应用
  14. mgo 的 session 与连接池
  15. MySql 主辅-一主多辅
  16. nginx按日期分割日志
  17. Linux系统服务之inetd
  18. mac 下 outlook 邮箱 服务器端口设置
  19. Linux命令:cp (copy)复制文件或目录
  20. 微信小程序及各种平台对接常用可逆加密算法aes256

热门文章

  1. Node.js静态页面展示例子2
  2. 高速排序java语言实现
  3. PLSQL Developer设置技巧
  4. Android下Fragment使用(全集)
  5. Hibernate学习之属性级别注解
  6. Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收
  7. 【Caffe代码解析】Blob
  8. Effective C++ Item 34 区分接口继承与实现继承
  9. Gmail收不到邮件咋办?
  10. eclipse maven 依赖jar下载失败解决办法