--- a/mtd_debug.c +++ b/mtd_debug.c @@ -236,6 +236,7 @@ int showinfo (int fd) int i,err,n; struct mtd_info_user mtd; static struct region_info_user region[1024]; + int iNumOfBadBlocks = 0; err = getmeminfo (fd,&mtd); if (err < 0) @@ -328,6 +329,11 @@ int showinfo (int fd) printf ("\nmtd.oobsize = "); printsize (mtd.oobsize); + printf ("\nmtd.badblockscount = "); + iNumOfBadBlocks = get_bb_number(fd, &mtd); + if (iNumOfBadBlocks > -1) + printf ("%d", iNumOfBadBlocks); + printf ("\n" "regions = %d\n" "\n", @@ -347,6 +353,50 @@ int showinfo (int fd) return (0); } +int get_bb_number(int fd, struct mtd_info_user *meminfo) +{ + int isNAND = (meminfo->type == MTD_NANDFLASH); + int ibbCounter = 0; + /* Last 4 blocks of any MTD device are protected and + MTD reports them as badblocks. */ + int usablesize = meminfo->size - (4 * meminfo->erasesize); + erase_info_t erase; + erase.length = meminfo->erasesize; + + for (erase.start = 0; + erase.start < usablesize; + erase.start += meminfo->erasesize) + { + loff_t offset = erase.start; + int ret = ioctl(fd, MEMGETBADBLOCK, &offset); + + if (ret > 0) + { + ibbCounter++; + continue; + } + else if (ret < 0) + { + if (errno == EOPNOTSUPP) + { + if (isNAND) + { + printf("Bad block check not available"); + return -1; + } + } + else + { + printf("MTD get bad block failed: %s", + strerror(errno)); + return -1; + } + } + } + + return ibbCounter; +} + void showusage (const char *progname) { fprintf (stderr,