summaryrefslogtreecommitdiff
path: root/include/librfid/rfid_asic_rc632.h
blob: 529b48c897e7c271f434fde0d4118c7e6636a558 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#ifndef _RFID_ASIC_RC632_H
#define _RFID_ASIC_RC632_H

struct rfid_asic_transport_handle;

#include <librfid/rfid.h>
#include <librfid/rfid_asic.h>
#include <librfid/rfid_layer2.h>

struct rfid_asic_rc632_transport {
	struct {
		int (*reg_write)(struct rfid_asic_transport_handle *rath,
				 u_int8_t reg,
				 u_int8_t value);
		int (*reg_read)(struct rfid_asic_transport_handle *rath,
				u_int8_t reg,
				u_int8_t *value);
		int (*fifo_write)(struct rfid_asic_transport_handle *rath,
				  u_int8_t len,
				  const u_int8_t *buf,
				  u_int8_t flags);
		int (*fifo_read)(struct rfid_asic_transport_handle *rath,
				 u_int8_t len,
				 u_int8_t *buf);
	} fn;
};

struct rfid_asic_handle;

struct iso14443a_atqa;
struct iso14443a_anticol_cmd;
struct iso15693_anticol_cmd;

struct rfid_asic_rc632 {
	struct {
		int (*power)(struct rfid_asic_handle *h, int on);
		int (*rf_power)(struct rfid_asic_handle *h, int on);
		int (*init)(struct rfid_asic_handle *h, enum rfid_layer2_id);
		int (*transceive)(struct rfid_asic_handle *h,
				  enum rfid_frametype,
				  const u_int8_t *tx_buf,
				  unsigned int tx_len,
				  u_int8_t *rx_buf,
				  unsigned int *rx_len,
				  u_int64_t timeout,
				  unsigned int flags);
		struct {
			int (*transceive_sf)(struct rfid_asic_handle *h,
					     u_int8_t cmd,
					     struct iso14443a_atqa *atqa);
			int (*transceive_acf)(struct rfid_asic_handle *h,
					      struct iso14443a_anticol_cmd *cmd,
					      unsigned int *bit_of_col);
			int (*set_speed)(struct rfid_asic_handle *h,
					 unsigned int tx,
					 unsigned int speed);
		} iso14443a;
		struct {
			int (*transceive_ac)(struct rfid_asic_handle *h,
					     const struct iso15693_anticol_cmd *acf,
					     unsigned int acf_len,
					     struct iso15693_anticol_resp *resp,
					     unsigned int *rx_len, char *bit_of_col);
		} iso15693;
		struct {
			int (*setkey)(struct rfid_asic_handle *h,
				      const unsigned char *key);
			int (*auth)(struct rfid_asic_handle *h, u_int8_t cmd, 
				    u_int32_t serno, u_int8_t block);
		} mifare_classic;
	} fn;
};

struct rc632_transport_handle {
};

/* A handle to a specific RC632 chip */
struct rfid_asic_rc632_handle {
	struct rc632_transport_handle th;
};

struct rfid_asic_rc632_impl_proto {
	u_int8_t mod_conductance;
	u_int8_t cw_conductance;
	u_int8_t bitphase;
	u_int8_t threshold;
};

struct rfid_asic_rc632_impl {
	u_int32_t mru;		/* maximum receive unit (PICC->PCD) */
	u_int32_t mtu;		/* maximum transmit unit (PCD->PICC) */
	//struct rfid_asic_rc632_impl_proto proto[NUM_RFID_PROTOCOLS];
};

extern struct rfid_asic_handle * rc632_open(struct rfid_asic_transport_handle *th);
extern void rc632_close(struct rfid_asic_handle *h);


/* register decoding inlines... */
#define DEBUGP_ERROR_FLAG(value) do {DEBUGP("error_flag: 0x%0.2x",value); \
				if (value & RC632_ERR_FLAG_CRC_ERR ) \
					DEBUGPC(", CRC"); \
				if (value & RC632_ERR_FLAG_COL_ERR ) \
					DEBUGPC(", COL"); \
				if (value & RC632_ERR_FLAG_FRAMING_ERR ) \
					DEBUGPC(", FRAMING"); \
				if (value & RC632_ERR_FLAG_PARITY_ERR) \
					DEBUGPC(", PARITY"); \
				if (value & RC632_ERR_FLAG_KEY_ERR ) \
					DEBUGPC(", KEY"); \
				if (value & RC632_ERR_FLAG_ACCESS_ERR ) \
					DEBUGPC(", ACCESS"); \
                DEBUGPC("\n");} while (0);

#define DEBUGP_STATUS_FLAG(foo) do {\
			DEBUGP("status_flag: 0x%0.2x",foo); \
			if (foo & RC632_STAT_ERR ) \
				DEBUGPC(", ERR"); \
			if (foo & RC632_STAT_HIALERT ) \
				DEBUGPC(", Hi"); \
			if (foo & RC632_STAT_IRQ ) \
				DEBUGPC(", IRQ"); \
			if (foo & RC632_STAT_LOALERT )  \
				DEBUGPC(", Lo"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_AWAITINGRX )  \
				DEBUGPC(", mAwaitingRX"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_GOTORX )  \
				DEBUGPC(", mGotoRX"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_IDLE )  \
				DEBUGPC(", mIdle"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_PREPARERX )  \
				DEBUGPC(", mPrepareRX"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_RECV )  \
				DEBUGPC(", mRX"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_TXDATA )  \
				DEBUGPC(", mTXData"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_TXEOF )  \
				DEBUGPC(", mTXeof"); \
			if ((foo & RC632_STAT_MODEM_MASK) == RC632_STAT_MODEM_TXSOF )  \
				DEBUGPC(", mTXsof"); \
            DEBUGPC("\n"); } while (0);

#define DEBUGP_INTERRUPT_FLAG(foo) do {\
                DEBUGP("interrupt_flag: 0x%0.2x",foo); \
                if (foo & RC632_INT_HIALERT) \
                    DEBUGPC(", HiA"); \
                if (foo & RC632_INT_LOALERT) \
                    DEBUGPC(", LoA"); \
                if (foo & RC632_INT_IDLE) \
                    DEBUGPC(", IDLE"); \
                if (foo & RC632_INT_RX) \
                    DEBUGPC(", RX"); \
                if (foo & RC632_INT_TX) \
                    DEBUGPC(", TX"); \
                if (foo & RC632_INT_TIMER) \
                    DEBUGPC(", TIMER"); \
                if (foo & RC632_INT_SET) \
                    DEBUGPC(", SET"); \
                DEBUGPC("\n"); } while (0);

#endif
personal git repositories of Harald Welte. Your mileage may vary