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
  • 节点的子节点:"child-node1" “child-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

Linux Charger IC 驱动移植总结的更多相关文章

  1. linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  2. linux网卡驱动移植

    这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层.DM9000A将MAC和PHY做到一起,也可 ...

  3. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  4. I.MX6 SHT20 Linux 驱动移植

    /*********************************************************************** * I.MX6 SHT20 Linux 驱动移植 * ...

  5. Linux Spi驱动移植小结

    2012-01-07 22:21:29 效果图: 理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了. 1,  make menuconfig添加 ...

  6. 移植Linux Kernel SM750 驱动到VxWorks 7

    一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...

  7. 【Linux驱动】TQ2440 DM9000E网卡驱动移植(Linux-2.6.30.4)

    花了一天的时间研究了一下Linux-2.6.30.4版本号内核下关于TQ2440 DM9000E的网卡驱动移植.总结一下自己的收获. 事实上.在Linux-2.6.30.4版本号内核下有关于网卡驱动, ...

  8. Linux网卡驱动移植--Dm9000网卡驱动分析

    1. Linux网络体系结构由以下5部分组成 ① 系统调用接口: 位于Linux网络子系统的顶部,为应用程序提供访问内核网络子系统的方法,主要指socket系统调用. ② 协议无关接口: 实现一组基于 ...

  9. Linux的LCD驱动分析及移植

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...

随机推荐

  1. 教你如何入手用python实现简单爬虫微信公众号并下载视频

    主要功能 如何简单爬虫微信公众号 获取信息:标题.摘要.封面.文章地址 自动批量下载公众号内的视频 一.获取公众号信息:标题.摘要.封面.文章URL 操作步骤: 1.先自己申请一个公众号 2.登录自己 ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之九(四十五)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  3. 页面性能分析-Chrome Dev Tools

    一.分析面板介绍 进行页面性能快速分析的主要是图中圈出来的几个模块功能: Network : 页面中各种资源请求的情况,这里能看到资源的名称.状态.使用的协议(http1/http2/quic...) ...

  4. TensorFlow keras卷积神经网络 添加L2正则化

    model = keras.models.Sequential([ #卷积层1 keras.layers.Conv2D(32,kernel_size=5,strides=1,padding=" ...

  5. 总结php删除html标签和标签内的内容的方法

    来源:https://www.cnblogs.com/shaoguan/p/7336984.html 经常扒别人网站文章的坑们:我是指那种批量式采集的压根不看内容的:少不了都会用到删除html标签的函 ...

  6. UML由浅入深

    在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...

  7. Ubuntu 安装 Qt, 安装辅助软件

    sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev sudo apt-get install gcc g++ sudo apt-get inst ...

  8. 【ejabberd】安装XMPP服务器ejabberd(Ubuntu 12.04)

    ejabberd ejabberd is a free and open source instant messaging server written in Erlang/OTP. ejabberd ...

  9. Django项目打包

    Django项目打包 这是目前开发完成的project目录树.我们要打包其中的polls app. (v_python3.6) thinkt@linux-pw37:~/PycharmProjects/ ...

  10. 日日算法:Kruskal算法

    介绍 克鲁斯卡尔(Kruskal)算法是用来求出连通图中最小生成树的算法. 连通图:指无向图中任意两点都能相通的图. 最小生成树:指联通图的所有生成树中边权重的总和最小的树(即,找出一个树,让其联通所 ...