00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #define __SKIP_FATFS__
00029 #include "sceptre.h"
00030 #include "sdcard.h"
00031
00032 #include "lpcusb\target\type.h"
00033 #include "lpcusb\target\debug.h"
00034 #include "blockdev.h"
00035
00036 static U32 getsdbits(U8 *buf, int offset, int len)
00037 {
00038 U32 mask, data;
00039 int bytepos, bitpos;
00040 int shift;
00041
00042 offset = 127 - offset;
00043 bytepos = offset / 8;
00044 bitpos = offset % 8;
00045 mask = (1 << len) - 1;
00046
00047 data = 0;
00048 for (shift = -(len + bitpos); shift < 0; shift += 8) {
00049 data = (data << 8) | buf[bytepos++];
00050 }
00051 return (data >> shift) & mask;
00052 }
00053
00054
00055 BOOL BlockDevInit(void)
00056 {
00057 return SDInit();
00058 }
00059
00060
00061 BOOL BlockDevWrite(U32 dwBlock, U8* pbBuf)
00062 {
00063 return SDWriteBlock(pbBuf, dwBlock);
00064 }
00065
00066
00067 BOOL BlockDevRead(U32 dwBlock, U8* pbBuf)
00068 {
00069 return SDReadBlock(pbBuf, dwBlock);
00070 }
00071
00072
00073 BOOL BlockDevGetSize(U32 *pdwDriveSize)
00074 {
00075 U8 abBuf[16];
00076 U32 c_size, num_blocks, block_size;
00077 U16 read_bl_len;
00078 U8 csd_structure, c_size_mult;
00079
00080
00081 if (!SDReadCSD(abBuf)) {
00082 return FALSE;
00083 }
00084 csd_structure = getsdbits(abBuf, 127, 2);
00085 switch (csd_structure) {
00086
00087 case 0:
00088 read_bl_len = getsdbits(abBuf, 83, 4);
00089 c_size = getsdbits(abBuf, 73, 12);
00090 c_size_mult = getsdbits(abBuf, 49, 3);
00091 num_blocks = (c_size + 1) * (4 << c_size_mult);
00092 block_size = 1 << read_bl_len;
00093 break;
00094
00095 case 1:
00096 c_size = getsdbits(abBuf, 69, 22);
00097 num_blocks = (c_size + 1) * 512 * 1024;
00098 block_size = 512;
00099 break;
00100
00101 default:
00102 DBG("Invalid CSD structure (%d)!\n", csd_structure);
00103 return FALSE;
00104 }
00105
00106 *pdwDriveSize = num_blocks * block_size;
00107 return TRUE;
00108 }
00109