应用程序操作NorFlash示例代码分享(norflash接口使用方法)

代码如下:

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 40
    struct 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;
}

(0)

相关推荐

  • 应用程序操作NorFlash示例代码分享(norflash接口使用方法)

    复制代码 代码如下: 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.s

  • C++ I/O文件读写操作的示例代码

    IO: 向设备输入数据和输出数据C++的IO流 c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 文件流: 对文件进行读写操作 头文件: 类库: ifstream 对文件输入(读文件) ofstream 对文件输出(写文件) fstream 对文件输入或输出 //写文件 #include <fstream> #include <iostream> #include <string> using namespace std; int main() { st

  • 小程序自动化测试的示例代码

    背景 近期团队打算做一个小程序自动化测试的工具,期望能够做的业务人员操作一遍小程序后,自动还原之前的操作路径,并且捕获操作过程中发生的异常,以此来判断这次发布时候会影响小程序的基础功能. 上述描述看似简单,但是中间还是有些难点的,第一个难点就是如何在业务人员操作小程序的时候记录操作路径,第二个难点就是如何将记录的操作路径进行还原. 自动化 SDK 如何将操作路径还原这个问题,当然首选官方提供的 SDK: miniprogram-automator . 小程序自动化 SDK为开发者提供了一套通过外

  • C# 利用Selenium实现浏览器自动化操作的示例代码

    概述 Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C. java.ruby.python.或是C# ,你都可以通过selenium完成自动化测试.本文以一个简单的小例子,简述C# 利用Selenium进行浏览器的模拟操作,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点 要实现本例的功能,除了要掌握Html ,JavaScript,CSS等基础知识,还涉及以下知识点: log4net:主要用于日志的记录和存储,本例采用log4net进行日志记录,便于过程跟踪

  • Go语言操作数据库及其常规操作的示例代码

    Go操作MySQL 安装: go get -u github.com/go-sql-driver/mysql GO语言的操作数据库的驱动原生支持连接池, 并且是并发安全的 标准库没有具体的实现 只是列出了一些需要的第三方库实现的具体内容 //第一次连接MySQL成功 package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" // _想当于init()初始化 "log&qu

  • JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享

    效果展示: 代码实现: 控制器 <?php namespace app\controllers; use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\filters\VerbFilter; use app\models\LoginForm; use app\models\ContactForm; //use yii\db\ActiveRecord; use yii\data\Pagination; use

  • Python Learning 列表的更多操作及示例代码

    遍历列表-for循环 列表中存储的元素可能非常多,如果想一个一个的访问列表中的元素,可能是一件十分头疼的事.那有没有什么好的办法呢?当然有!使用 for循环 假如有一个食物名单列表,通过 for循环 将列表中的食物名称都打印出来 # 定义一个食物名单列表 foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza'] # 循环访问foods列表 for food in foods: print(food) 输出: potato  tomato 

  • pyqt5 textEdit、lineEdit操作的示例代码

    1.定义一个textEdit/lineEdit:(lineEdit只需要将代码中的QTextEdit改为QLineEdit) self.textEdit = QtWidgets.QTextEdit(Dialog) self.textEdit.setGeometry(QtCore.QRect(70, 90, 171, 391)) self.textEdit.setObjectName("textEdit") self.textEdit.setReadOnly(True)#设置为只读,即可

  • JAVA 实现磁盘文件加解密操作的示例代码

    简单实现了下: import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.*; import java.security.GeneralSecurityException; import java.security.SecureRandom; /** * 文件

  • Unity常用音频操作类示例代码

    下面通过代码给大家介绍Unity常用音频操作类,具体代码如下所示: using UnityEngine; using System.Collections; public class AudioPlay : MonoBehaviour { public static AudioPlay Instance; public AudioClip[] FuChuAudio; public AudioSource FCAudio; // public AudioSource BabyAudio; // U

随机推荐