diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega2560.c b/firmware/asdf/src/Arch/asdf_arch_atmega2560.c index 6ddd9d5..f81455d 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega2560.c +++ b/firmware/asdf/src/Arch/asdf_arch_atmega2560.c @@ -738,7 +738,55 @@ asdf_cols_t asdf_arch_read_row(uint8_t row) ASDF_HIROW_PORT = rows >> 8; ASDF_LOROW_PORT = rows & 0xff; - return (asdf_cols_t) ASDF_COLUMNS_PORT; + return (asdf_cols_t) ASDF_COLUMNS_PIN; +} + +// PROCEDURE: asdf_arch_read_row +// INPUTS: (uint8_t) row: the row number to be scanned +// OUTPUTS: returns a word containing the active (pressed) columns +// +// DESCRIPTION: Outputs the argument to the ROW ports, then reads the column +// port and returns the value. The value is a binary representation of the keys +// pressed within the row, with 1=pressed, 0=released. +// +// SIDE EFFECTS: Sets ROW output port. +// +// NOTES: +// +// 1) The keymap represents an unpressed key as a "0" and a pressed key as a +// "1". So, if a keypress pulls the column line low, then the reading of the +// physical bits must be inverted. +// +// SCOPE: public +// +// COMPLEXITY: 1 +// +asdf_cols_t asdf_arch_osi_read_row(uint8_t row) +{ + asdf_cols_t cols; + + if (row > 7) { + cols = asdf_arch_read_row(row); + } else { + // enable the OSI keyboard + clear_bit(&ASDF_OSI_KBE_PORT, ASDF_OSI_KBE_BIT); + + // register the row to be read + ASDF_COLUMNS_DDR = ALL_OUTPUTS; + + ASDF_COLUMNS_PORT = (1 << row); + clear_bit(&ASDF_OSI_RW_PORT, ASDF_OSI_RW_BIT); + set_bit(&ASDF_OSI_RW_PORT, ASDF_OSI_RW_BIT); + + // Read in the columns + ASDF_COLUMNS_DDR = ALL_INPUTS; + return ASDF_COLUMNS_PIN; + + ASDF_LOROW_PORT = row & 0xff; + + cols = (asdf_cols_t) ASDF_COLUMNS_PORT; + } + return cols; } diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega2560.h b/firmware/asdf/src/Arch/asdf_arch_atmega2560.h index ecd1a35..78859d9 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega2560.h +++ b/firmware/asdf/src/Arch/asdf_arch_atmega2560.h @@ -318,6 +318,15 @@ #define ASDF_STROBE_DDR DDRB #define ASDF_STROBE_BIT 4 +#define ASDF_OSI_KBE_PORT ASDF_HIROW_PORT +#define ASDF_OSI_KBE_DDR ASDF_HIROW_DDR +#define ASDF_OSI_KBE_BIT 1 + +#define ASDF_OSI_RW_PORT ASDF_HIROW_PORT +#define ASDF_OSI_RW_DDR ASDF_HIROW_DDR +#define ASDF_OSI_RW_BIT 2 + + #define FUSE_INTERNAL_8MHZ_OSC_4MS (FUSE_CKSEL1 | FUSE_SUT0) #define FUSE_INTERNAL_8MHZ_OSC_65MS (FUSE_CKSEL1 | FUSE_SUT1) #define FUSE_XTAL_16MHZ_4MS (FUSE_CKSEL2 | FUSE_CKSEL1 | CKSEL0 | FUSE_SUT1)