aciodrv: add PANB support (+ aciotest handler)

add aciodrv-proc module

explanation : PANB works differently from other acio devices ; you send
one "start auto input" command without expecting a reply, and then the
piano keeps spamming "recv poll" commands on the acio bus and never replies
to any other commands.. failure to process these messages quickly enough
will saturate the serial buffer and cause checksum errors after a while.

for this reason, aciodrv-proc module was added in order to create a
thread which manages these recv poll commands and keeps the latest
known button state in memory so that it can be retrieved easily.
This commit is contained in:
CrazyRedMachine
2021-05-03 20:14:21 +02:00
parent d3026cd540
commit f88ffdb854
15 changed files with 465 additions and 8 deletions
+5
View File
@@ -9,6 +9,7 @@
#include "acio/hdxs.h"
#include "acio/icca.h"
#include "acio/kfca.h"
#include "acio/panb.h"
#define AC_IO_SOF 0xAA
#define AC_IO_ESCAPE 0xFF
@@ -38,6 +39,7 @@ enum ac_io_node_type {
AC_IO_NODE_TYPE_KFCA = 0x09060000,
AC_IO_NODE_TYPE_BI2A = 0x0d060000,
AC_IO_NODE_TYPE_RVOL = 0x09060001,
AC_IO_NODE_TYPE_PANB = 0x090E0000,
};
#pragma pack(push, 1)
@@ -78,6 +80,9 @@ struct ac_io_message {
struct ac_io_kfca_poll_in kfca_poll_in;
struct ac_io_kfca_poll_out kfca_poll_out;
struct ac_io_panb_poll_in panb_poll_in;
struct ac_io_panb_poll_out panb_poll_out;
struct ac_io_hdxs_output hdxs_output;
};
} cmd;
+42
View File
@@ -0,0 +1,42 @@
#ifndef AC_IO_PANB_H
#define AC_IO_PANB_H
#include <stdint.h>
#define AC_IO_CMD_PANB_POLL_REPLY 0x0110
#define AC_IO_CMD_PANB_SEND_LAMP 0x0111
#define AC_IO_CMD_PANB_START_AUTO_INPUT 0x0115
#define AC_IO_PANB_NUM_NODES 4
#define AC_IO_PANB_MAX_KEYS (7*AC_IO_PANB_NUM_NODES)
#define AC_IO_PANB_MAX_KEYPAIRS (AC_IO_PANB_MAX_KEYS/2)
struct ac_io_panb_keypair {
uint8_t key2 : 4;
uint8_t key1 : 4;
};
#pragma pack(push, 1)
struct ac_io_panb_poll_in {
/* last received command sequence number (start_auto_input / send_lamp) */
uint8_t sub_seq1;
/* auto-increment sequence number for autopoll reports */
uint8_t sub_seq2;
struct ac_io_panb_keypair keypair[AC_IO_PANB_MAX_KEYPAIRS];
};
#pragma pack(pop)
struct ac_io_panb_color {
uint8_t red;
uint8_t green;
uint8_t blue;
};
#pragma pack(push, 1)
struct ac_io_panb_poll_out {
struct ac_io_panb_color key[AC_IO_PANB_MAX_KEYS];
};
#pragma pack(pop)
#endif