官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2144|回复: 2

第8章裸机实验,nand flash是K9F2G08X0B,疑问?

[复制链接]

5

主题

14

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2012-7-7 23:11:00 | 显示全部楼层 |阅读模式

mini2440开发板:第8章裸机实验,nand flash是K9F2G08X0B

//nand.lds文件
SECTIONS {
        firtst          0x00000000 : { head.o init.o nand.o main.o}
        second             0x30000000 : AT(4096) { main.o }
}

AT (4096),其中的4096是加载地址
《嵌入式linux应用开发完全手册》的p137页中写到:
        “本实例的目的是把一部分代码存放在nand flash地址的4096之后”
makefile文件
arm-elf-ld -Tnand.lds        -o nand_elf head.o init.o nand.o main.o

疑问:1)4096是nand flash上的存储地址?本人认为是
          2)但是,如果是4096是nand flash的地址的话,那么仅仅通过下面两句话
                        arm-elf-ld -Tnand.lds        -o nand_elf head.o init.o nand.o main.o          //makefile文件
                        second             0x30000000 : AT(4096) { main.o }                                                //nand.lds文件
        就能把main.o写入到nand flash中?

我本人的认为:写nand flash需要通过诸如Page Program 80h 10h这样的命令集伴随的一些列操作才能完成!!

请大家解释一下原委!!!谢谢

回复

使用道具 举报

5

主题

14

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2012-7-7 23:12:00 | 显示全部楼层
回复 1楼jeremyhuang的帖子

也许问题描述的不是很清楚,我从另外一个方面阐述一下我的问题:
@******************************************************************************
@ File:head.s
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@******************************************************************************      
  
.text
.global _start
_start:
                                            @函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义
            ldr     sp, =4096               @设置堆栈
            bl      disable_watch_dog       @关WATCH DOG
            bl      memsetup                @初始化SDRAM
            bl      nand_init               @初始化NAND Flash

                                            @将NAND Flash中地址6144开始的2048字节代码(main.c编译得到)复制到SDRAM中
                                            @nand_read_ll函数需要3个参数:
            ldr     r0,     =0x30000000     @1. 目标地址=0x30000000,这是SDRAM的起始地址
            mov     r1,     #4096                          @2.  源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
            mov     r2,     #2048           @3.  复制长度= 2048(bytes),对于本实验的main.c,这是足够了
            bl      nand_read               @调用C函数nand_read

            ldr     sp, =0x34000000         @设置栈
            ldr     lr, =halt_loop          @设置返回地址
            ldr     pc, =main               @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
halt_loop:
            b       halt_loop

这里:        
            ldr     r0,     =0x30000000     @1. 目标地址=0x30000000,这是SDRAM的起始地址
            mov     r1,     #4096                          @2.  源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
            mov     r2,     #2048           @3.  复制长度= 2048(bytes),对于本实验的main.c,这是足够了
            bl      nand_read               @调用C函数nand_read

                nand_read函数,源地址4096开始大小为2048的地址空间的数据,本人认为是属于nand flash的地址空间,对吗?
                那么这个地址空间的main.o是如何写入到nand flash中的?
                有网友说,是烧写进去的,本人认为不是,我是用openjtag进行调试,没有进行过任何烧写。
回复 支持 反对

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2012-7-11 10:53:00 | 显示全部楼层
SECTIONS {
    firtst      0x00000000 : { head.o init.o nand.o main.o}
    second         0x30000000 : AT(4096) { main.o }
}

这是控制生成的BIN文件,0位置放first段的代码,4096开始放second段的代码;
这个BIN文件烧到FLASH去后,FLASH的0地址就放first段的代码,FLASH的4096地址开始放second段的代码;
然后时,重定位要“从FLASH的4096那里读代码,放到SDRAM的0x30000000去”
至于second段有多大,我就直接用2048,因为看BIN文件就可以知道它不会超过2048
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-11-18 14:39 , Processed in 0.295345 second(s), 20 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表