/* * spreadspace avr utils * * * Copyright (C) 2012 Christian Pointner * * This file is part of spreadspace avr utils. * * spreadspace avr utils 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 3 of the License, or * any later version. * * spreadspace avr utils 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 spreadspace avr utils. If not, see . */ #define TAG_STA_PIN PINB #define TAG_STA_BIT 4 #define PIN_B_INTERRUPT 1< #include #include #include #include "util.h" #include "led.h" #include "LUFA/Drivers/Peripheral/TWI.h" //const uint8_t SL018_ADDR = B10100000: const uint8_t SL018_ADDR = 0xa0; const uint8_t SL018_WRITE = 0; const uint8_t SL018_READ = 1; //============================================ // Command List, preamble + length + command //============================================ const unsigned char SL018CMD_ComSelectCard[] ={1,1}; const unsigned char SL018CMD_ComLoginSector0[] ={9,2,0+2,0xAA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; const unsigned char SL018CMD_ComReadBlock1[] ={2,3,1+8}; const unsigned char SL018CMD_ComWriteBlock1[] ={18,4,1+8,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; const unsigned char SL018CMD_ComIntiPurse1[] ={6,6,1+8,0x78,0x56,0x34,0x12}; const unsigned char SL018CMD_ComReadPurse1[] ={2,5,1+8}; const unsigned char SL018CMD_ComIncrPurse1[] ={6,8,1+8,0x02,0x00,0x00,0x00}; const unsigned char SL018CMD_ComDecrPurse1[] ={6,9,1+8,0x01,0x00,0x00,0x00}; const unsigned char SL018CMD_ComCopyValue[] ={3,0x0A,1+8,2+8}; const unsigned char SL018CMD_ComReadUltralightPage5[] ={2,0x10,0x05}; const unsigned char SL018CMD_ComWriteUltralightPage5[]={6,0x11,0x05,0x12,0x34,0x56,0x78}; const unsigned char SL018CMD_ComRedLedOn[] ={2,0x40,1}; const unsigned char SL018CMD_ComRedLedOff[] ={2,0x40,0}; /* LUFA Library Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ #include #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); } /* end LUFA CDC-ACM specific definitions*/ unsigned char sl018_send_buffer(const unsigned char * buffer) { uint8_t len = 0; uint8_t pos = 0; unsigned char ret; len = buffer[0]; if (TWI_StartTransmission(SL018_ADDR | SL018_WRITE,10) == TWI_ERROR_NoError) { for(pos=0; pos<=len; pos++) TWI_SendByte(buffer[pos]); // Must stop transmission afterwards to release the bus TWI_StopTransmission(); } else { return 1; } return 0; } void handle_cmd(uint8_t cmd) { switch(cmd) { case '0': led_off(); break; case '1': led_on(); break; case 't': led_toggle(); break; case 'r': reset2bootloader(); break; case '3': if(sl018_send_buffer(SL018CMD_ComRedLedOff)) { led_toggle(); } break; default: CDC_Device_SendString(&VirtualSerial_CDC_Interface, "error\n"); return; } CDC_Device_SendString(&VirtualSerial_CDC_Interface, "ok\n"); } static void PCint(void) { if( (TAG_STA_PIN >> TAG_STA_BIT) & 1) led_on(); else led_off(); } SIGNAL(PCINT0_vect) { PCint(); } //SIGNAL(PCINT1_vect) { // PCint(); //} //SIGNAL(PCINT2_vect) { // PCint(); //} int main(void) { MCUSR &= ~(1 << WDRF); wdt_disable(); PCMSK0=PIN_B_INTERRUPT; //PCMSK1=PIN_C_INTERRUPT; //PCMSK2=PIN_D_INTERRUPT; PCICR|=1< 0) { int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); if(!(ReceivedByte < 0)) { handle_cmd(ReceivedByte); } BytesReceived--; } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); } }