Quick & dirty HD write implementation. Hey, it works!

This commit is contained in:
Jeroen Domburg 2017-09-28 23:51:04 +08:00
parent 20c4e48be2
commit cb147908ee
4 changed files with 36 additions and 8 deletions

View File

@ -25,16 +25,27 @@ const uint8_t inq_resp[95]={
'1','.','0',' ',' ',' ',' ',' ', //prod rev lvl
};
static void writeSector(HdPriv *hd, unsigned int lba, uint8_t *data) {
uint8_t *secdat=malloc(4096);
assert(secdat);
unsigned int lbaStart=lba&(~7);
unsigned int lbaOff=lba&7;
assert(esp_partition_read(hd->part, lbaStart*512, secdat, 4096)==ESP_OK);
assert(esp_partition_erase_range(hd->part, lbaStart*512, 4096)==ESP_OK);
for (int i=0; i<512; i++) secdat[lbaOff*512+i]=data[i];
assert(esp_partition_write(hd->part, lbaStart*512, secdat, 4096)==ESP_OK);
free(secdat);
}
static int hdScsiCmd(SCSITransferData *data, unsigned int cmd, unsigned int len, unsigned int lba, void *arg) {
int ret=0;
static uint8_t *bb=NULL;
HdPriv *hd=(HdPriv*)arg;
if (cmd==0x8 || cmd==0x28) { //read
printf("HD: Read %d bytes from LBA %d.\n", len*512, lba);
#if 0 //spi ram read/write does not play well with flash reads
assert(esp_partition_read(hd->part, lba*512, data->data, len*512)==ESP_OK);
#else
#if 0
//alternate mmap solution
uint8_t *buf;
spi_flash_mmap_handle_t handle;
esp_partition_mmap(hd->part, lba*512, len*512, SPI_FLASH_MMAP_DATA, &buf, &handle);
@ -43,6 +54,15 @@ static int hdScsiCmd(SCSITransferData *data, unsigned int cmd, unsigned int len,
#endif
// hexdump(data->data, len*512);
ret=len*512;
} else if (cmd==0x0A || cmd==0x2A) { //write
uint8_t *dp=data->data;
while(len) {
writeSector(hd, lba, dp);
lba++;
dp+=512;
len--;
}
ret=0;
} else if (cmd==0x12) { //inquiry
printf("HD: Inquery\n");
memcpy(data->data, inq_resp, sizeof(inq_resp));

View File

@ -107,7 +107,7 @@ static void parseScsiCmd(int isRead) {
printf("SCSI: UNSUPPORTED CMD %x\n", cmd);
return;
}
// printf("SCSI: CMD %x LBA %x LEN %x CTRL %x\n", cmd, lba, len, ctrl);
printf("SCSI: CMD %x LBA %x LEN %x CTRL %x %s\n", cmd, lba, len, ctrl, isRead?"*READ*":"*WRITE*");
if (ncr.dev[ncr.selected]) {
ncr.datalen=ncr.dev[ncr.selected]->scsiCmd(&ncr.data, cmd, len, lba, ncr.dev[ncr.selected]->arg);
}
@ -178,9 +178,13 @@ unsigned int ncrRead(unsigned int addr, unsigned int dack) {
void ncrWrite(unsigned int addr, unsigned int dack, unsigned int val) {
unsigned int pc=m68k_get_reg(NULL, M68K_REG_PC);
if (addr==0) {
if (ncr.mode&MODE_DMA && dack) {
printf("UNSUPPORTED: dma write\n");
ncr.buf[ncr.bufpos]=val;
if ((ncr.tcr&TCR_IO)==0) {
if (ncr.bufpos!=ncr.bufmax) ncr.bufpos++;
}
}
ncr.dout=val;
ncr.din=val;
@ -234,10 +238,10 @@ void ncrWrite(unsigned int addr, unsigned int dack, unsigned int val) {
int newtcr=(val&7);
if (oldtcr==0 && ncr.bufpos) {
//End of data out phase
parseScsiCmd(1);
parseScsiCmd(0);
} else if ((oldtcr==TCR_CD) && (newtcr==TCR_IO)) {
//Start of data in phase
parseScsiCmd(0);
parseScsiCmd(1);
}
if ((ncr.tcr&0x7)==TCR_IO) {
printf("Data Out finished: Host read %d/%d bytes.\n", ncr.bufpos, ncr.datalen);

View File

@ -33,6 +33,11 @@ static int hdScsiCmd(SCSITransferData *data, unsigned int cmd, unsigned int len,
fread(data->data, 512, len, hd->f);
printf("HD: Read %d bytes.\n", len*512);
ret=len*512;
} else if (cmd==0xA || cmd==0x2A) { //write
fseek(hd->f, lba*512, SEEK_SET);
fwrite(data->data, 512, len, hd->f);
printf("HD: Write %d bytes\n", len*512);
ret=0;
} else if (cmd==0x12) { //inquiry
printf("HD: Inquery\n");
memcpy(data->data, inq_resp, sizeof(inq_resp));

View File

@ -3,7 +3,6 @@
#define TME_ROMSIZE (128*1024)
#ifdef CONFIG_SPIRAM_SUPPORT_MALLOC
#if 1