)]}'
{
  "log": [
    {
      "commit": "d8d2249fd9a435eae5eec7b1e3a59c325334f365",
      "tree": "f11718b78ce5b386e0fa38f7cb45bf93d1948250",
      "parents": [
        "c5099be4f48a24347767def517540446c218a1cd",
        "b1c7bf1d50366792ddcaf9f391de26c77d118177"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Mon Oct 19 23:35:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 23:35:11 2026 +0200"
      },
      "message": "Merge pull request #3857 from dmitrykos/stk_port\n\nAdd abstraction layer for SuperTinyKernel RTOS (STK)"
    },
    {
      "commit": "b1c7bf1d50366792ddcaf9f391de26c77d118177",
      "tree": "23656152f374ffc1616631a1c99c3c8941c7b047",
      "parents": [
        "52e4f748a396bc12c3cfcf247c44f794fc768127"
      ],
      "author": {
        "name": "dmitrykos",
        "email": "dmitrykos@neutroncode.com",
        "time": "Mon Oct 19 19:42:22 2026 +0300"
      },
      "committer": {
        "name": "dmitrykos",
        "email": "dmitrykos@neutroncode.com",
        "time": "Mon Oct 19 19:42:22 2026 +0300"
      },
      "message": "Fix OSAL semaphore not being binary: it used STK’s default maximum count (65534), so repeated posts could leave extra tokens; the maximum is now (1).\n"
    },
    {
      "commit": "52e4f748a396bc12c3cfcf247c44f794fc768127",
      "tree": "8915a2203cca6900b0a30e8b21dac505b7e522db",
      "parents": [
        "968895e019c76c4c253d852a177e17f422e8d56c"
      ],
      "author": {
        "name": "dmitrykos",
        "email": "dmitrykos@neutroncode.com",
        "time": "Mon Oct 19 13:48:57 2026 +0300"
      },
      "committer": {
        "name": "dmitrykos",
        "email": "dmitrykos@neutroncode.com",
        "time": "Mon Oct 19 13:48:57 2026 +0300"
      },
      "message": "Fix osal_task_handle_t declared as uintptr_t throws warning.\nFix sub-tick delays and timeouts truncating to 0 ticks.\nFix stk_*_create usage due to STK C API change.\nRemove dependence on tusb_config.h.\nUse non-recursive stk::sync::FastMutex.\n"
    },
    {
      "commit": "c5099be4f48a24347767def517540446c218a1cd",
      "tree": "9f9d6be7a7a5395c50fed8f60fd5fe12b05f5ad9",
      "parents": [
        "65fd47cee6b6430d911c2614fbca749e3dbaf581"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 19 09:59:40 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:59:40 2026 +0700"
      },
      "message": "hil: close run_cmd\u0027s and run_alongside\u0027s fork-to-try signal window (#4249)"
    },
    {
      "commit": "65fd47cee6b6430d911c2614fbca749e3dbaf581",
      "tree": "3d93ad1a0c55eb86668de1bbe157a4abea12cba6",
      "parents": [
        "687ab4723e7b51787cf29e67a1144fdc3845b5e5"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Mon Oct 19 04:04:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:04:59 2026 +0700"
      },
      "message": "Run the agent skill scripts on Windows (#4247)"
    },
    {
      "commit": "687ab4723e7b51787cf29e67a1144fdc3845b5e5",
      "tree": "acf010a3f54dc3ce9669c495e008e96c735caefe",
      "parents": [
        "1c1df637f8e776e1bb463c5e773d7c5df5f6d2a6"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sun Oct 18 23:18:01 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 23:18:01 2026 +0700"
      },
      "message": "hil: take usb-kernel-recover from agentrc and reserve a root-port cycle host-wide (#4248)"
    },
    {
      "commit": "1c1df637f8e776e1bb463c5e773d7c5df5f6d2a6",
      "tree": "78e8f13c57d399b8d61797ce3ab1a00a5438a483",
      "parents": [
        "f90c1c0376f399fae259860d9cb33007645a53d7",
        "04cf5d5fcf0cdd140b68b40f33bd928785a90ce7"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Sun Oct 18 15:47:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 15:47:07 2026 +0200"
      },
      "message": "Merge pull request #4113 from Zipdox2/master\n\nAdd several unit descriptors and expand TU_ARGS_APPLY"
    },
    {
      "commit": "f90c1c0376f399fae259860d9cb33007645a53d7",
      "tree": "fea24f59042e5b78433a9466e00d01b37c4a459d",
      "parents": [
        "2f675abdd182163d03d4b25b47ad03497da23b1a",
        "60e368e106a2c8e7fb218bf2d8280dda4b8ee6d8"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Sun Oct 18 15:45:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 15:45:20 2026 +0200"
      },
      "message": "Merge pull request #4114 from r3wretrhy/fix/osal-none-volatile-cxx20-4103\n\nosal_none: avoid ++/-- on volatile semaphore count"
    },
    {
      "commit": "2f675abdd182163d03d4b25b47ad03497da23b1a",
      "tree": "dc128dc6bae62ad3eb25c1425688027982720650",
      "parents": [
        "98741b55959564746998d0453c32d87064629d7c"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sun Oct 18 15:03:47 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 15:03:47 2026 +0700"
      },
      "message": "hil: fail-closed lock, usbtest retry history, shared harness scripts from agentrc at a pin (#4245)\n\nThe HIL board lock failed open when its lock dir was unusable; it now refuses. hil_report keeps per-case usbtest\nstatuses, skipped cells and earlier attempts (closes #4226). The lock mechanics, RTT console and bounded USB\nobservation are loaded from lib/agentrc at the commit tools/get_deps.py pins (hathach/agentrc#117, #121) through\ntest/hil/helper/agentrc.py; tinyusb\u0027s own copies and the superseded rtt plan and spec are gone.\n\nHardware: ci.lan lpcxpresso55s69 cdc_msc OK, usbtest 30/30, board_test OK at 48d49ef22 (hil-1792299100). Tests:\ntest/hil 470, change-impact 293, .claude/test 289. CI red only from 33 HIL cells accepted as rig-side."
    },
    {
      "commit": "98741b55959564746998d0453c32d87064629d7c",
      "tree": "66ae284e1b63429ab7ef0aded6c4da414fba28dc",
      "parents": [
        "78bb90d22009be779afe768b1105f0126716ff62"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sat Oct 17 15:26:59 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 15:26:59 2026 +0700"
      },
      "message": "hil: rename the HIL contract to hil-contract and keep only TinyUSB\u0027s mechanics (#4225)\n\n* hil: rename the HIL contract to hil-contract and keep only TinyUSB\u0027s mechanics\n\nagentrc\u0027s hil skill now holds the rules every project shares (locks,\nrunning, reporting, verdicts, retries); this page keeps hosts and\nrosters, selection, build receipts, local and remote execution,\nreservation, results, recovery and limits under its eight sections.\nRequires hathach/agentrc#83.\n\n* hil-contract: hold other projects\u0027 names separately and list what the report hides\n\n* hil-contract: name the usbtest failure line without its colored status\n\n* hil-contract: name the reply\u0027s skipped and usbtest fields and state the usbtest retry rule once\n\n* hil-contract: scope the operator retry to test failures and classify usbtest aborts and filtered tests\n\n* hil-contract: keep the first retry attempt, classify usbtest aborts by cause and scope the retry per variant\n\n* hil-contract: gate the retry on a blocker row, classify unlisted usbtest aborts and list a re-run regression\n\n* hil-contract: keep retried for a locked retry, decide a pass-then-fail row by its re-run and pin the roster skip line\n\n* hil-contract: fold the enumerated usbtest blocker lines into the did-not-run default\n\n* hil-contract: allow retried {} when no retry ran\n\n* hil-contract: keep the extraction to the harness\u0027s output and name what it hides\n\nRevert the operator-authored reply fields and the retry and verdict rework to the first commit\u0027s wording, keeping the separate cross-project hold. State what the report cannot show (#4226), the fail-open lock dir, the exit mapping, what an empty selection leaves uncovered and a failed flash\u0027s FAIL cell.\n\n* hil-contract: point the shared lock and retry rules at hil and list the report\u0027s folds in Limits"
    },
    {
      "commit": "78bb90d22009be779afe768b1105f0126716ff62",
      "tree": "fc24a96641f4e22cc087d3eb1d7600ec0e45b939",
      "parents": [
        "3c6524eb95c0055d3acb18ac37220ff0a48ee326"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sat Oct 17 15:04:24 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 15:04:24 2026 +0700"
      },
      "message": "hil: replace lpcxpresso55s28 with lpcxpresso55s69 on the ci rig (#4240)"
    },
    {
      "commit": "3c6524eb95c0055d3acb18ac37220ff0a48ee326",
      "tree": "116329f7c664d5320e839f79ac168a4682602ddb",
      "parents": [
        "d668b0abb7219b9ce324fa88d46604bb9e869973",
        "b4d19c7bd1a8e65301ae5f419c66ec4283b6053d"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Fri Oct 16 10:32:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 10:32:21 2026 +0200"
      },
      "message": "Merge pull request #4237 from rhgndf/wch-usbhs-connect-disconnect\n\nAdd support for connect/disconnect in WCH USBHS"
    },
    {
      "commit": "b4d19c7bd1a8e65301ae5f419c66ec4283b6053d",
      "tree": "116329f7c664d5320e839f79ac168a4682602ddb",
      "parents": [
        "d668b0abb7219b9ce324fa88d46604bb9e869973"
      ],
      "author": {
        "name": "Jie Feng",
        "email": "hjf3108@gmail.com",
        "time": "Wed Oct 14 15:29:13 2026 +0800"
      },
      "committer": {
        "name": "Jie Feng",
        "email": "hjf3108@gmail.com",
        "time": "Fri Oct 16 11:56:40 2026 +0800"
      },
      "message": "Add support for connect/disconnect in WCH USBHS\n"
    },
    {
      "commit": "d668b0abb7219b9ce324fa88d46604bb9e869973",
      "tree": "55b068285c3e9baaaf266b9b566a0bf978994458",
      "parents": [
        "ea1d867ced5259d49679f481e5d4e21a36dc11b0"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 16 10:16:57 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 10:16:57 2026 +0700"
      },
      "message": "espressif: drop CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK from the example defaults (#4236)\n\nOn a RISC-V target (P4, S31) with a debugger attached, every context switch\nre-arms the stack watchpoint through a semihosting ebreak, so openocd halts\nthe core at task rate: USB service stops, the attach itself sometimes lands\nin the panic handler, and the chip boot-loops after openocd exits. ESP-IDF\nleaves the option off by default and the canary stack check stays on.\nDropping it frees one hardware trigger and shrinks configMINIMAL_STACK_SIZE\nby 60 bytes, so tasks sized from that constant get smaller allocations,\npartly offset by the up-to-60-byte region the watchpoint reserved."
    },
    {
      "commit": "ea1d867ced5259d49679f481e5d4e21a36dc11b0",
      "tree": "0d528dfeb7bb4ba54be078f07af31eade95f2278",
      "parents": [
        "ec7be1ed1d74de8929782c5dfc1f358a2b088db8"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 15 11:14:06 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 11:14:06 2026 +0700"
      },
      "message": "change_impact: treat src/**/*.py as non-code (#4235)\n\ndwc2_info.py is a hand-run helper no build reads; the port rule sent a one-line edit to it to 22 dwc2 families and 9 HIL boards."
    },
    {
      "commit": "ec7be1ed1d74de8929782c5dfc1f358a2b088db8",
      "tree": "33784b4193ef021d1d60f3f4cf7d9da57e3a80de",
      "parents": [
        "4536bb27b6c9987c4cf112af9e620e2af8e98f66"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 15 10:23:21 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:23:21 2026 +0700"
      },
      "message": "dwc2: serialize slave TX FIFO writes and flushes across cores (#4234)\n\nOn dual-core targets the slave-mode ISR TX FIFO write and the TX FIFO flush ran unlocked against the task on the other core, truncating packets (#4229). Take usbd_spin_lock around both."
    },
    {
      "commit": "4536bb27b6c9987c4cf112af9e620e2af8e98f66",
      "tree": "473d842dd0b5cd1f2246d73c1a1634b32191ce95",
      "parents": [
        "4c195b7b94f813a37b77b184bcae7b2b6ef2835e"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 15 10:18:57 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:18:57 2026 +0700"
      },
      "message": "espressif: add ESP32-S31 Function CoreBoard (#4228)\n\nDevice role on the J4 HS OTG port (A-to-A cable; J4 VBUS is always on). board_get_unique_id() reads the factory MAC-48, not the EUI-64. Adds the S31 to dwc2_info."
    },
    {
      "commit": "4c195b7b94f813a37b77b184bcae7b2b6ef2835e",
      "tree": "5c3537bfb02ec502234f9d2fd1637339b325e8c1",
      "parents": [
        "6f68a6245f6cfd352ca54b456cf039c535729eca"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 14 15:10:27 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 15:10:27 2026 +0700"
      },
      "message": "ci: pin the ESP-IDF docker image in toolchain.json (#4224)\n\nCloses #4217."
    },
    {
      "commit": "6f68a6245f6cfd352ca54b456cf039c535729eca",
      "tree": "4dcc1040e9dc465e5d9fe01d83489e57ce4a6324",
      "parents": [
        "2b67b130e17192149280c03b113aa968abadd44d"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 14 01:25:52 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 01:25:52 2026 +0700"
      },
      "message": "Add security policy (#4227)"
    },
    {
      "commit": "2b67b130e17192149280c03b113aa968abadd44d",
      "tree": "b101ee72cd324cb3a37e406aa1ab1a9b78dab266",
      "parents": [
        "229b955a74e8909dc4cb3f44e20a7a0815770e0b"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 13 18:12:31 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 18:12:31 2026 +0700"
      },
      "message": "test/fuzz: build with CMake, keep the OSS-Fuzz make entry points (#4219)\n\nCloses #4209."
    },
    {
      "commit": "229b955a74e8909dc4cb3f44e20a7a0815770e0b",
      "tree": "29014f082ec6ff788d5ebc6e17428e2235df54c9",
      "parents": [
        "73ce3f8361eaee0fd0fb80e72be4ef00e6a5acc6"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 13 18:08:53 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 18:08:53 2026 +0700"
      },
      "message": "espressif: require ESP-IDF 5.3 or later (#4218)"
    },
    {
      "commit": "73ce3f8361eaee0fd0fb80e72be4ef00e6a5acc6",
      "tree": "9b95a7c142b9ab3fdad7e20ae3ac587c3c1a1fdb",
      "parents": [
        "5033903dc4bd97938c3fe20677b07fa08436cb17"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 13 15:55:54 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:55:54 2026 +0700"
      },
      "message": "espressif: build with ESP-IDF v6.1 (#4204)"
    },
    {
      "commit": "5033903dc4bd97938c3fe20677b07fa08436cb17",
      "tree": "d883ad58745f2c6642d9f60deaf5b93e97297526",
      "parents": [
        "60c248b311c9b8cd658d48d0c0296b7113f236b1"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 13 13:34:37 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 13:34:37 2026 +0700"
      },
      "message": "nrf5x: drop EP0 arms and stalls made for a superseded SETUP (#4068)\n\nA host that abandons a control transfer and sends a new SETUP could have the task\u0027s arm or stall for the old request complete or stall the new one. The SETUP event now carries an 8-bit tag id, usbd hands it to the DCD through the weak hook dcd_edpt0_setup_begin() and skips a SETUP the DCD reports superseded, and nrf5x drops EP0 arms and stalls whose tag is not the latest. Adds the usbtest late-answer request and test/hil/stale_setup.py.\n\nCloses #4058."
    },
    {
      "commit": "60c248b311c9b8cd658d48d0c0296b7113f236b1",
      "tree": "ddc6cee7f263ca0118906ada06f733bb3dcac1df",
      "parents": [
        "e99616dd618f836ccd9cd8030542417a18d658c5"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 13 12:00:07 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 12:00:07 2026 +0700"
      },
      "message": "Add OSS Scanner Dockerfile and threat model (#4208)\n\nBuild the fuzz harnesses and unit tests for Anthropic\u0027s OSS Scanner and describe the threat model. Classify .oss-scanner/ as metadata in change_impact.py."
    },
    {
      "commit": "e99616dd618f836ccd9cd8030542417a18d658c5",
      "tree": "dec317e77837071117b408d31e6c8f307bf2ab72",
      "parents": [
        "1a0e4020ecbf439b75b6b6fd7e8f4127c873d070"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 13 09:01:23 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:01:23 2026 +0700"
      },
      "message": "nrf5x: drop an OUT packet flagged before clear-halt released it (#4211)\n\nClear data_received with the SIZE.EPOUT write in dcd_edpt_clear_stall(), before clearing the stall, so a bulk OUT packet nRF ACKed before the stall is not DMAed into the next transfer. Fixes the nRF part of #4107."
    },
    {
      "commit": "1a0e4020ecbf439b75b6b6fd7e8f4127c873d070",
      "tree": "0e04534d80029c70e26b6fd543563ceb5cec75f3",
      "parents": [
        "efab607b8b738224c27b5e9e6410f8c74da43373",
        "f7d5906857e39e7d6b89991986e10abcc0c8a0ef"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 12 11:00:59 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 11:00:59 2026 +0700"
      },
      "message": "Merge pull request #4207 from hathach/claude/readme-review-badges\n\nREADME: add CodeRabbit and Greptile badges"
    },
    {
      "commit": "f7d5906857e39e7d6b89991986e10abcc0c8a0ef",
      "tree": "0e04534d80029c70e26b6fd543563ceb5cec75f3",
      "parents": [
        "efab607b8b738224c27b5e9e6410f8c74da43373"
      ],
      "author": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 12 10:56:24 2026 +0700"
      },
      "committer": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 12 10:56:24 2026 +0700"
      },
      "message": "README: add CodeRabbit and Greptile badges, move License after Sponsor\n"
    },
    {
      "commit": "efab607b8b738224c27b5e9e6410f8c74da43373",
      "tree": "3e7bd69c8f0c2f8145e27d09d81c3d3818e468f9",
      "parents": [
        "8ec9bf6ab5acb7cfc4f9a4483828862ab044298f",
        "0e449ae63a5ab3ed1e37d779549f51ed8fb85ef4"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sun Oct 11 16:01:13 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 16:01:13 2026 +0700"
      },
      "message": "Merge pull request #3776 from mikeysklar/hub-recover-stuck-int-poll\n\nhub: recover a stuck status-change interrupt poll (Fruit Jam CH334F USB host)"
    },
    {
      "commit": "8ec9bf6ab5acb7cfc4f9a4483828862ab044298f",
      "tree": "c665ff0e8a32b5c5a591fb0b42068b9f4591a106",
      "parents": [
        "3174e76034edd019a9713c3f21f837b6ef14bca4"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sun Oct 11 15:57:15 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 15:57:15 2026 +0700"
      },
      "message": "nrf5x: wait for a running EasyDMA to end before reading SETUP data (#4164)\n\n- handle_setup_isr waits up to 21 scans (~190 us) for a running DMA\u0027s END: on nRF52840 the SETUP registers read zero during an EPOUT DMA.\n- The request direction is captured with the SETUP instead of re-reading BMREQUESTTYPE.\n\nCloses #4060"
    },
    {
      "commit": "3174e76034edd019a9713c3f21f837b6ef14bca4",
      "tree": "f241febb6d6db77a4cd27342d564135afe510ce4",
      "parents": [
        "3ab3f9209a27eac15c464e31caec355c7b06b5cb"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sun Oct 11 10:01:28 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 10:01:28 2026 +0700"
      },
      "message": "rp2040/hcd: abort host interrupt endpoint transfers (#4177)\n\nhcd_edpt_abort_xfer() refused interrupt endpoints, but usbh releases the endpoint anyway, so the next transfer panicked \"buf_ctrl already available\".\n\nAbort now stops the slot via INT_EP_CTRL, settles the data toggle and returns; the SOF interrupt reclaims the buffer two frames later and starts a transfer queued meanwhile. On RP2350 a poll can still run in the frame after the abort reads SOF_RD, so the second frame is required. Interrupt slots are allocated from the endpoint pool; on RP2040 the EPX SOF round-robin still runs first after SOF (#3964).\n\nFixes #4167. Refs #4168."
    },
    {
      "commit": "0e449ae63a5ab3ed1e37d779549f51ed8fb85ef4",
      "tree": "fe01032f01bcae27873af18eb74b18b2a43a0d9c",
      "parents": [
        "2c023b949d3786339bf085f9a5b1cee9539392d5"
      ],
      "author": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 09 14:59:47 2026 +0700"
      },
      "committer": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Sat Oct 10 23:46:46 2026 +0700"
      },
      "message": "hub: carry the port status callback in the transfer and tighten the recovery\n\nhub_port_get_status() passes the caller\u0027s callback straight to\ntuh_control_xfer() and leaves the port status in the hub\u0027s ctrl_buf, so\nno callback slot is lost when hub_close() runs before usbh fails the\nhub\u0027s requests (enumeration behind an unplugged hub never got FAILED and\nblocked later attaches). A removed hub\u0027s late status completion returns\nwithout re-arming. Enumeration fails on a non-successful port status read\ninstead of decoding stale ctrl_buf.\n\nThe stuck-poll recovery counts only FAILED/STALLED/TIMEOUT, triggers after\n3 of them (each FAILED is already 3 transaction errors, USB 2.0 5.3.2),\nreads ports 1..bNbrPorts then the hub\u0027s own status so a latched hub\nchange is not missed, and advances only on an accepted request. Add hub\nunit tests.\n"
    },
    {
      "commit": "3ab3f9209a27eac15c464e31caec355c7b06b5cb",
      "tree": "bb6563ca1cda9a832466367b54f54b36bd050ae9",
      "parents": [
        "5f3d88cdbe87ede4fcaddc6a095dcf2edb100f65"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sat Oct 10 10:24:42 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 10:24:42 2026 +0700"
      },
      "message": "nrf5x: release a DMA in flight across close_all, bus reset and unplug (#4066)\n\n- END interrupts stay enabled; a retired transfer\u0027s END is dropped by its xferid.\n- close_all waits for a running DMA unless it predates a bus reset; unplug waits a bounded time.\n- hil: teardown_stress.py; nrf52840dk replaces feather_nrf52840_express on the ci rig; cdc_msc_throughput sets its tty raw without waiting for a drain.\n\nCloses #4057"
    },
    {
      "commit": "5f3d88cdbe87ede4fcaddc6a095dcf2edb100f65",
      "tree": "6d34bff4a451dec572ccc0678bd2ab02d2dc01c8",
      "parents": [
        "a8c8a1c331dbc1664b0b9a61adb02b2bf1d3e85e"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 09 18:37:52 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 18:37:52 2026 +0700"
      },
      "message": "rusb2: fix SQCLR/ACLRM preconditions and RA6M5 USBHS pipe handling (#4146)\n\n- pipe_reset(): reach PID\u003dNAK and PBUSY\u003d0 out of CURPIPE before SQCLR/ACLRM, hold ACLRM \u003e\u003d100 ns\n- RA6M5 USBHS: per-pipe PIPEBUF; park OUT packets that arrive unarmed instead of dropping them\n- keep a halt when a transfer is submitted on a halted pipe; quiesce pipes on close; EP0 drain completes in the caller\u0027s context\n- RA: no .bin except dfu-util boards; HIL: ra6m5_ek with openocd reset recovery\n\nFixes #4038, closes #4150"
    },
    {
      "commit": "a8c8a1c331dbc1664b0b9a61adb02b2bf1d3e85e",
      "tree": "924dd97557370a55c5d6353e2d74f8bfee248e66",
      "parents": [
        "e20482387575da72b11d84ed008b25a28e068a01",
        "8193ac5b5277ca36a77fbef4df973ba77a6be049"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 09 18:11:26 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 18:11:26 2026 +0700"
      },
      "message": "Merge pull request #3865 from kkitayam/fix_rx_family_compile_errors\n\nFix RX65N CMake build and RFP flashing"
    },
    {
      "commit": "2c023b949d3786339bf085f9a5b1cee9539392d5",
      "tree": "fe9793e53b54bee395aa1df3045aa74225b60e4d",
      "parents": [
        "e20482387575da72b11d84ed008b25a28e068a01"
      ],
      "author": {
        "name": "Mikey Sklar",
        "email": "mikeysklar@gmail.com",
        "time": "Sat Jul 18 09:53:26 2026 -0700"
      },
      "committer": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 09 02:06:03 2026 +0700"
      },
      "message": "hub: recover a stuck status-change interrupt poll (Fruit Jam CH334F USB host)\n\nWhen a device is unplugged from a hub port, the hub reports it on the\nstatus-change interrupt endpoint. On some hosts that interrupt transfer starts\nfailing (XFER_RESULT_FAILED) repeatedly instead of delivering the change, and\nhub_xfer_cb just re-arms it, so the removal is never seen and tuh_umount_cb is\nnever called. The device stays mounted and every transfer to it fails.\n\nAfter HUB_INT_FAIL_RECOVER consecutive failed polls, poll a port status directly\n(one port per recovery so every port is covered) so the latched change is still\nfound and handled through the normal path. State is per hub.\n\nReproduced with CircuitPython on an Adafruit Fruit Jam (RP2350, PIO USB host\nwith an onboard CH334F hub). Run the loop below and unplug the device from a hub\nport a few times. Before this change, after some unplugs it prints the USBError\nline forever; after it, every unplug prints \"no device\".\n\n    import time, usb.core\n    while True:\n        d \u003d list(usb.core.find(find_all\u003dTrue))\n        if not d:\n            print(\"no device\")\n        else:\n            try:\n                print(\"device:\", d[0].product)\n            except usb.core.USBError:\n                print(\"USBError, device wedged, not removed\")\n        time.sleep(0.5)\n"
    },
    {
      "commit": "e20482387575da72b11d84ed008b25a28e068a01",
      "tree": "e7612104af41108e389b7fd2bcdd5e059f2c8b27",
      "parents": [
        "a6c63450b128117927606ef7d441051792691d22"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 08 19:13:46 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 19:13:46 2026 +0700"
      },
      "message": "rp2040/hcd: abort EPX transfers and release the buffer of a failed one (#4166)\n\nThe usbh control watchdog (#3862) relies on hcd_edpt_abort_xfer(), which was\na stub here: a timed-out transfer stayed live on EPX, the round-robin resumed\nit later, and its RX timeout left epx_buf_ctrl AVAILABLE, so the next transfer\npanicked \"buf_ctrl already available\". A STALLed control IN leaves it the same\nway. Abort and device close (dev0 included) now stop the SIE and release EPX,\nand a STALL or RX timeout releases the buffer and its pending BUFF_STATUS.\n\nFixes #4108, fixes #3874."
    },
    {
      "commit": "a6c63450b128117927606ef7d441051792691d22",
      "tree": "b17a131f9afd126f681d5fff1b24349c9e3f0f49",
      "parents": [
        "caffd17f022aa7965b0f03cf57a60930d165d68d"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 08 16:07:12 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 16:07:12 2026 +0700"
      },
      "message": "build.py: forward -D to idf.py, share example selection with code_size (#4161)\n\nFixes #4155. Fixes #4156."
    },
    {
      "commit": "caffd17f022aa7965b0f03cf57a60930d165d68d",
      "tree": "ac38a156a3aeab12d6e9abc9bd6bf201a68aa0fb",
      "parents": [
        "4162b37da56f37f606241b7c3aa29534ecf2405a"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 08 13:35:14 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 13:35:14 2026 +0700"
      },
      "message": "usbtest: drill a board whose recovery flasher is not openocd (#4160)\n\nSTM32_Programmer_CLI -halt cannot stand in: on stm32g0b1nucleo DHCSR read the core running again after the CLI exited."
    },
    {
      "commit": "4162b37da56f37f606241b7c3aa29534ecf2405a",
      "tree": "bb7c279f028fb964cfc5b81d26c1a1ae10087a11",
      "parents": [
        "c57d44a9850ca947b12339c608578ca3d21ea846"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 08 12:57:23 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:57:23 2026 +0700"
      },
      "message": "audio: let the IN flow control track a source off USB SOF (#4132)\n\nThe blackout now holds off only a reversal, so repeated corrections can follow a source up to ~1% off SOF, and a Type I stream open trims the FIFO to its threshold. Fixes #4046."
    },
    {
      "commit": "c57d44a9850ca947b12339c608578ca3d21ea846",
      "tree": "9b6c471669a15d813e09a0531b4aab5d5b0d86c4",
      "parents": [
        "a05a6db83320e20757b4e29062e06a60dc65add7"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 08 12:41:29 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:41:29 2026 +0700"
      },
      "message": "dwc2/hcd: retire a closing DMA channel on its halt without re-arming it (#4151)\n\nIn buffer DMA mode the halt requested by edpt_close() can arrive with NAK,\nACK, NYET or XactErr. The per-direction handlers re-armed the channel for\nthose before their trailing closing check, so the channel was de-allocated\nwith HCCHAR.ChEna still set (W1S, cleared only by the core) and its next\ntransfer was never serviced. This defeated the enumeration retry after a\ncontrol timeout (#4096): the UDisk NAKs its first GET_DESCRIPTOR, the abort\nand dev0 close re-armed then retired EP0\u0027s channel, and the hub request that\nstarts the retry hung. Retire closing channels in the DMA halt early exit,\nalongside aborted ones, for both directions."
    },
    {
      "commit": "a05a6db83320e20757b4e29062e06a60dc65add7",
      "tree": "4166a5ce6432f4891d250629f2ef73ae394bce25",
      "parents": [
        "834c42cb83f36b19d23f2f514eb53cc6deafcf07"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Thu Oct 08 07:13:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:13:41 2026 +0700"
      },
      "message": "docs: add per-class device and host reference (#3806)\n\nReplace class_drivers.rst with docs/reference/class/, one page per class\ncovering configuration, APIs and callbacks, checked against the drivers.\nNote which callbacks run outside tud_task()/tuh_task().\n\nDriver bugs found along the way: #4135-#4144."
    },
    {
      "commit": "834c42cb83f36b19d23f2f514eb53cc6deafcf07",
      "tree": "b7f0770d20f153677133444ecce5d10db532760d",
      "parents": [
        "e42fa93570a672d4779b7a3d0e14145a3ae919e6"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 08 11:07:08 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:07:08 2026 +0700"
      },
      "message": "code_size: build through build.py\u0027s functions, share one size step between report and diff (#4145)\n\nSkip an -e example the board does not build, as build.py does; refuse unknown boards and examples. Closes #3989."
    },
    {
      "commit": "e42fa93570a672d4779b7a3d0e14145a3ae919e6",
      "tree": "29d91b128f8b33c67d8f4c6d21ebeb341bd753c1",
      "parents": [
        "97f453f5f47618861b912d4d4e23c69170be41a1"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 18:13:23 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:13:23 2026 +0700"
      },
      "message": "dcd_dwc2: serialize GINTMSK and DAINTMSK read-modify-write (#4115)\n\nTake usbd_spin_lock around the task and ISR RMWs of GINTMSK/DAINTMSK; on multi-core a stale write could leave RXFLVLM masked or lose SOFM.\n\nFixes #4105"
    },
    {
      "commit": "97f453f5f47618861b912d4d4e23c69170be41a1",
      "tree": "9bbd5e30163e427249714f9f830f56f494fa1755",
      "parents": [
        "d229dfdb4781586b4bf65146d517a60717f040c4"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 18:03:57 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:03:57 2026 +0700"
      },
      "message": "nrf5x: start EasyDMA from a pending bitmask in the USBD ISR (#4059)\n\nA blocked EasyDMA start took a usbd queue entry: lost when the queue was full and waiting on the usbd task. Requests are now bits in _dcd.dma_pending, started at the tail of the USBD ISR (EP0, ISO, then round-robin).\n\nAlso moves the ISR\u0027s sizeable event handling into functions and skips an OUT END for an unarmed transfer instead of asserting.\n\nCloses #4042"
    },
    {
      "commit": "d229dfdb4781586b4bf65146d517a60717f040c4",
      "tree": "c2ea77ea78f0aa8ab57cb4fce429cdeb798ca574",
      "parents": [
        "efa3e132235aefa4ef49d31c746c0c5f0c0e0bc9"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 17:46:09 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 17:46:09 2026 +0700"
      },
      "message": "hil: recover a board left wedged by a cancelled run (#4134)\n\nBefore a board\u0027s first flash, reset it through its convoy-safe recovery flasher when a D-state testusb left by a cancelled run holds its usbfs node. Treat STM32_Programmer_CLI as convoy-safe.\n\nFixes #4126."
    },
    {
      "commit": "efa3e132235aefa4ef49d31c746c0c5f0c0e0bc9",
      "tree": "bffa86a387e3c06abd2fe718d5c8d71fb8335cb3",
      "parents": [
        "d48bd84a519a7ee8fbc0cb2f36b8519757cec63b"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 16:42:27 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 16:42:27 2026 +0700"
      },
      "message": "hil: report every audio_test_freertos ramp gap and keep the failing capture (#4133)"
    },
    {
      "commit": "d48bd84a519a7ee8fbc0cb2f36b8519757cec63b",
      "tree": "791838babced80d1f25f08397a549bef61686ccb",
      "parents": [
        "a0fda5cf2ba133c6646217cc269704d54cfc2ebf"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 15:45:14 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 15:45:14 2026 +0700"
      },
      "message": "osal/rtx4: size the queue pool in bytes and fail send when it is exhausted (#4129)"
    },
    {
      "commit": "a0fda5cf2ba133c6646217cc269704d54cfc2ebf",
      "tree": "5e4bf6426404f6142241a3e2c4bf3d9d6b71f4dc",
      "parents": [
        "dbc77592304c75dad0264806fa3740e03b6cee67"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 15:40:42 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 15:40:42 2026 +0700"
      },
      "message": "docs: drop superpowers plans and specs for landed ci_hs firmware work (#4131)\n\nKeep the skill, agent, workflow and rig-tooling records for the agentrc migration."
    },
    {
      "commit": "dbc77592304c75dad0264806fa3740e03b6cee67",
      "tree": "b508b5a0e7e33bbb7287cbe9d5faf1a70ec3e3a5",
      "parents": [
        "09c244c116465caf11e369be6163a2276ae74cc1"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 15:09:46 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 15:09:46 2026 +0700"
      },
      "message": "hil: drop the per-controller throttles and prove every usbtest board\u0027s hang recovery (#4109)\n\nRemove the FLASH_PARALLEL and USBTEST_PARALLEL per-controller permits; convoy-safe probe-reset recovery now bounds a wedged usbtest instead. Every usbtest board must carry a convoy-safe flasher_recover, proven with the new wedge drill; add openocd recovery entries for the stlink boards, ek_tm4c123gxl and ra4m1_ek. Halve HS case 9 iterations, carry each board\u0027s controller in its result row, and delete obsolete superpowers design docs."
    },
    {
      "commit": "09c244c116465caf11e369be6163a2276ae74cc1",
      "tree": "3929a199bfe5ef78f568b0c26d9aec36fd7db88a",
      "parents": [
        "1b2f60efcec5f79369ce40d83daf674afea8451d"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 14:54:10 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 14:54:10 2026 +0700"
      },
      "message": "Skip device-stack examples on ESP targets without native USB (#4124)\n\ntusb_mcu.h rejects CFG_TUD_ENABLED on ESP32/C2/C3/C5/C6/C61/H2, so the four such boards configured device and dual examples that could not compile. Closes #3929."
    },
    {
      "commit": "1b2f60efcec5f79369ce40d83daf674afea8451d",
      "tree": "31613a1feb4bab631e6dd4c8bd38292a586abd58",
      "parents": [
        "acfe2ec829adb8d2b5f42e6850abfbec3b80eef7"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 14:40:57 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 14:40:57 2026 +0700"
      },
      "message": "osal/rtx4: return false when os_mbx_wait() times out in osal_queue_receive() (#4128)"
    },
    {
      "commit": "acfe2ec829adb8d2b5f42e6850abfbec3b80eef7",
      "tree": "16394021ba423706b6440c0da323c4ab82d4309e",
      "parents": [
        "64acc80ed6060c032bad1e2ea9033e58e6f4d763"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 13:17:37 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 13:17:37 2026 +0700"
      },
      "message": "Rename ci_select to change_impact (#4123)\n\nThe selector now answers both build and HIL impact, so it is named for what it does. CI hand-off files become selection.json; the obsolete selector design docs are removed, and the rule table lives only in the module docstring."
    },
    {
      "commit": "64acc80ed6060c032bad1e2ea9033e58e6f4d763",
      "tree": "36642c6d414d1e0dec7a645b6c3a2abee5077459",
      "parents": [
        "0695116231bed2f13879501b3799d655734c0131"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 12:55:44 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 12:55:44 2026 +0700"
      },
      "message": "stm32f723disco: restore the 216 MHz system clock (#4122)\n\n#3774 dropped SYSCLK to 72 MHz, breaking HIL host/cdc_msc_hid; restore PLL N\u003d432/P\u003d2/Q\u003d9."
    },
    {
      "commit": "0695116231bed2f13879501b3799d655734c0131",
      "tree": "c0c490b70b349ccc70130e03f61d9c309fcf98b8",
      "parents": [
        "5e4ba3d469aa36617704d3ad618e05ece167ee20"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 12:55:40 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 12:55:40 2026 +0700"
      },
      "message": "ch32v10x: scale the SysTick reload for its HCLK/8 time base (#4121)\n\nCH32V103 STK counts HCLK/8 (RM 9.5.3.1); the 1 ms tick ran 8x slow and failed HIL midi_test."
    },
    {
      "commit": "5e4ba3d469aa36617704d3ad618e05ece167ee20",
      "tree": "a5b643bcafb1f68b45266d285ee12216c9d69b9c",
      "parents": [
        "840ffe3ac152394347d27a0d4841f4c3c49ac944"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Wed Oct 07 11:11:21 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 11:11:21 2026 +0700"
      },
      "message": "ci: select builds and HIL from a validated manifest (#4104)\n\nCI build and HIL selection now come from one validated manifest (`check_build.py --select-only`): the selector replaces the path-filter gate, changed boards outside the pinned matrix get a `cmake-required` build, and every membrowse target uploads once per commit. Adds `coverage_audit.py` to check selection against real link graphs (0 missed builds over 247 master commits).\n\nHIL: 18 cells red, all failing or flapping on master too; this PR changes no firmware."
    },
    {
      "commit": "840ffe3ac152394347d27a0d4841f4c3c49ac944",
      "tree": "019f5a371080ac15844a345d846b93f5d3d8ad0a",
      "parents": [
        "b05fb182da76c039a87f2cf76340acea0f21e6df"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 06 23:35:31 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 23:35:31 2026 +0700"
      },
      "message": "Merge pull request #4106 from hathach/fix-issue-210\n\ndwc2: make dwc2_int_set the only port interrupt hook, build efm32 host examples"
    },
    {
      "commit": "b05fb182da76c039a87f2cf76340acea0f21e6df",
      "tree": "4894ce27ac1b8b7b6cd4dd38775c72d8b487333c",
      "parents": [
        "fb4dcf442ee46b70279fdf9b9cabe3e1ac419560",
        "7a52b312a035efd78dbb63ad3f26a297e0fb66e1"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Oct 06 18:25:53 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 18:25:53 2026 +0700"
      },
      "message": "Merge pull request #4013 from liangxiaoLv/dwc2-diepempmsk-rmw\n\ndcd_dwc2: serialize diepempmsk read-modify-write with usbd_spin_lock"
    },
    {
      "commit": "04cf5d5fcf0cdd140b68b40f33bd928785a90ce7",
      "tree": "d6d077a5d0d18bfa52a092d838dc3964ef59de62",
      "parents": [
        "8fdb30b506e3ca2d6b94f8d3c063a1d8f79932e6"
      ],
      "author": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 12:26:06 2026 +0200"
      },
      "committer": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 12:26:06 2026 +0200"
      },
      "message": "Parenthesize TUD_AUDIO20_DESC_MIXER_UNIT_LEN arguments\n"
    },
    {
      "commit": "8fdb30b506e3ca2d6b94f8d3c063a1d8f79932e6",
      "tree": "a31b1076665a9a59a7d9cb3b9391bf57a8a1bfb2",
      "parents": [
        "e775386b780b4f4a85a09a10a586b50bda86cdfc"
      ],
      "author": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:59:26 2026 +0200"
      },
      "committer": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:59:26 2026 +0200"
      },
      "message": "Expand TU_ARGS_APPLY to 17\n"
    },
    {
      "commit": "e775386b780b4f4a85a09a10a586b50bda86cdfc",
      "tree": "23e89c3dac9e54bb055f7546e93e291fdc8581ba",
      "parents": [
        "372922114de5ad3dfcd7d11d9bbb2867c9db9e1d"
      ],
      "author": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:49:31 2026 +0200"
      },
      "committer": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:49:31 2026 +0200"
      },
      "message": "Up/Down-mix processing unit descriptor\n"
    },
    {
      "commit": "372922114de5ad3dfcd7d11d9bbb2867c9db9e1d",
      "tree": "d074a92f271178660eb564062797ec0cbde84a62",
      "parents": [
        "0abfbcfebdb17e2a97c04a60ff5046b59b67c874"
      ],
      "author": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:44:21 2026 +0200"
      },
      "committer": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:44:21 2026 +0200"
      },
      "message": "Mixer unit descriptor\n"
    },
    {
      "commit": "0abfbcfebdb17e2a97c04a60ff5046b59b67c874",
      "tree": "1d6b237e2214e0d2d538ff9175292fe814f7c001",
      "parents": [
        "fb4dcf442ee46b70279fdf9b9cabe3e1ac419560"
      ],
      "author": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:38:46 2026 +0200"
      },
      "committer": {
        "name": "Zipdox2",
        "email": "zipdox@zipdox.net",
        "time": "Tue Oct 06 11:38:46 2026 +0200"
      },
      "message": "Add phantom power controls\n"
    },
    {
      "commit": "60e368e106a2c8e7fb218bf2d8280dda4b8ee6d8",
      "tree": "e73abd47463a7c74276325c8f3b441a9743859b0",
      "parents": [
        "fb4dcf442ee46b70279fdf9b9cabe3e1ac419560"
      ],
      "author": {
        "name": "Zhaoqi Xu",
        "email": "lzy00419@outlook.com",
        "time": "Tue Oct 06 15:57:44 2026 +0800"
      },
      "committer": {
        "name": "Zhaoqi Xu",
        "email": "lzy00419@outlook.com",
        "time": "Tue Oct 06 15:57:44 2026 +0800"
      },
      "message": "osal_none: avoid ++/-- on volatile semaphore count\n\nIncrement and decrement of a volatile-qualified object are deprecated\nsince C++20, so including tusb.h from a C++20 (or later) translation unit\nwith OPT_OS_NONE warns with -Wvolatile and fails under -Werror.\n\nUse an explicit read-modify-write instead. The generated code is the\nsame: count++/count-- on a volatile was already a non-atomic RMW.\n\nFixes #4103\n"
    },
    {
      "commit": "7a52b312a035efd78dbb63ad3f26a297e0fb66e1",
      "tree": "4894ce27ac1b8b7b6cd4dd38775c72d8b487333c",
      "parents": [
        "d2b6142bc34b0e10ffd9f8a21634f1fa0c54139e"
      ],
      "author": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 23:49:49 2026 +0700"
      },
      "committer": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 23:49:53 2026 +0700"
      },
      "message": "dcd_dwc2: replace diepempmsk comment block with per-site one-liners\n"
    },
    {
      "commit": "d2b6142bc34b0e10ffd9f8a21634f1fa0c54139e",
      "tree": "b4dd99e09ec609325ddb12ce18fbdcbed8cdff9d",
      "parents": [
        "fb4dcf442ee46b70279fdf9b9cabe3e1ac419560"
      ],
      "author": {
        "name": "liangxiao.lv",
        "email": "liangxiao.lv@potentia.ai",
        "time": "Mon Sep 28 16:52:02 2026 +0800"
      },
      "committer": {
        "name": "hathach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 23:49:53 2026 +0700"
      },
      "message": "dcd_dwc2: serialize diepempmsk read-modify-write with usbd_spin_lock\n\ndiepempmsk gates the TXFE (TxFIFO empty) interrupt of every IN endpoint in a\nsingle 32-bit register, and two places read-modify-write it:\n\n  edpt_schedule_packets()  sets the endpoint\u0027s bit\n  handle_epin_slave()      clears the endpoint\u0027s bit\n\nThey touch *different* endpoints\u0027 bits of the *same* word, so a write based on a\nstale snapshot wipes the other writer\u0027s bit.\n\nObserved interleaving (core0 \u003d USB ISR, core1 \u003d task submitting CDC data):\n\n  core0 (ISR)                                core1 (task)\n  set ep2: 0x00 -\u003e 0x04\n                                             read 0x04, write 0x14\n  clear ep2: read 0x04 (stale)\n             write 0x00  ------------------\u003e ep4\u0027s just-set bit is gone too\n\nThe victim is a bulk IN endpoint: its gate is now closed, so the already armed\ntransfer (DIEPTSIZ.XferSize \u003e 0) never gets its TXFE interrupt, nothing is moved\ninto the TxFIFO, and the transfer never completes - a bulk endpoint is only\nre-armed on completion. Isochronous endpoints re-arm every frame and therefore\nself-heal, which is why the failure presents as \"audio keeps working, CDC\nsilently dies\".\n\nLatch snapshot: DIEPTSIZ.XferSize \u003e 0, DTXFSTS \u003d 0, the endpoint\u0027s diepempmsk\nbit cleared.\n\nThe set side is already serialized: it only runs for non-EP0 endpoints, and\ndcd_edpt_xfer()/dcd_edpt_xfer_fifo() hold usbd_spin_lock() across the whole\nscheduling (dcd_edpt_close_all() zeroes the same register under that lock as\nwell). The clear side runs in the endpoint ISR, which does not hold it, so take\nthe same lock there - around the epin-\u003etsiz read as well as the update. The ISR\nqueues the transfer completion before reading tsiz, so the task can re-arm that\nendpoint in between, and a clear based on the pre-arm tsiz would wipe the bit of\nthe transfer that was just armed.\n\nThat is deliberately the existing lock and not a dedicated one: OSAL spinlocks\nmust not be nested. On OPT_OS_NONE each spinlock keeps its own nesting count, so\nreleasing an inner lock re-enables interrupts while the outer critical section\nis still running. Sharing it also keeps a single protection domain for the\nregister.\n\nValidated on ESP32-S3 with ESP-IDF 6.0 (composite UAC + CDC-ACM + DFU, host\nrecording audio and streaming CDC at the same time): putting a critical section\naround these two statements took the latch rate from 4 events / 6120 s to 0\nevents / 9600 s (~2.0e8 mask writes). That run serialized them with a separate\nOSAL spinlock in espressif/tinyusb 0.19.0~3; this patch gives the same mutual\nexclusion through the lock the writers already share.\n"
    },
    {
      "commit": "fb4dcf442ee46b70279fdf9b9cabe3e1ac419560",
      "tree": "e59a69d660b523f11ca78ae05ee6d8c5c8c51051",
      "parents": [
        "d8fb6ee6b789188d1a280413ebfd32a1d83ac2b9"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 23:21:48 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 23:21:48 2026 +0700"
      },
      "message": "dwc2: add dwc2_int_set to bcm, gd32 and xmc ports and build their host examples (#4100)\n\nhcd_dwc2.c calls dwc2_int_set(), which these port headers lacked, so any host build failed as efm32 did in #4082. Their USB IRQs now dispatch by role via tusb_int_handler(). Admit broadcom_32bit, gd32vf103 and xmc4000 to the bare-metal host examples for build coverage; host is not yet validated on hardware. hcdma takes a uintptr_t cast like dcd_dwc2.c so broadcom_64bit compiles the host driver."
    },
    {
      "commit": "d8fb6ee6b789188d1a280413ebfd32a1d83ac2b9",
      "tree": "2f7fc646165cd672f8f221e49bcad1bd1a75ceb2",
      "parents": [
        "dabc7514a7d8e388e6b18f8b5f9e576a4c9327d6"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 23:16:29 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 23:16:29 2026 +0700"
      },
      "message": "ci: verify a pinned sha256 for every toolchain download (#4098)\n\nFixes #4079"
    },
    {
      "commit": "dabc7514a7d8e388e6b18f8b5f9e576a4c9327d6",
      "tree": "1b980733d4ef9c5875767988132866a91a3fc0af",
      "parents": [
        "430fcd222dc83faac3ef0920da97c9e8c3452c8d"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 23:12:30 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 23:12:30 2026 +0700"
      },
      "message": "nrf: run FreeRTOS secure-only on Cortex-M33 BSPs (#4099)\n\nThe CM33 NTZ port started the first task with a Non-secure EXC_RETURN on the Secure-only nRF5340 app core and HardFaulted, so no FreeRTOS example enumerated on nrf5340dk. Also adds nrf5340dk to the ci.lan HIL rig.\n\nFixes #4071."
    },
    {
      "commit": "430fcd222dc83faac3ef0920da97c9e8c3452c8d",
      "tree": "7c1a2b50fa0ffec032a97646684c138ef783c0f6",
      "parents": [
        "aea34e5707e8e565f861b07417946e9b5492dc78"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 18:15:59 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 18:15:59 2026 +0700"
      },
      "message": "usbh: add control transfer timeout and enumeration retry (#3862)\n\nA device that ACKs SETUP but never completes a later stage froze the single control slot and, during enumeration, hub polling for every port.\n\n- CFG_TUH_CONTROL_TIMEOUT_MS (default 5000): per-transfer deadline; on expiry EP0 is aborted and the transfer completes XFER_RESULT_TIMEOUT.\n- CFG_TUH_ENUM_ATTEMPT_MAX (default 2): a device-side enumeration failure retries with a fresh port reset.\n- HIL: host/dual examples wait 12/8 s for enumeration; optional uart_uid console bridge."
    },
    {
      "commit": "aea34e5707e8e565f861b07417946e9b5492dc78",
      "tree": "c2b0d50779c8f9ba209be2dc8f62c2ed424fbfe0",
      "parents": [
        "b476581ef082db233d456d4097a0982262e84bbd"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 15:49:15 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 15:49:15 2026 +0700"
      },
      "message": "dwc2: fix efm32 host build and build efm32 in CI (#4090)\n\ndwc2_efm32.h lacked dwc2_int_set(), which hcd_dwc2.c calls, so host/audio_host failed to build for sltb009a; the efm32 USB IRQ now dispatches by role via tusb_int_handler(). CI never built efm32: add it to the matrix and fetch CMSIS_5 for it.\n\nFixes #4082"
    },
    {
      "commit": "b476581ef082db233d456d4097a0982262e84bbd",
      "tree": "a2555f4bb4f634e87ba38416a914fa62b2511ce4",
      "parents": [
        "b0d3e6ce043e009d5e13b7941b9d3c3327c126f4"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 15:41:58 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 15:41:58 2026 +0700"
      },
      "message": "ci: skip hil-hfp-iar before taking the runner when hfp.json is unaffected (#4097)"
    },
    {
      "commit": "b0d3e6ce043e009d5e13b7941b9d3c3327c126f4",
      "tree": "a70a2cbd0368be7ec695d684d2d1f115a02cf335",
      "parents": [
        "74f6ffd99f1f35ba519a2346973a835ea2127d1d"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 15:40:31 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 15:40:31 2026 +0700"
      },
      "message": "HIL: add a pyocd flasher, flash lpcxpresso55s28 over CMSIS-DAP (#4094)\n\npyocd has no VID/PID probe filter, so test/hil/pyocd/run_pyocd.py restricts pyusb discovery to the roster\u0027s vid_pid; user_script.py does an LPC55 debug-mailbox reset before pyocd\u0027s reset catch, whose flash blank check fails above 100 MHz (UM11126 5.3)."
    },
    {
      "commit": "74f6ffd99f1f35ba519a2346973a835ea2127d1d",
      "tree": "9d5b031f4d5227f734e8d16f2b0634be50a0e4ca",
      "parents": [
        "e37d9eba74a7aad55a85e143bc71d2a643990da1"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 14:15:26 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 14:15:26 2026 +0700"
      },
      "message": "membrowse_cli: fail one elf, not the run, on non-UTF-8 ninja output (#4093)\n\nCloses #4087."
    },
    {
      "commit": "e37d9eba74a7aad55a85e143bc71d2a643990da1",
      "tree": "bbd83e36ff1b0b29f5a6514b4d654beec0ec8642",
      "parents": [
        "1ded482f3573413402f63f0345e0284034696309"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 13:31:40 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 13:31:40 2026 +0700"
      },
      "message": "code_size: name the min and max build of each file in the PR comment (#4092)\n\nEach metric\u0027s min → max stays in one right-aligned cell; the board/example of each extreme gets its own column."
    },
    {
      "commit": "1ded482f3573413402f63f0345e0284034696309",
      "tree": "bbf8516c03d2d118714c34d2b1b46ef6bbf3990d",
      "parents": [
        "894b5d35b90b6bff4349a66fad1f3705f169c436"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 11:44:13 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 11:44:13 2026 +0700"
      },
      "message": "code_size: run report and diff on Windows (#4086)\n\n`tools/code_size.py report` and `diff` run on native Windows with `python -X utf8`: \u0027/\u0027 size keys and drive-less, case-insensitive filters, linker scripts read through ninja\u0027s cmd.exe wrapper, CMake-shortened objects keyed through build.ninja, and a timeout stops the whole command tree with taskkill. ESP-IDF, snapshot/compare and paths with spaces are not supported there; CI stays Linux-only."
    },
    {
      "commit": "894b5d35b90b6bff4349a66fad1f3705f169c436",
      "tree": "e600f2bb1eb569e29eca098ca730f301d4a1a723",
      "parents": [
        "c391fe9cb05abea9058ea3fc781c64e11bd057ab"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Oct 05 10:25:52 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 10:25:52 2026 +0700"
      },
      "message": "code-size skill: refresh a raced comment by re-running its code-size-comment job (#4089)"
    },
    {
      "commit": "c391fe9cb05abea9058ea3fc781c64e11bd057ab",
      "tree": "aa873d71bb600d0537f9175d3697b40a4614b1e9",
      "parents": [
        "e96850b8cfa292cbc1ad5e5126fcb82fe7708431"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Sat Oct 03 22:56:57 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 22:56:57 2026 +0700"
      },
      "message": "code_size: diff takes its base from CI\u0027s stored master snapshots (#4081)\n\n`tools/code_size.py diff` downloads the CI snapshots of the base commit by default, cached under ~/.cache, and falls back to a local base build when they are unavailable. CI pins pico-sdk to 2.3.1."
    },
    {
      "commit": "e96850b8cfa292cbc1ad5e5126fcb82fe7708431",
      "tree": "b6a63cbcf92a5d4cfb42b04176f7a3f2cf9c7baa",
      "parents": [
        "064afa3774cbbb2093d6af9805bdaa15b4e0f751",
        "cb00d33beaa18dc13237476b86f079d2e8d15353"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Sat Oct 03 15:23:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 15:23:18 2026 +0200"
      },
      "message": "Merge pull request #4083 from cycfi/gtb-midi-protocol\n\nmidi2: settable GTB bMIDIProtocol, default MIDI 2.0"
    },
    {
      "commit": "cb00d33beaa18dc13237476b86f079d2e8d15353",
      "tree": "b6a63cbcf92a5d4cfb42b04176f7a3f2cf9c7baa",
      "parents": [
        "0ffb6706dda5011c9c508a758ba2c184ee4f30b1"
      ],
      "author": {
        "name": "djowel",
        "email": "djowel@gmail.com",
        "time": "Sat Oct 03 08:47:06 2026 +0800"
      },
      "committer": {
        "name": "djowel",
        "email": "djowel@gmail.com",
        "time": "Sat Oct 03 08:47:06 2026 +0800"
      },
      "message": "Start a MIDI 2.0 interface in the protocol its Group Terminal Block declares, and test the default block\n"
    },
    {
      "commit": "0ffb6706dda5011c9c508a758ba2c184ee4f30b1",
      "tree": "831ebaaf7365f06a3014c3290e6b2038a12df971",
      "parents": [
        "064afa3774cbbb2093d6af9805bdaa15b4e0f751"
      ],
      "author": {
        "name": "djowel",
        "email": "djowel@gmail.com",
        "time": "Sat Oct 03 07:47:13 2026 +0800"
      },
      "committer": {
        "name": "djowel",
        "email": "djowel@gmail.com",
        "time": "Sat Oct 03 07:47:13 2026 +0800"
      },
      "message": "Make the Group Terminal Block\u0027s default MIDI protocol settable, MIDI 2.0 by default\n"
    },
    {
      "commit": "064afa3774cbbb2093d6af9805bdaa15b4e0f751",
      "tree": "9e3a63c5c356696a53dbab5891c262a476c4cb0e",
      "parents": [
        "01d1c455211b9b9db4c1062babe2555a79d11cb2"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 02 19:10:21 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 19:10:21 2026 +0700"
      },
      "message": "ci: use Arm GNU toolchain from Arm\u0027s GitLab instead of xpack (#4080)\n\nArm\u0027s official build is half the download, and as a non-GitHub URL setup_toolchain caches it. It is also the build developers install, so local code-size results match CI\u0027s."
    },
    {
      "commit": "01d1c455211b9b9db4c1062babe2555a79d11cb2",
      "tree": "ba10cdc4bd3128c883710ab55b95deb188b4d5bf",
      "parents": [
        "a68d8ab812bf037f6e3a13960341f5d891f2fd8f"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 02 18:21:39 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 18:21:39 2026 +0700"
      },
      "message": "ci: extract bz2/xz toolchains on cache miss, fetch them over https (#4077)"
    },
    {
      "commit": "a68d8ab812bf037f6e3a13960341f5d891f2fd8f",
      "tree": "57aba8abe2b909ba7843759f42c8ca217d02aef9",
      "parents": [
        "5c91559918254972fd803d125a2b52e6db511a95"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 02 15:40:06 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 15:40:06 2026 +0700"
      },
      "message": "ci: code size comment from stored master snapshots, ESP included (#4055)\n\n- Size pinned boards\u0027 examples (ESP-IDF and -DMA variants included) with membrowse 1.2.12 and store per-board snapshots as artifacts.\n- Compare a PR against the stored master snapshots and post one sticky comment: each changed TinyUSB file with its min to max Flash/RAM delta, plus what was not compared; the full report goes to the job summary and an artifact.\n- Retire the Membrowse PR comment.\n- Add tools/code_size.py report/diff for local runs, and the code-size skill."
    },
    {
      "commit": "5c91559918254972fd803d125a2b52e6db511a95",
      "tree": "ab4628c8b08726972b525b4060fd2b52372a4a04",
      "parents": [
        "e5cfecb904396c04cc16695b54a6ae494f57ce4c"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Fri Oct 02 01:47:48 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 01:47:48 2026 +0700"
      },
      "message": "rp2040, HIL: detach on warm restart and reset hub TT after cancelled splits (#4056)\n\n- rp2040: dcd_init holds the pull-up off 2 ms when a warm restart left it\n  attached; board_init resets USBCTRL when native USB is unused.\n- test/hil: send Reset_TT to the DUT\u0027s multi-TT hub port before each flash\n  and after usbtest unlink or failed cases; Linux xHCI never clears a TT\n  buffer on URB cancel."
    },
    {
      "commit": "e5cfecb904396c04cc16695b54a6ae494f57ce4c",
      "tree": "cfc1f7ac5fba41d03bed0877e42b9e0c475b6d3d",
      "parents": [
        "e85c2b8affa1efbf00d398d59e7a87d3e61cc4a9"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 01 17:20:17 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 17:20:17 2026 +0700"
      },
      "message": "hil_pool_check: check device boards with dfu_runtime only, build it on espressif (#4053)\n\n- dfu_runtime builds with FreeRTOS on espressif (usbtest\u0027s layout); ESP HIL runs it\n- pool check flashes only dfu_runtime on device boards; the roster\u0027s only list picks tests, not health\n- espressif builds every example with an ESP-IDF component, adding dual/dynamic_switch and dual/host_info_to_device_cdc\n- family_json: note build.py get_examples as an input fix does not track"
    },
    {
      "commit": "e85c2b8affa1efbf00d398d59e7a87d3e61cc4a9",
      "tree": "57e9e9c625f3e662f69dac2ee4c91eae82578b19",
      "parents": [
        "497709395e438add32e4189fcedbd30665c69d93"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 01 15:40:27 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 15:40:27 2026 +0700"
      },
      "message": "mtp: fix data phase completion and transaction recovery, with unit and raw HIL coverage (#3956)\n\nTake the data OUT length from the host\u0027s container header, treat an early\nresponse or short packet as a device-initiated cancel, and recover through\nCancel, Device Reset and Get Device Status (Still Image CDD 1.0). A command\nthat follows a cancelled data IN waits in usbd until that IN is retired.\n\nThe cancel relies on dcd.h\u0027s \"stall removes any queued transfer\": nrf5x,\nmusb (double-packet TX FIFO) and rusb2 now retire a loaded IN packet on stall.\n\nThe mtp example keeps its ObjectInfo across a failed SendObject per PIMA 15740\n10.4.12-13; test/hil/mtp_raw.py covers the recovery paths on hardware.\n\nFixes #3957, fixes #3958"
    },
    {
      "commit": "497709395e438add32e4189fcedbd30665c69d93",
      "tree": "369d7dc5df8b54ffe7dca05ddf36fa22b91a2dc5",
      "parents": [
        "9b0e5e73380e31b7cdeb658c073f94b8a87db2c8"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 01 12:56:49 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 12:56:49 2026 +0700"
      },
      "message": "hil_pool_check: flash from cached CI master artifacts, drop builds and recovery (#4030)\n\n- Fetch one variant per board from the latest 10 master push runs into\n  ~/.cache/tinyusb-hil/firmware and reuse it; -B DIR uses a local build.\n- Drop on-the-spot builds, probe/board recovery, topology, threads, the RTT\n  host check and the PID check; keep verified parking, --scan-only, locks;\n  add --json.\n- Remove CI_BUILD: CI\u0027s silent board_test skipped board_init(), so host\n  parks could never be verified. HIL now parks with the standard board_test.\n- build_utils.dep_head: use --git-dir, since a hook\u0027s exported GIT_DIR\n  outranks -C and made every dep look off-pin."
    },
    {
      "commit": "9b0e5e73380e31b7cdeb658c073f94b8a87db2c8",
      "tree": "5b1fc4856f668fa16f61ed3f88ef841a9cac26a9",
      "parents": [
        "011591a25891ee50d8565399fab5331d3041b0f7"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Thu Oct 01 08:56:54 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 08:56:54 2026 +0700"
      },
      "message": "usbtest: confine testusb\u0027s device scan to the DUT node (#4049)\n\n* usbtest: confine testusb\u0027s device scan to the DUT node\n\nStock testusb ftw()s and opens every usbfs node even with -D, so one\npeer stuck in enumeration held a lock that timed out every other\nboard\u0027s cases. -A \u003cnode\u003e makes glibc ftw() visit only that node.\n\nFixes #4047\n\n* usbtest.py: simplify"
    },
    {
      "commit": "011591a25891ee50d8565399fab5331d3041b0f7",
      "tree": "e45707a342ddeca8df536a26372fe32129b0dfbd",
      "parents": [
        "9ddeac4b550f9be8f9ed6e748e845441c6ab98aa",
        "136c2648470744042eca96f469b41437720d5708"
      ],
      "author": {
        "name": "Zixun LI",
        "email": "admin@hifiphile.com",
        "time": "Tue Sep 29 23:03:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 23:03:29 2026 +0200"
      },
      "message": "Merge pull request #3966 from rhgndf/wch-usbhs-fixes\n\nwch/usbhs: release controller before handling completions"
    },
    {
      "commit": "9ddeac4b550f9be8f9ed6e748e845441c6ab98aa",
      "tree": "1c654d464103c2762cc3d933a67eebdbb7a4e135",
      "parents": [
        "61d9f45b2bf2d8ae2851e56c7a02e6f1a162b5ee"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Sep 29 23:04:59 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 23:04:59 2026 +0700"
      },
      "message": "hil_flash: rerun JLinkExe when libjlinkarm crashes before the target (#4015)\n\nlibjlinkarm.so V9.66 and V9.78 corrupt their heap right after reading\nthe probe\u0027s S/N and die by SIGSEGV or \"double free\" SIGABRT. From Sep 15\nto 26 that failed about 240 flashes and resets in 82 CI HIL runs, on all\n13 ci.lan J-Link boards (every probe on-board: OB, LPC-Link 2, OpenSDA,\nST-Link reflashed), always before target access. CI flashes once\n(--retry 1), so each crash failed a job.\n\nMeasured on feather_nrf52840_express\u0027s OB: 3 crashes in 810 runs; a\nreal SIGSEGV was rerun by this change and passed."
    },
    {
      "commit": "61d9f45b2bf2d8ae2851e56c7a02e6f1a162b5ee",
      "tree": "5c26ac68dfac9032981b67802f6288e355f21ad4",
      "parents": [
        "4e2a99aa9ea54efc3a5b70141847fe3f9eb380c3"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Sep 29 19:35:29 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 19:35:29 2026 +0700"
      },
      "message": "usbtest skill: scripts for bring-up and failed cases (#4019)\n\n- kernel_src.py prints a testusb case\u0027s kernel source and its completion waits for a tag or uname -r\n- run_case.py runs chosen cases on one roster board: refuses before touching hardware, then lock, flash, run under a budget, park, release; SIGTERM kills its children and still releases the lock\n- usbtest.py: a case testusb never ran is FAIL, duplicate --tests are refused, an unrecovered hang exits nonzero\n- hints in CLAUDE.md, the hil skill and docs/porting.rst"
    },
    {
      "commit": "4e2a99aa9ea54efc3a5b70141847fe3f9eb380c3",
      "tree": "733b3d083435f01ccc184f71c8d98332e0db53d2",
      "parents": [
        "f3d021460ae5de0551ad5a788cb2b05005dd7ca4"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Sep 29 13:18:38 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 13:18:38 2026 +0700"
      },
      "message": "code_size: per-file/section/symbol size report and base diff, one membrowse CLI (#3988)\n\nReplace metrics.py, metrics_compare_base.py and the membrowse_* scripts with\ntools/code_size.py (report, and diff against a base ref built in a worktree,\nper board and elf pair; membrowse, linkermap or bloaty engines; flash/RAM from\nthe ELF headers; --ci over the CI-pinned boards) and tools/membrowse_cli.py\n(report, onboard, linker-shim). Diffing each pair on its own, rather than\naveraged per-file sizes, keeps a change confined to one configuration visible.\n\nMake tools/linkermap an optional get_deps dependency fetched by path, drop the\nunused examples-linkermap target, pass MEMBROWSE_OPTION as --option\u003d, share\nfirst_error with check_build, and replace the membrowse skill with code-size."
    },
    {
      "commit": "f3d021460ae5de0551ad5a788cb2b05005dd7ca4",
      "tree": "c6881b659fee7d71a1ae9f44fa1f7a44d44ff64f",
      "parents": [
        "6edbdc88da72a0fdf9cef734d550f46257550d48"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Sep 29 13:16:14 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 13:16:14 2026 +0700"
      },
      "message": "hil: remove the D-state/wedge containment that never fired (#4018)\n\nEvery \"USB subsystem is wedged\" verdict and pool abandon in CI logs came\nfrom the usbtest new_id registry contention fixed by #3955; the markers,\npost-pool recovery, strays and abandon exit never fired after it.\n\n- usbtest confirms a hang by reaping its own child, then tries one\n  recovery step; only the battery\u0027s JSON verdict latches board-wedged\n- drop wedged-board markers, post-pool recovery, pool containment and\n  the abandon path; keep the bounded pool drain and partial report\n- trim the sysfs strand memo to the inode memo and its per-path cap\n- keep convoy-safe flashers, flasher_recover and the manual\n  usb-kernel-recover playbook"
    },
    {
      "commit": "6edbdc88da72a0fdf9cef734d550f46257550d48",
      "tree": "7eab9268516697337c2e0d6439ecfc0bccb0946c",
      "parents": [
        "3024dd2e31bc7d6dd27b708ad57f880a8d7f85ac"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Tue Sep 29 09:11:21 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 09:11:21 2026 +0700"
      },
      "message": "CLAUDE.md: launch a PR\u0027s chief through agentrc\u0027s headless-chief skill (#4020)"
    },
    {
      "commit": "136c2648470744042eca96f469b41437720d5708",
      "tree": "88cad103a64b80d0864cab26739d21e9a4d451e5",
      "parents": [
        "9ba245bf9abcee52bc4bd71ce55553dce1ca3a3e"
      ],
      "author": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 23:54:13 2026 +0200"
      },
      "committer": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 23:54:13 2026 +0200"
      },
      "message": "docs: add WCH USBHS interrupt endpoint starvation\n\nAlso add missing links in MCU table.\n\nSigned-off-by: HiFiPhile \u003cadmin@hifiphile.com\u003e\n"
    },
    {
      "commit": "9ba245bf9abcee52bc4bd71ce55553dce1ca3a3e",
      "tree": "22852ead5b5573ede178612f581bdb091613e759",
      "parents": [
        "83f85a1a44bacd35c8e5f017dfd14cc09233b361"
      ],
      "author": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:26:06 2026 +0200"
      },
      "committer": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:26:24 2026 +0200"
      },
      "message": "ch32: remove redundant EP toggle check\n\nSigned-off-by: HiFiPhile \u003cadmin@hifiphile.com\u003e\n"
    },
    {
      "commit": "83f85a1a44bacd35c8e5f017dfd14cc09233b361",
      "tree": "bd40fbbcd7b40bcf7c23730da77a0f052cdd94bd",
      "parents": [
        "b1bae71e2f4013d07fddb4cf96b3a30a30a382ff"
      ],
      "author": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:14:54 2026 +0200"
      },
      "committer": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:14:54 2026 +0200"
      },
      "message": "ch32: select USBHS device speed from rhport configuration\n\nHonor rh_init-\u003espeed when configuring the USBHS controller instead of\nselecting speed with TUD_OPT_HIGH_SPEED and rejecting full-speed builds.\nMap AUTO/HIGH to high speed, FULL to full speed, and LOW to low speed;\nreject unsupported values. This ports the speed-selection part of #3727.\n\nThe low-speed register setting does not establish low-speed enumeration\nsupport: the reset-completion path still relies on SOF.\n\nValidation:\n- Full example sets passed on NanoCH32V305 and CH32V307: 54 builds.\n- NanoCH32V305 uac2_headset builds with USBHS forced to full speed.\n- NanoCH32V305 uac2_headset stack size: +44 bytes code, no RAM change.\n"
    },
    {
      "commit": "b1bae71e2f4013d07fddb4cf96b3a30a30a382ff",
      "tree": "d58680dc8c09a3f702441d890349fd5aabff3715",
      "parents": [
        "6969ed6652da8e1a7833849de614a4db86a3758b"
      ],
      "author": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:12:05 2026 +0200"
      },
      "committer": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:12:05 2026 +0200"
      },
      "message": "ch32: complete USBHS bus reset on the first SOF\n\nBUS_RST can precede completion of speed negotiation, so it cannot reliably\nreport the negotiated bus speed. Waiting until the first SETUP reports reset\nand SETUP together, allowing task-side reset processing to clear the queued\nSETUP count before the request is handled.\n\nHandle BUS_RST before transfer and SETUP flags, notify RESET_START, reset\nEP0, and discard reset/transaction flags observed in the entry snapshot.\nTemporarily enable SOF interrupts and mark reset completion pending. On the\nfirst SOF, read SPEED_TYPE, report RESET_END once, and disable SOF interrupts.\nSubsequent SOF events use the normal path when USBD enables them again.\n\nThis gives the USB task the interval before the first SETUP to process reset\nwithout changing the core SETUP bookkeeping. It still requires the task to\nrun in that interval. Keep runtime speed selection and OUT toggle filtering\noutside this commit.\n\nValidation:\n- Full example sets passed on NanoCH32V305 and CH32V307: 54 builds.\n- NanoCH32V305 uac2_headset stack size: +96 bytes code, +1 byte BSS.\n"
    },
    {
      "commit": "6969ed6652da8e1a7833849de614a4db86a3758b",
      "tree": "8ed701ed93784d495732c518e2fc8495bd8df64b",
      "parents": [
        "99c53f32c20654348cfd0cd7fc87d94543674c81",
        "3024dd2e31bc7d6dd27b708ad57f880a8d7f85ac"
      ],
      "author": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:07:49 2026 +0200"
      },
      "committer": {
        "name": "HiFiPhile",
        "email": "admin@hifiphile.com",
        "time": "Mon Sep 28 22:07:49 2026 +0200"
      },
      "message": "Merge upstream master into pr-3966-irq-latency\n"
    },
    {
      "commit": "3024dd2e31bc7d6dd27b708ad57f880a8d7f85ac",
      "tree": "3d44b4a319b19696d504a887d4bb0d5f164beb34",
      "parents": [
        "de4940525876259efb17f14e775312365bfdf97c"
      ],
      "author": {
        "name": "Ha Thach",
        "email": "thach@tinyusb.org",
        "time": "Mon Sep 28 15:47:31 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 15:47:31 2026 +0700"
      },
      "message": "Fix transfer lengths that wrap when narrowed to 16 bits (#3968)\n\n- Clamp endpoint stream requests before narrowing to the fifo length\n- msc host: split data stages larger than a 16-bit transfer\n- Reject transfer lengths that do not fit a 16-bit endpoint transfer\n- msc device: fail READ10/WRITE10 whose block size does not fit 16 bits"
    }
  ],
  "next": "99c53f32c20654348cfd0cd7fc87d94543674c81"
}
