28
28
#include "BigBuf.h"
29
29
#include "mifareutil.h"
30
30
#include "pcf7931.h"
31
+ #include "i2c.h"
31
32
#ifdef WITH_LCD
32
33
#include "LCD.h"
33
34
#endif
34
- #ifdef WITH_SMARTCARD
35
- #include "i2c.h"
36
- #endif
37
35
38
36
39
37
// Craig Young - 14a stand-alone code
@@ -143,7 +141,7 @@ void Dbhexdump(int len, uint8_t *d, bool bAsci) {
143
141
static int ReadAdc (int ch )
144
142
{
145
143
// Note: ADC_MODE_PRESCALE and ADC_MODE_SAMPLE_HOLD_TIME are set to the maximum allowed value.
146
- // AMPL_HI is are high impedance (10MOhm || 1MOhm) output, the input capacitance of the ADC is 12pF (typical). This results in a time constant
144
+ // AMPL_HI is a high impedance (10MOhm || 1MOhm) output, the input capacitance of the ADC is 12pF (typical). This results in a time constant
147
145
// of RC = (0.91MOhm) * 12pF = 10.9us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged.
148
146
//
149
147
// The maths are:
@@ -162,7 +160,7 @@ static int ReadAdc(int ch)
162
160
163
161
while (!(AT91C_BASE_ADC -> ADC_SR & ADC_END_OF_CONVERSION (ch ))) {};
164
162
165
- return AT91C_BASE_ADC -> ADC_CDR [ch ];
163
+ return AT91C_BASE_ADC -> ADC_CDR [ch ] & 0x3ff ;
166
164
}
167
165
168
166
int AvgAdc (int ch ) // was static - merlok
@@ -177,6 +175,26 @@ int AvgAdc(int ch) // was static - merlok
177
175
return (a + 15 ) >> 5 ;
178
176
}
179
177
178
+ static int AvgAdc_Voltage_HF (void )
179
+ {
180
+ int AvgAdc_Voltage_Low , AvgAdc_Voltage_High ;
181
+
182
+ AvgAdc_Voltage_Low = (MAX_ADC_HF_VOLTAGE_LOW * AvgAdc (ADC_CHAN_HF_LOW )) >> 10 ;
183
+ // if voltage range is about to be exceeded, use high voltage ADC channel if available (RDV40 only)
184
+ if (AvgAdc_Voltage_Low > MAX_ADC_HF_VOLTAGE_LOW - 300 ) {
185
+ AvgAdc_Voltage_High = (MAX_ADC_HF_VOLTAGE_HIGH * AvgAdc (ADC_CHAN_HF_HIGH )) >> 10 ;
186
+ if (AvgAdc_Voltage_High >= AvgAdc_Voltage_Low ) {
187
+ return AvgAdc_Voltage_High ;
188
+ }
189
+ }
190
+ return AvgAdc_Voltage_Low ;
191
+ }
192
+
193
+ static int AvgAdc_Voltage_LF (void )
194
+ {
195
+ return (MAX_ADC_LF_VOLTAGE * AvgAdc (ADC_CHAN_LF )) >> 10 ;
196
+ }
197
+
180
198
void MeasureAntennaTuningLfOnly (int * vLf125 , int * vLf134 , int * peakf , int * peakv , uint8_t LF_Results [])
181
199
{
182
200
int i , adcval = 0 , peak = 0 ;
@@ -198,7 +216,7 @@ void MeasureAntennaTuningLfOnly(int *vLf125, int *vLf134, int *peakf, int *peakv
198
216
WDT_HIT ();
199
217
FpgaSendCommand (FPGA_CMD_SET_DIVISOR , i );
200
218
SpinDelay (20 );
201
- adcval = (( MAX_ADC_LF_VOLTAGE * AvgAdc ( ADC_CHAN_LF )) >> 10 );
219
+ adcval = AvgAdc_Voltage_LF ( );
202
220
if (i == 95 ) * vLf125 = adcval ; // voltage at 125Khz
203
221
if (i == 89 ) * vLf134 = adcval ; // voltage at 134Khz
204
222
@@ -223,9 +241,8 @@ void MeasureAntennaTuningHfOnly(int *vHf)
223
241
FpgaDownloadAndGo (FPGA_BITSTREAM_HF );
224
242
FpgaWriteConfWord (FPGA_MAJOR_MODE_HF_READER_RX_XCORR );
225
243
SpinDelay (20 );
226
- * vHf = ( MAX_ADC_HF_VOLTAGE * AvgAdc ( ADC_CHAN_HF )) >> 10 ;
244
+ * vHf = AvgAdc_Voltage_HF () ;
227
245
LED_A_OFF ();
228
-
229
246
return ;
230
247
}
231
248
@@ -267,8 +284,8 @@ void MeasureAntennaTuningHf(void)
267
284
FpgaWriteConfWord (FPGA_MAJOR_MODE_HF_READER_RX_XCORR );
268
285
269
286
for (;;) {
270
- SpinDelay (20 );
271
- vHf = ( MAX_ADC_HF_VOLTAGE * AvgAdc ( ADC_CHAN_HF )) >> 10 ;
287
+ SpinDelay (500 );
288
+ vHf = AvgAdc_Voltage_HF () ;
272
289
273
290
Dbprintf ("%d mV" ,vHf );
274
291
if (BUTTON_PRESS ()) break ;
@@ -293,6 +310,7 @@ extern struct version_information version_information;
293
310
/* bootrom version information is pointed to from _bootphase1_version_pointer */
294
311
extern char * _bootphase1_version_pointer , _flash_start , _flash_end , _bootrom_start , _bootrom_end , __data_src_start__ ;
295
312
313
+
296
314
void SendVersion (void )
297
315
{
298
316
char temp [USB_CMD_DATA_SIZE ]; /* Limited data payload in USB packets */
@@ -315,11 +333,16 @@ void SendVersion(void)
315
333
316
334
for (int i = 0 ; i < fpga_bitstream_num ; i ++ ) {
317
335
strncat (VersionString , fpga_version_information [i ], sizeof (VersionString ) - strlen (VersionString ) - 1 );
318
- if (i < fpga_bitstream_num - 1 ) {
319
- strncat (VersionString , "\n" , sizeof (VersionString ) - strlen (VersionString ) - 1 );
320
- }
336
+ strncat (VersionString , "\n" , sizeof (VersionString ) - strlen (VersionString ) - 1 );
321
337
}
322
-
338
+
339
+ // test availability of SmartCard slot
340
+ if (I2C_is_available ()) {
341
+ strncat (VersionString , "SmartCard Slot: available\n" , sizeof (VersionString ) - strlen (VersionString ) - 1 );
342
+ } else {
343
+ strncat (VersionString , "SmartCard Slot: not available\n" , sizeof (VersionString ) - strlen (VersionString ) - 1 );
344
+ }
345
+
323
346
// Send Chip ID and used flash memory
324
347
uint32_t text_and_rodata_section_size = (uint32_t )& __data_src_start__ - (uint32_t )& _flash_start ;
325
348
uint32_t compressed_data_section_size = common_area .arg1 ;
@@ -828,13 +851,15 @@ static const int LIGHT_LEN = sizeof(LIGHT_SCHEME)/sizeof(LIGHT_SCHEME[0]);
828
851
829
852
void ListenReaderField (int limit )
830
853
{
831
- int lf_av , lf_av_new , lf_baseline = 0 , lf_max ;
832
- int hf_av , hf_av_new , hf_baseline = 0 , hf_max ;
854
+ int lf_av , lf_av_new = 0 , lf_baseline = 0 , lf_max ;
855
+ int hf_av , hf_av_new = 0 , hf_baseline = 0 , hf_max ;
833
856
int mode = 1 , display_val , display_max , i ;
834
857
835
- #define LF_ONLY 1
836
- #define HF_ONLY 2
837
- #define REPORT_CHANGE 10 // report new values only if they have changed at least by REPORT_CHANGE
858
+ #define LF_ONLY 1
859
+ #define HF_ONLY 2
860
+ #define REPORT_CHANGE_PERCENT 5 // report new values only if they have changed at least by REPORT_CHANGE_PERCENT
861
+ #define MIN_HF_FIELD 300 // in mode 1 signal HF field greater than MIN_HF_FIELD above baseline
862
+ #define MIN_LF_FIELD 1200 // in mode 1 signal LF field greater than MIN_LF_FIELD above baseline
838
863
839
864
840
865
// switch off FPGA - we don't want to measure our own signal
@@ -843,23 +868,23 @@ void ListenReaderField(int limit)
843
868
844
869
LEDsoff ();
845
870
846
- lf_av = lf_max = AvgAdc ( ADC_CHAN_LF );
871
+ lf_av = lf_max = AvgAdc_Voltage_LF ( );
847
872
848
873
if (limit != HF_ONLY ) {
849
- Dbprintf ("LF 125/134kHz Baseline: %dmV" , ( MAX_ADC_LF_VOLTAGE * lf_av ) >> 10 );
874
+ Dbprintf ("LF 125/134kHz Baseline: %dmV" , lf_av );
850
875
lf_baseline = lf_av ;
851
876
}
852
877
853
- hf_av = hf_max = AvgAdc ( ADC_CHAN_HF );
854
-
878
+ hf_av = hf_max = AvgAdc_Voltage_HF ( );
879
+
855
880
if (limit != LF_ONLY ) {
856
- Dbprintf ("HF 13.56MHz Baseline: %dmV" , ( MAX_ADC_HF_VOLTAGE * hf_av ) >> 10 );
881
+ Dbprintf ("HF 13.56MHz Baseline: %dmV" , hf_av );
857
882
hf_baseline = hf_av ;
858
883
}
859
884
860
885
for (;;) {
886
+ SpinDelay (500 );
861
887
if (BUTTON_PRESS ()) {
862
- SpinDelay (500 );
863
888
switch (mode ) {
864
889
case 1 :
865
890
mode = 2 ;
@@ -872,21 +897,22 @@ void ListenReaderField(int limit)
872
897
return ;
873
898
break ;
874
899
}
900
+ while (BUTTON_PRESS ());
875
901
}
876
902
WDT_HIT ();
877
903
878
904
if (limit != HF_ONLY ) {
879
905
if (mode == 1 ) {
880
- if (ABS ( lf_av - lf_baseline ) > REPORT_CHANGE )
906
+ if (lf_av - lf_baseline > MIN_LF_FIELD )
881
907
LED_D_ON ();
882
908
else
883
909
LED_D_OFF ();
884
910
}
885
911
886
- lf_av_new = AvgAdc ( ADC_CHAN_LF );
912
+ lf_av_new = AvgAdc_Voltage_LF ( );
887
913
// see if there's a significant change
888
- if (ABS (lf_av - lf_av_new ) > REPORT_CHANGE ) {
889
- Dbprintf ("LF 125/134kHz Field Change: %5dmV" , ( MAX_ADC_LF_VOLTAGE * lf_av_new ) >> 10 );
914
+ if (ABS (( lf_av - lf_av_new )* 100 /( lf_av ? lf_av : 1 )) > REPORT_CHANGE_PERCENT ) {
915
+ Dbprintf ("LF 125/134kHz Field Change: %5dmV" , lf_av_new );
890
916
lf_av = lf_av_new ;
891
917
if (lf_av > lf_max )
892
918
lf_max = lf_av ;
@@ -895,16 +921,17 @@ void ListenReaderField(int limit)
895
921
896
922
if (limit != LF_ONLY ) {
897
923
if (mode == 1 ){
898
- if (ABS ( hf_av - hf_baseline ) > REPORT_CHANGE )
924
+ if (hf_av - hf_baseline > MIN_HF_FIELD )
899
925
LED_B_ON ();
900
926
else
901
927
LED_B_OFF ();
902
928
}
903
929
904
- hf_av_new = AvgAdc (ADC_CHAN_HF );
930
+ hf_av_new = AvgAdc_Voltage_HF ();
931
+
905
932
// see if there's a significant change
906
- if (ABS (hf_av - hf_av_new ) > REPORT_CHANGE ) {
907
- Dbprintf ("HF 13.56MHz Field Change: %5dmV" , ( MAX_ADC_HF_VOLTAGE * hf_av_new ) >> 10 );
933
+ if (ABS (( hf_av - hf_av_new )* 100 /( hf_av ? hf_av : 1 )) > REPORT_CHANGE_PERCENT ) {
934
+ Dbprintf ("HF 13.56MHz Field Change: %5dmV" , hf_av_new );
908
935
hf_av = hf_av_new ;
909
936
if (hf_av > hf_max )
910
937
hf_max = hf_av ;
@@ -1436,7 +1463,7 @@ void __attribute__((noreturn)) AppMain(void)
1436
1463
LED_A_OFF ();
1437
1464
1438
1465
// Init USB device
1439
- usb_enable ();
1466
+ usb_enable ();
1440
1467
1441
1468
// The FPGA gets its clock from us from PCK0 output, so set that up.
1442
1469
AT91C_BASE_PIOA -> PIO_BSR = GPIO_PCK0 ;
0 commit comments