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

View File

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

View File

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