da9062.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2021-9-3 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include <rtconfig.h>
  13. #if defined(NU_PKG_USING_DA9062)
  14. #include <rtthread.h>
  15. #include <rtdevice.h>
  16. #include "da9062_reg.h"
  17. #define DBG_ENABLE
  18. #define DBG_LEVEL DBG_LOG
  19. #define DBG_SECTION_NAME "da9062"
  20. #define DBG_COLOR
  21. #include <rtdbg.h>
  22. struct regmap_range
  23. {
  24. uint32_t range_min;
  25. uint32_t range_max;
  26. };
  27. #define regmap_reg_range(low, high) { .range_min = low, .range_max = high, }
  28. #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
  29. #define BYTE_TO_BINARY_PATTERN "\t%c\t%c\t%c\t%c\t%c\t%c\t%c\t%c"
  30. #define BYTE_TO_BINARY(byte) \
  31. (byte & 0x80 ? '1' : '0'), \
  32. (byte & 0x40 ? '1' : '0'), \
  33. (byte & 0x20 ? '1' : '0'), \
  34. (byte & 0x10 ? '1' : '0'), \
  35. (byte & 0x08 ? '1' : '0'), \
  36. (byte & 0x04 ? '1' : '0'), \
  37. (byte & 0x02 ? '1' : '0'), \
  38. (byte & 0x01 ? '1' : '0')
  39. #define DEF_DA9062_PAGE0_SLAVEADDR (0xB0>>1)
  40. static struct rt_i2c_bus_device *g_psNuEpwmCap = RT_NULL;
  41. static const struct regmap_range da9062_aa_readable_ranges[] =
  42. {
  43. regmap_reg_range(DA9062AA_PAGE_CON, DA9062AA_STATUS_B),
  44. regmap_reg_range(DA9062AA_STATUS_D, DA9062AA_EVENT_C),
  45. regmap_reg_range(DA9062AA_IRQ_MASK_A, DA9062AA_IRQ_MASK_C),
  46. regmap_reg_range(DA9062AA_CONTROL_A, DA9062AA_GPIO_4),
  47. regmap_reg_range(DA9062AA_GPIO_WKUP_MODE, DA9062AA_BUCK4_CONT),
  48. regmap_reg_range(DA9062AA_BUCK3_CONT, DA9062AA_BUCK3_CONT),
  49. regmap_reg_range(DA9062AA_LDO1_CONT, DA9062AA_LDO4_CONT),
  50. regmap_reg_range(DA9062AA_DVC_1, DA9062AA_DVC_1),
  51. regmap_reg_range(DA9062AA_COUNT_S, DA9062AA_SECOND_D),
  52. regmap_reg_range(DA9062AA_SEQ, DA9062AA_ID_4_3),
  53. regmap_reg_range(DA9062AA_ID_12_11, DA9062AA_ID_16_15),
  54. regmap_reg_range(DA9062AA_ID_22_21, DA9062AA_ID_32_31),
  55. regmap_reg_range(DA9062AA_SEQ_A, DA9062AA_BUCK3_CFG),
  56. regmap_reg_range(DA9062AA_VBUCK2_A, DA9062AA_VBUCK4_A),
  57. regmap_reg_range(DA9062AA_VBUCK3_A, DA9062AA_VBUCK3_A),
  58. regmap_reg_range(DA9062AA_VLDO1_A, DA9062AA_VLDO4_A),
  59. regmap_reg_range(DA9062AA_VBUCK2_B, DA9062AA_VBUCK4_B),
  60. regmap_reg_range(DA9062AA_VBUCK3_B, DA9062AA_VBUCK3_B),
  61. regmap_reg_range(DA9062AA_VLDO1_B, DA9062AA_VLDO4_B),
  62. regmap_reg_range(DA9062AA_BBAT_CONT, DA9062AA_BBAT_CONT),
  63. #if 0
  64. regmap_reg_range(DA9062AA_INTERFACE, DA9062AA_CONFIG_E),
  65. regmap_reg_range(DA9062AA_CONFIG_G, DA9062AA_CONFIG_K),
  66. regmap_reg_range(DA9062AA_CONFIG_M, DA9062AA_CONFIG_M),
  67. regmap_reg_range(DA9062AA_TRIM_CLDR, DA9062AA_GP_ID_19),
  68. regmap_reg_range(DA9062AA_DEVICE_ID, DA9062AA_CONFIG_ID),
  69. #endif
  70. };
  71. static const struct regmap_range da9062_aa_writeable_ranges[] =
  72. {
  73. regmap_reg_range(DA9062AA_PAGE_CON, DA9062AA_PAGE_CON),
  74. regmap_reg_range(DA9062AA_FAULT_LOG, DA9062AA_EVENT_C),
  75. regmap_reg_range(DA9062AA_IRQ_MASK_A, DA9062AA_IRQ_MASK_C),
  76. regmap_reg_range(DA9062AA_CONTROL_A, DA9062AA_GPIO_4),
  77. regmap_reg_range(DA9062AA_GPIO_WKUP_MODE, DA9062AA_BUCK4_CONT),
  78. regmap_reg_range(DA9062AA_BUCK3_CONT, DA9062AA_BUCK3_CONT),
  79. regmap_reg_range(DA9062AA_LDO1_CONT, DA9062AA_LDO4_CONT),
  80. regmap_reg_range(DA9062AA_DVC_1, DA9062AA_DVC_1),
  81. regmap_reg_range(DA9062AA_COUNT_S, DA9062AA_ALARM_Y),
  82. regmap_reg_range(DA9062AA_SEQ, DA9062AA_ID_4_3),
  83. regmap_reg_range(DA9062AA_ID_12_11, DA9062AA_ID_16_15),
  84. regmap_reg_range(DA9062AA_ID_22_21, DA9062AA_ID_32_31),
  85. regmap_reg_range(DA9062AA_SEQ_A, DA9062AA_BUCK3_CFG),
  86. regmap_reg_range(DA9062AA_VBUCK2_A, DA9062AA_VBUCK4_A),
  87. regmap_reg_range(DA9062AA_VBUCK3_A, DA9062AA_VBUCK3_A),
  88. regmap_reg_range(DA9062AA_VLDO1_A, DA9062AA_VLDO4_A),
  89. regmap_reg_range(DA9062AA_VBUCK2_B, DA9062AA_VBUCK4_B),
  90. regmap_reg_range(DA9062AA_VBUCK3_B, DA9062AA_VBUCK3_B),
  91. regmap_reg_range(DA9062AA_VLDO1_B, DA9062AA_VLDO4_B),
  92. regmap_reg_range(DA9062AA_BBAT_CONT, DA9062AA_BBAT_CONT),
  93. regmap_reg_range(DA9062AA_GP_ID_0, DA9062AA_GP_ID_19),
  94. };
  95. static const struct regmap_range da9062_aa_volatile_ranges[] =
  96. {
  97. regmap_reg_range(DA9062AA_PAGE_CON, DA9062AA_STATUS_B),
  98. regmap_reg_range(DA9062AA_STATUS_D, DA9062AA_EVENT_C),
  99. regmap_reg_range(DA9062AA_CONTROL_A, DA9062AA_CONTROL_B),
  100. regmap_reg_range(DA9062AA_CONTROL_E, DA9062AA_CONTROL_F),
  101. regmap_reg_range(DA9062AA_BUCK2_CONT, DA9062AA_BUCK4_CONT),
  102. regmap_reg_range(DA9062AA_BUCK3_CONT, DA9062AA_BUCK3_CONT),
  103. regmap_reg_range(DA9062AA_LDO1_CONT, DA9062AA_LDO4_CONT),
  104. regmap_reg_range(DA9062AA_DVC_1, DA9062AA_DVC_1),
  105. regmap_reg_range(DA9062AA_COUNT_S, DA9062AA_SECOND_D),
  106. regmap_reg_range(DA9062AA_SEQ, DA9062AA_SEQ),
  107. regmap_reg_range(DA9062AA_EN_32K, DA9062AA_EN_32K),
  108. };
  109. static int da9062_i2c_write(uint8_t u8addr, uint8_t u8data)
  110. {
  111. struct rt_i2c_msg msg;
  112. char au8TxData[2];
  113. RT_ASSERT(g_psNuEpwmCap != NULL);
  114. au8TxData[0] = u8addr; //addr [ 7:0]
  115. au8TxData[1] = u8data; //data [ 7:0]
  116. msg.addr = DEF_DA9062_PAGE0_SLAVEADDR; /* Slave address */
  117. msg.flags = RT_I2C_WR; /* Write flag */
  118. msg.buf = (rt_uint8_t *)&au8TxData[0]; /* Slave register address */
  119. msg.len = sizeof(au8TxData); /* Number of bytes sent */
  120. if (g_psNuEpwmCap && rt_i2c_transfer(g_psNuEpwmCap, &msg, 1) != 1)
  121. {
  122. rt_kprintf("[Failed] addr=%x, data=%d\n", u8addr, u8data);
  123. return -RT_ERROR;
  124. }
  125. return RT_EOK;
  126. }
  127. static int da9062_i2c_read(uint8_t u8addr, uint8_t *pu8data)
  128. {
  129. struct rt_i2c_msg msgs[2];
  130. char u8TxData;
  131. RT_ASSERT(g_psNuEpwmCap != NULL);
  132. RT_ASSERT(pu8data != NULL);
  133. u8TxData = u8addr; //addr [ 7:0]
  134. msgs[0].addr = DEF_DA9062_PAGE0_SLAVEADDR; /* Slave address */
  135. msgs[0].flags = RT_I2C_WR; /* Write flag */
  136. msgs[0].buf = (rt_uint8_t *)&u8TxData; /* Number of bytes sent */
  137. msgs[0].len = sizeof(u8TxData); /* Number of bytes read */
  138. msgs[1].addr = DEF_DA9062_PAGE0_SLAVEADDR; /* Slave address */
  139. msgs[1].flags = RT_I2C_RD; /* Read flag */
  140. msgs[1].buf = (rt_uint8_t *)pu8data ; /* Read data pointer */
  141. msgs[1].len = 1; /* Number of bytes read */
  142. if (rt_i2c_transfer(g_psNuEpwmCap, &msgs[0], 2) != 2)
  143. {
  144. return -RT_ERROR;
  145. }
  146. return RT_EOK;
  147. }
  148. int da9062_regs_dump(void)
  149. {
  150. int i;
  151. rt_kprintf("============================================================================\n");
  152. rt_kprintf("|Value@Addr |\t7\t6\t5\t4\t3\t2\t1\t0 |\n");
  153. rt_kprintf("============================================================================\n");
  154. for (i = 0; i < ARRAY_SIZE(da9062_aa_readable_ranges); i++)
  155. {
  156. int start = da9062_aa_readable_ranges[i].range_min;
  157. int end = da9062_aa_readable_ranges[i].range_max;
  158. while (start <= end)
  159. {
  160. uint8_t u8Value = 0;
  161. if (da9062_i2c_read((uint8_t)start, &u8Value) != RT_EOK)
  162. {
  163. rt_kprintf("Can't readback value@0x%2x!\n", start);
  164. return -RT_ERROR;
  165. }
  166. else
  167. {
  168. rt_kprintf("| 0x%02X@0x%02X | "BYTE_TO_BINARY_PATTERN " |\n", u8Value, start, BYTE_TO_BINARY(u8Value));
  169. }
  170. start++;
  171. }
  172. }
  173. rt_kprintf("============================================================================\n");
  174. return RT_EOK;
  175. }
  176. int rt_hw_da9062_init(const char *i2c_dev)
  177. {
  178. RT_ASSERT(i2c_dev != RT_NULL);
  179. /* Find I2C bus */
  180. g_psNuEpwmCap = (struct rt_i2c_bus_device *)rt_device_find(i2c_dev);
  181. if (g_psNuEpwmCap == RT_NULL)
  182. {
  183. LOG_E("Can't found I2C bus - %s..!\n", i2c_dev);
  184. goto exit_rt_hw_da9062_init;
  185. }
  186. return RT_EOK;
  187. exit_rt_hw_da9062_init:
  188. return -RT_ERROR;
  189. }
  190. static int da9062_dump(int argc, char **argv)
  191. {
  192. rt_hw_da9062_init("i2c0");
  193. da9062_regs_dump();
  194. }
  195. #ifdef FINSH_USING_MSH
  196. MSH_CMD_EXPORT(da9062_dump, dump da9062 registers);
  197. #endif
  198. #endif //#if defined(NU_PKG_USING_DA9062)