mutex_lock为什么会影响寄存器的设置
由于触摸屏和电池都要用到ADC,所以我打算把触摸屏驱动中所有的ADC操作都提取出来,做一个公用的函数(ADCConvert())来让这两个驱动使用,然后将函数中的ADC操作用mutex_lock实现互斥:(这个公用的函数放在ADC的驱动文件中)
extern int ADCConvert(int cmd){
mutex_lock(&adc_mutex);
switch(cmd) {
case 1:
.....ADC寄存器的操作,取样,转换,上报的过程
case 2:
writel(0xd3, ts_base+S3C_ADCTSC);
}
mutex_unlock(&adc_mutex);
}
但现在碰到一个问题,在触摸屏驱动的probe函数中有一个设置按下中断检测的操作:writel(0xd3, ts_base+S3C_ADCTSC);。我把这句代码移到ADCConvert(2)中,取而代之的是对这个函数的调用。但函数调用后S3C_ADCTSC的寄存器的内容并没有改变(没有变为0xd3);如果把锁去掉,S3C_ADCTSC寄存器 的值就能设置成0xd3,请各位帮忙分析一下。。。谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
补充一下,触摸屏驱动和ADC驱动的probe中,都用函数ioremap()对物理地址进行了映射
一路ADC能同时对两路模拟信号做AD转换吗?应该不止一路AD吧,如果是两路的话,就不需要mutex了
回复 3# garyv
关键是两个设备要同时设置模式寄存器,取数据的时候也是同一个寄存器,所以是有必要加锁的。这个问题不是锁造成的原因,加锁前后已经把寄存器的值保存并恢复,所以才没有变化。
结束