@@ -1,4 +1,4 @@ | |||
/* 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 | |||
* of this software and associated documentation files (the "Software"), to deal | |||
@@ -42,7 +42,7 @@ inline void init_errorLED() | |||
DDRD |= (1<<6); | |||
// ARM | |||
#elif defined(_mk20dx128_) | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||
// 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); | |||
@@ -68,7 +68,7 @@ inline void errorLED( uint8_t on ) | |||
} | |||
// ARM | |||
#elif defined(_mk20dx128_) | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||
// Error LED On (C5) | |||
if ( on ) { |
@@ -1,4 +1,4 @@ | |||
/* 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 | |||
* of this software and associated documentation files (the "Software"), to deal | |||
@@ -37,7 +37,7 @@ void usb_debug_putstr( char* s ) | |||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | |||
while ( *s != '\0' ) | |||
usb_debug_putchar( *s++ ); | |||
#elif defined(_mk20dx128_) // ARM | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM | |||
// Count characters until NULL character, then send the amount counted | |||
uint32_t count = 0; | |||
while ( s[count] != '\0' ) | |||
@@ -84,7 +84,7 @@ void _print(const char *s) | |||
usb_debug_putchar('\r'); | |||
usb_debug_putchar(c); | |||
} | |||
#elif defined(_mk20dx128_) // ARM | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM | |||
usb_debug_putstr( (char*)s ); | |||
#endif | |||
} |
@@ -1,4 +1,4 @@ | |||
/* 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 | |||
* of this software and associated documentation files (the "Software"), to deal | |||
@@ -30,7 +30,7 @@ | |||
#include <avr/pgmspace.h> | |||
#include "avr/usb_keyboard_debug.h" | |||
#elif defined(_mk20dx128_) | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||
#include "arm/usb_serial.h" | |||
@@ -358,23 +358,30 @@ struct usb_string_descriptor_struct { | |||
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, | |||
3, | |||
{0x0409} | |||
}; | |||
static struct usb_string_descriptor_struct string1 = { | |||
struct usb_string_descriptor_struct usb_string_manufacturer_name_default = { | |||
sizeof(STR_MANUFACTURER), | |||
3, | |||
STR_MANUFACTURER | |||
}; | |||
static struct usb_string_descriptor_struct string2 = { | |||
struct usb_string_descriptor_struct usb_string_product_name_default = { | |||
sizeof(STR_PRODUCT), | |||
3, | |||
STR_PRODUCT | |||
}; | |||
static struct usb_string_descriptor_struct string3 = { | |||
struct usb_string_descriptor_struct usb_string_serial_number_default = { | |||
sizeof(STR_SERIAL), | |||
3, | |||
STR_SERIAL | |||
@@ -399,10 +406,10 @@ const usb_descriptor_list_t usb_descriptor_list[] = { | |||
{0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)}, | |||
{0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_DESC_OFFSET, 9}, | |||
#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} | |||
}; | |||
@@ -45,16 +45,49 @@ | |||
#define ENDPOINT_RECEIVE_ONLY 0x19 | |||
#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_SUBCLASS 0x02 | |||
#define DEVICE_PROTOCOL 0x01 | |||
#define EP0_SIZE 64 | |||
#define NUM_ENDPOINTS 15 | |||
#define NUM_ENDPOINTS 6 | |||
#define NUM_USB_BUFFERS 30 | |||
#define NUM_INTERFACE 4 | |||
#define CDC_IAD_DESCRIPTOR 1 | |||
#define CDC_STATUS_INTERFACE 0 | |||
@@ -73,15 +106,20 @@ | |||
#define MOUSE_ENDPOINT 5 | |||
#define MOUSE_SIZE 8 | |||
#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 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 ENDPOINT2_CONFIG ENDPOINT_TRANSIMIT_ONLY | |||
#define ENDPOINT3_CONFIG ENDPOINT_RECEIVE_ONLY | |||
#define ENDPOINT4_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) |
@@ -32,11 +32,8 @@ | |||
#include "usb_dev.h" | |||
#include "usb_mem.h" | |||
#define NUM_BUF 30 | |||
__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; | |||
@@ -53,7 +50,7 @@ usb_packet_t * usb_malloc(void) | |||
__disable_irq(); | |||
avail = usb_buffer_available; | |||
n = __builtin_clz(avail); // clz = count leading zeros | |||
if (n >= NUM_BUF) { | |||
if (n >= NUM_USB_BUFFERS) { | |||
__enable_irq(); | |||
return NULL; | |||
} | |||
@@ -82,7 +79,7 @@ void usb_free(usb_packet_t *p) | |||
//serial_print("free:"); | |||
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_print("\n"); | |||
@@ -30,7 +30,7 @@ | |||
// USB Includes | |||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | |||
#include "avr/usb_keyboard_debug.h" | |||
#elif defined(_mk20dx128_) | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||
#include "arm/usb_keyboard.h" | |||
#include "arm/usb_dev.h" | |||
#endif | |||
@@ -110,7 +110,7 @@ inline void usb_send(void) | |||
inline void output_firmwareReload() | |||
{ | |||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | |||
#elif defined(_mk20dx128_) | |||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||
usb_device_reload(); | |||
#endif | |||
} |