URL
https://opencores.org/ocsvn/xulalx25soc/xulalx25soc/trunk
Subversion Repositories xulalx25soc
Compare Revisions
- This comparison shows the changes necessary to convert path
/xulalx25soc
- from Rev 94 to Rev 95
- ↔ Reverse comparison
Rev 94 → Rev 95
/trunk/bench/cpp/sdspisim.h
61,12 → 61,14
|
int m_last_sck, m_delay, m_mosi; |
bool m_busy, m_debug, m_block_address, m_altcmd_flag, |
m_syncd, m_host_supports_high_capacity; |
m_syncd, m_host_supports_high_capacity, m_reading_data, |
m_have_token; |
|
RESET_STATES m_reset_state; |
|
int m_cmdidx, m_bitpos, m_rspidx, m_rspdly, m_blkdly, |
m_blklen, m_blkidx, m_last_miso, m_powerup_busy; |
m_blklen, m_blkidx, m_last_miso, m_powerup_busy, |
m_rxloc; |
char m_cmdbuf[8], m_dat_out, m_dat_in; |
char m_rspbuf[SDSPI_RSPLEN]; |
char m_block_buf[SDSPI_MAXBLKLEN]; |
80,6 → 82,7
int operator()(const int csn, const int sck, const int dat); |
unsigned cmdcrc(int ln, char *buf) const; |
bool check_cmdcrc(char *buf) const; |
unsigned blockcrc(int ln, char *buf) const; |
void add_block_crc(int ln, char *buf) const; |
}; |
|
/trunk/bench/cpp/sdspisim.cpp
67,7 → 67,7
// tSE = 1500 * MILLISECONDS; |
*/ |
static const unsigned |
CCS = 0; // 0: SDSC card, 1: SDHC or SDXC card |
CCS = 1; // 0: SDSC card, 1: SDHC or SDXC card |
|
SDSPISIM::SDSPISIM(void) { |
m_dev = NULL; |
116,6 → 116,10
// m_ireg = m_oreg = 0; |
// m_sreg = 0x01c; |
// m_creg = 0x001; // Iinitial creg on delivery |
|
// |
m_reading_data = false; |
m_have_token = false; |
} |
|
void SDSPISIM::load(const char *fname) { |
128,6 → 132,8
fseek(m_dev, 0l, SEEK_SET); |
|
m_devblocks = devln>>9; |
|
printf("SDCARD: NBLOCKS = %ld\n", m_devblocks); |
} |
} |
|
187,7 → 193,37
if ((m_bitpos&7)==0) { |
printf("SDSPI--RX BYTE %02x\n", m_dat_in&0x0ff); |
m_dat_out = 0xff; |
if (m_cmdidx < 6) { |
if (m_reading_data) { |
if (m_have_token) { |
m_block_buf[m_rxloc++] = m_dat_in; |
printf("SDSPI: WR[%3d] = %02x\n", m_rxloc-1, |
m_dat_in&0x0ff); |
if (m_rxloc >= 512+2) { |
unsigned crc, rxcrc; |
crc = blockcrc(512, m_block_buf); |
rxcrc = ((m_block_buf[512]&0x0ff)<<8) |
|(m_block_buf[513]&0x0ff); |
|
printf("LEN = %d\n", m_rxloc); |
printf("CHECKING CRC: (rx) %04x =? %04x (calc)\n", |
crc, rxcrc); |
m_reading_data = false; |
m_have_token = false; |
if (rxcrc == crc) |
m_dat_out = 5; |
else { |
m_dat_out = 0x0b; |
assert(rxcrc == crc); |
} |
} |
} else { |
if ((m_dat_in&0x0ff) == 0x0fe) { |
printf("SDSPI: TOKEN!!\n"); |
m_have_token = true; |
m_rxloc = 0; |
} else printf("SDSPI: waiting on token\n"); |
} |
} else if (m_cmdidx < 6) { |
printf("SDSPI: CMDIDX = %d\n", m_cmdidx); |
// All commands *must* start with a 01... pair of bits. |
if (m_cmdidx == 0) |
232,11 → 268,21
SDSPI_RCVD_ACMD41 |
:SDSPI_RESET_COMPLETE; |
break; |
case 51: // ACMD51 |
m_block_buf[0] = 0x0fe; |
for(int j=0; j<8; j++) |
m_block_buf[j+1] = m_csd[j]; |
m_blklen = 8; |
add_block_crc(m_blklen, m_block_buf); |
|
m_blkdly = 0; |
m_blkidx = 0; |
m_dat_out = 0; |
break; |
case 13: // ACMD13 |
case 22: // ACMD22 |
case 23: // ACMD23 |
case 42: // ACMD42 |
case 51: // ACMD51 |
default: // Unimplemented command! |
m_rspbuf[0] = 0x04; |
m_rspdly = 4; |
321,6 → 367,7
m_rspbuf[0] = 0x00; |
memset(m_block_buf, 0x0ff, SDSPI_MAXBLKLEN); |
if (m_dev) { |
printf("Reading from block %08x of %08lx\n", arg, m_devblocks); |
if (m_block_address) { |
assert(arg < m_devblocks); |
fseek(m_dev, arg<<9, SEEK_SET); |
329,7 → 376,7
fseek(m_dev, arg, SEEK_SET); |
} |
} m_block_buf[0] = 0x0fe; |
m_blklen = (1<<m_csd[5]); |
m_blklen = 512; // (1<<m_csd[5]); |
if (m_dev) |
fread(&m_block_buf[1], m_blklen, 1, m_dev); |
else |
339,6 → 386,11
m_blkdly = 60; |
m_blkidx = 0; |
break; |
case 24: // CMD24 -- WRITE_BLOCK |
m_reading_data = true; |
m_have_token = false; |
m_dat_out = 0; |
break; |
case 55: // CMD55 -- APP_CMD |
m_rspbuf[0] = 0x00; |
m_rspdly = 2; |
362,7 → 414,6
case 12: // CMD12 -- STOP_TRANSMISSION (!impl) |
case 16: // CMD16 -- SET_BLOCKLEN |
case 18: // CMD18 -- READ_MULTIPLE_BLOCK |
case 24: // CMD24 -- WRITE_BLOCK |
case 25: // CMD25 -- WRITE_MULTIPLE_BLOCK |
case 27: // CMD27 -- PROGRAM_CSD |
case 32: // CMD32 -- ERASE_WR_BLK_START_ADDR |
431,11 → 482,13
return (fill == (buf[5]&0x0ff)); |
} |
|
void SDSPISIM::add_block_crc(int len, char *buf) const { |
unsigned int fill = 0, taps = 0x121; |
unsigned SDSPISIM::blockcrc(int len, char *buf) const { |
unsigned int fill = 0, taps = 0x1021; |
bool dbg = (len == 512); |
|
for(int i=1; i<=len; i++) { |
fill ^= (buf[i] << 8); |
for(int i=0; i<len; i++) { |
if (dbg) { printf("BUF[%3d] = %02x\n", i, buf[i]&0x0ff); } |
fill ^= ((buf[i]&0x0ff) << 8); |
for(int j=0; j<8; j++) { |
if (fill&0x8000) |
fill = (fill<<1)^taps; |
444,6 → 497,14
} |
} |
|
fill &= 0x0ffff; |
if (dbg) { printf("BLOCKCRC(%d,??) = %04x\n", len, fill); } |
return fill; |
} |
|
void SDSPISIM::add_block_crc(int len, char *buf) const { |
unsigned fill = blockcrc(len, &buf[1]); |
|
buf[len+1] = (fill >> 8)&0x0ff; |
buf[len+2] = (fill )&0x0ff; |
} |