81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
#ifndef SPI_H
|
|
#define SPI_H
|
|
|
|
#include <stdint.h>
|
|
#include <inttypes.h>
|
|
#include <map>
|
|
#include <string>
|
|
|
|
class INIReader;
|
|
class File;
|
|
|
|
namespace Spi {
|
|
|
|
void clock(uint16_t b, uint16_t a);
|
|
bool config(INIReader &reader, const std::string §ionString);
|
|
|
|
class Device {
|
|
public:
|
|
Device(int port);
|
|
virtual void clock(uint16_t b, uint16_t a);
|
|
virtual bool config(INIReader &reader, const std::string §ionString) = 0;
|
|
virtual uint8_t spiselect(void);
|
|
virtual uint8_t spibyte(uint8_t) = 0;
|
|
protected:
|
|
const uint8_t cs;
|
|
uint8_t mask;
|
|
uint8_t miso_byte;
|
|
uint8_t mosi_byte;
|
|
};
|
|
|
|
class SDCard : public Device {
|
|
protected:
|
|
|
|
enum Type { NONE = 0, MMC, SDSC, SDHC };
|
|
|
|
uint8_t idle;
|
|
int state;
|
|
int count;
|
|
int len;
|
|
uint8_t *buffer;
|
|
long long offset;
|
|
Type type;
|
|
std::string filename;
|
|
long long filelen;
|
|
File *fd;
|
|
|
|
enum Action { WAIT=0, RECV=1, SEND=2, BUSY=3 };
|
|
enum Context { INIT=0, CMD, APPCMD, REG, READ, READM, WRITE, WRITE1, WRITEM, WRITEM1 };
|
|
|
|
Action action(void) {
|
|
return Action(state & 0xf); }
|
|
Context context(void) {
|
|
return Context(state >> 4); }
|
|
void set_wait_state(Context context) {
|
|
state = (context<<4) | Action::WAIT; }
|
|
void set_recv_state(Context context, int n) {
|
|
state = (context<<4) | Action::RECV; len=n; count=0; }
|
|
void set_recv_state(Context context, int n, uint8_t b) {
|
|
state = (context<<4) | Action::RECV; len=n; buffer[0]=b; count=1; }
|
|
void set_send_state(Context context, int n) {
|
|
state = (context<<4) | Action::SEND; len=n; count=0; }
|
|
void set_send_r1_state(Context context, uint8_t r1) {
|
|
buffer[0] = r1; set_send_state(context, 1); }
|
|
void set_busy_state(Context context, int n) {
|
|
state = (context<<4) | Action::BUSY; len=n; count=0; }
|
|
|
|
uint8_t spiselect(void);
|
|
uint8_t spibyte(uint8_t);
|
|
void sdcommand(Context ctx);
|
|
bool read_data();
|
|
bool write_data();
|
|
public:
|
|
SDCard(int num);
|
|
virtual ~SDCard();
|
|
virtual bool config(INIReader &reader, const std::string §ionString);
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|