前言
BPI-Pico的CircuitPython固件烧录流程有点复杂,所以想研究一下,顺便记录一下。
准备
硬件方面,我这里用到的设备有
1、BPI-M1+
2、OpenWrt固件(具体配置方法在这里)
3、BPI-Pico板子(上面有一片ESP32-S3,我们是为了给这个芯片烧写固件)
4、一个hub(想接更多设备可以接更多hub,但是一定要注意供电,一定要买好点的hub,我在这里遇到了很多供电不足的坑)
BPI-Pico的CircuitPython固件目前是两步,第一个是烧录combined.bin文件,复位之后会识别到一个U盘,然后将firmware.uf2文件复制到U盘里面,ESP32会自动烧录进去,但是openwrt好像没有自动挂载?所以需要找到设备名(/dev/sda?/dev/sdb?应该是叫设备名吧)然后新建文件夹,挂载,删除等
第一步很简单,参考以前的文章就能解决Openwrt自动识别DFU状态下的STM32并实现自动烧录
第二步大概有个思路,如下:
1、插上板子,输出所有变量,找到和ttyACM状态下不一样的点,通过这个识别不同状态的ESP32-S3芯片
2、获取到设备名,新建文件夹,挂载到文件夹,将固件复制到文件夹,取消挂载,删除文件夹
找不同
首先是编辑hotplug.json文件,识别到设备插入后,执行脚本
[ "if", [ "eq", "ACTION", [ "add" ] ], [ "exec", "/root/test" ] ]
然后需要编辑脚本
vi /root/test
将下面的代码放进去
#!/bin/sh echo "==========" >> /tmp/env.log env >> /tmp/env.log echo "----------" >> /tmp/env.log
BPI-Pico的combined.bin烧录完了之后,插到M1+上。然后查看/tmp/env.log文件
root@OpenWrt:~# cat /tmp/env.log ========== DEVNAME=bus/usb/004/004 ACTION=add SHLVL=1 HOME=/ SEQNUM=1038 BUSNUM=004 MAJOR=189 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1 TERM=linux SUBSYSTEM=usb PATH=/usr/sbin:/usr/bin:/sbin:/bin MINOR=387 TYPE=0/0/0 DEVNUM=004 PRODUCT=303a/812d/100 PWD=/ DEVTYPE=usb_device ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1039 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0 TERM=linux SUBSYSTEM=usb PATH=/usr/sbin:/usr/bin:/sbin:/bin MODALIAS=usb:v303Ap812Dd0100dc00dsc00dp00ic08isc06ip50in00 TYPE=0/0/0 PRODUCT=303a/812d/100 INTERFACE=8/6/80 PWD=/ DEVTYPE=usb_interface ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1040 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1 TERM=linux SUBSYSTEM=scsi PATH=/usr/sbin:/usr/bin:/sbin:/bin PWD=/ DEVTYPE=scsi_host ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1041 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1/scsi_host/host1 TERM=linux SUBSYSTEM=scsi_host PATH=/usr/sbin:/usr/bin:/sbin:/bin PWD=/ ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1043 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.1 TERM=linux SUBSYSTEM=usb PATH=/usr/sbin:/usr/bin:/sbin:/bin MODALIAS=usb:v303Ap812Dd0100dc00dsc00dp00ic03isc00ip00in01 TYPE=0/0/0 PRODUCT=303a/812d/100 INTERFACE=3/0/0 PWD=/ DEVTYPE=usb_interface ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1045 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1/target1:0:0 TERM=linux SUBSYSTEM=scsi PATH=/usr/sbin:/usr/bin:/sbin:/bin PWD=/ DEVTYPE=scsi_target ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1046 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1/target1:0:0/1:0:0:0 TERM=linux SUBSYSTEM=scsi PATH=/usr/sbin:/usr/bin:/sbin:/bin MODALIAS=scsi:t-0x00 PWD=/ DEVTYPE=scsi_device ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1047 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1/target1:0:0/1:0:0:0/scsi_disk/1:0:0:0 TERM=linux SUBSYSTEM=scsi_disk PATH=/usr/sbin:/usr/bin:/sbin:/bin PWD=/ ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1049 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1/target1:0:0/1:0:0:0/scsi_device/1:0:0:0 TERM=linux SUBSYSTEM=scsi_device PATH=/usr/sbin:/usr/bin:/sbin:/bin PWD=/ ---------- ========== ACTION=add SHLVL=1 HOME=/ SEQNUM=1050 DEVPATH=/devices/virtual/bdi/8:0 TERM=linux SUBSYSTEM=bdi PATH=/usr/sbin:/usr/bin:/sbin:/bin PWD=/ ---------- ========== DEVNAME=sda ACTION=add SHLVL=1 HOME=/ SEQNUM=1051 MAJOR=8 DEVPATH=/devices/platform/soc@01c00000/1c1c400.usb/usb4/4-1/4-1:1.0/host1/target1:0:0/1:0:0:0/block/sda TERM=linux SUBSYSTEM=block PATH=/usr/sbin:/usr/bin:/sbin:/bin MINOR=0 PWD=/ DEVTYPE=disk ----------
可以看到,最下面这个,SUBSYSTEM=block,所以他是触发的/etc/hotplug.d/block/文件夹下面的脚本,即00-media-change,输出可以看到
在后面加上一部分,让识别到disk就执行/root/QC/AutoRun脚本,并传输一个参数,usbmode,后面AutoRun脚本得到了AutoRun就自动执行复制的脚本
if [ "$DEVTYPE" = "disk" ] then if [ "$ACTION" = add ] || [ "$ACTION" = remove ] then #echo "ACTION="$ACTION >> /tmp/env.log env >> /root/env.log /root/QC/AutoRun usbmode exit 0 fi fi
保存重启
到此就简单了,/etc/hotplug.d/tty/00_ttyUSB加一个判断,ACTION=add或者remove,自动执行/root/QC/AutoRun并带一个参数ttymode,然后编辑/root/QC/AutoRun文件,如果是ttymode就执行esptool烧录脚本,如果是usbmode就新建文件夹,挂载,复制,等待复制完,取消挂载,删除,后面简单把复制挂载的代码放进来
mkdir /root/$DEVICENAME PICOPATH=/root/$DEVICENAME mount /dev/$DEVICENAME $PICOPATH echo $PICOPATH >> /tmp/env1.log cp /root/QC/pico/firmware.uf2 $PICOPATH sleep 24 umount /root/$DEVICENAME rm -rf /root/$DEVICENAME
总结
总体思路上和之前的esptool步骤一样,识别,执行脚本等等,所以问题倒不是很大,记录下来方便后面用到
暂无评论