一种比较简单的在USB U盘中访问nandflash的方法

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盘的例子来看,能降低写文件的时候的擦除次数

时间: 2024-11-13 08:42:15

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

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

对于一些企业内部核心系统,特别是外网访问的时候,为了信息安全,可能需要对外部访问的IP地址作限制,虽然IIS中也提供了根据IP地址或IP地址段进行限制或允许,但并没有提供根据IP地址所在的城市进行限制或允许.本文主要通过自定义扩展IHttpModule接口,考虑到性能IP数据库主要采用QQwry纯真IP数据库(但此数据库并非是官方的,我之前与ip138网站对比过,IP地址信息的准确性大概在90%左右),主要实现不仅可以根据IP地址或IP地址段进行限制或允许(与IIS的功能相同),而且可以根据IP

找1~100之间素数的两种比较简单的方法

方法一:利用一个布尔类型的值的判断,优点想法更直接易懂 public static void main(String[] args) { for(int i=2;i<=100;i++){ boolean b=true; for(int n=2;n<i;n++){ if(i%n==0){ b=false; break; } } if(b==true){ System.out.print(i+"\t"); } } } 方法二:能被2和这个数本身以外的数整除的都不是素数.理解难但

四种比较简单的图像显著性区域特征提取方法原理及实现-----&gt; AC/HC/LC/FT。

laviewpbt  2014.8.4 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享. 先从最简单的最容易实现的算法说起吧: 1. LC算法 参考论文:Visual Attention Detection in Video Sequences Using Spatiotemporal Cues. Yun Zhai and Mubarak Shah.  Pa

一种大气简单的Web管理(陈列)版面设计

在页面的设计中,多版面是一种常见的设计样式.本文命名一种 这样的样式,可以简单描述为一行top,一列左目录,剩余的右下的空间为内容展示区.这样的样式,便于快速定位到某项内容或功能. 在基本的HTML语法中,iframe可以提供多版面,方法简易,然而,本文主要在于推介一种利用Div实现版面控制的方法,这种方法可以利用div带来的更大灵活性. 首先,展示下最终实现的效果. 主页面采用这样的frame.css样式控制. #framecontentTop { position: absolute; to

网页中使用css的几种方式简单介绍

网页中使用css的几种方式简单介绍: css在当前的网页中可以说是必须的,如果没有使用css,那么这个网页一般丑陋的难以想象,下面就介绍一下网页使用css的几种方式,希望对初学者能够有所帮助. 一.内联样式: 所谓的内联样式就是卸载标签之内的样式,代码如下: <div style="color:red;font-size:10px"></div> 也就是使用style方式在标签内规定div的样式. 二.内部样式表: 所谓内部样式表,就是样式表写在当前页面,而不是

一种理想的在关系数据库中存储树型结构数据的方法

一种理想的在关系数据库中存储树型结构数据的方法 在各种基于关系数据库的应用系统开发中,我们往往需要存储树型结构的数据,目前有很多流行的方法,如邻接列表模型(The Adjacency List Model),在此基础上也有很多人针对不同的需求做了相应的改进,但总是在某些方面存在的各种各样的缺陷.    那么理想中的树型结构应具备哪些特点呢?数据存储冗余小.直观性强:方便返回整个树型结构数据:可以很轻松的返回某一子树(方便分层加载):快整获以某节点的祖谱路径:插入.删除.移动节点效率高等等.带着这

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

话续前文 : 自己实现简单的AOP(一)简介 在第一篇文章中,对AOP的实现方式做了一个简单介绍.接下来,引入Attribute 为方法指定增强对象,由此实现一个简单的AOP. 注意:指定的是增强对象,“对象”,也就是说Attribute标记,标记的其实是一个对象.由此.使用多态便可轻松实现增强的扩展. 自定义的Attribute /// <summary> /// 为方法标记指定的增强对象 /// <para>指定的增强,可通过代理 DelayProxy 织入</para&

几种在shell命令行中过滤adb logcat输出的方法

我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法. 1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp       adb logcat | grep -i

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

本发明公开了一种面向云服务的UCON多义务访问控制方法及系统.本方法为:1)设置每一云服务的义务项:建立每一云服务所包含的义务图:2)根据用户所请求的云服务查找该云服务的所有强制义务图和可选义务图,并提取该用户对该云服务的历史完成情况:3)对每一强制义务图,监控其每一义务项所对应属性的属性值,判断该义务项是否完成,并检查所有强制义务图是否已经完成,如果完成则进行步骤4):4)对每一可选义务图,监控其每一义务项所对应属性的属性值,并根据该义务项的历史完成情况判断该义务项的完成概率:然后计算该云服务