Linux Charger IC 驱动移植总结

文章目录

  • Linux Charger IC 驱动移植总结
    • 1 设备树的基本知识
      • 设备树的概念
      • 设备树的基本结构
      • compatible属性
        • 举个栗子
    • 2 电源管理
      • 基本概念
        • C速率
        • 开路电压(OCV)
        • 电池极化
      • 电池充电过程
        • 涓流充电
        • 恒流充电(CC)
        • 恒压充电(CV)
        • 充电终止
        • 备注
    • 总结
    • 参考文献

通过这次移植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 requireda-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 WIFI模块驱动移植

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 请问有知道atheros ...

  2. 嵌入式linux usb wifi驱动移植

    文档名称:嵌入式linux usb wifi驱动移植 版本历史 版本号        时间        内容 v1.0b001        2012-6-18        初始版本,介绍在嵌入式 ...

  3. linux ec20 usb驱动移植,linux下EC20 4G模块驱动移植

    之前有移植过ME909s MU609,主要工作就是把4G模块当做USB设备,挂载在linux上,驱动移植主要是能够让板子识别到模块,并产生SUB多个虚拟的节点,用于操作模块,拨号上网 关于内核的配置, ...

  4. linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...

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

  5. STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  6. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  7. linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx

    linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...

  8. arm9+linux s3c2440 触摸屏驱动移植

    ---------------------------------------------------------------------------------------- 主机操作系统:cent ...

  9. Linux学习——I2C-MPU6050驱动移植记录

    开发板:Nvidia Jetson Nano b01 模块:MPU6050 I2C设备 接线 vcc - 3.3v(17) gnd - GND(25) scl - I2C0_SCL(28) -> ...

最新文章

  1. Ubuntu Linux下如何配置Android开发环境
  2. PHP同时连接多个mysql数据库_php如何同时连接多个数据库
  3. 转: 学ppt的网址与素材
  4. selenium+python中,框架中,怎么返回上一个菜单
  5. 开发实践丨用小熊派STM32开发板模拟自动售货机
  6. [转]httpclient 上传文件、下载文件
  7. Redis主从复制知识点
  8. Java开发笔记(一百五十)C3P0连接池的用法
  9. 二次解析视屏 php,最新PHP二次视频解析源码 带后台版
  10. SWFObject Flash 增强插件
  11. push_back和emplace_back区别
  12. 浅学 --------- CSS
  13. IOS 改变导航栏颜色
  14. 坦克大战游戏Java网络版设计
  15. linux分配iomem,linux 下__iomem 解析【转】
  16. 国企面试 计算机专业,在国企面试中,计算机维护岗位面试会问什么10 爱问知识人...
  17. 刘强东的代码水平如何?网友:95年一个晚上赚5万
  18. 创建自己的web应用--记账本(一)
  19. 新闻发稿公司及软文发稿渠道整体操作过程解密
  20. mysql 中文匹配_MYSQL-中文检索匹配与正则表达式

热门文章

  1. Segmented Log 分段日志
  2. D:\……R.jar: 另一个程序正在使用此文件,进程无法访问。
  3. C++ pair的基本用法总结(整理)
  4. github项目移动到组织仓库
  5. WPF 视频开发所谓的空域问题解决
  6. 如何快速成为数据分析师?网友分享亲身经历:有段时间一直认为自己会当一辈子的会计
  7. 自如大前端-web动画探索(一)
  8. 我,放弃外企高薪卖小龙虾创业,不到一年就后悔了……
  9. SATA VS PATA
  10. C51单片机驱动LCD1602显示字符串