Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdint.h>
- #define EINVAL -1
- struct axppmic_regulator {
- // struct axppmic_softc *ar_sc;
- uint8_t ar_ereg, ar_emask;
- uint8_t ar_eval, ar_dval;
- uint8_t ar_vreg, ar_vmask;
- uint32_t ar_base, ar_delta, ar_step;
- uint32_t ar_base2, ar_delta2, ar_step2;
- // struct regulator_device ar_rd;
- };
- struct axppmic_regulator axp209_ldo5 = {
- .ar_vmask = 0xf0,
- .ar_base = 1800000,
- .ar_delta = (100000 >> 4),
- .ar_step = (16 << 4),
- };
- struct axppmic_regulator axp809_aldo1 = {
- .ar_vmask = 0x1f,
- .ar_base = 700000,
- .ar_delta = 100000,
- .ar_step = 27,
- };
- struct axppmic_regulator axp809_dcdc4 = {
- .ar_vmask = 0x3f,
- .ar_base = 600000,
- .ar_delta = 20000,
- .ar_step = 48,
- .ar_base2 = 1800000,
- .ar_delta2 = 100000,
- .ar_step2 = 9,
- };
- struct axppmic_regulator axp809_dldo1 = {
- .ar_vmask = 0x1f,
- .ar_base = 700000,
- .ar_delta = 100000,
- .ar_step = 27,
- .ar_base2 = 3400000,
- .ar_delta2 = 200000,
- .ar_step2 = 5,
- };
- uint32_t
- axppmic_get_voltage_new(void *cookie, uint8_t value)
- {
- struct axppmic_regulator *ar = cookie;
- uint32_t voltage;
- // uint8_t value;
- // value = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
- value &= ar->ar_vmask;
- if (ar->ar_base2 > 0 && value >= ar->ar_step)
- voltage = ar->ar_base2 + (value - ar->ar_step) * ar->ar_delta2;
- else
- voltage = ar->ar_base + value * ar->ar_delta;
- return voltage;
- }
- int
- axppmic_set_voltage_new(void *cookie, uint32_t voltage)
- {
- struct axppmic_regulator *ar = cookie;
- uint32_t value, reg;
- if (voltage < ar->ar_base)
- return EINVAL;
- if (ar->ar_base2 > 0 && voltage >= ar->ar_base2) {
- value = (voltage - ar->ar_base2) / ar->ar_delta2;
- if (value >= ar->ar_step2)
- return EINVAL;
- value += ar->ar_step;
- } else {
- value = (voltage - ar->ar_base) / ar->ar_delta;
- if (value >= ar->ar_step)
- return EINVAL;
- }
- if (value > ar->ar_vmask)
- return EINVAL;
- // reg = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
- // axppmic_write_reg(ar->ar_sc, ar->ar_vreg,
- // (reg & ~ar->ar_vmask) | (value & ar->ar_vmask));
- // return 0;
- return value;
- }
- uint32_t
- axppmic_get_voltage(void *cookie, uint8_t value)
- {
- struct axppmic_regulator *ar = cookie;
- uint32_t voltage;
- // uint8_t value;
- // value = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
- value &= ar->ar_vmask;
- voltage = ar->ar_base + value * ar->ar_delta;
- if (ar->ar_base2 > 0 && voltage > ar->ar_base2) {
- value -= (ar->ar_base2 - ar->ar_base) / ar->ar_delta;
- voltage = ar->ar_base2 + value * ar->ar_delta2;
- }
- return voltage;
- }
- int
- axppmic_set_voltage(void *cookie, uint32_t voltage)
- {
- struct axppmic_regulator *ar = cookie;
- uint32_t value, reg;
- if (voltage < ar->ar_base)
- return EINVAL;
- value = (voltage - ar->ar_base) / ar->ar_delta;
- if (ar->ar_base2 > 0 && voltage > ar->ar_base2) {
- value = (ar->ar_base2 - ar->ar_base) / ar->ar_delta;
- value += (voltage - ar->ar_base2) / ar->ar_delta2;
- }
- if (value > ar->ar_vmask)
- return EINVAL;
- // reg = axppmic_read_reg(ar->ar_sc, ar->ar_vreg);
- // reg &= ~ar->ar_vmask;
- // axppmic_write_reg(ar->ar_sc, ar->ar_vreg, reg | value);
- // return 0;
- return value;
- }
- void test(char *title, struct axppmic_regulator *r)
- {
- uint32_t i, old, new, start, end, delta;
- printf("*get: %s\n", title);
- for (i = 0; i < r->ar_vmask + 1; i++) {
- old = axppmic_get_voltage(r, i);
- new = axppmic_get_voltage_new(r, i);
- if (old != new)
- printf("%d: old(%d) new(%d)\n", i, old, new);
- }
- start = r->ar_base - r->ar_delta;
- end = r->ar_base + r->ar_delta * r->ar_step;
- delta = r->ar_delta;
- printf("*set: %s (%d-%d)\n", title, start, end);
- for (i = start; i <= end; i += delta / 2) {
- old = axppmic_set_voltage(r, i);
- new = axppmic_set_voltage_new(r, i);
- if (old != new)
- printf("%d: old(%d) new(%d)\n", i, old, new);
- }
- if (!r->ar_base2)
- return;
- start = r->ar_base2 - r->ar_delta2;
- end = r->ar_base2 + r->ar_delta2 * r->ar_step2;
- delta = r->ar_delta2;
- printf("*set: %s (%d-%d)\n", title, start, end);
- for (i = start; i <= end; i += delta / 2) {
- old = axppmic_set_voltage(r, i);
- new = axppmic_set_voltage_new(r, i);
- if (old != new)
- printf("%d: old(%d) new(%d)\n", i, old, new);
- }
- }
- int main(int argc, char *argv[])
- {
- test("axp209_ldo5", &axp209_ldo5);
- test("axp809_aldo1", &axp809_aldo1);
- test("axp809_dcdc4", &axp809_dcdc4);
- test("axp809_dldo1", &axp809_dldo1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement