Commit b8db5fc1 authored by Dean Camera's avatar Dean Camera
Browse files

Added new Relay Controller Board project (thanks to OBinou).

Added hardware board driver support for the PJRC Teensy line of USB AVR boards.
parent c2de01b6
This diff is collapsed.
......@@ -94,6 +94,9 @@
* such as the Joystick driver, where the removal would adversely affect the code's operation is still disallowed. */
#define BOARD_NONE 10
/** Selects the Teensy (all versions) specific board drivers, including the driver for the board LEDs. */
#define BOARD_TEENSY 11
#if !defined(__DOXYGEN__)
#define BOARD_ BOARD_NONE
......
......@@ -95,14 +95,14 @@
#include "RZUSBSTICK/LEDs.h"
#elif (BOARD == BOARD_ATAVRUSBRF01)
#include "ATAVRUSBRF01/LEDs.h"
#elif (BOARD == BOARD_XPLAIN)
#include "XPLAIN/LEDs.h"
#elif (BOARD == BOARD_XPLAIN_REV1)
#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
#include "XPLAIN/LEDs.h"
#elif (BOARD == BOARD_BUMBLEB)
#include "BUMBLEB/LEDs.h"
#elif (BOARD == BOARD_EVK527)
#include "EVK527/LEDs.h"
#include "EVK527/LEDs.h"
#elif (BOARD == BOARD_TEENSY)
#include "TEENSY/LEDs.h"
#elif (BOARD == BOARD_USER)
#include "Board/LEDs.h"
#endif
......
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 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 disclaim 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
*
* Board specific LED driver header for the PJRC Teensy series boards.
*
* \note This file should not be included directly. It is automatically included as needed by the LEDs driver
* dispatch header located in LUFA/Drivers/Board/LEDs.h.
*/
/** \ingroup Group_LEDs
* @defgroup Group_LEDs_TEENSY TEENSY
*
* Board specific LED driver header for the PJRC Teensy boards.
*
* \note This file should not be included directly. It is automatically included as needed by the LEDs driver
* dispatch header located in LUFA/Drivers/Board/LEDs.h.
*
* @{
*/
#ifndef __LEDS_TEENSY_H__
#define __LEDS_TEENSY_H__
/* Includes: */
#include <avr/io.h>
#include "../../../Common/Common.h"
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Preprocessor Checks: */
#if !defined(__INCLUDE_FROM_LEDS_H)
#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
#endif
/* Public Interface - May be used in end-application: */
/* Macros: */
/** LED mask for the first LED on the board. */
#define LEDS_LED1 (1 << 6)
/** LED mask for all the LEDs on the board. */
#define LEDS_ALL_LEDS (1 << 6)
/** LED mask for the none of the board LEDs */
#define LEDS_NO_LEDS 0
/* Inline Functions: */
#if !defined(__DOXYGEN__)
static inline void LEDs_Init(void)
{
DDRD |= LEDS_ALL_LEDS;
PORTD |= LEDS_ALL_LEDS;
}
static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
{
PORTD &= ~LEDMask;
}
static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
{
PORTD |= LEDMask;
}
static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
{
PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
}
static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask)
{
PORTD = ((PORTD | LEDMask) & ~ActiveMask);
}
static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
{
PORTD ^= LEDMask;
}
static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
static inline uint8_t LEDs_GetLEDs(void)
{
return (~PORTD & LEDS_ALL_LEDS);
}
#endif
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif
/** @} */
......@@ -10,6 +10,8 @@
*
* <b>New:</b>
* - Added incomplete MIDIToneGenerator project
* - Added board hardware driver support for the PJRC Teensy line of USB AVR boards
* - Added new Relay Controller Board project (thanks to OBinou)
*
* <b>Changed:</b>
* - AVRISP programmer project now has a more robust timeout system, allowing for an increse of the software USART speed
......
......@@ -21,18 +21,18 @@
* - AT90USB1286 (USB Device Only)
* - AT90USB1287 (USB Host and Device)
*
* Currently supported Atmel boards:
* Currently supported Atmel boards (see \ref Group_BoardTypes):
* - AT90USBKEY
* - ATAVRUSBRF01
* - EVK527
* - RZUSBSTICK
* - STK525
* - STK526
* - XPLAIN Revision 1 (Board AT90USB1287 only, original 45DB041D Dataflash IC)
* - XPLAIN Revision 2 onwards (Board AT90USB1287 only, newer 45DB642D Dataflash IC)
* - XPLAIN (Both original first revision board, and newer boards with a different Dataflash model)
*
* Currently supported third-party boards (via hardware drivers):
* - BUMBLEB (using officially recommended peripheral layout)
* Currently supported third-party boards (see \ref Group_BoardTypes):
* - Bumble-B (using officially recommended peripheral layout)
* - Teensy (all revisions and versions)
* - Any Other Custom User Boards (with Board Drivers if desired, see \ref Page_WritingBoardDrivers)
*/
\ No newline at end of file
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 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 disclaim 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"
/** 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.
*/
USB_Descriptor_Device_t PROGMEM RelayBoard_DeviceDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
.USBSpecification = VERSION_BCD(01.10),
.Class = 0xFF,
.SubClass = 0x00,
.Protocol = 0x00,
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
.VendorID = 0x04B4,
.ProductID = 0xFD11,
.ReleaseNumber = VERSION_BCD(02.00),
.ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02,
.SerialNumStrIndex = 0x03,
.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.
*/
RelayBoard_USB_Descriptor_Configuration_t PROGMEM RelayBoard_ConfigurationDescriptor =
{
.Config =
{
.Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
.TotalConfigurationSize = sizeof(RelayBoard_USB_Descriptor_Configuration_t),
.TotalInterfaces = 1,
.ConfigurationNumber = 1,
.ConfigurationStrIndex = NO_DESCRIPTOR,
.ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED,
.MaxPowerConsumption = USB_CONFIG_POWER_MA(500)
},
.RelayBoardInterface =
{
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
.InterfaceNumber = 0,
.AlternateSetting = 0,
.TotalEndpoints = 0,
.Class = 0xFF,
.SubClass = 0x00,
.Protocol = 0x00,
.InterfaceStrIndex = NO_DESCRIPTOR
},
};
/** 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.
*/
USB_Descriptor_String_t PROGMEM RelayBoard_LanguageString =
{
.Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
.UnicodeString = {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.
*/
USB_Descriptor_String_t PROGMEM RelayBoard_ManufacturerString =
{
.Header = {.Size = USB_STRING_LEN(5), .Type = DTYPE_String},
.UnicodeString = L"SISPM"
};
/** 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.
*/
USB_Descriptor_String_t PROGMEM RelayBoard_ProductString =
{
.Header = {.Size = USB_STRING_LEN(10), .Type = DTYPE_String},
.UnicodeString = L"RelayBoard"
};
/** Serial number string. This is a Unicode string containing the device's unique serial number, expressed as a
* series of uppercase hexadecimal digits.
*/
USB_Descriptor_String_t PROGMEM RelayBoard_SerialString =
{
.Header = {.Size = USB_STRING_LEN(5), .Type = DTYPE_String},
.UnicodeString = L"00001"
};
/** 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, void** const DescriptorAddress)
{
const uint8_t DescriptorType = (wValue >> 8);
const uint8_t DescriptorNumber = (wValue & 0xFF);
void* Address = NULL;
uint16_t Size = NO_DESCRIPTOR;
switch (DescriptorType)
{
case DTYPE_Device:
Address = (void*)&RelayBoard_DeviceDescriptor;
Size = sizeof(USB_Descriptor_Device_t);
break;
case DTYPE_Configuration:
Address = (void*)&RelayBoard_ConfigurationDescriptor;
Size = sizeof(RelayBoard_USB_Descriptor_Configuration_t);
break;
case DTYPE_String:
switch (DescriptorNumber)
{
case 0x00:
Address = (void*)&RelayBoard_LanguageString;
Size = pgm_read_byte(&RelayBoard_LanguageString.Header.Size);
break;
case 0x01:
Address = (void*)&RelayBoard_ManufacturerString;
Size = pgm_read_byte(&RelayBoard_ManufacturerString.Header.Size);
break;
case 0x02:
Address = (void*)&RelayBoard_ProductString;
Size = pgm_read_byte(&RelayBoard_ProductString.Header.Size);
break;
case 0x03:
Address = (void*)&RelayBoard_SerialString;
Size = pgm_read_byte(&RelayBoard_SerialString.Header.Size);
break;
}
break;
}
*DescriptorAddress = Address;
return Size;
}
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 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 disclaim 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>
/* 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;
USB_Descriptor_Interface_t RelayBoardInterface;
} RelayBoard_USB_Descriptor_Configuration_t;
/* Function Prototypes: */
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress);
#endif
This diff is collapsed.
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 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 disclaim 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 RelayBoard program. This file contains the main tasks of
* the project and is responsible for the initial application hardware configuration.
*/
#include "RelayBoard.h"
/** 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 (;;)
USB_USBTask();
}
/** Configures the board hardware and chip peripherals for the project's functionality. */
void SetupHardware(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF);
wdt_disable();
/* Disable clock division */
clock_prescale_set(clock_div_1);
/* Hardware Initialization */
USB_Init();
/* Initialize Relays */
DDRC |= ALL_RELAYS;
PORTC |= ALL_RELAYS;
}
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_Device_ConfigurationChanged(void)
{
USB_Device_EnableSOFEvents();
}
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_Device_UnhandledControlRequest(void)
{
const uint8_t serial[5] = { 0, 0, 0, 0, 1 };
uint8_t data[2] = { 0, 0 };
switch (USB_ControlRequest.bRequest)
{
case 0x09:
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{
LEDs_ToggleLEDs(LEDS_LED1);
Endpoint_ClearSETUP();
Endpoint_Read_Control_Stream_LE(data, sizeof(data));
Endpoint_ClearIN();
switch (USB_ControlRequest.wValue)
{
case 0x303:
if (data[1]) PORTC |= RELAY1; else PORTC &= ~RELAY1; break;
case 0x306:
if (data[1]) PORTC |= RELAY2; else PORTC &= ~RELAY2; break;
case 0x309:
if (data[1]) PORTC |= RELAY3; else PORTC &= ~RELAY3; break;
case 0x30c:
if (data[1]) PORTC |= RELAY4; else PORTC &= ~RELAY4; break;
default:
break;
}
}
break;
case 0x01:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{
LEDs_ToggleLEDs(LEDS_LED1);
Endpoint_ClearSETUP();
switch (USB_ControlRequest.wValue)
{
case 0x301:
Endpoint_Write_Control_Stream_LE(serial, sizeof(serial));
break;
case 0x303:
if (PORTC & RELAY1) data[1]=3; else data[1]=2; break;
case 0x306:
if (PORTC & RELAY2) data[1]=3; else data[1]=2; break;
case 0x309:
if (PORTC & RELAY3) data[1]=3; else data[1]=2; break;
case 0x30c:
if (PORTC & RELAY4) data[1]=3; else data[1]=2; break;
default:
break;
}
if (data[1])
Endpoint_Write_Control_Stream_LE(data, sizeof(data));
Endpoint_ClearOUT();
}
break;
}
}
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 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 disclaim 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