diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/Makefile | 4 | ||||
-rw-r--r-- | firmware/include/openpcd.h | 4 | ||||
-rw-r--r-- | firmware/src/pcd/main_presence.c | 163 |
3 files changed, 171 insertions, 0 deletions
diff --git a/firmware/Makefile b/firmware/Makefile index 3de893c..ac1dcd8 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -275,6 +275,10 @@ ifeq ($(TARGET),main_reqa) EXTRA_LIBS = rfid endif +ifeq ($(TARGET),main_presence) +EXTRA_LIBS = rfid +endif + #Support for newlibc-lpc (file: libnewlibc-lpc.a) #NEWLIBLPC = -lnewlib-lpc diff --git a/firmware/include/openpcd.h b/firmware/include/openpcd.h index 904b8ff..e5a0ac7 100644 --- a/firmware/include/openpcd.h +++ b/firmware/include/openpcd.h @@ -33,6 +33,7 @@ enum openpcd_cmd_class { OPENPCD_CMD_CLS_PWM = 0x4, OPENPCD_CMD_CLS_ADC = 0x5, OPENPCD_CMD_CLS_LIBRFID = 0x6, + OPENPCD_CMD_CLS_PRESENCE = 0x7, /* PICC (transponder) side */ OPENPCD_CMD_CLS_PICC = 0xe, @@ -89,6 +90,9 @@ enum openpcd_cmd_class { /* CMD_CLS_LIBRFID */ #define OPENPCD_CMD_LRFID_DETECT_IRQ (0x1|OPENPCD_CLS2CMD(OPENPCD_CMD_CLS_LIBRFID)) +/* CMD_CLS_LIBRFID */ +#define OPENPCD_CMD_PRESENCE_UID_GET (0x1|OPENPCD_CLS2CMD(OPENPCD_CMD_CLS_PRESENCE)) + /* CMD_CLS_USBTEST */ #define OPENPCD_CMD_USBTEST_IN (0x1|OPENPCD_CLS2CMD(OPENPCD_CMD_CLS_USBTEST)) #define OPENPCD_CMD_USBTEST_OUT (0x2|OPENPCD_CLS2CMD(OPENPCD_CMD_CLS_USBTEST)) diff --git a/firmware/src/pcd/main_presence.c b/firmware/src/pcd/main_presence.c new file mode 100644 index 0000000..f61878f --- /dev/null +++ b/firmware/src/pcd/main_presence.c @@ -0,0 +1,163 @@ +/* AT91SAM7 "presence reader" firmware for OpenPCD + * + * (C) 2006 by Milosch Meriac <meriac@openpcd.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <errno.h> +#include <string.h> +#include <lib_AT91SAM7.h> +#include <librfid/rfid_layer2_iso14443a.h> +#include "rc632.h" +#include <os/dbgu.h> +#include <os/led.h> +#include <os/pcd_enumerate.h> +#include <os/usb_handler.h> +#include <pcd/rc632_highlevel.h> + +#include <librfid/rfid_reader.h> +#include <librfid/rfid_layer2.h> + +#include "../openpcd.h" +#include <os/main.h> + +#define RAH NULL + +u_int32_t delay_scan,delay_blink,last_uid,last_polled_uid; +static struct rfid_reader_handle *rh; +static struct rfid_layer2_handle *l2h; + +static int usb_presence_rx(struct req_ctx *rctx) +{ + struct openpcd_hdr *poh = (struct openpcd_hdr *) rctx->data; + + switch (poh->cmd) + { + case OPENPCD_CMD_PRESENCE_UID_GET: + DEBUGPCRF("get presence UID"); + + poh->flags |= OPENPCD_FLAG_RESPOND; + if(last_polled_uid) + { + rctx->tot_len += 4; + poh->data[0]=(u_int8_t)(last_polled_uid>>24); + poh->data[1]=(u_int8_t)(last_polled_uid>>16); + poh->data[2]=(u_int8_t)(last_polled_uid>> 8); + poh->data[3]=(u_int8_t)(last_polled_uid ); + last_polled_uid=0; + } + break; + default: + DEBUGP("UNKNOWN "); + return USB_ERR(USB_ERR_CMD_UNKNOWN); + break; + } + + if (poh->flags & OPENPCD_FLAG_RESPOND) + return USB_RET_RESPOND; + + return 0; +} + +void _init_func(void) +{ + DEBUGPCRF("enabling RC632"); + rc632_init(); + + DEBUGPCRF("turning on RF"); + rc632_turn_on_rf(RAH); + + DEBUGPCRF("initializing 14443A operation"); + rh = rfid_reader_open(NULL, RFID_READER_OPENPCD); + l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443A); + + DEBUGPCRF("registering USB handler"); + usb_hdlr_register(&usb_presence_rx, OPENPCD_CMD_CLS_PRESENCE); + + delay_scan=delay_blink=0; + last_uid=0; +} + +int _main_dbgu(char key) +{ + unsigned char value; + + switch (key) { + case '4': + AT91F_DBGU_Printk("Testing RC632 : "); + if (rc632_test(RAH) == 0) + AT91F_DBGU_Printk("SUCCESS!\n\r"); + else + AT91F_DBGU_Printk("ERROR!\n\r"); + + break; + case '5': + opcd_rc632_reg_read(RAH, RC632_REG_RX_WAIT, &value); + DEBUGPCR("Reading RC632 Reg RxWait: 0x%02xr", value); + + break; + case '6': + DEBUGPCR("Writing RC632 Reg RxWait: 0x55"); + opcd_rc632_reg_write(RAH, RC632_REG_RX_WAIT, 0x55); + break; + case '7': + rc632_dump(); + break; + } + + return -EINVAL; +} + +void _main_func(void) +{ + u_int32_t uid; + int status; + + status = rfid_layer2_open(l2h); + if (status >= 0 && l2h->uid_len==4) + { + uid=((u_int32_t)l2h->uid[0]) | + ((u_int32_t)l2h->uid[1])<< 8| + ((u_int32_t)l2h->uid[2])<<16| + ((u_int32_t)l2h->uid[3])<<24; + + delay_scan=100; + + if(uid!=last_uid) + { + last_uid=last_polled_uid=uid; + delay_blink=10; + + DEBUGPCR("UID:0x%08X", uid); + } + } + else + if(delay_scan) + delay_scan--; + else + last_uid=0; + + led_switch(1,(delay_blink==0)?1:0); + if(delay_blink) + delay_blink--; + + /* first we try to get rid of pending to-be-sent stuff */ + usb_out_process(); + /* next we deal with incoming reqyests from USB EP1 (OUT) */ + usb_in_process(); + rc632_unthrottle(); +} |