[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