主题 : 阅读触摸屏驱动遇到的诸多问题 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 27691
精华: 0
发帖: 88
金钱: 450 两
威望: 90 点
综合积分: 176 分
注册时间: 2010-08-30
最后登录: 2014-01-14
楼主  发表于: 2010-09-14 18:47

 阅读触摸屏驱动遇到的诸多问题

看了两天触摸屏驱动程序,提出以下疑问,望有心人解答:

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.aiothome.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子系统,那么在应用层如何获得驱动传来的事件值?这个问题如果嫌麻烦,可以不答,我自己查资料
描述:触摸屏驱动
附件: ts.rar (2 K) 下载次数:18