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);
}