Fix pasting to ext save data, possibly fix 128kb EEPROM support.

This commit is contained in:
Steven Smith 2016-06-04 17:05:07 -07:00
parent 253f808982
commit 2c9dffd4c0
13 changed files with 35 additions and 16 deletions

View File

@ -241,13 +241,22 @@ static Result spi_read_data(SaveChip chip, u32* bytesRead, void* data, u32 offse
break;
case CHIP_EEPROM_8KB:
case CHIP_EEPROM_64KB:
case CHIP_EEPROM_128KB:
cmdSize = 3;
cmd[0] = SPI_EEPROM_CMD_READ;
cmd[1] = (u8) (pos >> 8);
cmd[2] = (u8) pos;
res = spi_execute_command(chip, cmd, cmdSize, data, size, NULL, 0);
pos += size;
break;
case CHIP_EEPROM_128KB:
cmdSize = 4;
cmd[0] = SPI_EEPROM_CMD_READ;
cmd[1] = (u8) (pos >> 16);
cmd[2] = (u8) (pos >> 8);
cmd[3] = (u8) pos;
res = spi_execute_command(chip, cmd, cmdSize, data, size, NULL, 0);
pos += size;
break;
case CHIP_FLASH_256KB:
@ -305,12 +314,18 @@ static Result spi_write_data(SaveChip chip, u32* bytesWritten, void* data, u32 o
break;
case CHIP_EEPROM_8KB:
case CHIP_EEPROM_64KB:
case CHIP_EEPROM_128KB:
cmdSize = 3;
cmd[0] = SPI_EEPROM_CMD_WRITE;
cmd[1] = (u8) (pos >> 8);
cmd[2] = (u8) pos;
break;
case CHIP_EEPROM_128KB:
cmdSize = 4;
cmd[0] = SPI_EEPROM_CMD_WRITE;
cmd[1] = (u8) (pos >> 16);
cmd[2] = (u8) (pos >> 8);
cmd[3] = (u8) pos;
break;
case CHIP_FLASH_256KB:
case CHIP_FLASH_512KB:
case CHIP_FLASH_1MB:

View File

@ -57,7 +57,7 @@ static Result action_export_twl_save_read_src(void* data, u32 handle, u32* bytes
return spi_read_save(bytesRead, buffer, (u32) offset, size);
}
static Result action_export_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result action_export_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
export_twl_save_data* exportData = (export_twl_save_data*) data;
Result res = 0;

View File

@ -66,7 +66,7 @@ static Result action_import_twl_save_read_src(void* data, u32 handle, u32* bytes
return FSFILE_Read(handle, bytesRead, offset, buffer, size);
}
static Result action_import_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result action_import_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
return spi_init_card();
}

View File

@ -94,7 +94,7 @@ static Result action_install_cdn_read_src(void* data, u32 handle, u32* bytesRead
return res != HTTPC_RESULTCODE_DOWNLOADPENDING ? res : 0;
}
static Result action_install_cdn_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result action_install_cdn_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
install_cdn_data* installData = (install_cdn_data*) data;
if(index == 0) {

View File

@ -109,7 +109,7 @@ static Result action_install_cias_read_src(void* data, u32 handle, u32* bytesRea
return FSFILE_Read(handle, bytesRead, offset, buffer, size);
}
static Result action_install_cias_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result action_install_cias_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
install_cias_data* installData = (install_cias_data*) data;
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);

View File

@ -108,7 +108,7 @@ static Result action_install_tickets_read_src(void* data, u32 handle, u32* bytes
return FSFILE_Read(handle, bytesRead, offset, buffer, size);
}
static Result action_install_tickets_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result action_install_tickets_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
AM_DeleteTicket(((file_info*) ((list_item*) linked_list_get(&((install_tickets_data*) data)->contents, index))->data)->ticketInfo.titleId);
return AM_InstallTicketBegin(handle);
}

View File

@ -121,7 +121,7 @@ static Result action_paste_files_read_src(void* data, u32 handle, u32* bytesRead
return FSFILE_Read(handle, bytesRead, offset, buffer, size);
}
static Result action_paste_files_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result action_paste_files_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
paste_files_data* pasteData = (paste_files_data*) data;
Result res = 0;
@ -135,9 +135,13 @@ static Result action_paste_files_open_dst(void* data, u32 index, void* initialRe
pasteData->currExists = R_SUCCEEDED(FSUSER_OpenFile(&currHandle, pasteData->target->archive, *fsPath, FS_OPEN_READ, 0));
if(pasteData->currExists) {
FSFILE_Close(currHandle);
} else {
res = FSUSER_CreateFile(pasteData->target->archive, *fsPath, 0, size);
}
res = FSUSER_OpenFile(handle, pasteData->target->archive, *fsPath, FS_OPEN_WRITE | FS_OPEN_CREATE, 0);
if(R_SUCCEEDED(res)) {
res = FSUSER_OpenFile(handle, pasteData->target->archive, *fsPath, FS_OPEN_WRITE, 0);
}
util_free_path_utf8(fsPath);
} else {

View File

@ -36,7 +36,7 @@ static Result dumpnand_read_src(void* data, u32 handle, u32* bytesRead, void* bu
return FSFILE_Read(handle, bytesRead, offset, buffer, size);
}
static Result dumpnand_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result dumpnand_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
return FSUSER_OpenFileDirectly(handle, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""), fsMakePath(PATH_UTF16, u"/NAND.bin"), FS_OPEN_WRITE | FS_OPEN_CREATE, 0);
}

View File

@ -103,7 +103,7 @@ static Result networkinstall_read_src(void* data, u32 handle, u32* bytesRead, vo
return 0;
}
static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
network_install_data* networkInstallData = (network_install_data*) data;
Result res = 0;

View File

@ -104,7 +104,7 @@ static Result qrinstall_read_src(void* data, u32 handle, u32* bytesRead, void* b
return res != HTTPC_RESULTCODE_DOWNLOADPENDING ? res : 0;
}
static Result qrinstall_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result qrinstall_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
qr_install_data* qrInstallData = (qr_install_data*) data;
Result res = 0;

View File

@ -55,7 +55,7 @@ static Result task_data_op_copy(data_op_data* data, u32 index) {
if(data->currTotal == 0) {
if(data->copyEmpty) {
u32 dstHandle = 0;
if(R_SUCCEEDED(res = data->openDst(data->data, index, NULL, &dstHandle))) {
if(R_SUCCEEDED(res = data->openDst(data->data, index, NULL, data->currTotal, &dstHandle))) {
res = data->closeDst(data->data, index, true, dstHandle);
}
} else {
@ -86,7 +86,7 @@ static Result task_data_op_copy(data_op_data* data, u32 index) {
if(firstRun) {
firstRun = false;
if(R_FAILED(res = data->openDst(data->data, index, buffer, &dstHandle))) {
if(R_FAILED(res = data->openDst(data->data, index, buffer, data->currTotal, &dstHandle))) {
break;
}
}

View File

@ -109,7 +109,7 @@ typedef struct data_op_info_s {
Result (*getSrcSize)(void* data, u32 handle, u64* size);
Result (*readSrc)(void* data, u32 handle, u32* bytesRead, void* buffer, u64 offset, u32 size);
Result (*openDst)(void* data, u32 index, void* initialReadBlock, u32* handle);
Result (*openDst)(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle);
Result (*closeDst)(void* data, u32 index, bool succeeded, u32 handle);
Result (*writeDst)(void* data, u32 handle, u32* bytesWritten, void* buffer, u64 offset, u32 size);

View File

@ -87,7 +87,7 @@ static Result update_read_src(void* data, u32 handle, u32* bytesRead, void* buff
return res != HTTPC_RESULTCODE_DOWNLOADPENDING ? res : 0;
}
static Result update_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
static Result update_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) {
if(util_get_3dsx_path() != NULL) {
FS_Path* path = util_make_path_utf8(util_get_3dsx_path());
if(path != NULL) {