Added a math library, with clamp and POW. added printf support for printing doubles added a few helper functions in PIT for calcaulting the time in seconds of a clock cycle based on divisor
146 lines
3.9 KiB
C
146 lines
3.9 KiB
C
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#ifndef ARCH_KEYB_H
|
|
#define ARCH_KEYB_H
|
|
|
|
#define KEYB_PORT (0x60)
|
|
|
|
#define KEYB_CMD_RETRIES 3
|
|
|
|
typedef enum {
|
|
KEYB_CMD_SET_LEDS = 0xED,
|
|
KEYB_CMD_ECHO = 0xEE,
|
|
KEYB_CMD_DO_SCAN_CODE = 0xF0,
|
|
KEYB_CMD_IDENTIFY_KEYB = 0xF2,
|
|
KEYB_CMD_SET_TYPEMATIC = 0xF3,
|
|
KEYB_CMD_ENABLE_SCANNING = 0xF4,
|
|
KEYB_CMD_DISABLE_SCANNING = 0xF5,
|
|
KEYB_CMD_SET_DEFAULT_PARAMS = 0xF6,
|
|
KEYB_CMD_TYPEMATIC_AUTOREPEAT_3 = 0xF7,
|
|
KEYB_CMD_ALL_MAKE_RELEASE_3 = 0xF8,
|
|
KEYB_CMD_MAKE_ONLY_3 = 0xF9,
|
|
KEYB_CMD_TYPE_AUTOREPEAT_MAKE_RELEASE_3 = 0xFA,
|
|
KEYB_CMD_KEY_TYPEMATIC_AUTOREPEAT_3 = 0xFB,
|
|
KEYB_CMD_KEY_MAKE_RELEASE_3 = 0xFC,
|
|
KEYB_CMD_KEY_MAKE_3 = 0xFD,
|
|
KEYB_RESEND_LAST_BYTE = 0xFE,
|
|
KEYB_RESET_SELF_TEST = 0xFF
|
|
} keyb_cmd_t;
|
|
|
|
#define KEYB_LED_SCRL_LCK (1 << 0)
|
|
#define KEYB_LED_NUM_LCK (1 << 1)
|
|
#define KEYB_LED_CAP_LCK (1 << 2)
|
|
|
|
|
|
// TODO investigate
|
|
#define KEYB_GET_SCAN_SET (0x00)
|
|
#define KEYB_SET_SCAN_1 (0x01)
|
|
#define KEYB_SET_SCAN_2 (0x02)
|
|
#define KEYB_SET_SCAN_3 (0x03)
|
|
|
|
typedef enum {
|
|
KEYB_RESP_ERR = 0x00,
|
|
KEYB_RESP_SELF_TEST_PASSED = 0xAA,
|
|
KEYB_RESP_ECHO = 0xEE,
|
|
KEYB_RESP_ACK = 0xFA,
|
|
KEYB_RESP_SELF_TEST_FAILED = 0xFC,
|
|
KEYB_RESP_SELF_TEST_FAILED_TWO = 0xFD,
|
|
KEYB_RESP_RESEND = 0xFE,
|
|
KEYB_RESP_ERR_TWO = 0xFF
|
|
} keyb_resp_t;
|
|
|
|
#define STATUS_FLAG_RSHIFT (1 << 0)
|
|
#define STATUS_FLAG_LSHIFT (1 << 1)
|
|
#define STATUS_FLAG_CTRL (1 << 2)
|
|
#define STATUS_FLAG_ALT (1 << 3)
|
|
#define STATUS_FLAG_SCRL_LOCK (1 << 4)
|
|
#define STATUS_FLAG_NUM_LOCK (1 << 5)
|
|
#define STATUS_FLAG_CAPS_LOCK (1 << 6)
|
|
#define STATUS_FLAG_INSERT (1 << 7)
|
|
|
|
typedef enum {
|
|
KEY_NONE,
|
|
KEY_ESC = 0x01,
|
|
KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
|
|
KEY_MINUS, KEY_EQUALS,
|
|
KEY_BACKSPACE, KEY_TAB,
|
|
KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P,
|
|
KEY_LEFT_BRACKET, KEY_RIGHT_BRACKET, KEY_ENTER, KEY_LEFT_CTRL,
|
|
KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L,
|
|
KEY_SEMICOLON, KEY_SINGLE_QUOTE, KEY_BACK_TICK, KEY_LEFT_SHIFT, KEY_BACKSLASH,
|
|
KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M,
|
|
KEY_COMMA, KEY_PERIOD,
|
|
KEY_FORWARDSLASH,
|
|
KEY_RIGHT_SHIFT,
|
|
KEY_KP_ASTERISK,
|
|
KEY_LEFT_ALT,
|
|
KEY_SPACE, KEY_CAPSLOCK,
|
|
KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10,
|
|
KEY_NUMLOCK, KEY_SCROLLLOCK,
|
|
KEY_KP_7, KEY_KP_8, KEY_KP_9,
|
|
KEY_KP_MINUS,
|
|
KEY_KP_4, KEY_KP_5, KEY_KP_6,
|
|
KEY_KP_PLUS,
|
|
KEY_KP_1, KEY_KP_2, KEY_KP_3, KEY_KP_0,
|
|
KEY_KP_PERIOD,
|
|
KEY_F11 = 0x57,
|
|
KEY_F12,
|
|
KEY_ESC_R = 0x81,
|
|
KEY_1_R, KEY_2_R, KEY_3_R, KEY_4_R, KEY_5_R, KEY_6_R, KEY_7_R, KEY_8_R, KEY_9_R, KEY_0_R,
|
|
KEY_MINUS_R, KEY_EQUALS_R,
|
|
KEY_BACKSPACE_R,
|
|
KEY_TAB_R,
|
|
KEY_Q_R, KEY_W_R, KEY_E_R, KEY_R_R, KEY_T_R, KEY_Y_R, KEY_U_R, KEY_I_R, KEY_O_R, KEY_P_R,
|
|
KEY_LEFT_BRACKET_R, KEY_RIGHT_BRACKET_R,
|
|
KEY_ENTER_R, KEY_LEFT_CTRL_R,
|
|
KEY_A_R, KEY_S_R, KEY_D_R, KEY_F_R, KEY_G_R, KEY_H_R, KEY_J_R, KEY_K_R, KEY_L_R,
|
|
KEY_SEMICOLON_R, KEY_SINGLE_QUOTE_R, KEY_BACK_TICK_R, KEY_LEFT_SHIFT_R, KEY_BACKSLASH_R,
|
|
KEY_Z_R, KEY_X_R, KEY_C_R, KEY_V_R, KEY_B_R, KEY_N_R, KEY_M_R,
|
|
KEY_COMMA_R, KEY_PERIOD_R,
|
|
KEY_FORWARDSLASH_R,
|
|
KEY_RIGHT_SHIFT_R,
|
|
KEY_KP_ASTERISK_R,
|
|
KEY_LEFT_ALT_R,
|
|
KEY_SPACE_R, KEY_CAPSLOCK_R,
|
|
KEY_F1_R, KEY_F2_R, KEY_F3_R, KEY_F4_R, KEY_F5_R, KEY_F6_R, KEY_F7_R, KEY_F8_R, KEY_F9_R, KEY_F10_R,
|
|
KEY_NUMLOCK_R, KEY_SCROLLLOCK_R,
|
|
KEY_KP_7_R, KEY_KP_8_R, KEY_KP_9_R,
|
|
KEY_KP_MINUS_R,
|
|
KEY_KP_4_R, KEY_KP_5_R, KEY_KP_6_R,
|
|
KEY_KP_PLUS_R,
|
|
KEY_KP_1_R, KEY_KP_2_R, KEY_KP_3_R, KEY_KP_0_R,
|
|
KEY_KP_PERIOD_R,
|
|
KEY_F11_R = 0xD7,
|
|
KEY_F12_R,
|
|
} kb_key_code_t;
|
|
|
|
#define KEY_PRESS_RELEASE_DIFF (KEY_ESC_R - KEY_ESC)
|
|
|
|
typedef struct {
|
|
kb_key_code_t key_code;
|
|
uint8_t flags;
|
|
bool release;
|
|
} key_press_t ;
|
|
|
|
struct keyboard_state {
|
|
bool ready;
|
|
|
|
bool waiting_for_commands;
|
|
|
|
uint8_t leds;
|
|
uint8_t flags;
|
|
};
|
|
|
|
|
|
void init_kb(void);
|
|
|
|
void send_kb_commands(void);
|
|
void queue_kb_command(uint8_t command);
|
|
|
|
|
|
kb_key_code_t decode_scancode(uint8_t scancode);
|
|
key_press_t do_keypress(kb_key_code_t keycode);
|
|
|
|
#endif
|