ni_labpc_cs.c revision 00990e7ce0b0e596fe41d9c64d6933ea70084003
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 void *priv_data) 265{ 266 if (p_dev->config_index == 0) 267 return -EINVAL; 268 269 return pcmcia_request_io(p_dev); 270} 271 272 273static void labpc_config(struct pcmcia_device *link) 274{ 275 int ret; 276 277 dev_dbg(&link->dev, "labpc_config\n"); 278 279 link->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ | 280 CONF_AUTO_AUDIO | CONF_AUTO_SET_IO; 281 282 ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL); 283 if (ret) { 284 dev_warn(&link->dev, "no configuration found\n"); 285 goto failed; 286 } 287 288 if (!link->irq) 289 goto failed; 290 291 /* 292 This actually configures the PCMCIA socket -- setting up 293 the I/O windows and the interrupt mapping, and putting the 294 card and host interface into "Memory and IO" mode. 295 */ 296 ret = pcmcia_enable_device(link); 297 if (ret) 298 goto failed; 299 300 /* Finally, report what we've done */ 301 dev_info(&link->dev, "index 0x%02x", link->config_index); 302 printk(", irq %d", link->irq); 303 if (link->resource[0]) 304 printk(" & %pR", link->resource[0]); 305 if (link->resource[1]) 306 printk(" & %pR", link->resource[1]); 307 printk("\n"); 308 309 return; 310 311failed: 312 labpc_release(link); 313 314} /* labpc_config */ 315 316static void labpc_release(struct pcmcia_device *link) 317{ 318 dev_dbg(&link->dev, "labpc_release\n"); 319 320 pcmcia_disable_device(link); 321} /* labpc_release */ 322 323/*====================================================================== 324 325 The card status event handler. Mostly, this schedules other 326 stuff to run after an event is received. 327 328 When a CARD_REMOVAL event is received, we immediately set a 329 private flag to block future accesses to this device. All the 330 functions that actually access the device should check this flag 331 to make sure the card is still present. 332 333======================================================================*/ 334 335static int labpc_cs_suspend(struct pcmcia_device *link) 336{ 337 struct local_info_t *local = link->priv; 338 339 /* Mark the device as stopped, to block IO until later */ 340 local->stop = 1; 341 return 0; 342} /* labpc_cs_suspend */ 343 344static int labpc_cs_resume(struct pcmcia_device *link) 345{ 346 struct local_info_t *local = link->priv; 347 348 local->stop = 0; 349 return 0; 350} /* labpc_cs_resume */ 351 352/*====================================================================*/ 353 354static struct pcmcia_device_id labpc_cs_ids[] = { 355 /* N.B. These IDs should match those in labpc_cs_boards (ni_labpc.c) */ 356 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103), /* daqcard-1200 */ 357 PCMCIA_DEVICE_NULL 358}; 359 360MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids); 361MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>"); 362MODULE_DESCRIPTION("Comedi driver for National Instruments Lab-PC"); 363MODULE_LICENSE("GPL"); 364 365struct pcmcia_driver labpc_cs_driver = { 366 .probe = labpc_cs_attach, 367 .remove = labpc_cs_detach, 368 .suspend = labpc_cs_suspend, 369 .resume = labpc_cs_resume, 370 .id_table = labpc_cs_ids, 371 .owner = THIS_MODULE, 372 .drv = { 373 .name = "daqcard-1200", 374 }, 375}; 376 377static int __init init_labpc_cs(void) 378{ 379 pcmcia_register_driver(&labpc_cs_driver); 380 return 0; 381} 382 383static void __exit exit_labpc_cs(void) 384{ 385 pcmcia_unregister_driver(&labpc_cs_driver); 386} 387 388int __init labpc_init_module(void) 389{ 390 int ret; 391 392 ret = init_labpc_cs(); 393 if (ret < 0) 394 return ret; 395 396 return comedi_driver_register(&driver_labpc_cs); 397} 398 399void __exit labpc_exit_module(void) 400{ 401 exit_labpc_cs(); 402 comedi_driver_unregister(&driver_labpc_cs); 403} 404 405module_init(labpc_init_module); 406module_exit(labpc_exit_module); 407