免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3279 | 回复: 3
打印 上一主题 下一主题

mutex_lock为什么会影响寄存器的设置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-31 16:04 |只看该作者 |倒序浏览
由于触摸屏和电池都要用到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,请各位帮忙分析一下。。。谢谢

论坛徽章:
0
2 [报告]
发表于 2011-03-31 16:45 |只看该作者
补充一下,触摸屏驱动和ADC驱动的probe中,都用函数ioremap()对物理地址进行了映射

论坛徽章:
0
3 [报告]
发表于 2011-03-31 22:53 |只看该作者
一路ADC能同时对两路模拟信号做AD转换吗?应该不止一路AD吧,如果是两路的话,就不需要mutex了

论坛徽章:
0
4 [报告]
发表于 2011-04-01 19:59 |只看该作者
回复 3# garyv


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP