/***************************************************************************** 函 数 名 : bsp_hi6551_dr_get_mode 功能描述 : PMIC HI6551电源模式查询 (支持闪烁和呼吸) (DR1/2支持普通闪烁,呼吸长亮,呼吸闪烁( 高精度闪烁 ) DR3/4/5只支持闪烁和呼吸) 输入参数 : dr_id:要查询的电流源编号 输出参数 : 无 返 回 值 : 无 调用函数 : 备注说明 : Acore提供该函数实现 *****************************************************************************/ dr_mode_e bsp_hi6551_dr_get_mode(int dr_id) { PMIC_HI6551_DRS_ATTR *hi6551_dr; int iret = BSP_PMU_OK; u8 regval = 0; /*参数有效性检查*/ iret = hi6551_dr_para_check(dr_id); if(BSP_PMU_OK != iret) return PMU_DRS_MODE_BUTTOM; hi6551_dr = &hi6551_dr_attr[dr_id]; /*先判断是闪烁模式还是呼吸模式*/ bsp_dr_reg_read(hi6551_dr->mode_sel_reg_addr, ®val); if(regval & ((u8) (0x1 << hi6551_dr->mode_sel_bit_offset))) { /*判断是闪烁长亮还是闪烁闪亮*/ bsp_dr_reg_read(hi6551_dr->fla_mode_reg_addr, ®val); if(regval & ((u8) (0x1 << hi6551_dr->fla_mode_bit_offset))) { pmic_print_info("dr_id[%d] is in fla-flash mode\n", dr_id); return PMU_DRS_MODE_FLA_FLASH;/*闪烁闪动低精度模式*/ } else { pmic_print_info("dr_id[%d] is in fla-light mode\n", dr_id); return PMU_DRS_MODE_FLA_LIGHT;/*闪烁长亮持续输出模式*/ } } else { /*if(PMIC_HI6551_DR03 <= dr_id),DR3,4,5不区分呼吸长亮和呼吸闪烁*/ if(DR_INVAILD_ADDR == hi6551_dr->bre_mode_reg_addr) { pmic_print_info("dr_id[%d] is in normal bre mode\n", dr_id); return PMU_DRS_MODE_BRE;/*呼吸模式*/ } else { /*判断是呼吸长亮还是呼吸闪烁*/ bsp_dr_reg_read(hi6551_dr->bre_mode_reg_addr, ®val); if(regval & ((u8) (0x1 << hi6551_dr->bre_mode_bit_offset))) { pmic_print_info("dr_id[%d] is in breath-flash mode\n", dr_id); return PMU_DRS_MODE_BRE_FLASH;/*呼吸闪烁高精度模式*/ } else { pmic_print_info("dr_id[%d] is in breath-light mode\n", dr_id); return PMU_DRS_MODE_BRE_LIGHT;/*呼吸长亮模式*/ } } } }
void pmic_init(void) { u8 pmic_id; GPIO_SetFunctionEach(eGPIO_F1, eGPIO_4, 1); GPIO_SetDataEach(eGPIO_F1, eGPIO_4, 1); GPIO_SetFunctionEach(eGPIO_F1, eGPIO_5, 1); GPIO_SetDataEach(eGPIO_F1, eGPIO_5, 1); GPIO_SetFunctionEach(eGPIO_X0, eGPIO_7, 0); GPIO_SetPullUpDownEach(eGPIO_X0, eGPIO_7, 0); GPIO_SetFunctionEach(eGPIO_X1, eGPIO_5, 0); GPIO_SetPullUpDownEach(eGPIO_X1, eGPIO_5, 0); udelay(10000); /* make sure all GPIOs got applied */ I2C_InitIp(7, 400*1000, 1000000); udelay(10000); /* make sure I2C controller starts up */ /* read ID */ IIC7_ERead(S5M8767_ADDR, 0, &pmic_id); if(pmic_id >= 0x0 && pmic_id <= 0x5) { pmic_s5m8767_init(); } else { pmic_max77686_init(); } pmic_print_info(); charger_max77693_init(); }
/***************************************************************************** 函 数 名 : bsp_hi6559_test_init 功能描述 : hi6559 test模块的初始化 输入参数 : void 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 异常定位 *****************************************************************************/ s32 bsp_hi6559_test_init(void) { s32 iret = BSP_PMU_OK; struct pmu_test_ops hi6559_test_ops = { .pmu_volt_onoff_test = bsp_hi6559_volt_onoff_test, .pmu_volt_setget_test = bsp_hi6559_volt_setget_test, .pmu_volt_mode_test = bsp_hi6559_volt_mode_test, .pmu_volt_table_test = bsp_hi6559_volttable_test, #ifdef __KERNEL__ .pmu_dr_onoff_test = bsp_hi6559_dr_onoff_test, .pmu_dr_setget_test = bsp_hi6559_dr_setget_test, .pmu_dr_mode_test = bsp_hi6559_dr_mode_test, #endif }; iret = bsp_pmu_test_register(PMIC_HI6559,hi6559_test_ops); if(BSP_PMU_OK != iret) pmic_print_error("bsp_pmu_test_register error!\n"); else pmic_print_info("bsp_hi6559_test_init ok!\n"); return iret; }
/***************************************************************************** 函 数 名 : dummy_dr_fla_time_set 功能描述 : DR闪烁时间配置,默认打桩函数 输入参数 : void 输出参数 : reset.log 返 回 值 : pmu问题或ok 调用函数 : 被调函数 : LED模块 *****************************************************************************/ int dummy_dr_fla_time_set(DR_FLA_TIME* dr_fla_time_st) { pmic_print_info("fla_on_us is %d,fla_off_us is %d!\n",\ dr_fla_time_st->fla_on_us,dr_fla_time_st->fla_off_us); pmic_print_error("no pmic macro defined,use dummy!"); return BSP_PMU_NO_PMIC; }
/***************************************************************************** 函 数 名 : dummy_dr_bre_time_set 功能描述 : DR呼吸时间配置,默认打桩函数 输入参数 : void 输出参数 : 无 返 回 值 : pmu问题或ok 调用函数 : 被调函数 : LED模块 *****************************************************************************/ int dummy_dr_bre_time_set(dr_id_e dr_id, DR_BRE_TIME* dr_bre_time_st) { pmic_print_info("on_ms is %d,off_ms is %d,rise_ms is %d,fall_ms is %d!\n",\ dr_bre_time_st->bre_on_ms,dr_bre_time_st->bre_off_ms,dr_bre_time_st->bre_rise_ms,dr_bre_time_st->bre_fall_ms); pmic_print_error("no pmic macro defined,use dummy!"); return BSP_PMU_NO_PMIC; }
/***************************************************************************** 函 数 名 : hi6551_dr_bre_time_selector_get 功能描述 : 获取dr 呼吸时间总共档位值 输入参数 : dr_id:要设置的电流源编号;bre_time_enum:所要查询的时间类型; 输出参数 : 无 返 回 值 : 档位时间 调用函数 : 备注说明 : *****************************************************************************/ unsigned hi6551_dr_bre_time_selectors_get(dr_id_e dr_id, dr_bre_time_e bre_time_enum) { PMIC_HI6551_DRS_ATTR *hi6551_dr; int iret = BSP_PMU_OK; unsigned selectors = 0; /*参数有效性检查*/ iret = hi6551_dr_para_check((int)dr_id); if(BSP_PMU_OK != iret) return BSP_PMU_PARA_ERROR; hi6551_dr = &hi6551_dr_attr[dr_id]; switch(bre_time_enum) { case PMU_DRS_BRE_ON_MS: case PMU_DRS_BRE_OFF_MS: selectors = hi6551_dr->size_of_onoff_time_list; break; case PMU_DRS_BRE_RISE_MS: case PMU_DRS_BRE_FALL_MS: selectors = hi6551_dr->size_of_risefall_time_list; break; default: pmic_print_error("don't support this bre time!\n"); return BSP_PMU_PARA_ERROR; } pmic_print_info("dr_id[%d],enum %d 's selector %d time is %d!\n",dr_id,bre_time_enum,selectors); return selectors; }
int bsp_hi6551_dr_get_current(int dr_id) { u8 regval = 0; int iret = BSP_PMU_OK; PMIC_HI6551_DRS_ATTR *hi6551_dr; u32 cur = 0; /*参数有效性检查*/ iret = hi6551_dr_para_check(dr_id); if(BSP_PMU_OK != iret) return BSP_PMU_PARA_ERROR; hi6551_dr = &hi6551_dr_attr[dr_id]; bsp_hi6551_reg_read(hi6551_dr->current_reg_addr, ®val); /* 获取电压档位值 */ cur = (regval & hi6551_dr->current_bit_mask) >> hi6551_dr->current_bit_offset; cur = hi6551_dr->current_list[cur]; pmic_print_info("dr_id %d's current is %d uA!\n", dr_id,cur); return cur; }
int bsp_hi6551_dr_list_current(int dr_id, unsigned selector) { PMIC_HI6551_DRS_ATTR *hi6551_dr; int iret = BSP_PMU_OK; int cur = 0; /*参数有效性检查*/ iret = hi6551_dr_para_check(dr_id); if(BSP_PMU_OK != iret) return BSP_PMU_PARA_ERROR; hi6551_dr = &hi6551_dr_attr[dr_id]; /*检查档位有效性*/ if (selector > NUM_OF_DR_CURRENT) { pmic_print_error("selector is %d,not exist,-EINVAL,please input new\n", selector); return BSP_PMU_ERROR; } cur = hi6551_dr->current_list[selector]; pmic_print_info("volt %d selector %d is %d uA!!\n",dr_id,selector,cur); return cur; }
int bsp_dr_reg_show(u16 addr) { u8 Value = 0; bsp_dr_reg_read(addr, &Value); pmic_print_info("pmuRead addr 0x%x value is 0x%x!!\n",addr,Value); return Value; }
/***************************************************************************** 函 数 名 : bsp_hi6559_optreg_test 功能描述 : hi6559 优化reg配置测试 输入参数 : 无 输出参数 : 无 返 回 值 : 无 *****************************************************************************/ void bsp_hi6559_optreg_test(void) { #if 0 u32 test_num = 0; u32 m; u8 value; if(BSP_PMU_V230 == bsp_pmu_version_get()) { test_num = sizeof(g_BBStar_CFG)/sizeof(BBStar_CFG_S); for(m = 0; m < test_num; m++) { bsp_hi6559_reg_read(g_BBStar_CFG[m].regAddr,&value); pmic_print_info("the value of addr %x is %x\n", g_BBStar_CFG[m].regAddr,value); if(g_BBStar_CFG_V03[m].regValue != value) { pmic_print_error("the value of addr %x is different\n", g_BBStar_CFG[m].regAddr); pmic_print_error("read value is %x,should be %x\n", value,g_BBStar_CFG[m].regValue); } } } else if((BSP_PMU_V210 == bsp_pmu_version_get())||(BSP_PMU_V220 == bsp_pmu_version_get())) { test_num = sizeof(g_BBStar_CFG_V03)/sizeof(BBStar_CFG_S); for(m = 0; m < test_num; m++) { bsp_hi6559_reg_read(g_BBStar_CFG_V03[m].regAddr,&value); pmic_print_info("the value of addr %x is %x\n", g_BBStar_CFG_V03[m].regAddr,value); if(g_BBStar_CFG_V03[m].regValue != value) { pmic_print_error("the value of addr %x is different\n", g_BBStar_CFG_V03[m].regAddr); pmic_print_error("read value is %x,should be %x\n", value,g_BBStar_CFG_V03[m].regValue); } } } #else pmic_print_error("strub now\n"); #endif pmic_print_error("test ok!\n"); return; }
/***************************************************************************** 函 数 名 : hi6559_irq_handler 功能描述 : 中断处理函数 输入参数 : 无 输出参数 : 无 返 回 值 : 无 *****************************************************************************/ void hi6559_irq_handler(u32 irq) { /* 关闭中断,中断处理任务完成后打开 */ hi6559_irq_disable(); pmic_print_info("**********hi6559_irq_handler**********\n"); queue_work(hi6559_irq_data_st->hi6559_irq_wq, &hi6559_irq_data_st->hi6559_irq_wk); return; }
int hi6551_lcd_bl_current_set(int cur) { unsigned selector = 0; int iret = BSP_PMU_OK; iret = bsp_hi6551_dr_set_current(PMIC_HI6551_DR01,cur,cur,&selector); pmic_print_info("hi6551_bl_cur_set ok!\n"); return iret; }
s32 hi6559_lcd_bl_current_set(s32 cur) { u32 selector = 0; s32 iret = BSP_PMU_OK; iret = bsp_hi6559_dr_set_current(PMIC_HI6559_DR01,cur,cur,&selector); pmic_print_info("hi6559_bl_cur_set ok!\n"); return iret; }
/***************************************************************************** 函 数 名 : bsp_pmu_volt_state 功能描述 : 显示当前PMIC的所有路电源的使用信息(包括开关,电压,) 输入参数 : void 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 :异常定位 *****************************************************************************/ void bsp_pmu_volt_state(void) { int i = 0; pmic_print_info("*****bsp_pmu_all_volt_state*****\n"); for(i = 0;i < PMIC_BUTTOM;i++) { if(NULL != g_pmu_dbg.dbg_ops[i].pmu_volt_state) g_pmu_dbg.dbg_ops[i].pmu_volt_state(); } }
/***************************************************************************** 函 数 名 : hi6559_irq_handler 功能描述 : 中断处理函数 输入参数 : 无 输出参数 : 无 返 回 值 : 无 *****************************************************************************/ irqreturn_t hi6559_irq_handler(s32 irq, void *data) { struct hi6559_irq_data *hi6559_irq_data = data; /* 关闭中断,中断处理任务完成后打开 */ hi6559_irq_disable(); pmic_print_info("**********hi6559_irq_handler**********\n"); queue_work(hi6559_irq_data->hi6559_irq_wq, &hi6559_irq_data->hi6559_irq_wk); return IRQ_HANDLED; }
/***************************************************************************** 函 数 名 : bsp_pmu_pmic_info 功能描述 : 显示当前所有PMIC的版本信息 输入参数 : void 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 异常定位 *****************************************************************************/ void bsp_pmu_pmic_info(void) { int i = 0; pmic_print_info("*****bsp_pmu_pmic_info*****\n"); for(i = 0;i < PMIC_BUTTOM;i++) { if(NULL != g_pmu_dbg.dbg_ops[i].pmu_pmic_info) g_pmu_dbg.dbg_ops[i].pmu_pmic_info(); } }
/***************************************************************************** 函 数 名 : bsp_pmu_boot_om_show 功能描述 : 显示此次运行过程中当前PMU状态的异常信息 输入参数 : void 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 异常定位 *****************************************************************************/ void bsp_pmu_om_boot_show(void) { int i = 0; pmic_print_info("*****bsp_pmu_boot_om_show*****\n"); for(i = 0;i < PMIC_BUTTOM;i++) { if(NULL != g_pmu_dbg.dbg_ops[i].pmu_om_boot_show) g_pmu_dbg.dbg_ops[i].pmu_om_boot_show(); } }
/***************************************************************************** 函 数 名 : bsp_pmu_dbg_register 功能描述 : pmu模块dbg信息注册 输入参数 : void 输出参数 : 无 返 回 值 : 注册成功或失败 调用函数 : 被调函数 : 异常定位 *****************************************************************************/ int bsp_pmu_dbg_register(pmic_id_e pmic_id,struct pmu_dbg_ops ops_func) { if(PMIC_BUTTOM <= pmic_id) { pmic_print_info("*****bsp_pmu_all_volt_state*****\n"); return BSP_PMU_PARA_ERROR; } g_pmu_dbg.dbg_ops[pmic_id]= ops_func; return BSP_PMU_OK; }
/***************************************************************************** 函 数 名 : hi6551_dr_fla_time_get 功能描述 : 获取dr的闪烁周期时间和点亮时间 输入参数 : dr_fla_time_st:闪烁时间参数结构体;单位:us 输出参数 : 无 返 回 值 : 设置成功或者失败 调用函数 : 备注说明 : 对应寄存器只有设置时间的功能,不需要互斥锁 闪烁周期:reg_value*31.25ms;点亮时间:reg_value*7.8125ms *****************************************************************************/ int hi6551_dr_fla_time_get(DR_FLA_TIME* dr_fla_time_st) { u8 feriod = 0;/*闪烁周期寄存器配置值*/ u8 on_time = 0;/*点亮时间设置值*/ unsigned feriod_time_us = 0; /*feriod时间获取*/ bsp_dr_reg_read(HI6551_FLASH_PERIOD_OFFSET,&feriod); feriod_time_us = feriod * FLA_PERIOD_STEP; pmic_print_info("dr fla feriod is %d us!!\n",feriod_time_us); /*闪烁点亮时间获取*/ bsp_dr_reg_read(HI6551_FLASH_ON_OFFSET,&on_time); dr_fla_time_st->fla_on_us = on_time * FLA_ON_STEP; pmic_print_info("dr fla on_time is %d us!!\n",dr_fla_time_st->fla_on_us); /*闪烁灯灭时间获取*/ dr_fla_time_st->fla_off_us = feriod_time_us - dr_fla_time_st->fla_on_us; pmic_print_info("dr fla off_time is %d us!!\n",dr_fla_time_st->fla_off_us); return BSP_DR_OK; }
s32 bsp_hi6559_dr_set_current_test(s32 dr_id, s32 min_uA, s32 max_uA) { u32 selector = 0; s32 iret = BSP_PMU_OK; iret = bsp_hi6559_dr_set_current(dr_id,min_uA,max_uA,&selector); if(iret) return iret; else { pmic_print_info("selector value is %d!\n",selector); return (int)selector; } }
int bsp_hi6551_dr_set_current_test(int dr_id, int min_uA, int max_uA) { unsigned selector = 0; int iret = BSP_PMU_OK; iret = bsp_hi6551_dr_set_current(dr_id,min_uA,max_uA,&selector); if(iret) return iret; else { pmic_print_info("selector value is %d!\n",selector); return (int)selector; } }
/***************************************************************************** 函 数 名 : hi6559_volt_set_get_voltage_test 功能描述 : 电源电压获取/设置功能测试 输入参数 : 无 输出参数 : 无 返 回 值 : 无 *****************************************************************************/ s32 hi6559_volt_set_get_voltage_test(void) { PMIC_HI6559_VLTGS_TABLE *hi6559_volt_table = (PMIC_HI6559_VLTGS_TABLE *)SHM_PMU_VOLTTABLE_ADDR; PMIC_HI6559_VLTGS_ATTR *hi6559_volt; u32 selector = 0; s32 voltage = 0; s32 test_sub, iret = 0; s32 test_num = (sizeof(volt_setget_test)/sizeof(int)); u8 j = 0; /* 电压属性表安全性检查 */ iret = hi6559_volt_test_table_check(hi6559_volt_table); if(BSP_PMU_OK != iret) { return BSP_PMU_VOLTTABLE_ERROR; } /* 依次对每路电压源的每档电压进行设置、获取,并获取list volt */ for(test_sub = 0;test_sub < test_num; test_sub++) { hi6559_volt = &hi6559_volt_table->hi6559_volt_attr[volt_setget_test[test_sub]]; for(j = 0; j <= hi6559_volt->voltage_nums;j++) { voltage = hi6559_volt->voltage_list[j]; iret = bsp_hi6559_volt_set_voltage(volt_setget_test[test_sub],voltage,voltage,&selector); if(BSP_PMU_OK != iret) { pmic_print_error("ERROR: volt%d set voltage failed, iret %d!!\n", volt_setget_test[test_sub], iret); } if(voltage != bsp_hi6559_volt_get_voltage(volt_setget_test[test_sub])) { pmic_print_error("ERROR: volt%d get voltage failed!!\n", volt_setget_test[test_sub]); } if(voltage != bsp_hi6559_volt_list_voltage(volt_setget_test[test_sub],selector)) { pmic_print_error("ERROR: volt%d get list voltage failed, selector %d!!\n", volt_setget_test[test_sub], selector); } } } pmic_print_info("hi6559_volt_set_get_voltage_test ok!!\n",volt_setget_test[test_sub]); return BSP_PMU_OK; }
/*----------------电流源其他设置相关接口,给lcd背光模块调用的接口-------------------*/ int hi6551_lcd_bl_power_switch(power_switch_e sw) { int iret = BSP_PMU_OK; switch(sw) { case POWER_OFF: iret = bsp_hi6551_dr_disable(PMIC_HI6551_DR01); break; case POWER_ON: iret = bsp_hi6551_dr_enable(PMIC_HI6551_DR01); break; default: break; } pmic_print_info("hi6551_bl_power ok!\n"); return iret; }
/***************************************************************************** 函 数 名 : hi6551_dr_start_delay_get 功能描述 : 获取dr的启动延时时间 输入参数 : dr_id:要设置的电流源编号;delay_ms:启动延时的时间,单位:ms 设置范围:[0 , 32768]ms 输出参数 : 无 返 回 值 : 设置成功或失败 调用函数 : 备注说明 : 对应寄存器只有设置时间的功能,不需要互斥锁,只有DR3/4/5有此功能 *****************************************************************************/ int hi6551_dr_start_delay_get(dr_id_e dr_id, unsigned *delay_ms) { PMIC_HI6551_DRS_ATTR *hi6551_dr; u8 regval = 0; /* 有效性检查*/ if (dr_id< PMU_DR03) { pmic_print_error("This DR %d can not support start delay time!\n",dr_id); return BSP_PMU_PARA_ERROR; } hi6551_dr = &hi6551_dr_attr[dr_id]; bsp_dr_reg_read(hi6551_dr->start_del_reg_addr,®val); *delay_ms = (unsigned)regval * DR345_START_DELAY_STEP; pmic_print_info("dr_id[%d] start delay time is %d!\n", dr_id, *delay_ms); return BSP_DR_OK; }
/***************************************************************************** 函 数 名 : hi6551_dr_bre_time_list 功能描述 : 陈列dr的呼吸时间(包括长亮,长暗、渐亮、渐暗时间)各档位的时间值 输入参数 : dr_id:要设置的电流源编号;bre_time_enum:所要查询的时间类型; selector,时间档位 输出参数 : 无 返 回 值 : 档位时间 调用函数 : 备注说明 : *****************************************************************************/ unsigned hi6551_dr_bre_time_list(dr_id_e dr_id, dr_bre_time_e bre_time_enum ,unsigned selector) { PMIC_HI6551_DRS_ATTR *hi6551_dr; int iret = BSP_PMU_OK; unsigned dr_bre_time = 0; /*参数有效性检查*/ iret = hi6551_dr_para_check((int)dr_id); if(BSP_PMU_OK != iret) return BSP_PMU_PARA_ERROR; hi6551_dr = &hi6551_dr_attr[dr_id]; switch(bre_time_enum) { case PMU_DRS_BRE_ON_MS: case PMU_DRS_BRE_OFF_MS: if(selector > hi6551_dr->size_of_onoff_time_list) { pmic_print_error("dr_id[%d] bre_onoff_time don't support selector %d!\n",dr_id,selector); pmic_print_error("max selector is %d!\n",hi6551_dr->size_of_onoff_time_list); return BSP_PMU_PARA_ERROR; } else dr_bre_time = hi6551_dr->bre_onoff_time_list[selector]; break; case PMU_DRS_BRE_RISE_MS: case PMU_DRS_BRE_FALL_MS: if(selector > hi6551_dr->size_of_risefall_time_list) { pmic_print_error("dr_id[%d] bre_risefall_time don't support selector %d!\n",dr_id,selector); pmic_print_error("max selector is %d!\n",hi6551_dr->size_of_risefall_time_list); return BSP_PMU_PARA_ERROR; } else dr_bre_time = hi6551_dr->bre_risefall_time_list[selector]; break; default: pmic_print_error("don't support this bre time!\n"); return BSP_PMU_PARA_ERROR; } pmic_print_info("dr_id[%d],enum %d 's selector %d time is %dms!\n",dr_id,bre_time_enum,selector,dr_bre_time); return dr_bre_time; }
int bsp_dr_switch(int dr_id, power_switch_e sw) { int iret = BSP_PMU_OK; switch(sw) { case POWER_OFF: iret = bsp_hi6559_dr_disable(dr_id); break; case POWER_ON: iret = bsp_hi6559_dr_enable(dr_id); break; default: break; } pmic_print_info("hi6559_ldo14_switch ok!\n"); return iret; }
/*核内互斥*/ int hi6451_volt_mutex_onecore_test(void) { int i = 0; u32 pmu_hi6451_test_pri[30] = {10,12,15,17,19,20,25,28,30,32,34,36,40,42,45,48,50,53,55,58,60,65,72,83,85,87,89,92,95,99}; u32 task_id[30] = {0}; u8 name[30][30] = {0}; for(i = 0;i < 30;i++) { sprintf((char*)name[i], "pmu_onecore_test_task%d", i); if(-1 == osl_task_init((char*)name[i], pmu_hi6451_test_pri[i], PMIC_HI6451_TEST_TASK_STACK_SIZE, (void *)hi6451_volt_enable_test, NULL, &task_id[i])) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_PMU,"create test task %d error\n",i); return BSP_PMIC_HI6451_TEST_ERROR; } } pmic_print_info("hi6451_volt_mutex_onecore_test ok!!\n",i); return 0; }
/*test hi6451 volt disable/isenable*/ int hi6451_volt_disable_test(void) { int i = 0; int j = 0; int test_num = ARRAY_SIZE(hi6451_volt_onoff_test); for(j = 0;j < test_num; j++) { i = hi6451_volt_onoff_test[j]; bsp_hi6451_volt_disable(i); if(0 != bsp_hi6451_volt_is_enabled(i)) { pmic_print_error("\n volt %d: disable or is_enabled failed!\n", i); return i; } } pmic_print_info("hi6451_volt_disable_test ok!!\n",i); return BSP_PMU_OK; }
/***************************************************************************** 函 数 名 : bsp_hi6551_dr_set_current 功能描述 : PMIC HI6551电源电压 输入参数 : dr_id:要查询的电流源编号 输出参数 : 无 返 回 值 : 无 调用函数 : 备注说明 : Acore、Ccore均提供该函数实现,但各核操作的电源不同(由regulator层保证), 故不需要添加核间锁,只使用核内锁 *****************************************************************************/ int bsp_hi6551_dr_set_current(int dr_id, int min_uA, int max_uA, unsigned *selector) { PMIC_HI6551_DRS_ATTR *hi6551_dr; int iret = BSP_PMU_OK; int i = 0; int valid = 0; /*参数有效性检查*/ iret = hi6551_dr_para_check(dr_id); if(BSP_PMU_OK != iret) return BSP_PMU_PARA_ERROR; hi6551_dr = &hi6551_dr_attr[dr_id]; /**/ for(i = 0; i < DR_CUR_NUMS; i++ ) { if ((min_uA <= hi6551_dr->current_list[i])&&(max_uA >= hi6551_dr->current_list[i])) { valid = 1; break; } } /* 如果设置值有效,设置寄存器 */ if (valid) { *selector = i; bsp_dr_reg_write_mask(hi6551_dr->current_reg_addr, (u8)(i << hi6551_dr->current_bit_offset), hi6551_dr->current_bit_mask); pmic_print_info("current is set at %d uA!\n", hi6551_dr->current_list[i]); return BSP_PMU_OK; } else { pmic_print_error("dr_id %d cann't support current between %d and %d uA!\n",dr_id,min_uA,max_uA); return BSP_PMU_ERROR; } }
/*notice: some volt cannot set too high*/ int hi6451_volt_set_get_voltage_test(void) { unsigned selector = 0; int voltage = 0; int flag = 0; int i,test_sub ,k=0; int test_num = ARRAY_SIZE(hi6451_volt_set_test); for(test_sub = 0;test_sub < test_num; test_sub++) { i = hi6451_volt_set_test[test_sub]; if(hi6451_volt_attr[i].voltage_list != NULL) { for(k = 0; k < hi6451_volt_attr[i].voltage_nums;k++) { voltage = hi6451_volt_attr[i].voltage_list[k]; bsp_hi6451_volt_set_voltage(i,voltage,voltage,&selector); if(voltage != bsp_hi6451_volt_get_voltage(i)) { pmic_print_error("id %d set or get voltage error!!\n",i); return i; } if(voltage != bsp_hi6451_volt_list_voltage(i,selector)) { pmic_print_error("id %d set or list voltage error!!\n",selector); return i; } } } else { pmic_print_error("hi6551_volt_attr[%d].voltage_list is NULL,need check!!\n",i); return i; } } pmic_print_info("hi6451_volt_set_get_voltage_test ok!!\n",i); return BSP_PMU_OK; }