ni_labpc_cs.c revision 1ac71e5a35eebee60cdcf15b3980bd94498f037b
1/* 2 comedi/drivers/ni_labpc_cs.c 3 Driver for National Instruments daqcard-1200 boards 4 Copyright (C) 2001, 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net> 5 6 PCMCIA crap is adapted from dummy_cs.c 1.31 2001/08/24 12:13:13 7 from the pcmcia package. 8 The initial developer of the pcmcia dummy_cs.c code is David A. Hinds 9 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 10 are Copyright (C) 1999 David A. Hinds. 11 12 This program is free software; you can redistribute it and/or modify 13 it under the terms of the GNU General Public License as published by 14 the Free Software Foundation; either version 2 of the License, or 15 (at your option) any later version. 16 17 This program is distributed in the hope that it will be useful, 18 but WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 GNU General Public License for more details. 21 22 You should have received a copy of the GNU General Public License 23 along with this program; if not, write to the Free Software 24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 25 26************************************************************************ 27*/ 28/* 29Driver: ni_labpc_cs 30Description: National Instruments Lab-PC (& compatibles) 31Author: Frank Mori Hess <fmhess@users.sourceforge.net> 32Devices: [National Instruments] DAQCard-1200 (daqcard-1200) 33Status: works 34 35Thanks go to Fredrik Lingvall for much testing and perseverance in 36helping to debug daqcard-1200 support. 37 38The 1200 series boards have onboard calibration dacs for correcting 39analog input/output offsets and gains. The proper settings for these 40caldacs are stored on the board's eeprom. To read the caldac values 41from the eeprom and store them into a file that can be then be used by 42comedilib, use the comedi_calibrate program. 43 44Configuration options: 45 none 46 47The daqcard-1200 has quirky chanlist requirements 48when scanning multiple channels. Multiple channel scan 49sequence must start at highest channel, then decrement down to 50channel 0. Chanlists consisting of all one channel 51are also legal, and allow you to pace conversions in bursts. 52 53*/ 54 55/* 56 57NI manuals: 58340988a (daqcard-1200) 59 60*/ 61 62#undef LABPC_DEBUG /* debugging messages */ 63 64#include "../comedidev.h" 65 66#include <linux/delay.h> 67#include <linux/slab.h> 68 69#include "8253.h" 70#include "8255.h" 71#include "comedi_fc.h" 72#include "ni_labpc.h" 73 74#include <pcmcia/cistpl.h> 75#include <pcmcia/cisreg.h> 76#include <pcmcia/ds.h> 77 78static struct pcmcia_device *pcmcia_cur_dev; 79 80static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it); 81 82static const struct labpc_board_struct labpc_cs_boards[] = { 83 { 84 .name = "daqcard-1200", 85 .device_id = 0x103, /* 0x10b is manufacturer id, 86 0x103 is device id */ 87 .ai_speed = 10000, 88 .bustype = pcmcia_bustype, 89 .register_layout = labpc_1200_layout, 90 .has_ao = 1, 91 .ai_range_table = &range_labpc_1200_ai, 92 .ai_range_code = labpc_1200_ai_gain_bits, 93 .ai_range_is_unipolar = labpc_1200_is_unipolar, 94 .ai_scan_up = 0, 95 .memory_mapped_io = 0, 96 }, 97 /* duplicate entry, to support using alternate name */ 98 { 99 .name = "ni_labpc_cs", 100 .device_id = 0x103, 101 .ai_speed = 10000, 102 .bustype = pcmcia_bustype, 103 .register_layout = labpc_1200_layout, 104 .has_ao = 1, 105 .ai_range_table = &range_labpc_1200_ai, 106 .ai_range_code = labpc_1200_ai_gain_bits, 107 .ai_range_is_unipolar = labpc_1200_is_unipolar, 108 .ai_scan_up = 0, 109 .memory_mapped_io = 0, 110 }, 111}; 112 113/* 114 * Useful for shorthand access to the particular board structure 115 */ 116#define thisboard ((const struct labpc_board_struct *)dev->board_ptr) 117 118static struct comedi_driver driver_labpc_cs = { 119 .driver_name = "ni_labpc_cs", 120 .module = THIS_MODULE, 121 .attach = &labpc_attach, 122 .detach = &labpc_common_detach, 123 .num_names = ARRAY_SIZE(labpc_cs_boards), 124 .board_name = &labpc_cs_boards[0].name, 125 .offset = sizeof(struct labpc_board_struct), 126}; 127 128static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it) 129{ 130 unsigned long iobase = 0; 131 unsigned int irq = 0; 132 struct pcmcia_device *link; 133 134 /* allocate and initialize dev->private */ 135 if (alloc_private(dev, sizeof(struct labpc_private)) < 0) 136 return -ENOMEM; 137 138 /* get base address, irq etc. based on bustype */ 139 switch (thisboard->bustype) { 140 case pcmcia_bustype: 141 link = pcmcia_cur_dev; /* XXX hack */ 142 if (!link) 143 return -EIO; 144 iobase = link->resource[0]->start; 145 irq = link->irq; 146 break; 147 default: 148 printk("bug! couldn't determine board type\n"); 149 return -EINVAL; 150 break; 151 } 152 return labpc_common_attach(dev, iobase, irq, 0); 153} 154 155/*====================================================================*/ 156 157/* 158 The event() function is this driver's Card Services event handler. 159 It will be called by Card Services when an appropriate card status 160 event is received. The config() and release() entry points are 161 used to configure or release a socket, in response to card 162 insertion and ejection events. They are invoked from the dummy 163 event handler. 164 165 Kernel version 2.6.16 upwards uses suspend() and resume() functions 166 instead of an event() function. 167*/ 168 169static void labpc_config(struct pcmcia_device *link); 170static void labpc_release(struct pcmcia_device *link); 171static int labpc_cs_suspend(struct pcmcia_device *p_dev); 172static int labpc_cs_resume(struct pcmcia_device *p_dev); 173 174/* 175 The attach() and detach() entry points are used to create and destroy 176 "instances" of the driver, where each instance represents everything 177 needed to manage one actual PCMCIA card. 178*/ 179 180static int labpc_cs_attach(struct pcmcia_device *); 181static void labpc_cs_detach(struct pcmcia_device *); 182 183/* 184 You'll also need to prototype all the functions that will actually 185 be used to talk to your device. See 'memory_cs' for a good example 186 of a fully self-sufficient driver; the other drivers rely more or 187 less on other parts of the kernel. 188*/ 189 190struct local_info_t { 191 struct pcmcia_device *link; 192 int stop; 193 struct bus_operations *bus; 194}; 195 196/*====================================================================== 197 198 labpc_cs_attach() creates an "instance" of the driver, allocating 199 local data structures for one device. The device is registered 200 with Card Services. 201 202 The dev_link structure is initialized, but we don't actually 203 configure the card at this point -- we wait until we receive a 204 card insertion event. 205 206======================================================================*/ 207 208static int labpc_cs_attach(struct pcmcia_device *link) 209{ 210 struct local_info_t *local; 211 212 dev_dbg(&link->dev, "labpc_cs_attach()\n"); 213 214 /* Allocate space for private device-specific data */ 215 local = kzalloc(sizeof(struct local_info_t), GFP_KERNEL); 216 if (!local) 217 return -ENOMEM; 218 local->link = link; 219 link->priv = local; 220 221 pcmcia_cur_dev = link; 222 223 labpc_config(link); 224 225 return 0; 226} /* labpc_cs_attach */ 227 228/*====================================================================== 229 230 This deletes a driver "instance". The device is de-registered 231 with Card Services. If it has been released, all local data 232 structures are freed. Otherwise, the structures will be freed 233 when the device is released. 234 235======================================================================*/ 236 237static void labpc_cs_detach(struct pcmcia_device *link) 238{ 239 dev_dbg(&link->dev, "labpc_cs_detach\n"); 240 241 /* 242 If the device is currently configured and active, we won't 243 actually delete it yet. Instead, it is marked so that when 244 the release() function is called, that will trigger a proper 245 detach(). 246 */ 247 ((struct local_info_t *)link->priv)->stop = 1; 248 labpc_release(link); 249 250 /* This points to the parent local_info_t struct (may be null) */ 251 kfree(link->priv); 252 253} /* labpc_cs_detach */ 254 255/*====================================================================== 256 257 labpc_config() is scheduled to run after a CARD_INSERTION event 258 is received, to configure the PCMCIA socket, and to make the 259 device available to the system. 260 261======================================================================*/ 262 263static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev, 264 cistpl_cftable_entry_t *cfg, 265 cistpl_cftable_entry_t *dflt, 266 unsigned int vcc, 267 void *priv_data) 268{ 269 if (cfg->index == 0) 270 return -ENODEV; 271 272 /* Does this card need audio output? */ 273 if (cfg->flags & CISTPL_CFTABLE_AUDIO) 274 p_dev->config_flags |= CONF_ENABLE_SPKR; 275 276 /* Do we need to allocate an interrupt? */ 277 p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; 278 279 /* IO window settings */ 280 p_dev->resource[0]->end = p_dev->resource[1]->end = 0; 281 if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { 282 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; 283 p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; 284 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; 285 p_dev->resource[0]->flags |= 286 pcmcia_io_cfg_data_width(io->flags); 287 p_dev->resource[0]->start = io->win[0].base; 288 p_dev->resource[0]->end = io->win[0].len; 289 if (io->nwin > 1) { 290 p_dev->resource[1]->flags = p_dev->resource[0]->flags; 291 p_dev->resource[1]->start = io->win[1].base; 292 p_dev->resource[1]->end = io->win[1].len; 293 } 294 /* This reserves IO space but doesn't actually enable it */ 295 if (pcmcia_request_io(p_dev) != 0) 296 return -ENODEV; 297 } 298 299 /* If we got this far, we're cool! */ 300 return 0; 301} 302 303 304static void labpc_config(struct pcmcia_device *link) 305{ 306 int ret; 307 308 dev_dbg(&link->dev, "labpc_config\n"); 309 310 ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL); 311 if (ret) { 312 dev_warn(&link->dev, "no configuration found\n"); 313 goto failed; 314 } 315 316 if (!link->irq) 317 goto failed; 318 319 /* 320 This actually configures the PCMCIA socket -- setting up 321 the I/O windows and the interrupt mapping, and putting the 322 card and host interface into "Memory and IO" mode. 323 */ 324 p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; 325 ret = pcmcia_enable_device(link); 326 if (ret) 327 goto failed; 328 329 /* Finally, report what we've done */ 330 dev_info(&link->dev, "index 0x%02x", link->config_index); 331 printk(", irq %d", link->irq); 332 if (link->resource[0]) 333 printk(" & %pR", link->resource[0]); 334 if (link->resource[1]) 335 printk(" & %pR", link->resource[1]); 336 printk("\n"); 337 338 return; 339 340failed: 341 labpc_release(link); 342 343} /* labpc_config */ 344 345static void labpc_release(struct pcmcia_device *link) 346{ 347 dev_dbg(&link->dev, "labpc_release\n"); 348 349 pcmcia_disable_device(link); 350} /* labpc_release */ 351 352/*====================================================================== 353 354 The card status event handler. Mostly, this schedules other 355 stuff to run after an event is received. 356 357 When a CARD_REMOVAL event is received, we immediately set a 358 private flag to block future accesses to this device. All the 359 functions that actually access the device should check this flag 360 to make sure the card is still present. 361 362======================================================================*/ 363 364static int labpc_cs_suspend(struct pcmcia_device *link) 365{ 366 struct local_info_t *local = link->priv; 367 368 /* Mark the device as stopped, to block IO until later */ 369 local->stop = 1; 370 return 0; 371} /* labpc_cs_suspend */ 372 373static int labpc_cs_resume(struct pcmcia_device *link) 374{ 375 struct local_info_t *local = link->priv; 376 377 local->stop = 0; 378 return 0; 379} /* labpc_cs_resume */ 380 381/*====================================================================*/ 382 383static struct pcmcia_device_id labpc_cs_ids[] = { 384 /* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */ 385 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103), /* daqcard-1200 */ 386 PCMCIA_DEVICE_NULL 387}; 388 389MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids); 390MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>"); 391MODULE_DESCRIPTION("Comedi driver for National Instruments Lab-PC"); 392MODULE_LICENSE("GPL"); 393 394struct pcmcia_driver labpc_cs_driver = { 395 .probe = labpc_cs_attach, 396 .remove = labpc_cs_detach, 397 .suspend = labpc_cs_suspend, 398 .resume = labpc_cs_resume, 399 .id_table = labpc_cs_ids, 400 .owner = THIS_MODULE, 401 .drv = { 402 .name = "daqcard-1200", 403 }, 404}; 405 406static int __init init_labpc_cs(void) 407{ 408 pcmcia_register_driver(&labpc_cs_driver); 409 return 0; 410} 411 412static void __exit exit_labpc_cs(void) 413{ 414 pcmcia_unregister_driver(&labpc_cs_driver); 415} 416 417int __init labpc_init_module(void) 418{ 419 int ret; 420 421 ret = init_labpc_cs(); 422 if (ret < 0) 423 return ret; 424 425 return comedi_driver_register(&driver_labpc_cs); 426} 427 428void __exit labpc_exit_module(void) 429{ 430 exit_labpc_cs(); 431 comedi_driver_unregister(&driver_labpc_cs); 432} 433 434module_init(labpc_init_module); 435module_exit(labpc_exit_module); 436