USBMSD: Add media removal event check function

pull/9444/head
Maciej Bocianski 2019-01-21 15:41:43 +01:00
parent 0e7f112653
commit 0cd9d24d08
2 changed files with 20 additions and 3 deletions

View File

@ -66,7 +66,7 @@ enum Status {
USBMSD::USBMSD(BlockDevice *bd, bool connect_blocking, uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
: USBDevice(get_usb_phy(), vendor_id, product_id, product_release),
_initialized(false), _in_task(&_queue), _out_task(&_queue), _reset_task(&_queue), _control_task(&_queue), _configure_task(&_queue), _bd(bd)
_initialized(false), _media_removed(false), _in_task(&_queue), _out_task(&_queue), _reset_task(&_queue), _control_task(&_queue), _configure_task(&_queue), _bd(bd)
{
_init();
if (connect_blocking) {
@ -78,7 +78,7 @@ USBMSD::USBMSD(BlockDevice *bd, bool connect_blocking, uint16_t vendor_id, uint1
USBMSD::USBMSD(USBPhy *phy, BlockDevice *bd, uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
: USBDevice(phy, vendor_id, product_id, product_release),
_initialized(false), _in_task(&_queue), _out_task(&_queue), _reset_task(&_queue), _control_task(&_queue), _configure_task(&_queue), _bd(bd)
_initialized(false), _media_removed(false), _in_task(&_queue), _out_task(&_queue), _reset_task(&_queue), _control_task(&_queue), _configure_task(&_queue), _bd(bd)
{
_init();
}
@ -161,6 +161,7 @@ bool USBMSD::connect()
//connect the device
USBDevice::connect();
_initialized = true;
_media_removed = false;
_mutex.unlock();
_mutex_init.unlock();
return true;
@ -213,7 +214,12 @@ void USBMSD::attach(mbed::Callback<void()> cb)
unlock();
}
int USBMSD::disk_read(uint8_t *data, uint64_t block, uint8_t count)
bool USBMSD::media_removed()
{
return _media_removed;
}
int USBMSD::disk_read(uint8_t* data, uint64_t block, uint8_t count)
{
bd_addr_t addr = block * _bd->get_erase_size();
bd_size_t size = count * _bd->get_erase_size();
@ -816,6 +822,7 @@ void USBMSD::CBWDecode(uint8_t *buf, uint16_t size)
case MEDIA_REMOVAL:
_csw.Status = CSW_PASSED;
sendCSW();
_media_removed = true;
break;
default:
fail();

View File

@ -123,6 +123,13 @@ public:
*/
void attach(mbed::Callback<void()> cb);
/**
* Check if MSD device was removed/unmounted on the host side.
*
* @returns true if device was removed/unmounted on the host side
*/
bool media_removed();
protected:
/*
@ -205,6 +212,9 @@ private:
// If this class has been initialized
bool _initialized;
// If msd device has been unmounted by host
volatile bool _media_removed;
//state of the bulk-only state machine
Stage _stage;