/* * FILE flash_lock.c * * This utility locks one or more sectors of flash device. * */ #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; struct mtd_info_user mtdInfo; struct erase_info_user mtdLockInfo; int num_sectors; int ofs; /* * Parse command line options */ if(argc != 4) { fprintf(stderr, "USAGE: %s \n", argv[0]); exit(1); } else if(strncmp(argv[1], "/dev/mtd", 8) != 0) { fprintf(stderr, "'%s' is not a MTD device. Must specify mtd device: /dev/mtd?\n", argv[1]); exit(1); } fd = open(argv[1], O_RDWR); if(fd < 0) { fprintf(stderr, "Could not open mtd device: %s\n", argv[1]); exit(1); } if(ioctl(fd, MEMGETINFO, &mtdInfo)) { fprintf(stderr, "Could not get MTD device info from %s\n", argv[1]); close(fd); exit(1); } sscanf(argv[2], "%x",&ofs); sscanf(argv[3], "%d",&num_sectors); if(ofs > mtdInfo.size - mtdInfo.erasesize) { fprintf(stderr, "%x is beyond device size %x\n",ofs,(unsigned int)(mtdInfo.size - mtdInfo.erasesize)); exit(1); } if (num_sectors == -1) { num_sectors = mtdInfo.size/mtdInfo.erasesize; } else { if(num_sectors > mtdInfo.size/mtdInfo.erasesize) { fprintf(stderr, "%d are too many sectors, device only has %d\n",num_sectors,(int)(mtdInfo.size/mtdInfo.erasesize)); exit(1); } } mtdLockInfo.start = ofs; mtdLockInfo.length = num_sectors * mtdInfo.erasesize; if(ioctl(fd, MEMLOCK, &mtdLockInfo)) { fprintf(stderr, "Could not lock MTD device: %s\n", argv[1]); close(fd); exit(1); } return 0; }