1
0
Fork 0

Squashed 'tmk_core/' changes from caca2c0..dc0e46e

dc0e46e Rename LUFA to LUFA-git
3bfa7fa Remove LUFA-120730
215b764 Merge commit 'afa0f22a9299686fd88f58ce09c5b521ac917e8f' as 'protocol/lufa/LUFA'
afa0f22 Squashed 'protocol/lufa/LUFA/' content from commit def7fca
c0c42fa Remove submodule of LUFA
30f897d Merge commit '87ced33feb74e79c3281dda36eb6d6d153399b41' as 'protocol/usb_hid/USB_Host_Shield_2.0'
87ced33 Squashed 'protocol/usb_hid/USB_Host_Shield_2.0/' content from commit aab4a69
14f6d49 Remove submodule of USB_Host_Shield_2.0

git-subtree-dir: tmk_core
git-subtree-split: dc0e46eaa4367d4e218f8816e3c117895820f07c
This commit is contained in:
tmk 2015-05-13 11:13:10 +09:00
parent 4d116a04e9
commit f6d56675f9
1575 changed files with 421901 additions and 63190 deletions

View file

@ -0,0 +1,58 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
* \brief Application Configuration Header File
*
* This is a header file which is be used to configure some of
* the application's compile time options, as an alternative to
* specifying the compile time constants supplied through a
* makefile or build system.
*
* For information on what each token does, refer to the
* \ref Sec_Options section of the application documentation.
*/
#ifndef _APP_CONFIG_H_
#define _APP_CONFIG_H_
#define MAG_T1_CLOCK (1 << 0)
#define MAG_T1_DATA (1 << 1)
#define MAG_T2_CLOCK (1 << 2)
#define MAG_T2_DATA (1 << 3)
#define MAG_T3_CLOCK (1 << 4)
#define MAG_T3_DATA (1 << 5)
#define MAG_CARDPRESENT (1 << 6)
#define MAG_PORT PORTC
#define MAG_PIN PINC
#define MAG_DDR DDRC
#endif

View file

@ -0,0 +1,93 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
* \brief LUFA Library Configuration Header File
*
* This header file is used to configure LUFA's compile time options,
* as an alternative to the compile time constants supplied through
* a makefile.
*
* For information on what each token does, refer to the LUFA
* manual section "Summary of Compile Tokens".
*/
#ifndef _LUFA_CONFIG_H_
#define _LUFA_CONFIG_H_
#if (ARCH == ARCH_AVR8)
/* Non-USB Related Configuration Tokens: */
// #define DISABLE_TERMINAL_CODES
/* USB Class Driver Related Tokens: */
// #define HID_HOST_BOOT_PROTOCOL_ONLY
// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
// #define HID_MAX_COLLECTIONS {Insert Value Here}
// #define HID_MAX_REPORTITEMS {Insert Value Here}
// #define HID_MAX_REPORT_IDS {Insert Value Here}
// #define NO_CLASS_DRIVER_AUTOFLUSH
/* General USB Driver Related Tokens: */
#define ORDERED_EP_CONFIG
#define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
#define USB_DEVICE_ONLY
// #define USB_HOST_ONLY
// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
// #define NO_LIMITED_CONTROLLER_CONNECT
// #define NO_SOF_EVENTS
/* USB Device Mode Driver Related Tokens: */
// #define USE_RAM_DESCRIPTORS
#define USE_FLASH_DESCRIPTORS
// #define USE_EEPROM_DESCRIPTORS
// #define NO_INTERNAL_SERIAL
#define FIXED_CONTROL_ENDPOINT_SIZE 8
#define DEVICE_STATE_AS_GPIOR 0
#define FIXED_NUM_CONFIGURATIONS 1
// #define CONTROL_ONLY_DEVICE
// #define INTERRUPT_CONTROL_ENDPOINT
// #define NO_DEVICE_REMOTE_WAKEUP
// #define NO_DEVICE_SELF_POWER
/* USB Host Mode Driver Related Tokens: */
// #define HOST_STATE_AS_GPIOR {Insert Value Here}
// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
// #define NO_AUTO_VBUS_MANAGEMENT
// #define INVERTED_VBUS_ENABLE_LINE
#else
#error Unsupported architecture for this LUFA configuration file.
#endif
#endif

View file

@ -0,0 +1,216 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* USB Device Descriptors, for library use when in USB device mode. Descriptors are special
* computer-readable structures which the host requests upon device enumeration, to determine
* the device's capabilities and functions.
*/
#include "Descriptors.h"
/** HID report descriptor. This is a HID class specific descriptor, which defines the structure of the
* reports sent and received by the HID device to and from the USB host. It indicates what data is sent,
* where in the report each element is located and exactly how the data should be interpreted and used.
*
* See the HID class specification for more information on HID report descriptors.
*/
const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
{
/* Use the HID class driver's standard Keyboard report.
* Max simultaneous keys: 6
*/
HID_DESCRIPTOR_KEYBOARD(6)
};
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
* device characteristics, including the supported USB version, control endpoint size and the
* number of device configurations. The descriptor is read out by the USB host when the enumeration
* process begins.
*/
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
.USBSpecification = VERSION_BCD(1,1,0),
.Class = USB_CSCP_NoDeviceClass,
.SubClass = USB_CSCP_NoDeviceSubclass,
.Protocol = USB_CSCP_NoDeviceProtocol,
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
.VendorID = 0x03EB,
.ProductID = 0x2042,
.ReleaseNumber = VERSION_BCD(0,0,1),
.ManufacturerStrIndex = STRING_ID_Manufacturer,
.ProductStrIndex = STRING_ID_Product,
.SerialNumStrIndex = USE_INTERNAL_SERIAL,
.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
};
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
* of the device in one of its supported configurations, including information about any device interfaces
* and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
* a configuration so that the host may correctly communicate with the USB device.
*/
const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Config =
{
.Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
.TotalInterfaces = 1,
.ConfigurationNumber = 1,
.ConfigurationStrIndex = NO_DESCRIPTOR,
.ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED),
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
},
.HID_Interface =
{
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
.InterfaceNumber = INTERFACE_ID_Keyboard,
.AlternateSetting = 0x00,
.TotalEndpoints = 1,
.Class = HID_CSCP_HIDClass,
.SubClass = HID_CSCP_BootSubclass,
.Protocol = HID_CSCP_KeyboardBootProtocol,
.InterfaceStrIndex = NO_DESCRIPTOR
},
.HID_KeyboardHID =
{
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
.HIDSpec = VERSION_BCD(1,1,1),
.CountryCode = 0x00,
.TotalReportDescriptors = 1,
.HIDReportType = HID_DTYPE_Report,
.HIDReportLength = sizeof(KeyboardReport)
},
.HID_ReportINEndpoint =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
.EndpointAddress = KEYBOARD_EPADDR,
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = KEYBOARD_EPSIZE,
.PollingIntervalMS = 0x05
},
};
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
* via the language ID table available at USB.org what languages the device supports for its string descriptors. */
const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG);
/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
* Descriptor.
*/
const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"Dean Camera and Denver Gingerich");
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
* Descriptor.
*/
const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"Magnetic Card Reader");
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
* documentation) by the application code so that the address and size of a requested descriptor can be given
* to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
* is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
* USB host.
*/
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint8_t wIndex,
const void** const DescriptorAddress)
{
const uint8_t DescriptorType = (wValue >> 8);
const uint8_t DescriptorNumber = (wValue & 0xFF);
const void* Address = NULL;
uint16_t Size = NO_DESCRIPTOR;
switch (DescriptorType)
{
case DTYPE_Device:
Address = &DeviceDescriptor;
Size = sizeof(USB_Descriptor_Device_t);
break;
case DTYPE_Configuration:
Address = &ConfigurationDescriptor;
Size = sizeof(USB_Descriptor_Configuration_t);
break;
case DTYPE_String:
switch (DescriptorNumber)
{
case STRING_ID_Language:
Address = &LanguageString;
Size = pgm_read_byte(&LanguageString.Header.Size);
break;
case STRING_ID_Manufacturer:
Address = &ManufacturerString;
Size = pgm_read_byte(&ManufacturerString.Header.Size);
break;
case STRING_ID_Product:
Address = &ProductString;
Size = pgm_read_byte(&ProductString.Header.Size);
break;
}
break;
case HID_DTYPE_HID:
Address = &ConfigurationDescriptor.HID_KeyboardHID;
Size = sizeof(USB_HID_Descriptor_HID_t);
break;
case HID_DTYPE_Report:
Address = &KeyboardReport;
Size = sizeof(KeyboardReport);
break;
}
*DescriptorAddress = Address;
return Size;
}

View file

@ -0,0 +1,96 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Header file for Descriptors.c.
*/
#ifndef _DESCRIPTORS_H_
#define _DESCRIPTORS_H_
/* Includes: */
#include <avr/pgmspace.h>
#include <LUFA/Drivers/USB/USB.h>
#include "Config/AppConfig.h"
/* Type Defines: */
/** Type define for the device configuration descriptor structure. This must be defined in the
* application code, as the configuration descriptor contains several sub-descriptors which
* vary between devices, and which describe the device's usage to the host.
*/
typedef struct
{
USB_Descriptor_Configuration_Header_t Config; /**< Configuration descriptor header structure */
// Keyboard HID Interface
USB_Descriptor_Interface_t HID_Interface; /**< Keyboard interface descriptor */
USB_HID_Descriptor_HID_t HID_KeyboardHID; /**< Keyboard HID descriptor */
USB_Descriptor_Endpoint_t HID_ReportINEndpoint; /**< Keyboard key report endpoint descriptor */
} USB_Descriptor_Configuration_t;
/** Enum for the device interface descriptor IDs within the device. Each interface descriptor
* should have a unique ID index associated with it, which can be used to refer to the
* interface from other descriptors.
*/
enum InterfaceDescriptors_t
{
INTERFACE_ID_Keyboard = 0, /**< Keyboard interface descriptor ID */
};
/** Enum for the device string descriptor IDs within the device. Each string descriptor should
* have a unique ID index associated with it, which can be used to refer to the string from
* other descriptors.
*/
enum StringDescriptors_t
{
STRING_ID_Language = 0, /**< Supported Languages string descriptor ID (must be zero) */
STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */
STRING_ID_Product = 2, /**< Product string ID */
};
/* Macros: */
/** Endpoint address of the keyboard key press reporting endpoint. */
#define KEYBOARD_EPADDR (ENDPOINT_DIR_IN | 1)
/** Size of the keyboard report endpoints, in bytes. */
#define KEYBOARD_EPSIZE 8
/* Function Prototypes: */
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint8_t wIndex,
const void** const DescriptorAddress)
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
#endif

View file

@ -0,0 +1,115 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** Circular bit buffer library. This will allow for individual bits
* to be stored in packed form inside circular buffers, to reduce
* overall RAM usage.
*/
#include "CircularBitBuffer.h"
/** Function to initialize or reset a bit buffer, ready for data to be stored into it. */
void BitBuffer_Init(BitBuffer_t* const Buffer)
{
/* Reset the number of stored bits in the buffer */
Buffer->Elements = 0;
/* Reset the data in and out pointer structures in the buffer to the first buffer bit */
Buffer->In.CurrentByte = Buffer->Data;
Buffer->In.ByteMask = (1 << 0);
Buffer->Out.CurrentByte = Buffer->Data;
Buffer->Out.ByteMask = (1 << 0);
}
/** Function to store the given bit into the given bit buffer. */
void BitBuffer_StoreNextBit(BitBuffer_t* const Buffer,
const bool Bit)
{
/* If the bit to store is true, set the next bit in the buffer */
if (Bit)
*Buffer->In.CurrentByte |= Buffer->In.ByteMask;
/* Increment the number of stored bits in the buffer counter */
Buffer->Elements++;
/* Check if the current buffer byte is full of stored bits */
if (Buffer->In.ByteMask == (1 << 7))
{
/* Check if the end of the buffer has been reached, if so reset to start of buffer, otherwise advance to next bit */
if (Buffer->In.CurrentByte != &Buffer->Data[sizeof(Buffer->Data) - 1])
Buffer->In.CurrentByte++;
else
Buffer->In.CurrentByte = Buffer->Data;
/* Reset the storage bit mask in the current buffer byte to the first bit */
Buffer->In.ByteMask = (1 << 0);
}
else
{
/* Shift the current storage bit mask to the next bit in the current byte */
Buffer->In.ByteMask <<= 1;
}
}
/** Function to retrieve the next bit stored in the given bit buffer. */
bool BitBuffer_GetNextBit(BitBuffer_t* const Buffer)
{
/* Retrieve the value of the next bit stored in the buffer */
bool Bit = ((*Buffer->Out.CurrentByte & Buffer->Out.ByteMask) != 0);
/* Clear the buffer bit */
*Buffer->Out.CurrentByte &= ~Buffer->Out.ByteMask;
/* Decrement the number of stored bits in the buffer counter */
Buffer->Elements--;
/* Check if the current buffer byte is empty of stored bits */
if (Buffer->Out.ByteMask == (1 << 7))
{
/* Check if the end of the buffer has been reached, if so reset to start of buffer, otherwise advance to next bit */
if (Buffer->Out.CurrentByte != &Buffer->Data[sizeof(Buffer->Data) - 1])
Buffer->Out.CurrentByte++;
else
Buffer->Out.CurrentByte = Buffer->Data;
/* Reset the retrieval bit mask in the current buffer byte to the first bit */
Buffer->Out.ByteMask = (1 << 0);
}
else
{
/* Shift the current retrieval bit mask to the next bit in the current byte */
Buffer->Out.ByteMask <<= 1;
}
/* Return the retrieved bit from the buffer */
return Bit;
}

View file

@ -0,0 +1,97 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Header file for CircularBitBuffer.c.
*/
#ifndef _CIRCULARBITBUFFER_H_
#define _CIRCULARBITBUFFER_H_
/* Includes: */
#include <avr/io.h>
#include <stdbool.h>
#include <LUFA/Common/Common.h>
/* Macros: */
#if (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__)) || defined(__DOXYGEN__)
/** Maximum number of bits which can be stored into a bit buffer. The memory usage is one eighth of this value per buffer. */
#define MAX_BITS 8192
#else
#define MAX_BITS 1024
#endif
/* Type Defines: */
/** Type define for a pointer to a bit in a bit buffer. */
typedef struct
{
uint8_t* CurrentByte; /**< Pointer to the current byte in the buffer */
uint8_t ByteMask; /**< Mask of the current bit in the buffer */
} BitBufferPointer_t;
/** Type define for a circular packet bit buffer. */
typedef struct
{
uint8_t Data[MAX_BITS / 8]; /**< Buffer to hold the stored bits in packed form */
uint16_t Elements; /**< Number of stored bits in the bit buffer */
BitBufferPointer_t In; /**< Bit pointer to the next storage location in the buffer */
BitBufferPointer_t Out; /**< Bit pointer to the next retrieval location in the buffer */
} BitBuffer_t;
/* Function Prototypes: */
/** Initializes or resets a given bit buffer, ready to store new bits.
*
* \param[in,out] Buffer Bit buffer to initialize
*/
void BitBuffer_Init(BitBuffer_t* const Buffer) ATTR_NON_NULL_PTR_ARG(1);
/** Stores a bit into the next location inside a given bit buffer.
*
* \param[in,out] Buffer Bit buffer to store a bit into
* \param[in] Bit Bit to store into the buffer
*/
void BitBuffer_StoreNextBit(BitBuffer_t* const Buffer,
const bool Bit) ATTR_NON_NULL_PTR_ARG(1);
/** Retrieves a bit from the next location inside a given bit buffer.
*
* \param[in,out] Buffer Bit buffer to retrieve a bit from
*
* \return Next bit from the buffer
*/
bool BitBuffer_GetNextBit(BitBuffer_t* const Buffer) ATTR_NON_NULL_PTR_ARG(1);
#endif

View file

@ -0,0 +1,102 @@
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/*
NOTE: The user of this include file MUST define the following macros
prior to including the file:
MAG_T1_CLOCK_PIN Pin connected to Track 1 clock wire (i.e.. PORTC1)
MAG_T1_DATA_PIN Pin connected to Track 1 data wire (i.e.. PORTC2)
MAG_T2_CLOCK_PIN Pin connected to Track 2 clock wire (i.e.. PORTC3)
MAG_T2_DATA_PIN Pin connected to Track 2 data wire (i.e.. PORTC0)
MAG_T3_CLOCK_PIN Pin connected to Track 3 clock wire (i.e.. PORTC5)
MAG_T3_DATA_PIN Pin connected to Track 3 data wire (i.e.. PORTC6)
MAG_CLS_PIN Pin connected to card loaded wire (i.e.. PORTC4)
MAG_PIN PIN macro for the reader's port (i.e.. PINC)
MAG_DDR DDR macro for the reader's port (i.e.. DDRC)
MAG_PORT PORT macro for the reader's port (i.e.. PORTC)
The example macros listed above assume that the Track 2 data wire is
connected to pin 0 on port C, the Track 2 clock wire is connected to
pin 3 on port C (similarly for Tracks 1 and 3), and the card loaded
wire is connected to pin 4 on port C.
If the mag-stripe reader you are using only reads one or two tracks,
then set the clock and data pins for the tracks it doesn't read to a
pin that is unused. For example, on the AT90USBKey, any of the pins on
port C that do not have wires attached will be unused since they are
not connected to any onboard devices (such as the joystick or
temperature sensor).
Connecting wires to pins on different ports (i.e.. a data wire to pin 0
on port C and a clock wire to pin 0 on port D) is currently
unsupported. All pins specified above must be on the same port.
*/
/** \file
*
* Driver header for a TTL Magnetic Card reader device (such as the Omron V3B-4K).
*/
#ifndef _MAGSTRIPEHW_H_
#define _MAGSTRIPEHW_H_
/* Includes: */
#include <avr/io.h>
#include <LUFA/Common/Common.h>
#include "Config/AppConfig.h"
/* Private Interface - For use in library only: */
/* Macros: */
/** Mask of the track data, clock and card detection pins. */
#define MAG_MASK (MAG_T1_DATA | MAG_T1_CLOCK | \
MAG_T2_DATA | MAG_T2_CLOCK | \
MAG_T3_DATA | MAG_T3_CLOCK | \
MAG_CARDPRESENT)
/* Public Interface - May be used in end-application: */
/* Inline Functions: */
/** Initializes the magnetic stripe card reader ports and pins so that the card reader
* device can be controlled and read by the card reader driver. This must be called before
* trying to read any of the card reader's status lines.
*/
static inline void Magstripe_Init(void)
{
MAG_DDR &= ~MAG_MASK;
MAG_PORT |= MAG_MASK;
};
/** Returns the status of all the magnetic card reader's outputs.
*
* \return A mask indicating which card lines are high or low
*/
static inline uint8_t Magstripe_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
static inline uint8_t Magstripe_GetStatus(void)
{
/* Mag-stripe IOs are active low and must be inverted when read */
return ((uint8_t)~MAG_PIN & MAG_MASK);
}
#endif

View file

@ -0,0 +1,228 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Main source file for the MagStripe reader program. This file contains the main tasks of
* the project and is responsible for the initial application hardware configuration.
*/
#include "Magstripe.h"
/** Bit buffers to hold the read bits for each of the three magnetic card tracks before they are transmitted
* to the host as keyboard presses.
*/
static BitBuffer_t TrackDataBuffers[TOTAL_TRACKS];
/** Pointer to the current track buffer being sent to the host. */
static BitBuffer_t* CurrentTrackBuffer = &TrackDataBuffers[TOTAL_TRACKS];
/** Buffer to hold the previously generated Keyboard HID report, for comparison purposes inside the HID class driver. */
static uint8_t PrevKeyboardHIDReportBuffer[sizeof(USB_KeyboardReport_Data_t)];
/** LUFA HID Class driver interface configuration and state information. This structure is
* passed to all HID Class driver functions, so that multiple instances of the same class
* within a device can be differentiated from one another.
*/
USB_ClassInfo_HID_Device_t Keyboard_HID_Interface =
{
.Config =
{
.InterfaceNumber = INTERFACE_ID_Keyboard,
.ReportINEndpoint =
{
.Address = KEYBOARD_EPADDR,
.Size = KEYBOARD_EPSIZE,
.Banks = 1,
},
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
},
};
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
*/
int main(void)
{
SetupHardware();
for (uint8_t Buffer = 0; Buffer < TOTAL_TRACKS; Buffer++)
BitBuffer_Init(&TrackDataBuffers[Buffer]);
GlobalInterruptEnable();
for (;;)
{
if (Magstripe_GetStatus() & MAG_CARDPRESENT)
ReadMagstripeData();
HID_Device_USBTask(&Keyboard_HID_Interface);
USB_USBTask();
}
}
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void)
{
#if (ARCH == ARCH_AVR8)
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF);
wdt_disable();
/* Disable clock division */
clock_prescale_set(clock_div_1);
#endif
/* Hardware Initialization */
Magstripe_Init();
USB_Init();
}
/** Determines if a card has been inserted, and if so reads in each track's contents into the bit buffers
* until they are read out to the host as a series of keyboard presses.
*/
void ReadMagstripeData(void)
{
/* Arrays to hold the buffer pointers, clock and data bit masks for the separate card tracks */
const struct
{
uint8_t ClockMask;
uint8_t DataMask;
} TrackInfo[] = {{MAG_T1_CLOCK, MAG_T1_DATA},
{MAG_T2_CLOCK, MAG_T2_DATA},
{MAG_T3_CLOCK, MAG_T3_DATA}};
uint8_t Magstripe_Prev = 0;
uint8_t Magstripe_LCL = Magstripe_GetStatus();
while (Magstripe_LCL & MAG_CARDPRESENT)
{
for (uint8_t Track = 0; Track < TOTAL_TRACKS; Track++)
{
bool DataPinLevel = ((Magstripe_LCL & TrackInfo[Track].DataMask) != 0);
bool ClockPinLevel = ((Magstripe_LCL & TrackInfo[Track].ClockMask) != 0);
bool ClockLevelChanged = (((Magstripe_LCL ^ Magstripe_Prev) & TrackInfo[Track].ClockMask) != 0);
/* Sample data on rising clock edges from the card reader */
if (ClockPinLevel && ClockLevelChanged)
BitBuffer_StoreNextBit(&TrackDataBuffers[Track], DataPinLevel);
}
Magstripe_Prev = Magstripe_LCL;
Magstripe_LCL = Magstripe_GetStatus();
}
CurrentTrackBuffer = &TrackDataBuffers[0];
}
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_Device_ConfigurationChanged(void)
{
HID_Device_ConfigureEndpoints(&Keyboard_HID_Interface);
USB_Device_EnableSOFEvents();
}
/** Event handler for the library USB Control Request reception event. */
void EVENT_USB_Device_ControlRequest(void)
{
HID_Device_ProcessControlRequest(&Keyboard_HID_Interface);
}
/** Event handler for the USB device Start Of Frame event. */
void EVENT_USB_Device_StartOfFrame(void)
{
HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
}
/** HID class driver callback function for the creation of HID reports to the host.
*
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
* \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature
* \param[out] ReportData Pointer to a buffer where the created report should be stored
* \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent)
*
* \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent
*/
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
uint8_t* const ReportID,
const uint8_t ReportType,
void* ReportData,
uint16_t* const ReportSize)
{
USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;
static bool IsKeyReleaseReport;
/* Key reports must be interleaved with key release reports, or repeated keys will be ignored */
IsKeyReleaseReport = !IsKeyReleaseReport;
if ((IsKeyReleaseReport) || (CurrentTrackBuffer == &TrackDataBuffers[TOTAL_TRACKS]))
{
/* No more data to send, or key release report between key presses */
KeyboardReport->KeyCode[0] = KEY_NONE;
}
else if (!(CurrentTrackBuffer->Elements))
{
/* End of current track, send an enter press and change to the next track's buffer */
KeyboardReport->KeyCode[0] = KEY_ENTER;
CurrentTrackBuffer++;
}
else
{
/* Still data in the current track; convert next bit to a 1 or 0 keypress */
KeyboardReport->KeyCode[0] = BitBuffer_GetNextBit(CurrentTrackBuffer) ? KEY_1 : KEY_0;
}
*ReportSize = sizeof(USB_KeyboardReport_Data_t);
return false;
}
/** HID Class driver callback function for the processing of a received HID report from the host.
*
* \param[in] HIDInterfaceInfo Pointer to the HID interface structure for the HID interface being referenced
* \param[in] ReportID Report ID of the received report from the host
* \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
* \param[in] ReportData Pointer to the report buffer where the received report is stored
* \param[in] ReportSize Size in bytes of the report received from the host
*/
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
const uint8_t ReportID,
const uint8_t ReportType,
const void* ReportData,
const uint16_t ReportSize)
{
// Ignore keyboard LED reports from the host, but still need to declare the callback routine
}

View file

@ -0,0 +1,90 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2014.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaims all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Header file for Magstripe.c.
*/
#ifndef _MAGSTRIPE_H_
#define _MAGSTRIPE_H_
/* Includes: */
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include "Descriptors.h"
#include "Lib/MagstripeHW.h"
#include "Lib/CircularBitBuffer.h"
#include "Config/AppConfig.h"
#include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Platform/Platform.h>
/* Macros: */
/** Total number of tracks which can be read from the card, between 1 and 3. */
#define TOTAL_TRACKS 3
/** HID keyboard keycode to indicate that no is currently pressed. */
#define KEY_NONE 0
/** HID keyboard keycode to indicate that the "1" key is currently pressed. */
#define KEY_1 30
/** HID keyboard keycode to indicate that the "0" key is currently pressed. */
#define KEY_0 39
/** HID keyboard keycode to indicate that the enter key is currently pressed. */
#define KEY_ENTER 40
/* Function Prototypes: */
void SetupHardware(void);
void ReadMagstripeData(void);
void EVENT_USB_Device_ConfigurationChanged(void);
void EVENT_USB_Device_ControlRequest(void);
void EVENT_USB_Device_StartOfFrame(void);
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
uint8_t* const ReportID,
const uint8_t ReportType,
void* ReportData,
uint16_t* const ReportSize);
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
const uint8_t ReportID,
const uint8_t ReportType,
const void* ReportData,
const uint16_t ReportSize);
#endif

View file

@ -0,0 +1,163 @@
/** \file
*
* This file contains special DoxyGen information for the generation of the main page and other special
* documentation pages. It is not a project source file.
*/
/** \mainpage Denver Gingerich's USBSnoop Magnetic Card Reader Project
*
* \section Sec_Compat Project Compatibility:
*
* The following list indicates what microcontrollers are compatible with this project.
*
* \li AT90USB1287
* \li AT90USB1286
*
* \section Sec_Info USB Information:
*
* The following table gives a rundown of the USB utilization of this project.
*
* <table>
* <tr>
* <td><b>USB Mode:</b></td>
* <td>Device</td>
* </tr>
* <tr>
* <td><b>USB Class:</b></td>
* <td>Human Interface Device (HID)</td>
* </tr>
* <tr>
* <td><b>USB Subclass:</b></td>
* <td>Keyboard</td>
* </tr>
* <tr>
* <td><b>Relevant Standards:</b></td>
* <td>USBIF HID Standard, USBIF HID Usage Tables</td>
* </tr>
* <tr>
* <td><b>Supported USB Speeds:</b></td>
* <td>Full Speed Mode</td>
* </tr>
* </table>
*
* \section Sec_Description Project Description:
*
* Firmware for a USB AVR powered USB TTL magnetic stripe reader (using a card
* reader such as the Omron V3B-4K) by Denver Gingerich. This project is designed
* to be used with the open source Stripe Snoop project at <a>http://stripesnoop.sourceforge.net/</a>.
*
* See <a>http://ossguy.com/ss_usb/</a> for the USB reader hardware project website,
* including construction and support details.
*
* To use, connect your magnetic card reader device to the USB AVR as follows (pin and port mapping may be adjusted
* from the project makefile):
*
* <table>
* <tr>
* <th><b>Signal:</b></th>
* <th><b>AVR Port:</b></th>
* </tr>
* <tr>
* <td>Track 1 Data</td>
* <td>PORTC, Pin 1</td>
* </tr>
* <tr>
* <td>Track 1 Clock</td>
* <td>PORTC, Pin 2</td>
* </tr>
* <tr>
* <td>Track 2 Data</td>
* <td>PORTC, Pin 3</td>
* </tr>
* <tr>
* <td>Track 2 Clock</td>
* <td>PORTC, Pin 0</td>
* </tr>
* <tr>
* <td>Track 3 Data</td>
* <td>PORTC, Pin 5</td>
* </tr>
* <tr>
* <td>Track 3 Clock</td>
* <td>PORTC, Pin 6</td>
* </tr>
* <tr>
* <td>Card Detect</td>
* <td>PORTC, Pin 4</td>
* </tr>
* </table>
*
* This project is based on the LUFA Keyboard project demonstration application, written by Denver Gingerich.
*
* This application uses a keyboard HID driver to communicate the data collected a TTL magnetic stripe reader
* to the connected computer. The raw bitstream obtained from the magnetic stripe reader is "typed" through
* the keyboard driver as 0's and 1's. After every card swipe, the project will send a return key.
*
* \section Sec_Options Project Options
*
* The following defines can be found in this project, which can control the project behaviour when defined, or changed in value.
*
* <table>
* <tr>
* <th><b>Define Name:</b></th>
* <th><b>Location:</b></th>
* <th><b>Description:</b></th>
* </tr>
* <tr>
* <td>MAX_BITS</td>
* <td>CircularBitBuffer.h</td>
* <td>Gives the maximum number of bits per track which can be buffered by the device for later transmission to a host.</td>
* </tr>
* <tr>
* <td>MAG_T1_CLOCK</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's CLOCK line for the reader's track 1 output.</td>
* </tr>
* <tr>
* <td>MAG_T1_DATA</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's DATA line for the reader's track 1 output.</td>
* </tr>
* <tr>
* <td>MAG_T2_CLOCK</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's CLOCK line for the reader's track 2 output.</td>
* </tr>
* <tr>
* <td>MAG_T2_DATA</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's DATA line for the reader's track 2 output.</td>
* </tr>
* <tr>
* <td>MAG_T3_CLOCK</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's CLOCK line for the reader's track 3 output.</td>
* </tr>
* <tr>
* <td>MAG_T3_DATA</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's DATA line for the reader's track 3 output.</td>
* </tr>
* <tr>
* <td>MAG_CARDPRESENT</td>
* <td>AppConfig.h</td>
* <td>Mask for the magnetic card reader's card detection output.</td>
* </tr>
* <tr>
* <td>MAG_PIN</td>
* <td>AppConfig.h</td>
* <td>PIN register that the magnetic card reader device is attached to.</td>
* </tr>
* <tr>
* <td>MAG_PORT</td>
* <td>AppConfig.h</td>
* <td>PORT register that the magnetic card reader device is attached to.</td>
* </tr>
* <tr>
* <td>MAG_DDR</td>
* <td>AppConfig.h</td>
* <td>DDR register that the magnetic card reader device is attached to.</td>
* </tr>
* </table>
*/

View file

@ -0,0 +1,52 @@
<asf xmlversion="1.0">
<project caption="Magnetic Strip Card Reader" id="lufa.projects.magstripe.avr8">
<require idref="lufa.projects.magstripe"/>
<require idref="lufa.boards.dummy.avr8"/>
<generator value="as5_8"/>
<device-support value="at90usb1287"/>
<config name="lufa.drivers.board.name" value="usbkey"/>
<build type="define" name="F_CPU" value="8000000UL"/>
<build type="define" name="F_USB" value="8000000UL"/>
</project>
<module type="application" id="lufa.projects.magstripe" caption="Magnetic Strip Card Reader">
<info type="description" value="summary">
Magnetic strip card reader project.
</info>
<info type="gui-flag" value="move-to-root"/>
<info type="keyword" value="Technology">
<keyword value="Class Driver APIs"/>
<keyword value="USB Device"/>
<keyword value="HID Class"/>
</info>
<device-support-alias value="lufa_avr8"/>
<device-support-alias value="lufa_xmega"/>
<device-support-alias value="lufa_uc3"/>
<build type="distribute" subtype="user-file" value="doxyfile"/>
<build type="distribute" subtype="user-file" value="Magstripe.txt"/>
<build type="c-source" value="Magstripe.c"/>
<build type="c-source" value="Descriptors.c"/>
<build type="header-file" value="Magstripe.h"/>
<build type="header-file" value="Descriptors.h"/>
<build type="c-source" value="Lib/CircularBitBuffer.c"/>
<build type="header-file" value="Lib/CircularBitBuffer.h"/>
<build type="header-file" value="Lib/MagstripeHW.h"/>
<build type="module-config" subtype="path" value="Config"/>
<build type="module-config" subtype="required-header-file" value="AppConfig.h"/>
<build type="header-file" value="Config/AppConfig.h"/>
<build type="header-file" value="Config/LUFAConfig.h"/>
<require idref="lufa.common"/>
<require idref="lufa.platform"/>
<require idref="lufa.drivers.usb"/>
</module>
</asf>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,38 @@
#
# LUFA Library
# Copyright (C) Dean Camera, 2014.
#
# dean [at] fourwalledcubicle [dot] com
# www.lufa-lib.org
#
# --------------------------------------
# LUFA Project Makefile.
# --------------------------------------
# Run "make help" for target help.
MCU = at90usb1287
ARCH = AVR8
BOARD = NONE
F_CPU = 16000000
F_USB = $(F_CPU)
OPTIMIZATION = s
TARGET = Magstripe
SRC = $(TARGET).c Descriptors.c Lib/CircularBitBuffer.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
LUFA_PATH = ../../LUFA
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/
LD_FLAGS =
# Default target
all:
# Include LUFA build script makefiles
include $(LUFA_PATH)/Build/lufa_core.mk
include $(LUFA_PATH)/Build/lufa_sources.mk
include $(LUFA_PATH)/Build/lufa_build.mk
include $(LUFA_PATH)/Build/lufa_cppcheck.mk
include $(LUFA_PATH)/Build/lufa_doxygen.mk
include $(LUFA_PATH)/Build/lufa_dfu.mk
include $(LUFA_PATH)/Build/lufa_hid.mk
include $(LUFA_PATH)/Build/lufa_avrdude.mk
include $(LUFA_PATH)/Build/lufa_atprogram.mk