diff options
Diffstat (limited to 'docs')
91 files changed, 0 insertions, 17425 deletions
diff --git a/docs/ap-ec-comm.md b/docs/ap-ec-comm.md deleted file mode 100644 index 5cd6fd82d9..0000000000 --- a/docs/ap-ec-comm.md +++ /dev/null @@ -1,152 +0,0 @@ -# Application Processor to EC communication - -[TOC] - -## Overview - -The Application Processor (sometimes called the host) communicates with the EC -by issuing *host commands*, which are identified by a command ID and version -number, and then reading a response. When a host command is issued through -`ectool`, two or three software components are involved: - -* `ectool`, the user-space binary, -* normally the `cros-ec` Kernel driver, and -* the code on the EC itself. This can be thought of as two parts: - * a chip-specific driver for the appropriate transport, and - * the generic host command handling code (mostly in the - [host command task]). - -We'll go into detail of each of these, as well as the traffic on the wire, in -the following sections. - -### `ectool` - -`ectool` contains wrapper functions for the host commands exposed by the EC, -providing a CLI. They call one of the transport-specific `ec_command` -implementations in the `util/comm-*.c` files to send and receive from the EC. - -### EC kernel driver - -In most cases, `ectool` communicates via the [`cros-ec` Kernel driver], rather -than directly from userspace. It sends raw commands to the Kernel driver, which -sends them on to the EC, bypassing a lot of the other Kernel driver -functionality. - -There are other CrOS EC-related Kernel drivers, which use host commands to act -as adapters to existing Linux APIs. For example, sensors from the EC are mapped -to the Linux [Industrial I/O] system. - -### On the wire - -Now we come to the protocol itself. All transactions take this general form: - -* Host writes the request packet, consisting of: - * a transport-specific header; - * a `struct ec_host_request` containing the command ID, data length, and a - checksum; and - * zero or more bytes of parameters for the command, the format of which - depends on the command. -* Host reads the response to its request, consisting of: - * a transport-specific header; - * a `struct ec_host_response` containing the result code, data length, and - a checksum; and - * zero or more bytes of response from the command, again with a - command-specific format. - -### On the EC - -The host packet is received on the EC by some chip-specific code which checks -its transport-specific header, then passes it on to the common host command -code, starting at `host_packet_receive`. The common code validates the packet -and then sends it on to the handler function (annotated with the -`DECLARE_HOST_COMMAND` macro), which runs in the `HOSTCMD` task. The handler can -set a response by modifying its arguments struct, which is sent back to the host -via the chip-specific code. - -While this is happening, the EC needs to indicate to the host that it is busy -processing and not yet ready to give a response. How it does this depends on the -transport method used (see [Transport-specific details] below). - -## Versions - -There are two different concepts of "version" involved in host commands: version -of the overarching protocol, and versions of individual commands. - -### Protocol versions - -There have been three protocol versions so far, and this document describes -version 3. Version 1 was superseded by 2 before it shipped, so no devices use it -anymore. Version 2 is generally deprecated, but you might still encounter it -occasionally. - -Which version is in use can be determined using the `EC_CMD_GET_PROTOCOL_INFO` -command. This was only introduced in version 3, however, so if errors, -`EC_CMD_HELLO` should be sent in version 2. If the hello command succeeds, the -EC speaks version 2. - -### Command versions - -Individual commands also have versions, independent of the protocol version -they're being called with. Different versions of a command may have different -parameter or response formats. `EC_CMD_GET_CMD_VERSIONS` returns the versions of -the given command supported by the EC. These version numbers start at 0. - -## Transport-specific details - -Although the command and response formats are the same across all transports, -some details of how they are transmitted differ, which may be of interest when -implementing the EC side of the protocol on a new chip. - -### I<sup>2</sup>C - -I<sup>2</sup>C is very flexible with its timing, so when the EC receives a -packet from the host, it should stretch the clock, holding it low until it is -ready for the host to read the response. - -If the host tries to read more bytes than were in the response, the EC should -respond with an obvious filler byte (such as 0xEC). For example, if a command -that normally returns 50 bytes errors, its response will only be 8 bytes (the -size of the response struct). The host will probably try to read 50 bytes -anyway, so the EC should send the 8 bytes of the struct followed by 42 copies of -the filler byte. - -### SPI - -The SPI bus is similar to I<sup>2</sup>C, but with two major exceptions. First, -there's a minimum speed on the SPI bus. If slave devices don't respond quickly -enough, the master will assume they're broken and give up. Second, every -transaction is bidirectional. When bits are being clocked from master to slave -on the MOSI line, the master will simultaneously read bits in the other -direction on the MISO line. - -Hardware devices can usually handle this, and often some hardware-based flow -control used to "stretch" the transaction by a bit or byte if the slave device -needs a little extra time to respond to the master's demands. - -When exchanging messages with the EC on the SPI bus, the EC's host commands are -communicated using our own software flow-control scheme, because most of the -embedded controllers either aren't fast enough or don't have any support for -hardware flow-control. - -It works like this: When the AP sends a byte to the EC, if the EC doesn't have a -response queued up in advance, a default byte is returned. The EC preconfigures -that default response byte to indicate its status (ready, busy, waiting for more -input, etc.). Once the AP has sent a complete command message, it continues -clocking bytes to the EC (which the EC ignores) and just looks at the response -byte that comes back. Once the EC has parsed the AP's command and is ready to -reply, it sends a "start of frame" byte, followed by the actual response. The AP -continues to read and ignore bytes from the EC until it sees the start of frame -byte, and then it knows that the EC's response is starting with the next byte. - -Once the response packet has been read, any additional reads should return -`EC_SPI_PAST_END`. - -### LPC or eSPI - -The EC should set `EC_LPC_STATUS_PROCESSING` in its command status register -after receiving a host packet and before it has a response ready. - -[`cros-ec` Kernel driver]: https://chromium.googlesource.com/chromiumos/third_party/kernel/+/refs/heads/chromeos-4.19/drivers/mfd/cros_ec_dev.c -[Industrial I/O]: https://www.kernel.org/doc/html/v4.14/driver-api/iio/index.html -[host command task]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/common/host_command.c -[Transport-specific details]: #Transport_specific-details diff --git a/docs/case_closed_debugging.md b/docs/case_closed_debugging.md deleted file mode 100644 index 8310970652..0000000000 --- a/docs/case_closed_debugging.md +++ /dev/null @@ -1,2 +0,0 @@ -The has been moved into a -[different branch](https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging.md) diff --git a/docs/case_closed_debugging_cr50.md b/docs/case_closed_debugging_cr50.md deleted file mode 100644 index ac518c0153..0000000000 --- a/docs/case_closed_debugging_cr50.md +++ /dev/null @@ -1,2 +0,0 @@ -The has been moved into a -[different branch](https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md) diff --git a/docs/ccd_howtos.md b/docs/ccd_howtos.md deleted file mode 100644 index 44deecd16d..0000000000 --- a/docs/ccd_howtos.md +++ /dev/null @@ -1,2 +0,0 @@ -The has been moved into a -[different branch](https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/ccd_howtos.md) diff --git a/docs/code_coverage.md b/docs/code_coverage.md deleted file mode 100644 index ec8053ca93..0000000000 --- a/docs/code_coverage.md +++ /dev/null @@ -1,50 +0,0 @@ -# Code Coverage - -Provides an overview of how to use code coverage tools when running the unit -tests in the EC codebase. - -[TOC] - -## Availability - -Code coverage is only available for host-based unit tests, as opposed to manual -tests that run on target hardware. - -## Building for code coverage - -To build host-based unit tests for code coverage, invoke `make` with the -`coverage` target, as follows: - -`make coverage -j` - -This target will compile and link the unit tests with `--coverage` flag (which -pulls in the `gcov` libraries), run the tests, and then process the profiling -data into a code coverage report using the `lcov` and `genhtml` tools. - -The coverage report top-level page is `build/coverage/coverage_rpt/index.html`. - -### Noise in the build output - -When building for code coverage, you may see multiple warnings of the form -`geninfo: WARNING: no data found for -/mnt/host/source/src/platform/ec/core/host/cpu.h` and `genhtml: WARNING: -function data mismatch at -/mnt/host/source/src/platform/ec/common/math_util.c:134` - -These warnings can be ignored. (FYI, the "function data mismatch" warnings -appear to be caused in part by using relative paths instead of absolute paths.) - -## Zephyr ztest code coverage - -To build the Zephyr unit tests for code coverage run: - -`zmake coverage build/ztest-coverage` - -This target will compile, without linking, all zephyr projects with -`CONFIG_COVERAGE` Kconfig option enabled, run the tests, and then process the -profiling data into a code coverage report using the `lcov` and `genhtml` -tools. This requires the `HAS_COVERAGE_SUPPORT` option, which can only be -selected in `Kconfig.board`. - -The coverage report top-level page is -`build/ztest-coverage/coverage_rpt/index.html`. diff --git a/docs/code_reviews.md b/docs/code_reviews.md deleted file mode 100644 index a8e77c3fd8..0000000000 --- a/docs/code_reviews.md +++ /dev/null @@ -1,54 +0,0 @@ -# Code Reviews - -The `platform/ec` repository makes use of a code review system that tries to -evenly distribute code reviews among available reviewers. - -[TOC] - -## How to request a review - -Add `cros-ec-reviewers@google.com` to the reviewer line in Gerrit. A background -job will come around and replace the `cros-ec-reviewers@google.com` address with -the next available reviewer in the EC reviewer rotation. This typically takes on -the order of minutes. - -Optionally, you can click the [FIND OWNERS] button in the UI, and select -`cros-ec-reviewers@google.com`. - -## When to use review system - -If you are modifying code in `common/`, `chip/`, or `core/`, feel free to use -the `cros-ec-reviewers@google.com` system. It is **never** a requirement to use -`cros-ec-reviewers@google.com`. You can always request a review from a specific -person. - -## Responsibilities of reviewers - -If the selected reviewer is unfamiliar with code in a CL, then that reviewer -should at least ensure that EC style and paradigms are being followed. Once EC -styles and paradigms are being followed, then the reviewer can give a +1 and add -the appropriate domain expert for that section of code. - -Reviewers should try to give an initial response within 1 business day of -receiving a review request. Thereafter, they should try to respond to new -comments by the author within 1 business day. - -## Review guidelines - -Authors and reviewers should follow the Chrome OS firmware review -[guidelines][2] while publishing and reviewing code. - -## How can I join the rotation? - -Add your name to the [list of reviewers][1]. - -## Reference - -* [Chrome OS firmware review guidelines][2] -* [Coreboot Gerrit Guidelines][3] -* [Google small CL guidelines][5] - -[1]: http://google3/chrome/crosinfra/gwsq/ec_reviewers -[2]: http://chromium.googlesource.com/chromiumos/docs/+/HEAD/firmware_code_reviews.md -[3]: https://doc.coreboot.org/getting_started/gerrit_guidelines.html -[5]: https://google.github.io/eng-practices/review/developer/small-cls.html diff --git a/docs/configuration/ap_power_sequencing.md b/docs/configuration/ap_power_sequencing.md deleted file mode 100644 index c5073d5809..0000000000 --- a/docs/configuration/ap_power_sequencing.md +++ /dev/null @@ -1,253 +0,0 @@ -# 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 deleted file mode 100644 index f89ee78454..0000000000 --- a/docs/configuration/cbi.md +++ /dev/null @@ -1,39 +0,0 @@ -# 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_CBI_EEPROM` - -## 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/+/HEAD/design_docs/cros_board_info.md -[I2C buses]: ./i2c.md -[I2C debugging information]: ./i2c.md# diff --git a/docs/configuration/config_ap_to_ec_comm.md b/docs/configuration/config_ap_to_ec_comm.md deleted file mode 100644 index 24b309feb7..0000000000 --- a/docs/configuration/config_ap_to_ec_comm.md +++ /dev/null @@ -1,73 +0,0 @@ -# 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_SHI` - [SPI Host Interface](../ec_terms.md#shi) (SHI) -- `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 deleted file mode 100644 index defc27eec8..0000000000 --- a/docs/configuration/ec_chipset.md +++ /dev/null @@ -1,116 +0,0 @@ -# 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 <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 diff --git a/docs/configuration/gpio.md b/docs/configuration/gpio.md deleted file mode 100644 index f4a5c4719a..0000000000 --- a/docs/configuration/gpio.md +++ /dev/null @@ -1,160 +0,0 @@ -# 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 fake 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 deleted file mode 100644 index 36464bb371..0000000000 --- a/docs/configuration/i2c.md +++ /dev/null @@ -1,203 +0,0 @@ -# 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_CONTROLLER`. - -## 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_TRANSFER_SIZE <bytes>` -- `CONFIG_I2C_NACK_RETRY_COUNT <count>` -- `CONFIG_I2C_EXTRA_PACKET_SIZE <bytes>` - Only used on STM32 EC's if - `CONFIG_HOSTCMD_I2C_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/+/HEAD/design_docs/cros_board_info.md diff --git a/docs/configuration/keyboard.md b/docs/configuration/keyboard.md deleted file mode 100644 index 8398fefbde..0000000000 --- a/docs/configuration/keyboard.md +++ /dev/null @@ -1,87 +0,0 @@ -## 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 can be used to customize - the keyboard scanner (e.g. scan frequency, debounce duration, etc.). - -## 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 deleted file mode 100644 index c4fe7894af..0000000000 --- a/docs/configuration/leds.md +++ /dev/null @@ -1,88 +0,0 @@ -# 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 diff --git a/docs/configuration/motion_sensors.md b/docs/configuration/motion_sensors.md deleted file mode 100644 index 6e84fc3307..0000000000 --- a/docs/configuration/motion_sensors.md +++ /dev/null @@ -1,50 +0,0 @@ -# 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 deleted file mode 100644 index be4d2378a5..0000000000 --- a/docs/configuration/template.md +++ /dev/null @@ -1,51 +0,0 @@ -# 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/core_runtime.md b/docs/core_runtime.md deleted file mode 100644 index 4a45136234..0000000000 --- a/docs/core_runtime.md +++ /dev/null @@ -1,329 +0,0 @@ -# Chromium OS Embedded Controller Runtime - -## Design Principles - -1. Never do at runtime what you can do at compile time The goal is saving flash - space and computations. Compile-time configuration until you really need to - switch at runtime. - -2. Real-time: guarantee low latency (eg < 20 us) no interrupt disabling ... - bounded code in interrupt handlers. - -3. Keep it simple: design for the subset of microcontroller we use targeted at - 32-bit single core CPU for small systems : 4kB to 64kB data RAM, possibly - execute-in-place from flash. - -## Execution Contexts - -This is a pre-emptible runtime with static tasks. It has only 2 possible -execution contexts: - -- the regular [tasks](#tasks) -- the [interrupt handlers](#interrupts) - -The initial startup is an exception as described in the -[dedicated paragraph](#startup). - -### Tasks - -The tasks are statically defined at compile-time. They are described for each -*board* in the [board/$board/ec.tasklist](../board/host/ec.tasklist) file. - -They also have a static fixed priority implicitly defined at compile-time by -their order in the [ec.tasklist](../board/host/ec.tasklist) file (the top-most -one being the lowest priority aka *task* *1*). As a consequence, two different -tasks cannot have the same priority. - -In order to store its context, each task has its own stack whose (*small*) size -is defined at compile-time in the [ec.tasklist](../board/host/ec.tasklist) file. - -A task can normally be preempted at any time by either interrupts or higher -priority tasks, see the [preemption section](#scheduling-and-preemption) for -details and the [locking section](#locking-and-atomicity) for the few cases -where you need to avoid it. - -### Interrupts - -The hardware interrupt requests are connected to the interruption handling *C* -routines declared by the `DECLARE_IRQ` macros, through some chip/core specific -mechanisms (e.g. depending on whether we have a vectored interrupt controller, -slave interrupt controllers...) - -The interrupts can be nested (ie interrupted by a higher priority interrupt). -All the interrupt vectors are assigned a priority as defined in their -`DECLARE_IRQ` macro. The number of available priority level is -architecture-specific (e.g. 4 on Cortex-M0, 8 on Cortex-M3/M4) and several -interrupt handlers can have the same priority. An interrupt handler can only be -interrupted by a handler having a priority **strictly** **greater** than its -own. - -In most cases, the exceptions (e.g data/prefetch aborts, software interrupt) can -be seen as interrupts with a priority strictly greater than all IRQ vectors. So -they can interrupt any IRQ handler using the same nesting mechanism. All fatal -exceptions should ultimately lead to a reboot. - -### Events - -Each task has a *pending* events bitmap[1] implemented as a 32-bit word. Several -events are pre-defined for all tasks, the most significant bits on the 32-bit -bitmap are reserved for them : the timer pending event on bit 31 -([see the corresponding section](#time)), the requested task wake (bit 29), the -event to kick the waiters on a mutex (bit 30), along with a few hardware -specific events. The 19 least significant bits are available for task-specific -meanings. - -Those event bits are used in inter-task communication and scheduling mechanism, -other tasks **and** interrupt handlers can atomically set them to request -specific actions from the task. Therefore, the presence of pending events in a -task bitmap has an impact on its scheduling as described in the -[scheduling section](#scheduling-and-preemption). These requests are done using -the `task_set_event()` and `task_wake()` primitives. - -The two typical use-cases are: - -- a task sends a message to another task (simply use some common memory - structures [see explanation](#single-address-space) and want it to process - it now. -- a hardware IRQ occurred, and we need to do some long processing to respond - to it (e.g. an I2C transaction). The associated interrupt handler cannot do - it (for latency reason), so it will raise an event to ask a task to do it. - -The task code chooses to consume them (or a subset of them) when it's running -through the `task_wait_event()` and `task_wait_event_mask()` primitives. - -### Scheduling and Preemption - -The system has a global bitmap[1] called `tasks_ready` containing one bit per -task and indicating whether it is *ready* *to* *run* (ie want/need to be -scheduled). The task ready bit can only be cleared when it's calling itself one -of the functions explicitly triggering a re-scheduling (e.g. `task_wait_event()` -or `task_set_event()`) **and** it has no pending event. The task ready bit is -set by any task or interrupt handler setting an event bit for the task (ie -`task_set_event()`). - -The scheduling is based on (and *only* on) the `tasks_ready` bitmap (which is -derived from all the events bitmap of the tasks as explained above). - -Then, the scheduling policy to find which task should run is just finding the -most significant bit set in the tasks_ready bitmap and schedule the -corresponding task. - -Important note: the re-scheduling happens **only** when we are exiting the -interrupt context. It is done in a non-preemptible context (likely with the -highest priority). Indeed, a re-scheduling is actually needed only when the -highest priority task ready has changed. There are 3 distinct cases where this -can happen: - -- an interrupt handler sets a new event for a task. In this case, - `task_set_event` will detect that it is executed in interrupt context and - record in the `need_resched_or_profiling` variable that it might need to - re-schedule at interrupt return. When the current interrupt is going to - return, it will see this bit and decide to take the slow path making a new - scheduling decision and eventually a context switch instead of the fast path - returning to the interrupt task. -- a task sets an event on another task. The runtime will trigger a software - interrupt to force a re-scheduling at its exit. -- the running task voluntarily relinquish its current execution rights by - calling `task_wait_event()` or a similar function. This will call the - software interrupt similarly to the previous case. - -On the re-scheduling path, if the highest-priority ready task is not matching -the currently running one, it will perform a context-switch by saving all the -processor registers on the current task stack, switch the stack pointer to the -newly scheduled task, and restore the registers from the previously saved -context from there. - -### Hooks and Deferred Functions - -The lowest priority task (ie Task 1, aka TASK_ID_HOOKS) is reserved to execute -repetitive actions and future actions deferred in time without blocking the -current task or creating a dedicated task (whose stack memory allocation would -be wasting precious RAM). - -The HOOKS task has a list of deferred functions and their next deadline. Every -time it is waken up, it runs through the list and calls the ones whose deadline -is expired. Before going back to sleep, it arms a timer to the closest deadline. -The deferred functions can be created using the `DECLARED_DEFERRED()` macro. -Similarly, the HOOK_SECOND and HOOK_TICK hooks are called periodically by the -HOOKS task loop (the *tick* duration is platform-defined and shorter than the -second). - -Note: be specially careful about priority inversions when accessing resources -protected by a mutex (e.g. a shared I2C controller) in a deferred function. -Indeed being the lowest priority task, it might be de-scheduled for long time -and starve higher priority tasks trying to access the resource given there is no -priority boosting implemented for this case. Also, be careful about long delays -(> x 100us) in hook or deferred function handlers, since those will starve other -hooks of execution time. It is better to implement a state machine where you set -up a subsequent call to a deferred function than have a long delay in your -handler. - -### Watchdog - -The system is always protected against misbehaving tasks and interrupt handlers -by a hardware watchdog rebooting the CPU when it is not attended. - -The watchdog is petted in the HOOKS task, typically by declaring a HOOK_TICK -doing it as regular intervals. Given this is the lowest priority task, this -guarantees that all tasks are getting some run time during the watchdog period. - -Note: that's also why one should not sprinkle its code with `watchdog_reload()` -to paper over long-running routine issues. - -To help debug bad sequences triggering watchdog reboots, most platforms -implement a warning mechanism defined under `CONFIG_WATCHDOG_HELP`. It's a timer -firing at the middle of the watchdog period if it hasn't been petted by then, -and dumping on the console the current state of the execution mainly to help -find a stuck task or handler. The normal execution is resumed though after this -alert. - -### Startup - -The startup sequence goes through the following steps: - -- the assembly entry routine clears the .bss (uninitialized data), copies the - initialized data (and optionally the code if we are not executing from - flash), sets a stack pointer. -- we can jump to the `main()` C routine at this point. -- then we go through the hardware pre-init (before we have all the clocks to - run the peripherals normal) and init routines, in this rough order: memory - protection if any, gpios in their default state, prepare the interrupt - controller, set the clocks, then timers, enable interrupts, init the debug - UART and the watchdog. -- finally, start tasks. - -For the tasks startup, initially only the HOOKS task is marked as ready, so it -is the first to start and can call all the HOOK_INIT handlers performing -initializations before actually executing any real task code. Then all tasks are -marked as ready, and the highest priority one is given the control. - -During all the startup sequence until the control is given the first task, we -are using a special stack called 'system stack' which will be later re-used as -the interrupts and exception stack. - -To prepare the first context switch, the code in `task_pre_init()` is stuffing -all the tasks stacks with a *fake* saved context whose program counter contains -the task start address, and the stack pointer is pointing to its reserved stack -space. - -### Locking and Atomicity - -The two main concurrency primitives are lightweight atomic variables and heavier -mutexes. - -The atomic variables are 32-bit integers (which can usually be loaded/stored -atomically on the architecture we are supporting). The `atomic.h` headers -include primitives to do atomically various bit and arithmetic operations using -either load-linked/load-exclusive, store-conditional/store-exclusive or simple -depending on what is available. - -The mutexes are actually statically allocated binary semaphores. In case of -contention, they will make the waiting task sleep (removing its ready bit) and -use the [event mechanism](#events) to wake-up the other waiters on unlocking. - -Note: the mutexes are NOT triggering any priority boosting to avoid the priority -inversion phenomenon. - -Given the runtime is running on single core CPU, spinlocks would be equivalent -to masking interrupts with `interrupt_disable()` spinlocks, but it's strongly -discouraged to avoid harming the real-time characteristics of the runtime. - -## Time - -### Time Keeping - -In the runtime, the time is accounted everywhere using a **64-bit** -**microsecond** count since the microcontroller **cold** **boot**. - -Note: The runtime has no notion of wall-time/date, even though a few platforms -have an RTC inside the microcontroller. - -These microsecond timestamps are implemented in the code using the `timestamp_t` -type, and the current timestamp is returned by the `get_time()` function. - -The time-keeping is preferably implemented using a 32-bit hardware free running -counter at 1Mhz plus a 32-bit word in memory keeping track of the high word of -the 64-bit absolute time. This word is incremented by the 32-bit timer rollback -interrupt. - -Note: as a consequence of this implementation, when the 64-bit timestamp is read -in interrupt context in a handler having a higher priority than the timer IRQ -(which is somewhat rare), the high 32-bit word might be incoherent (off by one). - -### Timer Event - -The runtime offers *one* (and only one) timer per task. All the task timers are -multiplexed on a single hardware timer. (can be just a *match* *interrupt* on -the free running counter mentioned in the [previous paragraph](#time-keeping)) -Every time a timer is armed or expired, the runtime finds the task timer having -the closest deadline and programs it in the hardware to get an interrupt. At the -same time, it sets the TASK_EVENT_TIMER event in all tasks whose timer deadline -has expired. The next deadline is computed in interrupt context. - -Note: given each task has a **single** timer which is also used to wake-up the -task when `task_wait_event()` is called with a timeout, one needs to be careful -when using directly the `timer_arm()` function because there is an eventuality -that this timer is still running on the next `task_wait_event()` call, the call -will fail due to the lack of available timer. - -## Memory - -### Single Address Space - -There is no memory isolation between tasks (ie they all live in the same address -space). Some architectures implement memory protection mechanism albeit only to -differentiate executable area (eg `.code`) from writable area (eg `.bss` or -`.data`) as there is a **single** **privilege** level for all execution -contexts. - -As all the memory is implicitly shared between the task, the inter-task -communication can be done by simply writing the data structures in memory and -using events to wake the other task (given we properly thought the concurrent -accesses on those structures). - -### Heap - -The data structure should be statically allocated at compile time. - -Note: there is no dynamic allocator available (e.g. `malloc()`), not due to -impossibility to create one but to avoid the negative side effects of having -one: ie poor/unpredictable real-time behavior and possible leaks leading to a -long-tail of failures. - -- TODO: talk about shared memory -- TODO: where/how we store *panic* *memory* and *sysjump* *parameters*. - -### Stacks - -Each task has its own stack, in addition there is a system stack used for -startup and interrupts/exceptions. - -Note 1: Each task stack is relatively small (e.g. 512 bytes), so one needs to be -careful about stack usage when implementing features. - -Note 2: At the same time, the total size of RAM used by stacks is a big chunk of -the total RAM consumption, so their sizes need to be carefully tuned. (please -refer to the [debugging paragraph](#debugging) for additional input on this -topic. - -## Firmware Code Organization and Multiple Copies - -- TODO: Details the classical RO / RW partitions and how we sysjump. - -## Power Management - -- TODO: talk about the idle task + WFI (note: interrupts are disabled!) -- TODO: more about low power idle and the sleep-disable bitmap -- TODO: adjusting the microsecond timer at wake-up - -## Debugging - -- TODO: our main tool: serial console ... (but non-blocking / discard - overflow, cflush DO/DONT) -- TODO: else JTAG stop and go: careful with watchdog and timer -- TODO: panics and software panics -- TODO: stack size tuning and canarying - -- TODO: Address the rest of the comments from https://crrev.com/c/445941 - -\[1]: bitmap: array of bits. diff --git a/docs/detachable_base_verified_boot.md b/docs/detachable_base_verified_boot.md deleted file mode 100644 index c1eec3fc0b..0000000000 --- a/docs/detachable_base_verified_boot.md +++ /dev/null @@ -1,432 +0,0 @@ -# Detachable Base Verified Boot - -Authors: rspangler@google.com, drinkcat@google.com - -Last Updated: 2016-11-16 - -Original: http://go/detachable-base-vboot - -[TOC] - -## Introduction - -### What's a Base? - -Detachable Chromebooks such as `Poppy` have a tablet-like `Lid` and a detachable -keyboard `Base`. Effectively, the `Base` is a USB keyboard+trackpad which plugs -into the `Lid`. - -The `Lid` contains most of the components, including: - -* AP -* ECDisplay -* Storage -* Battery - -The `Base` connects to the `Lid` via USB pogo pins, and contains: - -* EC ([STM32F072]). To minimize confusion with the main EC in the `Lid`, this - will always be called the `BaseEC`. -* Matrixed keyboard -* Touchpad - -The `Base` always gets its power from the `Lid` USB port. This means that -attaching the base always triggers a power-on reset. - -### Verified Boot Requirements - -The `BaseEC` will be responsible for handling user input from the keyboard and -touchpad. This means that a compromised `BaseEC` could implement a keylogger. To -prevent this, we will use verified boot to protect the `BaseEC` firmware. - -We need a way to securely update the `BaseEC` firmware from the AP. We cannot -use EC Software Sync as implemented on existing Chromebooks (and as still used -in the `Lid`) because the `Base` cannot trust that it is talking to an official -`Lid` firmware/OS. All the Base knows is that _something_ on the other end of -USB is trying to send it an update. So the BaseEC will need to do its own public -key verification of the firmware update. This includes rollback protection. - -Updating the `BaseEC` firmware should not require rebooting the lid. This means -the update will take place after the OS has already booted on the lid. Ideally, -it should also not require the user to detach/reattach the base during the -update process. If the update takes longer than a few seconds, we should tell -the user, because the keyboard and trackpad will be unavailable during the -update. - -The solution should also have low (or no) BOM cost, and minimal flash size -requirement. - -## Proposal - -`BaseEC` RO region includes a public key, whose private counterpart is kept -safely on our signers. On boot, RO checks RW signature (RW image is signed by -our signers), and will only jump to RW if the signature is valid. - -We also include a rollback region (RB) to implement rollback protection (and -prevent rollback to a correctly signed, but compromised, RW). This region can -only be updated by RO. - -We also devise a scheme to update RW firmware (the details are documented in -[EC Update over USB]). - -Note: This proposal is very specific to the STM32 flash architecture. Other ECs -(particularly ones with external SPI flash) may need additional external logic -and/or a I2C EEPROM to hold the rollback info block. - -### Flash - -STM32F072 has 128KB flash, with 2KB erase sectors and 4KB protection blocks. - -We will divide flash into three sections: - -* `BaseEC`-RO firmware. - * Not updatable in production. - * Only capable of USB update, not keyboard/trackpad. - * Contains public key to verify RW image (RSA-3072). -* `BaseEC`-RW firmware. - * Fully functional. - * Updatable from AP. - * Signature (SHA-256 + RSA-3072). -* `BaseEC`-RB: Rollback info block (4KB). - * Contains minimum RW version that RO will accept to jump to. - * Updatable from RO. - -Each of those sections can be locked independently: In production, RO is always -locked, and only RO can write to RB (RO will always make sure to lock RB before -jumping to RW). - -Flash protection is a little entertaining on STM32: - -* The flash protection bits for the \*next\* boot are stored in a non-volatile - `WRPx` register (in EC code, this is abstracted as - `EC_FLASH_PROTECT_[REGION]_AT_BOOT` flags).. -* On chip reset, `WRPx` is copied into a read-only `FLASH_WRPR` register; that - controls which blocks are protected for this boot. This is abstracted as - `EC_FLASH_PROTECT_[REGION]_NOW` in the EC code. - -### Rollback Info Block - -The Rollback Info Block (aka "RB") is a 4KB block of flash. - -It has two 2KB erase sectors. We will ping-pong writes to those sectors, so that -interrupting power during an erase-write cannot cause data loss. If both sectors -are valid, the stricter (i.e. the highest value) of the 2 sectors is used. - -We will use the RB to hold the following: - -* Minimum **RW rollback firmware** version: a 32-bit integer. Used for - rollback protection. This number is independent of the actual EC version, - and is stored a 32-bit integer as part of the `BaseEC`-RW region (see - [CL:452815] for a possible implementation) -* A magic signature that indicates that the RB section is valid. - -### RO Verified Boot Flow - -#### Write-Protect RO think test before this handles corrupt RW. - -Write protect of RO firmware works the same way it does now: - -* Early RO code looks at a write protect (WP) GPIO and a global PSTATE - variable (part of the RO image itself). When we switch to RO that contains - the MP key, we set the PSTATE to locked. -* If both of those are set: - * RO code sets `EC_FLASH_PROTECT_RO_AT_BOOT` to protect itself. This - ensures RO code is never writable past this point. - * If `_AT_BOOT` flags protects more than the current write protect range - (`_NOW` flags), RO reboots so that changes take effect. -* Otherwise, someone has physically disconnected WP. Set `WRPx=0` to unprotect - all flash and reboot. - -#### Check if AP Wants To Update RW - -Next, RO needs to find out if the AP wants to update RW. RO initializes USB and -starts a 1 second timer to give the AP an opportunity to send a command before -RO jumps to RW. This delay gives us a way to regain control of the base, if the -previous RW firmware is properly signed but bad/nonfunctional. - -That command can be: - -* `STOP_IN_RO`: Yes, I might want to update you. Stick around. - * `UNLOCK_RW`: Tells EC to unlock RW region, if it is currently locked, so - that it can be reprogrammed. This also locks RB region. EC reboots if - needed. -* `JUMP_TO_RW`: No, I don't want to update you. Go ahead and jump to your RW - code if it verifies. - -RO will start verifying RW while it waits for the AP to send it a command or for -the timeout. If a command is received, RO will stop the 1-second timer, and wait -for more commands from the AP. This allows the AP to update RW. - -Verifying RW will take ~200 ms, and the AP should be able to send a command to -the base within ~100 ms of it appearing on USB, so this check should not cause -any delay to the base's boot process. - -#### Verify RW - -RO calculates the hash of RW. - -* Use the public key stored in RO to check if the hash matches the RSA-signed - RW signature. On failure, go back to waiting for an update from the AP. -* Check the RW rollback version against the stored minimum version in RB. If - the RW version is too low, fail. Go back to waiting for an update from the - AP. -* If RO is protected, then also set `EC_FLASH_PROTECT_RW_AT_BOOT` so that RW - will be protected on the next boot, the reboot. - -#### Roll Forward - -If `EC_FLASH_PROTECT_ROLLBACK_NOW` is set (RB is protected), do not attempt to -roll forward. We know RW firmware is properly signed, but not if it's -functional. - -If `EC_FLASH_PROTECT_ROLLBACK_NOW` is not set (RB is unprotected), \_and\_ the -RW signature is correct, then update RB: - -* Erase/write the older sector of RB. -* Set the stored minimum version to the RW rollback version. -* If RO is protected, then also set `EC_FLASH_PROTECT_ROLLBACK_NOW` so that RB - will be protected on the next boot. - -#### Jump to RW - -If the 1-second timer for the AP to send a command to RO has not expired, RO -waits for it to expire or the AP to send a command, whichever happens first. - -If RB or RW is unprotected (`EC_FLASH_PROTECT_RW/ROLLBACK_NOW` are not set), -protect it and reboot (we never want RW to be able to update RB on its own). - -Otherwise, jump to RW firmware. - -### RW Verified Boot Flow - -RW firmware provides the keyboard and trackpad functionality. - -#### AP Wants To Update RW - -At some point the AP may want to update RW. To do so, it sends `UNLOCK_RW` -command, to ask RW to unlock itself and reboot, then follow the update steps -above. - -#### AP Wants to Roll Forward RW - -After the update, the base boots to the new RW firmware. At that point, the AP -knows the new RW firmware is good enough to talk to, so it tells RW to prepare -for roll forward. - -* `UNLOCK_ROLLBACK` command: RW unprotects RB. -* On next boot (not necessarily urgent, but can be forced), RO will update RB - according to the steps above. - -### Write Protect GPIO - -The `BaseEC` needs a write protect (WP) GPIO signal to decide whether to keep RO -firmware protected or not. This is the same requirement as on existing ECs. - -In an assembled base, the WP signal will be physically asserted. De-asserting -the signal requires disassembling the base and disconnecting something. - -Typically, the `BaseEC` will apply a weak pull-up to the WP GPIO; the presence -of the WP screw/flex will short the pin to ground. - -#### RO Updates During Development - -If RO is unprotected (i.e. during development), RW can also update it. - -If the key is \_not\_ the same (dev->premp, premp->mp updates) we can't update -RW first (it won't verify). These steps should work though, if current RW is -recent enough and stable enough to update RO: - -* Make sure RW is active -* Update RO, reboot -* Update RW from RO - -If the key is the same, we can update RW first. - -### Signer, image format, and verification process - -Memory map: - -RO | RB | RW -------------------------------------------------- | --- | --- -`...` \| `Public key` \| `...` \| `FMAP` \| `...` | | `EC code and data` \| `Blank (0xff)` \| `Signature` - -* RO contains an embedded RSA public key (`vb21_packed_key` format), at a - variable location. -* RW contains a signature (`vb21_signature`), packed at the end of the RW - region. - * The signature also contains the actual length of the EC code and image - (ignoring 0xff padding) - * RO validates signature against the provided length, then checks that the - rest of the RW region (up to the signature itself) is filled with ones - (padding). - * This speeds up verification significantly, as SHA-256 is an - expensive process. -* RO contains an FMAP that allows futility to find the RO key, RW region, and - RW signature location. - -For re-signing, `futility` (rwsig type) does this: - -* Look for FMAP to find RO public key RW region, and RW signature locations. -* Resign RW region, using the length provided in existing RW signature. -* Replace RO public key with the one used for signing. - -`vb21_packed_key` (public key) has a field for key version, that we can use to -increment from dev keys, to premp, and final mp keys. BaseEC will need to report -the key version, to avoid incorrect updates. - -## Example Boot / Update Flows - -The base starts in the following state: - -* Powered off -* WP GPIO is asserted -* PSTATE is set to protect RO firmware -* RW firmware is valid, and currently version M -* `EC_FLASH_PROTECT_[REGION]_AT_BOOT/_NOW` protects RO+RW+RB (that is, - everything) - -All AP operations are done from the `Lid` OS. - -Base updates will interrupt keyboard/trackpad functionality, so the user should -be informed when an update is taking place. - -Reboots of the `Base` do not cause or require reboots of the `Lid`, do not -require action on the part of the user, and will not be visible to the user -(other than the previously noted lack of functionality). - -### Power On, No Update - -Step | RW | RB contents | `_AT_BOOT` | `_NOW` ---------------------------------------------------------------------------------------------- | --- | ----------- | ---------- | ------ -(initial state) | M | 1/blank | RO/RW/RB | RO/RW/RB -1. RO waits 1 second for an update request from AP | | | | -2. RO verifies RW signature => RW is good | | | | -3. RO notes that `_AT_BOOT` and `_NOW` already protect everything, so no reboot is necessary. | | | | -4. RO jumps to RW | | | | - -### Updating RW - -Assume AP now has a new `BaseEC`-RW, version N>M. The base is already running RW -version M. In this card, the rollback version in both version is identical -("1"), so RB does not require an update. - -Step | RW | RB contents | `_AT_BOOT` | `_NOW` -------------------------------------------------------- | --- | ----------- | -------------- | ------ -RW is running | M | 1/blank | RO/RW/RB | RO/RW/RB -AP tells RW to prepare for an update (UNLOCK_RW) | | | | -RW unsets `EC_FLASH_PROTECT_RW_AT_BOOT` to unprotect RW | | | **RO/\_\_/RB** | -RW reboots to update `EC_FLASH_PROTECT_RW_NOW` | | | | **RO/\_\_/RB** - -The next base boot is where the update takes place: - -Step | RW | RB contents | `_AT_BOOT` | `_NOW` ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | ----------- | ------------ | ------ -RO waits 2 seconds for an update request from the AP | M | 1/blank | RO/\_\_/RB | RO/\_\_/RB -AP tells RO an update is coming (`STOP_IN_RO`) | | | | -AP tells the user that a base update is taking place. UI should say: "Please don't be surprised that your keyboard and trackpad won't work for a few seconds..." | | | | -AP writes RW version N | **N** | | | -AP tells RO to reboot (`IMMEDIATE_RESET`) | | | | -RO reboots, verifies RW signature => RW is good | | | | -RO checks RW rollback version N (1) and sees it's greater or equal than RB rollback version 1. So, RW is good. | | | | -RO sets `RW_AT_BOOT` to protect RW on the next boot. | | | **RO/RW/RB** | -RO reboots | | | | **RO/RW/RB** - -The next base boot is where we first run the new RW firmware. - -### Roll forward - -Now let's assume we followed the steps above, and we now have a RW version O -that has rollback version 2. - -Step | RW | RB contents | `_AT_BOOT` | `_NOW` --------------------------------------------------------------------------------------------------------------- | ----- | ----------- | -------------- | ------ -RO verifies RW signature => RW is good | **O** | 1/blank | RO/RW/RB | RO/RW/RB -RO checks RW rollback version O (2) and sees it's greater or equal than RB rollback version 1. So, RW is good. | | | | -RO jumps to RW | | | | -AP is satisfied that the base works, so it tells RW to prepare for a | | | | -roll-forward (`UNLOCK_ROLLBACK`) | | | | -RW unsets `ROLLBACK_AT_BOOT` | | | **RO/RW/\_\_** | -RW may reboot (or just wait for next reattach) | | | | **RO/RW/\_\_** - -On next boot, RB will be updated: - -Step | RW | RB contents | `_AT_BOOT` | `_NOW` ------------------------------------------------------------------------------------------------------------------------------------------ | --- | ----------- | ------------ | ------ -RO verifies RW signature => RW is good | O | 1/blank | RO/RW/\_\_ | RO/RW/\_\_ -RO sees that RB is unprotected, and sees RW rollback version O (2) and sees is greater than RB rollback version 1. So RB needs an update. | | | | -RO updates RB's second block | O | **1/2** | | -RO sets `ROLLBACK_AT_BOOT` to protect RB on the next boot. | | | **RO/RW/RB** | -RO reboots. | | | | **RO/RW/RB** - -## Details - -### STM32 Flash Protection - -At a high level, flash protection works on the STM32F072 chip works in the -following manner: - -* 128KB flash total flash, organized as 32 independently protectable 4KB - blocks. Each block has 2 independently erasable 2KB sectors. -* `FLASH_WRPR` is the register controlling flash write protect of these - blocks. It is not directly writable. In EC common code, these bits are - abstracted as `EC_FLASH_PROTECT_[REGION]_NOW`. -* Instead, there is a non-volatile register called `WRPx`, which is stored in - a separate information block of flash. This is always writable. In EC common - code, these bits are abstracted as `EC_FLASH_PROTECT_[REGION]_AT_BOOT`. On - chip reset, `WRPx` is copied to the `FLASH_WRPR` register. - -Here's the interesting part. The only way to change read-only firmware is to -change `WRPx` and then reset the chip, so that `WRPx` is copied into -`FLASH_WRPR`. At that point, read-only firmware could be writable. But that same -reset also transfers control back to the read-only firmware. If the read-only -firmware doesn't want to be writable, all it has to do is change `WRPx` back to -protect itself, and then reboot again. We do that already on all devices which -use the STM32 chips. - -Flash protection works similarly on other STM32F chips, if we need to move to a -larger or more capable EC for the base to support a more complex base. - -### Flash Contents - -The 128KB `BaseEC` flash will be divided into three parts. - -* Read-only firmware (`Base`-EC-RO, or just "RO" in this document) - * ~40KB - * Minimal functionality, so it can be small. - * Verifies the rewritable firmware. - * Updates the rewritable firmware over USB. - * Does NOT have keyboard or trackpad support. - * Includes the `Base-EC` root key. -* Rewritable firmware (`Base-EC`-RW, or just "RW" in this document) - * ~84KB - * Supports keyboard and trackpad. - * Trackpad drivers may be non-trivial in size. - * Future bases may include type-C ports, sensors, or batteries, all of - which will increase RW size. - * As with the main EC, it is unlikely we will have space for multiple - copies of RW (so, no RW-A and RW-B). - * Updates the read-only firmware over USB (pre-production devices only). -* Rollback block (`Base-EC`-RB, or just "RB" in this document) - * 4KB (one protection block) - * Contains rollback version information for RW - * Only writable by RO. - * Updates alternate between the 2 2KB erase sectors. We only erase one of - them at a time, so an interrupted erase/write will not cause data loss. - -Adding the RB will decrease the total amount of flash available for RO and RW, -but doesn't require any additional external components. This is acceptable -because RO will be smaller (since it only has update/verify functionality). - -### Verification Speed - -On a STM32F072 chip running at 48 MHz, - -* SHA-256 of a 64KB RW image takes 200 ms (~3 ms/KB) - * Reducing RW image size reduces verification time almost proportionally - (even if we need to check that the rest of the image is erased). -* RSA-2048 (exponent 3) signature verification takes ~50 ms -* RSA-3072 (exponent 3) signature verification takes ~100 ms - -[STM32F072]: http://www.st.com/content/ccc/resource/technical/document/reference_manual/c2/f8/8a/f2/18/e6/43/96/DM00031936.pdf/files/DM00031936.pdf -[EC Update over USB]: ./usb_updater.md -[CL:452815]: https://chromium-review.googlesource.com/c/452815/2 diff --git a/docs/ec-3po-design.md b/docs/ec-3po-design.md deleted file mode 100644 index 79ec3ecf0f..0000000000 --- a/docs/ec-3po-design.md +++ /dev/null @@ -1,326 +0,0 @@ -# EC-3PO: The EC console interpreter - -[TOC] - -## Introduction - -Today, the Chromium OS Embedded Controller (EC) has a very rich debug console -that is very helpful and has features including command history, editing, -timestamps, channels and much more. However, all of these features currently use -up valuable flash space that a number of our boards desperately need. We -constantly run into this problem where boards are running out of space and -people have to hack out a lot of code just so the image will fit. It's been -occurring with more frequency lately and I imagine it will continue to occur as -we add more features to our EC code base. What we could do instead is move all -of that console functionality out to a separate utility and turn the EC console -into a binary mode which would only speak in host command packets and debug -output packets. EC-3PO would serve as the interpreter translating from the -traditional EC console that we all know and love to host command packets sent -down to the EC and vice versa. - -## Benefits - -The benefits to be gained are numerous and can all occur without changing -people's existing workflow. The only slight impact might be that we instruct -people to `emerge hdctools` every so often. All people would notice would be -that the EC images would be getting smaller and/or more console features. - -### Testing & FAFT - -Currently, [FAFT](https://www.chromium.org/for-testers/faft) runs its tests -while trying to parse strings from the EC console. This method can be fairly -fragile as debug output can be interleaved with the console input. A lot of -items could be improved by switching to this host command packet interface. - -* Communicating in packets makes testing easier and more robust. - * When FAFT is running, the EC could be in a binary mode where it only - communicates in host command packets. These packets are easier to parse, - create, and filter on. - * With filtering, you get the added bonus of not having unwanted debug - output. - * It allows us to really test the host command interface which is how the - EC talks to the AP anyways. -* Better testing of existing host command handlers. - * By speaking in host command packets, we can reuse the existing host - command handlers which is nice since we'll be using the same handlers - that are used to respond to the AP. -* FAFT would no longer have to worry about the console dropping characters. - * We can add error checking to the interpreter which would automatically - retry errors. This alleviates FAFT from trying to check if the EC had - properly received a line of input. (Ctrl+L) - -With better and more reliable tests, we can improve the quality of our EC -codebase. - -### Space Savings - -By moving the console functionality off of the EC, we would be able to shave off -a considerable amount of bytes from the EC images. People wouldn't have to worry -as much about creating a debug console print with the fear of bloating up the -image size. Smaller stack requirements by changing `printf` formatting to only -count bytes while moving common strings off the EC. Additionally, most of these -savings will come for free as it will apply to every EC with a console. We won't -be restricted by the type of chip. - -### A richer EC console - -* We could do things like on-the-fly console channel filtering. -* Coloring specific channels such as "mark all USB PD messages in green". -* Adding colors in general. -* Adding temporary console commands. -* Longer command history which survives EC reboot -* Searching command history -* Redirecting debug output to log files (which causes no interleaving of - command and debug output) -* Bang commands (`!foo`) - -### Better debuggability - -Sometimes, there will be an issue with the EC (or believed to be an EC issue) -such as the keyboard locking up on certain keys or rows. At times like that, it -would be nice to have an EC console to see what's going on. Other times maybe -having a servo connected might make the issue not present itself. - -* We could do cool things like having an EC console without having to hook up - servo. -* Run `ectool` from the chroot using a PTY interface. - -## Deployment Strategy - -There are many facets to this feature, but here's a deployment strategy which -will gradually take us from the current EC console today, to a future where the -console is completely removed from the EC. The goal will be to make this change -as transparent as possible to developers. - -### Phase 1: Insertion - -_[[Merged to ToT](https://crrev.com/c/320629) on 2016-02-07]_ - -Phase 1 will most likely consist of getting EC-3PO in place in between servo and -the EC while not modifying the behavior of the console too much. In this phase, -we can replicate the console interface and achieve the following things. - -* Replicate command editing. -* Save command history. -* Add error checking to the console commands. - -### Phase 2: Assimilation - -Phase 2 will start to introduce the host command packet communication. - -* Printing will be done via packets and assembled in EC-3PO. -* Console commands now are sent using the host command packets. - * This will be incremental as console commands are converted. -* Add debug output filtering and redirection/logging. - -### Phase 3: Expansion - -Phase 3 will expand the feature set of EC-3PO. - -* Add PTY interface to `ectool`. -* Add on-device console without `servod`. -* Colored output. -* Command history search. -* Bang commands (`!foo`) - -## High Level Design & Highlights - -![Diagram with three boxes. EC-3PO with an incoming PTY communicates with the -Serial Driver over another PTY. The Serial Driver communicates with the EC -UART.](./images/ec-3po-high-level-design.png) - -### EC Interface - -Each host command is a 16-bit command value. Commands which take parameters or -return response data specify `struct`s for that data. See -[`include/ec_commands.h`](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/include/ec_commands.h) -for the current format of request and replies. Currently, there are no changes -made to the format of the host request and response structures. - -On the EC, we essentially need to create a UART host command handler. This -handler will be watching the console input for a byte sequence to switch into -this host command mode. The starting sequence for an incoming host command -packet will be `0xDA`, a byte signifying `EC_COMMAND_PROTOCOL_3`. Once this byte -is seen, the EC will transition to its "host command processing mode" and -receive the host command. It will then process the host command, send the binary -host response, and then transition back into normal mode. Ideally, there should -be some locking of the UART to prevent other writes while this is taking place. - -By the end of the assimilation (Phase 2), there would be no "normal mode" and -everything would be in the binary host command mode. - -### Host Interface - -The host interface is where the bulk of the work will be. This will be -converting from the received host commands to console prints as well as -converting the console inputs to host commands. It will also be responsible for -replicating the console. This includes things like moving back and forth for -command editing. - -The interpreter should also open a PTY and `dut-control` should return this PTY -as the `ec_uart_pty`. This is to ensure that the change is as transparent as -possible to developers. - -### Features - -The following are an explanation of a few of the planned features. - -#### Command Error Checking - -EC-3PO and the EC can perform error checking when sending the commands to the -EC. This feature would be implemented prior to switching to the binary format. -The interpreter can package the command in the following manner. - -* 2 Ampersands -* 2 hex digits representing the length of the command -* 2 hex digits representing the CRC-8 of the command -* 1 Ampersand -* The command itself -* 2 newline characters. - -This is robust because no commands currently start with `&`. If the EC does not -see ‘`&&`', then one of the ampersands has been dropped. If the EC doesn't see -an ampersand after 4 hex digits, it either dropped a hex digit or the ampersand. -Two newlines, so dropping one of those is alright. Once the EC gets the command -and newline, it can verify the command string hasn't been corrupted. - -In the event that the command string was corrupted, the EC can return an error -string back of `&&EE`. If the translator reads a line with at least one -ampersand followed by one "E", then an error had occurred and the translator can -simply retry the console command. This creates a reliable input to the console, -a great win for FAFT. - -#### PTY interface to `ectool` - -Once the UART host command handler is functional, we could add the UART as one -of the interfaces to `ectool`. This would allow `ectool` to be run from the -chroot simply by having `ectool` communicate over the PTY. Since `ectool` -communicates using host commands anyways, everything should just work™. The -benefits of this include faster development of `ectool` and host commands as -well as a more robust interface for FAFT. - -#### On-device EC console without Servo - -Once the transition is complete and the console speaks entirely in host -commands, it's no longer necessary to have the console talk solely over the -UART. EC-3PO, or a variant, could exist as a standalone application that could -be bundled in the system image, just like `ectool`. It would then send and -receive host commands using the same interface that `ectool` uses whether it be -LPC or I2C. This would essentially give us a console without having to hook up -servo. - -Note for security reasons, this must be locked down to only allow a subset of -commands and debug output when the system is ready to ship. - -#### Replacing `cprintf()` - -All prints will need to become packets. In these packets will contain the format -string, but all `cprintf()` has to do is parse to format string to determine how -many bytes the parameters take up. Then, `cprintf()` will send the format string -and the parameters to EC-3PO which will create the proper string using that -information. That makes `cprintf()` on the EC smaller and use less stack space -than it would have used for formatting. - -We could also have a table of common format strings which the EC could just -provide an index and the parameters. - -## Internal Design - -EC-3PO is a Python package which aims to migrate the rich debug console from the -EC itself to the host. It is composed of two modules: console and interpreter. - -![Diagram of EC-3PO internal design. Within an outer box labelled EC-3PO are the -Console and Interpreter modules. A bidirectional command pipe links the two, and -a debug pipe goes from the Interpreter to the -Console.](./images/ec-3po-internal-design.png) - -### Console module - -The console module provides the interactive console interface between the user -and the interpreter. It handles the presentation of the EC console including -editing methods as well as session-persistent command history. - -The console runs in an infinite loop listening for activity on three things -using the `select()` system call: the PTY served to the user, the command pipe, -and the debug pipe. The debug pipe is a unidirectional pipe from the interpreter -to the console. From this pipe are debug prints that originate from the attached -EC and the console currently writes these strings as is to the user PTY. The -command pipe is bidirectional and is used between the console and the -interpreter for command traffic. An example transaction would be a host command -request and response. - -#### Enhanced EC image negotiation - -When the user transmits a character on the PTY, the console begins to scan every -byte and perform the appropriate actions. Since not every EC image will support -these enhanced features, the console must perform an interrogation to determine -what behaviour to take. If the interrogation mode is set to auto, this -negotiation takes place every time the enter key is pressed. The interrogation -is very simple 2 way handshake. The console sends down a byte, `EC_SYN` and -waits a timeout period to receive a byte, `EC_ACK`. This timeout period is 300ms -for non-enhanced EC images and 1 second for enhanced EC images. Enhanced EC -images will try to immediately respond to an `EC_SYN` with an `EC_ACK` to -indicate to EC-3PO that the current EC images is enhanced. The non-enhanced EC -image timeout period is intended to be short because non-enhanced EC images will -never reply to the `EC_SYN`. By keeping this timeout short, we are essentially -inserting a slight pause after each command. However, this timeout is long -enough for an enhanced EC image to send its reply of `EC_ACK`. Once the `EC_ACK` -is received by the console, the console increases the timeout to 1 second for -stability purposes just in case the enhanced EC image takes a bit longer to send -its reply for some reason. This negotiation allows EC-3PO to behave correctly -for both enhanced and non-enhanced EC images. - -If a user knows that they are not using an enhanced EC image, they can disable -the interrogation by issuing a OOBM command. This will cause the console to -never initiate a negotiation, eliminating the delay. See the "interrogate" -command in the Out of Band Management section for usage. - -#### Enhanced vs. Non-Enhanced EC images - -All EC images which don't explicitly enable the new features (or were built -before the features were implemented in the code base) are non-enhanced images. -Non-enhanced EC images will be handling the presentation of the console -including editing methods (and history if enabled). Therefore, the EC-3PO -console and interpreter behave as a simple pipe for this case forwarding -everything straight to the EC to handle. For the enhanced EC images, all console -presentation (including editing methods) is handled locally by the EC-3PO -console. Enhanced EC images will also support all of the other features -discussed in this document. - -#### Out of Band Management - -The interactive console also has an Out of Band Management (OOBM) interface. -This allows commands to be entered that can alter the behavior of the console -and interpreter during runtime. From the console, one can bring up the OOBM -prompt by pressing ‘%' . These were originally added for debug purposes. - -##### Supported Commands - -* `loglevel <integer>` - * Allows setting the effective loglevel of the console and interpreter. -* `interrogate <never | always | auto> [enhanced]` - * Allows control of when and how often interrogation occurs. - -### Interpreter module - -The interpreter provides the interpretation layer between the EC UART and the -user. Similar to the console module, the interpreter starts an infinite loop of -servicing the user and the EC by means of a `select()` system call. It receives -commands through its command pipe, formats the commands for the EC, and sends -the command to the EC. It also presents data from the EC to either be displayed -via the interactive console module or some other consumer. - -The interpreter also keeps track of whether the EC image it's communicating with -is enhanced or not. This is required so that the interpreter can communicate -correctly with the EC. For enhanced EC images, the interpreter will pack -incoming commands in a particular format. This could be the "packed plaintext" -form or the binary host command format. With the packed plaintext form, the -interpreter also supports command retrying by monitoring the response of the EC -and automatically retrying the command with no input from the user. - -### Other users - -Since the interpreter communicates using pipes, it's not necessary that the user -use the console module. For example, FAFT could directly connect to the -interpreter and send down commands and receive command responses instead of -having to deal with the PTY and instead just deal with python objects. diff --git a/docs/ec-3po.md b/docs/ec-3po.md deleted file mode 100644 index dae7b9babb..0000000000 --- a/docs/ec-3po.md +++ /dev/null @@ -1,82 +0,0 @@ -# EC-3PO - -[TOC] - -## What is EC-3PO? - -EC-3PO is the console interpreter that will one day replace the EC console that -we have today. EC-3PO aims to migrate our rich debug console from the EC itself -to the host. This allows us to maintain our rich debug console without impacting -our EC image sizes while also allowing us to add new features. - -For more information, see [the design doc](./ec-3po-design.md). - -## How do I use EC-3PO? - -If you're using `servod` to connect to your EC, chances are you're already using -it. EC-3PO was grafted into `servod` on Feb 7th 2016. If you're not running -`servod`, you can run EC-3PO manually by running `console.py` in the -`util/ec3po` directory from the EC checkout. You will need to provide the PTY -that you get from elsewhere though. - -To obtain the EC console PTY, inside the chroot run: - -```shell -$ dut-control ec_uart_pty -``` - -**NOTE: It's important to use `dut-control` to query the PTY instead of just -eyeballing the `servod` output.** The former PTY (now known as -`raw_ec_uart_pty`) will be sending raw binary data. Trying to use that console -with an enhanced EC image will definitely fail and you won't be able to -send/receive any commands. - -Then use your favorite serial terminal program to connect to the PTY. Since -`servod` is run as root, you'll need to run your serial terminal program as root -as well using `sudo`. This is because the permissions have changed from 666 to -660. - -EC-3PO has been tested with `minicom`, `screen`, `socat`, and `cu`. However, if -you're using `cu` you'll have to do the following to get it to work because -apparently, `cu` wants group write permissions. On Ubuntu at least, the PTY is -created with the `tty` group. If on your machine it's not, then just replace -`tty` with whatever group it's created with. - -1. Create a `tty` group if you don't have one already. -1. Add root to the `tty` group. -1. Rerun `cu` with `sudo` and it should work now. - -## Why does the console seem "laggier" than before? - -This is because there's a ~300ms delay after entering each console command. This -is due to the interrogation that the console interpreter performs to determine -if the EC image it's currently talking to is enhanced or not. Debug prints -coming from the EC should be the same speed. Since most people aren't currently -using the enhanced EC images, you can go ahead and run this command if the 300ms -delay is unbearable. - -To disable the delay: - -1. Open the EC console. -1. Press `%` -1. Enter `interrogate never` -1. Then press enter. - -\**For `socat` users, due to the line buffered nature, you'll have to just enter -`%interrogate never`. Notice the lack of the space character between `%` and the -command.* - -The interrogation delay should now be gone and you can have your 300ms/cmd back. - -## How do I try out this "enhanced" EC image you speak of? - -You simply add this to your board.h file. - -```c -#define CONFIG_EXPERIMENTAL_CONSOLE -``` - -## I can't open the EC console - -Make sure you try with `sudo`. If you're using `cu`, make sure root is a member -of the group of the created PTY. diff --git a/docs/ec_terms.md b/docs/ec_terms.md deleted file mode 100644 index 3b9f88416e..0000000000 --- a/docs/ec_terms.md +++ /dev/null @@ -1,248 +0,0 @@ -# EC Acronyms and Technologies - -## Glossary - -* **8042 Interface** {#8042} - - Interface for sending keyboard events to the [AP](#ap) and for receiving - commands from the AP. Only supported by x86 based APs. - -* **ACCEL - Accelerometer** {#accel} - - A sensor that measures acceleration, typically over 3-axis. Nominally - provides information about the orientation of a device. On Chromebook 2-in-1 - devices, there is an accelerometer in the base and one in the lid. Combining - the measurements from both accelerometers allows for a precise calculation - of the lid angle, used to switch between tablet and laptop mode. - -* **ACCELGYRO - Accelerometer/Gyroscope** {#accelgyro} - - A combination [accelerometer](#accel) and [gyroscope](#gyro) sensor that - provides more precise orientation information by measuring both linear and - rotational motion. - -* **ADC - Analog to Digital Converter** {#adc} - - A sensor that converts an analog voltage to a digital reading. - -* **ALS - Ambient Light Sensor** {#als} - - A sensor that measures the ambient light present. Used to automatically - control the screen and keyboard backlight level. - -* **AP - Application Processor** {#ap} - - The processor on the board that boots and runs ChromeOS. - -* **BAR - Barometer** {#bar} - - A sensor that measures atmospheric pressure. - -* **BC12 - Battery Charging** {#bc12} - - A device that implements the USB Battery Charging specification, version - 1.2. The complete [BC 1.2 Specification] is available from the USB - Implementers Forum. - -* **CBI - CROS Board Information** {#cbi} - - A collection of properties describing the board. This includes board - version, SKU, model name, and other fields. More details are found in the - [CrOS Board Info] documentation. - -* **CEC - Consumer Electronics Control** {#cec} - - A one-wire bidirectional bus. More details are on the [CEC Wikipedia page]. - -* **DPTF - Dynamic Power and Thermal Framework (Intel)** {#dptf} - - Intel's platform based power and thermal management. See the [DPTF Readme] - for details on the implementation used in ChromeOS. - -* **EC - Embedded Controller** {#ec} - - The [MCU](#mcu) used to control the keyboard, battery charging, USB port - switching, sensor management, and other functions, offloading these tasks - from the [AP](#ap). - -* **EC-3PO** {#ec-3po} - - A replacement of the current UART-based console which moves much of the code - off the EC into a host tool, reducing the amount of flash space required. - -* **E-Mark - Electronically Marked Cable** {#emark} - - See the [USB-C documentation](./usb-c.md#emark) for more details. - -* **eSPI - Enhanced Serial Peripheral Interface (Intel)** {#espi} - - Intel's synchronous communication interface between the [AP](#ap) and the - [EC](#ec). Supports quad I/O mode and clock speeds up to 66 Mhz, providing - bandwidth up to 264 Mbps. The full [eSPI Specification] is available from - Intel. - -* **FAFT - Fully Automated Firmware Tests** {#faft} - - A collection of tests and related infrastructure that exercise and verify - capabilities of Chrome OS. See the [FAFT design doc] and - [chromium.org documentation](https://www.chromium.org/for-testers/faft) for - more details. Replaced [SAFT](#saft). - -* **GMR - Giant Magnetoresistance Sensor** {#gmr} - - A sensor device that detects a magnetic field. These sensors differ from - [MAG](#mag) sensors, in that they only detect magnetic fields in close - proximity to the sensor. On Chromebooks, GMR sensors are used to detect when - the lid is opened. On convertible Chromebooks, the GMR sensor also detects - tablet mode when lid the is opened a full 360 degrees. - -* **GPIO - General Purpose Input/Output** {#gpio} - - An individual signal that can independently controlled and read. GPIOs are - used to enable/disable power rails, drive reset signals, and receive - interrupts from devices connected to the EC. GPIOs may also be connected to - [I/O expanders](#ioexpander). - -* **GYRO - Gyroscope** {#gyro} - - A sensor that measures angular momentum, providing information about - rotational motion of the device. - -* **I/O Expander** {#ioexpander} - - An [I2C](#i2c) peripheral device that provides additional GPIO signals - (anywhere from 8 - 32 signals). GPIOs behind an I/O expander are written and - read using I2C register accesses from the I2C controller in the EC. - -* **I2C - Inter-Integrated Circuit** {#i2c} - - A 2-wire synchronous communication bus, consisting of a clock signal and a - bidirectional data signal. An I2C bus typically contains one controller - device and one or more peripheral devices. The I2C standard defines - supported clock speeds of 100 KHz and 400 KHz. The full [I2C Specification] - is available from NXP (formerly Phillips). - -* **LED - Light Emitting Diode** {#led} - - A Light Emitting Diode is a semiconductor that emits light when current - flows through it. - -* **LPC - [Low Pin Count bus]** {#lpc} - - Legacy communication bus between the [AP](#ap) and [EC](#ec). Runs at 33 - MHz, providing a 133 Mbps bandwidth connection. Replaced by the - [eSPI](#espi) interface. - -* **MAG - Magnetometer** {#mag} - - A digital compass sensor, providing orientation for navigation. - -* **MCU - Microcontroller Unit** {#mcu} - - A small integrated chip containing a CPU core, on-chip ROM, on-chip RAM. - Also contains multiple peripheral interfaces, including GPIO, I2C buses, SPI - buses, ADC, PWM, etc. - -* **MKBP - Matrix Keyboard Protocol** {#mkbp} - - Message based protocol for communicating asynchronous events from the - [EC](#ec) to the [AP](#ap). Events are not limited to keyboard events with - the sensor subsystem as one of the main users. An EC board implementation - can be configured to send keyboard events through MKBP or using the - [8042 interface](#8042). This is the [EC MKBP driver] implementation. - -* **MST - Multi Stream Transport** {#mst} - - Part of the Display Port 1.2 standard, used to drive multiple independent - video streams from a single display port. The EC code is typically - responsible for enabling and disabling the MST hub chipset. - -* **OOBM - Out of Band Management** {#oobm} - - A command in the [EC-3PO protocol](#ec-3po) that allows commands to be - entered to alter the behaviour of the console and interpreter during - runtime. - -* **PD - USB Power Delivery** {#pd} - - See the [USB-C documentation](./usb-c.md#pd) for more details. - -* **PMIC - Power Management IC** {#pmic} - - An integrated circuit used to turn power rails on and off. - -* **PPC - USB Power Path Controller** {#ppc} - - See the [USB-C documentation](./usb-c.md#ppc) for more details. - -* **PWM - Pulse Width Modulation** {#pwm} - - Method of varying the duty cycle of a signal to control another device. A - typical application is to control fan speeds or the brightness of a - backlight. - -* **SAFT - Semi-Automated Firmware Tests** {#saft} - - A suite of tests for firmware, succeeded by [FAFT](#faft). See the - [chromium.org documentation](https://www.chromium.org/for-testers/saft) for - more details. - -* **SHI - SPI Host Interface** {#shi} - - [SPI](#spi) host interface used for communication between the AP and the EC. - In this configuration, the AP provides the SPI controller and the EC - provides the SPI peripheral. This interface is only used for non-x86 base - APs. - - x86-based APs use either the [eSPI](#espi) or [LPC](#lpc) interface. - -* **SPI - Serial Peripheral Interconnect** {#spi} - - A 4-wire synchronous communication bus consisting of the signals CLK - (clock), SDO (Serial Data Out), SDI (Serial Data In), and CS (chip-select, - one per SPI peripheral). The SDO and SDI pins are defined from the - perspective of the device: the SPI controller's SDO pin connects to the SPI - peripheral's SDI pin and vice-versa. Clock speeds over 100 MHz are - supported. SPI communication involves the following sequence: - - * SPI controller asserts CS. - * SPI controller transmits one or bytes on its SDO signal, received by the - SPI peripheral on its SDI signal. - * SPI peripheral transmits zero or more bytes on its SDO signal, received - by the SPI controller on its SDI signal. - * SPI controller de-asserts CS. - - The specific contents of a SPI frame varies based on the SPI peripheral - type. - -* **SVDM - Structured Vendor Defined Messages** {#svdm} - - See the [USB-C documentation](./usb-c.md#svdm) for more details. - -* **TCPC - USB Type-C Port Controller** {#tcpc} - - See the [USB-C documentation](./usb-c.md#tcpc) for more details. - -* **UART - Universal Asynchronous Receiver Transceiver** {#uart} - - Also known as a serial port. An asynchronous communication channel between - two devices with a dedicated receive pin, transmit pin, and ground. Optional - hardware flow control signals require additional connections between the - devices. Standard transmission rates are slow (up to 115200 bits per - second). Typical use is to provide a debug console to the EC. [RS-232] is - the protocol standard used by UARTs. - -* **VCONN - Connector Voltage** {#vconn} - - See the [USB-C documentation](./usb-c.md#vconn) for more details. - -[BC 1.2 Specification]: <https://www.usb.org/document-library/battery-charging-v12-spec-and-adopters-agreement> -[CrOS Board Info]: <https://chromium.googlesource.com/chromiumos/docs/+/HEAD/design_docs/cros_board_info.md> -[CEC Wikipedia page]: <https://en.wikipedia.org/wiki/Consumer_Electronics_Control> -[DPTF Readme]: <https://github.com/intel/dptf/blob/master/README.txt> -[eSPI Specification]: <https://www.intel.com/content/dam/support/us/en/documents/software/chipset-software/327432-004_espi_base_specification_rev1.0.pdf> -[FAFT design doc]: <https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/docs/faft-design-doc.md> -[I2C Specification]: <https://www.nxp.com/docs/en/user-guide/UM10204.pdf> -[RS-232]: <https://en.wikipedia.org/wiki/RS-232> -[EC MKBP driver]: <https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/common/keyboard_mkbp.c> -[Low Pin Count bus]: https://en.wikipedia.org/wiki/Low_Pin_Count diff --git a/docs/fingerprint/OWNERS b/docs/fingerprint/OWNERS deleted file mode 100644 index ba92c193e0..0000000000 --- a/docs/fingerprint/OWNERS +++ /dev/null @@ -1 +0,0 @@ -include ../../common/fpsensor/OWNERS diff --git a/docs/fingerprint/fingerprint-authentication-design-doc.md b/docs/fingerprint/fingerprint-authentication-design-doc.md deleted file mode 100644 index 7db552405a..0000000000 --- a/docs/fingerprint/fingerprint-authentication-design-doc.md +++ /dev/null @@ -1,772 +0,0 @@ -# Fingerprint Authentication on Chrome OS - -Authors: norvez@google.com, vpalatin@google.com - -Reviewers: kerrnel@google.com, mnissler@google.com - -Last Updated: 2019-01-14 - -[TOC] - -## Objective - -### Goals - -* Let users securely unlock their device with just their fingerprint -* Reuse the same architecture on all future platforms, don’t be tied to a - specific technology ([Arm TrustZone], [Intel SGX]). -* Support Android’s [fingerprint authentication framework] so users can for - example authorise payments in Android apps with their fingerprint. The - fingerprint implementation needs to comply with Android’s [CDD]. - -### Non-goals - -* Let users log in with their fingerprint - * Users will have to use other authentication methods (e.g. password or - PIN) to log into their account. - * Once logged in, users will be able to unlock the screen with their - fingerprint - -## Background - -To unlock their Chromebook users have to enter their password or a PIN. -[Windows] and [macOS] let the user authenticate with their fingerprint for -faster unlocking, we want to bring that capability to Chrome OS. - -### Fingerprint matching basics - -#### Fingerprint enrollment - -When a user wants to register their finger for fingerprint authentication, they -go through the _enrollment_ operation. They are asked to touch the sensor -multiple times with different parts of their fingerprint. The -[matching algorithm] uses the images captured during enrollment to build a model -of that fingerprint (known as a _template_). - -#### Fingerprint matching - -When the user puts their finger on the sensor, an image of the fingerprint is -captured and compared to the fingerprint templates of the enrolled fingerprints -to determine if the fingerprint matches one of the templates. - -#### Template update (TU) - -When the matching algorithm determines that a fingerprint matches a template -with a high level of certainty, it can (and normally will) use that fingerprint -image to update the template to improve the accuracy of future matching -operations. - -### Threat model - -There are two main objectives for potential attackers: - -* Large scale collection of biometric data from users by opportunistic - attackers - * This attack is only valuable remotely. In case an attacker has physical - access to the device they are already able to collect fingerprint data - left by the user on the device itself without having to attack the - software. -* Target a specific user, typically with physical access to the device in - order to either: - * Allow the attacker to enroll their own fingerprint to unlock the device - at will later on (the “abusive partner” model). - * Spoof positive fingerprint matches to let the rest of the system believe - that a user has successfully identified, for example to break [2FA] - \("spy" trying to gain access to an organisation’s resources via the - victim’s computer). - -### Privacy and security - -* Biometric data is particularly sensitive, so all operations on fingerprint - data must happen in a _Secure Biometric Processor_ (**SBP**). Attackers must - not gain access to the user’s fingerprints even if they have exploited the - software running on the AP. -* To protect the user’s privacy, fingerprint data must not be accessible - without the user’s consent, even by Google. Typically it will protected by - the user’s password. -* Fingerprint data must not leave the device. -* For added security, only the specific Chromebook used to enroll the - fingerprint can use it. Other Chromebooks, even of the same model, must not - be able to use the enrolled fingerprint. - -### Scalability - -For Eve, we [considered][Old Design Doc] using SGX as the SBP. However the -complexity of the solution makes that option unattractive, both because of the -amount of dev work required and because of the large resulting attack surface. -It’s also exclusive to Intel, we would have to develop a completely different -architecture for other platforms, which would add more dev work and increase the -attack surface again. - -## Overview {#overview} - -Devices have a dedicated microcontroller (MCU) running a firmware based on the -[Chromium OS EC] codebase that is used as the _Secure Biometric Processor_ -(**SBP**), where all enrollment and matching operations take place. Even if -attackers gained control of the AP, they still would not be able to access the -fingerprint (FP) data since it never leaves the SBP unencrypted. - -The SBP controls the sensor directly over a dedicated SPI bus. The SBP is -connected to the host with a different SPI bus, the host has no direct access to -the FP data coming from the sensor. - -Enrolled templates for a particular user are stored in the user’s [cryptohome] -but not synced/backed up to the cloud. They are thus encrypted with a key -(`User_Key`) derived from the user’s password, preventing 3rd parties (including -Google) from accessing the fingerprint templates if the user hasn’t entered -their password. - -On top of that, enrolled templates are also encrypted by a device-specific -`HW_Key`. `HW_Key` is derived from a secret that has been randomly generated by -the SBP, which prevents decrypting the templates on another device. - -### Architecture - -![Fingerprint Architecture] - -### Typical workflows - -#### FP enrollment - -1. User starts the enrollment flow from the Settings UI. -1. SBP starts the enrollment operation. -1. SBP captures a number of FP images (exact number depends on the sensor, - typically 3-4 to 10-12) and builds the template in the SBP’s volatile memory -1. SBP encrypts the template with `HW_Key` and sends the encrypted template to - the AP. -1. AP encrypts the template with `User_Key` and saves it to non-volatile - storage. -1. User goes back to step 1 to enroll another finger. A user can typically - enroll 3 to 5 fingers, depending on how many templates the SBP can hold in - its internal volatile storage at the same time. - -#### User login - -1. User logs in by typing their password. -1. FP templates of that user go through the first level of decryption, with - `User_Key`. -1. FP templates are uploaded to the SBP. -1. FP templates go through the second level of decryption in the SBP, with - `HW_Key`. -1. Deciphered FP templates are kept in the SBP’s volatile memory, ready to use - for matching operations. - -#### Screen unlocking operation - -1. User touches the sensor with their finger. -1. SBP verifies that the FP image matches one of the user’s templates. -1. SBP wakes up the AP and sends a “FP matched” message to the AP -1. The AP unlocks the screen. -1. Matcher updates the template in the SBP’s volatile memory. -1. SBP encrypts the updated template with `HW_Key` and sends the encrypted - template to the AP. -1. AP encrypts the template with `User_Key` and saves it to non-volatile - storage. - -## Detailed Design {#detailed-design} - -### FP template encryption {#template-encryption} - -FP templates are encrypted "twice". First, the templates are encrypted by the -SBP with a hardware-bound key that is unique to this SBP and that only the SBP -knows. On top of that, the AP also encrypts the FP templates with a key bound to -the user password. - -#### User-bound encryption - -The FP templates are stored in a "[cryptohome daemon store folder]" which is -encrypted by [cryptohome] with a key tied to the user password. We plan to -replace this post-launch with a mechanism similar to -[Authentication-Time User Secrets]. Separate design doc to come. - -#### Hardware-bound encryption - -FP templates are AES-encrypted with `HW_Key`. `HW_Key` is bound to this specific -SBP so encrypted templates can only be deciphered by this specific SBP. To -ensure that a powerwash/recovery/WP toggle/.../ makes the encryption key -impossible to recover, `HW_Key` also depends on a secret held by the TPM. - -We use an AEAD cipher (AES-GCM) to detect if the encrypted templates have been -tampered with by an attacker controlling the AP. - -##### SBP secret generation - -The SBP generates a new 128-bit random number `SBP_Src_Key` every time the user -goes through recovery or powerwashes the device. The [clobber-state] script -sends a command to the SBP to make it immediately regenerate a new `SBP_Src_Key` -immediately after requesting a TPM clear. - -`SBP_Src_Key` is stored by the SBP’s internal Flash and never shared with the -AP. - -##### TPM-held Secret - -To avoid potential bugs where `SBP_Src_Key` would not always be made -unrecoverable in some corner cases of recovery or powerwash, we make the -encryption key `HW_Key` depend on a secret that is held by the TPM and deleted -every time the TPM is cleared, for example if someone attempts to do a -"[ccd open]" to disable the hardware WP. - -The following is a summary of the mechanism, see the specific design doc -[TPM Seed for Fingerprint MCU] for details. - -The TPM already holds a "[system key]" `Cros_Sys_Key` in NVRAM space that is -used to derive the encryption key of the stateful partition. That "system key" -can only be read once per boot, typically by [mount_encrypted]. - -We modify mount_encrypted so that right after reading the seed, it derives a key -`TPM_Seed`: - -``` -TPM_Seed = HMAC-SHA256(Cros_Sys_Key, "biod") -``` - -`TPM_Seed` is then uploaded to the SBP where it will part of the -[Input Key Material (IKM)] and immediately cleared from the AP’s memory, while -the attack surface is very small (e.g. no network connections, stateful -partition not yet mounted) to prevent attackers from accessing it. - -##### `HW_Key` derivation {#hw-key-derivation} - -The `HW_Key` 128-bit AES key for every FP template on the device is derived from -the SBP’s secret and the TPM’s secret to ensure uniqueness. Therefore, even two -identical devices would have different encryption keys. The user ID is also used -as an input for key derivation, so 2 users on the same device won’t share -encryption keys either. Summing up, the key used to encrypt a template depends -on: - -* Device-bound `TPM_Seed`, randomly generated on recovery/powerwash -* SBP-specific `SBP_Src_Key`, randomly generated on recovery/powerwash -* User ID on the device -* Encryption salt, randomly generated before every encryption - -###### Salt for key derivation - -Every time we update a template, we generate a new random 128-bit salt. - -The salt is not required to be secret, so we store `User_Salt` in cleartext next -to the user’s encrypted FP templates on the disk. - -On user login, biod sends the salt and the encrypted FP templates to the SBP. -biod also sends the User ID to the SBP. The SBP derives the AES key using [HKDF] -with HMAC-SHA256: - -``` -HW_Key = HKDF(HMAC-SHA256, SBP_Src_Key, TPM_Seed, User_Salt, User_ID) -``` - -At that point, the SBP [authenticates and deciphers](#aead) the FP templates. -The SBP then generates a new 128-bit salt `User_Salt_New` randomly and derives a -new AES key: - -``` -HW_Key_New = HKDF(HMAC-SHA256, SBP_Src_Key, TPM_Seed, User_Salt_New, User_ID) -``` - -Updated FP templates are then encrypted with `HW_Key_New` before being stored on -the host, along with the new salt `User_Salt_New`. - -*Note*: The SBP has a unique serial number hwID that could also be used as an -additional input to the KDF (though it never changes). The entropy is pretty low -and though not easily accessible an attacker who had stolen the device could -gain access to it. After consulting with the security team, using the hwID was -deemed unnecessary since it wasn’t adding real entropy. - -##### AEAD (AES-GCM) Encryption {#aead} - -To encrypt the FP templates with `HW_Key` we use BoringSSL’s implementation of -AES-GCM128. - -###### Initialisation Vector - -The encryption operations are done by the R/W firmware that doesn’t have write -access to the Flash, so it can’t keep track of IVs that could have already been -used during previous boots since it has no way to persist state. Instead, the -SBP will generate a random 96-bit IV every time it needs to encrypt a template -with `HW_Key` before sending it back to the host for storage. This only happens -every time a user successfully matches their finger, which assuming 1 match -every second for 10 years would result in 3600\*24\*365\*10 < 350,000,000, so -the risk of reusing an IV is acceptable. To ensure that a compromised host could -not try to generate too many messages to find collisions, the SBP rate-limits -the number of encryption operations to 1 per second. - -The IV will be stored on the host with the salt, the encrypted templates and the -16-byte tag for authentication. - -###### Authentication Tag - -To authenticate the encrypted templates, we use a 128-bit tag that we store in -clear text with the encrypted template. - -Authentication of the encrypted templates prevents attackers from generating -random templates to try to attack directly the matching libraries rather than -the AES-GCM128 implementation. It also prevents attackers from trying to pass -their own template instead of the user’s FP template. - -###### Encryption Flowchart - -Encryption of the FP template in the SBP before the ciphered data is sent to the -AP for storage. - -![Encryption Flowchart] - -###### Decryption Flowchart - -Decryption of the ciphered FP template coming from the AP when the user logs in. - -![Decryption Flowchart] - -#### FP template disk format - -Encrypted templates are stored in a “[cryptohome daemon store folder]” that is -only mounted/decrypted when the user has logged in. The templates are stored as -JSON files with the following fields: - -```JSON -{ - "biomanager": “CrosFpBiometricsManager” string - "version": integer describing the version of the file format. Set to 1 at launch - "data": Base64-encoded string containing the `HW_Key`-encrypted template - "label": user-configurable human-readable string listed in the UI - "record_id": UUID of that template generated at enrollment time -} -``` - -##### `HW_Key`-encrypted template format - -The content of the "data" field is the encrypted template that can be deciphered -by the SBP. - -Field Name | Field description | Field size (bytes) | Field offset (bytes) ----------- | --------------------------------------------------------------------- | ------------------ | -------------------- -Version | Number describing the version of the file format. Set to 3 at launch. | 2 | 0 -Reserved | Reserved bytes, set to 0 | 2 | 2 -Nonce | Randomly-generated IV | 12 | 4 -Salt | Randomly-generated salt | 16 | 16 -Tag | AES-GCM Authentication Tag | 16 | 32 -Template | Encrypted template | 47552 | 48 - -When the user logs in, the cryptohome daemon store folder of that user is -mounted and the JSON files become available to biod. For every enrolled finger, -biod sends the `HW_Key`-encrypted template to the SBP. The SBP -[derives `HW_Key`](#hw-key-derivation) for that template and deciphers the -template. - -### Protection of the SBP - -To access the unencrypted data and/or `HW_Key`, attackers have 3 main options: - -* Temporarily gain read or even execution access in the SBP through a firmware - bug - * Would allow an attacker to gain access to the clear text FP data and/or - the encryption key - * Mitigation strategy in [Prevent RW exploits](#prevent-rw-exploits) -* Turn a temporary compromise of the SBP’s firmware into a permanent exploit - by replacing the SBP’s firmware with a firmware controlled by the attacker - * Would allow an attacker to gain access to the clear text FP data and/or - the encryption key - * Would allow an attacker to spoof positive FP matches, defeating 2FA - * Mitigation in [Verified firmware](#verified-firmware) -* Use physical access and control of WP to load a compromised firmware to the - SBP - * Mitigation in [Control WP/BOOT0](#control-wp-boot0) - -#### Verified firmware {#verified-firmware} - -To verify the integrity of the firmware we use a mechanism similar to the one -used to protect the EC in detachable keyboards as described in -[Detachable Base Verified Boot]. - -The SBP has a minimalistic RO firmware that contains the public part of an -RSA-3072 exponent 3 key pair. The corresponding private key is only accessible -by the Chrome OS signers and is used to sign SBP firmwares. On boot the RO -firmware verifies the signature of the RW firmware. If the RW signature is -valid, the RO firmware protects itself by setting the WP bit of the Flash then -jumps to RW. - -##### Anti-rollback - -On top of verifying the signature of the RW firmware, the RO firmware must -verify that the RW firmware is not an outdated version with known -vulnerabilities. This is required to prevent attackers from loading valid but -vulnerable RW firmwares. This is achieved with an anti-rollback mechanism as -described in -[Detachable Base Verified Boot][Detachable Base Verified Boot Anti-Rollback]. - -###### Nocturne-specific anti-rollback - -On nocturne, the SBP is an STM32H7 MCU, with 128K Flash blocks. We still need 2 -pingpong RB blocks to prevent data loss, so the Flash map looks like this: - -Name | Size -------------------- | ------- -RO firmware | 128 KB -Blank | 640 KB -RB1 + `SBP_Src_Key` | 128 KB -RB2 + `SBP_Src_Key` | 128 KB -RW firmware | 1024 KB - -The Nocturne SBP uses the same Flash block for the anti-rollback mechanism and -`SBP_Src_Key`. Most of the anti-rollback mechanism is identical to the one -described in -[Detachable Base Verified Boot][Detachable Base Verified Boot Anti-Rollback], -and the key is similar to the entropy/secret stored for -[Detachable Base Swap Detection]. - -The rollback minimum version is updated whenever RO has verified RW signature, -and the RW rollback version is larger than what is stored in the RB block. - -When re-keying is desired, `SBP_Src_Key` is updated by doing the following -operation: - -``` -SHA256(SBP_Src_Key || entropy) -``` - -where `entropy` is generated from STM32H7 True Random Number Generator (see -[RM0433] Chapter 33 for details). Since there are 2 rollback blocks, and we -ping-pong between them, re-keying should involve updating `SBP_Src_Key` twice, -so that both blocks are erased, and no remnant of the previous key is left over. - -#### Prevent RW exploits {#prevent-rw-exploits} - -Even non-persistent exploits in the RW firmware would be problematic if the -attacker was able to read the content of the memory or the Flash, e.g. via a -buffer overflow, since they could gain access to the clear text FP data and/or -the encryption key. If the attacker was also able to execute code in RW, they -would be able to spoof positive FP matches. - -##### Attack through host command interface {#attack-host-command} - -The AP can send a number of commands to the SBP, for example to wait for a match -or to update the RW firmware. In case of a vulnerability in the protocol an -attacker with (potentially remote) access to the AP<->SBP SPI bus could send bad -specially crafted commands to the SBP and potentially gain read, write or even -execute permissions in the SBP. - -###### Mitigation strategies - -* Limit the size of the API exposed by the SBP to the AP -* Fuzz the host command interface - -##### Attack through crafted templates uploaded to the SBP {#template-attack} - -The AP partially deciphers (with `User_Key`) the templates stored on the disk -then sends the `HW_Key`-encrypted templates to the SBP where they will be -deciphered and then passed to the matching algorithm. An attacker could submit a -carefully crafted template to the SBP that would exploit holes in the closed -source matching algorithm library. - -###### Mitigation strategies - -We use AEAD to decipher and authenticate the templates received from the AP, -they are not passed directly to the matching library. Bad templates will be -intercepted by the decryption code. - -##### RAM noexec - -Even if an attacker gained some level of access to the SBP, the RAM is not -executable so it would be hard for the attacker to execute compromised code, for -example to spoof successful authentication and break 2FA or to attempt to turn -into a persistent compromission of the SBP by writing a new compromised firmware -to Flash. - -#### Control WP/BOOT0 {#control-wp-boot0} - -The BOOT0 pin of the MCU is gated by the WP controlled by Haven. Since toggling -the WP bit from Haven requires physical access to the device, remote attackers -can’t toggle the BOOT0 pin to make the MCU start in bootloader mode and -read/write the Flash from the AP. - -However, with physical access (> 5 minutes) an attacker could disable the WP -signal from Haven and toggle the BOOT0 pin to start the MCU in bootloader mode. - -##### Flash protected with RDP Level 1 - -We will set the Flash in [Global Read-out Protection (RDP) mode Level 1]. This -means that attackers with physical access who would manage to start the MCU in -bootloader mode would not be able to read `SBP_Src_Key` from the Flash. -Attackers would still be able to read the content of the RAM and registers but -at that point the MCU would just have rebooted and the RAM would be empty. - -If the attacker attempted to write their own code to the Flash (for example to -replace RO), RDP Level 1 would only allow that after a complete erasure of the -Flash that would wipe `SBP_Src_Key`, preventing the user from decrypting FP -templates. - -*Note*: An attacker with that level of access could in theory replace the RO -firmware with their own firmware. This would however have wiped enrolled -fingers, giving the user an indication that their device might have been -tampered with. This wouldn’t give access to existing FP templates or images to -the attacker, only future enrollments. - -##### RMA - -To ensure that a device is clean after e.g. refurbishing, the RMA procedure -would require that the operator disabled the WP bit from Haven and toggled BOOT0 -to switch to bootloader mode. After that a known good RO and RW firmware can be -written to the Flash and the operator will reenable the WP bit from Haven. - -## Security Considerations - -### Security boundaries - -#### Chrome to system services - -Biod and Chrome communicate over D-Bus (defined [here][biod D-Bus API]). - -* Chrome lets biod know when the user has signed in, so biod can load the - templates to the [SBP](#overview). -* Biod lets Chrome know when the SBP has detected a positive or negative match - so Chrome can unlock the screen. -* Chrome tells biod to start/end enrolling a finger. -* Chrome tells biod to start/end authentication (matching) mode. - -#### Kernel to firmware - -The SBP uses the `cros_ec` interface, same as the EC. There are additional -SBP-specific host commands that the AP can send to the SBP, see -[Attack through host command interface](#attack-host-command). - -### Privileges - -#### Sandboxing - -Biod uses Minijail ([upstart script][biod upstart script]) for [sandboxing], and -has a [seccomp filter]. - -### Untrusted input - -Encrypted templates are read from the stateful partition where they could be -corrupted or tampered with. Biod itself doesn’t parse that input -it’s still -encrypted by the SBP- and merely marshalls the data around to and from the SBP. -To ensure the integrity of the input, we use [AEAD] with an -[implementation][AEAD implementation] based on BoringSSL. - -The encrypted templates are wrapped inside JSON files that could be corrupted or -tampered with. Biod does parse and interpret some fields of those JSON files. -That input is [fuzzed]. - -### Sensitive data - -The SBP handles biometric data, see the [Detailed Design](#detailed-design) -section that describes how we keep that data protected from attackers. - -### Attack surface - -#### Libraries - -* Biod uses libbrillo and libchrome -* The SBP firmware is based on the cros_ec code already used in the EC. Two - significant additions: - * Parts of BoringSSL (AES and AES-GCM) ported to cros_ec - * 3rd-party proprietary blob used for matching, see - [Closed source blobs in the SBP](#closed-source-blobs). - -#### Remote attacks - -Neither biod nor the SBP are exposed directly to remote attackers. Since biod -communicates with Chrome over D-Bus, and attacker who had compromised Chrome -could start sending D-Bus commands to biod. - -#### Closed source blobs in the SBP {#closed-source-blobs} - -The enrollment/matching and image capture libraries are provided by a 3rd-party -vendor in binary form. That proprietary blob went through a security audit by a -3rd party auditor (see the auditor’s [report][Security Audit Report]. - -On top of the security audit of the 3rd-party proprietary code, we limit the -attack surface of those libraries by not directly exposing them to user input. -Data (e.g. FP templates) that is fed to those libraries isn’t directly coming -from untrusted user input, it is sanitized by the opensource glue logic and -wrappers. For example, we use AEAD to ensure that the encrypted data that is -deciphered before being passed to the 3rd-party libraries has been generated by -the SBP itself. For more details, see section -[Attack through crafted templates uploaded to the SBP](#template-attack). - -### Implementation robustness - -#### biod (userspace daemon) - -##### Multi-threading/multi-process - -biod uses `base::MessageLoopForIO`, no custom multi-thread or multi-process -implementation. - -##### State machine implementation - -biod has 3 main states: - -* Idle -* Waiting for a match: controlled by the [AuthSession] object -* Enrolling a new fingerprint: controlled by the [EnrollSession] object. - -#### cros_fp (SBP firmware) - -##### Multi-threading/multi-process - -We use the [primitives][EC primitives] of the Chromium OS EC: tasks, hooks, and -deferred functions. - -##### Memory allocation - -Most buffers (e.g. for FP images and templates) are [statically allocated]. The -vendor libraries do require some dynamic memory allocation, we provide -[wrappers functions] that use the [malloc/free memory module for Chrome EC]. - -##### State machine implementation - -There is one main [state machine] that configures the matching/enrollment code -to be ready for a match or to enroll a finger. - -### Cryptography - -See detailed discussion in the ["FP template encryption"](#template-encryption) -section. - -### Metrics {#metrics} - -Metrics related to security that we’re collecting through UMA: - -* `Ash.Login.Lock.AuthMethod.Used.ClamShellMode` to know if FP is used to - authenticate -* `Ash.Login.Lock.AuthMethod.Used.TabletMode` to know if FP is used to - authenticate -* `Fingerprint.Unlock.AuthSuccessful` tracks whether FP authentication was - successful or not -* `Fingerprint.Unlock.AttemptsCountBeforeSuccess` tracks how many attempts it - takes for users to unlock with their fingerprint -* `Fingerprint.UnlockEnabled` tracks whether FP unlocking is enabled or not -* `Fingerprint.Unlock.EnrolledFingerCount` reports the number of fingers that - users have enrolled - -Complete list of metrics collected via UMA: -[New UKM collection review - CrOS FP Unlock] - -### Potential attacks - -#### Enroll a rogue fingerprint - -An attacker with physical access to the device could enroll their own -fingerprint under the victim’s account and use it to unlock the device at-will -in the future. - -* Enrollment UI requires the user password before telling biod to start an - enrollment session, so the attacker would need some form of exploit to - bypass Chrome and trigger the enrollment. We plan to replace this - post-launch with a mechanism similar to [Authentication-Time User Secrets]. - Separate design doc to come. -* Even if it’s not a persistent exploit, a rogue enrolled fingerprint would - persist. -* The victim’s fingerprint data would still be secure. -* The enrollment UI shows how many fingers are enrolled. - -## Privacy Considerations - -### Fingerprint data is kept locally on the device - -The raw fingerprint images themselves never leave the SBP. The fingerprint -templates are kept on the local storage (encrypted both with the `HW_Key` and -the `User_Key`) of the device and not synced to the cloud, encrypted or not. - -### Fingerprint data decryption requires the user password - -The fingerprint templates are stored in a "[cryptohome daemon store folder]" -which is only mounted when the user logs in. To do so, they must have entered -their password. - -### FP matching is not used for login, only unlocking - -Before using their fingerprint to unlock the device the user must have logged -in, typically with the Google Account password. - -### Lock screen will display a FP icon if enabled - -If a user has enabled FP unlocking, a FP icon will be associated to that user on -the lock screen. This potentially lets others know that a user has enabled FP -unlocking. This seems reasonable when the small resulting decrease in privacy is -weighed against the fact that adding an icon greatly improves UX. - -### Metrics collection - -We collect anonymous metrics through [UMA], see section [Metrics](#metrics) for -details. - -### Logs - -Biod, the SBP, and Chrome have logs related to the fingerprint process. -[Privacy fields for Fingerprints] lists the log entries and their privacy -implications. Full [PDD is here]. - -#### Biod - -The log files are in `/var/log/biod/`. - -#### SBP - -The log file is `/var/log/cros_fp.log`. - -<!-- Links --> - -[2FA]: https://en.wikipedia.org/wiki/Multi-factor_authentication -[AEAD implementation]: https://chromium.googlesource.com/chromiumos/platform/ec/+/aed008f87c3c880edecf7608ab24eaa4bee1bc46/common/fpsensor.c#574 -[AEAD]: https://en.wikipedia.org/wiki/Authenticated_encryption -[Arm TrustZone]: https://www.arm.com/products/security-on-arm/trustzone -[Authentication-Time User Secrets]: http://go/authentication-time-user-secrets -[AuthSession]: https://chromium.googlesource.com/chromiumos/platform2/+/eae39a9ad1239f8fbfa8164255578b306ff6ba5c/biod/biometrics_manager.h#96 -[biod D-Bus API]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/system_api/dbus/biod/ -[biod upstart script]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/biod/init/biod.conf -[ccd open]: https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md#Open-CCD -[CDD]: https://source.android.com/compatibility/android-cdd#7_3_10_fingerprint_sensor -[Chromium OS EC]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md -[clobber-state]: https://chromium.googlesource.com/chromiumos/platform2/+/962ab1bc481db0cf504b5449eb3a3d5008ea7601/init/clobber_state.cc#475 -[cryptohome daemon store folder]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/sandboxing.md#securely-mounting-cryptohome-daemon-store-folders -[cryptohome]: https://www.chromium.org/chromium-os/chromiumos-design-docs/protecting-cached-user-data -[Detachable Base Swap Detection]: https://docs.google.com/document/d/1WYdkkSAL_RHVc5mUXnAvBBfAeM7Wj3ABa1dbeTdvm74/edit#heading=h.g74ijelumqop -[Detachable Base Verified Boot Anti-Rollback]: http://go/detachable-base-vboot#heading=h.fimcm174ok3 -[Detachable Base Verified Boot]: http://go/detachable-base-vboot#heading=h.dolfbdpggye6 -[EC primitives]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md#Software-Features -[EnrollSession]: https://chromium.googlesource.com/chromiumos/platform2/+/eae39a9ad1239f8fbfa8164255578b306ff6ba5c/biod/biometrics_manager.h#92 -[fingerprint authentication framework]: https://developer.android.com/about/versions/marshmallow/android-6.0.html#fingerprint-authentication -[fuzzed]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/biod/biod_storage_fuzzer.cc -[Global Read-out Protection (RDP) mode Level 1]: https://www.st.com/content/ccc/resource/technical/document/application_note/b4/14/62/81/18/57/48/05/DM00075930.pdf/files/DM00075930.pdf/jcr:content/translations/en.DM00075930.pdf -[HKDF]: https://tools.ietf.org/html/rfc5869 -[Input Key Material (IKM)]: https://en.wikipedia.org/wiki/HKDF -[Intel SGX]: https://software.intel.com/en-us/sgx -[macOS]: https://support.apple.com/en-us/HT207054 -[malloc/free memory module for Chrome EC]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/common/shmalloc.c -[matching algorithm]: https://en.wikipedia.org/wiki/Fingerprint#Algorithms -[mount_encrypted]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/cryptohome/mount_encrypted -[New UKM collection review - CrOS FP Unlock]: https://docs.google.com/document/d/1qjDCMcBcrhSeg_uwyEIRsXHKmzUTJahcg6a4YVhkuLo -[Old Design Doc]: https://docs.google.com/document/d/1MdPRmCDkVg1HO9DdbvPT5fDZS2ICg5ys9_ok_K95EEU -[PDD is here]: http://go/cros-fingerprint-pdd -[Privacy fields for Fingerprints]: https://docs.google.com/spreadsheets/d/1jLfnuhfbrImpoxuj92OkAxS_GGrm7QkpQhsUQCkO9ec -[Privacy fields for Fingerprints]: https://docs.google.com/spreadsheets/d/1jLfnuhfbrImpoxuj92OkAxS_GGrm7QkpQhsUQCkO9ec/ -[RM0433]: https://www.st.com/content/ccc/resource/technical/document/reference_manual/group0/c9/a3/76/fa/55/46/45/fa/DM00314099/files/DM00314099.pdf/jcr:content/translations/en.DM00314099.pdf -[sandboxing]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/sandboxing.md -[seccomp filter]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/biod/init/seccomp/biod-seccomp-amd64.policy -[Security Audit Report]: https://drive.google.com/a/google.com/file/d/0B1HHKpeDpzYnMDdocGxwWUhpckpWM0hMU0tPa2ZjdEFnLU53/ -[state machine]: https://chromium.googlesource.com/chromiumos/platform/ec/+/90d177e3f0ae729bea7e24934a3c6ef9f2520d45/common/fpsensor.c#252 -[statically allocated]: https://chromium.googlesource.com/chromiumos/platform/ec/+/90d177e3f0ae729bea7e24934a3c6ef9f2520d45/common/fpsensor.c#57 -[system key]: https://chromium.googlesource.com/chromiumos/platform2/+/23b79133514ac2cd986bce21c398fb6658bda248/cryptohome/mount_encrypted/encryption_key.h#125 -[UMA]: http://go/uma -[Windows]: https://www.microsoft.com/en-us/windows/windows-hello -[wrappers functions]: https://chrome-internal.googlesource.com/chromeos/platform/ec-private/+/9ebb3f10c611afff695f679aaeed1a35551a116b/fpc_sensor_pal.c#52 -[TPM Seed for Fingerprint MCU]: ../fingerprint/fingerprint-tpm-seed.md - -<!-- 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/1-JUWTF7sUTND29BfhDvIudzX_S6g-iwoxG1InPedmVw --> - -[Decryption Flowchart]: ../images/cros_fingerprint_decryption_flowchart.png - -<!-- https://drive.google.com/open?id=1uUprgLsTUZZ2G2QWRYcRn6zBAh6ejvJagVRD7eZQv-k --> - -[Encryption Flowchart]: ../images/cros_fingerprint_encryption_flowchart.png - -<!-- https://docs.google.com/drawings/d/1DFEdxfDXEtYY3LNOOJFAxVw2A7rKouH98tnb1yiXLAA --> - -[Fingerprint Architecture]: ../images/cros_fingerprint_architecture_diagram.png diff --git a/docs/fingerprint/fingerprint-debugging.md b/docs/fingerprint/fingerprint-debugging.md deleted file mode 100644 index c77874e7bb..0000000000 --- a/docs/fingerprint/fingerprint-debugging.md +++ /dev/null @@ -1,254 +0,0 @@ -# Fingerprint Debugging - -This document describes how to attach a debugger with SWD in order to debug the -FPMCU with [`gdb`](#gdb) or to [flash the FPMCU](#flash). - -[TOC] - -## Overview - -### SWD - -`SWD` (Single Wire Debug) was introduced by ARM with the Cortex-M family to -reduce the pin count required by JTAG. JTAG requires 5 pins, but SWD can be done -with only 3 pins. Furthermore, one of the freed up pins can be repurposed for -tracing. - -See [CoreSight Connectors] for details on the three standard types of connectors -used for JTAG and SWD for ARM devices. - -## Hardware Required - -* JTAG/SWD Debugger Probe: Any debug probe that supports SWD will work, but - this document assumes that you're using a - [Segger J-Trace PRO for Cortex-M][J-Trace]. -* [Dragonclaw v0.2 Development board][FPMCU dev board] or - [Icetower v0.1 Development board][FPMCU dev board]. -* [Servo Micro]. - -## Software Required - -* [JLink Software] \(when using [J-Trace] or other Segger debug probes). This - is the only software required for flashing. -* In order to perform breakpoint debugging, you will need a tool that supports - connecting `gdbserver`. This document will assume [CLion] \(Googlers see - [CLion for Chrome OS]) and was tested with `JLink_Linux_V684a_x86_64`. - Alternatively, you can use [Ozone], a standalone debugger from Segger. - -## JLink Software {#software} - -Download the [JLink Software], choosing the `J-Link Software and Documentation -pack for Linux, TGZ archive, 64-bit` version. This version is recommended -because it's simple to extract the tarball into a directory that is accessible -to the Chrome OS chroot. The instructions in this document assume that you have -extracted the tarball in -`~/chromiumos/src/platform/ec/JLink_Linux_V684a_x86_64`. - -## Connecting SWD {#connect-swd} - -### Dragonclaw v0.2 - -The connector for SWD is `J4` on Dragonclaw v0.2. - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: Pay attention to the location of pin 1 (red wire) in the -photos below so that you connect with the correct orientation. - -`SW2` on the bottom of Dragonclaw must be set to `CORESIGHT`. - -If you want to connect a 20-Pin ARM Standard JTAG Connector (0.10" / 2.54 mm), -you can use the following [adapter][JTAG to SWD Adapter] and [cable][SWD Cable]. -*** -<!-- mdformat on --> - -Dragonclaw v0.2 with 20-pin SWD (0.05" / 1.27mm) on J4. Only half the pins are connected. | ------------------------------------------------------------------------------------------ | -![Dragonclaw with 20-pin SWD] | - -Dragonclaw v0.2 with 10-pin SWD (0.05" / 1.27mm) on J4. | -------------------------------------------------------- | -![Dragonclaw with 10-pin SWD] | - -### Icetower v0.1 - -The connector for SWD is `J4` on Icetower v0.1. - -`SW2` on Icetower must be set to `CORESIGHT` (not `SERVO`). - -Icetower v0.1 with 20-pin SWD (0.05" / 1.27mm) on J4. | ------------------------------------------------------ | -![Icetower with 20-pin SWD] | - -## Powering the Board {#power} - -[Servo Micro] can provide both the 3.3V for the MCU and 1.8V for the sensor. - -Run the following to start `servod`, which will enable power to these rails by -default: - -```bash -(chroot) $ sudo servod --board=<BOARD> -``` - -where `<BOARD>` is the board you are working with -([`dartmonkey` or `bloonchipper`][fingerprint hardware]). - -Theoretically, it's also possible to power through J-Trace, though the -[power pin] on J-Trace only outputs 5V, whereas the MCU runs at 3.3V and the -sensor runs at 1.8V. The pin is also not connected on the current designs. - -## Flashing the FPMCU with JLink {#flash} - -* Install the [JLink Software](#software). -* [Connect SWD](#connect-swd). -* [Power the board with servo](#power). -* Start the JLink server: - -```bash -(chroot) $ cd ~/trunk/src/platform/ec -``` - -```bash -# JLinkRemoteServerCLExe will listen on port 19020 (among others) by default. -# This can be overridden with the -Port argument. -(outside) $ ./JLink_Linux_V684a_x86_64/JLinkRemoteServerCLExe -select USB -``` - -You should see the following: - -```bash -SEGGER J-Link Remote Server V6.84a -Compiled Sep 7 2020 18:28:13 - -'q' to quit '?' for help - -Connected to J-Link with S/N 123456 - -Waiting for client connections... -``` - -* Build the FPMCU image: - -```bash -(chroot) $ cd ~/trunk/src/platform/ec -``` - -```bash -(chroot) $ make BOARD=<BOARD> -j -``` - -replacing `<BOARD>` with [`bloonchipper` or `dartmonkey`][fingerprint hardware]. - -* Run the [`flash_jlink.py`] script: - -```bash -(chroot) $ ~/trunk/src/platform/ec/util/flash_jlink.py --board <BOARD> --image ./build/<BOARD>/ec.bin -``` - -replacing `<BOARD>` with [`bloonchipper` or `dartmonkey`][fingerprint hardware]. - -## Using JLink gdbserver {#gdb} - -Start the JLink gdbserver for the appropriate MCU type: - -* Dragonclaw / [Nucleo STM32F412ZG]: `STM32F412CG` -* Icetower / [Nucleo STM32H743ZI]: `STM32H743ZI` - -```bash -(outside) $ ./JLink_Linux_V684a_x86_64/JLinkGDBServerCLExe -select USB -device STM32F412CG -endian little -if SWD -speed auto -noir -noLocalhostOnly -``` - -You should see the port that `gdbserver` is running on in the output: - -```bash -Connecting to J-Link... -J-Link is connected. -Firmware: J-Trace PRO V2 Cortex-M compiled Dec 13 2019 11:19:22 -Hardware: V2.00 -S/N: XXXXX -Feature(s): RDI, FlashBP, FlashDL, JFlash, GDB -Checking target voltage... -Target voltage: 3.30 V -Listening on TCP/IP port 2331 <--- gdbserver port -Connecting to target... -Connected to target -Waiting for GDB connection... -``` - -Configure your editor to use this [`.gdbinit`], taking care to set the correct -environment variables for the `BOARD` and `GDBSERVER` being used. For CLion, if -you want to use a `.gdbinit` outside of your `HOME` directory, you'll need to -[configure `~/.gdbinit`]. - -In your editor, specify the IP address and port for `gdbserver`: - -``` -127.0.0.1:2331 -``` - -You will also want to provide the symbol files: - -* RW image: `build/<board>/RW/ec.RW.elf` -* RO image: `build/<board>/RO.ec.RO.elf` - -Also, since we're compiling the firmware in the chroot, but your editor is -running outside of the chroot, you'll want to remap the source code path to -account for this: - -* "Remote source" is the path inside the chroot: - `/home/<username>/trunk/src/platform/ec` -* "Local source" is the path outside the chroot: - `${HOME}/chromiumos/src/platform/ec` - -To debug with CLion, you will create a new [GDB Remote Debug Configuration] -called `EC Debug`, with: - -* `'target remote' args` (gdbserver IP and port from above): `127.0.0.1:2331` -* `Symbol file` (RW or RO ELF): `/path/to/build/<board>/RW/ec.RW.elf` -* `Path mapping`: Add remote to local source path mapping as described above. - -After configuring this if you select the `EC Debug` target in CLion and -[click the debug icon][CLion Start Remote Debug], CLion and JLink will handle -automatically flashing the ELF file and stepping through breakpoints in the -code. Even if not debugging, this may help with your iterative development flow -since the JLink tool can flash very quickly since it performs a differential -flash. Note that you still need to recompile after making changes to the source -code before launching the debugger. - -## Using Ozone - -Ozone is a free standalone debugger provided by Segger that works with the -[J-Trace]. You may want to use it if you need more powerful debug features than -gdbserver can provide. For example, Ozone has a register mapping for the MCUs we -use, so you can easily inspect CPU registers. It can also be automated with a -scripting language and show code coverage when used with a [J-Trace] that is -connected to the trace pins on a board. Note that the Dragonclaw v0.2 uses an -STM32F412 package that does not have the synchronous trace pins, but the -[Nucleo STM32F412ZG] does have the trace pins. - -[CoreSight Connectors]: http://www2.keil.com/coresight/coresight-connectors -[FPMCU dev board]: ./fingerprint-dev-for-partners.md#fpmcu-dev-board -[J-Trace]: https://www.segger.com/products/debug-probes/j-trace/models/j-trace/ -[JLink Software]: https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack -[Servo Micro]: ./fingerprint-dev-for-partners.md#Servo-Micro -[JTAG to SWD Adapter]: https://www.adafruit.com/product/2094 -[SWD Cable]: https://www.adafruit.com/product/1675 -[Ozone]: https://www.segger.com/products/development-tools/ozone-j-link-debugger/ -[CLion]: https://www.jetbrains.com/clion/ -[CLion for Chrome OS]: http://go/clion-for-chromeos -[GDB Remote Debug Configuration]: https://www.jetbrains.com/help/clion/remote-debug.html#remote-config -[CLion Start Remote Debug]: https://www.jetbrains.com/help/clion/remote-debug.html#start-remote-debug -[Nucleo STM32F412ZG]: https://www.st.com/en/evaluation-tools/nucleo-f412zg.html -[Nucleo STM32H743ZI]: https://www.st.com/en/evaluation-tools/nucleo-h743zi.html -[`.gdbinit`]: /util/gdbinit -[configure `~/.gdbinit`]: https://www.jetbrains.com/help/clion/configuring-debugger-options.html#gdbinit-lldbinit -[power pin]: https://www.segger.com/products/debug-probes/j-link/technology/interface-description/ -[fingerprint hardware]: ./fingerprint.md#hardware -[`flash_jlink.py`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/util/flash_jlink.py - -<!-- Images --> - -[Dragonclaw with 20-pin SWD]: ../images/dragonclaw_with_20_pin_swd.jpg -[Dragonclaw with 10-pin SWD]: ../images/dragonclaw_with_10_pin_swd.jpg -[Icetower with 20-pin SWD]: ../images/icetower_with_20_pin_swd.jpg diff --git a/docs/fingerprint/fingerprint-dev-for-partners.md b/docs/fingerprint/fingerprint-dev-for-partners.md deleted file mode 100644 index 2d9332db5b..0000000000 --- a/docs/fingerprint/fingerprint-dev-for-partners.md +++ /dev/null @@ -1,657 +0,0 @@ -# FPMCU Development for Partners - -This document is intended to help partners (sensor vendors, MCU vendors, etc) -that are currently (or interested in) developing fingerprint solutions for -Chromebooks. The document assumes that you're using Linux to do the development; -preferably a recent version of Ubuntu or Debian. Some partners have had success -developing in a VM, but please note that we don't test that configuration. - -See the [FPMCU documentation] for additional development information. - -[TOC] - -## Hardware Required for Standalone Development (no Chromebook) - -The following hardware components can be used to set up a standalone development -environment for FPMCU development (i.e., it does not rely on a Chromebook). -Development for other [EC]s is often done in a similar manner, but some of them -have their own standalone development or evaluation kits that don't require the -use of [servo]. - -You will need an [FPMCU reference board](#fpmcu-dev-board) and a -[servo debugger](#servo). - -### FPMCU board {#fpmcu-dev-board} - -The Fingerprint MCU (FPMCU) board has the MCU that handles all -fingerprint-related functionality (matching, encryption, etc). The fingerprint -sensor itself connects to the FPMCU board. - -This FPMCU board is the Dragonclaw Rev 0.2. | -------------------------------------------- | -![Dragonclaw board] | - -Download the [Dragonclaw schematics, layout, and BOM][dragonclaw schematics]. - -<!-- mdformat off(b/139308852) --> -*** note -**Googlers**: You can pick up the Dragonclaw development board at Chromestop. -**Partners**: You can request a Dragonclaw development board from Google. -*** - -*** note -Dragonclaw Rev 0.2 needs a [rework](#dragonclaw-rev-0.2-rework) for the FPC -sensor to work while being powered through Servo. All of the boards at Chromestop -have already been reworked. -*** -<!-- mdformat on --> - -This FPMCU board is the Dartmonkey Rev 0.1. | -------------------------------------------- | -![Dartmonkey board] | - -### Servo - -Servo is a general purpose debug board that connects to a header on the FPMCU -board. Among other things, the servo supplies power to the FPMCU and can be used -to program the FPMCU, interact with the EC console, take power measurements, and -debug a running program. It supports SPI, UART, I2C, as well as JTAG/SWD. - -There are two different servo debugger setups supported, the -[Servo Micro](#servo-micro) and the [Servo V2 + Yoshi](#servo-v2-yoshi). The -servo micro is recommended for its simplicity. It lacks builtin JTAG/SWD support -for single step debugging, but Dragonclaw v0.2 has an -[SWD connector](#servo-micro-swd) that can be used. - -[Servo Micro](#servo-micro) | [ServoV2 + Yoshi](#servo-v2-yoshi) ---------------------------- | ---------------------------------- -![Servo Micro] | ServoV2 ![Servo v2] Yoshi Flex ![Standard Yoshi Flex] - -<!-- mdformat off(b/139308852) --> -*** note -For more information about both servos, see [servo]. -*** -<!-- mdformat on --> - -### Servo Micro - -Unlike the Servo V2, the newer servo micro does not require any adapters to -interface with the FPMCU board. - -As you can see below, one end connects to the FPMCU board and the other connect -to the developer's computer over micro USB. - -![Servo Micro with Dragonclaw] - -<!-- mdformat off(b/139308852) --> -*** note -For more information about Servo Micro, see [Servo Micro Info]. -*** -<!-- mdformat on --> - -#### Using SWD (Optional) {#servo-micro-swd} - -Instructions for setup are described in [Fingerprint Debugging]. - -### Servo V2 + Yoshi - -Servo V2 is the original full featured debugger. It requires a -[Yoshi Flex Cable](#yoshi-flex-cable) to interface with the FPMCU. - -![Servo v2] - -<!-- mdformat off(b/139308852) --> -*** note -NOTE: More information on servo can be found in the [servo] documentation. -*** -<!-- mdformat on --> - -#### Yoshi Flex Cable - -The Yoshi Flex cable is used to connect Servo v2 to the FPMCU board. The -standard cable does not work with SWD, but a simple rework can be performed to -support SWD. - -Standard Yoshi Flex | Yoshi Flex Reworked to Support SWD ----------------------- | ------------------------------------- -![Standard Yoshi Flex] | ![Yoshi Flex Reworked to Support SWD] - -Rework steps: - -* Remove R18 and R19 -* Wire from Pin 6 of U21 to right side of R18 -* Wire from Pin 6 of U21 to right side of R19 - -#### Micro USB Cable - -A micro USB cable is needed to connect the the servo v2 board to your host Linux -development machine. - -* [Micro USB Cable] - -#### Servo V2 Hardware Setup - -1. Connect the Yoshi Flex cable to servo, paying attention to the pin - numbering. - - ![Connect Yoshi Flex] ![Another Yoshi Flex image] - -2. Connect the other end of the Yoshi Flex cable to the servo header on the - FPMCU board. - - ![Connect Yoshi Flex to FPMCU board] ![Another image] - -3. Connect the fingerprint sensor to the header on the FPMCU board. - -4. Connect the micro USB cable to servo's `HOST_IN` port. The other end of the - USB cable should be plugged into your host development machine. - - ![Connect USB to Servo] - -5. Optional: Connect SWD Debugger - - If you want to use SWD for debugging, connect your debugger to the `JTAG` - header on servo v2. - - ![Connect SWD Debugger] - -## Software Setup - -### Get the Chromium OS source code - -* First, make sure you [have the prerequisites]. -* Then [get the source]. -* Create and [enter the `chroot`]. - * You can stop after the `enter the chroot` step. - -### Build the [EC]\ (embedded controller) codebase - -Open **two** terminals and enter the chroot in each: - -```bash -# from a terminal on your machine -(outside chroot) $ cd ~/chromiumos/src - -# enter the chroot (the flag is important) -(outside chroot) $ cros_sdk --no-ns-pid -``` - -<!-- mdformat off(b/139308852) --> -*** note -NOTE: More information on servo can be found in the [servo] documentation. -*** -<!-- mdformat on --> - -In one of the terminals, build and start `servod` - -Build and install `servod` in the chroot: - -```bash -(chroot) $ sudo emerge hdctools -``` - -<!-- mdformat off(b/139308852) --> -*** note -In all of the following commands, replace `<BOARD>` in the command with -`bloonchipper` or `dartmonkey` depending on the development board you are using. -*** -<!-- mdformat on --> - -Run `servod`: - -```bash -(chroot) $ sudo servod --board=<BOARD> -``` - -You should see something like this. Leave it running: - -```bash -2019-04-11 15:21:53,715 - servod - INFO - Start -2019-04-11 15:21:53,765 - servod - INFO - Found servo, vid: 0x18d1 pid: 0x5002 sid: 911416-00789 -2019-04-11 15:21:53,766 - servod - INFO - Found XML overlay for board zerblebarn -2019-04-11 15:21:53,766 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/servo_v2_r1.xml, None, 0) -2019-04-11 15:21:53,767 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/servo_v2_r0.xml, None, 0) -2019-04-11 15:21:53,771 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/common.xml, None, 0) -2019-04-11 15:21:53,772 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/power_tools.xml, None, 0) -2019-04-11 15:21:53,774 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/keyboard.xml, None, 0) -2019-04-11 15:21:53,775 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/uart_common.xml, None, 0) -2019-04-11 15:21:53,777 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/ftdii2c_cmd.xml, None, 0) -2019-04-11 15:21:53,777 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/usb_image_management.xml, None, 0) -2019-04-11 15:21:53,784 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/servo_zerblebarn_overlay.xml, None, 0) -2019-04-11 15:21:53,785 - SystemConfig - INFO - Loading XML config (/usr/lib64/python2.7/site-packages/servo/data/servoflex_v2_r0_p50.xml, None, 0) -2019-04-11 15:21:53,792 - Servod - INFO - Initializing interface 1 to ftdi_empty -2019-04-11 15:21:53,792 - Servod - INFO - Initializing interface 2 to ftdi_i2c -2019-04-11 15:21:53,795 - Servod - INFO - Initializing interface 3 to ftdi_uart -2019-04-11 15:21:53,799 - Servod - INFO - /dev/pts/8 -2019-04-11 15:21:53,799 - Servod - INFO - Initializing interface 4 to ftdi_uart -2019-04-11 15:21:53,802 - Servod - INFO - /dev/pts/9 -2019-04-11 15:21:53,802 - Servod - INFO - Use the next FTDI part @ pid = 0x5003 -2019-04-11 15:21:53,802 - Servod - INFO - Initializing interface 5 to ftdi_empty -2019-04-11 15:21:53,802 - Servod - INFO - Use the next FTDI part @ pid = 0x5003 -2019-04-11 15:21:53,802 - Servod - INFO - Initializing interface 6 to ftdi_empty -2019-04-11 15:21:53,802 - Servod - INFO - Use the next FTDI part @ pid = 0x5003 -2019-04-11 15:21:53,802 - Servod - INFO - Initializing interface 7 to ftdi_uart -2019-04-11 15:21:53,805 - Servod - INFO - /dev/pts/10 -2019-04-11 15:21:53,805 - Servod - INFO - Use the next FTDI part @ pid = 0x5003 -2019-04-11 15:21:53,805 - Servod - INFO - Initializing interface 8 to ftdi_uart -2019-04-11 15:21:53,808 - Servod - INFO - /dev/pts/11 -2019-04-11 15:21:53,808 - Servod - INFO - Initializing interface 9 to ec3po_uart -2019-04-11 15:21:53,811 - PD/Cr50 - EC3PO Interface - INFO - -------------------- PD/Cr50 console on: /dev/pts/12 -2019-04-11 15:21:53,811 - Servod - INFO - Initializing interface 10 to ec3po_uart -2019-04-11 15:21:53,812 - EC - EC3PO Interface - INFO - -------------------- EC console on: /dev/pts/14 -2019-04-11 15:21:54,316 - Servod - INFO - Initialized i2c_mux to rem -2019-04-11 15:21:54,317 - Servod - INFO - Initialized i2c_mux_en to on -2019-04-11 15:21:54,319 - Servod - INFO - Initialized pch_disable to off -2019-04-11 15:21:54,320 - Servod - INFO - Initialized jtag_buf_on_flex_en to off -2019-04-11 15:21:54,321 - Servod - INFO - Initialized cold_reset to off -2019-04-11 15:21:54,322 - Servod - INFO - Initialized warm_reset to off -2019-04-11 15:21:54,323 - Servod - INFO - Initialized spi1_buf_on_flex_en to off -2019-04-11 15:21:54,324 - Servod - INFO - Initialized spi_hold to off -2019-04-11 15:21:54,326 - Servod - INFO - Initialized pwr_button to release -2019-04-11 15:21:54,327 - Servod - INFO - Initialized lid_open to yes -2019-04-11 15:21:54,328 - Servod - INFO - Initialized spi2_buf_on_flex_en to off -2019-04-11 15:21:54,330 - Servod - INFO - Initialized rec_mode to off -2019-04-11 15:21:54,331 - Servod - INFO - Initialized fw_up to off -2019-04-11 15:21:54,332 - Servod - INFO - Initialized usb_mux_sel1 to dut_sees_usbkey -2019-04-11 15:21:54,333 - Servod - INFO - Initialized prtctl4_pwren to on -2019-04-11 15:21:54,334 - Servod - INFO - Initialized uart3_en to on -2019-04-11 15:21:54,334 - Servod - INFO - Initialized dut_hub_pwren to on -2019-04-11 15:21:54,335 - Servod - INFO - Initialized kbd_en to off -2019-04-11 15:21:54,337 - Servod - INFO - Initialized spi1_vref to pp3300 -2019-04-11 15:21:54,338 - Servod - INFO - Initialized spi2_vref to pp1800 -2019-04-11 15:21:54,339 - Servod - INFO - Initialized uart2_en to on -2019-04-11 15:21:54,340 - Servod - INFO - Initialized uart1_en to on -2019-04-11 15:21:54,341 - Servod - INFO - Initialized jtag_buf_en to off -2019-04-11 15:21:54,342 - Servod - INFO - Initialized fw_wp_en to off -2019-04-11 15:21:54,343 - Servod - INFO - Initialized sd_vref_sel to off -2019-04-11 15:21:54,343 - Servod - INFO - Initialized ec_ec3po_interp_connect to on -2019-04-11 15:21:54,344 - Servod - INFO - Initialized uart3_vref to off -2019-04-11 15:21:54,345 - Servod - INFO - Initialized jtag_vref_sel0 to pp3300 -2019-04-11 15:21:54,346 - Servod - INFO - Initialized jtag_vref_sel1 to pp3300 -2019-04-11 15:21:54,346 - Servod - INFO - Initialized fpmcu_ec3po_interp_connect to on -2019-04-11 15:21:54,349 - ServoDeviceWatchdog - INFO - Watchdog setup for devices: set([(6353, 20482, '911416-00789')]) -2019-04-11 15:21:54,351 - servod - INFO - Listening on localhost port 9999 -``` - -In the other terminal, build and flash the firmware: - -Navigate to the EC source: - -```bash -(chroot) $ cd ../platform/ec -``` - -Build the firmware: - -```bash -(chroot) $ make BOARD=<BOARD> -j -``` - -The resulting file will be in `build/<BOARD>/ec.bin` - -Flash the firmware file: - -```bash -(chroot) $ ./util/flash_ec --board=<BOARD> --image=./build/<BOARD>/ec.bin -``` - -Prepare a serial terminal in your chroot: - -```bash -(chroot) $ sudo emerge screen -``` - -Connect to the UART pty: - -```bash -(chroot) $ sudo screen $(dut-control raw_fpmcu_console_uart_pty | cut -d: -f2) -``` - -Press enter key several times (may need to wait up to 20 seconds). Then you will -see a prompt: - -``` -> -``` - -At this point you are connected to the MCU's serial (UART) console. You can list -all of the available console commands with "help": - -``` -> help -``` - -```bash -Known commands: - chan fpcapture hcdebugsherase fpenroll history spixfer waitms - flashinfo fpmatch hostevent sysinfo - flashread gettime md sysjump - flashwp gpioget panicinfo syslock - flashwrite gpioset reboot taskinfo -HELP LIST = more info; HELP CMD = help on CMD. -``` - -Start a fingerprint enrollment: - -``` -> fpenroll -``` - -### Measuring Power {#measure-power} - -The Dragonclaw reference board has an onboard INA that monitors the voltage and -power draw of the MCU and FP Sensor independently. - -Signal Name | Description ---------------- | ------------------------------------- -`pp3300_dx_mcu` | 3.3V supplying the MCU -`pp3300_dx_fp` | 3.3V supplying the fingerprint sensor -`pp1800_dx_fp` | 1.8V supplying the fingerprint sensor - -You can monitor all power and voltages by using the following command: - -```bash -(chroot) $ watch -n0.5 dut-control pp3300_dx_mcu_mv pp3300_dx_fp_mv pp1800_dx_fp_mv pp3300_dx_mcu_mw pp3300_dx_fp_mw pp1800_dx_fp_mw -``` - -You can get a summary of the power over `N` seconds with: - -```bash -(chroot) $ dut-control -t N pp3300_dx_mcu_mv pp3300_dx_fp_mv pp1800_dx_fp_mv pp3300_dx_mcu_mw pp3300_dx_fp_mw pp1800_dx_fp_mw -``` - -<!-- mdformat off(b/139308852) --> -*** note -The `_mv` suffix denotes millivolt and `_mw` suffix denotes milliwatt. -*** - -*** note -See [Power Measurement Documentation] for more information. -*** -<!-- mdformat on --> - -### Toggling Hardware Write Protect - -When using a fingerprint development board connected to servo, you can toggle -hardware write protect for testing. - -**NOTE**: `servod` must be running. - -Check the state of hardware write protect: - -```bash -(chroot) $ dut-control fw_wp_en -``` - -Enable hardware write protect: - -```bash -(chroot) $ dut-control fw_wp_en:on -``` - -Disable hardware write protect: - -```bash -(chroot) $ dut-control fw_wp_en:off -``` - -### Contributing Changes - -#### Using Gerrit and git - -If you’re not familiar with `git`, Gerrit (code review) and `repo`, here are -some docs to help you get started: - -* [Git and Gerrit Intro for Chromium OS]: Useful to get started as quickly as - possible, but does not explain how `git` works under the hood. -* [Set your editor]: Use your favorite editor when writing `git` commit - messages. -* [Chromium OS Contributing Guide]: Detailed overview of contributing changes - to Chromium OS and the workflow we use. -* [Git: Concepts and Workflow]: Good overview of how `git` actually works. -* [Gerrit: Concepts and Workflow]: Good overview of how Gerrit works; assumes - you understand `git` basics. -* [Life of a patch]: Android workflow, but similar to Chrome OS. - -The Gerrit dashboard that will show your pending reviews (and ones we have for -you): - -* [Public Gerrit] -* [Internal Gerrit] - -#### Registering for a chromium.org *Internal* Account - -If your partnership agreement requires non-public code sharing you will need to -register for an account on the [Internal Gerrit]. Refer to the -[Gerrit Credentials Setup] page for details. Once you register for an internal -account, your contact at Google can make sure you have the necessary permissions -to access the private repository. - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: In order to use a private repository you will have to manually add it -to the repo manifest file before running `repo sync`. Check with your contact -at Google for the exact values to use below: - -**`(outside) $ ~/chromiumos/.repo/manifests/default.xml`** - -```xml -<project remote="cros-internal" - path="CHECK WITH GOOGLE" - groups="firmware" - name="CHECK WITH GOOGLE" /> -``` - -**`(outside) $ ~/chromiumos/.repo/manifests/remote.xml`** - -```xml -<remote name="cros-internal" - fetch="https://chrome-internal.googlesource.com" - review="https://chrome-internal-review.googlesource.com" /> -``` -*** -<!-- mdformat on --> - -### Tracking Issues and Communication - -Development issue tracking and communication is done through the -[Partner Issue Tracker]. You will use your [Partner Domain] account to access -the [Partner Issue Tracker]. If you do not already have a [Partner Domain] -account, please request one from your Google contact. - -In order to make sure that you receive email notifications for issues, please -make sure that you [set up email forwarding] and set your -[notification settings] appropriately. Communication should primarily be done -through the [Partner Issue Tracker] and not email so that it can be more easily -tracked by multiple people and a record is preserved for posterity. - -[Partner Issue Tracker]: https://developers.google.com/issue-tracker/guides/partner-access -[Partner Domain]: https://developers.google.com/issue-tracker/guides/partner-domains -[set up email forwarding]: https://developers.google.com/issue-tracker/guides/partner-domains#email_forwarding -[notification settings]: https://developers.google.com/issue-tracker/guides/set-notification-preferences - -## Working with Chromebooks - -Chromebooks have an FPMCU (e.g., Dragonclaw) board attached to the motherboard. -You can use the device to run `ectool` commands and test the fingerprint sensor -from the UI. - -### Developer Mode and Write Protection - -Make sure that your fingerprint-equipped Chrome OS device is in [developer mode] -with a *test* image flashed and [hardware write protection] disabled. Using the -test image will allow you to SSH into the device and disabling hardware write -protection allows you to have full access to flashing the FPMCU firmware. - -See [Installing Chromium] for details on flashing test images and enabling -[developer mode]. - -### Connecting - -In general, most of our development is done by connecting to the DUT (device -under test) via SSH. We usually connect the DUT to ethernet (e.g., via USB-C to -Ethernet converter), but WiFi should also work (assuming corporate firewall -restrictions don’t block SSH port 22). To get the IP address, tap the -battery/time icon in the lower right corner. Then tap on “Ethernet” followed by -the gear icon in the upper right. - -```bash -(chroot) $ ssh root@<IP_ADDRESS> -Password: test0000 -``` - -Once you have SSH’ed into the DUT, you should be able to run `ectool` commands. - -**Example**: Capture a "test_reset" image from the sensor and write it to a -[PNM] file (viewable with the ImageMagick `display` command): - -```bash -(device) $ ectool --name=cros_fp fpmode capture test_reset; ectool --name=cros_fp waitevent 5 500; ectool --name=cros_fp fpframe > /tmp/test_reset.pnm -``` - -Alternatively, you can access a shell via the UI on device by pressing -`CTRL+ALT+F2` (third key on top row). Log in with `root` and `test0000`. - -### Flashing FPMCU from DUT - -Copy the firmware to the DUT: - -```bash -(chroot) $ scp ./build/bloonchipper/ec.bin <DUT_IP>:/tmp/ec.bin -``` - -From the DUT, flash the firmware you copied: - -```bash -(device) $ flash_fp_mcu /tmp/ec.bin -``` - -## Commit-queue Prototype Environment - -![CQ Prototype Environment] - -## Troubleshooting - -### Dragonclaw Rev 0.2 Rework {#dragonclaw-rev-0.2-rework} - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: All Dragonclaw v0.2 boards have been reworked, so it is not necessary -to perform the rework yourself. -*** -<!-- mdformat on --> - -Dragonclaw **Rev 0.2** has two load switches (`U4` and `U6`) that enable the -1.8V power rail from the servo connector or motherboard connector. However, this -switch is not compatible with 1.8V, so will always output 0V. - -The [rework document][Dragonclaw Rev 0.2 1.8V Rework] describes replacing these -two switches with ones compatible with 1.8V. - -### Dragonclaw Rev 0.1 Servo Fix - -Dragonclaw **Rev 0.1** has a known issue with UART and JTAG. Most notably, this -issue causes servo micro to fail to program the FPMCU over UART. - -This issue can be fixed with the following rework steps: - -* Connect servo header pin 13 to pin 18 -* Connect servo header pin 13 to pin 29 - -![Dragonclaw servo fix diagram] - -### Verify that servo and debugger are connected to USB {#servo-connected} - -Check whether servo is enumerating on USB. If you are using a debugger -(Lauterbach, J-Link, etc), also check to make sure it enumerates. Depending on -the debugger being used, it may need to be powered with an external power -supply. - -```bash -(chroot) $ lsusb - -Bus 002 Device 003: ID 0897:0004 Lauterbach # ← This is my Lauterbach (debugger) -Bus 001 Device 013: ID 18d1:5002 Google Inc. # ← This is servo -``` - -### "No servos found" when running servod - -If you get the following message, make sure that -[servo is connected to USB](#servo-connected). You may also want to try -restarting your machine (or VM). - -```bash -(chroot) $ sudo servod --board=bloonchipper -2019-04-12 14:53:42,236 - servod - INFO - Start -2019-04-12 14:53:42,270 - servod - ERROR - No servos found -``` - -### Losing characters in servo UART console - -Make sure that this interface is disabled: - -```bash -(chroot) $ dut-control usbpd_ec3po_interp_connect:off -``` - -### FPMCU console commands - -* Once the console is working you can use `help` to see the commands. -* There should be fingerprint commands that start with `fp` (see `fpsensor.c` - in the [EC] code). - -<!-- Links --> - -[EC]: https://chromium.googlesource.com/chromiumos/platform/ec -[ectool_servo_spi]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/util/comm-servo-spi.c#15 -[servo]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/README.md -[developer mode]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/debug_buttons.md#firmware-keyboard-interface -[hardware write protection]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/docs/write_protection.md -[have the prerequisites]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#Prerequisites -[get the source]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#get-the-source -[enter the `chroot`]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#building-chromium-os -[Chromium OS Contributing Guide]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/contributing.md -[Servo Micro Info]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/docs/servo_micro.md -[Set your editor]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#Set-your-editor -[Life of a patch]: https://source.android.com/setup/contribute/life-of-a-patch -[Git: Concepts and Workflow]: https://docs.google.com/presentation/d/1IQCRPHEIX-qKo7QFxsD3V62yhyGA9_5YsYXFOiBpgkk/ -[Gerrit: Concepts and Workflow]: https://docs.google.com/presentation/d/1C73UgQdzZDw0gzpaEqIC6SPujZJhqamyqO1XOHjH-uk/ -[Public Gerrit]: https://chromium-review.googlesource.com -[Power Measurement Documentation]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/docs/power_measurement.md -[Internal Gerrit]: https://chrome-internal-review.googlesource.com -[Gerrit Credentials Setup]: https://www.chromium.org/chromium-os/developer-guide/gerrit-guide -[Micro USB Cable]: https://www.monoprice.com/product?p_id=9762 -[PNM]: https://en.wikipedia.org/wiki/Netpbm_format -[Git and Gerrit Intro for Chromium OS]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/git_and_gerrit_intro.md -[Installing Chromium]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#installing-chromium-os-on-your-device -[FPMCU documentation]: ./fingerprint.md -[Fingerprint Debugging]: ./fingerprint-debugging.md -[dragonclaw schematics]: ../schematics/dragonclaw - -<!-- Images --> - -[Servo Micro]: ../images/servo_micro.jpg -[Servo Micro with Dragonclaw]: ../images/servomicro_dragonclaw.jpg -[Servo v2]: ../images/servo_v2.jpg -[Standard Yoshi Flex]: ../images/yoshi_flex.jpg -[Yoshi Flex Reworked to Support SWD]: ../images/yoshi_flex_swd_rework.jpg -[Dragonclaw board]: ../images/dragonclaw_rev_0.2.jpg -[Dragonclaw servo fix diagram]: ../images/dragonclaw_servo_fix.jpg -[Connect USB to Servo]: ../images/servo_v2_with_micro_usb.jpg -[Connect Yoshi Flex]: ../images/servo_v2_with_yoshi_flex.jpg -[Another Yoshi Flex image]: ../images/servo_v2_with_yoshi_flex2.jpg -[Connect Yoshi Flex to FPMCU board]: ../images/dragonclaw_yoshi_flex_header.jpg -[Another image]: ../images/dragonclaw_yoshi_flex_header2.jpg -[Connect SWD Debugger]: ../images/servo_v2_jtag_header.jpg -[Dartmonkey board]: ../images/dartmonkey.jpg - -<!-- If you make changes to the docs below make sure to regenerate the JPEGs by - appending "export/pdf" to the Google Drive link. --> - -<!-- https://docs.google.com/drawings/d/1YhOUD-Qf69NUdugT6n0cX7o7CWvb5begcdmJwv7ch6I --> - -[Dragonclaw Rev 0.2 1.8V Rework]: https://github.com/coreboot/chrome-ec/blob/master/docs/images/dragonclaw_rev_0.2_1.8v_load_switch_rework.pdf - -<!-- https://docs.google.com/drawings/d/1w2qbb4AsSxY-KTK2vXZ6TKeWHveWvS3Dkgh61ocu0wc --> - -[CQ Prototype Environment]: ../images/CQ_Prototype_Environment.jpg diff --git a/docs/fingerprint/fingerprint-factory-quick-guide.md b/docs/fingerprint/fingerprint-factory-quick-guide.md deleted file mode 100644 index c9478bf99a..0000000000 --- a/docs/fingerprint/fingerprint-factory-quick-guide.md +++ /dev/null @@ -1,97 +0,0 @@ -# Chrome OS Fingerprint Sensor: Quick Factory Guide - -The goal of this document is to outline how ODM partners can make use of the -existing Chrome OS factory scripts to meet Chrome OS FPS factory requirements. - -[TOC] - -## Factory Requirements - -### Flash firmware for fingerprint sensor microcontroller (FPMCU) - -FPMCU firmware must be flashed before fingerprint functional test is run. ODM -partners may work with the module house to preflash FPMCU firmware before -factory SMT. However, this way ODM partners have to coordinate with the module -house to make sure the preflash FPMCU firmware blob is extracted from the FSI -release image (from /opt/google/biod/fw/). If the FPMCU firmware doesn’t match -the FPMCU firmware blob checked into the release image, the end users will see -the ‘critical update’ screen in their out-of-box experience, because -bio\_fw\_updater tries to update FPMCU firmware at boot time. This is a bad user -experience we want to avoid. Most importantly, in PVT/MP build, only the FPMCU -firmware in the release image would be signed by MP key. So you **MUST** ensure -FPMCU is flashed with the MP-signed firmware blob extracted from FSI, before -shipping the devices. - -As opposed to pre-flashing FPMCU in the module house, ODM partners are -encouraged to make use of -[update\_fpmcu\_firmware.py](https://chromium.googlesource.com/chromiumos/platform/factory/+/e5e903d0a0d8327dd8b9e47d2c808fd845ed73a4/py/test/pytests/update_fpmcu_firmware.py) -to update FPMCU firmware in the factory flow. This script can detect fingerprint -MCU board name, find the right FPMCU firmware blob for the DUT from the release -partition, and then flash FPMCU by flash\_fp\_mcu tool. Please note that this -script may take more than 30 secs to complete, which is slow. - -Since bio\_fw\_update has been disabled in factory test image via -[crrev/c/1913645](https://chromium-review.googlesource.com/c/chromiumos/platform2/+/1913645), -in the factory flow, the FPMCU firmware should not be overwritten by -boot-update-firmware service during reboot. - -### Run fingerprint sensor functional test - -Please add -[fingerprint\_mcu.py](https://chromium.git.corp.google.com/chromiumos/platform/factory/+/a283609cd8446ba4a4b75c2e1d84c9ba24ea8422/py/test/pytests/fingerprint_mcu.py) -to your device test list. A more detailed description about this test can be -found -[here](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/docs/fingerprint/fingerprint-factory-requirements.md). - -### Initialize FPMCU entropy in factory finalization - -The support for FPMCU entropy initialization has been integrated into the -factory finalization script. So FPMCU entropy should be automatically -initialized in factory finalization, if a FPMCU is found on DUT. Note that FPMCU -entropy initialization would fail if rollback\_block\_id is not equal to zero, -which means the entropy has been initialized before. It is usually caused by -biod trying to initialize FPMCU entropy and increment rollback\_block\_id at -boot time. Since we have disabled biod and bio\_crypto\_init in factory test -image via -[crrev/c/1910290](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1910290), -we expect rollback\_block\_id would stay zero during the factory flow, and FPMCU -entropy initialization should succeed in factory finalization. So just run -factory finalization as any other CrOS boards. - -### Enable FPMCU software write protection (SWWP) in factory finalization in PVT/MP - -The support for FPMCU SWWP has been integrated into factory finalization script. -So FPMCU SWWP should be automatically enabled in factory finalization together -with AP/EC SWWP when write\_protection arg is set to true and a FPMCU is found -on DUT. Just run factory finalization as any other CrOS boards. - -### Reset entropy for factory re-finalization (in case of RMA or OQC) - -For the boards that have been finalized, FPMCU entropy has been initialized. So -running re-finalization for those boards are expected to fail at FPMCU entropy -initialization. Before running re-finalization for those boards, ODM partners -have to remove hardware write protection (HWWP) and then run -[update\_fpmcu\_firmware.py](https://chromium.googlesource.com/chromiumos/platform/factory/+/d399a0a1bdeb7249de2721b269e7365e4486e23c/py/test/pytests/update_fpmcu_firmware.py) -to reset rollback\_block\_id and entropy. So the follow-up re-finalization -(which re-initialize entropy) can succeed. - -## References - -* CrOS fingerprint factory requirements: - [doc link](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/docs/fingerprint/fingerprint-factory-requirements.md) -* The summary of CLs: - * Add a factory script to update FPMCU firmware: - [crrev/c/1918679](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1918679), - [crrev/c/1913493](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1913493), - [crrev/c/1927149](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1927149), - [crrev/c/1984618](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1984618), - [crrev/c/2036574](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/2036574) - * Disable FPS-related services that will interfere with the factory flow: - [crrev/c/1913645](https://chromium-review.googlesource.com/c/chromiumos/platform2/+/1913645), - [crrev/c/1910290](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1910290) - * Support FPMCU in factory finalization: - [crrev/c/1868795](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1868795), - [crrev/c/1902267](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1902267), - [crrev/c/1900503](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1900503), - [crrev/c/1925927](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1925927), - [crrev/c/1948163](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1948163) diff --git a/docs/fingerprint/fingerprint-factory-requirements.md b/docs/fingerprint/fingerprint-factory-requirements.md deleted file mode 100644 index 0fc99e2740..0000000000 --- a/docs/fingerprint/fingerprint-factory-requirements.md +++ /dev/null @@ -1,502 +0,0 @@ -# Chrome OS Fingerprint Factory Requirements - -This document provides an overview of factory requirements and testing for the -fingerprint sensor. - -[TOC] - -## Contact - -For questions regarding this document, please contact the -[Chrome OS Fingerprint Team]. - -## Terminology - -* `AP`: Application Processor. -* `FPMCU`: Fingerprint Microcontroller. -* `FATP`: Final Assembly, Test, and Pack -* `FP sensor`: Fingerprint sensor. Directly connected to the FPMCU, not the - AP. -* `firmware`: Software that runs on the FPMCU. -* `finalization`: Process that is run in the factory before the device being - built leaves the factory. -* `entropy`: Cryptographically secure random bytes stored in FPMCU flash. Used - for encrypting/decrypting fingerprint templates. -* `software write protect`: Prevents the RO portion of the FPMCU’s flash from - being overwritten. Full details in [EC docs][Software Write Protect]. -* `ITS`: In-Device Test Specification. -* `MTS`: Module Test Specification. -* `MQT`: Module Quality Test. -* `MQT2`: Module Quality Test 2. - -## Documents - -* [FPC1025: Module Test Specification] -* [FPC1145: Module Test Specification] -* [FPC In-Device Test Specification] -* [Factory Fingerprint Sensor Testing for `nocturne` ] - -## FPMCU Firmware Location - -The binaries for the FPMCU firmware are located in `/opt/google/biod/fw`. Now -that Chrome OS supports unibuild, there may be multiple firmware binaries in the -directory since multiple sensors may be used across a single "board" (e.g., the -`hatch` board can use either `bloonchipper` or `dartmonkey`). - -The correct firmware type to use for a given board can be discovered with the -[Chrome OS Config] tool: - -```bash -(dut) $ cros_config /fingerprint board -dartmonkey -``` - -OR - -```bash -(chroot) $ cros_config_host -c /build/<BOARD>/usr/share/chromeos-config/yaml/config.yaml -m <MODEL> get /fingerprint board -dartmonkey -``` - -The corresponding firmware for the above command would be -`/opt/google/biod/fw/dartmonkey_*.bin`. - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: If you get an empty response when running the above commands, the -Chrome OS Config settings may not have been updated for the Chrome OS board. -See the instructions on [updating Chrome OS Config] for fingerprint. -*** -<!-- mdformat on --> - -Note that the fingerprint team continuously releases updates to the firmware, so -SIEs should watch for version changes in ToT if they are maintaining a separate -factory branch. - -## Flashing the FPMCU - -When the FPMCU is completely blank a low-level flashing tool must be used to -program an initial version of the FPMCU firmware. It’s possible to use the -[`flash_fp_mcu`] script as this low-level flashing tool, though since it -requires the AP and is not necessarily robust against failures, it is not -recommended for mass-production. More details about [`flash_fp_mcu`] are in the -[Fingerprint flashing documentation]. - -The initial version of the FPMCU firmware should be flashed either by the module -house or by the factory. Once an initial version of the FPMCU firmware has been -flashed (i.e., the FPMCU is not blank), the `bio_fw_updater` tool runs on -startup and handles updating the FPMCU firmware to match the version that is in -the rootfs. Note that this update process can take around 30 seconds; if that -length of time is an issue then the factory or module house should pre-flash the -latest firmware beforehand. - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: If the FPMCU is not flashed in the factory as part of development -builds (EVT, etc.), it's possible for developers (or Chromestop) to manually -run [`flash_fp_mcu`], as long as they can disable [hardware write protect]. -Obviously this only applies during development, not mass production. -*** -<!-- mdformat on --> - -## biod and timberslide - -Since `biod` communicates with the FPMCU, it’s best to disable it when running -the fingerprint factory tests. This can be done with upstart: - -```bash -(dut) $ stop biod -``` - -Once testing is complete `biod` should be restarted (or you can reboot the -device). - -`timberslide` is the daemon that periodically sends commands to the FPMCU to -read the latest FPMCU logs. It writes the results to `/var/log/cros_fp.log`. It -should be fine to leave running during tests, though it should be stopped before -running the [`flash_fp_mcu`] script, since that script erases the entire FPMCU: - -```bash -(dut) $ stop timberslide LOG_PATH=/sys/kernel/debug/cros_fp/console_log -``` - -## Factory Tests - -### Fingerprint Sensor (standalone module) - -When using an FPC sensor (e.g., FPC 1025, FPC 1145), the fingerprint sensor -itself must be tested by the module manufacturer with FPC’s tools. FPC provides -a Module Test Tool (MTT), which requires additional hardware (FPC Module Test -Card). FPC also provides design drawings for the rubber stamp. The stamp, -test-fixture and test station need to be implemented by the OEM/ODM/Module House -(often only module house). - -The `MTS` _must_ be followed by the module manufacturer, but Google does not -provide direct support for this testing. FPC is the main point of contact. - -The module testing procedure is documented in the following: - -[FPC1025: Module Test Specification] - -[FPC1145: Module Test Specification] - -### Fingerprint Sensor + FPMCU (in device) - -In-device tests are run during the `FATP` process once the device has been fully -assembled. Google provides source code for these tests in -[`fingerprint_mcu.py`]. - -Hardware Required: Chrome OS DUT before finalization. - -Documentation: [FPC In-Device Test Specification] - -#### Test Image Checkerboard and Inverted Checkerboard Test (CB/ICB) - -##### Purpose - -Capture a checkerboard (and inverted checkerboard) pattern and verify that the -values of the individual pixels do not deviate from the median. - -##### Implementation - -Use `ectool` to capture the first checkerboard pattern image: - -```bash -(dut) $ ectool --name=cros_fp fpmode capture pattern0; ectool --name=cros_fp waitevent 5 500 -FP mode: (0x20000008) capture -MKBP event 5 data: 00 00 00 80 -``` - -Copy the first checkerboard image to a file: - -```bash -(dut) $ ectool --name=cros_fp fpframe > /tmp/pattern0.pnm -``` - -Use `ectool` to capture the second checkerboard pattern image: - -```bash -(dut) $ ectool --name=cros_fp fpmode capture pattern1; ectool --name=cros_fp waitevent 5 500 -FP mode: (0x30000008) capture -MKBP event 5 data: 00 00 00 80 -``` - -Copy the second checkerboard image to a different file: - -```bash -(dut) $ ectool --name=cros_fp fpframe > /tmp/pattern1.pnm -``` - -Perform median analysis on the resulting image as described in the `MTS` -document. The factory toolkit does this in -[`fingerprint_mcu.py`][Checkerboard Test]. - -<!-- mdformat off(b/139308852) --> -*** note -**TIP**: You can view the `.pnm` files generated by the commands below on your -Linux desktop with ImageMagick: `display /path/to/file.pnm`. -*** -<!-- mdformat on --> - -##### Success/Failure - -The median pixel value (type 1 and type 2), pixel errors, finger detect zone -errors, and pixel error deviation limit must fall within the acceptance criteria -limits specified in "4.3.5 Acceptance Criteria Test Image CB / iCB" in the `MTS` -document for the sensor being tested. - -#### Hardware Reset Test (aka IRQ test) - -##### Purpose - -Perform a hardware reset of the sensor and test that the IRQ line is asserted -after 5 ms. See "Section 4.1 Reset test pattern procedure" and "2.8 HW Reset" in -the FPC `MTS` document for the sensor being tested. - -##### Implementation - -This is implemented by the FPMCU on every boot. The results can be checked with -the `ectool` command. The factory toolkit does this in -[`fpmcu_utils.py`][GetSensorIdErrors]. - -##### Success/Failure - -The `Error flags` line of the `fpinfo` `ectool` command must be empty. - -```bash -(dut) $ ectool --name=cros_fp fpinfo - -Fingerprint sensor: vendor 20435046 product 9 model 1401 version 1 -Image: size 56x192 8 bpp -Error flags: -Dead pixels: UNKNOWN -Templates: version 4 size 47616 count 0/5 dirty bitmap 0 -``` - -#### Hardware ID (HWID) check - -##### Purpose - -Ensure that communications between the sensor and the FPMCU are working and that -the correct sensor has been assembled. - -##### Implementation - -`ectool` can be used to request the hardware ID, which can be compared with the -expected hardware ID. The factory toolkit does this in -[`fpmcu_utils.py`][GetSensorId]. - -##### Success/Failure - -The `Fingerprint sensor` line of the `fpinfo` `ectool` command must show the -expected ID and the `Error flags` line must be empty: - -```bash -(dut) $ ectool --name=cros_fp fpinfo - -Fingerprint sensor: vendor 20435046 product 9 model 1401 version 1 # FPC 1145 -Image: size 56x192 8 bpp -Error flags: -Dead pixels: UNKNOWN -Templates: version 4 size 47616 count 0/5 dirty bitmap 0 -``` - -#### Reset Pixel (RP) - -##### Purpose - -Capture a white image, compare the individual pixel values and ensure that the -deviation to the median is within the specified range. - -##### Implementation - -Capture the test image with `ectool` and analyze the output. The factory toolkit -does this in [`fingerprint_mcu.py`][ProcessResetPixelImage]. - -Switch to correct capture mode and wait: - -```bash -(dut) $ ectool --name=cros_fp fpmode capture test_reset; ectool --name=cros_fp waitevent 5 500 -FP mode: (0x50000008) capture -MKBP event 5 data: 00 00 00 80 -``` - -Retrieve the test image: - -```bash -(dut) $ ectool --name=cros_fp fpframe > /tmp/test_reset.pnm -``` - -##### Success/Failure - -A pixel is considered to be a bad pixel ("reset pixel error") if the value read -out deviates more than a defined value from the median. The median value and the -max number of pixels that have "reset pixel error" are defined in section "Reset -Pixel" (4.4 or 4.5) of the MTS for the given sensor. - -#### Module Quality Test (or Module Quality Test 2) with Rubber Stamp Zebra (Optional) - -##### Purpose - -The Module Quality Test (`MQT`) uses a rubber stamp with a "zebra" pattern to -characterize module performance and image quality after the top layer (including -stack-up) is applied. Although this test is optional, OEMs are strongly -encouraged to perform it. - -##### Implementation - -Capture the image when the rubber stamp is applied: - -```bash -(dut) $ ectool --name=cros_fp fpmode capture qual -FP mode: (0x40000008) capture -``` - -Wait for the capture to be finished, timeout after 10s: - -```bash -(dut) $ ectool --name=cros_fp waitevent 5 10000 -MKBP event 5 data: 00 00 00 80 -``` - -Copy the raw captured from to the AP: - -```bash -(dut) $ ectool --name=cros_fp fpframe raw > /tmp/fp.raw -``` - -Run the analysis tool on the captured frame: - -```bash -(dut) $ /usr/local/opt/fpc/fputils.py --mqt /tmp/fp.raw -Error, MQT status : (5) -MQT failed (-1) -``` - -The factory toolkit does this in [`fingerprint_mcu.py`][rubber_finger_present]. - -##### Success/Failure - -See "Section 5.1.5" Acceptance Criteria for `MQT2` or "Section 5.2.5 Acceptance -Criteria" in the MTS for the given sensor. - -## Finalization - -The finalization process must perform two tasks: - -1. Initialize the FPMCU’s `entropy`. -1. When building for PVT or mass production, enable `software write protect`. - -### Initialize FPMCU Entropy - -The `bio_wash` tool is intended to support both the first time factory -initialization and RMA, depending on the flag. When run with the -`--factory_init` argument (`bio_wash --factory_init`), it will ensure that the -`entropy` is set. If the `entropy` has already been set it will do nothing. - -A side-effect of running `bio_wash` is that the `rollback_id` changes (`ectool ---name=cros_fp rollbackinfo`). Initially when the firmware is first flashed, the -`rollback_id` should be zero. After `entropy` is initialized the `rollback_id` -should be set to 1. - -Note that for new devices coming out of the factory we expect `rollback_id` to -be 1, which indicates that the entropy has been set exactly once. - -### Enable Software Write Protect - -`Software write protect` must be enabled for PVT and mass production devices. It -ensures that the RO portion of the FPMCU firmware cannot be overwritten, so it -is critical for FPMCU security. - -The following commands will enable software write protection: - -```bash -(dut) $ ectool --name=cros_fp flashprotect enable # enable -(dut) $ sleep 2 -(dut) $ ectool --name=cros_fp reboot_ec # reboot so it takes effect -(dut) $ sleep 2 -``` - -To validate that software write protection has taken effect, run the following: - -```bash -(dut) $ ectool --name=cros_fp flashprotect # get flashprotect state - -# output should match below -Flash protect flags: 0x0000000b wp_gpio_asserted ro_at_boot ro_now -Valid flags: 0x0000003f wp_gpio_asserted ro_at_boot ro_now all_now STUCK INCONSISTENT -Writable flags: 0x00000004 all_now -``` - -If software write protection is not enabled, you will see the following instead: - -```bash -(dut) $ ectool --name=cros_fp flashprotect # get flashprotect state - -# not protected -Flash protect flags: 0x00000000 -Valid flags: 0x0000003f wp_gpio_asserted ro_at_boot ro_now all_now STUCK INCONSISTENT -Writable flags: 0x00000001 ro_at_boot -``` - -Capturing a raw frame from the sensor will only work when software write -protection is not enabled, so the test should check the following command works -*before* write protection is enabled and then fails *after* write protection is -enabled: - -```bash -(dut) $ ectool --name=cros_fp fpframe raw - -# write protection disabled, exit code 0 and output will be raw bytes - -# write protection enabled, exit code 1 and output will be -EC result 4 (ACCESS_DENIED) -Failed to get FP sensor frame -``` - -## RMA Process - -As part of the RMA process, the `entropy` needs to be reset so that the new -device owner has a new unique encryption key. - -The `bio_wash` tool is intended to support both the first time factory -initialization and RMA, depending on the flag. When run without any arguments -(`bio_wash`), it will forcibly reset the entropy. - -The RMA process should either run `bio_wash` without any arguments or re-flash -the FPMCU firmware and then run `bio_wash --factory_init` to make sure that the -entropy has been reset. - -## Miscellaneous Commands for Test Implementations - -### FPMCU Image Version - -```bash -(dut) $ ectool --name=cros_fp version - -RO version: nocturne_fp_v2.2.64-58cf5974e -RW version: nocturne_fp_v2.2.110-b936c0a3c -Firmware copy: RW -Build info: nocturne_fp_v2.2.110-b936c0a3c 2018-11-02 14:16:46 @swarm-cros-461 -Tool version: v2.0.2144-1524c164f 2019-09-09 06:50:36 @chromeos-ci-legacy-us-central2-d-x32-7-3ay8 -``` - -### Capture Raw Images - -Put your finger on the sensor, then run: - -```bash -(dut) $ ectool --name=cros_fp fpmode capture vendor -``` - -Wait for the capture to be finished, timeout after 10s: - -```bash -(dut) $ ectool --name=cros_fp waitevent 5 10000 -MKBP event 5 data: 00 00 00 80 -``` - -Remove the finger from the sensor, then start the retrieval of the frame from -the MCU to the AP: - -```bash -(dut) $ ectool --name=cros_fp fpframe raw > /tmp/fp.raw -``` - -To convert the images from FPC’s proprietary format to PNG, you will need to -have `cros deploy`’d `libfputils-nocturne`, which will install the required -utilities in `/opt/fpc`. - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: As of 2019-05-21, the `libfputils` library only works for the FPC 1145 -sensor (in nocturne), not the FPC 1025 sensor (hatch). -*** -<!-- mdformat on --> - -Convert the buffer in proprietary format into png: - -```bash -(dut) $ /opt/fpc/fputils.py /tmp/fp.raw --png -Extraction found 2 images -Wrote /tmp/fp.0.png (14085 bytes) -Wrote /tmp/fp.1.png (14025 bytes) -``` - -[Software Write Protect]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/docs/write_protection.md#Software-Write-Protect -[hardware write protect]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/docs/write_protection.md#hw_wp -[FPC1025: Module Test Specification]: http://go/cros-fingerprint-fpc1025-module-test-spec -[FPC1145: Module Test Specification]: http://go/cros-fingerprint-fpc1145-module-test-spec -[FPC In-Device Test Specification]: http://go/cros-fingerprint-fpc-indevice-test-spec -[`fingerprint_mcu.py`]: https://chromium.googlesource.com/chromiumos/platform/factory/+/HEAD/py/test/pytests/fingerprint_mcu.py -[Checkerboard Test]: https://chromium.googlesource.com/chromiumos/platform/factory/+/d23ebc7eeb074760e8a720e3acac4cfe4073b2ae/py/test/pytests/fingerprint_mcu.py#166 -[GetSensorIdErrors]: https://chromium.googlesource.com/chromiumos/platform/factory/+/d23ebc7eeb074760e8a720e3acac4cfe4073b2ae/py/test/utils/fpmcu_utils.py#73 -[GetSensorId]: https://chromium.googlesource.com/chromiumos/platform/factory/+/d23ebc7eeb074760e8a720e3acac4cfe4073b2ae/py/test/utils/fpmcu_utils.py#65 -[ProcessResetPixelImage]: https://chromium.googlesource.com/chromiumos/platform/factory/+/d23ebc7eeb074760e8a720e3acac4cfe4073b2ae/py/test/pytests/fingerprint_mcu.py#268 -[rubber_finger_present]: https://chromium.googlesource.com/chromiumos/platform/factory/+/d23ebc7eeb074760e8a720e3acac4cfe4073b2ae/py/test/pytests/fingerprint_mcu.py#330 -[Chrome OS Fingerprint Team]: http://go/cros-fingerprint-docs -[Factory Fingerprint Sensor Testing for `nocturne`]: http://go/fingerprint-factory-testing-nocturne -[`flash_fp_mcu`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/util/flash_fp_mcu -[Fingerprint flashing documentation]: ./fingerprint.md#factory-rma-dev-updates -[Chrome OS Config]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/chromeos-config/README.md -[updating Chrome OS Config]: ./fingerprint.md#update-chromeos-config diff --git a/docs/fingerprint/fingerprint-firmware-testing-for-partners.md b/docs/fingerprint/fingerprint-firmware-testing-for-partners.md deleted file mode 100644 index 3432bb0aac..0000000000 --- a/docs/fingerprint/fingerprint-firmware-testing-for-partners.md +++ /dev/null @@ -1,112 +0,0 @@ -# Fingerprint Firmware Testing Instructions for Partners - -This document is intended to help partners (sensor vendors, MCU vendors, etc) -run the Chrome OS fingerprint team's firmware tests, as part of the AVL process. -The document assumes that you‘re using Linux to do the development; preferably a -recent version of Ubuntu or Debian. It may be possible to use a virtual machine, -but that is not a configuration we test. - -[TOC] - -## Hardware Requirements - -You will need a Chromebook with the fingerprint sensor and fingerprint MCU -(FPMCU), and a [servo debugger]. - -### Chromebook with fingerprint sensor - -The Chromebook needs to be in [developer mode] and running a test image so that -the test can ssh into it. The fingerprint firmware tests will run a series of -bash commands, including flashing the FPMCU firmware and rebooting the -Chromebook. You do not need [CCD] because servo will handle the firmware write -protection for you. - -### Servo - -Servo is a general purpose debug board used in many automated tests in Chromium -OS. Among other things, servo enables the tests to toggle hardware write -protect. - -While there are multiple versions of servo, for firmware tests we strongly -recommend [Servo V4] as that's the simplest and most often used in autotests. -This document will assume you are using Servo V4. - -### Hardware Setup - -* Connect the "HOST" side of Servo V4 to your host machine (which should have - a Chromium OS chroot). -* Connect the other side of Servo V4 to a USB port on the Chromebook with - fingerprint sensor. -* Connect the "DUT POWER" side of Servo V4 to power supply. -* Make sure the USB cable from the host machine to Servo V4 is in data - transfer mode (i.e. if there's an LED, it should be yellow instead of - green). -* Make sure the you can ssh into the Chromebook from the chroot on the host - machine. - -## Software Setup - -### Get the Chromium OS source code. - -* First, make sure you [have the prerequisites]. -* Then [get the source]. - -### Build the autotest codebase - -```bash -# from a terminal on your machine -(outside chroot) $ cd ~/chromiumos/src - -# enter the chroot (the flag is important) -(outside chroot) $ cros_sdk --no-ns-pid - -# build autotest for the board to be tested -(chroot) $ emerge-<BOARD> autotest -``` - -### Start servod - -```bash -(chroot) $ sudo servod --board=<BOARD> -``` - -At this point the servod daemon should be running and listening to port 9999 by -default. If it isn't, check the hardware connection. - -## Run a Single Fingerprint Firmware Test - -Use another terminal and enter the chroot like before: - -```bash -(outside chroot) $ cd ~/chromiumos/src -(outside chroot) $ cros_sdk --no-ns-pid -``` - -To run a single test, use this command in your chroot: - -```bash -test_that --board=<BOARD> <IP> <test name> -``` - -For example: - -```bash -test_that --board=nocturne <IP> firmware_Fingerprint.ReadFlash -``` - -## Run the Entire Fingerprint Firmware Test Suite - -To run the entire suite, use this command in your chroot: - -```bash -test_that --board=<BOARD> <IP> suite:fingerprint -``` - -<!-- Links --> - -[servo debugger]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/docs/servo.md -[developer mode]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_mode.md -[CCD]: https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/cr50_stab/docs/case_closed_debugging.md -[Servo V4]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/docs/servo_v4.md -[have the prerequisites]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#Prerequisites -[get the source]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#get-the-source diff --git a/docs/fingerprint/fingerprint-tpm-seed.md b/docs/fingerprint/fingerprint-tpm-seed.md deleted file mode 100644 index 904fb7243a..0000000000 --- a/docs/fingerprint/fingerprint-tpm-seed.md +++ /dev/null @@ -1,324 +0,0 @@ -# TPM Seed for Fingerprint MCU - -Authors: pmalani@google.com, norvez@google.com - -Reviewers: semenzato@google.com, apronin@google.com, mnissler@google.com and -others - -Last Updated: 2018-11-01 - -[TOC] - -## Objective - -Increase security for Fingerprint (FP) templates by using a TPM-sourced seed in -addition to internal FPMCU entropy while encrypting FP templates. The -TPM-sourced seed will be derived from the system key which is loaded from the -TPM during boot in mount-encrypted. - -## Background - -Fingerprint authorization in Chrome OS, relies on encrypted FP templates which -are stored in each user’s mount directory. These templates are created and -encrypted by the FPMCU during FP enrollment, before being sent back to the AP -(Application Processor). When the user logs in, these templates are sent to the -FPMCU where they get decrypted and loaded. - -The encryption is performed in the FPMCU using entropy which is internal to the -MCU and never leaves the MCU. That way, even if the templates are somehow -obtained by and attacker from the user mount directory, they cannot be -decrypted, since the attacker will not have access to the MCU entropy. This -entropy gets reset on every powerwash/recovery. - -The complete design doc is [Fingerprint Authentication on Chrome OS]. - -## Requirements and Scale - -The solution proposed should exhibit the following attributes: - -* Strengthens security of FP templates. -* Does not compromise the security of other sub-systems. -* Works fast and doesn’t affect time to boot, or reduce boot-time stability. - -## Design Ideas - -In addition to FPMCU entropy, we include a TPM-sourced seed (derived from the -system key) while performing template encryption. The TPM system key gets -regenerated during powerwash/recovery, so in the event that the FP templates are -accessed due to a runtime exploit, a power-wash / recovery from the user will -ensure: - -* The raw templates cannot be decrypted, since the TPM-seed would have been - lost irrevocably. -* Since a new TPM-seed is generated (since a new system key is created), old - templates can’t be re-used, even if the attacker could somehow gain access - to the FP MCU entropy. - -The overall design consists of two components: - -* Generating a TPM-seed and sending it to the Biometric sensor managers. -* The Bio sensor managers sending the seed to the FPMCU and programming it - into the encryption / decryption operations of FP templates. - -### TPM seed generation {#seed-generation} - -![TPM Seed Diagram] - -The TPM seed generation would proceed as follows: - -1. During mount-encrypted execution, after the `System_key` is loaded, the - TPM-backed system key will be HMAC-ed with a simple salt (the string - `biod`): - - ``` - TPM_Seed = HMAC_SHA256(System_key, "biod") - ``` - -2. The resulting 256-bit seed (called `TPM_Seed`) will be maintained in a - `brillo::SecureBlob`. - -3. The `TPM_seed` will be saved into a tmpfs file - (`/run/biod_crypto_init/seed`) for consumption by `bio_crypto_init`. This - file's ownership will be set up such that only user/group `biod` can access - it. - -4. `bio_crypto_init` (the binary which sends the seed to the FPMCU) will be - spawned after mount-encrypted completes. This is ensured by setting the - `bio_crypto_init` upstart rules to depend on `starting boot-services` - -5. On the `bio_crypto_init` side, the `TPM_seed` will be retrieved from the - tmpfs file and forwarded to the FP MCU via the various BiometricManagers. - Immediately after reading from the tmpfs file, `bio_crypto_init` will nuke - (write all 0’s and then delete) the tmpfs file. - -6. The upstart rules of biod will be modified such that it will start after - `bio_crypto_init` stops (this modification can be made in the `.conf` file - of biod) - -#### IPC Mechanism {#ipc} - -(For a discussion of various alternatives, please see the -[Alternatives Considered] section) - -The IPC mechanism selected should have the following features: - -* Allow to quickly pass the `TPM_seed` between mount-encrypted and - `bio_crypto_init`. -* Minimize the presence of extra/asynchronously deleted copies of the - `TPM_seed` buffer in kernel and memory. This is crucial to minimize the risk - of access to this seed. - -The currently proposed method of passing the `TPM_seed` is to use a **file in -tmpfs**. The sequence would be as follows: - -* mount-encrypted will write the `TPM_Seed` to a file in `/run` - (`/run/bio_crypto_init/seed`). `/run` is a tmpfs created by the OS for use - by various system services. -* `bio_crypto_init` will read the `TPM_Seed` from the known tmpfs file. -* As soon as `bio_crypto_init` reads the `TPM_Seed`, it will first overwrite - (`/run/biod_crypto_init/seed`) with all 0s, and immediately after will - delete `/run/biod_crypto_init/seed`. -* `bio_crypto_init` can then instantiate its BiometricManager classes and send - the data to the FP MCU. This way, even if the sending of data fails, there - will not be any stray copy of the `TPM_seed` in a process’s memory, or in - tmpfs. - -##### Advantages - -* No/minimal buffering of copies of `TPM_Seed` in kernel. -* No need to create and pass FDs between mount-encrypted and - `bio_crypto_init`. - -##### Disadvantages - -* If `bio_crypto_init` crashes / fails to start, the tmpfs file remains in the - system, i.e cleanup of tmpfs is reliant on `bio_crypto_init`. - -### Programming TPM_Seed into MCU - -#### Entropy addition v/s programming TPM Seed - -When a device boots up for the first time after going through -recovery/powerwash, biod will force an "Add Entropy" step. This involves: - -* rebooting the FP MCU to RO -* Performing an entropy addition step -* Rebooting the FP MCU to RW -* Verifying that the entropy addition has taken place (by checking the block - ID of the rollback info on the MCU). - -Unfortunately, since the `TPM_Seed` will be stored in MCU RAM, the reboot of the -FPMCU will lead to the `TPM_Seed` being lost until the next boot. In the absence -of a `TPM_Seed`, all FPMCU operations will fail (until the next boot). There is -no opportunity to reprogram the `TPM_Seed`, because that must take place during -mount-encrypted, which must necessarily run before `biod` starts. - -There are two proposals to work around this issue. The one eventually selected -has been included here, and the other alternative has been placed in the -[Alternatives Considered] section. - -##### Make bio_crypto_init solely set the TPM_Seed (don't perform entropy_add) - -In this method, `bio_crypto_init` will not perform any reboot on the MCU, and -solely program the `TPM_Seed`. This would mean that if a device was to boot for -a first time without having done any previous powerwash/recovery, the first boot -would not have FP functionality. FP functionality would be regained on all -subsequent boot (since the entropy would have been added/initialized by then). - -The downside of this approach is a poor user experience. - -The benefit is a simple implementation of the `bio_crypto_init` tool, which will -consequently also take less time to execute (booting to RO/RW are time consuming -operations). - -In practice all devices leaving the factory floor would have `bio_wash ---factory_init` done on them during finalisation to initialise the entropy, and -so this shouldn't affect a large majority of end users. - -### Signaling biod to start - -In order to avoid races which might occur because both `bio_crypto_init` and -`biod` will try to access the `BiometricManagers`' hardware. We need to ensure -that `biod` only starts after `bio_crypto_init` ends. - -To accomplish this, `biod.conf` will be modified to include a dependency on -`bio_crypto_init` to start the daemon. So, the relevant portion of `biod.conf` -will now be: - -``` -start on started system-services and started uinput and stopped bio_crypto_init -``` - -### Formula to calculate IKM used for encryption in MCU - -In the FPMCU we will use the concatenation of `TPM_Seed` and [`SBP_Src_Key`] as -Input Key Material (IKM) to derive an encryption key. Combined with a random -salt, the pseudo random key (PRK) would be derived as: - -``` -PRK = HMAC_SHA256(Random_Salt, SBP_Src_Key || TPM_Seed) -``` - -## Alternatives Considered {#alt-considered} - -A few alternatives are being considered for the IPC Mechanism - -#### pipe/socketpair - -##### Disadvantages - -* The data written to pipes is buffered in internal kernel buffers till it is - read out from the other end of the pipe/socketpair. In the case of a - `bio_crypto_init` crashing, this will leave a copy in the internal kernel - buffers. Question: How long before those internal buffers get cleared in the - case of the pipe not being read from? - -#### Anonymous file (memfd_create) / Anonymous mmap - -##### Disadvantages - -* Question: When all references to the anonymous file are dropped, are the - contents of the anonymous file re-allocated, overwritten, or is the - corresponding inode simply destroyed (and the data blocks still stick around - and are reallocated lazily ?) - -There was also another alternative considered for the sequence of programming -the TPM seed and initializing the FPMCU: make `bio_crypto_init` add entropy and -then set TPM. - -## Security Considerations - -### Security boundaries - -* A new minijailed process (`bio_crypto_init`) is run when `starting - boot-services` is signaled. -* An IPC takes place between mount-encrypted and `bio_crypto_init` via a tmpfs - file. The reading and deletion of the tmpfs file is detailed in the - [IPC Mechanism] section. - -### Privileges - -* `bio_crypto_init` runs minijail-ed and runs with user/group `biod`. Only the - files required for its functioning (i.e., the tmpfs file `/run/`, the - devnode to access the FPMCU, log directory inside - `/var/log/bio_crypto_init`) are mounted and visible inside the sandbox. See - the [minijail0 arguments] for a full explanation. - -### Untrusted input - -* The only input is the `System_key` which is retrieved from the TPM anyway - during mount-encrypted execution. Thus, no additional or new input is being - fed to the feature. -* Additionally, the derived TPM-seed is saved in a tmpfs file which has a - user/group ownership as `biod` so only users `root` or `biod` can access the - file. Since `bio_crypto_init` runs only during `starting boot-services` and - the process along with the conf file ensures that the file is deleted after - execution, there is no additional threat of the `/tmp` file being corrupted. - -### Sensitive data - -* The feature involves the storage of a `TPM_Seed` derived from the - `System_key` from TPM, in a file on tmpfs (the file is zeroed and deleted - once read by `bio_crypto_init`). - -### Attack surface - -* In the event of the contents of the tmp file being read, the `TPM_Seed` - would not be of much use to the attacker, since the use of `HMAC_SHA256` - means the attacker would still not have access to the system key (brute - force trial of HMAC 256 would be required to guess the system salt required - to produce the TPM-seed). -* In the unlikely event of the contents of the tmp file being modified before - they are programmed into the FPMCU, FP unlock would fail (since the - encrypted templates would not longer be decrypted correctly, since the FPMCU - encryption key would have changed). The FP templates encryption key is a - combination of both the `TPM_seed` as well as the internal `SBP_Src_Key` - combined with a random salt, and since only the encrypted templates are - stored on the rootfs, the templates would simply be rendered useless. A - powerwash/recovery can help restore functionality of FP unlock, but new - templates would have to be registered. -* This code should not be accessible to remote attackers. - -### Implementation robustness - -* `bio_crypto_init` uses two processes. A child process is spawned by - `bio_crypto_init` and the FPMCU programming is done on the child process. - The parent process waits for the child process to complete, or kills the - process if it exceeds a timeout limit. This ensures that the process doesn't - hang indefinitely. -* The feature uses tmpfs (`/run/bio_crypto_init/seed`) as an IPC mechanism to - transfer the `TPM_Seed` between mount-encrypted and `bio_crypto_init`. - Please see the [Alternatives Considered] and [Design Ideas] section - regarding rationale behind choosing tmpfs vis a vis socketpair/pipe. - -### Cryptography - -* `HMAC_SHA256` is used to derived `TPM_Seed` from the `System_key` as - described in section [TPM seed generation]. - -* `HMAC_SHA256` is also used to derive the FPMCU’s encryption key. This is the - same as it was earlier; the only change is that source key has been updated - to also include the `TPM_Seed`. - -## Privacy Considerations - -This implementation should not have any adverse implications on Privacy (over -and above existing functionality on Chrome OS). This provides security hardening -for the fingerprint templates to prevent their retrieval and mis-use. - -[Fingerprint Authentication on Chrome OS]: ../fingerprint/fingerprint-authentication-design-doc.md -[`SBP_Src_Key`]: ../fingerprint/fingerprint-authentication-design-doc.md#sbp-secret-generation -[IPC Mechanism]: #ipc -[minijail0 arguments]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform2/biod/init/bio_crypto_init.conf;l=36;drc=1fcefaa166e868069ad1b81091333ff75e0657f6 -[Design Ideas]: #design-ideas -[TPM seed generation]: #seed-generation -[Alternatives Considered]: #alt-considered - -<!-- 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/1d0ocdnEjsO26c3usP1FwgTZ7VwEr-4ydnC0WMhOnbLY --> - -[TPM Seed Diagram]: ../images/cros_fingerprint_tpm_seed.png diff --git a/docs/fingerprint/fingerprint.md b/docs/fingerprint/fingerprint.md deleted file mode 100644 index 39785f5afb..0000000000 --- a/docs/fingerprint/fingerprint.md +++ /dev/null @@ -1,590 +0,0 @@ -# Fingerprint Firmware (FPMCU) - -[TOC] - -<!-- mdformat off(b/139308852) --> -*** note -NOTE: The build commands assume you are in the `~/trunk/src/platform/ec` -directory inside the chroot. -*** -<!-- mdformat on --> - -<!-- mdformat off(b/139308852) --> -*** note -WARNING: When switching branches in the EC codebase, you probably want to nuke -the `build` directory or at least the board you're working on: `rm -rf -build/<board>` or `make clobber` to prevent compilation errors. -*** -<!-- mdformat on --> - -## Software - -The main source code for fingerprint sensor functionality lives in the -[`common/fpsensor`] directory. The driver code for specific sensors lives in the -[`driver/fingerprint`] directory. - -## Hardware {#hardware} - -The following "boards" (specified by the `BOARD` environment variable when -building the EC code) are for fingerprint: - -MCU | Sensor | Firmware (EC "board") | Dev Board | Nucleo Board ----------------------- | ---------- | ---------------------------------------------- | -------------------------------------------- | ------------ -[STM32H743] \(Cortex-M7) | [FPC 1145] | `dartmonkey`<br>(aka `nocturne_fp`, `nami_fp`) | [Icetower v0.2] <br>(Previously Dragontalon) | [Nucleo H743ZI2] -[STM32F412] \(Cortex-M4) | [FPC 1025] | `bloonchipper`<br>(aka `hatch_fp`) | [Dragonclaw v0.2] | [Nucleo F412ZG] - -### Sensor Template Sizes - -Sensor | Fingerprint Template Size ----------- | -------------------------------- -[FPC 1145] | [~48 KB][FPC 1145 Template Size] -[FPC 1025] | [~5 KB][FPC 1025 Template Size] - -### Determining Hardware {#chromeos-config-fingerprint} - -If you have access to a shell on your Chromebook, you can use [Chrome OS Config] -to determine the FPMCU that it contains: - -```bash -(dut) $ cros_config /fingerprint board -``` - -Alternatively, if you have a Chromium OS build, you can use [Chrome OS Config] -in the chroot to determine the FPMCU: - -```bash -(chroot) $ cros_config_host -c /build/<BOARD>/usr/share/chromeos-config/yaml/config.yaml -m <MODEL> get /fingerprint board -``` - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: If you get an empty response when running these commands, the -[Chrome OS Config] properties for fingerprint may not have been set up yet. See -the [section on updating Chrome OS Config](#update-chromeos-config). -*** -<!-- mdformat on --> - -## Building FPMCU Firmware Locally - -### See `Makefile` target options - -```bash -(chroot) ~/trunk/src/platform/ec $ make help -``` - -### Build - -Replace `<BOARD_NAME>` in the command below with the fingerprint MCU that you -are targeting (e.g., `nocturne_fp`, `dartmonkey`, `bloonchipper`). - -```bash -(chroot) ~/trunk/src/platform/ec $ make BOARD=<BOARD_NAME> -j -``` - -### Verbose Build output - -Use `V=1` to see the complete compiler output (all flags). - -```bash -(chroot) ~/trunk/src/platform/ec $ make V=1 BOARD=nocturne_fp -j -``` - -## Building all EC firmware (before "repo upload") - -Before uploading a change to Gerrit via `repo upload`, you'll need to build -*all* the boards in the EC codebase to make sure your changes do not break any -others. - -<!-- mdformat off(b/139308852) --> -*** note -NOTE: If you forget to do this, do not worry. `repo upload` will warn you and -prevent you from uploading. -*** -<!-- mdformat on --> - -```bash -(chroot) ~/trunk/src/platform/ec $ make buildall -j -``` - -## Building and running unit tests - -See the [Unit Tests] documentation for details on how to [run the unit tests]. - -## Build ectool - -```bash -(chroot) ~/trunk/src/platform/ec $ make BOARD=nocturne_fp utils-host -j -``` - -## Build and run the `host_command` fuzz test - -```bash -(chroot) ~/trunk/src/platform/ec $ make run-host_command_fuzz -``` - -## Logs - -[`timberslide`] is a simple daemon that collects logs from the FPMCU and writes -them to disk. [`timberslide`] reads from sysfs, where the kernel driver -[periodically dumps the FPMCU console output][cros_ec_debugfs]. [`timberslide`] -writes the resulting logs to `/var/log/cros_fp.log`. There are multiple -instances of [`timberslide`] that run; one for each MCU running the EC codebase. - -### Starting timberslide - -```bash -(dut)$ start timberslide LOG_PATH=/sys/kernel/debug/cros_fp/console_log -``` - -### Stopping timberslide - -```bash -(dut)$ stop timberslide LOG_PATH=/sys/kernel/debug/cros_fp/console_log -``` - -### Manually running timberslide - -```bash -(dut)$ timberslide --device_log=/sys/kernel/debug/cros_fp/console_log -``` - -### Reading logs from kernel - -If [`timberslide`] is not running you can just `cat` the logs directly from the -kernel: - -```bash -(dut)$ cat /sys/kernel/debug/cros_fp/console_log -``` - -## Production Updates (Auto-Update) - -### `fp_updater.sh` and `bio_fw_updater` - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: The auto-update process requires a working version of the firmware -running on the FPMCU. See [Fingerprint Factory Requirements] for details on -flashing in the factory. -*** -<!-- mdformat on --> - -[`fp_updater.sh`] and [`bio_fw_updater`] are wrappers around [`flashrom`] and -require already-functioning RO firmware running on the FPMCU. It’s meant to be -used in production to update the RW firmware. `fp_updater.sh` was used prior to -M77; `bio_fw_updater` replaces it. - -It's also possible to use the updater to update the RO firmware if you disable -*both* HW and SW write protect, which we use for updating development devices -that do not have write protect enabled (dogfood devices, EVT, etc.) - -In production, only the RW portion of the firmware can be updated (unless the -user disables [hardware write protection]). - -## Factory / RMA / Development Updates {#factory-rma-dev-updates} - -### `flash_fp_mcu` - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: This tool is really just for us to use during development or during -the RMA flow (must go through finalization again in that case). We never update -RO in the field (can’t by design). See [Fingerprint Factory Requirements] for -details on flashing in the factory. -*** -<!-- mdformat on --> - -[`flash_fp_mcu`] enables spidev and toggles some GPIOs to put the FPMCU (STM32) -into bootloader mode. At that point it uses [`stm32mon`] to rewrite the entire -flash (both RO and RW). The FPMCU can only be put into bootloader mode when -[hardware write protection] is disabled, which means [`flash_fp_mcu`] can only -be used when [hardware write protection] is disabled. - -[`flash_fp_mcu`] is available in the [Chromium OS test image]. - -### `stm32mon` - -[`stm32mon`] is a tool used to send commands to the STM32 bootloader. We use it -for development (through [`flash_fp_mcu`]) to erase and flash the entire chip. - -[`stm32mon`] is available in the [Chromium OS test image]. - -## Keys - -The `RO` section of the fingerprint firmware contains the public portion of the -key used to sign the RW firmware. The RO firmware uses the public key to -validate the signature of the RW firmware before jumping to it. It is not -possible to update the public key stored in the RO firmware once a device has -been shipped (i.e., once [hardware write protection] is enabled). - -Different keys are used to sign the firmware during development and production. -The `dev` key is used for local builds and development and is not private; it is -called `dev_key.pem` and located in the "board" directory for the given FPMCU -(e.g., [`board/nocturne_fp/dev_key.pem`]). After doing a build, the `ec.bin` in -the `build` directory (e.g., `build/nocturne_fp/ec.bin`) will be signed with the -`dev` key. - -The two other types of keys are `premp` and `mp`, which stand for "pre-mass -production" and "mass production", respectively. Both the `premp` and `mp` keys -are only available to the buildbots as part of the official build. The `premp` -is typically used during bringup of new hardware to validate the signing flow of -the buildbots, while the `mp` key is used for PVT and production devices. - -Switching keys is only possible when the `RO` firmware is not write protected, -since the public portion of the keypair is stored in the `RO` firmware. - -### Generate Key - -For testing, you can generate a new key by using the following openssl command: - -```bash -openssl genrsa -3 -out board/$BOARD/dev_key.pem 3072 -``` - -### Resources - -* https://sites.google.com/a/google.com/chromeos/resources/engineering/releng/signer-documentation -* https://sites.google.com/a/google.com/chromeos/paygen---payload -* https://b.corp.google.com/issues/77882970 - -## Signing - -[`futility`] is used to sign EC firmware. There’s a wrapper script around it for -signing called [`sign_official_build.sh`]. - -### Key ID - -The output of `futility show` will show a `Public Key File` and `Signature` -section, each of which have an `ID` field. This ID lets you match the key to the -signature in case there is more than one. -[It’s just a sha1sum of the public key,][vboot_key_id] so it lets you -[uniquely identify the key being used][vb2_public_key]. - -If you have the key (e.g., in PEM format), you can compute the `ID` with the -`futility show` command: - -```bash -(chroot) $ futility show ./path/to/key.pem -``` - -#### Example - -If you are building the `hatch_fp` "board" on your local machine (which signs -the resulting `ec.bin` with the `dev` key, you can check the `ID` with: - -```bash -(chroot)$ futility show board/hatch_fp/dev_key.pem -``` - -``` -Private Key file: board/hatch_fp/dev_key.pem - Key length: 3072 - Key sha1sum: 61382804da86b4156d666cc9a976088f8b647d44 -``` - -```bash -(chroot)$ futility show build/hatch_fp/ec.bin -``` - -``` -Public Key file: build/hatch_fp/ec.bin - Vboot API: 2.1 - Desc: "" - Signature Algorithm: 7 RSA3072EXP3 - Hash Algorithm: 2 SHA256 - Version: 0x00000001 - ID: 61382804da86b4156d666cc9a976088f8b647d44 -Signature: build/hatch_fp/ec.bin - Vboot API: 2.1 - Desc: "" - Signature Algorithm: 7 RSA3072EXP3 - Hash Algorithm: 2 SHA256 - Total size: 0x1b8 (440) - ID: 61382804da86b4156d666cc9a976088f8b647d44 - Data size: 0x2864c (165452) -Signature verification succeeded. -``` - -### Showing Key ID (fingerprint) for running FW - -[Asked on chromeos-chatty-firmware][chatty-firmware-q] about adding an EC -command to show the Key ID (fingerprint) from the RO version. This would make it -a lot easier during both development and testing. - -## Power - -See [Measuring Power] for instructions on how to measure power with the -fingerprint development boards. - -### Dragonclaw v0.2 - -```bash -(chroot) $ dut-control -t 60 pp3300_dx_mcu_mv pp3300_dx_fp_mv pp1800_dx_fp_mv pp3300_dx_mcu_mw pp3300_dx_fp_mw pp1800_dx_fp_mw -``` - -**Firmware Version**: -`bloonchipper_v2.0.4277-9f652bb3-RO_v2.0.7314-3dfc5ff6-RW.bin` - -#### MCU is idle - -``` -(chroot) $ dut-control fpmcu_slp_alt:off -``` - -``` -@@ NAME COUNT AVERAGE STDDEV MAX MIN -@@ sample_msecs 113 533.56 40.91 658.52 447.06 -@@ pp1800_dx_fp_mv 113 1800.00 0.00 1800.00 1800.00 -@@ pp1800_dx_fp_mw 113 0.00 0.00 0.00 0.00 -@@ pp3300_dx_fp_mv 113 3280.00 0.00 3280.00 3280.00 -@@ pp3300_dx_fp_mw 113 0.01 0.05 0.26 0.00 -@@ pp3300_dx_mcu_mv 113 3280.00 0.00 3280.00 3280.00 -@@ pp3300_dx_mcu_mw 113 24.67 0.00 24.67 24.67 -``` - -#### MCU in low power mode (suspend) - -``` -(chroot) $ dut-control fpmcu_slp_alt:on -``` - -``` -@@ NAME COUNT AVERAGE STDDEV MAX MIN -@@ sample_msecs 115 526.56 36.79 607.60 426.58 -@@ pp1800_dx_fp_mv 115 1800.00 0.00 1800.00 1800.00 -@@ pp1800_dx_fp_mw 115 0.00 0.00 0.00 0.00 -@@ pp3300_dx_fp_mv 115 3287.30 2.25 3288.00 3280.00 -@@ pp3300_dx_fp_mw 115 0.00 0.02 0.26 0.00 -@@ pp3300_dx_mcu_mv 115 3280.97 2.62 3288.00 3280.00 -@@ pp3300_dx_mcu_mw 115 4.02 0.64 10.76 3.94 -``` - -### Icetower v0.1 - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: Icetower v0.1 has a hardware bug in the INA connections, so you cannot -measure the 1.8V fingerprint sensor rail. See http://b/178098140. - -Additionally, before https://crrev.com/c/2689101, the sleep GPIOs were not -configured correctly, so the change needs to be cherry-picked in order to -measure releases before that point. -*** -<!-- mdformat on --> - -```bash -(chroot) $ dut-control -t 60 pp3300_dx_mcu_mv pp3300_dx_fp_mv pp3300_dx_mcu_mw pp3300_dx_fp_mw -``` - -**Firmware Version**: -`dartmonkey_v2.0.2887-311310808-RO_v2.0.7304-441100b93-RW.bin` - -#### MCU is idle - -``` -(chroot) $ dut-control fpmcu_slp_alt:off -``` - -``` -@@ NAME COUNT AVERAGE STDDEV MAX MIN -@@ sample_msecs 178 337.13 20.91 404.32 289.82 -@@ pp3300_dx_fp_mv 178 3256.00 0.00 3256.00 3256.00 -@@ pp3300_dx_fp_mw 178 0.00 0.00 0.00 0.00 -@@ pp3300_dx_mcu_mv 178 3248.00 0.00 3248.00 3248.00 -@@ pp3300_dx_mcu_mw 178 45.17 0.09 45.21 44.95 -``` - -#### MCU in low power mode (suspend) - -``` -(chroot) $ dut-control fpmcu_slp_alt:on -``` - -``` -@@ NAME COUNT AVERAGE STDDEV MAX MIN -@@ sample_msecs 174 345.60 31.93 457.62 283.00 -@@ pp3300_dx_fp_mv 174 3264.00 0.00 3264.00 3264.00 -@@ pp3300_dx_fp_mw 174 0.00 0.00 0.00 0.00 -@@ pp3300_dx_mcu_mv 174 3260.69 3.94 3264.00 3256.00 -@@ pp3300_dx_mcu_mw 174 5.47 0.10 5.48 4.17 -``` - -## Chrome OS Build (portage / ebuild) - -In order to use the fingerprint sensor with a given [Chrome OS board], a few -things need to be configured for the [Chrome OS board]. - -### Enable biod USE flag - -The biod [`USE` flag] needs to be enabled for the [Chrome OS board]. This `USE` -flag -[determines whether the `biod` daemon is built and installed][biod chromium-os]. - -To enable the `USE` flag, update the `make.defaults` for the [Chrome OS board]. -See the [`make.defaults` for the Hatch board][hatch make.defaults] as an -example. - -#### Verifying biod is installed in the rootfs - -After enabling the `biod` [`USE` flag] and building the `biod` package for your -target [Chrome OS board], the `biod` binary should be in the build directory: - -```bash -(chroot) $ emerge-<BOARD> biod -``` - -```bash -(chroot) $ ls /build/<BOARD>/usr/bin/biod -/build/<BOARD>/usr/bin/biod -``` - -### Update FPMCU_FIRMWARE - -`FPMCU_FIRMWARE` should be set to the set of fingerprint firmware that should be -built and installed for the [Chrome OS board]. - -`FPMCU_FIRMWARE` is a [`USE_EXPAND` variable][`USE` flag], -[defined in the base `make.defaults`][FPMCU_FIRMWARE make.defaults]. - -The `biod` ebuild uses the resulting [`USE` flags] to -[determine which FPMCU release firmware to build][biod release firmware] and the -[`chromeos-firmware-fpmcu` ebuild] uses the resulting [`USE` flags] to -[determine which firmware to install][firmware ebuild] to the rootfs in -`/opt/google/biod/fw`. - -Possible values for `FPMCU_FIRMWARE` can be found by looking at the -`FIRMWARE_EC_BOARD` values in the [`chromeos-fpmcu-release*` ebuilds], which -correspond to the [FPMCU hardware](#hardware). - -See the [Hatch baseboard `make.defaults`] for an example. - -#### Verifying FPMCU firmware is installed in the rootfs - -Once you have added the `FPMCU_FIRMWARE` flag and rebuilt the -[`chromeos-firmware-fpmcu` ebuild], the firmware will show up in the the chroot: - -<!-- mdformat off(b/139308852) --> -*** note -**NOTE**: This requires access to the [internal manifest]. -*** -<!-- mdformat on --> - -```bash -(chroot) $ emerge-<BOARD> chromeos-firmware-fpmcu -``` - -```bash -(chroot) $ ls /build/<BOARD>/opt/google/biod/fw -bloonchipper_v2.0.2626-3c315108.bin dartmonkey_v2.0.2887-311310808.bin -``` - -The above output assumes you selected the `bloonchipper` and `dartmonkey` -firmware by setting `FPMCU_FIRMWARE="bloonchipper dartmonkey"`. The actual -version numbers displayed will not necessarily match since the firmware is -constantly updated. - -### Update Chrome OS Config {#update-chromeos-config} - -With "unibuild", the same OS image (build) for a given [Chrome OS board] is used -across multiple devices. Often there will be some devices that have a -fingerprint sensor, some that do not, and even different sensors for the same -board. - -Determining what fingerprint hardware is on a given [Chrome OS board] is thus -done at runtime, using [Chrome OS Config]. - -The `fingerprint` config needs to be in the `model.yaml` for the given -[Chrome OS board]. The [Chrome OS Config fingerprint] section describes the -attributes for the `fingerprint` config in more detail. - -The [`ec_extras` attribute] needs to be set to the list of fingerprint firmware -that should be built as part of the build. - -See the [`model.yaml` for the Hatch board][hatch model.yaml] as an example. - -Instead of crafting the `model.yaml` by hand, newer boards are moving to the -[Chrome OS Project Configuration] model, where the config is generated using -[Starlark]. The common [`create_fingerprint`] function can be used across models -to configure the fingerprint settings. See the [Morphius `config.star`] for an -example of how to call `create_fingerprint`. After you modify a `config.star` -file you will need to [regenerate the config]. If you need to change many -projects (e.g., modifying [`create_fingerprint`]), you can use the [`CLFactory`] -tool. - -Once you have updated the config, you can test your changes by -[running `cros_config`](#chromeos-config-fingerprint). The Chrome OS Config -documentation has a [section on testing properties] that describes this in more -detail. - -### SKUs - -The fingerprint sensor may only be included on certain SKUs for a given device. -The fingerprint code uses [Chrome OS Config] to determine whether a device has a -fingerprint sensor or not. For each SKU, there is an associated -[fingerprint config][Chrome OS Config fingerprint]. [Chrome OS Config] -determines the [SKU information][Chrome OS Config SKU] (and thus the -[fingerprint config][Chrome OS Config fingerprint]) from [CBI Info]. The SKU for -a given device can be found by viewing `chrome://system/#platform_identity_sku`. - -[`common/fpsensor`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/common/fpsensor/ -[`driver/fingerprint`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/driver/fingerprint -[`nocturne_fp`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/board/nocturne_fp/ -[`nami_fp`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/board/nami_fp/ -[`hatch_fp`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/board/hatch_fp/ -[`bloonchipper`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/board/bloonchipper/ -[`dartmonkey`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/board/dartmonkey/ -[hardware write protection]: ../write_protection.md -[`flash_fp_mcu`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/util/flash_fp_mcu -[`stm32mon`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/e1f3f89e7ea7945adddd0c2e6838f5e59856cff2/util/stm32mon.c#14 -[`futility`]: https://chromium.googlesource.com/chromiumos/platform/vboot_reference/+/HEAD/futility/ -[`sign_official_build.sh`]: https://chromium.googlesource.com/chromiumos/platform/vboot_reference/+/HEAD/scripts/image_signing/sign_official_build.sh -[vboot_key_id]: https://chromium.googlesource.com/chromiumos/platform/vboot_reference/+/e7db36856ce418552637d1981c173d22dfe5bf39/firmware/2lib/include/2id.h#5 -[vb2_public_key]: https://chromium.googlesource.com/chromiumos/platform/vboot_reference/+/e7db36856ce418552637d1981c173d22dfe5bf39/firmware/2lib/include/2rsa.h#14 -[chatty-firmware-q]: https://groups.google.com/a/google.com/d/msg/chromeos-chatty-firmware/ZSg423wsFPg/26UbdGwjFQAJ -[`fp_updater.sh`]: http://go/cros-fp-updater-nocturne-source -[`bio_fw_updater`]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/biod/tools -[`flashrom`]: https://chromium.googlesource.com/chromiumos/third_party/flashrom/ -[STM32F412]: https://www.st.com/resource/en/reference_manual/dm00180369.pdf -[STM32H743]: https://www.st.com/resource/en/reference_manual/dm00314099.pdf -[`board/nocturne_fp/dev_key.pem`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/board/nocturne_fp/dev_key.pem -[`timberslide`]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/timberslide -[cros_ec_debugfs]: https://chromium.googlesource.com/chromiumos/third_party/kernel/+/9db44685934a2e4bc9180ea2de87a6c429672395/drivers/platform/chrome/cros_ec_debugfs.c -[Fingerprint Factory Requirements]: ./fingerprint-factory-requirements.md -[Chromium OS test image]: https://chromium.googlesource.com/chromiumos/platform/factory/+/HEAD/README.md#building-test-image -[Chrome OS Config]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/chromeos-config/README.md -[Chrome OS Config fingerprint]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/chromeos-config/README.md#fingerprint -[section on testing properties]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/chromeos-config/README.md#adding-and-testing-new-properties -[Chrome OS board]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#Select-a-board -[biod chromium-os]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/4ea72b588af3394cb9fd1c330dcf726472183dfd/virtual/target-chromium-os/target-chromium-os-1.ebuild#154 -[hatch make.defaults]: https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/2f075f0e7ce09d3eb460f3c529da463a6201276c/overlay-hatch/profiles/base/make.defaults#22 -[Hatch baseboard `make.defaults`]: https://chrome-internal.googlesource.com/chromeos/overlays/baseboard-hatch-private/+/HEAD/profiles/base/make.defaults#17 -[hatch model.yaml]: https://chrome-internal.googlesource.com/chromeos/overlays/overlay-hatch-private/+/HEAD/chromeos-base/chromeos-config-bsp-hatch-private/files/model.yaml -[`ec_extras` attribute]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/chromeos-config/README.md#build_targets -[FPMCU_FIRMWARE make.defaults]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/4ea72b588af3394cb9fd1c330dcf726472183dfd/profiles/base/make.defaults#157 -[`USE` flag]: https://devmanual.gentoo.org/general-concepts/use-flags/index.html -[`USE` flags]: https://devmanual.gentoo.org/general-concepts/use-flags/index.html -[biod release firmware]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/4ea72b588af3394cb9fd1c330dcf726472183dfd/chromeos-base/biod/biod-9999.ebuild#49 -[`chromeos-firmware-fpmcu` ebuild]: https://chrome-internal.googlesource.com/chromeos/overlays/chromeos-overlay/+/HEAD/chromeos-base/chromeos-firmware-fpmcu/chromeos-firmware-fpmcu-9999.ebuild -[firmware ebuild]: https://chrome-internal.googlesource.com/chromeos/overlays/chromeos-overlay/+/HEAD/chromeos-base/chromeos-firmware-fpmcu/chromeos-firmware-fpmcu-9999.ebuild#40 -[`chromeos-fpmcu-release*` ebuilds]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/HEAD/sys-firmware -[internal manifest]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#get-the-source-code -[Unit Tests]: ../unit_tests.md -[run the unit tests]: ../unit_tests.md#running -[Measuring Power]: ./fingerprint-dev-for-partners.md#measure-power -[dragonclaw]: ./fingerprint-dev-for-partners.md#fpmcu-dev-board -[FPC 1145]: ../../driver/fingerprint/fpc/libfp/fpc1145_private.h -[FPC 1025]: ../../driver/fingerprint/fpc/bep/fpc1025_private.h -[FPC 1145 Template Size]: https://chromium.googlesource.com/chromiumos/platform/ec/+/127521b109be8aac352e80e319e46ed123360408/driver/fingerprint/fpc/libfp/fpc1145_private.h#46 -[FPC 1025 Template Size]: https://chromium.googlesource.com/chromiumos/platform/ec/+/127521b109be8aac352e80e319e46ed123360408/driver/fingerprint/fpc/bep/fpc1025_private.h#44 -[Dragonclaw v0.2]: ./fingerprint-dev-for-partners.md#fpmcu-dev-board -[Icetower v0.2]: ./fingerprint-dev-for-partners.md#fpmcu-dev-board -[Nucleo F412ZG]: https://www.digikey.com/en/products/detail/stmicroelectronics/NUCLEO-F412ZG/6137573 -[Nucleo H743ZI2]: https://www.digikey.com/en/products/detail/stmicroelectronics/NUCLEO-H743ZI2/10130892 -[CBI Info]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/design_docs/cros_board_info.md -[Chrome OS Config SKU]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/chromeos-config/README.md#identity -[Chrome OS Project Configuration]: https://chromium.googlesource.com/chromiumos/config/+/HEAD/README.md -[Starlark]: https://docs.bazel.build/versions/master/skylark/language.html -[`create_fingerprint`]: https://chromium.googlesource.com/chromiumos/config/+/e1fa0d7f56eb3dd6e9378e4326de086ada46b7d3/util/hw_topology.star#444 -[Morphius `config.star`]: https://chrome-internal.googlesource.com/chromeos/project/zork/morphius/+/593b657a776ed6b320c826916adc9cd845faf709/config.star#85 -[regenerate the config]: https://chromium.googlesource.com/chromiumos/config/+/HEAD/README.md#making-configuration-changes-for-your-project -[`CLFactory`]: https://chromium.googlesource.com/chromiumos/config/+/HEAD/README.md#making-bulk-changes-across-repos diff --git a/docs/getting_started_quickly.md b/docs/getting_started_quickly.md deleted file mode 100644 index 325bef39b0..0000000000 --- a/docs/getting_started_quickly.md +++ /dev/null @@ -1,125 +0,0 @@ -# Get Started Building EC Images (Quickly) - -[TOC] - -The -[Chromium OS Developer Guide](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md) -and [README](../README.md) walk through the steps needed to fetch and build -Chromium OS source. These steps can be followed to retrieve and build EC source -as well. On the other hand, if your sole interest is building an EC image, the -general developer guide contains some extra unneeded steps. - -The fastest possible way to build an EC image is to skip the Chromium OS chroot -install entirely. The following steps have been tested on an Ubuntu 15.10 (Wily -Werewolf) 64-bit host machine. Other distros / versions may be used, but -toolchain incompatibilities may require extra debug. - -## Building - -1. Install build / dev tools: - - ```bash - sudo apt-get install git libftdi-dev libusb-dev libncurses5-dev gcc-arm-none-eabi - ``` - -1. Sync the cros-ec git repo: - - ```bash - git clone https://chromium.googlesource.com/chromiumos/platform/ec - ``` - -1. Build your EC image: - - ```bash - HOSTCC=x86_64-linux-gnu-gcc CROSS_COMPILE_arm=arm-none-eabi- make BOARD=${BOARD} - ``` - - Note: the EC supports multiple architectures, check `core/*/build.mk` files - for other supported `CROSS_COMPILE_` variables. - -## External Dependencies - -Most boards are buildable, but some will fail due to dependencies on external -binaries (such as [`futility`](#building-futility)). Also, some related tools -(such as `flash_ec` and `servod`) must be run from the Chromium OS chroot. Here -is a set of steps to setup a minimal development environment to build EC images -from the Chromium OS chroot: - -1. Create a folder for your chroot: - - ```bash - mkdir cros-src; cd cros-src - ``` - -1. Run - - ```bash - repo init -u https://chromium.googlesource.com/chromiumos/manifest -g minilayout,firmware - ``` - -1. Run `repo sync`: - - ```bash - repo sync -j <number of cores on your workstatsion> - ``` - -1. Enter the chroot and enter your password for `sudo` if prompted: - - ```bash - ./chromite/bin/cros_sdk - ``` - -1. Set up your board: - - ```bash - setup_board --board=${BOARD} - ``` - - (ex. `setup_board --board=glados`) - -1. Build EC: - - ```bash - ./build_packages --board=${BOARD} chromeos-ec - ``` - -1. Now, EC images for any board can be built with: - - ```bash - cd ~/trunk/src/platform/ec; make BOARD=${BOARD} -j - ``` - -## Building `futility` outside the chroot {#building-futility} - -If you want to build the `futility` host tool outside the normal Chrome OS -chroot self-contained environment, you can try the following - -1. Install futility build dependencies: - - ```bash - sudo apt-get install uuid-dev liblzma-dev libyaml-dev libssl-dev - ``` - -1. Get the vboot reference sources: - - ```bash - git clone https://chromium.googlesource.com/chromiumos/platform/vboot_reference - ``` - -1. Build it: - - ```bash - cd vboot_reference ; make - ``` - -1. Install it in `/usr/local/bin`: - - ```bash - sudo make install - ``` - -1. Add `/usr/local/bin` to your default `PATH`: - - ```bash - export PATH="${PATH}:/usr/local/bin" - ``` diff --git a/docs/hammer.md b/docs/hammer.md deleted file mode 100644 index 6048f1c441..0000000000 --- a/docs/hammer.md +++ /dev/null @@ -1,199 +0,0 @@ -# Hammer care and feeding - -Original: [go/hammercare](http://go/hammercare) - -Last updated: 2021-03-18 - -[TOC] - -## Servo - -### Start servod - -``` -cros_sdk --no-ns-pid -sudo servod --port=9000 -b hammer -c hammer.xml -``` - -### UART console - -The simplest solution for most people is to use the `dut-console` script. - -First, add this line into your .bashrc (or other shell init script; needed once -only): -``` bash -alias dut-console="~/chromiumos/src/platform/dev/contrib/dut-console" -``` - -Then simply run `dut-console -c ec`. `dut-console` uses `cu` under the hood, and -works like ssh - to leave, press `<ENTER> <~> <.> <ENTER>`. - - -``` bash -src/platform/dev/contrib/dut-console -p 9000 -c ec -``` - -## Build EC - -(Inside chroot) -``` bash -cd ~/trunk/src/platform/ec -make BOARD=<BOARD> -j -``` - -## Flash EC - -### Prerequisites - -#### Find the USB VID:PID of the device - -USB VID:PID is listed in [hammer/variants.h](../board/hammer/variants.h). -Many scripts below requires correct PID to work. - -#### Stop hammerd - -Remove rootfs verification: -``` bash -/usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification --force -``` - -Reboot the DUT then rename hammerd -``` bash -mv /usr/bin/hammerd /usr/bin/hammerd.bak -``` - -### Hammer connected to Chromebook, flash via USB - -(Inside chroot) Copy-paste the script below to a file named -"flash_hammer.usbremote", run -``` bash -bash flash_hammer.usbremote <BOARD> <VID:PID> <IP> [ro] -``` - -``` bash -#!/bin/bash -# flash_hammer.usbremote -set -x -e - -BOARD=$1 -ID=$2 -IP=$3 -EXTRA="-d $ID" - -ssh $IP sh -c "'rm -f /usr/local/ec.bin'" -scp ~/trunk/src/platform/ec/build/${BOARD}/ec.bin $IP:/usr/local/ec.bin - -if [ "$4" = 'ro' ]; then - ssh $IP sh -x -c "'usb_updater2 $EXTRA -j; - sleep 1.0; - usb_updater2 $EXTRA /usr/local/ec.bin; - sleep 0.5; - usb_updater2 $EXTRA -s; - usb_updater2 $EXTRA /usr/local/ec.bin'" -else - ssh $IP sh -x -c "'usb_updater2 $EXTRA -w; - usb_updater2 $EXTRA -r; sleep 0.5; - usb_updater2 $EXTRA -s; - usb_updater2 $EXTRA /usr/local/ec.bin'" -fi -``` - -### Hammer connected to Chromebook, flash via servo - -(Inside chroot) Copy-paste the script below to a file named "flash_hammer", -run `bash flash_hammer <IP> </path/to/ec.bin>` - -``` bash -#!/bin/bash -# Recommended to use a USB 3.0 Ethernet adapter for this to work, otherwise the -# network on the DUT will temporarily go down when the root USB hub is taken -# down. - -set -e -IP=$1 -shift - -# USB 2.0 root hub -USBID="usb1" - -set -x - -# unbind, then rebind, the root hub (in the mean time, we'll start programming) -ssh $IP sh -c "'echo $USBID > /sys/bus/usb/drivers/usb/unbind; sleep 3; echo $USBID > /sys/bus/usb/drivers/usb/bind'" & - -util/flash_ec --board=hammer --port 9000 --image "$@" -``` - -### Hammer connected via servo only - -Do not connect hammer to Chromebook in this case, or at least make sure -Chromebook is either suspended (S3) or off (when put into programming mode, -STM32 always prefers USB interface when available) - -For Servo V2: - -``` bash -dut-control -p 9000 spi1_vref:pp3300 spi1_buf_en:on spi1_buf_on_flex_en:on -util/flash_ec --board=hammer --port=9000 [--image=/path/to/ec.bin] - -# To disable power from servo to Hammer -dut-control -p 9000 spi1_vref:off spi1_buf_en:off spi1_buf_on_flex_en:off -``` - -For Servo Micro (there is only one buffer in the power delivery path, -so don't include the spi1_buf_on_flex_en control): - -``` bash -dut-control -p 9000 spi1_vref:pp3300 spi1_buf_en:on -util/flash_ec --board=hammer --port=9000 [--image=/path/to/ec.bin] - -# To disable power from servo to Hammer -dut-control -p 9000 spi1_vref:off spi1_buf_en:off -``` - -### Hammer connected via POGO-PIN-USB to Linux - -So this is very similar to Hammer connected to poppy, flash via USB, but you -are directly running commands on the machine connected to Hammer, so you don’t -need to SSH to it. - -``` bash -#!/bin/bash -# flash_hammer.usblocal - -EXTRA= -EC=build/${BOARD:-hammer}/ec.bin -UPDATER=usb_updater2 - -if [ -n "$ID" ]; then - EXTRA="-d $ID" -fi - -if [ "$1" = 'ro' ]; then - "${UPDATER}" $EXTRA -j; - sleep 1.0; - "${UPDATER}" $EXTRA "${EC}"; - sleep 1.0; - "${UPDATER}" $EXTRA -s; - "${UPDATER}" $EXTRA "${EC}"; -else - "${UPDATER}" $EXTRA -w; - "${UPDATER}" $EXTRA -r; - sleep 1.0; - "${UPDATER}" $EXTRA -s; - "${UPDATER}" $EXTRA "${EC}"; -fi - -# To use this script: BOARD=<BOARD> ID=<VID:PID> ./flash_hammer.usblocal [ro] -``` - -## Update touchpad firmware - -(Inside DUT) -``` bash -usb_updater2 --tp_update <FILE> --device=<VID:PID> -``` -or -``` bash -ec_touchpad_updater -p <PID> <FILE> -``` diff --git a/docs/i2c-debugging.md b/docs/i2c-debugging.md deleted file mode 100644 index 125e72b777..0000000000 --- a/docs/i2c-debugging.md +++ /dev/null @@ -1,51 +0,0 @@ -# I²C Debugging Tips - -The EC codebase has functionality to help you debug I²C errors without pulling -out the scope. Some of the debug functionality is disabled by default to save -space, but can be enabled with the `CONFIG_I2C_DEBUG` option. - -## Tracing - -You can use the `i2ctrace` command to monitor (ranges of) addresses: - -``` -i2ctrace [list - | disable <id> - | enable <port> <address> - | enable <port> <address-low> <address-high>] -``` - -For example: - -``` -> i2ctrace enable 0 0x10 0x30 -> i2ctrace enable 1 0x20 -> i2ctrace list -id port address --- ---- ------- -0 0 0x10 to 0x30 -1 1 0x40 to 0x50 -... debug spam may follow ... -i2c: 1:0x20 wr 0x10 rd 0x01 0x00 -i2c: 1:0x20 wr 0x10 0x01 0x00 -... -> i2ctrace disable 1 -> i2ctrace list -id port address --- ---- ------- -0 0 0x10 to 0x30 -``` - -A maximum of 8 debug entries are supported at a single time. - -Note that `i2ctrace enable` will merge debug entries when possible: - -``` -> i2ctrace enable 0 0x10 0x30 -> i2ctrace enable 0 0x40 0x50 -> i2ctrace enable 0 0x31 0x3f -> i2ctrace list -id port address --- ---- ------- -0 0 0x10 to 0x50 -``` diff --git a/docs/ide-support.md b/docs/ide-support.md deleted file mode 100644 index cec196be58..0000000000 --- a/docs/ide-support.md +++ /dev/null @@ -1,57 +0,0 @@ -# IDE Support - -[TOC] - -## Odd File Types - -EC uses a few odd file types/names. Some are included from other header files -and used to generate data structures, thus it is important for your IDE to index -them. - -Patterns | Vague Type ------------------------------------------------------ | ---------- -`README.*` | Text -`Makefile.rules`, `Makefile.toolchain` | Makefile -`gpio.wrap` | C Header -`gpio.inc` | C Header -`*.tasklist`, `*.irqlist`, `*.mocklist`, `*.testlist` | C Header - -## IDE Configuration Primitives - -Due to the way most EC code has been structured, you can typically only safely -inspect a configuration for a single image (RO or RW) for a single board. Thus, -you need to specify the specific board/image pair when requesting defines and -includes. - -Command | Description --------------------------------------------- | ------------------------------ -`make print-defines BOARD=$BOARD BLD=RW/RO` | List compiler injected defines -`make print-includes BOARD=$BOARD BLD=RW/RO` | List compiler include paths - -## VSCode - -You can use the `ide-config.sh` tool to generate a VSCode configuration that -includes selectable sub-configurations for every board/image pair. - -1. From the root `ec` directory, do the following: - - ```bash - mkdir -p .vscode - ./util/ide-config.sh vscode all:RW all:RO | tee .vscode/c_cpp_properties.json - ``` - -2. Open VSCode and navigate to some C source file. - -3. Run `C/C++ Reset IntelliSense Database` from the `Ctrl-Shift-P` menu - -4. Select the config in the bottom right, next to the `Select Language Mode`. - You will only see this option when a C/C++ file is open. Additionally, you - can select a configuration by pressing `Ctrl-Shift-P` and selecting the - `C/C++ Select a Configuration...` option. - -5. Add the EC specific file associations and style settings. Do the following - to copy the default settings to `.vscode/settings.json`: - - ```bash - cp .vscode/settings.json.default .vscode/settings.json - ``` diff --git a/docs/images/CQ_Prototype_Environment.jpg b/docs/images/CQ_Prototype_Environment.jpg Binary files differdeleted file mode 100644 index 77b39d9470..0000000000 --- a/docs/images/CQ_Prototype_Environment.jpg +++ /dev/null diff --git a/docs/images/TCPMv2-ExampleStates.png b/docs/images/TCPMv2-ExampleStates.png Binary files differdeleted file mode 100644 index 7068829e31..0000000000 --- a/docs/images/TCPMv2-ExampleStates.png +++ /dev/null diff --git a/docs/images/TCPMv2-ExampleTransitions.png b/docs/images/TCPMv2-ExampleTransitions.png Binary files differdeleted file mode 100644 index da88a143a8..0000000000 --- a/docs/images/TCPMv2-ExampleTransitions.png +++ /dev/null diff --git a/docs/images/TCPMv2-TaskLayers.png b/docs/images/TCPMv2-TaskLayers.png Binary files differdeleted file mode 100644 index 7429e8f9b1..0000000000 --- a/docs/images/TCPMv2-TaskLayers.png +++ /dev/null diff --git a/docs/images/TCPMv2-TaskLoop.png b/docs/images/TCPMv2-TaskLoop.png Binary files differdeleted file mode 100644 index 1c0bb218fe..0000000000 --- a/docs/images/TCPMv2-TaskLoop.png +++ /dev/null diff --git a/docs/images/alternate_example.png b/docs/images/alternate_example.png Binary files differdeleted file mode 100644 index b2fcdb51e1..0000000000 --- a/docs/images/alternate_example.png +++ /dev/null diff --git a/docs/images/cros_fingerprint_architecture_diagram.png b/docs/images/cros_fingerprint_architecture_diagram.png Binary files differdeleted file mode 100644 index f83a338101..0000000000 --- a/docs/images/cros_fingerprint_architecture_diagram.png +++ /dev/null diff --git a/docs/images/cros_fingerprint_decryption_flowchart.png b/docs/images/cros_fingerprint_decryption_flowchart.png Binary files differdeleted file mode 100644 index b693d6e826..0000000000 --- a/docs/images/cros_fingerprint_decryption_flowchart.png +++ /dev/null diff --git a/docs/images/cros_fingerprint_encryption_flowchart.png b/docs/images/cros_fingerprint_encryption_flowchart.png Binary files differdeleted file mode 100644 index 8cfbaea56e..0000000000 --- a/docs/images/cros_fingerprint_encryption_flowchart.png +++ /dev/null diff --git a/docs/images/cros_fingerprint_tpm_seed.png b/docs/images/cros_fingerprint_tpm_seed.png Binary files differdeleted file mode 100644 index 8213e6f775..0000000000 --- a/docs/images/cros_fingerprint_tpm_seed.png +++ /dev/null diff --git a/docs/images/dartmonkey.jpg b/docs/images/dartmonkey.jpg Binary files differdeleted file mode 100644 index 5eb15ef73d..0000000000 --- a/docs/images/dartmonkey.jpg +++ /dev/null diff --git a/docs/images/dragonclaw.jpg b/docs/images/dragonclaw.jpg Binary files differdeleted file mode 100644 index c8d1f07934..0000000000 --- a/docs/images/dragonclaw.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_rev_0.2.jpg b/docs/images/dragonclaw_rev_0.2.jpg Binary files differdeleted file mode 100644 index 5dd41d23e4..0000000000 --- a/docs/images/dragonclaw_rev_0.2.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_rev_0.2_1.8v_load_switch_rework.pdf b/docs/images/dragonclaw_rev_0.2_1.8v_load_switch_rework.pdf Binary files differdeleted file mode 100644 index 5cb23ac5ef..0000000000 --- a/docs/images/dragonclaw_rev_0.2_1.8v_load_switch_rework.pdf +++ /dev/null diff --git a/docs/images/dragonclaw_rev_0.2_1.8v_rework.jpg b/docs/images/dragonclaw_rev_0.2_1.8v_rework.jpg Binary files differdeleted file mode 100644 index 6708732d0b..0000000000 --- a/docs/images/dragonclaw_rev_0.2_1.8v_rework.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_servo_fix.jpg b/docs/images/dragonclaw_servo_fix.jpg Binary files differdeleted file mode 100644 index cdcf510ebf..0000000000 --- a/docs/images/dragonclaw_servo_fix.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_with_10_pin_swd.jpg b/docs/images/dragonclaw_with_10_pin_swd.jpg Binary files differdeleted file mode 100644 index fb4711cf29..0000000000 --- a/docs/images/dragonclaw_with_10_pin_swd.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_with_20_pin_swd.jpg b/docs/images/dragonclaw_with_20_pin_swd.jpg Binary files differdeleted file mode 100644 index 18257a1ea7..0000000000 --- a/docs/images/dragonclaw_with_20_pin_swd.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_withfix.jpg b/docs/images/dragonclaw_withfix.jpg Binary files differdeleted file mode 100644 index c8469502df..0000000000 --- a/docs/images/dragonclaw_withfix.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_yoshi_flex_header.jpg b/docs/images/dragonclaw_yoshi_flex_header.jpg Binary files differdeleted file mode 100644 index 11ca23ddff..0000000000 --- a/docs/images/dragonclaw_yoshi_flex_header.jpg +++ /dev/null diff --git a/docs/images/dragonclaw_yoshi_flex_header2.jpg b/docs/images/dragonclaw_yoshi_flex_header2.jpg Binary files differdeleted file mode 100644 index ae515dfd43..0000000000 --- a/docs/images/dragonclaw_yoshi_flex_header2.jpg +++ /dev/null diff --git a/docs/images/ec-3po-high-level-design.png b/docs/images/ec-3po-high-level-design.png Binary files differdeleted file mode 100644 index 2956fa777f..0000000000 --- a/docs/images/ec-3po-high-level-design.png +++ /dev/null diff --git a/docs/images/ec-3po-internal-design.png b/docs/images/ec-3po-internal-design.png Binary files differdeleted file mode 100644 index 25f60793ae..0000000000 --- a/docs/images/ec-3po-internal-design.png +++ /dev/null diff --git a/docs/images/gpio_example.png b/docs/images/gpio_example.png Binary files differdeleted file mode 100644 index b2092b5e30..0000000000 --- a/docs/images/gpio_example.png +++ /dev/null diff --git a/docs/images/gpio_int_example.png b/docs/images/gpio_int_example.png Binary files differdeleted file mode 100644 index fe231e9b55..0000000000 --- a/docs/images/gpio_int_example.png +++ /dev/null diff --git a/docs/images/i2c_example.png b/docs/images/i2c_example.png Binary files differdeleted file mode 100644 index 73ee880541..0000000000 --- a/docs/images/i2c_example.png +++ /dev/null diff --git a/docs/images/icetower_with_20_pin_swd.jpg b/docs/images/icetower_with_20_pin_swd.jpg Binary files differdeleted file mode 100644 index dcaa0ad731..0000000000 --- a/docs/images/icetower_with_20_pin_swd.jpg +++ /dev/null diff --git a/docs/images/servo_micro.jpg b/docs/images/servo_micro.jpg Binary files differdeleted file mode 100644 index 39c0bbdf48..0000000000 --- a/docs/images/servo_micro.jpg +++ /dev/null diff --git a/docs/images/servo_v2.jpg b/docs/images/servo_v2.jpg Binary files differdeleted file mode 100644 index e45833ebe9..0000000000 --- a/docs/images/servo_v2.jpg +++ /dev/null diff --git a/docs/images/servo_v2_jtag_header.jpg b/docs/images/servo_v2_jtag_header.jpg Binary files differdeleted file mode 100644 index 0cfe3e832d..0000000000 --- a/docs/images/servo_v2_jtag_header.jpg +++ /dev/null diff --git a/docs/images/servo_v2_with_micro_usb.jpg b/docs/images/servo_v2_with_micro_usb.jpg Binary files differdeleted file mode 100644 index dc5c53e258..0000000000 --- a/docs/images/servo_v2_with_micro_usb.jpg +++ /dev/null diff --git a/docs/images/servo_v2_with_yoshi_flex.jpg b/docs/images/servo_v2_with_yoshi_flex.jpg Binary files differdeleted file mode 100644 index 77263f6676..0000000000 --- a/docs/images/servo_v2_with_yoshi_flex.jpg +++ /dev/null diff --git a/docs/images/servo_v2_with_yoshi_flex2.jpg b/docs/images/servo_v2_with_yoshi_flex2.jpg Binary files differdeleted file mode 100644 index 833134fd7f..0000000000 --- a/docs/images/servo_v2_with_yoshi_flex2.jpg +++ /dev/null diff --git a/docs/images/servomicro_dragonclaw.jpg b/docs/images/servomicro_dragonclaw.jpg Binary files differdeleted file mode 100644 index a9d947f220..0000000000 --- a/docs/images/servomicro_dragonclaw.jpg +++ /dev/null diff --git a/docs/images/usb_source_port_balancing.png b/docs/images/usb_source_port_balancing.png Binary files differdeleted file mode 100644 index 6f4ccf8b93..0000000000 --- a/docs/images/usb_source_port_balancing.png +++ /dev/null diff --git a/docs/images/yoshi_flex.jpg b/docs/images/yoshi_flex.jpg Binary files differdeleted file mode 100644 index 0ba3304721..0000000000 --- a/docs/images/yoshi_flex.jpg +++ /dev/null diff --git a/docs/images/yoshi_flex_swd_rework.jpg b/docs/images/yoshi_flex_swd_rework.jpg Binary files differdeleted file mode 100644 index 8dd088745e..0000000000 --- a/docs/images/yoshi_flex_swd_rework.jpg +++ /dev/null diff --git a/docs/low_battery_startup.md b/docs/low_battery_startup.md deleted file mode 100644 index 48f9c28f49..0000000000 --- a/docs/low_battery_startup.md +++ /dev/null @@ -1,420 +0,0 @@ -# Configuring the EC for Low-Battery Startup - -Near the bottom of charge, starting up a ChromeOS device can be a tricky -proposition. Several features interact to make it difficult to reliably turn on -the machine without browning out. Over the years, a variety of configuration -options have been written to maximize ChromeOS's compatibility with the basic -user expectation, - -"I plugged it in, therefore it should turn on." - -When creating a new board configuration, this document should aid the engineer -in navigating and choosing correct values for these options. - -The first section describes the various features which interact with each other -to create a complex environment for the EC during boot, especially at a low -state of charge. - -Second, we'll provide some reference configurations which cover many -Chromebooks' use cases. - -Finally, we'll close out with a detailed review of the configuration parameters -which are available. - -## Interacting Features - -### Battery and Charging Circuit - -For the most part, ChromeOS device power systems are much like other laptop -battery power systems. A variable-voltage rail is connected to the battery via a -series of cutoff MOSFETs. Several system power rails derive their power from the -system's variable-voltage rail. Mains power is delivered to the variable-voltage -system rail by a buck/boost charging circuit. Mains power is itself rectified, -isolated, and stepped down by an external power supply. - -During most of the battery charge, the charger operates in current mode, acting -as a constant current source that delivers current to the variable-voltage rail. -Load transients are served by the capacitance on the rail and the battery. By -superposition, load transients during the charge don't necessarily draw current -from the battery, they may just reduce the current flow into the battery. - -References to AC power in the EC codebase are actually references to an external -power supply's DC source. External supplies that are actually USB-PD-speaking -battery packs are indistinguishable from AC/DC adapters as far as the EC is -concerned. Variables and functions which refer to external supplies all refer to -them as 'AC', though. - -### Source Current Negotiation - -A device may draw power from an AC adapter via a few methods. - -#### USB BC1.2 Current Sources - -BC1.2 negotiation is usually managed entirely by an external IC. Once it is -complete, the EC limits itself to 2.4A max. Additionally, the charger may be -configured to switch to an input voltage regulation mode if the input voltage -begins to sag too low. - -Ideally, the input source provides a voltage droop, such that it is not quite -overloaded at the input voltage regulation setpoint of about 4.5V. Thus, 4.5V -serves as a reasonable reference voltage for the charger to use when it is in an -input voltage-regulation mode. - -In effect, the EC limits to both a maximum current of 2.4A and minimum voltage -of 4.5V, for about 12W of power draw from a BC1.2 source. - -See also `driver/bc12/max14637.c:bc12_detect()`. - -#### USB-PD Sources - -High-current power supplies are negotiated via the USB Type C Current Source and -USB Power Delivery specifications (PD). PD sources must support Type-C Current -Source, but the reverse is not true. Both types of current sources are managed -via the PD protocol module in the EC codebase. - -Type-C Current Source capabilities of up to 15W (3A, 5V) are advertised via -analog signaling alone. Via digital communication in the PD protocol, much -higher power states may be negotiated. However, higher power states also usually -run at a higher voltage state as well. Any time the voltage level is changing, -the power sink (the ChromeOS device) must lower its power consumption during the -transient. The standby current level is governed by -`CONFIG_CHARGER_INPUT_CURRENT`. - -PD port partners are capable of both soft and hard resets. Hard resets will -cause a dead-bus state for a brief interval before PD can renegotiate, from -scratch, because it is intended to emulate a cable disconnect. Therefore, a hard -reset without a connected battery will brownout the Chromebook. - -### Locked and Unlocked Firmware - -The Verified Boot implementation normally limits the complexity of the code -which executes in the locked Read-Only firmware package. The consequences for -the EC are: - -- Locked RO EC firmware does not process any digital PD messages at all, it - only recognizes the analog advertisement of USB Current Source (15W max). -- Installation of user-provided firmware is supported, but the write-protect - pin must be cleared to enable it. -- On recent systems, write-protect is cleared by removing the system battery. - -### ChromeOS `powerd` - -The power management daemon provided by ChromeOS displays a "low-power charger" -warning message via the system tray whenever the charger is limited to less than -20W. Therefore, if a USB-PD source is restricted to analog signaling, or a BC1.2 -source is connected, the user gets alerted to the situation. - -Systems that can run on very little power may be rapidly charged with a 15W -charger, while a high power system may require a 40W state or more for a decent -battery charging user experience. Therefore, a board's overlay may override the -warning threshold by replacing `/usr/share/power_manager/usb_min_ac_watts` in -the board's filesystem. - -See also `platform2/power_manager/` source code. - -### Cell Imbalance - -Under normal conditions, the battery pack is equipped with a management IC which -is solely responsible for the safety of the battery, measurement of the state of -charge, and the balance of its cells. Examples include (but are not limited to) -the TI BQ40Z50 and Renesas RAJ240. - -However, after very long periods of rest without a battery charging cycle, the -natural self-discharge rate of each cell will cause them to diverge somewhat -from each other. - -Some IC's can be configured to report a pack total state of charge of zero if -any one cell's voltage is below a certain threshold. However, many do not. -Therefore, after an extended rest period, one cell can be very close to the cell -undervoltage cutoff threshold, even though the pack as a whole is considered to -be at 3% charge or more. - -### Power Profile During Boot - -The power profile during the boot sequence is substantially different than that -seen during typical use. Dynamic voltage and frequency scaling of the AP is -partially governed by the temperature of the processor core. As the processor -gets hotter, it will reduce its maximum core voltage and frequency to settle out -at some maximum design junction temperature for the core. For passively cooled -devices, the profile may also be chosen to limit the external case temperature. - -At startup, the case and core are cold. The bootloaders and kernel are also -optimized to boot as fast as possible for a responsive user experience. So, the -power drawn during the boot is much higher than that seen during typical -productivity and entertainment tasks. - -### Depthcharge Power Verification - -After verification and optional update of the EC's RW firwmare, Depthcharge will -poll the EC to verify that it is allowed to proceed to boot to the kernel. - -It does this by polling via the: - `EC_CMD_CHARGE_STATE` host command. - -`CHARGE_STATE_CMD_GET_PARAM` subcommand. - `CS_PARAM_LIMIT_POWER` parameter. - -When the EC returns 0, power draw by the AP is unlimited and depthcharge resumes -the boot. If the EC fails to return 0 in three seconds, depthcharge shuts down. - -See also vb2ex_ec_vboot_done() in Depthcharge, and option -`CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW` in the EC. By default, this option is -not set, and the EC immediately allows the boot to proceed. - -## Example Low-Battery Boot Sequences and Configurations - -Most ChromeOS devices power needs will be met by one of the following templates. - -### Low-Power Device - -Low-power devices require 15W or less of power to boot the AP. The battery pack -is robust enough to support the device during brief intervals of PD negotiation -without browning out. - -``` -#define CONFIG_CHARGER_INPUT_CURRENT 512 -#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 1 -``` - -A detailed boot sequence under this configuration, with a low battery and -available AC power via a USB-PD charger: - -1. EC ROM bootloader loads and jumps to the EC's read-only firmware image. -1. RO firmware negotiates a 15W state via Current Source analog signaling and - begins charging the battery with it. -1. RO firmware verifies conditions to begin booting the AP: - - Battery state of charge > 1% - - OR charger power greater or equal to 15W (met by Current Source analog - signaling). -1. AP firmware performs verification of the EC's RW image, upgrades it if - necessary, and sysjumps the EC to it. -1. AP firmware queries the charge state limit power flag via EC-host command, - and the EC immediately responds that it is clear. -1. Depthcharge continues the boot. - 1. In parallel with kernel loading and Linux's boot, the EC performs PD - negotiation. Charger power lowers to 2.5W for up to 500ms as the source - transitions from vSafe5V to its highest supported voltage (15V or 20V - are typical). During this transition time some power is drawn from the - battery. - 1. After PD negotiation is complete, the EC raises the charger current - limit to the negotiated limit (45W is typical). - -### Low-Power Device Startup With Marginal Battery Compatibility - -Similar in configuration to the low-power device startup, this system enables -additional options to maximize its compatibility with marginal batteries near -the bottom of charge. The Grunt family is an exemplar. This system will complete -software sync with less than 15W of power, but may require more power to boot -the kernel and get to the login screen. - -``` -/* Limit battery impact during PD voltage changes. */ -#define CONFIG_CHARGER_INPUT_CURRENT 512 - -/* Distrust the battery SOC measurement a bit. */ -#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 3 - -/* - * Require PD negotiation to be complete prior to booting Linux, but don't - * care about how much power we negotiate. - */ -#define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 15001 - -/* Extra paranoia about imbalanced cells. */ -#define CONFIG_BATTERY_MEASURE_IMBALANCE -``` - -Additionally, in order to take advantage of cell imbalance detection, the system -battery must support per-cell voltage measurement. - -A detailed boot sequence under this configuration, with a low battery and -available AC power: - -1. EC ROM bootloader loads and jumps to the EC's read-only firmware image. -1. RO firmware negotiates a 15W state via Current Source analog signaling and - begins charging the battery with it. -1. RO firmware verifies conditions to begin booting the AP: - - battery state of charge >= 3% AND cell imbalance < 200 mV - - OR battery state of charge >= 5% - - OR charger power greater or equal to 15W (met by Current Source analog - signaling). -1. AP firmware performs verification of the EC's RW image, upgrades it if - necessary, and sysjumps the EC to it. -1. AP firmware polls the charge state limit power flag via EC-host command for - up to 3 seconds, in 50ms intervals. The EC will return `1` (power limited) - so long as the charger power is < 15.001W and the battery is less than 3%. - 1. Meanwhile, the EC performs PD negotiation. Charger power lowers to 2.5W - for up to 500ms as the source transitions from vSafe5V to its highest - supported voltage (15V or 20V are typical). - 1. After negotiation is complete, the EC raises the charger current limit - to the negotiated limit (45W is typical). - 1. The EC returns 0 (unlimited) on the next `LIMIT_POWER` request. -1. Depthcharge continues to boot Linux. - -### High-Power Boot Device Startup - -A "high-power device" in this case is one that requires significantly more than -15W of power to boot the AP. These devices may complete software sync at 15W or -less. Very briefly drawing current out of the battery does not cause a brownout. - -Example configuration: - -``` -#define CONFIG_CHARGER_INPUT_CURRENT 512 -#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 3 -#define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON 15000 -#define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 27000 -``` - -Where the low-power device specified a threshold that just barely requires PD -negotiation to happen before booting, this device has a definite minimum power -to boot Linux (27W). A detailed boot sequence under this configuration, with a -low battery and available AC power: - -1. EC ROM bootloader loads and jumps to the EC's read-only firmware image. -1. RO firmware negotiates a 15W state via Current Source analog signaling and - begins charging the battery with it. -1. RO firmware verifies conditions to begin booting the AP: - - battery state of charge >= 3% - - OR charger power greater or equal to 15W (met by Current Source analog - signaling). -1. AP firmware performs verification of the EC's RW image, upgrades it if - necessary, and sysjumps the EC to it. -1. AP firmware polls the charge state limit power flag via EC-host command for - up to 3 seconds, in 50ms intervals. The EC will return `1` (power limited) - so long as the charger power is < 27W and the battery is less than 3%. - 1. Meanwhile, the EC performs PD negotiation. Charger power lowers to 2.5W - for up to 500ms as the source transitions from vSafe5V to its highest - supported voltage (15V or 20V are typical). - 1. After negotiation is complete, the EC raises the charger current limit - to the negotiated limit (45W is typical). - 1. The EC returns 0 (unlimited) on the next `LIMIT_POWER` request. -1. Depthcharge continues to boot Linux. - -### High-Power SwSync Device Startup - -Like the high-power boot device startup, these devices draw less than 15W during -most of the software sync process, but may briefly exceed 15W during short -intervals of software sync. However, there is substantial risk of brownout -during those intervals unless the battery is charged up a bit first. Therefore, -they strictly require 1% battery capacity to perform software sync. -Additionally, this configuration requires PD negotiation to be complete prior to -performing a no-battery boot. Nami is an exemplar. - -Example configuration: - -``` -#define CONFIG_CHARGER_INPUT_CURRENT 512 - -#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON_WITH_AC 1 -#define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON_WITH_BATT 15000 - -#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 3 -#define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON 27000 - -#define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 3 -#define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 27000 -``` - -1. EC ROM bootloader loads and jumps to the EC's read-only firmware image. -1. RO firmware negotiates a 15W state via Current Source analog signaling and - begins charging the battery with it. -1. RO firmware verifies conditions to begin booting the AP: - - Battery state of charge is greater than 1% AND charger power is greater - than 15W (met after a minute or so of charging on analog signaling) - - OR Battery state of charge is greater than 3% - - OR Charger power is greater than 27W (met after PD negotiation in - unlocked RO firmware). -1. AP firmware performs verification of the EC's RW image, upgrades it if - necessary, and sysjumps the EC to it. -1. AP firmware polls the charge state limit power flag via EC-host command for - up to 3 seconds, in 50ms intervals. The EC will return `1` (power limited) - so long as the charger power is < 27W and the battery is less than 3%. - 1. Meanwhile, the EC performs PD negotiation. Charger power lowers to 2.5W - for up to 500ms as the source transitions from vSafe5V to its highest - supported voltage (15V or 20V are typical). - 1. After negotiation is complete, the EC raises the charger current limit - to the negotiated limit (45W is typical). - 1. The EC returns 0 (unlimited) on the next `LIMIT_POWER` request. -1. Depthcharge continues to boot Linux. - -## Configuration Option Details - -### `CONFIG_CHARGER_INPUT_CURRENT` - -Required. - -The lowest current limit programmed into the charger. This determines both the -default level used on startup, and the value used during the voltage transients -in PD negotiation. - -It should not be higher than 512 mA unless the device ships with a discrete -power supply. Raising this term above 512 mA is contrary to USB-PD. It may be -lowered in order to improve compatibility with marginal BC1.2 chargers. - -### `CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON` - -Required. - -The minimum battery state of charge to start up the AP, in percent of full -charge. - -#### `CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON` - -Default: 15000 (15W) - -The minimum charger power level to start the AP even when the battery is less -than `CHARGER_MIN_BAT_PCT_FOR_POWER_ON`, in milliwatts. - -### `CONFIG_BATTERY_MEASURE_IMBALANCE` - -Optional. Only set this option if one or more batteries shipped with this board -support per-cell battery voltage measurement. - -When enabled, the EC will query the attached battery for its per-cell voltages. -If the cell voltage is excessively imbalanced at a low state of charge, the boot -is inhibited. - -#### `CONFIG_CHARGER_MIN_BAT_PCT_IMBALANCED_POWER_ON` - -Default: 5%. Above this battery state of charge, cell voltage balance is -ignored. - -#### `CONFIG_BATTERY_MAX_IMBALANCE_MV` - -Default: 200 mV. If the difference between the highest and lowest cell exceeds -this value, then the pack is considered to be imbalanced. - -Note that lithium chemistry cells will almost always read similar voltages. It -is only near the top and bottom of charge that the slope of dV/dQ increases -enough for small cell imbalances to be visible as a voltage difference. - -### `CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW` - -Optional. - -The minimum charger power level to allow Depthcharge to start up the kernel, -even when the battery state of charge is less than -`CHARGER_LIMIT_POWER_THRESH_BAT_PCT`, in milliwatts. - -When this term is `#undef`ined (the default), kernel startup is immediately -allowed. - -#### `CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT` - -Optional. - -The minimum battery state of charge to allow Depthcharge to start up the kernel. -When using this feature, start with `CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON` - -### `CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON_WITH_AC` - -Optional. - -Similar to `MIN_BAT_PCT_FOR_POWER_ON`, but used to define a secondary threshold -for this feature. - -#### `CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON_WITH_BATT` - -Optional. - -Similar to `CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON`, this is the minimum -charger power needed to boot even when the battery is less than -`CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON_WITH_AC` diff --git a/docs/new_board_checklist.md b/docs/new_board_checklist.md deleted file mode 100644 index 7fe89d4121..0000000000 --- a/docs/new_board_checklist.md +++ /dev/null @@ -1,179 +0,0 @@ -# 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/+/HEAD/contrib/variant/README.md -[new_variant.py]:https://chromium.googlesource.com/chromiumos/platform/dev-util/+/HEAD/contrib/variant/new_variant.py -[create_initial_ec_image.sh]:https://chromium.googlesource.com/chromiumos/platform/dev-util/+/HEAD/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 diff --git a/docs/reducing_ec_image_size.md b/docs/reducing_ec_image_size.md deleted file mode 100644 index a165f165ff..0000000000 --- a/docs/reducing_ec_image_size.md +++ /dev/null @@ -1,459 +0,0 @@ -# Reducing the EC image size - -The EC ToT codebase continues grows as new features are added and for bug -fixes. This puts pressure on older boards that have limited flash space -remaining. This document provides some tips for reducing the EC image size. - -[TOC] - -## Checking the EC image footprint - -The EC codebase supports two build types: - -1. `cros-ec` builds are the legacy EC images built using Make (e.g. `make - BOARD=volteer`) -1. `zephyr-ec` builds are the EC images built using the Zephyr RTOS kernel using - zmake/Cmake (e.g. `zmake configure -b zephyr/projects/volteer/volteer`) - -### Checking a single cros-ec build - -Building a single cros-ec board using `make BOARD=<board> -j` reports the the -number of bytes free in flash and RAM for both the RO and RW images. An example -from building the juniper board is shown below. - -``` -$ make BOARD=juniper -j - ... - *** 668 bytes in flash and 10308 bytes in RAM still available on juniper RO **** - *** 3224 bytes in flash and 7460 bytes in RAM still available on juniper RW **** -``` - -### Checking all cros-ec builds - -Running `make buildall -j` shows a summary of the three boards with the smallest -RO flash footprint, FW flash footprint, and RW RAM footprint. - -``` -$ make buildall -j - ... -buildall completed successfully! -Smallest free spaces in RO flash (bytes): -servo_v4 : 104 -scarlet : 108 -mushu : 160 -Smallest free spaces in RW flash (bytes): -mushu : 96 -bobba : 232 -trondo : 376 -Tightest boards' RW RAM images, bytes free: -whiskers : 244 -minimuffin: 284 -zinger : 284 -``` - -### Comparing cros-ec image sizes - -The cros-ec makefile provides two make targets for helping track the impact of -code changes. - -`make savesizes` saves the EC footprint information for all boards, providing -the baseline for comparison. `make newsizes` compares the sizes of the current -build against the EC footprint information saved by most recent invocation of -`make savesizes`. - -General workflow: -1. Checkout branch you need to compare against. For example `repo start - check-ec-size -r cros/main` or `repo start check-ec-size -r <hash>`. -1. Run `make buildall -j`. -1. Run `make savesizes`. -1. Apply your code change (e.g. change the local branch, cherry-pick your - changes, or directly edit source files). -1. Run `make buildall -j` again. -1. Run `make newsizes` to generate report of size changes. - -Example report from `make newsizes` shown below: - -``` -$ make newsizes -build/burnet/RO/space_free_flash grew by 576 bytes: (488 to 1064) -build/burnet/RW/space_free_flash grew by 552 bytes: (1324 to 1876) -build/cerise/RO/space_free_flash grew by 512 bytes: (276 to 788) -build/cerise/RW/space_free_flash grew by 548 bytes: (7076 to 7624) - ... -``` - -### Checking a single zephyr-ec build - -By default all the information messages from the `zmake` tool are hidden during -builds of zephyr-ec boards. - -Changing the logging level to INFO, displays the flash and SRAM usage of board. - -``` -$ zmake -l INFO configure -b zephyr/projects/volteer/volteer -INFO: Clearing old build directory /mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer - ... -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:ro]Memory region Used Size Region Size %age Used -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:ro]FLASH: 238852 B 512 KB 45.56% -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:ro]SRAM: 57144 B 62 KB 90.01% -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:ro]IDT_LIST: 0 GB 2 KB 0.00% -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:rw]Memory region Used Size Region Size %age Used -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:rw]FLASH: 238852 B 512 KB 45.56% -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:rw]SRAM: 57144 B 62 KB 90.01% -INFO: [/mnt/host/source/src/platform/ec/build/zephyr/projects/volteer/volteer:rw]IDT_LIST: 0 GB 2 KB 0.00% -``` - -For easier to read output, you can run the ninja build tool directly and see the -RO and RW footprint. - -``` -$ zmake configure zephyr/projects/volteer/volteer/ -$ ninja -C build/zephyr/projects/volteer/volteer/build-ro -ninja: Entering directory 'build/zephyr/projects/volteer/volteer/build-ro' -[1/324] Preparing syscall dependency handling - -[317/324] Linking C executable zephyr/zephyr_prebuilt.elf - -[324/324] Linking C executable zephyr/zephyr.elf -Memory region Used Size Region Size %age Used - FLASH: 238852 B 512 KB 45.56% - SRAM: 57144 B 62 KB 90.01% - IDT_LIST: 0 GB 2 KB 0.00% -``` - -Note, that the flash region size listed above represents the total flash -available on the EC. The actual available region size is only half the reported -value in order to store two images (RO+RW). - -#### Other Zephyr utilities - -The Cmake system utilized by Zephyr provides two build targets `rom_report` and -`ram_report` which generate a list of all the compiled objects in tabular form. -This can be useful for identifying particular modules that contribute to the -image size. - -The `rom_report` and `ram_report` targets are currently only supported when -working outside the chroot. Follow the [instructions][1] for building zephyr-ec -images outside chroot before running the commands below. - -``` -# Configure the Volteer zephyr project, storing the build files in /tmp/zephyr-volteer -$ zmake configure -B /tmp/zephyr-volteer zephyr/projects/volteer/volteer -t zephyr - -# Build the RO image -$ ninja -C /tmp/zephyr-volteer/build-ro - -# Generate the ROM report, report sent to stdout -$ ninja -C /tmp/zephyr-volteer/build-ro rom_report -``` - -Please refer to the [Zephyr Optimization Tools][3] documentation for details on -the `rom_report` and `ram_report` targets. - -## Disable console commands - -The lowest hanging fruit for reducing the EC image size is by disabling console -commands that provide debug information only and don't impact the user or the -automated testing. Any console command that is not used by the FAFT tests and -suites is safe to disable in the EC images. - -For cros-ec builds, add `#undef CONFIG_CMD_<name>` to the board.h or baseboard.h -file to disable the console command. - -For zephyr-ec builds, add `CONFIG_PLATFORM_EC_CONSOLE_CMD_<name>=n` to the board -prj.conf file to disable the console command. - -* TODO: Create new CONFIG/Kconfig option that disables all console commands not - required by FAFT. - -| Used by FAFT | config.h option | Console commands | Notes | -|:---|:---|:---|:---| -| | CONFIG_CMD_ACCELS | `accelrange`<br>`accelres`<br>`accelrate`<br>`accelread`<br>`accelinit`<br>`accelinfo` | | -| | CONFIG_CMD_ACCELSPOOF | `accelspoof` | | -| | CONFIG_CMD_ACCEL_FIFO | `fiforead` | | -| | CONFIG_CMD_ACCEL_INFO | `accelinfo` | | -| | CONFIG_CMD_ADC | `adc` | Note firmware_ECAdc uses the `temps` command. | -| | CONFIG_CMD_ALS | `als` | | -| | CONFIG_CMD_APTHROTTLE | `apthrottle` | | -| | CONFIG_CMD_AP_RESET_LOG |??? | | -| | CONFIG_CMD_BATDEBUG | `fgunseal`<br>`fgseal`<br>`fginit`<br>`fgprobe`<br>`fgrd`<br>`fgcmd`<br>`fcmdrd` | | -| | CONFIG_CMD_BATTFAKE | `battfake` | | -| | CONFIG_CMD_BATT_MFG_ACCESS | `battmfgacc` | | -| | CONFIG_CMD_CBI | `cbi` | firmwareECCbiEeprom uses `ectool` on AP to test CBI | -| x | CONFIG_CMD_CHARGEN | `chargen` | Used by firmware_Cr50CCDUartStress, included in faft_ccd, faft_cr50_prepvt, and faft_cr50_pvt suites | -| | CONFIG_CMD_CHARGER | `bd9995x`<br>`sy21612` | | -| | CONFIG_CMD_CHARGER_ADC_AMON_BMON | `amonbmon` | | -| | CONFIG_CMD_CHARGER_DUMP | `charger_dump` | | -| | CONFIG_CMD_CHARGER_PROFILE_OVERRIDE | `fastcharge` | | -| | CONFIG_CMD_CHARGER_PROFILE_OVERRIDE_TEST | `fastchgtest` | | -| | CONFIG_CMD_CHARGE_SUPPLIER_INFO | `chgsup` | | -| | CONFIG_CMD_CHGRAMP | `chgramp` | | -| | CONFIG_CMD_CLOCKGATES | `clockgates` | | -| | CONFIG_CMD_COMXTEST | `comxtest` | | -| x | CONFIG_CMD_CRASH | `crash` | | -| | CONFIG_CMD_DEVICE_EVENT | `deviceevent` | | -| | CONFIG_CMD_DLOG | `dlog` | | -| | CONFIG_CMD_ECTEMP | `ectemp` | | -| | CONFIG_CMD_FASTCHARGE | `fastcharge` | Obsolete? use CONFIG_CMD_CHARGER_PROFILE_OVERRIDE? | -| | CONFIG_CMD_FLASH | `flasherase`<br>`flashwrite`<br>`flashread` | | -| | CONFIG_CMD_FLASHINFO | `flashinfo` | | -| | CONFIG_CMD_FLASH_TRISTATE | `fpcapture`<br>`flash_tristate` | | -| | CONFIG_CMD_FLASH_WP | `flashwp` | | -| | CONFIG_CMD_FORCETIME | `forcetime` | | -| | CONFIG_CMD_FPSENSOR_DEBUG | `fpcapture`<br>`fpenroll`<br>`fpmatch`<br>`fpclear`<br>`fpmaintenance` | | -| | CONFIG_CMD_GETTIME | `gettime` | Used by Cr50 tests, not by FAFT EC | -| | CONFIG_CMD_GL3590 | `gl3590` | | -| | CONFIG_CMD_GPIO_EXTENDED | Adds options to `gpioget` and `gpioset`. | Should be renamed to CONFIG_GPOI_EXTENDED | -| | CONFIG_CMD_GPIO_POWER_DOWN | Not a valid config. | Should be CONFIG_GPIO_POWER_DOWN | -| | CONFIG_CMD_GT7288 | `gt7288_desc`<br>`gt7288_repdesc`<br>`gt7288_ver`<br>`gt7288_report` | | -| | CONFIG_CMD_HASH | `hash` | firmware_ECHash uses `ectool echash` | -| x | CONFIG_CMD_HCDEBUG | `hcdebug` | firmware_ECBootTime.py | -| x | CONFIG_CMD_HOSTCMD | `hostcmd` | | -| | CONFIG_CMD_I2CWEDGE | `i2cwedge`<br>`i2cunwedge` | | -| | CONFIG_CMD_I2C_PROTECT | `i2cprotect` | | -| | CONFIG_CMD_I2C_SCAN | `i2cscan` | | -| | CONFIG_CMD_I2C_STRESS_TEST | `i2ctest` | | -| | CONFIG_CMD_I2C_STRESS_TEST_ACCEL | Not a console command | | -| | CONFIG_CMD_I2C_STRESS_TEST_ALS | Not a console command | | -| | CONFIG_CMD_I2C_STRESS_TEST_BATTERY | Not a console command | | -| | CONFIG_CMD_I2C_STRESS_TEST_CHARGER | Not a console command | | -| | CONFIG_CMD_I2C_STRESS_TEST_TCPC | `Not a console command | | -| | CONFIG_CMD_I2C_XFER | `i2cxfer` | firmware_ECCbiEeprom uses `ectool i2cxfer` which is not guarded by CONFIG_CMD_I2C_XFER | -| | CONFIG_CMD_I2C_XFER_RAW | | Adds options to `i2cxfer` | -| | CONFIG_CMD_IDLE_STATS | `idlestats` | | -| | CONFIG_CMD_INA | `ina` | | -| | CONFIG_CMD_JUMPTAGS | `jumptags` | | -| x | CONFIG_CMD_KEYBOARD | `8042`<br>`ksstate`<br>`kbpress` | | -| | CONFIG_CMD_LEDTEST | `ledtest` | | -| | CONFIG_CMD_MCDP | `mcdp` | | -| | CONFIG_CMD_MD | `md` | | -| | CONFIG_CMD_MEM | | Not a console command - gates `md` and `rw` | -| | CONFIG_CMD_MFALLOW | `mfallow` | | -| | CONFIG_CMD_MMAPINFO | `mmapinfo` | | -| x | CONFIG_CMD_PD | `pd` | Used by FAFT PD | -| | CONFIG_CMD_PD_DEV_DUMP_INFO | | Not a console command | -| | CONFIG_CMD_PD_FLASH | `pd flash` | Not supported by TCPMv2 | -| | CONFIG_CMD_PECI | `peci` | firmware_ECThermal uses `ectool tempsinfo` | -| | CONFIG_CMD_PLL | `pll` | only used by lm4 chip | -| | CONFIG_CMD_POWERINDEBUG | `powerindebug` | | -| | CONFIG_CMD_POWERLED | `powerled` | | -| x | CONFIG_CMD_POWER_AP | `apreset`<br>`apshutdown` | Used by power_Monitoring.py | -| | CONFIG_CMD_PPC_DUMP | `ppc_dump` | | -| | CONFIG_CMD_PS2 | `ps2ench`<br>`ps2write` | Used only on NPCX | -| | CONFIG_CMD_PWR_AVG | `pwr_avg` | | -| | CONFIG_CMD_RAND | `rand` | Used only on STM32 | -| | CONFIG_CMD_REGULATOR | `ir357x` | | -| | CONFIG_CMD_RESET_FLAGS | `rflags` | | -| | CONFIG_CMD_RETIMER | `bb`<br>`kbxfer` | | -| | CONFIG_CMD_RTC | `rtc` | | -| | CONFIG_CMD_RTC_ALARM | `rtc_alarm` | | -| | CONFIG_CMD_RW | `rw` | | -| | CONFIG_CMD_SCRATCHPAD | `scratchpad` | | -| | CONFIG_CMD_SEVEN_SEG_DISPLAY | `seg` | | -| | CONFIG_CMD_SHA256_TEST | `???` | | -| x | CONFIG_CMD_SHMEM | `shmem` | Used by firmware_ECSharedMem | -| | CONFIG_CMD_SLEEP | `sleep` | used only lm4 | -| | CONFIG_CMD_SLEEPMASK | `sleepmask` | Only used for Cr50 tests | -| | CONFIG_CMD_SLEEPMASK_SET | | Adds options to `sleepmask` | -| | CONFIG_CMD_SPI_FLASH | `spi_flasherase`<br>`spi_flashwrite`<br>`spi_flashread`<br>`spi_flash_rsr`<br>`spi_flash_wsr`<br>`spi_flash_wsr` | | -| | CONFIG_CMD_SPI_NOR | `spinorinfo`<br>`spinorerase`<br>`spinorwrite`<br>`spinorread` | | -| | CONFIG_CMD_SPI_XFER | `spixfer` | | -| | CONFIG_CMD_STACKOVERFLOW | `crash stack` | Adds option to `crash` command. | -| x | CONFIG_CMD_SYSINFO | `sysinfo` | Used by firmware_ECSystemLocked | -| x | CONFIG_CMD_SYSJUMP | `sysjump` | Used by firmware_ECSharedMem | -| | CONFIG_CMD_SYSLOCK | `syslock` | | -| | CONFIG_CMD_TASKREADY | `taskready` | | -| | CONFIG_CMD_TASK_RESET | `taskreset` | | -| | CONFIG_CMD_TCPC_DUMP | `tcpci_dump` | | -| x | CONFIG_CMD_TEMP_SENSOR | `temps` | | -| | CONFIG_CMD_TIMERINFO | `timerinfo` | | -| | CONFIG_CMD_TYPEC | `typec` | | -| | CONFIG_CMD_USART_INFO | `usart_info` | | -| | CONFIG_CMD_USB_PD_CABLE | `pdcable` | | -| x | CONFIG_CMD_USB_PD_PE | `pe` | Doesn't appear to be used but might be by FAFT PD | -| x | CONFIG_CMD_WAITMS | `waitms` | firmware_ECWatchdog | | - -## Reduce or eliminate USB-C debugging - -The TCPM (Type-C Port manager) implementation is one of the more complex modules -implemented by the EC code. This module includes extensive debugging and is -enabled by default due to the value provided during both board bringup and on -production systems. - -The TCPM provides the following debug levels: -* `DEBUG_DISABLE` (0) - Debugging disabled, no runtime messages displayed -* `DEBUG_LEVEL_1` (1) - Displays all the state transitions for the TC (Type-C) - and PE (Policy Engine) state machines -* `DEBUG_LEVEL_2` (2) - Displays the raw contents of received PD (Power - Delivery) packets, excluding PING packets -* `DEBUG_LEVEL_3` (3) - Enables debug messages in the PRL Also displays received - PING packets. - -When `CONFIG_USB_PD_DEBUG_LEVEL` is undefined, the EC allows runtime -configuration of the USB-C debug level using the `pd dump <level>` EC console -command. In this configuration, the strings from all debug levels are included -in the image. - -Enabling a fixed debug level removes runtime control of the debug level and also -removes the strings for the higher debug levels. - -For cros-ec builds, add the following to your board.h/baseboard.h file: - -```c - #define CONFIG_USB_PD_DEBUG_LEVEL <level> -``` - -For zephyr-ec builds, add the following to your prj.conf file: - -``` - CONFIG_PLATFORM_EC_USB_PD_DEBUG_FIXED_LEVEL=y - CONFIG_PLATFORM_EC_USB_PD_DEBUG_LEVEL=<level> -``` - -Approximate flash space savings from each fixed level setting: - -Fixed Debug Level | Relative Saving | Cumulative Saving ---- | --- | --- -Disabled | 0 | 0 -3 | 100 bytes | 100 bytes -2 | 500-600 bytes | 600-700 bytes -1 | 100 bytes | 700-800 bytes -0 | 2000 bytes | 2700-2800 bytes - -The recommended setting is setting the fixed debug level to `DEBUG_LEVEL_2` (2). -This adds details about received PD packets in the EC log stored by the kernel -and can help troubleshoot PD issues when a PD analyzer isn't available. - -It is not recommended to set the fixed debug level to `DEBUG_DISABLE` (0) on any -shipping firmware. - -### TCPMv1 Configuration - -Many older platforms still use the legacy TCPMv1 (`CONFIG_USB_PD_TCPMV1`) -implementation. Specific to TCPMv1, the PD protocol state names can be removed -from the debug output by adding the following to the board.h/baseboard.h file. - -```c -#undef CONFIG_USB_PD_TCPMV1_DEBUG -``` - -This saves around 900 bytes of flash space. TCPMv2 does not currently provide an -equivalent configuration option, so there is also no Kconfig equivalent. - -## Other optional features - -### ASSERT() Calls - -By default, `ASSERT()` calls generate a console message of the following form: - -``` - ASSERTION FAILURE '<expr>' in function() at file:line -``` - -There are two options available that reduce the size of strings stored with the -`ASSERT()` calls. - -Description | cros-ec setting | zephyr-ec setting | Total Savings -:--- | :--- | :--- | :--- -Display only file and line number | `#define CONFIG_DEBUG_ASSERT_BRIEF` | `CONFIG_PLATFORM_EC_DEBUG_ASSERT_BRIEF=y` | 2000-2500 bytes -Disable all debug from ASSERT() calls.<br> EC is reset using a software breakpoint. | `#undef CONFIG_DEBUG_ASSERT_REBOOTS` | `CONFIG_PLATFORM_EC_DEBUG_ASSERT_REBOOTS=n`<br>`CONFIG_PLATFORM_EC_DEBUG_ASSERT_BREAKPOINT=y` | 3000-4000 bytes - -It is not recommended to disable `CONFIG_PLATFORM_EC_DEBUG_ASSERT_REBOOTS` on -shipping firmware. - -### Disable console help - -The help strings can be removed from the final build, saving about 5000 bytes of -flash space. - -For cros-ec builds, add `#undef CONFIG_CONSOLE_CMDHELP` to the -board.h/baseboard.h file. - -zephyr-ec builds use Zephyr's shell subsystem and by default enable the -`CONFIG_SHELL_MINIMAL` option. This option already disables shell help along -with many other non-critical features. Refer to the shell subsystem [Kconfig][2] -source file for the complete list of shell features than can be configured. - -### Link time optimizaiton - -Link time optimization (LTO) is a feature of the linker to identify and remove -unused code. - -For cros-ec builds, LTO is enabled by adding this to the board.h/baseboard.h -file. - -```c -#define CONFIG_LTO -``` - -For zephyr-ec builds, LTO is enabled by default and is controlled with Kconfig. - -``` -CONFIG_LTO=y -``` - -Note that for zephyr-ec builds, LTO is only turned on for the source files found -under `platform/ec`. The upstream Zephyr code does not currently support LTO -due to some auto-generated code that breaks the assumptions made by the linker. -This [Github issue][4] tracks the effort to support LTO in the Zephyr kernel. - -### CONFIG_CHIP_INIT_ROM_REGION - -The config option `CONFIG_CHIP_INIT_ROM_REGION` creates a new linker section to -store data that remains resident in ROM/flash at runtime. This reduces the -effective cros-ec image size by identifying data structures that do not need to -be copied into the code RAM section at startup. - -This option has the following requirements: -1. EC executes code from RAM -2. The ROM/flash size is larger than 2 times the code RAM size. -3. The RO code released for the board includes this - [change](https://crrev.com/c/2428566). - -The only EC chip that matches these prerequisites is the Nuvoton NPCX7. - -Due to the RO code requirement, take care before enabling this option for boards -released prior to 2021. - -If the above requirements are meant, add the following to the -board.h/baseboard.h file: - -```c -#define CONFIG_CHIP_INIT_ROM_REGION -#define CONFIG_CHIP_DATA_IN_INIT_ROM -``` - -These options are not supported for zephyr-ec builds. - -### Enable short GPIO names - -The [GPIO macros](./configuration/gpio.md) defined by the board get stored as -descriptive strings for use with the `gpioget` and `gpioset` console commands. - -The names of the GPIOs can be shorted by enabling the -`CONFIG_COMMON_GPIO_SHORTNAMES` option. - -For example, the Kukui board defines this GPIO: - -```c -GPIO(PMIC_FORCE_RESET_ODL, PIN(A, 2), GPIO_ODR_HIGH) -``` - -Normally, the GPIO name is stored exactly as specified by the macro: -`PMIC_FORCE_RESET_ODL`. However, when `CONFIG_COMMON_GPIO_SHORTNAMES` is -defined, then the GPIO name is shortened to only include port and pin number: -`A2`. - -This option is currently only supported by the STM32 chip and it is not -supported by zephyr-ec builds. - -Note that there are some [FAFT tests][5] that rely on the GPIO name. If you -enable this option, you may also need to change firmware testing configuration -[file][6]. - -[1]:./zephyr_build.md#Working-outside-the-chroot -[2]:https://github.com/zephyrproject-rtos/zephyr/blob/main/subsys/shell/Kconfig -[3]:https://docs.zephyrproject.org/latest/guides/optimizations/tools.html -[4]:https://github.com/zephyrproject-rtos/zephyr/issues/2112 -[5]:https://chromium.googlesource.com/chromiumos/third_party/autotest/+/069cb4b0/server/site_tests/firmware_ECUsbPorts/firmware_ECUsbPorts.py#81 -[6]:https://chromium.googlesource.com/chromiumos/platform/fw-testing-configs/+/e2e9547e/volteer.json#26 diff --git a/docs/schematics/dragonclaw/LICENSE b/docs/schematics/dragonclaw/LICENSE deleted file mode 100644 index d1b237d529..0000000000 --- a/docs/schematics/dragonclaw/LICENSE +++ /dev/null @@ -1,318 +0,0 @@ -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution 4.0 International Public License ("Public License"). To the -extent this Public License may be interpreted as a contract, You are -granted the Licensed Rights in consideration of Your acceptance of -these terms and conditions, and the Licensor grants You such rights in -consideration of benefits the Licensor receives from making the -Licensed Material available under these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - d. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - e. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - f. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - g. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - h. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - i. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - j. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - k. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's - License You apply must not prevent recipients of the Adapted - Material from complying with this Public License. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - diff --git a/docs/schematics/dragonclaw/README.md b/docs/schematics/dragonclaw/README.md deleted file mode 100644 index 66fde41df8..0000000000 --- a/docs/schematics/dragonclaw/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Dragonclaw Fingerprint Development Board Schematics - -The schematics are in the [HTML file][schematic] and viewable with any browser. -Note that you'll need to download and save the HTML file from -[this link][schematic]; you cannot view it directly from the server. - -The layout file is in the [`.brd`] file. - -[`.brd`]: https://raw.githubusercontent.com/coreboot/chrome-ec/master/docs/schematics/dragonclaw/dragonclaw_v0.2.brd -[schematic]: https://raw.githubusercontent.com/coreboot/chrome-ec/master/docs/schematics/dragonclaw/dragonclaw_v0.2.html diff --git a/docs/schematics/dragonclaw/dragonclaw_v0.2.brd b/docs/schematics/dragonclaw/dragonclaw_v0.2.brd Binary files differdeleted file mode 100644 index 37e8b3190d..0000000000 --- a/docs/schematics/dragonclaw/dragonclaw_v0.2.brd +++ /dev/null diff --git a/docs/schematics/dragonclaw/dragonclaw_v0.2.html b/docs/schematics/dragonclaw/dragonclaw_v0.2.html deleted file mode 100644 index c3241ae00f..0000000000 --- a/docs/schematics/dragonclaw/dragonclaw_v0.2.html +++ /dev/null @@ -1,7087 +0,0 @@ -<!DOCTYPE html> -<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - -<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABIAQMAAABvIyEEAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAFdJREFUKM9jYGBg+A+EEEANFvN/EDgAZMmDWT+ALHsw6w+QVQ9m/UNh/YcAXCyo6VRiAc38D8ZUYoH9/R9qBxVYNHAfVcOPQGxhi19E7CNSBCKVUDf9AQBM1TcCCjMB0AAAAABJRU5ErkJggg=="> -<title>dragonclaw.cpm - ab219060b29f55c904192cae83fe7d668b73d4b9</title> -</head><body> -<script>/* Javascript code for DiffUI. Directly embedded. */ - -var zoom = 1; -var dark = null; - -/** Activates or deactivates animations referenced by diff id. - * classname -- used to select which animations to trigger - * state -- whether to animate (or reset) - * conflictswith -- classname this diff conflicts with. - * Conflicting animations will not be started. - */ -var setAnimation = function(classname, state, conflictswith='') { - var anims = document.getElementsByClassName(classname); - for (var i = 0; i < anims.length; i++) { - anims[i].setAttribute('fill', 'freeze'); - if (conflictswith) { - var attr = anims[i].getAttribute('attr'); - var siblings = anims[i].parentElement.children; - for (var j = 0; j < siblings.length; j++) { - if (siblings[j].classList.contains(conflictswith) - && attr === siblings[j].getAttribute('attr')) - break; - } - if (j !== siblings.length) - continue; - } - anims[i].beginElement(); - anims[i].setAttribute('dur', state ? '1s': 'indefinite'); - } -}; - -/** Callback for when a diff checkbox is clicked. - * Animates the diff and, if checked, unsets any conflicting diffs. - */ -var onDiffClick = function(target) { - setAnimation(target.name, target.checked); - if (!target.checked) - return; - var row = target; - var td = undefined; - while (row.tagName !== 'TR') { - td = row; - row = row.parentElement; - } - for (var i = 0; i < row.children.length; i++) { - if (row.children[i] === td) - continue; - var checkboxes = row.children[i].getElementsByTagName('input'); - for (var j = 0; j < checkboxes.length; j++) { - if (checkboxes[j].checked) { - checkboxes[j].checked = false; - setAnimation(checkboxes[j].name, false, target.name); - } - } - } -}; - -/** Handles restarting animations when a page header is held down. - * Also updates the history to include the page number. - */ -var onHeaderMouse = function(evt, down) { - pushHash(evt.target.parentElement.id); - for (var tag in {animate:0, animateTransform:0}) { - var anims = evt.target.parentElement.getElementsByTagName(tag); - for (var i = 0; i < anims.length; i++) { - var hasattr = anims[i].hasAttribute('oldDur'); - if (down && !hasattr) { - var olddur = anims[i].getAttribute('dur'); - if (olddur === null || olddur === 'indefinite') - continue; - anims[i].setAttribute('oldDur', olddur); - anims[i].beginElement(); - anims[i].setAttribute('dur', 'indefinite'); - } else if (!down && hasattr) { - anims[i].beginElement(); - anims[i].setAttribute('dur', anims[i].getAttribute('oldDur')); - anims[i].removeAttribute('oldDur'); - } else { - continue; - } - } - } -}; - -/** Callback on clicking the highlight all button for lists of diffs. - * FIXME: this isn't optimized at all - */ -var onHighlightAllClick = function(target) { - while (target.tagName !== 'TABLE') - target = target.parentElement; - // Erase existing highlights - highlight(); - // Highlight everything - var inputs = target.getElementsByTagName('input'); - for (var i = 0; i < inputs.length; i++) { - if (inputs[i].type === 'checkbox' && inputs[i].checked) { - var anims = document.getElementsByClassName(inputs[i].name); - for (var j = 0; j < anims.length; j++) { - highlight(anims[j].parentElement); - } - } - } -}; - - -/** Callback on clicking the expand button for lists of diffs. - */ -var onExpandClick = function(target) { - var show = target.value === '+'; - var row = target; - var func = (function(e){ - if (show) { - e.removeAttribute('hidden'); - } else { - e.setAttribute('hidden', null); - } - }); - while (row.tagName !== 'TR') - row = row.parentElement; - for (var i = 1; i < row.children.length; i++) - func(row.children[i]); - while (row = row.nextElementSibling) { - if (row.getElementsByTagName('th').length) - break; - func(row); - } - target.value = (show ? '-' : '+'); -}; - -/** Validation function to ensure conflicts have been resolved. - */ -var onSubmit = function() { - var rows = document.getElementsByClassName('conflict'); - for (var i = 0; i < rows.length; i++) { - var checks = rows[i].getElementsByTagName('input'); - for (var j = 0; j < checks.length; j++) { - if (checks[j].checked) - break; - } - if (j === checks.length) { - return confirm( - 'Some conflicts do not have any changes selected.\n' - + 'Unselected changes will be abandoned entirely.\n' - + '\n' - + 'Accept anyway?' - ); - } - } - return true; -}; - -/** Callback function when clicking on an instance. - * Updates the location with the instance's path. - */ -var onInstanceClick = function(target) { - while (target && !target.id) - target = target.parentElement; - if (target) { - // If this is the only instance of this refdes, strip the symbol suffix - var refdes = target.id.split('.')[0]; - if (document.querySelectorAll("[id^='" + refdes + ".']").length > 1) { - pushHash(target.id); - } else { - pushHash(refdes); - } - if (target.classList.contains('highlight')) { - highlight(); - } else { - highlight(target); - } - } -}; - -/** Updates the back/forward history with a new target (if not redundant). - */ -var pushHash = function(target) { - window.history.replaceState(null, '', '#' + target); -}; - -/** Highlights an element and removes other highlights. - */ -var highlight = function(elem, scroll) { - // Remove old highlights - if (scroll || !elem) { - var highlighted = document.getElementsByClassName('highlight'); - for (var i = 0; i < highlighted.length; i++) { - if (highlighted[i] !== elem) { - // This removes the item from the array, so don't advance i - highlighted[i--].classList.remove('highlight'); - } - } - } - if (elem) { - // In the case of a multi-highlight, ensure we're not redundant - if (!scroll) { - // Check parents - var p = elem; - while (p = p.parentElement) { - if (p.classList.contains('highlight')) - return; - } - // Clear children - var highlighted = elem.getElementsByClassName('highlight'); - for (var i = 0; i < highlighted.length; i++) { - if (highlighted[i] !== elem) { - // This removes the item from the array, so don't advance i - highlighted[i--].classList.remove('highlight'); - } - } - } - /** - * Vertical and horizontal lines have zero area, so the highlight filter - * causes the line to no longer render. Add an invisible 1x1 rect in this - * case to the group to work around the issue. - */ - var box = elem.getBoundingClientRect(); - if (elem.tagName === 'g' && (!box.width || !box.height)) { - var subg = elem.getElementsByTagName('g'); - subg = subg.length ? subg[subg.length-1] : elem; - var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect'); - rect.setAttribute('width', 1); - rect.setAttribute('height', 1); - rect.setAttribute('opacity', 0); - subg.appendChild(rect); - } - elem.classList.add('highlight'); - if (scroll) { - // Only scroll if the midpoint of element is not currently visible - var midX = box.left + box.width / 2; - var midY = box.top + box.height / 2; - if (midX < 0 || midX > window.innerWidth || - midY < 0 || midY > window.innerHeight) { - elem.scrollIntoView({block: 'center', inline: 'center'}); - } - } - } -}; - -/** Flips between light and dark color schemes. - */ -var invert = function() { - if (dark === null) { - // Grab the current color scheme - var svgs = document.getElementsByTagName('svg'); - if (svgs.length && svgs[0].style['background-color'] === 'black') { - dark = true; - } else if (svgs.length && svgs[0].style['background-color'] === 'white') { - dark = false; - } else { - return; - } - } - dark = !dark; - var bgcolor = dark ? 'black' : 'white'; - // For readability, some colors are tweaked in dark vs light schematics - var colormap = { - black: 'white', - green: 'lime', - goldenrod: 'yellow', - darkviolet: 'violet', - dodgerblue: 'skyblue', - deeppink: 'pink', - } - // Invert the table for light mode - if (!dark) { - var rev = {}; - for (var key in colormap) - rev[colormap[key]] = key; - colormap = rev; - } - // Update colors - // TODO: determine if it's faster to do this via css variables, in order to - // avoid all the DOM updates. - // FIXME: inverting before the page is fully loaded causes later pages to not - // be inverted. Add a step at the end of page load to correct this. - var applyMap = function(elem) { - for (var attr in {stroke:0, fill:0}) { - var color = elem.getAttribute(attr); - if (color in colormap) - elem.setAttribute(attr, colormap[color]); - } - for (var i = 0; i < elem.children.length; i++) { - applyMap(elem.children[i]); - } - }; - var svgs = document.getElementsByTagName('svg'); - for (var i = 0; i < svgs.length; i++) { - // If the bgcolor is already correct, the pages are out of sync. Skip it. - if (svgs[i].style['background-color'] === bgcolor) { - continue; - } - svgs[i].style['background-color'] = bgcolor; - applyMap(svgs[i]); - } -}; - -/** Navigates to the referenced target when back/forward are hit. - */ -window.onpopstate = function(evt) { - var refdes = window.location.hash.replace('#', '').toUpperCase(); - if (!refdes) - return; - var elem = document.getElementById(refdes) || - document.getElementById(refdes.toLowerCase()); - if (elem) { - highlight(elem, true); - return; - } - // If there's no exact match, exclude symbol index and try again. - var groups = document.getElementsByTagName('g'); - for (var i = 0; i < groups.length; i++) { - if (groups[i].id.split('.')[0] === refdes) { - highlight(groups[i], true); - return; - } - } -}; - -/** Takes an element and linkifies it, applying a provided function to the text - * contents to generate the link target. - */ -var onTextClick = function(text, linkfunc) { - while (text.lastChild) - text = text.lastChild; - var href = linkfunc(text.textContent.trim()); - if (href[0] === '#') { - window.location.hash = href.substr(1); - } else { - window.open(href); - } -}; - -/** General mousemove handler. - * Used to upgrade clickable things to links without slowing down initial load - * time. - */ -window.onmousemove = function(evt) { - var target = evt.target; - if (target.tagname === 'tspan') - target = target.parentElement; - if (target.tagName === 'text') { - var propname = target.getElementsByTagName('title'); - propname = propname.length ? propname[0].textContent.replace('$', '') : ''; - if (propname === 'AGILE_PN' || propname.startsWith('XR')) { - target.setAttribute('cursor', 'pointer'); - } - } -}; - -/** General click handler. Dispatches as appropriate. - */ -window.onclick = function(evt) { - var target = evt.target; - // Process inputs - if (target.type === 'checkbox') { - return onDiffClick(target); - } else if (target.type === 'button') { - if (target.value.length === 1) { - return onExpandClick(target); - } else { - return onHighlightAllClick(target); - } - } - // Process text clicks - // Clicking on tspan is the same as clicking on text - if (target.tagname === 'tspan') - target = target.parentElement; - if (target.tagName === 'text') { - var propname = target.getElementsByTagName('title'); - propname = propname.length ? propname[0].textContent.replace('$', '') : ''; - if (propname === 'AGILE_PN') { - return onTextClick(target, function(t) { - return 'https://goto.google.com/ee-part/G' + t.replace('G', ''); - }); - } else if (propname.startsWith('XR')) { - return onTextClick(target, function(t) { - // FIXME: this will be wrong on hierarchical designs if the - // module order isn't properly followed. - // TODO: some XR formats end with the page location (eg F7). - // use this to find the right location to scroll to. - return '#page' + parseInt(t); - }); - } - } - // If it wasn't the above, find the ancestor with an id set (if any) - while (target && !target.id) - target = target.parentElement; - if (!target) - return; - // If the ancestor is a g tag, it's an instance. - if (target.tagName === 'g') { - return onInstanceClick(target); - } -}; - -/** General double-click handler. Dispatches as appropriate. - */ -window.ondblclick = function(evt) { - var target = evt.target; - // Process text doubleclicks - // Clicking on tspan is the same as clicking on text - if (target.tagname === 'tspan') - target = target.parentElement; - if (target.tagName === 'text') { - var propname = target.getElementsByTagName('title'); - propname = propname.length ? propname[0].textContent.replace('$', '') : ''; - // Double-clicking on net names triggers a search for the next one. - if (propname === 'SIG_NAME' || propname === 'HDL_POWER') { - while (target.lastChild) - target = target.lastChild; - window.find(target.textContent.trim(), - true, false, true, true, false, true); - return; - } - } - // Double-clicking on random blank spaces will flip the colors. - // TODO: make a floating toolbar with zoom/invert/goto/etc instead - if (target.tagName === 'DIV' || target.tagName === 'HTML') { - invert(); - return; - } -}; - -/** Use css transform to scale the page instead of allowing the browser to zoom - * and reflow. This is waaaaaay faster. - * x, y -- point in client space to keep constant when zooming. - * if not provided, assume middle of the window. - */ -var setZoom = function(newZoom, x, y) { - newZoom = Math.min(10, Math.max(0.5, newZoom)); - if (x === undefined) { - x = window.innerWidth / 2; - y = window.innerHeight / 2; - } - x += window.scrollX; - y += window.scrollY; - document.documentElement.style['transform-origin'] = '0 0'; - document.documentElement.style['transform'] = 'scale(' + newZoom + ')'; - window.scrollBy(x*(newZoom/zoom-1), y*(newZoom/zoom-1)); - zoom = newZoom; -}; - -/** Captures keydown events to capture zoom. - */ -window.onkeydown = function(evt) { - if (evt.ctrlKey && (evt.code === 'Equal' || evt.code === 'Plus')) { - setZoom(zoom*1.1); - evt.preventDefault(); - } else if (evt.ctrlKey && evt.code === 'Minus') { - setZoom(zoom/1.1); - evt.preventDefault(); - } else if (evt.ctrlKey && evt.code === 'Digit0') { - setZoom(1); - evt.preventDefault(); - } -}; - -/** Captures wheel events to capture zoom. - * Note that this has to be added via addEventListener with {passive: true}, - * since browsers nowadays assume passivity for this event. - */ -window.addEventListener("wheel", function(evt) { - if (evt.ctrlKey) { - // Dividing by 500 seems to make zoom rate about the same as keyboard - setZoom(zoom * Math.exp(-evt.deltaY * (evt.deltaMode ? 120 : 1) / 500), - evt.clientX, evt.clientY); - evt.preventDefault(); - } -}, {passive: false}); - -/** Run on page load. Injects event handlers and other interface improvements. - */ -window.onload = function() { - // Inject header interactions - var headers = document.getElementsByTagName('h1'); - for (var i = 0; i < headers.length; i++) { - headers[i].addEventListener('mousedown', function(e){onHeaderMouse(e, 1)}); - headers[i].addEventListener('mouseup', function(e){onHeaderMouse(e, 0)}); - } - - // Trigger animations for alread-checked diffs - var inputs = document.getElementsByTagName('input'); - for (var i = 0; i < inputs.length; i++) { - if (inputs[i].type === 'checkbox' && inputs[i].checked) - setAnimation(inputs[i].name, true); - } - - // Now that everything's ready, try to scroll to the item requested in the URL - window.onpopstate(); -}; -</script> -<style> -@media print { - @page { - size: tabloid landscape; - } - h1,hr { - display: none; - } - div > svg { - page-break-after: always; - } - html { - transform: none !important; - } -} -.highlight { - filter: url(#highlight); -} -tr.conflict { - background-color: tomato; -} -th.expander { - text-align: left; - white-space: nowrap; -} -th.expander input { - font-family: mono; -} -</style> -<div id="page1"> -<h1>dragonclaw/page1: TABLE OF CONTENTS</h1> -<div> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,-5500,8500,5500" width="14.87500in" height="9.62500in" font-family="monospace" font-size="47.000000" stroke-width="3" style="background-color:white"> -<symbol id="symbol:border_b.3" overflow="visible"> -<line x1="8495" y1="-5" x2="5" y2="-5" stroke-width="6"></line> -<line x1="8495" y1="-5495" x2="8495" y2="-5" stroke-width="6"></line> -<line x1="5" y1="-5495" x2="5" y2="-5" stroke-width="6"></line> -<line x1="8495" y1="-5495" x2="5" y2="-5495" stroke-width="6"></line> -<line x1="8425" y1="-75" x2="75" y2="-75"></line> -<line x1="8425" y1="-5425" x2="8425" y2="-75"></line> -<line x1="75" y1="-75" x2="75" y2="-5425"></line> -<line x1="8425" y1="-5425" x2="75" y2="-5425"></line> -<line x1="70" y1="-70" x2="8430" y2="-70"></line> -<line x1="70" y1="-5430" x2="70" y2="-70"></line> -<line x1="8430" y1="-5430" x2="8430" y2="-70"></line> -<line x1="8430" y1="-5430" x2="70" y2="-5430"></line> -<line x1="8500" stroke-width="6"></line> -<line x1="8500" y1="-5500" x2="8500" stroke-width="6"></line> -<line y2="-5500" stroke-width="6"></line> -<line x1="8500" y1="-5500" y2="-5500" stroke-width="6"></line> -<line x1="5895" y1="-350" x2="8425" y2="-350" stroke-width="6"></line> -<line x1="8425" y1="-225" x2="6270" y2="-225"></line> -<line x1="6270" y1="-350" x2="6270" y2="-75" stroke-width="6"></line> -<line x1="8425" y1="-150" x2="6270" y2="-150"></line> -<line x1="8000" x2="8000" y2="-225"></line> -<line x1="4500" y1="-75" x2="4500"></line> -<line x1="5500" y1="-75" x2="5500"></line> -<line x1="5000" y1="-75" x2="5000"></line> -<line x1="7500" y1="-75" x2="7500"></line> -<line x1="7000" y1="-75" x2="7000"></line> -<line x1="2000" y1="-75" x2="2000"></line> -<line x1="2500" y1="-75" x2="2500"></line> -<line x1="1000" y1="-75" x2="1000"></line> -<line x1="500" y1="-75" x2="500"></line> -<line x1="3000" y1="-75" x2="3000"></line> -<line x1="3500" y1="-75" x2="3500"></line> -<line x1="4000" y1="-75" x2="4000"></line> -<line x1="6500" y1="-75" x2="6500"></line> -<line x1="6000" y1="-75" x2="6000"></line> -<line x1="1500" y1="-75" x2="1500"></line> -<line x1="5257" y1="-233" x2="5257" y2="-75"></line> -<line x1="5895" y1="-350" x2="5895" y2="-75" stroke-width="6"></line> -<line x1="7125" y1="-150" x2="7125" y2="-225"></line> -<line x1="8425" y1="-4500" x2="8500" y2="-4500"></line> -<line x1="8425" y1="-5000" x2="8500" y2="-5000"></line> -<line x1="8425" y1="-3000" x2="8500" y2="-3000"></line> -<line x1="8425" y1="-2500" x2="8500" y2="-2500"></line> -<line x1="8425" y1="-4000" x2="8500" y2="-4000"></line> -<line x1="8425" y1="-3500" x2="8500" y2="-3500"></line> -<line x1="8425" y1="-2000" x2="8500" y2="-2000"></line> -<line x1="8425" y1="-500" x2="8500" y2="-500"></line> -<line x1="8425" y1="-1500" x2="8500" y2="-1500"></line> -<line x1="8425" y1="-1000" x2="8500" y2="-1000"></line> -<line x1="8000" y1="-5495" x2="8000" y2="-5425"></line> -<line x1="7500" y1="-5495" x2="7500" y2="-5425"></line> -<line x1="6500" y1="-5495" x2="6500" y2="-5425"></line> -<line x1="7000" y1="-5495" x2="7000" y2="-5425"></line> -<line x1="6000" y1="-5495" x2="6000" y2="-5425"></line> -<line x1="5500" y1="-5495" x2="5500" y2="-5425"></line> -<line x1="5000" y1="-5495" x2="5000" y2="-5425"></line> -<line x1="4500" y1="-5495" x2="4500" y2="-5425"></line> -<line x1="4000" y1="-5495" x2="4000" y2="-5425"></line> -<line x1="3500" y1="-5495" x2="3500" y2="-5425"></line> -<line x1="2500" y1="-5495" x2="2500" y2="-5425"></line> -<line x1="3000" y1="-5495" x2="3000" y2="-5425"></line> -<line x1="1000" y1="-5495" x2="1000" y2="-5425"></line> -<line x1="500" y1="-5495" x2="500" y2="-5425"></line> -<line x1="2000" y1="-5495" x2="2000" y2="-5425"></line> -<line x1="1500" y1="-5495" x2="1500" y2="-5425"></line> -<line x1="70" y1="-233" x2="5257" y2="-233"></line> -<line x1="5" y1="-4500" x2="70" y2="-4500"></line> -<line x1="5" y1="-5000" x2="70" y2="-5000"></line> -<line x1="5" y1="-4000" x2="70" y2="-4000"></line> -<line x1="5" y1="-3000" x2="70" y2="-3000"></line> -<line x1="5" y1="-2500" x2="70" y2="-2500"></line> -<line x1="5" y1="-3500" x2="70" y2="-3500"></line> -<line x1="5" y1="-2000" x2="70" y2="-2000"></line> -<line x1="5" y1="-1500" x2="70" y2="-1500"></line> -<line x1="5" y1="-500" x2="70" y2="-500"></line> -<line x1="5" y1="-1000" x2="70" y2="-1000"></line> -<text stroke="none" x="150" y="-150" font-size="24">THIS WORK IS LICENSED UNDER A CREATIVE COMMONS ATTRIBUTION 4.0 BY LICENSE.</text> -<text stroke="none" x="250" y="-25" font-size="40" text-anchor="middle">1</text> -<text stroke="none" x="6279" y="-191" font-size="30">DESIGN:</text> -<text stroke="none" x="6279" y="-265" font-size="30">TITLE:</text> -<text stroke="none" x="6282" y="-315" font-size="30">PAGE</text> -<text stroke="none" x="6250" y="-25" font-size="40" text-anchor="middle">13</text> -<text stroke="none" x="7154" y="-191" font-size="30">DOC NUMBER:</text> -<text stroke="none" x="8007" y="-81" font-size="30">FLAT:</text> -<text stroke="none" x="7750" y="-25" font-size="40" text-anchor="middle">16</text> -<text stroke="none" x="8250" y="-5450" font-size="40" text-anchor="middle">17</text> -<text stroke="none" x="8250" y="-25" font-size="40" text-anchor="middle">17</text> -<text stroke="none" x="4250" y="-5450" font-size="40" text-anchor="middle">9</text> -<text stroke="none" x="8462" y="-5250" font-size="34" text-anchor="middle">L</text> -<text stroke="none" x="8462" y="-4750" font-size="34" text-anchor="middle">K</text> -<text stroke="none" x="8462" y="-4250" font-size="40" text-anchor="middle">J</text> -<text stroke="none" x="8462" y="-3750" font-size="40" text-anchor="middle">H</text> -<text stroke="none" x="8462" y="-3250" font-size="40" text-anchor="middle">G</text> -<text stroke="none" x="8462" y="-2750" font-size="40" text-anchor="middle">F</text> -<text stroke="none" x="8462" y="-2250" font-size="40" text-anchor="middle">E</text> -<text stroke="none" x="8462" y="-1750" font-size="40" text-anchor="middle">D</text> -<text stroke="none" x="8462" y="-1250" font-size="40" text-anchor="middle">C</text> -<text stroke="none" x="8462" y="-750" font-size="40" text-anchor="middle">B</text> -<text stroke="none" x="8462" y="-250" font-size="40" text-anchor="middle">A</text> -<text stroke="none" x="38" y="-5250" font-size="34" text-anchor="middle">L</text> -<text stroke="none" x="38" y="-3250" font-size="40" text-anchor="middle">G</text> -<text stroke="none" x="38" y="-2750" font-size="40" text-anchor="middle">F</text> -<text stroke="none" x="38" y="-2250" font-size="40" text-anchor="middle">E</text> -<text stroke="none" x="38" y="-1750" font-size="40" text-anchor="middle">D</text> -<text stroke="none" x="38" y="-1250" font-size="40" text-anchor="middle">C</text> -<text stroke="none" x="38" y="-750" font-size="40" text-anchor="middle">B</text> -<text stroke="none" x="250" y="-5450" font-size="40" text-anchor="middle">1</text> -<text stroke="none" x="750" y="-5450" font-size="40" text-anchor="middle">2</text> -<text stroke="none" x="1250" y="-5450" font-size="40" text-anchor="middle">3</text> -<text stroke="none" x="2250" y="-5450" font-size="40" text-anchor="middle">5</text> -<text stroke="none" x="2750" y="-5450" font-size="40" text-anchor="middle">6</text> -<text stroke="none" x="3250" y="-5450" font-size="40" text-anchor="middle">7</text> -<text stroke="none" x="3750" y="-5450" font-size="40" text-anchor="middle">8</text> -<text stroke="none" x="4750" y="-5450" font-size="40" text-anchor="middle">10</text> -<text stroke="none" x="5250" y="-5450" font-size="40" text-anchor="middle">11</text> -<text stroke="none" x="5750" y="-5450" font-size="40" text-anchor="middle">12</text> -<text stroke="none" x="6250" y="-5450" font-size="40" text-anchor="middle">13</text> -<text stroke="none" x="6750" y="-5450" font-size="40" text-anchor="middle">14</text> -<text stroke="none" x="7750" y="-5450" font-size="40" text-anchor="middle">16</text> -<text stroke="none" x="1750" y="-25" font-size="40" text-anchor="middle">4</text> -<text stroke="none" x="2250" y="-25" font-size="40" text-anchor="middle">5</text> -<text stroke="none" x="2750" y="-25" font-size="40" text-anchor="middle">6</text> -<text stroke="none" x="3250" y="-25" font-size="40" text-anchor="middle">7</text> -<text stroke="none" x="3750" y="-25" font-size="40" text-anchor="middle">8</text> -<text stroke="none" x="4250" y="-25" font-size="40" text-anchor="middle">9</text> -<text stroke="none" x="1750" y="-5450" font-size="40" text-anchor="middle">4</text> -<text stroke="none" x="750" y="-25" font-size="40" text-anchor="middle">2</text> -<text stroke="none" x="38" y="-4250" font-size="40" text-anchor="middle">J</text> -<text stroke="none" x="1250" y="-25" font-size="40" text-anchor="middle">3</text> -<text stroke="none" x="6750" y="-25" font-size="40" text-anchor="middle">14</text> -<text stroke="none" x="7250" y="-25" font-size="40" text-anchor="middle">15</text> -<text stroke="none" x="8007" y="-116" font-size="30">PAGE:</text> -<text stroke="none" x="8007" y="-192" font-size="30">REV:</text> -<text stroke="none" x="38" y="-4750" font-size="34" text-anchor="middle">K</text> -<text stroke="none" x="6279" y="-115" font-size="30">MODIFIED:</text> -<text stroke="none" x="5250" y="-25" font-size="40" text-anchor="middle">11</text> -<text stroke="none" x="4750" y="-25" font-size="40" text-anchor="middle">10</text> -<text stroke="none" x="38" y="-250" font-size="40" text-anchor="middle">A</text> -<text stroke="none" x="38" y="-3750" font-size="40" text-anchor="middle">H</text> -<text stroke="none" x="5750" y="-25" font-size="40" text-anchor="middle">12</text> -<text stroke="none" x="7250" y="-5450" font-size="40" text-anchor="middle">15</text> -<g transform="translate(6082,-215)"> -<image href="data:image/jpg;base64,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" x="-182" y="-134" width="365" height="268"></image> -</g> -</symbol> -<symbol id="symbol:al_toc.1" overflow="visible"> -<line x1="3300" y1="200" x2="6025" y2="200" stroke-width="6"></line> -<line x1="3300" x2="6025" stroke-width="6"></line> -<line x1="3300" x2="3300" y2="3225" stroke-width="6"></line> -<line x1="6025" x2="6025" y2="3225" stroke-width="6"></line> -<line x1="3300" y1="3225" x2="6025" y2="3225" stroke-width="6"></line> -<line y1="2425" x2="2725" y2="2425"></line> -<line x1="2725" x2="2725" y2="3225" stroke-width="6"></line> -<line y2="3225" stroke-width="6"></line> -<line x1="2725" y1="3225" y2="3225" stroke-width="6"></line> -<line x1="2725" stroke-width="6"></line> -<line x1="3750" x2="3750" y2="3225" stroke-width="6"></line> -<line x1="3300" y1="1425" x2="6025" y2="1425"></line> -<line x1="3300" y1="2525" x2="6025" y2="2525"></line> -<line x1="3300" y1="2625" x2="6025" y2="2625"></line> -<line x1="3300" y1="3025" x2="6025" y2="3025"></line> -<line x1="3300" y1="3125" x2="6025" y2="3125"></line> -<line x1="3300" y1="2925" x2="6025" y2="2925"></line> -<line x1="3300" y1="2125" x2="6025" y2="2125"></line> -<line x1="3300" y1="1125" x2="6025" y2="1125"></line> -<line x1="3300" y1="2825" x2="6025" y2="2825"></line> -<line x1="3300" y1="2725" x2="6025" y2="2725"></line> -<line x1="3300" y1="1925" x2="6025" y2="1925"></line> -<line x1="3300" y1="325" x2="6025" y2="325"></line> -<line x1="3300" y1="1725" x2="6025" y2="1725"></line> -<line x1="3300" y1="1825" x2="6025" y2="1825"></line> -<line x1="3300" y1="625" x2="6025" y2="625"></line> -<line x1="3300" y1="825" x2="6025" y2="825"></line> -<line x1="3300" y1="925" x2="6025" y2="925"></line> -<line x1="3300" y1="1025" x2="6025" y2="1025"></line> -<line x1="3300" y1="1225" x2="6025" y2="1225"></line> -<line x1="3300" y1="1325" x2="6025" y2="1325"></line> -<line x1="3300" y1="1525" x2="6025" y2="1525"></line> -<line x1="3300" y1="1625" x2="6025" y2="1625"></line> -<line x1="3300" y1="2425" x2="6025" y2="2425"></line> -<line x1="3300" y1="2325" x2="6025" y2="2325"></line> -<line x1="3300" y1="2225" x2="6025" y2="2225"></line> -<line x1="3300" y1="2025" x2="6025" y2="2025"></line> -<line x1="3300" y1="725" x2="6025" y2="725"></line> -<line x1="3300" y1="525" x2="6025" y2="525"></line> -<line x1="3300" y1="425" x2="6025" y2="425"></line> -<line x1="450" x2="450" y2="3225" stroke-width="6"></line> -<line y1="1325" x2="2725" y2="1325"></line> -<line y1="1725" x2="2725" y2="1725"></line> -<line y1="2025" x2="2725" y2="2025"></line> -<line y1="2325" x2="2725" y2="2325"></line> -<line y1="2725" x2="2725" y2="2725"></line> -<line y1="2825" x2="2725" y2="2825"></line> -<line y1="625" x2="2725" y2="625"></line> -<line y1="325" x2="2725" y2="325"></line> -<line y1="425" x2="2725" y2="425"></line> -<line y1="825" x2="2725" y2="825"></line> -<line y1="925" x2="2725" y2="925"></line> -<line y1="1225" x2="2725" y2="1225"></line> -<line y1="1125" x2="2725" y2="1125"></line> -<line y1="725" x2="2725" y2="725"></line> -<line y1="200" x2="2725" y2="200" stroke-width="6"></line> -<line y1="525" x2="2725" y2="525"></line> -<line y1="1525" x2="2725" y2="1525"></line> -<line y1="3025" x2="2725" y2="3025"></line> -<line y1="2125" x2="2725" y2="2125"></line> -<line y1="2225" x2="2725" y2="2225"></line> -<line y1="3125" x2="2725" y2="3125"></line> -<line y1="2925" x2="2725" y2="2925"></line> -<line y1="2625" x2="2725" y2="2625"></line> -<line y1="2525" x2="2725" y2="2525"></line> -<line y1="1425" x2="2725" y2="1425"></line> -<line y1="1825" x2="2725" y2="1825"></line> -<line y1="1925" x2="2725" y2="1925"></line> -<line y1="1025" x2="2725" y2="1025"></line> -<line y1="1625" x2="2725" y2="1625"></line> -<text stroke="none" x="775" y="150" font-size="47">SHEET NAME</text> -<text stroke="none" x="4050" y="125" font-size="47">SHEET NAME</text> -<text stroke="none" x="25" y="150" font-size="47">SHEET NO.</text> -<text stroke="none" x="3375" y="125" font-size="47">SHEET NO.</text> -<text stroke="none" x="532" y="-51" font-size="93">TABLE OF CONTENTS</text> -</symbol> -<symbol id="symbol:gnd.1" overflow="visible"> -<line x1="37" y1="-19" x2="63" y2="-19"></line> -<line x1="43" y1="-12" x2="57" y2="-12"></line> -<line x1="31" y1="-26" x2="69" y2="-26"></line> -<line x1="25" y1="-33" x2="75" y2="-33"></line> -<line x1="50" y1="-50" x2="50" y2="-33"></line> -</symbol> -<symbol id="symbol:stm32f412.2" overflow="visible"> -<line x1="-400" y1="-900" x2="-400" y2="750"></line> -<line x1="400" y1="-900" x2="400" y2="750"></line> -<line x1="-400" y1="-900" x2="400" y2="-900"></line> -<line x1="-400" y1="750" x2="400" y2="750"></line> -<line x1="-500" y1="-500" x2="-400" y2="-500"></line> -<line x1="500" y1="-800" x2="400" y2="-800"></line> -<line x1="500" y1="-750" x2="400" y2="-750"></line> -<line x1="500" y1="-700" x2="400" y2="-700"></line> -<line x1="500" y1="-600" x2="400" y2="-600"></line> -<line x1="500" y1="-550" x2="400" y2="-550"></line> -<line x1="-500" y1="500" x2="-400" y2="500"></line> -<line x1="500" y1="500" x2="400" y2="500"></line> -<line x1="-500" y1="-700" x2="-400" y2="-700"></line> -<line x1="-500" y1="-400" x2="-400" y2="-400"></line> -<line x1="-500" y1="-350" x2="-400" y2="-350"></line> -<line x1="-500" y1="-300" x2="-400" y2="-300"></line> -<line x1="-500" y1="-250" x2="-400" y2="-250"></line> -<line x1="-500" y1="-200" x2="-400" y2="-200"></line> -<line x1="-500" y1="-150" x2="-400" y2="-150"></line> -<line x1="-500" y1="-100" x2="-400" y2="-100"></line> -<line x1="-500" y1="-50" x2="-400" y2="-50"></line> -<line x1="500" y1="-400" x2="400" y2="-400"></line> -<line x1="500" y1="-350" x2="400" y2="-350"></line> -<line x1="500" y1="-300" x2="400" y2="-300"></line> -<line x1="500" y1="150" x2="400" y2="150"></line> -<line x1="-500" y1="-550" x2="-400" y2="-550"></line> -<line x1="500" y1="600" x2="400" y2="600"></line> -<line x1="-500" y1="-800" x2="-400" y2="-800"></line> -<line x1="500" y1="200" x2="400" y2="200"></line> -<line x1="500" y1="250" x2="400" y2="250"></line> -<line x1="500" y1="300" x2="400" y2="300"></line> -<line x1="500" y1="350" x2="400" y2="350"></line> -<line x1="-500" x2="-400"></line> -<line x1="-500" y1="50" x2="-400" y2="50"></line> -<line x1="-500" y1="100" x2="-400" y2="100"></line> -<line x1="-500" y1="150" x2="-400" y2="150"></line> -<line x1="-500" y1="200" x2="-400" y2="200"></line> -<line x1="-500" y1="250" x2="-400" y2="250"></line> -<line x1="500" y1="650" x2="400" y2="650"></line> -<line x1="-500" y1="-750" x2="-400" y2="-750"></line> -<line x1="-500" y1="300" x2="-400" y2="300"></line> -<line x1="-500" y1="350" x2="-400" y2="350"></line> -<line x1="500" y1="-250" x2="400" y2="-250"></line> -<line x1="500" y1="-200" x2="400" y2="-200"></line> -<line x1="500" y1="-150" x2="400" y2="-150"></line> -<line x1="500" y1="-100" x2="400" y2="-100"></line> -<line x1="500" y1="-50" x2="400" y2="-50"></line> -<line x1="-500" y1="600" x2="-400" y2="600"></line> -<line x1="500" x2="400"></line> -<line x1="500" y1="50" x2="400" y2="50"></line> -<line x1="-500" y1="-850" x2="-400" y2="-850"></line> -<line x1="500" y1="550" x2="400" y2="550"></line> -<line x1="500" y1="700" x2="400" y2="700"></line> -<text stroke="none" y="-342" font-size="32" text-anchor="middle">stm32f412</text> -<text stroke="none" x="-390" y="-499" font-size="24">VBAT</text> -<text stroke="none" x="390" y="-800" font-size="24" text-anchor="end">PC13</text> -<text stroke="none" x="390" y="-750" font-size="24" text-anchor="end">PC14-OSC32_IN</text> -<text stroke="none" x="390" y="-700" font-size="24" text-anchor="end">PC15-OSC32_OUT</text> -<text stroke="none" x="390" y="-600" font-size="24" text-anchor="end">PH0-OSC_IN</text> -<text stroke="none" x="390" y="-550" font-size="24" text-anchor="end">PH1-OSC_OUT</text> -<text stroke="none" x="-390" y="500" font-size="24">NRST</text> -<text stroke="none" x="390" y="500" font-size="24" text-anchor="end">VSSA/VREF</text> -<text stroke="none" x="-390" y="-699" font-size="24">VDDA/VREF+</text> -<text stroke="none" x="-390" y="-400" font-size="24">PA0</text> -<text stroke="none" x="-390" y="-350" font-size="24">PA1</text> -<text stroke="none" x="-390" y="-300" font-size="24">PA2</text> -<text stroke="none" x="-390" y="-250" font-size="24">PA3</text> -<text stroke="none" x="-390" y="-200" font-size="24">PA4</text> -<text stroke="none" x="-390" y="-150" font-size="24">PA5</text> -<text stroke="none" x="-390" y="-100" font-size="24">PA6</text> -<text stroke="none" x="-390" y="-50" font-size="24">PA7</text> -<text stroke="none" x="390" y="-400" font-size="24" text-anchor="end">PB0</text> -<text stroke="none" x="390" y="-350" font-size="24" text-anchor="end">PB1</text> -<text stroke="none" x="390" y="-300" font-size="24" text-anchor="end">PB2</text> -<text stroke="none" x="390" y="150" font-size="24" text-anchor="end">PB10</text> -<text stroke="none" x="-390" y="-549" font-size="24">VCAP_1</text> -<text stroke="none" x="390" y="600" font-size="24" text-anchor="end">VSS1</text> -<text stroke="none" x="-390" y="-800" font-size="24">VDD1</text> -<text stroke="none" x="390" y="200" font-size="24" text-anchor="end">PB12</text> -<text stroke="none" x="390" y="250" font-size="24" text-anchor="end">PB13</text> -<text stroke="none" x="390" y="300" font-size="24" text-anchor="end">PB14</text> -<text stroke="none" x="390" y="351" font-size="24" text-anchor="end">PB15</text> -<text stroke="none" x="-390" font-size="24">PA8</text> -<text stroke="none" x="-390" y="50" font-size="24">PA9</text> -<text stroke="none" x="-390" y="100" font-size="24">PA10</text> -<text stroke="none" x="-390" y="151" font-size="24">PA11</text> -<text stroke="none" x="-390" y="201" font-size="24">PA12</text> -<text stroke="none" x="-390" y="251" font-size="24">PA13</text> -<text stroke="none" x="390" y="650" font-size="24" text-anchor="end">VSS2</text> -<text stroke="none" x="-390" y="-750" font-size="24">VDD2</text> -<text stroke="none" x="-390" y="301" font-size="24">PA14</text> -<text stroke="none" x="-390" y="351" font-size="24">PA15</text> -<text stroke="none" x="390" y="-250" font-size="24" text-anchor="end">PB3</text> -<text stroke="none" x="390" y="-200" font-size="24" text-anchor="end">PB4</text> -<text stroke="none" x="390" y="-150" font-size="24" text-anchor="end">PB5</text> -<text stroke="none" x="390" y="-100" font-size="24" text-anchor="end">PB6</text> -<text stroke="none" x="390" y="-50" font-size="24" text-anchor="end">PB7</text> -<text stroke="none" x="-390" y="600" font-size="24">BOOT0</text> -<text stroke="none" x="390" font-size="24" text-anchor="end">PB8</text> -<text stroke="none" x="390" y="50" font-size="24" text-anchor="end">PB9</text> -<text stroke="none" x="-390" y="-849" font-size="24">VDD0</text> -<text stroke="none" x="390" y="550" font-size="24" text-anchor="end">VSS0</text> -<text stroke="none" x="390" y="699" font-size="24" text-anchor="end">G1</text> -</symbol> -<symbol id="symbol:res.1" overflow="visible"> -<line x1="19" y1="6" x2="-22" y2="-14"></line> -<line x1="-23" y1="25" x2="19" y2="6"></line> -<line x1="-22" y1="-14" x2="18" y2="-34"></line> -<line x1="-22" y1="-54" x2="18" y2="-34"></line> -<line y1="36" x2="-23" y2="25"></line> -<line x1="18" y1="-74" x2="-22" y2="-54"></line> -<line y1="-84" x2="18" y2="-74"></line> -<line y1="-100" y2="-84"></line> -<line y1="50" y2="36"></line> -</symbol> -<symbol id="symbol:cap.1" overflow="visible"> -<line x1="30" y1="10" x2="-30" y2="10"></line> -<line x1="30" y1="-10" x2="-30" y2="-10"></line> -<line y1="50" y2="10"></line> -<line y1="-50" y2="-10"></line> -</symbol> -<symbol id="symbol:ina3221.1" overflow="visible"> -<line x1="-150" y1="-350" x2="-150" y2="350"></line> -<line x1="-150" y1="-350" x2="150" y2="-350"></line> -<line x1="150" y1="-350" x2="150" y2="350"></line> -<line x1="-150" y1="350" x2="150" y2="350"></line> -<line x1="-200" x2="-150"></line> -<line x1="-200" y1="200" x2="-150" y2="200"></line> -<line x1="-50" y1="400" x2="-50" y2="350"></line> -<line x1="200" y1="-250" x2="150" y2="-250"></line> -<line x1="200" y1="-300" x2="150" y2="-300"></line> -<line x1="200" x2="150"></line> -<line x1="200" y1="-50" x2="150" y2="-50"></line> -<line x1="200" y1="250" x2="150" y2="250"></line> -<line x1="200" y1="200" x2="150" y2="200"></line> -<line x1="-200" y1="100" x2="-150" y2="100"></line> -<line x1="-200" y1="-150" x2="-150" y2="-150"></line> -<line x1="-200" y1="-100" x2="-150" y2="-100"></line> -<line x1="-200" y1="250" x2="-150" y2="250"></line> -<line x1="-200" y1="-300" x2="-150" y2="-300"></line> -<line x1="-200" y1="-250" x2="-150" y2="-250"></line> -<line x1="-200" y1="150" x2="-150" y2="150"></line> -<line x1="50" y1="400" x2="50" y2="350"></line> -<text stroke="none" x="-140" font-size="24">A0</text> -<text stroke="none" x="-140" y="199" font-size="24">CRITICAL</text> -<g transform="translate(-50,340)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="24">GND</text> -</g></g> -<text stroke="none" x="140" y="-249" font-size="24" text-anchor="end">IN-1</text> -<text stroke="none" x="140" y="-299" font-size="24" text-anchor="end">IN+1</text> -<text stroke="none" x="140" y="1" font-size="24" text-anchor="end">IN-2</text> -<text stroke="none" x="140" y="-49" font-size="24" text-anchor="end">IN+2</text> -<text stroke="none" x="140" y="251" font-size="24" text-anchor="end">IN-3</text> -<text stroke="none" x="140" y="201" font-size="24" text-anchor="end">IN+3</text> -<text stroke="none" x="-140" y="99" font-size="24">PV</text> -<text stroke="none" x="-140" y="-149" font-size="24">SCL</text> -<text stroke="none" x="-140" y="-100" font-size="24">SDA</text> -<text stroke="none" x="-140" y="249" font-size="24">TC</text> -<text stroke="none" x="-140" y="-300" font-size="24">VPU</text> -<text stroke="none" x="-140" y="-249" font-size="24">VS</text> -<text stroke="none" x="-140" y="149" font-size="24">WARNING</text> -<g transform="translate(49,340)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="24">G1</text> -</g></g> -</symbol> -<symbol id="symbol:res.4" overflow="visible"> -<line x1="-25" y1="-20" x2="-35"></line> -<line x1="-5" y1="20" x2="-25" y2="-20"></line> -<line x1="15" y1="-20" x2="-5" y2="20"></line> -<line x1="15" y1="-20" x2="35" y2="20"></line> -<line x1="35" y1="20" x2="55" y2="-20"></line> -<line x1="55" y1="-20" x2="75" y2="20"></line> -<line x1="75" y1="20" x2="85"></line> -<line x1="-50" x2="-35"></line> -<line x1="85" x2="100"></line> -</symbol> -<symbol id="symbol:testpoint.1" overflow="visible"> -<line x1="100"></line> -<line y1="10" x2="10" stroke-width="6"></line> -<line x1="10" y2="-10" stroke-width="6"></line> -<line y1="-5" x2="5" stroke-width="6"></line> -<line x1="5" y2="5" stroke-width="6"></line> -<line x1="-5" y2="-5" stroke-width="6"></line> -<line y1="5" x2="-5" stroke-width="6"></line> -<line x1="-10" y2="10" stroke-width="6"></line> -<line y1="-10" x2="-10" stroke-width="6"></line> -<circle r="5" fill="none"></circle> -<circle r="10" fill="none"></circle> -<circle r="10" fill="none"></circle> -</symbol> -<symbol id="symbol:non_inverting_buffer.2" overflow="visible"> -<line x1="-25" y1="50" x2="-25" y2="-50"></line> -<line x1="75" x2="-25" y2="50"></line> -<line x1="75" x2="-25" y2="-50"></line> -<line x1="150" x2="75"></line> -<line x1="-75" y1="75" x2="100" y2="75"></line> -<line x1="-75" y1="-75" x2="-75" y2="75"></line> -<line x1="100" y1="-75" x2="100" y2="75"></line> -<line x1="100" y1="-75" x2="-75" y2="-75"></line> -<line x1="-100" x2="-25"></line> -<line x1="19" y1="11" x2="1" y2="11"></line> -<line x1="10" y1="-9" x2="1"></line> -<line x1="10" y1="-9" x2="19"></line> -<line x1="10" y1="10" x2="1" y2="1"></line> -<line x1="10" y1="10" x2="19" y2="1"></line> -<line x1="50" y1="100" x2="50" y2="15"></line> -<line x1="50" y1="-100" x2="50" y2="-15"></line> -<g transform="translate(50,100)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="32">?</text> -</g></g> -<text stroke="none" x="-100" font-size="32">?</text> -<text stroke="none" x="125" y="-25" font-size="32">?</text> -<g transform="translate(50,-100)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="32">?</text> -</g></g> -</symbol> -<symbol id="symbol:led.1:m:s" overflow="visible"> -<line x1="25" y1="25" x2="-25" y2="25" stroke-width="6"></line> -<line x1="60" y1="-50" x2="70" y2="-40"></line> -<line x1="25" y1="-25" x2="-25" y2="-25" stroke-width="6"></line> -<line x1="75" y1="-25" x2="85" y2="-15"></line> -<line x1="50" y1="10" x2="80" y2="-20"></line> -<line y1="-25" y2="-50"></line> -<line x1="25" y1="25" y2="-25" stroke-width="6"></line> -<line y1="-25" x2="-25" y2="25" stroke-width="6"></line> -<line x1="35" y1="-15" x2="65" y2="-45"></line> -<line y1="25" y2="50"></line> -<line x1="95" y1="-35" x2="85" y2="-15"></line> -<line x1="75" y1="-25" x2="95" y2="-35"></line> -<line x1="80" y1="-60" x2="70" y2="-40"></line> -<line x1="60" y1="-50" x2="80" y2="-60"></line> -</symbol> -<symbol id="symbol:analog_switch.3" overflow="visible"> -<line x1="150" y1="-800" x2="150"></line> -<line x1="-150" y1="-800" x2="150" y2="-800"></line> -<line x1="-150" x2="150"></line> -<line x1="-150" y1="-800" x2="-150"></line> -<line x1="-200" y1="-100" x2="-176" y2="-100"></line> -<line x1="200" y1="-200" x2="150" y2="-200"></line> -<line x1="200" y1="-350" x2="150" y2="-350"></line> -<line x1="200" y1="-500" x2="150" y2="-500"></line> -<line x1="200" y1="-650" x2="150" y2="-650"></line> -<line x1="200" y1="-600" x2="150" y2="-600"></line> -<line x1="200" y1="-750" x2="150" y2="-750"></line> -<line x1="200" y1="-300" x2="150" y2="-300"></line> -<line x1="200" y1="-150" x2="150" y2="-150"></line> -<line x1="200" y1="-450" x2="150" y2="-450"></line> -<line x1="200" y1="-50" x2="150" y2="-50"></line> -<line x1="-200" y1="-750" x2="-150" y2="-750"></line> -<line x1="-200" y1="-650" x2="-150" y2="-650"></line> -<line x1="-200" y1="-200" x2="-150" y2="-200"></line> -<line x1="-200" y1="-500" x2="-150" y2="-500"></line> -<line x1="-200" y1="-350" x2="-150" y2="-350"></line> -<circle cx="-163" cy="-100" r="13" fill="none"></circle> -<text stroke="none" x="-140" y="-100" font-size="32">EN_L</text> -<text stroke="none" x="140" y="-200" font-size="32" text-anchor="end">NC4</text> -<text stroke="none" x="140" y="-350" font-size="32" text-anchor="end">NC3</text> -<text stroke="none" x="140" y="-500" font-size="32" text-anchor="end">NC2</text> -<text stroke="none" x="140" y="-650" font-size="32" text-anchor="end">NC1</text> -<text stroke="none" x="140" y="-600" font-size="32" text-anchor="end">NO1</text> -<text stroke="none" x="140" y="-750" font-size="32" text-anchor="end">V</text> -<text stroke="none" x="140" y="-300" font-size="32" text-anchor="end">NO3</text> -<text stroke="none" x="140" y="-150" font-size="32" text-anchor="end">NO4</text> -<text stroke="none" x="140" y="-450" font-size="32" text-anchor="end">NO2</text> -<text stroke="none" x="140" y="-50" font-size="32" text-anchor="end">GND</text> -<text stroke="none" x="-140" y="-750" font-size="32">IN</text> -<text stroke="none" x="-140" y="-650" font-size="32">COM1</text> -<text stroke="none" x="-140" y="-200" font-size="32">COM4</text> -<text stroke="none" x="-140" y="-500" font-size="32">COM2</text> -<text stroke="none" x="-140" y="-350" font-size="32">COM3</text> -</symbol> -<symbol id="symbol:load_switch.15" overflow="visible"> -<line x1="-200" y1="-200" x2="-200" y2="200"></line> -<line x1="200" y1="-200" x2="200" y2="200"></line> -<line x1="-200" y1="200" x2="200" y2="200"></line> -<line x1="-200" y1="-200" x2="200" y2="-200"></line> -<line x1="-250" y1="-100" x2="-200" y2="-100"></line> -<line x1="-250" y1="-50" x2="-200" y2="-50"></line> -<line x1="-250" y1="50" x2="-226" y2="50"></line> -<line x1="250" y1="150" x2="200" y2="150"></line> -<line x1="250" y1="-50" x2="200" y2="-50"></line> -<line x1="250" y1="-100" x2="200" y2="-100"></line> -<line x1="250" y1="-150" x2="200" y2="-150"></line> -<line x1="-250" y1="150" x2="-200" y2="150"></line> -<line x1="-250" y1="100" x2="-200" y2="100"></line> -<line x1="-250" y1="-150" x2="-200" y2="-150"></line> -<line x1="250" y1="100" x2="200" y2="100"></line> -<circle cx="-213" cy="50" r="13" fill="none"></circle> -<text stroke="none" x="-190" y="-100" font-size="32">IN_2</text> -<text stroke="none" x="-190" y="-50" font-size="32">IN_3</text> -<text stroke="none" x="-190" y="50" font-size="32">FAULT_L</text> -<text stroke="none" x="190" y="150" font-size="32" text-anchor="end">GND_2</text> -<text stroke="none" x="190" y="-50" font-size="32" text-anchor="end">OUT_3</text> -<text stroke="none" x="190" y="-100" font-size="32" text-anchor="end">OUT_2</text> -<text stroke="none" x="190" y="-150" font-size="32" text-anchor="end">OUT_1</text> -<text stroke="none" x="-190" y="150" font-size="32">ILIM</text> -<text stroke="none" x="-190" y="100" font-size="32">EN</text> -<text stroke="none" x="-190" y="-150" font-size="32">IN_1</text> -<text stroke="none" x="190" y="100" font-size="32" text-anchor="end">GND_1</text> -</symbol> -<symbol id="symbol:nmos.1" overflow="visible"> -<line x1="-39" y1="-42" x2="-39" y2="42" stroke-width="6"></line> -<line x1="-25" y1="10" x2="-25" y2="-10" stroke-width="6"></line> -<line x1="-25" y1="50" x2="-25" y2="30" stroke-width="6"></line> -<line x1="60" y1="5" x2="40" y2="5"></line> -<line x1="-25" y1="40" x2="50" y2="40"></line> -<line x1="-25" y1="-50" x2="-25" y2="-30" stroke-width="6"></line> -<line x1="60" y1="-10" x2="40" y2="-10"></line> -<line x1="-25" x2="25"></line> -<line y1="-12" x2="-25"></line> -<line y1="11" x2="-25"></line> -<line x1="40" y1="5" x2="50" y2="-10"></line> -<line x1="50" y1="-10" x2="60" y2="5"></line> -<line x1="-25" y1="-40" x2="50" y2="-40"></line> -<line x1="25" y1="40" x2="25"></line> -<line x1="-39" y1="43" x2="-39" y2="50"></line> -<line x1="50" y1="-100" x2="50" y2="-10"></line> -<line x1="-100" y1="50" x2="-39" y2="50"></line> -<line x1="50" y1="100" x2="50" y2="5"></line> -<circle cx="-2" r="67" fill="none"></circle> -<text stroke="none" x="24" y="-76" font-size="24">?</text> -<text stroke="none" x="-94" y="41" font-size="24">?</text> -<text stroke="none" x="24" y="92" font-size="24">?</text> -</symbol> -<symbol id="symbol:ts5a23159.1" overflow="visible"> -<line x1="-250" y1="250" x2="-250" y2="-350"></line> -<line x1="250" y1="250" x2="-250" y2="250"></line> -<line x1="250" y1="-350" x2="-250" y2="-350"></line> -<line x1="250" y1="-350" x2="250" y2="250"></line> -<line x1="-350" y1="150" x2="-250" y2="150"></line> -<line x1="350" y1="150" x2="250" y2="150"></line> -<line x1="-50" y1="350" x2="-50" y2="250"></line> -<line x1="-50" y1="-450" x2="-50" y2="-350"></line> -<line x1="350" y1="-250" x2="250" y2="-250"></line> -<line x1="-350" y1="-250" x2="-250" y2="-250"></line> -<line x1="-350" y1="-150" x2="-250" y2="-150"></line> -<line x1="-350" y1="50" x2="-250" y2="50"></line> -<line x1="350" y1="50" x2="250" y2="50"></line> -<line x1="350" y1="-150" x2="250" y2="-150"></line> -<text stroke="none" y="-167" font-size="32" text-anchor="middle">ts5a23159</text> -<text stroke="none" x="-240" y="150" font-size="24">NO2</text> -<text stroke="none" x="240" y="150" font-size="24" text-anchor="end">IN2</text> -<g transform="translate(-50,240)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="24">GND</text> -</g></g> -<g transform="translate(-50,-340)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="24" text-anchor="end">VCC</text> -</g></g> -<text stroke="none" x="240" y="-250" font-size="24" text-anchor="end">COM1</text> -<text stroke="none" x="-240" y="-250" font-size="24">NC1</text> -<text stroke="none" x="-240" y="-150" font-size="24">NO1</text> -<text stroke="none" x="-240" y="50" font-size="24">NC2</text> -<text stroke="none" x="240" y="50" font-size="24" text-anchor="end">COM2</text> -<text stroke="none" x="240" y="-150" font-size="24" text-anchor="end">IN1</text> -</symbol> -<symbol id="symbol:spdt.1" overflow="visible"> -<line x1="-100" y1="-125" x2="-100" y2="125" stroke-dasharray="54,36,18,36"></line> -<line x1="-100" y1="-125" x2="100" y2="-125" stroke-dasharray="54,36,18,36"></line> -<line x1="-100" y1="125" x2="100" y2="125" stroke-dasharray="54,36,18,36"></line> -<line x1="100" y1="125" x2="100" y2="-125" stroke-dasharray="54,36,18,36"></line> -<line x1="82" y1="-76" x2="-65" y2="-5" stroke-width="6"></line> -<line x1="150" y1="100" x2="86" y2="100"></line> -<line x1="150" y1="-100" x2="86" y2="-100"></line> -<line x1="-150" x2="-86"></line> -<circle cx="75" cy="100" r="11" fill="none"></circle> -<circle cx="75" cy="-100" r="11" fill="none"></circle> -<circle cx="-75" r="11" fill="none"></circle> -<text stroke="none" x="-87" y="-87" font-size="29">SPDT</text> -<text stroke="none" x="107" y="95" font-size="23">?</text> -<text stroke="none" x="107" y="-105" font-size="23">?</text> -<text stroke="none" x="-107" y="-5" font-size="23" text-anchor="end">?</text> -</symbol> -<symbol id="symbol:tps22913.1" overflow="visible"> -<line x1="-200" y1="50" x2="-150" y2="50"></line> -<line x1="-150" y1="150" x2="-150" y2="-150"></line> -<line x1="150" y1="150" x2="-150" y2="150"></line> -<line x1="-150" y1="-150" x2="150" y2="-150"></line> -<line x1="150" y1="150" x2="150" y2="-150"></line> -<line x1="200" y1="50" x2="150" y2="50"></line> -<line x1="200" y1="-50" x2="150" y2="-50"></line> -<line x1="-200" y1="-50" x2="-150" y2="-50"></line> -<text stroke="none" x="140" y="-50" font-size="23" text-anchor="end">VOUT</text> -<text stroke="none" x="140" y="50" font-size="23" text-anchor="end">GND</text> -<text stroke="none" x="-140" y="-50" font-size="23">VIN</text> -<text stroke="none" x="-140" y="50" font-size="23">ON</text> -</symbol> -<symbol id="symbol:panasonic_p4.1" overflow="visible"> -<line x1="-150" y1="-700" x2="-150" y2="700"></line> -<line x1="-150" y1="-700" x2="150" y2="-700"></line> -<line x1="-150" y1="700" x2="150" y2="700"></line> -<line x1="150" y1="-700" x2="150" y2="700"></line> -<line x1="-200" y1="50" x2="-150" y2="50"></line> -<line x1="-200" y1="-650" x2="-150" y2="-650"></line> -<line x1="200" y1="-450" x2="150" y2="-450"></line> -<line x1="200" y1="-50" x2="150" y2="-50"></line> -<line x1="200" y1="-200" x2="150" y2="-200"></line> -<line x1="200" y1="-250" x2="150" y2="-250"></line> -<line x1="200" y1="-300" x2="150" y2="-300"></line> -<line x1="200" y1="-350" x2="150" y2="-350"></line> -<line x1="200" y1="-650" x2="150" y2="-650"></line> -<line x1="200" y1="-550" x2="150" y2="-550"></line> -<line x1="200" y1="-600" x2="150" y2="-600"></line> -<line x1="-200" y1="-600" x2="-150" y2="-600"></line> -<line x1="-200" y1="-550" x2="-150" y2="-550"></line> -<line x1="-200" y1="-500" x2="-150" y2="-500"></line> -<line x1="-200" y1="-450" x2="-150" y2="-450"></line> -<line x1="-200" y1="-250" x2="-150" y2="-250"></line> -<line x1="-200" y1="-200" x2="-150" y2="-200"></line> -<line x1="-200" y1="-150" x2="-150" y2="-150"></line> -<line x1="-200" y1="-100" x2="-150" y2="-100"></line> -<line x1="-200" y1="-50" x2="-150" y2="-50"></line> -<line x1="-200" x2="-150"></line> -<line x1="-200" y1="100" x2="-150" y2="100"></line> -<line x1="-200" y1="150" x2="-150" y2="150"></line> -<line x1="-200" y1="200" x2="-150" y2="200"></line> -<line x1="-200" y1="250" x2="-150" y2="250"></line> -<line x1="-200" y1="300" x2="-150" y2="300"></line> -<line x1="-200" y1="350" x2="-150" y2="350"></line> -<line x1="-200" y1="400" x2="-150" y2="400"></line> -<line x1="-200" y1="450" x2="-150" y2="450"></line> -<line x1="-200" y1="500" x2="-150" y2="500"></line> -<line x1="-200" y1="550" x2="-150" y2="550"></line> -<line x1="200" y1="-500" x2="150" y2="-500"></line> -<line x1="200" y1="-400" x2="150" y2="-400"></line> -<line x1="200" y1="-150" x2="150" y2="-150"></line> -<line x1="200" y1="-100" x2="150" y2="-100"></line> -<line x1="200" x2="150"></line> -<line x1="200" y1="50" x2="150" y2="50"></line> -<line x1="200" y1="100" x2="150" y2="100"></line> -<line x1="200" y1="150" x2="150" y2="150"></line> -<line x1="200" y1="450" x2="150" y2="450"></line> -<line x1="200" y1="500" x2="150" y2="500"></line> -<line x1="200" y1="550" x2="150" y2="550"></line> -<line x1="200" y1="200" x2="150" y2="200"></line> -<line x1="200" y1="250" x2="150" y2="250"></line> -<line x1="200" y1="300" x2="150" y2="300"></line> -<line x1="200" y1="350" x2="150" y2="350"></line> -<line x1="200" y1="400" x2="150" y2="400"></line> -<line x1="-200" y1="-400" x2="-150" y2="-400"></line> -<line x1="-200" y1="-350" x2="-150" y2="-350"></line> -<line x1="-200" y1="-300" x2="-150" y2="-300"></line> -<text stroke="none" x="-140" y="50" font-size="34">29</text> -<text stroke="none" x="-140" y="-650" font-size="34">1</text> -<text stroke="none" x="140" y="-450" font-size="34" text-anchor="end">10</text> -<text stroke="none" x="140" y="-50" font-size="34" text-anchor="end">26</text> -<text stroke="none" x="140" y="-200" font-size="34" text-anchor="end">20</text> -<text stroke="none" x="140" y="-250" font-size="34" text-anchor="end">18</text> -<text stroke="none" x="140" y="-300" font-size="34" text-anchor="end">16</text> -<text stroke="none" x="140" y="-350" font-size="34" text-anchor="end">14</text> -<text stroke="none" x="140" y="-650" font-size="34" text-anchor="end">2</text> -<text stroke="none" x="140" y="-550" font-size="34" text-anchor="end">6</text> -<text stroke="none" x="140" y="-600" font-size="34" text-anchor="end">4</text> -<text stroke="none" x="-140" y="-600" font-size="34">3</text> -<text stroke="none" x="-140" y="-550" font-size="34">5</text> -<text stroke="none" x="-140" y="-500" font-size="34">7</text> -<text stroke="none" x="-140" y="-450" font-size="34">9</text> -<text stroke="none" x="-140" y="-250" font-size="34">17</text> -<text stroke="none" x="-140" y="-200" font-size="34">19</text> -<text stroke="none" x="-140" y="-150" font-size="34">21</text> -<text stroke="none" x="-140" y="-100" font-size="34">23</text> -<text stroke="none" x="-140" y="-50" font-size="34">25</text> -<text stroke="none" x="-140" font-size="34">27</text> -<text stroke="none" x="-140" y="100" font-size="34">31</text> -<text stroke="none" x="-140" y="150" font-size="34">33</text> -<text stroke="none" x="-140" y="200" font-size="34">35</text> -<text stroke="none" x="-140" y="250" font-size="34">37</text> -<text stroke="none" x="-140" y="300" font-size="34">39</text> -<text stroke="none" x="-140" y="350" font-size="34">41</text> -<text stroke="none" x="-140" y="400" font-size="34">43</text> -<text stroke="none" x="-140" y="450" font-size="34">45</text> -<text stroke="none" x="-140" y="500" font-size="34">47</text> -<text stroke="none" x="-140" y="550" font-size="34">49</text> -<text stroke="none" x="140" y="-500" font-size="34" text-anchor="end">8</text> -<text stroke="none" x="140" y="-400" font-size="34" text-anchor="end">12</text> -<text stroke="none" x="140" y="-150" font-size="34" text-anchor="end">22</text> -<text stroke="none" x="140" y="-100" font-size="34" text-anchor="end">24</text> -<text stroke="none" x="140" font-size="34" text-anchor="end">28</text> -<text stroke="none" x="140" y="50" font-size="34" text-anchor="end">30</text> -<text stroke="none" x="140" y="100" font-size="34" text-anchor="end">32</text> -<text stroke="none" x="140" y="150" font-size="34" text-anchor="end">34</text> -<text stroke="none" x="140" y="450" font-size="34" text-anchor="end">46</text> -<text stroke="none" x="140" y="500" font-size="34" text-anchor="end">48</text> -<text stroke="none" x="140" y="550" font-size="34" text-anchor="end">50</text> -<text stroke="none" x="140" y="200" font-size="34" text-anchor="end">36</text> -<text stroke="none" x="140" y="250" font-size="34" text-anchor="end">38</text> -<text stroke="none" x="140" y="300" font-size="34" text-anchor="end">40</text> -<text stroke="none" x="140" y="350" font-size="34" text-anchor="end">42</text> -<text stroke="none" x="140" y="400" font-size="34" text-anchor="end">44</text> -<text stroke="none" x="-140" y="-400" font-size="34">11</text> -<text stroke="none" x="-140" y="-350" font-size="34">13</text> -<text stroke="none" x="-140" y="-300" font-size="34">15</text> -</symbol> -<symbol id="symbol:con10.1" overflow="visible"> -<line x1="-50" y1="-150" x2="-50" y2="150"></line> -<line x1="-50" y1="-150" x2="50" y2="-150"></line> -<line x1="50" y1="150" x2="-50" y2="150"></line> -<line x1="50" y1="-150" x2="50" y2="150"></line> -<line x1="-50" y1="25" x2="50" y2="25"></line> -<line y1="-150" y2="150"></line> -<line x1="-50" y1="75" x2="50" y2="75"></line> -<line x1="-50" y1="-25" x2="50" y2="-25"></line> -<line x1="-50" y1="-75" x2="50" y2="-75"></line> -<line x1="-100" y1="-50" x2="-40" y2="-50"></line> -<line x1="-100" x2="-40"></line> -<line x1="-100" y1="-100" x2="-40" y2="-100"></line> -<line x1="40" y1="-100" x2="100" y2="-100"></line> -<line x1="40" y1="100" x2="100" y2="100"></line> -<line x1="40" x2="100"></line> -<line x1="40" y1="50" x2="100" y2="50"></line> -<line x1="40" y1="-50" x2="100" y2="-50"></line> -<line x1="-100" y1="100" x2="-40" y2="100"></line> -<line x1="-100" y1="50" x2="-40" y2="50"></line> -<circle cx="-25" cy="-50" r="15" fill="none"></circle> -<circle cx="-25" r="15" fill="none"></circle> -<circle cx="-25" cy="-100" r="15" fill="none"></circle> -<circle cx="25" cy="-100" r="15" fill="none"></circle> -<circle cx="25" cy="100" r="15" fill="none"></circle> -<circle cx="25" r="15" fill="none"></circle> -<circle cx="25" cy="50" r="15" fill="none"></circle> -<circle cx="25" cy="-50" r="15" fill="none"></circle> -<circle cx="-25" cy="100" r="15" fill="none"></circle> -<circle cx="-25" cy="50" r="15" fill="none"></circle> -</symbol> -<symbol id="symbol:ffc_20pin.2" overflow="visible"> -<line x1="100" y1="-1050" x2="100"></line> -<line x1="-100" y1="-1050" x2="-100"></line> -<line x1="-100" y1="-1050" x2="100" y2="-1050"></line> -<line x1="100" x2="-100"></line> -<line x1="150" y1="-50" x2="100" y2="-50"></line> -<line x1="-150" y1="-450" x2="-100" y2="-450"></line> -<line x1="-150" y1="-500" x2="-100" y2="-500"></line> -<line x1="-150" y1="-550" x2="-100" y2="-550"></line> -<line x1="150" y1="-100" x2="100" y2="-100"></line> -<line x1="-150" y1="-300" x2="-100" y2="-300"></line> -<line x1="-150" y1="-800" x2="-100" y2="-800"></line> -<line x1="-150" y1="-750" x2="-100" y2="-750"></line> -<line x1="-150" y1="-400" x2="-100" y2="-400"></line> -<line x1="-150" y1="-600" x2="-100" y2="-600"></line> -<line x1="-150" y1="-650" x2="-100" y2="-650"></line> -<line x1="-150" y1="-700" x2="-100" y2="-700"></line> -<line x1="-150" y1="-850" x2="-100" y2="-850"></line> -<line x1="-150" y1="-900" x2="-100" y2="-900"></line> -<line x1="-150" y1="-1000" x2="-100" y2="-1000"></line> -<line x1="-150" y1="-950" x2="-100" y2="-950"></line> -<line x1="-150" y1="-50" x2="-100" y2="-50"></line> -<line x1="-150" y1="-100" x2="-100" y2="-100"></line> -<line x1="-150" y1="-150" x2="-100" y2="-150"></line> -<line x1="-150" y1="-200" x2="-100" y2="-200"></line> -<line x1="-150" y1="-250" x2="-100" y2="-250"></line> -<line x1="-150" y1="-350" x2="-100" y2="-350"></line> -<text stroke="none" x="90" y="-50" font-size="32" text-anchor="end">M2</text> -<text stroke="none" x="-90" y="-450" font-size="32">12</text> -<text stroke="none" x="-90" y="-500" font-size="32">11</text> -<text stroke="none" x="-90" y="-550" font-size="32">10</text> -<text stroke="none" x="90" y="-100" font-size="32" text-anchor="end">M1</text> -<text stroke="none" x="-90" y="-300" font-size="32">15</text> -<text stroke="none" x="-90" y="-800" font-size="32">5</text> -<text stroke="none" x="-90" y="-750" font-size="32">6</text> -<text stroke="none" x="-90" y="-400" font-size="32">13</text> -<text stroke="none" x="-90" y="-600" font-size="32">9</text> -<text stroke="none" x="-90" y="-650" font-size="32">8</text> -<text stroke="none" x="-90" y="-700" font-size="32">7</text> -<text stroke="none" x="-90" y="-850" font-size="32">4</text> -<text stroke="none" x="-90" y="-900" font-size="32">3</text> -<text stroke="none" x="-90" y="-1000" font-size="32">1</text> -<text stroke="none" x="-90" y="-950" font-size="32">2</text> -<text stroke="none" x="-90" y="-50" font-size="32">20</text> -<text stroke="none" x="-90" y="-100" font-size="32">19</text> -<text stroke="none" x="-90" y="-150" font-size="32">18</text> -<text stroke="none" x="-90" y="-200" font-size="32">17</text> -<text stroke="none" x="-90" y="-250" font-size="32">16</text> -<text stroke="none" x="-90" y="-350" font-size="32">14</text> -</symbol> -<symbol id="symbol:74aup1t97.1" overflow="visible"> -<line x1="200" y1="-200" x2="200" y2="200"></line> -<line x1="-200" y1="-200" x2="200" y2="-200"></line> -<line x1="-200" y1="200" x2="200" y2="200"></line> -<line x1="-200" y1="-200" x2="-200" y2="200"></line> -<line x1="-100" y1="30" x2="-35" y2="30"></line> -<line x1="-100" y1="100" x2="-100" y2="30"></line> -<line x1="-100" y1="100" x2="-35" y2="100"></line> -<line x1="-100" y1="-30" x2="-35" y2="-30"></line> -<line x1="-100" y1="-100" x2="-100" y2="-30"></line> -<line x1="-100" y1="-100" x2="-35" y2="-100"></line> -<line x1="-150" y1="-50" x2="-100" y2="-50"></line> -<line x1="-150" y1="100" x2="-150" y2="-50"></line> -<line x1="-125" y1="-80" x2="-100" y2="-80"></line> -<line x1="-125" y1="-100" x2="-125" y2="-80"></line> -<line x1="-125" x2="-125" y2="50"></line> -<line x1="-125" y1="50" x2="-100" y2="50"></line> -<line x1="-150" y1="85" x2="-120" y2="85"></line> -<line x1="25" y1="15" x2="60" y2="15"></line> -<line x1="25" y1="65" x2="25" y2="15"></line> -<line y1="65" x2="25" y2="65"></line> -<line x1="25" y1="-65" x2="25" y2="-20"></line> -<line y1="-65" x2="25" y2="-65"></line> -<line x1="25" y1="-20" x2="60" y2="-20"></line> -<line y1="-250" y2="-200"></line> -<line y1="250" y2="200"></line> -<line x1="250" x2="150"></line> -<line x1="-250" y1="100" x2="-150" y2="100"></line> -<line x1="-250" x2="-125"></line> -<line x1="-250" y1="-100" x2="-125" y2="-100"></line> -<path fill="none" d="M -35 100 A 35 35 0 1 0 -34 30"></path> -<circle cx="-110" cy="85" r="10" fill="none"></circle> -<path fill="none" d="M 49 49 A 82 82 0 0 0 148 0"></path> -<path fill="none" d="M 50 49 A 90 90 0 0 0 50 -49"></path> -<path fill="none" d="M 149 0 A 83 83 0 0 0 49 -49"></path> -<path fill="none" d="M -35 -30 A 35 35 0 1 0 -34 -100"></path> -<g transform="translate(15,-200)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="29" text-anchor="end">VCC</text> -</g></g> -<g transform="translate(-20,195)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="29">GND</text> -</g></g> -<text stroke="none" x="195" y="-10" font-size="29" text-anchor="end">Y</text> -<text stroke="none" x="-190" y="95" font-size="29">C</text> -<text stroke="none" x="-190" y="-5" font-size="29">B</text> -<text stroke="none" x="-190" y="-105" font-size="29">A</text> -</symbol> -<symbol id="symbol:74aup1t97.3" overflow="visible"> -<line x1="200" y1="200" x2="-200" y2="200"></line> -<line x1="200" y1="-200" x2="200" y2="200"></line> -<line x1="-200" y1="-200" x2="-200" y2="200"></line> -<line x1="-200" y1="-200" x2="200" y2="-200"></line> -<line x1="-125" y1="100" x2="25" y2="100"></line> -<line x1="-125" y1="-100" x2="-125" y2="100"></line> -<line x1="-125" y1="-100" x2="25" y2="-100"></line> -<line x1="250" x2="165"></line> -<line x1="-250" y1="-50" x2="-165" y2="-50"></line> -<line y1="-250" y2="-200"></line> -<line y1="250" y2="200"></line> -<line x1="-100" y1="-200" x2="-100" y2="-250"></line> -<line x1="-250" y1="50" x2="-125" y2="50"></line> -<path fill="none" d="M 24 100 A 100 100 0 1 0 25 -100"></path> -<circle cx="145" r="20" fill="none"></circle> -<circle cx="-145" cy="-50" r="20" fill="none"></circle> -<text stroke="none" x="195" y="-10" font-size="29" text-anchor="end">Y</text> -<text stroke="none" x="-190" y="-55" font-size="29">A</text> -<g transform="translate(15,-200)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="29" text-anchor="end">VCC</text> -</g></g> -<g transform="translate(15,190)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="29">GND</text> -</g></g> -<g transform="translate(-100,-150)"> -<g transform="rotate(-90)"> -<text stroke="none" font-size="29">B</text> -</g></g> -<text stroke="none" x="-190" y="45" font-size="29">C</text> -</symbol> -<symbol id="symbol:ffc_13pin.1" overflow="visible"> -<line y1="-700"></line> -<line y1="-700" x2="200" y2="-700"></line> -<line x2="200"></line> -<line x1="200" x2="200" y2="-700"></line> -<line x1="200" y1="-700" y2="-700"></line> -<line y2="-700"></line> -<line x1="250" y1="-100" x2="200" y2="-100"></line> -<line x1="250" y1="-200" x2="200" y2="-200"></line> -<line x1="250" y1="-250" x2="200" y2="-250"></line> -<line x1="250" y1="-150" x2="200" y2="-150"></line> -<line x1="250" y1="-300" x2="200" y2="-300"></line> -<line x1="250" y1="-400" x2="200" y2="-400"></line> -<line x1="250" y1="-450" x2="200" y2="-450"></line> -<line x1="250" y1="-500" x2="200" y2="-500"></line> -<line x1="250" y1="-350" x2="200" y2="-350"></line> -<line x1="250" y1="-550" x2="200" y2="-550"></line> -<line x1="250" y1="-650" x2="200" y2="-650"></line> -<line x1="250" y1="-600" x2="200" y2="-600"></line> -<line x1="250" y1="-50" x2="200" y2="-50"></line> -<line y1="-300" x2="-50" y2="-300"></line> -<line x1="-50" y1="-350" y2="-350"></line> -<text stroke="none" x="190" y="-100" font-size="32" text-anchor="end">12</text> -<text stroke="none" x="190" y="-200" font-size="32" text-anchor="end">10</text> -<text stroke="none" x="190" y="-250" font-size="32" text-anchor="end">9</text> -<text stroke="none" x="190" y="-150" font-size="32" text-anchor="end">11</text> -<text stroke="none" x="190" y="-300" font-size="32" text-anchor="end">8</text> -<text stroke="none" x="190" y="-400" font-size="32" text-anchor="end">6</text> -<text stroke="none" x="190" y="-450" font-size="32" text-anchor="end">5</text> -<text stroke="none" x="190" y="-500" font-size="32" text-anchor="end">4</text> -<text stroke="none" x="190" y="-350" font-size="32" text-anchor="end">7</text> -<text stroke="none" x="190" y="-550" font-size="32" text-anchor="end">3</text> -<text stroke="none" x="190" y="-650" font-size="32" text-anchor="end">1</text> -<text stroke="none" x="190" y="-600" font-size="32" text-anchor="end">2</text> -<text stroke="none" x="190" y="-50" font-size="32" text-anchor="end">13</text> -<text stroke="none" x="16" y="-300" font-size="32">M2</text> -<text stroke="none" x="16" y="-350" font-size="32">M1</text> -</symbol> -<symbol id="symbol:b2b_16pin.2:s" overflow="visible"> -<line x1="-100" y1="250" x2="-100" y2="-300"></line> -<line x1="-100" y1="250" x2="150" y2="250"></line> -<line x1="-100" y1="-300" x2="150" y2="-300"></line> -<line x1="150" y1="250" x2="150" y2="-300"></line> -<line x1="200" y1="100" x2="150" y2="100"></line> -<line x1="200" y1="50" x2="150" y2="50"></line> -<line x1="200" x2="150"></line> -<line x1="150" y1="-150" x2="200" y2="-150"></line> -<line x1="150" y1="-50" x2="200" y2="-50"></line> -<line x1="150" y1="-100" x2="200" y2="-100"></line> -<line x1="150" y1="-250" x2="200" y2="-250"></line> -<line x1="150" y1="-200" x2="200" y2="-200"></line> -<line x1="-150" y1="-150" x2="-100" y2="-150"></line> -<line x1="-150" y1="-100" x2="-100" y2="-100"></line> -<line x1="-150" x2="-100"></line> -<line x1="-150" y1="-50" x2="-100" y2="-50"></line> -<line x1="-150" y1="-200" x2="-100" y2="-200"></line> -<line x1="-150" y1="-250" x2="-100" y2="-250"></line> -<line x1="-150" y1="100" x2="-100" y2="100"></line> -<line x1="-150" y1="50" x2="-100" y2="50"></line> -<line x1="200" y1="150" x2="150" y2="150"></line> -<line x1="-150" y1="150" x2="-100" y2="150"></line> -<line x1="-150" y1="200" x2="-100" y2="200"></line> -<line x1="200" y1="200" x2="150" y2="200"></line> -<g transform="translate(140,101)"> -<text stroke="none" font-size="32" transform=" rotate(180)">16</text> -</g> -<g transform="translate(140,51)"> -<text stroke="none" font-size="32" transform=" rotate(180)">14</text> -</g> -<g transform="translate(140,1)"> -<text stroke="none" font-size="32" transform=" rotate(180)">12</text> -</g> -<g transform="translate(140,-150)"> -<text stroke="none" font-size="32" transform=" rotate(180)">6</text> -</g> -<g transform="translate(140,-50)"> -<text stroke="none" font-size="32" transform=" rotate(180)">10</text> -</g> -<g transform="translate(140,-100)"> -<text stroke="none" font-size="32" transform=" rotate(180)">8</text> -</g> -<g transform="translate(140,-250)"> -<text stroke="none" font-size="32" transform=" rotate(180)">2</text> -</g> -<g transform="translate(140,-200)"> -<text stroke="none" font-size="32" transform=" rotate(180)">4</text> -</g> -<g transform="translate(-90,-150)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">5</text> -</g> -<g transform="translate(-90,-100)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">7</text> -</g> -<g transform="translate(-90,1)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">11</text> -</g> -<g transform="translate(-90,-50)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">9</text> -</g> -<g transform="translate(-90,-200)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">3</text> -</g> -<g transform="translate(-90,-250)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">1</text> -</g> -<g transform="translate(-90,100)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">15</text> -</g> -<g transform="translate(-90,50)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">13</text> -</g> -<g transform="translate(140,150)"> -<text stroke="none" font-size="32" transform=" rotate(180)">M2</text> -</g> -<g transform="translate(-90,150)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">M1</text> -</g> -<g transform="translate(-90,200)"> -<text stroke="none" font-size="32" text-anchor="end" transform=" rotate(180)">M3</text> -</g> -<g transform="translate(140,200)"> -<text stroke="none" font-size="32" transform=" rotate(180)">M4</text> -</g> -</symbol> -<use href="#symbol:border_b.3" fill="green" stroke="green"></use> -<text stroke="none" x="600" y="-4400" fill="orange" font-size="75.000015"> -<title>CUSTOM_TXT_CDS</title>PCB: 651-03910-00</text> -<text stroke="none" x="600" y="-4550" fill="orange" font-size="75.000015"> -<title>CUSTOM_TXT_CDS</title>ASSY:650-03910-01</text> -<text stroke="none" x="600" y="-4700" fill="orange" font-size="75.000015"> -<title>CUSTOM_TXT_CDS</title>SCH: 650-03910-01-SCH</text> -<text stroke="none" x="600" y="-4950" fill="orange" font-size="231.000018"> -<title>CUSTOM_TXT_CDS</title>dragonclaw</text> -<text stroke="none" x="6570" y="-95" fill="green" font-size="26.999996"> -<title>CUSTOM_TXT_CDS</title>Fri Jan 17 12:52:49 2020</text> -<text stroke="none" x="6500" y="-170" fill="green" font-size="33.999988"> -<title>CUSTOM_TXT_CDS</title>dragonclaw</text> -<text stroke="none" x="7500" y="-175" fill="green" font-size="30.000006000000003"> -<title>CUSTOM_TXT_CDS</title>650-03910-01-SCH</text> -<text stroke="none" x="8265" y="-175" fill="green" font-size="33.999988" text-anchor="middle"> -<title>CUSTOM_TXT_CDS</title>0.2</text> -<text stroke="none" x="8427" y="-84" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>1 OF 5</text> -<text stroke="none" x="8427" y="-119" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>1 OF 5</text> -<text stroke="none" x="7212" y="-260" fill="orange" font-size="67.999976" text-anchor="middle"> -<title>PAGE_TITLE</title>TABLE OF CONTENTS</text> -<g transform="translate(500,-4000)"> -<use href="#symbol:al_toc.1" fill="green" stroke="green"></use> -<a href="#page4"> -<text stroke="none" x="550" y="600" fill="orange"> -<title>CUSTOM_TXT_CDS</title>HOST CONNECTORS</text> -</a> -<a href="#page5"> -<text stroke="none" x="550" y="700" fill="orange"> -<title>CUSTOM_TXT_CDS</title>SENSOR CONNECTORS</text> -</a> -<a href="#page1"> -<text stroke="none" x="75" y="300" fill="orange"> -<title>CUSTOM_TXT_CDS</title>1</text> -</a> -<text stroke="none" x="550" y="800" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<a href="#page2"> -<text stroke="none" x="75" y="400" fill="orange"> -<title>CUSTOM_TXT_CDS</title>2</text> -</a> -<text stroke="none" x="550" y="900" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<a href="#page3"> -<text stroke="none" x="75" y="500" fill="orange"> -<title>CUSTOM_TXT_CDS</title>3</text> -</a> -<text stroke="none" x="550" y="1000" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<a href="#page4"> -<text stroke="none" x="75" y="600" fill="orange"> -<title>CUSTOM_TXT_CDS</title>4</text> -</a> -<text stroke="none" x="550" y="1100" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<a href="#page5"> -<text stroke="none" x="75" y="700" fill="orange"> -<title>CUSTOM_TXT_CDS</title>5</text> -</a> -<text stroke="none" x="550" y="1200" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="800" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="550" y="1300" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="900" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="550" y="1400" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1000" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="550" y="1500" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1100" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="550" y="1600" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1200" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="550" y="1700" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1300" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1400" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1500" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1600" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<text stroke="none" x="75" y="1700" fill="orange"> -<title>CUSTOM_TXT_CDS</title></text> -<a href="#page3"> -<text stroke="none" x="550" y="500" fill="orange"> -<title>CUSTOM_TXT_CDS</title>HOST SELECTION</text> -</a> -<a href="#page2"> -<text stroke="none" x="550" y="400" fill="orange"> -<title>CUSTOM_TXT_CDS</title>MCU</text> -</a> -<a href="#page1"> -<text stroke="none" x="550" y="300" fill="orange"> -<title>CUSTOM_TXT_CDS</title>TABLE OF CONTENTS</text> -</a> -</g> -<g id="I1" transform="translate(5450,-150)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g transform="translate(5500,-200)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(5650,-250)"> -<line x2="-150" stroke="goldenrod"></line> -<text stroke="none" x="-10" y="-10" fill="orange" font-size="31.999997" text-anchor="end"> -<title>SIG_NAME</title>GND</text> -</g> -<filter id="highlight" x="-20" y="-20" height="40" width="40"> <femorphology operator="dilate" radius="20"></femorphology> <fecomponenttransfer result="highlight"> <fefuncr type="discrete" tableValues="1"></fefuncr> <fefuncg type="discrete" tableValues="1"></fefuncg> <fefuncb type="discrete" tableValues="0"></fefuncb> <fefunca type="table" tableValues="0 0.5 0.5 0.5 0.5 0.5 0.5 0.5"></fefunca> </fecomponenttransfer> <fecomposite in="SourceGraphic" in2="highlight" operator="over"></fecomposite> </filter> -</svg> - -</div> -</div> -<hr> -<div id="page2"> -<h1>dragonclaw/page2: MCU</h1> -<div> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,-5500,8500,5500" width="14.87500in" height="9.62500in" font-family="monospace" font-size="47.000000" stroke-width="3" style="background-color:white"> -<use href="#symbol:border_b.3" fill="green" stroke="green"></use> -<text stroke="none" x="6570" y="-95" fill="green" font-size="26.999996"> -<title>CUSTOM_TXT_CDS</title>Fri Jan 17 12:53:12 2020</text> -<text stroke="none" x="6500" y="-170" fill="green" font-size="33.999988"> -<title>CUSTOM_TXT_CDS</title>dragonclaw</text> -<text stroke="none" x="7500" y="-175" fill="green" font-size="30.000006000000003"> -<title>CUSTOM_TXT_CDS</title>650-03910-01-SCH</text> -<text stroke="none" x="8265" y="-175" fill="green" font-size="33.999988" text-anchor="middle"> -<title>CUSTOM_TXT_CDS</title>0.2</text> -<text stroke="none" x="8427" y="-84" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>2 OF 5</text> -<text stroke="none" x="8427" y="-119" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>2 OF 5</text> -<text stroke="none" x="7212" y="-260" fill="orange" font-size="67.999976" text-anchor="middle"> -<title>PAGE_TITLE</title>MCU</text> -<g id="U2.2" transform="translate(6000,-4000)"> -<use href="#symbol:stm32f412.2" fill="green" stroke="green"></use> -<text stroke="none" x="-500" y="964" fill="green" font-size="57.000002"> -<title>MFGR_PN</title>STM32F412CGU6</text> -<text stroke="none" x="-500" y="1021" fill="green" font-size="57.000002"> -<title>PACK_TYPE</title>UFQFPN48</text> -<text stroke="none" x="-500" y="907" fill="green" font-size="57.000002"> -<title>MFGR</title>ST MICROELECTRONICS</text> -<text stroke="none" x="-500" y="850" fill="green" font-size="57.000002"> -<title>AGILE_PN</title>313-02528-00</text> -<text stroke="none" x="500" y="-1000" fill="green" font-size="57.000002" text-anchor="end"> -<title>$LOCATION</title>U2</text> -<text stroke="none" x="510" y="540" fill="black" font-size="31.999997"> -<title>$PN</title>23</text> -<text stroke="none" x="-510" y="-410" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="510" y="590" fill="black" font-size="31.999997"> -<title>$PN</title>35</text> -<text stroke="none" x="-510" y="-360" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>11</text> -<text stroke="none" x="510" y="640" fill="black" font-size="31.999997"> -<title>$PN</title>47</text> -<text stroke="none" x="-510" y="-310" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>12</text> -<text stroke="none" x="510" y="690" fill="black" font-size="31.999997"> -<title>$PN</title>G1</text> -<text stroke="none" x="-510" y="-260" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="-510" y="-210" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>14</text> -<text stroke="none" x="-510" y="-160" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>15</text> -<text stroke="none" x="-510" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>16</text> -<text stroke="none" x="-510" y="-60" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>17</text> -<text stroke="none" x="-510" y="-10" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>29</text> -<text stroke="none" x="-510" y="40" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>30</text> -<text stroke="none" x="-510" y="90" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>31</text> -<text stroke="none" x="-510" y="140" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>32</text> -<text stroke="none" x="-510" y="190" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>33</text> -<text stroke="none" x="-510" y="240" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>34</text> -<text stroke="none" x="-510" y="290" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>37</text> -<text stroke="none" x="-510" y="340" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>38</text> -<text stroke="none" x="-510" y="490" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="-510" y="590" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>44</text> -<text stroke="none" x="-510" y="-510" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>1</text> -<text stroke="none" x="510" y="490" fill="black" font-size="31.999997"> -<title>$PN</title>8</text> -<text stroke="none" x="-510" y="-560" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>22</text> -<text stroke="none" x="510" y="340" fill="black" font-size="31.999997"> -<title>$PN</title>28</text> -<text stroke="none" x="-510" y="-710" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>9</text> -<text stroke="none" x="510" y="290" fill="black" font-size="31.999997"> -<title>$PN</title>27</text> -<text stroke="none" x="-510" y="-760" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>48</text> -<text stroke="none" x="510" y="240" fill="black" font-size="31.999997"> -<title>$PN</title>26</text> -<text stroke="none" x="-510" y="-810" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>36</text> -<text stroke="none" x="510" y="190" fill="black" font-size="31.999997"> -<title>$PN</title>25</text> -<text stroke="none" x="-510" y="-860" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>24</text> -<text stroke="none" x="510" y="140" fill="black" font-size="31.999997"> -<title>$PN</title>21</text> -<text stroke="none" x="510" y="40" fill="black" font-size="31.999997"> -<title>$PN</title>46</text> -<text stroke="none" x="510" y="-10" fill="black" font-size="31.999997"> -<title>$PN</title>45</text> -<text stroke="none" x="510" y="-60" fill="black" font-size="31.999997"> -<title>$PN</title>43</text> -<text stroke="none" x="510" y="-110" fill="black" font-size="31.999997"> -<title>$PN</title>42</text> -<text stroke="none" x="510" y="-160" fill="black" font-size="31.999997"> -<title>$PN</title>41</text> -<text stroke="none" x="510" y="-210" fill="black" font-size="31.999997"> -<title>$PN</title>40</text> -<text stroke="none" x="510" y="-260" fill="black" font-size="31.999997"> -<title>$PN</title>39</text> -<text stroke="none" x="510" y="-310" fill="black" font-size="31.999997"> -<title>$PN</title>20</text> -<text stroke="none" x="510" y="-360" fill="black" font-size="31.999997"> -<title>$PN</title>19</text> -<text stroke="none" x="510" y="-410" fill="black" font-size="31.999997"> -<title>$PN</title>18</text> -<text stroke="none" x="510" y="-560" fill="black" font-size="31.999997"> -<title>$PN</title>6</text> -<text stroke="none" x="510" y="-610" fill="black" font-size="31.999997"> -<title>$PN</title>5</text> -<text stroke="none" x="510" y="-710" fill="black" font-size="31.999997"> -<title>$PN</title>4</text> -<text stroke="none" x="510" y="-760" fill="black" font-size="31.999997"> -<title>$PN</title>3</text> -<text stroke="none" x="510" y="-810" fill="black" font-size="31.999997"> -<title>$PN</title>2</text> -</g> -<g id="I5" transform="translate(6750,-3200)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R3.1" transform="translate(950,-1650)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R3</text> -</g> -<g id="R4.1" transform="translate(350,-950)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R4</text> -</g> -<g id="I11" transform="translate(3400,-4350)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C8.1" transform="translate(3450,-4450)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>4.7uF</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C8</text> -</g> -<g id="C9.1" transform="translate(3900,-3250)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C9</text> -</g> -<g id="I14" transform="translate(3850,-3150)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C6.1" transform="translate(3000,-4450)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C6</text> -</g> -<g id="I16" transform="translate(2950,-4350)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C3.1" transform="translate(4500,-4900)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C3</text> -</g> -<g id="I18" transform="translate(4450,-4800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C2.1" transform="translate(4250,-4900)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>4.7uF</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C2</text> -</g> -<g id="I20" transform="translate(4200,-4800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C4.1" transform="translate(4750,-4900)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C4</text> -</g> -<g id="I22" transform="translate(4700,-4800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I23" transform="translate(4950,-4800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C5.1" transform="translate(5000,-4900)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C5</text> -</g> -<g id="C7.1" transform="translate(3200,-4450)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C7</text> -</g> -<g id="I26" transform="translate(3150,-4350)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U1.1" transform="translate(4900,-1000)"> -<use href="#symbol:ina3221.1" fill="green" stroke="green"></use> -<text stroke="none" x="-149" y="412" fill="green" font-size="31.999997"> -<title>PATH</title>I27</text> -<text stroke="none" x="50" y="-414" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>QFN16</text> -<text stroke="none" x="50" y="-457" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>INA3221AIRGVR</text> -<text stroke="none" x="50" y="-500" fill="orange" font-size="31.999997"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="50" y="-371" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>313-01081-00</text> -<text stroke="none" x="-100" y="-387" fill="green" font-size="31.999997" text-anchor="end"> -<title>$LOCATION</title>U1</text> -<text stroke="none" x="-210" y="-160" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>6</text> -<text stroke="none" x="210" y="240" fill="black" font-size="31.999997"> -<title>$PN</title>1</text> -<text stroke="none" x="-210" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="-210" y="-10" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="-210" y="90" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-210" y="140" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>8</text> -<g transform="translate(40,410)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>17</text> -</g></g> -<text stroke="none" x="-210" y="190" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>9</text> -<g transform="translate(-60,410)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>3</text> -</g></g> -<text stroke="none" x="-210" y="240" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="210" y="190" fill="black" font-size="31.999997"> -<title>$PN</title>2</text> -<text stroke="none" x="-210" y="-260" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="-210" y="-310" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>16</text> -<text stroke="none" x="210" y="-10" fill="black" font-size="31.999997"> -<title>$PN</title>14</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="31.999997"> -<title>$PN</title>15</text> -<text stroke="none" x="210" y="-260" fill="black" font-size="31.999997"> -<title>$PN</title>11</text> -<text stroke="none" x="210" y="-310" fill="black" font-size="31.999997"> -<title>$PN</title>12</text> -</g> -<g id="C1.1" transform="translate(3700,-1200)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C1</text> -</g> -<g id="I29" transform="translate(3650,-1100)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I30" transform="translate(4350,-900)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R5.1" transform="translate(850,-3150)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R5</text> -</g> -<g id="R1.4" transform="translate(3350,-5100)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.5</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R1</text> -</g> -<g id="TP3.1" transform="translate(6600,-1300)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP3</text> -</g> -<g id="TP4.1" transform="translate(6600,-1250)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP4</text> -</g> -<g id="TP5.1" transform="translate(6600,-1200)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP5</text> -</g> -<g id="TP6.1" transform="translate(6600,-1150)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP6</text> -</g> -<g id="TP9.1" transform="translate(6600,-850)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP9</text> -</g> -<g id="TP8.1" transform="translate(6600,-900)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP8</text> -</g> -<g id="TP10.1" transform="translate(6600,-800)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP10</text> -</g> -<g id="TP11.1" transform="translate(6600,-750)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP11</text> -</g> -<g id="TP12.1" transform="translate(6600,-700)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP12</text> -</g> -<g id="TP13.1" transform="translate(6600,-550)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP13</text> -</g> -<g id="TP14.1" transform="translate(6600,-500)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP14</text> -</g> -<g id="TP1.1" transform="translate(6600,-1500)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP1</text> -</g> -<g id="TP2.1" transform="translate(6600,-1450)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP2</text> -</g> -<g id="R17.1" transform="translate(550,-950)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R17</text> -</g> -<g id="R27.1" transform="translate(550,-3800)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R27</text> -</g> -<g id="R28.1" transform="translate(350,-3800)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R28</text> -</g> -<g id="R29.1" transform="translate(350,-2000)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="100" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R29</text> -</g> -<g id="R35.1" transform="translate(350,-450)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-35" fill="green" font-size="28.999987"> -<title>VALUE</title>1M</text> -<text stroke="none" x="30" y="-10" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="15" fill="orange" font-size="23.000014"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R35</text> -</g> -<g id="R36.1" transform="translate(500,-450)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="15" fill="orange" font-size="23.000014"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-10" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-35" fill="green" font-size="28.999987"> -<title>VALUE</title>1M</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R36</text> -</g> -<g id="I60" transform="translate(300,-350)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I61" transform="translate(450,-350)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R34.1" transform="translate(600,-3150)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="50" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R34</text> -</g> -<g id="I67" transform="translate(300,-2650)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R30.1" transform="translate(350,-3150)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R30</text> -</g> -<g id="I69" transform="translate(500,-850)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I71" transform="translate(300,-850)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I72" transform="translate(4800,-400)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R33.1" transform="translate(550,-1650)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R33</text> -</g> -<g id="I75" transform="translate(300,-1900)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R32.1" transform="translate(350,-1650)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="50" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R32</text> -</g> -<g id="R40.1" transform="translate(650,-450)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-35" fill="green" font-size="28.999987"> -<title>VALUE</title>1M</text> -<text stroke="none" x="30" y="-10" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="15" fill="orange" font-size="23.000014"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R40</text> -</g> -<g id="I82" transform="translate(600,-350)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R41.1" transform="translate(750,-2400)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R41</text> -</g> -<g id="R18.1" transform="translate(750,-1650)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>LOCATION</title>R18</text> -</g> -<g id="R39.1" transform="translate(750,-3800)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R39</text> -</g> -<g id="R44.1" transform="translate(950,-3800)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R44</text> -</g> -<g id="R45.1" transform="translate(350,-2400)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="50" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R45</text> -</g> -<g id="U14.2" transform="translate(4750,-2000)"> -<use href="#symbol:non_inverting_buffer.2" fill="green" stroke="green"></use> -<text stroke="none" x="75" y="100" fill="green" font-size="23.000014"> -<title>PACK_TYPE</title>WCSP4</text> -<text stroke="none" x="75" y="150" fill="green" font-size="23.000014"> -<title>AGILE_PN</title>313-00602-00</text> -<text stroke="none" x="75" y="125" fill="green" font-size="23.000014"> -<title>MFGR_PN</title>SN74LVC1G07YZVR</text> -<text stroke="none" x="100" y="-100" fill="orange" font-size="28.999987"> -<title>PATH</title>I106</text> -<text stroke="none" x="100" y="-150" fill="orange" font-size="48.000019"> -<title>VALUE</title>74LVC1G07</text> -<text stroke="none" x="100" y="-200" fill="orange" font-size="48.000019"> -<title>VOLT</title>1.65-5.5V</text> -<text stroke="none" x="-100" y="-100" fill="dodgerblue" font-size="28.999987"> -<title>$LOCATION</title>U14</text> -<g transform="translate(40,110)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>B1</text> -</g></g> -<text stroke="none" x="-110" y="-10" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>A1</text> -<g transform="translate(40,-110)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997"> -<title>$PN</title>A2</text> -</g></g> -<text stroke="none" x="160" y="-10" fill="black" font-size="31.999997"> -<title>$PN</title>B2</text> -</g> -<g id="DS1.1" transform="translate(5350,-2150)"> -<g transform="rotate(-180)"> -<g transform="scale(-1,1)"> -<use href="#symbol:led.1:m:s" fill="green" stroke="green"></use> -</g></g> -<text stroke="none" x="120" y="9" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0603</text> -<text stroke="none" x="120" y="44" fill="green" font-size="28.999987"> -<title>VALUE</title>GREEN</text> -<text stroke="none" x="100" y="-50" fill="green" font-size="28.999987"> -<title>MFGR_PN</title>LTST-C190GKT</text> -<text stroke="none" x="120" y="79" fill="green" font-size="28.999987"> -<title>$LOCATION</title>DS1</text> -<g transform="translate(-10,60)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>K</text> -</g></g> -<g transform="translate(-10,-60)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997"> -<title>$PN</title>A</text> -</g></g> -</g> -<g id="I109" transform="translate(4750,-1800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R46.1" transform="translate(550,-2400)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="50" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R46</text> -</g> -<g id="R51.4" transform="translate(4200,-2000)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="-100" fill="orange" font-size="23.000014" text-anchor="end"> -<title>VALUE</title>0.0</text> -<text stroke="none" x="150" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R51</text> -</g> -<g id="R31.1" transform="translate(350,-2750)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-10" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-35" fill="green" font-size="28.999987"> -<title>VALUE</title>10K</text> -<text stroke="none" x="30" y="15" fill="orange" font-size="23.000014"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R31</text> -</g> -<g id="R48.4" transform="translate(5050,-2300)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>120</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R48</text> -</g> -<g id="I116" transform="translate(8000,-2100)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I118" transform="translate(6750,-2100)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R54.1" transform="translate(6800,-2250)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="100" y="-100" fill="orange" font-size="48.000019"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R54</text> -</g> -<g id="R21.1" transform="translate(6800,-2500)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R21</text> -</g> -<g id="R22.1" transform="translate(8050,-2500)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R22</text> -</g> -<g id="R53.1" transform="translate(8050,-2250)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="100" y="-100" fill="orange" font-size="48.000019"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R53</text> -</g> -<g id="R55.4" transform="translate(4550,-2750)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R55</text> -</g> -<g id="R56.4" transform="translate(4550,-2600)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>100K</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R56</text> -</g> -<g id="TP7.1" transform="translate(6600,-1100)"> -<use href="#symbol:testpoint.1" fill="green" stroke="green"></use> -<text stroke="none" y="-50" fill="orange" font-size="48.000019"> -<title>VALUE</title></text> -<text stroke="none" x="-10" y="14" fill="green" font-size="28.999987" text-anchor="end"> -<title>$LOCATION</title>TP7</text> -</g> -<text stroke="none" x="2200" y="-650" fill="purple" font-size="60.000012000000005">BOOT STRAPS</text> -<text stroke="none" x="2200" y="-1100" fill="purple" font-size="60.000012000000005">BOOT</text> -<text stroke="none" x="3400" y="-350" fill="purple" font-size="48.000019">IN+ AND IN- SIGNALS MUST BE ROUTED DIFFERENTIALLY</text> -<text stroke="none" x="2200" y="-1600" fill="purple" font-size="60.000012000000005">INT/RST</text> -<text stroke="none" x="3400" y="-450" fill="purple" font-size="48.000019">INA ADDR: 0X40</text> -<text stroke="none" x="300" y="-4300" fill="purple" font-size="38.000017">SPI3</text> -<text stroke="none" x="2200" y="-2400" fill="purple" font-size="60.000012000000005">SPI - MCU/FPS</text> -<text stroke="none" x="300" y="-4350" fill="purple" font-size="38.000017">SPI1</text> -<text stroke="none" x="300" y="-4400" fill="purple" font-size="38.000017">CAN</text> -<text stroke="none" x="300" y="-4450" fill="purple" font-size="38.000017">USART3</text> -<text stroke="none" x="300" y="-4500" fill="purple" font-size="38.000017">USART1</text> -<text stroke="none" x="300" y="-4550" fill="purple" font-size="38.000017">USB</text> -<text stroke="none" x="300" y="-4650" fill="purple" font-size="38.000017">BOOT PERIPHERALS</text> -<text stroke="none" x="2200" y="-3000" fill="purple" font-size="60.000012000000005">SPI - MCU/HOST</text> -<text stroke="none" x="300" y="-4950" fill="purple" font-size="231.000018">STM32F412</text> -<text stroke="none" x="1100" y="-4300" fill="purple" font-size="38.000017">PA15/PC10/PC11/PC13</text> -<text stroke="none" x="1100" y="-4350" fill="purple" font-size="38.000017">PA4/PA5/PA6/PA7</text> -<text stroke="none" x="1100" y="-4400" fill="purple" font-size="38.000017">PB5/PB13</text> -<text stroke="none" x="1100" y="-4450" fill="purple" font-size="38.000017">PB10/PB11</text> -<text stroke="none" x="1100" y="-4500" fill="purple" font-size="38.000017">PA9/PA10</text> -<text stroke="none" x="1100" y="-4550" fill="purple" font-size="38.000017">PA11/PA12</text> -<text stroke="none" x="1100" y="-4650" fill="purple" font-size="38.000017">PINS</text> -<text stroke="none" x="2200" y="-3750" fill="purple" font-size="60.000012000000005">UART</text> -<text stroke="none" x="4350" y="-1750" fill="purple" font-size="30.000006000000003">MAX CURRENT SINK: 32MA</text> -<text stroke="none" x="5250" y="-1850" fill="purple" font-size="30.000006000000003">FORWARD CURRENT: 10MA</text> -<text stroke="none" x="5250" y="-1900" fill="purple" font-size="30.000006000000003">FORWARD VOLTAGE: 2.1V</text> -<text stroke="none" x="3050" y="-4850" fill="purple" font-size="48.000019">PLACE CAPS CLOSE TO MCU</text> -<text stroke="none" x="6050" y="-1850" fill="purple" font-size="30.000006000000003">DIVIDER AND R1 VS R2 LOCATION **</text> -<text stroke="none" x="6050" y="-1900" fill="purple" font-size="30.000006000000003">** PLEASE ADD SILKSCREEN TO INDICATE</text> -<text stroke="none" x="6050" y="-2000" fill="purple" font-size="30.000006000000003">DIVIDER INDICATES TRANSPORT LINE</text> -<text stroke="none" x="6600" y="-1600" fill="purple" font-size="75.000015">TESTPOINTS</text> -<text stroke="none" x="7300" y="-1850" fill="purple" font-size="30.000006000000003">DIVIDER AND R1 VS R2 LOCATION **</text> -<text stroke="none" x="7300" y="-1900" fill="purple" font-size="30.000006000000003">** PLEASE ADD SILKSCREEN TO INDICATE</text> -<text stroke="none" x="7300" y="-2000" fill="purple" font-size="30.000006000000003">DIVIDER INDICATES TRANSPORT LINE</text> -<text stroke="none" x="6650" y="-4900" fill="purple" font-size="38.000017">ALL PERIPHERALS, MAX FREQ: TYP = 29MA</text> -<text stroke="none" x="6650" y="-4950" fill="purple" font-size="38.000017">CURRENT CONSUMPTION</text> -<g transform="translate(5500,-3700)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DEBUG_MCU_JTCK_SWCLK</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5500,-3650)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DEBUG_MCU_JTDI</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(7950,-4250)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DEBUG_MCU_JTDO_SWO</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5500,-3750)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DEBUG_MCU_JTMS_SWDIO</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6700,-1100)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="340" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DEBUG_MCU_JTRST</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-4200)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DEBUG_MCU_JTRST</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6800,-2600)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6800,-2650)"> -<line x2="-650" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DIVIDER_HIGHSIDE</text> -<text stroke="none" x="-714" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(8050,-2600)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(8050,-2650)"> -<line x2="-650" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DIVIDER_HIGHSIDE</text> -<text stroke="none" x="-714" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-4000)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>DIVIDER_HIGHSIDE</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(350,-1600)"> -<line y2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(1800,-1350)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>FP_MCU_INT_L</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-550)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>FP_MCU_INT_L</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4400)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>FP_MCU_INT_L</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6800,-2350)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-2400)"> -<line x2="-650" stroke="goldenrod"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>FP_SENSOR_SEL</text> -<text stroke="none" x="-744" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-684" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6800,-2400)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(7950,-4400)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>FP_SENSOR_SEL</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4850,-450)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(4400,-950)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(4850,-500)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(4850,-500)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(4400,-1000)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(4950,-500)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(4800,-1900)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-2200)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6500,-3300)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(6500,-3350)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(6500,-3400)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(6500,-3450)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-3300)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-3350)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-3400)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-3450)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(8050,-2200)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-3500)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6800,-3500)"> -<line x2="-300" stroke="goldenrod"></line> -</g> -<g transform="translate(350,-2850)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-2900)"> -<line x2="-1500" stroke="goldenrod"></line> -<text stroke="none" x="-760" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_CLK</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4150)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_CLK</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(850,-3050)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-3050)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-760" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_CS_ODL</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4250,-4200)"> -<line x2="1250" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_CS_ODL</text> -<text stroke="none" x="-124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(600,-3100)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-3000)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-760" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_MISO</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4100)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_MISO</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(350,-3100)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-2950)"> -<line x2="-1500" stroke="goldenrod"></line> -<text stroke="none" x="-760" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_MOSI</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4050)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_SPI_MOSI</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-4050)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_MCU_WP_OD</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(350,-1050)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-1150)"> -<line x2="-1300" stroke="goldenrod"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_BOOT0</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3400)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_BOOT0</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(550,-1050)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-1100)"> -<line x2="-1100" stroke="goldenrod"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_BOOT1</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-4300)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_BOOT1</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(750,-1500)"> -<line x2="1050" stroke="goldenrod"></line> -<text stroke="none" x="340" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_RST_L</text> -<text stroke="none" x="1140" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1080" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(750,-1600)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6700,-900)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_RST_L</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-3850)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_RST_L</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(350,-2100)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(350,-2150)"> -<line x2="1500" stroke="goldenrod"></line> -<text stroke="none" x="740" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_CLK</text> -<text stroke="none" x="1590" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1530" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-800)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_CLK</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-3750)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_CLK</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(750,-2300)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(750,-2300)"> -<line x2="1100" stroke="goldenrod"></line> -<text stroke="none" x="340" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_CS_L</text> -<text stroke="none" x="1190" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1130" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-850)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_CS_L</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-3800)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_CS_L</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(550,-2250)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(550,-2250)"> -<line x2="1300" stroke="goldenrod"></line> -<text stroke="none" x="540" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_MISO</text> -<text stroke="none" x="1390" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1330" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-750)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_MISO</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-3700)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_MISO</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(350,-2200)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(350,-2200)"> -<line x2="1500" stroke="goldenrod"></line> -<text stroke="none" x="740" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_MOSI</text> -<text stroke="none" x="1590" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1530" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-700)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_MOSI</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-3650)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_FP_SPI_MOSI</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(550,-1400)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(550,-1400)"> -<line x2="1250" stroke="goldenrod"></line> -<text stroke="none" x="540" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_PLATFORM_INT_L</text> -<text stroke="none" x="1340" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1280" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3350,-2000)"> -<line x2="800" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_PLATFORM_INT_L</text> -<text stroke="none" x="-94" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-500)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_PLATFORM_INT_L</text> -<text stroke="none" x="1240" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4350)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_PLATFORM_INT_L</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(950,-1550)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(950,-1550)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="140" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_RST_ODL</text> -<text stroke="none" x="940" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="880" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3900,-3300)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(3900,-3500)"> -<line x2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(5500,-3500)"> -<line x2="-1600" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_RST_ODL</text> -<text stroke="none" x="-1774" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-1714" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-3950)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>MCU_USER_PRES_FP_L</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(350,-550)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-750)"> -<line x2="-1300" stroke="goldenrod"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PA11_STRAP</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3850)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PA11_STRAP</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(500,-550)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-700)"> -<line x2="-1150" stroke="goldenrod"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PA12_STRAP</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3800)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PA12_STRAP</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(650,-550)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-650)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PB5_STRAP</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-4150)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PB5_STRAP</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5100,-800)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP1800</text> -<text stroke="none" x="800" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>5 </text> -<text stroke="none" x="740" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6700,-1450)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="340" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800</text> -<text stroke="none" x="800" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>5 </text> -<text stroke="none" x="740" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5100,-750)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP1800_FP</text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(350,-1750)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(350,-1800)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(550,-1750)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(550,-1800)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(750,-1750)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(950,-1750)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(950,-1800)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(350,-2500)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(350,-2550)"> -<line x2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(550,-2500)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(550,-2550)"> -<line x2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(750,-2500)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(750,-2550)"> -<line x2="1100" stroke="goldenrod"></line> -<text stroke="none" x="710" y="-10" fill="orange" font-size="60.000012000000005"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="1310" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="1250" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="1190" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="1130" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1800,-1800)"> -<line x2="-850" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="60.000012000000005"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="210" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="150" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3400,-1300)"> -<line x2="300" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-214" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-154" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-94" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3700,-1250)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(3700,-1300)"> -<line x2="700" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4400,-1250)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(4400,-1300)"> -<line x2="300" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4700,-1250)"> -<line x2="-300" stroke="goldenrod"></line> -</g> -<g transform="translate(5100,-1050)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="860" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="800" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="740" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5100,-1300)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="860" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="800" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="740" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4250,-2300)"> -<line x2="550" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="48.000019"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-244" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-184" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4800,-2100)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(4800,-2300)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6700,-1500)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="340" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="860" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="800" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="740" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3300,-5100)"> -<line x2="-350" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-310" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-564" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-504" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-444" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-384" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5100,-1000)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300_FP</text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(350,-3250)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(350,-3300)"> -<line x2="250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(600,-3250)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(850,-3250)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(850,-3300)"> -<line x2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(350,-3900)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(550,-3900)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(550,-3950)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(750,-3900)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(750,-3950)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(950,-3900)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(950,-3950)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1850,-3300)"> -<line x2="-1000" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="60.000012000000005"> -<title>SIG_NAME</title>PP3300_MCU</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1850,-3950)"> -<line x2="-900" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="60.000012000000005"> -<title>SIG_NAME</title>PP3300_MCU</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5100,-1250)"> -<line x2="650" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300_MCU</text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3000,-4500)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-4700)"> -<line x2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(3200,-4500)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(4250,-4950)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(4250,-5100)"> -<line x2="-800" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_MCU</text> -<text stroke="none" x="-644" y="-10" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4500,-4950)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(4500,-5100)"> -<line x2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4750,-4950)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(5300,-4500)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(4750,-5100)"> -<line x2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5000,-4950)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(5300,-4700)"> -<line x2="-2100" stroke="goldenrod"></line> -</g> -<g transform="translate(5300,-4700)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5500,-4500)"> -<line x2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(5300,-4750)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5000,-5100)"> -<line x2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5300,-4800)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5300,-4850)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5500,-4700)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5500,-4750)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5500,-4800)"> -<line x2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5300,-5100)"> -<line y2="250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5300,-5100)"> -<line x2="-300" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4700,-1150)"> -<line x2="-700" stroke="goldenrod"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_INA_I2C_SCL</text> -<text stroke="none" x="-734" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(4700,-1100)"> -<line x2="-700" stroke="goldenrod"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_INA_I2C_SDA</text> -<text stroke="none" x="-734" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6700,-1250)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SERVO_MCU_JTCK_SWCLK</text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6700,-1200)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SERVO_MCU_JTDI</text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6700,-1150)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SERVO_MCU_JTDO_SWO</text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6700,-1300)"> -<line x2="1150" stroke="goldenrod"></line> -<text stroke="none" x="350" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SERVO_MCU_JTMS_SWDIO</text> -<text stroke="none" x="1180" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(4500,-2750)"> -<line x2="-650" stroke="goldenrod"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SLP_S0_L</text> -<text stroke="none" x="-714" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(4650,-2750)"> -<line x2="700" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SLP_S0_L_R</text> -<text stroke="none" x="730" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4000)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SLP_S0_L_R</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4500,-2600)"> -<line x2="-650" stroke="goldenrod"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SLP_S3_L</text> -<text stroke="none" x="-714" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(4650,-2600)"> -<line x2="700" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SLP_S3_L_R</text> -<text stroke="none" x="730" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7950,-4100)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>SLP_S3_L_R</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(8050,-2350)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(8050,-2400)"> -<line x2="-650" stroke="goldenrod"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>TRANSPORT_SEL</text> -<text stroke="none" x="-684" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(8050,-2400)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(7950,-4350)"> -<line x2="-1450" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>TRANSPORT_SEL</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(350,-3750)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-3550)"> -<line x2="-1500" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART1_HOST_TX_MCU_RX</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3900)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART1_HOST_TX_MCU_RX</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(550,-3750)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-3600)"> -<line x2="-1300" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART1_MCU_TX_HOST_RX</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3950)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART1_MCU_TX_HOST_RX</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(950,-3700)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-3700)"> -<line x2="-900" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART2_MCU_TX_SERVO_RX</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4300)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART2_MCU_TX_SERVO_RX</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(750,-3650)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-3650)"> -<line x2="-1100" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART2_SERVO_TX_MCU_RX</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4250)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1210" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>UART2_SERVO_TX_MCU_RX</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3450,-4500)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(3450,-4550)"> -<line x2="2050" stroke="goldenrod"></line> -</g> -<g transform="translate(5150,-2300)"> -<line x2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-2200)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-2000)"> -<line x2="-450" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-2100)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(4300,-2000)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<circle cx="6800" cy="-2400" r="10" stroke="black" fill="black"></circle> -<circle cx="4850" cy="-500" r="10" stroke="black" fill="black"></circle> -<circle cx="6800" cy="-3300" r="10" stroke="black" fill="black"></circle> -<circle cx="6800" cy="-3350" r="10" stroke="black" fill="black"></circle> -<circle cx="6800" cy="-3400" r="10" stroke="black" fill="black"></circle> -<circle cx="6800" cy="-3450" r="10" stroke="black" fill="black"></circle> -<circle cx="3900" cy="-3500" r="10" stroke="black" fill="black"></circle> -<circle cx="550" cy="-1800" r="10" stroke="black" fill="black"></circle> -<circle cx="750" cy="-1800" r="10" stroke="black" fill="black"></circle> -<circle cx="950" cy="-1800" r="10" stroke="black" fill="black"></circle> -<circle cx="550" cy="-2550" r="10" stroke="black" fill="black"></circle> -<circle cx="750" cy="-2550" r="10" stroke="black" fill="black"></circle> -<circle cx="3700" cy="-1300" r="10" stroke="black" fill="black"></circle> -<circle cx="4400" cy="-1300" r="10" stroke="black" fill="black"></circle> -<circle cx="4800" cy="-2300" r="10" stroke="black" fill="black"></circle> -<circle cx="600" cy="-3300" r="10" stroke="black" fill="black"></circle> -<circle cx="850" cy="-3300" r="10" stroke="black" fill="black"></circle> -<circle cx="550" cy="-3950" r="10" stroke="black" fill="black"></circle> -<circle cx="750" cy="-3950" r="10" stroke="black" fill="black"></circle> -<circle cx="950" cy="-3950" r="10" stroke="black" fill="black"></circle> -<circle cx="3200" cy="-4700" r="10" stroke="black" fill="black"></circle> -<circle cx="4250" cy="-5100" r="10" stroke="black" fill="black"></circle> -<circle cx="4500" cy="-5100" r="10" stroke="black" fill="black"></circle> -<circle cx="4750" cy="-5100" r="10" stroke="black" fill="black"></circle> -<circle cx="5300" cy="-4700" r="10" stroke="black" fill="black"></circle> -<circle cx="5300" cy="-4750" r="10" stroke="black" fill="black"></circle> -<circle cx="5000" cy="-5100" r="10" stroke="black" fill="black"></circle> -<circle cx="5300" cy="-4800" r="10" stroke="black" fill="black"></circle> -<circle cx="5300" cy="-4850" r="10" stroke="black" fill="black"></circle> -<circle cx="8050" cy="-2400" r="10" stroke="black" fill="black"></circle> -</svg> - -</div> -</div> -<hr> -<div id="page3"> -<h1>dragonclaw/page3: HOST SELECTION</h1> -<div> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,-5500,8500,5500" width="14.87500in" height="9.62500in" font-family="monospace" font-size="47.000000" stroke-width="3" style="background-color:white"> -<use href="#symbol:border_b.3" fill="green" stroke="green"></use> -<text stroke="none" x="6570" y="-95" fill="green" font-size="26.999996"> -<title>CUSTOM_TXT_CDS</title>Fri Jan 17 12:53:12 2020</text> -<text stroke="none" x="6500" y="-170" fill="green" font-size="33.999988"> -<title>CUSTOM_TXT_CDS</title>dragonclaw</text> -<text stroke="none" x="7500" y="-175" fill="green" font-size="30.000006000000003"> -<title>CUSTOM_TXT_CDS</title>650-03910-01-SCH</text> -<text stroke="none" x="8265" y="-175" fill="green" font-size="33.999988" text-anchor="middle"> -<title>CUSTOM_TXT_CDS</title>0.2</text> -<text stroke="none" x="8427" y="-84" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>3 OF 5</text> -<text stroke="none" x="8427" y="-119" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>3 OF 5</text> -<text stroke="none" x="7212" y="-260" fill="orange" font-size="67.999976" text-anchor="middle"> -<title>PAGE_TITLE</title>HOST SELECTION</text> -<g id="I1" transform="translate(6400,-3300)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U7.3" transform="translate(5800,-3500)"> -<use href="#symbol:analog_switch.3" fill="green" stroke="green"></use> -<text stroke="none" x="-150" y="179" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>QUAD_QFN16</text> -<text stroke="none" x="-150" y="93" fill="orange" font-size="31.999997"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="-150" y="50" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>313-04276-00</text> -<text stroke="none" x="-150" y="136" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>TS3A5018RSVR</text> -<text stroke="none" y="-800" fill="black" font-size="31.999997" text-anchor="middle"> -<title>$LOCATION</title>U7</text> -<text stroke="none" x="-210" y="-110" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="-210" y="-210" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-210" y="-360" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>6</text> -<text stroke="none" x="-210" y="-510" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="210" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>11</text> -<text stroke="none" x="210" y="-210" fill="black" font-size="38.000017"> -<title>$PN</title>12</text> -<text stroke="none" x="-210" y="-660" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="210" y="-310" fill="black" font-size="38.000017"> -<title>$PN</title>8</text> -<text stroke="none" x="-210" y="-760" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>15</text> -<text stroke="none" x="210" y="-360" fill="black" font-size="38.000017"> -<title>$PN</title>9</text> -<text stroke="none" x="210" y="-460" fill="black" font-size="38.000017"> -<title>$PN</title>4</text> -<text stroke="none" x="210" y="-510" fill="black" font-size="38.000017"> -<title>$PN</title>3</text> -<text stroke="none" x="210" y="-610" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -<text stroke="none" x="210" y="-660" fill="black" font-size="38.000017"> -<title>$PN</title>16</text> -<text stroke="none" x="210" y="-760" fill="black" font-size="38.000017"> -<title>$PN</title>14</text> -</g> -<g id="I3" transform="translate(5350,-3300)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C10.1" transform="translate(7200,-4100)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C10</text> -</g> -<g id="I5" transform="translate(7150,-4000)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I8" transform="translate(6300,-4550)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U5.15" transform="translate(2400,-1750)"> -<use href="#symbol:load_switch.15" fill="green" stroke="green"></use> -<text stroke="none" x="-200" y="250" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>313-04181-00</text> -<text stroke="none" x="-200" y="336" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>TPS2559DRCR</text> -<text stroke="none" x="-200" y="379" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>VSON10</text> -<text stroke="none" x="-200" y="293" fill="orange" font-size="31.999997"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" y="-200" fill="black" font-size="31.999997" text-anchor="middle"> -<title>$LOCATION</title>U5</text> -<text stroke="none" x="-260" y="-160" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="-260" y="-110" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>3</text> -<text stroke="none" x="-260" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="-260" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-260" y="90" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="-260" y="140" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>6</text> -<text stroke="none" x="260" y="140" fill="black" font-size="38.000017"> -<title>$PN</title>11</text> -<text stroke="none" x="260" y="90" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -<text stroke="none" x="260" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>9</text> -<text stroke="none" x="260" y="-110" fill="black" font-size="38.000017"> -<title>$PN</title>8</text> -<text stroke="none" x="260" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>7</text> -</g> -<g id="R10.1" transform="translate(1800,-1450)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R10</text> -</g> -<g id="I16" transform="translate(1750,-1300)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I17" transform="translate(2950,-1450)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I20" transform="translate(2950,-550)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I24" transform="translate(2950,-4050)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U3.15" transform="translate(2400,-4350)"> -<use href="#symbol:load_switch.15" fill="green" stroke="green"></use> -<text stroke="none" x="-200" y="250" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>313-04181-00</text> -<text stroke="none" x="-200" y="293" fill="orange" font-size="31.999997"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="-200" y="336" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>TPS2559DRCR</text> -<text stroke="none" x="-200" y="379" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>VSON10</text> -<text stroke="none" y="-200" fill="black" font-size="31.999997" text-anchor="middle"> -<title>$LOCATION</title>U3</text> -<text stroke="none" x="-260" y="-160" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="-260" y="-110" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>3</text> -<text stroke="none" x="-260" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="-260" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-260" y="90" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="-260" y="140" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>6</text> -<text stroke="none" x="260" y="140" fill="black" font-size="38.000017"> -<title>$PN</title>11</text> -<text stroke="none" x="260" y="90" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -<text stroke="none" x="260" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>9</text> -<text stroke="none" x="260" y="-110" fill="black" font-size="38.000017"> -<title>$PN</title>8</text> -<text stroke="none" x="260" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>7</text> -</g> -<g id="R12.1" transform="translate(2000,-3950)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R12</text> -</g> -<g id="I28" transform="translate(1950,-3800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="Q1.1" transform="translate(1250,-4050)"> -<use href="#symbol:nmos.1" fill="green" stroke="green"></use> -<text stroke="none" x="80" y="100" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>SOT23_3P_1</text> -<text stroke="none" x="80" y="-20" fill="green" font-size="28.999987"> -<title>MFGR_PN</title>BSS138</text> -<text stroke="none" x="80" y="10" fill="green" font-size="28.999987"> -<title>VDS</title>50V</text> -<text stroke="none" x="80" y="40" fill="green" font-size="28.999987"> -<title>RDS</title>6.0Ohm</text> -<text stroke="none" x="80" y="70" fill="green" font-size="28.999987"> -<title>ID</title>200mA</text> -<text stroke="none" x="80" y="-50" fill="green" font-size="23.000014"> -<title>MFGR</title>ON SEMICONDUCTOR</text> -<text stroke="none" x="80" y="-80" fill="green" font-size="28.999987"> -<title>$LOCATION</title>Q1</text> -<text stroke="none" x="24" y="92" fill="black" font-size="23.999986000000003"> -<title>$PN</title>S</text> -<text stroke="none" x="-94" y="41" fill="black" font-size="23.999986000000003"> -<title>$PN</title>G</text> -<text stroke="none" x="24" y="-76" fill="black" font-size="23.999986000000003"> -<title>$PN</title>D</text> -</g> -<g id="R8.1" transform="translate(1300,-4350)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R8</text> -</g> -<g id="I31" transform="translate(1250,-3850)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R6.1" transform="translate(1100,-3850)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R6</text> -</g> -<g id="I33" transform="translate(1050,-3700)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I34" transform="translate(2800,-3000)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R9.1" transform="translate(1300,-3250)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R9</text> -</g> -<g id="Q2.1" transform="translate(1250,-2950)"> -<use href="#symbol:nmos.1" fill="green" stroke="green"></use> -<text stroke="none" x="80" y="40" fill="green" font-size="28.999987"> -<title>RDS</title>6.0Ohm</text> -<text stroke="none" x="80" y="-20" fill="green" font-size="28.999987"> -<title>MFGR_PN</title>BSS138</text> -<text stroke="none" x="80" y="70" fill="green" font-size="28.999987"> -<title>ID</title>200mA</text> -<text stroke="none" x="80" y="10" fill="green" font-size="28.999987"> -<title>VDS</title>50V</text> -<text stroke="none" x="80" y="-50" fill="green" font-size="23.000014"> -<title>MFGR</title>ON SEMICONDUCTOR</text> -<text stroke="none" x="80" y="100" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>SOT23_3P_1</text> -<text stroke="none" x="80" y="-80" fill="green" font-size="28.999987"> -<title>$LOCATION</title>Q2</text> -<text stroke="none" x="24" y="92" fill="black" font-size="23.999986000000003"> -<title>$PN</title>S</text> -<text stroke="none" x="-94" y="41" fill="black" font-size="23.999986000000003"> -<title>$PN</title>G</text> -<text stroke="none" x="24" y="-76" fill="black" font-size="23.999986000000003"> -<title>$PN</title>D</text> -</g> -<g id="I41" transform="translate(1250,-2750)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R7.1" transform="translate(1100,-2750)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R7</text> -</g> -<g id="I43" transform="translate(1050,-2600)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U8.1" transform="translate(5900,-1050)"> -<use href="#symbol:ts5a23159.1" fill="green" stroke="green"></use> -<text stroke="none" x="-300" y="671" fill="green" font-size="36.999998"> -<title>PACK_TYPE</title>VSSOP10</text> -<text stroke="none" x="-300" y="614" fill="green" font-size="36.999998"> -<title>MFGR_PN</title>TS5A23159DGSR</text> -<text stroke="none" x="-300" y="557" fill="green" font-size="36.999998"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="-300" y="500" fill="green" font-size="36.999998"> -<title>AGILE_PN</title>232-00045-00</text> -<text stroke="none" x="350" y="-400" fill="green" font-size="57.000002" text-anchor="end"> -<title>$LOCATION</title>U8</text> -<text stroke="none" x="-360" y="-260" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>9</text> -<text stroke="none" x="-360" y="-160" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<g transform="translate(-60,360)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>3</text> -</g></g> -<text stroke="none" x="-360" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="-360" y="140" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="360" y="140" fill="black" font-size="38.000017"> -<title>$PN</title>5</text> -<text stroke="none" x="360" y="40" fill="black" font-size="38.000017"> -<title>$PN</title>6</text> -<g transform="translate(-60,-460)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017"> -<title>$PN</title>8</text> -</g></g> -<text stroke="none" x="360" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -<text stroke="none" x="360" y="-260" fill="black" font-size="38.000017"> -<title>$PN</title>10</text> -</g> -<g id="I45" transform="translate(6400,-1400)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C11.1" transform="translate(6450,-1500)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C11</text> -</g> -<g id="I47" transform="translate(5800,-600)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R2.4" transform="translate(2350,-4700)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.01</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="100" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R2</text> -</g> -<g id="R14.4" transform="translate(2350,-3500)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.01</text> -<text stroke="none" x="100" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R14</text> -</g> -<g id="R15.4" transform="translate(2350,-2100)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="100" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.01</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R15</text> -</g> -<g id="R16.4" transform="translate(2350,-1100)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="100" y="-100" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.01</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R16</text> -</g> -<g id="C19.1" transform="translate(7200,-2750)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C19</text> -</g> -<g id="I59" transform="translate(7150,-2650)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I60" transform="translate(6400,-1950)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U13.3" transform="translate(5800,-2150)"> -<use href="#symbol:analog_switch.3" fill="green" stroke="green"></use> -<text stroke="none" x="-150" y="50" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>313-04276-00</text> -<text stroke="none" x="-150" y="136" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>TS3A5018RSVR</text> -<text stroke="none" x="-150" y="179" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>QUAD_QFN16</text> -<text stroke="none" x="-150" y="93" fill="orange" font-size="31.999997"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" y="-800" fill="black" font-size="31.999997" text-anchor="middle"> -<title>$LOCATION</title>U13</text> -<text stroke="none" x="-210" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="-210" y="-210" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-210" y="-360" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="31.999997"> -<title>$PN</title>6</text> -<text stroke="none" x="-210" y="-510" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="210" y="-160" fill="black" font-size="31.999997"> -<title>$PN</title>11</text> -<text stroke="none" x="210" y="-210" fill="black" font-size="31.999997"> -<title>$PN</title>12</text> -<text stroke="none" x="-210" y="-660" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="210" y="-310" fill="black" font-size="31.999997"> -<title>$PN</title>8</text> -<text stroke="none" x="-210" y="-760" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>15</text> -<text stroke="none" x="210" y="-360" fill="black" font-size="31.999997"> -<title>$PN</title>9</text> -<text stroke="none" x="210" y="-460" fill="black" font-size="31.999997"> -<title>$PN</title>4</text> -<text stroke="none" x="210" y="-510" fill="black" font-size="31.999997"> -<title>$PN</title>3</text> -<text stroke="none" x="210" y="-610" fill="black" font-size="31.999997"> -<title>$PN</title>1</text> -<text stroke="none" x="210" y="-660" fill="black" font-size="31.999997"> -<title>$PN</title>16</text> -<text stroke="none" x="210" y="-760" fill="black" font-size="31.999997"> -<title>$PN</title>14</text> -</g> -<g id="I62" transform="translate(5350,-1950)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="SW1.1" transform="translate(5850,-4850)"> -<use href="#symbol:spdt.1" fill="green" stroke="green"></use> -<text stroke="none" x="-100" y="193" fill="orange" font-size="31.999997"> -<title>MFGR</title>C & K COMPONENTS</text> -<text stroke="none" x="-100" y="279" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>SLIDE_3P</text> -<text stroke="none" x="-100" y="236" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>JS102011SAQN</text> -<text stroke="none" x="-100" y="150" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>510-00282-00</text> -<text stroke="none" y="-150" fill="black" font-size="31.999997" text-anchor="middle"> -<title>$LOCATION</title>SW1</text> -</g> -<g id="R50.4" transform="translate(6500,-4950)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R50</text> -</g> -<g id="U4.1" transform="translate(2400,-3200)"> -<use href="#symbol:tps22913.1" fill="green" stroke="green"></use> -<text stroke="none" x="-150" y="250" fill="orange" font-size="30.000006000000003"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="-150" y="300" fill="orange" font-size="30.000006000000003"> -<title>MFGR_PN</title>TPS22913BYZVR</text> -<text stroke="none" x="-150" y="200" fill="orange" font-size="30.000006000000003"> -<title>AGILE_PN</title>400-00131-00</text> -<text stroke="none" x="-152" y="-182" fill="green" font-size="30.999978"> -<title>LOCATION</title>U4</text> -<text stroke="none" x="-210" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>A2</text> -<text stroke="none" x="-210" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>B2</text> -<text stroke="none" x="210" y="40" fill="black" font-size="38.000017"> -<title>$PN</title>B1</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>A1</text> -</g> -<g id="U6.1" transform="translate(2400,-850)"> -<use href="#symbol:tps22913.1" fill="green" stroke="green"></use> -<text stroke="none" x="-150" y="200" fill="orange" font-size="30.000006000000003"> -<title>AGILE_PN</title>400-00131-00</text> -<text stroke="none" x="-150" y="300" fill="orange" font-size="30.000006000000003"> -<title>MFGR_PN</title>TPS22913BYZVR</text> -<text stroke="none" x="-150" y="250" fill="orange" font-size="30.000006000000003"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="-152" y="-182" fill="green" font-size="30.999978"> -<title>LOCATION</title>U6</text> -<text stroke="none" x="-210" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>A2</text> -<text stroke="none" x="-210" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>B2</text> -<text stroke="none" x="210" y="40" fill="black" font-size="38.000017"> -<title>$PN</title>B1</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>A1</text> -</g> -<text stroke="none" x="1400" y="-2400" fill="purple" font-size="48.000019">LOAD SWITCHES HAVE REVERSE-CURRENT PROTECTION</text> -<text stroke="none" x="1400" y="-2450" fill="purple" font-size="48.000019">LOAD SWITCHS FOR ISOLATION BETWEEN SOURCES</text> -<text stroke="none" x="550" y="-5050" fill="purple" font-size="30.000006000000003">ILIM = 1115MA, SET BY RES</text> -<text stroke="none" x="550" y="-5100" fill="purple" font-size="38.000017">SERVO POWER ONLY ENABLED IF PLATFORM NOT CONNECTED</text> -<text stroke="none" x="550" y="-5150" fill="purple" font-size="38.000017">SYSTEM POWER CAN BE PROVIDED BY SERVO OR PLATFORM</text> -<text stroke="none" x="550" y="-5250" fill="purple" font-size="60.000012000000005">MASTER SELECTION FOR BOARD POWER</text> -<text stroke="none" x="4700" y="-1650" fill="purple" font-size="38.000017">DETERMINE WHICH HOST DRIVES BOOT SIGNALS</text> -<text stroke="none" x="4750" y="-3050" fill="purple" font-size="38.000017">DETERMINE WHICH HOST COMMUNICATES WITH MCU: UART AND SLP SIGNALS </text> -<text stroke="none" x="4750" y="-4400" fill="purple" font-size="38.000017">DETERMINE WHICH HOST COMMUNICATES WITH MCU VIA SPI</text> -<text stroke="none" x="4750" y="-5050" fill="purple" font-size="38.000017">L: SERVO, H: PLATFORM</text> -<text stroke="none" x="4750" y="-5100" fill="purple" font-size="38.000017">HOST_SEL CONTROLLED BY MECHANICAL SWITCH</text> -<text stroke="none" x="4750" y="-5150" fill="purple" font-size="38.000017">HOST CAN BE SERVO OR PLATFORM: DETERMINED BY "HOST_SEL"</text> -<text stroke="none" x="4750" y="-5250" fill="purple" font-size="60.000012000000005">MASTER SELECTION FOR HOST TO MCU COMMUNICATOIN</text> -<text stroke="none" x="6700" y="-3300" fill="purple" font-size="38.000017">SWITCHES CAN HANDLE SPEEDS UP TO 100MHZ </text> -<text stroke="none" x="6100" y="-4800" fill="purple" font-size="38.000017">ADD SILKSCREEN NOTE FOR SERVO VS PLATFORM DIRECTION</text> -<text stroke="none" x="6500" y="-4650" fill="purple" font-size="38.000017">GND SIDE: SERVO </text> -<text stroke="none" x="6500" y="-4700" fill="purple" font-size="38.000017">PP3300 SIDE: PLATFORM </text> -<g transform="translate(1300,-3150)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-3150)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-3150)"> -<line x2="900" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>EN_PP1800_SERVO</text> -</g> -<g transform="translate(1300,-4250)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-4250)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-4250)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-610" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>EN_PP3300_SERVO</text> -</g> -<g transform="translate(1800,-1400)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2600,-800)"> -<line x2="400" stroke="goldenrod"></line> -</g> -<g transform="translate(1100,-2700)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-800)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-2850)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-1600)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-1650)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-1600)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-1650)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(1100,-3800)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-3950)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2600,-3150)"> -<line x2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-3900)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2850,-3150)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(5850,-650)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-4200)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-4250)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-4200)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-4250)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(5400,-2250)"> -<line y2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(5600,-2250)"> -<line x2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-2200)"> -<line x2="450" stroke="goldenrod"></line> -</g> -<g transform="translate(6450,-2200)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(5400,-3600)"> -<line y2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(5600,-3600)"> -<line x2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-3550)"> -<line x2="450" stroke="goldenrod"></line> -</g> -<g transform="translate(6450,-3550)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-4750)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<g transform="translate(6350,-4750)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(4750,-4000)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_MCU_SPI_CLK</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4750,-3850)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_MCU_SPI_MISO</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4750,-3700)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_MCU_SPI_MOSI</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4750,-4150)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_MCU_WP_OD</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6250,-900)"> -<line x2="700" stroke="goldenrod"></line> -</g> -<g transform="translate(6250,-1200)"> -<line x2="700" stroke="goldenrod"></line> -</g> -<g transform="translate(4750,-2950)"> -<line x2="550" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_SEL</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(6950,-900)"> -<line y2="-300" stroke="goldenrod"></line> -</g> -<g transform="translate(6950,-1200)"> -<line x2="450" stroke="goldenrod"></line> -<text stroke="none" x="190" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_SEL</text> -<text stroke="none" x="480" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5300,-2900)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(5300,-2950)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(4750,-4300)"> -<line x2="550" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_SEL</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5300,-4250)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(4750,-4850)"> -<line x2="950" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>HOST_SEL</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5300,-4300)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6250,-1300)"> -<line x2="550" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_BOOT0</text> -<text stroke="none" x="580" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6250,-1000)"> -<line x2="550" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_BOOT1</text> -<text stroke="none" x="580" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4700,-1200)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_BOOT0</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(4700,-900)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_BOOT1</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2750)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SLP_S0_L</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2600)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SLP_S3_L</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-3950)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SPI_CLK</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-3800)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SPI_MISO</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-3650)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SPI_MOSI</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-4100)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_WP_OD</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(2450,-1100)"> -<line x2="550" stroke="goldenrod"></line> -</g> -<g transform="translate(3000,-900)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(3000,-900)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="140" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800</text> -<text stroke="none" x="600" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>5 </text> -<text stroke="none" x="540" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="480" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3000,-1100)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(2600,-3250)"> -<line x2="250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2450,-3500)"> -<line x2="400" stroke="goldenrod"></line> -</g> -<g transform="translate(2850,-3250)"> -<line y2="-150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2850,-3400)"> -<line x2="650" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="360" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800</text> -<text stroke="none" x="800" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>5 </text> -<text stroke="none" x="740" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="680" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2850,-3500)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(1050,-900)"> -<line x2="750" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_PLATFORM</text> -<text stroke="none" x="-124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(1800,-900)"> -<line y2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1800,-900)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2000,-800)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-800)"> -<line x2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(1800,-1100)"> -<line x2="500" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2000,-900)"> -<line x2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(1100,-2850)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1100,-2900)"> -<line x2="-700" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_PLATFORM</text> -<text stroke="none" x="-794" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-734" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(1150,-2900)"> -<line x2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(400,-3400)"> -<line x2="900" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_SERVO</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(1300,-3350)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-3400)"> -<line x2="650" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1950,-3250)"> -<line y2="-150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1950,-3250)"> -<line x2="250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1950,-3400)"> -<line y2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1950,-3500)"> -<line x2="350" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2650,-1800)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2650,-1850)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2450,-2100)"> -<line x2="550" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-1900)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2800,-1800)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2800,-1850)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2800,-1900)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(3000,-1900)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="140" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="660" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="600" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="540" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="480" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3000,-2100)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-4400)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2650,-4450)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2450,-4700)"> -<line x2="550" stroke="goldenrod"></line> -</g> -<g transform="translate(2650,-4500)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2800,-4400)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2800,-4450)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2800,-4500)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5850,-1500)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(5850,-1600)"> -<line x2="600" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(3000,-4500)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="140" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="660" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="600" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="540" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="480" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(3000,-4700)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(6450,-1550)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6850,-1600)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-260" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="210" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="150" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-2900)"> -<line x2="1200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7200,-2900)"> -<line y2="100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6000,-4250)"> -<line x2="1200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7600,-2900)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-260" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="210" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="150" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7200,-4250)"> -<line y2="100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7600,-4250)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-260" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="210" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="150" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1050,-1900)"> -<line x2="750" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_PLATFORM</text> -<text stroke="none" x="-124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2000,-1650)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(1800,-1900)"> -<line y2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1800,-1900)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2000,-1800)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-1650)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-1850)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1800,-2100)"> -<line x2="500" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2150,-1800)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-1850)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-1900)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(1100,-3950)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1100,-4000)"> -<line x2="-700" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_PLATFORM</text> -<text stroke="none" x="-794" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-734" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(1150,-4000)"> -<line x2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6600,-4950)"> -<line x2="850" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_PLATFORM</text> -<text stroke="none" x="940" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="880" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(400,-4500)"> -<line x2="900" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_SERVO</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(1300,-4450)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1300,-4500)"> -<line x2="550" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1850,-4500)"> -<line x2="150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1850,-4500)"> -<line y2="-200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2000,-4400)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-4450)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1850,-4700)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2150,-4400)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-4450)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-4500)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(4700,-1300)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_BOOT0</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(4700,-1000)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_BOOT1</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2800)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SLP_S0_L</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2650)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SLP_S3_L</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-4000)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_CLK</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-3850)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_MISO</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-3700)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_MOSI</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-4150)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_WP_OD</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(4750,-2800)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SLP_S0_L</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4750,-2650)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SLP_S3_L</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4750,-2350)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_HOST_TX_MCU_RX</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4750,-2500)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_MCU_TX_HOST_RX</text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-2450)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_MCU_TX_PLATFORM_RX</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2500)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_MCU_TX_SERVO_RX</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2300)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_PLATFORM_TX_MCU_RX</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(6000,-2350)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_SERVO_TX_MCU_RX</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(1800,-1600)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-1600)"> -<line x2="-350" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-4200)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(2150,-4200)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-4950)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -</g> -<circle cx="1300" cy="-3150" r="10" stroke="black" fill="black"></circle> -<circle cx="1300" cy="-4250" r="10" stroke="black" fill="black"></circle> -<circle cx="3000" cy="-1600" r="10" stroke="black" fill="black"></circle> -<circle cx="3000" cy="-4200" r="10" stroke="black" fill="black"></circle> -<circle cx="6950" cy="-1200" r="10" stroke="black" fill="black"></circle> -<circle cx="3000" cy="-900" r="10" stroke="black" fill="black"></circle> -<circle cx="2850" cy="-3400" r="10" stroke="black" fill="black"></circle> -<circle cx="1800" cy="-900" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-900" r="10" stroke="black" fill="black"></circle> -<circle cx="1100" cy="-2900" r="10" stroke="black" fill="black"></circle> -<circle cx="1300" cy="-3400" r="10" stroke="black" fill="black"></circle> -<circle cx="1950" cy="-3400" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-1850" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-1900" r="10" stroke="black" fill="black"></circle> -<circle cx="3000" cy="-1900" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-4450" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-4500" r="10" stroke="black" fill="black"></circle> -<circle cx="3000" cy="-4500" r="10" stroke="black" fill="black"></circle> -<circle cx="6450" cy="-1600" r="10" stroke="black" fill="black"></circle> -<circle cx="7200" cy="-2900" r="10" stroke="black" fill="black"></circle> -<circle cx="7200" cy="-4250" r="10" stroke="black" fill="black"></circle> -<circle cx="1800" cy="-1900" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-1800" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-1850" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-1900" r="10" stroke="black" fill="black"></circle> -<circle cx="1100" cy="-4000" r="10" stroke="black" fill="black"></circle> -<circle cx="1300" cy="-4500" r="10" stroke="black" fill="black"></circle> -<circle cx="1850" cy="-4500" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-4450" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-4500" r="10" stroke="black" fill="black"></circle> -</svg> - -</div> -</div> -<hr> -<div id="page4"> -<h1>dragonclaw/page4: HOST CONNECTORS</h1> -<div> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,-5500,8500,5500" width="14.87500in" height="9.62500in" font-family="monospace" font-size="47.000000" stroke-width="3" style="background-color:white"> -<use href="#symbol:border_b.3" fill="green" stroke="green"></use> -<text stroke="none" x="6570" y="-95" fill="green" font-size="26.999996"> -<title>CUSTOM_TXT_CDS</title>Fri Jan 17 12:53:13 2020</text> -<text stroke="none" x="6500" y="-170" fill="green" font-size="33.999988"> -<title>CUSTOM_TXT_CDS</title>dragonclaw</text> -<text stroke="none" x="7500" y="-175" fill="green" font-size="30.000006000000003"> -<title>CUSTOM_TXT_CDS</title>650-03910-01-SCH</text> -<text stroke="none" x="8265" y="-175" fill="green" font-size="33.999988" text-anchor="middle"> -<title>CUSTOM_TXT_CDS</title>0.2</text> -<text stroke="none" x="8427" y="-84" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>4 OF 5</text> -<text stroke="none" x="8427" y="-119" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>4 OF 5</text> -<text stroke="none" x="7212" y="-260" fill="orange" font-size="67.999976" text-anchor="middle"> -<title>PAGE_TITLE</title>HOST CONNECTORS</text> -<g id="J1.1" transform="translate(5700,-4000)"> -<use href="#symbol:panasonic_p4.1" fill="green" stroke="green"></use> -<text stroke="none" x="-122" y="-725" fill="orange" font-size="23.999986000000003" text-anchor="end"> -<title>PATH</title>I6</text> -<text stroke="none" x="-125" y="870" fill="orange" font-size="23.999986000000003"> -<title>PACK_TYPE</title>50P</text> -<text stroke="none" x="-125" y="830" fill="orange" font-size="23.999986000000003"> -<title>MFGR_PN</title>AXK750147G</text> -<text stroke="none" x="-125" y="750" fill="orange" font-size="23.999986000000003"> -<title>AGILE_PN</title>210-00792-00</text> -<text stroke="none" x="-125" y="790" fill="orange" font-size="23.999986000000003"> -<title>MFGR</title>PANASONIC</text> -<text stroke="none" x="-210" y="-160" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>21</text> -<text stroke="none" x="210" y="240" fill="black" font-size="31.999997"> -<title>$PN</title>38</text> -<text stroke="none" x="-210" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>23</text> -<text stroke="none" x="210" y="290" fill="black" font-size="31.999997"> -<title>$PN</title>40</text> -<text stroke="none" x="-210" y="-60" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>25</text> -<text stroke="none" x="210" y="340" fill="black" font-size="31.999997"> -<title>$PN</title>42</text> -<text stroke="none" x="-210" y="-10" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>27</text> -<text stroke="none" x="210" y="390" fill="black" font-size="31.999997"> -<title>$PN</title>44</text> -<text stroke="none" x="-210" y="40" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>29</text> -<text stroke="none" x="210" y="440" fill="black" font-size="31.999997"> -<title>$PN</title>46</text> -<text stroke="none" x="-210" y="90" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>31</text> -<text stroke="none" x="210" y="490" fill="black" font-size="31.999997"> -<title>$PN</title>48</text> -<text stroke="none" x="-210" y="140" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>33</text> -<text stroke="none" x="210" y="540" fill="black" font-size="31.999997"> -<title>$PN</title>50</text> -<text stroke="none" x="-210" y="190" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>35</text> -<text stroke="none" x="-210" y="240" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>37</text> -<text stroke="none" x="-210" y="290" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>39</text> -<text stroke="none" x="-210" y="340" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>41</text> -<text stroke="none" x="-210" y="390" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>43</text> -<text stroke="none" x="-210" y="440" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>45</text> -<text stroke="none" x="-210" y="490" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>47</text> -<text stroke="none" x="-210" y="540" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>49</text> -<text stroke="none" x="-210" y="-210" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>19</text> -<text stroke="none" x="210" y="190" fill="black" font-size="31.999997"> -<title>$PN</title>36</text> -<text stroke="none" x="-210" y="-260" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>17</text> -<text stroke="none" x="210" y="140" fill="black" font-size="31.999997"> -<title>$PN</title>34</text> -<text stroke="none" x="-210" y="-310" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>15</text> -<text stroke="none" x="210" y="90" fill="black" font-size="31.999997"> -<title>$PN</title>32</text> -<text stroke="none" x="-210" y="-360" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="210" y="40" fill="black" font-size="31.999997"> -<title>$PN</title>30</text> -<text stroke="none" x="-210" y="-410" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>11</text> -<text stroke="none" x="210" y="-10" fill="black" font-size="31.999997"> -<title>$PN</title>28</text> -<text stroke="none" x="-210" y="-460" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>9</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="31.999997"> -<title>$PN</title>26</text> -<text stroke="none" x="-210" y="-510" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="210" y="-110" fill="black" font-size="31.999997"> -<title>$PN</title>24</text> -<text stroke="none" x="-210" y="-560" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="210" y="-160" fill="black" font-size="31.999997"> -<title>$PN</title>22</text> -<text stroke="none" x="-210" y="-610" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>3</text> -<text stroke="none" x="210" y="-210" fill="black" font-size="31.999997"> -<title>$PN</title>20</text> -<text stroke="none" x="-210" y="-660" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>1</text> -<text stroke="none" x="210" y="-260" fill="black" font-size="31.999997"> -<title>$PN</title>18</text> -<text stroke="none" x="210" y="-310" fill="black" font-size="31.999997"> -<title>$PN</title>16</text> -<text stroke="none" x="210" y="-360" fill="black" font-size="31.999997"> -<title>$PN</title>14</text> -<text stroke="none" x="210" y="-410" fill="black" font-size="31.999997"> -<title>$PN</title>12</text> -<text stroke="none" x="210" y="-460" fill="black" font-size="31.999997"> -<title>$PN</title>10</text> -<text stroke="none" x="210" y="-510" fill="black" font-size="31.999997"> -<title>$PN</title>8</text> -<text stroke="none" x="210" y="-560" fill="black" font-size="31.999997"> -<title>$PN</title>6</text> -<text stroke="none" x="210" y="-610" fill="black" font-size="31.999997"> -<title>$PN</title>4</text> -<text stroke="none" x="210" y="-660" fill="black" font-size="31.999997"> -<title>$PN</title>2</text> -</g> -<g id="R26.4" transform="translate(7050,-4450)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>1K</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R26</text> -</g> -<g id="I8" transform="translate(5300,-3200)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I9" transform="translate(6000,-3200)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R37.4" transform="translate(4800,-3950)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="150" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="-100" fill="orange" font-size="23.000014" text-anchor="end"> -<title>VALUE</title>0.0</text> -<text stroke="none" x="50" y="50" fill="black" font-size="23.000014" text-anchor="middle"> -<title>$LOCATION</title>R37</text> -</g> -<g id="R38.4" transform="translate(6350,-4250)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="150" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="-100" fill="orange" font-size="23.000014" text-anchor="end"> -<title>VALUE</title>0.0</text> -<text stroke="none" x="50" y="50" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R38</text> -</g> -<g id="J4.1" transform="translate(2200,-1500)"> -<use href="#symbol:con10.1" fill="green" stroke="green"></use> -<text stroke="none" y="393" fill="green" font-size="30.000006000000003"> -<title>MFGR_PN</title>FTSH-105-01-L-DV-P-TR</text> -<text stroke="none" y="300" fill="green" font-size="30.000006000000003"> -<title>PACK_TYPE</title>SM</text> -<text stroke="none" y="343" fill="green" font-size="30.000006000000003"> -<title>MFGR</title>SAMTEC INC</text> -<text stroke="none" y="243" fill="orange" font-size="30.000006000000003"> -<title>AGILE_PN</title>210-01266-00</text> -<text stroke="none" y="-250" fill="green" font-size="48.000019" text-anchor="middle"> -<title>$LOCATION</title>J4</text> -<text stroke="none" x="-110" y="-60" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>3</text> -<text stroke="none" x="-110" y="-10" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="-110" y="40" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="-110" y="90" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>9</text> -<text stroke="none" x="-110" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>1</text> -<text stroke="none" x="110" y="90" fill="black" font-size="31.999997"> -<title>$PN</title>10</text> -<text stroke="none" x="110" y="40" fill="black" font-size="31.999997"> -<title>$PN</title>8</text> -<text stroke="none" x="110" y="-10" fill="black" font-size="31.999997"> -<title>$PN</title>6</text> -<text stroke="none" x="110" y="-60" fill="black" font-size="31.999997"> -<title>$PN</title>4</text> -<text stroke="none" x="110" y="-110" fill="black" font-size="31.999997"> -<title>$PN</title>2</text> -</g> -<g id="I13" transform="translate(1950,-1200)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R47.4" transform="translate(1050,-1600)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="150" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="-50" fill="orange" font-size="23.000014" text-anchor="end"> -<title>VALUE</title>0.0</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R47</text> -</g> -<g id="R49.4" transform="translate(3450,-1400)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="-100" fill="orange" font-size="23.000014" text-anchor="end"> -<title>VALUE</title>0.0</text> -<text stroke="none" x="150" fill="orange" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R49</text> -</g> -<g id="U15.3" transform="translate(5700,-900)"> -<use href="#symbol:analog_switch.3" fill="green" stroke="green"></use> -<text stroke="none" x="-150" y="93" fill="orange" font-size="31.999997"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="-150" y="50" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>313-04276-00</text> -<text stroke="none" x="-150" y="136" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>TS3A5018RSVR</text> -<text stroke="none" x="-150" y="179" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>QUAD_QFN16</text> -<text stroke="none" y="-800" fill="black" font-size="31.999997" text-anchor="middle"> -<title>$LOCATION</title>U15</text> -<text stroke="none" x="-210" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="-210" y="-210" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-210" y="-360" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="210" y="-60" fill="black" font-size="31.999997"> -<title>$PN</title>6</text> -<text stroke="none" x="-210" y="-510" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="210" y="-160" fill="black" font-size="31.999997"> -<title>$PN</title>11</text> -<text stroke="none" x="210" y="-210" fill="black" font-size="31.999997"> -<title>$PN</title>12</text> -<text stroke="none" x="-210" y="-660" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="210" y="-310" fill="black" font-size="31.999997"> -<title>$PN</title>8</text> -<text stroke="none" x="-210" y="-760" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>15</text> -<text stroke="none" x="210" y="-360" fill="black" font-size="31.999997"> -<title>$PN</title>9</text> -<text stroke="none" x="210" y="-460" fill="black" font-size="31.999997"> -<title>$PN</title>4</text> -<text stroke="none" x="210" y="-510" fill="black" font-size="31.999997"> -<title>$PN</title>3</text> -<text stroke="none" x="210" y="-610" fill="black" font-size="31.999997"> -<title>$PN</title>1</text> -<text stroke="none" x="210" y="-660" fill="black" font-size="31.999997"> -<title>$PN</title>16</text> -<text stroke="none" x="210" y="-760" fill="black" font-size="31.999997"> -<title>$PN</title>14</text> -</g> -<g id="C20.1" transform="translate(7100,-1500)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C20</text> -</g> -<g id="I18" transform="translate(7050,-1400)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I19" transform="translate(6300,-700)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I20" transform="translate(5250,-700)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I22" transform="translate(6200,-1950)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R52.4" transform="translate(6400,-2350)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R52</text> -</g> -<g id="SW2.1" transform="translate(5750,-2250)"> -<use href="#symbol:spdt.1" fill="green" stroke="green"></use> -<text stroke="none" x="-100" y="279" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>SLIDE_3P</text> -<text stroke="none" x="-100" y="150" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>510-00282-00</text> -<text stroke="none" x="-100" y="193" fill="orange" font-size="31.999997"> -<title>MFGR</title>C & K COMPONENTS</text> -<text stroke="none" x="-100" y="236" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>JS102011SAQN</text> -<text stroke="none" y="-150" fill="black" font-size="31.999997" text-anchor="middle"> -<title>LOCATION</title>SW2</text> -<text stroke="none" x="-107" y="-5" fill="black" font-size="23.000014" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="107" y="95" fill="black" font-size="23.000014"> -<title>$PN</title>3</text> -<text stroke="none" x="107" y="-105" fill="black" font-size="23.000014"> -<title>$PN</title>1</text> -</g> -<g id="J2.2" transform="translate(2650,-3600)"> -<use href="#symbol:ffc_20pin.2" fill="green" stroke="green"></use> -<text stroke="none" y="-1100" fill="orange" font-size="48.000019"> -<title>VARIANT</title>DEFAULT</text> -<text stroke="none" x="-100" y="93" fill="orange" font-size="31.999997"> -<title>MFGR</title>MOLEX</text> -<text stroke="none" x="-100" y="179" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>2M</text> -<text stroke="none" x="-100" y="136" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>5051102091</text> -<text stroke="none" x="-100" y="50" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>210-04266-00</text> -<text stroke="none" y="-1050" fill="black" font-size="31.999997" text-anchor="middle"> -<title>LOCATION</title>J2</text> -<text stroke="none" x="-160" y="-110" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>19</text> -<text stroke="none" x="-160" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>20</text> -<text stroke="none" x="-160" y="-160" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>18</text> -<text stroke="none" x="-160" y="-210" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>17</text> -<text stroke="none" x="-160" y="-260" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>16</text> -<text stroke="none" x="-160" y="-310" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>15</text> -<text stroke="none" x="-160" y="-360" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>14</text> -<text stroke="none" x="160" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>M2</text> -<text stroke="none" x="-160" y="-410" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>13</text> -<text stroke="none" x="160" y="-110" fill="black" font-size="38.000017"> -<title>$PN</title>M1</text> -<text stroke="none" x="-160" y="-460" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>12</text> -<text stroke="none" x="-160" y="-510" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>11</text> -<text stroke="none" x="-160" y="-560" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-160" y="-610" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>9</text> -<text stroke="none" x="-160" y="-660" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>8</text> -<text stroke="none" x="-160" y="-710" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="-160" y="-760" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>6</text> -<text stroke="none" x="-160" y="-810" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>5</text> -<text stroke="none" x="-160" y="-860" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="-160" y="-910" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>3</text> -<text stroke="none" x="-160" y="-960" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="-160" y="-1010" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>1</text> -</g> -<g id="I33" transform="translate(2150,-3500)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I34" transform="translate(3000,-3500)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<text stroke="none" x="1300" y="-2050" fill="purple" font-size="94.0">CORESIGHT10 CONNECTOR</text> -<text stroke="none" x="1800" y="-1700" fill="purple" font-size="38.000017">VREF</text> -<text stroke="none" x="1450" y="-3100" fill="purple" font-size="38.000017">DO NOT EXPOSE UART SIGNALS DIRECTLY (SECURITY RISK)</text> -<text stroke="none" x="1450" y="-3150" fill="purple" font-size="38.000017">PRODUCTION DEVICES SHOULD HAVE UART ROUTED THROUGH H1</text> -<text stroke="none" x="1450" y="-3250" fill="purple" font-size="38.000017">MCU_BOOT0 GATED BY EC_FLASH_ODL ON PLATFORM</text> -<text stroke="none" x="1250" y="-5050" fill="purple" font-size="94.0">PLATFORM MLB CONNECTOR</text> -<text stroke="none" x="4250" y="-2700" fill="purple" font-size="38.000017">** PLEASE ADD SILKSCREEN TO INDICATE SWITCH OPTIONS ** </text> -<text stroke="none" x="4250" y="-2850" fill="purple" font-size="38.000017">MECHANICAL SWITCH DETERMINE WHICH HOST COMMUNICATES WITH MCU VIA SWD/JTAG FOR DEBUGGING </text> -<text stroke="none" x="4800" y="-2550" fill="purple" font-size="38.000017">GND SIDE: SERVO</text> -<text stroke="none" x="4800" y="-2600" fill="purple" font-size="38.000017">PP3300 SIDE: CORESIGHT </text> -<text stroke="none" x="4550" y="-4950" fill="purple" font-size="38.000017">**PIN1 TO FACE BOARD EDGE SO THAT SERVO CABLE EXITS BOARD IMMEDIATELY** </text> -<text stroke="none" x="5000" y="-5050" fill="purple" font-size="94.0">SERVO CONNECTOR</text> -<g transform="translate(3200,-1550)"> -<line x2="-900" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTCK_SWCLK</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1350)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTCK_SWCLK</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(3200,-1450)"> -<line x2="-900" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTDI</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1050)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTDI</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(3200,-1500)"> -<line x2="-900" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTDO_SWO</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1200)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTDO_SWO</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(3200,-1600)"> -<line x2="-900" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTMS_SWDIO</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1500)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_JTMS_SWDIO</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(3400,-1400)"> -<line x2="-1100" stroke="goldenrod"></line> -<text stroke="none" x="-910" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>CORESIGHT_MCU_RST_ODL</text> -</g> -<g transform="translate(4650,-1400)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_MCU_JTCK_SWCLK</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4650,-1100)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_MCU_JTDI</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4650,-1250)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_MCU_JTDO_SWO</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4650,-1550)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_MCU_JTMS_SWDIO</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4000)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_MCU_JTRST</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4650,-1700)"> -<line x2="550" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_SEL</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5200,-1650)"> -<line x2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(4650,-2250)"> -<line x2="950" stroke="goldenrod"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>DEBUG_SEL</text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5200,-1700)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-1400)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-1500)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-1500)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(2100,-1400)"> -<line x2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(2000,-1550)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2100,-1550)"> -<line x2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(2200,-3650)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(2200,-3650)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(2500,-3650)"> -<line x2="-300" stroke="goldenrod"></line> -</g> -<g transform="translate(2500,-3700)"> -<line x2="-300" stroke="goldenrod"></line> -</g> -<g transform="translate(5300,-1000)"> -<line y2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-3650)"> -<line x2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-3700)"> -<line x2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(5500,-1000)"> -<line x2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(3050,-3650)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(3050,-3700)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-950)"> -<line x2="450" stroke="goldenrod"></line> -</g> -<g transform="translate(6350,-950)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-2150)"> -<line x2="350" stroke="goldenrod"></line> -</g> -<g transform="translate(6250,-2150)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-3250)"> -<line y2="-650" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-3900)"> -<line y2="-400" stroke="goldenrod"></line> -</g> -<g transform="translate(5500,-3900)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-3650)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-4300)"> -<line y2="-350" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-3800)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(6050,-3650)"> -<line y2="400" stroke="goldenrod"></line> -</g> -<g transform="translate(5500,-4300)"> -<line x2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(6050,-3800)"> -<line y2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(5350,-4650)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-4200)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(6050,-4200)"> -<line y2="400" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-4500)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(6050,-4500)"> -<line y2="300" stroke="goldenrod"></line> -</g> -<g transform="translate(2500,-4450)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_MCU_SPI_CS_ODL</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7150,-4450)"> -<line x2="800" stroke="goldenrod"></line> -<text stroke="none" x="140" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>HOST_MCU_SPI_CS_ODL</text> -<text stroke="none" x="890" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="830" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2500,-4100)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_PLATFORM_INT_L</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4150,-1400)"> -<line x2="-600" stroke="goldenrod"></line> -<text stroke="none" x="-360" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_RST_ODL</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2500,-4200)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_RST_ODL</text> -<text stroke="none" x="-1374" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6900,-4350)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_RST_ODL</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2500,-3800)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_USER_PRES_FP_L</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2500,-4150)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_BOOT0</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4050)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_BOOT1</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-3850)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SLP_S0_L</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-3900)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SLP_S3_L</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4600)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SPI_CLK</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4550)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SPI_MISO</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4500)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_SPI_MOSI</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-3750)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PLATFORM_MCU_WP_OD</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4300)"> -<line x2="-1250" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP1800_PLATFORM</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(6900,-4550)"> -<line x2="-1000" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_SERVO</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(550,-1600)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-214" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-154" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-94" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-34" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5900,-1650)"> -<line x2="1200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7100,-1650)"> -<line y2="100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6500,-2350)"> -<line x2="850" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="540" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="1060" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="1000" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="940" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="880" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7500,-1650)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-260" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="210" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="150" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2100,-1600)"> -<line x2="-950" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300_CORESIGHT</text> -</g> -<g transform="translate(2100,-4250)"> -<line y2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2100,-4350)"> -<line x2="-850" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-760" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300_PLATFORM</text> -<text stroke="none" x="-914" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4250)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2500,-4350)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(3700,-4350)"> -<line x2="650" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_SERVO</text> -<text stroke="none" x="-124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(4350,-3950)"> -<line x2="400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4350,-4350)"> -<line y2="400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(5500,-4350)"> -<line x2="-1150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6450,-4250)"> -<line x2="1500" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="990" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_SERVO</text> -<text stroke="none" x="1590" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1530" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(6900,-3750)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_INA_I2C_SCL</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3750)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_INA_I2C_SDA</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-3600)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_BOOT0</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(6900,-3600)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_BOOT1</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5900,-1400)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTCK_SWCLK</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4150)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTCK_SWCLK</text> -<text stroke="none" x="-1124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>2 </text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1100)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTDI</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6900,-4100)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTDI</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>2 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1250)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTDO_SWO</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4050)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTDO_SWO</text> -<text stroke="none" x="-1124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>2 </text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5900,-1550)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTMS_SWDIO</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>4 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5500,-4100)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_JTMS_SWDIO</text> -<text stroke="none" x="-1124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>2 </text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>4 </text> -</g> -<g transform="translate(5500,-3700)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SLP_S0_L</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5500,-3650)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SLP_S3_L</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5500,-4450)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_CLK</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5900,-4450)"> -<line x2="1100" stroke="goldenrod"></line> -<text stroke="none" x="290" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_CS_ODL</text> -</g> -<g transform="translate(6900,-4400)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_MISO</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5500,-4400)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_SPI_MOSI</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(6900,-3700)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>SERVO_MCU_WP_OD</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-3950)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_MCU_TX_PLATFORM_RX</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5500,-4250)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_MCU_TX_SERVO_RX</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(2500,-4000)"> -<line x2="-1250" stroke="goldenrod"></line> -<text stroke="none" x="-1160" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_PLATFORM_TX_MCU_RX</text> -<text stroke="none" x="-1314" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(6900,-4300)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART1_SERVO_TX_MCU_RX</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>3 </text> -</g> -<g transform="translate(5500,-3850)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-960" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART2_MCU_TX_SERVO_RX</text> -<text stroke="none" x="-1064" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6900,-3900)"> -<line x2="-1000" stroke="goldenrod"></line> -<text stroke="none" x="-710" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>UART2_SERVO_TX_MCU_RX</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5900,-4250)"> -<line x2="400" stroke="goldenrod"></line> -</g> -<g transform="translate(4900,-3950)"> -<line x2="600" stroke="goldenrod"></line> -</g> -<g transform="translate(5900,-2350)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -</g> -<circle cx="2000" cy="-1400" r="10" stroke="black" fill="black"></circle> -<circle cx="2000" cy="-1500" r="10" stroke="black" fill="black"></circle> -<circle cx="2200" cy="-3650" r="10" stroke="black" fill="black"></circle> -<circle cx="3050" cy="-3650" r="10" stroke="black" fill="black"></circle> -<circle cx="5350" cy="-3900" r="10" stroke="black" fill="black"></circle> -<circle cx="5350" cy="-4300" r="10" stroke="black" fill="black"></circle> -<circle cx="6050" cy="-3650" r="10" stroke="black" fill="black"></circle> -<circle cx="6050" cy="-3800" r="10" stroke="black" fill="black"></circle> -<circle cx="6050" cy="-4200" r="10" stroke="black" fill="black"></circle> -<circle cx="7100" cy="-1650" r="10" stroke="black" fill="black"></circle> -<circle cx="2100" cy="-4350" r="10" stroke="black" fill="black"></circle> -<circle cx="4350" cy="-4350" r="10" stroke="black" fill="black"></circle> -</svg> - -</div> -</div> -<hr> -<div id="page5"> -<h1>dragonclaw/page5: SENSOR CONNECTORS</h1> -<div> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,-5500,8500,5500" width="14.87500in" height="9.62500in" font-family="monospace" font-size="47.000000" stroke-width="3" style="background-color:white"> -<use href="#symbol:border_b.3" fill="green" stroke="green"></use> -<text stroke="none" x="6570" y="-95" fill="green" font-size="26.999996"> -<title>CUSTOM_TXT_CDS</title>Fri Jan 17 12:53:13 2020</text> -<text stroke="none" x="6500" y="-170" fill="green" font-size="33.999988"> -<title>CUSTOM_TXT_CDS</title>dragonclaw</text> -<text stroke="none" x="7500" y="-175" fill="green" font-size="30.000006000000003"> -<title>CUSTOM_TXT_CDS</title>650-03910-01-SCH</text> -<text stroke="none" x="8265" y="-175" fill="green" font-size="33.999988" text-anchor="middle"> -<title>CUSTOM_TXT_CDS</title>0.2</text> -<text stroke="none" x="8427" y="-84" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>5 OF 5</text> -<text stroke="none" x="8427" y="-119" fill="green" font-size="26.999996" text-anchor="end"> -<title>CUSTOM_TXT_CDS</title>5 OF 5</text> -<text stroke="none" x="7212" y="-260" fill="orange" font-size="67.999976" text-anchor="middle"> -<title>PAGE_TITLE</title>SENSOR CONNECTORS</text> -<g id="R25.1" transform="translate(4700,-4150)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="150" y="-50" fill="orange" font-size="30.000006000000003"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="30" y="-60" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R25</text> -</g> -<g id="I13" transform="translate(3350,-3750)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I14" transform="translate(2750,-3750)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I15" transform="translate(1600,-3750)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C13.1" transform="translate(1650,-3850)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C13</text> -</g> -<g id="I17" transform="translate(1350,-3750)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C12.1" transform="translate(1400,-3850)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>1UF</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C12</text> -</g> -<g id="U9.1" transform="translate(6750,-2450)"> -<use href="#symbol:74aup1t97.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="400" fill="green" font-size="28.999987"> -<title>AGILE_PN</title>313-00608-00</text> -<text stroke="none" x="50" y="350" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>CSP</text> -<text stroke="none" x="50" y="250" fill="green" font-size="28.999987"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="50" y="300" fill="green" font-size="28.999987"> -<title>MFGR_PN</title>SN74AUP1T97YZPR</text> -<text stroke="none" x="50" y="-275" fill="green" font-size="28.999987"> -<title>PATH</title>I21</text> -<text stroke="none" x="50" y="-225" fill="green" font-size="28.999987"> -<title>$LOCATION</title>U9</text> -<text stroke="none" x="-260" y="-110" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>C1</text> -<text stroke="none" x="-260" y="-10" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>A1</text> -<g transform="translate(-10,260)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>B1</text> -</g></g> -<text stroke="none" x="-260" y="90" fill="black" font-size="31.999997" text-anchor="end"> -<title>$PN</title>A2</text> -<g transform="translate(-10,-260)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="31.999997"> -<title>$PN</title>B2</text> -</g></g> -<text stroke="none" x="260" y="-10" fill="black" font-size="31.999997"> -<title>$PN</title>C2</text> -</g> -<g id="U10.3" transform="translate(2000,-2500)"> -<use href="#symbol:74aup1t97.3" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="-275" fill="green" font-size="28.999987"> -<title>PATH</title>I22</text> -<text stroke="none" x="50" y="400" fill="green" font-size="28.999987"> -<title>AGILE_PN</title>313-00608-00</text> -<text stroke="none" x="50" y="300" fill="green" font-size="28.999987"> -<title>MFGR_PN</title>SN74AUP1T97YZPR</text> -<text stroke="none" x="50" y="350" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>CSP</text> -<text stroke="none" x="50" y="250" fill="green" font-size="28.999987"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="50" y="-225" fill="green" font-size="28.999987"> -<title>$LOCATION</title>U10</text> -<text stroke="none" x="-260" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>C1</text> -<g transform="translate(-10,260)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>B1</text> -</g></g> -<text stroke="none" x="-260" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>A2</text> -<g transform="translate(-110,-260)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017"> -<title>$PN</title>A1</text> -</g></g> -<g transform="translate(-10,-260)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017"> -<title>$PN</title>B2</text> -</g></g> -<text stroke="none" x="260" y="-10" fill="black" font-size="38.000017"> -<title>$PN</title>C2</text> -</g> -<g id="C15.1" transform="translate(6100,-2700)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C15</text> -</g> -<g id="I24" transform="translate(6050,-2600)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I25" transform="translate(6700,-2000)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C14.1" transform="translate(1450,-2800)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C14</text> -</g> -<g id="I27" transform="translate(1400,-2700)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I28" transform="translate(1950,-2050)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="U12.1" transform="translate(3900,-1250)"> -<use href="#symbol:ts5a23159.1" fill="green" stroke="green"></use> -<text stroke="none" x="-300" y="614" fill="green" font-size="57.000002"> -<title>MFGR_PN</title>TS5A23159DGSR</text> -<text stroke="none" x="-300" y="671" fill="green" font-size="57.000002"> -<title>PACK_TYPE</title>VSSOP10</text> -<text stroke="none" x="-300" y="500" fill="green" font-size="57.000002"> -<title>AGILE_PN</title>232-00045-00</text> -<text stroke="none" x="-300" y="557" fill="green" font-size="57.000002"> -<title>MFGR</title>TEXAS INSTRUMENTS INC</text> -<text stroke="none" x="350" y="-400" fill="green" font-size="57.000002" text-anchor="end"> -<title>$LOCATION</title>U12</text> -<text stroke="none" x="-360" y="-260" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>9</text> -<text stroke="none" x="-360" y="-160" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<g transform="translate(-60,360)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>3</text> -</g></g> -<text stroke="none" x="-360" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>7</text> -<text stroke="none" x="-360" y="140" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="360" y="140" fill="black" font-size="38.000017"> -<title>$PN</title>5</text> -<text stroke="none" x="360" y="40" fill="black" font-size="38.000017"> -<title>$PN</title>6</text> -<g transform="translate(-60,-460)"> -<g transform="rotate(-90)"> -<text stroke="none" fill="black" font-size="38.000017"> -<title>$PN</title>8</text> -</g></g> -<text stroke="none" x="360" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -<text stroke="none" x="360" y="-260" fill="black" font-size="38.000017"> -<title>$PN</title>10</text> -</g> -<g id="I32" transform="translate(3800,-800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C18.1" transform="translate(4500,-1700)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" y="91" fill="orange" font-size="28.999987"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="60" fill="green" font-size="28.999987"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="29" fill="green" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" fill="green" font-size="28.999987"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="28.999987"> -<title>$LOCATION</title>C18</text> -</g> -<g id="I34" transform="translate(4450,-1600)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R24.4" transform="translate(4550,-4950)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.5</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R24</text> -</g> -<g id="R42.4" transform="translate(4550,-4800)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.5</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R42</text> -</g> -<g id="R19.4" transform="translate(1050,-4200)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.5</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R19</text> -</g> -<g id="R23.4" transform="translate(1050,-4100)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.5</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R23</text> -</g> -<g id="J5.1" transform="translate(5750,-3600)"> -<use href="#symbol:ffc_13pin.1" fill="green" stroke="green"></use> -<text stroke="none" y="136" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>FH35C-13S-0.3SHW(50)</text> -<text stroke="none" y="179" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>ZIF</text> -<text stroke="none" x="100" y="-750" fill="orange" font-size="48.000019"> -<title>VARIANT</title>DEFAULT</text> -<text stroke="none" y="93" fill="orange" font-size="31.999997"> -<title>MFGR</title>HIROSE ELECTRIC CO LTD</text> -<text stroke="none" y="50" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>210-02827-00</text> -<text stroke="none" x="100" y="-700" fill="black" font-size="31.999997" text-anchor="middle"> -<title>LOCATION</title>J5</text> -<text stroke="none" x="-60" y="-310" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>M1</text> -<text stroke="none" x="-60" y="-360" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>M2</text> -<text stroke="none" x="260" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>13</text> -<text stroke="none" x="260" y="-110" fill="black" font-size="38.000017"> -<title>$PN</title>12</text> -<text stroke="none" x="260" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>11</text> -<text stroke="none" x="260" y="-210" fill="black" font-size="38.000017"> -<title>$PN</title>10</text> -<text stroke="none" x="260" y="-260" fill="black" font-size="38.000017"> -<title>$PN</title>9</text> -<text stroke="none" x="260" y="-310" fill="black" font-size="38.000017"> -<title>$PN</title>8</text> -<text stroke="none" x="260" y="-360" fill="black" font-size="38.000017"> -<title>$PN</title>7</text> -<text stroke="none" x="260" y="-410" fill="black" font-size="38.000017"> -<title>$PN</title>6</text> -<text stroke="none" x="260" y="-460" fill="black" font-size="38.000017"> -<title>$PN</title>5</text> -<text stroke="none" x="260" y="-510" fill="black" font-size="38.000017"> -<title>$PN</title>4</text> -<text stroke="none" x="260" y="-560" fill="black" font-size="38.000017"> -<title>$PN</title>3</text> -<text stroke="none" x="260" y="-610" fill="black" font-size="38.000017"> -<title>$PN</title>2</text> -<text stroke="none" x="260" y="-660" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -</g> -<g id="R43.4" transform="translate(7400,-4300)"> -<use href="#symbol:res.4" fill="green" stroke="green"></use> -<text stroke="none" x="20" y="-25" fill="orange" font-size="28.999987" text-anchor="end"> -<title>VALUE</title>0.5</text> -<text stroke="none" x="30" y="-25" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0402</text> -<text stroke="none" x="25" y="-55" fill="black" font-size="28.999987" text-anchor="middle"> -<title>$LOCATION</title>R43</text> -</g> -<g id="C17.1" transform="translate(7100,-4200)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="23.000014"> -<title>VALUE</title>1UF</text> -<text stroke="none" x="50" y="60" fill="green" font-size="23.000014"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="23.000014"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="29" fill="green" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="23.000014"> -<title>$LOCATION</title>C17</text> -</g> -<g id="I46" transform="translate(7050,-4100)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="C16.1" transform="translate(6900,-4200)"> -<use href="#symbol:cap.1" fill="green" stroke="green"></use> -<text stroke="none" x="50" fill="green" font-size="23.000014"> -<title>VALUE</title>0.1UF</text> -<text stroke="none" x="50" y="29" fill="green" font-size="23.000014"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="50" y="60" fill="green" font-size="23.000014"> -<title>VOLT</title>10V</text> -<text stroke="none" x="50" y="91" fill="orange" font-size="23.000014"> -<title>DIELECTRIC</title>X5R</text> -<text stroke="none" x="50" y="-30" fill="green" font-size="23.000014"> -<title>$LOCATION</title>C16</text> -</g> -<g id="I48" transform="translate(6850,-4100)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="R20.1" transform="translate(7350,-4050)"> -<use href="#symbol:res.1" fill="green" stroke="green"></use> -<text stroke="none" x="30" y="-30" fill="orange" font-size="28.999987"> -<title>VALUE</title>100K</text> -<text stroke="none" x="30" fill="orange" font-size="28.999987"> -<title>TOLERANCE</title>1%</text> -<text stroke="none" x="30" y="30" fill="orange" font-size="28.999987"> -<title>PACK_TYPE</title>0201</text> -<text stroke="none" x="150" y="-50" fill="orange" font-size="38.000017"> -<title>BOM_IGNORE</title>DNS</text> -<text stroke="none" x="30" y="-65" fill="black" font-size="28.999987"> -<title>$LOCATION</title>R20</text> -</g> -<g id="I50" transform="translate(5550,-3800)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="I51" transform="translate(6150,-3550)"> -<use href="#symbol:gnd.1" fill="green" stroke="green"></use> -</g> -<g id="J3.2" transform="translate(3100,-4200)"> -<g transform="rotate(-180)"> -<use href="#symbol:b2b_16pin.2:s" fill="green" stroke="green"></use> -</g> -<text stroke="none" x="-200" y="600" fill="orange" font-size="31.999997"> -<title>AGILE_PN</title>210-01668-00</text> -<text stroke="none" x="-200" y="550" fill="orange" font-size="31.999997"> -<title>MFGR</title>HIROSE ELECTRIC CO LTD</text> -<text stroke="none" x="-200" y="450" fill="orange" font-size="31.999997"> -<title>PACK_TYPE</title>HIROSE_BM10</text> -<text stroke="none" x="-200" y="500" fill="orange" font-size="31.999997"> -<title>MFGR_PN</title>BM10NB(0.8)-16DS-0.4V(51)</text> -<text stroke="none" y="-300" fill="black" font-size="31.999997" text-anchor="middle"> -<title>LOCATION</title>J3</text> -<text stroke="none" x="-210" y="-160" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>M2</text> -<text stroke="none" x="160" y="190" fill="black" font-size="38.000017"> -<title>$PN</title>3</text> -<text stroke="none" x="-210" y="-110" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>16</text> -<text stroke="none" x="160" y="240" fill="black" font-size="38.000017"> -<title>$PN</title>1</text> -<text stroke="none" x="-210" y="-60" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>14</text> -<text stroke="none" x="-210" y="-10" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>12</text> -<text stroke="none" x="-210" y="40" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>10</text> -<text stroke="none" x="-210" y="90" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>8</text> -<text stroke="none" x="-210" y="140" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>6</text> -<text stroke="none" x="-210" y="190" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>4</text> -<text stroke="none" x="-210" y="240" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>2</text> -<text stroke="none" x="-210" y="-210" fill="black" font-size="38.000017" text-anchor="end"> -<title>$PN</title>M4</text> -<text stroke="none" x="160" y="140" fill="black" font-size="38.000017"> -<title>$PN</title>5</text> -<text stroke="none" x="160" y="90" fill="black" font-size="38.000017"> -<title>$PN</title>7</text> -<text stroke="none" x="160" y="40" fill="black" font-size="38.000017"> -<title>$PN</title>9</text> -<text stroke="none" x="160" y="-10" fill="black" font-size="38.000017"> -<title>$PN</title>11</text> -<text stroke="none" x="160" y="-60" fill="black" font-size="38.000017"> -<title>$PN</title>13</text> -<text stroke="none" x="160" y="-110" fill="black" font-size="38.000017"> -<title>$PN</title>15</text> -<text stroke="none" x="160" y="-160" fill="black" font-size="38.000017"> -<title>$PN</title>M1</text> -<text stroke="none" x="160" y="-210" fill="black" font-size="38.000017"> -<title>$PN</title>M3</text> -</g> -<text stroke="none" x="900" y="-3050" fill="purple" font-size="60.000012000000005">FP_SENSOR_SEL : H</text> -<text stroke="none" x="900" y="-3150" fill="purple" font-size="60.000012000000005">MCU_FP_SPI_CS_L: L</text> -<text stroke="none" x="900" y="-3250" fill="purple" font-size="60.000012000000005">FPC SENSOR SELECTED WHEN:</text> -<text stroke="none" x="900" y="-4600" fill="purple" font-size="60.000012000000005">*PLACE PIN2 TOWARDS THE EDGE SO CABLE EXITS BOARD* </text> -<text stroke="none" x="900" y="-4700" fill="purple" font-size="60.000012000000005">**ADD SILKSCREEN LABELLED "FPC"**</text> -<text stroke="none" x="900" y="-4800" fill="purple" font-size="75.000015">FPC FP SENSOR CONNECTOR</text> -<text stroke="none" x="5650" y="-2950" fill="purple" font-size="60.000012000000005">FP_SENSOR_SEL : L</text> -<text stroke="none" x="5650" y="-3050" fill="purple" font-size="60.000012000000005">MCU_FP_SPI_CS_L: L</text> -<text stroke="none" x="5650" y="-3150" fill="purple" font-size="60.000012000000005">ELAN SENSOR SELECTED WHEN:</text> -<text stroke="none" x="5650" y="-4550" fill="purple" font-size="60.000012000000005">**ADD SILKSCREEN LABELLED "ELAN"**</text> -<text stroke="none" x="5650" y="-4650" fill="purple" font-size="75.000015">ELAN FP SENSOR CONNECTOR</text> -<g transform="translate(3550,-1500)"> -<line x2="-500" stroke="goldenrod"></line> -<text stroke="none" x="-460" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>ELAN_MCU_INT_L</text> -<text stroke="none" x="-564" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(6000,-4050)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="440" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>ELAN_MCU_INT_L</text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(3550,-1400)"> -<line x2="-500" stroke="goldenrod"></line> -<text stroke="none" x="-460" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>FPC_MCU_INT_L</text> -<text stroke="none" x="-564" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(4200,-4150)"> -<line x2="-950" stroke="goldenrod"></line> -<text stroke="none" x="-560" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>FPC_MCU_INT_L</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(4850,-1500)"> -<line x2="-600" stroke="goldenrod"></line> -<text stroke="none" x="-360" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>FP_MCU_INT_L</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1750,-2450)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>FP_SENSOR_SEL</text> -<text stroke="none" x="-974" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-914" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4250,-1400)"> -<line x2="850" stroke="goldenrod"></line> -<text stroke="none" x="240" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>FP_SENSOR_SEL</text> -<text stroke="none" x="940" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="880" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6500,-2350)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>FP_SENSOR_SEL</text> -<text stroke="none" x="-974" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-914" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2000,-2100)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(3850,-850)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-3800)"> -<line y2="-200" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-4000)"> -<line y2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-4100)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(2900,-4000)"> -<line x2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(2900,-4100)"> -<line x2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-4250)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-4350)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(2800,-4400)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(2900,-4350)"> -<line x2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(3250,-4000)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(2900,-4400)"> -<line x2="-100" stroke="goldenrod"></line> -</g> -<g transform="translate(3400,-4000)"> -<line y2="200" stroke="goldenrod"></line> -</g> -<g transform="translate(3250,-4250)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(3250,-4350)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(3250,-4400)"> -<line x2="150" stroke="goldenrod"></line> -</g> -<g transform="translate(3400,-4250)"> -<line y2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(3400,-4350)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(3400,-4400)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6750,-2050)"> -<line y2="-150" stroke="goldenrod"></line> -</g> -<g transform="translate(5600,-3850)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(5600,-3900)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(5600,-3900)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(5600,-3950)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-3650)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-3700)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-3750)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6100,-3650)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6100,-3700)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6100,-3750)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6200,-3650)"> -<line y2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-4150)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-4250)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6100,-4150)"> -<line y2="400" stroke="goldenrod"></line> -</g> -<g transform="translate(6100,-4250)"> -<line y2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(6000,-3950)"> -<line x2="1350" stroke="goldenrod"></line> -<text stroke="none" x="440" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_ELAN_SPI_CS_L</text> -<text stroke="none" x="406" y="-10" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(7850,-2450)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-560" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_ELAN_SPI_CS_L</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(7350,-3950)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(3100,-2500)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-560" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FPC_SPI_CS_L</text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(3250,-4050)"> -<line x2="1450" stroke="goldenrod"></line> -<text stroke="none" x="390" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FPC_SPI_CS_L</text> -<text stroke="none" x="1530" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>5 </text> -</g> -<g transform="translate(4700,-4050)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(4700,-4050)"> -<line x2="50" stroke="goldenrod"></line> -</g> -<g transform="translate(3250,-4100)"> -<line x2="1200" stroke="goldenrod"></line> -<text stroke="none" x="390" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_RST_L</text> -<text stroke="none" x="1290" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1230" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-4000)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="440" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_RST_L</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4200,-3950)"> -<line x2="-950" stroke="goldenrod"></line> -<text stroke="none" x="-560" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_CLK</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-3900)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="440" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_CLK</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1750,-2550)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_CS_L</text> -<text stroke="none" x="-974" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-914" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6500,-2450)"> -<line x2="-850" stroke="goldenrod"></line> -<text stroke="none" x="-810" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_CS_L</text> -<text stroke="none" x="-974" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-914" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2900,-4050)"> -<line x2="-950" stroke="goldenrod"></line> -<text stroke="none" x="-910" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_MISO</text> -<text stroke="none" x="-1044" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-984" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-3800)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="440" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_MISO</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(2900,-3950)"> -<line x2="-950" stroke="goldenrod"></line> -<text stroke="none" x="-910" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_MOSI</text> -<text stroke="none" x="-1044" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-984" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-3850)"> -<line x2="1000" stroke="goldenrod"></line> -<text stroke="none" x="440" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>MCU_FP_SPI_MOSI</text> -<text stroke="none" x="1090" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="1030" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(4500,-4800)"> -<line x2="-700" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800</text> -<text stroke="none" x="-794" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-734" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1000,-4200)"> -<line x2="-500" stroke="goldenrod"></line> -<text stroke="none" x="-460" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_FP</text> -<text stroke="none" x="-624" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-564" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5350,-4800)"> -<line x2="-700" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_FP</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1400,-3900)"> -<line y2="-300" stroke="goldenrod"></line> -</g> -<g transform="translate(1150,-4200)"> -<line x2="250" stroke="goldenrod"></line> -</g> -<g transform="translate(2900,-4200)"> -<line x2="-1500" stroke="goldenrod"></line> -<text stroke="none" x="-896" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP1800_FPC</text> -</g> -<g transform="translate(900,-2900)"> -<line x2="550" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="40" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-244" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-184" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-124" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-64" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1450,-2850)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1450,-2900)"> -<line x2="450" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1900,-2750)"> -<line y2="-150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2000,-2750)"> -<line y2="-150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2000,-2900)"> -<line x2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(3850,-1700)"> -<line y2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(3850,-1800)"> -<line x2="650" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4500,-1750)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4500,-1800)"> -<line x2="950" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="690" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="1160" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="1100" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="1040" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="980" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6100,-2750)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6100,-2800)"> -<line x2="-450" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-694" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-634" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-574" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-514" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6350,-2550)"> -<line y2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4700,-4250)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4700,-4300)"> -<line x2="350" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="560" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="500" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="440" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="380" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6500,-2550)"> -<line x2="-150" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6350,-2800)"> -<line x2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(4500,-4950)"> -<line x2="-700" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-660" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="-914" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="-854" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="-794" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="-734" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6750,-2700)"> -<line y2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6750,-2800)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7350,-4150)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7350,-4200)"> -<line x2="550" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="340" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300</text> -<text stroke="none" x="760" fill="black" font-size="30.000006000000003"> -<title>$XR3</title>5 </text> -<text stroke="none" x="700" fill="black" font-size="30.000006000000003"> -<title>$XR2</title>4 </text> -<text stroke="none" x="640" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>3 </text> -<text stroke="none" x="580" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(6000,-4100)"> -<line x2="350" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6000,-4200)"> -<line x2="350" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6350,-4100)"> -<line y2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6350,-4200)"> -<line y2="-100" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6350,-4300)"> -<line x2="550" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="90" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300_ELAN</text> -</g> -<g transform="translate(6900,-4250)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(6900,-4300)"> -<line x2="200" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7100,-4250)"> -<line y2="-50" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(7350,-4300)"> -<line x2="-250" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(1000,-4100)"> -<line x2="-500" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-460" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_FP</text> -<text stroke="none" x="-624" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="-564" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(5350,-4950)"> -<line x2="-700" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-410" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_FP</text> -<text stroke="none" x="90" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="30" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(7500,-4300)"> -<line x2="400" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="140" y="-10" fill="orange" font-size="30.000006000000003"> -<title>SIG_NAME</title>PP3300_FP</text> -<text stroke="none" x="490" fill="black" font-size="30.000006000000003"> -<title>$XR1</title>5 </text> -<text stroke="none" x="430" fill="black" font-size="30.000006000000003"> -<title>$XR0</title>2 </text> -</g> -<g transform="translate(1150,-4100)"> -<line x2="100" stroke="goldenrod"></line> -</g> -<g transform="translate(1250,-4100)"> -<line y2="-50" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-3900)"> -<line y2="-250" stroke="goldenrod"></line> -</g> -<g transform="translate(1650,-4150)"> -<line x2="-400" stroke="goldenrod" stroke-width="6"></line> -</g> -<g transform="translate(2900,-4150)"> -<line x2="-1250" stroke="goldenrod" stroke-width="6"></line> -<text stroke="none" x="-896" y="-10" fill="orange" font-size="38.000017"> -<title>SIG_NAME</title>PP3300_FPC</text> -</g> -<circle cx="2800" cy="-4000" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-4100" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-4250" r="10" stroke="black" fill="black"></circle> -<circle cx="2800" cy="-4350" r="10" stroke="black" fill="black"></circle> -<circle cx="3400" cy="-4000" r="10" stroke="black" fill="black"></circle> -<circle cx="3400" cy="-4250" r="10" stroke="black" fill="black"></circle> -<circle cx="3400" cy="-4350" r="10" stroke="black" fill="black"></circle> -<circle cx="5600" cy="-3900" r="10" stroke="black" fill="black"></circle> -<circle cx="6100" cy="-3650" r="10" stroke="black" fill="black"></circle> -<circle cx="6100" cy="-3700" r="10" stroke="black" fill="black"></circle> -<circle cx="6100" cy="-3750" r="10" stroke="black" fill="black"></circle> -<circle cx="6100" cy="-4150" r="10" stroke="black" fill="black"></circle> -<circle cx="4700" cy="-4050" r="10" stroke="black" fill="black"></circle> -<circle cx="1400" cy="-4200" r="10" stroke="black" fill="black"></circle> -<circle cx="1450" cy="-2900" r="10" stroke="black" fill="black"></circle> -<circle cx="1900" cy="-2900" r="10" stroke="black" fill="black"></circle> -<circle cx="4500" cy="-1800" r="10" stroke="black" fill="black"></circle> -<circle cx="6100" cy="-2800" r="10" stroke="black" fill="black"></circle> -<circle cx="6350" cy="-2800" r="10" stroke="black" fill="black"></circle> -<circle cx="6350" cy="-4200" r="10" stroke="black" fill="black"></circle> -<circle cx="6900" cy="-4300" r="10" stroke="black" fill="black"></circle> -<circle cx="7100" cy="-4300" r="10" stroke="black" fill="black"></circle> -<circle cx="1650" cy="-4150" r="10" stroke="black" fill="black"></circle> -</svg> - -</div> -</div> -<hr> -</body></html> diff --git a/docs/schematics/dragonclaw/dragonclaw_v0.2_bom.csv b/docs/schematics/dragonclaw/dragonclaw_v0.2_bom.csv deleted file mode 100644 index 13f2a55b6b..0000000000 --- a/docs/schematics/dragonclaw/dragonclaw_v0.2_bom.csv +++ /dev/null @@ -1,26 +0,0 @@ -Reference designators,DNP designators,Quantity,Manufacturer,Manufacturer P/N,Description,Sourcing,Mounting Type,Vendor Name,Vendor P/N,URL,Notes
-C1 C3 C4 C5 C7 C10 C11 C14 C15 C16 C18 C19 C20,,13,Yageo,CC0201KRX5R6BB104,0201 0.1 uF 10 V ±10 % Tolerance X5R SMT Multilayer Ceramic Capacitor,tempo,smt,Digi-Key,311-1593-1-ND,https://octopart.com/click/track?ai=8297&sig=067af79&sid=459&ppid=25629481&vpid=193845858&ct=offers,
-C2 C8,,2,TDK,C1005X5R1A475K050BC,C Series 0402 4.7 uF 10 V ±10 % Tolerance X5R SMT Multilayer Ceramic Capacitor,tempo,smt,Digi-Key,445-13820-1-ND,https://octopart.com/click/track?ai=8297&sig=01f98a8&sid=459&ppid=28166959&vpid=73759644&ct=offers,
-C6 C12 C13 C17,,4,Taiyo Yuden,LMK063BBJ105MPLF,CAP CER 1UF 10V X5R 0201,tempo,smt,Digi-Key,587-6263-1-ND,https://octopart.com/click/track?ai=8297&sig=0712f19&sid=459&ppid=59159715&vpid=528035991&ct=offers,
-J1,,1,Panasonic,AXK750147G,"Connector, Receptacle, 50 Position, 2Row; Pitch Spacing:0.4Mm; No. Of Contacts:50Contacts; Gender:receptacle; Product Range:p4 Series; Contact Termination Type:surface Mount; No. Of Rows:2Rows; Contact Plating:gold Plated Contacts Rohs Compliant: Yes",tempo,smt,Digi-Key,255-2533-1-ND,https://octopart.com/click/track?ai=8297&sig=053b57f&sid=459&ppid=6716868&vpid=34098380&ct=offers,
-J4,,1,Samtec,FTSH-105-01-L-DV-P-TR,Connector Systems:wire-To-Board; Pitch Spacing:1.27Mm; No. Of Rows:2Rows; No. Of Contacts:10Contacts; Contact Termination Type:surface Mount; Product Range:ftsh Series; Connector Shroud:unshrouded; Contact Material:phosphor Bronze Rohs Compliant: Yes,tempo,smt,Mouser,200-FTSH10501LDVPTR,https://octopart.com/click/track?ai=8297&sig=062d0da&sid=2401&ppid=9236906&vpid=493091076&ct=offers,
-J3,,1,Hirose,BM10NB(0.8)-16DS-0.4V(51),CONN RCPT 16POS SMD GOLD,tempo,smt,Digi-Key,H11823CT-ND,https://octopart.com/click/track?ai=8297&sig=086fb17&sid=459&ppid=19073631&vpid=33743439&ct=offers,
-J2,,1,Molex,505110-2091,CONN FFC/FPC BOTTOM 20P .5MM R/A,tempo,smt,Digi-Key,WM11287CT-ND,https://octopart.com/click/track?ai=8297&sig=08af8fc&sid=459&ppid=57952888&vpid=213397109&ct=offers,
-J5,,1,Hirose,FH35C-13S-0.3SHW(99),CONN FPC 13POS 0.30MM R/A,tempo,smt,Digi-Key,H122265CT-ND,https://octopart.com/click/track?ai=8297&sig=0682a03&sid=459&ppid=33632612&vpid=120326136&ct=offers,
-U8 U12,,2,Texas Instruments,TS5A23159DGSR,Analog Switch Dual SPDT 10-Pin VSSOP T/R,tempo,smt,Digi-Key,296-18598-1-ND,https://octopart.com/click/track?ai=8297&sig=026eeda&sid=459&ppid=512343&vpid=1735040&ct=offers,
-U14,,1,Texas Instruments,SN74LVC1G07YZVR,Buffer/Driver 1-CH Non-Inverting Open Drain CMOS 4-Pin DSBGA T/R,tempo,leadless,Digi-Key,296-21057-1-ND,https://octopart.com/click/track?ai=8297&sig=0e65ea2&sid=459&ppid=664237&vpid=1799702&ct=offers,
-U9 U10,,2,Texas Instruments,SN74AUP1T97YZPR,IC TRNSLTR UNIDIRECTIONAL 6DSBGA,tempo,leadless,Digi-Key,296-17899-1-ND,https://octopart.com/click/track?ai=8297&sig=0e9ca45&sid=459&ppid=464945&vpid=1674955&ct=offers,
-U1,,1,Texas Instruments,INA3221AIRGVR,IC CURRENT SHUNT MONITOR 16VQFN,tempo,leadless,Digi-Key,296-INA3221AIRGVRCT-ND,https://octopart.com/click/track?ai=8297&sig=0b68a57&sid=459&ppid=22631279&vpid=595207883&ct=offers,
-U2,,1,STMicroelectronics,STM32F412CGU6,IC MCU 32BIT 1MB FLASH 48UFQFPN,tempo,leadless,Mouser,511-STM32F412CGU6,https://octopart.com/click/track?ai=8297&sig=0d8fdb9&sid=2401&ppid=74146039&vpid=458625504&ct=offers,
-U3 U4 U5 U6,,4,Texas Instruments,TPS2559DRCR,IC PWR SWITCH N-CHAN 1:1 10VSON,tempo,leadless,Digi-Key,296-40730-1-ND,https://octopart.com/click/track?ai=8297&sig=0e5279b&sid=459&ppid=47153743&vpid=192871412&ct=offers,
-U7 U13 U15,,3,Texas Instruments,TS3A5018RSVR,IC SWITCH QUAD SPDT 16UQFN,tempo,leadless,Digi-Key,296-27552-1-ND,https://octopart.com/click/track?ai=8297&sig=0179e01&sid=459&ppid=18629953&vpid=34364363&ct=offers,
-DS1,,1,Lite-On,LTST-C190GKT,"Smd, 0603, Grn, 569Nm, 6Mcd, Clr, T/r Rohs Compliant: Yes",tempo,smt,Digi-Key,160-1183-1-ND,https://octopart.com/click/track?ai=8297&sig=0316225&sid=459&ppid=549821&vpid=1103326&ct=offers,
-R37 R38 R47 R49 R51,,5,Vishay,CRCW02010000Z0ED,CRCW Series 0201 0.05 W 0 Ohm Jumper Surface Mount Thick Film Chip Resistor,tempo,smt,Digi-Key,541-0.0AGCT-ND,https://octopart.com/click/track?ai=8297&sig=0ed1c57&sid=459&ppid=39994378&vpid=114977597&ct=offers,
-R35 R36 R40,,3,Vishay,CRCW02011M00FKED,"THICK FILM RESISTOR, 1MOHM, 50mW, ±1%",tempo,smt,Digi-Key,541-1.00MAABCT-ND,https://octopart.com/click/track?ai=8297&sig=0227c5e&sid=459&ppid=41857821&vpid=116456133&ct=offers,
-R31,,1,Vishay,CRCW020110K0FNED,Res Thick Film 0201 10K Ohm 1% 1/20W ±200ppm/°C Molded SMD SMD Paper T/R,tempo,smt,Mouser,71-CRCW0201-10K,https://octopart.com/click/track?ai=8297&sig=0ddf9ae&sid=2401&ppid=39803208&vpid=116516014&ct=offers,
-R48,,1,Vishay,CRCW0402120RFKEDC,D10/crcw0402-C 100 120R 1% Et7 E3,tempo,smt,Digi-Key,541-4077-1-ND,https://octopart.com/click/track?ai=8297&sig=08ebab3&sid=459&ppid=75649391&vpid=454352811&ct=offers,
-R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R17 R18 R21 R22 R27 R28 R30 R33 R39 R41 R44 R50 R52 R55 R56,,26,Vishay,CRCW0201100KFKED,Res Thick Film 0201 100K Ohm 1% 1/20W ±100ppm/°C Molded SMD SMD Paper T/R,tempo,smt,Digi-Key,541-100KAABDKR-ND,https://octopart.com/click/track?ai=8297&sig=0c369aa&sid=459&ppid=41857764&vpid=115224580&ct=offers,
-R26,,1,Vishay,CRCW02011K00FNED,Res Thick Film 0201 1K Ohm 1% 1/20W ±200ppm/°C Molded SMD SMD Paper T/R,tempo,smt,Mouser,71-CRCW02011K00FNED,https://octopart.com/click/track?ai=8297&sig=000b814&sid=2401&ppid=39803573&vpid=116319440&ct=offers,
-R1 R19 R23 R24 R42 R43,,6,Stackpole Electronics,CSR0402FKR500,"Thick Film - Current Sensing 0402, 1%, T&r - 1,000 Pcs/reel, 0.5 Ohms Rohs Compliant: Yes",tempo,smt,Digi-Key,CSR0402FKR500CT-ND,https://octopart.com/click/track?ai=8297&sig=0aa805e&sid=459&ppid=21887093&vpid=203733614&ct=offers,
-Q1 Q2,,2,ON Semiconductor,BSS138,Fet 50V 3.5 Ohm Sot23 Rohs Compliant: Yes,tempo,smt,Digi-Key,BSS138CT-ND,https://octopart.com/click/track?ai=8297&sig=004b419&sid=459&ppid=19021258&vpid=452459305&ct=offers,
-SW1 SW2,,2,C&K Components,JS102011SAQN,"Slide Switch, Spdt, 0.3A, 6Vdc, Smd; Contact Configuration:spdt; Switch Operation:on-On; Switch Mounting:surface Mount; Product Range:js Series; Contact Current Max:300Ma; Contact Voltage Ac Max:-; Contact Voltage Dc Max:6V Rohs Compliant: Yes",tempo,smt,Digi-Key,401-1999-1-ND,https://octopart.com/click/track?ai=8297&sig=0e387fb&sid=459&ppid=7088996&vpid=34441074&ct=offers,
diff --git a/docs/sitemap.md b/docs/sitemap.md deleted file mode 100644 index 2b9f4aaaf8..0000000000 --- a/docs/sitemap.md +++ /dev/null @@ -1,79 +0,0 @@ -# Sitemap - -## Getting Started - -* [Getting Started Quickly](./getting_started_quickly.md) -* [Core Runtime](./core_runtime.md) -* [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][1] -* [Google Security Chip Case Closed Debugging][2] -* [Tutorials][3] - -## Verified Boot Troubleshooting - -* [Cr50 Verified Boot Troubleshooting][4] - -## Fingerprint MCU (FPMCU) - -* [Fingerprint MCU (FPMCU)](./fingerprint/fingerprint.md) -* [FPMCU Development for Partners](./fingerprint/fingerprint-dev-for-partners.md) -* [FPMCU Firmware Testing for Partners](./fingerprint/fingerprint-firmware-testing-for-partners.md) -* [FPMCU Debugging](./fingerprint/fingerprint-debugging.md) -* [Fingerprint Authentication Design Doc](./fingerprint/fingerprint-authentication-design-doc.md) -* [Fingerprint Factory Requirements](./fingerprint/fingerprint-factory-requirements.md) -* [Fingerprint Quick Factory Guide](./fingerprint/fingerprint-factory-quick-guide.md) -* [Dragonclaw Schematics and Layout](./schematics/dragonclaw) - -## Testing - -* [Unit Tests](./unit_tests.md) - * [Porting EC unit tests to Ztest](./ztest.md) -* [Code Coverage](./code_coverage.md) - -## Updaters - -* [USB Updater](./usb_updater.md) - -## USB - -* [USB-C Power Delivery and Alternate Modes](./usb-c.md) -* [USB-A and USB-C Policies for Sourcing Power](./usb_power.md) -* [USB-C Power Delivery TCPMv2](./usb-tcpmv2.md) - -## Verified Boot - -* [Detachable Base Verified Boot](./detachable_base_verified_boot.md) - -## EC-3PO - -* [EC-3PO overview](./ec-3po.md) -* [EC-3PO design doc](./ec-3po-design.md) - -## Zephyr - -* [Initialization Order](./zephyr_init.md) -* [Proof-of-Concept-Device Bringup](./zephyr_poc_device_bringup.md) -* [Shimming](./zephyr_shim.md) -* [Porting EC unit tests to Ztest](./ztest.md) - -## Miscellaneous - -* [Low Battery Startup](./low_battery_startup.md) -* [I2C tracing via console commands](./i2c-debugging.md) -* [Application Processor to EC communication](./ap-ec-comm.md) -* [Reducing EC Image Size](./reducing_ec_image_size.md) -* [Code Reviews](./code_reviews.md) -* [IDE Support](./ide-support.md) - -[1]:https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging.md -[2]:https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md -[3]:https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/ccd_howtos.md -[4]:https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/cr50_vboot_troubleshooting.md diff --git a/docs/unit_tests.md b/docs/unit_tests.md deleted file mode 100644 index f26a8519c8..0000000000 --- a/docs/unit_tests.md +++ /dev/null @@ -1,232 +0,0 @@ -# Unit Tests - -Provides an overview of how to write and run the unit tests in the EC codebase. - -[TOC] - -## Running Unit Tests {#running} - -The unit tests run on the host machine using the [`host` board]. - -List available unit tests: - -```bash -(chroot) ~/trunk/src/platform/ec $ make print-host-tests -``` - -Build and run a specific unit test (the `host_command` test in this example): - -```bash -(chroot) ~/trunk/src/platform/ec $ make run-host_command -``` - -Build and run all unit tests: - -```bash -(chroot) ~/trunk/src/platform/ec $ make runhosttests -j -``` - -## Debugging Unit Tests - -You need the host version of gdb: - -```bash -(chroot) sudo emerge -j sys-devel/gdb -``` - -Then run gdb on the specific test you want to debug (the `host_command` test in this example): - -``` -(chroot) gdb build/host/host_command/host_command.exe -handle SIGUSR1 noprint nostop -break test_hostcmd_ok -run -``` - -## Writing Unit Tests - -Unit tests live in the [`test`] subdirectory of the CrOS EC codebase. - -All new unit tests should be written to use the Zephyr Ztest -[API](https://docs.zephyrproject.org/latest/guides/test/ztest.html). If you are -making significant changes to an existing test, you should also look at porting -the test from the EC test API to the Ztest API. - -Using the Ztest API makes the unit tests suitable for submitting upstream to the -Zephyr project, and reduces the porting work when the EC transitions to the -Zephyr RTOS. - -### File headers - -Include [`test_util.h`] and any other required includes. In this example, the -function being tested is defined in the test, but a real unit test would include -the header file for the module that defines `some_function`. - -`test/my_test.c`: - -```c -#include <stdbool.h> -#include "test_util.h" - -static bool some_function(void) -{ - return true; -} -``` - -[`test_util.h`] includes `ztest.h` if `CONFIG_ZEPHYR` is defined, or defines a -mapping from the `zassert` macros to the EC `TEST_ASSERT` macros if -`CONFIG_ZEPHYR` is not defined. - -### Test cases - -Define the test cases. Use the `EC_TEST_RETURN` return type on these functions. - -```c -/* Write a function with the following signature: */ -test_static EC_TEST_RETURN test_my_function(void) -{ - /* Run some code */ - bool condition = some_function(); - - /* Check that the expected condition is correct. */ - zassert_true(condition, NULL); - - return EC_SUCCESS; -} -``` - -`test/my_test.c`: - -```c -/* Write a function with the following signature: */ -test_static EC_TEST_RETURN test_my_function(void) -{ - /* Run some code */ - bool condition = some_function(); - - /* Check that the expected condition is correct. */ - TEST_EQ(condition, true, "%d"); - - return EC_SUCCESS; -} -``` - -The only difference between those two versions of `test/my_test.c` is the -assertion: `c zassert_true(condition, NULL);` versus `c TEST_EQ(condition, true, -"%d");` - -### Specify the test cases to run - -The EC test API enumerates the test cases using `RUN_TEST` in the `run_test` -function, while the Ztest API enumerates the test cases using `ztest_unit_test` -inside another macro for the test suite, inside of `test_main`. - -`test/my_test.c`: - -```c -#ifdef CONFIG_ZEPHYR -void test_main(void) -{ - ztest_test_suite(test_my_unit, - ztest_unit_test(test_my_function)); - ztest_run_test_suite(test_my_unit); -} -#else -/* The test framework will call the function named "run_test" */ -void run_test(int argc, char **argv) -{ - /* Each unit test can be run using the RUN_TEST macro: */ - RUN_TEST(test_my_function); - - /* Report the results of all the tests at the end. */ - test_print_result(); -} -#endif /* CONFIG_ZEPHYR */ -``` - -### Task List - -EC unit tests can run additional tasks besides the main test thread. The EC unit -test implementation provides a phtreads-based implementation of the EC task API. -We do not yet support running additional tasks in Ztest-based tests. - -In the [`test`] subdirectory, create a `tasklist` file for your test that lists -the tasks that should run as part of the test: - -`test/my_test.tasklist`: - -```c -/* - * No test task in this case, but you can use `TASK_TEST` macro to specify one. - */ -#define CONFIG_TEST_TASK_LIST -``` - -### Makefile - -Add the test to the `Makefile` so that it can build as an EC unit test: - -`test/build.mk`: - -```Makefile -test-list-host += my_test -``` - -and - -```Makefile -my_test-y=my_test.o -``` - -Make sure you test shows up in the "host" tests: - -```bash -(chroot) $ make print-host-tests | grep my_test -host-my_test -run-my_test -``` - -### Build and Run - -Build and run the test as an EC unit test: - -```bash -(chroot) $ make run-my_test -``` - -For building the test as a Zephyr Ztest unit test, follow the instructions in -[Porting EC unit tests to Ztest](./ztest.md) to build the unit test for Zephyr's -"native_posix" host-based target. - -<!-- mdformat off(b/139308852) --> -*** note -**TIP**: Unit tests should be independent from each other as much as possible. -This keeps the test (and any system state) simple to reason about and also -allows running unit tests in parallel. You can use the -[`before_test` hook][`test_util.h`] to reset the state before each test is run. -*** -<!-- mdformat on --> - -## Mocks - -We do not yet support mocks for Zephyr Ztest-based tests. [Mocks][`mock`] enable -you to simulate behavior for parts of the system that you're not directly -testing. They can also be useful for testing specific edge cases that are hard -to exercise during normal use (e.g., error conditions). - -See the [Mock README] for details. - -### Mock Time - -When writing unit tests that rely on a clock, it's best not to rely on a real -hardware clock. It's very difficult to enforce exact timing with a real clock, -which leads to test flakiness (and developers ignoring tests since they're flaky -). Instead, use the [Mock Timer] to adjust the time during the test. - -[`mock`]: /include/mock -[Mock Timer]: /include/mock/timer_mock.h -[`test`]: /test -[`host` board]: /board/host/ -[`test_util.h`]: /include/test_util.h -[Mock README]: /common/mock/README.md diff --git a/docs/usb-c.md b/docs/usb-c.md deleted file mode 100644 index 1e009f82b2..0000000000 --- a/docs/usb-c.md +++ /dev/null @@ -1,219 +0,0 @@ -# EC Implementation of USB-C Power Delivery and Alternate Modes - -USB-C PD requires a complex state machine as USB-C PD can operate in many -different modes. This includes but isn't limited to: - -* Negotiated power contracts. Either side of the cable can source or sink - power up to 100W (if supported by device). -* Reversed cable mode. This requires a mux to switch the signals before - getting to the SoC (or AP). -* Debug accessory mode, e.g. [Case Closed Debugging (CCD)] -* Multiple uses for the 4 differential pair signals including - * USB SuperSpeed mode (up to 4 lanes for USB data) - * DisplayPort Alternate Mode (up to 4 lanes for DisplayPort data) - * Dock Mode (2 lanes for USB data, and 2 lanes for DisplayPort) - * Audio Accessory mode. (1 lane is used for L and R analog audio signal) - -For a more complete list of USB-C Power Delivery features, see the -[USB-C PD spec][USB PD Spec Id]. - -This document covers various touch points to consider for USB-C PD and Alternate -Modes in the EC codebase. - -[TOC] - -## Glossary - -* PD {#pd} - * Power Delivery. Protocol over USB-C connector that allows up to 100W of - power. Not supported on USB-A or USB-B connectors. A good overview of - USB PD is found in the [Introduction to USB Power Delivery] application - note. -* TCPC {#tcpc} - * Type-C Port Controller. Typically a separate IC connected through I2C, - sometimes embedded within the EC as a hardware sub module. The TCPC - interprets physical layer signals on CC lines and Vbus, and sends that - information to the TCPM to decide what action to take. In older designs, - there was a separate EC (running this codebase) that acted as the TCPC - that communicated with the main EC (also running this codebase), which - acted as the TCPM. More info in the official - [TCPC spec][USB TCPM Spec Id]. -* TCPM {#tcpm} - * Type-C Port Manager. Manages the state of the USB-C connection. Makes - decisions about what state to transition to. This is the code running on - the EC itself. -* PE {#pe} - * Policy Engine. According to the [TypeC spec][USB TC Spec Id], the policy - engine is the state machine that decides how the USB-C connection - progresses through different states and which USB-C PD features are - available, such as Try.SRC -* TC {#tc} - * Type-C physical layer. -* PPC {#ppc} - * Power Path Controller. An optional, separate IC that isolates various - USB-C signals from each other and the rest of the board. This IC should - prevent shorts and over current/voltage scenarios for Vbus. Some PPCs - will protect signals other than Vbus as well. -* SSMUX {#ssmux} - * SuperSpeed Mux. This is typically the same IC as the TCPC; it enables - the mirrored orientation of the USB-C cable to go to the correct pins on - SoC. Also, allows the SuperSpeed signal to be used for different - purposes, such as USB data or DisplayPort. -* SVDM {#svdm} - * Structured Vendor Defined Messages are a class of [USB PD](#pd) messages - to enable non-power related communication between port partners. SVDMs - are used to negotiate and set the display port mode on a USB-C - connection. -* DRP {#drp} - * Dual Role Power Port. A USB-C port that can act as either a power Source - or power Sink. -* UFP {#ufp} - * Upstream Facing Port. The USB data role that is typical for a peripheral - (e.g. HID keyboard). -* DFP {#dfp} - - * Downstream Facing Port. The USB Data role that is typical for a host - machine (e.g. device running ChromeOS). - -* E-Mark {#emark} - - * Electronically marked cable. A USB-C cable that contains an embedded - chip in the cable, used to identify the capabilities of the cable. - -* VCONN {#vconn} - - * Connector Voltage. A dedicated power supply rail for [E-Mark](#emark) - cables and other accessory functions (such as display dongles, and - docks). VCONN re-uses one of the CC1/CC2 signals to provide 5 volt, 1 - watt, of power. - -## Different PD stacks - -Right now platform/ec has two different implementations of USB-C PD stack. - -1. The older implementation is mainly contained within - [`usb_pd_protocol.c`](../common/usb_pd_protocol.c) and - [`usb_pd_policy.c`](../common/usb_pd_policy.c) -2. The newer implementation is found under [`common/usbc`](../common/usbc) and - is broken up into multiple different files and state machines - * Policy engine state machine files, `usb_pe_*_sm.c`. - * Protocol engine state machine file, `usb_prl_*_sm.c`. - * State machine framework file, `usb_sm.c`. - * Type-C physical layer state machine files, `usb_tc_*_sm.c`. - * USB-C PD Task file, `usbc_task.c`. - -The older implementation supports firmware for device types other than -Chromebooks. For example, the older stack supports the Zinger, which is the -USB-C charging device that shipped with Samus, the Google Chromebook Pixel 2. -The Zinger implements the charger only side of the USB PD protocol. - -To use the newer USB-C PD stack implementation, see -[TCPMv2 Overview](usb-tcpmv2.md). - -## Implementation Considerations - -In both older and newer implementations, the following details apply: - -* For each USB-C port, there must be two tasks: `PD_C#` and `PD_INT_C#`, where - `#` is the port number starting from `0`. - * The `PD_C#` task runs the state machine (old or new) for the port and - communicates with the TCPC, MUX, and PPC. This task needs a large task - stack. - * The `PD_INT_C#` tasks run at a higher priority than the state machine - task, and its sole job is to receive interrupts from the TCPC as quickly - as possible then send appropriate messages to other tasks (including - `PD_C#`). This task shouldn't need much stack space, but the i2c - recovery code requires a decent amount of stack space so it ends up - needing a fair amount too. -* Saving PD state between EC jumps - * PD communication is disabled in locked RO images (normal state for - customer devices). When the jump from RO to RW happens relatively - quickly (e.g. there is not a long memory training step), then there - aren't many problems when RW takes over and negotiates higher PD - contracts. - * To support factory use cases that don't have a battery (and are - therefore unlocked), PD communication is enabled in unlocked RO. This - allows systems without software sync enabled to get a higher power - contract than 15W in RO. - * We save and restore PD state between RO -> RW and RW -> RO jump to allow - us to maintain a higher negotiated power through the full jump and - re-initialization process. For example, for each port we save the power - role, data role, and Vconn sourcing state in battery-backed or - non-volatile RAM. This allows the firmware image that is initializing to - restore an existing SNK contract (Chromebook as SNK) without cutting - power. We don't cut the power from the external supplier because we - issue a SoftReset (leaves Vbus intact) instead of a HardReset (drops - Vbus) in this contract resume case. - * Both use cases where we actually are able to restore the PD contract - require an unlocked RO (e.g. factory) otherwise RO cannot communicate - via PD and will drop the higher PD contract (by applying Rp/Rp on the CC - lines temporarily) - * The RO->RW use case is for an unlocked (e.g. factory) device that - negotiated power and we want to keep that contract after we jump to - RW in the normal software sync boot process. This is especially - useful when there is no battery and Vbus is our only power source. - * The RW->RO use case happens when we are performing auxiliary FW - upgrades during software sync and BIOS instructs the EC to jump back - to RO. We'll also try to maintain contracts over an EC reset when - unlocked. - -## Configuration - -There are many `CONFIG_*` options and driver structs that are needed in the -board.h and board.c implementation. - -### TCPC Config - -The `tcpc_config` array of `tcpc_config_t` structs defined in `board.c` (or -baseboard equivalent) should be defined for every board. The index in the -`tcpc_config` array corresponds to the USB-C port number. This struct should -point to the specific TCPC driver that corresponds to the TCPC that is being -used on that port. The i2c port and address for the TCPC are also specified -here. - -### SSMUX Config - -The `usb_muxes` array of `usb_mux` structs defined in `board.c` (or baseboard -equivalent) should be defined for every board. Normally the standard -`tcpci_tcpm_usb_mux_driver` driver works, especially if TCPC and MUX are the -same IC. - -If the signal strength for the high-speed data lines needs to be tuned for a -specific hardware layout, the `board_init` field on the `usb_mux` is called -every time the mux is woken up from a low power state and should be used for -setting custom board tuning parameters. - -### PPC Config - -Some boards have an additional IC that sits between the physical USB-C connector -and the rest of the board. The PPC IC gates whether the Vbus line is an input or -output signal, based on i2c settings or gpio pins. A PPC also typically provides -over voltage and over current protection on multiple USB-C pins. - -The `ppc_chips` array of `ppc_config_t` structs defined in `board.c` (or -baseboard equivalent) sets the appropriate driver and i2c port/address for the -PPC IC. - -### Useful Config Options - -Many USB-C policies and features are gated by various `CONFIG_*` options that -should be defined in `board.h` (or baseboard equivalent). - -Most USB-C options will start with `CONFIG_USB_PD_` or `CONFIG_USBC_`. For their -full descriptions see [config.h][config header link] - -## Interactions with other tasks - -TODO(https://crbug.com/974302): mention `USB_CHG_P#` and `CHARGER` - -## Upgrading FW for TCPCs - -TODO(https://crbug.com/974302): Mention how this works even though it is in -depthcharge. Probing now. Need new driver in depthcharge - -[Case Closed Debugging (CCD)]: https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md -[Introduction to USB Power Delivery]: https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en575003 -[USB PD Spec Id]: https://www.usb.org/document-library/usb-power-delivery -[USB TC Spec Id]: https://www.usb.org/document-library/usb-type-cr-cable-and-connector-specification-revision-20-august-2019 -[USB TCPM Spec Id]: https://www.usb.org/document-library/usb-type-ctm-port-controller-interface-specification -[config header link]: ../include/config.h diff --git a/docs/usb-tcpmv2.md b/docs/usb-tcpmv2.md deleted file mode 100644 index b942b048d8..0000000000 --- a/docs/usb-tcpmv2.md +++ /dev/null @@ -1,221 +0,0 @@ -# EC USB-C Power Delivery TCPMv2 Overview - -As the original USB-C Power Delivery (PD) solution for the ChromeOS Embedded -Controller has aged, it has grown to the point where it is difficult to add new -features and address bugs. A new PD stack (generally referred to as TCPMv2) has -been introduced to the codebase for use moving forward. It implements a layered, -state-based design which tracks more closely with the USB Type-C and USB PD -specifications. - -[TOC] - -## Enabling TCPMv2 - -Boards may enable TCPMv2 by adding the following defines: - -* `CONFIG_USB_PD_TCPMV2`Configures the board to use the new stack. -* `CONFIG_USB_DRP_ACC_TRYSRC`: Configures the type of state machine to run (in - this case, a DRP which performs Try.SRC behavior). Currently available are - DRP and charge-through Vconn-powered device options -* `CONFIG_USB_PD_DECODE_SOP`: Sets up messaging for SOP’ and SOP’’, which is - strongly encouraged in the TCPMv2 code moving forward -* `CONFIG_USB_PID 0x1234`: Sets the USB Product Identifier. This will be - shared for all boards within one reference design, and new PIDs may be - requested by sending an email to the ChromeOS FW Team. -* `CONFIG_USB_PD_REV30`: The TCPMv2 stack defaults to PD2.0 operation but - defining this macro enables PD3.0 functionality. - -Other configurations to specify behaviors within the task still apply (ex. -`CONFIG_USB_PD_ALT_MODE_DFP` and `CONFIG_USB_PD_TCPC_LOW_POWER`). - -## State Machine Framework - -The basis of the TCPMv2 state machines is a generic state machine framework. -This framework can be found in common/usbc/usb\_sm.c. For each state, there may -be defined: - -* Entry: Called upon entering a state -* Run: Called while steady in a state -* Exit: Called upon leaving a state -* Parent: Superstate. Enters, exits, and runs alongside the child state. Only - enters and exits when transitioning between states which do not share the - parent. - -All fields are optional and may be set to NULL. A new state is transitioned to -with a call into set\_state(), which exits the old state and parents and enters -the new parents and state. States may be changed with set\_state() in any entry -or run function, but any call from an exit function is ignored since exit is -only called when a change is already in progress. While in a state, run\_state() -executes the run function for the current state and parents. If set\_state() is -called from either an entry function or a run function, the remaining run or -entry functions are stopped. - -Below is a graphical example of what some states may look like. States 1 and 2 -share Parent State 1, while State 3 has Parent State of 2. - -![Example States](images/TCPMv2-ExampleStates.png "Example States") - -Translated into code, this would be something like below (note it is not -necessary that the states be a part of an array, but the TCPMv2 code generally -organizes the states in this way): - -``` -static const struct usb_state test_states[] = { - [PARENT_1] = { - .entry = parent_1_entry, - .run = parent_1_run, - .exit = parent_1_exit, - }, - [PARENT_2] = { - .entry = parent_2_entry, - .run = parent_2_run, - .exit = parent_2_exit, - }, - [STATE_1] = { - .entry = state_1_entry, - .run = state_1_run, - .exit = state_1_exit, - .parent = &test_states[PARENT_1], - }, - [STATE_2] = { - .entry = state_2_entry, - .run = state_2_run, - .exit = state_2_exit, - .parent = &test_states[PARENT_1], - }, - [STATE_3] = { - .entry = state_3_entry, - .run = state_3_run, - .exit = state_3_exit, - .parent = &test_states[PARENT_2], - }, -}; -``` - -For this example, each test state is written simply to produce a print of its -function name. The two exceptions are: - -* parent\_1\_run() calls set\_state() into STATE\_2 when called a second time -* state\_2\_entry() calls set\_state() into STATE\_3 - -Graphically, this is represented below: - -![Example Transitions](images/TCPMv2-ExampleTransitions.png "Example state transitions and resulting called functions") - -And the following code output is produced: - -``` -Calling run_state() -state_1_run -parent_1_run - -Calling run_state() -state_1_run -state_1_run calling set_state() to state 2 -state_1_exit -state_2_entry -state_2_entry calling set_state() to state 3 -state_2_exit -parent_1_exit -parent_2_entry -state_3_entry - -Calling run_state() -state_3_run -parent_2_run -``` - -## TCPMv2 PD Task - -The TCPMv2 PD task is built upon state machines using the above framework and is -located in common/usbc/usbc\_task.c. It is separated into three layers which -track with the USB Type-C and USB PD specification states and run in a loop with -5 ms periods between executions. A graphical representation of these layers is -below. - -![PD Task Loop](images/TCPMv2-TaskLoop.png "PD task loop state machine calls") - -The task is designed such that the Type-C (TC) layer could run independently for -any application which doesn’t wish to enable PD messaging. Boards define their -appropriate Policy Engine (PE) and TC state machines through their selection of -a CONFIG\_USB\_\* define, with current options supporting both Dual-Role Ports -(DRPs) and Charge-Through Vconn-Powered Device (CTVPD). All boards use the same -Protocol Layer (PRL) code. - -## TCPMv2 Layers - -### Overview - -The three state machines mentioned above interact with each other and the EC -drivers in order to orchestrate all Type-C connection behavior. Graphically, -they are represented below. - -![PD Task Layers](images/TCPMv2-TaskLayers.png "PD task layer interactions") - -Layers communicate with each other using atomic operations on flags and shared -buffers. Functions calling into each layer are clearly named to indicate the -layer they are acting on, and anything calling into the PD task should be doing -so through pd\_\* named functions. - -Some specific examples of how this communication works between layers is below. -If a port partner sends in a Vconn\_swap request, then: - -* PRL will communicate that a message was received to the PE layer through - pe\_message\_received(), which sets PE\_FLAGS\_MSG\_RECEIVED and indicates - the receive buffer has a message -* PE asks with the TC whether the board is sourcing Vconn with - tc\_is\_vconn\_src() which checks TC\_FLAGS\_VCONN\_ON -* PE tells the PRL to send an ACCEPT message to the port partner through - prl\_send\_ctrl\_msg() which fills in shared message information and sets - PRL\_FLAGS\_MSG\_XMIT -* PRL lets the PE know that the message transmit was successful through - pe\_message\_sent() which sets PE\_FLAGS\_TX\_COMPLETE -* TC tells the PE layer that the Vconn swap completed with - pe\_vconn\_swap\_complete() which sets PE\_FLAGS\_VCONN\_SWAP\_COMPLETE - -### Type-C Layer - -Defined in the USB Type-C specification, this layer is responsible for basic -connection. It takes care of setting the CC lines, detecting and debouncing the -partner CC lines, and performs most of the interactions needed with the PPC and -USB mux. Once the TC layer has gotten the connection to the point of being -Attached.SNK or Attached.SRC, it will enable the PRL and PE layers accordingly. - -### Protocol Layer - -A part of the USB PD specification, the protocol layer is responsible for the -actual sending and receiving of PD messages with the TCPCs. The layer is -actually composed of 4 separate state machines running one after the other. -These state machines are: - -* Chunked receive (RCH): passes messages up to the PE and requests chunks when - chunking -* Chunked transmit (TCH): receives messages from the PE and waits for chunk - requests when chunking -* Protocol transmit (PRL\_TX): passes messages to the TCPCs and handles PD 3.0 - collision avoidance -* Protocol hard reset (PRL\_HR): responds to or transmits hard resets, resets - PRL layer variables, notifies PE of hard reset receipt or sent - -### Policy Engine Layer - -The PE layer states are defined as a part of the USB PD specification. State -names are meant to track very closely with the specification so they can be -easily searchable and understood. The PE’s primary responsibility is to send and -process PD messages in order to implement the port’s policy. - -## Best Practices - -* Always call return after set\_state(). Once the state has been changed, - nothing further should be done in the current state. -* Never call set\_state() from an exit function. The call will be ignored as - there is already a state transition taking place. -* Never call set\_state() from outside the PD task. The task may be waiting in - any number of locations and the context should not change around it while it - does so. -* Always use flags to communicate between layers, and to communicate with the - PD task from other tasks. Flags should be accessed through atomic - operations. -* Always use pd\_\* functions to access the PD task from other tasks. -* Always write unit tests as code is added, to verify new code works and - protect against regressions as development continues. diff --git a/docs/usb_power.md b/docs/usb_power.md deleted file mode 100644 index 95177dc150..0000000000 --- a/docs/usb_power.md +++ /dev/null @@ -1,277 +0,0 @@ -# USB Power Considerations - -Users want to be able to charge external devices using their Chromebook USB -ports, e.g. charge a phone from their Chromebook. We want to provide a fast -charging experience to end-users, so we prefer to offer high power charging when -possible. - -[TOC] - -## Summary of Design Requirements - -For explanations of calculations see rest of doc. - -### Total System Power - -Total current needed for external USB devices at 5V: - -``` -((Number of Type-C Ports) * (1800mA)) + 1500mA + -((Number of Type-A Ports) * (900mA)) + 600mA§ -``` - -§ The additional 600mA can be omitted if BC1.2 is not supported for Type-A - -### Daughter Board Considerations - -If a daughter board has 1 Type-A (supporting BC 1.2) and 1 Type-C, the max -potential current load at 5V is `Type-A Vbus (1500mA) + Type-C Vbus (3000mA) + -Type-C Vconn (300mA) = 4800mA` - -* The DB ribbon cables need to be able to carry enough current to supply 24W - (4.8A * 5V) of power to the DB. - * This may be on a single or multiple power rails depending on hardware - design. -* The ground path on the ribbon cable from the DB also needs to be able to - carry enough current to match the power rails. - -## USB Type-A Ports - -For Type-A ports, the [BC 1.2 Specification] adds higher power modes on top of -the [USB 3.2 Specification]. While BC 1.2 support isn't required, it is -preferred, as it allows end-users to charge their devices more quickly. - -[BC 1.2 Specification] defines multiple modes of operation including, but not -limited to: - -* CDP - Charging Downstream Port - * Allows USB Data. Provides guaranteed 1.5A @ 5V power. - * ChromeOS device can act as a CDP. -* SDP - Standard Downstream Port - * Allows USB Data. Provides guaranteed current defined by USB - Specifications - * For USB3, provides guaranteed current of 0.9A @ 5V. - * For USB2, provides guaranteed current of 0.5A @ 5V. - * ChromeOS device can act as a SDP. -* DCP - Dedicated Charging Port - * No USB Data. Provides max of 1.5A @ 5V power. - * ChromeOS device **will not** act as a DCP. - -For detection logic of each mode (e.g. on the D+ and D- pins) and nuance of -power/current power requirements, see full [BC 1.2 Specification]. - -Without BC 1.2 support, the max power requirements match that of a Standard -Downstream Port (SDP) as defined by various specification (e.g. -[USB 3.2 Specification]). - -### ChromeOS as Source - Policy for Type-A - -If BC 1.2 is supported on a ChromeOS device, then the first Type-A port in use -will act as a CDP, providing a maximum current of 1.5A while also enabling USB -data. All other Type-A ports will only be SDP, providing a maximum current of -900mA. - -Note that the CDP Type-A port allocation is dynamic; the first Type-A port to -draw more than 900mA gets to be the CDP, with a maximum current of 1.5A. Then -all other Type-A ports get downgraded to the lower, 900mA current limit (i.e. -SDP) while the first Type-A port maintains a current draw of more than 900mA. In -practice, this means that the first Type-A device plugged in gets to consume -1.5A and any Type-A device inserted after that will only get 900mA. - -Once the Type-A device drawing 1.5A stops pulling more than 900mA or is -physically removed, then the extra 600mA (as well as CDP advertisement) becomes -available to any Type-A port. In practice, Type-A devices only determine current -limits when they are first inserted, so any Type-A device that is still plugged -in when the 1.5A device is removed will not notice that it can pull more -current. This means that the first Type-A device **inserted** after removing the -original 1.5A device gets access to 1.5A. - -The allocation of the one CDP Type-A port is unaffected by user interaction with -Type-C ports. Once a Type-A port has been claimed as CDP, inserting a Type-C -device will not revoke the CDP status of the Type-A port. - -For example, the below sequence of events illustrates the above Type-A policy if -BC 1.2 is supported: - -1. Insert Type-A phone first - * Since no other Type-A port is currently supplying more than 900mA, this - port can supply 1.5A as the CDP. - * Phone pulls 1.5A; other Type-A ports are now marked as SDPs limiting - current to 900mA, each. - * Current state: `phone @ 1.5A`. -2. Insert Type-A mouse second - * Mouse is only allowed 900mA since port is SDP. - * Current state: `phone @ 1.5A` and `mouse @ 900mA`. -3. Remove phone - * High-current port status is relinquished. Now first Type-A port to draw - more than 900mA will claim the one high-current port status (as the - CDP). - * Mouse does not realize that more power is available since most Type-A - devices only determine their current limits upon connection. - * Current state: `mouse @ 900ma`. -4. Insert Type-A battery pack - * Since no other Type-A port is currently supplying more than 900mA, this - port can supply 1.5A as the CDP. - * Battery pack pulls 1.5A; other Type-A ports are now marked as SDPs - limiting current to 900mA, each. - * Current state: `mouse @ 900ma` and `battery pack @ 1.5A`. - -The total current needed for all Type-A ports at 5V is: - -``` -if (BC1.2_Supported) - (# Type-A Ports)*(900mA) + 600mA -else - (# Type-A Ports)*(900mA) -``` - -## USB Type-C Ports - -USB Type-C allows for dynamic negotiation of high power contracts; this is -accomplished through varying CC resistors and/or USB-C Power Delivery (PD). More -in-depth information can be found in the [USB Type-C Specification] \(section -4.5.2.3) and the [USB PD Specification]. CC resistor contracts can range from -500mA/5V to 3A/5V, while PD contracts can range from 0mA/3.3V to 5A/20V. - -### ChromeOS as Source - Policy for Type-C - -**Note:** Behavior outlined here is only implemented in the TCPMv2 Device -Policy Manager (DPM) when a board defines a non-zero maximum number of 3A -ports supported through `CONFIG_USB_PD_3A_PORTS`. - -ChromeOS devices currently source power to external USB devices at 5V with a -typical current of 1.5A for each Type-C port. In certain scenarios, a Type-C -port can source up to 3A @ 5V. - -ChromeOS prefers that the first PD-capable Type-C device **that requires 3A** -should get 3A guaranteed at 5V. Once the maximum supported number of PD-capable -Type-C device has claimed 3A, then other PD-capable Type-C devices will only be -offered a maximum of 1.5A. - -If Fast Role Swap (FRS) is supported and a sourcing port partner reports -requiring 3A after a fast role swap, then this port should be allocated 3A if -no more PD-capable sinks require 3A, and FRS detection may be enabled. Once a -PD-capable device **that requires 3A** is inserted, the FRS port may have FRS -detection disabled if the maximum number of 3A ports has been reached. - -If there are no PD-capable Type-C devices requiring 3A and no FRS ports -requiring 3A, then the first non-PD device will be given 3A until a PD-capable -device **that requires 3A** is inserted, or until an FRS source that requires -3A is inserted. - -Devices will indicate they require 3A operating current in their sink -capabilities, and this will be used as the trigger to let the EC know to -offer that port a 3A source contract. FRS source partners will also -indicate the need for 3A in their sink capabilities, under their Fast Role -Swap required current. - -This policy is laid out in the following flow chart. Current policy for the -"next" port allocation is to select the lowest port number any time more than -one port meets criteria to receive 3A. - -Port balancing will occur when: -* Sink Capabilities are received for a device -* Source capabilities are not replied to after nCapsCount, indicating a non-PD - sink -* Power roles are swapped -* Detach occurs - -![Source Port Balancing](images/usb_source_port_balancing.png "Source Port Balancing") - -Inserting a Type-A device does not affect the power assignment for Type-C ports; -only Type-C devices affect the power of Type-C ports. - -For example, the below sequence of events illustrates the above Type-C policy -with a board with a maximum number of 1 3A-ports supported: - -1. A non-PD capable Type-C keyboard is inserted first - * Keyboard will be offered 1.5A initially - * Current state: `keyboard @ 1.5A`. -2. Partner is established to be non-PD through reaching PE\_SRC\_Disabled. - * Since there are no other PD-capable devices and this is the first - device, offer this device 3A via CC resistor change. - * Current state: `keyboard @ 3A`. -3. A non-PD capable Type-C mouse is inserted second - * It will be offered 1.5A since there is already another non-PD device - claiming 3A. - * Current state: `keyboard @ 3A` and `mouse @ 1.5A`. -4. A PD-capable Type-C hub is inserted third - * Initially negotiate for 1.5A. - * Since this is a PD device, query its operational current through - requesting Sink Capabilities. - * Hub does not want high power from Chromebook; hub continues to receive - 1.5A. - * Keyboard gets to maintain higher 3A current supply. - * Current state: `keyboard @ 3A` and `mouse @ 1.5A` and `hub @ 1.5A`. -5. A PD-capable Type-C phone is inserted fourth - * Phone is initially offered 1.5A. - * Since this is a PD device, query its operational current through - requesting Sink Capabilities. - * The phone reports it wants 3A. - * Since PD devices are preferred for 3A, the non-PD keyboard will be - downgraded from 3A to 1.5A via a CC resistor change. - * After tSinkAdj (60 ms), phone is offered 3A through new Source - Capabilities. - * Current state: `keyboard @ 1.5A` and `mouse @ 1.5A` and `hub @ 1.5A` - and `phone @ 3A`. -6. A PD-capable Type-C tablet is inserted fifth - * Tablet is initially offered 1.5A. - * Since this is a PD device, query its operational current through - requesting Sink Capabilities. - * Tablet would like 3A, but the board has reached its maximum number of - supported 3A ports. Note this port's desired current for later. - * Current state: `keyboard @ 1.5A` and `mouse @ 1.5A` and `hub @ 1.5A` - and `phone @ 3A` and `tablet @ 1.5A`. -7. The PD-capable phone is removed - * The next PD-capable sink device is offered 3A: the tablet - * Current state: `keyboard @ 1.5A` and `mouse @ 1.5A` and `hub @ 1.5A` - and `tablet @ 3A`. -8. A FRS-capable dock is inserted - * The dock is sourcing us - * Since this is a PD capable device, query its FRS current through - requesting Sink Capabilities. - * Dock reports requiring 3A current after FRS. - * Tablet is currently occupying the 3A port, so note this port's desired - FRS current for later. - * Current state: `keyboard @ 1.5A` and `mouse @ 1.5A` and `hub @ 1.5A` - and `tablet @ 3A`; dock `FRS detection disabled` -9. The PD-capable tablet is removed - * The next PD-capable device requiring 3A is offered 3A. If there are - no PD-capable devices requiring 3A, then the next FRS device is - allocated 3A. - * The hub only requires 1.5A, so FRS is enabled for the dock. - * Current state: `keyboard @ 1.5A` and `mouse @ 1.5A` and `hub @ 1.5A`; - dock `FRS detection enabled` -10. The FRS dock is removed - * The next PD-capable device requiring 3A is offered 3A. If there are - no PD-capable devices requiring 3A, then the next FRS device is - allocated 3A. If there are no FRS devices, then the next non-PD - capable device is given 3A. - * The hub only requires 1.5A, so mouse is given 3A via CC - resistor change. - * Current state: `keyboard @ 1.5A` and `mouse @ 3A` and `hub @ 1.5A`. -11. The non-PD capable mouse is removed - * The hub does not require 3A. - * Current state: `keyboard @ 3A` and `hub @ 1.5A`. - -Note: Not all released Chromebooks implement the above policy due to -pre-existing hardware design constraints. - -Type-C ports also need to provide an additional 300mA @ 5V (1.5W) for Vconn on -every port. Note: the 1.5W for Vconn may also be supplied at other voltages, -such as 455mA @ 3.3V instead. - -The total current needed for all Type-C ports at 5V is: - -``` -((Number of Type-C Ports) * (1500mA + 300mA)) + 1500mA -``` - -The total maximum current needed for a single Type-C port at 5V is `(3000mA + -300mA) = 3.3A`. This max current for a single port is especially relevant for -sizing the daughter board ribbon cable appropriately. - -[BC 1.2 Specification]: <https://www.usb.org/document-library/battery-charging-v12-spec-and-adopters-agreement> -[USB 3.2 Specification]: <https://www.usb.org/document-library/usb-32-specification-released-september-22-2017-and-ecns> -[USB PD Specification]: https://www.usb.org/document-library/usb-power-delivery -[USB Type-C Specification]: https://www.usb.org/document-library/usb-type-cr-cable-and-connector-specification-revision-14-march-29-2019 diff --git a/docs/usb_updater.md b/docs/usb_updater.md deleted file mode 100644 index f1505550d1..0000000000 --- a/docs/usb_updater.md +++ /dev/null @@ -1,201 +0,0 @@ -# EC update over USB - -chip/g (Cr50) and common code (hammer, servo_micro/v4) update over USB protocols -share a lot in terms of protocol and ideas, but use different code bases. - -chip/g EC-side implementation is found in `chip/g/*upgrade*`, and the userspace -tool which provides updates over USB among with supporting other features and -interfaces is found in `extra/usb_updater/gsctool.c`. - -Common code uses implementations in `common/*update*.c` and -`include/*update*.h`, and `extra/usb_updater/usb_updater2.c` for the userspace -updater. - -## Cr50-specific notes - -The Cr50 firmware image consists of multiple sections, of interest to the USB -updater are the RO and RW code sections, two of each. When firmware update -session is established, the Cr50 device reports locations of backup RW and RO -sections (those not currently used by the device). - -Based on this information the updater carves out the appropriate sections from -the full Cr50 firmware binary image and sends them to the device for programming -into flash. Once the new sections are programmed and the device is restarted, -the new RO and RW are used if they pass verification and are logically newer -than the existing sections. - -There are two ways to communicate with the Cr50 device: USB and `/dev/tpm0` -(when `gsctool` is running on a chromebook with the Cr50 device). Originally -different protocols were used to communicate over different channels, starting -with version 3 the same protocol is used. - -## Common-code notes - -For non-Cr50 or chip/g devices (common code), the layout is a bit different, as -devices usually have a single RO and a single RW, where RO is truly read-only in -production, and verifies RW before jumping to it. - -For testing and development, `usb_updater2` is provided, while production code -will use `hammerd` (in `src/platform/hammerd`) to update the device. - -## Update protocol - -The host (either a local AP or a workstation) is the master of the firmware -update protocol, it sends data to the Cr50 device, which processes it and -responds. - -The encapsulation format is different between the `/dev/tpm0` and USB cases: - -``` - 4 bytes 4 bytes 4 bytes variable size -+-----------+--------------+---------------+----------~~--------------+ -+ total size| block digest | dest address | data | -+-----------+--------------+---------------+----------~~--------------+ - \ \ / - \ \ / - \ +----- FW update PDU sent over /dev/tpm0 -----------+ - \ / - +--------- USB frame, requires total size field ------------+ -``` - -The update protocol data units (PDUs) are passed over `/dev/tpm0`, the -encapsulation includes integrity verification and destination address of the -data (more of this later). `/dev/tpm0` transactions pretty much do not have size -limits, whereas the USB data is sent in chunks of the size determined when the -USB connection is set up. This is why USB requires an additional encapsulation -into frames to communicate the PDU size to the client side so that the PDU can -be reassembled before passing to the programming function. - -In general, the protocol consists of two phases: connection establishment and -actual image transfer. - -The very first PDU of the transfer session is used to establish the connection. -The first PDU does not have any data, and the `dest address` field is set to -zero. Receiving such a PDU signals the programming function that the host -intends to transfer a new image. - -The response to the first PDU varies depending on the protocol version. - -Note that protocol versions before 5 are described here for completeness, but -are not supported any more. - -Version 1 is used over `/dev/tpm0`. The response is either 4 or 1 bytes in size. -The 4 byte response is the *base address* of the backup RW section, and there is -no support for RO updates. The one byte response is an error indication, -possibly reporting flash erase failure, command format error, etc. - -Version 2 is used over USB. The response is 8 bytes in size. The first four -bytes are either the *base address* of the backup RW section (still no RO -updates), or an error code, the same as in Version 1. The second 4 bytes are the -protocol version number (set to 2). - -All versions above 2 behave the same over `/dev/tpm0` and USB. - -Version 3 response is 16 bytes in size. The first 4 bytes are the error code the -second 4 bytes are the protocol version (set to 3) and then 4 byte *offset* of -the RO section followed by the 4 byte *offset* of the RW section. - -Version 4 response in addition to version 3 provides header revision fields for -active RO and RW images running on the target. - -Once the connection is established, the image to be programmed into flash is -transferred to the Cr50 in 1K PDUs. In versions 1 and 2 the address in the -header is the absolute address to place the block to, in version 3 and later it -is the offset into the flash. - -Protocol version 5 includes RO and RW key ID information into the first PDU -response. The key ID could be used to tell between prod and dev signing modes, -among other things. - -Protocol version 6 does not change the format of the first PDU response, but it -indicates the target's ability to channel TPM vendor commands through USB -connection. - -Common-code updater also uses protocol version 6, but has a fairly different -`first_response_pdu` header, indicated by setting `1` in the higher 16-bit for -the protocol version field (`header_type`). The response includes fields such as -maximum PDU size (which is not fixed to 1KB like for Cr50), flash protection -status, version string, and a minimum rollback version. - -Details can be found in `include/update_fw.h`. - -### State machine (update over USB) - -This describes the EC-side state machine for update over USB. - -IDLE state: - -* If host sends update start PDU (a command without any payload, digest = 0 - and base = 0): - - * Reply with `first_update_pdu` block. Go to OUTSIDE_BLOCK state. - -* If host sends a vendor command (see below), execute that, reply, and stay in - IDLE state. Note that vendor commands are only accepted in IDLE state. - -OUTSIDE_BLOCK (preparing to receive start of PDU): - -* If no data is received in 5 seconds, go back to IDLE state. -* If host sends `UPDATE_DONE` command (by setting `dest address` to - `0xb007ab1e`), go back to IDLE state. -* If host sends a valid block start with a valid address, copy the rest of the - payload and go to INSIDE_BLOCK state. - -INSIDE_BLOCK (in a middle of a PDU): - -* If no data is received in 5 seconds, go back to IDLE state. -* Copy data to a buffer. - - * If buffer is full (i.e. matches the total expected PDU size), write the - data and go to OUTSIDE_BLOCK. - * Else, stay in INSIDE_BLOCK. - -### Vendor commands (channeled TPM command, Cr50) - -When channeling TPM vendor commands the USB frame looks as follows: - -``` - 4 bytes 4 bytes 4 bytes 2 bytes variable size -+-----------+--------------+---------------+-----------+------~~~-------+ -+ total size| block digest | EXT_CMD | vend. sub.| data | -+-----------+--------------+---------------+-----------+------~~~-------+ -``` - -Where `Vend. sub` is the vendor subcommand, and data field is subcommand -dependent. The target tells between update PDUs and encapsulated vendor -subcommands by looking at the `EXT_CMD` value - it is set to `0xbaccd00a` and as -such is guaranteed not to be a valid update PDU destination address. - -These commands cannot exceed the USB packet size (typically 64 bytes), as no -reassembly is performed for such frames. - -The vendor command response size is not fixed, it is subcommand dependent. - -The Cr50 device responds to each update PDU with a confirmation which is 4 bytes -in size in protocol version 2, and 1 byte in size in all other versions. Zero -value means success, non-zero value is the error code reported by Cr50. - -Again, vendor command responses are subcommand specific. - -### Vendor commands (common code) - -Vendor commands for command code look very similar to the TPM vendor commands -above, except that we use `UPDATE_EXTRA_CMD` (`b007ab1f`) instead of `EXT_CMD`, -and `Vend. sub.` have a limit set of values (unless otherwise noted, commands -take no parameter, and reply with a single 1-byte status code): - -* UPDATE_EXTRA_CMD_IMMEDIATE_RESET (0): Tell EC to reboot immediately. -* UPDATE_EXTRA_CMD_JUMP_TO_RW (1): Tell EC (in RO) to jump to RW, if the - signature verifies. -* UPDATE_EXTRA_CMD_STAY_IN_RO (2): Tell EC (in RO), to stay in RO, and not - jump to RW automatically. After this command is sent, a reset is necessary - for the EC to accept to jump to RW again. -* UPDATE_EXTRA_CMD_UNLOCK_RW (3): Tell EC to unlock RW on next reset. -* UPDATE_EXTRA_CMD_UNLOCK_ROLLBACK (4): Tell EC to unlock ROLLBACK on next - reset. -* UPDATE_EXTRA_CMD_INJECT_ENTROPY (5): Inject entropy into the device-specific - unique identifier (takes at least CONFIG_ROLLBACK_SECRET_SIZE=32 bytes of - data). -* UPDATE_EXTRA_CMD_PAIR_CHALLENGE (6): Tell EC to answer a X25519 challenge - for pairing. Takes in a `struct pair_challenge` as data, answers with a - `struct pair_challenge_response`. diff --git a/docs/write_protection.md b/docs/write_protection.md deleted file mode 100644 index 0ce6253a04..0000000000 --- a/docs/write_protection.md +++ /dev/null @@ -1,307 +0,0 @@ -# Firmware Write Protection - -[TOC] - -This is a somewhat tricky topic since write protection implementations can -differ between chips, and the hardware write protection has changed over time, -so please edit or open a bug if something is not clear. - -## Terminology - -## RO and RW - -MCUs running the EC code have read-only (RO) and read-write (RW) firmware. -Coming out of reset, the MCU boots into its RO firmware. - -In the case of the EC, the RO firmware boots the host and asks it to verify a -hash of the RW firmware (software sync). If the RW firmware is invalid, it is -updated from a copy in the host's RW firmware. - -In the case of the FPMCU, the RO firmware uses the public key embedded in it to -validate the signature of the RW firmware. If the RW firmware is invalid it does -not jump to the RW firmware. - -Once the RW firmware is validated, the MCU jumps to it (without rebooting). The -RO firmware is locked in the factory and is never changed. The RW firmware can -be updated later by pushing a new system firmware containing an updated RW -region. - -Note that both the RO and RW firmware regions are normally protected once write -protect has been turned on. - -In the case of the EC, the RW region is unprotected at MCU boot until it has -been verified by the host. The RW region is protected before the Linux kernel is -loaded. - -In the case of the FPMCU, the RW region is protected before jumping the RO -firmware jumps to it. - -## Hardware Write Protect {#hw_wp} - -On modern Chrome OS devices, the Cr50 (aka GSC / TPM) provides a "hardware write -protect" GPIO that is connected to the AP SPI flash, EC SPI flash, EEPROM, and -FPMCU via a [GPIO][write_protect_gpio]. This "hardware write protect" can only -be disabled with [Servo] or [SuzyQ](["CCD open"]) and corresponds to -[`OverrideWP`] in ccd. Disabling this write protect disables it for everything -connected to this signal. - -In the case of the FPMCU, the hardware write protect GPIO is tied to the STM32 -`BOOT0` pin, which is what tells the MCU to enter the STM32 bootloader mode. - -You may see various references to a -[write protect screw in documentation][wp_screw]. Older Chrome OS devices had a -write protect screw that had to be physically removed. More details on this -history can be found here: http://go/cros-wp-status. - -Another way of disabling hardware write protection is to remove the battery; -this method is mainly used during bringup. - -Additional reference: -https://chromium.googlesource.com/chromiumos/docs/+/HEAD/write_protection.md - -## Changing Hardware Write Protection - -Modifying the state of hardware write protection (via Cr50 GPIO) can be done if -the ["CCD open"] process has been completed. - -<!-- mdformat off(b/139308852) --> -*** note -`servod` *must* be running for `dut-control` to work. See the [Servo] page for -details. -*** -<!-- mdformat on --> - -### Enable Hardware Write Protection - -```bash -(chroot)$ dut-control fw_wp_state:force_on -``` - -### Disable Hardware Write Protection - -```bash -(chroot)$ dut-control fw_wp_state:force_off -``` - -### Enable/Disable Hardware Write Protection via Cr50 Console - -You can use the following commands from the [Cr50 console]: - -```bash -wp disable -``` - -```bash -wp enable -``` - -```bash -wp follow_batt_pres -``` - -## Software Write Protect - -Software-based write protect state stored in non-volatile memory. If hardware -write protect is enabled, software write protect can be enabled but can’t be -disabled. If hardware write protect is disabled, software write protect can be -enabled or disabled (note that some implementations require an EC reset to -disable software write protect). - -The underlying mechanism implementing software write protect may differ between -EC chips. However, the common requirements are that software write protect can -only be disabled when hardware write protect is off and that the RO firmware -must be protected before jumping to RW firmware if protection is enabled. - -Additional reference: -https://www.google.com/chromeos/partner/fe/docs/cpfe/firmwaretestmanual.html#software-write-protect - -## Changing Software Write Protection - -<!-- mdformat off(b/139308852) --> -*** note -*NOTE*: You cannot disable software write protect if hardware write protect is -enabled. -*** -<!-- mdformat on --> - -Software write protection can be toggled with `ectool --name=cros_fp -flashprotect enable/disable`, which sends the `EC_CMD_FLASH_PROTECT` command -toggling `EC_FLASH_PROTECT_RO_AT_BOOT` (changing `--name` to target different -ECs). - -### Changing Software Write Protection with ectool - -#### ectool flashprotect - -Print out current flash protection state. - -``` -Flash protect flags: 0x0000000f wp_gpio_asserted ro_at_boot ro_now all_now -Valid flags: 0x0000003f wp_gpio_asserted ro_at_boot ro_now all_now STUCK INCONSISTENT -Writable flags: 0x00000000 -``` - -`Flash protect flags` - Current flags that are set. - -`Valid flags` - All the options for flash protection. - -`Writable flags` - The flags that currently can be changed. (In this case, no -flags can be changed). - -Flags: - -* `wp_gpio_asserted` - Whether the hardware write protect GPIO is currently - asserted (read only). - -* `ro_at_boot` - Whether the EC will write protect the RO firmware on the next - boot of the EC. - -* `ro_now` - Protect the read-only portion of flash immediately. Requires - hardware WP be enabled. - -* `all_now` - Protect the entire flash (including RW) immediately. Requires - hardware WP be enabled. - -* `STUCK` - Flash protection settings have been fused and can’t be cleared - (should not happen during normal operation. Read only.) - -* `INCONSISTENT` - One or more banks of flash is not protected when it should - be (should not happen during normal operation. Read only.). - -#### ectool flashprotect enable - -Set `ro_at_boot` flag. The next time the EC is reset it will protect the flash. -Note that this requires a cold reset. - -#### ectool flashprotect enable now - -Set `ro_at_boot` `ro_now all_now` flags and immediately protect the flash. Note -that this will fail if hardware write protect is disabled. - -#### ectool flashprotect disable - -Clear `ro_at_boot` flag. This can only be cleared if the EC booted without -hardware write protect enabled. - -Note that you must reset the EC to clear write protect after removing the screw. -If the `ro_at_boot` flag set, and the EC resets with the HW gpio disabled, the -EC will leave the flash unprotected (`ro_now` and `all_now` flags are not set) -but leave `ro_at_boot` flag set. - -### Changing Software Write Protection with flashrom - -#### View the current state of software write protection - -```bash -(chroot) $ flashrom -p ec --wp-status -``` - -``` -WP: status: 0x00 -WP: status.srp0: 0 -WP: write protect is disabled. -WP: write protect range: start=0x00000000, len=0x00000000 -``` - -#### Enable software write protection - -This is immediate. The protection range indicates the RO region of the firmware. - -```bash -(chroot) $ flashrom -p ec --wp-enable -``` - -``` -SUCCESS -``` - -```bash -(chroot) $ flashrom -p ec --wp-status -``` - -``` -WP: status: 0x80 -WP: status.srp0: 1 -WP: write protect is enabled. -WP: write protect range: start=0x00000000, len=0x0001f800 -``` - -#### Disable software write protection - -Disable can only be done with hardware write protect disabled. - -```bash -(chroot) $ flashrom -p ec --wp-disable -``` - -``` -FAILED: RO_AT_BOOT is not clear. -FAILED -``` - -Reboot with [hardware write protection](#hw_wp) disabled. Note that protection -is still enabled, but the protection range is zero. - -```bash -(chroot) $ flashrom -p ec --wp-status -``` - -``` -WP: status: 0x80 -WP: status.srp0: 1 -WP: write protect is enabled. -WP: write protect range: start=0x00000000, len=0x00000000 -``` - -```bash -(chroot) $ flashrom -p ec --wp-disable -``` - -``` -SUCCESS -``` - -## system_is_locked() - -The [`system_is_locked()`] function in the EC code returns false if the HW write -protect GPIO is disabled, or the read-only firmware is not protected. - -One way this is used in the FPMCU source is to compile test or debug -functionality into the firmware. Guarding the test functionality with -`system_is_locked` allows us to execute the test code in automated testing by -disabling the hardware write protection; this means we can run the automated -tests against the exact same firmware we ship, rather than a different version -that has test functionality compiled in or out. - -## RDP1 {#rdp1} - -Stands for Readout Protection Level 1. - -Protects user flash memory against a debugger (JTAG/SWD) or potential malicious -code stored in RAM by disabling access (a bus error is generated when read -access is requested). Otherwise (no debugger connected and no boot in RAM set), -all read/program/erase operations from/to flash are allowed. - -When switching to a lower level of RDP (i.e., setting to 0), the user flash -memory is mass erased (set to all `0xFF`). - -Note that this completely destroys *all* of the firmware, including the RO -section. - -### Additional References - -https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1222094 - -## EC Flash Read/Write Command Write Protection Checks - -The EC code command handlers (`command_flash_erase`, `command_flash_write`, -etc.) return an error if `EC_FLASH_PROTECT_ALL_NOW` is set. - -["CCD open"]: https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md#Open-CCD -[Cr50 console]: https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md#Consoles -[Servo]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/README.md -[`OverrideWP`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging_cr50.md -[`system_is_locked()`]: https://chromium.googlesource.com/chromiumos/platform/ec/+/aaba1d5efd51082d143ce2ac64e6caf9cb14d5e5/common/system.c#195 -[wp_screw]: https://www.chromium.org/chromium-os/firmware-porting-guide/firmware-ec-write-protection -[write_protect_gpio]: https://chromium.googlesource.com/chromiumos/platform/ec/+/aaba1d5efd51082d143ce2ac64e6caf9cb14d5e5/include/ec_commands.h#1599 -[SuzyQ]: https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/HEAD/docs/ccd.md#SuzyQ-SuzyQable diff --git a/docs/zephyr_build.md b/docs/zephyr_build.md deleted file mode 100644 index 5a3c809724..0000000000 --- a/docs/zephyr_build.md +++ /dev/null @@ -1,164 +0,0 @@ -# Building Zephyr OS - -[TOC] - -Chromium OS EC uses the `zmake` tool to build Zephyr. - -This section describes how to build and use zmake. - -## Syncing the source - -N.B. The Zephyr build relies on multiple repos and tools which get installed as -packages into the chroot. This means that partial syncs are not supported -(i.e. just doing `repo sync .` in platform/ec). You must run -`~/trunk/src/scripts/update_chroot` frequently, ideally each time you do a full -repo sync. This will update zmake and the repos in src/third_party/zephyr - - -## Working inside the chroot - -### Install zmake - -The `zephyr-build-tools` ebuild builds and installed zmake. This should happen -automatically, with the caveat above. - -To do this manually and run tests: - -```bash -FEATURE=test sudo -E emerge zephyr-build-tools -``` - - -### Building - -You can build zephyr with: - -```bash -emerge-volteer chromeos-zephyr -``` - -For local development you can run zmake directly; see instruction below. - -## Working outside the chroot - -Running outside the Chromium OS chroot is useful for upstream work and for -those using the EC outside the Chromium OS. - - -### Remove west, if installed [b/184654974](http://b/184654974) - -Zephyr's Cmake system will try to attach itself to the west tool if it finds it -installed, conflicting with manual cmake invocations. If you installed west, -you'll need to remove it: - -```bash -python3 -m pip uninstall west -``` - - -### Install zmake - -You can install zmake with pip: - -```bash -cd ~/chromiumos/src/platform/ec -python3 -m pip install -e zephyr/zmake --user -``` - -Ensure that ~/.local/bin in on your PATH - -You may also need to install these items: - -```bash -sudo apt-get install cmake ninja-build python3-pyelftools gcc-multilib \ - python3-pykwalify python3-colorama python3-testfixtures -``` - -You must reinstall zmake after any `repo sync` since new features may have been -added that are needed by the build. - - -### Install binman - -First build pylibfdt: - -```bash -cd somewhere -sudo apt-get install flex bison swig -git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git -cd dtc -make -make install PREFIX=~/.local # You can install this where it suits -``` - -If you have a Chromium OS checkout then you should do: - -```bash -cd ~/.local/bin -ln -s ~/chromiumos/src/third_party/u-boot/files/tools/binman/binman -``` - -otherwise: - -```bash -cd somewhere -git clone https://source.denx.de/u-boot/u-boot.git -cd ~/.local/bin -ln -s somewhere/u-boot/tools/binman/binman -``` - -As above, ensure that `~/.local/bin` in on your PATH - - -### Building - -You can use `zmake help` to obtain help on how to use zmake. The following is -a rough guide. - -First configure the build with the project you want: - -```bash -# Use -t zephyr when running outside chroot - -zmake configure -B /tmp/z/vol zephyr/projects/volteer/volteer/ -t zephyr -``` - -If you are building for posix-ec, change the default toolchain to host to make -it use the native system one instead of llvm. Make sure to start with a clean -build directory if zmake returns any build error: - -```bash -zmake configure -B /tmp/posix zephyr/projects/posix-ec -t host -``` - -Then build with just the target directory: - -``` -zmake build /tmp/z/vol -``` - -The output is in that directory: - -* `output/zephyr.bin` - output binary (read-only and read-write packed - together) -* `output/zephyr.ro.elf` - read-only ELF for debugging -* `output/zephyr.rw.elf` - read-write ELF for debugging - -You might also find these files useful (using read-only as an example): - -* `build-ro/zephyr/.config` - Kconfig options selected -* `build-ro/zephyr/include/generated/devicetree_unfixed.h` - the (large) - header file that zephyr uses to provide devicetree information to the C code -* `build-ro/zephyr/zephyr.dts` - devicetree that is used -* `build-ro/zephyr/zephyr.dts` - map of image - - -### Looking at the Kconfig - -It should be possible to do this with: - -```bash -ninja -C /tmp/z/vol/build-ro menuconfig -``` - -However at present this does not work [b/184662866](http://b/184662866). diff --git a/docs/zephyr_init.md b/docs/zephyr_init.md deleted file mode 100644 index 8822736efb..0000000000 --- a/docs/zephyr_init.md +++ /dev/null @@ -1,53 +0,0 @@ -# Zephyr OS-based EC Initialization Order - -Zephyr provides Z_INIT_ENTRY_DEFINE() & the extend macro to install the initial -function. The initialize flow for different levels would be like the following -(not very detailed): -* architecture-specific initialization -* `PRE_KERNEL_1` level -* `PRE_KERNEL_2` level -* `POST_KERNEL` level -* `APPLICATION` level -* main() - -The kernel and driver initial functions separate into specific initialize -levels. It couldn't put all initial functions in main() for the Zephyr OS-based -EC. It is also hard to maintain those initial priority which separates into -different files. - -This file defines some Zephyr OS-based EC initial priorities which have critical -sequence requirement for initializing: - -## PRE_KERNEL_1 -* Priority (0-9) - Reserved for system testability: - - The highest priority could be used in zephyr. Don't use it when system - development. Buffer it for the following system development & testing. - -* Priority (10-19) - Chip level system pre-initialization: - - These priorities in this range are used for critical chip initialization, - including determining the reset cause and initializing the battery-backed - RAM driver. Most chip drivers should only be initialized after - `PLATFORM_EC_SYSTEM_PRE_INIT`. - -* Priority (20) - PLATFORM_EC_SYSTEM_PRE_INIT: - - At this initialization priority, the CROS system checks the reset cause and - initializing the system reset flags. Any chip level drivers related to - determining the reset type must be at a higher priority. - -* TODO - -## PRE_KERNEL_2 -* TODO - -## POST_KERNEL -* TODO - -## APPLICATION -* TODO - -## main() -* TODO -* Start the tasks. diff --git a/docs/zephyr_poc_device_bringup.md b/docs/zephyr_poc_device_bringup.md deleted file mode 100644 index 394aa4a05b..0000000000 --- a/docs/zephyr_poc_device_bringup.md +++ /dev/null @@ -1,52 +0,0 @@ -# Zephyr Proof-of-Concept-Device Bringup - -It may be useful to build a Zephyr OS-based EC for a device which -already has a CrOS EC device build, for the purposes of demonstrating -the feasibility of Zephyr OS. - -This document is a work-in-progress list of tricks & tools that may be -useful to you. - -## Initial Bringup - -Initially, you'll want to get a basic UART functioning with nothing -but a shell and some basic console commands. - -An example CL to do this for Lazor can be found -[here](https://crrev.com/c/2749765). - -## Bringing up GPIOs - -After you have UART functioning, GPIOs can be an easy target to start -unblocking further features. - -We have a very ugly program to auto-generate the GPIO DTS based on -gpio.inc for the existing board. You can find it at -`util/gpios_to_zephyr_dts.c`, and instructions are in the file on how -to compile and use it. You may have to hand-modify the output. - -The resultant CL for Lazor can be found [here](https://crrev.com/c/2749768). - -## Bring up Host Commands - -Set `CONFIG_PLATFORM_EC_HOSTCMD=y` and enable the appropriate -host-command interface for your platform (e.g., eSPI). - -An example CL for Lazor can be found [here](https://crrev.com/c/2749428). - -As long as you get this compiling that should be enough to move to the -next step. Further testing of the host command layer will require -power sequencing up and going. - -## Enabling some simple GPIO-based buttons and switches - -Next, you can: - -* [Add the lid switch](https://crrev.com/c/2749768) -* [Add the power button](https://crrev.com/c/2749426) -* [Add AC presence detection](https://crrev.com/c/2749428) - -## Power Sequencing - -TODO(jrosenth): add steps on enabling power sequencing and expand this -document. diff --git a/docs/zephyr_shim.md b/docs/zephyr_shim.md deleted file mode 100644 index fac0383aff..0000000000 --- a/docs/zephyr_shim.md +++ /dev/null @@ -1,381 +0,0 @@ -[TOC] - -# Zephyr Shimming How-To - -## Objective - -Allow a subset of the platform/ec code to be built as part of the Zephyr-based -EC without needing to land code into upstream zephyr, or our zephyr-chrome -repository. - -## Background - -Now that Google has joined [Zephyr OS](https://www.zephyrproject.org/), the EC -team is moving toward it instead of platform/ec code on embedded controllers for -future Chrome OS devices. See the -[originally proposed idea](https://goto.google.com/cros-ec-rtos) and a more -specific [Zephyr process doc](https://goto.google.com/zephyr-structure) of what -future development on Zephyr will look like. - -Simply put, we want to move to Zephyr OS to use an open-source embedded OS that -has a vibrant community. The embedded OS scene for the industry is very -fragmented, with various parties using their own custom solution. We see the -strong open-source community at Zephyr as potentially helping to consolidate -efforts in the embedded controller space. It will also benefit our partners -(both chip vendors and OEMs) since they should only have to support one embedded -OS (i.e., Zephyr) for both their Chrome OS and Windows based devices. - -Migrating to use Zephyr fully is going to take a few years. We do not want to -diverge from the active development happening on platform/ec code. We -potentially want to ship a product using Zephyr before the migration is -complete. - -## Design ideas - -In order to reuse `platform/ec` development , we shim "active" `platform/ec` -code as a -[Zephyr Module](https://docs.zephyrproject.org/latest/guides/modules.html). This -requires us to add some Zephyr specific code in a `zephyr` directory in the -`platform/ec` codebase. Once we release a Zephyr-based EC, then we can turn down -platform/ec for future development and work on migrating the platform/ec-module -code out of the module directory and into a first-class Zephyr code format -- in -the local -[Chrome Zephyr repo](https://chromium.googlesource.com/chromiumos/platform/zephyr-chrome/+/HEAD) -and ultimately [upstream](https://github.com/zephyrproject-rtos/zephyr). - -For platform/ec code that is stable and not under active development, the Zephyr -team may port that code to Zephyr, thus skipping the shimming process. - -### Subsystems of interest - -#### With Shim - -We shim the following subsystems (non-exhaustive). - -* USB-C: TCPC, PPC, MUX, TCPMv2 -* Charge Manager -* SoC Power Sequencing -* Sensors, if Intel’s HID-based solution is delayed in getting to Zephyr - upstream - -#### Little-to-No Shim - -We adopt upstream Zephyr or skip the shimming process (non-exhaustive). - -* CBI and dependent EEPROM code - * The format is stable. We pull in the list of CBI tags from platform/ec - though -* EFS2, Vboot, RO/RW split - * Adjusting flash layout would be difficult to shim, and the concept is - very stable. - * We may shim some core EFS2 logic -* Host command framework -* Sensors, if Intel’s HID-based solution getts to Zephyr upstream and passes - CTS -* Keyboard and keycode scanning support - * We may shim the newer Vivaldi feature. -* Console support - * We allow individual console commands via DECLARE\_CONSOLE\_COMMAND to be - shimmed to Zephyr. These convert commands to work with Zephyr's shell - subsystem. -* I2C - -### New content in platform/ec - -Add the `src/platform/ec/zephyr` folder with: - -* [Module integration files](https://docs.zephyrproject.org/latest/guides/modules.html#build-system-integration), - e.g., module.yml, CMakeLists.txt, and KConfig. - * **module.yml** is the required entry point (must be located at - _zephyr/module.yml_ in the repository) for Zephyr modules, and declares - the location of Kconfig and CMakeLists.txt files used by the Zephyr - build system. - * **CMakeLists.txt** replicates build logic for the files being shimmed, - outside of the platform/ec Makefile. - * **Kconfig** will declare any CONFIG\_\* options which are important to - expose from platform/ec code to the Zephyr build. -* Shim code to translate platform/ec code into Zephyr code - * For example, redefine platform/ec’s - [`DECLARE_HOST_COMMAND`](https://source.chromium.org/chromiumos/chromiumos/codesearch/+/HEAD:src/platform/ec/include/host_command.h;l=256;drc=514923bc59f5a3435dbb7cbf348735ed41889ffe) - to map to Zephyr's upstream - [`EC_HOST_CMD_HANDLER`](https://github.com/zephyrproject-rtos/zephyr/blob/d7468bf836b75c29980441f294a61eae6bf4bc75/include/ec_host_cmd.h#L73) - macro. This allows us to compile select platform/ec files in the Zephyr - build. - -### Namespace Collisions - -One significant issue of mixing Zephyr headers with our existing EC code is that -we currently have many names colliding with the Zephyr code. For example, -Zephyr's atomic functions also are named `atomic_add`, `atomic_or`, ..., -however, have a different API from our EC's atomic functions. This is critical, -since atomic operations are often used in `static inline` functions placed in -header files. - -In some cases, we are able to hack around these collisions by creating macros -and functions which are compatible with both Zephyr and our EC's usages. For -example, we can create a modified `IS_ENABLED` which accepts both defined to -nothing usages (CrOS EC `config.h` style), and defined to `1` usages (Zephyr -Kconfig style). - -However, long term, we may find this to be a continual cause of issues, and -creating hacks for every colliding macro or function may be unsustainable. We -propose _gradually_ introducing a namespace prefix to the `platform/ec` -codebase, for example `crec_`. We can begin at the critical areas of namespace -collision (e.g., atomics) and continue to improve the naming convention with -time. - -### New CQ check - -As long as code from platform/ec is part of the zephyr -[ebuild](http://cs/chromeos_public/src/third_party/chromiumos-overlay/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-9999.ebuild), -then we need to run the Zephyr CQ checks on any platform/ec CLs in addition to -the normal platform/ec CQ checks. This ensures that platform/ec changes aren’t -breaking the Zephyr builds and requiring the Zephyr team to debug recent -changes. - -For local builds, we can run `emerge-betty chromeos-zephyr-2_3` or `zmake` -utility to check that an EC CL has not broken anything on the Zephyr side. - -We will work with the CI team to enable this. - -## How to shim features - -Before you get started shimming a feature, it's important to -understand the general philosophies behind Zephyr OS and shimming: - -* Our current EC's OS isn't going away any time soon. Even after we - ship our first device with a Zephyr-based EC, we may still be working on - other projects using the old OS. It's important to consider how - your feature will apply to both the Zephyr world and CrOS EC OS - world. - -* We won't be converting old devices to use Zephyr-based firmware. - This means that our existing OS and its code will need maintained - for bug and security fixes for years to come. **Do not allow the - code you write for the CrOS EC OS to lack in quality or be "throw - away code" as it will need to be maintained for a long time.** - -* Shimming, by the very nature of the design, will lead to some ugly - hacks. We try and avoid this when we can, but some of them may be - completely unavoidable. This means we need to actively work against - nature to keep the code clean. If we do things right, there's even - a possibility that we leave things cleaner than we found them. - -* Shimming occasionally digs up landmines. Be prepared to step on - them. 💣 - -### What code can be shimmed? - -Code in the `common/` directory (and other common code directories, -like `power/`) is the ideal target for shimming, with the exception of -core OS features which have Zephyr OS equivalents. - -Code in the following directories should **never be shimmed**: - -- `core/`: this directory contains architecture-specific code which - should have a Zephyr OS equivalent feature. - -- `chip/`: this directory contains chip-specific code, and similarly - should have a Zephyr OS equivalent feature. - -In both cases, you should instead determine (or, in rare cases, -implement upstream) the equivalent Zephyr OS feature, and *implement -an architecture and chip agnostic* "shim layer" in the `zephyr/shim/` -directory which translates the APIs as necessary. - -As of the time of this document, the shim layer is nearing 100% -complete, and it should be rare that you encounter an API which needs -translation. - -Finally, code in the following directories should **avoid being -shimmed, if possible**: - -- `board/`: this directory contains variant-specific code. - -- `baseboard/`: this directory contains baseboard-specific code. - -In both cases, the only value in shimming in code from one of those -directories would be to enable a Zephyr OS build for a device which -already has CrOS EC OS support, as *Zephyr-only projects will not have -these directories*. You should be thinking about how this would be -implemented for a Zephyr-only project, and filing bugs to create the -appropriate device-tree and Kconfig equivalents before shimming this -code. - -See [Zephyr PoC device bringup](zephyr_poc_device_bringup.md) for more -information about bringing up proof-of-concept devices. - -### Configuration - -CrOS EC OS uses a special header `config.h`, which sets configuration -defaults, and includes board and chip specific configurations by -expecting the headers `board.h` and `config_chip.h` to be present. -Most of these configuration options start with `CONFIG_`, however the -rules were loosely defined over the years. - -Zephyr OS, on the other hand, uses two different configuration -systems: - -* Kconfig, the configuration system from the Linux Kernel, which - fits well within the domain of preprocessor definitions in C. The - schema for our Kconfig files can be found under `zephyr/Kconfig`, - and project-specific configurations are made in `prj.conf` files. - - Kconfig is generally used to select which EC software features are - enabled, and should be avoided for hardware configurations, such as - chip configuration registers and their default settings. - -* Open Firmware Device Tree, which you may also be familiar with from - the Linux kernel. This configuration can be found in `*.dts` files. - - Device-tree is generally used for hardware configurations, and - should be avoided for EC software feature configuration. - -For code which is shimmed, we need to play nicely with both the CrOS -EC OS configuration system, and Zephyr's configuration systems. Thus, -we follow the following pattern: - -* EC software features are configured using `Kconfig` and - `zephyr/shim/include/config_chip.h` translates them into the - appropriate CrOS EC OS configurations using patterns such as below: - - ```c - #undef CONFIG_CMD_GETTIME - #ifdef CONFIG_PLATFORM_EC_TIMER_CMD_GETTIME - #define CONFIG_CMD_GETTIME - #endif - ``` - - The preprocessor code should follow that template exactly, and not - use any nesting (Kconfig handles dependencies, there is no reason to - do it again in the preprocessor code). - -* **The domain of Kconfig options and CrOS EC configuration names - should be completely distinct.** This is because the Kconfig options - are included automatically, and including `config.h` may undefine - them. To mitigate this, we follow a convention of using - `CONFIG_PLATFORM_EC_` as the prefix for EC software features in - Kconfig. - -One special configuration option exists, `CONFIG_ZEPHYR`, which you -can use to detect whether the OS is Zephyr OS. This is the -conventional way to add Zephyr-specific (or excluded) code in CrOS EC -code. - -The typical EC macros for reducing `#ifdef` messes (e.g., -`IS_ENABLED`, `STATIC_IF`, etc.) work with both CrOS EC OS and Kconfig -options, and should be used when possible. - -### Header Files - -Besides the include paths provided by Zephyr OS, the following paths -are additionally added for shimmed code: - -* `include/` -* `zephyr/include/` -* `zephyr/shim/include/` - -The names of headers in these directories should be completely -distinct. C compilers have no mechanism for "include ordering", and -there is no way to "override a header". - -If you feel the need to "override" a header, say `foo.h` in -`include/`, the best way to do this is to give it a different name -under `zephyr/shim/include` (e.g., `zephyr_foo_shim.h`), and include -that in the `foo.h` header with a `#ifdef CONFIG_ZEPHYR` guard. - -The typical styling convention for includes (following existing -conventions in `platform/ec` and other C codebases we have) is: - -* Zephyr OS headers in pointy brackets, in alphabetical order. - -* One blank line - -* CrOS EC OS headers (either from `include/`, `zephyr/shim/include/`, - or the current directory), in quotes (not pointy brackets). - -### Adding files to Cmake - -Zephyr's build system (including shimmed code) uses CMake instead of -`Makefiles`, and your code will not be compiled for Zephyr unless you -list the files in `zephyr/CMakeLists.txt`. - -### Step-by-step guide to adding a Kconfig - -Follow these steps: - -1. Make sure you have read the above Configuration section - -2. Add your config to one of zephyr/Kconfig* files. Note the PLATFORM_EC_ prefix - and try to put it near related things: - - ```kconfig - config PLATFORM_EC_CHARGER_BQ25720 - bool "TI BQ25720 charger" - help - The TI BQ25720 is a blah blah (describe summary from datasheet, - at least 3 lines so take 10 minutes to write something truly useful) - ``` - - Consider a `depends on PLATFORM_EC_...` line if it depends on an existing - feature. - -3. Add to zephyr/shim/include/config_chip.h (put it at the bottom): - - ```kconfig - #undef CONFIG_CHARGER_BQ25720 - #ifdef CONFIG_PLATFORM_EC_CHARGER_BQ25720 - #define CONFIG_CHARGER_BQ25720 - #endif - ``` - -4. Add the source file to zephyr/CMakeLists.txt if it is not already there. For - ordering check the comments in that file: - - `zephyr_sources_ifdef(CONFIG_PLATFORM_EC_CHARGER_BQ25720 - "${PLATFORM_EC}/driver/charger/bq25720.c")` - -5. Run a build on a board that enables the new CONFIG (in config.h) to make sure - there are no problems. - -6. If it doesn't work, please email zephyr-task-force@ or file a bug and assign - it to sjg@, cc zephyr-task-force@ (please include CL link and the error - output). - -### Unit Tests - -Unit tests, implemented using the Ztest framework, can be found in -`zephyr/test`. - -To run all unit tests, you use `zmake testall`. - -## Alternatives Considered - -### Translate code and mirror into the zephyr-chrome repository - -We could potentially write a script which, via a series of find/replace -operations, translates a platform/ec module to use Zephyr functions, macros, and -paradigms. On a frequent basis, we would translate all modules of interest in -the platform/ec repository and land an "uprev" change in the zephyr-chrome -repository. - -The main disadvantage of this technique is that we can't get any CQ coverage -when platform/ec CLs land that the modules will continue to work in Zephyr. -Additionally, the translator script would be delicate and probably require -frequent maintenance. - -However, this technique does have some benefits. With modules directly -translated to code in the Zephyr paradigm, the process of upstreaming a shimmed -module to ZephyrOS would be significantly easier. Additionally, it would require -no shim code in platform/ec. - -### Don't do any code sharing - -One option is to avoid shimming in any platform/ec code and allow the Zephyr -team to re-implement features in upstream zephyr, or our local zephyr-chrome -repository. - -Disregarding the infeasible amount of work required to complete this option, the -platform/ec repository has a far faster development pace as there are many more -contributors, and the Zephyr features would quickly lose parity during the time -frame that we are launching both Zephyr-based and platform/ec-based devices. diff --git a/docs/ztest.md b/docs/ztest.md deleted file mode 100644 index 021b3391bd..0000000000 --- a/docs/ztest.md +++ /dev/null @@ -1,200 +0,0 @@ -# Porting EC unit tests to Ztest - -[TOC] - -This HOWTO shows the process for porting the EC's `base32` unit test to Zephyr's -Ztest framework. All of the work is done in `src/platform/ec`. - -See -[Test Framework - Zephyr Project Documentation](https://docs.zephyrproject.org/1.12.0/subsystems/test/ztest.html#quick-start-unit-testing) -for details about Zephyr's Ztest framework. - -For examples of porting an EC unit test to the Ztest API, see: * -[base32](https://crrev.com/c/2492527) and -[improvements](https://crrev.com/c/2634401) * -[accel_cal](https://crrev.com/c/2645198) - -## Porting Considerations - -Not every EC unit test can be ported to Ztest. This section describes cases that -are not supported and cases where caveats apply. - -### EC Mocks Are Not Supported - -If a test has a `$TEST.mocklist` file associated with the unit test, it is using -the EC mocking framework, which is unsupported in the Ztest framework. Ztest has -its own mocking framework which the EC does not support. - -### Multiple Task Caveats - -The EC unit test framework starts a single task to call `run_test`, and this -task will then call the functions for the various test cases. Some unit tests -have multiple threads of execution, which is enabled by a `$TEST.tasklist` file -associated with the unit test. The test runner task has a task ID of -`TASK_ID_TEST_RUNNER`, which can be used as an argument to any of the task -functions. See for example the -[`charge_ramp` unit test](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/test/charge_ramp.c#81) -and the -[`host_command` unit test](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/test/host_command.c#32) - -When a unit test is ported to Ztest, `test_main` doesn't have a thread ID, so -`TASK_ID_TEST_RUNNER` is undefined. `charge_ramp` and `host_command` cannot be -ported at this time. `test_main` also cannot call any of the task functions that -must be called from a task, such as `task_wake`; these functions can pend the -calling task, but since `test_main` doesn't have a thread ID, the pend will -fail. See the -[`mutex` unit test](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/test/mutex.c#116) -for an example. - -## Determine source files being tested - -Determine which C files the unit test requires by finding the test in -`test/test_config.h`: - -``` -#ifdef TEST_BASE32 -#define CONFIG_BASE32 -#endif -``` - -Locate the `CONFIG` item(s) in `common/build.mk`: - -``` -common-$(CONFIG_BASE32)+=base32.o -``` - -So for the `base32` test, we only need to shim `common/base32.c`. - -Add the C files to `zephyr/shim/CMakeLists.txt`, in the "Shimmed modules" -section: - -``` -# Shimmed modules -zephyr_sources_ifdef(CONFIG_PLATFORM_EC "${PLATFORM_EC}/common/base32.c") -``` - -Refer to [zephyr: shim in base32.c](https://crrev.com/c/2468631). - -## Create test directory - -Create a new directory for the unit test in `zephyr/test/base32`. - -Create `zephyr/test/base32/prj.conf` with these contents: - -``` -CONFIG_ZTEST=y -CONFIG_PLATFORM_EC=y -``` - -Create `zephyr/test/base32/CMakeLists.txt` with these contents: - -``` -target_sources(app PRIVATE ${PLATFORM_EC}/test/base32.c) -``` - -## Modify test source code - -### Test cases - -In the unit test, replace `run_test` with `TEST_MAIN()`. This will allow both -platform/ec tests and Ztests to share the same entry point. - -Change `RUN_TEST` to `ztest_unit_test` and add the `ztest_test_suite` wrapper -plus the call to `ztest_run_test_suite`. - -```c -/* - * Define the test cases to run. We need to do this twice, once in the format - * that Ztest uses, and again in the format the the EC test framework uses. - * If you add a test to one of them, make sure to add it to the other. - */ -TEST_MAIN() -{ - ztest_test_suite(test_base32_lib, - ztest_unit_test(test_crc5), - ztest_unit_test(test_encode), - ztest_unit_test(test_decode)); - ztest_run_test_suite(test_base32_lib); -} -``` - -Each function that is called by `ztest_unit_test` needs to be declared using -`DECLARE_EC_TEST`. Keep the `return EC_SUCCESS;` at the end of the test -function. Note that for the EC build, `TEST_MAIN` will call `test_reset` before -running the test cases, and `test_print_result` after. - -### Assert macros - -Change the `TEST_ASSERT` macros to `zassert` macros. There are plans to automate -this process, but for now, it's a manual process involving some intelligent -find-and-replace. - -* `TEST_ASSERT(n)` to `zassert_true(n, NULL)` -* `TEST_EQ(a, b, fmt)` to `zassert_equal(a, b, fmt ## ", " ## fmt, a, b)` - * e.g. `TEST_EQ(a, b, "%d")` becomes `zassert_equal(a, b, "%d, %d", a, b)` -* `TEST_NE(a, b, fmt)` to `zassert_not_equal(a, b, fmt ## ", " ## fmt, a, b)` -* `TEST_LT(a, b, fmt)` to `zassert_true(a < b, fmt ## ", " ## fmt, a, b)` -* `TEST_LE(a, b, fmt)` to `zassert_true(a <= b, fmt ## ", " ## fmt, a, b)` -* `TEST_GT(a, b, fmt)` to `zassert_true(a > b, fmt ## ", " ## fmt, a, b)` -* `TEST_GE(a, b, fmt)` tp `zassert_true(a >= b, fmt ## ", " ## fmt, a, b)` -* `TEST_BITS_SET(a, bits)` to `zassert_true(a & (int)bits == (int)bits, "%u, - %u", a & (int)bits, (int)bits)` -* `TEST_BITS_CLEARED(a, bits)` to `zassert_true(a & (int)bits == 0, "%u, 0", a - & (int)bits)` -* `TEST_ASSERT_ARRAY_EQ(s, d, n)` to `zassert_mem_equal(s, d, b, NULL)` -* `TEST_CHECK(n)` to `zassert_true(n, NULL)` -* `TEST_NEAR(a, b, epsilon, fmt)` to `zassert_within(a, b, epsilon, fmt, a)` - * Currently, every usage of `TEST_NEAR` involves floating point values -* `TEST_ASSERT_ABS_LESS(n, t)` to `zassert_true(abs(n) < t, "%d, %d", n, t)` - * Currently, every usage of `TEST_ASSERT_ANS_LESS` involves signed - integers. - -There isn't a good replacement for `TEST_ASSERT_MEMSET(d, c, n)`, but it is only -used in two tests, `printf.c` and `utils.c`. If you need this test, you'll need -to code up a loop over the `n` bytes starting at `d`, and `zassert_equal` that -each byte is equal to `c`. - -Also note that some tests use constructs like `TEST_ASSERT(var == const)`, which -would have been better write as `TEST_EQ(var, const)`. These should be rewritten -to use `zassert_equal`. - -Refer to -[test: Allow EC unit test to use Ztest API](https://crrev.com/c/2492527) for the -changes to the base32.c source code. - -### Tasklist - -For any test that has a corresponding `${TESTNAME}.tasklist`, add the file -`shimmed_test_tasks.h` in the zephyr test directory, and in that file, -`#include` the tasklist file. See [accel_cal](https://crrev.com/c/2645198) for -an example. - -Add `CONFIG_HAS_TEST_TASKS=y` to the `prj.conf` file, as well as the appropriate -`CONFIG_PLATFORM_EC` defines to include or exclude code that the unit under test -uses. - -## Build and run - -Use `zmake` to build and run the test: - -``` -(cr) $ zmake -l DEBUG configure --test -B build/ztest/base32 zephyr/test/base32 -... -UART_0 connected to pseudotty: /dev/pts/1 -*** Booting Zephyr OS build zephyr-v2.4.0-1-g63b2330a85cd *** -Running test suite test_base32_lib -=================================================================== -START - test_crc5 - PASS - test_crc5 -=================================================================== -START - test_encode - PASS - test_encode -=================================================================== -START - test_decode - PASS - test_decode -=================================================================== -Test suite test_base32_lib succeeded -=================================================================== -PROJECT EXECUTION SUCCESSFUL -(cr) $ -``` |