URL
https://opencores.org/ocsvn/sdspi/sdspi/trunk
Subversion Repositories sdspi
Compare Revisions
- This comparison shows the changes necessary to convert path
/sdspi/trunk/bench/cpp
- from Rev 2 to Rev 3
- ↔ Reverse comparison
Rev 2 → Rev 3
/sdspisim.cpp
1,6 → 1,5
/////////////////////////////////////////////////////////////////////////// |
//////////////////////////////////////////////////////////////////////////////// |
// |
// |
// Filename: sdspisim.cpp |
// |
// Project: Wishbone Controlled SD-Card Controller over SPI port |
11,12 → 10,12
// This simulator is for testing use in a Verilator/C++ environment, where |
// it would be used in place of the actual hardware. |
// |
// Creator: Dan Gisselquist |
// Creator: Dan Gisselquist, Ph.D. |
// Gisselquist Technology, LLC |
// |
/////////////////////////////////////////////////////////////////////////// |
//////////////////////////////////////////////////////////////////////////////// |
// |
// Copyright (C) 2015-2016, Gisselquist Technology, LLC |
// Copyright (C) 2015-2017, Gisselquist Technology, LLC |
// |
// This program is free software (firmware): you can redistribute it and/or |
// modify it under the terms of the GNU General Public License as published |
29,7 → 28,7
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with this program. (It's in the $(ROOT)/doc directory, run make with no |
// with this program. (It's in the $(ROOT)/doc directory. Run make with no |
// target there if the PDF file isn't present.) If not, see |
// <http://www.gnu.org/licenses/> for a copy. |
// |
37,7 → 36,9
// http://www.gnu.org/licenses/gpl.html |
// |
// |
/////////////////////////////////////////////////////////////////////////// |
//////////////////////////////////////////////////////////////////////////////// |
// |
// |
#include <stdio.h> |
#include <string.h> |
#include <assert.h> |
69,7 → 70,7
static const unsigned |
CCS = 1; // 0: SDSC card, 1: SDHC or SDXC card |
|
SDSPISIM::SDSPISIM(void) { |
SDSPISIM::SDSPISIM(const bool debug) { |
m_dev = NULL; |
m_last_sck = 1; |
m_block_address = (CCS==1); |
120,6 → 121,7
// |
m_reading_data = false; |
m_have_token = false; |
m_debug = debug; |
} |
|
void SDSPISIM::load(const char *fname) { |
133,7 → 135,7
|
m_devblocks = devln>>9; |
|
printf("SDCARD: NBLOCKS = %ld\n", m_devblocks); |
if (m_debug) printf("SDCARD: NBLOCKS = %ld\n", m_devblocks); |
} |
} |
|
181,7 → 183,7
// Only change our output on the falling edge |
|
m_last_sck = sck; |
printf("SDSPI: (%3d) [%d,%d,%d] ", m_delay, csn, sck, m_mosi); |
if (m_debug) printf("SDSPI: (%3d) [%d,%d,%d] ", m_delay, csn, sck, m_mosi); |
// assert(m_delay > 20); |
|
m_bitpos++; |
188,15 → 190,15
m_dat_in = (m_dat_in<<1)|m_mosi; |
|
|
printf("(bitpos=%d,dat_in=%02x)\n", m_bitpos&7, m_dat_in&0x0ff); |
if (m_debug) printf("(bitpos=%d,dat_in=%02x)\n", m_bitpos&7, m_dat_in&0x0ff); |
|
if ((m_bitpos&7)==0) { |
printf("SDSPI--RX BYTE %02x\n", m_dat_in&0x0ff); |
if (m_debug) printf("SDSPI--RX BYTE %02x\n", m_dat_in&0x0ff); |
m_dat_out = 0xff; |
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, |
if (m_debug) printf("SDSPI: WR[%3d] = %02x\n", m_rxloc-1, |
m_dat_in&0x0ff); |
if (m_rxloc >= 512+2) { |
unsigned crc, rxcrc; |
204,8 → 206,8
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", |
if (m_debug) printf("LEN = %d\n", m_rxloc); |
if (m_debug) printf("CHECKING CRC: (rx) %04x =? %04x (calc)\n", |
crc, rxcrc); |
m_reading_data = false; |
m_have_token = false; |
218,13 → 220,14
} |
} else { |
if ((m_dat_in&0x0ff) == 0x0fe) { |
printf("SDSPI: TOKEN!!\n"); |
if (m_debug) printf("SDSPI: TOKEN!!\n"); |
m_have_token = true; |
m_rxloc = 0; |
} else printf("SDSPI: waiting on token\n"); |
} else if (m_debug) |
printf("SDSPI: waiting on token\n"); |
} |
} else if (m_cmdidx < 6) { |
printf("SDSPI: CMDIDX = %d\n", m_cmdidx); |
if (m_debug) printf("SDSPI: CMDIDX = %d\n", m_cmdidx); |
// All commands *must* start with a 01... pair of bits. |
if (m_cmdidx == 0) |
assert((m_dat_in&0xc0)==0x40); |
236,10 → 239,12
m_rspidx = 0; |
m_blkdly = 0; |
m_blkidx = SDSPI_MAXBLKLEN; |
printf("SDSPI: CMDIDX = %d -- WE HAVE A COMMAND! [ ", m_cmdidx); |
for(int i=0; i<6; i++) |
printf("%02x ", m_cmdbuf[i] & 0xff); |
printf("]\n"); fflush(stdout); |
if (m_debug) { |
printf("SDSPI: CMDIDX = %d -- WE HAVE A COMMAND! [ ", m_cmdidx); |
for(int i=0; i<6; i++) |
printf("%02x ", m_cmdbuf[i] & 0xff); |
printf("]\n"); fflush(stdout); |
} |
|
unsigned arg; |
arg = ((((((m_cmdbuf[1]<<8)|(m_cmdbuf[2]&0x0ff))<<8) |
292,7 → 297,7
} else { |
m_altcmd_flag = false; |
memset(m_rspbuf, 0x0ff, SDSPI_RSPLEN); |
printf("SDSPI: Received a command 0x%02x (%d)\n", |
if (m_debug) printf("SDSPI: Received a command 0x%02x (%d)\n", |
m_cmdbuf[0], m_cmdbuf[0]&0x03f); |
switch(m_cmdbuf[0]&0x3f) { |
case 0: // CMD0 -- GO_IDLE_STATE |
367,7 → 372,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_debug) 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); |
378,9 → 383,10
} m_block_buf[0] = 0x0fe; |
m_blklen = 512; // (1<<m_csd[5]); |
if (m_dev) |
fread(&m_block_buf[1], m_blklen, 1, m_dev); |
m_blklen = fread(&m_block_buf[1], m_blklen, 1, m_dev); |
else |
memset(&m_block_buf[1], 0, m_blklen); |
m_blklen = (m_blklen != 512) ? 512 : m_blklen; |
add_block_crc(m_blklen, m_block_buf); |
|
m_blkdly = 60; |
423,7 → 429,7
default: // Unimplemented command |
m_rspbuf[0] = 0x04; |
m_rspdly = 4; |
printf("SDSPI ERR: Command CMD%d not implemented!\n", m_cmdbuf[0]&0x03f); |
if (m_debug) printf("SDSPI ERR: Command CMD%d not implemented!\n", m_cmdbuf[0]&0x03f); |
fflush(stdout); |
assert(0 && "Not Implemented"); |
} |
478,7 → 484,7
|
bool SDSPISIM::check_cmdcrc(char *buf) const { |
unsigned fill = cmdcrc(5, buf); |
printf("SDSPI: CRC-CHECK, should have a CRC of %02x\n", fill); |
if (m_debug) printf("SDSPI: CRC-CHECK, should have a CRC of %02x\n", fill); |
return (fill == (buf[5]&0x0ff)); |
} |
|
/sdspisim.h
15,7 → 15,7
// |
//////////////////////////////////////////////////////////////////////////////// |
// |
// Copyright (C) 2015-2016, Gisselquist Technology, LLC |
// Copyright (C) 2015-2017, Gisselquist Technology, LLC |
// |
// This program is free software (firmware): you can redistribute it and/or |
// modify it under the terms of the GNU General Public License as published |
28,7 → 28,7
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with this program. (It's in the $(ROOT)/doc directory, run make with no |
// with this program. (It's in the $(ROOT)/doc directory. Run make with no |
// target there if the PDF file isn't present.) If not, see |
// <http://www.gnu.org/licenses/> for a copy. |
// |
75,7 → 75,7
char m_csd[SDSPI_CSDLEN], m_cid[SDSPI_CIDLEN]; |
|
public: |
SDSPISIM(void); |
SDSPISIM(const bool debug = false); |
void load(const char *fname); |
void debug(const bool dbg) { m_debug = dbg; } |
bool debug(void) const { return m_debug; } |