相对于操作NandFlash,操作NorFlash相对简单,因为基本不需要考虑坏块,NorFlash也没有OOB区域,也跟ECC没有一毛钱关系。它的读写擦除相对容易。

int dealwithnor()
{ // glob_t mtdbuf;
struct mtd_info_user mtd;
struct erase_info_user erase;
int blocks = ;
int i = ; //用于控制擦除的块的个数
int k = ;
int written = ; //已写入的字节数,只初始化一次
unsigned int size = StateOfImage.st_size; //应该是镜像的实际大小,因为内存中大于镜像的空间的内容不可预知
unsigned int result = ;
unsigned int DevNum = ; //设备的数量
unsigned int StartDev = ; //从第startDev开始擦除
char DevName[] = {};
unsigned int AllSize = ;
#define MAXPARTITIONS 40
struct DeviceInfo
{
int fd;
char dir[];
uint32_t size; // Total size of the MTD
uint32_t erasesize; }DevInfo[MAXPARTITIONS];//用来存储设备信息 bzero(DevInfo, sizeof(struct DeviceInfo)); /* 这是一种方法,但是有一个缺点,当mtd设备大于10个是,通过glob搜索出来的结果
会出问题,下面采用会采用第二种方法 */
// if(searchmtd(&mtdbuf) != 0){ // DEBUG("Sorry! Can not find mtd device\n");
// return 1; //返回大于零的数,表示升级失败
// }
// else
// {
// int fd;
//
// DEBUG("find %d mtd devices \n",mtdbuf.gl_pathc);
// DevNum = mtdbuf.gl_pathc; // for(i=0; i<DevNum; i++)
// {
// fd = safeOpen (mtdbuf.gl_pathv[i],O_SYNC | O_RDWR);
// if(fd < 0)
// {
// printf("failt to open\n");
// return 1;
// }
// bzero(&mtd, sizeof(struct mtd_info_user));
// if (ioctl(fd, MEMGETINFO,&mtd) < 0)
// {
// DEBUG("ioctl(): %m\n");
// DEBUG("This doesn't seem to be a valid MTD flash device!\n");
// return 1;
// }
//
// strcpy(DevInfo[i].dir, mtdbuf.gl_pathv[i]);
// DevInfo[i].fd = fd;
// DevInfo[i].size = mtd.size;
// DevInfo[i].erasesize = mtd.erasesize;
// } // globfree(&mtdbuf);
// for(i=0; i<DevNum; i++)
// {
// printf("\n\tinfo of %s\n",DevInfo[i].dir);
// printf("%s.fd: %d\n",DevInfo[i].dir, DevInfo[i].fd);
// printf("%s.size: %d\n",DevInfo[i].dir,DevInfo[i].size);
// printf("%s.erasesize: %d\n",DevInfo[i].dir,DevInfo[i].erasesize);
// }
// } /* 下面是第二种方法,这种方法克服了第一种方法的缺陷,不受mtd设备数量的限制 */ for(i=; i<MAXPARTITIONS; i++)
{
int fd;
sprintf(DevName, "%s%d", "/dev/mtd",i); if((fd = open (DevName,O_SYNC | O_RDWR)) > )
{
bzero(&mtd, sizeof(struct mtd_info_user));
if (ioctl(fd, MEMGETINFO,&mtd) < )
{
DEBUG("ioctl(): %m\n");
DEBUG("This doesn't seem to be a valid MTD flash device!\n");
return ;
}
strcpy(DevInfo[i].dir, DevName);
DevInfo[i].fd = fd;
DevInfo[i].size = mtd.size;
DevInfo[i].erasesize = mtd.erasesize;
}
else
{
DevNum = i;
break;
} } for(i=; i<DevNum; i++)
{
printf("\n\tinfo of %s\n",DevInfo[i].dir);
printf("%s.fd: %d\n",DevInfo[i].dir, DevInfo[i].fd);
printf("%s.size: %d\n",DevInfo[i].dir,DevInfo[i].size);
printf("%s.erasesize: %d\n",DevInfo[i].dir,DevInfo[i].erasesize);
AllSize += DevInfo[i].size;
} if(AllSize < StateOfImage.st_size)
{
DEBUG("ERROR!! all device size is less than ImageSize\n");
return ;
} for(i=StartDev; i<DevNum; i++)
{ /**
* 先进行擦除操作
*/
int j = ;
g_AllImgSize = DevInfo[i].size;
g_AllImgWrite = ;
erase.start = ;
blocks = DevInfo[i].size / mtd.erasesize; //计算要擦除的块的个数
erase.length = mtd.erasesize;
printf ("\nbegin to erase block %s\n", DevInfo[i].dir);
for (j= ; j <= blocks; j++)
{
fprintf(stderr, "\rErasing blocks: %d/%d (%d%%)", j, blocks, (int)PERCENTAGE (j, blocks));
g_percentage = * ((float)g_AllImgWrite / g_AllImgSize);
if (ioctl(DevInfo[i].fd, MEMERASE, &erase) < )
{
DEBUG("\n");
DEBUG("While erasing blocks 0x%.8x-0x%.8x on %s\n",\
(unsigned int) erase.start, (unsigned int) (erase.start + erase.length), DevInfo[i].dir);
/*return "Error while erasing blocks";*/
return ;
}
g_AllImgWrite += erase.length;
erase.start += mtd.erasesize;
}
printf("\n\rErased blocks: %d/%d (100%%)\n", blocks, blocks); /**
* 再进行写操作
*/
printf ("\nbegin to write block %s\n\n", DevInfo[i].dir);
g_AllImgWrite = ;
k = BUFSIZE;
while (size)
{
if (size < BUFSIZE)
{
k = size;
}
printf("\033[1A");
printf("\r%s usage: %dk/%dk (%d%%)\n",\
DevInfo[i].dir, KB (g_AllImgWrite + k), KB (DevInfo[i].size), (int)PERCENTAGE (g_AllImgWrite + k, DevInfo[i].size));
fprintf(stderr, "Writing data: %dk/%ldk (%d%%)", KB (written + k), KB (StateOfImage.st_size), (int)PERCENTAGE (written + k, StateOfImage.st_size));
result = write(DevInfo[i].fd, &upPack[written], k);
if (k != result)
{
DEBUG ("\n");
if (result < )
{
DEBUG("While writing data to 0x%.8x-0x%.8x on %s\n", written, written + k, DevInfo[i].dir);
return ;
}
DEBUG("Short write count returned while writing to x%.8x-0x%.8x on %s: %d/%d bytes written to flash\n", \
written,written + k, DevInfo[i].dir, written + result, DevInfo[i].size);
return ;
} written += k;
size -= k; g_AllImgWrite += k;
if(g_AllImgWrite >= DevInfo[i].size)
{
g_AllImgWrite = ;
printf("\n");
break;
} }
printf("Wrote %d / %ldk bytes\n", written, (unsigned long int)(StateOfImage.st_size)); } munmap(upPack, UPGRADE_SHM_SIZE);
for(i=; i<DevNum; i++)
{
close (DevInfo[i].fd);
printf("%s is closed!\n",DevInfo[i].dir);
} return ;
}

在应用程序中操作NorFlash的更多相关文章

  1. c#中操作word文档-四、对象模型

    转自:http://blog.csdn.net/ruby97/article/details/7406806 Word对象模型  (.Net Perspective) 本文主要针对在Visual St ...

  2. 在应用程序中实现对NandFlash的操作

    以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...

  3. 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...

  4. 《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才 ...

  5. PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码

    PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...

  6. LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新

    原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S.    以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...

  7. websocketj--随时随地在Web浏览器中操作你的服务端程序

    0 - 有没有觉得Linux标准终端界面输入输出枯燥无味? 1 - 什么?vmstat命令的输出数据不直观?有没有想过能够可视化该命令的输出? 2 - 尝试过用浏览器操作Windows中的cmd吗? ...

  8. 在Python程序中的进程操作,multiprocess.Process模块

    在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

  9. Python程序中的进程操作

    之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程 ...

随机推荐

  1. cocos中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)

    CCLabelTTF CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OPENGL 纹理将会被创建..这意味着setString 和创建一个新的标签一样慢. 这个类使 ...

  2. 邮件发送服务AWS SES,Mailgun以及SendCloud(转)

    原文:http://www.l4zy.com/posts/aws_ses-mailgun-sendcloud.html 电子邮件这一已经诞生很多年的互联网基础服务并没有随着时间的推移而慢慢消亡,实际上 ...

  3. 关于PCB 3D 模型的快速导入方法

    altium designer中创建的3D library 只能查看3D效果,并没有其他功能,经测试在原理图编辑界面通过给元件添加 PCB 3D 并不能真正添加3D模型,这样添加根本没有效果(显示不出 ...

  4. hdu 5311 Hidden String (BestCoder 1st Anniversary ($))(深搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Time Limit: 2000/1000 MS (Java/Others)  ...

  5. POJ 1160Post Office

    POJ 1160    Post Office 我不知道优化,我只知道最暴力的方法,O(V^3),居然100ms不到的过了 设DP[i][j][k]表示考虑前i个小镇,放了j个邮局,最后一个邮局的所在 ...

  6. NSInvocation Basics

    In this article I'm going to cover the basics and usages of NSInvocation. What is NSInvocation? Appl ...

  7. [置顶] DataGridView控件---绑定数据方法

             DataGridView控件是在windows应用程中显示数据最好的方式,它只需要几行简短的代码就可以把数据显示给用户,同时又支持增.删.改操作.今天将自己总结的增加数据的方法总结分 ...

  8. Compactness问题

    今天偶然在论坛讨论在halcon下紧密度的问题,现在总结一下 Calculation: If L is the length of the contour (see contlength) and F ...

  9. php redis 分布式类

    配置: $redis_config = array( 'prefix' => 'ylmall_', 'master' => array( 'host' => "192.16 ...

  10. spring中文乱码过滤器

    中文乱码过滤器 在您通过表单向服务器提交数据时,一个经典的问题就是中文乱码问题.虽然我们所有的 JSP 文件和页面编码格式都采用 UTF-8,但这个问题还是会出现.解决的办法很简单,我们只需要在 we ...