RUNONMIPS 发表于 2011-03-31 16:04

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,请各位帮忙分析一下。。。谢谢

RUNONMIPS 发表于 2011-03-31 16:45

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

garyv 发表于 2011-03-31 22:53

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

RUNONMIPS 发表于 2011-04-01 19:59

回复 3# garyv


    关键是两个设备要同时设置模式寄存器,取数据的时候也是同一个寄存器,所以是有必要加锁的。这个问题不是锁造成的原因,加锁前后已经把寄存器的值保存并恢复,所以才没有变化。
结束
页: [1]
查看完整版本: mutex_lock为什么会影响寄存器的设置