Skip to content

v0.0.22

Choose a tag to compare

@github-actions github-actions released this 01 Oct 07:34
· 427 commits to main since this release

0.0.22

  • (EN) Breaking: the wire follows oep-spec's zero-base rewrite of 2026-10-01 (docs/v1-zero-base-proposal.ja.md §3 / §7; registry synced). Every answer that ended in data or a list now carries its length and may be followed by TLVs: read answers start flags len data [TLV] (console, fixture UART; capture len u32), gpio read n n×level, dmi done status nvals values, arm-adi transfer done status ack nvals values, run status stopped dpc elapsed_us nvals values (stopped 2 = the hart could not be halted: RunResult.not_halted), data frames position len data [TLV], events kind fixed-part [TLV]. TLVs have a long form (tag 0xFF len(u16) value for 255 bytes and more; message.tlv / split_tlvs, the long form with a short value is message.BadTlv). confirm answers the probe's boot_id; subscribe's max_delay_ms is u32; rejected unsupported is always tag [TLV] (0x00 = a fixed-part value: Unsupported.tag None, .tlvs).
  • (JA) 破壊的変更: wire を oep-spec の 2026-10-01 のゼロベース見直し(docs/v1-zero-base-proposal.ja.md §3 / §7。registry を写し直した)に揃えた。データや並びで終わっていた応答はすべて長さを持ち、後ろに TLV を置ける: read の応答 start flags len data [TLV](console、fixture UART。capture の len は u32)、gpio read n n×level、dmi done status nvals values、arm-adi transfer done status ack nvals values、run status stopped dpc elapsed_us nvals values(stopped 2 = hart を止められなかった: RunResult.not_halted)、データフレーム position len data [TLV]、出来事 kind 固定部 [TLV]。TLV に長い形(255 byte 以上は tag 0xFF len(u16) value。message.tlv / split_tlvs、短い値の長い形は message.BadTlv)。confirm は probe の boot_id を返す。subscribe の max_delay_ms は u32。rejected unsupported は常に tag [TLV](0x00 = 固定部の値: Unsupported.tag は None、.tlvs)。
  • (EN) Breaking: after the lease lapsed, the same session id's next request is rejected expired (0x0E): host.Expired(Rejected) with .lease_ms, never re-opened silently; open() then answers Opened.resumed == 2 (.swept) and Host.epoch moves (as it does on no_session - what an id forced out by another meets after locked). Wire.connections() and Console.streams() page through first / more. Subscriptions survive a same-id open while the lock is held; a subscribe to an fn that emits nothing is unsupported, an unsubscribe of nothing is ok.
  • (JA) 破壊的変更: lease が切れた後の同じ session_id の要求は rejected expired(0x0E): host.Expired(Rejected)(.lease_ms つき)。黙って open し直さない。その後の open() は Opened.resumed == 2(.swept)を返し、Host.epoch が進む(no_session でも進む。force で奪われた側は locked のあと no_session)。Wire.connections() と Console.streams() は first / more でページを辿る。保持中の同じ ID の open で購読は残る。送り出さない fn の subscribe は unsupported、購読の無い unsubscribe は ok。
  • (EN) Breaking: oep.probe.config - describe is declarations only (ProbeConfig.describe() -> Declared: storage max_bytes u32, items, slots_max, bind_modes u32); the live storage / slot / bind state is the lock-free state op (0x06, paged; ProbeConfig.state() -> State, SlotState.last_try_at_ns); unset (0x05) removes items by key (ProbeConfig.unset, config.remove() in a set list goes as an unset - a key alone no longer removes); the new uart item (config.Uart(fn, baud, format)) is applied whenever that UART's plan has RX or TX (a session's configure wins until the plan goes); slot fields are retry_ms (u32; the Python Slot.retry_s stays, seconds) and max_speed_hz (u32; Slot.max_speed stays, Hz); mechanism none (0xFF) = a slot without a console; the hash is the CRC-32 of the canonical form (config.canonical / hash_of). CLI: oep config state, oep config uart, remove for every item kind.
  • (JA) 破壊的変更: oep.probe.config - describe は宣言だけ(ProbeConfig.describe() -> Declared: storage は max_bytes u32、items、slots_max、bind_modes u32)。保存・スロット・bind の今の状態はロック不要の state op(0x06、ページング。ProbeConfig.state() -> State、SlotState.last_try_at_ns)。unset(0x05)はキーで項目を消す(ProbeConfig.unset。set の並びの config.remove() は unset として送る。キーだけの項目で消す規則は廃止)。新しい uart 項目(config.Uart(fn, baud, format))は、その UART の plan に RX / TX が付くたびに掛かる(セッションの configure は plan を解くまで勝つ)。スロットのフィールドは retry_ms(u32。Python の Slot.retry_s は秒のまま)と max_speed_hz(u32。Slot.max_speed は Hz のまま)。mechanism none(0xFF)= コンソール無しのスロット。hash は正規形の CRC-32(config.canonical / hash_of)。CLI: oep config state、oep config uart、remove はすべての項目。
  • (EN) Breaking: wires - attach_under_reset (op 0x04) is gone: Wire.attach(reset=(channel, hold_ms)) sends the attach's critical TLV 0x05 (the attach_under_reset() method stays as a wrapper and returns the dpc from the answer's TLV 0x11); max_speed is required by the probe, so attach() always sends one (None: the wire's declared max_clock_hz, else 1 MHz); the answer's flags are the common attach_flags (Wire.halted / .dpc; swd's dormant bit moved to bit2); scan takes max_speed / idle_clock TLVs and its skip is TLV 0x02; WireBase.connections() and detach(force=). RiscvDm.run(timeout_ms=None) is the probe's max_op_ms (core.max_op_ms), no longer 0xFFFFFFFF.
  • (JA) 破壊的変更: 線 - attach_under_reset(op 0x04)は無くなり、Wire.attach(reset=(channel, hold_ms)) が attach の critical TLV 0x05 を送る(attach_under_reset() メソッドは包みとして残り、応答の TLV 0x11 の dpc を返す)。probe は max_speed を必須にしたので attach() は常に送る(None: その線の宣言の max_clock_hz、無ければ 1 MHz)。応答の flags は共通の attach_flags(Wire.halted / .dpc。swd の dormant は bit2 に移った)。scan は max_speed / idle_clock の TLV を取り、skip は TLV 0x02。WireBase.connections() と detach(force=)。RiscvDm.run(timeout_ms=None) は probe の max_op_ms(core.max_op_ms)で、0xFFFFFFFF ではなくなった。
  • (EN) Breaking: console - marks carry time_ns (u64, the probe's one clock; Mark.time_ns, 22 bytes), a stream lives while anything uses it (the sessions that opened it, a bound slot; close takes one share; a lapse takes the session's), one live stream per connection (another mechanism: unavailable cause 6), a closed stream of the same place and mechanism comes back under its old number, mark closed (0x09) with why, the lock-free streams op (Console.streams() -> StreamInfo), a write that fits nothing is completed failed. Connections and streams share one u16 number space (wrapping); a number of the other kind is unavailable cause 6. registry.COMMON.enum holds read_from, read_flags, mark_kind and the mark details (they left the console's enum).
  • (JA) 破壊的変更: console - マークは time_ns(u64、probe の 1 本の時計。Mark.time_ns、22 byte)。ストリームは使っているもの(open したセッション、bind されたスロット)がある間生きる(close は自分の分、lease 切れはセッションの分を外す)。1 つの connection に生きているストリームは 1 つ(別の mechanism は unavailable cause 6)。閉じたストリームは同じ場所・同じ mechanism の open で同じ番号で戻る。マーク closed(0x09)に理由。ロック不要の streams op(Console.streams() -> StreamInfo)。何も入らなかった write は completed failed。connection とストリームは 1 つの u16 の番号空間(一周する)で、別の種類の番号は unavailable cause 6。registry.COMMON.enum に read_from、read_flags、mark_kind とマークの detail(console の enum から移った)。
  • (EN) Breaking: capture - every start is a generation (u32): start answers blocking_ms generation, status state serial_done write_pos flags generation [TLV error] (LogicCapture.status() -> Status, still iterable as the old 4-tuple), segment records are 37 bytes (Segment.generation), read is generation position max, release generation serial (another generation: unavailable cause 6), streaming data frames carry TLV generation (stream() drops another generation's, Received.stale); LogicCapture.generation / read(..., generation=); read_segment(segment) passes the segment's own. Trigger values are u32; segments answers have more; state 5 goes on by itself after release (no stopped 2 event); describe channels layouts / trigger types are u32, rate_list / group tracks / budget carry n; Calibration.vrefint_nominal_mv, factory data has raw_len; the group's start answers each track's generation (CaptureGroup.generations), its events are triggered 0x03 / stopped 0x02.
  • (JA) 破壊的変更: capture - start ごとに世代(u32): start の応答 blocking_ms generation、status state serial_done write_pos flags generation [TLV error](LogicCapture.status() -> Status。前の 4 つ組としても展開できる)、区画の情報は 37 byte(Segment.generation)、read は generation position max、release は generation serial(違う世代は unavailable cause 6)、ストリーミングのデータフレームは TLV generation を持つ(stream() は別の世代を捨てる。Received.stale)。LogicCapture.generation / read(..., generation=)。read_segment(segment) は区画の世代を付ける。trigger の value は u32。segments の応答に more。state 5 は release で自動で再開(stopped 2 の出来事は無い)。describe の channels の layout / trigger の types は u32、rate_list / 組の tracks / budget は n を持つ。Calibration.vrefint_nominal_mv。factory に raw_len。組の start は各トラックの世代を返す(CaptureGroup.generations)、組の出来事は triggered 0x03 / stopped 0x02。
  • (EN) Breaking: fixture - gpio read answers n n×level, its describe modes is u32 (a mode the probe lacks is unsupported with channel / index TLVs; mode 8+ malformed); the UART's stream is made by the plan (RX or TX) and goes with it, its position never going back within a boot; FixtureUart.status() (op 0x07) -> UartStatus (configured is a name: default / session / item / item_fallback, registry uart_configured); an undefined format bit is malformed, an undeclared format unsupported, a baud more than 5 % off unsupported; i2c / spi errors are u32, read_rx reads its TLV tail (last_ns), describe queue_depth.
  • (JA) 破壊的変更: fixture - gpio read の応答は n n×level、describe の modes は u32(持たない mode は channel / index の TLV つきの unsupported。mode 8 以上は malformed)。UART のストリームは plan(RX か TX)が作り、plan と一緒に消える。位置は起動の中で戻らない。FixtureUart.status()(op 0x07)-> UartStatus(configured は名前: default / session / item / item_fallback、registry の uart_configured)。format の未定義のビットは malformed、宣言に無い format は unsupported、±5% を超える baud は unsupported。i2c / spi の errors は u32、read_rx は TLV の後ろを読む(last_ns)、describe に queue_depth。
  • (EN) The fake probe follows all of it (the working spec): boot_id in confirm, expired and resumed 2, one resource number space, the heartbeat boot_id uptime_ns, the plan's plan_roles limit and reason table, attach's reset TLV / required max_speed / scan TLVs, dmi / run answers with nvals (run's FakeTarget.unstoppable for stopped 2), the console's stream lifetime and streams, gpio modes, the UART's plan-made stream / status / formats, probe.config's state / unset / uart item / canonical hash, capture generations and the group's generations TLV. Its describes declare max_op_ms 10000, plan_roles, discoverable (was oep_pid), gpio modes, UART formats. USB: the vendor interface is told by class 0xFF, subclass 0x4F, protocol 0x45 and a probe by its iProduct OEP alone (registry.USB).
  • (JA) fake の probe もすべてに追随した(動く spec): confirm の boot_id、expired と resumed 2、資源番号の 1 つの空間、ハートビート boot_id uptime_ns、plan の plan_roles の上限と断り方の表、attach の reset TLV / 必須の max_speed / scan の TLV、nvals を持つ dmi / run の応答(stopped 2 は FakeTarget.unstoppable)、console のストリームの寿命と streams、gpio の modes、UART の plan が作るストリーム / status / formats、probe.config の state / unset / uart 項目 / 正規形の hash、capture の世代と組の世代の TLV。describe は max_op_ms 10000、plan_roles、discoverable(oep_pid から改名)、gpio の modes、UART の formats を宣言する。USB: vendor の interface は class 0xFF・subclass 0x4F・protocol 0x45 で、probe は iProduct OEP だけで見分ける(registry.USB)。

Repository: https://github.com/Open-Embedded-Probe/oep-client-python

Full Changelog: v0.0.21...v0.0.22