#include <Arduino.h>
#include <Usb.h>
#include <LiquidCrystal.h>
#include "MSD.h"
//uint32_t idxIn;
//uint32_t idxOut;
//Capacity cap;
MassStorageDevice::MassStorageDevice(){
}
MassStorageDevice::MassStorageDevice(USBHost UsbHostController, UsbDevice Device, LiquidCrystal lc)
{
usb = UsbHostController;
msc = Device;
lcd = lc;
/*ushort len[2];
usb.getConfDescr(msc->address, 0, 4, 0, (byte*)&len);
byte* data = new byte[len[1]];
usb.getConfDescr(msc->address, 0, len[1], 0, &data[0]);
USB_CONFIGURATION_DESCRIPTOR* Config = (USB_CONFIGURATION_DESCRIPTOR*)data;
data += CONF_DESCR_LEN;
USB_INTERFACE_DESCRIPTOR* Interface0 = (USB_INTERFACE_DESCRIPTOR*)data;
data+=INTR_DESCR_LEN;
for(int i = 0; i < Interface0->bNumEndpoints; i++)
{
USB_ENDPOINT_DESCRIPTOR* Endpoint = (USB_ENDPOINT_DESCRIPTOR*)data;
if((Endpoint->bmAttributes & 3) == 2)
{
if(Endpoint->bEndpointAddress & 0x80 == 0x80)
{
//idxIn = UHD_Pipe_Alloc(msc->address, Endpoint->bEndpointAddress & 0xF, Endpoint->bmAttributes & 3, 0x80, Endpoint->wMaxPacketSize, Endpoint->bInterval, 2);
idxIn = UHD_Pipe_Alloc(msc->address, 2, 2, 0x80, 512, 0, 2);
}
else
{
//idxOut = UHD_Pipe_Alloc(msc->address, Endpoint->bEndpointAddress & 0xF, Endpoint->bmAttributes & 3, 0, Endpoint->wMaxPacketSize, Endpoint->bInterval, 2);
idxOut = UHD_Pipe_Alloc(msc->address, 2, 2, 0, 512, 0, 2);
}
}
data += EP_DESCR_LEN;
} */
idxIn = UHD_Pipe_Alloc(msc->address, 0x82, 2, 0x80, 512, 0, 2);
idxOut = UHD_Pipe_Alloc(msc->address, 0x2, 2, 0, 512, 0, 2);
InquiryResponse resp = SCSI_Inquiry();
lcd->clear();
lcd->setCursor(0, 0);
lcd->print((char*)&resp.ProductID[0]);
cap = SCSI_ReadCapacity10();
uint32_t capacity = cap.dwBlockAddress * cap.dwBlockLength;
lcd->setCursor(0, 1);
lcd->print(capacity);
lcd->print(" B");
delay(100);
SCSI_StartStop(1);
delay(150);
uint8_t buf[512];
lcd->clear();
for(int i = 0; i < 1000; i++)
{
SCSI_Read12(i, 1, &buf[0]);
lcd->setCursor(0, 0);
for(int i = 0; i < 16; i++)
{
lcd->print(buf*, HEX);*
- }*
- }*
- while(true);*
}
uint32_t MassStorageDevice::GetBlockSize()
{
- return cap.dwBlockLength;*
}
InquiryResponse MassStorageDevice::SCSI_Inquiry()
{
- CommandBlockWrapper cmd;*
- cmd.dCBWSignature = MASS_CBW_SIGNATURE;*
- cmd.dCBWTag = 123;*
- cmd.dCBWDataTransferLength = sizeof(InquiryResponse);*
- cmd.bmCBWFlags = MASS_CMD_DIR_IN;*
- cmd.bmCBWLUN = 0;*
- cmd.bmCBWCBLength = 6;*
for (uint8_t i = 0; i < 16; i++) cmd.CBWCB = 0;
* cmd.CBWCB[0] = SCSI_CMD_INQUIRY;
_ cmd.CBWCB[1] = 0 << 5;_
_ cmd.CBWCB[4] = sizeof(InquiryResponse);_
_ InquiryResponse resp;_
uint32_t length = sizeof(InquiryResponse);
SendCommand(&cmd, (uint8_t)&resp, &length, 0);
* return resp;*
}
void MassStorageDevice::SCSI_StartStop(uint8_t ctl)
{
* CommandBlockWrapper cbw;*
* cbw.dCBWSignature = MASS_CBW_SIGNATURE;
_ cbw.dCBWTag = 123;_
_ cbw.dCBWDataTransferLength = 0;_
cbw.bmCBWFlags = MASS_CMD_DIR_OUT;
_ cbw.bmCBWLUN = 0;_
_ cbw.bmCBWCBLength = 6;_
for (uint8_t i = 0; i < 16; i++)
_ cbw.CBWCB = 0;_
cbw.CBWCB[0] = SCSI_CMD_START_STOP_UNIT;
_ cbw.CBWCB[1] = 0 << 5;
cbw.CBWCB[4] = ctl & 0x03;
SendCommand(&cbw, 0, 0, -1);
}_
void MassStorageDevice::SCSI_Read12(uint32_t lba, uint32_t nBlocks, uint8_t buf)
{
* //SCSI_StartStop(1);
_ // delay(150);
CommandBlockWrapper cmd;_
cmd.dCBWSignature = MASS_CBW_SIGNATURE;
_ cmd.dCBWTag = 123;
cmd.dCBWDataTransferLength = cap.dwBlockLength * nBlocks;_
cmd.bmCBWFlags = MASS_CMD_DIR_IN;
_ cmd.bmCBWLUN = 0;
cmd.bmCBWCBLength = 10;
for (uint8_t i = 0; i < 16; i++) cmd.CBWCB = 0;
/*cmd.CBWCB[0] = SCSI_CMD_READ_12;
cmd.CBWCB[1] = 0 << 5;
cmd.CBWCB[2] = lba & 0xFF;
cmd.CBWCB[3] = (lba >> 8) & 0xFF;
cmd.CBWCB[4] = (lba >> 16) & 0xFF;
cmd.CBWCB[5] = (lba >> 24) & 0xFF;
cmd.CBWCB[6] = nBlocks & 0xFF;
cmd.CBWCB[7] = (nBlocks >> 8) & 0xFF;
cmd.CBWCB[8] = (nBlocks >> 16) & 0xFF;
cmd.CBWCB[9] = (nBlocks >> 24) & 0xFF;/
* cmd.CBWCB[0] = SCSI_CMD_READ_10;*
* cmd.CBWCB[1] = 0 << 5;
cmd.CBWCB[2] = ((lba >> 24) & 0xff);
cmd.CBWCB[3] = ((lba >> 16) & 0xff);
cmd.CBWCB[4] = ((lba >> 8) & 0xff);
cmd.CBWCB[5] = (lba & 0xff);
cmd.CBWCB[8] = nBlocks;_
uint32_t length = cap.dwBlockLength * nBlocks;
uint32_t error;
_ error = SendCommand(&cmd, buf, &length, 0);
if(error != 0)
{
lcd->clear();
lcd->setCursor(0, 0);
lcd->print("error");
lcd->setCursor(0, 1);
lcd->print(error);
while(true);
}
/lcd->clear();
for(int i = 0; i < 512; i++)
* {
lcd->setCursor(0, 0);
lcd->print(buf);[/color]
}/
* //lcd->print(";");
// lcd->print(buf[200]);
/lcd->setCursor(0, 0);
lcd->print(error);
* lcd->setCursor(0, 1);
lcd->print(length);/
}
Capacity MassStorageDevice::SCSI_ReadCapacity10()
{
* CommandBlockWrapper cmd;_
cmd.dCBWSignature = MASS_CBW_SIGNATURE;
_ cmd.dCBWTag = 123;
cmd.dCBWDataTransferLength = sizeof(Capacity);_
cmd.bmCBWFlags = MASS_CMD_DIR_IN;
_ cmd.bmCBWLUN = 0;
cmd.bmCBWCBLength = 10;_
for (uint8_t i = 0; i < 16; i++) cmd.CBWCB = 0;
cmd.CBWCB[0] = SCSI_CMD_READ_CAPACITY_10;
_ cmd.CBWCB[1] = 0 << 5;
Capacity resp;_
uint32_t length = sizeof(Capacity);
SendCommand(&cmd, (uint8_t)&resp, &length, 0);
* resp.dwBlockAddress = SwapByteOrder_32(resp.dwBlockAddress);
resp.dwBlockLength = SwapByteOrder_32(resp.dwBlockLength);
_ return resp;
}_
uint32_t MassStorageDevice::SendCommand(CommandBlockWrapper cmd, uint8_t* data, uint32_t* length, int flag)
{
UHD_Pipe_Write(idxOut, sizeof(CommandBlockWrapper), (uint8_t*)cmd);
* UHD_Pipe_Send(idxOut, tokOUT);
while(!UHD_Pipe_Is_Transfer_Complete(idxOut, tokOUT));
_ if(flag == 0)
{_
UHD_Pipe_Send(idxIn, tokIN);
while(uhd_byte_count(idxIn) == 0);
uint32_t l = uhd_byte_count(idxIn);
UHD_Pipe_Read(idxIn, length, data);
_ length = l;
}
else if(flag == 1)
{_
UHD_Pipe_Write(idxOut, length, data);
UHD_Pipe_Send(idxOut, tokOUT);
* while(!UHD_Pipe_Is_Transfer_Complete(idxOut, tokOUT));
_ }_
UHD_Pipe_Send(idxIn, tokIN);
while(uhd_byte_count(idxIn) == 0);
_ CommandStatusWrapper rest;_
UHD_Pipe_Read(idxIn, sizeof(CommandStatusWrapper), (uint8_t)&rest);
* if(rest.dCSWTag != 123) while(true);*
* return rest.bCSWStatus;*
}
[/quote]