cmd.count = htons(op->count);
return cdb_cmd_data(op, &cmd, GET_GLOBAL(op->drive_g->blksize));
}
+
+// Write sectors.
+int
+cdb_write(struct disk_op_s *op)
+{
+ struct cdb_rwdata_10 cmd;
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.command = CDB_CMD_WRITE_10;
+ cmd.lba = htonl(op->lba);
+ cmd.count = htons(op->count);
+ return cdb_cmd_data(op, &cmd, GET_GLOBAL(op->drive_g->blksize));
+}
int cdb_read_capacity(struct disk_op_s *op, struct cdbres_read_capacity *data);
int cdb_inquiry(struct disk_op_s *op, struct cdbres_inquiry *data);
int cdb_read(struct disk_op_s *op);
+int cdb_write(struct disk_op_s *op);
#endif // blockcmd.h
u32 bytes = blocksize * op->count;
struct cbw_s cbw;
memset(&cbw, 0, sizeof(cbw));
+ memcpy(cbw.CBWCB, cdbcmd, USB_CDB_SIZE);
cbw.dCBWSignature = CBW_SIGNATURE;
cbw.dCBWTag = 999; // XXX
cbw.dCBWDataTransferLength = bytes;
- cbw.bmCBWFlags = USB_DIR_IN; // XXX
+ cbw.bmCBWFlags = (cbw.CBWCB[0] == CDB_CMD_WRITE_10) ? USB_DIR_OUT : USB_DIR_IN;
cbw.bCBWLUN = 0; // XXX
cbw.bCBWCBLength = USB_CDB_SIZE;
- memcpy(cbw.CBWCB, cdbcmd, USB_CDB_SIZE);
// Transfer cbw to device.
int ret = usb_msc_send(udrive_g, USB_DIR_OUT
if (ret)
goto fail;
- // Transfer data from device.
+ // Transfer data to/from device.
if (bytes) {
- ret = usb_msc_send(udrive_g, USB_DIR_IN, op->buf_fl, bytes);
+ ret = usb_msc_send(udrive_g, cbw.bmCBWFlags, op->buf_fl, bytes);
if (ret)
goto fail;
}
switch (op->command) {
case CMD_READ:
return cdb_read(op);
- case CMD_FORMAT:
case CMD_WRITE:
- return DISK_RET_EWRITEPROTECT;
+ return cdb_write(op);
+ case CMD_FORMAT:
case CMD_RESET:
case CMD_ISREADY:
case CMD_VERIFY: