当前位置:  技术问答>linux和unix

共享中断还是有冲突

    来源: 互联网  发布时间:2016-07-25

    本文导语:  本帖最后由 wenxy1 于 2009-12-30 15:30:25 编辑 我用的华天正电子科技生产的RealARM开发板,移植他提供的linux系统(2.4.18)。里面带了触摸屏驱动,我想再加上ADC驱动。但是加了ADC驱动到内核后,触摸屏不能使用了,没有反...

本帖最后由 wenxy1 于 2009-12-30 15:30:25 编辑
我用的华天正电子科技生产的RealARM开发板,移植他提供的linux系统(2.4.18)。里面带了触摸屏驱动,我想再加上ADC驱动。但是加了ADC驱动到内核后,触摸屏不能使用了,没有反应。今天我试了把触摸屏驱动里的中断和ADC驱动里的中断设置成共享中断。还是加了ADC到内核,触摸屏不能使用。这是为什么呢?
我现在把我的驱动贴出来:
ADC驱动:

/*
* s3c2410-adc.c
*
* S3C2410 ADC
*  exclusive with s3c2410-ts.c
*
* Author: SeonKon Choi 
* Date  : $Date: 2003/01/20 14:24:49 $
*
* $Revision: 1.1.2.6 $
*
2004-6-14 add a device by threewater 

  Fri Dec 03 2002 SeonKon Choi 
  - initial
  
*
* This file is subject to the terms and conditions of the GNU General Public
* License.  See the file COPYING in the main directory of this archive
* for more details.
*/
#include 
#include 
#include 
#include 

#include 
#include 
#include 

#include 
#include 
#include 

#include "s3c2410-adc.h"

#undef DEBUG
//#define DEBUG
#ifdef DEBUG
#define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);}
#else
#define DPRINTK(x...) (void)(0)
#endif

#define DEVICE_NAME "s3c2410-adc"
#define ADCRAW_MINOR 1

static int adcMajor = 0;

typedef struct {
struct semaphore lock;
wait_queue_head_t wait;
int channel;
int prescale;
}ADC_DEV;

static ADC_DEV adcdev;

#define START_ADC_AIN(ch, prescale) 
do{ 
ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT((ch)) ; 
ADCCON |= ADC_START; 
}while(0)

static void adcdone_int_handler(int irq, void *dev_id, struct pt_regs *reg)
{
if(strcmp(dev_id,DEVICE_NAME)!=0)
        return -1;
wake_up(&adcdev.wait);
}

static ssize_t s3c2410_adc_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
{
int data;

if(count!=sizeof(data)){
//error input data size
DPRINTK("the size of  input data must be %dn", sizeof(data));
return 0;
}

copy_from_user(&data, buffer, count);
adcdev.channel=ADC_WRITE_GETCH(data);
adcdev.prescale=ADC_WRITE_GETPRE(data);

DPRINTK("set adc channel=%d, prescale=0x%xn", adcdev.channel, adcdev.prescale);

return count;
}

static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
int ret = 0;

if (down_interruptible(&adcdev.lock))
return -ERESTARTSYS;

START_ADC_AIN(adcdev.channel, adcdev.prescale);
interruptible_sleep_on(&adcdev.wait);

ret = ADCDAT0;
ret &= 0x3ff;
DPRINTK("AIN[%d] = 0x%04x, %dn", adcdev.channel, ret, ADCCON & 0x80 ? 1:0);

copy_to_user(buffer, (char *)&ret, sizeof(ret));

up(&adcdev.lock);

return sizeof(ret);
}

static int s3c2410_adc_open(struct inode *inode, struct file *filp)
{
init_MUTEX(&adcdev.lock);
init_waitqueue_head(&(adcdev.wait));

adcdev.channel=0;
adcdev.prescale=0xff;

MOD_INC_USE_COUNT;
DPRINTK( "adc openedn");
return 0;
}

static int s3c2410_adc_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
DPRINTK( "adc closedn");
return 0;
}


static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
open: s3c2410_adc_open,
read: s3c2410_adc_read,
write: s3c2410_adc_write,
release: s3c2410_adc_release,
};

#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_adc_dir, devfs_adcraw;
#endif

int __init s3c2410_adc_init(void)
{
int ret;

/* normal ADC */
ADCTSC = 0; //XP_PST(NOP_MODE);

ret = request_irq(IRQ_ADC_DONE, adcdone_int_handler, SA_SHIRQ, DEVICE_NAME, NULL);
if (ret) {
return ret;
}

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);
if (ret 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 进程数据同步:消息队列还是共享内存+信号
  • 求助:已经安装了共享库,还是提示“Unable to load library”
  • 还是关于linux共享库版本化的问题,有重谢
  • 初学请教:samba配置好后,为何windows还是无法看到linux的共享资源呢
  • Linux 共享内存介绍及实现代码
  • NFS共享作业时, 在客户端只可以看到服务器端的共享目录,而看不到共享目录下的内容.?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • 如何共享 共享库(*.so)中的变量?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?
  • 用samba共享其它机子访问Linux共享时,机子可以进入,但要打开共享文件夹时提示“无法访问...找不到网络名。”这是什么原因呢?
  • 局域网中的红旗2.0如何共享到win98服务器的联接共享?
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?解决立即给分
  • 几个servlet共享一些数据 如我从数据库里读出一些重要的设置存入vector 让几个servlet共享 怎么做到?先谢
  • 求助linux普通用户下内存共享(系统V共享)大家进来看看啊!急!!
  • 不同用户user之间如何访问共享内存?
  • 无法访问samba服务器中的共享文件夹
  • XP下设置与linux 本地连接的Internet共享问题
  • Unix/linux下如何监测共享内存的使用情况
  • 【求助】linux下什么是共享内存,怎么查看。
  • 我想知道LINUX如何与WIN98,WIN2000共享资源?
  • 判断共享内存中是否有数据
  • 多进程共享变量
  • 共享内存问题,高手们请进!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3