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” - 节点的子节点:"
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_get, of_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 驱动移植总结的更多相关文章
- linux enc28j60网卡驱动移植(硬件spi和模拟spi)
本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...
- linux网卡驱动移植
这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层.DM9000A将MAC和PHY做到一起,也可 ...
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- I.MX6 SHT20 Linux 驱动移植
/*********************************************************************** * I.MX6 SHT20 Linux 驱动移植 * ...
- Linux Spi驱动移植小结
2012-01-07 22:21:29 效果图: 理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了. 1, make menuconfig添加 ...
- 移植Linux Kernel SM750 驱动到VxWorks 7
一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...
- 【Linux驱动】TQ2440 DM9000E网卡驱动移植(Linux-2.6.30.4)
花了一天的时间研究了一下Linux-2.6.30.4版本号内核下关于TQ2440 DM9000E的网卡驱动移植.总结一下自己的收获. 事实上.在Linux-2.6.30.4版本号内核下有关于网卡驱动, ...
- Linux网卡驱动移植--Dm9000网卡驱动分析
1. Linux网络体系结构由以下5部分组成 ① 系统调用接口: 位于Linux网络子系统的顶部,为应用程序提供访问内核网络子系统的方法,主要指socket系统调用. ② 协议无关接口: 实现一组基于 ...
- Linux的LCD驱动分析及移植
测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...
随机推荐
- 虎符ctf-MISC-奇怪的组织(看完官方题解,找到了)
一道取证题,一整场比赛,基本就死磕了这一题 写的很乱,因为当时的思维就是那么乱,完全没有注意到出题人的提示, 还没做出来,没有找到关键key 那个人的real name 文档:虎符.note链接:ht ...
- 44道JavaScript送命题
很久以前看过一个老外写的帖子,JavaScript Puzzlers!,直译就是JavaScript难题,里面列举了100道JavaScript选择题,大部分都是让人摸不着头脑的题目,需要仔细琢磨一番 ...
- [WPF] 考古Expression Web:微软当年最漂亮的WPF软件
1. 什么是Expression Web Expression Studio是微软在2007年推出的一套针对设计师的套件,其中包含专业的设计工具和新技术,可以弹性且自由地将设计方案转为实际--无论设计 ...
- 云开发网站托管悄悄上线了 Next.js 的支持
我们知道部署web应用程序的最佳方式是作为静态HTML应用程序,因为他对搜索引擎很友好,速度快等等,这对我们写个人博客这样的小型网站无异于非常nice.如果你的应用可以作为静态HTML,那么可以试试N ...
- 一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!
很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...
- 前端开发--ajax
使用ajax,他是有两个模块的,一个是客户端,一个是服务端. 客户端负责发送数据,发送数据的方式有两种,一种是GET,另一种是POST. 服务端是用来接收,处理数据和发送请求的数据. 要想使用ajax ...
- thinkphp5--model数据操作的坑
最近用thinkphp5开发,经常用到model了来操作数据,但是操作多了,就发现他的坑了. 就好像如果你只是初始化一个model对象,但是你却用这个对象进行多次的数据操作,这时候他的数据就会发生混乱 ...
- 2019-2020-1 20199328《Linux内核原理与分析》第五周作业
实验要求: 实验步骤: 这里以20号系统调用getpid为例进行实验,该函数的功能为:返回当前进程标识. getpid.c代码: 查看实验结果: 当前进程pid为:31042. 在C语言中编入汇编代码 ...
- libeay32.dll 1.0.2j crash
https://github.com/BOINC/boinc/issues/2470 他们认为是CPU不同造成的 另外一个可能的原因 Changes between 1.0.2j and 1.0.2k ...
- mysql闪回工具--binlog2sql实践
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...