#include "LCD.h"
#endif
-
//=============================================================================
// A buffer where we can queue things up to be sent through the FPGA, for
// any purpose (fake tag, as reader, whatever). We go MSB first, since that
BYTE ToSend[256];
int ToSendMax;
static int ToSendBit;
+struct common_area common_area __attribute__((section(".commonarea")));
void BufferClear(void)
{
DbpIntegers(0, data[i], data[i+1]);
}
+/* osimage version information is linked in */
+extern struct version_information version_information;
+/* bootrom version information is pointed to from _bootphase1_version_pointer */
+extern char _bootphase1_version_pointer, _flash_start, _flash_end;
+void SendVersion(void)
+{
+ char temp[48]; /* Limited data payload in USB packets */
+ DbpString("Prox/RFID mark3 RFID instrument");
+
+ /* Try to find the bootrom version information. Expect to find a pointer at
+ * symbol _bootphase1_version_pointer, perform slight sanity checks on the
+ * pointer, then use it.
+ */
+ void *bootrom_version = *(void**)&_bootphase1_version_pointer;
+ if( bootrom_version < (void*)&_flash_start || bootrom_version >= (void*)&_flash_end ) {
+ DbpString("bootrom version information appears invalid");
+ } else {
+ FormatVersionInformation(temp, sizeof(temp), "bootrom: ", bootrom_version);
+ DbpString(temp);
+ }
+
+ FormatVersionInformation(temp, sizeof(temp), "os: ", &version_information);
+ DbpString(temp);
+
+ FpgaGatherVersion(temp, sizeof(temp));
+ DbpString(temp);
+}
+
// samy's sniff and repeat routine
void SamyRun()
{
at the same place! :-)
LIGHT SCHEME USED:
-
-Light scheme | Descriptiong
-----------------------------------------------------
- ---- | No field detected
- X--- | 14% of maximum current detected
- -X-- | 29% of maximum current detected
- --X- | 43% of maximum current detected
- ---X | 57% of maximum current detected
- --XX | 71% of maximum current detected
- -XXX | 86% of maximum current detected
- XXXX | 100% of maximum current detected
-
-TODO:
-Add the LF part for MODE 2
-
*/
+static const char LIGHT_SCHEME[] = {
+ 0x0, /* ---- | No field detected */
+ 0x1, /* X--- | 14% of maximum current detected */
+ 0x2, /* -X-- | 29% of maximum current detected */
+ 0x4, /* --X- | 43% of maximum current detected */
+ 0x8, /* ---X | 57% of maximum current detected */
+ 0xC, /* --XX | 71% of maximum current detected */
+ 0xE, /* -XXX | 86% of maximum current detected */
+ 0xF, /* XXXX | 100% of maximum current detected */
+};
+static const int LIGHT_LEN = sizeof(LIGHT_SCHEME)/sizeof(LIGHT_SCHEME[0]);
+
void ListenReaderField(int limit)
{
- int lf_av, lf_av_new, lf_baseline= 0, lf_count= 0;
+ int lf_av, lf_av_new, lf_baseline= 0, lf_count= 0, lf_max;
int hf_av, hf_av_new, hf_baseline= 0, hf_count= 0, hf_max;
- int mode=1;
+ int mode=1, display_val, display_max, i;
#define LF_ONLY 1
#define HF_ONLY 2
- LED_A_OFF();
- LED_B_OFF();
- LED_C_OFF();
- LED_D_OFF();
+ LEDsoff();
- lf_av= ReadAdc(ADC_CHAN_LF);
+ lf_av=lf_max=ReadAdc(ADC_CHAN_LF);
- if(limit != HF_ONLY)
- {
+ if(limit != HF_ONLY) {
DbpString("LF 125/134 Baseline:");
DbpIntegers(lf_av,0,0);
lf_baseline= lf_av;
- }
+ }
hf_av=hf_max=ReadAdc(ADC_CHAN_HF);
- if (limit != LF_ONLY)
- {
+ if (limit != LF_ONLY) {
DbpString("HF 13.56 Baseline:");
DbpIntegers(hf_av,0,0);
hf_baseline= hf_av;
- }
+ }
- for(;;)
- {
+ for(;;) {
if (BUTTON_PRESS()) {
SpinDelay(500);
switch (mode) {
case 2:
default:
DbpString("Stopped");
- LED_A_OFF();
- LED_B_OFF();
- LED_C_OFF();
- LED_D_OFF();
+ LEDsoff();
return;
break;
}
}
WDT_HIT();
- if (limit != HF_ONLY)
- {
- if (abs(lf_av - lf_baseline) > 10)
- LED_D_ON();
- else
- LED_D_OFF();
+ if (limit != HF_ONLY) {
+ if(mode==1) {
+ if (abs(lf_av - lf_baseline) > 10) LED_D_ON();
+ else LED_D_OFF();
+ }
+
++lf_count;
lf_av_new= ReadAdc(ADC_CHAN_LF);
// see if there's a significant change
- if(abs(lf_av - lf_av_new) > 10)
- {
+ if(abs(lf_av - lf_av_new) > 10) {
DbpString("LF 125/134 Field Change:");
DbpIntegers(lf_av,lf_av_new,lf_count);
lf_av= lf_av_new;
+ if (lf_av > lf_max)
+ lf_max = lf_av;
lf_count= 0;
- }
}
+ }
- if (limit != LF_ONLY)
- {
- if (abs(hf_av - hf_baseline) > 10) {
- if (mode == 1)
- LED_B_ON();
- if (mode == 2) {
- if ( hf_av>(hf_max/7)*6) {
- LED_A_ON(); LED_B_ON(); LED_C_ON(); LED_D_ON();
- }
- if ( (hf_av>(hf_max/7)*5) && (hf_av<=(hf_max/7)*6) ) {
- LED_A_ON(); LED_B_ON(); LED_C_OFF(); LED_D_ON();
- }
- if ( (hf_av>(hf_max/7)*4) && (hf_av<=(hf_max/7)*5) ) {
- LED_A_OFF(); LED_B_ON(); LED_C_OFF(); LED_D_ON();
- }
- if ( (hf_av>(hf_max/7)*3) && (hf_av<=(hf_max/7)*4) ) {
- LED_A_OFF(); LED_B_OFF(); LED_C_OFF(); LED_D_ON();
- }
- if ( (hf_av>(hf_max/7)*2) && (hf_av<=(hf_max/7)*3) ) {
- LED_A_OFF(); LED_B_ON(); LED_C_OFF(); LED_D_OFF();
- }
- if ( (hf_av>(hf_max/7)*1) && (hf_av<=(hf_max/7)*2) ) {
- LED_A_ON(); LED_B_OFF(); LED_C_OFF(); LED_D_OFF();
- }
- if ( (hf_av>(hf_max/7)*0) && (hf_av<=(hf_max/7)*1) ) {
- LED_A_OFF(); LED_B_OFF(); LED_C_ON(); LED_D_OFF();
- }
- }
- } else {
- if (mode == 1) {
- LED_B_OFF();
- }
- if (mode == 2) {
- LED_A_OFF(); LED_B_OFF(); LED_C_OFF(); LED_D_OFF();
- }
+ if (limit != LF_ONLY) {
+ if (mode == 1){
+ if (abs(hf_av - hf_baseline) > 10) LED_B_ON();
+ else LED_B_OFF();
}
-
+
++hf_count;
hf_av_new= ReadAdc(ADC_CHAN_HF);
// see if there's a significant change
- if(abs(hf_av - hf_av_new) > 10)
- {
+ if(abs(hf_av - hf_av_new) > 10) {
DbpString("HF 13.56 Field Change:");
DbpIntegers(hf_av,hf_av_new,hf_count);
hf_av= hf_av_new;
if (hf_av > hf_max)
hf_max = hf_av;
hf_count= 0;
+ }
+ }
+
+ if(mode == 2) {
+ if (limit == LF_ONLY) {
+ display_val = lf_av;
+ display_max = lf_max;
+ } else if (limit == HF_ONLY) {
+ display_val = hf_av;
+ display_max = hf_max;
+ } else { /* Pick one at random */
+ if( (hf_max - hf_baseline) > (lf_max - lf_baseline) ) {
+ display_val = hf_av;
+ display_max = hf_max;
+ } else {
+ display_val = lf_av;
+ display_max = lf_max;
+ }
+ }
+ for (i=0; i<LIGHT_LEN; i++) {
+ if (display_val >= ((display_max/LIGHT_LEN)*i) && display_val <= ((display_max/LIGHT_LEN)*(i+1))) {
+ if (LIGHT_SCHEME[i] & 0x1) LED_C_ON(); else LED_C_OFF();
+ if (LIGHT_SCHEME[i] & 0x2) LED_A_ON(); else LED_A_OFF();
+ if (LIGHT_SCHEME[i] & 0x4) LED_B_ON(); else LED_B_OFF();
+ if (LIGHT_SCHEME[i] & 0x8) LED_D_ON(); else LED_D_OFF();
+ break;
}
}
}
+ }
}
void UsbPacketReceived(BYTE *packet, int len)
case CMD_SET_LF_DIVISOR:
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, c->ext1);
break;
+ case CMD_VERSION:
+ SendVersion();
+ break;
+ case CMD_LF_SIMULATE_BIDIR:
+ SimulateTagLowFrequencyBidir(c->ext1, c->ext2);
+ break;
#ifdef WITH_LCD
case CMD_LCD_RESET:
LCDReset();
// We're going to reset, and the bootrom will take control.
}
break;
-
+ case CMD_START_FLASH:
+ if(common_area.flags.bootrom_present) {
+ common_area.command = COMMON_AREA_COMMAND_ENTER_FLASH_MODE;
+ }
+ USB_D_PLUS_PULLUP_OFF();
+ RSTC_CONTROL = RST_CONTROL_KEY | RST_CONTROL_PROCESSOR_RESET;
+ for(;;);
+ break;
+
+ case CMD_DEVICE_INFO: {
+ UsbCommand c;
+ c.cmd = CMD_DEVICE_INFO;
+ c.ext1 = DEVICE_INFO_FLAG_OSIMAGE_PRESENT | DEVICE_INFO_FLAG_CURRENT_MODE_OS;
+ if(common_area.flags.bootrom_present) c.ext1 |= DEVICE_INFO_FLAG_BOOTROM_PRESENT;
+ UsbSendPacket((BYTE*)&c, sizeof(c));
+ }
+ break;
default:
DbpString("unknown command");
break;
{
memset(BigBuf,0,sizeof(BigBuf));
SpinDelay(100);
+
+ if(common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) {
+ /* Initialize common area */
+ memset(&common_area, 0, sizeof(common_area));
+ common_area.magic = COMMON_AREA_MAGIC;
+ common_area.version = 1;
+ }
+ common_area.flags.osimage_present = 1;
LED_D_OFF();
LED_C_OFF();