uboot下NAND操作指令

1)网络启动参数设置

setenv serverip 192.168.7.103                  // Ubuntu的ip地址  

setenv ipaddr  192.168.7.163                    // 开发板ip地址 

setenv gatewayip 192.168.7.1                  // 设置网关 

setenv ethaddr 08:00:3e:26:0a:03            // 设置MAC地址

1、setenv bootcmd tftp 30800000 uImage \; bootm            //   设置倒计时后的第一条命令  (二选一

                                                                                                           //   (cp u-boot-2010.03/tools/mkimge /usr/bin/,用来生成uImage,注意权限)

2、setenv bootcmd tftp 33000000 zImage \; go 33000000

 

setenv bootargs console=ttySAC0,115200 init=/linuxrc root=/dev/nfs nfsroot=192.168.7.103:/opt/filesystem ip=192.168.7.163           // uboot传给内核的参数


/******************************************************************/

nand分区文件所在:

u-boot:include/configs/fs2410.h

kernel:/linux-2.6.35/arch/arm/plat-s3c24xx/ common-smdk.c

/******************************************************************/



2)烧写内核 

tftp 33000000 uImage 

nand erase 100000 400000

nand write 33000000 100000 400000

setenv bootcmd nand read 33000000 100000 400000 \; bootm 33000000




1、uboot下NAND操作指令 

       指令              Flash内地址        擦除长度

 nand erase     0x100000            0x200000 
       指令              内存中地址         Flash内地址 写入长度

 nand write     0x20000000        0x100000     0x200000 

nand read      0x20000000        0x100000     0x200000 

关于nand flash的时序分析,http://blog.chinaunix.net/uid-20178794-id-4111272.html这篇文章写得不错

2、分析读nand flash操作的时序图
(1)时序图

(2)相关分析

(3)步骤归纳

  • 发出片选信号,选中nand flash芯片
  • 发出00h命令
  • 发出5个地址序列,前两个对应的是列地址(对应一页中的某一列),后三个是行地址(对应的是某一页)
  • 发出30h命令
  • 等待nand flash准备好数据
  • nand flash准备好数据后,从nand flash 中读取数据
  • 取消片选信号,以确保进行其他与nand flash无关的操作影响到nand flash。

nand_read()函数的实

从nand flash的地址start_addr开始,读取数据大小为size的数据到buf指定的地址里。

void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;


#ifdef LARGER_NAND_PAGE(由于此宏在源程序中有定义,因而走下面第一路径)

//因为nand flash每次读操作是以page为单位的,而一个page 是2048字节(不同nand flash的page大小不一定相同)

//一个数如果是2048的倍数,低11位必须是0.这里&是按位与的意思,也就是size和start_addr是16进制数,而NAND_BLOCK_MASK_LP是十进制,它们都会转换成二进制,进行按位与操作。这里定义NAND_BLOCK_MASK_LP为2047,也就是首位为0,后11位为1,与2048的二进制首位为1,后11位为0按位相与后为0.
    if ((start_addr & NAND_BLOCK_MASK_LP) || (size & NAND_BLOCK_MASK_LP)) {
        return ;    /* 地址或长度不对齐 */
    }
#else
    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
        return ;    /* 地址或长度不对齐 */
    }
#endif


    /* 选中芯片 */
    nand_select_chip();

   
  
 for(i=start_addr; i < (start_addr + size);) {
 /*发出00h命令*/
      write_cmd(0);

 /* 发出5个周期的地址序列 */
      write_addr(i);
#ifdef LARGER_NAND_PAGE(程序中有定义,因为要区分nand flash 的大小页构造)

 /*发出30h命令*/

 write_cmd(0x30);
#endif

 /*发出空闲等待信号*/

   wait_idle();


#ifdef LARGER_NAND_PAGE

/*开始读取数据*/
      for(j=0; j < NAND_SECTOR_SIZE_LP; j++, i++) {     //这里的NAND_SECTOR_SIZE_LP定义为2048
#else
 for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
#endif

         *buf = read_data();
          buf++;
      }
    }


 /*取消片选信号*/

    nand_deselect_chip();
    
    return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值