Index: firmware/usbstack/usb_storage.c =================================================================== --- firmware/usbstack/usb_storage.c (revision 20339) +++ firmware/usbstack/usb_storage.c (working copy) @@ -74,6 +74,7 @@ #define SCSI_WRITE_10 0x2a #define SCSI_START_STOP_UNIT 0x1b #define SCSI_REPORT_LUNS 0xa0 +#define SCSI_WRITE_BUFFER 0x3b #define UMS_STATUS_GOOD 0x00 #define UMS_STATUS_FAIL 0x01 @@ -257,6 +258,7 @@ static void send_command_failed_result(void); static void send_block_data(void *data,int size); static void receive_block_data(void *data,int size); +static void receive_time(void); static void fill_inquiry(IF_MV_NONVOID(int lun)); static void send_and_read_next(void); static bool ejected[NUM_VOLUMES]; @@ -275,6 +277,7 @@ SENDING_RESULT, SENDING_FAILED_RESULT, RECEIVING_BLOCKS, + RECEIVING_TIME, SENDING_CSW } state = WAITING_FOR_COMMAND; @@ -591,6 +594,18 @@ cur_sense_data.ascq=0; } break; + case RECEIVING_TIME: + { + int year=(tb.transfer_buffer[0]<<8)+tb.transfer_buffer[1]; + int yearday=(tb.transfer_buffer[2]<<8)+tb.transfer_buffer[3]; + int hour=tb.transfer_buffer[5]; + int min=tb.transfer_buffer[6]; + int sec=tb.transfer_buffer[7]; + /* TODO: convert this into a struct tm that set_time() will + like, and call set_time() with it */ + send_csw(UMS_STATUS_GOOD); + } + break; } } @@ -1056,7 +1071,18 @@ } break; - + case SCSI_WRITE_BUFFER: + if(cbw->command_block[1]==1 + && cbw->command_block[2]==0 + && cbw->command_block[3]==0x0c + && cbw->command_block[4]==0 + && cbw->command_block[5]==0 + && cbw->command_block[6]==0 + && cbw->command_block[7]==0 + && cbw->command_block[8]==0 + && cbw->command_block[9]==0) + receive_time(); + break; default: logf("scsi unknown cmd %x",cbw->command_block[0x0]); send_csw(UMS_STATUS_FAIL); @@ -1085,6 +1111,11 @@ state = SENDING_FAILED_RESULT; } +static void receive_time(void) +{ + usb_drv_recv(ep_out, tb.transfer_buffer, 12); + state = RECEIVING_TIME; +} static void receive_block_data(void *data,int size) { usb_drv_recv(ep_out, data, size);