This commit was generated by cvs2svn to compensate for changes in r29615,
which included commits to RCS files with non-trunk default branches.
This commit is contained in:
commit
d5a54b9789
7
contrib/pnpinfo/Makefile
Normal file
7
contrib/pnpinfo/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
# @(#)Makefile 8.1 (Berkeley) 6/5/93
|
||||
|
||||
PROG= pnpinfo
|
||||
MAN8= pnpinfo.8
|
||||
CFLAGS= -Wall
|
||||
|
||||
.include <bsd.prog.mk>
|
59
contrib/pnpinfo/pnpinfo.8
Normal file
59
contrib/pnpinfo/pnpinfo.8
Normal file
@ -0,0 +1,59 @@
|
||||
.\" Copyright (c) 1996, Sujal M. Patel
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by Sujal M. Patel
|
||||
.\" 4. Neither the name of the author nor the names of any co-contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Id: pnpinfo.8,v 1.4 1996/05/06 00:00:18 smpatel Exp smpatel $
|
||||
.\"
|
||||
.Dd January 7, 1996
|
||||
.Dt PNPINFO 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm pnpinfo
|
||||
.Nd "Reports information about Plug-n-Play ISA devices"
|
||||
.Sh SYNOPSIS
|
||||
.Nm pnpinfo
|
||||
.Sh DESCRIPTION
|
||||
.Nm pnpinfo
|
||||
reports information about Plug-n-Play ISA devices. Some of the information,
|
||||
such as the vendor ID, serial number, I/O ports, IRQ, etc. are useful when
|
||||
configuring a kernel with ISA PnP devices.
|
||||
.Sh BUGS
|
||||
A few of the tags are unimplemented (Enough exist for 99% of PnP cards).
|
||||
.Sh SEE ALSO
|
||||
.Xr pnp 4
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
utility first appeared in
|
||||
.Tn FreeBSD
|
||||
2.2.
|
||||
.Sh AUTHOR
|
||||
.Bl -tag
|
||||
Sujal M. Patel, smpatel@umiacs.umd.edu
|
||||
.El
|
607
contrib/pnpinfo/pnpinfo.c
Normal file
607
contrib/pnpinfo/pnpinfo.c
Normal file
@ -0,0 +1,607 @@
|
||||
/*
|
||||
* Copyright (c) 1996, Sujal M. Patel
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: pnpinfo.c,v 1.16 1996/05/05 23:56:38 smpatel Exp $
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <machine/cpufunc.h>
|
||||
|
||||
#include <i386/isa/pnp.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEB(x) x
|
||||
#else
|
||||
#define DEB(x)
|
||||
#endif
|
||||
#define DDB(x) x
|
||||
|
||||
void
|
||||
pnp_write(int d, u_char r)
|
||||
{
|
||||
outb (_PNP_ADDRESS, d);
|
||||
outb (_PNP_WRITE_DATA, r);
|
||||
}
|
||||
/* The READ_DATA port that we are using currently */
|
||||
static int rd_port;
|
||||
|
||||
u_char
|
||||
pnp_read(int d)
|
||||
{
|
||||
outb(_PNP_ADDRESS, d);
|
||||
return inb( (rd_port << 2) + 3) & 0xff;
|
||||
}
|
||||
|
||||
u_char
|
||||
pnp_readw(int d)
|
||||
{
|
||||
int c = pnp_read(d) << 8 ;
|
||||
c |= pnp_read(d+1);
|
||||
return c;
|
||||
}
|
||||
|
||||
int logdevs=0;
|
||||
|
||||
void DELAY __P((int i));
|
||||
void send_Initiation_LFSR();
|
||||
int get_serial __P((u_char *data));
|
||||
int get_resource_info __P((u_char *buffer, int len));
|
||||
int handle_small_res __P((u_char *resinfo, int item, int len));
|
||||
void handle_large_res __P((u_char *resinfo, int item, int len));
|
||||
void dump_resdata __P((u_char *data, int csn));
|
||||
int isolation_protocol();
|
||||
|
||||
|
||||
/*
|
||||
* DELAY does accurate delaying in user-space.
|
||||
* This function busy-waits.
|
||||
*/
|
||||
void
|
||||
DELAY (int i)
|
||||
{
|
||||
struct timeval t;
|
||||
long start, stop;
|
||||
|
||||
i *= 4;
|
||||
|
||||
gettimeofday (&t, NULL);
|
||||
start = t.tv_sec * 1000000 + t.tv_usec;
|
||||
do {
|
||||
gettimeofday (&t, NULL);
|
||||
stop = t.tv_sec * 1000000 + t.tv_usec;
|
||||
} while (start + i > stop);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Send Initiation LFSR as described in "Plug and Play ISA Specification,
|
||||
* Intel May 94."
|
||||
*/
|
||||
void
|
||||
send_Initiation_LFSR()
|
||||
{
|
||||
int cur, i;
|
||||
|
||||
pnp_write(CONFIG_CONTROL, 0x2);
|
||||
|
||||
/* Reset the LSFR */
|
||||
outb(_PNP_ADDRESS, 0);
|
||||
outb(_PNP_ADDRESS, 0); /* yes, we do need it twice! */
|
||||
|
||||
cur = 0x6a;
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
outb(_PNP_ADDRESS, cur);
|
||||
cur = (cur >> 1) | (((cur ^ (cur >> 1)) << 7) & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the device's serial number. Returns 1 if the serial is valid.
|
||||
*/
|
||||
int
|
||||
get_serial(u_char *data)
|
||||
{
|
||||
int i, bit, valid = 0, sum = 0x6a;
|
||||
|
||||
bzero(data, sizeof(char) * 9);
|
||||
|
||||
for (i = 0; i < 72; i++) {
|
||||
bit = inb((rd_port << 2) | 0x3) == 0x55;
|
||||
DELAY(250); /* Delay 250 usec */
|
||||
|
||||
/* Can't Short Circuit the next evaluation, so 'and' is last */
|
||||
bit = (inb((rd_port << 2) | 0x3) == 0xaa) && bit;
|
||||
DELAY(250); /* Delay 250 usec */
|
||||
|
||||
valid = valid || bit;
|
||||
|
||||
if (i < 64)
|
||||
sum = (sum >> 1) |
|
||||
(((sum ^ (sum >> 1) ^ bit) << 7) & 0xff);
|
||||
|
||||
data[i / 8] = (data[i / 8] >> 1) | (bit ? 0x80 : 0);
|
||||
}
|
||||
|
||||
valid = valid && (data[8] == sum);
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Fill's the buffer with resource info from the device.
|
||||
* Returns 0 if the device fails to report
|
||||
*/
|
||||
int
|
||||
get_resource_info(u_char *buffer, int len)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
outb(_PNP_ADDRESS, STATUS);
|
||||
for (j = 0; j < 100; j++) {
|
||||
if ((inb((rd_port << 2) | 0x3)) & 0x1)
|
||||
break;
|
||||
DELAY(1);
|
||||
}
|
||||
if (j == 100) {
|
||||
printf("PnP device failed to report resource data\n");
|
||||
return 0;
|
||||
}
|
||||
outb(_PNP_ADDRESS, RESOURCE_DATA);
|
||||
buffer[i] = inb((rd_port << 2) | 0x3);
|
||||
DEB(printf("--- get_resource_info: got 0x%02x\n",(unsigned)buffer[i]));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
report_dma_info (x)
|
||||
int x;
|
||||
{
|
||||
char *s1=NULL, *s2=NULL, *s3=NULL, *s4=NULL, *s5=NULL;
|
||||
|
||||
switch (x & 0x3) {
|
||||
case 0:
|
||||
s1="8-bit";
|
||||
break;
|
||||
case 1:
|
||||
s1="8/16-bit";
|
||||
break;
|
||||
case 2:
|
||||
s1="16-bit";
|
||||
break;
|
||||
#ifdef DIAGNOSTIC
|
||||
case 3:
|
||||
s1="Reserved";
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
s2 = (x & 0x4) ? "bus master" : "not a bus master";
|
||||
|
||||
s3 = (x & 0x8) ? "count by byte" : "";
|
||||
|
||||
s4 = (x & 0x10) ? "count by word" : "";
|
||||
|
||||
switch ((x & 0x60) >> 5) {
|
||||
case 0:
|
||||
s5="Compatibility mode";
|
||||
break;
|
||||
case 1:
|
||||
s5="Type A";
|
||||
break;
|
||||
case 2:
|
||||
s5="Type B";
|
||||
break;
|
||||
case 3:
|
||||
s5="Type F";
|
||||
break;
|
||||
}
|
||||
printf("\t%s, %s, %s, %s, %s\n",s1,s2,s3,s4,s5);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
report_memory_info (int x)
|
||||
{
|
||||
if (x & 0x1)
|
||||
printf ("Memory Range: Writeable\n");
|
||||
else
|
||||
printf ("Memory Range: Not writeable (ROM)\n");
|
||||
|
||||
if (x & 0x2)
|
||||
printf ("Memory Range: Read-cacheable, write-through\n");
|
||||
else
|
||||
printf ("Memory Range: Non-cacheable\n");
|
||||
|
||||
if (x & 0x4)
|
||||
printf ("Memory Range: Decode supports high address\n");
|
||||
else
|
||||
printf ("Memory Range: Decode supports range length\n");
|
||||
|
||||
switch ((x & 0x18) >> 3) {
|
||||
case 0:
|
||||
printf ("Memory Range: 8-bit memory only\n");
|
||||
break;
|
||||
case 1:
|
||||
printf ("Memory Range: 16-bit memory only\n");
|
||||
break;
|
||||
case 2:
|
||||
printf ("Memory Range: 8-bit and 16-bit memory supported\n");
|
||||
break;
|
||||
#ifdef DIAGNOSTIC
|
||||
case 3:
|
||||
printf ("Memory Range: Reserved\n");
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (x & 0x20)
|
||||
printf ("Memory Range: Memory is shadowable\n");
|
||||
else
|
||||
printf ("Memory Range: Memory is not shadowable\n");
|
||||
|
||||
if (x & 0x40)
|
||||
printf ("Memory Range: Memory is an expansion ROM\n");
|
||||
else
|
||||
printf ("Memory Range: Memory is not an expansion ROM\n");
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
if (x & 0x80)
|
||||
printf ("Memory Range: Reserved (Device is brain-damaged)\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Small Resource Tag Handler
|
||||
*
|
||||
* Returns 1 if checksum was valid (and an END_TAG was received).
|
||||
* Returns -1 if checksum was invalid (and an END_TAG was received).
|
||||
* Returns 0 for other tags.
|
||||
*/
|
||||
int
|
||||
handle_small_res(u_char *resinfo, int item, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
DEB(printf("*** ITEM 0x%04x len %d detected\n", item, len));
|
||||
|
||||
switch (item) {
|
||||
default:
|
||||
printf("*** ITEM 0x%02x detected\n", item);
|
||||
break;
|
||||
case PNP_VERSION:
|
||||
printf("PnP Version %d.%d, Vendor Version %d\n",
|
||||
resinfo[0] >> 4, resinfo[0] & (0xf), resinfo[1]);
|
||||
break;
|
||||
case LOG_DEVICE_ID:
|
||||
printf("\nLogical Device ID: %c%c%c%02x%02x 0x%08x #%d\n",
|
||||
((resinfo[0] & 0x7c) >> 2) + 64,
|
||||
(((resinfo[0] & 0x03) << 3) |
|
||||
((resinfo[1] & 0xe0) >> 5)) + 64,
|
||||
(resinfo[1] & 0x1f) + 64,
|
||||
resinfo[2], resinfo[3], *(int *)(resinfo),
|
||||
logdevs++);
|
||||
|
||||
if (resinfo[4] & 0x1)
|
||||
printf ("\tDevice powers up active\n"); /* XXX */
|
||||
if (resinfo[4] & 0x2)
|
||||
printf ("\tDevice supports I/O Range Check\n");
|
||||
if (resinfo[4] > 0x3)
|
||||
printf ("\tReserved register funcs %02x\n",
|
||||
resinfo[4]);
|
||||
|
||||
if (len == 6)
|
||||
printf("\tVendor register funcs %02x\n", resinfo[5]);
|
||||
break;
|
||||
case COMP_DEVICE_ID:
|
||||
printf("Compatible Device ID: %c%c%c%02x%02x (%08x)\n",
|
||||
((resinfo[0] & 0x7c) >> 2) + 64,
|
||||
(((resinfo[0] & 0x03) << 3) |
|
||||
((resinfo[1] & 0xe0) >> 5)) + 64,
|
||||
(resinfo[1] & 0x1f) + 64,
|
||||
resinfo[2], resinfo[3], *(int *)resinfo);
|
||||
break;
|
||||
case IRQ_FORMAT:
|
||||
printf(" IRQ: ");
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
if (resinfo[0] & (1<<i))
|
||||
printf("%d ", i);
|
||||
for (i = 0; i < 8; i++)
|
||||
if (resinfo[1] & (1<<i))
|
||||
printf("%d ", i + 8);
|
||||
if (len == 3) {
|
||||
if (resinfo[2] & 0x1)
|
||||
printf("IRQ: High true edge sensitive\n");
|
||||
if (resinfo[2] & 0x2)
|
||||
printf("IRQ: Low true edge sensitive\n");
|
||||
if (resinfo[2] & 0x4)
|
||||
printf("IRQ: High true level sensitive\n");
|
||||
if (resinfo[2] & 0x8)
|
||||
printf("IRQ: Low true level sensitive\n");
|
||||
} else {
|
||||
printf(" - only one type (true/edge)\n");
|
||||
}
|
||||
break;
|
||||
case DMA_FORMAT:
|
||||
printf(" DMA: channel(s) ");
|
||||
for (i = 0; i < 8; i++)
|
||||
if (resinfo[0] & (1<<i))
|
||||
printf("%d ", i);
|
||||
printf ("\n");
|
||||
report_dma_info (resinfo[1]);
|
||||
break;
|
||||
case START_DEPEND_FUNC:
|
||||
printf("TAG Start DF\n");
|
||||
if (len == 1) {
|
||||
switch (resinfo[0]) {
|
||||
case 0:
|
||||
printf("Good Configuration\n");
|
||||
break;
|
||||
case 1:
|
||||
printf("Acceptable Configuration\n");
|
||||
break;
|
||||
case 2:
|
||||
printf("Sub-optimal Configuration\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case END_DEPEND_FUNC:
|
||||
printf("TAG End DF\n");
|
||||
break;
|
||||
case IO_PORT_DESC:
|
||||
printf(" I/O Range 0x%x .. 0x%x, alignment 0x%x, len 0x%x\n",
|
||||
resinfo[1] + (resinfo[2] << 8),
|
||||
resinfo[3] + (resinfo[4] << 8),
|
||||
resinfo[5], resinfo[6] );
|
||||
if (resinfo[0])
|
||||
printf("\t[16-bit addr]\n");
|
||||
else
|
||||
printf("\t[not 16-bit addr]\n");
|
||||
break;
|
||||
case FIXED_IO_PORT_DESC:
|
||||
printf (" FIXED I/O base address 0x%x length 0x%x\n",
|
||||
resinfo[0] + ( (resinfo[1] & 3 ) << 8), /* XXX */
|
||||
resinfo[2]);
|
||||
break;
|
||||
#ifdef DIAGNOSTIC
|
||||
case SM_RES_RESERVED:
|
||||
printf("Reserved Tag Detected\n");
|
||||
break;
|
||||
#endif
|
||||
case SM_VENDOR_DEFINED:
|
||||
printf("*** Small Vendor Tag Detected\n");
|
||||
break;
|
||||
case END_TAG:
|
||||
printf("End Tag\n\n");
|
||||
/* XXX Record and Verify Checksum */
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
handle_large_res(u_char *resinfo, int item, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
DEB(printf("*** Large ITEM %d len %d found\n", item, len));
|
||||
switch (item) {
|
||||
case MEMORY_RANGE_DESC:
|
||||
report_memory_info(resinfo[0]);
|
||||
printf("Memory range minimum address: 0x%x\n",
|
||||
(resinfo[1] << 8) + (resinfo[2] << 16));
|
||||
printf("Memory range maximum address: 0x%x\n",
|
||||
(resinfo[3] << 8) + (resinfo[4] << 16));
|
||||
printf("Memory range base alignment: 0x%x\n",
|
||||
(i = (resinfo[5] + (resinfo[6] << 8))) ? i : (1 << 16));
|
||||
printf("Memory range length: 0x%x\n",
|
||||
(resinfo[7] + (resinfo[8] << 8)) * 256);
|
||||
break;
|
||||
case ID_STRING_ANSI:
|
||||
printf("Device Description: ");
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (resinfo[i]) /* XXX */
|
||||
printf("%c", resinfo[i]);
|
||||
}
|
||||
printf("\n");
|
||||
break;
|
||||
case ID_STRING_UNICODE:
|
||||
printf("ID String Unicode Detected (Undefined)\n");
|
||||
break;
|
||||
case LG_VENDOR_DEFINED:
|
||||
printf("Large Vendor Defined Detected\n");
|
||||
break;
|
||||
case _32BIT_MEM_RANGE_DESC:
|
||||
printf("32bit Memory Range Desc Unimplemented\n");
|
||||
break;
|
||||
case _32BIT_FIXED_LOC_DESC:
|
||||
printf("32bit Fixed Location Desc Unimplemented\n");
|
||||
break;
|
||||
case LG_RES_RESERVED:
|
||||
printf("Large Reserved Tag Detected\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Dump all the information about configurations.
|
||||
*/
|
||||
void
|
||||
dump_resdata(u_char *data, int csn)
|
||||
{
|
||||
int i, large_len;
|
||||
|
||||
u_char tag, *resinfo;
|
||||
|
||||
DDB(printf("\nCard assigned CSN #%d\n", csn));
|
||||
printf("Vendor ID %c%c%c%02x%02x (0x%08x), Serial Number 0x%08x\n",
|
||||
((data[0] & 0x7c) >> 2) + 64,
|
||||
(((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64,
|
||||
(data[1] & 0x1f) + 64, data[2], data[3],
|
||||
*(int *)&(data[0]),
|
||||
*(int *)&(data[4]));
|
||||
|
||||
pnp_write(SET_CSN, csn); /* Move this out of this function XXX */
|
||||
outb(_PNP_ADDRESS, STATUS);
|
||||
|
||||
/* Allows up to 1kb of Resource Info, Should be plenty */
|
||||
for (i = 0; i < 1024; i++) {
|
||||
if (!get_resource_info(&tag, 1))
|
||||
break;
|
||||
|
||||
#define TYPE (tag >> 7)
|
||||
#define S_ITEM (tag >> 3)
|
||||
#define S_LEN (tag & 0x7)
|
||||
#define L_ITEM (tag & 0x7f)
|
||||
|
||||
if (TYPE == 0) {
|
||||
/* Handle small resouce data types */
|
||||
|
||||
resinfo = malloc(S_LEN);
|
||||
if (!get_resource_info(resinfo, S_LEN))
|
||||
break;
|
||||
|
||||
if (handle_small_res(resinfo, S_ITEM, S_LEN) == 1)
|
||||
break;
|
||||
free(resinfo);
|
||||
} else {
|
||||
/* Handle large resouce data types */
|
||||
|
||||
if (!get_resource_info((char *) &large_len, 2))
|
||||
break;
|
||||
|
||||
resinfo = malloc(large_len);
|
||||
if (!get_resource_info(resinfo, large_len))
|
||||
break;
|
||||
|
||||
handle_large_res(resinfo, L_ITEM, large_len);
|
||||
free(resinfo);
|
||||
}
|
||||
}
|
||||
printf("Successfully got %d resources, %d logical fdevs\n", i,
|
||||
logdevs);
|
||||
printf("-- card select # 0x%04x\n", pnp_read(SET_CSN));
|
||||
printf("\nCSN %c%c%c%02x%02x (0x%08x), Serial Number 0x%08x\n",
|
||||
((data[0] & 0x7c) >> 2) + 64,
|
||||
(((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64,
|
||||
(data[1] & 0x1f) + 64, data[2], data[3],
|
||||
*(int *)&(data[0]),
|
||||
*(int *)&(data[4]));
|
||||
|
||||
for (i=0; i<logdevs; i++) {
|
||||
int j;
|
||||
|
||||
pnp_write(SET_LDN, i);
|
||||
|
||||
printf("\nLogical device #%d\n", pnp_read(SET_LDN) );
|
||||
printf("IO: ");
|
||||
for (j=0; j<8; j++)
|
||||
printf(" 0x%04x", pnp_readw(IO_CONFIG_BASE + j*2));
|
||||
printf("\nIRQ %d %d\n",
|
||||
pnp_read(IRQ_CONFIG), pnp_read(IRQ_CONFIG+2) );
|
||||
printf("DMA %d %d\n",
|
||||
pnp_read(DRQ_CONFIG), pnp_read(DRQ_CONFIG+1) );
|
||||
printf("IO range check 0x%02x activate 0x%02x\n",
|
||||
pnp_read(IO_RANGE_CHECK), pnp_read(ACTIVATE) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Run the isolation protocol. Use rd_port as the READ_DATA port
|
||||
* value (caller should try multiple READ_DATA locations before giving
|
||||
* up). Upon exiting, all cards are aware that they should use rd_port
|
||||
* as the READ_DATA port;
|
||||
*
|
||||
*/
|
||||
int
|
||||
isolation_protocol()
|
||||
{
|
||||
int csn;
|
||||
u_char data[9];
|
||||
|
||||
send_Initiation_LFSR();
|
||||
|
||||
/* Reset CSN for All Cards */
|
||||
pnp_write(CONFIG_CONTROL, 0x04);
|
||||
|
||||
for (csn = 1; (csn < MAX_PNP_CARDS); csn++) {
|
||||
/* Wake up cards without a CSN */
|
||||
logdevs = 0 ;
|
||||
pnp_write(WAKE, 0);
|
||||
pnp_write(SET_RD_DATA, rd_port);
|
||||
outb(_PNP_ADDRESS, SERIAL_ISOLATION);
|
||||
DELAY(1000); /* Delay 1 msec */
|
||||
|
||||
if (get_serial(data))
|
||||
dump_resdata(data, csn);
|
||||
else
|
||||
break;
|
||||
}
|
||||
return csn - 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
main()
|
||||
{
|
||||
int num_pnp_devs;
|
||||
|
||||
/* Hey what about a i386_iopl() call :) */
|
||||
if (open("/dev/io", O_RDONLY) < 0) {
|
||||
fprintf (stderr, "pnpinfo: Can't get I/O privilege.\n");
|
||||
exit (1);
|
||||
}
|
||||
printf("Checking for Plug-n-Play devices...\n");
|
||||
|
||||
/* Try various READ_DATA ports from 0x203-0x3ff */
|
||||
for (rd_port = 0x80; (rd_port < 0xff); rd_port += 0x10) {
|
||||
DEB(printf("Trying Read_Port at %x...\n", (rd_port << 2) | 0x3) );
|
||||
num_pnp_devs = isolation_protocol(rd_port);
|
||||
if (num_pnp_devs)
|
||||
break;
|
||||
}
|
||||
if (!num_pnp_devs) {
|
||||
printf("No Plug-n-Play devices were found\n");
|
||||
return;
|
||||
}
|
||||
}
|
74
contrib/pnpinfo/pnpinfo.h
Normal file
74
contrib/pnpinfo/pnpinfo.h
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (c) 1996, Sujal M. Patel
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Sujal M. Patel
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: pnpinfo.h,v 1.1 1996/01/08 00:48:32 smpatel Exp $
|
||||
*/
|
||||
|
||||
|
||||
/* Maximum Number of PnP Devices. 6 should be plenty */
|
||||
#define MAX_CARDS 6
|
||||
|
||||
|
||||
/* Static ports */
|
||||
#define ADDRESS 0x279
|
||||
#define WRITE_DATA 0xa79
|
||||
|
||||
|
||||
/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */
|
||||
#define SET_RD_DATA 0x00
|
||||
#define SERIAL_ISOLATION 0x01
|
||||
#define WAKE 0x03
|
||||
#define RESOURCE_DATA 0x04
|
||||
#define STATUS 0x05
|
||||
#define SET_CSN 0x06
|
||||
|
||||
/* Small Resource Item names */
|
||||
#define PNP_VERSION 0x1
|
||||
#define LOG_DEVICE_ID 0x2
|
||||
#define COMP_DEVICE_ID 0x3
|
||||
#define IRQ_FORMAT 0x4
|
||||
#define DMA_FORMAT 0x5
|
||||
#define START_DEPEND_FUNC 0x6
|
||||
#define END_DEPEND_FUNC 0x7
|
||||
#define IO_PORT_DESC 0x8
|
||||
#define FIXED_IO_PORT_DESC 0x9
|
||||
#define SM_RES_RESERVED 0xa-0xd
|
||||
#define SM_VENDOR_DEFINED 0xe
|
||||
#define END_TAG 0xf
|
||||
|
||||
/* Large Resource Item names */
|
||||
#define MEMORY_RANGE_DESC 0x1
|
||||
#define ID_STRING_ANSI 0x2
|
||||
#define ID_STRING_UNICODE 0x3
|
||||
#define LG_VENDOR_DEFINED 0x4
|
||||
#define _32BIT_MEM_RANGE_DESC 0x5
|
||||
#define _32BIT_FIXED_LOC_DESC 0x6
|
||||
#define LG_RES_RESERVED 0x7-0x7f
|
Loading…
x
Reference in New Issue
Block a user