示例#1
0
/*-----------------------------------------------------------------------*/
DRESULT disk_read(BYTE drv,	/* Physical drive nmuber (0..) */
		  BYTE * buff,	/* Data buffer to store read data */
		  DWORD sector,	/* Sector address (LBA) */
		  BYTE count	/* Number of sectors to read (1..128) */
    )
{
	int result, i;
	switch (drv) {
	case SD:

		// translate the arguments here
		//xil_printf("readblock: %d %d\r\n",sector, count);
		for (i = 0; i < count; i++) {
			result =
			    mmc_read_block(sector + i,
					   buff + MMC_BLOCK_SIZE * i);
			if (result != 0)
				return RES_ERROR;
		};

		//print_block(buff, count*MMC_BLOCK_SIZE);
		return RES_OK;
	}
	return RES_PARERR;
}
示例#2
0
DRESULT diskRead (BYTE disk __attribute__ ((unused)), BYTE *buff, DWORD sector, BYTE count)
{
  DWORD res = 0;
  int i;

  if (gDiskStatus & DSTATUS_NOINIT) 
    return DRESULT_NOTRDY;
  if (!count) 
    return DRESULT_PARERR;
//printf("diskRead ( %d , %d )\n", sector, count);
  for (i = 0; i < count; i++)
  {
		res = mmc_read_block(i + sector);
int j;
for (j = 0 ; j < 512; j++)
{
//	printf("%x ", MMCRDData[j]);
//	if (((j+1) % 32) == 0) printf("\n");
}

		if (res == 0)
			memcpy(buff + i*512, MMCRDData, 512);
		else
			break;
  }
  
  if (res == 0)
    return DRESULT_OK;
  else
    return DRESULT_ERROR; 
}
示例#3
0
int MMC_disk_read(BYTE * buff, DWORD sector, BYTE count) {
  
  DWORD addr = sector * BLOCK_SIZE; 
  BYTE* ppos = buff; 
  BYTE c = 0; 
  for (c = 0; c < count; c++ ) {
    // read block into current buffer location
    mmc_read_block(addr, ppos); 
    
    ppos += BLOCK_SIZE; 
    
    addr += BLOCK_SIZE; 

  }
  
  return 0; 
}
示例#4
0
void mmc_command(struct doorbell_command_t *dbc)
{
	/* See sandbox_mmc.c for the command_data[] layout. */
	int fd;
	unsigned command = dbc->command_data[0];

	fd = open_mmc_file(get_mmc_device(dbc));

	if (fd == -1) {
		fprintf(stderr, "Unable to open/create '%s'\n",
			mmc_file[get_mmc_device(dbc)]);
		command_failure(dbc, dbc->device_id);
		return;
	}

	mmc_clear_results(dbc);

	switch (command) {
	case MMC_CMD_GO_IDLE_STATE:
		/* NOP */
		break;
	case MMC_CMD_SEND_OP_COND:
		mmc_send_op_cond(dbc);
		break;
	case MMC_CMD_ALL_SEND_CID:
		mmc_send_cid_register(dbc);
		break;
	case MMC_CMD_SET_RELATIVE_ADDR: /* SD_CMD_SEND_RELATIVE_ADDR */
		dbc->command_data[8]  = 0x500;
		break;
	case MMC_CMD_SWITCH:
		/* NOP */
		break;
	case MMC_CMD_SELECT_CARD:
		dbc->command_data[8] = MMC_STATUS_RDY_FOR_DATA | MMC_STATUS;
		break;
	case MMC_CMD_SEND_EXT_CSD:
		if (dbc->command_data[4] == 0)	/* SD_CMD_SEND_IF_COND */
			command_timeout(dbc, dbc->device_id);
		else				/* MMC_CMD_SEND_EXT_CSD */
			mmc_send_ext_csd_register(dbc);
		break;
	case MMC_CMD_SEND_CSD:
		mmc_send_csd_register(dbc);
		break;
	case MMC_CMD_STOP_TRANSMISSION:
		verbose("%s: ignored '%d' command\n", __func__, command);
		break;
	case MMC_CMD_SEND_STATUS:
		dbc->command_data[8] = MMC_STATUS_RDY_FOR_DATA | MMC_STATUS;
		break;
	case MMC_CMD_SET_BLOCKLEN:
		mmc_set_blocklen(dbc, dbc->command_data[2]);
		break;
	case MMC_CMD_READ_SINGLE_BLOCK: {
		const unsigned start = dbc->command_data[2];
		void *buf = (void *)(uintptr_t)dbc->command_data[4];
		mmc_read_block(dbc, fd, start, 1, buf);
		break;
	}
	case MMC_CMD_READ_MULTIPLE_BLOCK: {
		const unsigned start = dbc->command_data[2];
		void *buf = (void *)(uintptr_t)dbc->command_data[4];
		const unsigned len = dbc->command_data[6];

		mmc_read_block(dbc, fd, start, len, buf);
		break;
	}
	case MMC_CMD_WRITE_SINGLE_BLOCK: {
		const unsigned start = dbc->command_data[2];
		void *buf = (void *)(uintptr_t)dbc->command_data[4];

		mmc_write_block(dbc, fd, start, 1, buf);
		break;
	}
	case MMC_CMD_WRITE_MULTIPLE_BLOCK: {
		const unsigned start = dbc->command_data[2];
		void *buf = (void *)(uintptr_t)dbc->command_data[4];
		const unsigned len = dbc->command_data[6];

		mmc_write_block(dbc, fd, start, len, buf);
		break;
	}
	case MMC_CMD_ERASE_GROUP_START:
		mmc_erase_group_start(dbc, dbc->command_data[2]);
		break;
	case MMC_CMD_ERASE_GROUP_END:
		mmc_erase_group_end(dbc, dbc->command_data[2]);
		break;
	case MMC_CMD_ERASE:
		mmc_erase_group(dbc, fd,
				mmc_erase_group_start_block,
				mmc_erase_group_end_block);
		break;
	case SD_CMD_APP_SEND_OP_COND:
		dbc->command_data[8] = 0;
		command_timeout(dbc, dbc->device_id);
		break;
	case SD_CMD_APP_SEND_SCR:
		/* Do not support higher clock speeds */
		command_failure(dbc, dbc->device_id);
		break;
	case MMC_CMD_APP_CMD:
		dbc->command_data[8] = OCR_BUSY | OCR_HCS;
		break;
	default:
		mmc_unknown_command(dbc, command);
		break;
	}
	close(fd);
}