Esempio n. 1
0
void process_flash_write(void){
	WORD packet_length,i,c;
	WORD block_remainder, packet_remainder;
	if( !( EP2468STAT & 0x01 )){// EP2 FIFO NOT empty, host sent packet
		FIFORESET = 0x80; SYNCDELAY;
		packet_length = (EP2BCH << 8) | EP2BCL;
		i = 0;
		while(i < packet_length){
			block_remainder = 256 - flash_addr_l;
			packet_remainder = (packet_length > 256) ? 256 : packet_length;
			c = min(block_remainder, packet_remainder);
			if((flash_addr_m == 0) && (flash_addr_l == 0))
				sector_erase(flash_addr_h);
			page_write(flash_addr_h, flash_addr_m, flash_addr_l, &EP2FIFOBUF[i], c);
			i += c;
			// recalculate address
			if((c + flash_addr_l) == 256){
				flash_addr_l = 0x00;
				if(flash_addr_m == 0xFF){
					flash_addr_m = 0x00;
					flash_addr_h += 1;
				}
				else
					flash_addr_m += 1;
			}
			else
				flash_addr_l += c;
		}
		FIFORESET = 0x00; SYNCDELAY;
		OUTPKTEND = 0x82; // SKIP=1, do NOT pass buffer on to master
	}
}
Esempio n. 2
0
static int nor_erase(const struct spi_flash *flash, u32 offset, size_t len)
{
	int sector_start = offset;
	int sector_num = (u32)len / flash->sector_size;

	while (sector_num) {
		if (!sector_erase(sector_start)) {
			sector_start += flash->sector_size;
			sector_num--;
		} else {
			printk(BIOS_WARNING, "Erase failed at 0x%x!\n",
			       sector_start);
			return -1;
		}
	}
	return 0;
}
Esempio n. 3
0
/*------------------------------------------------------*/
int	PcLinkDecode (char *c)
{
/*
	long		i;
	rtime	t1,t2;
	char	cc[128];
	double	a,b,aa;
*/
	switch(*c)
	{
	case '=':
		LoadFromPc(++c);
		break;
	case ':':
		puts_rld(++c);
		return(eof);
	case '*':
		puts_C100(++c);
		puts_C100("\r");
		return(eof);
	case '.':
		GpsComm(++c);
		return(eof);
	case '@':
		WriteSophie(++c);
		return(eof);
	case '-':
		DeleteFromPc(++c);
		break;
	case '?':
		ListToPc(++c);
		break;
	case '#':
		SetAlarm();
		break;
#ifndef	WIN32
	case '!':
		sector_erase(SYSPAR,0);
		SavePar(SYSPAR,0);
		sector_erase(FONTS,0);
		fonts=FONTS;
		WriteGunData(Guns,&fonts);
		fonts=SaveZone(SaveFonts(fonts));
		break;
#endif
/* testiranje hitrosti
	case 'r':
		sscanf(++c,"%ld,%lf",&i,&a);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			b=sqrt(a);
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
	case 'm':
		sscanf(++c,"%ld,%lf,&lf",&i,&a,&b);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			aa=a*b;
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
	case 'p':
		sscanf(++c,"%ld,%lf,&lf",&i,&a,&b);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			aa=pow(a,b);
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
	case 'e':
		sscanf(++c,"%ld,%lf",&i,&a);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			aa=exp(a);
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
	case 's':
		sscanf(++c,"%ld,%lf",&i,&a);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			aa=sin(a);
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
	case 't':
		sscanf(++c,"%ld,%lf",&i,&a);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			aa=tan(a);
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
	case 'a':
		sscanf(++c,"%ld,%lf",&i,&a);
		ReadTime(&t1);
		watchdog();
		PIT_disable();
		while(i--)
			aa=atan(a);
		PIT_enable();
		wait(5);
		ReadTime(&t2);
		sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1));
		puts_pc(cc);
		beep(100);
		break;
*/

	default:
		if(chrtx(c))
		Ungetch(chrtx(c),0);
		break;
	}
	return(null);
}
Esempio n. 4
0
/*******************************************************************************
* Pull EP1 data
*******************************************************************************/
void ep1_pool(void){
	BYTE i;
	WORD adr;
	BYTE new_data = 0;
	
	// Test data for internal test
	if(FPGA_INT0 && FPGA_DONE && !prev_done && !cmd_cnt){
		EP8FIFOCFG = 0x00;  SYNCDELAY;
		FIFORESET = 0x08; SYNCDELAY;
		FIFORESET = 0x00; SYNCDELAY;
		EP8FIFOBUF[0] = 0x12;
		EP8FIFOBUF[1] = 0x34;
		EP8FIFOBUF[2] = 0x56;
		EP8FIFOBUF[3] = 0x78;
		EP8FIFOBUF[4] = 0x90;
		EP8FIFOBUF[5] = 0xAB;
		EP8FIFOBUF[6] = 0xCD;
		EP8FIFOBUF[7] = 0xEF;
		EP8BCH = 0;
		EP8BCL = 8;
		EP8FIFOCFG = 0x10;  SYNCDELAY;
		prev_done = 1;
	}

	if( !( EP1OUTCS & 0x02) ){ 			// Got something
		cmd_cnt++;
		for (i = 0; i < 0x40; i++) 
			EP1INBUF[i] = 0xFF;			// fill output buffer
			
		switch(EP1OUTBUF[0]){			// Decode command
			//-----------------------------------------------------------------
			default:
			case	CMD_READ_VERSION:
				EP1INBUF[0] = fx2_ver_maj_;
				EP1INBUF[1] = fx2_ver_min_;
				EP1INBUF[2] = fx2_tip_maj_;
				EP1INBUF[3] = fx2_tip_min_;
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case	CMD_SET_AUTORESPONSE:
				sts_int_auto_configured = 1;
				iar_adress = EP1OUTBUF[1];
				iar_count = EP1OUTBUF[2];
				iar_int_idx = 0;
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case	CMD_GET_AUTORESPONSE:
				EP1INBUF[0] = iar_int_idx;
				for(i = 0; i < 32; i++)
					EP1INBUF[i+1] = auto_response_data[i];
				iar_int_idx = 0;
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case	CMD_SWITCH_MODE:
				sts_current_mode = 1;
				new_data = 1;
				EP1INBUF[0] = EP1OUTBUF[1];
				break;
			//-----------------------------------------------------------------
			case	CMD_READ_STATUS:
				sts_flash_busy = get_flash_busy();
				sts_booting = FPGA_DONE;
				sts_fpga_prog = 0xaa;
				sts_high_speed_mode = (USBCS & bmHSM) ? 1 : 255;
				new_data = 1;					
				EP1INBUF[0] = sts_fifo_error;
				EP1INBUF[1] = sts_current_mode;
				EP1INBUF[2] = sts_flash_busy;
				EP1INBUF[3] = sts_fpga_prog;
				EP1INBUF[4] = sts_booting;
				EP1INBUF[5] = sts_i2c_new_data;
				EP1INBUF[6] = sts_int_auto_configured;
				EP1INBUF[7] = sts_high_speed_mode;
				sts_i2c_new_data = 0;
				break;
			//-----------------------------------------------------------------
			case CMD_RESET_FIFO_STATUS:
				sts_fifo_error = 0;
				FIFORESET = 0x80;  SYNCDELAY;  // NAK all requests from host.
				switch(EP1OUTBUF[1]){
					case 2:
						EP2FIFOCFG = 0x48;  SYNCDELAY;
						FIFORESET = 0x02;  SYNCDELAY;
						break;
					case 4:
						EP4FIFOCFG = 0x48;  SYNCDELAY;
						FIFORESET = 0x04;  SYNCDELAY;
						break;
					case 6:
						EP6FIFOCFG = 0x48;  SYNCDELAY;
						FIFORESET = 0x06;  SYNCDELAY;
						break;
					default:	// 0
						EP2FIFOCFG = 0x48;  SYNCDELAY;
						EP4FIFOCFG = 0x48;  SYNCDELAY;
						EP6FIFOCFG = 0x48;  SYNCDELAY;
						EP8FIFOCFG = 0x10;  SYNCDELAY;
						FIFORESET = 0x02;  SYNCDELAY;
						FIFORESET = 0x04;  SYNCDELAY;
						FIFORESET = 0x06;  SYNCDELAY;
				}
				FIFORESET = 0x00;  SYNCDELAY;	// Resume normal operation.
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_FLASH_WRITE:
				if (EP1OUTBUF[4] > 59) EP1OUTBUF[4] = 59;
				page_write(EP1OUTBUF[1], EP1OUTBUF[2], EP1OUTBUF[3], &EP1OUTBUF[5], EP1OUTBUF[4]);	//highest, high, low adr, read_ptr, size
			//-----------------------------------------------------------------
			case CMD_FLASH_READ:					
				if (EP1OUTBUF[4] > 64) EP1OUTBUF[4] = 64;
				page_read(EP1OUTBUF[1], EP1OUTBUF[2], EP1OUTBUF[3], &EP1INBUF[0], EP1OUTBUF[4]);		//highest, high, low adr, read_ptr, size
				new_data = 1;
				break;			
			//-----------------------------------------------------------------
			case CMD_FLASH_ERASE:
				// busy_polling();	
				// On some modules it cause API error - better to do it from software side
				bulk_erase();
				new_data = 1;
				sts_flash_busy = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_SECTOR_ERASE:
				sector_erase(EP1OUTBUF[1]);
				new_data = 1;
				sts_flash_busy = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_FLASH_WRITE_COMMAND:
				EP1INBUF[0] = 0x55;
				spi_command(EP1OUTBUF[1], &EP1OUTBUF[3], EP1OUTBUF[2], &EP1INBUF[1]);
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_EEPROM_WRITE:					
				adr = EP1OUTBUF[1];
				adr = (adr << 8) + EP1OUTBUF[2];
				if (EP1OUTBUF[3] > 32) EP1OUTBUF[3] = 32;				
				EEPROMWrite(adr, EP1OUTBUF[3], &EP1OUTBUF[4]);	// adress, size, data
			//-----------------------------------------------------------------
			case CMD_EEPROM_READ:
				adr = EP1OUTBUF[1];
				adr = (adr << 8) + EP1OUTBUF[2];
				EEPROMRead(adr, EP1OUTBUF[3], &EP1INBUF[0]);	// adress, size, data
				new_data = 1;
				break;			
			//-----------------------------------------------------------------
			case CMD_GET_FIFO_STATUS:
				EP1INBUF[0] = EP2CS;
				EP1INBUF[1] = EP4CS;
				EP1INBUF[2] = EP6CS;
				EP1INBUF[3] = EP8CS;
				EP1INBUF[4] = EP2FIFOBCH;
				EP1INBUF[5] = EP4FIFOBCH;
				EP1INBUF[6] = EP6FIFOBCH;
				EP1INBUF[7] = EP8FIFOBCH;
				EP1INBUF[8] = EP2FIFOBCL;
				EP1INBUF[9] = EP4FIFOBCL;
				EP1INBUF[10] = EP6FIFOBCL;
				EP1INBUF[11] = EP8FIFOBCL;
				EP1INBUF[12] = EP2FIFOFLGS;
				EP1INBUF[13] = EP4FIFOFLGS;
				EP1INBUF[14] = EP6FIFOFLGS;
				EP1INBUF[15] = EP8FIFOFLGS;
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_I2C_WRITE:
				I2CWrite(EP1OUTBUF[1], EP1OUTBUF[2], &EP1OUTBUF[3]);	// adress, size, data
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_I2C_READ:
				I2CRead(EP1OUTBUF[1], EP1OUTBUF[2], &EP1INBUF[0]);	// adress, size, data
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			/*
			case CMD_I2C_WRITE_READ:
				i = EP1OUTBUF[1];
				I2CWrite(i, EP1OUTBUF[2], &EP1OUTBUF[4]);	// adress, size, data
				delaycnt = 0;
				while (INT0_PIN == 0){
					EZUSB_Delay1ms();
					delaycnt++;
					if (delaycnt > 800)
						break;
					continue;
				}
				I2CRead(i, EP1OUTBUF[3], &EP1INBUF[0]);	// adress, size, data					
				new_data = 1;
				break;
			*/
			//-----------------------------------------------------------------
			case CMD_FPGA_POWER:
				if (EP1OUTBUF[1] == 0){
					FPGA_POWER = 0;
					sts_int_auto_configured = 0;
				}
				else{
					IOD = 0x03;	// Enable Power and disable Reset
					OED = 0x03;	// PROG_B and POWER
					FPGA_POWER = 1;
				}
				EP1INBUF[0] = (FPGA_POWER) ? 1 : 0;
				EP1INBUF[1] = 0xAA;
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_FPGA_RESET:
				FPGA_INT1 = (EP1OUTBUF[1]) ? 1 : 0;
				EP1INBUF[0] = FPGA_INT1;
				EP1INBUF[1] = 0xAA;
				new_data = 1;
				break;
			//-----------------------------------------------------------------
			case CMD_DEV_LOCK:
				if(EP1OUTBUF[1] == 0x01){	// Driver trying to lock device
					if(lock == 0){		// Device is free
						EP1INBUF[0] = 0x22;	// Sucessfull lock
						lock = 1;
					}
					else				// Device is locked
						EP1INBUF[0] = 0x00;	// Already locked
				}
				else{						// Driver trying to unlock device
					if(lock == 1){		// Device is locked
						EP1INBUF[0] = 0x33;	// Sucessfull unlock
						lock = 0;
					}
					else				// Device is unlocked
						EP1INBUF[0] = 0x00;	// Got problem
				}
				new_data = 1;
				break;		
			//-----------------------------------------------------------------
		}
		EP1OUTBC = EP1DATA_COUNT;		// Free input buffer
	}

	if(new_data){						// Have something to send
		if ( !(EP1INCS & 0x02)){		// Can send ?
			EP1INBC = EP1DATA_COUNT;	// Send
			new_data = 0;
		}
	}
}
Esempio n. 5
0
static int
program_flash(Environ *e, Self *s, int offset, uByte *data, int len)
{
	Flash *flash = s->type;
	int i;
	uByte *buf = 0;
	int buflen = 0;
	uByte *bp;
	int bpoff;
	int bpsize;
	Bool diag = diagnostic_mode(e);
	int width = s->width;
	int partswide = s->partswide;
	const Sector *sectors = flash->sectors;
	int mask = width - 1;

	if (offset < 0)
		return 0;

	DPRINTF(("program_flash: e %p, s %p, offset %#x, data %p, len %d\n",
			e, s, offset, data, len));

	while (len)
	{
		int sector;
		int soffset;
		int ssize;
		int off;
		int sz;
		int diffs;

		for (i = 1; sectors[i].size; i++)
			if (sectors[i].start * partswide > offset)
				break;

		sector = i - 1;
		soffset = sectors[sector].start * partswide;
		ssize = sectors[sector].size * partswide;
		DPRINTF(("program_flash: sector %d, offset %#x, size %d\n",
				sector, soffset, ssize));

		/* check for write past end of flash */
		if (soffset + ssize <= offset)
		{
			if (buf)
				free(buf);

			return 0;
		}

		off = offset - soffset;
		sz = len < (ssize - off) ? len : (ssize - off);

		DPRINTF(("program_flash: off %#x, sz %d\n", off, sz));

		if (sz < 0 || sz > ssize)
		{
			cprintf(e, "sz out of range, %d\n", sz);

			if (buf)
				free(buf);

			return 0;
		}

		/* check to see if we need to erase or program*/
		diffs = compare_flash(e, s, offset, data, sz, 0);
		DPRINTF(("program_flash: compare, %#x, %d, %d\n", offset, sz, diffs));

		if (diffs & 2)
		{
			diffs = 1;

			if (off || sz < ssize)
			{
				/* preserve the sector contents */
				if (buflen < ssize)
				{
					if (buf)
						free(buf);

					buf = (uByte *)malloc(ssize);
					buflen = ssize;

					if (!buf)
					{
						cprintf(e, "Unable to allocate sector buffer\n");
						return 0;
					}

					DPRINTF(("buf = %p\n", buf));
				}

				for (i = 0; i < ssize; i += width)
					read_word(e, s, soffset + i, &buf[i]); 

				for (i = 0; i < sz; i++)
					buf[off + i] = data[i];

				bp = buf;
			}
			else
				bp = data;

			bpoff = soffset;
			bpsize = ssize;
			DPRINTF(("program_flash: bp %p, bpoff %#x, bpsize %d\n",
					bp, bpoff, bpsize));

			/* erase sector */
			if (diag)
				cprintf(e, "Erasing sector %d\n", sector);
			else
				spin_cursor(e);

			DPRINTF(("program_flash: erasing sector %#x\n", soffset));
			sector_erase(e, s, soffset);
		}
		else
		{
			bp = data;
			bpoff = offset;
			bpsize = sz;
			DPRINTF(("program_flash: 2 bp %p, bpoff %#x, bpsize %d\n",
					bp, bpoff, bpsize));
		}

		if (diffs & 1)
		{
			if (diag)
				cprintf(e, "Programming sector %d\n", sector);
			else
				spin_cursor(e);

			DPRINTF(("program_flash: programming offset %#x, size %d\n", bpoff, bpsize));

			/* program */
			if (bpoff & mask)
			{
				/* handle odd bytes */
				int n = width - (bpoff & mask);

				if (n > bpsize)
					n = bpsize;

				DPRINTF(("program_flash: %d misaligned bytes at %#x\n", n, bpoff, bp));

				read_word(e, s, bpoff & ~mask, s->buf);

				for (i = 0; i < n; i++)
					s->buf[(bpoff & mask) + i] = bp[i];

				program_word(e, s, bpoff & ~mask, s->buf);
			}
			else
				i = 0;

			for (; i + width - 1 < bpsize; i += width)
			{
				if ((((i / width) + 1) % (4*1024)) == 0)
					spin_cursor(e);

				program_word(e, s, (bpoff + i) & ~mask, &bp[i]);
			}

			DPRINTF(("program_flash: %d aligned bytes remainder at %#x, %p\n", i, bpoff, bp));

			if (i < bpsize)
			{
				/* handle odd bytes at the tail */
				int j;

				DPRINTF(("program_flash: %d misaligned bytes remainder at %#x, %p\n", bpsize - i, bpoff + i, bp + i));

				read_word(e, s, (bpoff + i) & ~mask, s->buf);

				DPRINTF(("program_flash: buf[0] %#x, buf[1] %#x\n", s->buf[0], s->buf[1]));

				for (j = 0; i < bpsize; j++, i++)
					s->buf[j] = bp[i];

				DPRINTF(("program_flash: new buf[0] %#x, buf[1] %#x\n", s->buf[0], s->buf[1]));

				program_word(e, s, (bpoff + i) & ~mask, s->buf);
			}

			/* verify bytes */
			diffs = compare_flash(e, s, bpoff, bp, bpsize, 1);
			DPRINTF(("program_flash: compare: bpoff %p, bp %#x, bpsize %d, diffs %d\n",
					bpoff, bp, bpsize, diffs));
		}

		offset += sz;
		data += sz;
		len -= sz;
	}

	if (buf)
		free(buf);

	DPRINTF(("buf = %p free\n", buf));
	DPRINTF(("program_flash: offset %#x, data %#x, len %d\n",
					offset, data, len));

	/* return OK */
	return 1;
}