Linux Charger IC 驱动移植总结

Linux Charger IC 驱动移植总结

通过这次移植ti的charger ic芯片到平台上,总结了以下一些内容,需要用到并且掌握的内容。在此之前我还没有尝试写过内核4.0以上的驱动,对于设备树的配置只不过是看过语法,也并未太深入的了解。在这里对所需要涉及到的知识点简单做一下梳理和总结。

1 设备树的基本知识

设备树的概念

Linux中设备树的主要目的是提供一种描述不可发现硬件的方法。此信息以前在源代码中进行了硬编码。方便系统对硬件设备的管理,提高代码可复用率。位于 kernel/arch/platform/boot/dts 下,platform可以是arm,arm64,mips等等。设备树资料比较全的资料链接

设备树的基本结构

设备树是节点和属性的简单树结构。属性是键 – 值对,节点可以包含属性和子节点。例如,以下是.dts格式的简单树:

/dts-v1/;

/ {
    node1 {
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        // hex is implied in byte arrays. no '0x' prefix is required
        a-byte-data-property = [01 23 34 56];
        child-node1 {
            first-child-property;
            second-child-property = <1>;
            a-string-property = "Hello, world";
        };
        child-node2 {
        };
    };
    node2 {
        an-empty-property;
        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};

这棵树显然没有什么具体的作用,没有描述任何东西,但是它的确描述了节点——属性的结构。有:

  • 单个根节点: “/
  • 几个字节点:”node1” “node2
  • 节点的子节点:”node1” “node2
  • 分支上的属性和属性值

https://elinux.org/Device_Tree_Usage

compatible属性

这里需要重点理解一下compatible 属性,因为当时因为这个属性没有配置正确,导致一直没有将驱动配对。

设备树中表示设备的每个节点都需要 compatible属性。这是在操作系统中用来决定绑定到哪一个设备的驱动程序的关键。

举个栗子

设备树文件中的i2c0节点定义了一个子节点bq24296,可以看到compatible属性是ti,bq24296,那么它是如何找到对应的驱动程序呢?

&i2c0 {
    status = "okay";

    bq24296: bq24296@6b {
        compatible = "ti,bq24296";
        reg = <0x6b>;       
        gpios = <&gpio2 PXX GPIO_ACTIVE_LOW>,<&gpio3 PB5 GPIO_ACTIVE_LOW>;
        status = "okay";
    };
}

在驱动程序中找到了以下代码,当然了这是我参考其他驱动程序进行添加的compatible属性值,当然bq24296节点中gpios属性也可以通过读取,这里需要对设备树进行深入的学习。

static struct of_device_id bq24296_of_match[] = {
    { .compatible = "ti,bq24296"},
    { },
};

然后,我产生了疑惑,如何解析设备树的数据到内核呢?

static struct void bq24296_parse_dt(void *param)
{
    struct bq24296_board *pdata;
    ...
    bq24296_np = of_node_get(di->dev->of_node);
    if (!bq24296_np) {
        printk("could not find bq24296-node\n");
        return NULL;
    }
    pdata = devm_kzalloc(di->dev, sizeof(*pdata), GFP_KERNEL);
    if (!pdata)
        return NULL;

    pdata->chg_irq_pin = of_get_named_gpio(bq24296_np,"gpios",0);
    if (!gpio_is_valid(pdata->chg_irq_pin)) {
        printk("invalid gpio: %d\n",  pdata->chg_irq_pin);
    }

    pdata->dc_det_pin = of_get_named_gpio(bq24296_np,"gpios",1);
    if (!gpio_is_valid(pdata->dc_det_pin)) {
        printk("invalid gpio: %d\n",  pdata->dc_det_pin);
    }

}

例如of_node_getof_get_named_gpio 等等方法可以在内核中获取设备树里的属性信息。这里简单介绍一下,可以查看一下内核读取设备树的常用API,这样基本上就会清楚了。推荐一下宋老师的设备树博文https://blog.csdn.net/21cnbao/article/details/8457546。

2 电源管理

基本概念

C速率

大多数电池都标有额定容量,以安时(Ah)毫安时(mAh)为单位。这基本上是它们在完全耗尽之前可以供应一小时的放电电流。

举个例子,你有一个标记为2400mAh或2.4Ah的大电池,这意味着它可以通过你的电路推动2.4A,并在一小时的时间内放电。这将是1C放电率,在额定容量电流下放电。

如果你的电池为一个电路提供1200mA电流,它将是0.5C的放电率,它应该持续两个小时。

有些电池的放电率高于1C,如果你能以4.8A(2C)的速度放电,它可以持续30分钟。RC系统中使用的一些电池允许非常高的放电速率,如10或20C,但这种电池通常设计为失败而不是让您的飞机在飞行途中无动力,因此它们不是最安全的。

充电时,它基本相同,在1200mA的最大电流下为2400mAh电池充电将是0.5C的充电速率。出于安全原因,大多数电池应在0.5C和1C之间; 完全充电时间约为2-3小时。这些电池的制造商建议在0.8C或更低的温度下充电,以延长电池寿命; 然而,大多数动力电池可以在很小的压力下采用更高的充电C率。充电效率约为99%,电池在充电过程中保持冷却。

开路电压(OCV)

电池在开路状态下的电压,即电池断开的情况下电池两端的电压,等于电池正极与电池负极两端的电势差。

电池极化

电池在有电流通过的情况下,两个电极会出现极化的情况,电流越大,极化情况越严重。两极会偏离平衡电位,表现为阳极电位会比平衡电位高,而阴极会比平衡电位低,所以在出现极化的情况下,电位差会大于开路电压。

电池充电过程

充电周期包括两个主要阶段; 恒流CC)和恒压CV),但有些充电器跳过或增加更多级。主要的充电过程如下图所示。

在这里插入图片描述

涓流充电

在电池电压低于3V左右时采用涓流充电,涓流充电电流是恒流充电电流的十分之一即0.1C,这是由于电池自放电导致电池自身电压过低,大部分充电池特别是镍镉电池镍氢电池都有自放电现象;锂电池则不推荐使用这个方式进行充电

恒流充电(CC)

当电池电压上升到涓流充电阈值以上时,提高充电电流进行恒流充电。恒流充电的电流在0.2C至 1.0C之间。恒流充电时的电流并不要求十分精确,准恒定电流也可以。在线性充电器设计中,电流经常随着电池电压的上升而上升,以尽量减轻传输晶体管上的 散热问题。

大于1C的恒流充电并不会缩短整个充电周期时间,因此这种做法不可取。当以更高电流充电时,由于电极反应的过压以及电池内部阻抗上的电压上升,电池电压会更快速地上升。恒流充电阶段会变短,但由于下面恒压充电阶段的时间会相应增加,因此总的充电周期时间并不会缩短。

恒压充电(CV)

恒压充电—— 当电池电压上升到4.2V时,恒流充电结束,开始恒压充电阶段。为使性能达到最佳,稳压容差应当优于+1%。

充电终止

充电终止——与镍电池不同,并不建议对锂离子电池连续涓流充电。连续涓流充电会导致金属锂出现极板电镀效应。这会使电池不稳定,并且有可能导致突然的自动快速解体。

备注

  • 通过读取充电电池的电压来估算SoC是不切实际的; 在电池休息几小时后测量开路电压(OCV)是一个更好的指标。与所有电池一样,温度会影响OCV,锂离子的活性材料也会如此。通过库仑计数估计智能手机,笔记本电脑和其他设备的SoC。
  • NTC热敏电阻温度传感器是锂离子电池充电和安全的关键组成部分。它们提供了在充电周期内将锂离子电池保持在最佳状态所需的临界温度数据。充电期间仔细管理温度可延长电池寿命并避免锂离子电池固有的危险。

总结

本文主要就Charger IC驱动移植的过程中所遇到的知识点扫描进行了简单的总结,包括快速搞懂设备树,以及如何通过设备树与设备进行绑定。介绍了锂电池的相关概念以及充电过程和部分注意事项。

参考文献

https://blog.csdn.net/u012719256/article/details/52212520

http://www.elecfans.com/yuanqijian/dianchi/lidianchi/20180305642842_2.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

70 views