一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 應用程序操作NorFlash示例代碼分享(norflash接口使用方法)

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

2021-01-11 15:34C語言教程網 C/C++

相對于操作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 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;
}

 

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 亚洲日本中文字幕在线2022 | 欧美侏儒xxx | 日韩手机在线观看 | 国产精品一级香蕉一区 | 国内久久婷婷综合欲色啪 | 小小水蜜桃3视频在线观看 小鸟酱喷水 | 毛毛片在线 | 精品国产欧美精品v | 极端 成熟 性别 视频 | 成人做视频免费 | 五月婷婷在线播放 | 99热最新在线观看 | 王者荣耀瑶白色液体 | 国产hd老太婆 | 日本三级免费网站 | 亚洲国产香蕉视频欧美 | 手机在线免费观看日本推理片 | 明星ai人脸替换造梦在线播放 | 成人看的羞羞视频免费观看 | 亚洲 欧美 国产 综合 播放 | 精品久久久久香蕉网 | 欧美vpswindows动物 | 温柔校草高h | 农村妇女野外牲交一级毛片 | 北岛玲亚洲一区在线观看 | 欧美又黄又激烈真实床戏 | 午夜片神马影院福利 | 欧洲美女女同 | 69日本人| 黄动漫软件车车好快的车车 | 欧美三级一区 | 成人影院在线看 | 国产乱子伦在线观看不卡 | 男人插曲女人身体 | 免费观看无人区完整版 | 亚洲性爱区 | 亚洲国产综合久久精品 | 国产一区视频在线免费观看 | 久久观看视频 | 国内永久第一免费福利视频 | 碰91精品国产91久久婷婷 |