/* * flash_otp_lock.c -- lock area of One-Time-Program data */ #define PROGRAM_NAME "flash_otp_lock" #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <sys/ioctl.h> #include <mtd/mtd-user.h> #include "common.h" int main(int argc,char *argv[]) { int fd, val, ret, offset, size; char *p; if (argc != 5 || strcmp(argv[1], "-u")) { fprintf(stderr, "Usage: %s -u <device> <offset> <size>\n", PROGRAM_NAME); fprintf(stderr, "offset and size must match on OTP region boundaries\n"); fprintf(stderr, "CAUTION! ONCE LOCKED, OTP REGIONS CAN'T BE UNLOCKED!\n"); return EINVAL; } fd = open(argv[2], O_WRONLY); if (fd < 0) { perror(argv[2]); return errno; } val = MTD_OTP_USER; ret = ioctl(fd, OTPSELECT, &val); if (ret < 0) { perror("OTPSELECT"); return errno; } offset = strtoul(argv[3], &p, 0); if (argv[3][0] == 0 || *p != 0) { fprintf(stderr, "%s: bad offset value\n", PROGRAM_NAME); return ERANGE; } size = strtoul(argv[4], &p, 0); if (argv[4][0] == 0 || *p != 0) { fprintf(stderr, "%s: bad size value\n", PROGRAM_NAME); return ERANGE; } printf("About to lock OTP user data on %s from 0x%x to 0x%x\n", argv[2], offset, offset + size); if (prompt("Are you sure?", false)) { struct otp_info info; info.start = offset; info.length = size; ret = ioctl(fd, OTPLOCK, &info); if (ret < 0) { perror("OTPLOCK"); return errno; } printf("Done.\n"); } else { printf("Aborted\n"); } return 0; }