From 61e12a3157ea6860f23bf8e29372aa70aeb02be0 Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 7 May 2011 00:04:18 +0900 Subject: move files: main_vusb.c ps2_usart.c sendchar_usart.c from ps2_usb to common dir --- Makefile.vusb | 3 +- main_vusb.c | 62 +++++++++ ps2_usart.c | 325 +++++++++++++++++++++++++++++++++++++++++++++++ ps2_usb/Makefile | 2 +- ps2_usb/Makefile.vusb | 6 +- ps2_usb/main_vusb.c | 62 --------- ps2_usb/ps2_usart.c | 325 ----------------------------------------------- ps2_usb/sendchar_dummy.c | 8 -- ps2_usb/sendchar_usart.c | 58 --------- vusb/sendchar_usart.c | 19 +++ 10 files changed, 412 insertions(+), 458 deletions(-) create mode 100644 main_vusb.c create mode 100644 ps2_usart.c delete mode 100644 ps2_usb/main_vusb.c delete mode 100644 ps2_usb/ps2_usart.c delete mode 100644 ps2_usb/sendchar_dummy.c delete mode 100644 ps2_usb/sendchar_usart.c create mode 100644 vusb/sendchar_usart.c diff --git a/Makefile.vusb b/Makefile.vusb index 0ef1b11550..b8e71a8e36 100644 --- a/Makefile.vusb +++ b/Makefile.vusb @@ -2,7 +2,8 @@ OPT_DEFS += -DHOST_VUSB SRC = usbdrv.c \ usbdrvasm.S \ - oddebug.c + oddebug.c \ + sendchar_usart.c SRC += $(TARGET_SRC) diff --git a/main_vusb.c b/main_vusb.c new file mode 100644 index 0000000000..ec7c5797a1 --- /dev/null +++ b/main_vusb.c @@ -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 +#include +#include +#include +#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_usart.c b/ps2_usart.c new file mode 100644 index 0000000000..e45b94c93b --- /dev/null +++ b/ps2_usart.c @@ -0,0 +1,325 @@ +/* +Copyright (c) 2010,2011 Jun WAKO + +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 +#include +#include +#include +#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<>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< -#include -#include -#include -#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 e45b94c93b..0000000000 --- a/ps2_usb/ps2_usart.c +++ /dev/null @@ -1,325 +0,0 @@ -/* -Copyright (c) 2010,2011 Jun WAKO - -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 -#include -#include -#include -#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<>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< -#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 fe18177a3c..0000000000 --- a/ps2_usb/sendchar_usart.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#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; -} diff --git a/vusb/sendchar_usart.c b/vusb/sendchar_usart.c new file mode 100644 index 0000000000..d6f3c894c4 --- /dev/null +++ b/vusb/sendchar_usart.c @@ -0,0 +1,19 @@ +#include +#include "oddebug.h" +#include "sendchar.h" + + +#if DEBUG_LEVEL > 0 +/* 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; +} +#else +int8_t sendchar(uint8_t c) +{ + return 1; +} +#endif -- cgit v1.2.3