/** * \brief Initialize a disk. * * \param drv Physical drive number (0..). * * \return 0 or disk status in combination of DSTATUS bits * (STA_NOINIT, STA_PROTECT). */ DSTATUS disk_initialize(BYTE drv) { int i; Ctrl_status mem_status; #if 0 /* Default RTC configuration, 24-hour mode */ rtc_set_hour_mode(RTC, 0); #endif #if 0 configure_rtc_calendar(); #endif #if LUN_USB /* USB disk with multiple LUNs */ if (drv > LUN_ID_USB + Lun_usb_get_lun()) { return STA_NOINIT; } #else if (drv > MAX_LUN) { /* At least one of the LUN should be defined */ return STA_NOINIT; } #endif /* Check LUN ready (USB disk report CTRL_BUSY then CTRL_GOOD) */ for (i = 0; i < 2; i ++) { mem_status = mem_test_unit_ready(drv); if (CTRL_BUSY != mem_status) { break; } } if (mem_status != CTRL_GOOD) { return STA_NOINIT; } /* Check Write Protection Status */ if (mem_wr_protect(drv)) { return STA_PROTECT; } /* The memory should already be initialized */ return 0; }
U8 get_nb_lun(void) { #if MEM_USB == ENABLE # ifndef Lun_usb_get_lun # define Lun_usb_get_lun() host_get_lun() # endif U8 nb_lun; if (!Ctrl_access_lock()) return MAX_LUN; nb_lun = MAX_LUN + Lun_usb_get_lun(); Ctrl_access_unlock(); return nb_lun; #else return MAX_LUN; #endif }
/** * \brief Initialize a disk. * * \param drv Physical drive number (0..). * * \return 0 or disk status in combination of DSTATUS bits * (STA_NOINIT, STA_PROTECT). */ DSTATUS disk_initialize(BYTE drv) { #if LUN_USB /* USB disk with multiple LUNs */ if (drv > LUN_ID_USB + Lun_usb_get_lun()) { return STA_NOINIT; } #else if (drv > MAX_LUN) { /* At least one of the LUN should be defined */ return STA_NOINIT; } #endif MutexLocker lock((drv >= SD_MMC_HSMCI_MEM_CNT) ? Tasks::GetSpiMutex() : nullptr); Ctrl_status mem_status; /* Check LUN ready (USB disk report CTRL_BUSY then CTRL_GOOD) */ for (int i = 0; i < 2; i ++) { mem_status = mem_test_unit_ready(drv); if (CTRL_BUSY != mem_status) { break; } } if (mem_status != CTRL_GOOD) { return STA_NOINIT; } /* Check Write Protection Status */ if (mem_wr_protect(drv)) { return STA_PROTECT; } /* The memory should already be initialized */ return 0; }