summaryrefslogtreecommitdiff
path: root/usb-i2c-sl018/tuer-rfid.c
diff options
context:
space:
mode:
authorOthmar Gsenger <otti@wirdorange.org>2013-02-06 20:56:51 +0000
committerOthmar Gsenger <otti@wirdorange.org>2013-02-06 20:56:51 +0000
commita783671c72aa4b9fde5bf7a2af3bf11a7c876191 (patch)
treeac655008112294336c5a3decc29b67e67decd071 /usb-i2c-sl018/tuer-rfid.c
parentmoved sl018 code to seperate file (diff)
moved keystore and usb/serial to seperate files
stdio_ptr might need some improvement git-svn-id: https://svn.spreadspace.org/avr/trunk@134 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'usb-i2c-sl018/tuer-rfid.c')
-rw-r--r--usb-i2c-sl018/tuer-rfid.c217
1 files changed, 30 insertions, 187 deletions
diff --git a/usb-i2c-sl018/tuer-rfid.c b/usb-i2c-sl018/tuer-rfid.c
index 7beccb0..6823c71 100644
--- a/usb-i2c-sl018/tuer-rfid.c
+++ b/usb-i2c-sl018/tuer-rfid.c
@@ -25,6 +25,8 @@
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/power.h>
+#include <util/delay.h>
+#include "LUFA/Drivers/Peripheral/TWI.h"
#include <stdio.h>
#include <string.h>
@@ -36,127 +38,11 @@
#include "stepper.h"
#include "ledmatrix.h"
#include "sl018.h"
-
-#include "LUFA/Drivers/Peripheral/TWI.h"
-#include "LUFA/Drivers/Peripheral/Serial.h"
-#include "LUFA/Drivers/Misc/RingBuffer.h"
-
-#include <avr/eeprom.h>
-#define EEPROM_SIZE 1024
-typedef uint8_t keyslot_t[8];
-keyslot_t EEMEM keystore[EEPROM_SIZE/sizeof(keyslot_t)];
-
-FILE usb_stream;
-FILE serial_stream;
-FILE * stdio = &serial_stream;
-
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2012.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
+#include "keystore.h"
+#include "usb_serial.h"
+FILE * * stdio_ptr = NULL;
-#include <LUFA/Drivers/USB/USB.h>
-#include "lufa-descriptor-usbserial.h"
-
-USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
- {
- .Config =
- {
- .ControlInterfaceNumber = 0,
-
- .DataINEndpointNumber = CDC_TX_EPNUM,
- .DataINEndpointSize = CDC_TXRX_EPSIZE,
- .DataINEndpointDoubleBank = false,
-
- .DataOUTEndpointNumber = CDC_RX_EPNUM,
- .DataOUTEndpointSize = CDC_TXRX_EPSIZE,
- .DataOUTEndpointDoubleBank = false,
-
- .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
- .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
- .NotificationEndpointDoubleBank = false,
- },
- };
-
-void EVENT_USB_Device_ConfigurationChanged(void)
-{
- CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
-}
-
-void EVENT_USB_Device_ControlRequest(void)
-{
- CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
-}
-
-void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
-{
- if(CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
- stdio = &usb_stream;
- else
- stdio = &serial_stream;
-}
-
-void EVENT_USB_Device_Disconnect(void)
-{
- stdio = &serial_stream;
-}
-/* end LUFA CDC-ACM specific definitions*/
-
-
-
-int16_t stdio_bytes_received(void)
-{
- if(stdio == &usb_stream)
- return CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface);
- else
- return (int16_t)Serial_IsCharReceived();
-}
-
-
-void flash_keystore_from_stdio(void)
-{
- keyslot_t ks;
- uint8_t byte_pos=0;
- fprintf(stdio,"Flashing keys:\n\r");
- fflush(stdio);
- for(uint8_t ks_pos=0;ks_pos<EEPROM_SIZE/sizeof(ks);) {
- CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
- USB_USBTask();
-
- int16_t bytes_received = stdio_bytes_received();
- while(bytes_received > 0) {
- ks[byte_pos++]=fgetc(stdio);
- bytes_received--;
- if (byte_pos == sizeof(ks)) {
- byte_pos=0;
- eeprom_update_block(&ks,&keystore[ks_pos],sizeof(ks));
- ks_pos++;
- fputc('.', stdio);
- fflush(stdio);
- led_toggle();
- }
- }
- }
- fprintf(stdio,"\n");
- fputc(0, stdio);
- led_off();
-}
-
-void dump_keystore_to_stdio(void)
-{
- keyslot_t ks;
- for(uint8_t ks_pos=0;ks_pos<EEPROM_SIZE/sizeof(ks);ks_pos++) {
- eeprom_read_block(&ks,&keystore[ks_pos],sizeof(ks));
- for (uint8_t i=0; i< sizeof(ks); i++)
- fprintf(stdio,"%02X",ks[i]);
- fprintf(stdio,"\n\r");
- }
-}
-
void handle_stdio(uint8_t cmd)
{
switch(cmd) {
@@ -164,33 +50,33 @@ void handle_stdio(uint8_t cmd)
reset2bootloader();
break;
case 'R':
- if(!sl018_reset(stdio))
- fprintf(stdio, "ok\n\r");
+ if(!sl018_reset(*stdio_ptr))
+ fprintf(*stdio_ptr, "ok\n\r");
break;
case 'f': //get cardreader firmware version
do {
- unsigned char * firmware_str = sl018_get_firmware_version(stdio);
+ unsigned char * firmware_str = sl018_get_firmware_version(*stdio_ptr);
if(firmware_str)
- fprintf(stdio, "%s\n\r",firmware_str);
+ fprintf(*stdio_ptr, "%s\n\r",firmware_str);
} while(0);
break;
case 'e': //flash eeprom
- flash_keystore_from_stdio();
+ flash_keystore_from_stdio(*stdio_ptr);
break;
case 'd': //dump eeprom - this breaks security!
- dump_keystore_to_stdio();
+ dump_keystore_to_stdio(*stdio_ptr);
break;
case 'o':
if(start_stepper(dir_open))
- fprintf(stdio, "ok\n\r");
+ fprintf(*stdio_ptr, "ok\n\r");
else
- fprintf(stdio, "error: already in progress\n\r");
+ fprintf(*stdio_ptr, "error: already in progress\n\r");
break;
case 'c':
if(start_stepper(dir_close))
- fprintf(stdio, "ok\n\r");
+ fprintf(*stdio_ptr, "ok\n\r");
else
- fprintf(stdio, "error: already in progress\n\r");
+ fprintf(*stdio_ptr, "error: already in progress\n\r");
break;
case '0': ledmatrix(off); break;
case '1': ledmatrix(red); break;
@@ -201,61 +87,23 @@ void handle_stdio(uint8_t cmd)
case '6': ledmatrix(green_blink); break;
case '7': ledmatrix(rg_moving); break;
case '8': ledmatrix(rg_blink); break;
- default: fprintf(stdio, "error, unknown command %02X '%c'\n\r",cmd, cmd); return;
- }
-}
-
-
-
-/* this generates a Fletcher8 checksum */
-/* code from: http://stackoverflow.com/questions/13491700/8-bit-fletcher-checksum-of-16-byte-data */
-uint8_t generate_csum(uint8_t* data)
-{
- uint16_t sum1 = 0xf, sum2 = 0xf, len = sizeof(keyslot_t) - 1;
- do { sum2 += ( sum1 += *data++ ); } while (--len);
- return sum2<<4 | sum1;
-}
-
-uint8_t compare_keyslots(const keyslot_t a, const keyslot_t b)
-{
- uint8_t tmp=0;
- // constant time compare
- for(uint8_t i=0; i<sizeof(keyslot_t); ++i)
- tmp |= a[i] ^ b[i];
- return tmp;
-}
-
-bool check_card(const uint8_t * uid, uint8_t uid_len)
-{
- keyslot_t card, ks;
- memset(card, 0, sizeof(card));
- for (uint8_t pos=0; pos<uid_len; pos++)
- card[pos]=uid[uid_len-pos-1];
- card[sizeof(keyslot_t)-1]=generate_csum(card);
- bool valid=0;
- for(uint8_t ks_pos=0;ks_pos<(EEPROM_SIZE/sizeof(ks));ks_pos++) {
- eeprom_read_block(&ks,&keystore[ks_pos],sizeof(ks));
- if(!compare_keyslots(card, ks)) {
- valid=1;
- // break; // this would break security (not constant time)
- }
+ default: fprintf(*stdio_ptr, "error, unknown command %02X '%c'\n\r",cmd, cmd); return;
}
- return valid;
}
void handle_card(void)
{
uid_t uid;
- sl018_read_card_uid(&uid,stdio);
+ sl018_read_card_uid(&uid,*stdio_ptr);
if (uid.length)
{
- if(check_card(uid.buffer,uid.length)) {
- sl018_set_led(1,stdio);
+ if(keystore_check_card(uid.buffer,uid.length)) {
+ sl018_set_led(1,*stdio_ptr);
_delay_ms(255);
- fprintf(stdio,"Card allowed - opening/closing door\n\r"); // TODO: open/close door!
- sl018_set_led(0,stdio);
+ fprintf(*stdio_ptr,"Card allowed - opening/closing door\n\r"); // TODO: open/close door!
+ sl018_set_led(0,*stdio_ptr);
} else {
- fprintf(stdio,"Card not found in Database\n\r");
+ fprintf(*stdio_ptr,"Card not found in Database\n\r");
}
}
}
@@ -267,29 +115,24 @@ int main(void)
cpu_init();
led_init();
- USB_Init();
+ usb_serial_init();
TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000));
- Serial_Init(115200,false);
- Serial_CreateStream(&serial_stream);
- CDC_Device_CreateStream(&VirtualSerial_CDC_Interface,&usb_stream);
-
- sei();
-
init_heartbeat();
init_stepper();
init_ledmatrix();
+ stdio_ptr = usb_serial_get_stdio_ptr();
+ sei();
- sl018_reset(stdio);
+ sl018_reset(*stdio_ptr);
for(;;) {
- CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
- USB_USBTask();
+ usb_serial_task();
- int16_t bytes_received = stdio_bytes_received();
+ int16_t bytes_received = usb_serial_bytes_received();
if(bytes_received > 0)
- handle_stdio(fgetc(stdio));
+ handle_stdio(fgetc(*stdio_ptr));
- if (sl018_check_for_new_card(stdio))
+ if (sl018_check_for_new_card(*stdio_ptr))
handle_card();
handle_heartbeat();
}