SerialFlashFile SerialFlashChip::open(const char *filename)
{
	uint32_t maxfiles, straddr;
	uint16_t hash, hashtable[8];
	uint32_t i, n, index=0;
	uint32_t buf[3];
	SerialFlashFile file;

	maxfiles = check_signature();
	 //Serial.printf("sig: %08X\n", maxfiles);
	if (!maxfiles) return file;
	maxfiles &= 0xFFFF;
	hash = filename_hash(filename);
	 //Serial.printf("hash %04X for \"%s\"\n", hash, filename);
	while (index < maxfiles) {
		n = 8;
		if (n > maxfiles - index) n = maxfiles - index;
		SerialFlash.read(8 + index * 2, hashtable, n * 2);
		 //Serial.printf(" read %u: ", 8 + index * 2);
		 //pbuf(hashtable, n * 2);
		for (i=0; i < n; i++) {
			if (hashtable[i] == hash) {
				 //Serial.printf("  hash match at index %u\n", index+i);
				buf[2] = 0;
				SerialFlash.read(8 + maxfiles * 2 + (index+i) * 10, buf, 10);

				 //Serial.printf("  maxf=%d, index=%d, i=%d\n", maxfiles, index, i);
				 //Serial.printf("  read %u: ", 8 + maxfiles * 2 + (index+i) * 10);
				 //pbuf(buf, 10);
				straddr = 8 + maxfiles * 12 + buf[2] * 4;
				 //Serial.printf("  straddr = %u\n", straddr);
				if (filename_compare(filename, straddr)) {
					 //Serial.printf("  match!\n");
					 //Serial.printf("  addr = %u\n", buf[0]);
					 //Serial.printf("  len =  %u\n", buf[1]);
					file.address = buf[0];
					file.length = buf[1];
					file.offset = 0;
					file.dirindex = index + i;
					return file;
				}
			} else if (hashtable[i] == 0xFFFF) {
				return file;
			}
		}
		index += n;
	}
	return file;
}
Exemple #2
0
list_iter   boxpath_first_part(boxpath * bpath)
{
	list_iter it;
	boxfile * part;
	if(!boxpath_getfile(bpath)) return NULL;
	
	it = list_get_iter(bpath->dir->pieces);
	while(it && (filename_compare(bpath->file, list_iter_getval(it)) > 0))
		it = list_iter_next(it);
	if(it) {
		part = (boxfile*) list_iter_getval(it);
		if(strncmp(bpath->base, part->name, strlen(bpath->base)))
			return NULL;
	}
	
	return it;
}