67
67
/* control register bits */
68
#define parsid_STROBE 0x01
69
#define parsid_AUTOFEED 0x02
70
#define parsid_nINIT 0x04
71
#define parsid_SELECTIN 0x08
72
#define parsid_PCD 0x20
68
#define parsid_STROBE 0x01
69
#define parsid_AUTOFEED 0x02
70
#define parsid_nINIT 0x04
71
#define parsid_SELECTIN 0x08
72
#define parsid_PCD 0x20
74
74
static unsigned char parsid_ctrport;
76
76
static int parsid_port_address[4];
79
static int old_parsid_port=0;
80
static int parsid_open_status=0;
79
static int old_parsid_port = 0;
80
static int parsid_open_status = 0;
82
82
#ifdef HAVE_LIBIEEE1284
83
struct parport_list parlist;
83
struct parport_list parlist;
85
85
void parsid_ieee1284_outb(struct parport_list *pl, int addr, BYTE value)
87
if (addr==parsid_port_address[old_parsid_port])
88
ieee1284_write_data(pl->portv[old_parsid_port-1],value);
90
ieee1284_write_control(pl->portv[old_parsid_port-1],value);
87
if (addr == parsid_port_address[old_parsid_port]) {
88
ieee1284_write_data(pl->portv[old_parsid_port - 1], value);
90
ieee1284_write_control(pl->portv[old_parsid_port - 1], value);
93
94
int parsid_ieee1284_inb(struct parport_list *pl, int addr)
95
if (addr==parsid_port_address[old_parsid_port])
96
return ieee1284_read_data(pl->portv[old_parsid_port-1]);
98
return ieee1284_read_control(pl->portv[old_parsid_port-1]);
96
if (addr == parsid_port_address[old_parsid_port]) {
97
return ieee1284_read_data(pl->portv[old_parsid_port - 1]);
99
return ieee1284_read_control(pl->portv[old_parsid_port - 1]);
101
103
int parsid_ieee1284_open(struct parport_list *pl, int portnr)
106
ret_value=ieee1284_open(pl->portv[portnr],F1284_EXCL,&cap);
108
if (ret_value==E1284_OK)
110
ret_value=ieee1284_claim(pl->portv[portnr]);
111
if (ret_value!=E1284_OK)
112
ieee1284_close(pl->portv[portnr]);
114
if (ret_value==E1284_OK && (cap&CAP1284_RAW)==CAP1284_RAW)
108
ret_value = ieee1284_open(pl->portv[portnr], F1284_EXCL, &cap);
110
if (ret_value == E1284_OK) {
111
ret_value = ieee1284_claim(pl->portv[portnr]);
112
if (ret_value != E1284_OK) {
113
ieee1284_close(pl->portv[portnr]);
116
if (ret_value == E1284_OK && (cap & CAP1284_RAW) == CAP1284_RAW) {
120
123
void parsid_ieee1284_close(struct parport_list *pl, int portnr)
122
ieee1284_release(pl->portv[portnr]);
123
ieee1284_close(pl->portv[portnr]);
125
ieee1284_release(pl->portv[portnr]);
126
ieee1284_close(pl->portv[portnr]);
147
151
void parsid_outb(int addr, BYTE value)
149
153
#ifdef HAVE_LIBIEEE1284
150
parsid_ieee1284_outb(&parlist,addr,value);
154
parsid_ieee1284_outb(&parlist, addr, value);
152
156
#ifdef HAVE_MMAP_DEVICE_IO
155
159
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
158
162
#ifdef HAVE_IOPERM
163
167
BYTE parsid_inb(int addr)
165
169
#ifdef HAVE_LIBIEEE1284
166
return parsid_ieee1284_inb(&parlist,addr);
170
return parsid_ieee1284_inb(&parlist, addr);
168
172
#ifdef HAVE_MMAP_DEVICE_IO
171
175
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
172
return inb((unsigned short)addr);
176
return inb((unsigned short)addr);
174
178
#ifdef HAVE_IOPERM
175
return inb_p((unsigned short)addr);
179
return inb_p((unsigned short)addr);
179
183
/* chip control pin assignments */
180
184
static void parsid_chip_select(void)
182
parsid_ctrport|=parsid_STROBE;
183
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
186
parsid_ctrport |= parsid_STROBE;
187
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
186
190
static void parsid_chip_deselect(void)
188
parsid_ctrport&=~parsid_STROBE;
189
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
192
parsid_ctrport &= ~parsid_STROBE;
193
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
192
196
static void parsid_reset_start(void)
194
parsid_ctrport|=parsid_SELECTIN;
195
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
198
parsid_ctrport |= parsid_SELECTIN;
199
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
198
202
static void parsid_reset_end(void)
200
parsid_ctrport&=~parsid_SELECTIN;
201
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
204
parsid_ctrport &= ~parsid_SELECTIN;
205
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
204
208
static void parsid_latch_open(void)
206
parsid_ctrport&=~parsid_AUTOFEED;
207
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
210
parsid_ctrport &= ~parsid_AUTOFEED;
211
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
210
214
static void parsid_latch_lock(void)
212
parsid_ctrport|=parsid_AUTOFEED;
213
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
216
parsid_ctrport |= parsid_AUTOFEED;
217
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
216
220
static void parsid_RW_write(void)
218
parsid_ctrport&=~parsid_nINIT;
219
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
222
parsid_ctrport &= ~parsid_nINIT;
223
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
222
226
static void parsid_RW_read(void)
224
parsid_ctrport|=parsid_nINIT;
225
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
228
parsid_ctrport |= parsid_nINIT;
229
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
228
232
/* parallel port direction control */
229
233
static void parsid_port_write(void)
231
parsid_ctrport&=~parsid_PCD;
232
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
235
parsid_ctrport &= ~parsid_PCD;
236
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
235
239
static void parsid_port_read(void)
237
parsid_ctrport|=parsid_PCD;
238
parsid_outb(parsid_port_address[old_parsid_port]+2, parsid_ctrport);
241
parsid_ctrport |= parsid_PCD;
242
parsid_outb(parsid_port_address[old_parsid_port] + 2, parsid_ctrport);
241
245
static void parsid_sidwait(void)
245
249
int parsid_check_port(int port)
249
253
#if defined(HAVE_MMAP_DEVICE_IO) || defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM) || defined(HAVE_IOPERM)
254
int old_port_addr = 0;
253
257
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
254
258
#ifndef __FreeBSD__
259
if (port<0 || port>3)
265
while (count_port!=port)
267
if (parsid_port_address[port-1]!=0)
263
if (port < 0 || port > 3) {
271
while (count_port != port) {
272
if (parsid_port_address[port - 1] != 0) {
272
278
#ifdef HAVE_LIBIEEE1284
273
if (parsid_ieee1284_open(&parlist,real_port-1)==0)
277
if (old_parsid_port!=0)
278
parsid_ieee1284_close(&parlist,old_parsid_port-1);
279
old_parsid_port=real_port;
279
if (parsid_ieee1284_open(&parlist, real_port - 1) == 0) {
282
if (old_parsid_port != 0) {
283
parsid_ieee1284_close(&parlist, old_parsid_port - 1);
285
old_parsid_port=real_port;
283
289
#if defined(HAVE_MMAP_DEVICE_IO) || defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM) || defined(HAVE_IOPERM)
290
if (real_port == 1) {
293
if (real_port == 2) {
296
if (real_port == 3) {
291
if (old_parsid_port==1)
293
if (old_parsid_port==2)
295
if (old_parsid_port==3)
300
if (old_parsid_port == 1) {
303
if (old_parsid_port == 2) {
304
old_port_addr = 0x378;
306
if (old_parsid_port == 3) {
307
old_port_addr = 0x278;
299
311
#ifdef HAVE_MMAP_DEVICE_IO
300
if (mmap_device_io(4, port_addr)==MAP_FAILED)
304
if (old_parsid_port!=0)
305
mmunmap_device_io(4, old_port_addr);
307
old_parsid_port=real_port;
312
if (mmap_device_io(4, port_addr) == MAP_FAILED) {
315
if (old_parsid_port != 0) {
316
mmunmap_device_io(4, old_port_addr);
319
old_parsid_port = real_port;
310
322
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
311
323
#ifndef __FreeBSD__
312
324
#ifdef HAVE_LIBAMD64
313
if (amd64_get_ioperm(iomap)!=-1)
315
if (i386_get_ioperm(iomap)!=-1)
318
setaccess(iomap,port_addr,1);
319
setaccess(iomap,port_addr+2,1);
321
if (amd64_set_ioperm(iomap)!=-1)
323
if (i386_set_ioperm(iomap)!=-1)
326
if (old_parsid_port!=0)
328
setaccess(iomap,old_port_addr,0);
329
setaccess(iomap,old_port_addr+2,0);
331
amd64_set_ioperm(iomap);
333
i386_set_ioperm(iomap);
325
if (amd64_get_ioperm(iomap) != -1) {
327
if (i386_get_ioperm(iomap) != -1) {
329
setaccess(iomap, port_addr, 1);
330
setaccess(iomap, port_addr + 2, 1);
332
if (amd64_set_ioperm(iomap) != -1) {
334
if (i386_set_ioperm(iomap) != -1) {
336
if (old_parsid_port != 0) {
337
setaccess(iomap, old_port_addr, 0);
338
setaccess(iomap, old_port_addr + 2, 0);
340
amd64_set_ioperm(iomap);
342
i386_set_ioperm(iomap);
342
old_parsid_port=real_port;
351
old_parsid_port = real_port;
344
if (i386_set_ioperm(port_addr,3,1)!=0)
346
if (old_parsid_port!=0)
347
i386_set_ioperm(old_port_addr,3,0);
348
old_parsid_port=real_port;
353
if (i386_set_ioperm(port_addr, 3, 1) != 0) {
356
if (old_parsid_port != 0) {
357
i386_set_ioperm(old_port_addr, 3, 0);
359
old_parsid_port = real_port;
352
363
#ifdef HAVE_IOPERM
353
if (ioperm(0x80,1,1)!=0)
355
if (ioperm(port_addr,3,1)!=0)
357
if (old_parsid_port!=0)
358
ioperm(old_port_addr,3,0);
359
old_parsid_port=real_port;
364
if (ioperm(0x80, 1, 1) != 0) {
367
if (ioperm(port_addr, 3, 1) != 0) {
370
if (old_parsid_port != 0) {
371
ioperm(old_port_addr, 3, 0);
373
old_parsid_port = real_port;
362
parsid_ctrport = parsid_inb(parsid_port_address[old_parsid_port]+2);
376
parsid_ctrport = parsid_inb(parsid_port_address[old_parsid_port] + 2);
366
380
static int parsid_init(void)
369
383
#if defined(HAVE_MMAP_DEVICE_IO) || defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM) || defined(HAVE_IOPERM)
372
386
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
373
387
#ifndef __FreeBSD__
380
#ifdef HAVE_LIBIEEE1284
381
ieee1284_find_ports(&parlist, 0);
384
for (j = 0; j < 3; j++)
386
#ifdef HAVE_LIBIEEE1284
387
parsid_port_address[j]=parsid_ieee1284_open(&parlist,j);
394
#ifdef HAVE_LIBIEEE1284
395
ieee1284_find_ports(&parlist, 0);
398
for (j = 0; j < 3; j++) {
399
#ifdef HAVE_LIBIEEE1284
400
parsid_port_address[j] = parsid_ieee1284_open(&parlist, j);
390
403
#if defined(HAVE_MMAP_DEVICE_IO) || defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM) || defined(HAVE_IOPERM)
399
415
#ifdef HAVE_MMAP_DEVICE_IO
400
parsid_port_address[j]=mmap_device_io(4, port_addr);
401
if (parsid_port_address[j]!=MAP_FAILED)
403
mmunmap_device_io(4, port_addr);
404
parsid_port_address[j]=port_addr;
407
parsid_port_address[j]=0;
416
parsid_port_address[j] = mmap_device_io(4, port_addr);
417
if (parsid_port_address[j] != MAP_FAILED) {
418
mmunmap_device_io(4, port_addr);
419
parsid_port_address[j] = port_addr;
421
parsid_port_address[j] = 0;
410
425
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
411
426
#ifndef __FreeBSD__
412
427
#ifdef HAVE_LIBAMD64
413
if (amd64_get_ioperm(iomap)!=-1)
415
if (i386_get_ioperm(iomap)!=-1)
418
setaccess(iomap,port_addr,1);
419
setaccess(iomap,port_addr+2,1);
421
if (amd64_set_ioperm(iomap)!=-1)
423
if (i386_set_ioperm(iomap)!=-1)
426
parsid_port_address[j]=port_addr;
427
setaccess(iomap,port_addr,0);
428
setaccess(iomap,port_addr+2,0);
430
amd64_set_ioperm(iomap);
432
i386_set_ioperm(iomap);
436
parsid_port_address[j]=0;
439
parsid_port_address[j]=0;
441
parsid_port_address[j]=i386_set_ioperm(port_addr,3,1);
442
if (parsid_port_address[j]==0)
444
i386_set_ioperm(port_addr,3,0);
445
parsid_port_address[j]=port_addr;
448
parsid_port_address[j]=0;
428
if (amd64_get_ioperm(iomap) != -1)
430
if (i386_get_ioperm(iomap) != -1)
433
setaccess(iomap, port_addr, 1);
434
setaccess(iomap, port_addr + 2, 1);
436
if (amd64_set_ioperm(iomap) != -1)
438
if (i386_set_ioperm(iomap) != -1)
441
parsid_port_address[j] = port_addr;
442
setaccess(iomap, port_addr, 0);
443
setaccess(iomap, port_addr + 2, 0);
445
amd64_set_ioperm(iomap);
447
i386_set_ioperm(iomap);
450
parsid_port_address[j] = 0;
453
parsid_port_address[j] = 0;
456
parsid_port_address[j] = i386_set_ioperm(port_addr, 3, 1);
457
if (parsid_port_address[j] == 0) {
458
i386_set_ioperm(port_addr, 3, 0);
459
parsid_port_address[j] = port_addr;
461
parsid_port_address[j] = 0;
452
466
#ifdef HAVE_IOPERM
453
parsid_port_address[j]=ioperm(port_addr,3,1);
454
if (parsid_port_address[j]==0)
456
ioperm(port_addr,3,0);
457
parsid_port_address[j]=port_addr;
460
parsid_port_address[j]=0;
467
parsid_port_address[j] = ioperm(port_addr, 3, 1);
468
if (parsid_port_address[j] == 0) {
469
ioperm(port_addr, 3, 0);
470
parsid_port_address[j] = port_addr;
472
parsid_port_address[j] = 0;
462
if (parsid_port_address[j]!=0)
475
if (parsid_port_address[j] != 0) {
472
487
void parsid_reset(void)
474
if (parsid_open_status==1)
478
parsid_chip_select();
480
parsid_outb(parsid_port_address[old_parsid_port],0);
481
parsid_reset_start();
485
parsid_chip_deselect();
489
if (parsid_open_status == 1) {
492
parsid_chip_select();
494
parsid_outb(parsid_port_address[old_parsid_port], 0);
495
parsid_reset_start();
499
parsid_chip_deselect();
489
503
int parsid_open(int port)
491
if (parsid_open_status==0)
495
if (parsid_check_port(port)<0)
498
parsid_open_status=1;
505
if (parsid_open_status == 0) {
506
if (parsid_init() < 0) {
509
if (parsid_check_port(port) < 0) {
513
parsid_open_status = 1;
503
518
int parsid_close(void)
505
520
#if defined(HAVE_MMAP_DEVICE_IO) || defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM) || defined(HAVE_IOPERM)
521
int old_port_addr = 0;
508
523
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
509
524
#ifndef __FreeBSD__
513
if (parsid_open_status==1)
528
if (parsid_open_status == 1) {
516
530
#ifdef HAVE_LIBIEEE1284
517
if (old_parsid_port!=0)
519
parsid_ieee1284_close(&parlist,old_parsid_port-1);
531
if (old_parsid_port != 0) {
532
parsid_ieee1284_close(&parlist, old_parsid_port - 1);
524
537
#if defined(HAVE_MMAP_DEVICE_IO) || defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM) || defined(HAVE_IOPERM)
525
if (old_parsid_port==1)
527
if (old_parsid_port==2)
529
if (old_parsid_port==3)
538
if (old_parsid_port == 1) {
539
old_port_addr = 0x3bc;
541
if (old_parsid_port == 2) {
542
old_port_addr = 0x378;
544
if (old_parsid_port == 3) {
545
old_port_addr = 0x278;
533
549
#ifdef HAVE_MMAP_DEVICE_IO
534
if (old_parsid_port!=0)
536
mmunmap_device_io(4, old_port_addr);
550
if (old_parsid_port != 0) {
551
mmunmap_device_io(4, old_port_addr);
541
556
#if defined(HAVE_LIBAMD64) || defined(HAVE_I386_SET_IOPERM)
542
557
#ifndef __FreeBSD__
543
558
#ifdef HAVE_LIBAMD64
544
if (amd64_get_ioperm(iomap)!=-1)
559
if (amd64_get_ioperm(iomap) != -1)
546
if (i386_get_ioperm(iomap)!=-1)
561
if (i386_get_ioperm(iomap) != -1)
549
if (old_parsid_port!=0)
551
setaccess(iomap,old_port_addr,0);
552
setaccess(iomap,old_port_addr+2,0);
564
if (old_parsid_port != 0) {
565
setaccess(iomap, old_port_addr, 0);
566
setaccess(iomap, old_port_addr + 2, 0);
553
567
#ifdef HAVE_LIBAMD64
554
amd64_set_ioperm(iomap);
568
amd64_set_ioperm(iomap);
556
i386_set_ioperm(iomap);
570
i386_set_ioperm(iomap);
562
if (old_parsid_port!=0)
564
i386_set_ioperm(old_port_addr,3,0);
576
if (old_parsid_port != 0) {
577
i386_set_ioperm(old_port_addr, 3, 0);
570
583
#ifdef HAVE_IOPERM
571
if (old_parsid_port!=0)
574
ioperm(old_port_addr,3,0);
584
if (old_parsid_port != 0) {
586
ioperm(old_port_addr, 3, 0);
579
parsid_open_status=0;
591
parsid_open_status = 0;
583
595
int parsid_read(WORD addr, int chipno)
587
parsid_outb(parsid_port_address[old_parsid_port],addr);
593
parsid_chip_select();
595
value=parsid_inb(parsid_port_address[old_parsid_port]);
596
parsid_chip_deselect();
599
parsid_outb(parsid_port_address[old_parsid_port], addr);
605
parsid_chip_select();
607
value = parsid_inb(parsid_port_address[old_parsid_port]);
608
parsid_chip_deselect();
600
612
void parsid_store(WORD addr, BYTE outval, int chipno)
602
parsid_outb(parsid_port_address[old_parsid_port],addr);
606
parsid_outb(parsid_port_address[old_parsid_port],outval);
607
parsid_chip_select();
609
parsid_chip_deselect();
614
parsid_outb(parsid_port_address[old_parsid_port], addr);
618
parsid_outb(parsid_port_address[old_parsid_port], outval);
619
parsid_chip_select();
621
parsid_chip_deselect();