|
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 可以向应用层拷贝你的事件值 |
|