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 ...
随机推荐
- Python中有许多HTTP客户端,但使用最广泛且最容易的是requests
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:北京尚脑软件测试 PS:如有需要Python学习资料的小伙伴可以加点击 ...
- 用Python介绍了企业资产情况的数据爬取、分析与展示。
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:张耀杰 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- Xor Path 牛客,HPU--C--LCA
题解: 题目要求求出u和v两点在最短路径上的异或和.怎么确定最短路径呢?,就是U到LCA(u,v)的路径加上V到LCA(u,v).根据异或的性质,如k^a^a=k,即异或一个值两边等于原数值. 所以维 ...
- Jar包一键重启的Shell脚本及新服务器部署的一些经验
原文首发于博客园,作者:后青春期的Keats:地址:https://www.cnblogs.com/keatsCoder/ 转载请注明,谢谢! 前言 最近公司为客户重新部署了一套新环境,由我来完成了基 ...
- PHP函数:json_last_error
json_last_error() - 返回 JSON 编码解码时最后发生的错误.. 说明: json_last_error ( void ) : int 参数: 无 返回值: 返回一个整型(int ...
- 再看CVE-2018-12613 phpmyadmin后台文件包含&&RPO攻击
写在前面 因为看了朋友的一篇分析又回头想了想自己去年遇到的这个纠结的问题. 去年写过一篇phpmyadmin后台文件包含的文章,写的非常的草草,并没有分析的过程,只是把自己的问题记了下来.当时纠结于最 ...
- linux CVE-2019-13272 本地特权漏洞
漏洞描述 在5.1.17之前的Linux内核中,kernel / ptrace.c中的ptrace_link错误地处理了想要创建ptrace关系的进程的凭据记录,这允许本地用户通过利用父子的某些方案来 ...
- python爬虫面试题集锦及答案
1.爬取数据后使用哪个数据库存储数据的,为什么? - 2.你用过的爬虫框架或者模块有哪些?优缺点? - 3.写爬虫是用多进程好?还是多线程好? - 4.常见的反爬虫和应对方法? - 5.需要登录的网页 ...
- SVM之不一样的视角
在上一篇学习SVM中 从最大间隔角度出发,详细学习了如何用拉格朗日乘数法求解约束问题,一步步构建SVM的目标函数,这次尝试从另一个角度学习SVM. 回顾监督学习要素 数据:(\(x_i,y_i\)) ...
- Elasticsearch 集群部署
本文部署环境 $ cat /etc/redhat-release CentOS Linux release (Core) 部署前系统优化 $ /etc/security/limits.conf roo ...