diff options
| author | tmk <nobody@nowhere> | 2011-05-07 00:04:18 +0900 | 
|---|---|---|
| committer | tmk <nobody@nowhere> | 2011-05-07 00:48:18 +0900 | 
| commit | 61e12a3157ea6860f23bf8e29372aa70aeb02be0 (patch) | |
| tree | b93de00a8deb10713eec89edfb315d5b447201d6 /ps2_usb | |
| parent | a6b31e950fe8de3dc4888e2f90a4001a6caee483 (diff) | |
| download | firmware-61e12a3157ea6860f23bf8e29372aa70aeb02be0.tar.gz firmware-61e12a3157ea6860f23bf8e29372aa70aeb02be0.tar.bz2 firmware-61e12a3157ea6860f23bf8e29372aa70aeb02be0.zip | |
move files: main_vusb.c ps2_usart.c sendchar_usart.c from ps2_usb to common dir
Diffstat (limited to 'ps2_usb')
| -rwxr-xr-x | ps2_usb/Makefile | 2 | ||||
| -rw-r--r-- | ps2_usb/Makefile.vusb | 6 | ||||
| -rw-r--r-- | ps2_usb/main_vusb.c | 62 | ||||
| -rw-r--r-- | ps2_usb/ps2_usart.c | 325 | ||||
| -rw-r--r-- | ps2_usb/sendchar_dummy.c | 8 | ||||
| -rw-r--r-- | ps2_usb/sendchar_usart.c | 58 | 
6 files changed, 4 insertions, 457 deletions
| diff --git a/ps2_usb/Makefile b/ps2_usb/Makefile index 7b55e0201..605962915 100755 --- a/ps2_usb/Makefile +++ b/ps2_usb/Makefile @@ -10,7 +10,7 @@ TARGET_DIR = .  # keyboard dependent files  TARGET_SRC =	main_pjrc.c \  		keymap.c \ -  	        matrix.c \ +		matrix.c \  		led.c \  		ps2.c diff --git a/ps2_usb/Makefile.vusb b/ps2_usb/Makefile.vusb index 7b69dc27b..6e49fc44d 100644 --- a/ps2_usb/Makefile.vusb +++ b/ps2_usb/Makefile.vusb @@ -12,13 +12,13 @@ TARGET_SRC =	main_vusb.c \  		keymap.c \  		matrix.c \  		led.c \ -		ps2_usart.c \ -		sendchar_dummy.c -#		sendchar_usart.c +		ps2_usart.c  CONFIG_H = config_vusb.h +# V-USB debug level: To use ps2_usart.c level must be 0 +# ps2_usart.c requires USART to receive PS/2 signal.  OPT_DEFS = -DDEBUG_LEVEL=0 diff --git a/ps2_usb/main_vusb.c b/ps2_usb/main_vusb.c deleted file mode 100644 index ec7c5797a..000000000 --- a/ps2_usb/main_vusb.c +++ /dev/null @@ -1,62 +0,0 @@ -/* 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(); -    } -} diff --git a/ps2_usb/ps2_usart.c b/ps2_usb/ps2_usart.c deleted file mode 100644 index e45b94c93..000000000 --- a/ps2_usb/ps2_usart.c +++ /dev/null @@ -1,325 +0,0 @@ -/* -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; -} diff --git a/ps2_usb/sendchar_dummy.c b/ps2_usb/sendchar_dummy.c deleted file mode 100644 index 8c9e583f1..000000000 --- a/ps2_usb/sendchar_dummy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdint.h> -#include "sendchar.h" - - -int8_t sendchar(uint8_t c) -{ -    return 1; -} diff --git a/ps2_usb/sendchar_usart.c b/ps2_usb/sendchar_usart.c deleted file mode 100644 index fe18177a3..000000000 --- a/ps2_usb/sendchar_usart.c +++ /dev/null @@ -1,58 +0,0 @@ -#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; -} | 
