[prev in list] [next in list] [prev in thread] [next in thread]
List: comedi
Subject: Driver for ISA card PCL 730
From: Francisco Garcia-Lagos <lagos () dte ! uma ! es>
Date: 2003-08-22 9:27:01
[Download RAW message or body]
Hello all.
First of all, I write a similar message several week ago, but the problem
persist.
I am writing a comedi driver for pcl-730 Advantech card. It's a 32 digital
inputs (16 isolated and 16 non isolated) and 32 digital outputs (16
isolated and 16 non isolated) card. It's a ISA card (no PCI).
I write the driver beginning with pcm3770, as was suggested by a post in
this mailing list. Now, when a finish the driver, I need to test that all
is correct. I configure de driver using the following instructions as a root:
modprobe pcl730
comedi_config /dev/comedi0 pcl730 0x210
(the card was configured to base address 0x210).
To test the driver I use the example monitor program, available in the
comedi examples directory. Without connect anything (that is, if I not
connect any input or output in the card), the program print always 0 for
digital output, and for some digital input print 0 and for other print 1. I
think this can be an error.
Now, if I connect some inputs to 0 volt or to 5 volt, using the 27-d cable
and a protoboard, dc power supply, etc, the information printed by the
program doesn't change.
I am not sure what is the problem, this seem like the inputs of the card
are not detected properly. Also, if a change the output of the card, I
can't detect its by a multimeter.
Please, can someone help me with this error?
Fran.
["pcl730.c" (text/plain)]
/*
* Driver for PCL-730 and clones
* Blaine Lee
* from pcm3730 by Blaine Lee
*/
/*
Driver: pcl730.o
Description: PCL-730
Author: Francisco Garcia-Lagos
Devices: [Advantech] PCL-730 (pcl730)
Status: under development
Configuration options:
[0] - I/O port base
*/
#include <linux/comedidev.h>
#include <linux/ioport.h>
#define PCL730_SIZE 4 // consecutive io port addresses - without timer
#define PCL730_DOA 0 // offsets for each port
#define PCL730_DOB 1
#define PCL730_DOC 2
#define PCL730_DOD 3
#define PCL730_DIA 0
#define PCL730_DIB 1
#define PCL730_DIC 2
#define PCL730_DID 3
static int pcl730_attach(comedi_device *dev,comedi_devconfig *it);
static int pcl730_detach(comedi_device *dev);
static comedi_driver driver_pcl730={
driver_name: "pcl730",
module: THIS_MODULE,
attach: pcl730_attach,
detach: pcl730_detach,
};
COMEDI_INITCLEANUP(driver_pcl730);
static int pcl730_do_insn_bits(comedi_device *dev,comedi_subdevice *s,
comedi_insn *insn,lsampl_t *data)
{
if(insn->n!=2)return -EINVAL;
if(data[0]){
s->state &= ~data[0];
s->state |= (data[0]&data[1]);
outb(s->state,dev->iobase+(int)(s->private));
}
data[1] = s->state;
return 2;
}
static int pcl730_di_insn_bits(comedi_device *dev,comedi_subdevice *s,
comedi_insn *insn,lsampl_t *data)
{
if(insn->n!=2)return -EINVAL;
data[1] = inb(dev->iobase+(int)(s->private));
return 2;
}
static int pcl730_attach(comedi_device *dev,comedi_devconfig *it)
{
comedi_subdevice *s;
int iobase;
iobase=it->options[0];
printk("comedi%d: pcl730: 0x%04x ",dev->minor,iobase);
if(check_region(iobase,PCL730_SIZE)<0){
printk("I/O port conflict\n");
return -EIO;
}
request_region(iobase,PCL730,"pcl730");
dev->iobase=iobase;
dev->board_name="pcl730";
dev->iobase=dev->iobase;
dev->irq=0;
dev->n_subdevices=8;
if(alloc_subdevices(dev)<0)
return -ENOMEM;
s=dev->subdevices+0;
s->type=COMEDI_SUBD_DO;
s->subdev_flags=SDF_WRITABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_do_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DOA;
s=dev->subdevices+1;
s->type=COMEDI_SUBD_DO;
s->subdev_flags=SDF_WRITABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_do_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DOB;
s=dev->subdevices+2;
s->type=COMEDI_SUBD_DO;
s->subdev_flags=SDF_WRITABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_do_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DOC;
s=dev->subdevices+3;
s->type=COMEDI_SUBD_DO;
s->subdev_flags=SDF_WRITABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_do_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DOD;
s=dev->subdevices+4;
s->type=COMEDI_SUBD_DI;
s->subdev_flags=SDF_READABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_di_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DIA;
s=dev->subdevices+5;
s->type=COMEDI_SUBD_DI;
s->subdev_flags=SDF_READABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_di_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DIB;
s=dev->subdevices+6;
s->type=COMEDI_SUBD_DI;
s->subdev_flags=SDF_READABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_di_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DIC;
s=dev->subdevices+7;
s->type=COMEDI_SUBD_DI;
s->subdev_flags=SDF_READABLE;
s->maxdata=1;
s->n_chan=8;
s->insn_bits = pcl730_di_insn_bits;
s->range_table=&range_digital;
s->private = (void *) PCL730_DID;
printk("\n");
return 0;
}
static int pcm3730_detach(comedi_device *dev)
{
printk("comedi%d: pcl730: remove\n",dev->minor);
if(dev->iobase)
release_region(dev->iobase,PCL730_SIZE);
return 0;
}
_______________________________________________
comedi mailing list
comedi@comedi.org
https://cvs.comedi.org/cgi-bin/mailman/listinfo/comedi
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic