udisk can be eject
This commit is contained in:
parent
4cdb0154ba
commit
02869d7e67
|
@ -368,6 +368,7 @@ typedef struct ureqest* ureq_t;
|
|||
#define SCSI_INQUIRY_CMD 0x12
|
||||
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1e
|
||||
#define SCSI_MODE_SENSE_6 0x1a
|
||||
#define SCSI_START_STOP 0x1b
|
||||
#define SCSI_READ_CAPACITIES 0x23
|
||||
#define SCSI_READ_CAPACITY 0x25
|
||||
#define SCSI_READ_10 0x28
|
||||
|
|
|
@ -33,6 +33,7 @@ static rt_device_t disk;
|
|||
static rt_uint32_t _block;
|
||||
static rt_uint32_t _count, _size;
|
||||
static struct rt_device_blk_geometry geometry;
|
||||
static rt_uint32_t _removed = 0;
|
||||
|
||||
static struct udevice_descriptor dev_desc =
|
||||
{
|
||||
|
@ -126,13 +127,13 @@ static rt_err_t _request_sense(udevice_t device, uep_t ep_in)
|
|||
|
||||
data.ErrorCode = 0x70;
|
||||
data.Valid = 0;
|
||||
data.SenseKey = 5;
|
||||
data.SenseKey = 2; //TODO
|
||||
data.Information[0] = 0;
|
||||
data.Information[1] = 0;
|
||||
data.Information[2] = 0;
|
||||
data.Information[3] = 0;
|
||||
data.AdditionalSenseLength = 0x0b;
|
||||
data.AdditionalSenseCode = 0x20;
|
||||
data.AdditionalSenseLength = 0x0a;
|
||||
data.AdditionalSenseCode = 0x3a; //TODO
|
||||
data.AdditionalSenseCodeQualifier =0;
|
||||
|
||||
dcd_ep_write(device->dcd, ep_in, (rt_uint8_t*)&data, sizeof(struct request_sense_data));
|
||||
|
@ -299,6 +300,19 @@ static rt_err_t _verify_10(udevice_t device)
|
|||
return RT_EOK;
|
||||
}
|
||||
|
||||
static void _send_status(udevice_t device, mass_eps_t eps, ustorage_csw_t csw)
|
||||
{
|
||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)csw, SIZEOF_CSW);
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
||||
status = STATUS_CBW;
|
||||
}
|
||||
|
||||
static void _start_stop(ustorage_cbw_t cbw)
|
||||
{
|
||||
//TODO
|
||||
_removed = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will handle mass storage bulk in endpoint request.
|
||||
*
|
||||
|
@ -315,11 +329,9 @@ static rt_err_t _ep_in_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
|||
eps = cls->eps;
|
||||
if (status == STATUS_CSW)
|
||||
{
|
||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
||||
status = STATUS_CBW;
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
||||
_send_status(device, eps, &csw);
|
||||
}
|
||||
if(status == STATUS_SEND)
|
||||
else if (status == STATUS_SEND)
|
||||
{
|
||||
rt_device_read(disk, _block, eps->ep_in->buffer, 1);
|
||||
dcd_ep_write(device->dcd, eps->ep_in, eps->ep_in->buffer,
|
||||
|
@ -388,8 +400,8 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
|||
switch(cbw->cb[0])
|
||||
{
|
||||
case SCSI_TEST_UNIT_READY:
|
||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
||||
csw.status = _removed;
|
||||
_send_status(device, eps, &csw);
|
||||
break;
|
||||
case SCSI_REQUEST_SENSE:
|
||||
_request_sense(device, eps->ep_in);
|
||||
|
@ -404,8 +416,7 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
|||
status = STATUS_CSW;
|
||||
break;
|
||||
case SCSI_ALLOW_MEDIUM_REMOVAL:
|
||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
||||
_send_status(device, eps, &csw);
|
||||
break;
|
||||
case SCSI_READ_CAPACITIES:
|
||||
_read_capacities(device, eps->ep_in);
|
||||
|
@ -425,6 +436,10 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
|||
case SCSI_VERIFY_10:
|
||||
_verify_10(device);
|
||||
break;
|
||||
case SCSI_START_STOP:
|
||||
_start_stop(cbw);
|
||||
_send_status(device, eps, &csw);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(status == STATUS_RECEIVE)
|
||||
|
@ -439,9 +454,7 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
|||
_block ++;
|
||||
if(_size == 0)
|
||||
{
|
||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
||||
status = STATUS_CBW;
|
||||
_send_status(device, eps, &csw);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -734,8 +734,8 @@ rt_err_t _reset_notify(udevice_t device)
|
|||
|
||||
RT_ASSERT(device != RT_NULL);
|
||||
|
||||
_stop_notify();
|
||||
_run_notify();
|
||||
_stop_notify(device);
|
||||
_run_notify(device);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue