Merge branch 'adb_fix'

master
tmk 2013-04-09 14:31:27 +09:00
commit 3fa50565af
6 changed files with 202 additions and 26 deletions

View File

@ -32,12 +32,25 @@ MCU = atmega32u4 # Teensy 2.0
F_CPU = 16000000 F_CPU = 16000000
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options # Build Options
# comment out to disable the options. # comment out to disable the options.
# #
#MOUSEKEY_ENABLE = yes # Mouse keys #BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
EXTRAKEY_ENABLE = yes # Audio control and System control #MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
#NKRO_ENABLE = yes # USB Nkey Rollover #EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
#CONSOLE_ENABLE = yes # Console for debug
#COMMAND_ENABLE = yes # Commands for debug and configuration
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
#NKRO_ENABLE = yes # USB Nkey Rollover(+500)
# Search Path # Search Path

View File

@ -0,0 +1,131 @@
#----------------------------------------------------------------------------
# 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.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# 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 = adb_usb_lufa
# Directory common source filess exist
TOP_DIR = ../..
# Directory keyboard dependent files exist
TARGET_DIR = .
# project specific files
SRC = keymap.c \
matrix.c \
led.c \
adb.c
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
include $(TOP_DIR)/protocol/lufa.mk
include $(TOP_DIR)/protocol.mk
include $(TOP_DIR)/common.mk
include $(TOP_DIR)/rules.mk

View File

@ -21,7 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include "usb_keyboard.h"
#include "keycode.h" #include "keycode.h"
#include "print.h" #include "print.h"
#include "debug.h" #include "debug.h"

View File

@ -71,7 +71,6 @@ void matrix_init(void)
// initialize matrix state: all keys off // initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
print_enable = true;
debug_enable = true; debug_enable = true;
debug_matrix = true; debug_matrix = true;
debug_keyboard = true; debug_keyboard = true;

View File

@ -57,12 +57,13 @@ static inline void place_bit1(void);
static inline void send_byte(uint8_t data); static inline void send_byte(uint8_t data);
static inline bool read_bit(void); static inline bool read_bit(void);
static inline uint8_t read_byte(void); static inline uint8_t read_byte(void);
static inline uint8_t wait_data_lo(uint8_t us); static inline uint8_t wait_data_lo(uint16_t us);
static inline uint8_t wait_data_hi(uint8_t us); static inline uint8_t wait_data_hi(uint8_t us);
void adb_host_init(void) void adb_host_init(void)
{ {
DDRF |= (1<<1);
data_hi(); data_hi();
#ifdef ADB_PSW_BIT #ifdef ADB_PSW_BIT
psw_hi(); psw_hi();
@ -88,19 +89,24 @@ uint16_t adb_host_kbd_recv(void)
attention(); attention();
send_byte(0x2C); // Addr:Keyboard(0010), Cmd:Talk(11), Register0(00) send_byte(0x2C); // Addr:Keyboard(0010), Cmd:Talk(11), Register0(00)
place_bit0(); // Stopbit(0) place_bit0(); // Stopbit(0)
if (!wait_data_lo(0xFF)) // Tlt/Stop to Start(140-260us) if (!wait_data_lo(500)) { // Tlt/Stop to Start(140-260us)
return 0; // No data to send return 0; // No data to send
if (!read_bit()) // Startbit(1) }
if (!read_bit()) { // Startbit(1)
// Service Request
return -2; return -2;
}
// ad hoc fix: without block inerrupt read wrong bit occasionally and get keys stuck // ad hoc fix: without block inerrupt read wrong bit occasionally and get keys stuck
cli(); cli();
data = read_byte(); data = read_byte();
data = (data<<8) | read_byte(); data = (data<<8) | read_byte();
uint8_t stop = read_bit(); // Stopbit(0)
sei(); sei();
if (read_bit()) // Stopbit(0) if (stop) {
return -3; return -3;
}
return data; return data;
} }
@ -199,24 +205,48 @@ static inline bool read_bit(void)
{ {
// ADB Bit Cells // ADB Bit Cells
// //
// bit0: ______~~~
// 65 :35us
//
// bit1: ___~~~~~~
// 35 :65us
//
// bit0 low time: 60-70% of bit cell(42-91us)
// bit1 low time: 30-40% of bit cell(21-52us)
// bit cell time: 70-130us // bit cell time: 70-130us
// [from Apple IIgs Hardware Reference Second Edition] // low part of bit0: 60-70% of bit cell
// low part of bit1: 30-40% of bit cell
// //
// After 55us if data line is low/high then bit is 0/1. // bit cell time 70us 130us
// Too simple to rely on? // --------------------------------------------
// low part of bit0 42-49 78-91
// high part of bit0 21-28 39-52
// low part of bit1 21-28 39-52
// high part of bit1 42-49 78-91
//
//
// bit0:
// 70us bit cell:
// ____________~~~~~~
// 42-49 21-28
//
// 130us bit cell:
// ____________~~~~~~
// 78-91 39-52
//
// bit1:
// 70us bit cell:
// ______~~~~~~~~~~~~
// 21-28 42-49
//
// 130us bit cell:
// ______~~~~~~~~~~~~
// 39-52 78-91
//
// read:
// ________|~~~~~~~~~
// 55us
// Read data line after 55us. If data line is low/high then bit is 0/1.
// This method might not work at <90us bit cell time.
//
// [from Apple IIgs Hardware Reference Second Edition]
bool bit; bool bit;
wait_data_lo(75); // wait the beginning of bit cell wait_data_lo(75); // wait the start of bit cell at least 130ms(55+0+75)
_delay_us(55); _delay_us(55);
bit = data_in(); bit = data_in();
wait_data_hi(36); // wait high part of bit cell wait_data_hi(36); // wait high part of bit cell at least 91ms(55+36)
return bit; return bit;
} }
@ -231,7 +261,7 @@ static inline uint8_t read_byte(void)
return data; return data;
} }
static inline uint8_t wait_data_lo(uint8_t us) static inline uint8_t wait_data_lo(uint16_t us)
{ {
while (data_in() && us) { while (data_in() && us) {
_delay_us(1); _delay_us(1);
@ -258,7 +288,10 @@ Resources
--------- ---------
ADB - The Untold Story: Space Aliens Ate My Mouse ADB - The Untold Story: Space Aliens Ate My Mouse
http://developer.apple.com/legacy/mac/library/#technotes/hw/hw_01.html http://developer.apple.com/legacy/mac/library/#technotes/hw/hw_01.html
Apple IIgs Hardware Reference Second Edition [p80(Chapter6 p121)] ADB Manager
http://developer.apple.com/legacy/mac/library/documentation/mac/pdf/Devices/ADB_Manager.pdf
Service request(5-17)
Apple IIgs Hardware Reference Second Edition [Chapter6 p121]
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple%20IIgs%20Hardware%20Reference.pdf ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple%20IIgs%20Hardware%20Reference.pdf
ADB Keycode ADB Keycode
http://72.0.193.250/Documentation/macppc/adbkeycodes/ http://72.0.193.250/Documentation/macppc/adbkeycodes/
@ -376,9 +409,9 @@ Communication
Global reset: Global reset:
Host asserts low in 2.8-5.2ms. All devices are forced to reset. Host asserts low in 2.8-5.2ms. All devices are forced to reset.
Send request from device(Srq): Service request from device(Srq):
Device can request to send at commad(Global only?) stop bit. Device can request to send at commad(Global only?) stop bit.
keep low for 300us to request. Requesting device keeps low for 140-260us at stop bit of command.
Keyboard Data(Register0) Keyboard Data(Register0)

View File

@ -31,6 +31,7 @@
#include "usb_mouse.h" #include "usb_mouse.h"
#include "usb_debug.h" #include "usb_debug.h"
#include "usb_extra.h" #include "usb_extra.h"
#include "led.h"
#include "print.h" #include "print.h"
#include "util.h" #include "util.h"
#include "sleep_led.h" #include "sleep_led.h"