Initial commit
This commit is contained in:
commit
22bb178687
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
BaitAndSwitch.bin
|
||||
BaitAndSwitch.eep
|
||||
BaitAndSwitch.elf
|
||||
BaitAndSwitch.hex
|
||||
BaitAndSwitch.lss
|
||||
BaitAndSwitch.map
|
||||
BaitAndSwitch.sym
|
||||
obj
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[submodule "lufa"]
|
||||
path = lufa
|
||||
url = https://github.com/abcminiuser/lufa.git
|
7
Config/LUFAConfig.h
Normal file
7
Config/LUFAConfig.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
#define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
|
||||
#define USB_DEVICE_ONLY
|
||||
#define USE_FLASH_DESCRIPTORS
|
||||
#define FIXED_CONTROL_ENDPOINT_SIZE 8
|
||||
#define FIXED_NUM_CONFIGURATIONS 1
|
||||
#define INTERRUPT_CONTROL_ENDPOINT
|
34
board.h
Normal file
34
board.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
#pragma once
|
||||
#include <avr/io.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern FILE USBSerialStream;
|
||||
|
||||
#define SET_FUN_N(NAME, PORT, PIN) inline static void NAME(void) { PORT |= (1<<PIN); }
|
||||
#define CLR_FUN_N(NAME, PORT, PIN) inline static void NAME(void) { PORT &= ~(1<<PIN); }
|
||||
#define GET_FUN_N(NAME, PORT, PIN) inline static int NAME(void) { return !!(PORT & (1<<PIN)); }
|
||||
|
||||
#define PIN_FUN_N(NAME, PORT_NAME, PIN_NUM) \
|
||||
SET_FUN_N(NAME##On, PORT##PORT_NAME, PIN_NUM) \
|
||||
CLR_FUN_N(NAME##Off, PORT##PORT_NAME, PIN_NUM) \
|
||||
GET_FUN_N(NAME##Pin, PIN##PORT_NAME, PIN_NUM) \
|
||||
GET_FUN_N(NAME##Port, PORT##PORT_NAME, PIN_NUM)
|
||||
|
||||
#define SET_FUN_I(NAME, PORT, PIN) inline static void NAME(void) { PORT &= ~(1<<PIN); }
|
||||
#define CLR_FUN_I(NAME, PORT, PIN) inline static void NAME(void) { PORT |= (1<<PIN); }
|
||||
#define GET_FUN_I(NAME, PORT, PIN) inline static int NAME(void) { return !(PORT & (1<<PIN)); }
|
||||
|
||||
#define PIN_FUN_I(NAME, PORT_NAME, PIN_NUM) \
|
||||
SET_FUN_I(NAME##On, PORT##PORT_NAME, PIN_NUM) \
|
||||
CLR_FUN_I(NAME##Off, PORT##PORT_NAME, PIN_NUM) \
|
||||
GET_FUN_I(NAME##Pin, PIN##PORT_NAME, PIN_NUM) \
|
||||
GET_FUN_I(NAME##Port, PORT##PORT_NAME, PIN_NUM)
|
||||
|
||||
PIN_FUN_N(SysLed, B, 7)
|
||||
PIN_FUN_N(PortAInd, D, 0)
|
||||
PIN_FUN_N(PortBInd, D, 2)
|
||||
PIN_FUN_N(PortAPow, D, 1)
|
||||
PIN_FUN_N(PortBPow, D, 3)
|
||||
PIN_FUN_I(OutEn, D, 4)
|
||||
PIN_FUN_I(CtrlData, D, 5)
|
||||
PIN_FUN_N(DutData, D, 5)
|
114
commands.c
Normal file
114
commands.c
Normal file
|
@ -0,0 +1,114 @@
|
|||
#include "board.h"
|
||||
#include "commands.h"
|
||||
#include "usb.h"
|
||||
#include "main.h"
|
||||
#include <LUFA/Drivers/USB/USB.h>
|
||||
|
||||
extern FILE USBSerialStream;
|
||||
|
||||
static void DB(char const *s) {
|
||||
if (connected) {
|
||||
fputs(s, &USBSerialStream);
|
||||
fputs("\r\n", &USBSerialStream);
|
||||
}
|
||||
}
|
||||
|
||||
void connectCTL(void) {
|
||||
DB("CC");
|
||||
connectPowerCTL();
|
||||
disconnectPowerDUT();
|
||||
connectDataCTL();
|
||||
}
|
||||
|
||||
void connectDUT(void) {
|
||||
DB("CD");
|
||||
connectPowerDUT();
|
||||
disconnectPowerCTL();
|
||||
connectDataDUT();
|
||||
}
|
||||
|
||||
void connectDataCTL(void) {
|
||||
DB("CDC");
|
||||
PortBIndOff();
|
||||
CtrlDataOn();
|
||||
OutEnOn();
|
||||
PortAIndOn();
|
||||
}
|
||||
|
||||
void connectDataDUT(void) {
|
||||
DB("CDD");
|
||||
PortAIndOff();
|
||||
DutDataOn();
|
||||
OutEnOn();
|
||||
PortBIndOn();
|
||||
}
|
||||
|
||||
void connectPowerCTL(void) {
|
||||
DB("CPC");
|
||||
PortAPowOn();
|
||||
}
|
||||
|
||||
void connectPowerDUT(void) {
|
||||
DB("CPD");
|
||||
PortBPowOn();
|
||||
}
|
||||
|
||||
void disconnect(void) {
|
||||
DB("D");
|
||||
disconnectData();
|
||||
disconnectPower();
|
||||
}
|
||||
|
||||
void disconnectData(void) {
|
||||
DB("DD");
|
||||
OutEnOff();
|
||||
PortAIndOff();
|
||||
PortBIndOff();
|
||||
}
|
||||
|
||||
void disconnectPower(void) {
|
||||
DB("DP");
|
||||
disconnectPowerCTL();
|
||||
disconnectPowerDUT();
|
||||
}
|
||||
|
||||
void disconnectPowerCTL(void) {
|
||||
DB("DPC");
|
||||
PortAPowOff();
|
||||
}
|
||||
|
||||
void disconnectPowerDUT(void) {
|
||||
DB("DPD");
|
||||
PortBPowOff();
|
||||
}
|
||||
|
||||
void clearID(void) {
|
||||
DB("CI");
|
||||
SysLedOff();
|
||||
}
|
||||
|
||||
void setID(void) {
|
||||
DB("SI");
|
||||
SysLedOn();
|
||||
}
|
||||
|
||||
void status(void) {
|
||||
char buf[30];
|
||||
snprintf(buf, sizeof buf,
|
||||
"PC:%d, PD:%d, "
|
||||
"DT:%s\r\n"
|
||||
, PortAPowPort(), PortBPowPort()
|
||||
, OutEnPort() ? (CtrlDataPort() ? "Ctrl" : "DUT") : "off"
|
||||
);
|
||||
CDC_Device_SendString(&VirtualSerial_CDC_Interface, buf);
|
||||
}
|
||||
|
||||
void debug(void) {
|
||||
char buf[20];
|
||||
snprintf(buf, sizeof buf,
|
||||
"(%02x %02x %02x)\r\n"
|
||||
, (unsigned) (PINB & 0x87), (unsigned) (PINC & 0xF6), (unsigned) (PIND & 0xFF)
|
||||
);
|
||||
CDC_Device_SendString(&VirtualSerial_CDC_Interface, buf);
|
||||
}
|
||||
|
16
commands.h
Normal file
16
commands.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
void connectCTL(void);
|
||||
void connectDUT(void);
|
||||
void connectDataCTL(void);
|
||||
void connectDataDUT(void);
|
||||
void connectPowerCTL(void);
|
||||
void connectPowerDUT(void);
|
||||
void disconnect(void);
|
||||
void disconnectData(void);
|
||||
void disconnectPower(void);
|
||||
void disconnectPowerCTL(void);
|
||||
void disconnectPowerDUT(void);
|
||||
void clearID(void);
|
||||
void setID(void);
|
||||
void status(void);
|
||||
void debug(void);
|
180
descriptors.c
Normal file
180
descriptors.c
Normal file
|
@ -0,0 +1,180 @@
|
|||
#include "descriptors.h"
|
||||
|
||||
|
||||
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
|
||||
|
||||
.USBSpecification = VERSION_BCD(1,1,0),
|
||||
.Class = CDC_CSCP_CDCClass,
|
||||
.SubClass = CDC_CSCP_NoSpecificSubclass,
|
||||
.Protocol = CDC_CSCP_NoSpecificProtocol,
|
||||
|
||||
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
|
||||
|
||||
.VendorID = 0x03EB,
|
||||
.ProductID = 0x2044,
|
||||
.ReleaseNumber = VERSION_BCD(0,0,1),
|
||||
|
||||
.ManufacturerStrIndex = STRING_ID_Manufacturer,
|
||||
.ProductStrIndex = STRING_ID_Product,
|
||||
.SerialNumStrIndex = USE_INTERNAL_SERIAL,
|
||||
|
||||
.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
|
||||
};
|
||||
|
||||
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 = 2,
|
||||
|
||||
.ConfigurationNumber = 1,
|
||||
.ConfigurationStrIndex = NO_DESCRIPTOR,
|
||||
|
||||
.ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED),
|
||||
|
||||
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
|
||||
},
|
||||
|
||||
.CDC_CCI_Interface =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||
|
||||
.InterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||
.AlternateSetting = 0,
|
||||
|
||||
.TotalEndpoints = 1,
|
||||
|
||||
.Class = CDC_CSCP_CDCClass,
|
||||
.SubClass = CDC_CSCP_ACMSubclass,
|
||||
.Protocol = CDC_CSCP_ATCommandProtocol,
|
||||
|
||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||
},
|
||||
|
||||
.CDC_Functional_Header =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = CDC_DTYPE_CSInterface},
|
||||
.Subtype = CDC_DSUBTYPE_CSInterface_Header,
|
||||
|
||||
.CDCSpecification = VERSION_BCD(1,1,0),
|
||||
},
|
||||
|
||||
.CDC_Functional_ACM =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = CDC_DTYPE_CSInterface},
|
||||
.Subtype = CDC_DSUBTYPE_CSInterface_ACM,
|
||||
|
||||
.Capabilities = 0x06,
|
||||
},
|
||||
|
||||
.CDC_Functional_Union =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = CDC_DTYPE_CSInterface},
|
||||
.Subtype = CDC_DSUBTYPE_CSInterface_Union,
|
||||
|
||||
.MasterInterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||
.SlaveInterfaceNumber = INTERFACE_ID_CDC_DCI,
|
||||
},
|
||||
|
||||
.CDC_NotificationEndpoint =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||
|
||||
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||
.PollingIntervalMS = 0xFF
|
||||
},
|
||||
|
||||
.CDC_DCI_Interface =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||
|
||||
.InterfaceNumber = INTERFACE_ID_CDC_DCI,
|
||||
.AlternateSetting = 0,
|
||||
|
||||
.TotalEndpoints = 2,
|
||||
|
||||
.Class = CDC_CSCP_CDCDataClass,
|
||||
.SubClass = CDC_CSCP_NoDataSubclass,
|
||||
.Protocol = CDC_CSCP_NoDataProtocol,
|
||||
|
||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||
},
|
||||
|
||||
.CDC_DataOutEndpoint =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||
|
||||
.EndpointAddress = CDC_RX_EPADDR,
|
||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||
.PollingIntervalMS = 0x05
|
||||
},
|
||||
|
||||
.CDC_DataInEndpoint =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||
|
||||
.EndpointAddress = CDC_TX_EPADDR,
|
||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||
.PollingIntervalMS = 0x05
|
||||
}
|
||||
};
|
||||
|
||||
const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG);
|
||||
|
||||
const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"LUFA Library");
|
||||
|
||||
const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA CDC Demo");
|
||||
|
||||
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
|
||||
const uint16_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;
|
||||
}
|
||||
|
||||
*DescriptorAddress = Address;
|
||||
return Size;
|
||||
}
|
||||
|
110
descriptors.h
Normal file
110
descriptors.h
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2021.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.lufa-lib.org
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2021 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>
|
||||
|
||||
/* Macros: */
|
||||
/** Endpoint address of the CDC device-to-host notification IN endpoint. */
|
||||
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||
|
||||
/** Endpoint address of the CDC device-to-host data IN endpoint. */
|
||||
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||
|
||||
/** Endpoint address of the CDC host-to-device data OUT endpoint. */
|
||||
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||
|
||||
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||
#define CDC_NOTIFICATION_EPSIZE 8
|
||||
|
||||
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
||||
#define CDC_TXRX_EPSIZE 16
|
||||
|
||||
/* 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;
|
||||
|
||||
// CDC Control Interface
|
||||
USB_Descriptor_Interface_t CDC_CCI_Interface;
|
||||
USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header;
|
||||
USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM;
|
||||
USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union;
|
||||
USB_Descriptor_Endpoint_t CDC_NotificationEndpoint;
|
||||
|
||||
// CDC Data Interface
|
||||
USB_Descriptor_Interface_t CDC_DCI_Interface;
|
||||
USB_Descriptor_Endpoint_t CDC_DataOutEndpoint;
|
||||
USB_Descriptor_Endpoint_t CDC_DataInEndpoint;
|
||||
} 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_CDC_CCI = 0, /**< CDC CCI interface descriptor ID */
|
||||
INTERFACE_ID_CDC_DCI = 1, /**< CDC DCI 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 */
|
||||
};
|
||||
|
||||
/* Function Prototypes: */
|
||||
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
|
||||
const uint16_t wIndex,
|
||||
const void** const DescriptorAddress)
|
||||
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
|
||||
|
||||
#endif
|
||||
|
1
lufa
Submodule
1
lufa
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 15cf7809c7d9e7a6e42f256309dd965b6c8cc20b
|
141
main.c
Normal file
141
main.c
Normal file
|
@ -0,0 +1,141 @@
|
|||
#include "main.h"
|
||||
#include "board.h"
|
||||
#include "commands.h"
|
||||
#include "usb.h"
|
||||
|
||||
static void GPIO_Init();
|
||||
static void HandleSerialByte(uint8_t);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
GlobalInterruptEnable();
|
||||
SetupHardware();
|
||||
|
||||
/* Create a regular character stream for the interface so that it can be used with the stdio.h functions */
|
||||
CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
CheckInputs();
|
||||
|
||||
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
||||
USB_USBTask();
|
||||
|
||||
/* Must read data from the host, or it will lock up while waiting for the device */
|
||||
int16_t data = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
|
||||
if (data >= 0) {
|
||||
HandleSerialByte((uint8_t)(data & 0xFF));
|
||||
}
|
||||
|
||||
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
||||
USB_USBTask();
|
||||
}
|
||||
}
|
||||
|
||||
/** Configures the board hardware and chip peripherals for the demo'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 */
|
||||
GPIO_Init();
|
||||
USB_Init();
|
||||
}
|
||||
|
||||
void GPIO_Init() {
|
||||
// Port B:
|
||||
// 0, 1, 2: Inputs Disconnect, Sel B, Sel A -> Pullup
|
||||
// 7: SYS_LED
|
||||
DDRB = 1<<7;
|
||||
PINB |= (1 << 0) | (1 << 1) | (1 << 2);
|
||||
// Port C:
|
||||
// 2, 4, 5, 6, 7: C_SENSE, VBUS_CTRL_DET, HS, ~USBON, VBUS_DUT_DET
|
||||
// DDRC = 0;
|
||||
// Port D:
|
||||
// 0, 1: IND_PORTA, EN_POW_CTRL
|
||||
// 2, 3: IND_PORTB, EN_POW_DUT
|
||||
// 4: ~OE
|
||||
// 5: ~CTRL/DUT
|
||||
// 6: UNRST
|
||||
// 7: 5VMCU
|
||||
DDRD = ~((1<<7) | (1<<6));
|
||||
}
|
||||
|
||||
static int gotCommand = 0;
|
||||
void CheckInputs(void)
|
||||
{
|
||||
uint8_t portValue = (~PINB) & 7;
|
||||
static int lV = 0;
|
||||
if ((portValue == 0 || portValue == lV) && !gotCommand) {
|
||||
return;
|
||||
}
|
||||
|
||||
lV = portValue;
|
||||
gotCommand = 0;
|
||||
|
||||
if (portValue & (1<<0)) {
|
||||
disconnect();
|
||||
} else if (portValue & (1<<1)) {
|
||||
connectDUT();
|
||||
} else if (portValue & (1<<2)) {
|
||||
connectCTL();
|
||||
}
|
||||
}
|
||||
|
||||
static const struct {
|
||||
char const *name;
|
||||
void (*fun)(void);
|
||||
} commands[] = {
|
||||
{ "C", connectCTL },
|
||||
{ "PC", connectPowerCTL },
|
||||
{ "DC", connectDataCTL },
|
||||
{ "D", connectDUT },
|
||||
{ "PD", connectPowerDUT },
|
||||
{ "DD", connectDataDUT },
|
||||
{ "dPC", disconnectPowerCTL },
|
||||
{ "dPD", disconnectPowerDUT },
|
||||
{ "dP", disconnectPower },
|
||||
{ "dD", disconnectData },
|
||||
{ "d", disconnect },
|
||||
{ "I", setID },
|
||||
{ "i", clearID },
|
||||
{ "s", status },
|
||||
{ "x", debug }
|
||||
};
|
||||
|
||||
static void HandleCommand(char *cmd, int cmdLen) {
|
||||
for (int i = 0; i < (sizeof commands) / (sizeof commands[0]); i++) {
|
||||
if (!strncmp(commands[i].name, cmd, cmdLen)) {
|
||||
gotCommand = 1;
|
||||
commands[i].fun();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fputs("Unknown command\r\n", &USBSerialStream);
|
||||
}
|
||||
|
||||
static void HandleSerialByte(uint8_t b) {
|
||||
static char cmd[64];
|
||||
static int cmdLen = 0;
|
||||
|
||||
if (b != '\r' && b != '\n') {
|
||||
if (cmdLen < sizeof cmd - 1) {
|
||||
cmd[cmdLen++] = b;
|
||||
fputc(b, &USBSerialStream);
|
||||
}
|
||||
} else {
|
||||
if (cmdLen > 0) {
|
||||
fputs("\r\n", &USBSerialStream);
|
||||
CDC_Device_Flush(&VirtualSerial_CDC_Interface);
|
||||
cmd[cmdLen] = '\0';
|
||||
HandleCommand(cmd, cmdLen);
|
||||
cmdLen = 0;
|
||||
}
|
||||
}
|
||||
}
|
22
main.h
Normal file
22
main.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#pragma once
|
||||
#include <avr/io.h>
|
||||
#include <avr/wdt.h>
|
||||
#include <avr/power.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "descriptors.h"
|
||||
|
||||
#include <LUFA/Drivers/USB/USB.h>
|
||||
#include <LUFA/Platform/Platform.h>
|
||||
|
||||
void SetupHardware(void);
|
||||
void CheckInputs(void);
|
||||
|
||||
void EVENT_USB_Device_Connect(void);
|
||||
void EVENT_USB_Device_Disconnect(void);
|
||||
void EVENT_USB_Device_ConfigurationChanged(void);
|
||||
void EVENT_USB_Device_ControlRequest(void);
|
||||
|
||||
extern USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface;
|
42
makefile
Normal file
42
makefile
Normal file
|
@ -0,0 +1,42 @@
|
|||
#
|
||||
# LUFA Library
|
||||
# Copyright (C) Dean Camera, 2021.
|
||||
#
|
||||
# dean [at] fourwalledcubicle [dot] com
|
||||
# www.lufa-lib.org
|
||||
#
|
||||
# --------------------------------------
|
||||
# LUFA Project Makefile.
|
||||
# --------------------------------------
|
||||
|
||||
# Run "make help" for target help.
|
||||
|
||||
MCU = atmega16u2
|
||||
ARCH = AVR8
|
||||
F_CPU = 16000000
|
||||
F_USB = $(F_CPU)
|
||||
OPTIMIZATION = s
|
||||
TARGET = BaitAndSwitch
|
||||
SRC = main.c descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) usb.c commands.c
|
||||
LUFA_PATH = lufa/LUFA
|
||||
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/
|
||||
LD_FLAGS =
|
||||
|
||||
# Default target
|
||||
all:
|
||||
|
||||
# Include LUFA-specific DMBS extension modules
|
||||
DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA
|
||||
include $(DMBS_LUFA_PATH)/lufa-sources.mk
|
||||
include $(DMBS_LUFA_PATH)/lufa-gcc.mk
|
||||
|
||||
# Include common DMBS build system modules
|
||||
DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS
|
||||
include $(DMBS_PATH)/core.mk
|
||||
include $(DMBS_PATH)/cppcheck.mk
|
||||
include $(DMBS_PATH)/doxygen.mk
|
||||
include $(DMBS_PATH)/dfu.mk
|
||||
include $(DMBS_PATH)/gcc.mk
|
||||
include $(DMBS_PATH)/hid.mk
|
||||
include $(DMBS_PATH)/avrdude.mk
|
||||
include $(DMBS_PATH)/atprogram.mk
|
70
usb.c
Normal file
70
usb.c
Normal file
|
@ -0,0 +1,70 @@
|
|||
#include "main.h"
|
||||
#include "board.h"
|
||||
|
||||
int connected = 0;
|
||||
|
||||
FILE USBSerialStream;
|
||||
|
||||
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
|
||||
{
|
||||
.Config =
|
||||
{
|
||||
.ControlInterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||
.DataINEndpoint =
|
||||
{
|
||||
.Address = CDC_TX_EPADDR,
|
||||
.Size = CDC_TXRX_EPSIZE,
|
||||
.Banks = 1,
|
||||
},
|
||||
.DataOUTEndpoint =
|
||||
{
|
||||
.Address = CDC_RX_EPADDR,
|
||||
.Size = CDC_TXRX_EPSIZE,
|
||||
.Banks = 1,
|
||||
},
|
||||
.NotificationEndpoint =
|
||||
{
|
||||
.Address = CDC_NOTIFICATION_EPADDR,
|
||||
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||
.Banks = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
void EVENT_USB_Device_Connect(void)
|
||||
{
|
||||
}
|
||||
|
||||
void EVENT_USB_Device_Disconnect(void)
|
||||
{
|
||||
SysLedOff();
|
||||
connected = 0;
|
||||
}
|
||||
|
||||
void EVENT_USB_Device_ConfigurationChanged(void)
|
||||
{
|
||||
bool ConfigSuccess = true;
|
||||
|
||||
ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
|
||||
|
||||
if (ConfigSuccess) {
|
||||
SysLedOn();
|
||||
}
|
||||
}
|
||||
|
||||
void EVENT_USB_Device_ControlRequest(void)
|
||||
{
|
||||
CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
|
||||
}
|
||||
|
||||
void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo)
|
||||
{
|
||||
bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0;
|
||||
connected = HostReady;
|
||||
if (connected) {
|
||||
SysLedOn();
|
||||
} else {
|
||||
SysLedOff();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user