示例#1
0
文件: flash.c 项目: 8l/inferno
int
flashinit(void)
{
	int len;
	char *val;
	Flalloc *ap;
	void *addr;
	long mbytes;
	char type[20];

	flash.base = 0;
	flash.exec = 0;
	flash.size = 0;
	if(archflashreset(type, &addr, &mbytes) < 0){
		print("flash: flash not present or not enabled\n");	/* shouldn't happen */
		return 0;
	}
	flash.size = mbytes;
	flash.base = addr;
	flash.exec = flash.base + BOOTOFF;
	flash.config = nil;
	flash.conflen = 0;

	for(ap = (Flalloc*)(flash.base+CONFIGLIM)-1; memcmp(ap->sig, flashsig, 4) == 0; ap--){
		if(0)
			print("conf #%8.8lux: #%x #%6.6lux\n", ap, ap->tag, ap->base);
		if(ap->tag == Tconf &&
		   flashcheck(ap, &val, &len) &&
		   len >= sizeof(conftag)-1 &&
		   memcmp(val, conftag, sizeof(conftag)-1) == 0){
			flash.config = val;
			flash.conflen = len;
			if(0)
				print("flash: found config %8.8lux(%d):\n%s\n", val, len, val);
		}
	}
	if(flash.config == nil)
		print("flash: no config\n");
	else
		print("flash config %8.8lux(%d):\n%s\n", flash.config, flash.conflen, flash.config);
	if(issqueezed(flash.exec) == Q_MAGIC){
		print("flash: squeezed powerpc kernel installed\n");
		return 1<<0;
	}
	if(GLLONG(flash.exec) == Q_MAGIC){
		print("flash: unsqueezed powerpc kernel installed\n");
		return 1<<0;
	}
	flash.exec = 0;
	print("flash: no powerpc kernel in Flash\n");
	return 0;
}
示例#2
0
static void
flashreset(void)
{
	Flash *f;
	Flashtype *t;
	char *e;
	int bank;

	for(bank = 0; bank < Nbanks; bank++){
		f = malloc(sizeof(*f));
		if(f == nil){
			print("#F%d: can't allocate Flash data\n", bank);
			return;
		}
		f->cmask = ~(ulong)0;
		if(archflashreset(bank, f) < 0 || f->type == nil ||
		    f->addr == nil){
			free(f);
			return;
		}
		for(t = flash.types; t != nil; t = t->next)
			if(strcmp(f->type, t->name) == 0)
				break;
		if(t == nil){
			iprint("#F%d: no flash driver for type %s (addr %p)\n",
				bank, f->type, f->addr);
			free(f);
			return;
		}
		f->reset = t->reset;
		f->protect = 1;
		if(f->reset(f) == 0){
			flash.card[bank] = f;
			iprint("#F%d: %s addr %#p len %lud width %d interleave %d\n",
//				bank, f->type, PADDR(f->addr), f->size,
				bank, f->type, f->addr, f->size,
				f->width, f->interleave);
			e = flashnewpart(f, "flash", 0, f->size);
			if(e != nil)
				panic("#F%d: couldn't init table: %s", bank, e);
		}else
			iprint("#F%d: %#p: reset failed (%s)\n",
				bank, f->addr, f->type);
	}
}