yc_otp.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "yc_otp.h"
  2. #include "yc_drv_common.h"
  3. /*
  4. * @brief: OTP deint
  5. * @param: none
  6. * @return: none
  7. */
  8. void deinit_otp(void)
  9. {
  10. HWRITE(RFEN_CHGPUMP,HREAD(RFEN_CHGPUMP) & ~(0x40));
  11. }
  12. /*
  13. * @brief: OTP init
  14. * @param: none
  15. * @return: none
  16. */
  17. void init_otp(void)
  18. {
  19. // HWRITE(RFEN_CHGPUMP,0x70);
  20. HWRITE(RFEN_CHGPUMP,HREAD(RFEN_CHGPUMP)|0x40);
  21. SYS_delay_us(CHARGEPUMP_DELAY);
  22. }
  23. /*
  24. * @brief: OTP SET ADDR
  25. * @param: addr
  26. * @return: none
  27. */
  28. void otp_set_addr(uint32_t addr)
  29. {
  30. addr=addr<<3;
  31. HWRITEW(CORE_OTP_ADDR,addr);
  32. HWRITE(CORE_OTP_DIN,0);
  33. }
  34. /*
  35. * @brief: OTP CE
  36. * @param: none
  37. * @return: none
  38. */
  39. void otp_ce(void)
  40. {
  41. HWRITE(CORE_OTP_CTRL,0x82);
  42. SYS_delay_us(1);
  43. HWRITE(CORE_OTP_CTRL,0x80);
  44. HWRITE(CORE_OTP_CTRL,0x82);
  45. SYS_delay_us(13);
  46. }
  47. /*
  48. * @brief: OTP read init
  49. * @param: *data
  50. * @param: len
  51. * @return: none
  52. */
  53. void read_otp_init(uint8_t *data,uint32_t len)
  54. {
  55. int rega;
  56. otp_ce();
  57. HWRITE(CORE_OTP_CTRL,0xa2);
  58. HWRITEW(CORE_OTP_RXADDR,data);
  59. HWRITEW(CORE_OTP_RXLEN,len);
  60. HWRITE(CORE_OTP_DIN,0x11);
  61. HWRITE(CORE_DMA_START,OTP_START);
  62. }
  63. /*
  64. * @brief: OTP read
  65. * @param: addr
  66. * @param: *data
  67. * @param: len
  68. * @return: none
  69. */
  70. void read_otp(uint32_t addr,uint8_t *data,uint32_t len)
  71. {
  72. otp_set_addr(addr);
  73. read_otp_init((uint8_t *)mem_otp_data_buf, len);
  74. while(!(HREAD(CORE_DMA_STATUS)&2));
  75. HWRITE(CORE_OTP_CTRL,0x83);
  76. for(int i=0;i<len;i++)
  77. {
  78. data[i]=HREAD(mem_otp_data_buf+i);
  79. }
  80. }
  81. /*
  82. * @brief: OTP read data
  83. * @param: addr
  84. * @param: *data
  85. * @param: len
  86. * @return: none
  87. */
  88. void read_otp_data(uint32_t addr,uint8_t *data,uint32_t len)
  89. {
  90. OS_ENTER_CRITICAL();
  91. uint32_t i=0;
  92. uint32_t packnum=0;
  93. uint32_t ilen=0;
  94. packnum = len/packagelen;
  95. if(len%packagelen)
  96. {
  97. packnum++;
  98. }
  99. init_otp();
  100. for(i=0;i<packnum;i++)
  101. {
  102. ilen = len > packagelen ? packagelen :len;
  103. read_otp(addr,data,len);
  104. addr += ilen;
  105. data += ilen;
  106. len -= ilen;
  107. }
  108. deinit_otp();
  109. OS_EXIT_CRITICAL();
  110. }