Advertisement
uaa

test suite for axppmic(4)

uaa
Aug 5th, 2023
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. #define EINVAL -1
  5.  
  6. struct axppmic_regulator {
  7. // struct axppmic_softc *ar_sc;
  8.  
  9. uint8_t ar_ereg, ar_emask;
  10. uint8_t ar_eval, ar_dval;
  11.  
  12. uint8_t ar_vreg, ar_vmask;
  13. uint32_t ar_base, ar_delta, ar_step;
  14.  
  15. uint32_t ar_base2, ar_delta2, ar_step2;
  16.  
  17. // struct regulator_device ar_rd;
  18. };
  19.  
  20. struct axppmic_regulator axp209_ldo5 = {
  21. .ar_vmask = 0xf0,
  22. .ar_base = 1800000,
  23. .ar_delta = (100000 >> 4),
  24. .ar_step = (16 << 4),
  25. };
  26.  
  27. struct axppmic_regulator axp809_aldo1 = {
  28. .ar_vmask = 0x1f,
  29. .ar_base = 700000,
  30. .ar_delta = 100000,
  31. .ar_step = 27,
  32. };
  33.  
  34. struct axppmic_regulator axp809_dcdc4 = {
  35. .ar_vmask = 0x3f,
  36. .ar_base = 600000,
  37. .ar_delta = 20000,
  38. .ar_step = 48,
  39. .ar_base2 = 1800000,
  40. .ar_delta2 = 100000,
  41. .ar_step2 = 9,
  42. };
  43.  
  44. struct axppmic_regulator axp809_dldo1 = {
  45. .ar_vmask = 0x1f,
  46. .ar_base = 700000,
  47. .ar_delta = 100000,
  48. .ar_step = 27,
  49. .ar_base2 = 3400000,
  50. .ar_delta2 = 200000,
  51. .ar_step2 = 5,
  52. };
  53.  
  54. uint32_t
  55. axppmic_get_voltage_new(void *cookie, uint8_t value)
  56. {
  57. struct axppmic_regulator *ar = cookie;
  58. uint32_t voltage;
  59. // uint8_t value;
  60.  
  61. // value = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
  62. value &= ar->ar_vmask;
  63. if (ar->ar_base2 > 0 && value >= ar->ar_step)
  64. voltage = ar->ar_base2 + (value - ar->ar_step) * ar->ar_delta2;
  65. else
  66. voltage = ar->ar_base + value * ar->ar_delta;
  67. return voltage;
  68. }
  69.  
  70. int
  71. axppmic_set_voltage_new(void *cookie, uint32_t voltage)
  72. {
  73. struct axppmic_regulator *ar = cookie;
  74. uint32_t value, reg;
  75.  
  76. if (voltage < ar->ar_base)
  77. return EINVAL;
  78. if (ar->ar_base2 > 0 && voltage >= ar->ar_base2) {
  79. value = (voltage - ar->ar_base2) / ar->ar_delta2;
  80. if (value >= ar->ar_step2)
  81. return EINVAL;
  82. value += ar->ar_step;
  83. } else {
  84. value = (voltage - ar->ar_base) / ar->ar_delta;
  85. if (value >= ar->ar_step)
  86. return EINVAL;
  87. }
  88. if (value > ar->ar_vmask)
  89. return EINVAL;
  90.  
  91. // reg = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
  92. // axppmic_write_reg(ar->ar_sc, ar->ar_vreg,
  93. // (reg & ~ar->ar_vmask) | (value & ar->ar_vmask));
  94. // return 0;
  95.  
  96. return value;
  97. }
  98.  
  99. uint32_t
  100. axppmic_get_voltage(void *cookie, uint8_t value)
  101. {
  102. struct axppmic_regulator *ar = cookie;
  103. uint32_t voltage;
  104. // uint8_t value;
  105.  
  106. // value = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
  107. value &= ar->ar_vmask;
  108. voltage = ar->ar_base + value * ar->ar_delta;
  109. if (ar->ar_base2 > 0 && voltage > ar->ar_base2) {
  110. value -= (ar->ar_base2 - ar->ar_base) / ar->ar_delta;
  111. voltage = ar->ar_base2 + value * ar->ar_delta2;
  112. }
  113. return voltage;
  114. }
  115.  
  116. int
  117. axppmic_set_voltage(void *cookie, uint32_t voltage)
  118. {
  119. struct axppmic_regulator *ar = cookie;
  120. uint32_t value, reg;
  121.  
  122. if (voltage < ar->ar_base)
  123. return EINVAL;
  124. value = (voltage - ar->ar_base) / ar->ar_delta;
  125. if (ar->ar_base2 > 0 && voltage > ar->ar_base2) {
  126. value = (ar->ar_base2 - ar->ar_base) / ar->ar_delta;
  127. value += (voltage - ar->ar_base2) / ar->ar_delta2;
  128. }
  129. if (value > ar->ar_vmask)
  130. return EINVAL;
  131.  
  132. // reg = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
  133. // reg &= ~ar->ar_vmask;
  134. // axppmic_write_reg(ar->ar_sc, ar->ar_vreg, reg | value);
  135. // return 0;
  136.  
  137. return value;
  138. }
  139. void test(char *title, struct axppmic_regulator *r)
  140. {
  141. uint32_t i, old, new, start, end, delta;
  142.  
  143. printf("*get: %s\n", title);
  144. for (i = 0; i < r->ar_vmask + 1; i++) {
  145. old = axppmic_get_voltage(r, i);
  146. new = axppmic_get_voltage_new(r, i);
  147. if (old != new)
  148. printf("%d: old(%d) new(%d)\n", i, old, new);
  149. }
  150.  
  151. start = r->ar_base - r->ar_delta;
  152. end = r->ar_base + r->ar_delta * r->ar_step;
  153. delta = r->ar_delta;
  154. printf("*set: %s (%d-%d)\n", title, start, end);
  155. for (i = start; i <= end; i += delta / 2) {
  156. old = axppmic_set_voltage(r, i);
  157. new = axppmic_set_voltage_new(r, i);
  158. if (old != new)
  159. printf("%d: old(%d) new(%d)\n", i, old, new);
  160. }
  161.  
  162. if (!r->ar_base2)
  163. return;
  164.  
  165. start = r->ar_base2 - r->ar_delta2;
  166. end = r->ar_base2 + r->ar_delta2 * r->ar_step2;
  167. delta = r->ar_delta2;
  168. printf("*set: %s (%d-%d)\n", title, start, end);
  169. for (i = start; i <= end; i += delta / 2) {
  170. old = axppmic_set_voltage(r, i);
  171. new = axppmic_set_voltage_new(r, i);
  172. if (old != new)
  173. printf("%d: old(%d) new(%d)\n", i, old, new);
  174. }
  175. }
  176.  
  177. int main(int argc, char *argv[])
  178. {
  179. test("axp209_ldo5", &axp209_ldo5);
  180. test("axp809_aldo1", &axp809_aldo1);
  181. test("axp809_dcdc4", &axp809_dcdc4);
  182. test("axp809_dldo1", &axp809_dldo1);
  183.  
  184. return 0;
  185. }
  186.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement