亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

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

2020-01-26 15:40:00
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美中文字幕在线一区| 欧美精品免费播放| 欧美成人一区在线| 日韩av在线最新| 日本一欧美一欧美一亚洲视频| 亚洲欧美日韩综合| 久久久久久这里只有精品| 欧美日韩美女在线观看| 亚洲高清久久网| 在线视频一区二区| 久久躁狠狠躁夜夜爽| 欧洲一区二区视频| 国产亚洲精品综合一区91| 成人免费视频网址| 国产精品综合久久久| 欧美性xxxxxxx| 欧美成人h版在线观看| 欧美在线一区二区三区四| 成人黄色免费片| 亚洲精品中文字幕女同| 欧美午夜精品伦理| 亚洲第一福利视频| 欧美色欧美亚洲高清在线视频| 精品国产视频在线| 久久躁日日躁aaaaxxxx| 一区国产精品视频| 欧美极度另类性三渗透| 一区二区福利视频| 国产精品麻豆va在线播放| 国产精品视频永久免费播放| 欧美电影院免费观看| 日韩精品视频在线观看网址| 亚洲第一区第一页| 北条麻妃在线一区二区| 亚洲高清在线观看| 午夜精品一区二区三区在线视频| 欧美性高潮在线| 欧美性xxxx在线播放| 亚洲影院在线看| 91中文在线观看| 黑人欧美xxxx| 亚洲网站在线播放| 国产香蕉一区二区三区在线视频| 亚洲欧美国产一区二区三区| 国产亚洲人成a一在线v站| 丝袜情趣国产精品| 视频在线一区二区| 久久av在线播放| 久久成人亚洲精品| 成人午夜一级二级三级| 亚洲黄色成人网| 成人免费视频xnxx.com| 欧美黄色片在线观看| 午夜免费日韩视频| 91久久在线观看| 亚洲最大的网站| 国产精品视频永久免费播放| 最近2019中文字幕mv免费看| 日本精品在线视频| 日本久久中文字幕| 91精品久久久久久久久久另类| 国产一区深夜福利| 国产精品视频免费在线观看| 国产精品视频网| 亚洲香蕉成视频在线观看| 日韩免费在线免费观看| 精品久久久久久久久久久久久久| 色中色综合影院手机版在线观看| 成人福利在线观看| 亚洲偷熟乱区亚洲香蕉av| 亚洲福利在线看| 成人中文字幕在线观看| 日韩精品高清在线观看| 国产精品电影一区| 精品国产户外野外| 亚洲精品国产拍免费91在线| 中国日韩欧美久久久久久久久| 欧美大片在线看| 91精品国产高清久久久久久久久| 亚洲免费伊人电影在线观看av| 欧美中在线观看| 热re99久久精品国产66热| 欧美最猛黑人xxxx黑人猛叫黄| 激情久久av一区av二区av三区| 亚洲男人天堂久| 免费99精品国产自在在线| 亚洲精品国产电影| 在线观看亚洲视频| 午夜精品久久久久久久白皮肤| 国产精品人成电影| 国产精品久久久久久久久久尿| 欧美福利视频在线观看| 亚洲日本欧美中文幕| 欧美日韩激情视频| 久久精品国产精品| 久久精品国产2020观看福利| 欧美孕妇性xx| 欧美日韩性视频| 国产精品免费观看在线| 欧美在线视频网| 亚洲欧美日韩精品久久奇米色影视| 92裸体在线视频网站| 久久久久久亚洲精品中文字幕| 国产精品一区二区三区在线播放| 精品香蕉在线观看视频一| 日av在线播放中文不卡| 亚洲一区第一页| 中文字幕亚洲欧美| 国产精品成人观看视频国产奇米| 国产自产女人91一区在线观看| 欧美乱妇高清无乱码| 亚洲美女性生活视频| 精品国产一区二区三区久久狼5月| 91久久中文字幕| 日韩av中文字幕在线播放| 久久的精品视频| 国产精品福利在线观看| 久久天堂av综合合色| 亚洲人成五月天| 国产精品爱啪在线线免费观看| 国产精品日韩欧美大师| 91精品啪aⅴ在线观看国产| 欧美影院在线播放| 最新国产成人av网站网址麻豆| 欧美激情国产高清| 91精品国产综合久久久久久久久| 欧美国产日韩中文字幕在线| 国产欧美日韩丝袜精品一区| 国产精品久久久久91| 亚洲第一免费网站| 欧美激情视频在线免费观看 欧美视频免费一| 国产z一区二区三区| 欧美有码在线观看视频| 久久精品视频中文字幕| 亚洲最大av网站| 成人免费直播live| 国产噜噜噜噜久久久久久久久| 久久深夜福利免费观看| 久久视频在线免费观看| 久久综合伊人77777尤物| 欧洲美女7788成人免费视频| 欧美美女操人视频| 亚洲影院色在线观看免费| 亚洲成年网站在线观看| 亚洲电影免费在线观看| 亚洲自拍欧美色图| 97香蕉久久超级碰碰高清版| 日韩av网址在线| 欧美极品少妇xxxxⅹ裸体艺术| 成人久久18免费网站图片| 欧美日韩国产中字| 欧美亚洲国产成人精品| 欧美理论片在线观看| 高清欧美性猛交xxxx黑人猛交| 国产一区香蕉久久| 欧美刺激性大交免费视频| 亚洲va电影大全| 国产精品成人aaaaa网站| 米奇精品一区二区三区在线观看| 亚洲第一页自拍| 91精品国产免费久久久久久| 欧美黄色片在线观看| 日韩成人在线视频| 国产午夜精品久久久|