/* Copyright (C) 2011 by Jacob Alexander | |||||
/* Copyright (C) 2011-2014 by Jacob Alexander | |||||
* | * | ||||
* Permission is hereby granted, free of charge, to any person obtaining a copy | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
* of this software and associated documentation files (the "Software"), to deal | * of this software and associated documentation files (the "Software"), to deal | ||||
DDRD |= (1<<6); | DDRD |= (1<<6); | ||||
// ARM | // ARM | ||||
#elif defined(_mk20dx128_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
// Setup pin - Pin 11 -> C5 - See Lib/pin_map.teensy3 for more details on pins | // Setup pin - Pin 11 -> C5 - See Lib/pin_map.teensy3 for more details on pins | ||||
PORTC_PCR5 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); | PORTC_PCR5 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); | ||||
} | } | ||||
// ARM | // ARM | ||||
#elif defined(_mk20dx128_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
// Error LED On (C5) | // Error LED On (C5) | ||||
if ( on ) { | if ( on ) { |
/* Copyright (C) 2011-2013 by Jacob Alexander | |||||
/* Copyright (C) 2011-2014 by Jacob Alexander | |||||
* | * | ||||
* Permission is hereby granted, free of charge, to any person obtaining a copy | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
* of this software and associated documentation files (the "Software"), to deal | * of this software and associated documentation files (the "Software"), to deal | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | ||||
while ( *s != '\0' ) | while ( *s != '\0' ) | ||||
usb_debug_putchar( *s++ ); | usb_debug_putchar( *s++ ); | ||||
#elif defined(_mk20dx128_) // ARM | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM | |||||
// Count characters until NULL character, then send the amount counted | // Count characters until NULL character, then send the amount counted | ||||
uint32_t count = 0; | uint32_t count = 0; | ||||
while ( s[count] != '\0' ) | while ( s[count] != '\0' ) | ||||
usb_debug_putchar('\r'); | usb_debug_putchar('\r'); | ||||
usb_debug_putchar(c); | usb_debug_putchar(c); | ||||
} | } | ||||
#elif defined(_mk20dx128_) // ARM | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM | |||||
usb_debug_putstr( (char*)s ); | usb_debug_putstr( (char*)s ); | ||||
#endif | #endif | ||||
} | } |
/* Copyright (C) 2011-2013 by Jacob Alexander | |||||
/* Copyright (C) 2011-2014 by Jacob Alexander | |||||
* | * | ||||
* Permission is hereby granted, free of charge, to any person obtaining a copy | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
* of this software and associated documentation files (the "Software"), to deal | * of this software and associated documentation files (the "Software"), to deal | ||||
#include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||||
#include "avr/usb_keyboard_debug.h" | #include "avr/usb_keyboard_debug.h" | ||||
#elif defined(_mk20dx128_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#include "arm/usb_serial.h" | #include "arm/usb_serial.h" | ||||
uint16_t wString[]; | uint16_t wString[]; | ||||
}; | }; | ||||
static struct usb_string_descriptor_struct string0 = { | |||||
extern struct usb_string_descriptor_struct usb_string_manufacturer_name | |||||
__attribute__ ((weak, alias("usb_string_manufacturer_name_default"))); | |||||
extern struct usb_string_descriptor_struct usb_string_product_name | |||||
__attribute__ ((weak, alias("usb_string_product_name_default"))); | |||||
extern struct usb_string_descriptor_struct usb_string_serial_number | |||||
__attribute__ ((weak, alias("usb_string_serial_number_default"))); | |||||
struct usb_string_descriptor_struct string0 = { | |||||
4, | 4, | ||||
3, | 3, | ||||
{0x0409} | {0x0409} | ||||
}; | }; | ||||
static struct usb_string_descriptor_struct string1 = { | |||||
struct usb_string_descriptor_struct usb_string_manufacturer_name_default = { | |||||
sizeof(STR_MANUFACTURER), | sizeof(STR_MANUFACTURER), | ||||
3, | 3, | ||||
STR_MANUFACTURER | STR_MANUFACTURER | ||||
}; | }; | ||||
static struct usb_string_descriptor_struct string2 = { | |||||
struct usb_string_descriptor_struct usb_string_product_name_default = { | |||||
sizeof(STR_PRODUCT), | sizeof(STR_PRODUCT), | ||||
3, | 3, | ||||
STR_PRODUCT | STR_PRODUCT | ||||
}; | }; | ||||
static struct usb_string_descriptor_struct string3 = { | |||||
struct usb_string_descriptor_struct usb_string_serial_number_default = { | |||||
sizeof(STR_SERIAL), | sizeof(STR_SERIAL), | ||||
3, | 3, | ||||
STR_SERIAL | STR_SERIAL | ||||
{0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)}, | {0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)}, | ||||
{0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_DESC_OFFSET, 9}, | {0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_DESC_OFFSET, 9}, | ||||
#endif | #endif | ||||
{0x0300, 0x0000, (const uint8_t *)&string0, 4}, | |||||
{0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)}, | |||||
{0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)}, | |||||
{0x0303, 0x0409, (const uint8_t *)&string3, sizeof(STR_SERIAL)}, | |||||
{0x0300, 0x0000, (const uint8_t *)&string0, 0}, | |||||
{0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0}, | |||||
{0x0302, 0x0409, (const uint8_t *)&usb_string_product_name, 0}, | |||||
{0x0303, 0x0409, (const uint8_t *)&usb_string_serial_number, 0}, | |||||
{0, 0, NULL, 0} | {0, 0, NULL, 0} | ||||
}; | }; | ||||
#define ENDPOINT_RECEIVE_ONLY 0x19 | #define ENDPOINT_RECEIVE_ONLY 0x19 | ||||
#define ENDPOINT_TRANSMIT_AND_RECEIVE 0x1D | #define ENDPOINT_TRANSMIT_AND_RECEIVE 0x1D | ||||
// Some operating systems, especially Windows, may cache USB device | |||||
// info. Changes to the device name may not update on the same | |||||
// computer unless the vendor or product ID numbers change, or the | |||||
// "bcdDevice" revision code is increased. | |||||
/* | |||||
To modify a USB Type to have different interfaces, start in this | |||||
file. Delete the XYZ_INTERFACE lines for any interfaces you | |||||
wish to remove, and copy them from another USB Type for any you | |||||
want to add. | |||||
Give each interface a unique number, and edit NUM_INTERFACE to | |||||
reflect the number of interfaces. | |||||
Within each interface, make sure it uses a unique set of endpoints. | |||||
Edit NUM_ENDPOINTS to be at least the largest endpoint number used. | |||||
Then edit the ENDPOINT*_CONFIG lines so each endpoint is configured | |||||
the proper way (transmit, receive, or both). | |||||
The CONFIG_DESC_SIZE and any XYZ_DESC_OFFSET numbers must be | |||||
edited to the correct sizes. See usb_desc.c for the giant array | |||||
of bytes. Someday these may be done automatically..... (but how?) | |||||
If you are using existing interfaces, the code in each file should | |||||
automatically adapt to the changes you specify. If you need to | |||||
create a new type of interface, you'll need to write the code which | |||||
sends and receives packets, and presents an API to the user. | |||||
Finally, edit usb_inst.cpp, which creats instances of the C++ | |||||
objects for each combination. | |||||
Some operating systems, especially Windows, may cache USB device | |||||
info. Changes to the device name may not update on the same | |||||
computer unless the vendor or product ID numbers change, or the | |||||
"bcdDevice" revision code is increased. | |||||
If these instructions are missing steps or could be improved, please | |||||
let me know? http://forum.pjrc.com/forums/4-Suggestions-amp-Bug-Reports | |||||
*/ | |||||
#define DEVICE_CLASS 0xEF | #define DEVICE_CLASS 0xEF | ||||
#define DEVICE_SUBCLASS 0x02 | #define DEVICE_SUBCLASS 0x02 | ||||
#define DEVICE_PROTOCOL 0x01 | #define DEVICE_PROTOCOL 0x01 | ||||
#define EP0_SIZE 64 | #define EP0_SIZE 64 | ||||
#define NUM_ENDPOINTS 15 | |||||
#define NUM_ENDPOINTS 6 | |||||
#define NUM_USB_BUFFERS 30 | |||||
#define NUM_INTERFACE 4 | #define NUM_INTERFACE 4 | ||||
#define CDC_IAD_DESCRIPTOR 1 | #define CDC_IAD_DESCRIPTOR 1 | ||||
#define CDC_STATUS_INTERFACE 0 | #define CDC_STATUS_INTERFACE 0 | ||||
#define MOUSE_ENDPOINT 5 | #define MOUSE_ENDPOINT 5 | ||||
#define MOUSE_SIZE 8 | #define MOUSE_SIZE 8 | ||||
#define MOUSE_INTERVAL 2 | #define MOUSE_INTERVAL 2 | ||||
#define JOYSTICK_INTERFACE 4 // Joystick | |||||
#define JOYSTICK_ENDPOINT 6 | |||||
#define JOYSTICK_SIZE 16 | |||||
#define JOYSTICK_INTERVAL 1 | |||||
#define KEYBOARD_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9) | #define KEYBOARD_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9) | ||||
#define MOUSE_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9) | #define MOUSE_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9) | ||||
#define CONFIG_DESC_SIZE (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9+9+7) | |||||
#define JOYSTICK_DESC_OFFSET (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9+9+7 + 9) | |||||
#define CONFIG_DESC_SIZE (9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9+9+7 + 9+9+7) | |||||
#define ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY | #define ENDPOINT1_CONFIG ENDPOINT_TRANSIMIT_ONLY | ||||
#define ENDPOINT2_CONFIG ENDPOINT_TRANSIMIT_ONLY | #define ENDPOINT2_CONFIG ENDPOINT_TRANSIMIT_ONLY | ||||
#define ENDPOINT3_CONFIG ENDPOINT_RECEIVE_ONLY | #define ENDPOINT3_CONFIG ENDPOINT_RECEIVE_ONLY | ||||
#define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY | #define ENDPOINT4_CONFIG ENDPOINT_TRANSIMIT_ONLY | ||||
#define ENDPOINT5_CONFIG ENDPOINT_TRANSIMIT_ONLY | #define ENDPOINT5_CONFIG ENDPOINT_TRANSIMIT_ONLY | ||||
#define ENDPOINT6_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||||
// NUM_ENDPOINTS = number of non-zero endpoints (0 to 15) | // NUM_ENDPOINTS = number of non-zero endpoints (0 to 15) |
#include "usb_dev.h" | #include "usb_dev.h" | ||||
#include "usb_mem.h" | #include "usb_mem.h" | ||||
#define NUM_BUF 30 | |||||
__attribute__ ((section(".usbbuffers"), used)) | __attribute__ ((section(".usbbuffers"), used)) | ||||
//static unsigned char usb_buffer_memory[NUM_BUF * sizeof(usb_packet_t)]; | |||||
unsigned char usb_buffer_memory[NUM_BUF * sizeof(usb_packet_t)]; | |||||
unsigned char usb_buffer_memory[NUM_USB_BUFFERS * sizeof(usb_packet_t)]; | |||||
static uint32_t usb_buffer_available = 0xFFFFFFFF; | static uint32_t usb_buffer_available = 0xFFFFFFFF; | ||||
__disable_irq(); | __disable_irq(); | ||||
avail = usb_buffer_available; | avail = usb_buffer_available; | ||||
n = __builtin_clz(avail); // clz = count leading zeros | n = __builtin_clz(avail); // clz = count leading zeros | ||||
if (n >= NUM_BUF) { | |||||
if (n >= NUM_USB_BUFFERS) { | |||||
__enable_irq(); | __enable_irq(); | ||||
return NULL; | return NULL; | ||||
} | } | ||||
//serial_print("free:"); | //serial_print("free:"); | ||||
n = ((uint8_t *)p - usb_buffer_memory) / sizeof(usb_packet_t); | n = ((uint8_t *)p - usb_buffer_memory) / sizeof(usb_packet_t); | ||||
if (n >= NUM_BUF) return; | |||||
if (n >= NUM_USB_BUFFERS) return; | |||||
//serial_phex(n); | //serial_phex(n); | ||||
//serial_print("\n"); | //serial_print("\n"); | ||||
// USB Includes | // USB Includes | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | ||||
#include "avr/usb_keyboard_debug.h" | #include "avr/usb_keyboard_debug.h" | ||||
#elif defined(_mk20dx128_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#include "arm/usb_keyboard.h" | #include "arm/usb_keyboard.h" | ||||
#include "arm/usb_dev.h" | #include "arm/usb_dev.h" | ||||
#endif | #endif | ||||
inline void output_firmwareReload() | inline void output_firmwareReload() | ||||
{ | { | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | ||||
#elif defined(_mk20dx128_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
usb_device_reload(); | usb_device_reload(); | ||||
#endif | #endif | ||||
} | } |