1
0

Port ps2_usb to mbed

This commit is contained in:
tmk 2014-06-19 16:13:35 +09:00
parent 1b23028a38
commit daf232794e
8 changed files with 189 additions and 85 deletions

View File

@ -6,6 +6,7 @@
#elif defined(__arm__) #elif defined(__arm__)
# define PROGMEM # define PROGMEM
# define pgm_read_byte(p) *(p) # define pgm_read_byte(p) *(p)
# define pgm_read_word(p) *(p)
#endif #endif
#endif #endif

View File

@ -9,6 +9,7 @@ endif
ifdef PS2_USE_BUSYWAIT ifdef PS2_USE_BUSYWAIT
SRC += protocol/ps2_busywait.c SRC += protocol/ps2_busywait.c
SRC += protocol/ps2_io_avr.c
OPT_DEFS += -DPS2_USE_BUSYWAIT OPT_DEFS += -DPS2_USE_BUSYWAIT
endif endif

View File

@ -39,8 +39,9 @@ POSSIBILITY OF SUCH DAMAGE.
#define PS2_H #define PS2_H
#include <stdbool.h> #include <stdbool.h>
#include <util/delay.h> #include "wait.h"
#include <avr/io.h> #include "ps2_io.h"
#include "print.h"
/* /*
* Primitive PS/2 Library for AVR * Primitive PS/2 Library for AVR
@ -92,79 +93,27 @@ uint8_t ps2_host_recv(void);
void ps2_host_set_led(uint8_t usb_led); void ps2_host_set_led(uint8_t usb_led);
/* Check port settings for clock and data line */
#if !(defined(PS2_CLOCK_PORT) && \
defined(PS2_CLOCK_PIN) && \
defined(PS2_CLOCK_DDR) && \
defined(PS2_CLOCK_BIT))
# error "PS/2 clock port setting is required in config.h"
#endif
#if !(defined(PS2_DATA_PORT) && \
defined(PS2_DATA_PIN) && \
defined(PS2_DATA_DDR) && \
defined(PS2_DATA_BIT))
# error "PS/2 data port setting is required in config.h"
#endif
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* static functions * static functions
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
static inline void clock_lo(void)
{
PS2_CLOCK_PORT &= ~(1<<PS2_CLOCK_BIT);
PS2_CLOCK_DDR |= (1<<PS2_CLOCK_BIT);
}
static inline void clock_hi(void)
{
/* input with pull up */
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT);
PS2_CLOCK_PORT |= (1<<PS2_CLOCK_BIT);
}
static inline bool clock_in(void)
{
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(void)
{
PS2_DATA_PORT &= ~(1<<PS2_DATA_BIT);
PS2_DATA_DDR |= (1<<PS2_DATA_BIT);
}
static inline void data_hi(void)
{
/* input with pull up */
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);
PS2_DATA_PORT |= (1<<PS2_DATA_BIT);
}
static inline bool data_in(void)
{
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) static inline uint16_t wait_clock_lo(uint16_t us)
{ {
while (clock_in() && us) { asm(""); _delay_us(1); us--; } while (clock_in() && us) { asm(""); wait_us(1); us--; }
return us; return us;
} }
static inline uint16_t wait_clock_hi(uint16_t us) static inline uint16_t wait_clock_hi(uint16_t us)
{ {
while (!clock_in() && us) { asm(""); _delay_us(1); us--; } while (!clock_in() && us) { asm(""); wait_us(1); us--; }
return us; return us;
} }
static inline uint16_t wait_data_lo(uint16_t us) static inline uint16_t wait_data_lo(uint16_t us)
{ {
while (data_in() && us) { asm(""); _delay_us(1); us--; } while (data_in() && us) { asm(""); wait_us(1); us--; }
return us; return us;
} }
static inline uint16_t wait_data_hi(uint16_t us) static inline uint16_t wait_data_hi(uint16_t us)
{ {
while (!data_in() && us) { asm(""); _delay_us(1); us--; } while (!data_in() && us) { asm(""); wait_us(1); us--; }
return us; return us;
} }

View File

@ -40,8 +40,9 @@ POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <stdbool.h> #include <stdbool.h>
#include <util/delay.h> #include "wait.h"
#include "ps2.h" #include "ps2.h"
#include "ps2_io.h"
#include "debug.h" #include "debug.h"
@ -58,8 +59,11 @@ uint8_t ps2_error = PS2_ERR_NONE;
void ps2_host_init(void) void ps2_host_init(void)
{ {
clock_init();
data_init();
// POR(150-2000ms) plus BAT(300-500ms) may take 2.5sec([3]p.20) // POR(150-2000ms) plus BAT(300-500ms) may take 2.5sec([3]p.20)
_delay_ms(2500); wait_ms(2500);
inhibit(); inhibit();
} }
@ -71,7 +75,7 @@ uint8_t ps2_host_send(uint8_t data)
/* terminate a transmission if we have */ /* terminate a transmission if we have */
inhibit(); inhibit();
_delay_us(100); // 100us [4]p.13, [5]p.50 wait_us(100); // 100us [4]p.13, [5]p.50
/* 'Request to Send' and Start bit */ /* 'Request to Send' and Start bit */
data_lo(); data_lo();
@ -80,7 +84,7 @@ uint8_t ps2_host_send(uint8_t data)
/* Data bit */ /* Data bit */
for (uint8_t i = 0; i < 8; i++) { for (uint8_t i = 0; i < 8; i++) {
_delay_us(15); wait_us(15);
if (data&(1<<i)) { if (data&(1<<i)) {
parity = !parity; parity = !parity;
data_hi(); data_hi();
@ -92,13 +96,13 @@ uint8_t ps2_host_send(uint8_t data)
} }
/* Parity bit */ /* Parity bit */
_delay_us(15); wait_us(15);
if (parity) { data_hi(); } else { data_lo(); } if (parity) { data_hi(); } else { data_lo(); }
WAIT(clock_hi, 50, 4); WAIT(clock_hi, 50, 4);
WAIT(clock_lo, 50, 5); WAIT(clock_lo, 50, 5);
/* Stop bit */ /* Stop bit */
_delay_us(15); wait_us(15);
data_hi(); data_hi();
/* Ack */ /* Ack */

15
protocol/ps2_io.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef PS2_IO_H
#define PS2_IO_H
void clock_init(void);
void clock_lo(void);
void clock_hi(void);
bool clock_in(void);
void data_init(void);
void data_lo(void);
void data_hi(void);
bool data_in(void);
#endif

74
protocol/ps2_io_avr.c Normal file
View File

@ -0,0 +1,74 @@
#include <stdbool.h>
#include <util/delay.h>
/* Check port settings for clock and data line */
#if !(defined(PS2_CLOCK_PORT) && \
defined(PS2_CLOCK_PIN) && \
defined(PS2_CLOCK_DDR) && \
defined(PS2_CLOCK_BIT))
# error "PS/2 clock port setting is required in config.h"
#endif
#if !(defined(PS2_DATA_PORT) && \
defined(PS2_DATA_PIN) && \
defined(PS2_DATA_DDR) && \
defined(PS2_DATA_BIT))
# error "PS/2 data port setting is required in config.h"
#endif
/*
* Clock
*/
void clock_init(void)
{
}
void clock_lo(void)
{
PS2_CLOCK_PORT &= ~(1<<PS2_CLOCK_BIT);
PS2_CLOCK_DDR |= (1<<PS2_CLOCK_BIT);
}
void clock_hi(void)
{
/* input with pull up */
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT);
PS2_CLOCK_PORT |= (1<<PS2_CLOCK_BIT);
}
bool clock_in(void)
{
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);
}
/*
* Data
*/
void data_init(void)
{
}
void data_lo(void)
{
PS2_DATA_PORT &= ~(1<<PS2_DATA_BIT);
PS2_DATA_DDR |= (1<<PS2_DATA_BIT);
}
void data_hi(void)
{
/* input with pull up */
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);
PS2_DATA_PORT |= (1<<PS2_DATA_BIT);
}
bool data_in(void)
{
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);
}

60
protocol/ps2_io_mbed.c Normal file
View File

@ -0,0 +1,60 @@
#include <stdbool.h>
#include "ps2_io.h"
#include "gpio_api.h"
static gpio_t clock;
static gpio_t data;
/*
* Clock
*/
void clock_init(void)
{
gpio_init(&clock, P0_9);
gpio_mode(&clock, OpenDrain|PullNone);
}
void clock_lo(void)
{
gpio_dir(&clock, PIN_OUTPUT);
gpio_write(&clock, 0);
}
void clock_hi(void)
{
gpio_dir(&clock, PIN_OUTPUT);
gpio_write(&clock, 1);
}
bool clock_in(void)
{
gpio_dir(&clock, PIN_INPUT);
return gpio_read(&clock);
}
/*
* Data
*/
void data_init(void)
{
gpio_init(&data, P0_8);
gpio_mode(&data, OpenDrain|PullNone);
}
void data_lo(void)
{
gpio_dir(&data, PIN_OUTPUT);
gpio_write(&data, 0);
}
void data_hi(void)
{
gpio_dir(&data, PIN_OUTPUT);
gpio_write(&data, 1);
}
bool data_in(void)
{
gpio_dir(&data, PIN_INPUT);
return gpio_read(&data);
}

View File

@ -1,21 +1,21 @@
COMMON_DIR = common
OBJECTS += \ OBJECTS += \
$(OBJDIR)/$(COMMON_DIR)/action.o \ $(OBJDIR)/common/action.o \
$(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ $(OBJDIR)/common/action_tapping.o \
$(OBJDIR)/$(COMMON_DIR)/action_macro.o \ $(OBJDIR)/common/action_macro.o \
$(OBJDIR)/$(COMMON_DIR)/action_layer.o \ $(OBJDIR)/common/action_layer.o \
$(OBJDIR)/$(COMMON_DIR)/action_util.o \ $(OBJDIR)/common/action_util.o \
$(OBJDIR)/$(COMMON_DIR)/host.o \ $(OBJDIR)/common/host.o \
$(OBJDIR)/$(COMMON_DIR)/keymap.o \ $(OBJDIR)/common/keymap.o \
$(OBJDIR)/$(COMMON_DIR)/keyboard.o \ $(OBJDIR)/common/keyboard.o \
$(OBJDIR)/$(COMMON_DIR)/util.o \ $(OBJDIR)/common/util.o \
$(OBJDIR)/$(COMMON_DIR)/mbed/suspend.o \ $(OBJDIR)/common/mbed/suspend.o \
$(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ $(OBJDIR)/common/mbed/timer.o \
$(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ $(OBJDIR)/common/mbed/xprintf.o \
$(OBJDIR)/$(COMMON_DIR)/mbed/bootloader.o \ $(OBJDIR)/common/mbed/bootloader.o \
INCLUDE_PATHS += \ INCLUDE_PATHS += \
-I$(TMK_DIR)/$(COMMON_DIR) -I$(TMK_DIR)/common \
-I$(TMK_DIR)/protocol
CC_FLAGS += -include $(CONFIG_H) CC_FLAGS += -include $(CONFIG_H)
@ -24,13 +24,13 @@ CC_FLAGS += -include $(CONFIG_H)
# Option modules # Option modules
ifdef BOOTMAGIC_ENABLE ifdef BOOTMAGIC_ENABLE
$(error Not Supported) $(error Not Supported)
OBJECTS += $(OBJDIR)/$(COMMON_DIR)/bootmagic.o OBJECTS += $(OBJDIR)/common/bootmagic.o
OBJECTS += $(OBJDIR)/$(COMMON_DIR)/mbed/eeprom.o OBJECTS += $(OBJDIR)/common/mbed/eeprom.o
OPT_DEFS += -DBOOTMAGIC_ENABLE OPT_DEFS += -DBOOTMAGIC_ENABLE
endif endif
ifdef MOUSEKEY_ENABLE ifdef MOUSEKEY_ENABLE
OBJECTS += $(OBJDIR)/$(COMMON_DIR)/mousekey.o OBJECTS += $(OBJDIR)/common/mousekey.o
OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSEKEY_ENABLE
OPT_DEFS += -DMOUSE_ENABLE OPT_DEFS += -DMOUSE_ENABLE
endif endif
@ -50,7 +50,7 @@ endif
ifdef COMMAND_ENABLE ifdef COMMAND_ENABLE
$(error Not Supported) $(error Not Supported)
SRC += $(COMMON_DIR)/command.c SRC += common/command.c
OPT_DEFS += -DCOMMAND_ENABLE OPT_DEFS += -DCOMMAND_ENABLE
endif endif
@ -61,14 +61,14 @@ endif
ifdef SLEEP_LED_ENABLE ifdef SLEEP_LED_ENABLE
$(error Not Supported) $(error Not Supported)
SRC += $(COMMON_DIR)/sleep_led.c SRC += common/sleep_led.c
OPT_DEFS += -DSLEEP_LED_ENABLE OPT_DEFS += -DSLEEP_LED_ENABLE
OPT_DEFS += -DNO_SUSPEND_POWER_DOWN OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
endif endif
ifdef BACKLIGHT_ENABLE ifdef BACKLIGHT_ENABLE
$(error Not Supported) $(error Not Supported)
SRC += $(COMMON_DIR)/backlight.c SRC += common/backlight.c
OPT_DEFS += -DBACKLIGHT_ENABLE OPT_DEFS += -DBACKLIGHT_ENABLE
endif endif