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

Soeren Moch smoch at web.de
Thu Aug 8 17:08:00 CEST 2024



On 08.08.24 16:34, Sören Moch wrote:
>
>
> 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:
Even worse when powering the rock-5b board from a notebook PC.
With patch version 2 also 5V/3V are negotiated and everything works
(including booting linux),
with patch version 3 there is a boot loop as without any tcpm patch.

So I have to withdraw my tested-by-tag for v3.

Regards,
Soeren
>
> *** 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