u8 nandflash_write_buffer[NAND_SERECT_FULL_SIZE];

static int currentBlock = -1;

static int currentPage = -1;

//带缓冲的nand读取,不支持跨扇区

void NAND_Read_Addr_Mal(u32 addr,u8* buffer,u32 length)

{

u32 i = 0;

u32 readBlock = ((addr/NAND_SERECT_SIZE)/NAND_PAGE_NUM);//获取要写入的块

u32 readPage = ((addr/NAND_SERECT_SIZE)%NAND_PAGE_NUM);//获取要写入的页面

u32 readoffset = (addr%NAND_SERECT_SIZE);//写入位置偏移

u32 readPageCount = ((length + readoffset)/NAND_SERECT_SIZE);//获取一共需要写入的页

if(((length + readoffset)%NAND_SERECT_SIZE) != 0)readPageCount++;//比如刚好2048的时候,就还是在一页

if(readPageCount == 1)//仅读取一个快

{

//先检查当前需要读取的数据是不是在缓冲区中

if(currentBlock >= 0 && currentPage >= 0)

{

if(readBlock == currentBlock && readPage == currentPage)

{

//在缓冲区中读取数据

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

{

buffer[i] = nandflash_write_buffer[readoffset+i];

}

}

else

{

//在物理设备中读取数据

NAND_Read_Random_Page(readBlock,readPage,readoffset,buffer,length);

}

}

else if(currentBlock == -1 && currentPage == -1)

{

//缓冲区为空,直接进行物理读取

NAND_Read_Random_Page(readBlock,readPage,readoffset,buffer,length);

}

}

else

{

//      printf("2 or up sector not vailed \r\n");

}

}

//带缓冲nand写入,不支持跨扇区

void NAND_Write_Addr_Mal(u32 addr,u8* buffer,u32 length)

{

u32 writeBlock = (addr/NAND_SERECT_SIZE)/NAND_PAGE_NUM; //获取要写入的块

u32 writePage = (addr/NAND_SERECT_SIZE)%NAND_PAGE_NUM;  //获取要写入的页面

u32 writeoffset = (addr%NAND_SERECT_SIZE);              //写入位置偏移

u32 i = 0;

u32 copy;

if(currentBlock >= 0 && currentPage >= 0)

{

if(currentBlock == writeBlock && currentPage == writePage)//没有切换页面,那么数据更新依旧在缓存中

{

for(i = writeoffset; i < writeoffset+length ;i++)

{

nandflash_write_buffer[i] = buffer[i-writeoffset];

}

}

else

{

//更新了页面的写入,先将缓存中数据写入物理设备,进行新的一轮缓存操作

copy = (currentBlock/42)+NAND_COPYBACL_BLOCK_START;

//擦除交换分区

NAND_Erase_Block(copy);

for(i = 0; i < NAND_PAGE_NUM;i++)//拷贝数据到交换分区

{

if(i != currentPage)

{

NAND_Copy_Back_Page(currentBlock,i,copy,i);

}

}

//擦除源分区

NAND_Erase_Block(currentBlock);

//将原来数据拷贝回去

for(i = 0; i < NAND_PAGE_NUM;i++)//拷贝数据到交换分区

{

if(i != currentPage)

{

NAND_Copy_Back_Page(copy,i,currentBlock,i);

}

}

//将缓存数据拷贝到目的分区

NAND_Write_Page_full(currentBlock,currentPage,NAND_SERECT_FULL_SIZE,nandflash_write_buffer);

//到这里缓存的写入物理设备完成,接下来开始新一轮缓存

NAND_Read_Full_Page(writeBlock,writePage,nandflash_write_buffer,NAND_SERECT_FULL_SIZE);

currentBlock = writeBlock;

currentPage = writePage;//更新标记

//接下来更新数据,数据更新在缓存中进行,切换的时候写入

for(i = writeoffset; i < writeoffset+length ;i++)

{

nandflash_write_buffer[i] = buffer[i-writeoffset];

}

}

}

else if(currentBlock == -1 && currentPage == -1)//当前缓存包里面没有数据

{

//从nand中读出来

NAND_Read_Full_Page(writeBlock,writePage,nandflash_write_buffer,NAND_SERECT_FULL_SIZE);

currentBlock = writeBlock;

currentPage = writePage;//更新标记

//接下来更新数据,数据更新在缓存中进行,切换的时候写入

for(i = writeoffset; i < writeoffset+length ;i++)

{

nandflash_write_buffer[i] = buffer[i-writeoffset];

}

}

}

void Nand_Flush(void)   //nand缓冲区刷入设备

{

u32 copy;

u32 i = 0;

//将还没有写入的数据刷新到nand中,标记归零

if(currentBlock >= 0 && currentPage >= 0)

{

//更新了页面的写入,先将缓存中数据写入物理设备,进行新的一轮缓存操作

copy = (currentBlock/42)+NAND_COPYBACL_BLOCK_START;

//擦除交换分区

NAND_Erase_Block(copy);

for(i = 0; i < NAND_PAGE_NUM;i++)//拷贝数据到交换分区

{

if(i != currentPage)

{

NAND_Copy_Back_Page(currentBlock,i,copy,i);

}

}

//擦除源分区

NAND_Erase_Block(currentBlock);

//将原来数据拷贝回去

for(i = 0; i < NAND_PAGE_NUM;i++)//拷贝数据到交换分区

{

if(i != currentPage)

{

NAND_Copy_Back_Page(copy,i,currentBlock,i);

}

}

//将缓存数据拷贝到目的分区

NAND_Write_Page_full(currentBlock,currentPage,NAND_SERECT_FULL_SIZE,nandflash_write_buffer);

currentBlock = -1;

currentPage = -1;

}

}

结合之前写的USB做U盘的例子来看,能降低写文件的时候的擦除次数

一种比较简单的在USB U盘中访问nandflash的方法的更多相关文章

  1. 一种基于自定义代码的asp.net网站访问IP过滤方法!

    对于一些企业内部核心系统,特别是外网访问的时候,为了信息安全,可能需要对外部访问的IP地址作限制,虽然IIS中也提供了根据IP地址或IP地址段进行限制或允许,但并没有提供根据IP地址所在的城市进行限制 ...

  2. CSharpGL(40)一种极其简单的半透明渲染方法

    CSharpGL(40)一种极其简单的半透明渲染方法 开始 这里介绍一个实现半透明渲染效果的方法.此方法极其简单,不拖累渲染速度,但是不能适用所有的情况. 如下图所示,可以让包围盒显示为半透明效果. ...

  3. I.MX6 简单电路模拟USB设备的插入

    /**************************************************************************** * I.MX6 简单电路模拟USB设备的插入 ...

  4. 用 Java 技术创建 RESTful Web (服务 JAX-RS:一种更为简单、可移植性更好的替代方式)

    作者: Dustin Amrhein, 软件工程师, IBM Nick Gallardo, 软件工程师, IBM 出处: http://www.ibm.com/developerworks/cn/we ...

  5. [1.6W字] 浏览器跨域请求限制的详细原理分析&寻找一种最简单的方式实现XHR跨域(9种方法, 附大招可以纯前端实现跨域!)

    Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...

  6. 自己实现简单的AOP(二)引入Attribute 为方法指定增强对象

    话续前文 : 自己实现简单的AOP(一)简介 在前一篇文章中,对AOP的实现方式做了一个简单介绍.接下来,引入Attribute 为方法指定增强对象,由此实现一个简单的AOP. 注意:指定的是增强对象 ...

  7. 一种面向云服务的UCON多义务访问控制方法及系统

    )设置每一云服务的义务项:建立每一云服务所包含的义务图:2)根据用户所请求的云服务查找该云服务的所有强制义务图和可选义务图,并提取该用户对该云服务的历史完成情况:3)对每一强制义务图,监控其每一义务项 ...

  8. USB2.0协议学习笔记---USB工作过程(类的方法)

    前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 . 也可以理解为端点构成接口,接口组成配置,配置组成设备. ...

  9. macbook pro的usb串口失效的的处理方法

    macbook pro的usb串口失效的的处理方法 2011-08-24 12:14:32|  分类: mac|举报|字号 订阅     今天开电脑,无端端一个usb的串口失效了,接入鼠标 iphon ...

随机推荐

  1. tiny210移植linux内核(3.0.8)杂项

    关于三星芯片nand内存分区文件: linux-3.0.8/drivers/mtd/nand/s3c_nand.c struct mtd_partition s3c_partition_info[] ...

  2. selenuim,qtp,loadrunner,jmeter有何区别,想学个脚本语言python和测试工具应该从哪里入门呢。

    selenium和qtp是 功能的自动化测试,loadrunner和jmeter是性能的自动化测试 selenium要求代码能力比较高,适合用python,QTP一般用VBS,loadrunner一般 ...

  3. AutoTile 自动拼接(四) 学习与实践

    今天主要来说下,数据绑定. 之前第一章,我说到 把 资源图 画成格子,你们应该还有印象吧. 那么,当我 知道 格子数据,能否拿到 资源对应的图片呢? 大家先复习一下 第一章,发现很多格子数据 是相同的 ...

  4. CodeForces 687C The Values You Can Make(动态规划)

    这个也可以说是一个01背包了,里面也有一些集合的思想在里面,首先dp方程,dp[i][j]代表着当前数值为i,j能否被构成,如果dp[i][j] = 1,那么dp[i+m][j] 和 dp[i+m][ ...

  5. ElasticSearch — 集群搭建

    1.es需要java环境,故先检查java环境是否正常 2.下载elasticsearch安装包 http://www.elasticsearch.org/download/ 目前最新版本到1.4.0 ...

  6. Day05_JAVAEE系列:Junit

    Junit 单元测试开发工具:myeclipse10 内部集成的junit的库 1)什么是junit?     junit是一个专业的编写测试代码的工具 2)建立junit测试类的步骤:     2. ...

  7. hadoop的安全模式

    在安全模式下:不能增.删.改操作:但可以查看. 查看hadoop是否i处于安全模式下: 执行命令:hadoop dfsadmin -safemode get 进入hadoop的安全模式下: 执行命令: ...

  8. 第13章 Swing程序设计----常用面板

    面板也是一个Swing容器,它可以作为容器容纳其他组件,但它也必须被添加到其他容器中. Swing常用的面板包括JPanel面板和JScrollPanel面板. 1.JPanel面板 import j ...

  9. eclipse myeclipse修改工作区间 an error has occurred. see error log for more details. java.lang.nullpointerexception 问题解决

    解决办法:修改项目工作空间. 修改工作空间,以前打开myEclipse时知道怎么改!现在只有找配置文件了! 步骤: MyEclipse 5.1.1 GA----->Eclipse-----> ...

  10. CentOS 6.5 安装Nvidia驱动后出现"no screens found "错误

    参考官网文档 http://cn.download.nvidia.com/XFree86/Linux-x86_64/280.13/README/editxconfig.html 进入更改文档: vi ...