mutex_lock为什么会影响寄存器的设置

发布于 2022-09-30 18:37:42 字数 624 浏览 16 评论 0

由于触摸屏和电池都要用到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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倦话 2022-10-07 18:37:42

补充一下,触摸屏驱动和ADC驱动的probe中,都用函数ioremap()对物理地址进行了映射

饭团 2022-10-07 18:37:42

一路ADC能同时对两路模拟信号做AD转换吗?应该不止一路AD吧,如果是两路的话,就不需要mutex了

只怪假的太真实 2022-10-07 18:37:42

回复 3# garyv

    关键是两个设备要同时设置模式寄存器,取数据的时候也是同一个寄存器,所以是有必要加锁的。这个问题不是锁造成的原因,加锁前后已经把寄存器的值保存并恢复,所以才没有变化。
结束

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文