Single

Openwrt自动识别ESP32-S3并实现自动烧录CircuitPython固件

前言

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


保存重启

注意:这里有一个问题,是我后面才注意到的,sd卡等其他设备(/dev/mmcblk0p1)都会触发这个脚本,所以需要在后面的脚本做个识别,我这只有sda,sdb这种,所以只要DEVNAME是sd*就行

到此就简单了,/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步骤一样,识别,执行脚本等等,所以问题倒不是很大,记录下来方便后面用到

暂无评论

发表评论