summaryrefslogtreecommitdiff
path: root/usb-i2c-sl018
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2013-01-30 01:27:30 +0000
committerChristian Pointner <equinox@spreadspace.org>2013-01-30 01:27:30 +0000
commitee6ba28850d60b2bf84e132aea99cc83cf14fdee (patch)
tree5c46e5f02b4e29db87a71b05c42f77b78202122c /usb-i2c-sl018
parentupdated licence header (2012 vs 2013) (diff)
further cleanup
git-svn-id: https://svn.spreadspace.org/avr/trunk@97 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'usb-i2c-sl018')
-rw-r--r--usb-i2c-sl018/tuer-rfid.c49
1 files changed, 23 insertions, 26 deletions
diff --git a/usb-i2c-sl018/tuer-rfid.c b/usb-i2c-sl018/tuer-rfid.c
index bb9c1de..96535fc 100644
--- a/usb-i2c-sl018/tuer-rfid.c
+++ b/usb-i2c-sl018/tuer-rfid.c
@@ -26,6 +26,9 @@
#include <avr/interrupt.h>
#include <avr/power.h>
+#include <stdio.h>
+#include <string.h>
+
#include "util.h"
#include "led.h"
@@ -36,13 +39,7 @@
#include <avr/eeprom.h>
#define EEPROM_SIZE 1024
-typedef union
-{
- uint8_t byte[8];
- uint16_t uint16[4];
- uint32_t uint32[2];
- uint64_t uint64;
-} keyslot_t;
+typedef uint8_t keyslot_t[8];
keyslot_t EEMEM keyslots[EEPROM_SIZE/sizeof(keyslot_t)];
#define TAG_STA_PIN PINB
@@ -165,7 +162,6 @@ void EVENT_USB_Device_Disconnect(void)
}
/* end LUFA CDC-ACM specific definitions*/
-
int16_t stdio_BytesReceived(void)
{
if(stdio == &usb_stream)
@@ -237,9 +233,12 @@ void flash_eeprom_from_stdio(void)
fprintf(stdio,"Flashing keys:\n\r");
fflush(stdio);
for(keyslot_pos=0;keyslot_pos<EEPROM_SIZE/sizeof(keyslot);) {
+ CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
+ USB_USBTask();
+
int16_t BytesReceived = stdio_BytesReceived();
while(BytesReceived >0) {
- keyslot.byte[byte_pos++]=fgetc(stdio);
+ keyslot[byte_pos++]=fgetc(stdio);
BytesReceived--;
if (byte_pos == sizeof(keyslot)) {
byte_pos=0;
@@ -250,10 +249,9 @@ void flash_eeprom_from_stdio(void)
led_toggle();
}
}
- CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
- USB_USBTask();
}
fprintf(stdio,"\n");
+ led_off();
}
void dump_eeprom_to_stdio(void)
@@ -264,7 +262,7 @@ void dump_eeprom_to_stdio(void)
for(keyslot_pos=0;keyslot_pos<EEPROM_SIZE/sizeof(keyslot);keyslot_pos++) {
eeprom_read_block(&keyslot,&keyslots[keyslot_pos],sizeof(keyslot));
for (uint8_t i=0; i< sizeof(keyslot); i++)
- fprintf(stdio,"%02X",keyslot.byte[i]);
+ fprintf(stdio,"%02X",keyslot[i]);
fprintf(stdio,"\n\r");
}
}
@@ -278,9 +276,7 @@ void handle_stdio(uint8_t cmd)
break;
case 'f': //get cardreader firmware version
if(sl018_cmd(SL018CMD_ComGetFirmwareVersion))
- {
fprintf(stdio, "%s\n\r",recv_twi_msg->data);
- }
break;
case '4': //turn cardreader led off
if(sl018_cmd(SL018CMD_ComRedLedOff))
@@ -299,7 +295,7 @@ void handle_stdio(uint8_t cmd)
case 's': //get eeprom size
fprintf(stdio,"%d\n\r",EEPROM_SIZE);
break;
- default: fprintf(stdio, "error, unknown command %02X\n\r",cmd); return;
+ default: fprintf(stdio, "error, unknown command %02X '%c'\n\r",cmd, cmd); return;
}
}
@@ -314,12 +310,12 @@ uint8_t generate_csum(uint8_t* data)
return sum2<<4 | sum1;
}
-uint8_t compare_keyslots(const keyslot_t* a, const keyslot_t* b) // constant time compare
+uint8_t compare_keyslots(const keyslot_t a, const keyslot_t b)
{
uint8_t tmp=0, i;
+ // constant time compare
for(i=0; i<sizeof(keyslot_t); ++i)
- tmp |= a->byte[i] ^ b->byte[i];
-
+ tmp |= a[i] ^ b[i];
return tmp;
}
@@ -327,16 +323,16 @@ bool check_card(const uint8_t * uid, uint8_t uid_len)
{
keyslot_t card;
keyslot_t eeprom_ks;
- card.uint64=0;
+ memset(card, 0, sizeof(card));
uid_len = uid_len > sizeof(keyslot_t) ? sizeof(keyslot_t) : uid_len;
for (uint8_t pos=0; pos<uid_len; pos++)
- card.byte[pos]=uid[uid_len-pos-1];
- card.byte[sizeof(keyslot_t) - 1]=generate_csum(card.byte);
+ card[pos]=uid[uid_len-pos-1];
+ card[sizeof(keyslot_t) - 1]=generate_csum(card);
keyslot_t * ks=keyslots;
bool valid=0;
for(uint8_t ks_num=0;ks_num<(EEPROM_SIZE/sizeof(card));ks_num++) {
eeprom_read_block(&eeprom_ks,&ks[ks_num],sizeof(eeprom_ks));
- if(!compare_keyslots(&card, &eeprom_ks)) {
+ if(!compare_keyslots(card, eeprom_ks)) {
valid=1;
// break; // this would break security (not const time)
}
@@ -388,16 +384,17 @@ int main(void)
Serial_Init(115200,false);
Serial_CreateStream(&serial_stream);
for(;;) {
+ CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
+ USB_USBTask();
+
int16_t BytesReceived = stdio_BytesReceived();
- if(BytesReceived > 0) {
+ if(BytesReceived > 0)
handle_stdio(fgetc(stdio));
- }
+
if(CARD_PRESENT != card_status) {
card_status = CARD_PRESENT;
if(card_status)
handle_card();
}
- CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
- USB_USBTask();
}
}