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;
198 case CTRL_ERASE_SECTOR:
209DRESULT usbh_umas_read(uint8_t *buff, uint32_t sector_no,
int number_of_sector)
218 if (sector_no >= g_total_sector_num)
220 UMAS_DEBUG(
"usbh_umas_read - exceed disk size! (%d/%d)\n", sector_no, g_total_sector_num);
228 srb->request_buff = (uint8_t *)buff;
230 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
231 srb->cmnd[0] = READ_10;
232 srb->cmnd[1] = g_disk_lun << 5;
233 srb->cmnd[2] = (sector_no >> 24) & 0xFF;
234 srb->cmnd[3] = (sector_no >> 16) & 0xFF;
235 srb->cmnd[4] = (sector_no >> 8) & 0xFF;
236 srb->cmnd[5] = sector_no & 0xFF;
237 srb->cmnd[7] = (number_of_sector >> 8) & 0xFF;
238 srb->cmnd[8] = number_of_sector & 0xFF;
241 srb->request_bufflen = g_sector_size * number_of_sector;
244 srb->sc_data_direction = SCSI_DATA_READ;
246 if (run_scsi_command(srb, g_umas) != 0)
254 UMAS_DEBUG(
"usbh_umas_read - failed at sector %d (%d)\n", sector_no, number_of_sector);
262DRESULT usbh_umas_write(uint8_t *buff, uint32_t sector_no,
int number_of_sector)
270 if (sector_no >= g_total_sector_num)
272 UMAS_DEBUG(
"usbh_umas_write - exceed disk size! (%d/%d)\n", sector_no, g_total_sector_num);
280 srb->request_buff = (uint8_t *)buff;
282 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
283 srb->cmnd[0] = WRITE_10;
284 srb->cmnd[1] = g_disk_lun << 5;
285 srb->cmnd[2] = (sector_no >> 24) & 0xFF;
286 srb->cmnd[3] = (sector_no >> 16) & 0xFF;
287 srb->cmnd[4] = (sector_no >> 8) & 0xFF;
288 srb->cmnd[5] = sector_no & 0xFF;
289 srb->cmnd[7] = (number_of_sector >> 8) & 0xFF;
290 srb->cmnd[8] = number_of_sector & 0xFF;
293 srb->request_bufflen = g_sector_size * number_of_sector;
296 srb->sc_data_direction = SCSI_DATA_WRITE;
298 if (run_scsi_command(srb, g_umas) != 0)
306 UMAS_DEBUG(
"usbh_umas_write - failed at sector %d (%d)\n", sector_no, number_of_sector);
313int UMAS_InitUmasDevice(UMAS_DATA_T *umas)
316 SCSI_CMD_T *srb = &umas->srb;
318 uint32_t stack_buff[256/4];
320 memset(srb, 0,
sizeof(SCSI_CMD_T));
321 srb->request_buff = (
void *)&stack_buff[0];
322 memset(srb->request_buff, 0, 256);
324 for (g_disk_lun = umas->max_lun; g_disk_lun >= 0; g_disk_lun--)
326 UMAS_DEBUG(
"\n\n\n******* Read lun %d ******\n\n", g_disk_lun);
328 UMAS_DEBUG(
"INQUIRY ==>\n");
329 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
330 srb->cmnd[0] = INQUIRY;
331 srb->cmnd[1] = g_disk_lun << 5;
334 srb->request_bufflen = 36;
336 srb->sc_data_direction = SCSI_DATA_READ;
338 if (run_scsi_command(srb, umas) != 0)
339 UMAS_DEBUG(
"INQUIRY - command failed!\n");
341 UMAS_DEBUG(
"TEST UNIT READY ==>\n");
343 for (retries = 0; retries < 3; retries++)
345 if (test_unit_ready(umas, g_disk_lun) != 0)
350 else if (srb->result == 0)
356 if ((srb->result < 0) || (srb->sense_buffer[2] != UNIT_ATTENTION))
358 UMAS_DEBUG(
"TEST_UNIT_READY not UNIT_ATTENTION!\n");
367 if ((srb->result < 0) &&
368 (srb->sense_buffer[2] == UNIT_ATTENTION) &&
369 (srb->sense_buffer[12] == 0x3A))
371 UMAS_DEBUG(
"TEST_UNIT_READY - no media\n");
377 if ((srb->result < 0) && (srb->sense_buffer[2] == NOT_READY))
379 UMAS_DEBUG(
"TEST_UNIT_READY - not ready, will retry.\n");
384 if (bHasMedia ==
FALSE)
387 UMAS_DEBUG(
"REQUEST SENSE ==>\n");
389 if (request_sense(umas, g_disk_lun) == 0)
392 if ((srb->request_buff[16] == 0) && (srb->request_buff[17] == 0))
393 UMAS_DEBUG(
"REQUEST_SENSE - no sense\n");
395 UMAS_DEBUG(
"REQUEST_SENSE - attention %02x %02x\n", srb->request_buff[16], srb->request_buff[17]);
398 UMAS_DEBUG(
"REQUEST_SENSE failed!\n");;
400 UMAS_DEBUG(
"READ CAPACITY ==>\n");
401 memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
402 srb->cmnd[0] = READ_CAPACITY;
403 srb->cmnd[1] = g_disk_lun << 5;
405 srb->sense_buffer[0] = 0;
406 srb->sense_buffer[2] = 0;
407 srb->sc_data_direction = SCSI_DATA_READ;
408 if (run_scsi_command(srb, umas) != 0)
410 UMAS_DEBUG(
"READ_CAPACITY failed!\n");
414 g_total_sector_num = (srb->request_buff[0] << 24) | (srb->request_buff[1] << 16) |
415 (srb->request_buff[2] << 8) | srb->request_buff[3];
416 g_sector_size = (srb->request_buff[4] << 24) | (srb->request_buff[5] << 16) |
417 (srb->request_buff[6] << 8) | srb->request_buff[7];
419 UMAS_DEBUG(
"USB disk found: size=%d MB, uTotalSectorN=%d\n", g_total_sector_num / 2048, g_total_sector_num);
422 ((
mass_disk_t *)umas)->sector_number = g_total_sector_num;
427 printf(
"g_disk_lun = %d\n", g_disk_lun);
436void UMAS_ScanDeviceLun(UMAS_DATA_T *umas)
470 UMAS_DATA_T *backup_umas;
476 backup_umas = g_umas;
477 g_umas = (UMAS_DATA_T *)disk;
478 ret = usbh_umas_read(buff, sectorN, scnt);
479 g_umas = backup_umas;
500 UMAS_DATA_T *backup_umas;
506 backup_umas = g_umas;
507 g_umas = (UMAS_DATA_T *)disk;
508 ret = usbh_umas_write(buff, sectorN, scnt);
509 g_umas = backup_umas;
NUC472/NUC442 peripheral access layer header file. This file contains all the peripheral register's d...
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.
#define NULL
NULL pointer.
#define TRUE
Boolean true, define to use in API parameters or return value.
#define FALSE
Boolean false, define to use in API parameters or return value.
USB Host core driver header file.
USB Host Mass Storage driver header file.