added SONY NEWS keyboard NWP-5461 support.
parent
7386c76191
commit
579991b927
|
@ -0,0 +1,56 @@
|
||||||
|
#
|
||||||
|
# Makefile for PJRC Teensy
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = news_usb_pjrc
|
||||||
|
|
||||||
|
# Directory common source filess exist
|
||||||
|
COMMON_DIR = ..
|
||||||
|
|
||||||
|
# Directory keyboard dependent files exist
|
||||||
|
TARGET_DIR = .
|
||||||
|
|
||||||
|
# keyboard dependent files
|
||||||
|
SRC = main.c \
|
||||||
|
keymap.c \
|
||||||
|
matrix.c \
|
||||||
|
led.c \
|
||||||
|
news.c
|
||||||
|
|
||||||
|
CONFIG_H = config_pjrc.h
|
||||||
|
|
||||||
|
|
||||||
|
# MCU name, you MUST set this to match the board you are using
|
||||||
|
# type "make clean" after changing this, so all files will be rebuilt
|
||||||
|
#MCU = at90usb162 # Teensy 1.0
|
||||||
|
MCU = atmega32u4 # Teensy 2.0
|
||||||
|
#MCU = at90usb646 # Teensy++ 1.0
|
||||||
|
#MCU = at90usb1286 # Teensy++ 2.0
|
||||||
|
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# Normally the first thing your program should do is set the clock prescaler,
|
||||||
|
# so your program will run at the correct speed. You should also set this
|
||||||
|
# variable to same clock speed. The _delay_ms() macro uses this, and many
|
||||||
|
# examples use this variable to calculate timings. Do not add a "UL" here.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# *Comment out* to disable the options.
|
||||||
|
#
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Programming Options --------------------------
|
||||||
|
PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
include $(COMMON_DIR)/pjrc.mk
|
||||||
|
include $(COMMON_DIR)/common.mk
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
/* controller configuration */
|
||||||
|
#include "controller_teensy.h"
|
||||||
|
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x5021
|
||||||
|
#define MANUFACTURER t.m.k.
|
||||||
|
#define PRODUCT SONY NEWS keyboard converter
|
||||||
|
#define DESCRIPTION converts SONY NEWS protocol into USB
|
||||||
|
|
||||||
|
|
||||||
|
/* matrix size */
|
||||||
|
#define MATRIX_ROWS 16 // keycode bit: 3-0
|
||||||
|
#define MATRIX_COLS 8 // keycode bit: 6-4
|
||||||
|
|
||||||
|
|
||||||
|
/* key combination for command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT)) || \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KB_LCTRL) | MOD_BIT(KB_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
/* mouse keys */
|
||||||
|
#ifdef MOUSEKEY_ENABLE
|
||||||
|
# define MOUSEKEY_DELAY_TIME 255
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Asynchronous USART
|
||||||
|
* 8-data bit, non parity, 1-stop bit, no flow control
|
||||||
|
*/
|
||||||
|
#ifdef __AVR_ATmega32U4__
|
||||||
|
# define NEWS_KBD_RX_VECT USART1_RX_vect
|
||||||
|
# define NEWS_KBD_RX_DATA UDR1
|
||||||
|
# define NEWS_KBD_RX_BAUD 9600
|
||||||
|
# define NEWS_KBD_RX_UBBR ((F_CPU/(16UL*NEWS_KBD_RX_BAUD))-1)
|
||||||
|
# define NEWS_KBD_RX_INIT() do { \
|
||||||
|
UBRR1L = (uint8_t) NEWS_KBD_RX_UBBR; \
|
||||||
|
UBRR1H = (uint8_t) (NEWS_KBD_RX_UBBR>>8); \
|
||||||
|
UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); \
|
||||||
|
} while(0)
|
||||||
|
#else
|
||||||
|
# error "USART configuration is needed."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include "usb_keycodes.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "keymap.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Following macros help you to define a keymap with the form of actual keyboard layout.
|
||||||
|
|
||||||
|
/* SONY NEWS NWP-5461 */
|
||||||
|
#define KEYMAP( \
|
||||||
|
K7A, K01,K02,K03,K04,K05, K06,K07,K08,K09,K0A, K68,K69, K64,K65,K52, \
|
||||||
|
K0B,K0C,K0D,K0E,K0F,K10,K11,K12,K13,K14,K15,K16,K17,K18,K19, K6A, K4B,K4C,K4D,K4E, \
|
||||||
|
K1A,K1B,K1C,K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27, K6B, K4F,K50,K51,K56, \
|
||||||
|
K28,K29,K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34, K35, K6C, K53,K54,K55,K5A, \
|
||||||
|
K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K42, K6D, K57,K59,K58, \
|
||||||
|
K43,K44,K45, K46, K47, K48,K49,K4A, K6E, K66,K5B,K5C,K5D \
|
||||||
|
) { \
|
||||||
|
{ KB_NO, KB_##K01, KB_##K02, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \
|
||||||
|
{ KB_##K08, KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_##K0F }, \
|
||||||
|
{ KB_##K10, KB_##K11, KB_##K12, KB_##K13, KB_##K14, KB_##K15, KB_##K16, KB_##K17 }, \
|
||||||
|
{ KB_##K18, KB_##K19, KB_##K1A, KB_##K1B, KB_##K1C, KB_##K1D, KB_##K1E, KB_##K1F }, \
|
||||||
|
{ KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_##K25, KB_##K26, KB_##K27 }, \
|
||||||
|
{ KB_##K28, KB_##K29, KB_##K2A, KB_##K2B, KB_##K2C, KB_##K2D, KB_##K2E, KB_##K2F }, \
|
||||||
|
{ KB_##K30, KB_##K31, KB_##K32, KB_##K33, KB_##K34, KB_##K35, KB_##K36, KB_##K37 }, \
|
||||||
|
{ KB_##K38, KB_##K39, KB_##K3A, KB_##K3B, KB_##K3C, KB_##K3D, KB_##K3E, KB_##K3F }, \
|
||||||
|
{ KB_##K40, KB_##K41, KB_##K42, KB_##K43, KB_##K44, KB_##K45, KB_##K46, KB_##K47 }, \
|
||||||
|
{ KB_##K48, KB_##K49, KB_##K4A, KB_##K4B, KB_##K4C, KB_##K4D, KB_##K4E, KB_##K4F }, \
|
||||||
|
{ KB_##K50, KB_##K51, KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, \
|
||||||
|
{ KB_##K58, KB_##K59, KB_##K5A, KB_##K5B, KB_##K5C, KB_##K5D, KB_NO, KB_NO }, \
|
||||||
|
{ KB_NO, KB_NO, KB_NO, KB_NO, KB_##K64, KB_##K65, KB_##K66, KB_NO }, \
|
||||||
|
{ KB_##K68, KB_##K69, KB_##K6A, KB_##K6B, KB_##K6C, KB_##K6D, KB_##K6E, KB_NO }, \
|
||||||
|
{ KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, }, \
|
||||||
|
{ KB_NO, KB_NO, KB_##K7A, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO } \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
|
||||||
|
static const uint8_t PROGMEM fn_layer[] = {
|
||||||
|
0, // Fn0
|
||||||
|
0, // Fn1
|
||||||
|
0, // Fn2
|
||||||
|
0, // Fn3
|
||||||
|
0, // Fn4
|
||||||
|
0, // Fn5
|
||||||
|
0, // Fn6
|
||||||
|
0 // Fn7
|
||||||
|
};
|
||||||
|
|
||||||
|
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
|
||||||
|
// See layer.c for details.
|
||||||
|
static const uint8_t PROGMEM fn_keycode[] = {
|
||||||
|
KB_NO, // Fn0
|
||||||
|
KB_NO, // Fn1
|
||||||
|
KB_NO, // Fn2
|
||||||
|
KB_NO, // Fn3
|
||||||
|
KB_NO, // Fn4
|
||||||
|
KB_NO, // Fn5
|
||||||
|
KB_NO, // Fn6
|
||||||
|
KB_NO // Fn7
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* 0: default
|
||||||
|
* ,---. ,------------------------, ,------------------------. ,---------.
|
||||||
|
* |Pow| | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10| | F11| F12| ,-----------.
|
||||||
|
* `---' `------------------------' `------------------------' `---------' | *| /| +|
|
||||||
|
* ,-------------------------------------------------------------. ,---. ,---------------|
|
||||||
|
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS | |Hlp| | 7| 8| 9| -|
|
||||||
|
* |-------------------------------------------------------------| |---| |---------------|
|
||||||
|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Del| | |Ins| | 4| 5| 6| ,|
|
||||||
|
* |---------------------------------------------------------' | |---| |---------------|
|
||||||
|
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `|Return| |Clr| | 1| 2| 3| |
|
||||||
|
* |-------------------------------------------------------------| |---| |-----------|Ent|
|
||||||
|
* |Shift | Z| X| C| V| B| N| M| ,| ,| /| |Shift | |PgU| | 0| .| Up| |
|
||||||
|
* |-------------------------------------------------------------| |---| |---------------|
|
||||||
|
* |Alt |Gui |Alt | Space | |Gui|App|Ctrl | |PgD| |Tab|Lef|Dow|Rig|
|
||||||
|
* `-------------------------------------------------------------' `---' `---------------'
|
||||||
|
*/
|
||||||
|
KEYMAP(
|
||||||
|
PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAST,PSLS,PPLS,
|
||||||
|
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC, HELP, P7, P8, P9, PMNS,
|
||||||
|
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,DEL, INS, P4, P5, P6, PCMM,
|
||||||
|
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,GRV, ENT, CLR, P1, P2, P3, PENT,
|
||||||
|
LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, RSFT, PGUP, P0, PDOT,UP,
|
||||||
|
LCTL,LGUI,LALT, SPC, ERAS, RALT,RGUI,RCTL, PGDN, TAB, LEFT,DOWN,RGHT
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
|
||||||
|
{
|
||||||
|
return pgm_read_byte(&keymaps[(layer)][(row)][(col)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t keymap_fn_layer(uint8_t fn_bits)
|
||||||
|
{
|
||||||
|
return pgm_read_byte(&fn_layer[biton(fn_bits)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t keymap_fn_keycode(uint8_t fn_bits)
|
||||||
|
{
|
||||||
|
return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
#include "news.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
|
void led_set(uint8_t usb_led)
|
||||||
|
{
|
||||||
|
// not supported now
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "print.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "news.h"
|
||||||
|
#include "matrix.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Matrix Array usage:
|
||||||
|
*
|
||||||
|
* ROW: 16
|
||||||
|
* COL:8
|
||||||
|
*
|
||||||
|
* 8bit wide
|
||||||
|
* +---------+
|
||||||
|
* 0|00 ... 07|
|
||||||
|
* 1|08 ... 0F|
|
||||||
|
* :| ... |
|
||||||
|
* :| ... |
|
||||||
|
* E|70 ... 77|
|
||||||
|
* F|78 ... 7F|
|
||||||
|
* +---------+
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static uint8_t matrix[MATRIX_ROWS];
|
||||||
|
#define ROW(code) ((code>>3)&0xF)
|
||||||
|
#define COL(code) (code&0x07)
|
||||||
|
|
||||||
|
static bool is_modified = false;
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint8_t matrix_rows(void)
|
||||||
|
{
|
||||||
|
return MATRIX_ROWS;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint8_t matrix_cols(void)
|
||||||
|
{
|
||||||
|
return MATRIX_COLS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init(void)
|
||||||
|
{
|
||||||
|
news_init();
|
||||||
|
|
||||||
|
// initialize matrix state: all keys off
|
||||||
|
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_scan(void)
|
||||||
|
{
|
||||||
|
is_modified = false;
|
||||||
|
|
||||||
|
uint8_t code;
|
||||||
|
code = news_recv();
|
||||||
|
if (code == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
phex(code); print(" ");
|
||||||
|
if (code&0x80) {
|
||||||
|
// break code
|
||||||
|
if (matrix_is_on(ROW(code), COL(code))) {
|
||||||
|
matrix[ROW(code)] &= ~(1<<COL(code));
|
||||||
|
is_modified = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// make code
|
||||||
|
if (!matrix_is_on(ROW(code), COL(code))) {
|
||||||
|
matrix[ROW(code)] |= (1<<COL(code));
|
||||||
|
is_modified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matrix_is_modified(void)
|
||||||
|
{
|
||||||
|
return is_modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool matrix_has_ghost(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool matrix_is_on(uint8_t row, uint8_t col)
|
||||||
|
{
|
||||||
|
return (matrix[row] & (1<<col));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint8_t matrix_get_row(uint8_t row)
|
||||||
|
{
|
||||||
|
return matrix[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_print(void)
|
||||||
|
{
|
||||||
|
print("\nr/c 01234567\n");
|
||||||
|
for (uint8_t row = 0; row < matrix_rows(); row++) {
|
||||||
|
phex(row); print(": ");
|
||||||
|
pbin_reverse(matrix_get_row(row));
|
||||||
|
print("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_key_count(void)
|
||||||
|
{
|
||||||
|
uint8_t count = 0;
|
||||||
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
||||||
|
count += bitpop(matrix[i]);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
|
@ -0,0 +1,168 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include "news.h"
|
||||||
|
|
||||||
|
|
||||||
|
void news_init(void)
|
||||||
|
{
|
||||||
|
NEWS_KBD_RX_INIT();
|
||||||
|
}
|
||||||
|
|
||||||
|
// RX ring buffer
|
||||||
|
#define RBUF_SIZE 8
|
||||||
|
static uint8_t rbuf[RBUF_SIZE];
|
||||||
|
static uint8_t rbuf_head = 0;
|
||||||
|
static uint8_t rbuf_tail = 0;
|
||||||
|
|
||||||
|
uint8_t news_recv(void)
|
||||||
|
{
|
||||||
|
uint8_t data = 0;
|
||||||
|
if (rbuf_head == rbuf_tail) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = rbuf[rbuf_tail];
|
||||||
|
rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// USART RX complete interrupt
|
||||||
|
ISR(NEWS_KBD_RX_VECT)
|
||||||
|
{
|
||||||
|
uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
|
||||||
|
if (next != rbuf_tail) {
|
||||||
|
rbuf[rbuf_head] = NEWS_KBD_RX_DATA;
|
||||||
|
rbuf_head = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
SONY NEWS Keyboard Protocol
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Resources
|
||||||
|
---------
|
||||||
|
Mouse protocol of NWA-5461(Japanese)
|
||||||
|
http://groups.google.com/group/fj.sys.news/browse_thread/thread/a01b3e3ac6ae5b2d
|
||||||
|
|
||||||
|
SONY NEWS Info(Japanese)
|
||||||
|
http://katsu.watanabe.name/doc/sonynews/
|
||||||
|
|
||||||
|
|
||||||
|
Pinouts
|
||||||
|
-------
|
||||||
|
EIA 232 male connector from NWP-5461
|
||||||
|
-------------
|
||||||
|
\ 1 2 3 4 5 /
|
||||||
|
\ 6 7 8 9 /
|
||||||
|
---------
|
||||||
|
1 VCC
|
||||||
|
2 BZ(Speaker)
|
||||||
|
3 Keyboard Data(from keyboard MCU TxD)
|
||||||
|
4 NC
|
||||||
|
5 FG
|
||||||
|
6 Unknown Input(to keyboard MCU RxD via schmitt trigger)
|
||||||
|
7 Mouse Data(from Mouse Ext connector)
|
||||||
|
8 Unknown Input(to Keyboard MCU Input via diode and buffer)
|
||||||
|
9 GND
|
||||||
|
NOTE: Two LED on keyboard are controlled by pin 6,8?
|
||||||
|
|
||||||
|
EIA 232 male connector from NWP-411A
|
||||||
|
-------------
|
||||||
|
\ 1 2 3 4 5 /
|
||||||
|
\ 6 7 8 9 /
|
||||||
|
---------
|
||||||
|
1 VCC
|
||||||
|
2 BZ(Speaker)
|
||||||
|
3 Keyboard Data(from keyboard MCU TxD)
|
||||||
|
4 NC
|
||||||
|
5 FG
|
||||||
|
6 NC
|
||||||
|
7 Mouse Data(from Mouse Ext connector)
|
||||||
|
8 NC
|
||||||
|
9 GND
|
||||||
|
NOTE: These are just from my guess and not confirmed.
|
||||||
|
|
||||||
|
|
||||||
|
Signaling
|
||||||
|
---------
|
||||||
|
~~~~~~~~~~ ____XOO0X111X222X333X444X555X666X777~~~~ ~~~~~~~
|
||||||
|
Idle Start LSB MSB Stop Idle
|
||||||
|
|
||||||
|
Idle: High
|
||||||
|
Start bit: Low
|
||||||
|
Stop bit: High
|
||||||
|
Bit order: LSB first
|
||||||
|
|
||||||
|
Baud rate: 9600
|
||||||
|
Interface: TTL level(5V) UART
|
||||||
|
|
||||||
|
NOTE: This is observed on NWP-5461 with its DIP switch all OFF.
|
||||||
|
|
||||||
|
|
||||||
|
Format
|
||||||
|
------
|
||||||
|
MSB LSB
|
||||||
|
7 6 5 4 3 2 1 0 bit
|
||||||
|
| | | | | | | |
|
||||||
|
| +-+-+-+-+-+-+-- scan code(00-7F)
|
||||||
|
+---------------- break flag: sets when released
|
||||||
|
|
||||||
|
|
||||||
|
Scan Codes
|
||||||
|
----------
|
||||||
|
SONY NEWS NWP-5461
|
||||||
|
,---. ,------------------------, ,------------------------. ,---------.
|
||||||
|
| 7A| | 01 | 02 | 03 | 04 | 05 | | 06 | 07 | 08 | 09 | 0A | | 68 | 69 | ,-----------.
|
||||||
|
`---' `------------------------' `------------------------' `---------' | 64| 65| 52|
|
||||||
|
,-------------------------------------------------------------. ,---. ,---------------|
|
||||||
|
| 0B| 0C| 0D| 0E| 0F| 10| 11| 12| 13| 14| 15| 16| 17| 18| 19 | | 6A| | 4B| 4C| 4D| 4E|
|
||||||
|
|-------------------------------------------------------------| |---| |---------------|
|
||||||
|
| 1A | 1B| 1C| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| | | 6B| | 4F| 50| 51| 56|
|
||||||
|
|---------------------------------------------------------' | |---| |---------------|
|
||||||
|
| 28 | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35 | | 6C| | 53| 54| 55| |
|
||||||
|
|-------------------------------------------------------------| |---| |-----------| 5A|
|
||||||
|
| 36 | 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 6D| | 57| 59| 58| |
|
||||||
|
|-------------------------------------------------------------| |---| |---------------|
|
||||||
|
| 43 | 44 | 45 | 46 | 47 | 48| 49| 4A | | 6E| | 66| 5B| 5C| 5D|
|
||||||
|
`-------------------------------------------------------------' `---' `---------------'
|
||||||
|
*/
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
Copyright 2012 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NEWS_H
|
||||||
|
#define NEWS_H
|
||||||
|
/*
|
||||||
|
* Primitive PS/2 Library for AVR
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* host role */
|
||||||
|
void news_init(void);
|
||||||
|
uint8_t news_recv(void);
|
||||||
|
|
||||||
|
/* device role */
|
||||||
|
|
||||||
|
#endif
|
|
@ -67,6 +67,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define KB_APP KB_APPLICATION
|
#define KB_APP KB_APPLICATION
|
||||||
#define KB_NUHS KB_NONUS_HASH
|
#define KB_NUHS KB_NONUS_HASH
|
||||||
#define KB_NUBS KB_NONUS_BSLASH
|
#define KB_NUBS KB_NONUS_BSLASH
|
||||||
|
#define KB_ERAS KB_ALT_ERASE,
|
||||||
|
#define KB_CLR KB_CLEAR
|
||||||
/* for Japanese */
|
/* for Japanese */
|
||||||
#define KB_ZKHK KB_GRAVE
|
#define KB_ZKHK KB_GRAVE
|
||||||
#define KB_RO KB_INT1
|
#define KB_RO KB_INT1
|
||||||
|
@ -86,6 +88,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define KB_P9 KB_KP_9
|
#define KB_P9 KB_KP_9
|
||||||
#define KB_P0 KB_KP_0
|
#define KB_P0 KB_KP_0
|
||||||
#define KB_PDOT KB_KP_DOT
|
#define KB_PDOT KB_KP_DOT
|
||||||
|
#define KB_PCMM KB_KP_COMMA
|
||||||
#define KB_PSLS KB_KP_SLASH
|
#define KB_PSLS KB_KP_SLASH
|
||||||
#define KB_PAST KB_KP_ASTERISK
|
#define KB_PAST KB_KP_ASTERISK
|
||||||
#define KB_PMNS KB_KP_MINUS
|
#define KB_PMNS KB_KP_MINUS
|
||||||
|
|
Loading…
Reference in New Issue