24UMAS_DATA_T *g_umas =
NULL;
26static uint32_t g_sector_size, g_total_sector_num;
30static uint8_t usb_stor_sense_notready[18] =
39static int run_scsi_command(SCSI_CMD_T *srb, UMAS_DATA_T *umas)
42 if(srb->sc_data_direction == SCSI_DATA_UNKNOWN)
44 UMAS_DEBUG(
"run_scsi_command - UNKNOWN data direction\n");
45 umas->srb.result = DID_ERROR << 16;
51 if(umas->srb.target && (!(umas->flags & UMAS_FL_SCM_MULT_TARG)))
53 UMAS_DEBUG(
"run_scsi_command - Bad target number (%d/%d)\n", umas->srb.target, umas->srb.lun);
54 umas->srb.result = DID_BAD_TARGET << 16;
59 if(umas->srb.lun > umas->max_lun)
61 UMAS_DEBUG(
"run_scsi_command - Bad LUN (%d/%d)\n", srb->target, srb->lun);
62 umas->srb.result = DID_BAD_TARGET << 16;
67 if((srb->cmnd[0] == START_STOP) && (umas->flags & UMAS_FL_START_STOP))
69 UMAS_DEBUG(
"run_scsi_command - Skipping START_STOP command\n");
70 umas->srb.result = GOOD << 1;
77 UMAS_DEBUG(
"run_scsi_command - Request is for removed device\n");
82 if(umas->srb.cmnd[0] == REQUEST_SENSE)
84 memcpy(srb->request_buff,
85 usb_stor_sense_notready,
sizeof(usb_stor_sense_notready));
86 srb->result = GOOD << 1;
90 memcpy(srb->sense_buffer,
91 usb_stor_sense_notready,
sizeof(usb_stor_sense_notready));
92 srb->result = CHECK_CONDITION << 1;
97#ifdef UMAS_VERBOSE_DEBUG
98 UMAS_DEBUG_ShowCommand(srb);
101 umas->proto_handler(srb, umas);
105 if(umas->srb.result != DID_ABORT << 16)
107 UMAS_VDEBUG(
"run_scsi_command - scsi cmd done, result=0x%x\n", srb->result);
111 UMAS_DEBUG(
"run_scsi_command - scsi command aborted\n");
118int test_unit_ready(UMAS_DATA_T *umas,
int lun)
120 SCSI_CMD_T *srb = &umas->srb;
122 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
123 srb->cmnd[0] = TEST_UNIT_READY;
124 srb->cmnd[1] = lun << 5;
126 srb->request_bufflen = 0;
128 srb->sc_data_direction = SCSI_DATA_READ;
129 srb->sense_buffer[0] = 0;
130 srb->sense_buffer[2] = 0;
131 return run_scsi_command(srb, umas);
135int request_sense(UMAS_DATA_T *umas,
int lun)
137 SCSI_CMD_T *srb = &umas->srb;
139 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
140 srb->cmnd[0] = REQUEST_SENSE;
141 srb->cmnd[1] = lun << 5;
144 srb->request_bufflen = 18;
146 srb->sc_data_direction = SCSI_DATA_READ;
147 return run_scsi_command(srb, umas);
151int try_test_unit_ready(UMAS_DATA_T *umas)
155 for(retries = 0; retries < 10; retries++)
157 if(test_unit_ready(umas, 0) == 0)
170int usbh_umas_disk_status(
void)
178DRESULT usbh_umas_ioctl(
int cmd,
void *buff)
185 case GET_SECTOR_COUNT:
186 *(uint32_t *)buff = g_total_sector_num;
189 case GET_SECTOR_SIZE:
190 *(uint32_t *)buff = g_sector_size;
194 *(uint32_t *)buff = g_sector_size;
197 case CTRL_ERASE_SECTOR:
204DRESULT usbh_umas_read(uint8_t *buff, uint32_t sector_no,
int number_of_sector)
213 if(sector_no >= g_total_sector_num)
215 UMAS_DEBUG(
"usbh_umas_read - exceed disk size! (%d/%d)\n", sector_no, g_total_sector_num);
223 srb->request_buff = (uint8_t *)buff;
225 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
226 srb->cmnd[0] = READ_10;
227 srb->cmnd[1] = g_disk_lun << 5;
228 srb->cmnd[2] = (sector_no >> 24) & 0xFF;
229 srb->cmnd[3] = (sector_no >> 16) & 0xFF;
230 srb->cmnd[4] = (sector_no >> 8) & 0xFF;
231 srb->cmnd[5] = sector_no & 0xFF;
232 srb->cmnd[7] = (number_of_sector >> 8) & 0xFF;
233 srb->cmnd[8] = number_of_sector & 0xFF;
236 srb->request_bufflen = g_sector_size * number_of_sector;
239 srb->sc_data_direction = SCSI_DATA_READ;
241 if(run_scsi_command(srb, g_umas) != 0)
249 UMAS_DEBUG(
"usbh_umas_read - failed at sector %d (%d)\n", sector_no, number_of_sector);
257DRESULT usbh_umas_write(uint8_t *buff, uint32_t sector_no,
int number_of_sector)
265 if(sector_no >= g_total_sector_num)
267 UMAS_DEBUG(
"usbh_umas_write - exceed disk size! (%d/%d)\n", sector_no, g_total_sector_num);
275 srb->request_buff = (uint8_t *)buff;
277 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
278 srb->cmnd[0] = WRITE_10;
279 srb->cmnd[1] = g_disk_lun << 5;
280 srb->cmnd[2] = (sector_no >> 24) & 0xFF;
281 srb->cmnd[3] = (sector_no >> 16) & 0xFF;
282 srb->cmnd[4] = (sector_no >> 8) & 0xFF;
283 srb->cmnd[5] = sector_no & 0xFF;
284 srb->cmnd[7] = (number_of_sector >> 8) & 0xFF;
285 srb->cmnd[8] = number_of_sector & 0xFF;
288 srb->request_bufflen = g_sector_size * number_of_sector;
291 srb->sc_data_direction = SCSI_DATA_WRITE;
293 if(run_scsi_command(srb, g_umas) != 0)
301 UMAS_DEBUG(
"usbh_umas_write - failed at sector %d (%d)\n", sector_no, number_of_sector);
308int UMAS_InitUmasDevice(UMAS_DATA_T *umas)
311 SCSI_CMD_T *srb = &umas->srb;
313 uint32_t stack_buff[256 / 4];
315 memset(srb, 0,
sizeof(SCSI_CMD_T));
316 srb->request_buff = (
void *)&stack_buff[0];
317 memset(srb->request_buff, 0, 256);
319 for(g_disk_lun = umas->max_lun; g_disk_lun >= 0; g_disk_lun--)
321 UMAS_DEBUG(
"\n\n\n******* Read lun %d ******\n\n", g_disk_lun);
323 UMAS_DEBUG(
"INQUIRY ==>\n");
324 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
325 srb->cmnd[0] = INQUIRY;
326 srb->cmnd[1] = g_disk_lun << 5;
329 srb->request_bufflen = 36;
331 srb->sc_data_direction = SCSI_DATA_READ;
333 if(run_scsi_command(srb, umas) != 0)
334 UMAS_DEBUG(
"INQUIRY - command failed!\n");
336 UMAS_DEBUG(
"TEST UNIT READY ==>\n");
338 for(retries = 0; retries < 3; retries++)
340 if(test_unit_ready(umas, g_disk_lun) != 0)
345 else if(srb->result == 0)
351 if((srb->result < 0) || (srb->sense_buffer[2] != UNIT_ATTENTION))
353 UMAS_DEBUG(
"TEST_UNIT_READY not UNIT_ATTENTION!\n");
362 if((srb->result < 0) &&
363 (srb->sense_buffer[2] == UNIT_ATTENTION) &&
364 (srb->sense_buffer[12] == 0x3A))
366 UMAS_DEBUG(
"TEST_UNIT_READY - no media\n");
372 if((srb->result < 0) && (srb->sense_buffer[2] == NOT_READY))
374 UMAS_DEBUG(
"TEST_UNIT_READY - not ready, will retry.\n");
379 if(bHasMedia ==
FALSE)
382 UMAS_DEBUG(
"REQUEST SENSE ==>\n");
384 if(request_sense(umas, g_disk_lun) == 0)
387 if((srb->request_buff[16] == 0) && (srb->request_buff[17] == 0))
388 UMAS_DEBUG(
"REQUEST_SENSE - no sense\n");
390 UMAS_DEBUG(
"REQUEST_SENSE - attention %02x %02x\n", srb->request_buff[16], srb->request_buff[17]);
393 UMAS_DEBUG(
"REQUEST_SENSE failed!\n");;
395 UMAS_DEBUG(
"READ CAPACITY ==>\n");
396 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
397 srb->cmnd[0] = READ_CAPACITY;
398 srb->cmnd[1] = g_disk_lun << 5;
400 srb->sense_buffer[0] = 0;
401 srb->sense_buffer[2] = 0;
402 srb->sc_data_direction = SCSI_DATA_READ;
403 if(run_scsi_command(srb, umas) != 0)
405 UMAS_DEBUG(
"READ_CAPACITY failed!\n");
409 g_total_sector_num = (srb->request_buff[0] << 24) | (srb->request_buff[1] << 16) |
410 (srb->request_buff[2] << 8) | srb->request_buff[3];
411 g_sector_size = (srb->request_buff[4] << 24) | (srb->request_buff[5] << 16) |
412 (srb->request_buff[6] << 8) | srb->request_buff[7];
414 UMAS_DEBUG(
"USB disk found: size=%d MB, uTotalSectorN=%d\n", g_total_sector_num / 2048, g_total_sector_num);
416 ((mass_disk_t*)umas)->sector_size = g_sector_size;
417 ((mass_disk_t *)umas)->sector_number = g_total_sector_num;
422 printf(
"g_disk_lun = %d\n", g_disk_lun);
431void UMAS_ScanDeviceLun(UMAS_DATA_T *umas)
465 UMAS_DATA_T *backup_umas;
471 backup_umas = g_umas;
472 g_umas = (UMAS_DATA_T *)disk;
473 ret = usbh_umas_read(buff, sectorN, scnt);
474 g_umas = backup_umas;
495 UMAS_DATA_T *backup_umas;
501 backup_umas = g_umas;
502 g_umas = (UMAS_DATA_T *)disk;
503 ret = usbh_umas_write(buff, sectorN, scnt);
504 g_umas = backup_umas;
int32_t USBH_MassRawRead(mass_disk_t *disk, uint32_t sectorN, int32_t scnt, uint8_t *buff)
Read raw data from connected USB Mass Storage disk.
int32_t USBH_MassRawWrite(mass_disk_t *disk, uint32_t sectorN, int32_t scnt, uint8_t *buff)
Write raw data to connected USB Mass Storage disk.
USB Host core driver header file.
void usbh_mdelay(uint32_t msec)
USB Host Mass Storage driver header file.