am335x cotex-A8 数据手册触摸屏章节翻译

来源:互联网 发布:windows 2008 pe iso 编辑:程序博客网 时间:2024/05/16 09:20

最近公司产品打高频,结果很奇怪的是其它部件都没有问题,唯独触摸屏失灵。
而每次失灵后reboot后就又恢复正常。没办法了就把数据手册全部翻译了一遍,
看看驱动有没有设置不合适的地方。最后改了一下确实管用了,打完高频后基本能恢复过来,
但是偶尔还是会出现失灵。希望有遇到过类似的情况的大神指导一下该怎么彻底消除高频影响。
根据测试,和触摸屏本身没关系,应该是am335x触摸屏模块的问题。
下面是手册章节翻译。希望能帮到也做这块的人。

12.1 可编程的状态机可支持16个步骤:
-控制寄存器位来控制转换的开始
-可选择的:对于触笔按下硬件同步转换或者外部硬件事件,但是不能同时选择
-单次转换
-连续转换
-顺序的通过所有的输入通道基于一个mask
-对每个通道采样前都有可编程的OpenDelay值来控制
-对每个通道都有采样延时
-可以把数据存在两个FIFO中的任一个
-可通过CPU或者DMA取数据
-对每个FIFO都有DMA请求事件
-在操作过程中可动态的使能或者关闭通道输入
-停止位来结束转换

支持以下中断和状态,拥有屏蔽码
-硬件按下(触摸)事件中断
-硬件松开事件中断
-所有未屏蔽的通道经过一系列的转换后出发的中断
-达到FIFO临界值中断
-采样数据超过了一个可编程的范围
-FIFO数据溢出或者下溢中断
-状态位指示ADC是否正在转换中

12.3功能描述
在使能TSC_ADC_SS模块前,用户必须首先为“步骤控制寄存器”编程来控制一个通道的输入和采样。
有16个可编程的控制寄存器来控制转换器的开关、采样通道、模式选择(硬件触发还是软件使能、单次还是连续、
求平均值、FIFO数据存储到哪里)

12.3.1 硬件同步或者软件输出
用户可以控制每一个通道的输入行为来决定是否一个通道是否在其使能后被立即采样(SW enabled) ,
或者是否通道需要首先等待硬件事件的发生(一个硬件事件必须被映射到触摸事件或者硬件输入信号)
每个通道可被独立的控制经由Step Configuration 寄存器

12.3.2 打开延时和采样延时
用户可以控制输入数据到AFE(应该是ADC转换器)的时间和发送开始转换信号的时间。
这个延时可以使采样前触摸屏电压稳定。这个延时叫open delay,它可以被设置为0。
用户可以控制ADC采样的时间(开始转换信号的宽度)。每个通道可被独立的控制经由Step Delay寄存器。

12.3.3 采样求平均值
每个输入通道都有对采样数据求平均值的能力。有效的平均值选项是1(不求平均值)、2、4、8和16。
如果求平均值功能开启,通道立马重新采样(最多16次),并最后把平均值存储到FIFO中。
每个通道可被独立的控制经由Step Configuration 寄存器

12.3.4 单次和连续模式
当定序器完成了所有使能的步骤,用户可以决定是否定序器需要停止(one-shot),或者循环步骤重新开始
如果选择Single模式,那么程序装置将会自动设置step的使能位在一次转换之后。

12.3.5 中断
下面的中断可以通过使能位使能支持,同样也可以屏蔽
-用户按下触摸屏会产生触摸HW_PEN down中断
-触摸松开后由程序装置产生PEN_UP中断
-最后被激活的step处理完后会发出END_OF_SEQUENCE
-每个FIFO都有下溢和上溢中断
-每个FIFO都有一个可编程的阈值中断
-如果采样的数据大于或者小于编程好的数值,那么产生OUT_OF_RANGE中断

12.3.6 DMA 请求
可通过CPU或者DMA取每个FIFO的数据。为了产生DMA请求,用户必须首先使能TSC_ADC_SS_DMAENABLE_SET 寄存器。
同样,用户可以通过设置TSC_ADC_SS_DMAREQ 寄存器来设定产生DMA请求的字节数。当FIFO到达或者超过了这个值,
那么就会产生DMA请求。

DMA从接口为了有效的传输FIFO中的数据允许突发传输。DMA的地址被解码成FIFO0或者FIFO1的地址。
DMA的低位地址不用理会,因为指向FIFO的指针会自动的递增。DMA那一章有详细的介绍。

12.3.7 模拟前后(AFE)功能模块图
AFE的特性列举如下,其中一些被TSC_ADC_SS控制
-12位的ADC
-采样速率可以达到15个ADC时钟周期
-支持内部ADC时钟分频逻辑
-支持配置采样前时间和采样时间

12.4 操作模式
程序装置完全被软件控制,具体表现通过Step 寄存器控制。一个step是一个术语:取样一个通道的输入。
程序员可以决定哪一个哪一个输入数据需要发送到AFE(配置StepConfig寄存器),怎样(StepConfig)
什么时候(StepDelay)采样一个通道的输入。

一个step由三个寄存器组成:
-StepEnable:使能或者关闭step
-StepConfig:控制ADC的输入值(引用电压、上拉和下拉晶体管的偏置电压、哪个FIFO来存储数据)
-StepDelay:控制OpenDelay(驱动AFE输入到发送片上信号到AFE的时间)
控制SampleDelay(ADC采样输入信号的时间)

程序装置支持16个可编程的step,一个触摸Charge step、一个Idle step。除了Idle step没有StepEnable
和StepDelay外,其它的step都由三个寄存器组成(StepEnable, StepConfig, and StepDelay)。同样的,
在Idle和触摸Charge中,ADC实际上是不采样通道数据的。

假定所有的step都被设置为普通模式(没有触摸),那么所有的step将会使能SW模式。当TSC_ADC_SS使能后,
程序装置总是从Idle step开始,然后等待一个StepEnable[n]位开启。在一个step使能后,程序装置将会从
最小的step(1)开始一直到step(16)。如果某个step没有使能,那么程序装置会跳过它继续执行下一个。
如果所有的step都没有使能,那么程序装置将会保持在Idle step并应用Idle StepConfig设置。

假定只有触摸模式打开(没有普通模式的通道),那么steps可以被设置为硬件同步触发(映射到触摸事件)。
程序装置将会停在 IDLE 状态直到一个触摸按下事件产生然后开始HW step转换。触摸Charge step将会在
最后一个HW step完成后产生,然后回到Idle状态。(TS Charge step需要向触摸屏电容充电来使检测者检测
下一个触摸事件)

假定应用了一个混合模式(触摸和通用),用户可以控制steps为硬件触发(映射到触摸屏)或者软件使能。
如果程序装置在IDLE状态并且一个触摸事件发生了,HW steps总是按照从低到高的顺序首先被调度。
紧接着是TS Charge step。如果没有触摸事件,那么被使能的SW steps被调度。

如果程序装置正在处理软step,而此时一个硬件事件发生了,那么可以编程运行调度器抢占。如果硬件抢占位
被使能了,那么程序装置会先让当前处理的SW step完成,然后调用HW step。所有的HW step完成后再去重新
调用打断前的SW step。如果硬件抢占没有使能,那么触摸事件将会被忽略直到最后一个SW step处理完了。
如果SW step处理完之前触摸事件已经没了,那么这些触摸事件将会丢失。

即使没有触摸屏,用户依然可以配置steps为HW同步模式,这时可以把硬件同步映射为硬件输入信号。
硬件信号可以被驱动从时钟中断或者其它一些硬件IP,它们同样可以开始一个通道的转换。

当映射到一个硬件事件信号后,TSC_ADC_SS将会等待一个上升沿在它开始转换前。硬件输入信号被L4 OCP
时钟域捕捉,这个信号至少需要两个TSC_ADC_SS OCP 时钟才可能被捕捉到。

在最后一个被激活的step完成后,进入IDLE模式前,END_OF_SEQUENCE和PEN_UP中断将会产生。
END_OF_SEQUENCE中断并不意味着数据已经在FIFO(需要用FIFO中断和字计数寄存器)

12.4.1 PenCtrl and PenIRQ
PEN中断(应该是触摸中断)仅仅在正确的Pen 控制位是高的时候发生(TSC_ADC寄存器的5:6位有介绍)和
正确的对地晶体管偏置在StepConfig [N] 寄存器中被设置。参考应用手册来获取正确的配置。

如果一个step被设置成HW 同步,一旦从IDLE模式出来,程序装置将会不再管 PenCtrl 位。
程序装置将会自动屏蔽PenCtrl位(重写并关闭他们),所以ADC可以得到精准的测量数据从x和y通道。
在最后一个HW同步step完成后,程序装置将会变为TS Charge step 并且pen_overide屏蔽位被清除,
然后SW (bits 6:5)将会重新取得控制权。pen_irq将会被临时的忽略在TS Charge step 中。

下面有一个图特别重要:
触摸处理流程图

简单做个总结:am335x的触摸屏模块比起我以前用过的s3c2440还是高端了不少,它的核心其实就是19个step的设置。
这19个step分为三组:IDLE、CHARGE、和普通的step。其中前两个比较特殊,也是必须开启的step。
IDLE在触摸屏空闲时候会自动进入这个step,而CHARGE则是每次所有step处理完后在IDLE之前进入的STEP,
手册上说貌似是给触摸屏充电,反正差不多就这个意思,然后触摸屏才能重新响应中断。
而剩下的16个step则是来计算X坐标、Y坐标和压力值的step。官方给的驱动是所有的step全部用上了,
1-6个是用于求X,7-12用了求Y,13、14用来计算压力值。至于这些step寄存器的设置,就需要看这个章节给出的模块电路图了。
我测试了一下,其实X和Y的计算用2个step就够了。而奇怪的是它的中断:不能按照一般逻辑使用按下和松开中断来操控,
而是必须像官方驱动似的用FIFO的溢出中断,这点我没想明白是为什么。

0 0