15
15
* See the License for the specific language governing permissions and
16
16
* limitations under the License.
17
17
********************************************************************************/
18
- #include "bolos_target.h"
18
+
19
+ #include "os.h"
20
+ #include "os_settings.h"
21
+ #include "os_io_seproxyhal.h"
22
+
19
23
#include "errors.h"
20
24
#include "exceptions.h"
21
25
#ifdef HAVE_NFC
25
29
#endif // DEBUG_OS_STACK_CONSUMPTION
26
30
27
31
#include "os_io.h"
32
+ #include "os_io_nfc.h"
28
33
#include "os_utils.h"
29
34
#include "os_io_seproxyhal.h"
30
35
#include <string.h>
31
36
32
- #ifdef DEBUG
33
- #define LOG printf
34
- #else
35
- #define LOG (...)
36
- #endif
37
-
38
- #include "os.h"
39
37
#include "ledger_protocol.h"
40
38
41
39
static uint8_t rx_apdu_buffer [IO_APDU_BUFFER_SIZE ];
@@ -55,6 +53,9 @@ void io_nfc_init(void)
55
53
ledger_protocol_data .rx_dst_buffer = G_io_apdu_buffer ;
56
54
#endif
57
55
LEDGER_PROTOCOL_init (& ledger_protocol_data );
56
+ #ifdef HAVE_NFC_READER
57
+ memset ((void * ) & G_io_reader_ctx , 0 , sizeof (G_io_reader_ctx ));
58
+ #endif // HAVE_NFC_READER
58
59
}
59
60
60
61
void io_nfc_recv_event (void )
@@ -65,6 +66,13 @@ void io_nfc_recv_event(void)
65
66
66
67
// Full apdu is received, copy it to global apdu buffer
67
68
if (ledger_protocol_data .rx_apdu_status == APDU_STATUS_COMPLETE ) {
69
+ #ifdef HAVE_NFC_READER
70
+ if (G_io_reader_ctx .reader_mode ) {
71
+ G_io_reader_ctx .response_received = true;
72
+ return ;
73
+ }
74
+ #endif // HAVE_NFC_READER
75
+
68
76
memcpy (ledger_protocol_data .rx_dst_buffer ,
69
77
ledger_protocol_data .rx_apdu_buffer ,
70
78
ledger_protocol_data .rx_apdu_length );
@@ -106,4 +114,140 @@ void io_nfc_send_response(const uint8_t *packet, uint16_t packet_length)
106
114
}
107
115
}
108
116
117
+ #ifdef HAVE_NFC_READER
118
+
119
+ void io_nfc_event (void )
120
+ {
121
+ size_t size = U2BE (G_io_seproxyhal_spi_buffer , 1 );
122
+
123
+ if (size >= 1 ) {
124
+ switch (G_io_seproxyhal_spi_buffer [3 ]) {
125
+ case SEPROXYHAL_TAG_NFC_EVENT_CARD_DETECTED : {
126
+ G_io_reader_ctx .event_happened = true;
127
+ G_io_reader_ctx .last_event = CARD_DETECTED ;
128
+ G_io_reader_ctx .card .tech
129
+ = (G_io_seproxyhal_spi_buffer [4 ] == SEPROXYHAL_TAG_NFC_EVENT_CARD_DETECTED_A )
130
+ ? NFC_A
131
+ : NFC_B ;
132
+ G_io_reader_ctx .card .nfcid_len = MIN (size - 2 , sizeof (G_io_reader_ctx .card .nfcid ));
133
+ memcpy ((void * ) G_io_reader_ctx .card .nfcid ,
134
+ G_io_seproxyhal_spi_buffer + 5 ,
135
+ G_io_reader_ctx .card .nfcid_len );
136
+ } break ;
137
+
138
+ case SEPROXYHAL_TAG_NFC_EVENT_CARD_LOST :
139
+ if (G_io_reader_ctx .evt_callback != NULL ) {
140
+ G_io_reader_ctx .event_happened = true;
141
+ G_io_reader_ctx .last_event = CARD_REMOVED ;
142
+ }
143
+ break ;
144
+ }
145
+ }
146
+ }
147
+
148
+ void io_nfc_process_events (void )
149
+ {
150
+ if (G_io_reader_ctx .response_received ) {
151
+ G_io_reader_ctx .response_received = false;
152
+ if (G_io_reader_ctx .resp_callback != NULL ) {
153
+ nfc_resp_callback_t resp_cb = G_io_reader_ctx .resp_callback ;
154
+ G_io_reader_ctx .resp_callback = NULL ;
155
+ resp_cb (false,
156
+ false,
157
+ ledger_protocol_data .rx_apdu_buffer ,
158
+ ledger_protocol_data .rx_apdu_length );
159
+ }
160
+ memset (ledger_protocol_data .rx_apdu_buffer , 0 , ledger_protocol_data .rx_apdu_length );
161
+ }
162
+
163
+ if (G_io_reader_ctx .resp_callback != NULL && G_io_reader_ctx .remaining_ms == 0 ) {
164
+ nfc_resp_callback_t resp_cb = G_io_reader_ctx .resp_callback ;
165
+ G_io_reader_ctx .resp_callback = NULL ;
166
+ resp_cb (false, true, NULL , 0 );
167
+ }
168
+
169
+ if (G_io_reader_ctx .event_happened ) {
170
+ G_io_reader_ctx .event_happened = 0 ;
171
+
172
+ // If card is removed during an APDU processing, call the resp_callback with an error
173
+ if (G_io_reader_ctx .resp_callback != NULL && G_io_reader_ctx .last_event == CARD_REMOVED ) {
174
+ nfc_resp_callback_t resp_cb = G_io_reader_ctx .resp_callback ;
175
+ G_io_reader_ctx .resp_callback = NULL ;
176
+ resp_cb (true, false, NULL , 0 );
177
+ }
178
+
179
+ if (G_io_reader_ctx .evt_callback != NULL ) {
180
+ G_io_reader_ctx .evt_callback (G_io_reader_ctx .last_event ,
181
+ (struct card_info * ) & G_io_reader_ctx .card );
182
+ }
183
+ if (G_io_reader_ctx .last_event == CARD_REMOVED ) {
184
+ memset ((void * ) & G_io_reader_ctx .card , 0 , sizeof (G_io_reader_ctx .card ));
185
+ }
186
+ }
187
+ }
188
+
189
+ void io_nfc_ticker (void )
190
+ {
191
+ if (G_io_reader_ctx .resp_callback != NULL ) {
192
+ if (G_io_reader_ctx .remaining_ms <= 100 ) {
193
+ G_io_reader_ctx .remaining_ms = 0 ;
194
+ }
195
+ else {
196
+ G_io_reader_ctx .remaining_ms -= 100 ;
197
+ }
198
+ }
199
+ }
200
+
201
+ bool io_nfc_reader_send (const uint8_t * cmd_data ,
202
+ size_t cmd_len ,
203
+ nfc_resp_callback_t callback ,
204
+ int timeout_ms )
205
+ {
206
+ G_io_reader_ctx .resp_callback = PIC (callback );
207
+ io_nfc_send_response (PIC (cmd_data ), cmd_len );
208
+
209
+ G_io_reader_ctx .response_received = false;
210
+ G_io_reader_ctx .remaining_ms = timeout_ms ;
211
+
212
+ return true;
213
+ }
214
+
215
+ void io_nfc_reader_power (void )
216
+ {
217
+ uint8_t buffer [4 ];
218
+ buffer [0 ] = SEPROXYHAL_TAG_NFC_POWER ;
219
+ buffer [1 ] = 0 ;
220
+ buffer [2 ] = 1 ;
221
+ buffer [3 ] = SEPROXYHAL_TAG_NFC_POWER_ON_READER ;
222
+ io_seproxyhal_spi_send (buffer , 4 );
223
+ }
224
+
225
+ bool io_nfc_reader_start (nfc_evt_callback_t callback )
226
+ {
227
+ G_io_reader_ctx .evt_callback = PIC (callback );
228
+ G_io_reader_ctx .reader_mode = true;
229
+ G_io_reader_ctx .event_happened = false;
230
+ G_io_reader_ctx .resp_callback = NULL ;
231
+ G_io_reader_ctx .response_received = false;
232
+ io_nfc_reader_power ();
233
+ return true;
234
+ }
235
+
236
+ void io_nfc_reader_stop ()
237
+ {
238
+ G_io_reader_ctx .evt_callback = NULL ;
239
+ G_io_reader_ctx .reader_mode = false;
240
+ G_io_reader_ctx .event_happened = false;
241
+ G_io_reader_ctx .resp_callback = NULL ;
242
+ G_io_reader_ctx .response_received = false;
243
+ io_seproxyhal_nfc_power (false);
244
+ }
245
+
246
+ bool io_nfc_is_reader (void )
247
+ {
248
+ return G_io_reader_ctx .reader_mode ;
249
+ }
250
+
251
+ #endif // HAVE_NFC_READER
252
+
109
253
#endif // HAVE_NFC
0 commit comments