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

Soeren Moch smoch at web.de
Wed Sep 4 00:26:43 CEST 2024


Hi Sebastian,

Thanks for new patch version!

On 03.09.24 20:16, Sebastian Reichel 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)
With a dumb power supply (actually 12V w/o USB-PD) I see a error message
(not really sure if that makes sense, but no strong opinion from my side)
and 5V/1.5A reported with 'tcpm info', see below.
Can we expect 1.5A as fallback supply w/o USB-PD negotiation? 5V OK, but
I'm not sure if USB2/USB3 type A to type C cables are allowed according
to the USB spec, with lower possible currents.

I'm not sure what the 'right' thing is to report in this situation
(also cable orientation makes no sense).
Just want to mention that I see something different here.
>   * RavPower 90W
>   * UGREEN 100W
>   * Anker 45W
>   * RavPower PB
>
> Changes since PATCHv4:
>   * Rebase to latest master (v2024.10-rc4)
>   * Fix regression introduced in PATCHv3: The exit code for fusb302_set_vconn()
>     when vconn stays the same should be 0 instead of undefined
>   * Fix regression introduced in PATCHv3: tcpm_set_polarity() needs to update
>     port->polarity when there is no driver specific set_polarity function
I can confirm that these fixes indeed fix my reported regression from v2.
Booting to Linux works perfectly fine when powering from simple USB-PD
supplies (12V, 20V), as well as with power from my notebook computer.

So for the v5 series:
Tested-by: Soeren Moch <smoch at web.de>

I also tested powering from a UGREEN USB-C dock (see boot log below).
This also worked well. Only the data role was not switched correctly
to host as required for the dock. At least we got this 'not supported'
message probably related to that. Maybe that can be fixed later in
follow-up patches.

Thanks again for this great and very helpful rock-5b USB-PD support,
Soeren


Boot Logs:

============ dumb power supply w/o USB-PD ================

U-Boot 2024.07-00006-g8b9f4ed46f (Sep 03 2024 - 22:11:56 +0200)

Model: Radxa ROCK 5 Model B
DRAM:  8 GiB
fusb302 usb-typec at 22: TCPM: PD transmit data failed: -110
Core:  355 devices, 33 uclasses, devicetree: separate
MMC:   mmc at fe2c0000: 1, mmc at fe2d0000: 2, mmc at fe2e0000: 0
Loading Environment from nowhere... OK
In:    serial at feb50000
Out:   serial at feb50000
Err:   serial at feb50000
Model: Radxa ROCK 5 Model B
Net:   No ethernet found.
Hit any key to stop autoboot:  0
=> tcpm list
| Name                            | Parent name         | Parent uclass
@ seq
| usb-typec at 22                    | i2c at feac0000        | i2c @ 4 |
status: 0
=> tcpm dev usb-typec at 22
dev: 0 @ usb-typec at 22
=> tcpm info
Orientation: normal
PD Revision: rev3
Power Role:  sink
Data Role:   device
Voltage:      5.000 V
Current:      1.500 A
=>

============ dock + 20V USB-PD supply ====================

U-Boot 2024.07-00006-g8b9f4ed46f (Sep 03 2024 - 22:11:56 +0200)

Model: Radxa ROCK 5 Model B
DRAM:  8 GiB
fusb302 usb-typec at 22: TCPM: Currently not supported type 0xb
Core:  355 devices, 33 uclasses, devicetree: separate
MMC:   mmc at fe2c0000: 1, mmc at fe2d0000: 2, mmc at fe2e0000: 0
Loading Environment from nowhere... OK
In:    serial at feb50000
Out:   serial at feb50000
Err:   serial at feb50000
Model: Radxa ROCK 5 Model B
Net:   No ethernet found.
Hit any key to stop autoboot:  0
=> tcpm list
| Name                            | Parent name         | Parent uclass
@ seq
| usb-typec at 22                    | i2c at feac0000        | i2c @ 4 |
status: 0
=> tcpm dev usb-typec at 22
dev: 0 @ usb-typec at 22
=> tcpm info
Orientation: reverse
PD Revision: rev3
Power Role:  sink
Data Role:   device
Voltage:     20.000 V
Current:      2.750 A
=>

============================================================



More information about the U-Boot mailing list