udisk can be eject

This commit is contained in:
heyuanjie87 2013-06-15 23:02:50 +08:00
parent 4cdb0154ba
commit 02869d7e67
3 changed files with 31 additions and 17 deletions

View File

@ -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

View File

@ -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.
*
@ -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);
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);
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
{

View File

@ -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;
}