diff options
author | hvozda <hvozda@cvs.openbsd.org> | 1996-04-29 13:07:06 +0000 |
---|---|---|
committer | hvozda <hvozda@cvs.openbsd.org> | 1996-04-29 13:07:06 +0000 |
commit | 66dbdef25563581a0d393d8d919df22c43de70c7 (patch) | |
tree | 4cfdb17adf8be1fdf71a7e416fdc352fc014c3f3 /sbin/config_slot/config_slot.c | |
parent | fc0fd904cb2c0308afe4ec749ac0a2e82b1cf240 (diff) |
Pull in John Kohl's most recent (15Apr96) APM and PCMCIA work
(original PCMCIA framework by Stefan Grefen).
Diffstat (limited to 'sbin/config_slot/config_slot.c')
-rw-r--r-- | sbin/config_slot/config_slot.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/sbin/config_slot/config_slot.c b/sbin/config_slot/config_slot.c new file mode 100644 index 00000000000..a24c387eff9 --- /dev/null +++ b/sbin/config_slot/config_slot.c @@ -0,0 +1,233 @@ +/* + * Copyright (c) 1993, 1994 Stefan Grefen. 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 dipclaimer. + * 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 Stefan Grefen. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + */ +#include <stdio.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/file.h> +#include <sys/ioctl.h> +#include <sys/device.h> + +#include <dev/pcmcia/pcmciareg.h> +#include <dev/pcmcia/pcmciavar.h> +#include <dev/pcmcia/pcmcia_ioctl.h> + +void parse_device(u_char *, int, int); +void parse_ver1(u_char *, int, int); +void parse_config(u_char *, int, int); +void read_extended_speed(u_char *, int *); +const char *tuple_name(int), *dtype_name(int), *dsize_name(int), + *dspeed_name(int); +void parse_tuples(u_char *buf, int print_tuples); +int dumpcf(struct pcmcia_conf *pc_cf); +void usage(void); +int readiowin(char **argv,struct iowin *io); +void dcp(char **argv,char *target); +void parse_cmdline(int argc,char **argv,struct pcmcia_conf *pc_cf); + +int iowins=0; + +dumpcf(struct pcmcia_conf *pc_cf) { + int i; + static char *ios[]= { + "auto","8bit","16bit","illegal" + }; + printf("Driver name '%s'\n",pc_cf->driver_name); + printf("CFG offset %x\n",pc_cf->cfg_off ); + printf("IRQ type %s\n",pc_cf->irq_level?"Level":pc_cf->irq_pulse?"Pulse":"None"); + printf("CFG Entry %x %s\n",pc_cf->cfgtype,pc_cf->cfgtype&DOSRESET?"dosreset":""); + printf("IRQ num %x\n",pc_cf->irq_num&0xf); + printf("Cardtype %s\n",pc_cf->iocard?"IO":"MEM"); + for (i=0;i<pc_cf->iowin;i++) { + printf("iowin %x-%x %s\n",pc_cf->io[i].start, + pc_cf->io[i].start+pc_cf->io[i].len-1, + ios[(pc_cf->io[i].flags&(PCMCIA_MAP_8|PCMCIA_MAP_16))>>8]); + } + for (i=0;i<pc_cf->memwin;i++) { + printf("memwin (%x)%x-%x %x\n", + pc_cf->mem[i].caddr, + pc_cf->mem[i].start, + pc_cf->mem[i].start+pc_cf->mem[i].len-1, + pc_cf->mem[i].flags); + } +} + +void +usage(void) { + fprintf(stderr,"usage: config_slot <slotid> [driver name][iocard]\\\n"); + fprintf(stderr," [irq num][lirq][iowin start len width]\n"); + fprintf(stderr," [** not yet memwin start offs len width]\n"); +} + + +main(int argc,char **argv) { + char namebuf[64]; + struct pcmcia_status stbuf; + struct pcmcia_info inbuf; + struct pcmcia_conf pc_cf; + char manu[MAX_CIS_NAMELEN]; + char model[MAX_CIS_NAMELEN]; + char addinf1[MAX_CIS_NAMELEN]; + char addinf2[MAX_CIS_NAMELEN]; + int sockid; + int fd,cfg; + + if(argc<2 || !isdigit(argv[1][0])) { + usage(); + exit(1); + } + + sockid=atoi(argv[1]); + + bzero(pc_cf,sizeof(pc_cf)); + + argc-=2;argv+=2; + sprintf(namebuf,"/dev/pcmcia/slot%d",sockid); + + if((fd=open(namebuf,O_RDWR))<0) { + printf("errno %d\n",errno); + perror("open"); + exit(1); + } + if(ioctl(fd,PCMCIAIO_GET_STATUS,&stbuf)<0) { + printf("errno %d\n",errno); + perror("ioctl PCMCIAIO_GET_STATUS"); + exit(1); + } + if(!(stbuf.status&PCMCIA_CARD_PRESENT)) { + printf("No card in slot %d\n",stbuf.slot); + exit(1); + } + if(!(stbuf.status&PCMCIA_POWER)) { + int pw=PCMCIA_POWER_5V; + printf("Card in slot %d no power\n",stbuf.slot); + if(ioctl(fd,PCMCIAIO_SET_POWER,&pw)<0) { + printf("errno %d\n",errno); + perror("ioctl PCMCIAIO_SET_POWER"); + exit(1); + } + /*exit(1);/**/ + } + if(ioctl(fd,PCMCIAIO_GET_STATUS,&stbuf)<0) { + printf("errno %d\n",errno); + perror("ioctl PCMCIAIO_GET_STATUS"); + exit(1); + } + printf("Status slot %d %x\n",stbuf.slot,stbuf.status); + if(!(stbuf.status&PCMCIA_READY)) { + printf("Card in slot %d not ready\n",stbuf.slot); + /*exit(1);/**/ + } + if(ioctl(fd,PCMCIAIO_GET_INFO,&inbuf)<0) { + printf("errno %d\n",errno); + perror("ioctl PCMCIAIO_GET_INFO"); + exit(1); + } + /*dbuf(inbuf.cis_data,512);/**/ + bzero(&pc_cf,sizeof(pc_cf)); + /*parse_cmdline(argc,argv,&pc_cf);/**/ + printf("* %x\n",pc_cf.cfgtype); + cfg=pc_cf.cfgtype&CFGENTRYMASK; + if(pcmcia_get_cf(0, inbuf.cis_data,512,CFGENTRYMASK,&pc_cf)) { + fprintf(stderr,"read_conf failed\n"); + exit(1); + } + if(pc_cf.cfgtype&CFGENTRYID) { + if(pcmcia_get_cf(0, inbuf.cis_data,512,cfg,&pc_cf)) { + fprintf(stderr,"read_conf failed\n"); + exit(1); + } + } + parse_cmdline(argc,argv,&pc_cf); + if(iowins && pc_cf.iowin!=iowins) { + pc_cf.iowin=iowins; + } + dumpcf(&pc_cf); + if (pcmcia_get_cisver1(0, (u_char *)&inbuf.cis_data, 512, + manu, model, addinf1, addinf2) == 0) { + printf(" <%s, %s", manu, model); + if (addinf1[0]) + printf(", %s", addinf1); + if (addinf2[0]) + printf(", %s", addinf2); + printf(">\n"); + } + printf("PCMCIAIO_CONFIGURE==%x\n",PCMCIAIO_CONFIGURE); + if(ioctl(fd,PCMCIAIO_CONFIGURE,&pc_cf)<0) { + printf("errno %d\n",errno); + perror("ioctl PCMCIAIO_CONFIGURE"); + exit(1); + } + + exit(0); + +} +#define OPT_ARG(opt,arg,func) if(argc>1 && !strcmp(argv[0],opt)) { \ + arg=func(argv[1]); argv+=2;argc-=2 ;continue;} +#define OPT(opt,arg) if(!strcmp(argv[0],opt)) { \ + arg=1; argv++;argc-- ;continue;} +#define OPTOV_ARG(opt,op,func,arg) if(!strcmp(argv[0],opt)) { \ + arg op func(argv[1]); argv+=2;argc-=2 ;continue;} +#define OPTOV(opt,op,val,arg) if(!strcmp(argv[0],opt)) { \ + arg op val; argv++;argc-- ;continue;} +#define OPT_ARGN(opt,n,arg,func) if(argc>n && !strcmp(argv[0],opt)) { \ + func(&argv[1],&(arg)); argv+=n+1;argc-=n+1 ;continue;} +readiowin(char **argv,struct iowin *io) { + io->start=strtol(argv[0],NULL,0); + io->len=strtol(argv[1],NULL,0); + if(!strcmp(argv[2],"auto")) { + io->flags=0; + } else if(!strcmp(argv[2],"8bit")) { + io->flags=PCMCIA_MAP_8; + } else if(!strcmp(argv[2],"16bit")) { + io->flags=PCMCIA_MAP_16; + } +} + +void +dcp(char **argv,char *target) { + strcpy(target,argv[0]); +} + +void +parse_cmdline(int argc,char **argv,struct pcmcia_conf *pc_cf) { + int memwin=0; + while(argc>0) { + OPT_ARG("irq", pc_cf->irq_num,atoi); + OPT_ARGN("iowin",3,pc_cf->io[iowins++],readiowin); + /*OPT_ARGN("-memwin",4,pc_cf->mem,readmem,win);/**/ + OPT("pirq", pc_cf->irq_pulse); + OPT("lirq", pc_cf->irq_level); + OPT("iocard", pc_cf->iocard); + OPTOV("dosreset", |= ,DOSRESET,pc_cf->cfgtype); + OPTOV_ARG("configid",|= CFGENTRYID |,atoi,pc_cf->cfgtype); + OPT_ARGN("driver",1, pc_cf->driver_name[0][0],dcp); + printf("illegal option '%s'\n",argv[0]); + argc--;argv++; + } +} |