[PATCH v3 0/7] FUSB302 USB-C controller support

Sören Moch smoch at web.de
Thu Aug 8 16:34:36 CEST 2024



On 08.08.24 15:58, Soeren Moch wrote:
>
>
> On 02.08.24 19:59, 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).
>>
>> Sorry for the delay in getting PATCHv3 ready.
>>
>> 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)
>
> FWIW
> I retested this v3 series on top of v2024.07. Everything still works
> as expected on my rock-5b board with different USB-PD power supplies
> (5V, 12V, 20V).
>
> Tested-by: Soeren Moch <smoch at web.de>
One difference between patch versions 2 and 3 I can observe when
powering from a mini-PC (USB-C port) though:

*** Patch version v2:

U-Boot 2024.07-00005-g2000ac570b (Aug 08 2024 - 16:20:40 +0200)

Model: Radxa ROCK 5 Model B
DRAM:  8 GiB
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:      5.000 V
Current:      3.000 A
=>

*** Patch version v3:

U-Boot 2024.07-00007-g642d8a1c14 (Aug 08 2024 - 15:32:24 +0200)

Model: Radxa ROCK 5 Model B
DRAM:  8 GiB
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
fusb302 usb-typec at 22: TCPM: PD transmit data failed: -110
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:      0.000 A
=>

So patch version 2 worked better for this use case.

Regards,
Soeren
>
> Thanks,
> Soeren
>
>>   * 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 (7):
>>    usb: tcpm: add core framework
>>    usb: tcpm: fusb302: add driver
>>    board: rock5b-rk3588: add USB-C controller support
>>    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 |   46 +
>>   cmd/Kconfig                               |    7 +
>>   cmd/Makefile                              |    1 +
>>   cmd/tcpm.c                                |  136 ++
>>   configs/rock5b-rk3588_defconfig           |    5 +
>>   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            |   88 +
>>   drivers/usb/tcpm/tcpm.c                   | 2277 +++++++++++++++++++++
>>   include/dm/uclass-id.h                    |    1 +
>>   include/usb/pd.h                          |  516 +++++
>>   include/usb/tcpm.h                        |   99 +
>>   22 files changed, 4981 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
>>



More information about the U-Boot mailing list