Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

addw4: Add Adder WS 4 #436

Merged
merged 3 commits into from
Feb 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ BUILD = build
# Parameter for current board
ifeq ($(BOARD),)
all:
@echo -e "\x1B[31mBOARD must be specified\x1B[0m"
@exit 1
$(error BOARD must be specified)
else
# Calculate version
DATE=$(shell git show --format="%cs" --no-patch --no-show-signature)
Expand Down
27 changes: 27 additions & 0 deletions src/board/system76/addw4/board.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: GPL-3.0-only

#include <board/battery.h>
#include <board/board.h>
#include <board/espi.h>
#include <board/gctrl.h>
#include <board/gpio.h>
#include <common/debug.h>
#include <ec/ec.h>

void board_init(void) {
espi_init();

// Make sure charger is in off state, also enables PSYS
battery_charger_disable();

// Allow backlight to be turned on
gpio_set(&BKL_EN, true);
// Enable camera
gpio_set(&CCD_EN, true);
}

void board_event(void) {
espi_event();

ec_read_post_codes();
}
68 changes: 68 additions & 0 deletions src/board/system76/addw4/board.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# SPDX-License-Identifier: GPL-3.0-only

board-y += board.c
board-y += gpio.c

EC = ite
CONFIG_EC_ITE_IT5570E = y
CONFIG_EC_FLASH_SIZE_256K = y

# Enable eSPI
CONFIG_BUS_ESPI = y
CONFIG_PECI_OVER_ESPI = y

# Enable firmware security
#CONFIG_SECURITY = y

# Set keyboard configs
KEYBOARD = 18H9LHA04
KBLED = rgb_pwm

# Set touchpad PS2 bus
CFLAGS += -DPS2_TOUCHPAD=PS2_3

# Set smart charger parameters
CHARGER = oz26786
CFLAGS += -DI2C_SMBUS=I2C_4
CFLAGS += \
-DCHARGER_ADAPTER_RSENSE=5 \
-DCHARGER_BATTERY_RSENSE=10 \
-DCHARGER_CHARGE_CURRENT=3072 \
-DCHARGER_CHARGE_VOLTAGE=17400 \
-DCHARGER_INPUT_CURRENT=11500

# Set CPU power limits in watts
CFLAGS += \
-DPOWER_LIMIT_AC=230 \
-DPOWER_LIMIT_DC=45

# Custom fan curve
CFLAGS += -DBOARD_HEATUP=5
CFLAGS += -DBOARD_COOLDOWN=20
CFLAGS += -DBOARD_FAN_POINTS="\
FAN_POINT(50, 28), \
FAN_POINT(55, 28), \
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
CFLAGS += -DI2C_DGPU=I2C_1
CFLAGS += -DBOARD_DGPU_HEATUP=5
CFLAGS += -DBOARD_DGPU_COOLDOWN=20
CFLAGS += -DBOARD_DGPU_FAN_POINTS="\
FAN_POINT(50, 28), \
FAN_POINT(55, 28), \
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
261 changes: 261 additions & 0 deletions src/board/system76/addw4/gpio.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
// SPDX-License-Identifier: GPL-3.0-only

#include <board/gpio.h>
#include <common/macro.h>

// clang-format off
struct Gpio __code ACIN_N = GPIO(B, 0);
struct Gpio __code AC_PRESENT = GPIO(E, 1);
struct Gpio __code ALL_SYS_PWRGD = GPIO(C, 0);
struct Gpio __code BKL_EN = GPIO(C, 7);
struct Gpio __code BUF_PLT_RST_N = GPIO(D, 2); // renamed to ESPI_RESET_N
struct Gpio __code CCD_EN = GPIO(D, 1);
struct Gpio __code DD_ON = GPIO(E, 4);
struct Gpio __code DGPU_PWR_EN = GPIO(H, 6);
struct Gpio __code EC_EN = GPIO(B, 6); // renamed to SUSBC_EN#
struct Gpio __code EC_RSMRST_N = GPIO(E, 5);
struct Gpio __code GC6_FB_EN = GPIO(B, 5);
struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2);
struct Gpio __code LED_ACIN = GPIO(H, 2);
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 ME_WE = GPIO(I, 2);
struct Gpio __code PCH_DPWROK_EC = GPIO(F, 3);
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 RGBKB_DET_N = GPIO(E, 2);
struct Gpio __code SLP_SUS_N = GPIO(H, 7);
struct Gpio __code VA_EC_EN = GPIO(J, 4);
//struct Gpio __code WLAN_EN = GPIO(G, 1);
struct Gpio __code WLAN_PWR_EN = GPIO(H, 3);
struct Gpio __code XLP_OUT = GPIO(B, 4);
// clang-format on

void gpio_init(void) {
// PWRSW WDT 2 Enable 2
GCR9 = BIT(5);
// PWRSW WDT 2 Enable 1
GCR8 = BIT(4);

// Enable LPC reset on GPD2
GCR = 0x04;
// Disable UARTs
GCR6 = 0;
// Enable SMBus channel 4
GCR15 = BIT(4);
// Set GPD2 to 1.8V
GCR19 = BIT(0);
// Set GPF2 and GPF3 to 3.3V
GCR20 = 0;

// Set GPM6 power domain to VCC
GCR23 = BIT(0);

// Set GPIO data
// DDS_EC_PWM
GPDRA = BIT(3);
// XLP_OUT, PWR_SW#
GPDRB = BIT(4) | BIT(3);
GPDRC = 0;
// VGA_HEATSINK_SW
GPDRD = BIT(3);
// USB_PWR_EN#
GPDRE = BIT(3);
GPDRF = 0;
// H_PROCHOT_EC, BL_PWM_EN_EC
GPDRG = BIT(6) | BIT(0);
GPDRH = 0;
GPDRI = 0;
// PLVDD_RST_EC, KBC_MUTE#
GPDRJ = BIT(7) | BIT(1);

// Set GPIO control

// EC_PWM_LEDKB_P
GPCRA0 = GPIO_ALT;
// KBC_BEEP
GPCRA1 = GPIO_ALT;
// CPU_FAN_PWM
GPCRA2 = GPIO_ALT;
// DDS_EC_PWM
GPCRA3 = GPIO_IN;
// VGA_FAN_PWM
GPCRA4 = GPIO_ALT;
// EC_PWM_LEDKB_R
GPCRA5 = GPIO_ALT;
// EC_PWM_LEDKB_G
GPCRA6 = GPIO_ALT;
// EC_PWM_LEDKB_B
GPCRA7 = GPIO_ALT;

// AC_IN#
GPCRB0 = GPIO_IN | GPIO_UP;
// LID_SW#
GPCRB1 = GPIO_IN | GPIO_UP;
// EC_LAN_WAKEUP#
GPCRB2 = GPIO_IN;
// PWR_SW#
GPCRB3 = GPIO_IN;
// XLP_OUT
GPCRB4 = GPIO_OUT;
// GC6_FB_EN_PCH
GPCRB5 = GPIO_IN;
// SUSBC_EC#
GPCRB6 = GPIO_OUT | GPIO_UP;
// Not connected
GPCRB7 = GPIO_IN;

// ALL_SYS_PWRGD
GPCRC0 = GPIO_IN;
// SMC_VGA_THERM
GPCRC1 = GPIO_ALT | GPIO_UP;
// SMD_VGA_THERM
GPCRC2 = GPIO_ALT | GPIO_UP;
// KB-SO16
GPCRC3 = GPIO_ALT | GPIO_UP;
// CNVI_DET#
GPCRC4 = GPIO_IN | GPIO_UP;
// KB-SO17
GPCRC5 = GPIO_ALT | GPIO_UP;
// PM_PWROK
GPCRC6 = GPIO_OUT;
// BKL_EN
GPCRC7 = GPIO_OUT | GPIO_UP;

// LED_PWR
GPCRD0 = GPIO_OUT | GPIO_UP;
// CCD_EN
GPCRD1 = GPIO_OUT;
// ESPI_RESET#
GPCRD2 = GPIO_ALT;
// VGA_HEATSINK_SW
GPCRD3 = GPIO_OUT;
// 7411_SINK_CTRL
GPCRD4 = GPIO_IN;
// PWR_BTN#
GPCRD5 = GPIO_OUT | GPIO_UP;
// CPU_FANSEN
GPCRD6 = GPIO_ALT;
// VGA_HEATSINK_FANSEN
GPCRD7 = GPIO_ALT;

// SMC_BAT
GPCRE0 = GPIO_ALT | GPIO_UP;
// AC_PRESENT
GPCRE1 = GPIO_OUT | GPIO_UP;
// RGBKB-DET#
GPCRE2 = GPIO_IN | GPIO_UP;
// USB_PWR_EN# (XXX: Active high, despite pin name)
GPCRE3 = GPIO_OUT;
// DD_ON
GPCRE4 = GPIO_OUT | GPIO_DOWN;
// EC_RSMRST#
GPCRE5 = GPIO_OUT;
// JACK_IN#_EC
GPCRE6 = GPIO_IN;
// SMD_BAT
GPCRE7 = GPIO_ALT | GPIO_UP;

// 80CLK
GPCRF0 = GPIO_IN;
// USB_CHARGE_EN
GPCRF1 = GPIO_OUT | GPIO_UP;
// 3IN1
GPCRF2 = GPIO_IN | GPIO_UP;
// PCH_DPWROK_EC
GPCRF3 = GPIO_OUT;
// TP_CLK
GPCRF4 = GPIO_ALT | GPIO_UP;
// TP_DATA
GPCRF5 = GPIO_ALT | GPIO_UP;
// EC_SMD_EN#
GPCRF6 = GPIO_IN;
// MUX_CTRL_BIOS
GPCRF7 = GPIO_OUT;

// BL_PWM_EN_EC
GPCRG0 = GPIO_OUT;
// EC_WLAN_EN (NC)
GPCRG1 = GPIO_IN;
// AUTO_LOAD_PWR
GPCRG2 = GPIO_IN;
// 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_SLP_S0_CS_N
GPCRH0 = GPIO_IN;
// EC_TEST_R_2
GPCRH1 = GPIO_IN;
// LED_ACIN
GPCRH2 = GPIO_OUT | GPIO_UP;
// WLAN_PWR_EN
GPCRH3 = GPIO_OUT;
// OVERT#_EC
GPCRH4 = GPIO_IN | GPIO_UP;
// LED_BAT_CHG
GPCRH5 = GPIO_OUT | GPIO_UP;
// DGPU_PWR_EN
GPCRH6 = GPIO_IN;
// SLP_SUS#
GPCRH7 = GPIO_IN;

// BAT_DET
GPCRI0 = GPIO_ALT;
// BAT_VOLT
GPCRI1 = GPIO_ALT;
// ME_WE
GPCRI2 = GPIO_OUT;
// THERM_VOLT_CPU
GPCRI3 = GPIO_ALT;
// TOTAL_CUR
GPCRI4 = GPIO_ALT;
// THERM_VOLT_GPU
GPCRI5 = GPIO_ALT;
// THERM_VOLT_HEATSINK
GPCRI6 = GPIO_ALT;
// MODEL_ID
GPCRI7 = GPIO_IN;

// LED_BAT_FULL
GPCRJ0 = GPIO_OUT | GPIO_UP;
// KBC_MUTE# / USB charger detection
GPCRJ1 = GPIO_IN;
// PCH_FAN
GPCRJ2 = GPIO_ALT;
// HEATSINK_FANSEN_R
GPCRJ3 = GPIO_IN;
// VA_EC_EN
GPCRJ4 = GPIO_OUT;
// VBATT_BOOST#
GPCRJ5 = GPIO_IN;
// EC_GPIO
GPCRJ6 = GPIO_IN;
// PLVDD_RST_EC
GPCRJ7 = GPIO_OUT;

// ESPI_IO0_EC
GPCRM0 = GPIO_ALT | GPIO_UP | GPIO_DOWN;
// ESPI_IO1_EC
GPCRM1 = GPIO_ALT | GPIO_UP | GPIO_DOWN;
// ESPI_IO2_EC
GPCRM2 = GPIO_ALT | GPIO_UP | GPIO_DOWN;
// ESPI_IO3_EC
GPCRM3 = GPIO_ALT | GPIO_UP | GPIO_DOWN;
// ESPI_CLK_EC
GPCRM4 = GPIO_ALT | GPIO_UP | GPIO_DOWN;
// ESPI_CS_EC#
GPCRM5 = GPIO_ALT;
// ESPI_ALRT0#
GPCRM6 = GPIO_IN | GPIO_UP | GPIO_DOWN;
}
Loading
Loading