AI prompts
base on A simple USB sniffer based on Raspberry Pi RP2040 # Usb Sniffer Lite for RP2040
This is a simple USB sniffer based on a Raspberry Pi RP2040. It supports Low Speed and
Full Speed modes.
The firmware presents itself as a virtual COM-port (VCP), so no additional software
is necessary and it is compatible with all operating systems.
Here are a couple of example capture logs for the [enumeration](doc/usb_fs_enumeration.txt)
and a regular [data transfer](doc/usb_fs_data.txt).
The compiled binary is available [here](bin/UsbSnifferLite.uf2). Boot RP2040 into
the BootROM mode and copy the UF2 file to the drive.
This sniffer has no packet decoding capabilities, but there is an excellent online
[USB Descriptor and Request Parser](https://eleccelerator.com/usbdescreqparser/)
that is very helpful with decoding of the standard descriptors and requests.
The compiled binary needs to have CRC value updated to be recognized by the RP2040.
This can be done using [bin2uf2](https://github.com/ataradov/tools/tree/master/bin2uf2) tool.
## Hardware Connections
USB D+ and D- signals can be directly connected to the MCU pins. The default
pin assignments are shown in the following table:
| RP2040 Pin | Function | USB Cable Color |
|:-------:|:----------------:|:-----:|
| GND | Ground | Black |
| GPIO 10 | D+ | Green |
| GPIO 11 | D- | White |
| GPIO 12 | Start (internal) | N/A |
| GPIO 18 | Trigger | N/A |
| GPIO 25 | Status LED | N/A |
| GPIO 26 | Error LED | N/A |
The easiest way to connect the signals to the Raspberry Pi Pico board is to splice
the USB cable. It does not have to be pretty. Below is a picture of a cable that
took less than 10 minutes to make. Feel free to make it prettier.
![USB Cable](doc/cable.jpg)
[Here](doc/Hardware.md) are some pictures of a cleaner version based on
the [custom breakout board](https://github.com/ataradov/breakout-boards/tree/master/rp2040).
Trigger input is internally pulled up and the active level is low. When trigger is
enabled in the settings, the capture would pause until the trigger pin is pulled low.
Given the limited size of the capture buffer, trigger mechanism provides a way for
the debugged target to mark the part of interest.
## Dedicated Hardware
There is now a dedicated board. It integrates FE8.1 USB HUB, so you only need one
connection to the host PC. This simplifies setup a lot and eliminates wiring mess
that usually happens when working with USB sniffers.
Normally it is not advised to use the same host port for the sniffer and the target device,
but since in this case only USB Low Speed and Full Speed modes are supported, there
is plenty of bandwidth for both devices.
Schematics and Gerber files are available in the [hardware](hardware/) directory.
![USB Sniffer Lite PCB](doc/usb-sniffer-lite.jpg)
## Settings
The following settings are supported:
* Capture speed (e) -- Low / Full
* Capture trigger (g) -- Enabled / Disabled
* Capture limit (l) -- 100/200/500/1000/2000/5000/10000 packets / Unlimited
* Time display format (t) -- Relative to the first packet / previous packet / SOF / bus reset
* Data display format (a) -- Full / Limit to 16 bytes / Limit to 64 bytes / Do not display data
* Fold empty frames (f) -- Enabled / Disabled
A frame is delimited by the SOF packet in the Full Speed mode or by a keep-alive signal in
the Low Speed mode.
An empty frame is a frame that contains no packets other than IN/NAK and contains no packets
with errors detected. Folding of the empty frames shortens the displayed information by
combining consecutive empty frames into one entry, since they don't carry useful information,
but happen very often in a typical USB transaction.
## Commands
The following commands are supported:
* Print the help message (h)
* Display current buffer (b)
* Start capture (s)
* Stop capture (p)
Once capture is started and the trigger condition is met, the sniffer captures the specified
number of packets. After the capture is done, the buffer is displayed using current settings.
The display settings may be adjusted without a new capture. Once the buffer is captured,
it is stored in the memory and can be displayed again using a `b` command.
", Assign "at most 3 tags" to the expected json: {"id":"11379","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"