integrate V-USB support into ps2_usb
This commit is contained in:
		
							parent
							
								
									47f5d8b545
								
							
						
					
					
						commit
						fb8d23c60c
					
				
					 27 changed files with 176 additions and 1183 deletions
				
			
		| 
						 | 
				
			
			@ -1,46 +1,5 @@
 | 
			
		|||
# Hey Emacs, this is a -*- makefile -*-
 | 
			
		||||
#----------------------------------------------------------------------------
 | 
			
		||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
 | 
			
		||||
#
 | 
			
		||||
# Released to the Public Domain
 | 
			
		||||
#
 | 
			
		||||
# Additional material for this makefile was written by:
 | 
			
		||||
# Peter Fleury
 | 
			
		||||
# Tim Henigan
 | 
			
		||||
# Colin O'Flynn
 | 
			
		||||
# Reiner Patommel
 | 
			
		||||
# Markus Pfaff
 | 
			
		||||
# Sander Pool
 | 
			
		||||
# Frederik Rouleau
 | 
			
		||||
# Carlos Lamas
 | 
			
		||||
#
 | 
			
		||||
#----------------------------------------------------------------------------
 | 
			
		||||
# On command line:
 | 
			
		||||
#
 | 
			
		||||
# make all = Make software.
 | 
			
		||||
#
 | 
			
		||||
# make clean = Clean out built project files.
 | 
			
		||||
#
 | 
			
		||||
# make coff = Convert ELF to AVR COFF.
 | 
			
		||||
#
 | 
			
		||||
# make extcoff = Convert ELF to AVR Extended COFF.
 | 
			
		||||
#
 | 
			
		||||
# make program = Download the hex file to the device, using avrdude.
 | 
			
		||||
#                Please customize the avrdude settings below first!
 | 
			
		||||
#
 | 
			
		||||
# make debug = Start either simulavr or avarice as specified for debugging, 
 | 
			
		||||
#              with avr-gdb or avr-insight as the front end for debugging.
 | 
			
		||||
#
 | 
			
		||||
# make filename.s = Just compile filename.c into the assembler code only.
 | 
			
		||||
#
 | 
			
		||||
# make filename.i = Create a preprocessed source file for use in submitting
 | 
			
		||||
#                   bug reports to the GCC project.
 | 
			
		||||
#
 | 
			
		||||
# To rebuild project do "make clean" then "make all".
 | 
			
		||||
#----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# Target file name (without extension).
 | 
			
		||||
TARGET = tmk_ps2_usb
 | 
			
		||||
TARGET = ps2_usb
 | 
			
		||||
 | 
			
		||||
# Directory common source filess exist
 | 
			
		||||
COMMON_DIR = ..
 | 
			
		||||
| 
						 | 
				
			
			@ -49,10 +8,14 @@ COMMON_DIR = ..
 | 
			
		|||
TARGET_DIR = .
 | 
			
		||||
 | 
			
		||||
# keyboard dependent files
 | 
			
		||||
TARGET_SRC =	keymap.c \
 | 
			
		||||
TARGET_SRC =	main_pjrc.c \
 | 
			
		||||
		keymap.c \
 | 
			
		||||
  	        matrix.c \
 | 
			
		||||
		led.c \
 | 
			
		||||
		ps2.c
 | 
			
		||||
 | 
			
		||||
CONFIG_H = config_pjrc.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# MCU name, you MUST set this to match the board you are using
 | 
			
		||||
# type "make clean" after changing this, so all files will be rebuilt
 | 
			
		||||
| 
						 | 
				
			
			@ -78,4 +41,11 @@ USB_EXTRA_ENABLE = yes	# Enhanced feature for Windows(Audio control and System c
 | 
			
		|||
USB_NKRO_ENABLE = yes	# USB Nkey Rollover
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------- Programming Options --------------------------
 | 
			
		||||
PROGRAM_CMD = teensy_loader_cli.exe -mmcu=$(MCU) -w -v $(TARGET).hex
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
include $(COMMON_DIR)/Makefile.pjrc
 | 
			
		||||
include $(COMMON_DIR)/Makefile.common
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										84
									
								
								ps2_usb/Makefile.vusb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								ps2_usb/Makefile.vusb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
# Target file name (without extension).
 | 
			
		||||
TARGET = ps2_vusb
 | 
			
		||||
 | 
			
		||||
# Directory common source filess exist
 | 
			
		||||
COMMON_DIR = ..
 | 
			
		||||
 | 
			
		||||
# Directory keyboard dependent files exist
 | 
			
		||||
TARGET_DIR = .
 | 
			
		||||
 | 
			
		||||
# keyboard dependent files
 | 
			
		||||
TARGET_SRC =	main_vusb.c \
 | 
			
		||||
		keymap.c \
 | 
			
		||||
		matrix.c \
 | 
			
		||||
		led.c \
 | 
			
		||||
		ps2_usart.c \
 | 
			
		||||
		sendchar_dummy.c
 | 
			
		||||
#		sendchar_usart.c
 | 
			
		||||
 | 
			
		||||
CONFIG_H = config_vusb.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OPT_DEFS = -DDEBUG_LEVEL=0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# MCU name, you MUST set this to match the board you are using
 | 
			
		||||
# type "make clean" after changing this, so all files will be rebuilt
 | 
			
		||||
#MCU = at90usb162       # Teensy 1.0
 | 
			
		||||
#MCU = atmega32u4       # Teensy 2.0
 | 
			
		||||
#MCU = at90usb646       # Teensy++ 1.0
 | 
			
		||||
#MCU = at90usb1286      # Teensy++ 2.0
 | 
			
		||||
MCU = atmega168
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Processor frequency.
 | 
			
		||||
#   Normally the first thing your program should do is set the clock prescaler,
 | 
			
		||||
#   so your program will run at the correct speed.  You should also set this
 | 
			
		||||
#   variable to same clock speed.  The _delay_ms() macro uses this, and many
 | 
			
		||||
#   examples use this variable to calculate timings.  Do not add a "UL" here.
 | 
			
		||||
F_CPU = 20000000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Build Options
 | 
			
		||||
#   comment out to disable the options.
 | 
			
		||||
#
 | 
			
		||||
MOUSEKEY_ENABLE = yes	# Mouse keys
 | 
			
		||||
#USB_EXTRA_ENABLE = yes	# Enhanced feature for Windows(Audio control and System control)
 | 
			
		||||
#USB_NKRO_ENABLE = yes	# USB Nkey Rollover
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------- Programming Options --------------------------
 | 
			
		||||
AVRDUDE = avrdude
 | 
			
		||||
# Type: avrdude -c ? to get a full listing.
 | 
			
		||||
AVRDUDE_PROGRAMMER = usbasp
 | 
			
		||||
AVRDUDE_PORT =
 | 
			
		||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
 | 
			
		||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
 | 
			
		||||
 | 
			
		||||
# Uncomment the following if you want avrdude's erase cycle counter.
 | 
			
		||||
# Note that this counter needs to be initialized first using -Yn,
 | 
			
		||||
# see avrdude manual.
 | 
			
		||||
#AVRDUDE_ERASE_COUNTER = -y
 | 
			
		||||
 | 
			
		||||
# Uncomment the following if you do /not/ wish a verification to be
 | 
			
		||||
# performed after programming the device.
 | 
			
		||||
#AVRDUDE_NO_VERIFY = -V
 | 
			
		||||
 | 
			
		||||
# Increase verbosity level.  Please use this when submitting bug
 | 
			
		||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> 
 | 
			
		||||
# to submit bug reports.
 | 
			
		||||
#AVRDUDE_VERBOSE = -v -v
 | 
			
		||||
 | 
			
		||||
#AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
 | 
			
		||||
AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER)
 | 
			
		||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
 | 
			
		||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
 | 
			
		||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
 | 
			
		||||
 | 
			
		||||
PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
include $(COMMON_DIR)/Makefile.vusb
 | 
			
		||||
include $(COMMON_DIR)/Makefile.common
 | 
			
		||||
| 
						 | 
				
			
			@ -47,10 +47,10 @@ Keymap customization
 | 
			
		|||
    You can customize keymaps easily by editing source code.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Build
 | 
			
		||||
-----
 | 
			
		||||
Build for Teensy
 | 
			
		||||
----------------
 | 
			
		||||
0. Connect PS/2 keyboard to Teensy by 4 lines(Vcc, GND, Data, Clock).
 | 
			
		||||
1. Define following macros for PS/2 connection in config.h:
 | 
			
		||||
1. Define following macros for PS/2 connection in config_pjrc.h:
 | 
			
		||||
   PS2_DATA_PORT
 | 
			
		||||
   PS2_DATA_PIN
 | 
			
		||||
   PS2_DATA_DDR
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +65,15 @@ Build
 | 
			
		|||
   http://www.pjrc.com/teensy/loader.html
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Build for V-USB
 | 
			
		||||
---------------
 | 
			
		||||
0. Build V-USB controller board and connect PS/2 keyboard.
 | 
			
		||||
1. Define macros in config_vusb.h if needed.
 | 
			
		||||
2. Edit Makefile.vusb for build options and MCU setting.
 | 
			
		||||
3. make -f Makefile.vusb
 | 
			
		||||
4. program your V-USB controller.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Keymap
 | 
			
		||||
------
 | 
			
		||||
You can change a keymap by editing code of keymap.c like following.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,22 +10,26 @@
 | 
			
		|||
#define PRODUCT         PS/2 keyboard converter
 | 
			
		||||
#define DESCRIPTION     convert PS/2 keyboard to USB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* matrix size */
 | 
			
		||||
#define MATRIX_ROWS 32  // keycode bit: 3-0
 | 
			
		||||
#define MATRIX_COLS 8   // keycode bit: 6-4
 | 
			
		||||
/* define if matrix has ghost */
 | 
			
		||||
//#define MATRIX_HAS_GHOST
 | 
			
		||||
 | 
			
		||||
/* USB NKey Rollover */
 | 
			
		||||
#ifdef USB_NKRO_ENABLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* key combination for command */
 | 
			
		||||
#define IS_COMMAND() ( \
 | 
			
		||||
    keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) || \
 | 
			
		||||
    keyboard_report->mods == (BIT_LCTRL | BIT_RSHIFT) \
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* mouse keys */
 | 
			
		||||
#ifdef MOUSEKEY_ENABLE
 | 
			
		||||
#   define MOUSEKEY_DELAY_TIME 255
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* PS/2 mouse */
 | 
			
		||||
 | 
			
		||||
/* PS/2 lines */
 | 
			
		||||
#define PS2_CLOCK_PORT  PORTF
 | 
			
		||||
#define PS2_CLOCK_PIN   PINF
 | 
			
		||||
#define PS2_CLOCK_DDR   DDRF
 | 
			
		||||
							
								
								
									
										116
									
								
								ps2_usb/config_vusb.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								ps2_usb/config_vusb.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,116 @@
 | 
			
		|||
#ifndef CONFIG_H
 | 
			
		||||
#define CONFIG_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define VENDOR_ID       0xFEED
 | 
			
		||||
#define PRODUCT_ID      0x2233
 | 
			
		||||
// TODO: share these strings with usbconfig.h
 | 
			
		||||
// Edit usbconfig.h to change these.
 | 
			
		||||
#define MANUFACTURER    t.m.k.
 | 
			
		||||
#define PRODUCT         PS/2 keyboard converter
 | 
			
		||||
#define DESCRIPTION     convert PS/2 keyboard to USB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* matrix size */
 | 
			
		||||
#define MATRIX_ROWS 32  // keycode bit: 3-0
 | 
			
		||||
#define MATRIX_COLS 8   // keycode bit: 6-4
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* key combination for command */
 | 
			
		||||
#define IS_COMMAND() ( \
 | 
			
		||||
    keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) || \
 | 
			
		||||
    keyboard_report->mods == (BIT_LCTRL | BIT_RSHIFT) \
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* mouse keys */
 | 
			
		||||
#ifdef MOUSEKEY_ENABLE
 | 
			
		||||
#   define MOUSEKEY_DELAY_TIME 255
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* PS/2 lines */
 | 
			
		||||
#define PS2_CLOCK_PORT  PORTD
 | 
			
		||||
#define PS2_CLOCK_PIN   PIND
 | 
			
		||||
#define PS2_CLOCK_DDR   DDRD
 | 
			
		||||
#define PS2_CLOCK_BIT   4
 | 
			
		||||
#define PS2_DATA_PORT   PORTD
 | 
			
		||||
#define PS2_DATA_PIN    PIND
 | 
			
		||||
#define PS2_DATA_DDR    DDRD
 | 
			
		||||
#define PS2_DATA_BIT    0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Synchronous USART is used to receive data from keyboard.
 | 
			
		||||
// Use RXD pin for PS/2 DATA line and XCK for PS/2 CLOCK.
 | 
			
		||||
// NOTE: This is recomended strongly if you use V-USB library.
 | 
			
		||||
#define PS2_USE_USART
 | 
			
		||||
 | 
			
		||||
// External or Pin Change Interrupt is used to receive data from keyboard.
 | 
			
		||||
// Use INT1 or PCINTxx for PS/2 CLOCK line. see below.
 | 
			
		||||
//#define PS2_USE_INT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PS2_USE_USART
 | 
			
		||||
// synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge
 | 
			
		||||
// set DDR of CLOCK as input to be slave
 | 
			
		||||
#define PS2_USART_INIT() do {   \
 | 
			
		||||
    PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT);   \
 | 
			
		||||
    PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);     \
 | 
			
		||||
    UCSR0C = ((1 << UMSEL00) |  \
 | 
			
		||||
              (3 << UPM00)   |  \
 | 
			
		||||
              (0 << USBS0)   |  \
 | 
			
		||||
              (3 << UCSZ00)  |  \
 | 
			
		||||
              (0 << UCPOL0));   \
 | 
			
		||||
    UCSR0A = 0;                 \
 | 
			
		||||
    UBRR0H = 0;                 \
 | 
			
		||||
    UBRR0L = 0;                 \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_USART_RX_INT_ON() do {  \
 | 
			
		||||
    UCSR0B = ((1 << RXCIE0) |       \
 | 
			
		||||
              (1 << RXEN0));        \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_USART_RX_POLL_ON() do { \
 | 
			
		||||
    UCSR0B = (1 << RXEN0);          \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_USART_OFF() do {    \
 | 
			
		||||
    UCSR0C = 0;                 \
 | 
			
		||||
    UCSR0B &= ~((1 << RXEN0) |  \
 | 
			
		||||
                (1 << TXEN0));  \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_USART_RX_READY      (UCSR0A & (1<<RXC0))
 | 
			
		||||
#define PS2_USART_RX_DATA       UDR0
 | 
			
		||||
#define PS2_USART_ERROR         (UCSR0A & ((1<<FE0) | (1<<DOR0) | (1<<UPE0)))
 | 
			
		||||
#define PS2_USART_RX_VECT       USART_RX_vect
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PS2_USE_INT
 | 
			
		||||
/* INT1
 | 
			
		||||
#define PS2_INT_INIT()  do {    \
 | 
			
		||||
    EICRA |= ((1<<ISC11) |      \
 | 
			
		||||
              (0<<ISC10));      \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_INT_ON()  do {      \
 | 
			
		||||
    EIMSK |= (1<<INT1);         \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_INT_OFF() do {      \
 | 
			
		||||
    EIMSK &= ~(1<<INT1);        \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_INT_VECT    INT1_vect
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* PCINT20 */
 | 
			
		||||
#define PS2_INT_INIT()  do {    \
 | 
			
		||||
    PCICR  |= (1<<PCIE2);       \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_INT_ON()  do {      \
 | 
			
		||||
    PCMSK2 |= (1<<PCINT20);     \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_INT_OFF() do {      \
 | 
			
		||||
    PCMSK2 &= ~(1<<PCINT20);    \
 | 
			
		||||
    PCICR  &= ~(1<<PCIE2);      \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define PS2_INT_VECT    PCINT2_vect
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -4,12 +4,11 @@
 | 
			
		|||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <avr/pgmspace.h>
 | 
			
		||||
#include "usb_keyboard.h"
 | 
			
		||||
#include "usb_keycodes.h"
 | 
			
		||||
#include "print.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "keymap_skel.h"
 | 
			
		||||
#include "keymap.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
 | 
			
		||||
| 
						 | 
				
			
			@ -181,9 +180,3 @@ uint8_t keymap_fn_keycode(uint8_t fn_bits)
 | 
			
		|||
{
 | 
			
		||||
    return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// define a condition to enter special function mode
 | 
			
		||||
bool keymap_is_special_mode(uint8_t fn_bits)
 | 
			
		||||
{
 | 
			
		||||
    return usb_keyboard_mods == (BIT_LSHIFT | BIT_RSHIFT) || usb_keyboard_mods == (BIT_LCTRL | BIT_RSHIFT);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								ps2_usb/led.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								ps2_usb/led.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
#include "stdint.h"
 | 
			
		||||
#include "ps2.h"
 | 
			
		||||
#include "led.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void led_set(uint8_t usb_led)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ps2_led = 0;
 | 
			
		||||
    if (usb_led &  (1<<USB_LED_SCROLL_LOCK))
 | 
			
		||||
        ps2_led |= (1<<PS2_LED_SCROLL_LOCK);
 | 
			
		||||
    if (usb_led &  (1<<USB_LED_NUM_LOCK))
 | 
			
		||||
        ps2_led |= (1<<PS2_LED_NUM_LOCK);
 | 
			
		||||
    if (usb_led &  (1<<USB_LED_CAPS_LOCK))
 | 
			
		||||
        ps2_led |= (1<<PS2_LED_CAPS_LOCK);
 | 
			
		||||
    ps2_host_set_led(ps2_led);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										62
									
								
								ps2_usb/main_vusb.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								ps2_usb/main_vusb.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
/* PS/2 to USB keyboard converter
 | 
			
		||||
 * 2011/02/20
 | 
			
		||||
 * Copyright (c) 2011 tmk
 | 
			
		||||
 */
 | 
			
		||||
/* Name: main.c
 | 
			
		||||
 * Project: hid-mouse, a very simple HID example
 | 
			
		||||
 * Author: Christian Starkjohann
 | 
			
		||||
 * Creation Date: 2008-04-07
 | 
			
		||||
 * Tabsize: 4
 | 
			
		||||
 * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
 | 
			
		||||
 * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
 | 
			
		||||
 * This Revision: $Id: main.c 790 2010-05-30 21:00:26Z cs $
 | 
			
		||||
 */
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <avr/wdt.h>
 | 
			
		||||
#include <avr/interrupt.h>
 | 
			
		||||
#include <util/delay.h>
 | 
			
		||||
#include "usbdrv.h"
 | 
			
		||||
#include "oddebug.h"
 | 
			
		||||
#include "host_vusb.h"
 | 
			
		||||
#include "keyboard.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
#define DEBUGP_INIT() do { DDRC = 0xFF; } while (0)
 | 
			
		||||
#define DEBUGP(x) do { PORTC = x; } while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define DEBUGP_INIT()
 | 
			
		||||
#define DEBUGP(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
    DEBUGP_INIT();
 | 
			
		||||
    wdt_enable(WDTO_1S);
 | 
			
		||||
    odDebugInit();
 | 
			
		||||
    usbInit();
 | 
			
		||||
 | 
			
		||||
    /* enforce re-enumeration, do this while interrupts are disabled! */
 | 
			
		||||
    usbDeviceDisconnect();
 | 
			
		||||
    uint8_t i = 0;
 | 
			
		||||
    /* fake USB disconnect for > 250 ms */
 | 
			
		||||
    while(--i){
 | 
			
		||||
        wdt_reset();
 | 
			
		||||
        _delay_ms(1);
 | 
			
		||||
    }
 | 
			
		||||
    usbDeviceConnect();
 | 
			
		||||
 | 
			
		||||
    keyboard_init();
 | 
			
		||||
 | 
			
		||||
    sei();
 | 
			
		||||
    while (1) {
 | 
			
		||||
        DEBUGP(0x1);
 | 
			
		||||
        wdt_reset();
 | 
			
		||||
        usbPoll();
 | 
			
		||||
        DEBUGP(0x2);
 | 
			
		||||
        keyboard_proc();
 | 
			
		||||
        DEBUGP(0x3);
 | 
			
		||||
        host_vusb_keyboard_send();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -9,8 +9,7 @@
 | 
			
		|||
#include "util.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "ps2.h"
 | 
			
		||||
#include "usb_keyboard.h"
 | 
			
		||||
#include "matrix_skel.h"
 | 
			
		||||
#include "matrix.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if (MATRIX_COLS > 16)
 | 
			
		||||
| 
						 | 
				
			
			@ -60,8 +59,6 @@ static bool matrix_has_ghost_in_row(uint8_t row);
 | 
			
		|||
#endif
 | 
			
		||||
static void matrix_make(uint8_t code);
 | 
			
		||||
static void matrix_break(uint8_t code);
 | 
			
		||||
static void ps2_reset(void);
 | 
			
		||||
static void ps2_set_leds(uint8_t leds);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
| 
						 | 
				
			
			@ -78,20 +75,8 @@ uint8_t matrix_cols(void)
 | 
			
		|||
 | 
			
		||||
void matrix_init(void)
 | 
			
		||||
{
 | 
			
		||||
    print_enable = true;
 | 
			
		||||
    ps2_host_init();
 | 
			
		||||
 | 
			
		||||
    ps2_reset();
 | 
			
		||||
 | 
			
		||||
    // flush LEDs
 | 
			
		||||
    ps2_set_leds(1<<PS2_LED_NUM_LOCK);
 | 
			
		||||
    _delay_ms(100);
 | 
			
		||||
    ps2_set_leds(1<<PS2_LED_NUM_LOCK|1<<PS2_LED_CAPS_LOCK);
 | 
			
		||||
    _delay_ms(100);
 | 
			
		||||
    ps2_set_leds(1<<PS2_LED_NUM_LOCK|1<<PS2_LED_CAPS_LOCK|1<<PS2_LED_SCROLL_LOCK);
 | 
			
		||||
    _delay_ms(300);
 | 
			
		||||
    ps2_set_leds(0x00);
 | 
			
		||||
    
 | 
			
		||||
    // initialize matrix state: all keys off
 | 
			
		||||
    for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -191,7 +176,6 @@ uint8_t matrix_scan(void)
 | 
			
		|||
 | 
			
		||||
    uint8_t code;
 | 
			
		||||
    while ((code = ps2_host_recv())) {
 | 
			
		||||
debug_hex(code); debug(" ");
 | 
			
		||||
        switch (state) {
 | 
			
		||||
            case INIT:
 | 
			
		||||
                switch (code) {
 | 
			
		||||
| 
						 | 
				
			
			@ -349,22 +333,6 @@ debug_hex(code); debug(" ");
 | 
			
		|||
                state = INIT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // handle LED indicators
 | 
			
		||||
    static uint8_t prev_leds = 0;
 | 
			
		||||
    if (prev_leds != usb_keyboard_leds) {
 | 
			
		||||
        uint8_t leds = 0;
 | 
			
		||||
        if (usb_keyboard_leds&(1<<USB_LED_SCROLL_LOCK))
 | 
			
		||||
            leds |= (1<<PS2_LED_SCROLL_LOCK);
 | 
			
		||||
        if (usb_keyboard_leds&(1<<USB_LED_NUM_LOCK))
 | 
			
		||||
            leds |= (1<<PS2_LED_NUM_LOCK);
 | 
			
		||||
        if (usb_keyboard_leds&(1<<USB_LED_CAPS_LOCK))
 | 
			
		||||
            leds |= (1<<PS2_LED_CAPS_LOCK);
 | 
			
		||||
 | 
			
		||||
        ps2_set_leds(leds);
 | 
			
		||||
        prev_leds = usb_keyboard_leds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -472,19 +440,3 @@ static void matrix_break(uint8_t code)
 | 
			
		|||
        is_modified = true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ps2_reset(void)
 | 
			
		||||
{
 | 
			
		||||
    ps2_host_send(0xFF);
 | 
			
		||||
    ps2_host_recv(); // 0xFA
 | 
			
		||||
    ps2_host_recv(); // 0xAA
 | 
			
		||||
    _delay_ms(1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ps2_set_leds(uint8_t leds)
 | 
			
		||||
{
 | 
			
		||||
        ps2_host_send(0xED);
 | 
			
		||||
        ps2_host_recv();        // 0xFA
 | 
			
		||||
        ps2_host_send(leds);
 | 
			
		||||
        ps2_host_recv();        // 0xFA
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										325
									
								
								ps2_usb/ps2_usart.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								ps2_usb/ps2_usart.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,325 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright (c) 2010,2011 Jun WAKO <wakojun@gmail.com>
 | 
			
		||||
 | 
			
		||||
This software is licensed with a Modified BSD License.
 | 
			
		||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
 | 
			
		||||
GPL-compatible, and OK to use in both free and proprietary applications.
 | 
			
		||||
Additions and corrections to this file are welcome.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
* Redistributions of source code must retain the above copyright
 | 
			
		||||
  notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 | 
			
		||||
* Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
  notice, this list of conditions and the following disclaimer in
 | 
			
		||||
  the documentation and/or other materials provided with the
 | 
			
		||||
  distribution.
 | 
			
		||||
 | 
			
		||||
* Neither the name of the copyright holders nor the names of
 | 
			
		||||
  contributors may be used to endorse or promote products derived
 | 
			
		||||
  from this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
*/
 | 
			
		||||
/*
 | 
			
		||||
Primitive PS/2 Library for AVR
 | 
			
		||||
==============================
 | 
			
		||||
Host side is only supported now.
 | 
			
		||||
Synchronous USART is used to receive data by hardware process
 | 
			
		||||
rather than interrupt. During V-USB interrupt runs, CLOCK interrupt
 | 
			
		||||
cannot interpose. In the result it is prone to lost CLOCK edge.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I/O control
 | 
			
		||||
-----------
 | 
			
		||||
High state is asserted by internal pull-up.
 | 
			
		||||
If you have a signaling problem, you may need to have
 | 
			
		||||
external pull-up resisters on CLOCK and DATA line.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PS/2 References
 | 
			
		||||
---------------
 | 
			
		||||
http://www.computer-engineering.org/ps2protocol/
 | 
			
		||||
http://www.mcamafia.de/pdf/ibm_hitrc07.pdf
 | 
			
		||||
*/
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
#include <avr/interrupt.h>
 | 
			
		||||
#include <util/delay.h>
 | 
			
		||||
#include "ps2.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
#define DEBUGP_INIT() do { DDRC = 0xFF; } while (0)
 | 
			
		||||
#define DEBUGP(x) do { PORTC = x; } while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define DEBUGP_INIT()
 | 
			
		||||
#define DEBUGP(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define WAIT(stat, us, err) do { \
 | 
			
		||||
    if (!wait_##stat(us)) { \
 | 
			
		||||
        ps2_error = err; \
 | 
			
		||||
        goto ERROR; \
 | 
			
		||||
    } \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t ps2_error = PS2_ERR_NONE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline void clock_lo(void);
 | 
			
		||||
static inline void clock_hi(void);
 | 
			
		||||
static inline bool clock_in(void);
 | 
			
		||||
static inline void data_lo(void);
 | 
			
		||||
static inline void data_hi(void);
 | 
			
		||||
static inline bool data_in(void);
 | 
			
		||||
static inline uint16_t wait_clock_lo(uint16_t us);
 | 
			
		||||
static inline uint16_t wait_clock_hi(uint16_t us);
 | 
			
		||||
static inline uint16_t wait_data_lo(uint16_t us);
 | 
			
		||||
static inline uint16_t wait_data_hi(uint16_t us);
 | 
			
		||||
static inline void idle(void);
 | 
			
		||||
static inline void inhibit(void);
 | 
			
		||||
#if defined PS2_USE_INT || defined PS2_USE_USART
 | 
			
		||||
static inline uint8_t pbuf_dequeue(void);
 | 
			
		||||
static inline void pbuf_enqueue(uint8_t data);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ps2_host_init(void)
 | 
			
		||||
{
 | 
			
		||||
    DEBUGP_INIT();
 | 
			
		||||
    DEBUGP(0x1);
 | 
			
		||||
    idle();
 | 
			
		||||
    PS2_USART_INIT();
 | 
			
		||||
    PS2_USART_RX_INT_ON();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t ps2_host_send(uint8_t data)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t res = 0;
 | 
			
		||||
    bool parity = true;
 | 
			
		||||
    ps2_error = PS2_ERR_NONE;
 | 
			
		||||
 | 
			
		||||
    DEBUGP(0x6);
 | 
			
		||||
    PS2_USART_OFF();
 | 
			
		||||
 | 
			
		||||
    /* terminate a transmission if we have */
 | 
			
		||||
    inhibit();
 | 
			
		||||
    _delay_us(100);
 | 
			
		||||
 | 
			
		||||
    /* start bit [1] */
 | 
			
		||||
    data_lo();
 | 
			
		||||
    clock_hi();
 | 
			
		||||
    WAIT(clock_lo, 15000, 1);
 | 
			
		||||
    /* data [2-9] */
 | 
			
		||||
    for (uint8_t i = 0; i < 8; i++) {
 | 
			
		||||
        _delay_us(15);
 | 
			
		||||
        if (data&(1<<i)) {
 | 
			
		||||
            parity = !parity;
 | 
			
		||||
            data_hi();
 | 
			
		||||
        } else {
 | 
			
		||||
            data_lo();
 | 
			
		||||
        }
 | 
			
		||||
        WAIT(clock_hi, 50, 2);
 | 
			
		||||
        WAIT(clock_lo, 50, 3);
 | 
			
		||||
    }
 | 
			
		||||
    /* parity [10] */
 | 
			
		||||
    _delay_us(15);
 | 
			
		||||
    if (parity) { data_hi(); } else { data_lo(); }
 | 
			
		||||
    WAIT(clock_hi, 50, 4);
 | 
			
		||||
    WAIT(clock_lo, 50, 5);
 | 
			
		||||
    /* stop bit [11] */
 | 
			
		||||
    _delay_us(15);
 | 
			
		||||
    data_hi();
 | 
			
		||||
    /* ack [12] */
 | 
			
		||||
    WAIT(data_lo, 50, 6);
 | 
			
		||||
    WAIT(clock_lo, 50, 7);
 | 
			
		||||
 | 
			
		||||
    /* wait for idle state */
 | 
			
		||||
    WAIT(clock_hi, 50, 8);
 | 
			
		||||
    WAIT(data_hi, 50, 9);
 | 
			
		||||
 | 
			
		||||
    res = ps2_host_recv_response();
 | 
			
		||||
ERROR:
 | 
			
		||||
    idle();
 | 
			
		||||
    PS2_USART_INIT();
 | 
			
		||||
    PS2_USART_RX_INT_ON();
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Do polling data from keyboard to get response to last command.
 | 
			
		||||
uint8_t ps2_host_recv_response(void)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t data = 0;
 | 
			
		||||
    PS2_USART_INIT();
 | 
			
		||||
    PS2_USART_RX_POLL_ON();
 | 
			
		||||
    while (!PS2_USART_RX_READY)
 | 
			
		||||
        ;
 | 
			
		||||
    data = PS2_USART_RX_DATA;
 | 
			
		||||
    PS2_USART_OFF();
 | 
			
		||||
    DEBUGP(0x9);
 | 
			
		||||
    return data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t ps2_host_recv(void)
 | 
			
		||||
{
 | 
			
		||||
    return pbuf_dequeue();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISR(PS2_USART_RX_VECT)
 | 
			
		||||
{
 | 
			
		||||
    DEBUGP(0x7);
 | 
			
		||||
    uint8_t error = PS2_USART_ERROR;
 | 
			
		||||
    uint8_t data = PS2_USART_RX_DATA;
 | 
			
		||||
    if (error) {
 | 
			
		||||
        DEBUGP(error>>2);
 | 
			
		||||
    } else {
 | 
			
		||||
        pbuf_enqueue(data);
 | 
			
		||||
    }
 | 
			
		||||
    DEBUGP(0x8);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* send LED state to keyboard */
 | 
			
		||||
void ps2_host_set_led(uint8_t led)
 | 
			
		||||
{
 | 
			
		||||
    // send 0xED then keyboard keeps waiting for next LED data
 | 
			
		||||
    // and keyboard does not send any scan codes during waiting.
 | 
			
		||||
    // If fail to send LED data keyboard looks like being freezed.
 | 
			
		||||
    uint8_t retry = 3;
 | 
			
		||||
    while (retry-- && ps2_host_send(PS2_SET_LED) != PS2_ACK)
 | 
			
		||||
        ;
 | 
			
		||||
    retry = 3;
 | 
			
		||||
    while (retry-- && ps2_host_send(led) != PS2_ACK)
 | 
			
		||||
        ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------
 | 
			
		||||
 * static functions
 | 
			
		||||
 *------------------------------------------------------------------*/
 | 
			
		||||
static inline void clock_lo()
 | 
			
		||||
{
 | 
			
		||||
    PS2_CLOCK_PORT &= ~(1<<PS2_CLOCK_BIT);
 | 
			
		||||
    PS2_CLOCK_DDR  |=  (1<<PS2_CLOCK_BIT);
 | 
			
		||||
}
 | 
			
		||||
static inline void clock_hi()
 | 
			
		||||
{
 | 
			
		||||
    /* input with pull up */
 | 
			
		||||
    PS2_CLOCK_DDR  &= ~(1<<PS2_CLOCK_BIT);
 | 
			
		||||
    PS2_CLOCK_PORT |=  (1<<PS2_CLOCK_BIT);
 | 
			
		||||
}
 | 
			
		||||
static inline bool clock_in()
 | 
			
		||||
{
 | 
			
		||||
    PS2_CLOCK_DDR  &= ~(1<<PS2_CLOCK_BIT);
 | 
			
		||||
    PS2_CLOCK_PORT |=  (1<<PS2_CLOCK_BIT);
 | 
			
		||||
    _delay_us(1);
 | 
			
		||||
    return PS2_CLOCK_PIN&(1<<PS2_CLOCK_BIT);
 | 
			
		||||
}
 | 
			
		||||
static inline void data_lo()
 | 
			
		||||
{
 | 
			
		||||
    PS2_DATA_PORT &= ~(1<<PS2_DATA_BIT);
 | 
			
		||||
    PS2_DATA_DDR  |=  (1<<PS2_DATA_BIT);
 | 
			
		||||
}
 | 
			
		||||
static inline void data_hi()
 | 
			
		||||
{
 | 
			
		||||
    /* input with pull up */
 | 
			
		||||
    PS2_DATA_DDR  &= ~(1<<PS2_DATA_BIT);
 | 
			
		||||
    PS2_DATA_PORT |=  (1<<PS2_DATA_BIT);
 | 
			
		||||
}
 | 
			
		||||
static inline bool data_in()
 | 
			
		||||
{
 | 
			
		||||
    PS2_DATA_DDR  &= ~(1<<PS2_DATA_BIT);
 | 
			
		||||
    PS2_DATA_PORT |=  (1<<PS2_DATA_BIT);
 | 
			
		||||
    _delay_us(1);
 | 
			
		||||
    return PS2_DATA_PIN&(1<<PS2_DATA_BIT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint16_t wait_clock_lo(uint16_t us)
 | 
			
		||||
{
 | 
			
		||||
    while (clock_in()  && us) { asm(""); _delay_us(1); us--; }
 | 
			
		||||
    return us;
 | 
			
		||||
}
 | 
			
		||||
static inline uint16_t wait_clock_hi(uint16_t us)
 | 
			
		||||
{
 | 
			
		||||
    while (!clock_in() && us) { asm(""); _delay_us(1); us--; }
 | 
			
		||||
    return us;
 | 
			
		||||
}
 | 
			
		||||
static inline uint16_t wait_data_lo(uint16_t us)
 | 
			
		||||
{
 | 
			
		||||
    while (data_in() && us)  { asm(""); _delay_us(1); us--; }
 | 
			
		||||
    return us;
 | 
			
		||||
}
 | 
			
		||||
static inline uint16_t wait_data_hi(uint16_t us)
 | 
			
		||||
{
 | 
			
		||||
    while (!data_in() && us)  { asm(""); _delay_us(1); us--; }
 | 
			
		||||
    return us;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* idle state that device can send */
 | 
			
		||||
static inline void idle(void)
 | 
			
		||||
{
 | 
			
		||||
    clock_hi();
 | 
			
		||||
    data_hi();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* inhibit device to send */
 | 
			
		||||
static inline void inhibit(void)
 | 
			
		||||
{
 | 
			
		||||
    clock_lo();
 | 
			
		||||
    data_hi();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------
 | 
			
		||||
 * Ring buffer to store scan codes from keyboard
 | 
			
		||||
 *------------------------------------------------------------------*/
 | 
			
		||||
#define PBUF_SIZE 8
 | 
			
		||||
static uint8_t pbuf[PBUF_SIZE];
 | 
			
		||||
static uint8_t pbuf_head = 0;
 | 
			
		||||
static uint8_t pbuf_tail = 0;
 | 
			
		||||
static inline void pbuf_enqueue(uint8_t data)
 | 
			
		||||
{
 | 
			
		||||
    if (!data)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    uint8_t sreg = SREG;
 | 
			
		||||
    cli();
 | 
			
		||||
    uint8_t next = (pbuf_head + 1) % PBUF_SIZE;
 | 
			
		||||
    if (next != pbuf_tail) {
 | 
			
		||||
        pbuf[pbuf_head] = data;
 | 
			
		||||
        pbuf_head = next;
 | 
			
		||||
    } else {
 | 
			
		||||
        debug("pbuf: full\n");
 | 
			
		||||
    }
 | 
			
		||||
    SREG = sreg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint8_t pbuf_dequeue(void)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t val = 0;
 | 
			
		||||
 | 
			
		||||
    uint8_t sreg = SREG;
 | 
			
		||||
    cli();
 | 
			
		||||
    if (pbuf_head != pbuf_tail) {
 | 
			
		||||
        val = pbuf[pbuf_tail];
 | 
			
		||||
        pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE;
 | 
			
		||||
    }
 | 
			
		||||
    SREG = sreg;
 | 
			
		||||
 | 
			
		||||
    return val;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								ps2_usb/sendchar_dummy.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								ps2_usb/sendchar_dummy.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
#include <stdint.h>
 | 
			
		||||
#include "sendchar.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int8_t sendchar(uint8_t c)
 | 
			
		||||
{
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								ps2_usb/sendchar_usart.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ps2_usb/sendchar_usart.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
#include <stdint.h>
 | 
			
		||||
#include "oddebug.h"
 | 
			
		||||
#include "sendchar.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* from oddebug.h */
 | 
			
		||||
#if defined UBRR
 | 
			
		||||
#   define  ODDBG_UBRR  UBRR
 | 
			
		||||
#elif defined UBRRL
 | 
			
		||||
#   define  ODDBG_UBRR  UBRRL
 | 
			
		||||
#elif defined UBRR0
 | 
			
		||||
#   define  ODDBG_UBRR  UBRR0
 | 
			
		||||
#elif defined UBRR0L
 | 
			
		||||
#   define  ODDBG_UBRR  UBRR0L
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined UCR
 | 
			
		||||
#   define  ODDBG_UCR   UCR
 | 
			
		||||
#elif defined UCSRB
 | 
			
		||||
#   define  ODDBG_UCR   UCSRB
 | 
			
		||||
#elif defined UCSR0B
 | 
			
		||||
#   define  ODDBG_UCR   UCSR0B
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined TXEN
 | 
			
		||||
#   define  ODDBG_TXEN  TXEN
 | 
			
		||||
#else
 | 
			
		||||
#   define  ODDBG_TXEN  TXEN0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined USR
 | 
			
		||||
#   define  ODDBG_USR   USR
 | 
			
		||||
#elif defined UCSRA
 | 
			
		||||
#   define  ODDBG_USR   UCSRA
 | 
			
		||||
#elif defined UCSR0A
 | 
			
		||||
#   define  ODDBG_USR   UCSR0A
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined UDRE
 | 
			
		||||
#   define  ODDBG_UDRE  UDRE
 | 
			
		||||
#else
 | 
			
		||||
#   define  ODDBG_UDRE  UDRE0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined UDR
 | 
			
		||||
#   define  ODDBG_UDR   UDR
 | 
			
		||||
#elif defined UDR0
 | 
			
		||||
#   define  ODDBG_UDR   UDR0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* from oddebug.c */
 | 
			
		||||
int8_t sendchar(uint8_t c)
 | 
			
		||||
{
 | 
			
		||||
    while(!(ODDBG_USR & (1 << ODDBG_UDRE)));    /* wait for data register empty */
 | 
			
		||||
    ODDBG_UDR = c;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										378
									
								
								ps2_usb/usbconfig.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										378
									
								
								ps2_usb/usbconfig.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,378 @@
 | 
			
		|||
/* Name: usbconfig.h
 | 
			
		||||
 * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
 | 
			
		||||
 * Author: Christian Starkjohann
 | 
			
		||||
 * Creation Date: 2005-04-01
 | 
			
		||||
 * Tabsize: 4
 | 
			
		||||
 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
 | 
			
		||||
 * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
 | 
			
		||||
 * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __usbconfig_h_included__
 | 
			
		||||
#define __usbconfig_h_included__
 | 
			
		||||
 | 
			
		||||
#include "config_vusb.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
General Description:
 | 
			
		||||
This file is an example configuration (with inline documentation) for the USB
 | 
			
		||||
driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
 | 
			
		||||
also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
 | 
			
		||||
wire the lines to any other port, as long as D+ is also wired to INT0 (or any
 | 
			
		||||
other hardware interrupt, as long as it is the highest level interrupt, see
 | 
			
		||||
section at the end of this file).
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* ---------------------------- Hardware Config ---------------------------- */
 | 
			
		||||
 | 
			
		||||
#define USB_CFG_IOPORTNAME      D
 | 
			
		||||
/* This is the port where the USB bus is connected. When you configure it to
 | 
			
		||||
 * "B", the registers PORTB, PINB and DDRB will be used.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DMINUS_BIT      3
 | 
			
		||||
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 | 
			
		||||
 * This may be any bit in the port.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DPLUS_BIT       2
 | 
			
		||||
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 | 
			
		||||
 * This may be any bit in the port. Please note that D+ must also be connected
 | 
			
		||||
 * to interrupt pin INT0! [You can also use other interrupts, see section
 | 
			
		||||
 * "Optional MCU Description" below, or you can connect D- to the interrupt, as
 | 
			
		||||
 * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
 | 
			
		||||
 * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
 | 
			
		||||
 * markers every millisecond.]
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_CLOCK_KHZ       (F_CPU/1000)
 | 
			
		||||
/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
 | 
			
		||||
 * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
 | 
			
		||||
 * require no crystal, they tolerate +/- 1% deviation from the nominal
 | 
			
		||||
 * frequency. All other rates require a precision of 2000 ppm and thus a
 | 
			
		||||
 * crystal!
 | 
			
		||||
 * Since F_CPU should be defined to your actual clock rate anyway, you should
 | 
			
		||||
 * not need to modify this setting.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_CHECK_CRC       0
 | 
			
		||||
/* Define this to 1 if you want that the driver checks integrity of incoming
 | 
			
		||||
 * data packets (CRC checks). CRC checks cost quite a bit of code size and are
 | 
			
		||||
 * currently only available for 18 MHz crystal clock. You must choose
 | 
			
		||||
 * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* ----------------------- Optional Hardware Config ------------------------ */
 | 
			
		||||
 | 
			
		||||
/* #define USB_CFG_PULLUP_IOPORTNAME   D */
 | 
			
		||||
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
 | 
			
		||||
 * V+, you can connect and disconnect the device from firmware by calling
 | 
			
		||||
 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
 | 
			
		||||
 * This constant defines the port on which the pullup resistor is connected.
 | 
			
		||||
 */
 | 
			
		||||
/* #define USB_CFG_PULLUP_BIT          4 */
 | 
			
		||||
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 | 
			
		||||
 * above) where the 1.5k pullup resistor is connected. See description
 | 
			
		||||
 * above for details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* --------------------------- Functional Range ---------------------------- */
 | 
			
		||||
 | 
			
		||||
#define USB_CFG_HAVE_INTRIN_ENDPOINT    1
 | 
			
		||||
/* Define this to 1 if you want to compile a version with two endpoints: The
 | 
			
		||||
 * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
 | 
			
		||||
 * number).
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_HAVE_INTRIN_ENDPOINT3   1
 | 
			
		||||
/* Define this to 1 if you want to compile a version with three endpoints: The
 | 
			
		||||
 * default control endpoint 0, an interrupt-in endpoint 3 (or the number
 | 
			
		||||
 * configured below) and a catch-all default interrupt-in endpoint as above.
 | 
			
		||||
 * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_EP3_NUMBER              3
 | 
			
		||||
/* If the so-called endpoint 3 is used, it can now be configured to any other
 | 
			
		||||
 * endpoint number (except 0) with this macro. Default if undefined is 3.
 | 
			
		||||
 */
 | 
			
		||||
/* #define USB_INITIAL_DATATOKEN           USBPID_DATA1 */
 | 
			
		||||
/* The above macro defines the startup condition for data toggling on the
 | 
			
		||||
 * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
 | 
			
		||||
 * Since the token is toggled BEFORE sending any data, the first packet is
 | 
			
		||||
 * sent with the oposite value of this configuration!
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_IMPLEMENT_HALT          0
 | 
			
		||||
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
 | 
			
		||||
 * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
 | 
			
		||||
 * it is required by the standard. We have made it a config option because it
 | 
			
		||||
 * bloats the code considerably.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_SUPPRESS_INTR_CODE      0
 | 
			
		||||
/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
 | 
			
		||||
 * want to send any data over them. If this macro is defined to 1, functions
 | 
			
		||||
 * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
 | 
			
		||||
 * you need the interrupt-in endpoints in order to comply to an interface
 | 
			
		||||
 * (e.g. HID), but never want to send any data. This option saves a couple
 | 
			
		||||
 * of bytes in flash memory and the transmit buffers in RAM.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_INTR_POLL_INTERVAL      10
 | 
			
		||||
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
 | 
			
		||||
 * interval. The value is in milliseconds and must not be less than 10 ms for
 | 
			
		||||
 * low speed devices.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_IS_SELF_POWERED         0
 | 
			
		||||
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
 | 
			
		||||
 * device is powered from the USB bus.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_MAX_BUS_POWER           100
 | 
			
		||||
/* Set this variable to the maximum USB bus power consumption of your device.
 | 
			
		||||
 * The value is in milliamperes. [It will be divided by two since USB
 | 
			
		||||
 * communicates power requirements in units of 2 mA.]
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_IMPLEMENT_FN_WRITE      1
 | 
			
		||||
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
 | 
			
		||||
 * transfers. Set it to 0 if you don't need it and want to save a couple of
 | 
			
		||||
 * bytes.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_IMPLEMENT_FN_READ       0
 | 
			
		||||
/* Set this to 1 if you need to send control replies which are generated
 | 
			
		||||
 * "on the fly" when usbFunctionRead() is called. If you only want to send
 | 
			
		||||
 * data from a static buffer, set it to 0 and return the data from
 | 
			
		||||
 * usbFunctionSetup(). This saves a couple of bytes.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_IMPLEMENT_FN_WRITEOUT   0
 | 
			
		||||
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
 | 
			
		||||
 * You must implement the function usbFunctionWriteOut() which receives all
 | 
			
		||||
 * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
 | 
			
		||||
 * can be found in 'usbRxToken'.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_HAVE_FLOWCONTROL        0
 | 
			
		||||
/* Define this to 1 if you want flowcontrol over USB data. See the definition
 | 
			
		||||
 * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
 | 
			
		||||
 * usbdrv.h.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DRIVER_FLASH_PAGE       0
 | 
			
		||||
/* If the device has more than 64 kBytes of flash, define this to the 64 k page
 | 
			
		||||
 * where the driver's constants (descriptors) are located. Or in other words:
 | 
			
		||||
 * Define this to 1 for boot loaders on the ATMega128.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_LONG_TRANSFERS          0
 | 
			
		||||
/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
 | 
			
		||||
 * in a single control-in or control-out transfer. Note that the capability
 | 
			
		||||
 * for long transfers increases the driver size.
 | 
			
		||||
 */
 | 
			
		||||
/* #define USB_RX_USER_HOOK(data, len)     if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
 | 
			
		||||
/* This macro is a hook if you want to do unconventional things. If it is
 | 
			
		||||
 * defined, it's inserted at the beginning of received message processing.
 | 
			
		||||
 * If you eat the received message and don't want default processing to
 | 
			
		||||
 * proceed, do a return after doing your things. One possible application
 | 
			
		||||
 * (besides debugging) is to flash a status LED on each packet.
 | 
			
		||||
 */
 | 
			
		||||
/* #define USB_RESET_HOOK(resetStarts)     if(!resetStarts){hadUsbReset();} */
 | 
			
		||||
/* This macro is a hook if you need to know when an USB RESET occurs. It has
 | 
			
		||||
 * one parameter which distinguishes between the start of RESET state and its
 | 
			
		||||
 * end.
 | 
			
		||||
 */
 | 
			
		||||
/* #define USB_SET_ADDRESS_HOOK()              hadAddressAssigned(); */
 | 
			
		||||
/* This macro (if defined) is executed when a USB SET_ADDRESS request was
 | 
			
		||||
 * received.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_COUNT_SOF                   0
 | 
			
		||||
/* define this macro to 1 if you need the global variable "usbSofCount" which
 | 
			
		||||
 * counts SOF packets. This feature requires that the hardware interrupt is
 | 
			
		||||
 * connected to D- instead of D+.
 | 
			
		||||
 */
 | 
			
		||||
/* #ifdef __ASSEMBLER__
 | 
			
		||||
 * macro myAssemblerMacro
 | 
			
		||||
 *     in      YL, TCNT0
 | 
			
		||||
 *     sts     timer0Snapshot, YL
 | 
			
		||||
 *     endm
 | 
			
		||||
 * #endif
 | 
			
		||||
 * #define USB_SOF_HOOK                    myAssemblerMacro
 | 
			
		||||
 * This macro (if defined) is executed in the assembler module when a
 | 
			
		||||
 * Start Of Frame condition is detected. It is recommended to define it to
 | 
			
		||||
 * the name of an assembler macro which is defined here as well so that more
 | 
			
		||||
 * than one assembler instruction can be used. The macro may use the register
 | 
			
		||||
 * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
 | 
			
		||||
 * immediately after an SOF pulse may be lost and must be retried by the host.
 | 
			
		||||
 * What can you do with this hook? Since the SOF signal occurs exactly every
 | 
			
		||||
 * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
 | 
			
		||||
 * designs running on the internal RC oscillator.
 | 
			
		||||
 * Please note that Start Of Frame detection works only if D- is wired to the
 | 
			
		||||
 * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_CHECK_DATA_TOGGLING     0
 | 
			
		||||
/* define this macro to 1 if you want to filter out duplicate data packets
 | 
			
		||||
 * sent by the host. Duplicates occur only as a consequence of communication
 | 
			
		||||
 * errors, when the host does not receive an ACK. Please note that you need to
 | 
			
		||||
 * implement the filtering yourself in usbFunctionWriteOut() and
 | 
			
		||||
 * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
 | 
			
		||||
 * for each control- and out-endpoint to check for duplicate packets.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH   0
 | 
			
		||||
/* define this macro to 1 if you want the function usbMeasureFrameLength()
 | 
			
		||||
 * compiled in. This function can be used to calibrate the AVR's RC oscillator.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_USE_FAST_CRC                0
 | 
			
		||||
/* The assembler module has two implementations for the CRC algorithm. One is
 | 
			
		||||
 * faster, the other is smaller. This CRC routine is only used for transmitted
 | 
			
		||||
 * messages where timing is not critical. The faster routine needs 31 cycles
 | 
			
		||||
 * per byte while the smaller one needs 61 to 69 cycles. The faster routine
 | 
			
		||||
 * may be worth the 32 bytes bigger code size if you transmit lots of data and
 | 
			
		||||
 * run the AVR close to its limit.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* -------------------------- Device Description --------------------------- */
 | 
			
		||||
 | 
			
		||||
#define USB_CFG_VENDOR_ID       (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
 | 
			
		||||
/* USB vendor ID for the device, low byte first. If you have registered your
 | 
			
		||||
 * own Vendor ID, define it here. Otherwise you may use one of obdev's free
 | 
			
		||||
 * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
 | 
			
		||||
 * *** IMPORTANT NOTE ***
 | 
			
		||||
 * This template uses obdev's shared VID/PID pair for Vendor Class devices
 | 
			
		||||
 * with libusb: 0x16c0/0x5dc.  Use this VID/PID pair ONLY if you understand
 | 
			
		||||
 * the implications!
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DEVICE_ID       (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
 | 
			
		||||
/* This is the ID of the product, low byte first. It is interpreted in the
 | 
			
		||||
 * scope of the vendor ID. If you have registered your own VID with usb.org
 | 
			
		||||
 * or if you have licensed a PID from somebody else, define it here. Otherwise
 | 
			
		||||
 * you may use one of obdev's free shared VID/PID pairs. See the file
 | 
			
		||||
 * USB-IDs-for-free.txt for details!
 | 
			
		||||
 * *** IMPORTANT NOTE ***
 | 
			
		||||
 * This template uses obdev's shared VID/PID pair for Vendor Class devices
 | 
			
		||||
 * with libusb: 0x16c0/0x5dc.  Use this VID/PID pair ONLY if you understand
 | 
			
		||||
 * the implications!
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DEVICE_VERSION  0x00, 0x01
 | 
			
		||||
/* Version number of the device: Minor number first, then major number.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_VENDOR_NAME     't', '.', 'm', '.', 'k', '.'
 | 
			
		||||
#define USB_CFG_VENDOR_NAME_LEN 6
 | 
			
		||||
/* These two values define the vendor name returned by the USB device. The name
 | 
			
		||||
 * must be given as a list of characters under single quotes. The characters
 | 
			
		||||
 * are interpreted as Unicode (UTF-16) entities.
 | 
			
		||||
 * If you don't want a vendor name string, undefine these macros.
 | 
			
		||||
 * ALWAYS define a vendor name containing your Internet domain name if you use
 | 
			
		||||
 * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
 | 
			
		||||
 * details.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DEVICE_NAME     'P', 'S', '/', '2', ' ', 'k', 'e', 'y', 'b', 'o', 'a', 'r', 'd', ' ', 'c', 'o', 'n', 'v', 'e', 'r', 't', 'e', 'r'
 | 
			
		||||
#define USB_CFG_DEVICE_NAME_LEN 23
 | 
			
		||||
/* Same as above for the device name. If you don't want a device name, undefine
 | 
			
		||||
 * the macros. See the file USB-IDs-for-free.txt before you assign a name if
 | 
			
		||||
 * you use a shared VID/PID.
 | 
			
		||||
 */
 | 
			
		||||
/*#define USB_CFG_SERIAL_NUMBER   'N', 'o', 'n', 'e' */
 | 
			
		||||
/*#define USB_CFG_SERIAL_NUMBER_LEN   0 */
 | 
			
		||||
/* Same as above for the serial number. If you don't want a serial number,
 | 
			
		||||
 * undefine the macros.
 | 
			
		||||
 * It may be useful to provide the serial number through other means than at
 | 
			
		||||
 * compile time. See the section about descriptor properties below for how
 | 
			
		||||
 * to fine tune control over USB descriptors such as the string descriptor
 | 
			
		||||
 * for the serial number.
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_DEVICE_CLASS        0
 | 
			
		||||
#define USB_CFG_DEVICE_SUBCLASS     0
 | 
			
		||||
/* See USB specification if you want to conform to an existing device class.
 | 
			
		||||
 * Class 0xff is "vendor specific".
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_INTERFACE_CLASS     3   /* HID */
 | 
			
		||||
#define USB_CFG_INTERFACE_SUBCLASS  1   /* Boot */
 | 
			
		||||
#define USB_CFG_INTERFACE_PROTOCOL  1   /* Keyboard */
 | 
			
		||||
/* See USB specification if you want to conform to an existing device class or
 | 
			
		||||
 * protocol. The following classes must be set at interface level:
 | 
			
		||||
 * HID class is 3, no subclass and protocol required (but may be useful!)
 | 
			
		||||
 * CDC class is 2, use subclass 2 and protocol 1 for ACM
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    0
 | 
			
		||||
/* Define this to the length of the HID report descriptor, if you implement
 | 
			
		||||
 * an HID device. Otherwise don't define it or define it to 0.
 | 
			
		||||
 * If you use this define, you must add a PROGMEM character array named
 | 
			
		||||
 * "usbHidReportDescriptor" to your code which contains the report descriptor.
 | 
			
		||||
 * Don't forget to keep the array and this define in sync!
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* #define USB_PUBLIC static */
 | 
			
		||||
/* Use the define above if you #include usbdrv.c instead of linking against it.
 | 
			
		||||
 * This technique saves a couple of bytes in flash memory.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* ------------------- Fine Control over USB Descriptors ------------------- */
 | 
			
		||||
/* If you don't want to use the driver's default USB descriptors, you can
 | 
			
		||||
 * provide our own. These can be provided as (1) fixed length static data in
 | 
			
		||||
 * flash memory, (2) fixed length static data in RAM or (3) dynamically at
 | 
			
		||||
 * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
 | 
			
		||||
 * information about this function.
 | 
			
		||||
 * Descriptor handling is configured through the descriptor's properties. If
 | 
			
		||||
 * no properties are defined or if they are 0, the default descriptor is used.
 | 
			
		||||
 * Possible properties are:
 | 
			
		||||
 *   + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
 | 
			
		||||
 *     at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
 | 
			
		||||
 *     used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
 | 
			
		||||
 *     you want RAM pointers.
 | 
			
		||||
 *   + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
 | 
			
		||||
 *     in static memory is in RAM, not in flash memory.
 | 
			
		||||
 *   + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
 | 
			
		||||
 *     the driver must know the descriptor's length. The descriptor itself is
 | 
			
		||||
 *     found at the address of a well known identifier (see below).
 | 
			
		||||
 * List of static descriptor names (must be declared PROGMEM if in flash):
 | 
			
		||||
 *   char usbDescriptorDevice[];
 | 
			
		||||
 *   char usbDescriptorConfiguration[];
 | 
			
		||||
 *   char usbDescriptorHidReport[];
 | 
			
		||||
 *   char usbDescriptorString0[];
 | 
			
		||||
 *   int usbDescriptorStringVendor[];
 | 
			
		||||
 *   int usbDescriptorStringDevice[];
 | 
			
		||||
 *   int usbDescriptorStringSerialNumber[];
 | 
			
		||||
 * Other descriptors can't be provided statically, they must be provided
 | 
			
		||||
 * dynamically at runtime.
 | 
			
		||||
 *
 | 
			
		||||
 * Descriptor properties are or-ed or added together, e.g.:
 | 
			
		||||
 * #define USB_CFG_DESCR_PROPS_DEVICE   (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
 | 
			
		||||
 *
 | 
			
		||||
 * The following descriptors are defined:
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_DEVICE
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_CONFIGURATION
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_STRINGS
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_STRING_0
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_STRING_VENDOR
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_STRING_PRODUCT
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_HID
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_HID_REPORT
 | 
			
		||||
 *   USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
 | 
			
		||||
 *
 | 
			
		||||
 * Note about string descriptors: String descriptors are not just strings, they
 | 
			
		||||
 * are Unicode strings prefixed with a 2 byte header. Example:
 | 
			
		||||
 * int  serialNumberDescriptor[] = {
 | 
			
		||||
 *     USB_STRING_DESCRIPTOR_HEADER(6),
 | 
			
		||||
 *     'S', 'e', 'r', 'i', 'a', 'l'
 | 
			
		||||
 * };
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_DEVICE                  0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_CONFIGURATION           USB_PROP_IS_DYNAMIC
 | 
			
		||||
//#define USB_CFG_DESCR_PROPS_CONFIGURATION           0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_STRINGS                 0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_STRING_0                0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_STRING_VENDOR           0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT          0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    0
 | 
			
		||||
//#define USB_CFG_DESCR_PROPS_HID                     USB_PROP_IS_DYNAMIC
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_HID                     0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_HID_REPORT              USB_PROP_IS_DYNAMIC
 | 
			
		||||
//#define USB_CFG_DESCR_PROPS_HID_REPORT              0
 | 
			
		||||
#define USB_CFG_DESCR_PROPS_UNKNOWN                 0
 | 
			
		||||
 | 
			
		||||
/* ----------------------- Optional MCU Description ------------------------ */
 | 
			
		||||
 | 
			
		||||
/* The following configurations have working defaults in usbdrv.h. You
 | 
			
		||||
 * usually don't need to set them explicitly. Only if you want to run
 | 
			
		||||
 * the driver on a device which is not yet supported or with a compiler
 | 
			
		||||
 * which is not fully supported (such as IAR C) or if you use a differnt
 | 
			
		||||
 * interrupt than INT0, you may have to define some of these.
 | 
			
		||||
 */
 | 
			
		||||
/* #define USB_INTR_CFG            MCUCR */
 | 
			
		||||
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
 | 
			
		||||
/* #define USB_INTR_CFG_CLR        0 */
 | 
			
		||||
/* #define USB_INTR_ENABLE         GIMSK */
 | 
			
		||||
/* #define USB_INTR_ENABLE_BIT     INT0 */
 | 
			
		||||
/* #define USB_INTR_PENDING        GIFR */
 | 
			
		||||
/* #define USB_INTR_PENDING_BIT    INTF0 */
 | 
			
		||||
/* #define USB_INTR_VECTOR         INT0_vect */
 | 
			
		||||
 | 
			
		||||
#endif /* __usbconfig_h_included__ */
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue