2
2
3
3
#define TAG "MagHelpers"
4
4
5
- // Haviv Board - pins gpio_ext_pa7 & gpio_ext_pa6 was swapped.
6
- #define GPIO_PIN_A &gpio_ext_pa7
7
- #define GPIO_PIN_B &gpio_ext_pa6
8
- #define GPIO_PIN_ENABLE &gpio_ext_pa4
9
- #define RFID_PIN_OUT &gpio_rfid_carrier_out
10
-
11
5
#define ZERO_PREFIX 25 // n zeros prefix
12
6
#define ZERO_BETWEEN 53 // n zeros between tracks
13
7
#define ZERO_SUFFIX 25 // n zeros suffix
@@ -19,18 +13,18 @@ const int sublen[] = {32, 48, 48};
19
13
20
14
uint8_t last_value = 2 ;
21
15
22
- void play_halfbit (bool value , MagSetting * setting ) {
23
- switch (setting -> tx ) {
16
+ void play_halfbit (bool value , MagState * state ) {
17
+ switch (state -> tx ) {
24
18
case MagTxStateRFID :
25
- furi_hal_gpio_write (RFID_PIN_OUT , value );
19
+ furi_hal_gpio_write (& gpio_rfid_carrier_out , value );
26
20
/*furi_hal_gpio_write(RFID_PIN_OUT, !value);
27
21
furi_hal_gpio_write(RFID_PIN_OUT, value);
28
22
furi_hal_gpio_write(RFID_PIN_OUT, !value);
29
23
furi_hal_gpio_write(RFID_PIN_OUT, value);*/
30
24
break ;
31
25
case MagTxStateGPIO :
32
- furi_hal_gpio_write (GPIO_PIN_A , value );
33
- furi_hal_gpio_write (GPIO_PIN_B , !value );
26
+ furi_hal_gpio_write (mag_state_enum_to_pin ( state -> pin_input ) , value );
27
+ furi_hal_gpio_write (mag_state_enum_to_pin ( state -> pin_output ) , !value );
34
28
break ;
35
29
case MagTxStatePiezo :
36
30
furi_hal_gpio_write (& gpio_speaker , value );
@@ -41,7 +35,7 @@ void play_halfbit(bool value, MagSetting* setting) {
41
35
42
36
break ;
43
37
case MagTxStateLF_P :
44
- furi_hal_gpio_write (RFID_PIN_OUT , value );
38
+ furi_hal_gpio_write (& gpio_rfid_carrier_out , value );
45
39
furi_hal_gpio_write (& gpio_speaker , value );
46
40
47
41
/* // Weaker but cleaner signal
@@ -88,7 +82,7 @@ void play_halfbit(bool value, MagSetting* setting) {
88
82
last_value = value ;
89
83
}
90
84
91
- void play_track (uint8_t * bits_manchester , uint16_t n_bits , MagSetting * setting , bool reverse ) {
85
+ void play_track (uint8_t * bits_manchester , uint16_t n_bits , MagState * state , bool reverse ) {
92
86
for (uint16_t i = 0 ; i < n_bits ; i ++ ) {
93
87
uint16_t j = (reverse ) ? (n_bits - i - 1 ) : i ;
94
88
uint8_t byte = j / 8 ;
@@ -117,9 +111,9 @@ void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting,
117
111
// for DWT->CYCCNT. Note timer is aliased to 64us as per
118
112
// #define FURI_HAL_CORTEX_INSTRUCTIONS_PER_MICROSECOND (SystemCoreClock / 1000000) | furi_hal_cortex.c
119
113
120
- play_halfbit (bit , setting );
121
- furi_delay_us (setting -> us_clock );
122
- // if (i % 2 == 1) furi_delay_us(setting ->us_interpacket);
114
+ play_halfbit (bit , state );
115
+ furi_delay_us (state -> us_clock );
116
+ // if (i % 2 == 1) furi_delay_us(state ->us_interpacket);
123
117
}
124
118
}
125
119
@@ -131,7 +125,7 @@ void tx_init_rfid() {
131
125
// furi_hal_ibutton_start_drive();
132
126
furi_hal_ibutton_pin_write (false);
133
127
134
- // Initializing at GpioSpeedLow seems sufficient for our needs; no improvements seen by increasing speed setting
128
+ // Initializing at GpioSpeedLow seems sufficient for our needs; no improvements seen by increasing speed state
135
129
136
130
// this doesn't seem to make a difference, leaving it in
137
131
furi_hal_gpio_init (& gpio_rfid_data_in , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
@@ -143,14 +137,14 @@ void tx_init_rfid() {
143
137
furi_hal_gpio_init (& gpio_nfc_irq_rfid_pull , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
144
138
furi_hal_gpio_write (& gpio_nfc_irq_rfid_pull , false);
145
139
146
- furi_hal_gpio_init (RFID_PIN_OUT , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
140
+ furi_hal_gpio_init (& gpio_rfid_carrier_out , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
147
141
148
142
furi_delay_ms (300 );
149
143
}
150
144
151
145
void tx_deinit_rfid () {
152
146
// reset RFID system
153
- furi_hal_gpio_write (RFID_PIN_OUT , 0 );
147
+ furi_hal_gpio_write (& gpio_rfid_carrier_out , 0 );
154
148
155
149
furi_hal_rfid_pins_reset ();
156
150
}
@@ -179,19 +173,31 @@ void tx_deinit_piezo() {
179
173
furi_hal_gpio_init (& gpio_speaker , GpioModeAnalog , GpioPullNo , GpioSpeedLow );
180
174
}
181
175
182
- bool tx_init (MagSetting * setting ) {
176
+ bool tx_init (MagState * state ) {
183
177
// Initialize configured TX method
184
- switch (setting -> tx ) {
178
+ switch (state -> tx ) {
185
179
case MagTxStateRFID :
186
180
tx_init_rfid ();
187
181
break ;
188
182
case MagTxStateGPIO :
189
183
// gpio_item_configure_all_pins(GpioModeOutputPushPull);
190
- furi_hal_gpio_init (GPIO_PIN_A , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
191
- furi_hal_gpio_init (GPIO_PIN_B , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
192
- furi_hal_gpio_init (GPIO_PIN_ENABLE , GpioModeOutputPushPull , GpioPullNo , GpioSpeedLow );
193
-
194
- furi_hal_gpio_write (GPIO_PIN_ENABLE , 1 );
184
+ furi_hal_gpio_init (
185
+ mag_state_enum_to_pin (state -> pin_input ),
186
+ GpioModeOutputPushPull ,
187
+ GpioPullNo ,
188
+ GpioSpeedLow );
189
+ furi_hal_gpio_init (
190
+ mag_state_enum_to_pin (state -> pin_output ),
191
+ GpioModeOutputPushPull ,
192
+ GpioPullNo ,
193
+ GpioSpeedLow );
194
+ furi_hal_gpio_init (
195
+ mag_state_enum_to_pin (state -> pin_enable ),
196
+ GpioModeOutputPushPull ,
197
+ GpioPullNo ,
198
+ GpioSpeedLow );
199
+
200
+ furi_hal_gpio_write (mag_state_enum_to_pin (state -> pin_enable ), 1 );
195
201
196
202
// had some issues with ~300; bumped higher temporarily
197
203
furi_delay_ms (500 );
@@ -219,21 +225,24 @@ bool tx_init(MagSetting* setting) {
219
225
return true;
220
226
}
221
227
222
- bool tx_deinit (MagSetting * setting ) {
228
+ bool tx_deinit (MagState * state ) {
223
229
// Reset configured TX method
224
- switch (setting -> tx ) {
230
+ switch (state -> tx ) {
225
231
case MagTxStateRFID :
226
232
tx_deinit_rfid ();
227
233
break ;
228
234
case MagTxStateGPIO :
229
- furi_hal_gpio_write (GPIO_PIN_A , 0 );
230
- furi_hal_gpio_write (GPIO_PIN_B , 0 );
231
- furi_hal_gpio_write (GPIO_PIN_ENABLE , 0 );
235
+ furi_hal_gpio_write (mag_state_enum_to_pin ( state -> pin_input ) , 0 );
236
+ furi_hal_gpio_write (mag_state_enum_to_pin ( state -> pin_output ) , 0 );
237
+ furi_hal_gpio_write (mag_state_enum_to_pin ( state -> pin_enable ) , 0 );
232
238
233
239
// set back to analog output mode? - YES
234
- furi_hal_gpio_init (GPIO_PIN_A , GpioModeAnalog , GpioPullNo , GpioSpeedLow );
235
- furi_hal_gpio_init (GPIO_PIN_B , GpioModeAnalog , GpioPullNo , GpioSpeedLow );
236
- furi_hal_gpio_init (GPIO_PIN_ENABLE , GpioModeAnalog , GpioPullNo , GpioSpeedLow );
240
+ furi_hal_gpio_init (
241
+ mag_state_enum_to_pin (state -> pin_input ), GpioModeAnalog , GpioPullNo , GpioSpeedLow );
242
+ furi_hal_gpio_init (
243
+ mag_state_enum_to_pin (state -> pin_output ), GpioModeAnalog , GpioPullNo , GpioSpeedLow );
244
+ furi_hal_gpio_init (
245
+ mag_state_enum_to_pin (state -> pin_enable ), GpioModeAnalog , GpioPullNo , GpioSpeedLow );
237
246
238
247
//gpio_item_configure_all_pins(GpioModeAnalog);
239
248
break ;
@@ -262,7 +271,7 @@ bool tx_deinit(MagSetting* setting) {
262
271
}
263
272
264
273
void mag_spoof (Mag * mag ) {
265
- MagSetting * setting = mag -> setting ;
274
+ MagState * state = & mag -> state ;
266
275
267
276
// TODO: cleanup this section. Possibly move precompute + tx_init to emulate_on_enter?
268
277
FuriString * ft1 = mag -> mag_dev -> dev_data .track [0 ].str ;
@@ -320,47 +329,47 @@ void mag_spoof(Mag* mag) {
320
329
last_value = 2 ;
321
330
bool bit = false;
322
331
323
- if (!tx_init (setting )) return ;
332
+ if (!tx_init (state )) return ;
324
333
325
334
FURI_CRITICAL_ENTER ();
326
335
for (uint16_t i = 0 ; i < (ZERO_PREFIX * 2 ); i ++ ) {
327
336
// is this right?
328
337
if (!!(i % 2 )) bit ^= 1 ;
329
- play_halfbit (bit , setting );
330
- furi_delay_us (setting -> us_clock );
338
+ play_halfbit (bit , state );
339
+ furi_delay_us (state -> us_clock );
331
340
}
332
341
333
- if ((setting -> track == MagTrackStateOneAndTwo ) || (setting -> track == MagTrackStateOne ))
334
- play_track ((uint8_t * )bits_t1_manchester , bits_t1_count , setting , false);
342
+ if ((state -> track == MagTrackStateOneAndTwo ) || (state -> track == MagTrackStateOne ))
343
+ play_track ((uint8_t * )bits_t1_manchester , bits_t1_count , state , false);
335
344
336
- if ((setting -> track == MagTrackStateOneAndTwo ))
345
+ if ((state -> track == MagTrackStateOneAndTwo ))
337
346
for (uint16_t i = 0 ; i < (ZERO_BETWEEN * 2 ); i ++ ) {
338
347
if (!!(i % 2 )) bit ^= 1 ;
339
- play_halfbit (bit , setting );
340
- furi_delay_us (setting -> us_clock );
348
+ play_halfbit (bit , state );
349
+ furi_delay_us (state -> us_clock );
341
350
}
342
351
343
- if ((setting -> track == MagTrackStateOneAndTwo ) || (setting -> track == MagTrackStateTwo ))
352
+ if ((state -> track == MagTrackStateOneAndTwo ) || (state -> track == MagTrackStateTwo ))
344
353
play_track (
345
354
(uint8_t * )bits_t2_manchester ,
346
355
bits_t2_count ,
347
- setting ,
348
- (setting -> reverse == MagReverseStateOn ));
356
+ state ,
357
+ (state -> reverse == MagReverseStateOn ));
349
358
350
- if ((setting -> track == MagTrackStateThree ))
351
- play_track ((uint8_t * )bits_t3_manchester , bits_t3_count , setting , false);
359
+ if ((state -> track == MagTrackStateThree ))
360
+ play_track ((uint8_t * )bits_t3_manchester , bits_t3_count , state , false);
352
361
353
362
for (uint16_t i = 0 ; i < (ZERO_SUFFIX * 2 ); i ++ ) {
354
363
if (!!(i % 2 )) bit ^= 1 ;
355
- play_halfbit (bit , setting );
356
- furi_delay_us (setting -> us_clock );
364
+ play_halfbit (bit , state );
365
+ furi_delay_us (state -> us_clock );
357
366
}
358
367
FURI_CRITICAL_EXIT ();
359
368
360
369
free (data1 );
361
370
free (data2 );
362
371
free (data3 );
363
- tx_deinit (setting );
372
+ tx_deinit (state );
364
373
}
365
374
366
375
uint16_t add_bit (bool value , uint8_t * out , uint16_t count ) {
0 commit comments