S5PV210的NandFlash应用(二)

发布者:bullfish最新更新时间:2020-04-01 来源: eefocus关键字:S5PV210  NandFlash  读操作 手机看文章 扫描二维码
随时随地手机看文章

准备分析


《S5PV210的NandFlash应用(一)》有很多bug,为了文章完整性就不在原文上进行修改了。(一)是在调试nand_cp.c的时候,程序运行过之后,灯立即亮了起来,让我误以为我的NandFlash读操作正常了,最后在往下进行大文件拷贝的时候出现异常,我不得不重新回到这个Nand_cp.c这里来。这次结合Uart打印出NandFlash读出的数据,和210.bin文件进行对比,发现后边错误很多,但是我的程序也能运行。总结出了(一)里边的bug有:1.nand_cp.c中应该调用board_init_f_nand(),而非copy_uboot_to_ram_nand()。2.board_init_f_nand中的跳转代码uboot = (void *)0xd024010明显有误,为什么能够运行,就是实质都没有调用;3.是在start.S中通过相跳转到了main函数的,而非链接地址跳转的,造成了假象。用一天冷静下来,重新来理清思路。1.先把Uart调试通。2.通过Uart打印出NFDATA8_REG寄存器的值。3.和210.bin二进制文件对比。4.自己做二进制文件到210.bin的后边,进行对比。

        

资源工具


同《 S5PV210的LED应用(一)》

NandFlash: K9GAG08U0F (2G)


着手写程序

        (1) void board_init_f_nand ((unsigned long bootflag)) ,负责调用copy_uboot_to_ram_nand()和uboot = (void *)0xd0024010;

        (2) int copy_uboot_to_ram_nand (void),判断NandFlash类型页的大小。调用int nandll_read_blocks。

        (3) int nandll_read_blocks (ulong dst_addr, ulong size, int large_block),读一块大小。

        (4) int nandll_read_page (uchar *buf, ulong addr, int large_block),读一页大小,并通过串口打印出NFDATA8_REG寄存器的值。

具体的实现:


void board_init_f_nand(unsigned long bootflag)

{

__attribute__((noreturn)) void (*uboot)(void);

copy_uboot_to_ram_nand();

 

/* Jump to U-Boot image */

uboot = (void *)0xd0024010;

(*uboot)();

/* Never returns Here */

}


int copy_uboot_to_ram_nand (void)

{

int large_block = 0;

int i;

vu_char id;

 

NAND_CONTROL_ENABLE();

  NAND_ENABLE_CE();

  NFCMD_REG = NAND_CMD_READID;

  NFADDR_REG =  0x00;

 

/* wait for a while */

  for (i=0; i<200; i++);

id = NFDATA8_REG;

id = NFDATA8_REG;

 

if (id > 0x80)

large_block = 1;

if(id == 0xd5)

{ //page_size = 8k

large_block = 3;

}

 

/* read NAND Block.

* 128KB ->240KB because of U-Boot size increase. by scsuh

* So, read 0x3c000 bytes not 0x20000(128KB).

*/

//return nandll_read_blocks(CONFIG_SYS_TEXT_BASE, COPY_BL2_SIZE, large_block);

return nandll_read_blocks(0xd0024000, 0x4000, large_block);

}


/*

 * Read data from NAND.

 */

static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block)

{

uchar *buf = (uchar *)dst_addr;

int i;

uint page_shift = 9;

 

if (1 == large_block)

{

page_shift = 11;

/* Read pages */

for (i = (0x6000>>page_shift); i < (size>>page_shift); i++, buf+=(1< {

nandll_read_page(buf, i, large_block);

}

}

else if(3 == large_block)

{

page_shift = 13;

for (i = 0; i < 4; i++, buf+=(1<<(page_shift-1))) 

{

        nandll_read_page(buf, i, large_block-1);

}

}

        

return 0;

}


/*

 * address format

 *              17 16         9 8            0

 * --------------------------------------------

 * | block(12bit) | page(5bit) | offset(9bit) |

 * --------------------------------------------

 */

 

static int nandll_read_page (uchar *buf, ulong addr, int large_block)

{

int i;

volatile char c;

int page_size = 512;

 

if (1 == large_block)

page_size = 2048;

else if (2 == large_block)

page_size = 4096;

else if (3 == large_block)

page_size = 8192;

 

NAND_ENABLE_CE();

 

NFCMD_REG = NAND_CMD_READ0;

 

/* Write Address */

NFADDR_REG = 0;

 

if (large_block)

NFADDR_REG = 0;

 

NFADDR_REG = (addr) & 0xff;

NFADDR_REG = (addr >> 8) & 0xff;

NFADDR_REG = (addr >> 16) & 0xff;

 

if (large_block)

NFCMD_REG = NAND_CMD_READSTART;

 

        NF_TRANSRnB();

 

/* for compatibility(2460). u32 cannot be used. by scsuh */

for(i=0; i < page_size; i++) 

{

c = NFDATA8_REG; 

*buf++ = c;

puthex(c);

putc(' ');

                

  }

 

NAND_DISABLE_CE();

return 0;

}


下载运行


同《 S5PV210的LED应用(一)》


运行调试

对比如图所示:

得到结论,前16k代码在NandFlash存储方式如下:

遗留问题

  

1.无

关键字:S5PV210  NandFlash  读操作 引用地址:S5PV210的NandFlash应用(二)

上一篇:S5PV210的Uart应用
下一篇:FreeRTOS+STM32F103串口通信错误解决方法

推荐阅读最新更新时间:2024-11-12 18:44

u-boot中nandflash初始化流程分析
下面对nand flash的初始化代码nand_init()进行分析: 1.如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)没定义(CFG_NAND_LEGACY) 则start_armboot()调用driver/nand/nand.c中的nand_init(),否则如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)并且有定义了CFG_NAND_LEGACY,则调用自己定义的nand_init()。在我当前的情景中是使用driver/nand/nand.c中的nand_init()。 2.nand_init()调用本文件中的nand_init_chip()对nand进行初始化。
[单片机]
2018年NAND Flash价格有望缩减10%-20%
  TrendForce研究指出,明年上半年步入淡季, NANDFlash 价格有机会走跌,下半年需求回升,可能再次供不应求,预估2018年 NANDFlash ASP(平均销售单价)将较2017年缩减10%-20%。下面就随网络通信小编一起来了解一下相关内容吧。   相对而言,TrendForce预计,2018年DRAM产能扩增效益有限,价格趋势与供给状况持续看涨、看紧。   TrendForce表示,就移动存储来看,智能手机应用的存储零组件价格从2016年第三季开始不断攀升,以主流规格而言,到今年第四季价格平均上升40%,不仅影响各大品牌在智能手机的获利表现,连带影响品牌厂对于存储规格及容量提升的意愿。   展望2018年,
[网络通信]
S5PV210开发 -- 交叉编译器
交叉编译器我们讲了不少, Hi3516A开发--安装交叉编译器 DM368开发 -- 环境搭建 MQTT再学习 -- 交叉编译与移植 LIVE555再学习 -- DM368/Hi3516A 交叉编译 但都未系统的总结一下。 接下来,先讲一下S5PV210的交叉编译器的安装,然后再总结。 一、安装交叉编译器 (1)下载 下载:arm-none-linux-gnueabi-gcc下载 (2)安装 交叉编译所需软件包为 arm-2009q3.tar.bz2 《1》解压 在 /usr/local/ 目录下建立目录 arm,将软件解压至该目录。 #tar -xvf arm-2009q3.tar
[单片机]
<font color='red'>S5PV210</font>开发 -- 交叉编译器
S5PV210(TQ210)学习笔记——USB HOST移植
在写USB驱动程序的时候意外发现默认状态下内核没有驱动S5PV210的USB HOST控制器,于是,我自己动手移植了一下S5PV210的USB HOST模块,S5PV210的USB HOST控制器跟S3C2440的有些不同,S5PV210同时支持EHCI和OHCI接口(两者的区别自己谷歌搜一下),这样,S5PV210在功能上就完全支持USB2.0接口了。 Linux内核(以3.8.3为例)默认仅提供了ehci-s5p.c,但是提供了很多其他平台的ohci源码,因此,我们可以参考ohci-exynos.c来编写自己的ohci-s5p.c,然后参考ehci-s5p.c的代码组织方式添加到内核就可以了。下面废话少说,直接进入正题,开始US
[单片机]
S5PV210开发系列三_简易Bootloader的实现
Bootloader是嵌入式系统上电后第一段运行的代码。对于功能简单的处理器,可能并没有Bootloader的概念,但对于应用处理器,有不同的启动方式。不同的存储设备(Nand flash、sd/mmc、DDR2、SRAM等)。不同的操作系统等,往往须要一个Bootloader先初始化CPU和相关的硬件,建立内存空间映射,把内核或应用程序载入到对应的内存运行位置。最后调用内核或应用程序,释放CPU控制权,完毕整个Bootloader的流程。 笔者此处就S5PV210的Bootloader实现作一个简单的介绍。 1. Bootloader流程 Bootloader是严重依赖于详细硬件实现的,同样CPU内核架构。不同厂商生产的处理器其
[单片机]
<font color='red'>S5PV210</font>开发系列三_简易Bootloader的实现
S5PV210定时器
在S5PV210内部,一共有4类定时器件。这4类定时器件的功能、特征是不同的。 1、PWM定时器 (1)这种是最常用的,平时所说的定时器一般指的是这个。像简单单片机(譬如51单片机)中的定时器也是这类。 (2)为什么叫PWM定时器,因为一般SoC中产生PWM信号都是靠这个定时器模块的。 2、系统定时器 (1)系统(指的是操作系统)定时器,系统定时器也是用来产生固定时间间隔(TCNT×时钟周期)信号的,称为systick,这个systick用来给操作系统提供tick信号。 (2)产生systick作为操作系统的时间片(time slice)的,一般是用在操作系统的调度系统下,用来做调度系统的进程间切换。 (3)一般做操作系统移
[单片机]
2440nandflash启动过程再学习
2440nandflash启动,先是nandflash的前4K自动复制到CPU的0x0地址开始的4K区域。 然后CPU开始运行这4K(刚才copy过来的代码),主要是初始化硬件,然后一个很重要的就是CPU将nandflash的所有bootloader代码(包括刚才的4k代码)拷贝到SDRAM中去。 最后,找到搬移后4K代码在bootloader的最后一条指令的下一条指令在SDRAM的bootloader中的地址,继续运行bootloader的剩余代码引导系统。
[单片机]
S5PV210NandFlash应用(三)
准备分析 经过了《S5PV210的NandFlash应用(二)》对于二进制文件前16k的存取方式都了一定的了解。这次要证明的是第NandFlash第4页以后存取方式。《S5PV210的NandFlash应用(二)》里边的210.bin(大小为16k)是以存到4k为单位存到了前4页(0, 1, 2 ,3)的每页的前4k处。为此我自己写了一个8k的二进制文件(名字叫AB),贴在210.bin的后边,按照推断这8k应该存在了第4页。然后改到nand_cp.c以8k的方式,读取第4页,然后数据都输出到串口,再与原二进制文件对比。 资源工具 同《 S5PV210的LED应用(一)》 NandFlash: K9GAG08U0F (
[单片机]
<font color='red'>S5PV210</font>的<font color='red'>NandFlash</font>应用(三)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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