summaryrefslogtreecommitdiff
path: root/src/portable/raspberrypi
AgeCommit message (Collapse)Author
2026-07-07usbtest: address Codex re-review (5 findings)hathach
- rp2040 dcd_edpt_clear_stall: the toggle-reset re-issue rewound remaining_len only for IN, but bufctrl_prepare16() pre-subtracts it for OUT too, so an OUT re-issue was short by the still-armed buffers. Rewind both directions (user_buf only for IN, which advances at DPRAM-copy time). Validated: pico usbtest 30/30. - usb_recover.sh: refuse pci-rebind/reset/bind on a BDF that is not a USB controller (class 0x0c03xx), so a stray/mistyped address can't disturb storage or NICs on the shared HIL host. Guard tested against real BDFs. - ip3511 dcd_edpt_open: make it tolerant of reopening a still-armed endpoint instead of asserting it disabled -- retire via EPSKIP (UM11126 41.7.6/41.8.3) then force disabled. This is the correct ISO_ALLOC reopen contract, since usbd_edpt_close() is a no-op there. NOTE: audio/video streaming EPs already use usbd_edpt_iso_activate() on ISO_ALLOC, so there is no in-tree trigger; this is defensive hardening for a class that reopens a non-iso EP via usbd_edpt_open (e.g. a UVC device with a notification EP + VC SET_INTERFACE). Verified on HW: lpc11u37 usbtest 30/30 and video_capture SET_INTERFACE cycling both fine. - vendor_device set_alt: abort the outgoing altsetting's bulk/interrupt endpoints before dropping them, so an endpoint absent from the target altsetting can't stay armed and hold its usbd claim. (No in-tree trigger: usbtest uses a single non-zero altsetting; defensive robustness for multi-alt vendor devices.) - vendor_device tud_vendor_n_mounted(): count iso endpoints too, so an iso-only altsetting reports mounted. (No in-tree trigger: usbtest alt1 always has bulk.) Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HeF2gZ1M7GWkz6Av4BpKPg
2026-07-07address Codex/Copilot review findings (9 fixed, 3 refuted with evidence)hathach
- dcd(rp2040): rewind IN staging before the clear-halt re-issue. Staging advances user_buf/remaining_len when packets are copied into DPRAM, before the host has consumed them; aborting and re-issuing from the advanced pointer silently skipped the staged-but-unsent bytes. - dcd(ip3511): dcd_edpt_iso_activate aborts a transfer still armed from the previous altsetting (clear Active on both buffer slots) so the hardware can't keep servicing the old descriptor against the class's fresh queueing. - dcd(rusb2): reuse an endpoint's existing pipe in dcd_edpt_open. usbd_edpt_close is a no-op on ISO_ALLOC ports, so a class's close/open across SET_INTERFACE would allocate a second pipe with the same EPNUM and leak pipes. - class(vendor): the buffered-mode free-slot check also tests the interrupt endpoints, so an interrupt-only vendor interface isn't clobbered as "free". - bsp(ch32v30x): board_get_unique_id respects max_len and copies bytes (alignment-safe) instead of writing 12 bytes through a uint32_t cast. - test/hil/usbtest.py: treat same-serial multi-matches as ambiguous and retry until the dual-port stale node drops (nanoch32v203/ch32v307 variants); reprobe a binding that predates the dynamic-id re-registration so a stale capability profile can't survive; skip the remove_id/unbind cleanup after an unrecovered kernel-side hang (it would join the D-state convoy and deadlock the bus). - usbtest skip.txt: add the families whose DCD refuses dcd_edpt_iso_alloc (CXD56, FT90X, LPC175X_6X, LPC40XX, NUC100/120/505, PIC32MZ, SAMG, SAMX7X, VALENTYUSB_EPTRI) — tier 4 cannot enumerate there. - test/hil/tinyusb-sudoer: note that '#1000' is a sudoers UID specifier, not a comment (the review misread the grants as commented out). Refuted in review threads: nrf5x ISOSPLIT keeps reserve-max per-configuration allocation semantics (iso_alloc is per-config, not per-alt); the LPC EP-number claim (default descriptor uses EP1-3; lpcxpresso11u37 passes 30/30 on HW); the vendor alt-0 "abort" concern (host cannot address endpoints outside the active altsetting; usbd_edpt_iso_activate resets state on re-entry). Verified on hardware: raspberry_pi_pico, lpcxpresso11u37, ra4m1_ek all 30/30 through the HIL battery after the changes; builds clean incl. buffered-mode vendor (webusb_serial). Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HeF2gZ1M7GWkz6Av4BpKPg
2026-07-06Merge remote-tracking branch 'origin/master' into usbtesthathach
# Conflicts: # lib/rt-thread/port/msc_device_port.c # src/device/usbd.c
2026-07-06usbtest: address code-review findings (EP3 iso regression + 9 more)hathach
Cross-checking the branch against the MCU datasheets surfaced a regression and several latent defects. Fixes (finding # from the review): #1 dcd_ch32_usbfs: restore EP3's enlarged iso buffer. CH32V20x/V30x/F20x USBFS give endpoint 3 a 1023-byte iso packet (CH32FV2x_V3xRM ch23; 16-bit R16_UEP3_T_LEN), unlike every other 64 B endpoint. Commit c05e9313e removed that buffer and capped iso at 64 B, breaking >64 B FS iso (UVC/UAC) on EP3. Re-add it via CFG_TUD_WCH_USBFS_EP3_BUFSIZE, defaulted to 1023 on those parts (CH32_USBFS_EP3_1023_BUFSIZE in ch32_usbfs_reg.h) and 64 elsewhere. #3 dcd_ch32_usbfs: make data.isochronous[] per-direction and clear it on endpoint (re)open, so a reused ep number can't inherit a stale iso response. #7 dcd_ch32_usbfs: exempt iso from the PID_OUT data-toggle handling too (was only done for PID_IN); iso is DATA0-only in both directions. #13 dcd_ch32_usbfs: bounds-assert ep < EP_MAX in dcd_edpt_iso_alloc. #2/#6 usbtest descriptors: TUD_OPT_HIGH_SPEED is a compile-time capability, not the live speed, so the full-speed config (and OTHER_SPEED) advertised int/iso mps 512 on HS boards — illegal at FS / over the 1023 B/frame iso budget. Split into FS-legal / HS descriptor sizes; the plain macro tracks operating speed. #10 vendor: non-alt free-slot detection also checks the int endpoints (a vendor interface may now be interrupt-only, no bulk ep). #14 vendor: replace the order-coupled ITF_MEM_RESET_SIZE ladder (2 unreachable branches) with offsetof(vendord_interface_t, tx_stream). #5 rp2040: clear_stall re-issue preserves the already-transferred count so a mid-transfer clear-halt reports the full length, not just the remainder. #8 rp2040: force single-buffering for iso (only BULK gets a double DPRAM buffer), so a multi-packet iso xfer can't spill buffer 1 into the next ep's DPRAM. Verified: CH32V203 usbfs and CH583 still pass usbtest tier-4 30/30; all board families build; pre-commit (format/codespell/unit) clean. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01HeF2gZ1M7GWkz6Av4BpKPg
2026-07-03dcd(rp2040): re-issue in-flight transfer on clear-halt data-toggle resethathach
usbtest case 29 clears the endpoint halt on a NON-stalled bulk endpoint to reset the data toggle, then keeps streaming. rp2040's dcd_edpt_clear_stall disarmed the buffer (*buf_reg = 0) with no completion event, so the usbd claim leaked and the sink never re-armed -> toggle desync (EINVAL). (dwc2 passes because its clear-stall re-toggles the surviving transfer in place; rp2040 bakes the PID into the armed buffer and can't retoggle without re-arming.) Distinguish the two uses of clear-stall by the endpoint state: a real stall leaves it IDLE (dcd_edpt_stall aborts), whereas a toggle-reset finds it ACTIVE. In the ACTIVE case, abort (the RP2040-E2-safe way) and re-issue the transfer with the toggle reset to DATA0 so it still completes and releases the claim; the stall-recovery path is unchanged. Full usbtest battery now 30/30 on raspberry_pi_pico (rp2040) and adafruit_fruit_jam (rp2350), up from 29/30; dwc2 boards and test 13 (ep halt) unaffected. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HeF2gZ1M7GWkz6Av4BpKPg
2026-07-02license: use SPDX identifiers for src/ headers (#3749)Ha Thach
* license: use SPDX identifiers for src/ headers Replace the full ~20-line MIT license boilerplate on every src/ file with a two-line SPDX tag (SPDX-FileCopyrightText + SPDX-License-Identifier), following the REUSE convention used by CircuitPython and the Linux kernel. Removes ~3500 lines of duplicated boilerplate.
2026-05-15rp2040: fix host SET_REPORT (and any OUT-data control xfer) sending DATA0 ↵Boris Dolgov
instead of DATA1 hcd_edpt_xfer() previously reset ep->next_pid to 1 only when the control endpoint direction changed between stages. That handled IN-data control transfers (e.g. GET_REPORT, GET_DESCRIPTOR) where SETUP is OUT and DATA is IN, but not OUT-data class requests like SET_REPORT, where SETUP and DATA are both OUT and the direction-change check is false. ep->next_pid was left at 0 from hcd_edpt_open(), so the DATA stage went on the wire as DATA0 when the device expected DATA1. Strict devices (observed: Elgato Stream Deck) treat this as a protocol violation and disconnect. Key off "endpoint 0" instead of "direction changed", restoring the previous behavior. Interrupt/bulk endpoints take the ep->interrupt_num > 0 branch above and never reach this code, so they are unaffected.
2026-04-02Apply suggestion from @CopilotHa Thach
Co-authored-by: Copilot <[email protected]>
2026-04-02rp2040: fix RP2350 hard fault in unaligned_memcpy to USB DPRAMhathach
Use volatile byte accesses to prevent the compiler from widening the byte-by-byte copy loop into 16/32-bit accesses, which cause a hard fault on RP2350 when targeting USB DPRAM (device memory). Closes #3554
2026-04-01fix issue caused by merging active + pending statehathach
2026-04-01reduce code size, use state to replace active + pendinghathach
2026-03-31finally get rp2040 host epx working with 2-sof solution for switchinghathach
2026-03-31host abort transfer on short packet in double buffer.hathach
2026-03-30hcd rp2 add double buffered for control endpoint transfers.hathach
2026-03-28rp2 common refactorhathach
2026-03-28host epx clean uphathach
2026-03-27refactorhathach
2026-03-27rename and clean uphathach
2026-03-27fix E15 workaround issue with out of order in double buffer. device bulk ↵hathach
rx/tx ping-pong double buffered all working well
2026-03-27clean up hw_endpoint_open(), still has issue with E15 and ping-pong (slow read).hathach
2026-03-26implement ping-pong double buffered for both tx and rxhathach
2026-03-25fix e4 incorrect buf with incorrect buf_id = 1hathach
2026-03-25update hcd to handle interrupt per bufhathach
2026-03-24handle buf_status in per buffer basic (INTERRUPT_PER_BUFFER), this allows us ↵hathach
to sync/move half data payload instead of waiting for pair complete. Refactor endpoint control and buffer handling functions for clarity and efficiency.
2026-03-23add rp2040 sof + stop_trans on nak. increase nak_poll fs/ls delay to 300 us ↵hathach
to prevent xfer is ack while stopping.
2026-03-20clean uphathach
2026-03-20Add support for EPX preemption on RP2350 during NAK conditionshathach
2026-03-19Add EPX transfer scheduling when hcd_edpt_xfer() is called while epx is busyhathach
2026-03-19Merge branch 'refs/heads/master' into rp2040-hcd-epxhathach
2026-03-19rp2 disable hwfifohathach
2026-01-16revert back to shared hw_endpoint_thathach
2026-01-16renamehathach
2026-01-16renamehathach
2026-01-16implement hcd_device_close()hathach
2026-01-16refactor hcd, get both control and interrupt endpoint workinghathach
2026-01-15draft: hcd control workhathach
2026-01-10remove transfer_type from hw_endpointhathach
2026-01-09enable dedicated hwfifo for rp2hathach
2026-01-09clean uphathach
2026-01-09only apply errata E5 and E15 for rp2040. rp2350 already fixes thesehathach
2026-01-08fix hcd force_single mistake by refactorhathach
2026-01-08minor clean uphathach
2026-01-08change signature for hwep_buf_ctrl_* to take pointer to buf control instead ↵hathach
of hwep
2026-01-07remove hw_endpoint_t rx, rename/change signature of helper functionshathach
2026-01-07refactor remove endpoint_control/buffer_control from hw_endpoint_thathach
2025-11-19Merge remote-tracking branch 'tinyusb/master' into ↵HiFiPhile
copilot/fix-dcd-edpt-xfer-issue Signed-off-by: HiFiPhile <[email protected]>
2025-11-17make TUP_DCD_EDPT_ISO_ALLOC i.e dcd_edpt_iso_alloc()/dcd_edpt_iso_activate() ↵hathach
as default driver implementation. dcd_edpt_close() is deprecated and will be removed from all driver in the future.
2025-10-31Merge branch 'copilot/fix-dcd-edpt-xfer-issue' of ↵HiFiPhile
https://github.com/hathach/tinyusb into copilot/fix-dcd-edpt-xfer-issue
2025-10-31Merge remote-tracking branch 'tinyusb/master' into ↵HiFiPhile
copilot/fix-dcd-edpt-xfer-issue Signed-off-by: HiFiPhile <[email protected]>
2025-10-27improve warnings with rp2040 familyhathach