diff --git a/src/main/extio/Module.mk b/src/main/extio/Module.mk new file mode 100644 index 0000000..9845d60 --- /dev/null +++ b/src/main/extio/Module.mk @@ -0,0 +1,4 @@ +libs += extio + +src_extio := \ + cmd.c \ diff --git a/src/main/extio/cmd.c b/src/main/extio/cmd.c new file mode 100644 index 0000000..e392fae --- /dev/null +++ b/src/main/extio/cmd.c @@ -0,0 +1,16 @@ +#include "cmd.h" + +uint8_t extio_cmd_checksum(const struct extio_cmd_write *write) +{ + const uint8_t *data; + uint32_t checksum; + + data = (const uint8_t *) write; + + checksum = 0; + checksum += data[0]; + checksum += data[1]; + checksum += data[2]; + + return (uint8_t) (checksum & 0x7F); +} \ No newline at end of file diff --git a/src/main/extio/cmd.h b/src/main/extio/cmd.h new file mode 100644 index 0000000..e764705 --- /dev/null +++ b/src/main/extio/cmd.h @@ -0,0 +1,49 @@ +#ifndef EXTIO_CMD_H +#define EXTIO_CMD_H + +#include + +#define EXTIO_PAD_LIGHT_MAX_PLAYERS 2 + +enum extio_status { + EXTIO_STATUS_OK = 0x11, +}; + +#pragma pack(push, 1) + +struct extio_cmd_pad_light { + uint8_t unknown : 3; + uint8_t right : 1; + uint8_t left : 1; + uint8_t down : 1; + uint8_t up : 1; + uint8_t unknown_80 : 1; +}; + +struct extio_cmd_write { + struct extio_cmd_pad_light pad_lights[EXTIO_PAD_LIGHT_MAX_PLAYERS]; + + uint8_t unknown3 : 3; + uint8_t sensor_read_mode : 3; + uint8_t neons : 1; + uint8_t unknown4 : 1; + + uint8_t checksum; +}; + +struct extio_cmd_read { + uint8_t status; +}; + +_Static_assert( + sizeof(struct extio_cmd_write) == 4, + "struct extio_cmd_write is the wrong size"); +_Static_assert( + sizeof(struct extio_cmd_read) == 1, + "struct extio_cmd_read is the wrong size"); + +#pragma pack(pop) + +uint8_t extio_cmd_checksum(const struct extio_cmd_write *write); + +#endif \ No newline at end of file