[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