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_INQUIRY_CMD 0x12
|
||||||
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1e
|
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1e
|
||||||
#define SCSI_MODE_SENSE_6 0x1a
|
#define SCSI_MODE_SENSE_6 0x1a
|
||||||
|
#define SCSI_START_STOP 0x1b
|
||||||
#define SCSI_READ_CAPACITIES 0x23
|
#define SCSI_READ_CAPACITIES 0x23
|
||||||
#define SCSI_READ_CAPACITY 0x25
|
#define SCSI_READ_CAPACITY 0x25
|
||||||
#define SCSI_READ_10 0x28
|
#define SCSI_READ_10 0x28
|
||||||
|
|
|
@ -33,6 +33,7 @@ static rt_device_t disk;
|
||||||
static rt_uint32_t _block;
|
static rt_uint32_t _block;
|
||||||
static rt_uint32_t _count, _size;
|
static rt_uint32_t _count, _size;
|
||||||
static struct rt_device_blk_geometry geometry;
|
static struct rt_device_blk_geometry geometry;
|
||||||
|
static rt_uint32_t _removed = 0;
|
||||||
|
|
||||||
static struct udevice_descriptor dev_desc =
|
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.ErrorCode = 0x70;
|
||||||
data.Valid = 0;
|
data.Valid = 0;
|
||||||
data.SenseKey = 5;
|
data.SenseKey = 2; //TODO
|
||||||
data.Information[0] = 0;
|
data.Information[0] = 0;
|
||||||
data.Information[1] = 0;
|
data.Information[1] = 0;
|
||||||
data.Information[2] = 0;
|
data.Information[2] = 0;
|
||||||
data.Information[3] = 0;
|
data.Information[3] = 0;
|
||||||
data.AdditionalSenseLength = 0x0b;
|
data.AdditionalSenseLength = 0x0a;
|
||||||
data.AdditionalSenseCode = 0x20;
|
data.AdditionalSenseCode = 0x3a; //TODO
|
||||||
data.AdditionalSenseCodeQualifier =0;
|
data.AdditionalSenseCodeQualifier =0;
|
||||||
|
|
||||||
dcd_ep_write(device->dcd, ep_in, (rt_uint8_t*)&data, sizeof(struct request_sense_data));
|
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;
|
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.
|
* This function will handle mass storage bulk in endpoint request.
|
||||||
*
|
*
|
||||||
|
@ -313,13 +327,11 @@ static rt_err_t _ep_in_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
||||||
RT_ASSERT(device != RT_NULL);
|
RT_ASSERT(device != RT_NULL);
|
||||||
|
|
||||||
eps = cls->eps;
|
eps = cls->eps;
|
||||||
if(status == STATUS_CSW)
|
if (status == STATUS_CSW)
|
||||||
{
|
{
|
||||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
_send_status(device, eps, &csw);
|
||||||
status = STATUS_CBW;
|
|
||||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
|
||||||
}
|
}
|
||||||
if(status == STATUS_SEND)
|
else if (status == STATUS_SEND)
|
||||||
{
|
{
|
||||||
rt_device_read(disk, _block, eps->ep_in->buffer, 1);
|
rt_device_read(disk, _block, eps->ep_in->buffer, 1);
|
||||||
dcd_ep_write(device->dcd, eps->ep_in, eps->ep_in->buffer,
|
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])
|
switch(cbw->cb[0])
|
||||||
{
|
{
|
||||||
case SCSI_TEST_UNIT_READY:
|
case SCSI_TEST_UNIT_READY:
|
||||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
csw.status = _removed;
|
||||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
_send_status(device, eps, &csw);
|
||||||
break;
|
break;
|
||||||
case SCSI_REQUEST_SENSE:
|
case SCSI_REQUEST_SENSE:
|
||||||
_request_sense(device, eps->ep_in);
|
_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;
|
status = STATUS_CSW;
|
||||||
break;
|
break;
|
||||||
case SCSI_ALLOW_MEDIUM_REMOVAL:
|
case SCSI_ALLOW_MEDIUM_REMOVAL:
|
||||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
_send_status(device, eps, &csw);
|
||||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
|
||||||
break;
|
break;
|
||||||
case SCSI_READ_CAPACITIES:
|
case SCSI_READ_CAPACITIES:
|
||||||
_read_capacities(device, eps->ep_in);
|
_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:
|
case SCSI_VERIFY_10:
|
||||||
_verify_10(device);
|
_verify_10(device);
|
||||||
break;
|
break;
|
||||||
|
case SCSI_START_STOP:
|
||||||
|
_start_stop(cbw);
|
||||||
|
_send_status(device, eps, &csw);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(status == STATUS_RECEIVE)
|
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 ++;
|
_block ++;
|
||||||
if(_size == 0)
|
if(_size == 0)
|
||||||
{
|
{
|
||||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
_send_status(device, eps, &csw);
|
||||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
|
||||||
status = STATUS_CBW;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -734,8 +734,8 @@ rt_err_t _reset_notify(udevice_t device)
|
||||||
|
|
||||||
RT_ASSERT(device != RT_NULL);
|
RT_ASSERT(device != RT_NULL);
|
||||||
|
|
||||||
_stop_notify();
|
_stop_notify(device);
|
||||||
_run_notify();
|
_run_notify(device);
|
||||||
|
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue