⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i82365.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
📖 第 1 页 / 共 2 页
字号:
	meminit(0);	memset(&isa, 0, sizeof(ISAConf));	vector = VectorPCMCIA;	if(isaconfig("pcmcia", 0, &isa) && isa.irq)		vector = VectorPIC+isa.irq;	/* look for controllers */	i82386probe(0x3E0, 0x3E1, 0);	i82386probe(0x3E0, 0x3E1, 1);	i82386probe(0x3E2, 0x3E3, 0);	i82386probe(0x3E2, 0x3E3, 1);	for(i = 0; i < ncontroller; i++)		nslot += controller[i]->nslot;	slot = xalloc(nslot * sizeof(Slot));	/* if the card is there turn on 5V power to keep its battery alive */	lastslot = slot;	for(i = 0; i < ncontroller; i++){		cp = controller[i];		print("#y%d: %d slot %s: port 0x%uX irq %d\n",			i, cp->nslot, chipname[cp->type], cp->xreg, vector-VectorPIC);		for(j = 0; j < cp->nslot; j++){			pp = lastslot++;			pp->slotno = pp - slot;			pp->memlen = 64*MB;			pp->base = (cp->dev<<7) | (j<<6);			pp->cp = cp;			slotdis(pp);			/* interrupt on status change */			wrreg(pp, Rcscic, ((vector-VectorPIC)<<4) | Fchangeena);			rdreg(pp, Rcsc);		}	}	/* for card management interrupts */	if(ncontroller)		intrenable(vector, i82365intr, 0, BUSUNKNOWN);}/* a memmove using only bytes */static voidmemmoveb(uchar *to, uchar *from, int n){	while(n-- > 0)		*to++ = *from++;}/* a memmove using only shorts & bytes */static voidmemmoves(uchar *to, uchar *from, int n){	ushort *t, *f;	if((((ulong)to) & 1) || (((ulong)from) & 1) || (n & 1)){		while(n-- > 0)			*to++ = *from++;	} else {		n = n/2;		t = (ushort*)to;		f = (ushort*)from;		while(n-- > 0)			*t++ = *f++;	}}/* *  configure the Slot for IO.  We assume very heavily that we can read *  configuration info from the CIS.  If not, we won't set up correctly. */static intpcmio(int slotno, ISAConf *isa){	uchar we, x, *p;	Slot *pp;	Conftab *ct, *et, *t;	PCMmap *m;	int i, index, irq;	char *cp;	irq = isa->irq;	if(irq == 2)		irq = 9;	if(slotno > nslot)		return -1;	pp = slot + slotno;	if(!pp->occupied)		return -1;	et = &pp->ctab[pp->nctab];	ct = 0;	for(i = 0; i < isa->nopt; i++){		if(strncmp(isa->opt[i], "index=", 6))			continue;		index = strtol(&isa->opt[i][6], &cp, 0);		if(cp == &isa->opt[i][6] || index >= pp->nctab)			return -1;		ct = &pp->ctab[index];	}	if(ct == 0){			/* assume default is right */		if(pp->def)			ct = pp->def;		else			ct = pp->ctab;			/* try for best match */		if(ct->nioregs == 0 || ct->port != isa->port || ((1<<irq) & ct->irqs) == 0){			for(t = pp->ctab; t < et; t++)				if(t->nioregs && t->port == isa->port && ((1<<irq) & t->irqs)){					ct = t;					break;				}		}		if(ct->nioregs == 0 || ((1<<irq) & ct->irqs) == 0){			for(t = pp->ctab; t < et; t++)				if(t->nioregs && ((1<<irq) & t->irqs)){					ct = t;					break;				}		}		if(ct->nioregs == 0){			for(t = pp->ctab; t < et; t++)				if(t->nioregs){					ct = t;					break;				}		}	}	if(ct == et || ct->nioregs == 0)		return -1;	if(isa->port == 0 && ct->port == 0)		return -1;	/* route interrupts */	isa->irq = irq;	wrreg(pp, Rigc, irq | Fnotreset | Fiocard);		/* set power and enable device */	x = vcode(ct->vpp1);	wrreg(pp, Rpc, x|Fautopower|Foutena|Fcardena);	/* 16-bit data path */	if(ct->bit16)		x = Fiocs16|Fwidth16;	else		x = 0;	wrreg(pp, Rio, Ftiming|x);	/* enable io port map 0 */	if(isa->port == 0)		isa->port = ct->port;	we = rdreg(pp, Rwe);	wrreg(pp, Riobtm0lo, isa->port);	wrreg(pp, Riobtm0hi, isa->port>>8);	wrreg(pp, Riotop0lo, (isa->port+ct->nioregs-1));	wrreg(pp, Riotop0hi, (isa->port+ct->nioregs-1)>>8);	wrreg(pp, Rwe, we | (1<<6));	/* only touch Rconfig if it is present */	if(pp->cpresent & (1<<Rconfig)){		/*  Reset adapter */		m = pcmmap(slotno, pp->caddr + Rconfig, 1, 1);		p = (uchar*)(KZERO|(m->isa + pp->caddr + Rconfig - m->ca));		/* set configuration and interrupt type */		x = ct->index;		if((ct->irqtype & 0x20) && ((ct->irqtype & 0x40)==0 || isa->irq>7))			x |= Clevel;		*p = x;		delay(5);		pcmunmap(slotno, m);	}	return 0;}/* *  read and crack the card information structure enough to set *  important parameters like power */static void	tcfig(Slot*, int);static void	tentry(Slot*, int);static void	tvers1(Slot*, int);static void (*parse[256])(Slot*, int) ={[0x15]	tvers1,[0x1A]	tcfig,[0x1B]	tentry,};static intreadc(Slot *pp, uchar *x){	if(pp->cispos >= Mchunk)		return 0;	*x = pp->cisbase[2*pp->cispos];	pp->cispos++;	return 1;}static voidcisread(Slot *pp){	uchar link;	uchar type;	int this, i;	PCMmap *m;	memset(pp->ctab, 0, sizeof(pp->ctab));	pp->caddr = 0;	pp->cpresent = 0;	pp->configed = 0;	pp->nctab = 0;	m = pcmmap(pp->slotno, 0, 0, 1);	if(m == 0){print("pcmmap fail\n");		return;}	pp->cisbase = (uchar*)(KZERO|m->isa);print("cisbase %lux\n", pp->cisbase);	pp->cispos = 0;	/* loop through all the tuples */	for(i = 0; i < 1000; i++){		this = pp->cispos;		if(readc(pp, &type) != 1)			break;print("%x...", type);		if(type == 0xFF)			break;		if(readc(pp, &link) != 1)			break;		if(parse[type])			(*parse[type])(pp, type);		if(link == 0xff)			break;		pp->cispos = this + (2+link);	}print("i %d\n", i);	pcmunmap(pp->slotno, m);}static ulonggetlong(Slot *pp, int size){	uchar c;	int i;	ulong x;	x = 0;	for(i = 0; i < size; i++){		if(readc(pp, &c) != 1)			break;		x |= c<<(i*8);	}	return x;}static voidtcfig(Slot *pp, int ttype){	uchar size, rasize, rmsize;	uchar last;	USED(ttype);	if(readc(pp, &size) != 1)		return;	rasize = (size&0x3) + 1;	rmsize = ((size>>2)&0xf) + 1;	if(readc(pp, &last) != 1)		return;	pp->caddr = getlong(pp, rasize);	pp->cpresent = getlong(pp, rmsize);}static ulong vexp[8] ={	1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};static ulong vmant[16] ={	10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90,};static ulongmicrovolt(Slot *pp){	uchar c;	ulong microvolts;	ulong exp;	if(readc(pp, &c) != 1)		return 0;	exp = vexp[c&0x7];	microvolts = vmant[(c>>3)&0xf]*exp;	while(c & 0x80){		if(readc(pp, &c) != 1)			return 0;		switch(c){		case 0x7d:			break;		/* high impedence when sleeping */		case 0x7e:		case 0x7f:			microvolts = 0;	/* no connection */			break;		default:			exp /= 10;			microvolts += exp*(c&0x7f);		}	}	return microvolts;}static ulongnanoamps(Slot *pp){	uchar c;	ulong nanoamps;	if(readc(pp, &c) != 1)		return 0;	nanoamps = vexp[c&0x7]*vmant[(c>>3)&0xf];	while(c & 0x80){		if(readc(pp, &c) != 1)			return 0;		if(c == 0x7d || c == 0x7e || c == 0x7f)			nanoamps = 0;	}	return nanoamps;}/* *  only nominal voltage is important for config */static ulongpower(Slot *pp){	uchar feature;	ulong mv;	mv = 0;	if(readc(pp, &feature) != 1)		return 0;	if(feature & 1)		mv = microvolt(pp);	if(feature & 2)		microvolt(pp);	if(feature & 4)		microvolt(pp);	if(feature & 8)		nanoamps(pp);	if(feature & 0x10)		nanoamps(pp);	if(feature & 0x20)		nanoamps(pp);	if(feature & 0x40)		nanoamps(pp);	return mv/1000000;}static ulong mantissa[16] ={ 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, };static ulong exponent[8] ={ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, };static ulongttiming(Slot *pp, int scale){	uchar unscaled;	ulong nanosecs;	if(readc(pp, &unscaled) != 1)		return 0;	nanosecs = (mantissa[(unscaled>>3)&0xf]*exponent[unscaled&7])/10;	nanosecs = nanosecs * vexp[scale];	return nanosecs;}static voidtiming(Slot *pp, Conftab *ct){	uchar c, i;	if(readc(pp, &c) != 1)		return;	i = c&0x3;	if(i != 3)		ct->maxwait = ttiming(pp, i);		/* max wait */	i = (c>>2)&0x7;	if(i != 7)		ct->readywait = ttiming(pp, i);		/* max ready/busy wait */	i = (c>>5)&0x7;	if(i != 7)		ct->otherwait = ttiming(pp, i);		/* reserved wait */}static voidiospaces(Slot *pp, Conftab *ct){	uchar c;	int i;	ulong len;	if(readc(pp, &c) != 1)		return;	ct->nioregs = 1<<(c&0x1f);	ct->bit16 = ((c>>5)&3) >= 2;	if((c & 0x80) == 0)		return;	if(readc(pp, &c) != 1)		return;	for(i = (c&0xf)+1; i; i--){		ct->port = getlong(pp, (c>>4)&0x3);		len = getlong(pp, (c>>6)&0x3);		USED(len);	}}static voidirq(Slot *pp, Conftab *ct){	uchar c;	if(readc(pp, &c) != 1)		return;	ct->irqtype = c & 0xe0;	if(c & 0x10)		ct->irqs = getlong(pp, 2);	else		ct->irqs = 1<<(c&0xf);	ct->irqs &= 0xDEB8;		/* levels available to card */}static voidmemspace(Slot *pp, int asize, int lsize, int host){	ulong haddress, address, len;	len = getlong(pp, lsize)*256;	address = getlong(pp, asize)*256;	USED(len, address);	if(host){		haddress = getlong(pp, asize)*256;		USED(haddress);	}}static voidtentry(Slot *pp, int ttype){	uchar c, i, feature;	Conftab *ct;	USED(ttype);	if(pp->nctab >= Maxctab)		return;	if(readc(pp, &c) != 1)		return;	ct = &pp->ctab[pp->nctab++];	/* copy from last default config */	if(pp->def)		*ct = *pp->def;	ct->index = c & 0x3f;	/* is this the new default? */	if(c & 0x40)		pp->def = ct;	/* memory wait specified? */	if(c & 0x80){		if(readc(pp, &i) != 1)			return;		if(i&0x80)			ct->memwait = 1;	}	if(readc(pp, &feature) != 1)		return;	switch(feature&0x3){	case 1:		ct->vpp1 = ct->vpp2 = power(pp);		break;	case 2:		power(pp);		ct->vpp1 = ct->vpp2 = power(pp);		break;	case 3:		power(pp);		ct->vpp1 = power(pp);		ct->vpp2 = power(pp);		break;	default:		break;	}	if(feature&0x4)		timing(pp, ct);	if(feature&0x8)		iospaces(pp, ct);	if(feature&0x10)		irq(pp, ct);	switch((feature>>5)&0x3){	case 1:		memspace(pp, 0, 2, 0);		break;	case 2:		memspace(pp, 2, 2, 0);		break;	case 3:		if(readc(pp, &c) != 1)			return;		for(i = 0; i <= (c&0x7); i++)			memspace(pp, (c>>5)&0x3, (c>>3)&0x3, c&0x80);		break;	}	pp->configed++;}static voidtvers1(Slot *pp, int ttype){	uchar c, major, minor;	int  i;	USED(ttype);	if(readc(pp, &major) != 1){print("x");		return;}	if(readc(pp, &minor) != 1){print("y");		return;}	for(i = 0; i < sizeof(pp->verstr)-1; i++){		if(readc(pp, &c) != 1)			return;		if(c == 0)			c = '\n';		if(c == 0xff)			break;		pp->verstr[i] = c;	}	pp->verstr[i] = 0;print("ver %s\n", pp->verstr);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -