s3c2440 nand flash 拷贝实验

发布者:advancement4最新更新时间:2017-01-21 来源: eefocus关键字:s3c2440  nand  flash  拷贝实验 手机看文章 扫描二维码
随时随地手机看文章

首先明确一下我们的编程步骤。


(1)、加电在nand_flash加载boot.s中4K以内的程序。这4k将自动拷贝到SRAM(片内RAM)执行。


(2)、我们需要用这4k的程序实现nand-flash中4K以后的程序的拷贝(当然,拷贝到SDRAM基址为0x30000000处)继续执行(main.o部分的程序)。对于SDRAM的初始化和Watchdog的禁用已经在前一个实验中使用到了,这里就不再详细叙述。主要来看一下nand-flash的初始化和使用。



查阅一下s3c2440的空间布局。查看手册图Figure 5-1. S3C2440A Memory Map after Reset一目了然。


 


有8个banks— Total 8 memory banksSix memory banks for ROM, SRAM, etc.Remaining two memory banks for ROM, SRAM, SDRAM, etc .



每个bank拥有128M空间。当访问bankx时,对应的地址范围是128*n 到 128*(1+n)tq2440使用了64M的nand flash和64M的SDROMNAND Flash不对应任何bank,他是通过几组寄存器来访问的;上电以后,nand flash开始的4k数据被自动的复制到芯片内部一个称为steppingstone的RAM上。steppingstore的映射地址为0,上面的4k完成初始化工作;SDRAM则使用bank6,起始位置为0x30000000



该实验中我们将使用SDRAM的bank6实验目的:


(1)、mem controller的原理和工作过程


(2)、bank的使用


(3)、nand flash的读写控制


(4)、启动代码流程分析


 


在实际编程中,uboot和vivi都是绝佳的参考源码,我这里参考的是vivi的代码。


vivi已经上传到新浪共享:http://ishare.iask.sina.com.cn/f/11353581.html


 


datasheet上关于启动原理的介绍:

Bank0:The data bus of BANK0 (nGCS0) should be configured with a width as one of 16-bit and 32-bit ones. Because theBANK0 works as the booting ROM bank (map to 0x0000_0000), the bus width of BANK0 should be determinedbefore the first ROM access, which will depend on the logic level of OM[1:0] at Reset.


 


下面小结一下对nand flash控制器的操作过程.


 s3c2440对nandflash读写操作寄存器配置的流程:


s3c2440对nandflash读写操作寄存器配置的流程:


1.初始化


(1)NFCONT= (1<<0) //enable NAND flash controller


(2)NFCONT|= (1<<0)//chip disable


2.复位


(1)NFCONT&= ~(1<<1) //chip enable


(2)NFCMD= 0xff; //reset command


(3)while(!(NFSTAT& BUSY))等待NAND flashmemory ready to operate


3.读函数


(1)NFCONT&= ~(1<<1)//chip enable


(2)NFSTAT|= (1<<2) //NAND_CLEAR_RB ,RnBtransition is detected


(3)NFCMD= 0; //READ0,读上半叶


(4)//Write Address


NFADDR= i & 0xff;


NFADDR= (i >> 9) & 0xff;


NFADDR= (i >> 17) & 0xff;


NFADDR= (i >> 25) & 0xff;


(5)while(!(NFSTAT&(1<<0)) ); //NAND_DETECT_RB,等待NANDflash memory ready to operate


(6)*buf= (NFDATA & 0xff); //读数据线


(7)NFCONT|= (1<<1)//chip disable


 


用到的nand flash初始化读操作源码:


 1 /*在第一次实用NAND Flash前,复位一下NAND Flash */

 2  void nand_flash_reset()

 3 {

 4     NAND_CHIP_ENABLE;

 5     NFCMD = 0xff; //reset command

 6      wait_idle();

 7 }

 8 

 9  /*初始化NAND Flash */

10  void nand_flash_init()

11 {

12     //vivi init

13      int i = 0;

14     NFCONF = ( (7<<12)|(7<<8)|(7<<4)|(0<<0) );

15     NFCONT = ( (1<<4)|(0<<1)|(1<<0) );// Active low CE Control

16      NFSTAT = (0x6);//RnB Clear 

17      NFCMD = 0xff; //reset command

18      for(i = 0; i < 10; i++)

19         ;

20     wait_idle();

21     /*

22     //----------------------------------------------------------------

23     // following is the copy module

24     //----------------------------------------------------------------

25     NFCONT |= 0x2;//@ Flash Memory Chip Disable

26     //----------------------------------------------------------------

27     @ Flash Memory Chip Disable

28     @ get read to call C functions (for nand_read())

29     @ copy vivi to RAM

30     ldr    r0, =VIVI_RAM_BASE

31     mov     r1, #0x0

32     mov    r2, #0x20000

33     bl    nand_read_ll

34     //---------------------------------------------------------------

35     */

36     /*

37      NFCONT = (1<<0);

38      NAND_CHIP_DISABLE; 

39      nand_flash_reset();

40      */

41 }

42 

43  #define BUSY 1

44 inline void wait_idle(void)

45 {

46     while(!(NFSTAT & BUSY));

47     NFSTAT |= BUSY;

48 }

49 

50  #define NAND_SECTOR_SIZE 512

51  #define NAND_BLOCK_MASK  (NAND_SECTOR_SIZE - 1)

52 

53  /* low level nand read function */

54  int nand_flash_read(unsigned char *buf, unsigned long start_addr, int size)

55 {

56     int i, j;

57 

58     if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {

59         return -1; /* invalid alignment */

60     }

61 

62     NAND_CHIP_ENABLE;

63 

64     for(i=start_addr; i < (start_addr + size);) {

65         /*debug*/

66         (*(volatile unsigned long *)0x56000010) = 0x00015400;

67         (*(volatile unsigned long *)0x56000014) = 0x00000000;

68         /*debug*/

69         /* READ0 */

70         NAND_CLEAR_RB; 

71         NFCMD = 0;

72 

73         /* Write Address */

74         NFADDR = i & 0xff;

75         NFADDR = (i >> 9) & 0xff;

76         NFADDR = (i >> 17) & 0xff;

77         NFADDR = (i >> 25) & 0xff;

78 

79         NAND_DETECT_RB;

80 

81         for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {

82             *buf = (NFDATA & 0xff);

83             buf++;

84         }

85         /*debug*/

86         if(i >= 512)

87         {

88         for(j = 0; j < 2048; j++)

89             ;

90         (*(volatile unsigned long *)0x56000014) &= (1 << 5) & (1 << 6);

91         for(j = 0; j < 2048; j++)

92             ;

93         }

94         /*debug*/

95     }

96     NAND_CHIP_DISABLE;

97     return 0;

98 }



在sram执行的启动汇编代码:


 1 @----------------------------------------------------

 2 @ boot.s

 3 @ yeven @2010.20.28

 4 @----------------------------------------------------

 5 .text

 6 .global _start

 7  _start:

 8     ldr sp,=4096

 9     bl disable_wd        @关闭看门狗

10     bl memsetup            @初始化SDRAM

11     bl nand_flash_init    @初始化nand-flash

12 

13     @下面调用 nand_flash_read,它需要三个参数:目标地址,源地址,数据长度

14     ldr r0,=0x30000000    @SDRAM新的起始位置

15     mov r1,#4096        @main.o在nand-flash中的偏移,即数据起始位置

16     mov r2,#1024        @复制长度

17     bl nand_flash_read    @调用vivi代码中的拷贝函数

18     

19 

20     bl led_on_s

21     ldr pc, = set_sp    @设置堆栈,进入main.o执行

22  set_sp:

23     ldr sp,=0x34000000    @设置堆栈栈顶指针

24     ldr lr,=halt_loop    @设置主函数返回地址

25     ldr pc,=main                @执行主函数

26 

27  halt_loop:

28     b halt_loop

29 

30  led_on_s:

31     ldr r0,=0x56000010

32     mov r1,#0x00000400

33     str r1,[r0]

34     ldr r0,=0x56000014

35     mov r1,#0x00000000

36     str r1,[r0]


主函数执行代码,这一段将在sdram-0x30000000执行.他只是不停的闪灯:



 1 /*

 2  * mem-con.c    yeven @2010.10.27

 3  * learn to use the sdram,control the memory and memory map

 4  * the main program locate at boot.s

 5  * we just light the four leds to test the result.

 6  */

 7 

 8  //Register for the led

 9  #define    GPBCON        (*(volatile unsigned long *)0x56000010)

10 #define    GPBDAT        (*(volatile unsigned long *)0x56000014)

11 

12 //led-data register value(GPB5-GPB8)

13 #define LED0_ON        (1 << (5*2))

14 #define LED1_ON        (1 << (6*2))

15 #define    LED2_ON        (1 << (7*2))

16 #define LED3_ON        (1 << (8*2))

17 #define GPB_ON(n)    (~(1 << n))

18 #define GPB_OFF(n)    (1 << n)

19 

20 void delayms(unsigned int n)

21 {    

22     int i = 0;

23     for(i = 0; i < 10240*n; i++)

24         ;

25 }

26 

27 int main()

28 {

29     GPBCON |= (LED0_ON | LED1_ON | LED2_ON | LED3_ON);    //led0-4

30     while(1)

31     {

32         GPBDAT |= (GPB_ON(5) | GPB_ON(6) | GPB_ON(7) | GPB_ON(8));

33         delayms(1);

34         GPBDAT &= (GPB_OFF(5) & GPB_OFF(6) & GPB_OFF(7) & GPB_OFF(8));

35         delayms(1);

36     }

37 

38     return 0;

39 }

40     

 


编译的makfile和gnu ld文件:



SECTIONS

{

    first 0x00000000:    {boot.o init.o}

    second 0x30000000:    AT(4096){nand-flash-con.o}

}

 


 1 nand-flash-con:init2.c init.h nand-flash-con.c boot.s

 2     arm-linux-gcc -c -o boot.o boot.s

 3     arm-linux-gcc -c -o init.o init2.c #init.h

 4     arm-linux-gcc -c -o nand-flash-con.o nand-flash-con.c

 5     arm-linux-ld -Tnand.lds boot.o init.o nand-flash-con.o -o nand-flash-con-tmp.o

 6     arm-linux-objcopy -O binary -S nand-flash-con-tmp.o nand-flash-con

 7     arm-linux-objdump -D -b binary -m arm nand-flash-con > ttt.s

 8 clean:

 9     rm *.o

10     rm nand-flash-con


关键字:s3c2440  nand  flash  拷贝实验 引用地址:s3c2440 nand flash 拷贝实验

上一篇:ARM-Linux汇编到ADS汇编转换需要注意的问题
下一篇:s3c2440启动时的内存拷贝过程分析

推荐阅读最新更新时间:2024-03-16 15:31

S3C2440 中断控制寄存器
1、 SUBSRCPND 寄存器(SUB SOURCE PENDING) SUBSRCPND 寄存器被用来标识 INT_RXD0、INT_TXD0 等中断(S3C2410中这类中断有 11 个,而 S3C2440 中有 15 个)是否已经发生,每位对应一个中断。当这些中断发生并且没有被 INTSUBMSK 寄存器屏蔽,则它们中的若干位将“汇集”出现在 SRCPND 寄存器的一位上。比如 SUBSRCPND 寄存器中的 3 个中断 INT_RXD0、INT_TXD0、INT_ERR0,只要有一个发生了并且它没有被屏蔽,则 SRCPND 寄存器中的 INT_UART0 位被置 1。 要清楚中断时,往 SUBSRCPND 寄存器中某
[单片机]
<font color='red'>S3C2440</font> 中断控制寄存器
STM32用STLINK烧写外置FLASH遇到的问题
由于项目需要大量的图片字库还有音频文件,所以外挂了NOR flash和NAND flash,需要用到烧写算法STLDR(就是包含几段在SRAM里面运行的代码),调试的时候遇到了几个问题,都是大意造成的,所以写出来记录一下 首先烧写用到PC端软件是STM32 STLINK Utility,在安装目录下附带了一些常用的flash的烧写算法,但没有我用到的那种,所以只能参考ST-LINK Utility UM手册在…\ST-LINK Utility\ExternalLoader目录下的工程模板上修改,修改需要用到对FLASH的初始化、读写、擦除函数,这个要提前调试好,填到对应的函数内就可以了,后面由上位机自己调用 问题来了,主要
[单片机]
利用 Platform Flash PROM 实现多重启动功能
提要 一些应用利用 Xilinx FPGA 在每次启动时可改变配置的能力,根据所需来改变 FPGA 的功能。Xilinx Platform Flash XCFxxP PROM 的设计修订 (Design Revisioning) 功能,允许用户在单个PROM 中将多种配置存储为不同的修订版本,从而简化了 FPGA 配置更改。在 FPGA 内部加入少量的逻辑,用户就能在 PROM 中存储的多达四个不同的修订版本之间进行动态切换。多重启动或从多个设计修订进行动态重新配置的能力,与 Spartan-3E FPGA 和第三方并行 flash PROM 一起使用时所提供的 MultiBoot 选项相似。 本应用指南将进一步说明 Platf
[应用]
ARM-Linux s3c2440 之UART分析(五)
从上面四篇介绍文章中,已经清楚了串口设备与串口驱动实现的各层次关系流程。是一种从上而下的关系,从第二篇的层次流程图中可以看出。之前说过串口设备是一种platform device,下面看看串口作为platform device的实现细节。 串口的硬件平台实现smdk2440_map_io()初始化入口: static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc,ARRAY_SIZE(smdk2440_iodesc)); s3c24xx_init_clocks(12000000); s3c24xx_
[单片机]
智能嵌入式系统力拱 高容量Flash MCU需求涨
嵌入式系统智能化商机旺 MCU厂升级eFlash制程   微控制器(MCU)厂商在嵌入式快闪记忆体(eFlash)新一轮先进制程竞赛开打。值此智慧化嵌入式系统(Intelligent Embedded System)市场方兴未艾之际,Flash MCU内嵌的编码型快闪(NOR Flash)记忆体容量亦将大幅增长,以迎合智慧化嵌入式系统配备联网、图形化和语音人机介面等功能,以及内建精简型作业系统(OS)的设计要求。   看好内嵌更高快闪记忆体容量的Flash MCU在智慧嵌入式系统市场前景,微控制器厂商正大举投资更先进的eFlash奈米(nm)製程,如继瑞萨电子(Renesas Electronics)和飞思卡尔(Freesca
[模拟电子]
智能嵌入式系统力拱 高容量<font color='red'>Flash</font> MCU需求涨
s3c2440 ARM9 裸机驱动第三篇—定时器
定时器这篇是比较艰辛的,过程中出现了很多小问题,有些解决了,有些还是没有完全弄明白,这些问题主要集中在汇编部分的程序。 此部分主要是通过定时器中断的方式实现LED灯的闪烁。 一、硬件部分: 1.LED部分:参见之前的文章 2.定时器: 定时器的频率:Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value} {prescaler value} = 0~255 {divider value} = 2, 4, 8, 16 其中PCLK如果配置了MPLL就是50M,prescaler value配置TCFG0得到,divider
[单片机]
<font color='red'>s3c2440</font> ARM9 裸机驱动第三篇—定时器
Flash搞双重标准?中国特供版搜集用户信息
自从隐私密探Vivo NEX问世以来,各种软件窃取用户信息的消息迅速传播开来,在这样一个大环境下,用户几乎没有隐私可言,没想到Adobe公司针给中国用户这么大的“优待”,特供版Flash可以搜集用户信息。 Adobe公司前不久与中国一家软件代理商思杰马克丁签署了合作协议,另外中国用户将会被安装一个特供版Flash Player软件,用户协议明确规定了可以搜集用户上网隐私。     据悉,Adobe Flash Player国内特供版是跟重庆一家名为重橙网络科技有限公司合作的,安装后会常驻FlashHelperService服务,电脑如果检测到没有了这个服务,Flash就会停止工作,而用户协议中就直接说明了该服务会搜集用户的上网信
[嵌入式]
采用C51与插拔式FLASH闪存设计无纸记录仪
  ATMEL公司推出的带有看门狗功能的单片机AT89C55WD带有20K的程序存储器,是8051系列中一款较为先进的产品,其看门狗功能可以大大提高产品的稳定性,大容量的内部程序存储器可以容纳功能丰富的软件。   以往的许多无纸记录仪均采用3.5英寸软盘作为数据存贮介质,但软盘存贮的可靠性差、存储容量有限、成本较高等诸多缺点实在难以克服。   作为一种高科技的非易失性存储设备,FLASH闪存首先在数码相机、PDA、移动电话等数字产品当中得到了应用,随着工艺的进步和价格的下降,逐步向其他应用领域扩展,其容量大、功耗低、速度快、不易受损等优点正受到人们越来越多的青睐,而且最大的好处是,随着技术水平的进步,FLASH闪存的容量也在不断
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved