跳到主要内容

PMU 驱动

SyterKit 集成基于 I2C 的 PMU 驱动,支持 AXP 系列 PMU。

结构体

描述 axp pmu 的每一 step 对应电压关系的信息

/**
* Structure describing a voltage step of the power domain.
*/
typedef struct _axp_step_info {
uint32_t step_min_vol;// Minimum voltage level for the step.
uint32_t step_max_vol;// Maximum voltage level for the step.
uint32_t step_val; // Voltage increment value for the step.
uint32_t regation; // Regulator register address.
} axp_step_info_t;

PMU 的相关控制参数

/**
* Structure describing the control information of a power domain.
*/
typedef struct _axp_contrl_info {
char name[8]; // Name of the power domain.
uint32_t min_vol; // Minimum voltage level for the domain.
uint32_t max_vol; // Maximum voltage level for the domain.
uint32_t cfg_reg_addr; // Configuration register address.
uint32_t cfg_reg_mask; // Configuration register mask.
uint32_t ctrl_reg_addr; // Control register address.
uint32_t ctrl_bit_ofs; // Bit offset in the control register.
uint32_t reg_addr_offset; // Offset of the register address.
axp_step_info_t axp_step_tbl[4];// Voltage step table for the domain.
} axp_contrl_info;

API 接口

公共接口

axp_set_vol

int axp_set_vol(sunxi_i2c_t *i2c_dev, char *name, int set_vol, int onoff, axp_contrl_info *axp_ctrl_tbl, uint8_t axp_ctrl_tbl_size, uint8_t axp_addr);

设置由AXP控制的特定电源域的电压值。

  • i2c_dev:指向I2C设备结构的指针。
  • name:电源域的名称。
  • set_vol:要设置的电压值。
  • onoff:是否打开或关闭电源域(1表示打开,0表示关闭)。
  • axp_ctrl_tbl:指向AXP控制信息表的指针。
  • axp_ctrl_tbl_size:AXP控制信息表的大小。
  • axp_addr:AXP设备地址。
  • 返回值:表示操作成功状态的整数。

axp_get_vol

int axp_get_vol(sunxi_i2c_t *i2c_dev, char *name, axp_contrl_info *axp_ctrl_tbl, uint8_t axp_ctrl_tbl_size, uint8_t axp_addr);

获取由AXP控制的特定电源域的电压值。

  • i2c_dev:指向I2C设备结构的指针。
  • name:电源域的名称。
  • axp_ctrl_tbl:指向AXP控制信息表的指针。
  • axp_ctrl_tbl_size:AXP控制信息表的大小。
  • axp_addr:AXP设备地址。
  • 返回值:指定电源域的电压值。

AXP313/AXP323/AXP1530

pmu_axp1530_init

函数原型

int pmu_axp1530_init(sunxi_i2c_t *i2c_dev);

参数

  • i2c_dev:指向I2C设备结构的指针。

返回值

  • 如果成功则返回0,如果发生错误则返回-1。

pmu_axp1530_get_vol

函数原型

int pmu_axp1530_get_vol(sunxi_i2c_t *i2c_dev, char *name);

参数

  • i2c_dev:指向I2C设备结构的指针。
  • name:电源域的名称。

返回值

  • 指定电源域的电压值,如果发生错误则返回-1。

pmu_axp1530_set_vol

函数原型

int pmu_axp1530_set_vol(sunxi_i2c_t *i2c_dev, char *name, int set_vol, int onoff);

参数

  • i2c_dev:指向I2C设备结构的指针。
  • name:电源域的名称。
  • set_vol:要设置的电压值。
  • onoff:电源域的开/关状态(1 - 开启,0 - 关闭)。

返回值

  • 如果成功则返回0,如果发生错误则返回-1。

pmu_axp1530_set_dual_phase

函数原型

int pmu_axp1530_set_dual_phase(sunxi_i2c_t *i2c_dev);

参数

  • i2c_dev:指向I2C设备结构的指针。

返回值

  • 如果成功则返回0,如果发生错误则返回-1。

pmu_axp1530_dump

函数原型

void pmu_axp1530_dump(sunxi_i2c_t *i2c_dev);

参数

  • i2c_dev:指向I2C设备结构的指针。

AXP717/AXP717C/AXP717B

pmu_axp2202_init

函数原型

int pmu_axp2202_init(sunxi_i2c_t *i2c_dev);

参数

  • i2c_dev:指向I2C设备结构的指针。

返回值

  • 如果成功则返回0,如果发生错误则返回-1。

pmu_axp2202_get_vol

函数原型

int pmu_axp2202_get_vol(sunxi_i2c_t *i2c_dev, char *name);

参数

  • i2c_dev:指向I2C设备结构的指针。
  • name:电源域的名称。

返回值

  • 指定电源域的电压值,如果发生错误则返回-1。

pmu_axp2202_set_vol

函数原型

int pmu_axp2202_set_vol(sunxi_i2c_t *i2c_dev, char *name, int set_vol, int onoff);

参数

  • i2c_dev:指向I2C设备结构的指针。
  • name:电源域的名称。
  • set_vol:要设置的电压值。
  • onoff:电源域的开/关状态(1 - 开启,0 - 关闭)。

返回值

  • 如果成功则返回0,如果发生错误则返回-1。

pmu_axp2202_dump

函数原型

void pmu_axp2202_dump(sunxi_i2c_t *i2c_dev);

参数

  • i2c_dev:指向I2C设备结构的指针。

示例

初始化 I2C,初始化 PMU,设置 PMU 电压

sunxi_i2c_t i2c_pmu = {
.base = SUNXI_R_TWI0_BASE,
.id = SUNXI_R_I2C0,
.speed = 4000000,
.gpio_scl = {GPIO_PIN(GPIO_PORTL, 0), GPIO_PERIPH_MUX2},
.gpio_sda = {GPIO_PIN(GPIO_PORTL, 1), GPIO_PERIPH_MUX2},
};

int main(void) {
sunxi_i2c_init(&i2c_pmu);
pmu_axp2202_init(&i2c_pmu);
pmu_axp2202_set_vol(&i2c_pmu, "dcdc1", 1100, 1);
pmu_axp2202_dump(&i2c_pmu);
}

初始化 I2C,初始化两路 PMU,设置 PMU 电压

sunxi_i2c_t i2c_pmu = {
.base = SUNXI_R_TWI0_BASE,
.id = SUNXI_R_I2C0,
.speed = 4000000,
.gpio_scl = {GPIO_PIN(GPIO_PORTL, 0), GPIO_PERIPH_MUX2},
.gpio_sda = {GPIO_PIN(GPIO_PORTL, 1), GPIO_PERIPH_MUX2},
};

int main(void) {
sunxi_i2c_init(&i2c_pmu);
pmu_axp2202_init(&i2c_pmu);
pmu_axp1530_init(&i2c_pmu);

pmu_axp1530_set_dual_phase(&i2c_pmu);
pmu_axp1530_set_vol(&i2c_pmu, "dcdc1", 1100, 1);
pmu_axp1530_set_vol(&i2c_pmu, "dcdc2", 1100, 1);

pmu_axp2202_set_vol(&i2c_pmu, "dcdc1", 1100, 1);
pmu_axp2202_set_vol(&i2c_pmu, "bldo3", 1800, 1);
pmu_axp2202_set_vol(&i2c_pmu, "bldo1", 1800, 1);

pmu_axp2202_dump(&i2c_pmu);
pmu_axp1530_dump(&i2c_pmu);
}