3.2Bootloader拷贝
配置为从NAND FLASH启动,需要将NAND FLASH中的vivi代码copy到RAM中:
| #ifdef CONFIG_S3C2410_NAND_BOOT bl copy_myself @ jump to ram ldr r1, =on_the_ram add pc, r1, #0 nop nop 1: b 1b @ infinite loop #ifdef CONFIG_S3C2410_NAND_BOOT @ @ copy_myself: copy vivi to ram @ copy_myself: mov r10, lr @ reset NAND mov r1, #NAND_CTL_BASE ldr r2, =0xf830 @ initial value str r2, [r1, #oNFCONF] ldr r2, [r1, #oNFCONF] bic r2, r2, #0x800 @ enable chip str r2, [r1, #oNFCONF] mov r2, #0xff @ RESET command strb r2, [r1, #oNFCMD] mov r3, #0 @ wait 1: add r3, r3, #0x1 cmp r3, #0xa blt 1b 2: ldr r2, [r1, #oNFSTAT] @ wait ready tst r2, #0x1 beq 2b ldr r2, [r1, #oNFCONF] orr r2, r2, #0x800 @ disable chip str r2, [r1, #oNFCONF] @ get read to call C functions (for nand_read()) ldr sp, DW_STACK_START @ setup stack pointer mov fp, #0 @ no previous frame, so fp=0 @ copy vivi to RAM ldr r0, =VIVI_RAM_BASE mov r1, #0x0 mov r2, #0x20000 bl nand_read_ll tst r0, #0x0 beq ok_nand_read #ifdef CONFIG_DEBUG_LL bad_nand_read: ldr r0, STR_FAIL ldr r1, SerBase bl PrintWord 1: b 1b @ infinite loop #endif ok_nand_read: #ifdef CONFIG_DEBUG_LL ldr r0, STR_OK ldr r1, SerBase bl PrintWord #endif @ verify mov r0, #0 ldr r1, =0x33f00000 mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes go_next: ldr r3, [r0], #4 ldr r4, [r1], #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq done_nand_read bne go_next notmatch: #ifdef CONFIG_DEBUG_LL sub r0, r0, #4 ldr r1, SerBase bl PrintHexWord ldr r0, STR_FAIL ldr r1, SerBase bl PrintWord #endif 1: b 1b done_nand_read: #ifdef CONFIG_DEBUG_LL ldr r0, STR_OK ldr r1, SerBase bl PrintWord #endif mov pc, r10 @ clear memory @ r0: start address @ r1: length mem_clear: mov r2, #0 mov r3, r2 mov r4, r2 mov r5, r2 mov r6, r2 mov r7, r2 mov r8, r2 mov r9, r2 clear_loop: stmia r0!, {r2-r9} subs r1, r1, #(8 * 4) bne clear_loop mov pc, lr #endif @ CONFIG_S3C2410_NAND_BOOT |
3.3进入C代码
首先要设置堆栈指针sp,堆栈指针的设置是为了执行C语言代码作好准备。设置好堆栈后,调用C语言的main函数:
| @ get read to call C functions ldr sp, DW_STACK_START @ setup stack pointer mov fp, #0 @ no previous frame, so fp=0 mov a2, #0 @ set argv to NULL bl main @ call main mov pc, #FLASH_BASE @ otherwise, reboot |
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
·Linux集群技术 (7516篇文章)
·体验Linux的音影世界 (7270篇文章)
·Linux驱动大全 (7867篇文章)
·Linux下的路由的配置与应用 (10650篇文章)
·Linux命令简介 (8871篇文章)
·Linux防火墙 (8747篇文章)
·Linux日志专题 (7634篇文章)
·.NET移动与嵌入式技术 (5126篇文章)
·Linux服务器的安全性能 (17942篇文章)
·揭秘Linux内存管理 (7324篇文章)
·体验Linux的音影世界 (7270篇文章)
·Linux驱动大全 (7867篇文章)
·Linux下的路由的配置与应用 (10650篇文章)
·Linux命令简介 (8871篇文章)
·Linux防火墙 (8747篇文章)
·Linux日志专题 (7634篇文章)
·.NET移动与嵌入式技术 (5126篇文章)
·Linux服务器的安全性能 (17942篇文章)
·揭秘Linux内存管理 (7324篇文章)
·visual studio 2005 简体中文团队开发版 S (11199次浏览)
·遭遇Trojan.PSW.Lmir等病毒(第2版) (5742次浏览)
·Windows XP中实用快捷键操作技巧大集锦 (2823次浏览)
·中间件技术的概念和分类 (1206次浏览)
·Vista开发新技术之XAML简介 (1109次浏览)
·ARM的嵌入式Linux移植体验之应用实例 (1060次浏览)
·在VC6中创建wxWidgets项目[附图] (1046次浏览)
·用Shell写DEAMON后台来控制安全访问的方法 (16次浏览)
·Karrigell 入门简介 (0次浏览)
·遭遇Trojan.PSW.Lmir等病毒(第2版) (5742次浏览)
·Windows XP中实用快捷键操作技巧大集锦 (2823次浏览)
·中间件技术的概念和分类 (1206次浏览)
·Vista开发新技术之XAML简介 (1109次浏览)
·ARM的嵌入式Linux移植体验之应用实例 (1060次浏览)
·在VC6中创建wxWidgets项目[附图] (1046次浏览)
·用Shell写DEAMON后台来控制安全访问的方法 (16次浏览)
·Karrigell 入门简介 (0次浏览)
·Karrigell 入门简介 10-25
·Vista开发新技术之XAML简介 10-05
·ARM的嵌入式Linux移植体验之应用实例 10-05
·在VC6中创建wxWidgets项目[附图] 10-05
·中间件技术的概念和分类 10-05
·Windows XP中实用快捷键操作技巧大集锦 09-28
·visual studio 2005 简体中文团队开发版 SQL serve 09-23
·遭遇Trojan.PSW.Lmir等病毒(第2版) 09-23
·用Shell写DEAMON后台来控制安全访问的方法 09-18
·Shell脚本显示当前网络连接与对应物理地址 09-01
·Vista开发新技术之XAML简介 10-05
·ARM的嵌入式Linux移植体验之应用实例 10-05
·在VC6中创建wxWidgets项目[附图] 10-05
·中间件技术的概念和分类 10-05
·Windows XP中实用快捷键操作技巧大集锦 09-28
·visual studio 2005 简体中文团队开发版 SQL serve 09-23
·遭遇Trojan.PSW.Lmir等病毒(第2版) 09-23
·用Shell写DEAMON后台来控制安全访问的方法 09-18
·Shell脚本显示当前网络连接与对应物理地址 09-01
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容



