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