本文记载了博主折腾开源项目Pico-Fido2的经历,该项目集成了Fido和OpenPGP智能卡的功能,本人对嵌入式并没有过多了解,如有谬误,欢迎指教修正。
硬件选择
原项目支持RP2350和ESP32-S3(不推荐使用RP2040),这里就挑了个便宜的RP2350, 具体型号是无名科技(nologo)的RP2350-USB (4M).

固件编译与刷入
由于树莓派官方不支持nologo的固件,为了使用led功能,需要自行编译固件,为了维持电脑环境干净,使用docker作为编译环境。使用项目pico-docker-sdk作为raspberry固件编译环境。具体命令可参考项目内Readme,此处不具体说明,需要注意,记得bind pico-fido2的源代码到容器内的工作路径!
启动并进入container后,可以在路径/usr/local/picosdk/src/boards/include/boards下看到官方支持的所有引脚定义,为了添加对nologo的支持,可以在该路径下创建文件(或修改已有文件)。
有关的参考资料有无名科技官方的RP2350-USB Wiki
原理图如下
笔者此处创建了文件nologo_rp2350_usb.h,内容是参考waveshare_rp2350_one.h写的,再次强调,博主并不擅长嵌入式,内容可能存在问题,内容见下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
#ifndef _BOARDS_NOLOGO_RP2350_USB_H #define _BOARDS_NOLOGO_RP2350_USB_H
#define NOLOGO_RP2350_USB
#define PICO_RP2350A 1
#ifndef PICO_DEFAULT_UART #define PICO_DEFAULT_UART 0 #endif #ifndef PICO_DEFAULT_UART_TX_PIN #define PICO_DEFAULT_UART_TX_PIN 0 #endif #ifndef PICO_DEFAULT_UART_RX_PIN #define PICO_DEFAULT_UART_RX_PIN 1 #endif
#ifndef PICO_DEFAULT_WS2812_PIN #define PICO_DEFAULT_WS2812_PIN 22 #endif
#endif
#ifndef PICO_DEFAULT_I2C #define PICO_DEFAULT_I2C 1 #endif #ifndef PICO_DEFAULT_I2C_SDA_PIN #define PICO_DEFAULT_I2C_SDA_PIN 6 #endif #ifndef PICO_DEFAULT_I2C_SCL_PIN #define PICO_DEFAULT_I2C_SCL_PIN 7 #endif
#ifndef PICO_DEFAULT_SPI #define PICO_DEFAULT_SPI 1 #endif #ifndef PICO_DEFAULT_SPI_SCK_PIN #define PICO_DEFAULT_SPI_SCK_PIN 10 #endif #ifndef PICO_DEFAULT_SPI_TX_PIN #define PICO_DEFAULT_SPI_TX_PIN 11 #endif #ifndef PICO_DEFAULT_SPI_RX_PIN #define PICO_DEFAULT_SPI_RX_PIN 12 #endif #ifndef PICO_DEFAULT_SPI_CSN_PIN #define PICO_DEFAULT_SPI_CSN_PIN 13 #endif
#define PICO_BOOT_STAGE2_CHOOSE_W25Q128 1
#ifndef PICO_FLASH_SPI_CLKDIV #define PICO_FLASH_SPI_CLKDIV 2 #endif
#ifndef PICO_FLASH_SIZE_BYTES #define PICO_FLASH_SIZE_BYTES (4 * 1024 * 1024) #endif
#define PICO_SMPS_MODE_PIN 23
#ifndef PICO_RP2350_A2_SUPPORTED #define PICO_RP2350_A2_SUPPORTED 1 #endif
#endif
|
添加了以上定义后,即可根据Pico-fido2的构建说明编译固件
笔者使用的命令如下
1 2 3 4 5 6 7
| git clone https://github.com/youruser/pico-fido2 git submodule update --init --recursive cd pico-fido2 mkdir build cd build cmake .. -DPICO_BOARD=nologo_rp2350_usb -DVIDPID=Yubikey5 make
|
构建完成后,build/pico_fido2.uf2即为所需的固件,然后正常刷入即可,按住BOOT键插入电脑,此时会被识别为U盘,将uf2文件传入即可,等待几秒led亮起即为刷入完毕。此次完成全部工作,可以正常使用。
当然,你可以在该网站额外开启Secure Lock和Secure Boot功能,可以进一步增加安全性。不过后果好像是不能刷入其他签名的固件,在正式投入使用前可以考虑开启。
使用
至此你相当于拥有了一个平替Yubikey,推荐参考此项目来完成密钥生成,备份等后续工作。
可以安装yubioath-flutter来提供Yubikey的GUI管理工具,更多其他的命令行工具和配置方法可以参考以下Wiki:
博主在测试时,发现无法导入Curve 25519的密钥到RP2350中,会出现报错,但是根据Pico-fido2的项目说明,应该是支持的,不确定是什么原因,欢迎交流。
外壳
直接拿着个电路板到处跑也不太好,可以自行3D打印外壳,博主参考此处分享的stl文件,基于模型进行了少量修改。
以下为成品图:

Reference
以下为其他关于Pico-fido项目的博客,在我研究该项目时提供了帮助,其中也包括本文没有进一步展开的内容,推荐读者进一步阅读: