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
<sm...@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 <sm...@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@fe2c0000: 1, mmc@fe2d0000: 2, mmc@fe2e0000: 0
Loading Environment from nowhere... OK
In: serial@feb50000
Out: serial@feb50000
Err: serial@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@22 | i2c@feac0000 | i2c @ 4 |
status: 0
=> tcpm dev usb-typec@22
dev: 0 @ usb-typec@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@fe2c0000: 1, mmc@fe2d0000: 2, mmc@fe2e0000: 0
Loading Environment from nowhere... OK
In: serial@feb50000
Out: serial@feb50000
Err: serial@feb50000
Model: Radxa ROCK 5 Model B
fusb302 usb-typec@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@22 | i2c@feac0000 | i2c @ 4 |
status: 0
=> tcpm dev usb-typec@22
dev: 0 @ usb-typec@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