mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 09:10:30 +08:00
refactoring
This commit is contained in:
parent
649a57e842
commit
c49cc1b46b
@ -20,31 +20,30 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
// #define CMD_SERIAL Serial1
|
||||||
|
// #define CMD_SERIAL_SPEED 115200
|
||||||
|
// #define CMD_SERIAL_TIMEOUT 100000
|
||||||
|
// -- OR --
|
||||||
|
// #define CMD_SPI
|
||||||
|
|
||||||
#if !(defined(CMD_SERIAL) || defined(CMD_SPI))
|
#if !(defined(CMD_SERIAL) || defined(CMD_SPI))
|
||||||
# error CMD phy is not defined
|
# error CMD phy is not defined
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#ifdef CMD_SPI
|
|
||||||
# include <SPI.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HID_DYNAMIC
|
#ifdef HID_DYNAMIC
|
||||||
# include <avr/eeprom.h>
|
# include <avr/eeprom.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
|
#ifdef CMD_SPI
|
||||||
|
# include "spi.h"
|
||||||
|
#endif
|
||||||
#include "usb/hid.h"
|
#include "usb/hid.h"
|
||||||
#include "ps2/hid.h"
|
#include "ps2/hid.h"
|
||||||
|
|
||||||
|
|
||||||
// #define CMD_SERIAL Serial1
|
|
||||||
// #define CMD_SERIAL_SPEED 115200
|
|
||||||
// #define CMD_SERIAL_TIMEOUT 100000
|
|
||||||
// -- OR --
|
|
||||||
// #define CMD_SPI
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
static UsbKeyboard *_usb_kbd = NULL;
|
static UsbKeyboard *_usb_kbd = NULL;
|
||||||
static UsbMouseAbsolute *_usb_mouse_abs = NULL;
|
static UsbMouseAbsolute *_usb_mouse_abs = NULL;
|
||||||
@ -246,55 +245,6 @@ static uint8_t _handleRequest(const uint8_t *data) { // 8 bytes
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
#ifdef CMD_SPI
|
|
||||||
static volatile uint8_t _spi_in[8] = {0};
|
|
||||||
static volatile uint8_t _spi_in_index = 0;
|
|
||||||
|
|
||||||
static volatile uint8_t _spi_out[8] = {0};
|
|
||||||
static volatile uint8_t _spi_out_index = 0;
|
|
||||||
|
|
||||||
static bool _spiReady() {
|
|
||||||
return (!_spi_out[0] && _spi_in_index == 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _spiWrite(const uint8_t *data) {
|
|
||||||
// Меджик в нулевом байте разрешает начать ответ
|
|
||||||
for (int index = 7; index >= 0; --index) {
|
|
||||||
_spi_out[index] = data[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(SPI_STC_vect) {
|
|
||||||
uint8_t in = SPDR;
|
|
||||||
if (_spi_out[0] && _spi_out_index < 8) {
|
|
||||||
SPDR = _spi_out[_spi_out_index];
|
|
||||||
if (!(SPSR & (1 << WCOL))) {
|
|
||||||
++_spi_out_index;
|
|
||||||
if (_spi_out_index == 8) {
|
|
||||||
_spi_out_index = 0;
|
|
||||||
_spi_in_index = 0;
|
|
||||||
_spi_out[0] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
static bool receiving = false;
|
|
||||||
if (!receiving && in == PROTO::MAGIC) {
|
|
||||||
receiving = true;
|
|
||||||
}
|
|
||||||
if (receiving && _spi_in_index < 8) {
|
|
||||||
_spi_in[_spi_in_index] = in;
|
|
||||||
++_spi_in_index;
|
|
||||||
}
|
|
||||||
if (_spi_in_index == 8) {
|
|
||||||
receiving = false;
|
|
||||||
}
|
|
||||||
SPDR = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
static void _sendResponse(uint8_t code) {
|
static void _sendResponse(uint8_t code) {
|
||||||
static uint8_t prev_code = PROTO::RESP::NONE;
|
static uint8_t prev_code = PROTO::RESP::NONE;
|
||||||
@ -344,7 +294,7 @@ static void _sendResponse(uint8_t code) {
|
|||||||
# ifdef CMD_SERIAL
|
# ifdef CMD_SERIAL
|
||||||
CMD_SERIAL.write(data, 8);
|
CMD_SERIAL.write(data, 8);
|
||||||
# elif defined(CMD_SPI)
|
# elif defined(CMD_SPI)
|
||||||
_spiWrite(data);
|
spiWrite(data);
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,6 +308,9 @@ int main() {
|
|||||||
unsigned long last = micros();
|
unsigned long last = micros();
|
||||||
uint8_t buffer[8];
|
uint8_t buffer[8];
|
||||||
uint8_t index = 0;
|
uint8_t index = 0;
|
||||||
|
# elif defined(CMD_SPI)
|
||||||
|
spiBegin();
|
||||||
|
# endif
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
# ifdef HID_WITH_PS2
|
# ifdef HID_WITH_PS2
|
||||||
@ -365,6 +318,7 @@ int main() {
|
|||||||
_ps2_kbd->periodic();
|
_ps2_kbd->periodic();
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
# ifdef CMD_SERIAL
|
||||||
if (CMD_SERIAL.available() > 0) {
|
if (CMD_SERIAL.available() > 0) {
|
||||||
buffer[index] = (uint8_t)CMD_SERIAL.read();
|
buffer[index] = (uint8_t)CMD_SERIAL.read();
|
||||||
if (index == 7) {
|
if (index == 7) {
|
||||||
@ -384,23 +338,11 @@ int main() {
|
|||||||
index = 0;
|
index = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
# elif defined(CMD_SPI)
|
# elif defined(CMD_SPI)
|
||||||
pinMode(MISO, OUTPUT);
|
if (spiReady()) {
|
||||||
SPCR = (1 << SPE) | (1 << SPIE); // Slave, SPI En, IRQ En
|
_sendResponse(_handleRequest(spiGet()));
|
||||||
|
|
||||||
while (true) {
|
|
||||||
# ifdef HID_WITH_PS2
|
|
||||||
if (_ps2_kbd) {
|
|
||||||
_ps2_kbd->periodic();
|
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
if (_spiReady()) {
|
|
||||||
_sendResponse(_handleRequest((const uint8_t *)_spi_in));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
# endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
83
hid/src/spi.cpp
Normal file
83
hid/src/spi.cpp
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
# #
|
||||||
|
# KVMD - The main Pi-KVM daemon. #
|
||||||
|
# #
|
||||||
|
# Copyright (C) 2018 Maxim Devaev <mdevaev@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 3 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 <https://www.gnu.org/licenses/>. #
|
||||||
|
# #
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "spi.h"
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
|
||||||
|
static volatile uint8_t _spi_in[8] = {0};
|
||||||
|
static volatile uint8_t _spi_in_index = 0;
|
||||||
|
|
||||||
|
static volatile uint8_t _spi_out[8] = {0};
|
||||||
|
static volatile uint8_t _spi_out_index = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void spiBegin() {
|
||||||
|
pinMode(MISO, OUTPUT);
|
||||||
|
SPCR = (1 << SPE) | (1 << SPIE); // Slave, SPI En, IRQ En
|
||||||
|
}
|
||||||
|
|
||||||
|
bool spiReady() {
|
||||||
|
return (!_spi_out[0] && _spi_in_index == 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t *spiGet() {
|
||||||
|
return (const uint8_t *)_spi_in;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spiWrite(const uint8_t *data) {
|
||||||
|
// Меджик в нулевом байте разрешает начать ответ
|
||||||
|
for (int index = 7; index >= 0; --index) {
|
||||||
|
_spi_out[index] = data[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ISR(SPI_STC_vect) {
|
||||||
|
uint8_t in = SPDR;
|
||||||
|
if (_spi_out[0] && _spi_out_index < 8) {
|
||||||
|
SPDR = _spi_out[_spi_out_index];
|
||||||
|
if (!(SPSR & (1 << WCOL))) {
|
||||||
|
++_spi_out_index;
|
||||||
|
if (_spi_out_index == 8) {
|
||||||
|
_spi_out_index = 0;
|
||||||
|
_spi_in_index = 0;
|
||||||
|
_spi_out[0] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
static bool receiving = false;
|
||||||
|
if (!receiving && in != 0) {
|
||||||
|
receiving = true;
|
||||||
|
}
|
||||||
|
if (receiving && _spi_in_index < 8) {
|
||||||
|
_spi_in[_spi_in_index] = in;
|
||||||
|
++_spi_in_index;
|
||||||
|
}
|
||||||
|
if (_spi_in_index == 8) {
|
||||||
|
receiving = false;
|
||||||
|
}
|
||||||
|
SPDR = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
31
hid/src/spi.h
Normal file
31
hid/src/spi.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
# #
|
||||||
|
# KVMD - The main Pi-KVM daemon. #
|
||||||
|
# #
|
||||||
|
# Copyright (C) 2018 Maxim Devaev <mdevaev@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 3 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 <https://www.gnu.org/licenses/>. #
|
||||||
|
# #
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
|
||||||
|
void spiBegin();
|
||||||
|
bool spiReady();
|
||||||
|
const uint8_t *spiGet();
|
||||||
|
void spiWrite(const uint8_t *data);
|
||||||
Loading…
x
Reference in New Issue
Block a user