mass_storage_scsi.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #pragma once
  2. #include <furi.h>
  3. #define SCSI_BLOCK_SIZE (0x200UL)
  4. #define SCSI_SK_ILLEGAL_REQUEST (5)
  5. #define SCSI_ASC_INVALID_COMMAND_OPERATION_CODE (0x20)
  6. #define SCSI_ASC_LBA_OOB (0x21)
  7. #define SCSI_ASC_INVALID_FIELD_IN_CDB (0x24)
  8. typedef struct {
  9. void* ctx;
  10. bool (*read)(
  11. void* ctx,
  12. uint32_t lba,
  13. uint16_t count,
  14. uint8_t* out,
  15. uint32_t* out_len,
  16. uint32_t out_cap);
  17. bool (*write)(void* ctx, uint32_t lba, uint16_t count, uint8_t* buf, uint32_t len);
  18. uint32_t (*num_blocks)(void* ctx);
  19. void (*eject)(void* ctx);
  20. } SCSIDeviceFunc;
  21. typedef struct {
  22. SCSIDeviceFunc fn;
  23. uint8_t* cmd;
  24. uint8_t cmd_len;
  25. bool rx_done;
  26. bool tx_done;
  27. uint8_t sk; // sense key
  28. uint8_t asc; // additional sense code
  29. // command-specific data
  30. // valid from cmd_start to cmd_end
  31. union {
  32. struct {
  33. uint16_t count;
  34. uint32_t lba;
  35. } read_10; // SCSI_READ_10
  36. struct {
  37. uint16_t count;
  38. uint32_t lba;
  39. } write_10; // SCSI_WRITE_10
  40. };
  41. } SCSISession;
  42. bool scsi_cmd_start(SCSISession* scsi, uint8_t* cmd, uint8_t len);
  43. bool scsi_cmd_rx_data(SCSISession* scsi, uint8_t* data, uint32_t len);
  44. bool scsi_cmd_tx_data(SCSISession* scsi, uint8_t* data, uint32_t* len, uint32_t cap);
  45. bool scsi_cmd_end(SCSISession* scsi);