source: trunk/modules/sdmmc/caba/source/include/sdmmc.h@ 627

Last change on this file since 627 was 574, checked in by bouyer, 13 years ago

Try to be closer to a real sdmmc device: on rising edge really use the value
we had while the clock was low, not the value at the rising edge time.
This is to make the transfer fail if the MOSI line changes at rising clock
instead of falling clock as it should.

File size: 3.5 KB
Line 
1
2/* -*- c++ -*-
3 *
4 * SOCLIB_LGPL_HEADER_BEGIN
5 *
6 * This file is part of SoCLib, GNU LGPLv2.1.
7 *
8 * SoCLib is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published
10 * by the Free Software Foundation; version 2.1 of the License.
11 *
12 * SoCLib is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with SoCLib; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301 USA
21 *
22 * SOCLIB_LGPL_HEADER_END
23 *
24 * Copyright (c) UPMC, Lip6, SoC
25 * manuel.bouyer@lip6.fr october 2013
26 *
27 * Maintainers: bouyer
28 */
29
30//////////////////////////////////////////////////////////////////////////////////////
31// This component is a SD/MMC block device.
32//
33// This component can perform data transfers between one single file belonging
34// to the host system and a SPI controller.
35// The file name is an argument of the constructor.
36//
37
38#ifndef SOCLIB_SDMMC_H
39#define SOCLIB_SDMMC_H
40
41#include <stdint.h>
42#include <systemc>
43#include <unistd.h>
44#include "caba_base_module.h"
45
46namespace soclib {
47namespace caba {
48
49using namespace sc_core;
50
51class SdMMC
52 : public caba::BaseModule
53{
54private:
55
56 // Registers
57 int spi_fsm; // SPI state register
58 int spi_shiftreg; // data shift in/out
59 int spi_bitcount;
60 int spi_clk;
61 int spi_mosi_previous; // sampled MOSI value
62
63 uint8_t command;
64 uint32_t args;
65 uint8_t cmdcrc;
66 int m_fd; // File descriptor
67 uint64_t m_device_size; // Total number of blocks
68 const uint32_t m_latency; // device latency
69
70 uint8_t m_databuf[1 /* reponse */ + 1 /* data tocken */ + 512 /* data block */ + 2 /* CRC */ ];
71 uint32_t m_datalen_snd; // data size to be sent to host
72 uint32_t m_datalen_rcv; // data size expected from host
73 uint32_t m_data_idx;
74 bool m_acmd; // next command will be acmd
75 int m_sdstate; // sdcard internal state
76
77 // sd states
78 enum {
79 SD_IDLE = 0,
80 SD_READY = 1,
81 };
82
83 // methods
84 void genMealy();
85
86 void handle_sdmmc_cmd(uint8_t, uint32_t);
87 void handle_sdmmc_write(uint8_t, uint32_t);
88
89 // Master FSM states
90 enum {
91 S_IDLE = 0,
92 S_RECEIVE_CMD = 1,
93 S_RECEIVE_ARGS_START = 2,
94 S_RECEIVE_ARGS = 3,
95 S_RECEIVE_CRC = 4,
96 S_RECEIVE_DATA_WAIT = 5,
97 S_RECEIVE_DATA = 6,
98 S_SEND_DATA = 7,
99 };
100
101protected:
102
103 SC_HAS_PROCESS(SdMMC);
104
105public:
106
107 // ports
108 sc_in<bool> p_clk;
109 sc_in<bool> p_resetn;
110 sc_in<bool> p_spi_ss;
111 sc_in<bool> p_spi_clk;
112 sc_in<bool> p_spi_mosi;
113 sc_out<bool> p_spi_miso;
114
115 void print_trace();
116
117 // Constructor
118 SdMMC(
119 sc_module_name name,
120 const std::string &filename,
121 const uint32_t latency = 0);
122
123 ~SdMMC();
124
125};
126
127}}
128
129#endif /* SOCLIB_SDMMC_H */
130
131// Local Variables:
132// tab-width: 4
133// c-basic-offset: 4
134// c-file-offsets:((innamespace . 0)(inline-open . 0))
135// indent-tabs-mode: nil
136// End:
137
138// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
Note: See TracBrowser for help on using the repository browser.