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

int dealwithnor()
{//    glob_t mtdbuf;struct mtd_info_user mtd;struct erase_info_user erase;int blocks = 0;int i = 0;  //用于控制擦除的块的个数int k = 0;int written = 0;  //已写入的字节数,只初始化一次unsigned int size = StateOfImage.st_size;  //应该是镜像的实际大小,因为内存中大于镜像的空间的内容不可预知unsigned int result = 0;unsigned int DevNum = 0;    //设备的数量unsigned int StartDev = 0;  //从第startDev开始擦除char DevName[20] = {0};unsigned int AllSize = 0;#define MAXPARTITIONS 40struct DeviceInfo{int fd;char dir[20];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=0; i<MAXPARTITIONS; i++){int fd;sprintf(DevName, "%s%d", "/dev/mtd",i);if((fd = open (DevName,O_SYNC | O_RDWR)) > 0){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, DevName);DevInfo[i].fd = fd;DevInfo[i].size = mtd.size;DevInfo[i].erasesize = mtd.erasesize;}else{DevNum = i;break;}}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);AllSize += DevInfo[i].size;}if(AllSize < StateOfImage.st_size){DEBUG("ERROR!! all device size is less than ImageSize\n");return 1;}for(i=StartDev; i<DevNum; i++){/*** 先进行擦除操作 */int j = 0;g_AllImgSize = DevInfo[i].size;g_AllImgWrite = 0;erase.start = 0; blocks = DevInfo[i].size / mtd.erasesize;  //计算要擦除的块的个数erase.length = mtd.erasesize;printf ("\nbegin to erase block %s\n", DevInfo[i].dir);for (j= 1; j <= blocks; j++){fprintf(stderr, "\rErasing blocks: %d/%d (%d%%)", j, blocks, (int)PERCENTAGE (j, blocks));g_percentage = 100 * ((float)g_AllImgWrite / g_AllImgSize);if (ioctl(DevInfo[i].fd, MEMERASE, &erase) < 0){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 1;}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 = 0;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 < 0){DEBUG("While writing data to 0x%.8x-0x%.8x on %s\n", written, written + k, DevInfo[i].dir);return 1;}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 1;}written += k;size -= k;g_AllImgWrite += k;if(g_AllImgWrite >= DevInfo[i].size){   g_AllImgWrite = 0;printf("\n");break;}} printf("Wrote %d / %ldk bytes\n", written, (unsigned long int)(StateOfImage.st_size));        }munmap(upPack, UPGRADE_SHM_SIZE);for(i=0; i<DevNum; i++){close (DevInfo[i].fd);printf("%s is closed!\n",DevInfo[i].dir);}return 0;
}

转载于:https://www.cnblogs.com/pengdonglin137/p/3469191.html

在应用程序中操作NorFlash相关推荐

  1. 多线程程序中操作的原子性--转帖

    多线程程序中操作的原子性 0. 背景 原子操作就是不可再分的操作.在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头.本文主要讨论了三个问题: ...

  2. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  3. Java程序中操作Word表格

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  4. 在Delphi程序中操作注册表

    32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象: ...

  5. 多线程程序中操作的原子性

    0. 背景 原子操作就是不可再分的操作.在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头. 本文主要讨论了三个问题: 1. 多线程程序中对变 ...

  6. oledb vc访问mdb数据库_VC++程序中访问ACCESS 数据库使用用户名和密码

    此网站选择Access进入查看ADO 使用连接数据库的字符串,如使用到带用户名和密码连接Access数据库要用到以下条目: 红线标注的为使用连接数据库时设置的字符串,如果使用到用户Admin,密码Ad ...

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

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

  8. 在python程序中的进程操作

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

  9. python在中小学教学中的应用-在python程序中的进程操作

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

  10. 访问其他程序中的数据(ContentResolver的CRUD操作)

    内容提供器的用法一般有两种: 1.使用现有的内容提供器来读取和操作相应程序中的数据 2.创建自己的内容提供器给我们程序的数据提供外部访问接口. 如果一个应用程序通过内容提供器对其数据提供了外部访问接口 ...

最新文章

  1. oracle中create table with as和insert into with as语句
  2. Vue如何引入ElementUI进行使用
  3. sap采购订单更改记录_SAP系统如何实现减税:增值税16%
  4. 【渝粤教育】电大中专办公设备使用与维护 (2)_1作业 题库
  5. c语言e怎么表示_来测测!这11个C语言入门基础知识你都掌握了吗?
  6. 2012 依赖注入框架
  7. 18-mysql-数据类型
  8. 《Mahout算法解析与案例实战》一一2.3 测试安装
  9. 海康威视研究院ImageNet2016竞赛经验分享
  10. 信号与系统 Matlab 实验 画连续离散系统零极点图 分析连续、离散系统的频率特性 幅频特性曲线 相频特性曲线
  11. 电脑软件:推荐一款本地文档搜索神器,赶快下载试试吧!
  12. c语言循环接收按键,C语言中,如何用键盘输入来退出循环
  13. 重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)
  14. 轻松获得oblog2.52的WebShell
  15. C++ printf打印二进制,三进制,八进制,十六进制等(利用itoa)
  16. ubuntu 更换桌面为 KDE
  17. 黑马程序员——集合Collection:体系详述
  18. APP逆向分析之XX音乐客户端下载歌曲权限绕过
  19. MySQL索引(什么是索引、如何创建索引、什么时候用索引、索引的作用)
  20. UrlRewritingNet 完美实现 ASP.NET 2.0 中的URL重写(映射)

热门文章

  1. 对HDLC 和PPP实验的总结
  2. 搜索引擎Elasticsearch,这篇文章给讲透了(建议收藏)
  3. MySQL 是怎么死锁的?
  4. 掌握了这30道MySQL基础面试题,我成了面霸
  5. 程序员必看—程序员如何高效提升自己?
  6. 为什么Uber宣布从Postgres切换到MySQL?
  7. 阿里巴巴:如何从优秀员工,晋升为合格管理者?
  8. 代码很烂,所以离职。
  9. Go语言学习笔记(八)
  10. Wannafly挑战赛25 A.因子