Пример #1
0
/*****************************************************************************
 函 数 名  : 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, &regval);
    if(regval & ((u8) (0x1 << hi6551_dr->mode_sel_bit_offset)))
    {
        /*判断是闪烁长亮还是闪烁闪亮*/
        bsp_dr_reg_read(hi6551_dr->fla_mode_reg_addr, &regval);
        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, &regval);
            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;/*呼吸长亮模式*/
            }
        }

    }
}
Пример #2
0
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;
}
Пример #6
0
/*****************************************************************************
 函 数 名  : 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;
}
Пример #7
0
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, &regval);

    /* 获取电压档位值 */
    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;

}
Пример #8
0
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;

}
Пример #9
0
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;
}
Пример #11
0
/*****************************************************************************
 函 数 名  : 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;
}
Пример #12
0
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;
}
Пример #14
0
/*****************************************************************************
 函 数 名  : 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();
    }
}
Пример #15
0
/*****************************************************************************
 函 数 名  : 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;
}
Пример #16
0
/*****************************************************************************
 函 数 名  : 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();
    }
}
Пример #17
0
/*****************************************************************************
 函 数 名  : 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();
    }
}
Пример #18
0
/*****************************************************************************
 函 数 名  : 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;

}
Пример #19
0
/*****************************************************************************
 函 数 名  : 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;
    }
}
Пример #21
0
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;
}
Пример #23
0
/*----------------电流源其他设置相关接口,给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;
}
Пример #24
0
/*****************************************************************************
 函 数 名  : 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,&regval);
    *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;
}
Пример #25
0
/*****************************************************************************
 函 数 名  : 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;
}
Пример #26
0
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;
}
Пример #29
0
/*****************************************************************************
 函 数 名  : 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;
}