From 0ab7bf815f37deb958e4165d467543d9840e9269 Mon Sep 17 00:00:00 2001 From: Matt Jones <47545907+SoundMatt@users.noreply.github.com> Date: Wed, 19 Aug 2026 13:43:25 -0700 Subject: [PATCH] docs(fusa): [c-RCP-18-tracker Part 1] propagate tc18_master_id for REQ-CAN-*/REQ-GPIO-*/REQ-PWM-*/REQ-SPI-*/REQ-UART-*/REQ-WAKEUP-* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scope note: REQ-CAN-* does not exist in cpp-RCP's .fusa-reqs.json. Unlike go-RCP (where a REQ-CAN-* client-ergonomics wrapper package `canbr` still exists alongside the real endpoint's REQ-CANEP-*), cpp-RCP's canbr.hpp/ linbr.hpp bridge stubs — which historically used REQ-CAN-001..004/ REQ-LIN-001..004 (ROADMAP.md, "44 requirement entries that back the deleted packages") — were already DEPRECATEd and deleted outright in a prior milestone, and their requirement entries pruned from .fusa-reqs.json entirely (README.md: "CAN and LIN are native TC18 Endpoint types ... not bridge targets, so this package carries no canbr.hpp/linbr.hpp"). REQ-CANEP-* (the real CAN endpoint) was already linked in PR #109. So there is nothing to link under REQ-CAN-* here: 0 entries exist under that prefix. This batch instead covers cpp-RCP's remaining per-endpoint-type packages: REQ-GPIO-* (9), REQ-PWM-* (7), REQ-SPI-* (5), REQ-UART-* (7), REQ-WAKEUP-* (5) — 33 entries in scope, 24 linked, 9 deliberately skipped. Section numbers verified directly against TC18.txt (not assumed from memory or from go-RCP's citations, which use a different section layout for at least PWM): - GPIO: §13.7.4 (NOT §13.7.3 as originally guessed — §13.7.3 is SPI) - SPI: §13.7.3 - PWM_OUT: §13.7.5, PWM_IN: §13.7.6 - UART: §13.7.8 - WAKEUP: §13.7.2 - Shared evt-field semantics table (GPIO/PWM_OUT write combinators, saturation, ep_type enum, compound-wait): §13.2/§13.5/§13.5.1 == Per-prefix verdict == REQ-CAN-*: 0 entries exist (see scope note above). N/A. REQ-GPIO-* (9 total): 6 linked, 3 skipped. Linked: 001, 002, 003, 004, 005, 009. Skipped: - 006 "GPIO functional config block wiring" — the file's own header comment explicitly disclaims that "the concrete pin-direction bit convention, functional-config layout... chosen in this file are this implementation's own." TC18's actual GPIO functional-config register map (Table 44, §13.7.4.2) has no pin-direction or per-pin edge-enable fields at all (only debounce/clock/enable/ status) — linking to Table 44 would be a section-proximity match, not a content match, the exact mistake PR #109's review caught. - 007 "GpioEndpoint request-dispatch pattern" — an internal API orchestration claim (apply write + evaluate triggers + report bitmask "in one call"); its constituent behaviors are already individually covered by REQ-GPIO-002/003/004/005's own citations. Same shape as REQ-MDIO-003 ("MDIO register write-then-read round-trip"), left unlinked in PR #109 for the same reason. - 008 "GpioEndpoint error propagation and GpioErrc category" — implementation-only error-category plumbing, consistent with every other endpoint's *Errc entries (REQ-SPI-005, REQ-I2C-005, REQ-ADC-006, REQ-MDIO-005, REQ-UART-007, REQ-PWM-007, REQ-WAKEUP-005 below) being left unlinked throughout this and the prior batch. REQ-PWM-* (7 total): 6 linked, 1 skipped. Linked: 001, 002 (citation corrected), 003 (citation corrected), 004, 005, 006 (citation corrected). Skipped: 007 (PwmErrc error category — implementation-only, see above). REQ-SPI-* (5 total): 4 linked, 1 skipped. Linked: 001 (citation corrected), 002, 003, 004. Skipped: 005 (SpiErrc error category — implementation-only). REQ-UART-* (7 total): 4 linked, 3 skipped. Linked: 001, 002, 003, 005. Skipped: - 004 "UART payload-less pure read requests" — TC18 §13.7.8.1 only says a UART read *carrying* a byte_msg_payload is rejected (UNKNOWN_CMD); it does not define a distinct non-blocking "pure read" request kind for UART the way §13.7.4.3 explicitly names one for GPIO. handle_pure_read's own doc comment concedes this is this implementation's own API convenience ("no read_size is carried at all, so there is nothing to wait on"), not a TC18-named UART behavior distinct from what REQ-UART-002/003 already cover. - 006 "UART RX FIFO / read_size single-AVTPDU accepted limitation" — this requirement documents a deliberate NON-conformance: TC18 §13.7.8.1 mandates fragmenting the response when read_size exceeds uart_rx_fifo_size (TC18-13.7.8.1-004); this milestone's accepted limitation (ROADMAP.md milestone 52, fragmentation no-go) instead rejects such requests outright. Linking it would misrepresent a documented gap as coverage. - 007 (UartErrc error category — implementation-only). REQ-WAKEUP-* (5 total): 4 linked, 1 skipped. Linked: 001, 002, 003, 004. Skipped: 005 (WakeupErrc error category — implementation-only). == Full id -> master-catalog-id mapping (24 entries) == REQ-GPIO-001 -> TC18-13.7.4.1-005 "GPIO request length validation": TC18 requires rejecting any GPIO request not exactly 4 bytes (INVALID_PARAMETER); matches kGpioPayloadLen=4 / short_buffer. REQ-GPIO-002 -> TC18-13.5-001 "EP-specific usage of evt-field": Table 33's GPIO/PWM_OUT row defines evt[2:0]=000b/001b/010b/011b as Replace/OR/AND/XOR against current interface status; matches apply_bitmask_write's Replace/Or/And/Xor. REQ-GPIO-003 -> TC18-13.5-003 "Saturation arithmetic for GPIO/PWM_OUT add/subtract": "neither overflows nor wrap-arounds... saturated at 0x0000/0xFFFF" — matches the saturating (not wrapping) Add/Subtract rule directly. REQ-GPIO-004 -> TC18-13.5-001: same Table 33 GPIO/PWM_OUT row, evt[2:0]=100b (reserved/rejected) and 111b (reconfigure — endpoint config change, not a value written to the interface); matches Reserved-rejected / Reconfigure-retargets-directions split. REQ-GPIO-005 -> TC18-13.7.4.1-011 "Optional GPIO edge/change trigger generation": "generates triggers for all its mapped IO-pins on the change, falling and rising edge" — matches per-pin Change/Rising/ Falling signal evaluation. REQ-GPIO-009 -> TC18-13.7.4.3-004 "Write to input pin is ignored": "A write request to an input pin is ignored for this input pin" — direct match, quote already correct pre-existing; only the line number and master_id were added. REQ-PWM-001 -> TC18-13.7.5.3-001 "pwmo request format": "The PWM_out request and response contain two values in the payload. The active time... as well as the period" — matches the shared two-field PwmValue{period, active_duration} shape. REQ-PWM-002 -> TC18-13.5-001: Table 33 GPIO/PWM_OUT row, evt[2:0]=000b ("byte_msg_payload is presented at the interface") — matches Replace applying period/active_duration directly. CITATION CORRECTED (was "Table 30", which is TC18's actual "Error codes in responses" table, not the evt-field table — the real table is Table 33). REQ-PWM-003 -> TC18-13.5-003: same saturation clause as REQ-GPIO-003, applied per-field to PwmValue's uint16_t range. CITATION CORRECTED (was "Table 30" + "TC18.txt L3694-3714", which points at an unrelated sequencer request-state-machine passage, not Table 33/the saturation note at all). REQ-PWM-004 -> TC18-13.5-001: same Table 33 row, evt[2:0]=100b/111b, as REQ-GPIO-004 — matches Reserved-rejected / Reconfigure-unsupported (PWM_OUT has no reconfigure target of its own besides its functional config registers). REQ-PWM-005 -> TC18-13.7.6.1-001 "PWM_IN max-period exceeded / source-loss error notification": "if... the external PWM source stops, the PWM_IN endpoint will detect this and... notify the RC Client with an error response message" (error code PWM_IN_NO_SIGNAL, Table 30) — matches no_signal before first measurement / after clear_signal(). REQ-PWM-006 -> TC18-13.7.6.1-002 "pwmi trigger outputs": Table 47 defines exactly two PWM_IN trigger signals (0=rising edge, 1=falling edge) — matches RisingEdge/FallingEdge notification. CITATION CORRECTED (was "§13.7.5.1 Table 44" — §13.7.5.1 is PWM_OUT's pin-config section and Table 44 is GPIO's functional-config register map; the real anchor is §13.7.6.1 Table 47, the actual "pwmi trigger outputs" table). REQ-SPI-001 -> TC18-13.7.3.2-006 "Parallel SPI: up to 6 CS configurations, selected via evt[2:0]": "up to 6 CS signals may be handled by the SPI endpoint... the SPI bus functional configuration supports up to 6 different configurations in parallel... determined by evt[2:0]" — matches kMaxChannels=6, evt[2:0] 0-5 valid / 6,7 rejected. CITATION CORRECTED (was "§13.7.3.1" quoting "up to 6 pre-configurable sets of SPI configurations" at L4192 — TC18.txt L4192 is CRC/Safe-command-mode text, unrelated; and §13.7.3.1's real text says "up to 16" pre-configurable sets selected via byte_bus_id, not evt[2:0] — a known, spec-internal, editorially-flagged inconsistency between the "16" figure in §13.7.3.1 and the "6" figure in §13.7.3.2, per master-catalog entry TC18-13.7.3.1-002's own notes. cpp-RCP's kMaxChannels=6 + evt[2:0] selection matches §13.7.3.2's "6" clause, not §13.7.3.1's "16" one). REQ-SPI-002 -> TC18-13.5.1-001 "Compound-wait byte-length mismatch handling": "the interface status shall be capped to the length of the byte message payload. For SPI this means that e.g. only the first four out of 20 received bytes will be checked..." — exact match, including cpp-RCP's own kCompoundWaitCompareLen=4 / kMaxStatusBytes=20 constants mirroring TC18's own worked example. REQ-SPI-003 -> TC18-13.7.3.1-003 "Client byte-send request to SPI endpoint": "The RC Client can request the SPI endpoint to send one or more bytes that are delivered as byte_msg_payload..." — matches the raw PICO-out/POCI-in transfer request/response mechanism. REQ-SPI-004 -> TC18-13.7.3.1-007 "SPI trigger outputs mapping": Table 41 defines signal 0 = SPI execution done, (2+2n) = CSn asserted, (3+2n) = CSn de-asserted — matches CsAssert/TransferComplete/ CsDeassert and the per-(channel,signal) distinct SignalId scheme (the specific notification *order* is this implementation's own choice, not spec-mandated, consistent with this file's own disclaimer). REQ-UART-001 -> TC18-13.7.8.1-001 "UART EP dual independent TX/RX request storages": "these two processes are independent from each other, thus the UART EP has two EP request storages" — direct match. REQ-UART-002 -> TC18-13.7.8.1-002 "UART RX FIFO buffering and overflow flagging": "the UART EP shifts the received data into a fifo-rx-buffer... emptied by read requests. Overflow is flagged..." — direct match. REQ-UART-003 -> TC18-13.7.8.1-004 "UART read request trigger conditions and fragmentation sizing": "A read request will be started as soon as the fifo-rx-buffer is filled with as many bytes as requested in the read_size or when the uart_timeout has expired" — matches the read-completion rule. (Citation deliberately quotes only the read_size/timeout portion, not the fragmentation sentence that follows it in the same TC18 passage — this implementation's read_size_exceeds_bound rejection is a documented divergence from that fragmentation behavior, per REQ-UART-006, not an implementation of it.) REQ-UART-005 -> TC18-13.7.8.3-004 "UART EP ignores trailing non-integer-multiple bits when transmitting": "In case uart_nr_bits is not a multiple integer of 8... the EP ignores the last up to 'uart_nr_bits - 1' bits..." — matches the sub-octet mask-to-low-bits/zero-pad-high-bits packing rule. REQ-WAKEUP-001 -> TC18-13.2-002 "ep_type enumerated values": Table 32 lists 0x01 = WakeUp — matches kEndpointTypeWakeup=0x01. Same master_id as REQ-CANEP-001/REQ-MDIO-001 from PR #109 (same table, different row). Deliberately NOT linked to TC18-13.7.2.1-001 ("WakeUp endpoint fixed at EP nr 1") — that clause is about EP_Nr (instance position), a different field from ep_type (the type-code value this requirement actually tests); confirmed by reading endpoint.hpp's own kEndpointType* constant block, which is exactly Table 32's ep_type enumeration. REQ-WAKEUP-002 -> TC18-13.7.2.3-004 "SleepCMD fixed code value": "SleepCMD is coded as 0xA5." — direct, exact match. REQ-WAKEUP-003 -> TC18-13.7.2.2-002 "WakeUp functional configuration register map": Table 39's wup_status register — "Indication of wake-up source, writing '1' clears the flag. Each bit represents a wake-up source" — matches record_wake_source_event setting a bit / clear_wake_source_pins() resetting the mask. REQ-WAKEUP-004 -> TC18-13.7.2.1-002 "Repetitive wake-up messages after reconnection": "After establishing a network connection, the WakeUp endpoint sends repetitive messages. The timing interval is configurable (flush_time)." — matches the repeating WakeUp-message handshake for hot-start-from-Sleep. == Citation corrections found (5) == 1. REQ-SPI-001: wrong section (§13.7.3.1 instead of §13.7.3.2), wrong quote (misattributed the "6" figure to §13.7.3.1's text, which actually says "16"), and wrong line number (L4192 is CRC/Safe-mode text, not SPI channel-count text at all). 2. REQ-PWM-002: "Table 30" corrected to "Table 33" (Table 30 in TC18 is "Error codes in responses"; the evt-field table is Table 33). 3. REQ-PWM-003: same Table 30->33 correction, plus the line range L3694-3714 (sequencer request-state-machine text) corrected to the real Table 33 saturation-note location, L4094-4119. 4. REQ-PWM-006: "§13.7.5.1 Table 44" corrected to "§13.7.6.1 Table 47" (§13.7.5.1/Table 44 are PWM_OUT/GPIO material; PWM_IN's actual trigger-outputs table is §13.7.6.1 Table 47). 5. REQ-GPIO-009: quote content was already accurate; only the missing "TC18.txt L####" line-number suffix was added for consistency with every other linked entry's citation format. Note: REQ-PWM-002/003's own pre-existing `text` fields also say "§13.5 Table 30" — left untouched per field-preservation (only `tc18`/ `tc18_master_id` are new/corrected fields in this batch); the `text` field's wording is a separate, smaller pre-existing inaccuracy not in this batch's scope to rewrite. == Deliberately-untouched entries (9) == REQ-GPIO-006, REQ-GPIO-007, REQ-GPIO-008, REQ-PWM-007, REQ-SPI-005, REQ-UART-004, REQ-UART-006, REQ-UART-007, REQ-WAKEUP-005 — reasoning per-entry above (per-prefix verdict section). == Verification == - cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DRELAY_BUILD_CLI=ON -G Ninja && cmake --build build --parallel: clean rebuild, 0 errors. - ctest --test-dir build --output-on-failure -j1: 53/53 passing (matches PR #109 baseline). - cpfusa v0.18.0 check: 0 errors, 2 warnings, 1 info (unchanged from baseline). - cpfusa v0.18.0 trace --format json: 376 total/376 traced/376 tested/ 64 secTested (identical before and after — only citation metadata fields were added, no requirement entries or test annotations changed). - git diff --stat: 1 file changed (.fusa-reqs.json only), 67 insertions(+), 24 deletions(-) — 24 tc18_master_id fields added, 24 tc18 fields present after (19 new + 5 corrected in place). Signed-off-by: Matt Jones <47545907+SoundMatt@users.noreply.github.com> Co-Authored-By: Claude Sonnet 5 --- .fusa-reqs.json | 91 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 24 deletions(-) diff --git a/.fusa-reqs.json b/.fusa-reqs.json index 15adf33..fb1811c 100644 --- a/.fusa-reqs.json +++ b/.fusa-reqs.json @@ -2393,7 +2393,9 @@ "text": "rcp::gpio::kGpioPayloadLen shall be 4 and kMaxPins shall be 32; encode_gpio_payload/decode_gpio_payload shall round-trip a PinMask value in big-endian byte order, and decode_gpio_payload shall return avtp::AvtpErrc::short_buffer when given fewer than kGpioPayloadLen bytes.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.4.1 (\"A request not having exactly four bytes is rejected and an error response with error code = INVALID_PARAMETER will be sent\"), TC18.txt L4799-4800", + "tc18_master_id": "TC18-13.7.4.1-005" }, { "id": "REQ-GPIO-002", @@ -2401,7 +2403,9 @@ "text": "rcp::gpio::apply_gpio_write shall apply Replace/Or/And/Xor to GpioState::values via rcp::endpoint::apply_bitmask_write.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.5 Table 33 (\"The byte_msg_payload is presented at the interface\"; GPIO/PWM_OUT row, evt[2:0]=000b-011b), TC18.txt L4093-4105", + "tc18_master_id": "TC18-13.5-001" }, { "id": "REQ-GPIO-003", @@ -2409,7 +2413,9 @@ "text": "rcp::gpio::apply_gpio_write shall apply the saturating Add/Subtract rule to GpioState::values, clamping instead of wrapping, using the same rcp::endpoint saturation helpers PWM_OUT is expected to reuse at v2.4.0.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.5 (\"While doing additions and subtractions neither overflows nor wrap-arounds shall occur. The values are saturated at 0x0000 on the low side and 0xFFFF at the high side.\"), TC18.txt L4118-4119", + "tc18_master_id": "TC18-13.5-003" }, { "id": "REQ-GPIO-004", @@ -2417,7 +2423,9 @@ "text": "rcp::gpio::apply_gpio_write shall return an error without modifying GpioState for WriteSemantics::Reserved, and shall replace GpioState::directions (leaving GpioState::values unchanged) for WriteSemantics::Reconfigure.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.5 Table 33 (GPIO/PWM_OUT row, evt[2:0]=100b \"reserved – request shall be ignored and an err-response with error code = UNSUPPORTED_CMD shall be sent\"; evt[2:0]=111b \"used to change the configuration of the endpoint\"), TC18.txt L4106-4116", + "tc18_master_id": "TC18-13.5-001" }, { "id": "REQ-GPIO-005", @@ -2425,7 +2433,9 @@ "text": "rcp::gpio::evaluate_gpio_triggers shall notify a pin's Change signal on any bit transition and additionally its Rising or Falling signal depending on transition direction, reporting only signals the caller's rcp::endpoint::TriggerRegistry had armed, and shall notify nothing for a pin whose bit did not change.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.4.1 (\"The GPIO endpoint optionally generates triggers for all its mapped IO-pins on the change, falling and rising edge.\"), TC18.txt L4816", + "tc18_master_id": "TC18-13.7.4.1-011" }, { "id": "REQ-GPIO-006", @@ -2458,7 +2468,8 @@ "standard": "iso26262", "level": "ASIL-B", "asil": "ASIL-B", - "tc18": "§13.7.4.3 (\"A write request to an input pin is ignored for this input pin\")" + "tc18": "§13.7.4.3 (\"A write request to an input pin is ignored for this input pin\"), TC18.txt L4890", + "tc18_master_id": "TC18-13.7.4.3-004" }, { "id": "REQ-SPI-001", @@ -2467,7 +2478,8 @@ "standard": "iso26262", "level": "ASIL-B", "asil": "ASIL-B", - "tc18": "§13.7.3.1 (\"the SPI endpoint may support up to 6 pre-configurable sets of SPI configurations\"), TC18.txt L4192" + "tc18": "§13.7.3.2 (\"up to 6 CS signals may be handled by the SPI endpoint via its configurations\"; \"the SPI bus functional configuration supports up to 6 different configurations in parallel. Which configuration is used within an SPI request is determined by evt[2:0].\"), TC18.txt L4730-4739", + "tc18_master_id": "TC18-13.7.3.2-006" }, { "id": "REQ-SPI-002", @@ -2475,7 +2487,9 @@ "text": "rcp::spi::compound_wait_matches shall compare only the first kCompoundWaitCompareLen (4) bytes of a status transfer against the expected pattern, ignoring any difference beyond that window, shall reject a status transfer longer than kMaxStatusBytes (20), and shall return false when the truncated comparison window is empty.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.5.1 (\"the interface status shall be capped to the length of the byte message payload. For SPI this means that e.g. only the first four out of 20 received bytes will be checked when the byte_msg_payload in the compound wait has only four bytes.\"), TC18.txt L4136-4139", + "tc18_master_id": "TC18-13.5.1-001" }, { "id": "REQ-SPI-003", @@ -2483,7 +2497,9 @@ "text": "rcp::spi::SpiEndpoint::transfer shall record the sent and received bytes for the given channel independently of every other channel's last transfer, and shall return SpiErrc::channel_out_of_range for a channel >= kMaxChannels without recording anything.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.3.1 (\"The RC Client can request the SPI endpoint to send one or more bytes that are delivered as byte_msg_payload of an ACF_ABB/GBB to the endpoint.\"), TC18.txt L4597-4598", + "tc18_master_id": "TC18-13.7.3.1-003" }, { "id": "REQ-SPI-004", @@ -2491,7 +2507,9 @@ "text": "rcp::spi::SpiEndpoint::transfer shall notify CsAssert, then TransferComplete, then CsDeassert for the transferred channel's rcp::endpoint::TriggerRegistry, spi_signal_id shall assign a distinct SignalId to every (channel, signal) pair, and a channel's armed signals shall not affect notification delivery for any other channel.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.3.1 Table 41 (\"spi trigger outputs\"; 0 = SPI execution done, 2+2n = CSn asserted, 3+2n = CSn de-asserted), TC18.txt L4603-4611", + "tc18_master_id": "TC18-13.7.3.1-007" }, { "id": "REQ-SPI-005", @@ -2553,7 +2571,9 @@ "text": "rcp::uart::UartEndpoint::enqueue_tx shall append to a TX queue independent of the RX FIFO's contents, drain_tx shall return and clear exactly what was queued, and enqueue_tx shall return UartErrc::tx_queue_overflow rather than partially enqueueing when the push would exceed kTxQueueCapacity.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.8.1 (\"These two processes are independent from each other, thus the UART EP has two EP request storages, one for transmitting data and one for receiving data.\"), TC18.txt L5292-5293", + "tc18_master_id": "TC18-13.7.8.1-001" }, { "id": "REQ-UART-002", @@ -2561,7 +2581,9 @@ "text": "rcp::uart::UartEndpoint::rx_fill shall append bytes to the RX FIFO, rx_available shall report its current occupancy, and rx_fill shall return UartErrc::rx_fifo_overflow rather than partially filling when the push would exceed kRxFifoCapacity.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.8.1 (\"While receiving the UART EP shifts the received data into a fifo-rx-buffer that has a length of uart_rx_fifo_size. The buffer is emptied by read requests. Overflow is flagged in the UART EP status register.\"), TC18.txt L5294-5295", + "tc18_master_id": "TC18-13.7.8.1-002" }, { "id": "REQ-UART-003", @@ -2569,7 +2591,9 @@ "text": "rcp::uart::UartEndpoint::handle_read shall drain up to `read_size` bytes currently available in the RX FIFO, shall report out_timed_out=true only when read_size was not fully reached and elapsed_ms >= uart_timeout_ms, and shall return UartErrc::read_size_exceeds_bound for a read_size greater than kMaxReadSize without modifying the RX FIFO.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.8.1 (\"A read request will be started as soon as the fifo-rx-buffer is filled with as many bytes as requested in the read_size or when the uart_timeout has expired\"), TC18.txt L5297-5298", + "tc18_master_id": "TC18-13.7.8.1-004" }, { "id": "REQ-UART-004", @@ -2585,7 +2609,9 @@ "text": "rcp::uart::pack_frame_to_octet shall mask a frame's value to its low bits_per_frame bits (zero-padding the remaining high bits of the octet), rcp::uart::unpack_frame_bits shall invert that masking, and both shall return UartErrc::bits_per_frame_out_of_range for bits_per_frame outside [kMinBitsPerFrame, kMaxBitsPerFrame].", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.8.3 (\"In case uart_nr_bits is not a multiple integer of 8, then the RC Client might need to append up to 'uart_nr_bits - 1' bits to create a payload in requests that fits into an integer multiple of octects. Equally the UART EP will append up to 'uart_nr_bits - 1' bits in such cases in the responses. When transmitting the EP ignores the last up to 'uart_nr_bits - 1' bits from the request payload, when the length of the payload is not an integer multiple of uart_nr_bits.\"), TC18.txt L5402-5406", + "tc18_master_id": "TC18-13.7.8.3-004" }, { "id": "REQ-UART-006", @@ -2665,7 +2691,9 @@ "text": "rcp::pwm::PwmValue shall default both period and active_duration to 0, and both rcp::pwm::PwmOutEndpoint and rcp::pwm::PwmInEndpoint shall operate on this same two-field type.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.5.3 (\"The PWM_out request and response contain two values in the payload. The active time of the PWM signal as well as the period of the signal in clock ticks of the clock selected for this PWM_out endpoint.\"; Figure 27 – \"pwmo request format\"), TC18.txt L5031-5038", + "tc18_master_id": "TC18-13.7.5.3-001" }, { "id": "REQ-PWM-002", @@ -2674,7 +2702,8 @@ "standard": "iso26262", "level": "ASIL-B", "asil": "ASIL-B", - "tc18": "§13.5 Table 30 (GPIO/PWM_OUT row, evt[2:0]=000b)" + "tc18": "§13.5 Table 33 (\"The byte_msg_payload is presented at the interface\"; GPIO/PWM_OUT row, evt[2:0]=000b — this citation corrects the requirement text's own \"Table 30\", which is TC18's Table 30: Error codes in responses, not the evt-field table), TC18.txt L4093,L4116", + "tc18_master_id": "TC18-13.5-001" }, { "id": "REQ-PWM-003", @@ -2683,7 +2712,8 @@ "standard": "iso26262", "level": "ASIL-B", "asil": "ASIL-B", - "tc18": "§13.5 Table 30 (GPIO/PWM_OUT row, evt[2:0]=001b-011b,101b-110b), TC18.txt L3694-3714" + "tc18": "§13.5 Table 33 (GPIO/PWM_OUT row, evt[2:0]=001b-011b,101b-110b; \"While doing additions and subtractions neither overflows nor wrap-arounds shall occur. The values are saturated at 0x0000 on the low side and 0xFFFF at the high side.\" — this citation corrects the requirement text's own \"Table 30\" and the prior \"L3694-3714\" line range, both of which pointed at unrelated sequencer-state-machine text), TC18.txt L4094-4119", + "tc18_master_id": "TC18-13.5-003" }, { "id": "REQ-PWM-004", @@ -2691,7 +2721,9 @@ "text": "rcp::pwm::PwmOutEndpoint::handle_write shall return an error without modifying its state for WriteSemantics::Reserved, and shall return rcp::endpoint::EndpointErrc::non_combinable_write_semantics for WriteSemantics::Reconfigure (PWM_OUT defines no Reconfigure target of its own).", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.5 Table 33 (GPIO/PWM_OUT row, evt[2:0]=100b \"reserved – request shall be ignored and an err-response with error code = UNSUPPORTED_CMD shall be sent\"; evt[2:0]=111b \"used to change the configuration of the endpoint\"), TC18.txt L4106-4116", + "tc18_master_id": "TC18-13.5-001" }, { "id": "REQ-PWM-005", @@ -2699,7 +2731,9 @@ "text": "rcp::pwm::PwmInEndpoint::handle_read shall return PwmErrc::no_signal before any record_measurement call and again after clear_signal(), and shall otherwise return the most recently recorded PwmValue.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.6.1 (\"If the period of the incoming signal exceeds the configured maximum allowed period or if the external PWM source stops, the PWM_IN endpoint will detect this and if enabled within the EP_config (EP_RESP_ON_ERR) notify the RC Client with an error response message.\"; error code PWM_IN_NO_SIGNAL(9), Table 30: Error codes in responses), TC18.txt L5078-5080", + "tc18_master_id": "TC18-13.7.6.1-001" }, { "id": "REQ-PWM-006", @@ -2708,7 +2742,8 @@ "standard": "iso26262", "level": "ASIL-B", "asil": "ASIL-B", - "tc18": "§13.7.5.1 Table 44 (pwmi trigger outputs)" + "tc18": "§13.7.6.1 Table 47 (\"pwmi trigger outputs\"; 0 = rising edge of PWM_IN signal, 1 = falling edge of PWM_IN signal — this citation corrects the requirement's own \"§13.7.5.1 Table 44\", which is PWM_OUT's section and GPIO's functional-config table respectively, not PWM_IN's trigger table), TC18.txt L5078-5087", + "tc18_master_id": "TC18-13.7.6.1-002" }, { "id": "REQ-PWM-007", @@ -3016,7 +3051,9 @@ "text": "rcp::endpoint::kEndpointTypeWakeup shall equal 0x01.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.2 Table 32 (\"ep_type values\"; row \"0x01 WakeUp\"), TC18.txt L3998-4017", + "tc18_master_id": "TC18-13.2-002" }, { "id": "REQ-WAKEUP-002", @@ -3024,7 +3061,9 @@ "text": "rcp::wakeup::kSleepCmd shall equal 0xA5; rcp::wakeup::decode_sleep_cmd shall accept only that exact byte value and return WakeupErrc::not_sleep_cmd for every other byte (including 0x8x safety-tagged sequencer opcode bytes); rcp::wakeup::WakeupEndpoint::handle_sleep_cmd shall transition to asleep on kSleepCmd and shall leave state unchanged and return an error for any other byte.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.2.3 (\"SleepCMD is coded as 0xA5.\"), TC18.txt L4565", + "tc18_master_id": "TC18-13.7.2.3-004" }, { "id": "REQ-WAKEUP-003", @@ -3032,7 +3071,9 @@ "text": "rcp::wakeup::WakeupEndpoint::record_wake_source_event shall set the corresponding bit in wake_source_pins() and shall clear is_asleep(), and clear_wake_source_pins() shall reset the accumulated mask to 0 without affecting is_asleep() or the handshake-pending state.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.2.2 Table 39 (\"wup_status...Indication of wake-up source, writing '1' clears the flag. Each bit represents a wake-up source\"), TC18.txt L4503-4506", + "tc18_master_id": "TC18-13.7.2.2-002" }, { "id": "REQ-WAKEUP-004", @@ -3040,7 +3081,9 @@ "text": "rcp::wakeup::WakeupEndpoint::record_wake_source_event shall arm wakeup_message_pending() until acknowledge_wakeup() is called, wakeup_message_pending() shall continue reporting true across repeated calls while armed, and handle_sleep_cmd(kSleepCmd) shall clear any handshake left pending from a prior wake cycle.", "standard": "iso26262", "level": "ASIL-B", - "asil": "ASIL-B" + "asil": "ASIL-B", + "tc18": "§13.7.2.1 (\"After establishing a network connection, the WakeUp endpoint sends repetitive messages. The timing interval is configurable (flush_time).\"), TC18.txt L4488-4489", + "tc18_master_id": "TC18-13.7.2.1-002" }, { "id": "REQ-WAKEUP-005",