diff options
author | tmk <nobody@nowhere> | 2011-01-29 00:44:05 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2011-02-22 03:08:49 +0900 |
commit | 4f5f1a53d449172263e83c5769c92976e0d3332e (patch) | |
tree | 53c87958a30812cd548d83768c1348680e224c3d /ps2_vusb/main.c | |
parent | c07408a44784c0fdbca33567926a2c0aa4e8e17e (diff) |
added PS/2 to USB converter use V-USB as protocol stack
Diffstat (limited to 'ps2_vusb/main.c')
-rw-r--r-- | ps2_vusb/main.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/ps2_vusb/main.c b/ps2_vusb/main.c new file mode 100644 index 0000000000..359e28254e --- /dev/null +++ b/ps2_vusb/main.c @@ -0,0 +1,126 @@ +/* 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 $ + */ + +/* +This example should run on most AVRs with only little changes. No special +hardware resources except INT0 are used. You may have to change usbconfig.h for +different I/O pins for USB. Please note that USB D+ must be the INT0 pin, or +at least be connected to INT0 as well. + +We use VID/PID 0x046D/0xC00E which is taken from a Logitech mouse. Don't +publish any hardware using these IDs! This is for demonstration only! +*/ + +#include <stdint.h> +#include <avr/io.h> +#include <avr/wdt.h> +#include <avr/interrupt.h> /* for sei() */ +#include <util/delay.h> /* for _delay_ms() */ + +#include <avr/pgmspace.h> /* required by usbdrv.h */ +#include "usbdrv.h" +#include "usart_print.h" /* This is also an example for using debug macros */ +#include "ps2.h" +#include "usb_keycodes.h" +#include "matrix_skel.h" +#include "keymap_skel.h" +#include "layer.h" +#include "print.h" +#include "debug.h" +#include "sendchar.h" +#include "keyboard.h" +#include "timer.h" + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + + + + + + +int main(void) +{ +uchar i; + +print_enable = true; +debug_enable = true; +timer_init(); +matrix_init(); + + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + odDebugInit(); + DBG1(0x00, 0, 0); /* debug output: main starts */ + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ /* fake USB disconnect for > 250 ms */ + wdt_reset(); + _delay_ms(1); + } + usbDeviceConnect(); + sei(); + + uint8_t fn_bits = 0; + while (1) { /* main event loop */ + DBG1(0x02, 0, 0); /* debug output: main loop iterates */ + wdt_reset(); + usbPoll(); + +/* +static uint8_t code = 0; +code = ps2_host_recv(); +if (code) { + odDebug(0x05, &code, 1); +} +*/ + matrix_scan(); + if (matrix_is_modified()) { + //matrix_print(); // too heavy on USART + fn_bits = 0; + report_swap(); + report_clear(); + for (int row = 0; row < matrix_rows(); row++) { + for (int col = 0; col < matrix_cols(); col++) { + if (!matrix_is_on(row, col)) continue; + + uint8_t code = layer_get_keycode(row, col); + if (code == KB_NO) { + // do nothing + } + else if (IS_MOD(code)) { + report_add_mod(MOD_BIT(code)); + } + else if (IS_KEY(code)) { + report_add_key(code); + } + else if (IS_FN(code)) { + fn_bits |= FN_BIT(code); + } + else { + debug("ignore keycode: "); debug_hex(code); debug("\n"); + } + } + } + } + layer_switching(fn_bits); + if (matrix_is_modified()) { + report_send(); + } + } +} |