flash_otp_info.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * flash_otp_info.c -- print info about One-Time-Programm data
  3. */
  4. #define PROGRAM_NAME "flash_otp_info"
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <sys/ioctl.h>
  11. #include <mtd/mtd-user.h>
  12. int main(int argc,char *argv[])
  13. {
  14. int fd, val, i, ret;
  15. if (argc != 3 || (strcmp(argv[1], "-f") && strcmp(argv[1], "-u"))) {
  16. fprintf(stderr,"Usage: %s [ -f | -u ] <device>\n", PROGRAM_NAME);
  17. return EINVAL;
  18. }
  19. fd = open(argv[2], O_RDONLY);
  20. if (fd < 0) {
  21. perror(argv[2]);
  22. return errno;
  23. }
  24. val = argv[1][1] == 'f' ? MTD_OTP_FACTORY : MTD_OTP_USER;
  25. ret = ioctl(fd, OTPSELECT, &val);
  26. if (ret < 0) {
  27. perror("OTPSELECT");
  28. return errno;
  29. }
  30. ret = ioctl(fd, OTPGETREGIONCOUNT, &val);
  31. if (ret < 0) {
  32. perror("OTPGETREGIONCOUNT");
  33. return errno;
  34. }
  35. printf("Number of OTP %s blocks on %s: %d\n",
  36. argv[1][1] == 'f' ? "factory" : "user", argv[2], val);
  37. if (val > 0) {
  38. struct otp_info info[val];
  39. ret = ioctl(fd, OTPGETREGIONINFO, &info);
  40. if (ret < 0) {
  41. perror("OTPGETREGIONCOUNT");
  42. return errno;
  43. }
  44. for (i = 0; i < val; i++)
  45. printf("block %2d: offset = 0x%04x "
  46. "size = %2d bytes %s\n",
  47. i, info[i].start, info[i].length,
  48. info[i].locked ? "[locked]" : "[unlocked]");
  49. }
  50. close(fd);
  51. return 0;
  52. }