bonw14
This commit is contained in:
		
				
					committed by
					
						
						Jeremy Soller
					
				
			
			
				
	
			
			
			
						parent
						
							69d3b9d8bf
						
					
				
				
					commit
					f1809926f6
				
			
							
								
								
									
										83
									
								
								src/board/system76/bonw14/board.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								src/board/system76/bonw14/board.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
#include <arch/time.h>
 | 
			
		||||
#include <board/battery.h>
 | 
			
		||||
#include <board/board.h>
 | 
			
		||||
#include <board/dgpu.h>
 | 
			
		||||
#include <board/gctrl.h>
 | 
			
		||||
#include <board/gpio.h>
 | 
			
		||||
#include <board/kbc.h>
 | 
			
		||||
#include <board/peci.h>
 | 
			
		||||
#include <board/power.h>
 | 
			
		||||
#include <common/debug.h>
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								src/board/system76/bonw14/board.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/board/system76/bonw14/board.mk
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										271
									
								
								src/board/system76/bonw14/gpio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								src/board/system76/bonw14/gpio.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,271 @@
 | 
			
		||||
#include <board/gpio.h>
 | 
			
		||||
#include <common/debug.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
							
								
								
									
										55
									
								
								src/board/system76/bonw14/include/board/gpio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/board/system76/bonw14/include/board/gpio.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
#ifndef _BOARD_GPIO_H
 | 
			
		||||
#define _BOARD_GPIO_H
 | 
			
		||||
 | 
			
		||||
#include <ec/gpio.h>
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
							
								
								
									
										52
									
								
								src/board/system76/bonw14/include/board/keymap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/board/system76/bonw14/include/board/keymap.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
#ifndef _BOARD_KEYMAP_H
 | 
			
		||||
#define _BOARD_KEYMAP_H
 | 
			
		||||
 | 
			
		||||
#include <common/keymap.h>
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
							
								
								
									
										40
									
								
								src/board/system76/bonw14/kbled.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/board/system76/bonw14/kbled.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
#include <board/kbled.h>
 | 
			
		||||
#include <common/debug.h>
 | 
			
		||||
#include <ec/i2c.h>
 | 
			
		||||
#include <ec/pwm.h>
 | 
			
		||||
#include <ec/smbus.h>
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								src/board/system76/bonw14/keymap/default.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/board/system76/bonw14/keymap/default.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
// Default layout
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
)
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										22
									
								
								src/board/system76/bonw14/keymap/jeremy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/board/system76/bonw14/keymap/jeremy.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
// Default layout
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
)
 | 
			
		||||
};
 | 
			
		||||
@@ -9,6 +9,11 @@
 | 
			
		||||
#include <board/power.h>
 | 
			
		||||
#include <common/debug.h>
 | 
			
		||||
 | 
			
		||||
// 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 &&
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user