C++ firmware of the PICO to work with the u2if python module. Binary file (u2if.uf2) is available in published release and to must be uploaded to the pico. It can be also be built.
Plug in the PICO while holding down the BOOTSEL button, then a USB flash storage should appear. Copy "u2if.uf2" on it.
The firmware makes the pico act like a USB device (generic HID and CDC). Each command is blocking and is done via the HID interface (64 byte report). For some operations, CDC is used to increase the transfer speed.
To make PICO with this firmware usable in non-root mode, create following file (/etc/udev/rules.d/55-u2if.rules) and add contents depending of your hidraw implemantation (libusb or hidraw). See https://github.com/libusb/hidapi/blob/master/udev/69-hid.rules
# PICO
SUBSYSTEM=="usb", ATTR{idVendor}=="cafe", ATTR{idProduct}=="4005", MODE="0666"
# Adafruit Feather
SUBSYSTEM=="usb", ATTR{idVendor}=="239a", ATTR{idProduct}=="00f1", MODE="0666"
# Adafruit ItsyBitsy
SUBSYSTEM=="usb", ATTR{idVendor}=="239a", ATTR{idProduct}=="00fd", MODE="0666"
# Adafruit QT2040 Trinkey
SUBSYSTEM=="usb", ATTR{idVendor}=="239a", ATTR{idProduct}=="0109", MODE="0666"
# Adafruit QTPY
SUBSYSTEM=="usb", ATTR{idVendor}=="239a", ATTR{idProduct}=="00f7", MODE="0666"
# PICO
KERNEL=="hidraw*", ATTRS{idVendor}=="cafe", ATTRS{idProduct}=="4005", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit Feather
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="00f1", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit Feather CAN Bus
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="8130", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit Feather RFM
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="812E", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit Feather ThinkInk
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="812C", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit ItsyBitsy
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="00fd", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit KB2040
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="0105", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit QT2040 Trinkey
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="0109", TAG+="uaccess", GROUP="plugdev", MODE="0660"
# Adafruit QTPY
KERNEL=="hidraw*", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="00f7", TAG+="uaccess", GROUP="plugdev", MODE="0660"
Then reboot or reload udev rules:
- sudo udevadm control --reload-rules
- sudo udevadm trigger
In u2if directory:
- git submodule update --init --recursive
In u2if/firmware/source directory:
- mkdir build
- cd build
- cmake ..
- make
The firmware to upload to Pico is u2if/firmware/source/build/u2if.uf2
Compatible board can be:
- PICO
- FEATHER
- FEATHER_CAN
- FEATHER_EPD
- FEATHER_RFM
- ITSYBITSY
- KB2040
- QTPY
- QT2040_TRINKEY
Default compilation is for PICO board. But target board can be selected during cmake call: cmake -DBOARD=qtpy ..
Some interfaces can also be enabled(1)/disabled(0) during cmake:
- ADC: -DADC_ENABLED=0 (default 1)
- PWM: -DPWM_ENABLED=0 (default 1)
- I2S: -DI2S_ALLOW=1 (default 0, work only for PICO board)
- HUB75: -DHUB75_ALLOW=1 (default 0, work only for PICO board)
- WS2812: -DWS2812_ENABLED=0 (default 1)
Note: for WS2812 interface, the maximum number of leds managed is 1000 but this can be modified by the parameter WS2812_SIZE. If we increase this number, the I2S interface must be deactivated because it uses a lot of ram.
Example for PICO board enabling I2S and setting 300 as maximum number of leds: cmake -DBOARD=PICO -DI2S_ALLOW=1 -DWS2812_SIZE=300 ..
The build-all.sh script facilitates the generation of the different maps supported. It has to be launched form firmware directory and it will build uf2 firmware in firmware/release directory.