1-wire总线的特点

1-wire协议是用一条数据线作为总线进行数据通信的协议。

1-wire总线有以下特点:

1. 可以组建网络,个数没有限制。

2. 使用GPIO的特性就可以,不需要专门的控制器。

3. 总线网络中只有一个主动设备,其它设备均为从设备。主设备发起通信,从设备应答。从设备不能发起通信。

4. 属于串行异步通信。

5. 通信时序严格,在操作系统中,必须在数据通信阶段阶段关闭调度(调度带来的延迟可以能有数毫秒,将破坏时序)。

6. 不同的1-wire设备,通信协议和时序很可能不一样。组建网络时,确保使用遵守相同协议和时序的设备。

TPS6116x的功能框图

1. 从上电谈起

上电后,默认工作在PWM模式,参考电压为200mV. 如果要让设备工作在1-wire模式,则要按照时序要求设置CTRL。

上电的时候,如果CTRL是高电平,对是否1-wire模式的侦测被立即触发。如果CTRL不符合时序要求,则退出侦测。

任何时候,如果CTRL是低电平,且维持2.5ms以上,则设备关机。

2. 无论是PWM模式,还是1-wire模式,都是在设置参考电压(Reference Control).

FB的目标值是参考电压(Error Amplier)。FB与参考电压的误差值被输入PWM Control,以修正PWM的有效宽度。

3. Rset电阻用来调整最大亮度。参考电压的最大值为200mV,这样,如果Rset的阻值为10欧姆,那么LED的最大电流是20mA。

4. PWM的频率是600KHz.

5. 设备Shut down的时候(CTRL一直为低),没有PWM输出。Vin可以直接流向LED.所以Vin在设计上要小于LEDs的开启电压。

6. 设备从Shut down状态复位时(CTRL变高触发复位,设备开机)。开机时如果FB寄存器值(用来设置参考电压的寄存器)为0(范围0-31),则FB寄存器被设定为31(200mV)。

开机时如果FB寄存器不为0,则不会修改FB寄存器的值。Datasheet中指出,不要直接设定FB寄存器值为0,如果想关机,可以令设备Shutdown(CTRL置低2.5ms)。

7. Soft start-up控制电路控制电压一级一级往上升,以避免电流冲击。

TPS6116x的时序

在TPS6116x的Datasheet中,6.6节详细列出时序要求。

名字 含义 电平 最小值 最大值 单位
tvalACKN ACK准备时间,从设备在此区间准备ACK. TPS6116x只有在数据最高位(RFA)为1时,从设备返回ACK。并且从设备是OpenDrain输出的。   2 us
tACKN ACK的有效区间。数据线被从设备拉低。   512 us
toff 设备关机时间。相当于电脑的长按开机键进行强制关机。 2500   us
tes_det EasyScale模式侦测的真正开始。260us超过PWM模式的最大低电平宽度(5kHz, 200us).  260 2500 us
tes_delay TPS6116x从Shutdown状态退出(2.5ms后变高)时开始侦测EasyScale模式的进入。必须维持至少100us的高位。也可能一直高。 100   us
tes_win EasyScale模式侦测的总体时间。TPS6116x从Shutdown状态退出(2.5ms后变高)时开始侦测EasyScale模式的进入。包括tes_delay和tes_det。   1000   us
tSTART 字节处理的预备时间。也可以理解为字节之间的间隔。 2   us
tEOS 字节的结束。相当于UART的STOP位。 2 360 us
tH_LB 逻辑0的高电平时间 2 180 us
tL_LB 逻辑0的低电平时间 2 × tH_LB 360 us
tL_HB 逻辑1的低电平时间 2 180 us
tH_HB 逻辑1的高电平时间 2 × tL_HB 360 us

1. 上电

如果CTRL PIN引脚电平是高,进入tes_win,开始判断是进入EasyScale的1-wire模式,还是进入PWM模式。

如果CTRL PIN引脚电平是低,2.5ms之后设备shutdown,进入低耗电模式。

2. 进入EasyScale的1-wire模式。

1. 为了避免不确定的时序状态,先置CTRL PIN引脚电平为低3秒。设备进入shutdown状态。

static void tps6116_shutdown(unsigned int gpio) {
gpio_set_value(gpio, );
mdelay(); // tps6116 shut down.
}

2. 置CTRL PIN为高,进入tes_win。tes_win遵循下面的时序要求,以进入EasyScale的1-wire模式。

static void tps6116_reset(unsigned int gpio){
gpio_set_value(gpio, );
mdelay(); // tps6116 shut down.
gpio_set_value(gpio, ); // reset, FB = 200mv. start EasyScale detection window.
usleep(); // tes_delay. min 100us
preempt_disable(); // avoid the possbile shutdown. let me do it over.
gpio_set_value(gpio, );
usleep(); // tes_det, min 260us
gpio_set_value(gpio, );
preempt_enable();
usleep(); // tes_win, min 1000us. 500 + 300 + 500 = 1300 > 1000
}

3. 发送字符1。

static void tps6116_send_bit_1(unsigned int gpio){
gpio_set_value(gpio, );
udelay(); // pull low for 20us
gpio_set_value(gpio,);
udelay(); // pull high for 80us
}

4. 发送字符0。

static void tps6116_send_bit_0(unsigned int gpio){
gpio_set_value(gpio, );
udelay(); // pull low for 80us
gpio_set_value(gpio,);
udelay(); // pull high for 20us

5. 发送字节。

static void tps6116_send_byte(unsigned int gpio, unsigned char value){
int i;
int bit; udelay(); // start
for (i = ; i >= ; i--){
bit = value & ( << i); // High bit first
if (bit){
tps6116_send_bit_1(gpio);
}
else{
tps6116_send_bit_0(gpio);
}
}
gpio_set_value(gpio, ); // End of start
udelay();
gpio_set_value(gpio, ); // idle
}

6. 发送帧。

数据帧包含两个字节,第一个字节是地址0x72(固定的)。第二个地址是数据,bit[0-4]是FB寄存器值(0-31),bit[5-6]是设备地址(0),bit[7]是RFA,表示是否希望设备传回ACK。使用RFA,通信会更复杂,驱动还要改变GPIO方向,并且由于设备CTRL是OpenDrain的,主机端要加4.7K的上拉电阻。

// irq code running time is very short, assume it does not effect the timming here.
// if disable irq, the performance of the system will be effected.
static void tps6116_set_fb_value(unsigned int gpio, unsigned char value){
value = value & 0x1F; // RFA: 0, A1=A0=0
preempt_disable(); // let me do it over.
tps6116_send_byte(gpio, 0x72); // address: 0x72
tps6116_send_byte(gpio, value);
preempt_enable();
}

TPS6116x的Linux驱动的其它部分

1. 设置好平台驱动的数据结构。

static struct platform_driver tps6116_bl_driver = {
.driver = {
.name = "tps6116-bl",
.pm = &tps6116_bl_pm_ops,
.of_match_table = of_match_ptr(tps6116_bl_of_match),
},
.probe = tps6116_bl_probe,
.remove = tps6116_bl_remove,
.shutdown = tps6116_bl_shutdown,
}; module_platform_driver(tps6116_bl_driver);

2. probe的工作

1. 分配设备私有数据。

2. 从dts中获取必要的信息: default-brightness, max_brightness, gpio。

3. 初始化gpio。

4. 注册背光驱动。

5. 初始设置背光。

6. 设置平台驱动数据。 这样,从平台设备可以得到背光设备结构,从背光设备结构可以得到设备数据。这对应那些回调函数是很有必要的。

    struct backlight_device *bl = platform_get_drvdata(pdev);
struct tps6116_bl *tps6116_bl = bl_get_data(bl);

最快的方法是找一个相似的背光驱动,比如pwm_bl.c,看它是怎么与驱动框架交互的。

后语

看Data sheet或者看别人写的示例代码,会忽略很多细节。而在整理资料的过程当中,为了把内容细致、逻辑地呈现出来,就会反复阅读和理解手头的资料,很多细节就被挖掘出来。所以养成资料整理的习惯是很有必要的。

TPS6116x 1-wire总线的分析与驱动实现的更多相关文章

  1. i2c总线,设备,驱动之间的关系

    ------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...

  2. 《Linux总线、设备与驱动》USB设备发现机制

    说明:本分析基于mstar801平台Linux2.6.35.11内核,其他内核版本仅供参考. 一.程序在内核中的位置 1.usb host做为pci总线下的一个设备存在(嵌入式系统中有可能也会直接挂在 ...

  3. 利用FPGA实现PCI总线接口及Windows驱动实现

    利用FPGA实现PCI总线接口及Windows驱动实现 关于PCI总线协议,资料网上.书本都是.这里我们仅仅对重点对利用FPGA实现PCI总线接口问题进行简单分析.下图是PCI总线接口信号: 配置空间 ...

  4. 从需求的角度去理解Linux系列:总线、设备和驱动

    笔者成为博客专家后整理以前原创的嵌入式Linux系列博文,现推出以让更多的读者受益. <从需求的角度去理解linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文 ...

  5. 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

    本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...

  6. linux设备驱动归纳总结(九):1.platform总线的设备和驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-111745.html linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxx ...

  7. linux设备驱动归纳总结(八):2.总线、设备和驱动的关系【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-110295.html linux设备驱动归纳总结(八):2.总线.设备和驱动的关系 xxxxxxxxx ...

  8. linux设备驱动归纳总结(八):1.总线、设备和驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-109733.html linux设备驱动归纳总结(八):1.总线.设备和驱动 xxxxxxxxxxxx ...

  9. Linux 总线、设备、驱动模型 与 设备树

    1.总线.设备.驱动模型 本着高内聚.低耦合的原则,Linux 把设备驱动模型分为了总线.设备和驱动三个实体,这三个实体在内核里的职责分别如下: 设备和驱动向总线进行注册,总线负责把设备和对应的驱动绑 ...

随机推荐

  1. JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

     相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...

  2. perl 之 正则表达式 (简)

    正则表达式,简单介绍: 元字符 匹配项 字符类:单字符与数字   . 匹配除换行符之外的任意字符 [a-z0-9] 匹配集中任意单字符 [^a-z0-9] 匹配不在集合中的任意单字符 \d 匹配单个数 ...

  3. Beta 冲刺(4/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  4. 初学python之路-day04

    每天一篇总结,今天学习的是有关于流程控制的知识. 流程控制,顾名思义,在计算机运行中,程序是被某种控制方式按照某种流程或者规律来执行的.而python程序的运行,肯定也是按照某种规律在执行.这些规律可 ...

  5. 创建免费的证书,实现网站HTTPS

    使用Certbot来实现HTTPS,这边也就考虑采用Cerbot来实现下 配置Certbot 证书 Certbot 的官方网站是 https://certbot.eff.org/ ,打开官网选择的 w ...

  6. 使用mysqlslap进行MySQL压力测试

    使用mysqlslap进行MySQL压力测试发表于236 天前 ? MySQL ? 暂无评论 MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来 ...

  7. powershell 激活WIN10

    1.以win10专业版为例,鼠标右键点击开始图标,选择[windows powershell(管理员)],或者命令提示符管理员:2.打开命令窗口,复制这个命令slmgr /ipk W269N-WFGW ...

  8. 【工具】idea工具 java代码 gbk转utf8

    idea工具 https://github.com/downgoon/gbk2utf8 安装在目录下: /usr/local/gbk2utf8/bin 进入目录后直接执行 gbk2utf8 sourc ...

  9. Python学习计划

    ---恢复内容开始--- Python学习计划   https://edu.csdn.net/topic/python2?utm_source=blog4   匠人之心,成就真正Python全栈工程师 ...

  10. build配置项中maven常用插件

    <build> <!-- 在浏览器地址栏的项目名称 --> <finalName>${project.artifactId}</finalName> & ...