[PATCH v4 0/6] FUSB302 USB-C controller support

Simon Glass sjg at chromium.org
Sun Sep 1 22:09:42 CEST 2024


Hi Sebastian,

On Fri, 30 Aug 2024 at 12:23, Sebastian Reichel
<sebastian.reichel at collabora.com> wrote:
>
> Hi,
>
> On ROCK 5B power is usually supplied via it's USB-C port. This port has the
> data lines connected to RK3588, VBUS connected to the input regulator and
> CC pins connected to FUSB302. FUSB302 is a USB-C controller, which can be
> accessed via I2C from RK3588. The USB-C controller is needed to figure out
> the USB-C cable orientation, but also to do USB PD communication. Thus it
> would be great to enable support for it in the operating system.
>
> But the USB-PD specification requires, that a device reacts to USB-PD messages
> send by the power-supply within around 5 seconds. If that does not happen the
> power-supply assumes, that the device does not support USB-PD. If a device
> later starts sending USB-PD messages it is considered an error, which is solved
> by doing a hard reset. A USB-PD hard reset means, that all supply voltages are
> removed for a short period of time. For boards, which are solely powered
> through their USB-C port, like the Radxa Rock 5B, this results in an machine
> reset. This is currently worked around by not describing the FUSB302 in the
> kernel DT, so nothing will ever speak USB-PD on the Rock 5B. This means
>
> 1. the USB-C port cannot be used at all
> 2. the board will be running via fallback supply, which provides limited
>    power capabilities
>
> In order to avoid the hard reset, this adds FUSB302 support to U-Boot, so
> that we react to the power-supply's queries in time. The code, which is
> originally from the Linux kernel, consists of two parts:
>
> 1. the tcpm state machine, which implements the Type C port manager state
>    machine as described in the USB PD specification
> 2. the fusb302 driver, which knows about specific registers
>
> Especially the first part has been heavily modified compared to the
> kernel, which makes use of multiple delayed works and threads. For this
> I used a priorly ported version from Rockchip, removed their hacks and
> any states not necessary in U-Boot (e.g. audio accessory support).
>
> This version has been tested on Radxa Rock 5B using the open source TF-A
> (patches recently got merged into master branch) using the following power
> supplies:
>
>  * non PD capable (reports 5V 0A)
>  * RavPower 90W (ok)
>  * UGREEN 100W (ok)
>  * Anker 45W (ok)
>  * RavPower PB (hard resets in U-Boot, but succeeds at some point,
>    I still need to investigate)
>
> Changes since PATCHv3:
>  * Rebase to latest master (57949a99b7bd)
>  * Rework autoprobing; tcpm_post_bind tries to check if a probe is needed
>    based on DT properties and then sets the DM_FLAG_PROBE_AFTER_BIND flag.
>    If this accidently increases boot time on some boards they are probably
>    missing a 'self-powered;' flag in their USB-C connector node.
>  * Rock 5B ft_board_setup(): check for CONFIG_TYPEC_FUSB302 instead of
>    CONFIG_MISC_INIT_R to reflect the above change
>  * Drop adding 'CONFIG_MISC_INIT_R' to rock5b-rk3588_defconfig because of
>    the reworked autoprobing
>  * Log an error message if tcpm_send_queued_message() exits early
>  * Add R-b for the rockchip specific changes from Kever Yang
>  * Increase the timeout in tcpm_pd_transmit(), which seems to be the issue
>    Sören Moch ran into. I could not really reproduce it. Please test if this
>    helps with your supply (and share the logs if it does not help). I noticed
>    this version has issues with an old PD capable powerbank I own. I'm still
>    looking into that but wanted to share a new version so that the other
>    changes can get reviewed.
>
> Changes since PATCHv2:
>  * Rebase to latest master (a70d991212c9)
>  * Drop Wang Jie from Cc, since his address bounces
>  * I did not add a test suite. I fully agree, that it would be nice to have
>    one, but it is also a lot of work. Just emulating a FUSB302 is not enough,
>    we also need to emulate the remote USB-PD device to make this useful.
>    Without that we would only test what happens when a non-responsive USB-PD
>    supply is attached and that is the boring, very simple path in this code.
>    On the other hand implementing an emulated USB-C PD remote side more or less
>    requires implementing another big state machine.
>  * Add documentation for the 'tcpm' command (Simon Glass)
>  * I also got asked to add more documentation for the feature in general. I'm
>    not really sure what is needed. At least Tim Harvey managed to use it
>    considering he got stusb4500 working on top of PATCHV2. If there are more
>    specific requests I can write something.
>  * Just like PATCHv1, PATCHv2 received a 'Tested-by: Soeren Moch <smoch at web.de>',
>    which I did not take over. This time the changes are a lot smaller, but
>    the different handling of timeouts might have broken something. (On my end
>    things still behave correctly of course, otherwise I wouldn't have sent
>    this series)
>  * Address feedback from Marek Vasut
>   - TCPM core
>     - drop useless "failure" function
>     - replace printf with log in TCPM command code
>     - invert some conditions to reduce indent
>     - use read_poll_timeout() in tcpm_pd_transmit()
>     - did not add any more 'static' keywords to functions, the non-static
>       TCPM functions are exported and called from the fusb302 driver.
>     - add a safety guard to tcpm_send_queued_message(), which stops
>       the loop if more than 100 messages are send directly after each
>       other. This should never happen anyways, but it's better to exit
>       cleanly if the code runs astray.
>   - FUSB302 driver
>     - Drop default initialization for most local ret variables
>     - Make some local variables constant
>     - Make set_polarity callback optional on the uclass level and drop the
>       empty FUSB302 implementation
>     - Change buffer initialization in send message function
>     - Create define for max. message length magic value
>   - Rock 5B board code
>     - Add comment why misc_init_r explicitly initializes PD
>     - Split defconfig and DT into separate patches (Kever Yang)
>
> Changes since PATCHv1:
>  * tcpm: split uclass specific code to tcpm-uclass
>  * tcpm_print_info: move printing part to cmd/tcpm.c
>  * tcpm_print_info: report more information
>    - PD revision
>    - Cable orientation
>    - Power role
>    - Data role
>    - Print TCPM state based on connection status
>  * tcpm: use "struct udevice *dev" instead of "struct tcpm_port *port"
>    as function argument in most places and drop dev from the tcpm_port
>    struct
>  * tcpm: avoid useless kzalloc + copy + free for incoming events
>  * tcpm: use dev_get_uclass_plat() for tcpm_port
>  * tcpm: run tcpm_port_init() and tcpm_poll_event() from UCLASS post_probe()
>  * tcpm/fusb302: get rid of tcpc_dev by using dm_tcpm_ops() for the
>    function pointers and introducing get_connector_node() for the
>    ofnode
>  * fusb302: use "struct udevice *dev" instead of "struct fusb302_chip *chip"
>    as function argument and drop dev from the fusb302_chip struct
>  * fusb302: drop multiple unused members from fusb302_chip
>  * fusb302: directly use udelay instead of usleep_range define
>  * fusb302: use fusb302_ prefix for all functions. Afterwards tcpm_ prefix
>    is only used for the tcpm code itself
>  * fusb302: move fusb302_poll_event() to avoid forward defintion
>  * fusb302: drop probe function
>  * fusb302: drop unused LOG_BUFFER defines
>  * roughly 20% of all lines of the series changed between v1 and v2, so
>    I did not collect the Tested-by from Soeren Moch
>
> Greetings,
>
> -- Sebastian
>
> Sebastian Reichel (6):
>   usb: tcpm: add core framework
>   usb: tcpm: fusb302: add driver
>   board: rock5b-rk3588: enable USB-C in operating system
>   rockchip: rk3588-rock-5b: Add USB-C controller to u-boot.dtsi
>   rockchip: rock5b-rk3588: Enable USB-C PD support
>   MAINTAINERS: add TCPM section
>
>  MAINTAINERS                               |    9 +
>  Makefile                                  |    1 +
>  arch/arm/dts/rk3588-rock-5b-u-boot.dtsi   |   28 +
>  board/radxa/rock5b-rk3588/Makefile        |    6 +
>  board/radxa/rock5b-rk3588/rock5b-rk3588.c |   16 +
>  cmd/Kconfig                               |    7 +
>  cmd/Makefile                              |    1 +
>  cmd/tcpm.c                                |  136 ++
>  configs/rock5b-rk3588_defconfig           |    4 +
>  doc/usage/cmd/tcpm.rst                    |   66 +
>  doc/usage/index.rst                       |    1 +
>  drivers/usb/Kconfig                       |    2 +
>  drivers/usb/tcpm/Kconfig                  |   16 +
>  drivers/usb/tcpm/Makefile                 |    4 +
>  drivers/usb/tcpm/fusb302.c                | 1322 ++++++++++++
>  drivers/usb/tcpm/fusb302_reg.h            |  177 ++
>  drivers/usb/tcpm/tcpm-internal.h          |  173 ++
>  drivers/usb/tcpm/tcpm-uclass.c            |  145 ++
>  drivers/usb/tcpm/tcpm.c                   | 2289 +++++++++++++++++++++
>  include/dm/uclass-id.h                    |    1 +
>  include/usb/pd.h                          |  516 +++++
>  include/usb/tcpm.h                        |   99 +
>  22 files changed, 5019 insertions(+)
>  create mode 100644 board/radxa/rock5b-rk3588/Makefile
>  create mode 100644 board/radxa/rock5b-rk3588/rock5b-rk3588.c
>  create mode 100644 cmd/tcpm.c
>  create mode 100644 doc/usage/cmd/tcpm.rst
>  create mode 100644 drivers/usb/tcpm/Kconfig
>  create mode 100644 drivers/usb/tcpm/Makefile
>  create mode 100644 drivers/usb/tcpm/fusb302.c
>  create mode 100644 drivers/usb/tcpm/fusb302_reg.h
>  create mode 100644 drivers/usb/tcpm/tcpm-internal.h
>  create mode 100644 drivers/usb/tcpm/tcpm-uclass.c
>  create mode 100644 drivers/usb/tcpm/tcpm.c
>  create mode 100644 include/usb/pd.h
>  create mode 100644 include/usb/tcpm.h
>

Are you able to build this on sandbox?

Regards,
Simon


More information about the U-Boot mailing list