This is the project for the Old Model Robots for OU's Dr. Davis's Configurable Robots Research. This is being published so future robots can be set up easily.

Dependencies:   FatFileSystem MCP3008 Motor PinDetect QTR_8A SRF05 SSD1308_128x64_I2C mbed

Committer:
DrewSchaef
Date:
Wed Nov 01 15:57:59 2017 +0000
Revision:
0:bcad524c1856
Published the project to allow access for future work on the Configurable Robots Research Project(s).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DrewSchaef 0:bcad524c1856 1
DrewSchaef 0:bcad524c1856 2 /*
DrewSchaef 0:bcad524c1856 3 Copyright (c) 2010 Peter Barrett
DrewSchaef 0:bcad524c1856 4
DrewSchaef 0:bcad524c1856 5 Permission is hereby granted, free of charge, to any person obtaining a copy
DrewSchaef 0:bcad524c1856 6 of this software and associated documentation files (the "Software"), to deal
DrewSchaef 0:bcad524c1856 7 in the Software without restriction, including without limitation the rights
DrewSchaef 0:bcad524c1856 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
DrewSchaef 0:bcad524c1856 9 copies of the Software, and to permit persons to whom the Software is
DrewSchaef 0:bcad524c1856 10 furnished to do so, subject to the following conditions:
DrewSchaef 0:bcad524c1856 11
DrewSchaef 0:bcad524c1856 12 The above copyright notice and this permission notice shall be included in
DrewSchaef 0:bcad524c1856 13 all copies or substantial portions of the Software.
DrewSchaef 0:bcad524c1856 14
DrewSchaef 0:bcad524c1856 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
DrewSchaef 0:bcad524c1856 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
DrewSchaef 0:bcad524c1856 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
DrewSchaef 0:bcad524c1856 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
DrewSchaef 0:bcad524c1856 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DrewSchaef 0:bcad524c1856 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
DrewSchaef 0:bcad524c1856 21 THE SOFTWARE.
DrewSchaef 0:bcad524c1856 22 */
DrewSchaef 0:bcad524c1856 23
DrewSchaef 0:bcad524c1856 24 #include "stdlib.h"
DrewSchaef 0:bcad524c1856 25 #include "stdio.h"
DrewSchaef 0:bcad524c1856 26 #include "string.h"
DrewSchaef 0:bcad524c1856 27
DrewSchaef 0:bcad524c1856 28 #include "Utils.h"
DrewSchaef 0:bcad524c1856 29 #include "USBHost.h"
DrewSchaef 0:bcad524c1856 30
DrewSchaef 0:bcad524c1856 31
DrewSchaef 0:bcad524c1856 32 int MassStorage_ReadCapacity(int device, u32* blockCount, u32* blockSize);
DrewSchaef 0:bcad524c1856 33 int MassStorage_ReadBlock(int device, u32 block, u8* dst);
DrewSchaef 0:bcad524c1856 34 int MassStorage_WriteBlock(int device, u32 block, const u8* dst);
DrewSchaef 0:bcad524c1856 35
DrewSchaef 0:bcad524c1856 36
DrewSchaef 0:bcad524c1856 37 #define ERR_BAD_CSW_SIGNATURE -200
DrewSchaef 0:bcad524c1856 38
DrewSchaef 0:bcad524c1856 39 #define CBW_SIGNATURE 0x43425355
DrewSchaef 0:bcad524c1856 40 #define CSW_SIGNATURE 0x53425355
DrewSchaef 0:bcad524c1856 41
DrewSchaef 0:bcad524c1856 42 // Command Block
DrewSchaef 0:bcad524c1856 43 typedef struct
DrewSchaef 0:bcad524c1856 44 {
DrewSchaef 0:bcad524c1856 45 u32 Signature;
DrewSchaef 0:bcad524c1856 46 u32 Tag;
DrewSchaef 0:bcad524c1856 47 u32 TransferLength;
DrewSchaef 0:bcad524c1856 48 u8 Flags;
DrewSchaef 0:bcad524c1856 49 u8 LUN;
DrewSchaef 0:bcad524c1856 50 u8 CBLength;
DrewSchaef 0:bcad524c1856 51 u8 CB[16]; // only 6 really
DrewSchaef 0:bcad524c1856 52 } CBW;
DrewSchaef 0:bcad524c1856 53
DrewSchaef 0:bcad524c1856 54 // Status block
DrewSchaef 0:bcad524c1856 55 typedef struct
DrewSchaef 0:bcad524c1856 56 {
DrewSchaef 0:bcad524c1856 57 u32 Signature;
DrewSchaef 0:bcad524c1856 58 u32 Tag;
DrewSchaef 0:bcad524c1856 59 u32 DataResidue;
DrewSchaef 0:bcad524c1856 60 u8 Status;
DrewSchaef 0:bcad524c1856 61 } CSW;
DrewSchaef 0:bcad524c1856 62
DrewSchaef 0:bcad524c1856 63 int SCSIRequestSense(int device);
DrewSchaef 0:bcad524c1856 64
DrewSchaef 0:bcad524c1856 65 int DoSCSI(int device, const u8* cmd, int cmdLen, int flags, u8* data, u32 transferLen)
DrewSchaef 0:bcad524c1856 66 {
DrewSchaef 0:bcad524c1856 67 CBW cbw;
DrewSchaef 0:bcad524c1856 68 cbw.Signature = CBW_SIGNATURE;
DrewSchaef 0:bcad524c1856 69 cbw.Tag = 0;
DrewSchaef 0:bcad524c1856 70 cbw.TransferLength = transferLen;
DrewSchaef 0:bcad524c1856 71 cbw.Flags = flags;
DrewSchaef 0:bcad524c1856 72 cbw.LUN = 0;
DrewSchaef 0:bcad524c1856 73 cbw.CBLength = cmdLen;
DrewSchaef 0:bcad524c1856 74 memset(cbw.CB,0,sizeof(cbw.CB));
DrewSchaef 0:bcad524c1856 75 memcpy(cbw.CB,cmd,cmdLen);
DrewSchaef 0:bcad524c1856 76
DrewSchaef 0:bcad524c1856 77 int r;
DrewSchaef 0:bcad524c1856 78 r = USBBulkTransfer(device,0x01,(u8*)&cbw,31); // Send the command
DrewSchaef 0:bcad524c1856 79 if (r < 0)
DrewSchaef 0:bcad524c1856 80 return r;
DrewSchaef 0:bcad524c1856 81
DrewSchaef 0:bcad524c1856 82 if (data)
DrewSchaef 0:bcad524c1856 83 {
DrewSchaef 0:bcad524c1856 84 r = USBBulkTransfer(device,flags | 1,data,transferLen);
DrewSchaef 0:bcad524c1856 85 if (r < 0)
DrewSchaef 0:bcad524c1856 86 return r;
DrewSchaef 0:bcad524c1856 87 }
DrewSchaef 0:bcad524c1856 88
DrewSchaef 0:bcad524c1856 89 CSW csw;
DrewSchaef 0:bcad524c1856 90 csw.Signature = 0;
DrewSchaef 0:bcad524c1856 91 r = USBBulkTransfer(device,0x81,(u8*)&csw,13);
DrewSchaef 0:bcad524c1856 92 if (r < 0)
DrewSchaef 0:bcad524c1856 93 return r;
DrewSchaef 0:bcad524c1856 94
DrewSchaef 0:bcad524c1856 95 if (csw.Signature != CSW_SIGNATURE)
DrewSchaef 0:bcad524c1856 96 return ERR_BAD_CSW_SIGNATURE;
DrewSchaef 0:bcad524c1856 97
DrewSchaef 0:bcad524c1856 98 // ModeSense?
DrewSchaef 0:bcad524c1856 99 if (csw.Status == 1 && cmd[0] != 3)
DrewSchaef 0:bcad524c1856 100 return SCSIRequestSense(device);
DrewSchaef 0:bcad524c1856 101
DrewSchaef 0:bcad524c1856 102 return csw.Status;
DrewSchaef 0:bcad524c1856 103 }
DrewSchaef 0:bcad524c1856 104
DrewSchaef 0:bcad524c1856 105 int SCSITestUnitReady(int device)
DrewSchaef 0:bcad524c1856 106 {
DrewSchaef 0:bcad524c1856 107 u8 cmd[6];
DrewSchaef 0:bcad524c1856 108 memset(cmd,0,6);
DrewSchaef 0:bcad524c1856 109 return DoSCSI(device,cmd,6,DEVICE_TO_HOST,0,0);
DrewSchaef 0:bcad524c1856 110 }
DrewSchaef 0:bcad524c1856 111
DrewSchaef 0:bcad524c1856 112 int SCSIRequestSense(int device)
DrewSchaef 0:bcad524c1856 113 {
DrewSchaef 0:bcad524c1856 114 u8 cmd[6] = {0x03,0,0,0,18,0};
DrewSchaef 0:bcad524c1856 115 u8 result[18];
DrewSchaef 0:bcad524c1856 116 int r = DoSCSI(device,cmd,6,DEVICE_TO_HOST,result,18);
DrewSchaef 0:bcad524c1856 117 return r;
DrewSchaef 0:bcad524c1856 118 }
DrewSchaef 0:bcad524c1856 119
DrewSchaef 0:bcad524c1856 120 int SCSIInquiry(int device)
DrewSchaef 0:bcad524c1856 121 {
DrewSchaef 0:bcad524c1856 122 u8 cmd[6] = {0x12,0,0,0,36,0};
DrewSchaef 0:bcad524c1856 123 u8 result[36+2];
DrewSchaef 0:bcad524c1856 124 result[36] = '\n';
DrewSchaef 0:bcad524c1856 125 result[37] = 0;
DrewSchaef 0:bcad524c1856 126 int r = DoSCSI(device,cmd,6,DEVICE_TO_HOST,result,36);
DrewSchaef 0:bcad524c1856 127 if (r == 0)
DrewSchaef 0:bcad524c1856 128 printf((const char*)result + 8);
DrewSchaef 0:bcad524c1856 129 return r;
DrewSchaef 0:bcad524c1856 130 }
DrewSchaef 0:bcad524c1856 131
DrewSchaef 0:bcad524c1856 132 int SCSIReadCapacity(int device, u32* blockCount, u32* blockSize)
DrewSchaef 0:bcad524c1856 133 {
DrewSchaef 0:bcad524c1856 134 u8 cmd[10] = {0x25,0,0,0,8,0,0,0,0,0};
DrewSchaef 0:bcad524c1856 135 u8 result[8];
DrewSchaef 0:bcad524c1856 136 *blockSize = 0;
DrewSchaef 0:bcad524c1856 137 *blockCount = 0;
DrewSchaef 0:bcad524c1856 138 int r = DoSCSI(device,cmd,10,DEVICE_TO_HOST,result,8);
DrewSchaef 0:bcad524c1856 139 if (r == 0)
DrewSchaef 0:bcad524c1856 140 {
DrewSchaef 0:bcad524c1856 141 *blockCount = BE32(result);
DrewSchaef 0:bcad524c1856 142 *blockSize = BE32(result+4);
DrewSchaef 0:bcad524c1856 143 }
DrewSchaef 0:bcad524c1856 144 return r;
DrewSchaef 0:bcad524c1856 145 }
DrewSchaef 0:bcad524c1856 146
DrewSchaef 0:bcad524c1856 147 int SCSITransfer(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize, int direction)
DrewSchaef 0:bcad524c1856 148 {
DrewSchaef 0:bcad524c1856 149 // USB hardware will only do 4k per transfer
DrewSchaef 0:bcad524c1856 150 while (blockCount*blockSize > 4096)
DrewSchaef 0:bcad524c1856 151 {
DrewSchaef 0:bcad524c1856 152 int count = 4096/blockSize;
DrewSchaef 0:bcad524c1856 153 int r = SCSITransfer(device,blockAddr,count,dst,blockSize,direction);
DrewSchaef 0:bcad524c1856 154 dst += count*blockSize;
DrewSchaef 0:bcad524c1856 155 blockAddr += count;
DrewSchaef 0:bcad524c1856 156 blockCount -= count;
DrewSchaef 0:bcad524c1856 157 }
DrewSchaef 0:bcad524c1856 158
DrewSchaef 0:bcad524c1856 159 u8 cmd[10];
DrewSchaef 0:bcad524c1856 160 memset(cmd,0,10);
DrewSchaef 0:bcad524c1856 161 cmd[0] = (direction == DEVICE_TO_HOST) ? 0x28 : 0x2A;
DrewSchaef 0:bcad524c1856 162 BE32(blockAddr,cmd+2);
DrewSchaef 0:bcad524c1856 163 BE16(blockCount,cmd+7);
DrewSchaef 0:bcad524c1856 164 return DoSCSI(device,cmd,10,direction,dst,blockSize*blockCount);
DrewSchaef 0:bcad524c1856 165 }
DrewSchaef 0:bcad524c1856 166
DrewSchaef 0:bcad524c1856 167 int MassStorage_ReadCapacity(int device, u32* blockCount, u32* blockSize)
DrewSchaef 0:bcad524c1856 168 {
DrewSchaef 0:bcad524c1856 169 return SCSIReadCapacity(device,blockCount,blockSize);
DrewSchaef 0:bcad524c1856 170 }
DrewSchaef 0:bcad524c1856 171
DrewSchaef 0:bcad524c1856 172 int MassStorage_Read(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize = 512)
DrewSchaef 0:bcad524c1856 173 {
DrewSchaef 0:bcad524c1856 174 return SCSITransfer(device,blockAddr,blockCount,dst,blockSize,DEVICE_TO_HOST);
DrewSchaef 0:bcad524c1856 175 }
DrewSchaef 0:bcad524c1856 176
DrewSchaef 0:bcad524c1856 177 int MassStorage_Write(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize = 512)
DrewSchaef 0:bcad524c1856 178 {
DrewSchaef 0:bcad524c1856 179 return SCSITransfer(device,blockAddr,blockCount,dst,blockSize,HOST_TO_DEVICE);
DrewSchaef 0:bcad524c1856 180 }