예제 #1
0
/**************************************************************************
* int fdc_fdos_read
*  the length is in block number
*/
int fdc_fdos_read (void *buffer, int len)
{
	FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
	FDC_COMMAND_STRUCT *pCMD = &cmd;

	return (fdc_read_data (buffer, len, pCMD, pFG));
}
예제 #2
0
void t_FDC::Emulate(int iCycleCount)
{
	if (phase == EXEC_PHASE)
	{
		timeout -= iCycleCount;
		if (timeout <= 0)
		{
			flags |= OVERRUN_flag;
			if (cmd_direction == FDC_TO_CPU)
			{
				fdc_read_data();
			}
			else
			{
				fdc_write_data(0xff);
			}
		}
	}
}
예제 #3
0
/****************************************************************************
 * main routine do_fdcboot
 */
int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
	FDC_COMMAND_STRUCT *pCMD = &cmd;
	unsigned long addr,imsize;
	image_header_t *hdr;  /* used for fdc boot */
	unsigned char boot_drive;
	int i,nrofblk;
	char *ep;
	int rcode = 0;
#if defined(CONFIG_FIT)
	const void *fit_hdr;
#endif

	switch (argc) {
	case 1:
		addr = CFG_LOAD_ADDR;
		boot_drive=CFG_FDC_DRIVE_NUMBER;
		break;
	case 2:
		addr = simple_strtoul(argv[1], NULL, 16);
		boot_drive=CFG_FDC_DRIVE_NUMBER;
		break;
	case 3:
		addr = simple_strtoul(argv[1], NULL, 16);
		boot_drive=simple_strtoul(argv[2], NULL, 10);
		break;
	default:
		printf ("Usage:\n%s\n", cmdtp->usage);
		return 1;
	}
	/* setup FDC and scan for drives  */
	if(fdc_setup(boot_drive,pCMD,pFG)==FALSE) {
		printf("\n** Error in setup FDC **\n");
		return 1;
	}
	if(fdc_check_drive(pCMD,pFG)==FALSE) {
		printf("\n** Error in check_drives **\n");
		return 1;
	}
	if((pCMD->flags&(1<<boot_drive))==0) {
		/* drive not available */
		printf("\n** Drive %d not availabe **\n",boot_drive);
		return 1;
	}
	if((pCMD->flags&(0x10<<boot_drive))==0) {
		/* no disk inserted */
		printf("\n** No disk inserted in drive %d **\n",boot_drive);
		return 1;
	}
	/* ok, we have a valid source */
	pCMD->drive=boot_drive;
	/* read first block */
	pCMD->blnr=0;
	if(fdc_read_data((unsigned char *)addr,1,pCMD,pFG)==FALSE) {
		printf("\nRead error:");
		for(i=0;i<7;i++)
			printf("result%d: 0x%02X\n",i,pCMD->result[i]);
		return 1;
	}

	switch (genimg_get_format ((void *)addr)) {
	case IMAGE_FORMAT_LEGACY:
		hdr = (image_header_t *)addr;
		image_print_contents (hdr);

		imsize = image_get_image_size (hdr);
		break;
#if defined(CONFIG_FIT)
	case IMAGE_FORMAT_FIT:
		fit_hdr = (const void *)addr;
		if (!fit_check_format (fit_hdr)) {
			puts ("** Bad FIT image format\n");
			return 1;
		}
		puts ("Fit image detected...\n");

		imsize = fit_get_size (fit_hdr);
		break;
#endif
	default:
		puts ("** Unknown image type\n");
		return 1;
	}

	nrofblk=imsize/512;
	if((imsize%512)>0)
		nrofblk++;
	printf("Loading %ld Bytes (%d blocks) at 0x%08lx..\n",imsize,nrofblk,addr);
	pCMD->blnr=0;
	if(fdc_read_data((unsigned char *)addr,nrofblk,pCMD,pFG)==FALSE) {
		/* read image block */
		printf("\nRead error:");
		for(i=0;i<7;i++)
			printf("result%d: 0x%02X\n",i,pCMD->result[i]);
		return 1;
	}
	printf("OK %ld Bytes loaded.\n",imsize);

	flush_cache (addr, imsize);

#if defined(CONFIG_FIT)
	/* This cannot be done earlier, we need complete FIT image in RAM first */
	if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT)
		fit_print_contents ((const void *)addr);
#endif

	/* Loading ok, update default load address */
	load_addr = addr;

	/* Check if we should attempt an auto-start */
	if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
		char *local_args[2];
		extern int do_bootm (cmd_tbl_t *, int, int, char *[]);

		local_args[0] = argv[0];
		local_args[1] = NULL;

		printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);

		do_bootm (cmdtp, 0, 1, local_args);
		rcode ++;
	}
	return rcode;
}
예제 #4
0
파일: fdc.c 프로젝트: 01hyang/u-boot
/****************************************************************************
 * main routine do_fdcboot
 */
int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
	FDC_COMMAND_STRUCT *pCMD = &cmd;
	unsigned long addr,imsize;
#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
	image_header_t *hdr;  /* used for fdc boot */
#endif
	unsigned char boot_drive;
	int i,nrofblk;
#if defined(CONFIG_FIT)
	const void *fit_hdr = NULL;
#endif

	switch (argc) {
	case 1:
		addr = CONFIG_SYS_LOAD_ADDR;
		boot_drive=CONFIG_SYS_FDC_DRIVE_NUMBER;
		break;
	case 2:
		addr = simple_strtoul(argv[1], NULL, 16);
		boot_drive=CONFIG_SYS_FDC_DRIVE_NUMBER;
		break;
	case 3:
		addr = simple_strtoul(argv[1], NULL, 16);
		boot_drive=simple_strtoul(argv[2], NULL, 10);
		break;
	default:
		return CMD_RET_USAGE;
	}
	/* setup FDC and scan for drives  */
	if (fdc_setup(boot_drive, pCMD, pFG) == false) {
		printf("\n** Error in setup FDC **\n");
		return 1;
	}
	if (fdc_check_drive(pCMD, pFG) == false) {
		printf("\n** Error in check_drives **\n");
		return 1;
	}
	if((pCMD->flags&(1<<boot_drive))==0) {
		/* drive not available */
		printf("\n** Drive %d not availabe **\n",boot_drive);
		return 1;
	}
	if((pCMD->flags&(0x10<<boot_drive))==0) {
		/* no disk inserted */
		printf("\n** No disk inserted in drive %d **\n",boot_drive);
		return 1;
	}
	/* ok, we have a valid source */
	pCMD->drive=boot_drive;
	/* read first block */
	pCMD->blnr=0;
	if (fdc_read_data((unsigned char *)addr, 1, pCMD, pFG) == false) {
		printf("\nRead error:");
		for(i=0;i<7;i++)
			printf("result%d: 0x%02X\n",i,pCMD->result[i]);
		return 1;
	}

	switch (genimg_get_format ((void *)addr)) {
#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
	case IMAGE_FORMAT_LEGACY:
		hdr = (image_header_t *)addr;
		image_print_contents (hdr);

		imsize = image_get_image_size (hdr);
		break;
#endif
#if defined(CONFIG_FIT)
	case IMAGE_FORMAT_FIT:
		fit_hdr = (const void *)addr;
		puts ("Fit image detected...\n");

		imsize = fit_get_size (fit_hdr);
		break;
#endif
	default:
		puts ("** Unknown image type\n");
		return 1;
	}

	nrofblk=imsize/512;
	if((imsize%512)>0)
		nrofblk++;
	printf("Loading %ld Bytes (%d blocks) at 0x%08lx..\n",imsize,nrofblk,addr);
	pCMD->blnr=0;
	if (fdc_read_data((unsigned char *)addr, nrofblk, pCMD, pFG) == false) {
		/* read image block */
		printf("\nRead error:");
		for(i=0;i<7;i++)
			printf("result%d: 0x%02X\n",i,pCMD->result[i]);
		return 1;
	}
	printf("OK %ld Bytes loaded.\n",imsize);

	flush_cache (addr, imsize);

#if defined(CONFIG_FIT)
	/* This cannot be done earlier, we need complete FIT image in RAM first */
	if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT) {
		if (!fit_check_format (fit_hdr)) {
			puts ("** Bad FIT image format\n");
			return 1;
		}
		fit_print_contents (fit_hdr);
	}
#endif

	/* Loading ok, update default load address */
	load_addr = addr;

	return bootm_maybe_autostart(cmdtp, argv[0]);
}
예제 #5
0
파일: fdc.c 프로젝트: Nilquader/nc100em
void fdc_write(unsigned char a) { // Write byte to data register
	static int cmdlen = 9; // length of FDC command
#ifdef FDC_DEBUG	
	printf("FDC DATA WRITE = 0x%x\n", a);
#endif	
	switch(phase) {
		case P_COMMAND:
			fdccommand[CmdByte] = a; // store part of command
			if (CmdByte == 0) { // first byte of command
				switch(a&0x1F) {
					case CMD_READDATA:
					case CMD_READDELETEDDATA:
					case CMD_WRITEDATA:
					case CMD_WRITEDELETEDDATA:
					case CMD_READDIAGNOSTIC:
					case CMD_SCANEQUAL:
					case CMD_SCANLOWEQUAL:
					case CMD_SCANHIGHEQUAL:
						cmdlen = 9;
						break;
					case CMD_WRITEID:
						cmdlen = 6;
						break;
					case CMD_SPECIFY:
					case CMD_SEEK:
						cmdlen = 3;
						break;
					case CMD_READID:
					case CMD_RECALIBRATE:
					case CMD_SENSEDRV:
						cmdlen = 2;
						break;
					case CMD_SENSEINT:
					case CMD_VERSION:
						cmdlen = 1;
						break;
					default: // Invalid Command
						cmdlen = 1;
						printf("Invalid FDC Command received: 0x%x\n", a);
						break;	
				}
			// Set CB (Busy) flag
			//fdc_status_main|=MAIN_CB;	
			}
			CmdByte++;
			if (CmdByte == cmdlen) { // Command phase finished
				switch(fdccommand[0]&0x1F) {
					case CMD_READDATA:
						fdc_read_data();
						break;
					case CMD_READDELETEDDATA:
						printf("*** Unimplemented FDC Command READ DELETED DATA\n");
						break;
					case CMD_WRITEDATA:
						printf("*** Unimplemented FDC Command WRITE DATA\n");
						break;
					case CMD_WRITEDELETEDDATA:
						printf("*** Unimplemented FDC Command WRITE DELETED DATA\n");
						break;
					case CMD_READDIAGNOSTIC:
						printf("*** Unimplemented FDC Command READ DIAGNOSTIC\n");
						break;
					case CMD_READID:
						// Read sector ID
						fdc_read_id();
						break;
					case CMD_WRITEID:
						printf("*** Unimplemented FDC Command WRITE ID\n");
						break;
					case CMD_SCANEQUAL:
						printf("*** Unimplemented FDC Command SCAN EQUAL\n");
						break;
					case CMD_SCANLOWEQUAL:
						printf("*** Unimplemented FDC Command SCAN LOW OR EQUAL\n");
						break;
					case CMD_SCANHIGHEQUAL:
						printf("*** Unimplemented FDC Command SCAN HIGH OR EQUAL\n");
						break;
					case CMD_RECALIBRATE:
						// Reset to track 0
						fdc_seek(0);
						break;
					case CMD_SENSEINT:
						// Get Interrupt status register
						fdc_senseint();
						break;
					case CMD_SPECIFY:
						// We really don't need to do anything here. This command only sets
						// physical timing parameters. These are not relevant to a virtual FDC.
						fdc_status_main&=~MAIN_CB; // Clear CB (busy) flag
						break;
					case CMD_SENSEDRV:
						printf("*** Unimplemented FDC Command SENSE DRIVE\n");
						break;
					case CMD_VERSION:
						printf("*** Unimplemented FDC Command VERSION\n");
						break;
					case CMD_SEEK:
						// Seek to a specified track
						fdc_seek(fdccommand[2]);
						break;
					default:
						break;
				}
				CmdByte = 0;
			}
			break;
		case P_EXECUTION: // Execution phase
			break;
		case P_RESULT: // There should be no write acces in result phase
			break;
	}
}