diff options
author | Keith Short <keithshort@chromium.org> | 2019-08-20 16:50:13 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-27 20:53:58 +0000 |
commit | f634e7c0ccf4dc71185ef3c8b2ab96860629538d (patch) | |
tree | baa107be53d8d504e2c0d0f360a16326621f42d0 | |
parent | c2f751f107d88d910f4631eeb8c6f4f9a99b9d81 (diff) | |
download | chrome-ec-f634e7c0ccf4dc71185ef3c8b2ab96860629538d.tar.gz |
doc: Add creating a new board checklist.
Add the high-level steps for creating a new board in the EC code base.
The entry point is the docs/new_board_checklist.md file, which then
links to files found under docs/configuration/.
BUG=b:147905484
BRANCH=none
TEST=none
Change-Id: Ia0ca4f6547735a5d1ee93145ee18962cf7559fe3
Signed-off-by: Keith Short <keithshort@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1778635
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org>
-rw-r--r-- | README.md | 5 | ||||
-rw-r--r-- | docs/configuration/ap_power_sequencing.md | 253 | ||||
-rw-r--r-- | docs/configuration/cbi.md | 38 | ||||
-rw-r--r-- | docs/configuration/config_ap_to_ec_comm.md | 73 | ||||
-rw-r--r-- | docs/configuration/ec_chipset.md | 113 | ||||
-rw-r--r-- | docs/configuration/gpio.md | 155 | ||||
-rw-r--r-- | docs/configuration/i2c.md | 204 | ||||
-rw-r--r-- | docs/configuration/keyboard.md | 91 | ||||
-rw-r--r-- | docs/configuration/leds.md | 92 | ||||
-rw-r--r-- | docs/configuration/motion_sensors.md | 52 | ||||
-rw-r--r-- | docs/configuration/template.md | 51 | ||||
-rw-r--r-- | docs/images/alternate_example.png | bin | 0 -> 35864 bytes | |||
-rw-r--r-- | docs/images/gpio_example.png | bin | 0 -> 34201 bytes | |||
-rw-r--r-- | docs/images/gpio_int_example.png | bin | 0 -> 30677 bytes | |||
-rw-r--r-- | docs/images/i2c_example.png | bin | 0 -> 62991 bytes | |||
-rw-r--r-- | docs/new_board_checklist.md | 172 | ||||
-rw-r--r-- | docs/sitemap.md | 3 |
17 files changed, 1301 insertions, 1 deletions
@@ -61,7 +61,7 @@ Chromium OS development environment to build a binary. git clone https://chromium.googlesource.com/chromiumos/platform/ec ``` -The source code can also be broswed on the web at: +The source code can also be browsed on the web at: https://chromium.googlesource.com/chromiumos/platform/ec/ @@ -70,6 +70,9 @@ https://chromium.googlesource.com/chromiumos/platform/ec/ The following is a quick overview of the top-level directories in the EC repository: +**baseboard** - Code and configuration details shared by a collection of board +variants. Tightly linked with the `board` directory described below. + **board** - Board specific code and configuration details. This includes the GPIO map, battery parameters, and set of tasks to run for the device. diff --git a/docs/configuration/ap_power_sequencing.md b/docs/configuration/ap_power_sequencing.md new file mode 100644 index 0000000000..2b78592e57 --- /dev/null +++ b/docs/configuration/ap_power_sequencing.md @@ -0,0 +1,253 @@ +# Configure AP Power Sequencing + +This section details the configuration related to managing the system power +states (G3, S5, S3, S0, S0iX, etc). This includes the following tasks: + +- Selecting the AP chipset type. +- Configure output GPIOs that enable voltage rails. +- Configure input GPIOs that monitor the voltage rail status (power good + signals). +- Configure input GPIOs that monitor the AP sleep states. +- Pass through power sequencing signals from the board to the AP, often with + delays or other sequencing control. + +## Config options + +The AP chipset options are grouped together in [config.h]. Select exactly one of +the available AP chipset options (e.g. `CONFIG_CHIPSET_APOLLOLAKE`, +`CONFIG_CHIPSET_BRASWELL`, etc). If the AP chipset support is not available, +select `CONFIG_CHIPSET_ECDRIVEN` to enable basic support for handling S3 and S0 +power states. + +After selecting the chipset, search for additional options that start with +`CONFIG_CHIPSET*` and evaluate whether each option is appropriate to add to +`baseboard.h` or `board.h`. + +Finally, evaluate the `CONFIG_POWER_` options for use on your board. In +particular, the `CONFIG_POWER_BUTTON`, and `CONFIG_POWER_COMMON` should be +defined. + +The `CONFIG_BRINGUP` option is especially useful option during the initial power +up of a new board. This option is discussed in more detail in the [Testing and +Debugging](#Testing-and-Debugging) section. + +## Feature Parameters + +None needed in this section. + +## GPIOs and Alternate Pins + +### EC Outputs to the board + +The board should connect the enable signal of one or more voltage rails to the +EC. These enable signals will vary based on the AP type, but are typically +active high signals. For Intel Ice Lake chipsets, this includes enable signals +for the primary 3.3V and primary 5V rails. + +```c +GPIO(EN_PP3300_A, PIN(A, 3), GPIO_OUT_LOW) +GPIO(EN_PP5000, PIN(A, 4), GPIO_OUT_LOW) +``` + +### EC Outputs to AP + +For boards with an x86 AP, the following signals can be connected between the EC +and AP/PCH. Create `GPIO()` entries for any signals used on your board. + +- `GPIO_PCH_PWRBTN_L` - Output from the EC that proxies the status of the EC + input `GPIO_POWER_BUTTON_L` (driven by the H1). Only used when + `CONFIG_POWER_BUTTON_X86` is defined. +- `GPIO_PCH_RSMRST_L` - Output from the EC that proxies the status of the EC + input `GPIO_RSMRST_L_PGOOD` (driven by the PMIC or voltage regulators on the + board). +- `GPIO_PCH_SYS_PWROK` - Output from the EC that indicates when the system power + is good and the AP can power up. +- `GPIO_PCH_WAKE_L` - Output from the EC, driven low when there is a wake event. + +### Power Signal Interrupts + +For each power signal defined in the `power_signal_list[]` array, define a +`GPIO_INT()` entry that connects to the `power_signal_interrupt`. The interrupts +are configured to trigger on both rising edge and falling edge. + +The example below shows the power signals used with Ice Lake processors. + +```c +GPIO_INT(SLP_S0_L, PIN(D, 5), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SLP_S3_L, PIN(A, 5), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SLP_S4_L, PIN(D, 4), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(PG_EC_ALL_SYS_PWRGD, PIN(F, 4), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(PP5000_A_PG_OD, PIN(D, 7), GPIO_INT_BOTH, power_signal_interrupt) +``` + +See the [GPIO](./gpio.md) documentation for additional details on the GPIO +macros. + +## Data structures + +- `const struct power_signal_info power_signal_list[]` - This array defines the + signals from the AP and from the power subsystem on the board that control the + power state. For some Intel chipsets, including Apollo Lake and Ice Lake, this + power signal list is already defined by the corresponding chipset file under + the `./power` directory. + +## Tasks + +The `CHIPSET` task monitors and handles the power state changes. This task +should always be enabled with a priority higher than the `CHARGER` task, but +lower than the `HOSTCMD` and `CONSOLE` tasks. + +```c + TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ +``` + +The `POWERBTN` and task should be enabled when using x86 based AP chipsets. The +typical priority is higher than the `CONSOLE` task, but lower than the `KEYSCAN` +task. + +```c + TASK_ALWAYS(POWERBTN, power_button_task, NULL, LARGER_TASK_STACK_SIZE) \ +``` + +## Testing and Debugging + +During the first power on of prototype devices, it is recommended to enable +`CONFIG_BRINGUP`. This option prevents the EC from automatically powering on the +AP. You can use the EC console commands `gpioget` and `gpioset` to manually +check power good signals and enable power rails in a controlled manner. This +option also enables extra debug to log all power signal transitions to the EC +console. With `CONFIG_BRINGUP` enabled, you can trigger the automatic power +sequencing by running the `powerbtn` from the EC console. + +The EC console displays the following text when `CONFIG_BRINGUP` is enabled: + +``` +WARNING: BRINGUP BUILD +``` + +Once you manually press the power button, or execute the `powerbtn` command, the +EC console displays both the power state changes and the detected transitions of +all power signals. An example is shown below. + +``` +> powerbtn +Simulating 200 ms power button press. +[6.790816 power button pressed] +[6.791133 PB pressed] +[6.791410 PB task 1 = pressed] +[6.791755 PB PCH pwrbtn=LOW] +[6.792049 PB task 10 = was-off, wait 199362] +RTC: 0x000067bc (26556.00 s) +[6.792786 power state 5 = G3->S5, in 0x0000] +[6.793190 Set EN_PP3300_A: 1] +[6.793905 SW 0x03] +[6.817627 Set PCH_DSW_PWROK: 1] +[6.818007 Pass thru GPIO_DSW_PWROK: 1] +[6.818351 Set EN_PP5000_A: 1] +RTC: 0x000067bc (26556.00 s) +[6.903830 power state 1 = S5, in 0x0029] +[6.918735 Pass through GPIO_RSMRST_L_PGOOD: 1] +i2c 7 recovery! error code is 13, current state is 0 +Simulating power button release. +> [6.991576 power button released] +[6.992009 PB task 10 = was-off] +[6.992376 PB released] +[6.992635 PB task 6 = released] +[6.992958 PB PCH pwrbtn=HIGH] +[6.993256 PB task 0 = idle, wait -1] +[6.993806 PB released] +[6.994149 PB task 6 = released] +[6.994512 PB PCH pwrbtn=HIGH] +[6.994812 PB task 0 = idle, wait -1] +[6.995768 SW 0x01] +3 signal changes: + 6.807298 +0.000000 DSW_PWROK => 1 + 6.903417 +0.096119 SLP_SUS_L => 1 + 6.908471 +0.005054 PG_EC_RSMRST_ODL => 1 +1 signal changes: + 7.909941 +0.000000 SLP_S0_L => 1 +[9.026429 Fan 0 stalled!] +RTC: 0x000067bf (26559.00 s) +[9.124643 power state 6 = S5->S3, in 0x003f] +i2c 3 recovery! error code is 13, current state is 0 +[9.126543 mux config:2, port:1, res:1] +[9.127109 PD:S5->S3] +RTC: 0x000067bf (26559.00 s) +[9.127985 power state 2 = S3, in 0x003f] +RTC: 0x000067bf (26559.00 s) +[9.128640 power state 7 = S3->S0, in 0x003f] +``` + +This example shows successful power on of the AP as the AP transitions from the G3 +state all the way to the S0 state. + +The console messages shown in brackets `[]` include a timestamp. This timestamp +records when the corresponding console message was printed. + +The power signal changes are preceded by the message `<N> signal changes:`. +Power signal changes are recorded at interrupt priority into a special buffer +and are not displayed in real time. Instead, printing of the buffer is deferred +until the EC is no longer executing at interrupt priority. This causes the power +signal changes shown on the console to be out of order with respect to the other +EC messages. + +The power signal changes include a timestamp to help you correlate when the +actual power signal changed compared to other messages. From the example above, +the first power signal change recorded is the `DSW_PWROK` signal transitioning +from 0 to 1, and this is recorded at timestamp `6.807298`. Using the regular EC +console timestamp, you can reconstruct the real power sequence to look like the +following: + +``` +> powerb +Simulating 200 ms power button press. +[6.790816 power button pressed] +[6.791133 PB pressed] +[6.791410 PB task 1 = pressed] +[6.791755 PB PCH pwrbtn=LOW] +[6.792049 PB task 10 = was-off, wait 199362] +RTC: 0x000067bc (26556.00 s) +[6.792786 power state 5 = G3->S5, in 0x0000] +[6.793190 Set EN_PP3300_A: 1] +[6.793905 SW 0x03] + 6.807298 +0.000000 DSW_PWROK => 1 // Manually re-ordered entry +[6.817627 Set PCH_DSW_PWROK: 1] +[6.818007 Pass thru GPIO_DSW_PWROK: 1] +[6.818351 Set EN_PP5000_A: 1] +RTC: 0x000067bc (26556.00 s) + 6.903417 +0.096119 SLP_SUS_L => 1 // Manually re-ordered entry +[6.903830 power state 1 = S5, in 0x0029] + 6.908471 +0.005054 PG_EC_RSMRST_ODL => 1 // Manually re-ordered entry +[6.918735 Pass through GPIO_RSMRST_L_PGOOD: 1] +i2c 7 recovery! error code is 13, current state is 0 +Simulating power button release. +> [6.991576 power button released] +[6.992009 PB task 10 = was-off] +[6.992376 PB released] +[6.992635 PB task 6 = released] +[6.992958 PB PCH pwrbtn=HIGH] +[6.993256 PB task 0 = idle, wait -1] +[6.993806 PB released] +[6.994149 PB task 6 = released] +[6.994512 PB PCH pwrbtn=HIGH] +[6.994812 PB task 0 = idle, wait -1] +[6.995768 SW 0x01] +1 signal changes: + 7.909941 +0.000000 SLP_S0_L => 1 +[9.026429 Fan 0 stalled!] +RTC: 0x000067bf (26559.00 s) +[9.124643 power state 6 = S5->S3, in 0x003f] +i2c 3 recovery! error code is 13, current state is 0 +[9.126543 mux config:2, port:1, res:1] +[9.127109 PD:S5->S3] +RTC: 0x000067bf (26559.00 s) +[9.127985 power state 2 = S3, in 0x003f] +RTC: 0x000067bf (26559.00 s) +[9.128640 power state 7 = S3->S0, in 0x003f] +``` + + +*TODO ([b/147808790](http://issuetracker.google.com/147808790)) Add +documentation specific to each x86 processor type.* + +[config.h]: ../new_board_checklist.md#config_h diff --git a/docs/configuration/cbi.md b/docs/configuration/cbi.md new file mode 100644 index 0000000000..f285e8a8c2 --- /dev/null +++ b/docs/configuration/cbi.md @@ -0,0 +1,38 @@ +# Configure CrOS Board Information (CBI) + +If your board includes an EEPROM to store [CBI], then this feature must be +enabled and configured. Note that the [I2C buses] must be configured and working +before enabling CBI. + +## Config options + +Add the following config options to `baseboard.h` or `board.h`. + +- `CONFIG_BOARD_VERSION_CBI` +- `CONFIG_CROS_BOARD_INFO` + +## Feature Parameters + +- `I2C_ADDR_EEPROM_FLAGS <7-bit addr>` - Defines the 7-bit slave address for the + EEPROM containing CBI. + +## GPIOs and Alternate Pins + +None needed - the I2C pins should be configured automatically when initializing +the I2C buses. + +## Data Structures + +None required by this feature. + +## Tasks + +None required by this feature. + +## Testing and Debugging + +Refer to the [I2C debugging information] to verify communication with the CBI EEPROM. + +[CBI]: https://chromium.googlesource.com/chromiumos/docs/+/master/design_docs/cros_board_info.md +[I2C buses]: ./i2c.md +[I2C debugging information]: ./i2c.md#
\ No newline at end of file diff --git a/docs/configuration/config_ap_to_ec_comm.md b/docs/configuration/config_ap_to_ec_comm.md new file mode 100644 index 0000000000..2fdcc5a147 --- /dev/null +++ b/docs/configuration/config_ap_to_ec_comm.md @@ -0,0 +1,73 @@ +# Configure AP to EC Communication + +This document provides details on how to configure the AP to EC communication +channel used on your board. The [AP to EC Communication] document provides +details a system level of the operation of this feature. + +## Config options + +Configure the AP to EC communication channel, picking exactly one of the +following options. + +- `CONFIG_HOSTCMD_SPS` - [SPI slave](./ec_terms.md#spi) (SPS) interface +- `CONFIG_HOSTCMD_HECI` - HECI interface +- `CONFIG_HOSTCMD_LPC` - [LPC](./ec_terms.md#lpc) bus +- `CONFIG_HOSTCMD_ESPI` - [eSPI](./ec_terms.md#espi) bus + +In [config.h], search for options that start with the same name as your selected +communication interface. Override defaults as needed. + +## Feature Parameters + +None needed in this section. + +## GPIOs and Alternate Pins + +The EC code requires the following signals between the AP and the EC to be +defined by each board variant. + +- `GPIO_ENTERING_RW` - Output from the EC, active high signal indicates when the + EC code transitions from RO to RW code. + + ```c + GPIO(EC_ENTERING_RW, PIN(E, 3), GPIO_OUT_LOW) + ``` + +- `GPIO_SYS_RESET_L` - Output from the EC, active low signal used to put the AP + into reset. + + ```c + GPIO(SYS_RST_ODL, PIN(C, 5), GPIO_ODR_HIGH) + ``` + +Create `ALTERNATE()` entries for all EC signals used for AP communication. This +step can be skipped for any pins that default to communication channel +functionality. + +See the [GPIO](./gpio.md) documentation for additional details on +the GPIO macros. + +## Data structures + +None needed in this section. + +## Tasks + +The `HOSTCMD` task is responsible for processing commands sent by the AP and is +always required. The typical priority is higher than the `CHIPSET` task, but +lower than the `CONSOLE` task. + +```c + TASK_ALWAYS(HOSTCMD, host_command_task, NULL, LARGER_TASK_STACK_SIZE, 0) \ +``` + +## Testing and Debugging + +For Nuvoton EC chipsets, the file [./chip/npcx/registers.h] provides a +collection of `DEBUG_*` macros that can be used to enable extra console messages +related to a specific interface. For AP to EC communication, the `DEBUG_LPC` +and `DEBUG_ESPI` macros can help troubleshoot communication issues. + +[./chip/npcx/registers.h]: ../../chip/npcx/registers.h +[AP to EC Communication]: ../ap-ec-comm.md +[config.h]: ../new_board_checklist.md#config_h diff --git a/docs/configuration/ec_chipset.md b/docs/configuration/ec_chipset.md new file mode 100644 index 0000000000..5f04c4d81e --- /dev/null +++ b/docs/configuration/ec_chipset.md @@ -0,0 +1,113 @@ +# Configure EC Chipset + +## Config options + +The EC chipset is selected using board specific make file [build.mk]. The +following configuration options specify the type and size of flash memory used +by the EC. + + - `CONFIG_SPI_FLASH_REGS` - Should always be defined when using internal or + external SPI flash. + - `CONFIG_SPI_FLASH` - Define only if your board uses an external flash. + - `CONFIG_SPI_FLASH_<device_type>` - Select exactly one the supported flash + devices to compile in the required driver. This is needed even when using + the internal SPI flash of the EC chipset. + - Additional EC Chipset options are prefixed with `CONFIG_HIBERNATE*` and + should be evaluated for relevance on your board. + +## Feature Parameters + + - `CONFIG_FLASH_SIZE <bytes>` - Set to the size of the internal flash of the + EC. Must be defined to link the final image. + - `CONFIG_SPI_FLASH_PORT <port>` - Only used if your board as an external + flash. + +## GPIOs and Alternate Pins + +Configure the signals which will wakeup the EC from hibernate or deep sleep. +Typical wakeup sources include: + +- `GPIO_LID_OPEN` - An active high signal that indicates the lid has been + opened. The source of the signal is typically from a [GMR](../ec_terms.md#gmr) + or Hall-Effect sensor. The `GPIO_INT()` entry for this signal should be + connected to the `lid_interrupt()` routine. +- `GPIO_AC_PRESENT` - A signal from the battery charger that indicates the + device is connected to AC power. This signal is connected to the + `power_interrupt()` routine. +- `GPIO_POWER_BUTTON_L` - An active low signal from the power switch. This signal is connected to the `power_button_interrupt()` routine. +- `GPIO_EC_RST_ODL` - On some Nuvoton EC chipsets, the reset signal is + dual-routed to both a dedicated reset pin and a GPIO. In this case, no + interrupt handler needs to be registered to the GPIO signal, but the GPIO pin + must still be configured to wake on both edge types. The GPIO pin should also + be locked prevent the pin configuration from changing after the EC read-only + code runs. + +See the [GPIO](./gpio.md) documentation for additional details on the GPIO +macros. + +## Data structures + +- `const enum gpio_signal hibernate_wake_pins[]` - add all GPIO signals that + should trigger a wakeup of the EC. +- `const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins);` - + configures the number of wake signals used on the board. + +All ChromeOS wake sources are documented on the ChromeOS partner site in the +[Wake Sources and Battery Life] section. The EC specific wake sources are found +under the Deep Sleep and Shipping states and include: + +- Power button +- AC insert +- Lid open + +## Tasks + +None required by this feature. + +## Testing and Debugging + +## Example + +For the Volteer reference board, the following wake sources are defined in +[gpio.inc]. Note that configuration of `GPIO(EC_RST_ODL)` is located after all +`GPIO_INT()` entries required by the board. + +```c +/* Wake Source interrupts */ +GPIO_INT(EC_LID_OPEN, PIN(D, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, lid_interrupt) +GPIO_INT(EC_WP_L, PIN(A, 1), GPIO_INT_BOTH, switch_interrupt) +GPIO_INT(H1_EC_PWR_BTN_ODL, PIN(0, 1), GPIO_INT_BOTH, power_button_interrupt) +GPIO_INT(ACOK_OD, PIN(0, 0), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, extpower_interrupt) + +/* EC_RST_ODL - PSL input but must be locked */ +GPIO(EC_RST_ODL, PIN(0, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH | GPIO_LOCKED) +``` + +For the NPCx7 chipset, the alternate function must also be configured to connect +the wakeup pins to the PSL (power switch logic). + +```c +/* GPIOD2 = EC_LID_OPEN */ +ALTERNATE(PIN_MASK(D, BIT(2)), 0, MODULE_PMU, 0) +/* GPIO00 = ACOK_OD, + GPIO01 = H1_EC_PWR_BTN_ODL + GPIO02 = EC_RST_ODL */ +ALTERNATE(PIN_MASK(0, BIT(0) | BIT(1) | BIT(2)), 0, MODULE_PMU, 0) +``` + +The final step is to add the hibernate signals array to Volteer [baseboard.c] file: + +```c +/* Wake up pins */ +const enum gpio_signal hibernate_wake_pins[] = { + GPIO_LID_OPEN, + GPIO_ACOK_OD, + GPIO_POWER_BUTTON_L, + GPIO_EC_RST_ODL, +}; +const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); +``` +[gpio.inc]: ../../board/volteer/gpio.inc +[baseboard.c]: ../../baseboard/volteer/baseboard.c +[build.mk]: ../new_board_checklist.md#board_build_mk +[Wake Sources and Battery Life]: https://chromeos.google.com/partner/dlm/docs/latest-requirements/chromebook.html#wake-sources-and-battery-life
\ No newline at end of file diff --git a/docs/configuration/gpio.md b/docs/configuration/gpio.md new file mode 100644 index 0000000000..86fd21db6a --- /dev/null +++ b/docs/configuration/gpio.md @@ -0,0 +1,155 @@ +# GPIO Configuration + +GPIO setup is done for every board variant, but never for the baseboard, by +configuring the file `./board/<board>/gpio.inc`. This file configures all the +the pins on the EC chipset through the following macros. + +- `GPIO(<name>, ...)` - Configures simple GPIO input and outputs +- `GPIO_INT(<name>, ...)` - Configures GPIO inputs that connect to an interrupt + service routine. Historically these entries are defined first, but this no + longer required. +- `ALTERNATE(...)` - Configures a pin for an alternate function (e.g I2C, ADC, + SPI, etc) +- `UNIMPLEMENTED(<name>, ...)` - Creates a dummy GPIO entry + +The `GPIO()`, `GPIO_INT()`, and `UNIMPLEMENTED()` macros create a C enumeration +of the form `GPIO_<name>` that can be used in the code. As noted in [GPIO +Naming](../new_board_checklist.md#GPIO-Naming), the `<name>` parameter should +always match the schematic net name. + +## `GPIO()` macro + +### Prototype + +`GPIO(name, pin, flags)` + +- `name` - Defines the schematic net name, which is expanded to the enumeration + `GPIO_name` by the macro. +- `pin` - Use the `PIN(group,pin)` macro to define the GPIO group and pin + number. Note that on a few EC chipsets, the PIN macro is just `PIN(pin)`. +- `flags` - Define attributes of the pin (direction, pullup/pulldown, open + drain, voltage level, etc). All supported flags are found following the + `GPIO_FLAG_NONE` definition in [./include/gpio.h](../../include/gpio.h). + +### Example + +![GPIO Example] + +```c +GPIO(EC_ENTERING_RW, PIN(E, 3), GPIO_OUT_LOW) +``` + +The EC common code requires the enum `GPIO_ENTERING_RW` to be defined, so you +should also map the net name to the EC name in the `board.h` file. + +```c +#define GPIO_ENTERING_RW GPIO_EC_ENTERING_RW +``` + +## `GPIO_INT()` macro + +### Prototype +`GPIO_INT(name, pin, flags, signal)` + +- `name` - Defines the schematic net name, which is expanded to the enumeration + `GPIO_name` by the macro. +- `pin` - Same definition as `GPIO()` macro. +- `flags` - Same definition as `GPIO()` macro. Should always have one of the + `GPIO_INT_*` flags set. +- `signal` - Interrupt service routine called when the pin asserts according to + the flags set. + +### Example + +![GPIO_INT Example] + +```c +GPIO_INT(EC_LID_OPEN, PIN(D, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, lid_interrupt) +``` + +The EC common code requires the enum `GPIO_LID_OPEN` to be defined, so you als +need to map the net name to the EC name in the `board.h` file. + +```c +#define GPIO_LID_OPEN GPIO_EC_LID_OPEN +``` + +## `ALTERNATE()` macro + +### Prototype +`ALTERNATE(pinmask, function, module, flags)` + +- `pinmask` - Defines a set of pins in the same GPIO group to assign to a + different function. +- `function` - A chip-specific function number. Only used if the EC chipset + provides multiple alternate functions in addition to GPIO (e.g. pin can be + UART, I2C, SPI, or GPIO). The permitted values for this parameter vary based + on the EC chipset type. + - STM32 - 0 to 7 + - Maxim - 1 to 3 + - Microchip - 0 to 3 + - MediaTek - 0 to 7 + - All others (Nuvton, ITE, TI Stellaris, ) only support one alternate + function per pin, so this parameter should be set to 0. +- `module` - One of the enum module_id values defined in + [./include/module_id.h](../../include/module_id.h). +- `flags` - Same definition as `GPIO()` macro. + +### Notes + +At runtime there are two mechanisms for switching a pin between GPIO mode and +alternate function mode. + +- `gpio_config_module(enum module_id id, int enable)` - Configures all pins + matching the module enumeration `id`. +- `gpio_config_pin(enum module_id id, enum gpio_signal signal, int enable)` - + Configures a single pin matching the GPIO enumeration `signal`. + +For both routines, if `enable` is 1, then the corresponding pins are configured +for alternate mode operation. If `enable` is 0, then the corresponding pins are +configure for GPIO mode. + +`gpio_config_module()` is automatically called at runtime for all enabled +interfaces (I2C, SPI, UART, etc). You can use `gpio_config_pin()` to temporarily +configure a pin for GPIO operation, and to restore the original alternate +function. The I2C bus error recovery employs this mechanism to temporarily +driver the I2C SCL and SDA signals to known states, without interference by the +I2C controller in the EC chipset. + +The general recipe for overriding alternate functions is shown below. + +```c + /* Disconnect I2C1_SDA pin from I2C controller */ + gpio_config_pin(MODULE_I2C, GPIO_I2C1_SDA, 0); + + /* Setup I2C1_SDA as an GPIO open drain output and drive initial state low */ + gpio_set_flags(GPIO_I2C1_SDA, GPIO_ODR_LOW); + + /* Set GPIO high (or low) as required */ + gpio_set_level (GPIO_I2C1_SDA, 1); + + /* Restore I2C1_SDA pin to I2C function */' + gpio_config_pin(MODULE_I2C, GPIO_I2C1_SDA, 1); +``` + + + +### Example + +![ALTERNATE Example] + +```c +ALTERNATE(PIN_MASK(B, BIT(4) | BIT(5)), 0, MODULE_I2C, (GPIO_INPUT | GPIO_SEL_1P8V)) +``` + +<!-- Images --> + +<!-- If you make changes to the docs below make sure to regenerate the PNGs by + appending "export/png" to the Google Drive link. --> + +<!-- https://docs.google.com/drawings/d/18cWTYQRRCpypYDOLlvKQJTObwcj6wOjUga02B0oZXBg --> +[GPIO Example]: ../images/gpio_example.png +<!-- https://docs.google.com/drawings/d/1X6p5XfB6BBmUUKCrwOg56Bz6LZj9P_WPQXsOdk-OIiI --> +[GPIO_INT Example]: ../images/gpio_int_example.png +<!-- https://docs.google.com/drawings/d/1-kroVezQuA_KdQLzqYPs8u94EBg37z3k6lKzkSLRv-0 --> +[ALTERNATE Example]: ../images/alternate_example.png diff --git a/docs/configuration/i2c.md b/docs/configuration/i2c.md new file mode 100644 index 0000000000..92bfe7ad0a --- /dev/null +++ b/docs/configuration/i2c.md @@ -0,0 +1,204 @@ +# Configure I2C Buses + +## Config options + +The I2C options are prefixed with `CONFIG_I2C*`. Evaluate whether each option is +appropriate to add to your board. + +A typical EC and board should at a minimum set `CONFIG_I2C` and +`CONFIG_I2C_MASTER`. + +## Feature Parameters + +The following parameters control the behavior of the I2C library. [config.h] +defines a reasonable default value, but you may need to change the default value +for your board. + +- `CONFIG_I2C_CHIP_MAX_READ_SIZE <bytes>` +- `CONFIG_I2C_NACK_RETRY_COUNT <count>` +- `CONFIG_I2C_EXTRA_PACKET_SIZE <bytes>` - Only used on STM32 EC's if + `CONFIG_HOSTCMD_I2C_SLAVE_ADDR_FLAGS` is defined. + +## GPIOs and Alternate Pins + +In the gpio.inc file, you need to define a GPIO for the clock (SCL) and data +(SDA) pin used on each active I2C bus. The corresponding GPIOs are then included +in the `i2c_ports[]` array. This permits the I2C library to perform common bus +recovery actions using bit-banging without involvement by the EC-specific I2C +device driver. + +You also need to define the alternate function assignment for all I2C pins using +the `ALTERNATE()` macro. This step can be skipped for any pins that default to +I2C functionality. + +Note that many I2C buses only support 1.8V operation. This is determined by I2C +devices connected to the bus. In this case you need to include `GPIO_SEL_1P8V` +as part of the `flags` field in both the `GPIO()` and `ALTERNATE()` macros. I2C +bus 0 in the example below demonstrates configuring the SCL and SDA pins for +1.8V operation. + +See the [GPIO](./gpio.md) documentation for additional details on the GPIO +macros. + +## Data Structures + +- `const struct i2c_port_t i2c_ports[]` - This array should be defined in your + baseboard.c or board.c file. This array defines the mapping of internal I2C + port numbers used by the I2C library to the physical I2C ports connected to + the EC. +- `const unsigned int i2c_port_used = ARRAY_SIZE(i2c_ports)` - Defines the + number of internal I2C ports accessible by the I2C library. + +## Tasks + +None required by this feature. + +## Testing and Debugging + +### Console Commands + +- `i2cscan` - Provides a quick look of all I2C devices found on all configured + buses. +- `i2cxfer` - Allows you to read and write individual registers on an I2C + device. + +For runtime troubleshooting of an I2C device, enable and the [I2C +tracing](../i2c-debugging.md) module to log all I2C transactions initiated by +the EC code. + +## Example + +The image below shows the I2C bus assignment for the Volteer reference board. + +![I2C Example] + +The `gpio.inc` file for Volteer defines both `GPIO()` and `ALTERNATE()` entries for +all I2C buses used in the design. + +```c +/* I2C pins - Alternate function below configures I2C module on these pins */ +GPIO(EC_I2C0_SENSOR_SCL, PIN(B, 5), GPIO_INPUT | GPIO_SEL_1P8V) +GPIO(EC_I2C0_SENSOR_SDA, PIN(B, 4), GPIO_INPUT | GPIO_SEL_1P8V) +GPIO(EC_I2C1_USB_C0_SCL, PIN(9, 0), GPIO_INPUT) +GPIO(EC_I2C1_USB_C0_SDA, PIN(8, 7), GPIO_INPUT) +GPIO(EC_I2C2_USB_C1_SCL, PIN(9, 2), GPIO_INPUT) +GPIO(EC_I2C2_USB_C1_SDA, PIN(9, 1), GPIO_INPUT) +GPIO(EC_I2C3_USB_1_MIX_SCL, PIN(D, 1), GPIO_INPUT) +GPIO(EC_I2C3_USB_1_MIX_SDA, PIN(D, 0), GPIO_INPUT) +GPIO(EC_I2C5_POWER_SCL, PIN(3, 3), GPIO_INPUT) +GPIO(EC_I2C5_POWER_SDA, PIN(3, 6), GPIO_INPUT) +GPIO(EC_I2C7_EEPROM_SCL, PIN(B, 3), GPIO_INPUT) +GPIO(EC_I2C7_EEPROM_SDA, PIN(B, 2), GPIO_INPUT) + +/* Alternate functions GPIO definitions */ +ALTERNATE(PIN_MASK(B, BIT(5) | BIT(4)), 0, MODULE_I2C, (GPIO_INPUT | GPIO_SEL_1P8V)) /* I2C0 */ +ALTERNATE(PIN_MASK(9, BIT(0) | BIT(2) | BIT(1)), 0, MODULE_I2C, 0) /* I2C1 SCL / I2C2 */ +ALTERNATE(PIN_MASK(8, BIT(7)), 0, MODULE_I2C, 0) /* I2C1 SDA */ +ALTERNATE(PIN_MASK(D, BIT(1) | BIT(0)), 0, MODULE_I2C, 0) /* I2C3 */ +ALTERNATE(PIN_MASK(3, BIT(3) | BIT(6)), 0, MODULE_I2C, 0) /* I2C5 */ +ALTERNATE(PIN_MASK(B, BIT(3) | BIT(2)), 0, MODULE_I2C, 0) /* I2C7 */ +``` + +The `i2c_ports[]` array requires the `.port` field to be assigned to an EC +chipset specific enumeration. For the NPCx7 I2C bus names are defined in +[./chip/npcx/registers.h]. The Volteer `baseboard.h` file creates a mapping +from the schematic net name to the NPCx7 I2C bus enumeration. + +```c +#define CONFIG_I2C +#define I2C_PORT_SENSOR NPCX_I2C_PORT0_0 +#define I2C_PORT_USB_C0 NPCX_I2C_PORT1_0 +#define I2C_PORT_USB_C1 NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_1_MIX NPCX_I2C_PORT3_0 +#define I2C_PORT_POWER NPCX_I2C_PORT5_0 +#define I2C_PORT_EEPROM NPCX_I2C_PORT7_0 +``` + +The last piece for I2C configuration is to create the `i2c_ports[]` array using +the macros and enumerations added to `baseboard.h` and `gpio.inc`. + +```c +/* I2C port map configuration */ +const struct i2c_port_t i2c_ports[] = { + { + .name = "sensor", + .port = I2C_PORT_SENSOR, + .kbps = 400, + .scl = GPIO_EC_I2C0_SENSOR_SCL, + .sda = GPIO_EC_I2C0_SENSOR_SDA, + .flags = 0, + }, + { + .name = "usb_c0", + .port = I2C_PORT_USB_C0, + /* + * I2C buses used for PD communication must be set for 400 kbps + * or greater. Set to the maximum speed supported by all devices. + */ + .kbps = 1000, + .scl = GPIO_EC_I2C1_USB_C0_SCL, + .sda = GPIO_EC_I2C1_USB_C0_SDA, + }, + { + .name = "usb_c1", + .port = I2C_PORT_USB_C1, + /* + * I2C buses used for PD communication must be set for 400 kbps + * or greater. Set to the maximum speed supported by all devices. + */ + .scl = GPIO_EC_I2C2_USB_C1_SCL, + .sda = GPIO_EC_I2C2_USB_C1_SDA, + }, + { + .name = "usb_1_mix", + .port = I2C_PORT_USB_1_MIX, + .kbps = 100, + .scl = GPIO_EC_I2C3_USB_1_MIX_SCL, + .sda = GPIO_EC_I2C3_USB_1_MIX_SDA, + }, + { + .name = "power", + .port = I2C_PORT_POWER, + .kbps = 100, + .scl = GPIO_EC_I2C5_POWER_SCL, + .sda = GPIO_EC_I2C5_POWER_SDA, + }, + { + .name = "eeprom", + .port = I2C_PORT_EEPROM, + .kbps = 400, + .scl = GPIO_EC_I2C7_EEPROM_SCL, + .sda = GPIO_EC_I2C7_EEPROM_SDA, + }, +}; +const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); +``` + +The `.flags` field is optional when using the default I2C bus setup. See +[./include/i2c.h] for the full list of supported flags. + +The flag `I2C_PORT_FLAG_DYNAMIC_SPEED` allows the I2C bus frequency to be +changed at runtime. The typical use case is to set the I2C bus frequency to +different speeds based on the BOARD_VERSION in [CBI]. For example board version +1 supports 100 kbps operation but board version 2 and greater supports 400 kbps +operation. `I2C_PORT_FLAG_DYNAMIC_SPEED` is not used to change the I2C bus +frequency on the fly depending on the addressed slave device. + +An example of changing the I2C bus frequency from the [Kodama +board](../../board/kodama/board.c) is shown below. + +```c +static void board_i2c_init(void) +{ + if (board_get_version() < 2) + i2c_set_freq(1, I2C_FREQ_100KHZ); +} +DECLARE_HOOK(HOOK_INIT, board_i2c_init, HOOK_PRIO_INIT_I2C); +``` + + +[config.h]: ../new_board_checklist.md#config_h +[./chip/npcx/registers.h]: ../../chip/npcx/registers.h +[./include/i2c.h]: ../../include/i2c.h +[I2C Example]: ../images/i2c_example.png +[CBI]: https://chromium.googlesource.com/chromiumos/docs/+/master/design_docs/cros_board_info.md diff --git a/docs/configuration/keyboard.md b/docs/configuration/keyboard.md new file mode 100644 index 0000000000..f2dc585e1b --- /dev/null +++ b/docs/configuration/keyboard.md @@ -0,0 +1,91 @@ +## Configure Keyboard + +## Config options + +Keyboard options start with `CONFIG_KEYBOARD*`. Evaluate whether each option is +appropriate to add to `baseboard.h` or `board.h`. + +Your board should select only one of these options to configure the protocol +used to send keyboard events to the AP. + +- `CONFIG_KEYBOARD_PROTOCOL_8042` - Systems with an x86 AP use the 8042 + protocol. +- `CONFIG_KEYBOARD_PROTOCOL_MKBP` - Systems without an x86 AP (e.g. ARM) + typically use the MKBP protocol. + +## Feature Parameters + +- `CONFIG_KEYBOARD_KSO_BASE <pin>` - Evaluate whether this parameter is required + by your board. + +## GPIOs and Alternate Pins + +Define `ALTERNATE()` pin entries for all keyboard matrix signals, to connect the +signals to the keyboard controller of the EC chipset. + +Note that KSO_02 is purposely not configured for for alternate mode. See the [H1 +Special Requirements](#H1-Special-Requirements) below for details. + +```c +/* Example Keyboard pin setup */ +#define GPIO_KB_INPUT (GPIO_INPUT | GPIO_PULL_UP) +ALTERNATE(PIN_MASK(3, 0x03), 0, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT) /* KSI_00-01 */ +ALTERNATE(PIN_MASK(2, 0xFC), 0, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT) /* KSI_02-07 */ +ALTERNATE(PIN_MASK(2, 0x03), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_00-01 */ +ALTERNATE(PIN_MASK(1, 0x7F), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_03-09 */ +ALTERNATE(PIN_MASK(0, 0xF0), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_10-13 */ +ALTERNATE(PIN_MASK(8, 0x04), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_14 */ +``` + +See the [GPIO](./gpio.md) documentation for additional details on the GPIO +macros. + +## Data structures + +- `struct keyboard_scan_config keyscan_config` - This must be defined if the + `CONFIG_KEYBOARD_BOARD_CONFIG` option is defined. + +## Tasks + +The `KEYSCAN` task monitors the keyboard matrix for new key presses and is +required by this feature. The priority is set as one of the highest priority +tasks in the system, typically only below the `PD_Cn` and `PD_INT_Cn` tasks. + +```c + TASK_NOTEST(KEYSCAN, keyboard_scan_task, NULL, TASK_STACK_SIZE) \ +``` + +The `KEYPROTO` task handles sending and receiving 8042 protocol messages from +the AP and is required when `CONFIG_KEYBOARD_PROTOCOL_8042` is used. The typical +priority is lower than the `HOSTCMD` task. + +```c + TASK_NOTEST(KEYPROTO, keyboard_protocol_task, NULL, TASK_STACK_SIZE) \ +``` + +## Additional Notes + +- If you're including keyboard support, you should also define + `CONFIG_CMD_KEYBOARD` to enable keyboard debug commands from the EC console. +- `CONFIG_KEYBOARD_PROTOCOL_MKBP` automatically enables `CONFIG_MKBP_EVENT`. +- Boards that enable `CONFIG_KEYBOARD_PROTOCOL_8042` will often also define + `CONFIG_MKBP_EVENT` for sensor events. In this case only motion sensor data is + reported using the MKBP protocol, keyboard events are provided using the 8042 + protocol. Refer to [Configuring Sensors](./motion_sensors.md) for more + information. + +### H1 Special Requirements +On Boards that use the H1 secure microcontroller, one KSI (keyboard scan input) +signal and one KSO (keyboard scan output) signal are routed through the H1 +microcontroller. There are additional GPIO and configuration options that must +be enabled in this case. +- The KSO_02/COL2 signal is always inverted. Explicitly configure the GPIO to + default low. + ```c + GPIO(KBD_KSO2, PIN(1, 7), GPIO_OUT_LOW) /* KSO_02 inverted */ + ``` +- Add the define `CONFIG_KEYBOARD_COL2_INVERTED` to `baseboard.h` or `board.h`. +- If required by the board, define one of the following options to configure the + KSI pin routed to the H1 microcontroller. + - `CONFIG_KEYBOARD_PWRBTN_ASSERTS_KSI2` + - `CONFIG_KEYBOARD_PWRBTN_ASSERTS_KSI3` diff --git a/docs/configuration/leds.md b/docs/configuration/leds.md new file mode 100644 index 0000000000..72a548a306 --- /dev/null +++ b/docs/configuration/leds.md @@ -0,0 +1,92 @@ +# Configure LEDs + +LEDs provide status about the following: + +- Dedicated battery state/charging state +- Chromebook power +- Adapter power +- Left side USB-C port (battery state/charging state) +- Right side USB-C port (battery state/charging state) +- Recovery mode +- Debug mode + +LEDs can be configured as simple GPIOs, with on/off control only, or as PWM with +adjustment brightness and color. + +## Config options + +In [config.h], search for options that start with `CONFIG_LED*` and evaluate +whether each option is appropriate to add to `baseboard.h` or `board.h`. + +- `CONFIG_LED_COMMON` - Should be defined for both GPIO and PWM style LEDs. +- `CONFIG_LED_ONOFF_STATES` - used for GPIO controlled LEDs +- `CONFIG_LED_PWM` - used for PWM controlled LEDs. You must also define + `CONFIG_PWM` when using PWM controlled LEDs. + +## Feature Parameters + +- `CONFIG_LED_PWM_COUNT <count>` - Must be defined when using PWM LEDs + +Override the following parameters when using PWM LEDs if you don't want to use +the recommended LED color settings. +- `CONFIG_LED_PWM_CHARGE_COLOR <ec_led_color>` +- `CONFIG_LED_PWM_NEAR_FULL_COLOR <ec_led_color>` +- `CONFIG_LED_PWM_CHARGE_ERROR_COLOR <ec_led_color>` +- `CONFIG_LED_PWM_SOC_ON_COLOR <ec_led_color>` +- `CONFIG_LED_PWM_SOC_SUSPEND_COLOR <ec_led_color>` +- `CONFIG_LED_PWM_LOW_BATT_COLOR <ec_led_color>` + +## GPIOs and Alternate Pins + +For GPIO based LEDs, create `GPIO()` entries for all signals that connect to +platform LEDs. The default state of the pins should be set so that the LED is +off (typically high output). + +For PWM LEDs, configure the `ALTERNATE()` macro, setting the module type to +`MODULE_PWM`. + +## Data structures + +For GPIO based LEDs: +- `struct led_descriptor led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES]` - + Must be defined when `CONFIG_LED_ONOFF_STATES` is used. Defines the LED states + for the platform for various charging states. + +For PWM based LEDs: +- `const enum ec_led_id supported_led_ids[]` - Defines the LED type for all PWM + LEDs in the system. See [./include/ec_commands.h] for a description of the + supported LED types. +- `struct pwm_led led_color_map[]` - Defines the PWM intensity of the individual + LEDs to generate the corresponding color. This table allows for custom tuning + of the LED brightness and color. +- `const struct pwm_channels[]` - Configures the PWM module, refer to the + [Configuring PWM](./pwm.md) section for details. + +See the [GPIO](./gpio.md) documentation for additional details on the GPIO +macros. + +## Tasks + +None required by this feature. + +## Testing and Debugging + +### Console Commands + +- `pwmduty` - *TODO* add description. +- `gpioset` - For GPIO based LEDs, this command lets you directly change the + state of the LED. +- `gpioget` - For GPIO based LEDs, this reads current state of the pin. If the + current state does not track changes made with `gpioset`, check your board for + stuck at high or stuck at low condition. + +If you're having problems with a PWM LED, try reconfiguring the pin as a GPIO to +verify the board operation independent of the PWM module. + +## LED Driver Chips + +LED driver chips are used to control the LCD panel backlight. The backlight +control is separate from the platform LEDs. + +[config.h]: ../new_board_checklist.md#config_h +[./include/ec_commands.h]: ../../include/ec_commands.h
\ No newline at end of file diff --git a/docs/configuration/motion_sensors.md b/docs/configuration/motion_sensors.md new file mode 100644 index 0000000000..4dac939b10 --- /dev/null +++ b/docs/configuration/motion_sensors.md @@ -0,0 +1,52 @@ +# Configure Motion Sensors + +EC sensors are used for the following capabilities: + +- Accelerometers in base and lid measure lid angle to toggle between laptop and + tablet modes. +- Ambient light sensors control display backlight level. +- All sensor types, including gyroscope, e-compass, and pressure, are used by + Android apps. +- Special sync sensor type, synchronizes sensor events with AP. + +*TODO* - there is good content available in the most recent [Chrome EC] overview +presentation that can be added here. + +## Config options + +*TODO* + +## Feature Parameters + +*TODO* + + +## GPIOs and Alternate Pins + +*TODO* + +- `GPIO_EC_INT_L` - Output from the EC, driven low to indicate an event on the + EC is ready for servicing by the AP. + +## Data Structures + +*TODO* + +## Tasks + +*TODO* + +## Testing and Debugging + +*TODO* + +### Console Commands + +*TODO* + +## Example + +*TODO* + +[Chrome EC]: https://docs.google.com/presentation/d/1Y3PwNSnCQoCqDfL5rYqfaBP_ZqbMOTw_x83_ry4cro8/view#slide=id.g63bdbcea4b_0_27 + diff --git a/docs/configuration/template.md b/docs/configuration/template.md new file mode 100644 index 0000000000..be4d2378a5 --- /dev/null +++ b/docs/configuration/template.md @@ -0,0 +1,51 @@ +# EC Feature Configuration Template + +*Short description of the EC feature and the capabilities provided* + +## Config options + +In [config.h], search for options that start with `CONFIG_<feature>*` and +evaluate whether each option is appropriate to add to `baseboard.h` or +`board.h`. + +*Note - Avoid documenting `CONFIG_` options in the markdown as `config.h` +contains the authoritative definition.* + +## Feature Parameters + +*Detail `CONFIG_*` options that must be assigned to a value for this EC feature +to compile and operate.* + +## GPIOs and Alternate Pins + +*Document any hard-coded GPIO enumeration names required by the EC feature.* + +*For pins that require an alternate function, note the module required by the EC +feature.* + +## Data Structures + +*Document any data structures that must be defined in the board.c or baseboard.c +files in order for the EC feature to compile and operate.* + +*Document any functions that must be implemented in the board.c and baseboard.c +files.* + +## Tasks + +*Document any EC tasks that must be enabled by the feature.* + +## Testing and Debugging + +*Provide any tips for testing and debugging the EC feature.* + +### Console Commands + +*Document an EC console commands related to the feature.* + +## Example + +*Optional - provide code snippets from a working board to walk the user through +all code that must be created to enable this feature.* + +[config.h]: ../new_board_checklist.md#config_h diff --git a/docs/images/alternate_example.png b/docs/images/alternate_example.png Binary files differnew file mode 100644 index 0000000000..b2fcdb51e1 --- /dev/null +++ b/docs/images/alternate_example.png diff --git a/docs/images/gpio_example.png b/docs/images/gpio_example.png Binary files differnew file mode 100644 index 0000000000..b2092b5e30 --- /dev/null +++ b/docs/images/gpio_example.png diff --git a/docs/images/gpio_int_example.png b/docs/images/gpio_int_example.png Binary files differnew file mode 100644 index 0000000000..fe231e9b55 --- /dev/null +++ b/docs/images/gpio_int_example.png diff --git a/docs/images/i2c_example.png b/docs/images/i2c_example.png Binary files differnew file mode 100644 index 0000000000..73ee880541 --- /dev/null +++ b/docs/images/i2c_example.png diff --git a/docs/new_board_checklist.md b/docs/new_board_checklist.md new file mode 100644 index 0000000000..22e8d25988 --- /dev/null +++ b/docs/new_board_checklist.md @@ -0,0 +1,172 @@ +# Creating a new EC board + +[TOC] + +## Overview + +This document describes the high-level steps needed to create a new EC board. If +you're creating a new board based on existing baseboard, you can jump straight +to the relevant link found under [Configuring EC +Features](#Configure-EC-Features) and focus on known board changes. + +## Conventions +### Key Files +Before you get started, it's important to understand the role of a few key files +in the EC codebase. + +- [`include/config.h`](../include/config.h) {#config_h} - Contains the list of + top-level configuration options for the Chrome EC codebase. Each configuration + option is documented inline and is considered the authoritative definition. + +- `baseboard/<name>/` - This directory contains header files and source files + shared by all boards in a baseboard family. + - `baseboard.h` - Contains the EC configuration options shared by all + devices in the baseboard family. + - `baseboard.c` - Contains code shared by all devices in the baseboard + family. + - `build.mk` - The board family makefile specifies C source files compiled + into all boards in the baseboard family. + +- `board/<board>` - Files in this directory are only built for a single board. + - `board.h` - EC configuration options specific to a single board. + - `board.c` - Code built only on this board. + - `build.mk` {#board_build_mk} - The board makefile defines the EC chipset family, defines the + baseboard name, and specifies the C source files that are compiled. + - `gpio.inc` - This C header file defines the interrupts, GPIOs, and + alternate function selection for all pins on the EC chipset. + - `ec.tasklist` - This C header defines the lists of tasks that are enabled + on the board. See the main EC documentation more details on [EC tasks]. + +### GPIO Naming +Many drivers and libraries in the common EC code rely on board variants defining +an exact GPIO signal name. Examples include the `GPIO_LID_OPEN`, +`GPIO_ENTERING_RW`, and `GPIO_SYS_RESET_L` signals. The net names in schematics +often do not match these names exactly. When this occurs, best practice is that +all the `GPIO_INT()`, `GPIO()`, `ALTERNATE()`, and `UNIMPLEMENTED()` definitions +in `gpio.inc` use the schematic net name. You then create `#define` macros in +`board.h` to map the net names to the EC common names. + +Below is an example configuration for the SYS_RESET_L signal. The schematic net +name of this signal is EC_RST_ODL and the signal connects to the EC chipset pin +GPIO02. + +```c +/* From gpio.inc */ +GPIO(EC_RST_ODL, PIN(0, 2), GPIO_ODR_HIGH) + +/* From board.h */ +/* Map the schematic net name to the required EC name */ +#define GPIO_SYS_RESET_L GPIO_EC_RST_ODL +``` + +Please see the [GPIO](./configuration/gpio.md) documentation for additional +details on the GPIO macros. + +## How to use this document +Each of the following sections details a single feature set that may need to be +modified or configured for your new board. The feature sets are organized so +they can be implemented with a reasonably sized change list, and can be worked +on independently. + +Each configuration feature document includes the following sub-tasks: + +- **Config Options** - This section details the `CONFIG_*` options relevant to + the feature. Use the documentation found in [config.h] to determine whether + each option should be enabled (using #define) or disabled (using #undef) in + the relevant `baseboard.h` or `board.h` file. +- **Feature Parameters** - This section details parameters that control the + operation of the feature. Similar to the config options, feature parameters + are defined in [config.h] and prefixed with `CONFIG_*`. However, feature + parameters are assigned a default value, which can be overridden in by + `baseboard.h` or `board.h` using an `#undef/#define` pair. + ```c + #undef CONFIG_UART_TX_BUF_SIZE + #define CONFIG_UART_TX_BUF_SIZE 4096 + ``` +- **GPIOs and Alternate Pins** - This section details signals and pins relevant + to the feature. Add the required `GPIO_INT()`, `GPIO()`, `ALTERNATE()`, and + `UNIMPLEMENTED()` definitions to `gpio.inc`, making sure to follow the [GPIO + naming conventions]. +- **Data Structures** - This section details the data structures required to + configure the feature for correct operation. Add the data structures to + `baseboard.c` or `board.c`. Note that most data structures required by the + common EC code should be declared `const` to save on RAM usage. +- **Tasks** - This section details the tasks that the EC feature requires for + operation. +- **Testing and Debugging** - This section details strategies for testing the EC + feature set and for debugging issues. This section also documents EC console + commands related to the feature set. +- **Example** - When present, this section walks through a complete example for + configuring an EC feature based on an existing board implementation. + +## Create the new EC board + +The first step when creating a new EC board, is to create the required files in +the `./baseboard` and `./board` directories. When adding a new board for an +existing baseboard family, use the python script [new_variant.py] to +automatically copy the `./board` directory from an existing EC board to get you +started. The [new_variant.py] script performs additional operations not directly +related to the EC code, including copying coreboot files and modifying the yaml +files. If you want to copy the EC board files only, you can directly call the +[create_initial_ec_image.sh] script. The instructions for running this script +are found in the corresponding [README.md] documentation. + +The [new_variant.py] script also verifies the new EC board compiles and prepares +a changelist to upload to Gerrit. You should upload this changelist unmodified +for review and submission (you may need to run `make buildall -k` to satisfy +the EC pre-submit tests). + +The next step is to review the following sections to make any needed +modifications to your new board files, test the changes, and upload the changes +for review. + +### Creating a new reference board + +If you are creating a new reference board, it is recommended that you manually +create new directories under the `./baseboard` and `./board` directories and +populate these directories with the minimum set of files required compile the EC +board. The initial changelists for the Hatch and Volteer reference boards +provide good examples for how to start. + + * [Volteer EC skeleton build] + * [Hatch EC skeleton build] + +After submitting the skeleton builds, review the following sections and add each +feature set as required by your design. + +## Configure EC Features + +The checklist below provides an overview of EC features that must be configured +for correct operation of a Chromebook. The "Needed for Power On" column +indicates which features are critical for board bringup. These features take +priority and should be ready before the first prototypes arrive. Use the +documentation link for details about the code changes required to implement each +feature. + +| EC Feature | Needed for Power On | +| :--------- | ------------------: | +| [Configure EC Chipset](./configuration/ec_chipset.md) | yes | +| [Configure AP to EC Communication](./configuration/config_ap_to_ec_comm.md) | yes | +| [Configure AP Power Sequencing](./configuration/ap_power_sequencing.md) | yes | +| [Configure USB-C](./usb-c.md) | yes | +| [Configure Charger (TODO)](./configuration/template.md) | yes | +| [Configure I2C Buses](./configuration/i2c.md) | no | +| [Configure CrOS Board Information (CBI)](./configuration/cbi.md) | no | +| [Configure Keyboard](./configuration/keyboard.md) | no | +| [Configure LEDs](./configuration/leds.md) | no | +| [Configure Motion Sensors (TODO)](./configuration/motion_sensors.md) | no | +| [Configure BC1.2 Charger Detector (TODO)](./configuration/template.md) | no | +| [Configure Battery (TODO)](./configuration/template.md) | no | + +After finishing the changes required for all EC features, it is recommended that +you make one final pass over all the GPIOs and pin assignments used on your +board. Refer to the [GPIO](./configuration/gpio.md) documentation for details. + +[README.md]:https://chromium.googlesource.com/chromiumos/platform/dev-util/+/master/contrib/variant/README.md +[new_variant.py]:https://chromium.googlesource.com/chromiumos/platform/dev-util/+/master/contrib/variant/new_variant.py +[create_initial_ec_image.sh]:https://chromium.googlesource.com/chromiumos/platform/dev-util/+/master/contrib/variant/create_initial_ec_image.sh +[Volteer EC skeleton build]:https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1758532 +[Hatch EC skeleton build]:https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1377569/ +[config.h]: ./new_board_checklist.md#config_h +[EC tasks]: ../README.md#Tasks +[GPIO naming conventions]: ./new_board_checklist.md#GPIO-Naming
\ No newline at end of file diff --git a/docs/sitemap.md b/docs/sitemap.md index f80b7501b0..387e1be5f0 100644 --- a/docs/sitemap.md +++ b/docs/sitemap.md @@ -7,6 +7,9 @@ * [Write Protection](./write_protection.md) * [EC Acronyms and Technologies](./ec_terms.md) +## EC Bringup +* [New Board Checklist](./new_board_checklist.md) + ## Case Closed Debugging (CCD) * [Case Closed Debugging Overview](./case_closed_debugging.md) |