{"id":4361,"date":"2023-09-11T14:45:45","date_gmt":"2023-09-11T13:45:45","guid":{"rendered":"https:\/\/pmortensen.eu\/world2\/?p=4361"},"modified":"2026-02-05T21:55:38","modified_gmt":"2026-02-05T20:55:38","slug":"qmk-debugging-blues-on-ubuntu","status":"publish","type":"post","link":"https:\/\/pmortensen.eu\/world2\/2023\/09\/11\/qmk-debugging-blues-on-ubuntu\/","title":{"rendered":"QMK debugging blues on Ubuntu: hid_listen"},"content":{"rendered":"<p>The short version: Building the third-party tool &#8220;<a href=\"https:\/\/www.pjrc.com\/teensy\/hid_listen.html\">hid_listen<\/a>&#8221; from source and using <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ubuntu_version_history#Ubuntu_20.04_LTS_(Focal_Fossa)\">Ubuntu&nbsp;20.04<\/a> (Focal Fossa) or later enables debugging of QMK firmware on Ubuntu.<\/p>\n<h2>Introduction<\/h2>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Debugging#Techniques\">Printf debugging<\/a> is enabled in QMK by using the standard <em>printf<\/em> (or its cousin <em>dprintf()<\/em>) and by <a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/docs\/faq_debug.md#debugging-iddebugging\">configuration at compile time<\/a> (<strong><em>CONSOLE_ENABLE = yes<\/em><\/strong> in file <em>rules.mk<\/em> (for example, <a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/keyboards\/keychron\/v6\/iso_encoder\/keymaps\/keychron\/rules.mk\">keyboards\/keychron\/v6\/iso_encoder\/keymaps\/keychron\/rules.mk<\/a>)), though it is difficult (or impossible) to capture output early <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/19\/keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard#default_RGB_settings\">at startup time<\/a>, e.g., in function <a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/docs\/feature_eeprom.md\">eeconfig_init_kb()<\/a> (though a simple busy wait of, say, 5 seconds, before doing any debug output may work in some cases).<\/p>\n<p>Example code:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n    int tickCount = timer_read32();\r\n    printf(&quot;Ticks: %d\\n&quot;, tickCount);\r\n<\/pre>\n<p>The standard way to capture the output is (command line): <\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nqmk console\r\n<\/pre>\n<p>While this works perfectly fine in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Arch_Linux\">Arch Linux<\/a> (e.g., <a href=\"https:\/\/arcolinux.info\/\">ArcoLinux<\/a>. Linux kernel version 6.4.10-arch1-1), it doesn&#8217;t on Ubuntu 20.04 (the minimum version to install and compile the current version of QMK):<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n&lt;class 'AttributeError'&gt;\r\n\u2612 \/usr\/lib\/x86_64-linux-gnu\/libhidapi-hidraw.so: undefined symbol: hid_get_input_report\r\nTraceback (most recent call last):\r\n  File &quot;\/home\/mortensen\/.local\/lib\/python3.8\/site-packages\/milc\/milc.py&quot;, line 539, in __call__\r\n    return self.__call__()\r\n  File &quot;\/home\/mortensen\/.local\/lib\/python3.8\/site-packages\/milc\/milc.py&quot;, line 544, in __call__\r\n    return self._subcommand(self)\r\n  File &quot;\/home\/mortensen\/.local\/lib\/python3.8\/site-packages\/qmk_cli\/subcommands\/console.py&quot;, line 353, in console\r\n    device_finder = FindDevices(vid, pid, index, cli.args.numeric)\r\n  File &quot;\/home\/mortensen\/.local\/lib\/python3.8\/site-packages\/qmk_cli\/subcommands\/console.py&quot;, line 153, in __init__\r\n    self.hid = import_hid()\r\n  File &quot;\/home\/mortensen\/.local\/lib\/python3.8\/site-packages\/qmk_cli\/subcommands\/console.py&quot;, line 99, in import_hid\r\n    import hid\r\n  File &quot;\/home\/mortensen\/.local\/lib\/python3.8\/site-packages\/hid\/__init__.py&quot;, line 83, in &lt;module&gt;\r\n    hidapi.hid_get_input_report.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_size_t]\r\n  File &quot;\/usr\/lib\/python3.8\/ctypes\/__init__.py&quot;, line 386, in __getattr__\r\n    func = self.__getitem__(name)\r\n  File &quot;\/usr\/lib\/python3.8\/ctypes\/__init__.py&quot;, line 391, in __getitem__\r\n    func = self._FuncPtr((name_or_ordinal, self))\r\nAttributeError: \/usr\/lib\/x86_64-linux-gnu\/libhidapi-hidraw.so: undefined symbol: hid_get_input_report\r\n<\/pre>\n<p><a href=\"https:\/\/github.com\/libusb\/hidapi\/pull\/351\">Some mention<\/a> a minimum Linux kernel version of 5.11. But using a later (<a href=\"https:\/\/ubuntu.com\/kernel\/lifecycle\">HWE<\/a>) Linux kernel version, <em>5.15.0-83-generic<\/em>, <strong><em>sudo apt-get install linux-image-generic-hwe-20.04<\/em><\/strong>, did not help either (though it may or may not be that it is necessary, but not sufficient). Note that HWE is <em>not<\/em> enabled if upgrading from an older version of Ubuntu to 20.04; the kernel version thus stays at 5.4 (by default).<\/p>\n<p>Using a newer version of Ubuntu, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ubuntu_version_history#Ubuntu_22.04_LTS_(Jammy_Jellyfish)\">Ubuntu&nbsp;22.04<\/a> (Jammy Jellyfish. Linux kernel <em>6.2.0-32-generic<\/em> (HWE)) or <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ubuntu_version_history#Ubuntu_23.04_(Lunar_Lobster)\">Ubuntu&nbsp;23.04<\/a> (Lunar Lobster. Also Linux kernel <em>6.2.0-32-generic<\/em>) is not much better. It launches, but the result is an endless loop of &#8220;Could not connect to&#8221; (to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Standard_streams#Standard_error_(stderr)\">standard error<\/a>), about 8 times per second: <\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nqmk console\r\n<\/pre>\n<p>Output:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nLooking for devices...\r\nq*6-\u2612 Could not connect to Keychron Keychron V5 (:3434:0353:1): HIDException: unable to open device\r\n\u2612 Could not connect to Keychron Keychron V5 (:3434:0353:1): HIDException: unable to open device\r\n\u2612 Could not connect to Keychron Keychron V5 (:3434:0353:1): HIDException: unable to open device\r\n\u2612 Could not connect to Keychron Keychron V5 (:3434:0353:1): HIDException: unable to open device\r\n\u2612 Could not connect to Keychron Keychron V5 (:3434:0353:1): HIDException: unable to open device\r\n<\/pre>\n<p>(Note: The installation of QMK (the step <strong><em>python3 -m pip install &#8211;user qmk<\/em><\/strong>) is a challenge on Ubuntu&nbsp;23.04. The error is &#8220;<em>error: externally-managed-environment<\/em>&#8221; and is specific to later versions of Debian (and derived, like Ubuntu. It may be a sound approach, but the QMK documentation is completely silent on the matter. QMK can <a href=\"https:\/\/stackoverflow.com\/questions\/75602063\/pip-install-r-requirements-txt-is-failing-this-environment-is-externally-mana\/76084249#76084249\">be force-installed<\/a> by using the parameter with the scary name <em>&#8220;&#8211;break-system-packages&#8221;<\/em> (note: it is two times ASCII &#8220;-&#8221; before &#8220;break&#8221;; it doesn&#8217;t render as such here): &#8220;<strong><em>python3 -m pip install &#8211;break-system-packages &#8211;user qmk<\/em><\/strong>&#8221; (note: it is two times ASCII &#8220;-&#8221; before &#8220;user&#8221;; see also <a href=\"https:\/\/docs.qmk.fm\/#\/newbs_getting_started?id=installation-2\">the official documentation<\/a>; see also <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/09\/11\/qmk-debugging-blues-on-ubuntu#Appendix_A\">Appendix A<\/a> for a properly rendered command line). <strong><em>Disclaimer: Do it at your own risk<\/em><\/strong>.) But it is better to <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/1cxnqtu\/comment\/m80aes2\/\">use a virtual (Python) environment<\/a>.)<\/p>\n<p><!-- Later\n... crucial for more complex projects (e.g., with intricate data structures)...\n\nUpgrading to a later version of Ubuntu, like 22.04 or 23.04, will <strong><em>not<\/em><\/strong> work.\n--><\/p>\n<h2 id=\"solution\">The solution<\/h2>\n<p>hid_listen promises to be an (<a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/docs\/faq_debug.md\">officially recommended<\/a>) alternative. But it is old, and for Linux, only a 32-bit binary is provided.<\/p>\n<h2 id=\"CompileFromSource\">Compiling hid_listen from source<\/h2>\n<p>The solution is to compile from source. This is much less scary than it sounds. The abstract is: <a href=\"https:\/\/www.pjrc.com\/teensy\/hid_listen_1.01.zip\">Download the source<\/a> (only about 70 KB (yes, kilobyte, not megabyte)), uncompress it, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cd_(command)\">cd<\/a> to the folder with the &#8220;hid_listen.c&#8221; file, and execute &#8216;make&#8217;.<\/p>\n<p>This is all that is needed (GCC may throw some warnings; see Appendix C for details):<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\ncd \/home\/mortensen\/temp2\/2023-09-11\/hid_listen_1.01\/hid_listen\r\nmake\r\n<\/pre>\n<p>The result should be something like:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n16 -rwxrwxr-x 1 mortensen mortensen 14472 Sep 11 14:42 hid_listen\r\n<\/pre>\n<p>&#8216;hid_listen&#8217; can be run like:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n\/home\/mortensen\/temp2\/2023-09-11\/hid_listen_1.01\/hid_listen\/hid_listen\r\n<\/pre>\n<p>Output:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n    Waiting for device:\r\n    Listening:\r\n<\/pre>\n<p>(For download integrity, the MD5 sum for the <em>hid_listen_1.01.zip<\/em> file is FCC94F8248F5642F1FC9747E0F280569 (2023-09-11).)<\/p>\n<p><!-- later:\nAnd the QMK actually contains such printf ... that is called at startup:\n\n    End of keyboard_post_init_user()...\n--><\/p>\n<p><!--\n32 bit. 2011. \nBut\n--><\/p>\n<h2>Limitation: <em>hid_listen<\/em> only works with one device<\/h2>\n<p>If there is more than one device for this, say two Keychron keyboards connected at the same time, <em>hid_listen<\/em> will only listen to (and capture debug output) <strong><em>one of them<\/em><\/strong>. At this time, it is unknown what rule is used for this (e.g., physical USB position or order of powering on) or if there is a way to specify which device hid_listen should pick.<\/p>\n<p>One of keyboards can be disconnected to be sure which one is used, but this is inconvenient if doing any extensive development, as one of the keyboards has to be constantly plugged and unplugged (and the USB plugs aren&#8217;t designed for that).<\/p>\n<p>In this case, it is recommended to use some other keyboard as the main keyboard during development.<\/p>\n<h3>Possible workaround<\/h3>\n<p>It should be possible to hard code the USB vendor ID and product ID in the rawhid_open_only1() call in line 41 of file <em>hid_listen.c<\/em> (or add command-line parameters for the two), the first two parameters, respectively.<\/p>\n<p>But that is <strong><em>not the case<\/em><\/strong>! See below.<\/p>\n<p>The source line.<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n    hid = rawhid_open_only1(0, 0, 0xFF31, 0x0074);\r\n<\/pre>\n<p>This would only work for different products, not for two completely identical keyboard models.<\/p>\n<p><!-- ==================== Note: At bootloader time, the product ID is different from normal operation and the ***same*** for every Keychron keyboard. Thus, it is not very useful in this context.\n\nOne way to discover the USB vendor ID and product ID is using <em><a href=\"http:\/\/sourceforge.net\/p\/dfu-util\/tickets\/\">dfu-util<\/a><\/em> when the keyboard is in bootloader mode (note that putting it in bootloader mode made wipe out the current configuration, e.g., macros and keymappings <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/07\/10\/via-macros-on-mechanical-keyboards-with-qmk-are-less-crippled-than-expected\/\">used by Via<\/a>). \n\n[code gutter=\"false\"]\ndfu-util -l\n[\/code]\n\nResult for <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/19\/keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard\/\">Keychron V5<\/a>:\n\n[code gutter=\"false\"]\ndfu-util 0.9\n\nFound DFU: [0483:df11] ver=2200, devnum=9, cfg=1, intf=0, path=&quot;3-1.5&quot;, alt=3, name=&quot;@Device Feature\/0xFFFF0000\/01*004 e&quot;, serial=&quot;205C32845242&quot;\nFound DFU: [0483:df11] ver=2200, devnum=9, cfg=1, intf=0, path=&quot;3-1.5&quot;, alt=2, name=&quot;@OTP Memory \/0x1FFF7000\/01*0001Ke&quot;, serial=&quot;205C32845242&quot;\nFound DFU: [0483:df11] ver=2200, devnum=9, cfg=1, intf=0, path=&quot;3-1.5&quot;, alt=1, name=&quot;@Option Bytes  \/0x1FFF7800\/01*040 e&quot;, serial=&quot;205C32845242&quot;\nFound DFU: [0483:df11] ver=2200, devnum=9, cfg=1, intf=0, path=&quot;3-1.5&quot;, alt=0, name=&quot;@Internal Flash  \/0x08000000\/0128*0002Kg&quot;, serial=&quot;205C32845242&quot;\n[\/code]\n==================== --><\/p>\n<p>One way to discover the USB vendor ID and product ID is using <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dmesg\">dmesg<\/a>. Unplug and plug the keyboard to ensure it is the last one and then: <\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nclear ; dmesg | tail -n 20 | grep found\r\n<\/pre>\n<p>(Note that <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Lspci#lsusb\">lsusb<\/a><\/em> may not be useful as, for example, the explaining line is empty for Keychron V5 keyboards&#8230; (but not for Keychron V6).)<\/p>\n<p>Result for <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/19\/keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard\/\">Keychron V5<\/a>:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n[11600.408431] usb 3-1.5: New USB device found, idVendor=3434, idProduct=0353, bcdDevice= 1.00\r\n<\/pre>\n<p><!-- Keychron V6: [12975.719558] usb 3-2: New USB device found, idVendor=3434, idProduct=0363, bcdDevice= 1.00     --><\/p>\n<p>Thus the source code line in <em>hid_listen.c<\/em> would be:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n    hid = rawhid_open_only1(0x3434, 0x0353, 0xFF31, 0x0074);\r\n<\/pre>\n<p>Note that in bootloader mode all Keychron keyboards have the same IDs, 0x0483 and 0xDF11.<\/p>\n<p>But this approach <strong><em>doesn&#8217;t work<\/em><\/strong> in its current form&#8230; The first two parameters to <em>rawhid_open_only1()<\/em> are ignored (file <em>rawhid.c<\/em>): <em>&#8220;\/\/ TODO; inputs are <strong><em>ignored<\/em><\/strong> and hardcoded into this signature&#8230;.&#8221;<\/em>. Making it work would require more extensive changes.<\/p>\n<h3>hid_listen is open source!<\/h3>\n<p>The reference from the QMK documentation to only the web site www.pjrc.com and under &#8220;Teensy&#8221; makes it seem like hid_listen is somewhat proprietary, but it is not.<\/p>\n<p>The source code at <em>www.pjrc.com<\/em> is also outdated (version 1.01 and unknown publication date. But it is at least from before 2011 as there is a note with a timestamp of 2011-01-01 about 32-bit Linux vs. 64-bit). The QMK documentation fails to mention this.<\/p>\n<p>The original source code repository is <a href=\"https:\/\/github.com\/PaulStoffregen\/hid_listen\">this one<\/a> (last change in 2022).<\/p>\n<p>And the TMK project has forked it <a href=\"https:\/\/github.com\/tmk\/hid_listen\">here<\/a> (last change in 2022). For example, the 64-bit Linux issue was addressed in 2020: &#8220;Add binary for Linux 64-bit&#8221; (FFB011).<\/p>\n<p>Though the problem remains: The source code changes are mainly related to building hid_listen for various other systems. Parameters &#8220;vid&#8221; and  &#8220;pid&#8221; to function <em>rawhid_open_only1<\/em> are still ignored (not used at all).<\/p>\n<h3>Is there a solution anyway?<\/h3>\n<p>The call <em>&#8220;ioctl(fd, HIDIOCGRAWINFO, &#038;info)&#8221;<\/em> in <em>rawhid_open_only1()<\/em> returns a struct of type <em>hidraw_devinfo<\/em>. <a href=\"https:\/\/www.gsp.com\/cgi-bin\/man.cgi?topic=HIDRAW#HIDIOCGRAWINFO\">hidraw_devinfo is defined as<\/a>:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nstruct hidraw_devinfo\r\n{\r\n    uint32_t  bustype;\r\n    int16_t   vendor;\r\n    int16_t   product;\r\n};\r\n<\/pre>\n<p>Thus <em>info.vendor<\/em> and <em>info.product<\/em> can be matched with the filter parameters to <em>rawhid_open_only1()<\/em>, <em>&#8220;vid&#8221;<\/em> and <em>&#8220;pid&#8221;<\/em>, respectively.<\/p>\n<h2>An alternative: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Arch_Linux\">Arch Linux<\/a><\/h2>\n<p>For example, <a href=\"https:\/\/arcolinux.info\/\">ArcoLinux<\/a>.<\/p>\n<p>Though if the Arch Linux installation is out of date, for example, a few months, it may be necessary to deviate from the official instructions to make it work at all and use:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nsudo pacman --needed --noconfirm -Syu git python-pip libffi\r\n<\/pre>\n<p>As this may fail:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nsudo pacman --needed --noconfirm -S git python-pip libffi\r\n<\/pre>\n<p><!-- To research: Can it brought to work on 22.04 or 23.04 by some udev trickery? --><\/p>\n<h2>Conclusion<\/h2>\n<p>Compiling <em>hid_listen<\/em> from source for a 64-bit system is relatively straightforward and makes it possible to debug QMK keyboards on the older Ubuntu 20.04 version.<\/p>\n<p>However, it is inconvenient on a system with more than Keychron keyboard. With sufficient effort, the hid_listen source code could probably be changed to work with a USB product ID filter. Though that would not help with two Keychron keyboards of the same model (the USB product IDs are the same in that case&mdash;though the USB product ID can be spoofed (changed) for one or more of the keyboards, but this will cause problems using <a href=\"https:\/\/docs.keeb.io\/via\">Via<\/a> (the JSON file would also have to be manipulated)).<\/p>\n<p>A possible workaround is to only enable debugging (at compile-time) for the Keychron keyboard that is being developed on (and disable it for all other Keychron keyboards).<\/p>\n<h2 id=\"Appendix_A\">Appendix A: Transcript of installing QMK on Ubuntu&nbsp;23.04 (Lunar Lobster)<\/h2>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\npython3 -m pip install --break-system-packages --user qmk\r\n<\/pre>\n<p>Output:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nCollecting qmk\r\n  Downloading qmk-1.1.2-py2.py3-none-any.whl (13 kB)\r\nCollecting hid\r\n  Downloading hid-1.0.5.tar.gz (3.9 kB)\r\n  Preparing metadata (setup.py) ... done\r\nCollecting milc&gt;=1.4.2\r\n  Downloading milc-1.6.8-py2.py3-none-any.whl (24 kB)\r\nCollecting pyusb\r\n  Downloading pyusb-1.2.1-py3-none-any.whl (58 kB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 58.4\/58.4 kB 1.9 MB\/s eta 0:00:00\r\nRequirement already satisfied: setuptools&gt;=45 in \/usr\/lib\/python3\/dist-packages (from qmk) (66.1.1)\r\nCollecting dotty-dict\r\n  Downloading dotty_dict-1.3.1-py3-none-any.whl (7.0 kB)\r\nCollecting hjson\r\n  Downloading hjson-3.1.0-py3-none-any.whl (54 kB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 54.0\/54.0 kB 1.7 MB\/s eta 0:00:00\r\nCollecting jsonschema&gt;=4\r\n  Downloading jsonschema-4.19.0-py3-none-any.whl (83 kB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 83.4\/83.4 kB 1.6 MB\/s eta 0:00:00\r\nRequirement already satisfied: pillow in \/usr\/lib\/python3\/dist-packages (from qmk) (9.4.0)\r\nRequirement already satisfied: pygments in \/usr\/lib\/python3\/dist-packages (from qmk) (2.14.0)\r\nCollecting pyserial\r\n  Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 90.6\/90.6 kB 1.8 MB\/s eta 0:00:00\r\nCollecting attrs&gt;=22.2.0\r\n  Downloading attrs-23.1.0-py3-none-any.whl (61 kB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 61.2\/61.2 kB 2.5 MB\/s eta 0:00:00\r\nCollecting jsonschema-specifications&gt;=2023.03.6\r\n  Downloading jsonschema_specifications-2023.7.1-py3-none-any.whl (17 kB)\r\nCollecting referencing&gt;=0.28.4\r\n  Downloading referencing-0.30.2-py3-none-any.whl (25 kB)\r\nCollecting rpds-py&gt;=0.7.1\r\n  Downloading rpds_py-0.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.2\/1.2 MB 2.0 MB\/s eta 0:00:00\r\nCollecting appdirs\r\n  Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)\r\nCollecting argcomplete\r\n  Downloading argcomplete-3.1.1-py3-none-any.whl (41 kB)\r\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 41.5\/41.5 kB 3.1 MB\/s eta 0:00:00\r\nRequirement already satisfied: colorama in \/usr\/lib\/python3\/dist-packages (from milc&gt;=1.4.2-&gt;qmk) (0.4.6)\r\nCollecting halo\r\n  Downloading halo-0.0.31.tar.gz (11 kB)\r\n  Preparing metadata (setup.py) ... done\r\nCollecting spinners\r\n  Downloading spinners-0.0.24-py3-none-any.whl (5.5 kB)\r\nCollecting log_symbols&gt;=0.0.14\r\n  Downloading log_symbols-0.0.14-py3-none-any.whl (3.1 kB)\r\nRequirement already satisfied: six&gt;=1.12.0 in \/usr\/lib\/python3\/dist-packages (from halo-&gt;milc&gt;=1.4.2-&gt;qmk) (1.16.0)\r\nCollecting termcolor&gt;=1.1.0\r\n  Downloading termcolor-2.3.0-py3-none-any.whl (6.9 kB)\r\nBuilding wheels for collected packages: hid, halo\r\n  Building wheel for hid (setup.py) ... done\r\n  Created wheel for hid: filename=hid-1.0.5-py3-none-any.whl size=3730 sha256=7702aeb0d1f632b4254133ef54ab06e14ef787d46073b79f35a02b57eac74078\r\n  Stored in directory: \/home\/embo\/.cache\/pip\/wheels\/b7\/5a\/4e\/b427a96232d1fae99d5f9c28ef68ffdaf03d2d593838fd7995\r\n  Building wheel for halo (setup.py) ... done\r\n  Created wheel for halo: filename=halo-0.0.31-py3-none-any.whl size=11242 sha256=c3045def7842fcfabf12867d61974e28b9d86e73186c42857dde93e21f5cfe30\r\n  Stored in directory: \/home\/embo\/.cache\/pip\/wheels\/2e\/b1\/0a\/62566170555f623c8327d47df1f53b6e4311ec9dd0ea70a99c\r\nSuccessfully built hid halo\r\nInstalling collected packages: spinners, pyserial, hjson, hid, appdirs, termcolor, rpds-py, pyusb, log_symbols, dotty-dict, attrs, argcomplete, referencing, halo, milc, jsonschema-specifications, jsonschema, qmk\r\nSuccessfully installed appdirs-1.4.4 argcomplete-3.1.1 attrs-23.1.0 dotty-dict-1.3.1 halo-0.0.31 hid-1.0.5 hjson-3.1.0 jsonschema-4.19.0 jsonschema-specifications-2023.7.1 log_symbols-0.0.14 milc-1.6.8 pyserial-3.5 pyusb-1.2.1 qmk-1.1.2 referencing-0.30.2 rpds-py-0.10.2 spinners-0.0.24 termcolor-2.3.0\r\n<\/pre>\n<p>And:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nqmk setup\r\n<\/pre>\n<p>Output:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n\u03a8 Found qmk_firmware at \/home\/embo\/qmk_firmware.\r\n\u03a8 QMK Doctor is checking your environment.\r\n\u03a8 CLI version: 1.1.2\r\n\u03a8 QMK home: \/home\/embo\/qmk_firmware\r\n\u03a8 Detected Linux (Ubuntu 23.04).\r\n\u26a0 Missing or outdated udev rules for 'atmel-dfu' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'kiibohd' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'stm32-dfu' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'apm32-dfu' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'gd32v-dfu' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'wb32-dfu' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'bootloadhid' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'usbasploader' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'usbtinyisp' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'md-boot' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Detected ModemManager without the necessary udev rules. Please either disable it or set the appropriate udev rules if you are using a Pro Micro.\r\n\u26a0 Missing or outdated udev rules for 'caterina' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u26a0 Missing or outdated udev rules for 'hid-bootloader' boards. Run 'sudo cp \/home\/embo\/qmk_firmware\/util\/udev\/50-qmk.rules \/etc\/udev\/rules.d\/'.\r\n\u03a8 Git branch: master\r\n\u03a8 Repo version: 0.22.2\r\n\u26a0 The official repository does not seem to be configured as git remote &quot;upstream&quot;.\r\n\u2612 Can't find arm-none-eabi-gcc in your path.\r\n\u2612 Can't find avr-gcc in your path.\r\n\u2612 Can't find avrdude in your path.\r\n\u2612 Can't find dfu-programmer in your path.\r\n\u2612 Can't find dfu-util in your path.\r\nWould you like to install dependencies? [Y\/n] Y\r\nGet:1 http:\/\/security.ubuntu.com\/ubuntu lunar-security InRelease [109 kB]\r\nHit:2 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar InRelease                                 \r\nHit:3 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar-updates InRelease                         \r\nHit:4 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar-backports InRelease\r\nFetched 109 kB in 1s (97.8 kB\/s)\r\nReading package lists... Done\r\nInstalling dependencies\r\nReading package lists...\r\nBuilding dependency tree...\r\nReading state information...\r\nbuild-essential is already the newest version (12.9ubuntu3).\r\nbuild-essential set to manually installed.\r\ndiffutils is already the newest version (1:3.8-4).\r\ngcc is already the newest version (4:12.2.0-3ubuntu1).\r\ngcc set to manually installed.\r\ngit is already the newest version (1:2.39.2-1ubuntu1.1).\r\nunzip is already the newest version (6.0-27ubuntu1).\r\nunzip set to manually installed.\r\nwget is already the newest version (1.21.3-1ubuntu1).\r\nwget set to manually installed.\r\nzip is already the newest version (3.0-13).\r\nzip set to manually installed.\r\npython3-pip is already the newest version (23.0.1+dfsg-1ubuntu0.1).\r\nSuggested packages:\r\n  avrdude-doc gcc-doc libnewlib-doc\r\nThe following NEW packages will be installed:\r\n  avr-libc avrdude binutils-arm-none-eabi binutils-avr clang-format clang-format-15 dfu-programmer dfu-util gcc-arm-none-eabi gcc-avr\r\n  libclang-cpp15 libftdi1 libhidapi-hidraw0 libhidapi-libusb0 libnewlib-arm-none-eabi libnewlib-dev libstdc++-arm-none-eabi-dev\r\n  libstdc++-arm-none-eabi-newlib libusb-0.1-4 libusb-dev teensy-loader-cli\r\n0 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.\r\nNeed to get 489 MB of archives.\r\nAfter this operation, 2,689 MB of additional disk space will be used.\r\nGet:1 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar-updates\/universe amd64 libclang-cpp15 amd64 1:15.0.7-3ubuntu0.23.04.1 [12.7 MB]\r\nGet:2 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar-updates\/universe amd64 clang-format-15 amd64 1:15.0.7-3ubuntu0.23.04.1 [51.9 kB]\r\nGet:3 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 clang-format amd64 1:15.0-56~exp2 [2,804 B]\r\nGet:4 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 dfu-programmer amd64 0.6.1-1build1 [30.6 kB]\r\nGet:5 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/main amd64 libusb-0.1-4 amd64 2:0.1.12-32build3 [17.7 kB]\r\nGet:6 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libftdi1 amd64 0.20-4ubuntu1 [15.4 kB]\r\nGet:7 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 binutils-arm-none-eabi amd64 2.39-1ubuntu1+17ubuntu1 [3,008 kB]\r\nGet:8 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 gcc-arm-none-eabi amd64 15:12.2.rel1-1 [53.1 MB]\r\nGet:9 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libstdc++-arm-none-eabi-dev all 15:12.2.rel1-1+23 [1,236 kB]\r\nGet:10 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/main amd64 libusb-dev amd64 2:0.1.12-32build3 [32.0 kB]\r\nGet:11 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 teensy-loader-cli amd64 2.2-1 [12.0 kB]\r\nGet:12 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 binutils-avr amd64 2.26.20160125+Atmel3.6.2-4 [1,697 kB]\r\nGet:13 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 gcc-avr amd64 1:5.4.0+Atmel3.6.2-3 [17.2 MB]\r\nGet:14 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 avr-libc all 1:2.0.0+Atmel3.6.2-3 [4,859 kB]\r\nGet:15 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libhidapi-libusb0 amd64 0.13.1-1 [17.5 kB]\r\nGet:16 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 avrdude amd64 6.3-20171130+svn1429-2 [316 kB]\r\nGet:17 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 dfu-util amd64 0.11-1 [41.6 kB]\r\nGet:18 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libhidapi-hidraw0 amd64 0.13.1-1 [12.9 kB]\r\nGet:19 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libnewlib-dev all 3.3.0-1.3 [137 kB]\r\nGet:20 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libnewlib-arm-none-eabi all 3.3.0-1.3 [43.2 MB]\r\nGet:21 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 libstdc++-arm-none-eabi-newlib all 15:12.2.rel1-1+23 [352 MB]\r\nFetched 489 MB in 2min 14s (3,664 kB\/s)\r\nSelecting previously unselected package libclang-cpp15.\r\n(Reading database ... 209736 files and directories currently installed.)\r\nPreparing to unpack ...\/00-libclang-cpp15_1%3a15.0.7-3ubuntu0.23.04.1_amd64.deb ...\r\nUnpacking libclang-cpp15 (1:15.0.7-3ubuntu0.23.04.1) ...\r\nSelecting previously unselected package clang-format-15.\r\nPreparing to unpack ...\/01-clang-format-15_1%3a15.0.7-3ubuntu0.23.04.1_amd64.deb ...\r\nUnpacking clang-format-15 (1:15.0.7-3ubuntu0.23.04.1) ...\r\nSelecting previously unselected package clang-format:amd64.\r\nPreparing to unpack ...\/02-clang-format_1%3a15.0-56~exp2_amd64.deb ...\r\nUnpacking clang-format:amd64 (1:15.0-56~exp2) ...\r\nSelecting previously unselected package dfu-programmer.\r\nPreparing to unpack ...\/03-dfu-programmer_0.6.1-1build1_amd64.deb ...\r\nUnpacking dfu-programmer (0.6.1-1build1) ...\r\nSelecting previously unselected package libusb-0.1-4:amd64.\r\nPreparing to unpack ...\/04-libusb-0.1-4_2%3a0.1.12-32build3_amd64.deb ...\r\nUnpacking libusb-0.1-4:amd64 (2:0.1.12-32build3) ...\r\nSelecting previously unselected package libftdi1:amd64.\r\nPreparing to unpack ...\/05-libftdi1_0.20-4ubuntu1_amd64.deb ...\r\nUnpacking libftdi1:amd64 (0.20-4ubuntu1) ...\r\nSelecting previously unselected package binutils-arm-none-eabi.\r\nPreparing to unpack ...\/06-binutils-arm-none-eabi_2.39-1ubuntu1+17ubuntu1_amd64.deb ...\r\nUnpacking binutils-arm-none-eabi (2.39-1ubuntu1+17ubuntu1) ...\r\nSelecting previously unselected package gcc-arm-none-eabi.\r\nPreparing to unpack ...\/07-gcc-arm-none-eabi_15%3a12.2.rel1-1_amd64.deb ...\r\nUnpacking gcc-arm-none-eabi (15:12.2.rel1-1) ...\r\nSelecting previously unselected package libstdc++-arm-none-eabi-dev.\r\nPreparing to unpack ...\/08-libstdc++-arm-none-eabi-dev_15%3a12.2.rel1-1+23_all.deb ...\r\nUnpacking libstdc++-arm-none-eabi-dev (15:12.2.rel1-1+23) ...\r\nSelecting previously unselected package libusb-dev.\r\nPreparing to unpack ...\/09-libusb-dev_2%3a0.1.12-32build3_amd64.deb ...\r\nUnpacking libusb-dev (2:0.1.12-32build3) ...\r\nSelecting previously unselected package teensy-loader-cli.\r\nPreparing to unpack ...\/10-teensy-loader-cli_2.2-1_amd64.deb ...\r\nUnpacking teensy-loader-cli (2.2-1) ...\r\nSelecting previously unselected package binutils-avr.\r\nPreparing to unpack ...\/11-binutils-avr_2.26.20160125+Atmel3.6.2-4_amd64.deb ...\r\nUnpacking binutils-avr (2.26.20160125+Atmel3.6.2-4) ...\r\nSelecting previously unselected package gcc-avr.\r\nPreparing to unpack ...\/12-gcc-avr_1%3a5.4.0+Atmel3.6.2-3_amd64.deb ...\r\nUnpacking gcc-avr (1:5.4.0+Atmel3.6.2-3) ...\r\nSelecting previously unselected package avr-libc.\r\nPreparing to unpack ...\/13-avr-libc_1%3a2.0.0+Atmel3.6.2-3_all.deb ...\r\nUnpacking avr-libc (1:2.0.0+Atmel3.6.2-3) ...\r\nSelecting previously unselected package libhidapi-libusb0:amd64.\r\nPreparing to unpack ...\/14-libhidapi-libusb0_0.13.1-1_amd64.deb ...\r\nUnpacking libhidapi-libusb0:amd64 (0.13.1-1) ...\r\nSelecting previously unselected package avrdude.\r\nPreparing to unpack ...\/15-avrdude_6.3-20171130+svn1429-2_amd64.deb ...\r\nUnpacking avrdude (6.3-20171130+svn1429-2) ...\r\nSelecting previously unselected package dfu-util.\r\nPreparing to unpack ...\/16-dfu-util_0.11-1_amd64.deb ...\r\nUnpacking dfu-util (0.11-1) ...\r\nSelecting previously unselected package libhidapi-hidraw0:amd64.\r\nPreparing to unpack ...\/17-libhidapi-hidraw0_0.13.1-1_amd64.deb ...\r\nUnpacking libhidapi-hidraw0:amd64 (0.13.1-1) ...\r\nSelecting previously unselected package libnewlib-dev.\r\nPreparing to unpack ...\/18-libnewlib-dev_3.3.0-1.3_all.deb ...\r\nUnpacking libnewlib-dev (3.3.0-1.3) ...\r\nSelecting previously unselected package libnewlib-arm-none-eabi.\r\nPreparing to unpack ...\/19-libnewlib-arm-none-eabi_3.3.0-1.3_all.deb ...\r\nUnpacking libnewlib-arm-none-eabi (3.3.0-1.3) ...\r\nSelecting previously unselected package libstdc++-arm-none-eabi-newlib.\r\nPreparing to unpack ...\/20-libstdc++-arm-none-eabi-newlib_15%3a12.2.rel1-1+23_all.deb ...\r\nUnpacking libstdc++-arm-none-eabi-newlib (15:12.2.rel1-1+23) ...\r\nSetting up binutils-avr (2.26.20160125+Atmel3.6.2-4) ...\r\nSetting up binutils-arm-none-eabi (2.39-1ubuntu1+17ubuntu1) ...\r\nSetting up gcc-arm-none-eabi (15:12.2.rel1-1) ...\r\nSetting up libhidapi-hidraw0:amd64 (0.13.1-1) ...\r\nSetting up libusb-0.1-4:amd64 (2:0.1.12-32build3) ...\r\nSetting up gcc-avr (1:5.4.0+Atmel3.6.2-3) ...\r\nSetting up libnewlib-dev (3.3.0-1.3) ...\r\nSetting up libhidapi-libusb0:amd64 (0.13.1-1) ...\r\nSetting up libnewlib-arm-none-eabi (3.3.0-1.3) ...\r\nSetting up libclang-cpp15 (1:15.0.7-3ubuntu0.23.04.1) ...\r\nSetting up dfu-programmer (0.6.1-1build1) ...\r\nSetting up clang-format-15 (1:15.0.7-3ubuntu0.23.04.1) ...\r\nSetting up dfu-util (0.11-1) ...\r\nSetting up clang-format:amd64 (1:15.0-56~exp2) ...\r\nSetting up libstdc++-arm-none-eabi-dev (15:12.2.rel1-1+23) ...\r\nSetting up teensy-loader-cli (2.2-1) ...\r\nSetting up libftdi1:amd64 (0.20-4ubuntu1) ...\r\nSetting up libusb-dev (2:0.1.12-32build3) ...\r\nSetting up avr-libc (1:2.0.0+Atmel3.6.2-3) ...\r\nSetting up libstdc++-arm-none-eabi-newlib (15:12.2.rel1-1+23) ...\r\nSetting up avrdude (6.3-20171130+svn1429-2) ...\r\nProcessing triggers for man-db (2.11.2-1) ...\r\nProcessing triggers for libc-bin (2.37-0ubuntu2) ...\r\nReading package lists...\r\nBuilding dependency tree...\r\nReading state information...\r\nThe following NEW packages will be installed:\r\n  binutils-riscv64-unknown-elf gcc-riscv64-unknown-elf picolibc-riscv64-unknown-elf\r\n0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.\r\nNeed to get 173 MB of archives.\r\nAfter this operation, 1,212 MB of additional disk space will be used.\r\nGet:1 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 binutils-riscv64-unknown-elf amd64 2.35.1-0ubuntu1 [2,386 kB]\r\nGet:2 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 gcc-riscv64-unknown-elf amd64 10.2.0-0ubuntu1 [37.0 MB]\r\nGet:3 http:\/\/dk.archive.ubuntu.com\/ubuntu lunar\/universe amd64 picolibc-riscv64-unknown-elf all 1.8-1 [134 MB]\r\nFetched 173 MB in 49s (3,532 kB\/s)\r\nSelecting previously unselected package binutils-riscv64-unknown-elf.\r\n(Reading database ... 217532 files and directories currently installed.)\r\nPreparing to unpack ...\/binutils-riscv64-unknown-elf_2.35.1-0ubuntu1_amd64.deb ...\r\nUnpacking binutils-riscv64-unknown-elf (2.35.1-0ubuntu1) ...\r\nSelecting previously unselected package gcc-riscv64-unknown-elf.\r\nPreparing to unpack ...\/gcc-riscv64-unknown-elf_10.2.0-0ubuntu1_amd64.deb ...\r\nUnpacking gcc-riscv64-unknown-elf (10.2.0-0ubuntu1) ...\r\nSelecting previously unselected package picolibc-riscv64-unknown-elf.\r\nPreparing to unpack ...\/picolibc-riscv64-unknown-elf_1.8-1_all.deb ...\r\nUnpacking picolibc-riscv64-unknown-elf (1.8-1) ...\r\nSetting up binutils-riscv64-unknown-elf (2.35.1-0ubuntu1) ...\r\nSetting up gcc-riscv64-unknown-elf (10.2.0-0ubuntu1) ...\r\nSetting up picolibc-riscv64-unknown-elf (1.8-1) ...\r\nProcessing triggers for man-db (2.11.2-1) ...\r\nerror: externally-managed-environment\r\n\r\n\u00d7 This environment is externally managed\r\n\u2570\u2500&gt; To install Python packages system-wide, try apt install\r\n    python3-xyz, where xyz is the package you are trying to\r\n    install.\r\n    \r\n    If you wish to install a non-Debian-packaged Python package,\r\n    create a virtual environment using python3 -m venv path\/to\/venv.\r\n    Then use path\/to\/venv\/bin\/python and path\/to\/venv\/bin\/pip. Make\r\n    sure you have python3-full installed.\r\n    \r\n    If you wish to install a non-Debian packaged Python application,\r\n    it may be easiest to use pipx install xyz, which will manage a\r\n    virtual environment for you. Make sure you have pipx installed.\r\n    \r\n    See \/usr\/share\/doc\/python3.11\/README.venv for more information.\r\n\r\nnote: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.\r\nhint: See PEP 668 for the detailed specification.\r\n--2023-09-07 13:46:25--  https:\/\/www.obdev.at\/downloads\/vusb\/bootloadHID.2012-12-08.tar.gz\r\nResolving www.obdev.at (www.obdev.at)... 167.235.211.211\r\nConnecting to www.obdev.at (www.obdev.at)|167.235.211.211|:443... connected.\r\nHTTP request sent, awaiting response... 302 Found\r\nLocation: https:\/\/www.obdev.at\/ftp\/pub\/Products\/vusb\/bootloadHID.2012-12-08.tar.gz [following]\r\n--2023-09-07 13:46:26--  https:\/\/www.obdev.at\/ftp\/pub\/Products\/vusb\/bootloadHID.2012-12-08.tar.gz\r\nReusing existing connection to www.obdev.at:443.\r\nHTTP request sent, awaiting response... 200 OK\r\nLength: 107970 (105K) [application\/x-gzip]\r\nSaving to: \u2018STDOUT\u2019\r\n\r\n-                                 100%[=============================================================&gt;] 105.44K   629KB\/s    in 0.2s    \r\n\r\n2023-09-07 13:46:26 (629 KB\/s) - written to stdout [107970\/107970]\r\n\r\ngcc  -O2 -Wall `libusb-config --cflags` -c main.c -o main.o\r\ngcc  -O2 -Wall `libusb-config --cflags` -c usbcalls.c -o usbcalls.o\r\nIn file included from usbcalls.c:19:\r\nusb-libusb.c: In function \u2018usbGetReport\u2019:\r\nusb-libusb.c:196:9: warning: value computed is not used [-Wunused-value]\r\n  196 |         *len++;\r\n      |         ^~~~~~\r\ngcc  -O2 -Wall `libusb-config --cflags` -o bootloadHID main.o usbcalls.o `libusb-config --libs`\r\n\u03a8 All dependencies are installed.\r\n\u03a8 Found arm-none-eabi-gcc version 12.2.1\r\n\u03a8 Found avr-gcc version 5.4.0\r\n\u03a8 Found avrdude version 6.3-20171130\r\n\u03a8 Found dfu-programmer version 0.6.1\r\n\u03a8 Found dfu-util version 0.11\r\n\u03a8 Submodules are up to date.\r\n\u03a8 Submodule status:\r\n\u03a8 - lib\/chibios: 2023-04-15 13:48:04 +0000 --  (11edb1610)\r\n\u03a8 - lib\/chibios-contrib: 2023-07-17 11:39:05 +0200 --  (da78eb37)\r\n\u03a8 - lib\/googletest: 2021-06-11 06:37:43 -0700 --  (e2239ee6)\r\n\u03a8 - lib\/lufa: 2022-08-26 12:09:55 +1000 --  (549b97320)\r\n\u03a8 - lib\/vusb: 2022-06-13 09:18:17 +1000 --  (819dbc1)\r\n\u03a8 - lib\/printf: 2022-06-29 23:59:58 +0300 --  (c2e3b4e)\r\n\u03a8 - lib\/pico-sdk: 2023-02-12 20:19:37 +0100 --  (a3398d8)\r\n\u03a8 - lib\/lvgl: 2022-04-11 04:44:53 -0600 --  (e19410f8)\r\n\u03a8 QMK is ready to go, but minor problems were found\r\n<\/pre>\n<h2>Appendix B: Getting system information<\/h2>\n<p>From the command line:<\/p>\n<h3>Ubuntu version, incl. the minor version number<\/h3>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nlsb_release -a\r\n<\/pre>\n<p>Sample output:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nNo LSB modules are available.\r\nDistributor ID:\tUbuntu\r\nDescription:\tUbuntu 20.04.6 LTS\r\nRelease:\t20.04\r\nCodename:\tfocal\r\n<\/pre>\n<h3>Linux kernel version<\/h3>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nuname -r\r\n<\/pre>\n<p>Sample output:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n5.15.0-83-generic\r\n<\/pre>\n<h3><a href=\"https:\/\/ubuntu.com\/kernel\/lifecycle\">HWE<\/a> status<\/h3>\n<p>If it is enabled (typically later minor versions of a Ubuntu major version), a newer Linux kernel is used.<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nhwe-support-status  --verbose\r\n<\/pre>\n<p>Sample output (when it is enabled):<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nYour Hardware Enablement Stack (HWE) is supported until April 2025.\r\n<\/pre>\n<h2>Appendix C: Compilation warnings<\/h2>\n<p>GCC may throw some warnings:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\ngcc -O2 -Wall -DLINUX   -c -o hid_listen.o hid_listen.c\r\ngcc -O2 -Wall -DLINUX   -c -o rawhid.o rawhid.c\r\nrawhid.c:53:45: warning: assertions are a deprecated extension [-Wdeprecated]\r\n   53 | #if defined(LINUX) || defined(__LINUX__) || #system(linux)\r\n      |                                             ^\r\nrawhid.c: In function \u2018rawhid_open_only1\u2019:\r\nrawhid.c:100:21: warning: array subscript \u2018struct hidraw_report_descriptor[0]\u2019 is partly outside array bounds of \u2018char[512]\u2019 [-Warray-bounds]\r\n  100 |                 desc-&gt;size = len;\r\n      |                     ^~\r\nrawhid.c:77:14: note: object \u2018buf\u2019 of size 512\r\n   77 |         char buf[512];\r\n      |              ^~~\r\ngcc -o hid_listen hid_listen.o rawhid.o \r\nstrip hid_listen\r\n\r\n<\/pre>\n<p><!-- THE END --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The short version: Building the third-party tool &#8220;hid_listen&#8221; from source and using Ubuntu&nbsp;20.04 (Focal Fossa) or later enables debugging of QMK firmware on Ubuntu. Introduction Printf debugging is enabled in QMK by using the standard printf (or its cousin dprintf()) &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"more-link\" href=\"https:\/\/pmortensen.eu\/world2\/2023\/09\/11\/qmk-debugging-blues-on-ubuntu\/\"> <span class=\"screen-reader-text\">QMK debugging blues on Ubuntu: hid_listen<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23,28,26,35],"tags":[],"_links":{"self":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts\/4361"}],"collection":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/comments?post=4361"}],"version-history":[{"count":133,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts\/4361\/revisions"}],"predecessor-version":[{"id":6161,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts\/4361\/revisions\/6161"}],"wp:attachment":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/media?parent=4361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/categories?post=4361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/tags?post=4361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}