mt6750 battery_common.c阅读笔记1

static int battery_probe(struct platform_device *dev)
{
    struct class_device *class_dev = NULL;
    int ret = 0;

    battery_log(BAT_LOG_CRTI, "******** battery driver probe!! ********\n");

    /* Integrate with NVRAM */
    ret = alloc_chrdev_region(&adc_cali_devno, 0, 1, ADC_CALI_DEVNAME);
    if (ret)
        battery_log(BAT_LOG_CRTI, "Error: Can't Get Major number for adc_cali\n");
    adc_cali_cdev = cdev_alloc();
    adc_cali_cdev->owner = THIS_MODULE;
    adc_cali_cdev->ops = &adc_cali_fops;
    ret = cdev_add(adc_cali_cdev, adc_cali_devno, 1);
    if (ret)
        battery_log(BAT_LOG_CRTI, "adc_cali Error: cdev_add\n");
    adc_cali_major = MAJOR(adc_cali_devno);
    adc_cali_class = class_create(THIS_MODULE, ADC_CALI_DEVNAME);
    class_dev = (struct class_device *)device_create(adc_cali_class,
                             NULL,
                             adc_cali_devno, NULL, ADC_CALI_DEVNAME);
    battery_log(BAT_LOG_CRTI, "[BAT_probe] adc_cali prepare : done !!\n ");

    get_charging_control();//函数指针赋值,调用下面的charging_hw_XX里定义的函数
    batt_init_cust_data();//电池参数,dts初始化

    battery_charging_control(CHARGING_CMD_GET_PLATFORM_BOOT_MODE, &g_platform_boot_mode);//获取系统启动方式,关机充电?meta模式?还是正常的开机模式?
    battery_log(BAT_LOG_CRTI, "[BAT_probe] g_platform_boot_mode = %d\n ", g_platform_boot_mode);

//初始化锁battery_fg_lock和battery_suspend_lock
    wake_lock_init(&battery_fg_lock, WAKE_LOCK_SUSPEND, "battery fg wakelock");
    wake_lock_init(&battery_suspend_lock, WAKE_LOCK_SUSPEND, "battery suspend wakelock");
#if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)//是否快充的宏定义
    wake_lock_init(&TA_charger_suspend_lock, WAKE_LOCK_SUSPEND, "TA charger suspend wakelock");
#endif
//mtk快充相关的初始化代码
    mtk_pep_init();
    mtk_pep20_init();

    /* Integrate with Android Battery Service */
    ret = power_supply_register(&(dev->dev), &ac_main.psy);
    if (ret) {
        battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register AC Fail !!\n");
        return ret;
    }
    battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register AC Success !!\n");

    ret = power_supply_register(&(dev->dev), &usb_main.psy);
    if (ret) {
        battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register USB Fail !!\n");
        return ret;
    }
    battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register USB Success !!\n");

    ret = power_supply_register(&(dev->dev), &wireless_main.psy);
    if (ret) {
        battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register WIRELESS Fail !!\n");
        return ret;
    }
    battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register WIRELESS Success !!\n");

    ret = power_supply_register(&(dev->dev), &battery_main.psy);
//注册battery的powersupply
    if (ret) {
        battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register Battery Fail !!\n");
        return ret;
    }
    battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register Battery Success !!\n");

#if !defined(CONFIG_POWER_EXT)

#ifdef CONFIG_MTK_POWER_EXT_DETECT
    if (KAL_TRUE == bat_is_ext_power()) {
        battery_main.BAT_STATUS = POWER_SUPPLY_STATUS_FULL;
        battery_main.BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD;
        battery_main.BAT_PRESENT = 1;
        battery_main.BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION;
        battery_main.BAT_CAPACITY = 100;
        battery_main.BAT_batt_vol = 4200;
        battery_main.BAT_batt_temp = 220;

        g_bat_init_flag = KAL_TRUE;
        return 0;
    }
#endif
    /* For EM */


    /* battery_meter_initial();      //move to mt_battery_GetBatteryData() to decrease booting time */

    /* Initialization BMT Struct */
    BMT_status.bat_exist = KAL_TRUE;    /* 电池是否在位phone must have battery */
    BMT_status.charger_exist = KAL_FALSE;   /*充电器是否在位 for default, no charger */
    BMT_status.bat_vol = 0;//电池电压
    BMT_status.ICharging = 0;//进电池电流
    BMT_status.temperature = 0;//电池温度
    BMT_status.charger_vol = 0;//充电器电压
    BMT_status.total_charging_time = 0;//总的充电时间
    BMT_status.PRE_charging_time = 0;//预充电时间
    BMT_status.CC_charging_time = 0;//恒流充电时间
    BMT_status.TOPOFF_charging_time = 0;
    BMT_status.POSTFULL_charging_time = 0;
    BMT_status.SOC = 0;//电量
    BMT_status.UI_SOC = 0;//UI电量

    BMT_status.bat_charging_state = CHR_PRE;//充电状态
    BMT_status.bat_in_recharging_state = KAL_FALSE;//是否二次充电
    BMT_status.bat_full = KAL_FALSE;//充电满标记
    BMT_status.nPercent_ZCV = 0;// nPercent_ZCV
    BMT_status.nPrecent_UI_SOC_check_point = battery_meter_get_battery_nPercent_UI_SOC();

#if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
    dual_input_init();
#endif

    /* battery kernel thread for 10s check and charger in/out event */
    /* Replace GPT timer by hrtime */
    battery_kthread_hrtimer_init();

    kthread_run(bat_thread_kthread, NULL, "bat_thread_kthread");
//创建内核线程bat_thread_kthread,线程处理函数bat_thread_kthread后面分析
    battery_log(BAT_LOG_CRTI, "[battery_probe] bat_thread_kthread Done\n");


    charger_hv_detect_sw_workaround_init();


    /*LOG System Set */
    init_proc_log();

#else
    /* keep HW alive */
    /* charger_hv_detect_sw_workaround_init(); */
#endif
    g_bat_init_flag = KAL_TRUE;

#if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
    if ((g_vcdt_irq_delay_flag == KAL_TRUE) || (upmu_is_chr_det() == KAL_TRUE))
        do_chrdet_int_task();
#endif

    return 0;
}


//定时器初始化函数
void battery_kthread_hrtimer_init(void)
{
    ktime_t ktime;
#ifdef CONFIG_MTK_BQ25896_SUPPORT
/*watchdog timer before 40 secs*/
    ktime = ktime_set(BAT_TASK_PERIOD, 0);  /* 3s, 10* 1000 ms */
#else
    ktime = ktime_set(1, 0);
#endif
    hrtimer_init(&battery_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
// hrtimer_init初始化定时器工作模式。
    battery_kthread_timer.function = battery_kthread_hrtimer_func;
// 设置定时器的回调函数,定时器到时该函数将被调用 

    hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);
//启动定时器,超时时间为ktime
    battery_log(BAT_LOG_CRTI, "battery_kthread_hrtimer_init : done\n");
}


定时时间到处理函数
enum hrtimer_restart battery_kthread_hrtimer_func(struct hrtimer *timer)
{
    bat_thread_wakeup();

    return HRTIMER_NORESTART;
}

int bat_thread_kthread(void *x)
{
    ktime_t ktime = ktime_set(3, 0);    /* 10s, 10* 1000 ms */

#ifdef BATTERY_CDP_WORKAROUND2
    if (is_usb_rdy() == KAL_FALSE) {
        battery_log(BAT_LOG_CRTI, "CDP, block\n");
        wait_event(bat_thread_wq, (is_usb_rdy() == KAL_TRUE));
        battery_log(BAT_LOG_CRTI, "CDP, free\n");
    } else {
        battery_log(BAT_LOG_CRTI, "CDP, PASS\n");
    }
#endif
#if defined(BATTERY_SW_INIT)
        battery_charging_control(CHARGING_CMD_SW_INIT, NULL);
#endif

    /* Run on a process content */
    while (1) {
        mutex_lock(&bat_mutex);

        if (((chargin_hw_init_done == KAL_TRUE) && (battery_suspended == KAL_FALSE))
            || ((chargin_hw_init_done == KAL_TRUE) && (fg_wake_up_bat == KAL_TRUE)))
            BAT_thread();//电池数据处理线程

        mutex_unlock(&bat_mutex);

#ifdef FG_BAT_INT
        if (fg_wake_up_bat == KAL_TRUE) {
            wake_unlock(&battery_fg_lock);
            fg_wake_up_bat = KAL_FALSE;
            battery_log(BAT_LOG_CRTI, "unlock battery_fg_lock\n");
        }
#endif              /* #ifdef FG_BAT_INT */

        battery_log(BAT_LOG_FULL, "wait event\n");

        wait_event(bat_thread_wq, (bat_thread_timeout == KAL_TRUE));

        bat_thread_timeout = KAL_FALSE;
        hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);
        ktime = ktime_set(BAT_TASK_PERIOD, 0);  /* 10s, 10* 1000 ms */
        if (chr_wake_up_bat == KAL_TRUE && g_smartbook_update != 1) {   /* for charger plug in/ out */
#if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
            if (DISO_data.chr_get_diso_state) {
                DISO_data.chr_get_diso_state = KAL_FALSE;
                battery_charging_control(CHARGING_CMD_GET_DISO_STATE, &DISO_data);
            }
#endif

            g_smartbook_update = 0;
            battery_meter_reset();
            chr_wake_up_bat = KAL_FALSE;

            battery_log(BAT_LOG_CRTI,
                    "[BATTERY] Charger plug in/out, Call battery_meter_reset. (%d)\n",
                    BMT_status.UI_SOC);
        }

    }

    return 0;
}
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB是一种用于进行数值计算和数据可视化的软件平台。使用MATLAB可以进行各种科学计算、工程计算以及数据分析等。MATLAB提供了丰富的工具箱和函数库,能够满足不同领域的科学计算需求。 在MATLAB中,boost_thread-vc120-mt-1_56.dll是一个动态链接库文件,用于支持多线程编程。多线程编程可以提高程序的性能和效率,使程序能够同时执行多个任务。这个库文件是用于Windows平台上使用Visual Studio 2013进行编译的。 要下载boost_thread-vc120-mt-1_56.dll,可以按照以下步骤进行: 1. 打开MATLAB软件。 2. 在MATLAB命令窗口中输入"mex -setup",回车。 3. 在弹出的窗口中选择"Y",表示需要重新配置MEX编译器。 4. 在编译器选项中选择"Microsoft Visual C++ Compiler",回车。 5. 在弹出的窗口中选择"Y",表示需要下载并安装支持的编译器。 6. 下载和安装完成后,重新打开MATLAB。 7. 在MATLAB命令窗口中输入"mex -setup",回车。 8. 在弹出的窗口中选择"Y",表示要重新配置MEX编译器。 9. 选择相应的编译器选项,回车。 10. 设置完成后,在MATLAB命令窗口中输入"mex -setup",回车。 11. 在编译器选项中选择"Microsoft Visual C++ Compiler",回车。 12. 在弹出的窗口中选择"Y",表示需要下载并安装支持的编译器。 13. 下载和安装完成后,重新打开MATLAB。 14. 在MATLAB命令窗口中输入"mex -setup",回车。 15. 在弹出的窗口中选择"Y",表示要重新配置MEX编译器。 16. 选择相应的编译器选项,回车。 17. 设置完成后,可以在MATLAB环境中使用boost_thread-vc120-mt-1_56.dll库文件进行多线程编程了。 以上是关于MATLAB下载boost_thread-vc120-mt-1_56.dll的简单步骤说明,希望对您有所帮助。如果有任何其他问题,请随时向我们提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值