00001 #ifndef _uDRIVE_uSD_G1_h_
00002 #define _uDRIVE_uSD_G1_h_
00003
00004 #include <inttypes.h>
00005
00006 namespace _4Dsystems
00007 {
00021 #define ACK 0x06
00022
00025 #define NACK 0x15
00026
00035 #define INITIALIZE_MODULE 0x55
00036
00037 #define VERSION 0x56
00038
00039 #define EXTENDED 0x40
00040
00050 #define INITIALIZE_DISK 0x69
00051
00053 #define SET_MEMORY_ADDRESS 0x41
00054
00060 #define READ_SECTOR_BLOCK_DATA 0x52
00061
00062 #define WRITE_SECTOR_BLOCK_DATA 0x57
00063
00072 #define READ_SINGLE_BYTE 0x72
00073
00074 #define WRITE_SINGLE_BYTE 0x77
00075
00079
00080
00088 enum Error
00089 {
00090 OK = 0,
00091 COMMAND_ERROR,
00092 UNITIALIZED_ERROR,
00093 INVALID_DATA
00094 };
00095
00125 template <typename SerialInterface>
00126 class uDRIVE_uSD_G1
00127 {
00128 private:
00129 uint8_t _state;
00131 SerialInterface* _serial;
00140 inline int8_t ValidateCommand()
00141 {
00142 int8_t ret;
00143
00144 while( ! _serial->available() )
00145 {
00146 delay(10);
00147 }
00148 ret = _serial->read();
00149
00150
00151 if(ret != ACK)
00152 {
00153 return COMMAND_ERROR;
00154 }
00155
00156 return OK;
00157 }
00158
00165 inline void _read(uint8_t *iPtr, size_t nElements)
00166 {
00167 while(nElements--)
00168 {
00169 while( ! _serial->available() )
00170 {
00171 delay(10);
00172 }
00173 *iPtr++ = _serial->read();
00174 }
00175
00176 }
00177
00178 public:
00180 uDRIVE_uSD_G1() :
00181 _state(0),
00182 _serial(NULL)
00183 {}
00185 ~uDRIVE_uSD_G1() {}
00186
00194 int8_t Initialize(SerialInterface* iSerial)
00195 {
00196 int8_t ret;
00197
00198 _state = 0;
00199 _serial = iSerial;
00200
00201 _serial->print((uint8_t)INITIALIZE_MODULE);
00202
00203 ret = ValidateCommand();
00204 if(ret != OK)
00205 {
00206 return ret;
00207 }
00208
00209 _serial->print((uint8_t)EXTENDED);
00210 _serial->print((uint8_t)INITIALIZE_DISK);
00211
00212 ret = ValidateCommand();
00213 if(ret != OK)
00214 {
00215 return ret;
00216 }
00217
00218 _state = 1;
00219 return OK;
00220 }
00221
00235 int8_t ReadSectorBlock(const uint32_t& iAddress, uint8_t* iData)
00236 {
00237 uint8_t ret;
00238 uint16_t byteCount;
00239
00240
00241 if(iData == NULL)
00242 {
00243 return INVALID_DATA;
00244 }
00245
00246
00247 if(!_state)
00248 {
00249 return UNITIALIZED_ERROR;
00250 }
00251
00252 _serial->print((uint8_t)EXTENDED);
00253 _serial->print((uint8_t)READ_SECTOR_BLOCK_DATA);
00254 _serial->print((uint8_t)((iAddress >> 16) & 0xff));
00255 _serial->print((uint8_t)((iAddress >> 8) & 0xff));
00256 _serial->print((uint8_t)((iAddress ) & 0xff));
00257
00258
00259 _read(iData, 512);
00260
00261 return OK;
00262 }
00263
00277 int8_t WriteSectorBlock(const uint32_t& iAddress, uint8_t* iData)
00278 {
00279 uint16_t byteCount;
00280
00281
00282 if(iData == NULL)
00283 {
00284 return INVALID_DATA;
00285 }
00286
00287
00288 if(!_state)
00289 {
00290 return UNITIALIZED_ERROR;
00291 }
00292
00293 _serial->print((uint8_t)EXTENDED);
00294 _serial->print((uint8_t)WRITE_SECTOR_BLOCK_DATA);
00295 _serial->print((uint8_t)((iAddress >> 16) & 0xff));
00296 _serial->print((uint8_t)((iAddress >> 8) & 0xff));
00297 _serial->print((uint8_t)((iAddress ) & 0xff));
00298
00299
00300
00301 for(byteCount=0; byteCount<512; ++byteCount, ++iData)
00302 {
00303 _serial->print(*iData);
00304 }
00305
00306 return ValidateCommand();
00307 }
00308
00319 int8_t SetMemoryAddress(const uint32_t& iAddress)
00320 {
00321
00322 if(!_state)
00323 {
00324 return UNITIALIZED_ERROR;
00325 }
00326
00327 _serial->print((uint8_t)EXTENDED);
00328 _serial->print((uint8_t)SET_MEMORY_ADDRESS);
00329 _serial->print((uint8_t)((iAddress >> 24) & 0xff));
00330 _serial->print((uint8_t)((iAddress >> 16) & 0xff));
00331 _serial->print((uint8_t)((iAddress >> 8) & 0xff));
00332 _serial->print((uint8_t)((iAddress ) & 0xff));
00333
00334 return ValidateCommand();
00335 }
00336
00348 int8_t ReadSingleByte (uint8_t& iByte)
00349 {
00350
00351 if(!_state)
00352 {
00353 return UNITIALIZED_ERROR;
00354 }
00355
00356 _serial->print((uint8_t)EXTENDED);
00357 _serial->print((uint8_t)READ_SINGLE_BYTE);
00358
00359
00360
00361 while( ! _serial->available() )
00362 {
00363 delay(10);
00364 }
00365
00366 iByte = _serial->read();
00367
00368 return OK;
00369 }
00370
00392 int8_t WriteSingleByte(const uint8_t& iByte)
00393 {
00394
00395 if(!_state)
00396 {
00397 return UNITIALIZED_ERROR;
00398 }
00399
00400 _serial->print((uint8_t)EXTENDED);
00401 _serial->print((uint8_t)WRITE_SINGLE_BYTE);
00402
00403 _serial->print(iByte);
00404
00405 return ValidateCommand();
00406 }
00407
00408
00412 union DeviceInfo
00413 {
00414 struct
00415 {
00424 uint8_t device_type;
00426 uint8_t hardware_rev;
00428 uint8_t PmmC_rev;
00432 uint8_t reserved1;
00436 uint8_t reserved2;
00437 };
00438 uint8_t _data[5];
00439 };
00440
00448 int8_t RequestDeviceInfo(DeviceInfo& iInfo)
00449 {
00450 int8_t ret;
00451
00452
00453 if(!_state)
00454 {
00455 return UNITIALIZED_ERROR;
00456 }
00457
00458 _serial->print((uint8_t)VERSION);
00459 _read(iInfo._data, 5);
00460
00461 return OK;
00462 }
00463 };
00468 };
00469
00470 #endif // _uDRIVE_uSD_G1_h_