|
@@ -25,6 +25,8 @@
|
|
|
|
|
|
#include "bsp/board.h"
|
|
|
#include "tusb.h"
|
|
|
+#include "flash.h"
|
|
|
+#include "fsm.h"
|
|
|
|
|
|
#if CFG_TUD_MSC
|
|
|
|
|
@@ -32,6 +34,8 @@
|
|
|
#define DISK_BLOCK_NUM 1024
|
|
|
#define DISK_BLOCK_SIZE 512
|
|
|
|
|
|
+#define BLOCKS_PER_SECTOR (SPI_FLASH_SECTOR_SIZE / DISK_BLOCK_SIZE)
|
|
|
+
|
|
|
extern const unsigned char disk0_img[];
|
|
|
|
|
|
struct disk_lba {
|
|
@@ -39,11 +43,88 @@ struct disk_lba {
|
|
|
};
|
|
|
|
|
|
|
|
|
+static const uint8_t last_cluster_init_info[4] = { 0xF8, 0xFF, 0xFF, 0xFF };
|
|
|
+
|
|
|
+static const uint8_t disk1_mbr[DISK_BLOCK_SIZE] = {
|
|
|
+ 0xeb, 0x3c, 0x90, 0x6d, 0x6b, 0x66, 0x73, 0x2e, 0x66, 0x61, 0x74, 0x00,
|
|
|
+ 0x02, 0x04, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0xf8, 0x01, 0x00,
|
|
|
+ 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x80, 0x00, 0x29, 0x9d, 0x0b, 0x6e, 0xd0, 0x4e, 0x4f, 0x20, 0x4e, 0x41,
|
|
|
+ 0x4d, 0x45, 0x20, 0x20, 0x20, 0x20, 0x46, 0x41, 0x54, 0x31, 0x32, 0x20,
|
|
|
+ 0x20, 0x20, 0x0e, 0x1f, 0xbe, 0x5b, 0x7c, 0xac, 0x22, 0xc0, 0x74, 0x0b,
|
|
|
+ 0x56, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10, 0x5e, 0xeb, 0xf0, 0x32,
|
|
|
+ 0xe4, 0xcd, 0x16, 0xcd, 0x19, 0xeb, 0xfe, 0x54, 0x68, 0x69, 0x73, 0x20,
|
|
|
+ 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x6f,
|
|
|
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x2e, 0x20,
|
|
|
+ 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65,
|
|
|
+ 0x72, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x61, 0x62, 0x6c,
|
|
|
+ 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x70, 0x70, 0x79, 0x20, 0x61, 0x6e, 0x64,
|
|
|
+ 0x0d, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20,
|
|
|
+ 0x6b, 0x65, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x79, 0x20, 0x61,
|
|
|
+ 0x67, 0x61, 0x69, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x0d, 0x0a, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
// whether host does safe-eject
|
|
|
static bool ejected = false;
|
|
|
|
|
|
-static struct disk_lba lba_cache;
|
|
|
-static int lba_cached = -1;
|
|
|
+static struct disk_lba sector_cache[BLOCKS_PER_SECTOR];
|
|
|
+static int sector_cached = -1;
|
|
|
+
|
|
|
+static int sector_cache_load(uint32_t sector)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ if (sector * SPI_FLASH_SECTOR_SIZE > DRIVE_FLASH_SIZE) {
|
|
|
+ sector_cached = -1;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ //ret = flash_decrypt_read_sector(sector, sector_cache[0].data);
|
|
|
+ ret = flash_read(sector * SPI_FLASH_SECTOR_SIZE + DRIVE_FLASH_OFFSET,
|
|
|
+ sector_cache[0].data, SPI_FLASH_SECTOR_SIZE);
|
|
|
+ if (ret < 0) {
|
|
|
+ sector_cached = -1;
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ sector_cached = sector;
|
|
|
+}
|
|
|
+
|
|
|
+static void sector_cache_commit(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ uint32_t sector = sector_cached;
|
|
|
+ if (sector * SPI_FLASH_SECTOR_SIZE > DRIVE_FLASH_SIZE)
|
|
|
+ return;
|
|
|
+ //flash_encrypt_write_sector(sector, sector_cache[0].data);
|
|
|
+ flash_write(sector * SPI_FLASH_SECTOR_SIZE + DRIVE_FLASH_OFFSET,
|
|
|
+ sector_cache[0].data, SPI_FLASH_SECTOR_SIZE);
|
|
|
+}
|
|
|
|
|
|
struct drive {
|
|
|
const uint8_t lun;
|
|
@@ -55,7 +136,7 @@ struct drive {
|
|
|
|
|
|
#define N_DRIVES 2
|
|
|
|
|
|
-static uint8_t drv_active[N_DRIVES] = {1, 0};
|
|
|
+static uint8_t drv_active[N_DRIVES] = {1, 1};
|
|
|
|
|
|
|
|
|
const char global_vid[8] = "DLX";
|
|
@@ -64,14 +145,14 @@ const char vault_pid[16] = "MEP Vault";
|
|
|
const char global_rev[4] = "0.1";
|
|
|
|
|
|
static const struct drive Drives[N_DRIVES] = {
|
|
|
- { 0, "DLX", "MEP Tools", "0.1", 1024},
|
|
|
+ { 0, "DLX", "MEP Tools", "0.1", 256},
|
|
|
{ 1, "DLX", "MEP Vault", "0.1", 1024}
|
|
|
};
|
|
|
|
|
|
|
|
|
uint8_t tud_msc_get_maxlun_cb(void)
|
|
|
{
|
|
|
- return 1;
|
|
|
+ return 2;
|
|
|
}
|
|
|
|
|
|
// Invoked when received SCSI_CMD_INQUIRY
|
|
@@ -109,7 +190,7 @@ bool tud_msc_test_unit_ready_cb(uint8_t lun)
|
|
|
void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
|
|
|
{
|
|
|
if (lun >= N_DRIVES) {
|
|
|
- *block_count = DISK_BLOCK_NUM;
|
|
|
+ *block_count = 0;
|
|
|
*block_size = DISK_BLOCK_SIZE;
|
|
|
} else {
|
|
|
*block_count = Drives[lun].n_lba;
|
|
@@ -147,37 +228,37 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buff
|
|
|
{
|
|
|
|
|
|
const struct drive *drv;
|
|
|
- uint8_t const *addr;
|
|
|
+ uint32_t sector, sec_off;
|
|
|
if (lun >= N_DRIVES)
|
|
|
return -1;
|
|
|
drv = &Drives[lun];
|
|
|
|
|
|
if ( lba >= drv->n_lba )
|
|
|
return -1;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
if (lun == 0) {
|
|
|
struct disk_lba *msc_ro = (struct disk_lba *)disk0_img;
|
|
|
memcpy(buffer, msc_ro[lba].data + offset, bufsize);
|
|
|
asm volatile("DMB");
|
|
|
return bufsize;
|
|
|
} else {
|
|
|
-#if 0
|
|
|
- if ( lba != lba_cached) {
|
|
|
- if (lba == 0) {
|
|
|
- memcpy(lba_cache.data, mbr.data, sizeof(struct disk_lba));
|
|
|
- lba_cached = lba;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- memcpy(lba_cache.data, msc_ro[lba].data, sizeof(struct disk_lba));
|
|
|
- lba_cached = lba;
|
|
|
+ if (fsm_get() < VAULT_MAIN_MENU) {
|
|
|
+ memset(buffer, 0, bufsize);
|
|
|
+ return bufsize;
|
|
|
+ }
|
|
|
+ if (lba == 0) {
|
|
|
+ memcpy(buffer, disk1_mbr + offset, bufsize);
|
|
|
+ return bufsize;
|
|
|
+ }
|
|
|
+ sector = lba / BLOCKS_PER_SECTOR;
|
|
|
+ sec_off = lba - (sector * BLOCKS_PER_SECTOR);
|
|
|
+
|
|
|
+ if ( sector != sector_cached) {
|
|
|
+ sector_cache_load(sector);
|
|
|
return 0;
|
|
|
}
|
|
|
- memcpy(buffer, lba_cache.data + offset, bufsize);
|
|
|
-#endif
|
|
|
- memset(buffer, 0xA5, bufsize);
|
|
|
+ memcpy(buffer, sector_cache[sec_off].data + offset, bufsize);
|
|
|
+ asm volatile("DMB");
|
|
|
return bufsize;
|
|
|
}
|
|
|
}
|
|
@@ -185,8 +266,8 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buff
|
|
|
bool tud_msc_is_writable_cb (uint8_t lun)
|
|
|
{
|
|
|
if (lun != 1) {
|
|
|
- /* Read only. */
|
|
|
- return false;
|
|
|
+ /* Read only. */
|
|
|
+ return false;
|
|
|
} else {
|
|
|
return true;
|
|
|
}
|
|
@@ -196,13 +277,26 @@ bool tud_msc_is_writable_cb (uint8_t lun)
|
|
|
// Process data in buffer to disk's storage and return number of written bytes
|
|
|
int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)
|
|
|
{
|
|
|
- (void) lun;
|
|
|
- // out of ramdisk
|
|
|
- if ( lba >= DISK_BLOCK_NUM )
|
|
|
- return -1;
|
|
|
- /* Read only. Silently fail. */
|
|
|
- (void) lba; (void) offset; (void) buffer;
|
|
|
- return bufsize;
|
|
|
+ uint32_t sector, sec_off;
|
|
|
+ if (lun == 0)
|
|
|
+ return bufsize;
|
|
|
+ /*
|
|
|
+ if (lba == 0)
|
|
|
+ return bufsize;
|
|
|
+ */
|
|
|
+ if ( lba >= Drives[lun].n_lba)
|
|
|
+ return -1;
|
|
|
+ if (fsm_get() < VAULT_MAIN_MENU)
|
|
|
+ return -1;
|
|
|
+ sector = lba / BLOCKS_PER_SECTOR;
|
|
|
+ sec_off = lba - (sector * BLOCKS_PER_SECTOR);
|
|
|
+ if ( sector != sector_cached) {
|
|
|
+ sector_cache_load(sector);
|
|
|
+ }
|
|
|
+ memcpy(sector_cache[sec_off].data + offset, buffer, bufsize);
|
|
|
+ sector_cache_commit();
|
|
|
+ asm volatile("DMB");
|
|
|
+ return bufsize;
|
|
|
}
|
|
|
|
|
|
// Callback invoked when received an SCSI command not in built-in list below
|
|
@@ -251,4 +345,39 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
|
|
|
return resplen;
|
|
|
}
|
|
|
|
|
|
+void disk1_format(void)
|
|
|
+{
|
|
|
+ uint8_t block[DISK_BLOCK_SIZE];
|
|
|
+ int i, j;
|
|
|
+ if (cryptoengine_check_vault() < 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ memset(block, 0, DISK_BLOCK_SIZE);
|
|
|
+ for (i = 1; i < 5; i++) {
|
|
|
+ if (sector_cached != i) {
|
|
|
+ sector_cache_load(i);
|
|
|
+ }
|
|
|
+ for (j = 0; j < BLOCKS_PER_SECTOR; j++)
|
|
|
+ memcpy(sector_cache[j].data, block, DISK_BLOCK_SIZE);
|
|
|
+ sector_cache_commit();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Fill "last cluster" info */
|
|
|
+ sector_cache_load(0);
|
|
|
+ for (j = 0; j < BLOCKS_PER_SECTOR; j++)
|
|
|
+ memcpy(sector_cache[j].data, block, DISK_BLOCK_SIZE);
|
|
|
+ memcpy(sector_cache[0].data, disk1_mbr, DISK_BLOCK_SIZE);
|
|
|
+ memcpy(sector_cache[1].data, last_cluster_init_info, 4);
|
|
|
+ memcpy(sector_cache[2].data, last_cluster_init_info, 4);
|
|
|
+ sector_cache_commit();
|
|
|
+}
|
|
|
+
|
|
|
+void disk_crypto_activate(int status)
|
|
|
+{
|
|
|
+ drv_active[1] = status;
|
|
|
+ if (status) {
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#endif
|