forked from mirrors/qmk_userspace
		
	divide usb_keyboard_debug.[c|h] into usb_device, usb_keyboard, usb_debug.
This commit is contained in:
		
					parent
					
						
							
								6be0e4fafb
							
						
					
				
			
			
				commit
				
					
						7fd9003f59
					
				
			
		
					 9 changed files with 225 additions and 186 deletions
				
			
		
							
								
								
									
										4
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -48,7 +48,9 @@ TARGET = mykey
 | 
				
			||||||
SRC =	$(TARGET).c \
 | 
					SRC =	$(TARGET).c \
 | 
				
			||||||
	keymap.c \
 | 
						keymap.c \
 | 
				
			||||||
	matrix.c \
 | 
						matrix.c \
 | 
				
			||||||
	usb_keyboard_debug.c \
 | 
						usb_device.c \
 | 
				
			||||||
 | 
						usb_keyboard.c \
 | 
				
			||||||
 | 
						usb_debug.c \
 | 
				
			||||||
	print.c
 | 
						print.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								mykey.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								mykey.c
									
										
									
									
									
								
							| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
#include <avr/interrupt.h>
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
#include <util/delay.h>
 | 
					#include <util/delay.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "usb_keyboard_debug.h"
 | 
					#include "usb_device.h"
 | 
				
			||||||
#include "print.h"
 | 
					#include "print.h"
 | 
				
			||||||
#include "matrix.h"
 | 
					#include "matrix.h"
 | 
				
			||||||
#include "keymap.h"
 | 
					#include "keymap.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								print.h
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								print.h
									
										
									
									
									
								
							| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
#define print_h__
 | 
					#define print_h__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <avr/pgmspace.h>
 | 
					#include <avr/pgmspace.h>
 | 
				
			||||||
#include "usb_keyboard_debug.h"
 | 
					#include "usb_debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// this macro allows you to write print("some text") and
 | 
					// this macro allows you to write print("some text") and
 | 
				
			||||||
// the string is automatically placed into flash memory :)
 | 
					// the string is automatically placed into flash memory :)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										80
									
								
								usb_debug.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								usb_debug.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,80 @@
 | 
				
			||||||
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
 | 
					#include "usb_debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// the time remaining before we transmit any partially full
 | 
				
			||||||
 | 
					// packet, or send a zero length packet.
 | 
				
			||||||
 | 
					volatile uint8_t debug_flush_timer=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// transmit a character.  0 returned on success, -1 on error
 | 
				
			||||||
 | 
					int8_t usb_debug_putchar(uint8_t c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static uint8_t previous_timeout=0;
 | 
				
			||||||
 | 
						uint8_t timeout, intr_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if we're not online (enumerated and configured), error
 | 
				
			||||||
 | 
						if (!usb_configured()) return -1;
 | 
				
			||||||
 | 
						// interrupts are disabled so these functions can be
 | 
				
			||||||
 | 
						// used from the main program or interrupt context,
 | 
				
			||||||
 | 
						// even both in the same program!
 | 
				
			||||||
 | 
						intr_state = SREG;
 | 
				
			||||||
 | 
						cli();
 | 
				
			||||||
 | 
						UENUM = DEBUG_TX_ENDPOINT;
 | 
				
			||||||
 | 
						// if we gave up due to timeout before, don't wait again
 | 
				
			||||||
 | 
						if (previous_timeout) {
 | 
				
			||||||
 | 
							if (!(UEINTX & (1<<RWAL))) {
 | 
				
			||||||
 | 
								SREG = intr_state;
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							previous_timeout = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// wait for the FIFO to be ready to accept data
 | 
				
			||||||
 | 
						timeout = UDFNUML + 4;
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							// are we ready to transmit?
 | 
				
			||||||
 | 
							if (UEINTX & (1<<RWAL)) break;
 | 
				
			||||||
 | 
							SREG = intr_state;
 | 
				
			||||||
 | 
							// have we waited too long?
 | 
				
			||||||
 | 
							if (UDFNUML == timeout) {
 | 
				
			||||||
 | 
								previous_timeout = 1;
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// has the USB gone offline?
 | 
				
			||||||
 | 
							if (!usb_configured()) return -1;
 | 
				
			||||||
 | 
							// get ready to try checking again
 | 
				
			||||||
 | 
							intr_state = SREG;
 | 
				
			||||||
 | 
							cli();
 | 
				
			||||||
 | 
							UENUM = DEBUG_TX_ENDPOINT;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// actually write the byte into the FIFO
 | 
				
			||||||
 | 
						UEDATX = c;
 | 
				
			||||||
 | 
						// if this completed a packet, transmit it now!
 | 
				
			||||||
 | 
						if (!(UEINTX & (1<<RWAL))) {
 | 
				
			||||||
 | 
							UEINTX = 0x3A;
 | 
				
			||||||
 | 
							debug_flush_timer = 0;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							debug_flush_timer = 2;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						SREG = intr_state;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// immediately transmit any buffered output.
 | 
				
			||||||
 | 
					void usb_debug_flush_output(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint8_t intr_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						intr_state = SREG;
 | 
				
			||||||
 | 
						cli();
 | 
				
			||||||
 | 
						if (debug_flush_timer) {
 | 
				
			||||||
 | 
							UENUM = DEBUG_TX_ENDPOINT;
 | 
				
			||||||
 | 
							while ((UEINTX & (1<<RWAL))) {
 | 
				
			||||||
 | 
								UEDATX = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							UEINTX = 0x3A;
 | 
				
			||||||
 | 
							debug_flush_timer = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						SREG = intr_state;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								usb_debug.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								usb_debug.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					#ifndef USB_DEBUG_H
 | 
				
			||||||
 | 
					#define  USB_DEBUG_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "usb_device.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEBUG_INTERFACE		1
 | 
				
			||||||
 | 
					#define DEBUG_TX_ENDPOINT	4
 | 
				
			||||||
 | 
					#define DEBUG_TX_SIZE		32
 | 
				
			||||||
 | 
					#define DEBUG_TX_BUFFER		EP_DOUBLE_BUFFER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern volatile uint8_t debug_flush_timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int8_t usb_debug_putchar(uint8_t c);	// transmit a character
 | 
				
			||||||
 | 
					void usb_debug_flush_output(void);	// immediately transmit any buffered output
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -21,11 +21,12 @@
 | 
				
			||||||
 * THE SOFTWARE.
 | 
					 * THE SOFTWARE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Version 1.0: Initial Release
 | 
					#include <avr/pgmspace.h>
 | 
				
			||||||
// Version 1.1: Add support for Teensy 2.0
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
 | 
					#include "usb_device.h"
 | 
				
			||||||
 | 
					#include "usb_keyboard.h"
 | 
				
			||||||
 | 
					#include "usb_debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define USB_SERIAL_PRIVATE_INCLUDE
 | 
					 | 
				
			||||||
#include "usb_keyboard_debug.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**************************************************************************
 | 
					/**************************************************************************
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -63,16 +64,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENDPOINT0_SIZE		32
 | 
					#define ENDPOINT0_SIZE		32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define KEYBOARD_INTERFACE	0
 | 
					 | 
				
			||||||
#define KEYBOARD_ENDPOINT	3
 | 
					 | 
				
			||||||
#define KEYBOARD_SIZE		8
 | 
					 | 
				
			||||||
#define KEYBOARD_BUFFER		EP_DOUBLE_BUFFER
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DEBUG_INTERFACE		1
 | 
					 | 
				
			||||||
#define DEBUG_TX_ENDPOINT	4
 | 
					 | 
				
			||||||
#define DEBUG_TX_SIZE		32
 | 
					 | 
				
			||||||
#define DEBUG_TX_BUFFER		EP_DOUBLE_BUFFER
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const uint8_t PROGMEM endpoint_config_table[] = {
 | 
					static const uint8_t PROGMEM endpoint_config_table[] = {
 | 
				
			||||||
	0,
 | 
						0,
 | 
				
			||||||
	0,
 | 
						0,
 | 
				
			||||||
| 
						 | 
					@ -255,17 +246,22 @@ static struct usb_string_descriptor_struct PROGMEM string2 = {
 | 
				
			||||||
// This table defines which descriptor data is sent for each specific
 | 
					// This table defines which descriptor data is sent for each specific
 | 
				
			||||||
// request from the host (in wValue and wIndex).
 | 
					// request from the host (in wValue and wIndex).
 | 
				
			||||||
static struct descriptor_list_struct {
 | 
					static struct descriptor_list_struct {
 | 
				
			||||||
	uint16_t	wValue;
 | 
						uint16_t	wValue;     // descriptor type
 | 
				
			||||||
	uint16_t	wIndex;
 | 
						uint16_t	wIndex;
 | 
				
			||||||
	const uint8_t	*addr;
 | 
						const uint8_t	*addr;
 | 
				
			||||||
	uint8_t		length;
 | 
						uint8_t		length;
 | 
				
			||||||
} PROGMEM descriptor_list[] = {
 | 
					} PROGMEM descriptor_list[] = {
 | 
				
			||||||
 | 
					        // DEVICE descriptor
 | 
				
			||||||
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},
 | 
						{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},
 | 
				
			||||||
 | 
					        // CONFIGURATION descriptor
 | 
				
			||||||
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},
 | 
						{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},
 | 
				
			||||||
 | 
					        // HID REPORT
 | 
				
			||||||
	{0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)},
 | 
						{0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)},
 | 
				
			||||||
	{0x2100, KEYBOARD_INTERFACE, config1_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},
 | 
						{0x2100, KEYBOARD_INTERFACE, config1_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},
 | 
				
			||||||
 | 
					        // HID REPORT
 | 
				
			||||||
	{0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)},
 | 
						{0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)},
 | 
				
			||||||
	{0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9},
 | 
						{0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9},
 | 
				
			||||||
 | 
					        // STRING descriptor
 | 
				
			||||||
	{0x0300, 0x0000, (const uint8_t *)&string0, 4},
 | 
						{0x0300, 0x0000, (const uint8_t *)&string0, 4},
 | 
				
			||||||
	{0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)},
 | 
						{0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)},
 | 
				
			||||||
	{0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)}
 | 
						{0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)}
 | 
				
			||||||
| 
						 | 
					@ -282,33 +278,6 @@ static struct descriptor_list_struct {
 | 
				
			||||||
// zero when we are not configured, non-zero when enumerated
 | 
					// zero when we are not configured, non-zero when enumerated
 | 
				
			||||||
static volatile uint8_t usb_configuration=0;
 | 
					static volatile uint8_t usb_configuration=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// the time remaining before we transmit any partially full
 | 
					 | 
				
			||||||
// packet, or send a zero length packet.
 | 
					 | 
				
			||||||
static volatile uint8_t debug_flush_timer=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// which modifier keys are currently pressed
 | 
					 | 
				
			||||||
// 1=left ctrl,    2=left shift,   4=left alt,    8=left gui
 | 
					 | 
				
			||||||
// 16=right ctrl, 32=right shift, 64=right alt, 128=right gui
 | 
					 | 
				
			||||||
uint8_t keyboard_modifier_keys=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// which keys are currently pressed, up to 6 keys may be down at once
 | 
					 | 
				
			||||||
uint8_t keyboard_keys[6]={0,0,0,0,0,0};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// protocol setting from the host.  We use exactly the same report
 | 
					 | 
				
			||||||
// either way, so this variable only stores the setting since we
 | 
					 | 
				
			||||||
// are required to be able to report which setting is in use.
 | 
					 | 
				
			||||||
static uint8_t keyboard_protocol=1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// the idle configuration, how often we send the report to the
 | 
					 | 
				
			||||||
// host (ms * 4) even when it hasn't changed
 | 
					 | 
				
			||||||
static uint8_t keyboard_idle_config=125;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// count until idle timeout
 | 
					 | 
				
			||||||
static uint8_t keyboard_idle_count=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 1=num lock, 2=caps lock, 4=scroll lock, 8=compose, 16=kana
 | 
					 | 
				
			||||||
volatile uint8_t keyboard_leds=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**************************************************************************
 | 
					/**************************************************************************
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -339,127 +308,6 @@ uint8_t usb_configured(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// perform a single keystroke
 | 
					 | 
				
			||||||
int8_t usb_keyboard_press(uint8_t key, uint8_t modifier)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int8_t r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	keyboard_modifier_keys = modifier;
 | 
					 | 
				
			||||||
	keyboard_keys[0] = key;
 | 
					 | 
				
			||||||
	r = usb_keyboard_send();
 | 
					 | 
				
			||||||
	if (r) return r;
 | 
					 | 
				
			||||||
	keyboard_modifier_keys = 0;
 | 
					 | 
				
			||||||
	keyboard_keys[0] = 0;
 | 
					 | 
				
			||||||
	return usb_keyboard_send();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// send the contents of keyboard_keys and keyboard_modifier_keys
 | 
					 | 
				
			||||||
int8_t usb_keyboard_send(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint8_t i, intr_state, timeout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!usb_configuration) return -1;
 | 
					 | 
				
			||||||
	intr_state = SREG;
 | 
					 | 
				
			||||||
	cli();
 | 
					 | 
				
			||||||
	UENUM = KEYBOARD_ENDPOINT;
 | 
					 | 
				
			||||||
	timeout = UDFNUML + 50;
 | 
					 | 
				
			||||||
	while (1) {
 | 
					 | 
				
			||||||
		// are we ready to transmit?
 | 
					 | 
				
			||||||
		if (UEINTX & (1<<RWAL)) break;
 | 
					 | 
				
			||||||
		SREG = intr_state;
 | 
					 | 
				
			||||||
		// has the USB gone offline?
 | 
					 | 
				
			||||||
		if (!usb_configuration) return -1;
 | 
					 | 
				
			||||||
		// have we waited too long?
 | 
					 | 
				
			||||||
		if (UDFNUML == timeout) return -1;
 | 
					 | 
				
			||||||
		// get ready to try checking again
 | 
					 | 
				
			||||||
		intr_state = SREG;
 | 
					 | 
				
			||||||
		cli();
 | 
					 | 
				
			||||||
		UENUM = KEYBOARD_ENDPOINT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	UEDATX = keyboard_modifier_keys;
 | 
					 | 
				
			||||||
	UEDATX = 0;
 | 
					 | 
				
			||||||
	for (i=0; i<6; i++) {
 | 
					 | 
				
			||||||
		UEDATX = keyboard_keys[i];
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	UEINTX = 0x3A;
 | 
					 | 
				
			||||||
	keyboard_idle_count = 0;
 | 
					 | 
				
			||||||
	SREG = intr_state;
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// transmit a character.  0 returned on success, -1 on error
 | 
					 | 
				
			||||||
int8_t usb_debug_putchar(uint8_t c)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	static uint8_t previous_timeout=0;
 | 
					 | 
				
			||||||
	uint8_t timeout, intr_state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// if we're not online (enumerated and configured), error
 | 
					 | 
				
			||||||
	if (!usb_configuration) return -1;
 | 
					 | 
				
			||||||
	// interrupts are disabled so these functions can be
 | 
					 | 
				
			||||||
	// used from the main program or interrupt context,
 | 
					 | 
				
			||||||
	// even both in the same program!
 | 
					 | 
				
			||||||
	intr_state = SREG;
 | 
					 | 
				
			||||||
	cli();
 | 
					 | 
				
			||||||
	UENUM = DEBUG_TX_ENDPOINT;
 | 
					 | 
				
			||||||
	// if we gave up due to timeout before, don't wait again
 | 
					 | 
				
			||||||
	if (previous_timeout) {
 | 
					 | 
				
			||||||
		if (!(UEINTX & (1<<RWAL))) {
 | 
					 | 
				
			||||||
			SREG = intr_state;
 | 
					 | 
				
			||||||
			return -1;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		previous_timeout = 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// wait for the FIFO to be ready to accept data
 | 
					 | 
				
			||||||
	timeout = UDFNUML + 4;
 | 
					 | 
				
			||||||
	while (1) {
 | 
					 | 
				
			||||||
		// are we ready to transmit?
 | 
					 | 
				
			||||||
		if (UEINTX & (1<<RWAL)) break;
 | 
					 | 
				
			||||||
		SREG = intr_state;
 | 
					 | 
				
			||||||
		// have we waited too long?
 | 
					 | 
				
			||||||
		if (UDFNUML == timeout) {
 | 
					 | 
				
			||||||
			previous_timeout = 1;
 | 
					 | 
				
			||||||
			return -1;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// has the USB gone offline?
 | 
					 | 
				
			||||||
		if (!usb_configuration) return -1;
 | 
					 | 
				
			||||||
		// get ready to try checking again
 | 
					 | 
				
			||||||
		intr_state = SREG;
 | 
					 | 
				
			||||||
		cli();
 | 
					 | 
				
			||||||
		UENUM = DEBUG_TX_ENDPOINT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// actually write the byte into the FIFO
 | 
					 | 
				
			||||||
	UEDATX = c;
 | 
					 | 
				
			||||||
	// if this completed a packet, transmit it now!
 | 
					 | 
				
			||||||
	if (!(UEINTX & (1<<RWAL))) {
 | 
					 | 
				
			||||||
		UEINTX = 0x3A;
 | 
					 | 
				
			||||||
		debug_flush_timer = 0;
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		debug_flush_timer = 2;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	SREG = intr_state;
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// immediately transmit any buffered output.
 | 
					 | 
				
			||||||
void usb_debug_flush_output(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint8_t intr_state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	intr_state = SREG;
 | 
					 | 
				
			||||||
	cli();
 | 
					 | 
				
			||||||
	if (debug_flush_timer) {
 | 
					 | 
				
			||||||
		UENUM = DEBUG_TX_ENDPOINT;
 | 
					 | 
				
			||||||
		while ((UEINTX & (1<<RWAL))) {
 | 
					 | 
				
			||||||
			UEDATX = 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		UEINTX = 0x3A;
 | 
					 | 
				
			||||||
		debug_flush_timer = 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	SREG = intr_state;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**************************************************************************
 | 
					/**************************************************************************
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -1,30 +1,18 @@
 | 
				
			||||||
#ifndef usb_serial_h__
 | 
					#ifndef USB_DEVICE_H
 | 
				
			||||||
#define usb_serial_h__
 | 
					#define  USB_DEVICE_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <avr/io.h>
 | 
				
			||||||
 | 
					#include "usb_keyboard.h"
 | 
				
			||||||
 | 
					#include "usb_debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void usb_init(void);			// initialize everything
 | 
					void usb_init(void);			// initialize everything
 | 
				
			||||||
uint8_t usb_configured(void);		// is the USB port configured
 | 
					uint8_t usb_configured(void);		// is the USB port configured
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int8_t usb_keyboard_press(uint8_t key, uint8_t modifier);
 | 
					 | 
				
			||||||
int8_t usb_keyboard_send(void);
 | 
					 | 
				
			||||||
extern uint8_t keyboard_modifier_keys;
 | 
					 | 
				
			||||||
extern uint8_t keyboard_keys[6];
 | 
					 | 
				
			||||||
extern volatile uint8_t keyboard_leds;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int8_t usb_debug_putchar(uint8_t c);	// transmit a character
 | 
					 | 
				
			||||||
void usb_debug_flush_output(void);	// immediately transmit any buffered output
 | 
					 | 
				
			||||||
#define USB_DEBUG_HID
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Everything below this point is only intended for usb_serial.c
 | 
					 | 
				
			||||||
#ifdef USB_SERIAL_PRIVATE_INCLUDE
 | 
					 | 
				
			||||||
#include <avr/io.h>
 | 
					 | 
				
			||||||
#include <avr/pgmspace.h>
 | 
					 | 
				
			||||||
#include <avr/interrupt.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EP_TYPE_CONTROL			0x00
 | 
					#define EP_TYPE_CONTROL			0x00
 | 
				
			||||||
#define EP_TYPE_BULK_IN			0x81
 | 
					#define EP_TYPE_BULK_IN			0x81
 | 
				
			||||||
#define EP_TYPE_BULK_OUT		0x80
 | 
					#define EP_TYPE_BULK_OUT		0x80
 | 
				
			||||||
| 
						 | 
					@ -89,5 +77,5 @@ void usb_debug_flush_output(void);	// immediately transmit any buffered output
 | 
				
			||||||
#define CDC_SET_LINE_CODING		0x20
 | 
					#define CDC_SET_LINE_CODING		0x20
 | 
				
			||||||
#define CDC_GET_LINE_CODING		0x21
 | 
					#define CDC_GET_LINE_CODING		0x21
 | 
				
			||||||
#define CDC_SET_CONTROL_LINE_STATE	0x22
 | 
					#define CDC_SET_CONTROL_LINE_STATE	0x22
 | 
				
			||||||
#endif
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										76
									
								
								usb_keyboard.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								usb_keyboard.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
 | 
					#include <avr/pgmspace.h>
 | 
				
			||||||
 | 
					#include "usb_keyboard.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// which modifier keys are currently pressed
 | 
				
			||||||
 | 
					// 1=left ctrl,    2=left shift,   4=left alt,    8=left gui
 | 
				
			||||||
 | 
					// 16=right ctrl, 32=right shift, 64=right alt, 128=right gui
 | 
				
			||||||
 | 
					uint8_t keyboard_modifier_keys=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// which keys are currently pressed, up to 6 keys may be down at once
 | 
				
			||||||
 | 
					uint8_t keyboard_keys[6]={0,0,0,0,0,0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// protocol setting from the host.  We use exactly the same report
 | 
				
			||||||
 | 
					// either way, so this variable only stores the setting since we
 | 
				
			||||||
 | 
					// are required to be able to report which setting is in use.
 | 
				
			||||||
 | 
					uint8_t keyboard_protocol=1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// the idle configuration, how often we send the report to the
 | 
				
			||||||
 | 
					// host (ms * 4) even when it hasn't changed
 | 
				
			||||||
 | 
					uint8_t keyboard_idle_config=125;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// count until idle timeout
 | 
				
			||||||
 | 
					uint8_t keyboard_idle_count=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 1=num lock, 2=caps lock, 4=scroll lock, 8=compose, 16=kana
 | 
				
			||||||
 | 
					volatile uint8_t keyboard_leds=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// perform a single keystroke
 | 
				
			||||||
 | 
					int8_t usb_keyboard_press(uint8_t key, uint8_t modifier)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int8_t r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						keyboard_modifier_keys = modifier;
 | 
				
			||||||
 | 
						keyboard_keys[0] = key;
 | 
				
			||||||
 | 
						r = usb_keyboard_send();
 | 
				
			||||||
 | 
						if (r) return r;
 | 
				
			||||||
 | 
						keyboard_modifier_keys = 0;
 | 
				
			||||||
 | 
						keyboard_keys[0] = 0;
 | 
				
			||||||
 | 
						return usb_keyboard_send();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// send the contents of keyboard_keys and keyboard_modifier_keys
 | 
				
			||||||
 | 
					int8_t usb_keyboard_send(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint8_t i, intr_state, timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!usb_configured()) return -1;
 | 
				
			||||||
 | 
						intr_state = SREG;
 | 
				
			||||||
 | 
						cli();
 | 
				
			||||||
 | 
						UENUM = KEYBOARD_ENDPOINT;
 | 
				
			||||||
 | 
						timeout = UDFNUML + 50;
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							// are we ready to transmit?
 | 
				
			||||||
 | 
							if (UEINTX & (1<<RWAL)) break;
 | 
				
			||||||
 | 
							SREG = intr_state;
 | 
				
			||||||
 | 
							// has the USB gone offline?
 | 
				
			||||||
 | 
							if (!usb_configured()) return -1;
 | 
				
			||||||
 | 
							// have we waited too long?
 | 
				
			||||||
 | 
							if (UDFNUML == timeout) return -1;
 | 
				
			||||||
 | 
							// get ready to try checking again
 | 
				
			||||||
 | 
							intr_state = SREG;
 | 
				
			||||||
 | 
							cli();
 | 
				
			||||||
 | 
							UENUM = KEYBOARD_ENDPOINT;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						UEDATX = keyboard_modifier_keys;
 | 
				
			||||||
 | 
						UEDATX = 0;
 | 
				
			||||||
 | 
						for (i=0; i<6; i++) {
 | 
				
			||||||
 | 
							UEDATX = keyboard_keys[i];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						UEINTX = 0x3A;
 | 
				
			||||||
 | 
						keyboard_idle_count = 0;
 | 
				
			||||||
 | 
						SREG = intr_state;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										25
									
								
								usb_keyboard.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								usb_keyboard.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					#ifndef USB_KEYBOARD_H
 | 
				
			||||||
 | 
					#define  USB_KEYBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "usb_device.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define KEYBOARD_INTERFACE	0
 | 
				
			||||||
 | 
					#define KEYBOARD_ENDPOINT	3
 | 
				
			||||||
 | 
					#define KEYBOARD_SIZE		8
 | 
				
			||||||
 | 
					#define KEYBOARD_BUFFER		EP_DOUBLE_BUFFER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern uint8_t keyboard_modifier_keys;
 | 
				
			||||||
 | 
					extern uint8_t keyboard_keys[6];
 | 
				
			||||||
 | 
					extern uint8_t keyboard_protocol;
 | 
				
			||||||
 | 
					extern uint8_t keyboard_idle_config;
 | 
				
			||||||
 | 
					extern uint8_t keyboard_idle_count;
 | 
				
			||||||
 | 
					extern volatile uint8_t keyboard_leds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int8_t usb_keyboard_press(uint8_t key, uint8_t modifier);
 | 
				
			||||||
 | 
					int8_t usb_keyboard_send(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue