From f1809926f61d352a9bd1d42cbbfb8bcea6e15660 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 23 Jul 2020 10:57:18 -0600 Subject: [PATCH] bonw14 --- src/board/system76/bonw14/board.c | 83 ++++++ src/board/system76/bonw14/board.mk | 51 ++++ src/board/system76/bonw14/gpio.c | 271 ++++++++++++++++++ .../system76/bonw14/include/board/gpio.h | 55 ++++ .../system76/bonw14/include/board/keymap.h | 52 ++++ src/board/system76/bonw14/kbled.c | 40 +++ src/board/system76/bonw14/keymap/default.c | 22 ++ src/board/system76/bonw14/keymap/jeremy.c | 22 ++ src/board/system76/common/kbscan.c | 14 + 9 files changed, 610 insertions(+) create mode 100644 src/board/system76/bonw14/board.c create mode 100644 src/board/system76/bonw14/board.mk create mode 100644 src/board/system76/bonw14/gpio.c create mode 100644 src/board/system76/bonw14/include/board/gpio.h create mode 100644 src/board/system76/bonw14/include/board/keymap.h create mode 100644 src/board/system76/bonw14/kbled.c create mode 100644 src/board/system76/bonw14/keymap/default.c create mode 100644 src/board/system76/bonw14/keymap/jeremy.c diff --git a/src/board/system76/bonw14/board.c b/src/board/system76/bonw14/board.c new file mode 100644 index 0000000..69f5cf5 --- /dev/null +++ b/src/board/system76/bonw14/board.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern uint8_t main_cycle; + +void board_init(void) { + // Allow CPU to boot + gpio_set(&SB_KBCRST_N, true); + // Allow backlight to be turned on + gpio_set(&BKL_EN, true); + // Enable camera + gpio_set(&CCD_EN, true); + // Enable wireless + gpio_set(&BT_EN, true); + gpio_set(&WLAN_EN, true); + gpio_set(&WLAN_PWR_EN, true); + // Enable USB port power? + gpio_set(&USB_PWR_EN_N, false); + // Assert SMI#, SCI#, and SWI# + gpio_set(&SCI_N, true); + gpio_set(&SMI_N, true); + gpio_set(&SWI_N, true); + + // Enable POST codes + SPCTRL1 |= 0xC8; +} + +// Set PL4 using PECI +static int set_power_limit(uint8_t watts) { + return peci_wr_pkg_config( + 60, // index + 0, // param + ((uint32_t)watts) * 8 + ); +} + +void board_on_ac(bool ac) { + uint8_t power_limit = ac ? POWER_LIMIT_AC : POWER_LIMIT_DC; + // Retry, timeout errors happen occasionally + for (int i = 0; i < 16; i++) { + int res = set_power_limit(power_limit); + DEBUG("set_power_limit %d = %d\n", power_limit, res); + if (res == 0x40) { + break; + } else if (res < 0) { + ERROR("set_power_limit failed: 0x%02X\n", -res); + } else { + ERROR("set_power_limit unknown response: 0x%02X\n", res); + } + } +} + +void board_event(void) { + bool ac = !gpio_get(&ACIN_N); + + static bool last_power_limit_ac = true; + // We don't use power_state because the latency needs to be low + if (gpio_get(&BUF_PLT_RST_N)) { + if (last_power_limit_ac != ac) { + board_on_ac(ac); + last_power_limit_ac = ac; + } + } else { + last_power_limit_ac = true; + } + + // Read POST codes + while (P80H81HS & 1) { + uint8_t p80h = P80HD; + uint8_t p81h = P81HD; + P80H81HS |= 1; + + DEBUG("POST %02X%02X\n", p81h, p80h); + } +} diff --git a/src/board/system76/bonw14/board.mk b/src/board/system76/bonw14/board.mk new file mode 100644 index 0000000..2aa66a0 --- /dev/null +++ b/src/board/system76/bonw14/board.mk @@ -0,0 +1,51 @@ +EC=it5570e + +# Add keymap to src +KEYMAP?=default +SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c + +# Set discrete GPU I2C bus +CFLAGS+=-DI2C_DGPU=I2C_1 + +# Set battery I2C bus +CFLAGS+=-DI2C_SMBUS=I2C_4 + +# Set touchpad PS2 bus +CFLAGS+=-DPS2_TOUCHPAD=PS2_3 + +# Set smart charger parameters +CFLAGS+=\ + -DCHARGER_CHARGE_CURRENT=1536 \ + -DCHARGER_CHARGE_VOLTAGE=16800 \ + -DCHARGER_INPUT_CURRENT=14000 + +# Set CPU power limits in watts +CFLAGS+=\ + -DPOWER_LIMIT_AC=180 \ + -DPOWER_LIMIT_DC=28 + +# Custom fan curve +CLFAGS+=-DBOARD_HEATUP=5 +CFLAGS+=-DBOARD_COOLDOWN=20 +CFLAGS+=-DBOARD_FAN_POINTS="\ + FAN_POINT(60, 40), \ + FAN_POINT(65, 60), \ + FAN_POINT(70, 75), \ + FAN_POINT(75, 90), \ + FAN_POINT(80, 100) \ +" + +# Enable DGPU support +CFLAGS+=-DHAVE_DGPU=1 +CLFAGS+=-DBOARD_DGPU_HEATUP=5 +CFLAGS+=-DBOARD_DGPU_COOLDOWN=20 +CFLAGS+=-DBOARD_DGPU_FAN_POINTS="\ + FAN_POINT(60, 40), \ + FAN_POINT(65, 60), \ + FAN_POINT(70, 75), \ + FAN_POINT(75, 90), \ + FAN_POINT(80, 100) \ +" + +# Add system76 common code +include src/board/system76/common/common.mk diff --git a/src/board/system76/bonw14/gpio.c b/src/board/system76/bonw14/gpio.c new file mode 100644 index 0000000..0294e16 --- /dev/null +++ b/src/board/system76/bonw14/gpio.c @@ -0,0 +1,271 @@ +#include +#include + +struct Gpio __code ACIN_N = GPIO(B, 0); +struct Gpio __code AC_PRESENT = GPIO(E, 1); +struct Gpio __code AC_V1_EC = GPIO(J, 7); +struct Gpio __code AC_V2_EC = GPIO(F, 1); +struct Gpio __code ALL_SYS_PWRGD = GPIO(C, 0); +struct Gpio __code BKL_EN = GPIO(H, 2); +struct Gpio __code BT_EN = GPIO(H, 7); +struct Gpio __code BUF_PLT_RST_N = GPIO(D, 2); +struct Gpio __code CCD_EN = GPIO(D, 1); +struct Gpio __code DD_ON = GPIO(E, 4); +struct Gpio __code DGPU_PWR_EN = GPIO(A, 0); +struct Gpio __code EC_EN = GPIO(B, 6); +struct Gpio __code EC_RSMRST_N = GPIO(E, 5); +struct Gpio __code GC6_FB_EN = GPIO(H, 3); +struct Gpio __code LED_ACIN = GPIO(C, 7); +struct Gpio __code LED_BAT_CHG = GPIO(H, 5); +struct Gpio __code LED_BAT_FULL = GPIO(J, 0); +struct Gpio __code LED_PWR = GPIO(D, 0); +struct Gpio __code LID_SW_N = GPIO(B, 1); +struct Gpio __code PM_PWROK = GPIO(C, 6); +struct Gpio __code PWR_BTN_N = GPIO(D, 5); +struct Gpio __code PWR_SW_N = GPIO(B, 3); +struct Gpio __code SB_KBCRST_N = GPIO(E, 6); +struct Gpio __code SCI_N = GPIO(D, 3); +// TODO - SLP_SUS_N - does it work? +struct Gpio __code SMI_N = GPIO(D, 4); +struct Gpio __code SUSB_N_PCH = GPIO(H, 6); +struct Gpio __code SUSC_N_PCH = GPIO(H, 1); +struct Gpio __code SWI_N = GPIO(B, 5); +struct Gpio __code USB_PWR_EN_N = GPIO(F, 7); // renamed to USBVCC_ON# +struct Gpio __code VA_EC_EN = GPIO(J, 4); // renamed to SLP_SUS# +struct Gpio __code WLAN_EN = GPIO(G, 1); +struct Gpio __code WLAN_PWR_EN = GPIO(A, 3); +struct Gpio __code XLP_OUT = GPIO(B, 4); // renamed to EN_3V + +void gpio_init() { + // Enable LPC reset on GPD2 + GCR = 0x04; + // Enable SMBus channel 4 + GCR15 = (1 << 4); + // Set GPF2 and GPF3 to 3.3V + GCR20 = 0; + + // Set GPIO data + GPDRA = 0xA1; + GPDRB = 0x18; + GPDRC = 0x00; + GPDRD = 0x38; + GPDRE = 0x00; + GPDRF = 0xC0; + GPDRG = 0x00; + GPDRH = 0x00; + GPDRI = 0x00; + GPDRJ = 0x02; + + // Set GPIO control + // DGPU_PWR_EN + GPCRA0 = GPIO_OUT; + // KBC_BEEP + GPCRA1 = GPIO_ALT; + // CPU_FAN_PWM + GPCRA2 = GPIO_ALT; + // WLAN_PWR_EN + GPCRA3 = GPIO_OUT | GPIO_UP; + // VGA_FAN_PWM + GPCRA4 = GPIO_ALT; + // EC_LAN_EN + GPCRA5 = GPIO_OUT; + // TBTA_I2C_IRQ2Z - TODO + GPCRA6 = GPIO_OUT | GPIO_UP; + // CPU_ID_EC - TODO + GPCRA7 = GPIO_OUT; + // AC_IN# + GPCRB0 = GPIO_IN | GPIO_UP; + // LID_SW# + GPCRB1 = GPIO_IN | GPIO_UP; + // LAN_WAKE# + GPCRB2 = GPIO_IN | GPIO_UP; + // PWR_SW# + GPCRB3 = GPIO_IN; + // EN_3V + GPCRB4 = GPIO_OUT; + // SWI# + GPCRB5 = GPIO_OUT | GPIO_UP; + // EC_EN + GPCRB6 = GPIO_OUT | GPIO_UP; + // NO PIN + GPCRB7 = GPIO_IN; + // ALL_SYS_PWRGD + GPCRC0 = GPIO_IN; + // KBC_SMBus_CLK1 + GPCRC1 = GPIO_ALT; + // KBC_SMBus_DAT1 + GPCRC2 = GPIO_ALT; + // KB-SO16 + GPCRC3 = GPIO_IN; + // CNVI_DET# + GPCRC4 = GPIO_IN | GPIO_UP; + // KB-SO17 + GPCRC5 = GPIO_IN; + // PM_PWROK + GPCRC6 = GPIO_OUT; + // LED_ACIN + GPCRC7 = GPIO_OUT | GPIO_UP; + // LED_PWR + GPCRD0 = GPIO_OUT | GPIO_UP; + // CCD_EN + GPCRD1 = GPIO_OUT | GPIO_UP; + // BUF_PLT_RST# + GPCRD2 = GPIO_ALT; + // KBC_SCI# + GPCRD3 = GPIO_IN; + // SMI# + GPCRD4 = GPIO_IN; + // PWR_BTN# + GPCRD5 = GPIO_OUT | GPIO_UP; + // CPU_FANSEN + GPCRD6 = GPIO_ALT; + // VGA_FANSEN + GPCRD7 = GPIO_ALT; + // SMC_BAT + GPCRE0 = GPIO_ALT; + // AC_PRESENT + GPCRE1 = GPIO_OUT | GPIO_UP; + // GPU_PWR_EN# and TBTA_HRESET - TODO + GPCRE2 = GPIO_IN; + // USB_CHARGE_EN + GPCRE3 = GPIO_OUT | GPIO_UP; + // DD_ON + GPCRE4 = GPIO_OUT | GPIO_DOWN; + // EC_RSMRST# + GPCRE5 = GPIO_OUT; + // SB_KBCRST# + GPCRE6 = GPIO_OUT; + // SMD_BAT + GPCRE7 = GPIO_ALT; + // 80CLK + GPCRF0 = GPIO_IN; + // AC_V2_EC + GPCRF1 = GPIO_IN; + // 3IN1 + GPCRF2 = GPIO_IN | GPIO_UP; + // VGA_THROTTLE + GPCRF3 = GPIO_OUT; + // TP_CLK + GPCRF4 = GPIO_ALT; + // TP_DATA + GPCRF5 = GPIO_ALT; + // H_PECI + GPCRF6 = GPIO_ALT; + // USBVCC_ON# + GPCRF7 = GPIO_OUT | GPIO_UP; + // EAPD_MODE + GPCRG0 = GPIO_IN; + // WLAN_EN + GPCRG1 = GPIO_OUT | GPIO_UP; + // 100K pull-up to VDD3 + GPCRG2 = GPIO_OUT; + // ALSPI_CE# + GPCRG3 = GPIO_ALT; + // ALSPI_MSI + GPCRG4 = GPIO_ALT; + // ALSPI_MSO + GPCRG5 = GPIO_ALT; + // H_PROCHOT_EC + GPCRG6 = GPIO_OUT | GPIO_UP; + // ALSPI_SCLK + GPCRG7 = GPIO_ALT; + // PM_CLKRUN# + GPCRH0 = GPIO_ALT; + // SUSC#_PCH + GPCRH1 = GPIO_IN; + // BKL_EN + GPCRH2 = GPIO_OUT | GPIO_UP; + // GC6_FB_EN + GPCRH3 = GPIO_IN; + // TH_OVERT#1 + GPCRH4 = GPIO_IN; + // LED_BAT_CHG + GPCRH5 = GPIO_OUT | GPIO_UP; + // SUSB#_PCH + GPCRH6 = GPIO_IN; + // BT_EN and VGA_GATE_CTRL - TODO + GPCRH7 = GPIO_OUT; + // BAT_DET + GPCRI0 = GPIO_ALT; + // BAT_VOLT + GPCRI1 = GPIO_ALT; + // ECPIN68 - TODO + GPCRI2 = GPIO_OUT; + // THERM_VOLT + GPCRI3 = GPIO_ALT; + // TOTAL_CUR + GPCRI4 = GPIO_ALT; + // CABLE_DET and PCH_SLP_SUS# - TODO + GPCRI5 = GPIO_IN; + // FAN_CLEAN + GPCRI6 = GPIO_OUT; + // MODEL_ID + GPCRI7 = GPIO_IN; + // LED_BAT_FULL + GPCRJ0 = GPIO_OUT | GPIO_UP; + // KBC_MUTE# + GPCRJ1 = GPIO_OUT; + // ECPIN78 - TODO + GPCRJ2 = GPIO_IN; + // PERKB-DET# + GPCRJ3 = GPIO_IN | GPIO_UP; + // SLP_SUS# + GPCRJ4 = GPIO_OUT; + // BATT_BOOST# + GPCRJ5 = GPIO_OUT; + // EC_GPIO + GPCRJ6 = GPIO_OUT; + // AC_V1_EC + GPCRJ7 = GPIO_IN; + // LPC_AD0 + GPCRM0 = GPIO_ALT; + // LPC_AD1 + GPCRM1 = GPIO_ALT; + // LPC_AD2 + GPCRM2 = GPIO_ALT; + // LPC_AD3 + GPCRM3 = GPIO_ALT; + // PCLK_KBC + GPCRM4 = GPIO_ALT; + // LPC_FRAME# + GPCRM5 = GPIO_ALT; + // SERIRQ + GPCRM6 = GPIO_ALT; +} + +#if GPIO_DEBUG +void gpio_debug_bank( + char * bank, + uint8_t data, + uint8_t mirror, + uint8_t pot, + volatile uint8_t * control +) { + for(char i = 0; i < 8; i++) { + DEBUG( + "%s%d:\n\tdata %d\n\tmirror %d\n\tpot %d\n\tcontrol %02X\n", + bank, + i, + (data >> i) & 1, + (mirror >> i) & 1, + (pot >> i) & 1, + *(control + i) + ); + } +} + +void gpio_debug(void) { + #define bank(BANK) gpio_debug_bank(#BANK, GPDR ## BANK, GPDMR ## BANK, GPOT ## BANK, &GPCR ## BANK ## 0) + bank(A); + bank(B); + bank(C); + bank(D); + bank(E); + bank(F); + bank(G); + bank(H); + bank(I); + bank(J); + #undef bank +} +#endif diff --git a/src/board/system76/bonw14/include/board/gpio.h b/src/board/system76/bonw14/include/board/gpio.h new file mode 100644 index 0000000..be0e1eb --- /dev/null +++ b/src/board/system76/bonw14/include/board/gpio.h @@ -0,0 +1,55 @@ +#ifndef _BOARD_GPIO_H +#define _BOARD_GPIO_H + +#include + +#define GPIO_ALT 0x00 +#define GPIO_IN 0x80 +#define GPIO_OUT 0x40 +#define GPIO_UP 0x04 +#define GPIO_DOWN 0x02 + +void gpio_init(void); +void gpio_debug(void); + +extern struct Gpio __code ACIN_N; +extern struct Gpio __code AC_PRESENT; +extern struct Gpio __code AC_V1_EC; +extern struct Gpio __code AC_V2_EC; +extern struct Gpio __code ALL_SYS_PWRGD; +extern struct Gpio __code BKL_EN; +extern struct Gpio __code BT_EN; +extern struct Gpio __code BUF_PLT_RST_N; +extern struct Gpio __code CCD_EN; +extern struct Gpio __code DD_ON; +extern struct Gpio __code DGPU_PWR_EN; +extern struct Gpio __code EC_EN; +extern struct Gpio __code EC_RSMRST_N; +extern struct Gpio __code GC6_FB_EN; +extern struct Gpio __code LED_ACIN; +#define HAVE_LED_AIRPLANE_N 0 +extern struct Gpio __code LED_BAT_CHG; +extern struct Gpio __code LED_BAT_FULL; +extern struct Gpio __code LED_PWR; +extern struct Gpio __code LID_SW_N; +#define HAVE_PCH_DPWROK_EC 0 +#define HAVE_PCH_PWROK_EC 0 +extern struct Gpio __code PM_PWROK; +extern struct Gpio __code PWR_BTN_N; +extern struct Gpio __code PWR_SW_N; +extern struct Gpio __code SB_KBCRST_N; +extern struct Gpio __code SCI_N; +#define HAVE_SLP_SUS_N 0 +extern struct Gpio __code SMI_N; +extern struct Gpio __code SUSB_N_PCH; +extern struct Gpio __code SUSC_N_PCH; +#define HAVE_SUSWARN_N 0 +#define HAVE_SUS_PWR_ACK 0 +extern struct Gpio __code SWI_N; +extern struct Gpio __code USB_PWR_EN_N; +extern struct Gpio __code VA_EC_EN; +extern struct Gpio __code WLAN_EN; +extern struct Gpio __code WLAN_PWR_EN; +extern struct Gpio __code XLP_OUT; + +#endif // _BOARD_GPIO_H diff --git a/src/board/system76/bonw14/include/board/keymap.h b/src/board/system76/bonw14/include/board/keymap.h new file mode 100644 index 0000000..f820f6f --- /dev/null +++ b/src/board/system76/bonw14/include/board/keymap.h @@ -0,0 +1,52 @@ +#ifndef _BOARD_KEYMAP_H +#define _BOARD_KEYMAP_H + +#include + +#define ___ 0 + +// Conversion of physical layout to keyboard matrix +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, K0H, K0I, K0J, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C \ +) { /* 0, 1, 2, 3, 4, 5, 6, 7 */ \ + { K10, K31, K44, K27, K29, K4A, K1E, ___ }, /* 0 */ \ + { K50, K02, K15, K36, K48, K3B, K2E, ___ }, /* 1 */ \ + { K30, K12, K25, K18, K2A, ___, K3D, K55 }, /* 2 */ \ + { K40, K22, K35, K46, K1B, ___, K4D, K56 }, /* 3 */ \ + { K51, K13, K06, K37, K3A, K4B, K0H, K57 }, /* 4 */ \ + { K20, K42, K16, K28, K49, ___, K1F, K58 }, /* 5 */ \ + { K00, K32, K07, K09, K0C, K0E, K1G, K59 }, /* 6 */ \ + { ___, K03, K45, K38, K1C, K1D, K2F, K5A }, /* 7 */ \ + { K21, K33, K26, K47, K2B, K3C, K4E, K5B }, /* 8 */ \ + { K41, K43, K17, K19, K0D, K2D, K3E, K5C }, /* 9 */ \ + { K11, K23, K08, K39, K2C, K4C, K2G, K0J }, /* 10 */ \ + { K52, K04, ___, K0A, ___, K0F, K3F, K1H }, /* 11 */ \ + { K01, K14, ___, K1A, ___, K0G, K4F, K2H }, /* 12 */ \ + { K53, K24, ___, K0B, ___, ___, K0I, ___ }, /* 13 */ \ + { ___, K34, ___, ___, ___, ___, ___, K4G }, /* 14 */ \ + { K54, K05, ___, ___, ___, ___, ___, ___ }, /* 15 */ \ + { ___, ___, ___, ___, ___, ___, ___, ___ }, /* 16 */ \ + { ___, ___, ___, ___, ___, ___, ___, ___ } /* 17 */ \ +} + +// Keymap output pins +#define KM_OUT 18 +// Keymap input pins +#define KM_IN 8 +// Keymap layers (normal, Fn) +#define KM_LAY 2 +// Keyboard has n-key rollover +#define KM_NKEY 1 + +// Keymap +extern uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN]; + +// Get a keycode from the keymap +uint16_t keymap(int output, int input, int layer); + +#endif // _BOARD_KEYMAP_H diff --git a/src/board/system76/bonw14/kbled.c b/src/board/system76/bonw14/kbled.c new file mode 100644 index 0000000..7870daa --- /dev/null +++ b/src/board/system76/bonw14/kbled.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include + +void kbled_init(void) { + i2c_reset(&I2C_DGPU, true); + + // Force SMBUS B design to 100kHZ + SCLKTSB = 0b10; +} + +void kbled_reset(void) { + uint8_t value = 0xE4; + int res = i2c_set(&I2C_DGPU, 0x2D, 0xA0, &value, 1); + DEBUG("kbled_reset 0x2D: %d\n", res); + + value = 0xC4; + res = i2c_set(&I2C_DGPU, 0x66, 0xA0, &value, 1); + DEBUG("kbled_reset 0x66: %d\n", res); + + // Set brightness and color + kbled_set_color(0xFFFFFF); + kbled_set(0x00); +} + +uint8_t kbled_get(void) { + return 0; +} + +void kbled_set(uint8_t level) { + // Keep function for compatibility - this is set via USB HID + level = level; +} + +void kbled_set_color(uint32_t color) { + // Keep function for compatibility - this is set via USB HID + color = color; +} diff --git a/src/board/system76/bonw14/keymap/default.c b/src/board/system76/bonw14/keymap/default.c new file mode 100644 index 0000000..65d46ce --- /dev/null +++ b/src/board/system76/bonw14/keymap/default.c @@ -0,0 +1,22 @@ +// Default layout + +#include + +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +LAYOUT( + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, + K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, + K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_PLUS, + K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6, + K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER, + K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD +), +LAYOUT( + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, + K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, KT_SCI_EXTRA | SCI_EXTRA_KBD_COLOR, KT_SCI_EXTRA | SCI_EXTRA_KBD_TOGGLE, KT_SCI_EXTRA | SCI_EXTRA_KBD_DOWN, + K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, KT_SCI_EXTRA | SCI_EXTRA_KBD_UP, + K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6, + K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER, + K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD +) +}; diff --git a/src/board/system76/bonw14/keymap/jeremy.c b/src/board/system76/bonw14/keymap/jeremy.c new file mode 100644 index 0000000..2d19a63 --- /dev/null +++ b/src/board/system76/bonw14/keymap/jeremy.c @@ -0,0 +1,22 @@ +// Default layout + +#include + +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +LAYOUT( + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, + K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, + K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_PLUS, + KT_FN, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6, + K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER, + K_LEFT_CTRL, KT_FN, K_LEFT_ALT, K_LEFT_SUPER, K_SPACE, KT_FN, K_RIGHT_ALT, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD +), +LAYOUT( + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, + K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_DEL, K_NUM_LOCK, KT_SCI_EXTRA | SCI_EXTRA_KBD_COLOR, KT_SCI_EXTRA | SCI_EXTRA_KBD_TOGGLE, KT_SCI_EXTRA | SCI_EXTRA_KBD_DOWN, + K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_PGUP, K_HOME, K_PGDN, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, KT_SCI_EXTRA | SCI_EXTRA_KBD_UP, + KT_FN, K_A, K_S, K_D, K_F, K_G, K_LEFT, K_DOWN, K_UP, K_RIGHT, K_BKSP, K_DEL, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6, + K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_END, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER, + K_LEFT_CTRL, KT_FN, K_LEFT_ALT, K_LEFT_SUPER, K_ESC, KT_FN, K_RIGHT_ALT, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD +) +}; diff --git a/src/board/system76/common/kbscan.c b/src/board/system76/common/kbscan.c index c0320d5..46a5874 100644 --- a/src/board/system76/common/kbscan.c +++ b/src/board/system76/common/kbscan.c @@ -9,6 +9,11 @@ #include #include +// Default to not n-key rollover +#ifndef KM_NKEY +#define KM_NKEY 0 +#endif // KM_NKEY + bool kbscan_enabled = false; uint16_t kbscan_repeat_period = 91; uint16_t kbscan_repeat_delay = 500; @@ -89,6 +94,14 @@ static uint8_t kbscan_get_row(int i) { return ~KSI; } +#if KM_NKEY +static bool kbscan_has_ghost_in_row(int row, uint8_t rowdata) { + // Use arguments + row = row; + rowdata = rowdata; + return false; +} +#else // KM_NKEY static inline bool popcount_more_than_one(uint8_t rowdata) { return rowdata & (rowdata - 1); } @@ -123,6 +136,7 @@ static bool kbscan_has_ghost_in_row(int row, uint8_t rowdata) { return false; } +#endif // KM_NKEY bool kbscan_press(uint16_t key, bool pressed, uint8_t * layer) { if (pressed &&