在应用程序中操作NorFlash

在应用程序中操作NorFlash

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

int dealwithnor(){ mtd_info_user mtd;struct erase_info_user erase;int blocks = 0;k = 0;int written = 0; //已写入的字节数,只初始化一次unsigned int size = StateOfImage.st_size; //应该是镜像的实际大小,因为内存中大于镜像的空间的内容不可预知unsigned int result = 0;unsigned int DevNum = 0; //设备的数量unsigned DevName[20] = {0};unsigned int AllSize = 0;#define MAXPARTITIONS 40struct DeviceInfo{int fd;char dir[20];uint32_t size;// Total size of the MTDuint32_t erasesize;}DevInfo[MAXPARTITIONS];//用来存储设备信息bzero(DevInfo, sizeof(struct DeviceInfo));/* 这是一种方法,但是有一个缺点,当mtd设备大于10个是,通过glob搜索出来的结果会出问题,下面采用会采用第二种方法 */// if(searchmtd(&mtdbuf) != 0){//DEBUG(“Sorry! Can not find mtd device\n”);返回大于零的数,表示升级失败// }// 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);//}(i=0; i<MAXPARTITIONS; i++){int fd;sprintf(DevName, , ,i);if((fd = open (DevName,O_SYNC | O_RDWR)) > 0){bzero(&mtd, sizeof(struct mtd_info_user));if (ioctl(fd, MEMGETINFO,&mtd) < 0){DEBUG();DEBUG();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(,DevInfo[i].dir);printf(,DevInfo[i].dir, DevInfo[i].fd);printf(,DevInfo[i].dir,DevInfo[i].size);printf(,DevInfo[i].dir,DevInfo[i].erasesize);AllSize += DevInfo[i].size;}if(AllSize < StateOfImage.st_size){DEBUG();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 (, DevInfo[i].dir);for (j= 1; j <= blocks; j++){fprintf(stderr, , j, blocks, (int)PERCENTAGE (j, blocks));g_percentage = 100 * ((float)g_AllImgWrite / g_AllImgSize);if (ioctl(DevInfo[i].fd, MEMERASE, &erase) < 0){DEBUG();DEBUG(,\(unsigned int) erase.start, (unsigned int) (erase.start + erase.length), DevInfo[i].dir);;}g_AllImgWrite += erase.length;erase.start += mtd.erasesize;}printf(, blocks, blocks);/*** 再进行写操作*/printf (, DevInfo[i].dir);g_AllImgWrite = 0;k = BUFSIZE;while (size){if (size < BUFSIZE){k = size;}printf();printf(,\DevInfo[i].dir, KB (g_AllImgWrite + k), KB (DevInfo[i].size), (int)PERCENTAGE (g_AllImgWrite + k, DevInfo[i].size));fprintf(stderr, , 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 ();if (result < 0){DEBUG(, written, written + k, DevInfo[i].dir);return 1;}DEBUG(, \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();break;}}printf(, written, (unsigned long int)(StateOfImage.st_size));}munmap(upPack, UPGRADE_SHM_SIZE);for(i=0; i<DevNum; i++){close (DevInfo[i].fd);printf(,DevInfo[i].dir);}return 0;}

posted on

看不见我将要去的地方,记不得我已经去过的地方。

在应用程序中操作NorFlash

相关文章:

你感兴趣的文章:

标签云: