flash_otp_lock.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * flash_otp_lock.c -- lock area of One-Time-Program data
  3. */
  4. #define PROGRAM_NAME "flash_otp_lock"
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11. #include <sys/ioctl.h>
  12. #include <mtd/mtd-user.h>
  13. #include "common.h"
  14. int main(int argc,char *argv[])
  15. {
  16. int fd, val, ret, offset, size;
  17. char *p;
  18. if (argc != 5 || strcmp(argv[1], "-u")) {
  19. fprintf(stderr, "Usage: %s -u <device> <offset> <size>\n", PROGRAM_NAME);
  20. fprintf(stderr, "offset and size must match on OTP region boundaries\n");
  21. fprintf(stderr, "CAUTION! ONCE LOCKED, OTP REGIONS CAN'T BE UNLOCKED!\n");
  22. return EINVAL;
  23. }
  24. fd = open(argv[2], O_WRONLY);
  25. if (fd < 0) {
  26. perror(argv[2]);
  27. return errno;
  28. }
  29. val = MTD_OTP_USER;
  30. ret = ioctl(fd, OTPSELECT, &val);
  31. if (ret < 0) {
  32. perror("OTPSELECT");
  33. return errno;
  34. }
  35. offset = strtoul(argv[3], &p, 0);
  36. if (argv[3][0] == 0 || *p != 0) {
  37. fprintf(stderr, "%s: bad offset value\n", PROGRAM_NAME);
  38. return ERANGE;
  39. }
  40. size = strtoul(argv[4], &p, 0);
  41. if (argv[4][0] == 0 || *p != 0) {
  42. fprintf(stderr, "%s: bad size value\n", PROGRAM_NAME);
  43. return ERANGE;
  44. }
  45. printf("About to lock OTP user data on %s from 0x%x to 0x%x\n",
  46. argv[2], offset, offset + size);
  47. if (prompt("Are you sure?", false)) {
  48. struct otp_info info;
  49. info.start = offset;
  50. info.length = size;
  51. ret = ioctl(fd, OTPLOCK, &info);
  52. if (ret < 0) {
  53. perror("OTPLOCK");
  54. return errno;
  55. }
  56. printf("Done.\n");
  57. } else {
  58. printf("Aborted\n");
  59. }
  60. return 0;
  61. }