天嵌 ARM开发社区

 找回密码
 注册
查看: 2488|回复: 6

阅读触摸屏驱动程序遇到的问题

[复制链接]
zhoujiaxg 发表于 2010-9-14 18:57:27 | 显示全部楼层 |阅读模式
看了两天触摸屏驱动程序,提出以下疑问,望有心人解答:

1、在ADC转换前,触摸屏使用晶振时钟(3.68MHz),在AD转换中使用GCLK(最大50MHz)。ADC中断设置了值后,在启动ADC转换
即ADCCON|=0X01后,延迟1/CLK*ADCDLY时间后开始AD转换。这个延迟时间应该主要是用来对触摸屏按下防抖用的吧!
问题a:我对延迟时间的作用理解对么?
问题b:延迟时间的计算公式中CLK应该用3.68M还是50M?

2、触摸屏驱动程序中用到了物理地址到I/O虚拟内存的映射static void __iomem *base_addr;base_addr=ioremap(S3C2410_PA_ADC,0x20);
在相关头文件中有#define S3C2410_PA_ADC     (0x58000000) ,0x58000000恰好为ADC控制寄存器的段地址。应该可以理解为外部设备的物理地址吧。
后面对I/O内存的读写函数都是在基地址上+S3C2410_ADCCON之类的宏来寻找寄存器映射到内存空间的地址。S3C2410_ADCCON是相对于S3C2410_PA_ADC的偏移量
#define S3C2410_ADCREG(x) (x)
#define S3C2410_ADCCON     S3C2410_ADCREG(0x00)
问题a:我上面的解释对吗?
问题b:在论坛http://www.arm9home.net/read.php?tid-3113.html帖子中的TIMER0驱动中,有类似outl(Ftclk,S3C2410_TCNTB(0));  I/O端口操作。
查找S3C2410_TCNTB(0),最终找到  #define S3C_ADDR_BASE   (0xF4000000)的基地址,跟定时器控制器基地址0x51000000不同。那么,
outl(Ftclk,S3C2410_TCNTB(0))这个操作是怎样将Ftclk值装入定时器寄存器TCNTB0中的?

3、触摸屏驱动程序中用到了信号量extern struct semaphore ADC_LOCK;而程序中并没有对信号量进行初始化;这样信号量能正常使用吗?
IRQ_TC中断函数里面up(&ADC_LOCK)永远不可能执行,我看网上解释说,光标抬起会执行释放信号量。但是光标抬起中断发生后,你必须得通过down_trylock()&ADC_LOCK)
来获取信号量才能进入if语句,进不了if语句,怎么可能执行下面的up语句。但是事实上驱动是可以正常工作的,后来我看出来了,在timer中断函数中也可以检测光标抬起来释放
信号量。
问题:信号量可以不初始化吗?我程序分析得对吗?

4、驱动程序中用到了input子系统,那么在应用层如何获得驱动传来的事件值?这个问题如果嫌麻烦,可以不答,我自己查资料

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| zhoujiaxg 发表于 2010-9-15 00:36:07 | 显示全部楼层
版主,拜托,能帮我看下么~每次都等好久好久,我想重复发帖吸引你的注意力了:sleepy:
天嵌_support1 发表于 2010-9-15 10:35:48 | 显示全部楼层
2# zhoujiaxg


版主会看,你的问题是多了些。容许个时间,讨论进步。
天嵌_support1 发表于 2010-9-15 10:45:15 | 显示全部楼层
2# zhoujiaxg


重复发帖会被屏蔽了
 楼主| zhoujiaxg 发表于 2010-9-15 13:52:36 | 显示全部楼层
4# embedsky_lxt
那你记得帮我看看,别忘了哦:)
slesre 发表于 2010-11-12 22:27:43 | 显示全部楼层
问题问的好啊
天嵌_support1 发表于 2010-11-13 10:57:32 | 显示全部楼层
1# zhoujiaxg


1、在ADC转换前,触摸屏使用晶振时钟(3.68MHz),在AD转换中使用GCLK(最大50MHz)。ADC中断设置了值后,在启动ADC转换
即ADCCON|=0X01后,延迟1/CLK*ADCDLY时间后开始AD转换。这个延迟时间应该主要是用来对触摸屏按下防抖用的吧!
问题a:我对延迟时间的作用理解对么?
问题b:延迟时间的计算公式中CLK应该用3.68M还是50M?

答a: 你的理解是对的
答b: 是使用3.68M

2、触摸屏驱动程序中用到了物理地址到I/O虚拟内存的映射static void __iomem *base_addr;base_addr=ioremap(S3C2410_PA_ADC,0x20);
在相关头文件中有#define S3C2410_PA_ADC     (0x58000000) ,0x58000000恰好为ADC控制寄存器的段地址。应该可以理解为外部设备的物理地址吧。
后面对I/O内存的读写函数都是在基地址上+S3C2410_ADCCON之类的宏来寻找寄存器映射到内存空间的地址。S3C2410_ADCCON是相对于S3C2410_PA_ADC的偏移量
#define S3C2410_ADCREG(x) (x)
#define S3C2410_ADCCON     S3C2410_ADCREG(0x00)
问题a:我上面的解释对吗?
问题b:在论坛http://www.arm9home.net/read.php?tid-3113.html帖子中的TIMER0驱动中,有类似outl(Ftclk,S3C2410_TCNTB(0));  I/O端口操作。
查找S3C2410_TCNTB(0),最终找到  #define S3C_ADDR_BASE   (0xF4000000)的基地址,跟定时器控制器基地址0x51000000不同。那么,
outl(Ftclk,S3C2410_TCNTB(0))这个操作是怎样将Ftclk值装入定时器寄存器TCNTB0中的?

答a: 基址+偏移量,计算出它在IO中的地址,对的
答B: S3C2410_TCNTB(x)是一个宏定义 , arch/arm/plat-s3c/include/plat/regs-timer.h 文件中, 它可以定位到 TCNTBn的位置中。

3、触摸屏驱动程序中用到了信号量extern struct semaphore ADC_LOCK;而程序中并没有对信号量进行初始化;这样信号量能正常使用吗?
IRQ_TC中断函数里面up(&ADC_LOCK)永远不可能执行,我看网上解释说,光标抬起会执行释放信号量。但是光标抬起中断发生后,你必须得通过down_trylock()&ADC_LOCK)
来获取信号量才能进入if语句,进不了if语句,怎么可能执行下面的up语句。但是事实上驱动是可以正常工作的,后来我看出来了,在timer中断函数中也可以检测光标抬起来释放
信号量。
问题:信号量可以不初始化吗?我程序分析得对吗?
答: DECLARE_MUTEX(name). 该宏声明一个信号量name并初始化它的值为0

4、驱动程序中用到了input子系统,那么在应用层如何获得驱动传来的事件值?这个问题如果嫌麻烦,可以不答,我自己查资料
答: 可以通过传递参数,copy_to_user 可以向应用层拷贝你的事件值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-12 17:55 , Processed in 1.037150 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表