main 670a1871d8e6 cached
4657 files
19.5 MB
5.4M tokens
12120 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (21,876K chars total). Download the full file to get everything.
Repository: JPShag/PCILEECH-DMA-FW-Guide-2.0
Branch: main
Commit: 670a1871d8e6
Files: 4657
Total size: 19.5 MB

Directory structure:
gitextract_gv5nd5na/

├── CN/
│   ├── README-old-2.md
│   ├── README-old.md
│   ├── README.md
│   ├── 核对表.md
│   └── 版本 4.md
├── Checklist.md
├── FW-Guide-v4.md
├── Lesson 3_ Advanced PCIe Configuration and Interrupt Handling.md
├── README-old.md
├── README-v2-old.md
├── README.md
├── RU/
│   └── README.md
└── Tools/
    ├── CH347/
    │   └── ch347-main/
    │       ├── CH347FPGATool/
    │       │   ├── FPGABit/
    │       │   │   ├── bscan_spi_xc3s100e.bit
    │       │   │   ├── bscan_spi_xc3s1200e.bit
    │       │   │   ├── bscan_spi_xc3s1400a.bit
    │       │   │   ├── bscan_spi_xc3s1400an.bit
    │       │   │   ├── bscan_spi_xc3s1600e.bit
    │       │   │   ├── bscan_spi_xc3s200a.bit
    │       │   │   ├── bscan_spi_xc3s200an.bit
    │       │   │   ├── bscan_spi_xc3s250e.bit
    │       │   │   ├── bscan_spi_xc3s400a.bit
    │       │   │   ├── bscan_spi_xc3s400an.bit
    │       │   │   ├── bscan_spi_xc3s500e.bit
    │       │   │   ├── bscan_spi_xc3s50a.bit
    │       │   │   ├── bscan_spi_xc3s50an.bit
    │       │   │   ├── bscan_spi_xc3s700a.bit
    │       │   │   ├── bscan_spi_xc3s700an.bit
    │       │   │   ├── bscan_spi_xc3sd1800a.bit
    │       │   │   ├── bscan_spi_xc3sd3400a.bit
    │       │   │   ├── bscan_spi_xc6slx100.bit
    │       │   │   ├── bscan_spi_xc6slx100t.bit
    │       │   │   ├── bscan_spi_xc6slx150.bit
    │       │   │   ├── bscan_spi_xc6slx150t.bit
    │       │   │   ├── bscan_spi_xc6slx16.bit
    │       │   │   ├── bscan_spi_xc6slx25.bit
    │       │   │   ├── bscan_spi_xc6slx25t.bit
    │       │   │   ├── bscan_spi_xc6slx4.bit
    │       │   │   ├── bscan_spi_xc6slx45.bit
    │       │   │   ├── bscan_spi_xc6slx45t.bit
    │       │   │   ├── bscan_spi_xc6slx75.bit
    │       │   │   ├── bscan_spi_xc6slx75t.bit
    │       │   │   ├── bscan_spi_xc6slx9.bit
    │       │   │   ├── bscan_spi_xc7a100t.bit
    │       │   │   ├── bscan_spi_xc7a12t.bit
    │       │   │   ├── bscan_spi_xc7a15t.bit
    │       │   │   ├── bscan_spi_xc7a200t.bit
    │       │   │   ├── bscan_spi_xc7a25t.bit
    │       │   │   ├── bscan_spi_xc7a35t.bit
    │       │   │   ├── bscan_spi_xc7a50t.bit
    │       │   │   ├── bscan_spi_xc7a75t.bit
    │       │   │   ├── bscan_spi_xc7k160t.bit
    │       │   │   ├── bscan_spi_xc7k325t-debug.bit
    │       │   │   ├── bscan_spi_xc7k325t.bit
    │       │   │   ├── bscan_spi_xc7k355t.bit
    │       │   │   ├── bscan_spi_xc7k410t.bit
    │       │   │   ├── bscan_spi_xc7k420t.bit
    │       │   │   ├── bscan_spi_xc7k480t.bit
    │       │   │   ├── bscan_spi_xc7k70t.bit
    │       │   │   ├── bscan_spi_xc7s25.bit
    │       │   │   ├── bscan_spi_xc7s50.bit
    │       │   │   ├── bscan_spi_xc7v2000t.bit
    │       │   │   ├── bscan_spi_xc7v585t.bit
    │       │   │   ├── bscan_spi_xc7vh580t.bit
    │       │   │   ├── bscan_spi_xc7vh870t.bit
    │       │   │   ├── bscan_spi_xc7vx1140t.bit
    │       │   │   ├── bscan_spi_xc7vx330t.bit
    │       │   │   ├── bscan_spi_xc7vx415t.bit
    │       │   │   ├── bscan_spi_xc7vx485t.bit
    │       │   │   ├── bscan_spi_xc7vx550t.bit
    │       │   │   ├── bscan_spi_xc7vx690t.bit
    │       │   │   ├── bscan_spi_xc7vx980t.bit
    │       │   │   └── bscan_spi_xcku040.bit
    │       │   ├── OpenOCD_CH347/
    │       │   │   ├── bin/
    │       │   │   │   └── ch347.cfg
    │       │   │   ├── contrib/
    │       │   │   │   ├── 60-openocd.rules
    │       │   │   │   └── libdcc/
    │       │   │   │       ├── README
    │       │   │   │       ├── dcc_stdio.c
    │       │   │   │       ├── dcc_stdio.h
    │       │   │   │       └── example.c
    │       │   │   ├── scripts/
    │       │   │   │   ├── bitsbytes.tcl
    │       │   │   │   ├── board/
    │       │   │   │   │   ├── 8devices-lima.cfg
    │       │   │   │   │   ├── actux3.cfg
    │       │   │   │   │   ├── adapteva_parallella1.cfg
    │       │   │   │   │   ├── adsp-sc584-ezbrd.cfg
    │       │   │   │   │   ├── alphascale_asm9260_ek.cfg
    │       │   │   │   │   ├── altera_sockit.cfg
    │       │   │   │   │   ├── am3517evm.cfg
    │       │   │   │   │   ├── ampere_emag8180.cfg
    │       │   │   │   │   ├── arm_evaluator7t.cfg
    │       │   │   │   │   ├── arm_musca_a.cfg
    │       │   │   │   │   ├── arty_s7.cfg
    │       │   │   │   │   ├── asus-rt-n16.cfg
    │       │   │   │   │   ├── asus-rt-n66u.cfg
    │       │   │   │   │   ├── at91cap7a-stk-sdram.cfg
    │       │   │   │   │   ├── at91eb40a.cfg
    │       │   │   │   │   ├── at91rm9200-dk.cfg
    │       │   │   │   │   ├── at91rm9200-ek.cfg
    │       │   │   │   │   ├── at91sam9261-ek.cfg
    │       │   │   │   │   ├── at91sam9263-ek.cfg
    │       │   │   │   │   ├── at91sam9g20-ek.cfg
    │       │   │   │   │   ├── atmel_at91sam7s-ek.cfg
    │       │   │   │   │   ├── atmel_at91sam9260-ek.cfg
    │       │   │   │   │   ├── atmel_at91sam9rl-ek.cfg
    │       │   │   │   │   ├── atmel_sam3n_ek.cfg
    │       │   │   │   │   ├── atmel_sam3s_ek.cfg
    │       │   │   │   │   ├── atmel_sam3u_ek.cfg
    │       │   │   │   │   ├── atmel_sam3x_ek.cfg
    │       │   │   │   │   ├── atmel_sam4e_ek.cfg
    │       │   │   │   │   ├── atmel_sam4l8_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_sam4s_ek.cfg
    │       │   │   │   │   ├── atmel_sam4s_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samc20_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samc21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samd10_xplained_mini.cfg
    │       │   │   │   │   ├── atmel_samd11_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samd20_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samd21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_same70_xplained.cfg
    │       │   │   │   │   ├── atmel_samg53_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samg55_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_saml21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samr21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samv71_xplained_ultra.cfg
    │       │   │   │   │   ├── avnet_ultrazed-eg.cfg
    │       │   │   │   │   ├── balloon3-cpu.cfg
    │       │   │   │   │   ├── bcm28155_ap.cfg
    │       │   │   │   │   ├── bluefield.cfg
    │       │   │   │   │   ├── bt-homehubv1.cfg
    │       │   │   │   │   ├── colibri.cfg
    │       │   │   │   │   ├── crossbow_tech_imote2.cfg
    │       │   │   │   │   ├── csb337.cfg
    │       │   │   │   │   ├── csb732.cfg
    │       │   │   │   │   ├── da850evm.cfg
    │       │   │   │   │   ├── digi_connectcore_wi-9c.cfg
    │       │   │   │   │   ├── digilent_analog_discovery.cfg
    │       │   │   │   │   ├── digilent_atlys.cfg
    │       │   │   │   │   ├── digilent_nexys_video.cfg
    │       │   │   │   │   ├── digilent_zedboard.cfg
    │       │   │   │   │   ├── diolan_lpc4350-db1.cfg
    │       │   │   │   │   ├── diolan_lpc4357-db1.cfg
    │       │   │   │   │   ├── dk-tm4c129.cfg
    │       │   │   │   │   ├── dm355evm.cfg
    │       │   │   │   │   ├── dm365evm.cfg
    │       │   │   │   │   ├── dm6446evm.cfg
    │       │   │   │   │   ├── dp_busblaster_v3.cfg
    │       │   │   │   │   ├── dp_busblaster_v4.cfg
    │       │   │   │   │   ├── dptechnics_dpt-board-v1.cfg
    │       │   │   │   │   ├── efikamx.cfg
    │       │   │   │   │   ├── efm32.cfg
    │       │   │   │   │   ├── eir.cfg
    │       │   │   │   │   ├── ek-lm3s1968.cfg
    │       │   │   │   │   ├── ek-lm3s3748.cfg
    │       │   │   │   │   ├── ek-lm3s6965.cfg
    │       │   │   │   │   ├── ek-lm3s811-revb.cfg
    │       │   │   │   │   ├── ek-lm3s811.cfg
    │       │   │   │   │   ├── ek-lm3s8962.cfg
    │       │   │   │   │   ├── ek-lm3s9b9x.cfg
    │       │   │   │   │   ├── ek-lm3s9d92.cfg
    │       │   │   │   │   ├── ek-lm4f120xl.cfg
    │       │   │   │   │   ├── ek-lm4f232.cfg
    │       │   │   │   │   ├── ek-tm4c123gxl.cfg
    │       │   │   │   │   ├── ek-tm4c1294xl.cfg
    │       │   │   │   │   ├── embedded-artists_lpc2478-32.cfg
    │       │   │   │   │   ├── emcraft_imx8m-som-bsb.cfg
    │       │   │   │   │   ├── emcraft_twr-vf6-som-bsb.cfg
    │       │   │   │   │   ├── emcraft_vf6-som.cfg
    │       │   │   │   │   ├── esp32s2-kaluga-1.cfg
    │       │   │   │   │   ├── ethernut3.cfg
    │       │   │   │   │   ├── evb-lan9255.cfg
    │       │   │   │   │   ├── frdm-kl25z.cfg
    │       │   │   │   │   ├── frdm-kl46z.cfg
    │       │   │   │   │   ├── fsl_imx6q_sabresd.cfg
    │       │   │   │   │   ├── glyn_tonga2.cfg
    │       │   │   │   │   ├── gti/
    │       │   │   │   │   │   └── espressobin.cfg
    │       │   │   │   │   ├── gumstix-aerocore.cfg
    │       │   │   │   │   ├── hammer.cfg
    │       │   │   │   │   ├── hilscher_nxdb500sys.cfg
    │       │   │   │   │   ├── hilscher_nxeb500hmi.cfg
    │       │   │   │   │   ├── hilscher_nxhx10.cfg
    │       │   │   │   │   ├── hilscher_nxhx50.cfg
    │       │   │   │   │   ├── hilscher_nxhx500.cfg
    │       │   │   │   │   ├── hilscher_nxsb100.cfg
    │       │   │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   │   ├── hitex_lpc2929.cfg
    │       │   │   │   │   ├── hitex_stm32-performancestick.cfg
    │       │   │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   │   ├── iar_lpc1768.cfg
    │       │   │   │   │   ├── iar_str912_sk.cfg
    │       │   │   │   │   ├── icnova_imx53_sodimm.cfg
    │       │   │   │   │   ├── icnova_sam9g45_sodimm.cfg
    │       │   │   │   │   ├── imx27ads.cfg
    │       │   │   │   │   ├── imx27lnst.cfg
    │       │   │   │   │   ├── imx28evk.cfg
    │       │   │   │   │   ├── imx31pdk.cfg
    │       │   │   │   │   ├── imx35pdk.cfg
    │       │   │   │   │   ├── imx53-m53evk.cfg
    │       │   │   │   │   ├── imx53loco.cfg
    │       │   │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   │   ├── insignal_arndale.cfg
    │       │   │   │   │   ├── kasli.cfg
    │       │   │   │   │   ├── kc100.cfg
    │       │   │   │   │   ├── kc705.cfg
    │       │   │   │   │   ├── kcu105.cfg
    │       │   │   │   │   ├── keil_mcb1700.cfg
    │       │   │   │   │   ├── keil_mcb2140.cfg
    │       │   │   │   │   ├── kindle2.cfg
    │       │   │   │   │   ├── kontron_sl28.cfg
    │       │   │   │   │   ├── kwikstik.cfg
    │       │   │   │   │   ├── la_fonera-fon2200.cfg
    │       │   │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   │   ├── lemaker_hikey.cfg
    │       │   │   │   │   ├── linksys-wag200g.cfg
    │       │   │   │   │   ├── linksys-wrt54gl.cfg
    │       │   │   │   │   ├── linksys_nslu2.cfg
    │       │   │   │   │   ├── lisa-l.cfg
    │       │   │   │   │   ├── logicpd_imx27.cfg
    │       │   │   │   │   ├── lpc1850_spifi_generic.cfg
    │       │   │   │   │   ├── lpc4350_spifi_generic.cfg
    │       │   │   │   │   ├── lubbock.cfg
    │       │   │   │   │   ├── marsohod.cfg
    │       │   │   │   │   ├── marsohod2.cfg
    │       │   │   │   │   ├── marsohod3.cfg
    │       │   │   │   │   ├── mbed-lpc11u24.cfg
    │       │   │   │   │   ├── mbed-lpc1768.cfg
    │       │   │   │   │   ├── mcb1700.cfg
    │       │   │   │   │   ├── microchip_explorer16.cfg
    │       │   │   │   │   ├── microchip_sama5d27_som1_kit1.cfg
    │       │   │   │   │   ├── microchip_same51_curiosity_nano.cfg
    │       │   │   │   │   ├── microchip_same54_xplained_pro.cfg
    │       │   │   │   │   ├── microchip_saml11_xplained_pro.cfg
    │       │   │   │   │   ├── mini2440.cfg
    │       │   │   │   │   ├── mini6410.cfg
    │       │   │   │   │   ├── minispartan6.cfg
    │       │   │   │   │   ├── nds32_corvettef1.cfg
    │       │   │   │   │   ├── nds32_xc5.cfg
    │       │   │   │   │   ├── nds32_xc7.cfg
    │       │   │   │   │   ├── netgear-dg834v3.cfg
    │       │   │   │   │   ├── netgear-wg102.cfg
    │       │   │   │   │   ├── nordic_nrf51822_mkit.cfg
    │       │   │   │   │   ├── nordic_nrf51_dk.cfg
    │       │   │   │   │   ├── nordic_nrf52_dk.cfg
    │       │   │   │   │   ├── nordic_nrf52_ftx232.cfg
    │       │   │   │   │   ├── novena-internal-fpga.cfg
    │       │   │   │   │   ├── npcx_evb.cfg
    │       │   │   │   │   ├── numato_mimas_a7.cfg
    │       │   │   │   │   ├── numato_opsis.cfg
    │       │   │   │   │   ├── nxp_frdm-k64f.cfg
    │       │   │   │   │   ├── nxp_frdm-ls1012a.cfg
    │       │   │   │   │   ├── nxp_imx7sabre.cfg
    │       │   │   │   │   ├── nxp_lpc-link2.cfg
    │       │   │   │   │   ├── nxp_mcimx8m-evk.cfg
    │       │   │   │   │   ├── nxp_rdb-ls1046a.cfg
    │       │   │   │   │   ├── nxp_rdb-ls1088a.cfg
    │       │   │   │   │   ├── olimex_LPC2378STK.cfg
    │       │   │   │   │   ├── olimex_lpc_h2148.cfg
    │       │   │   │   │   ├── olimex_sam7_ex256.cfg
    │       │   │   │   │   ├── olimex_sam7_la2.cfg
    │       │   │   │   │   ├── olimex_sam9_l9260.cfg
    │       │   │   │   │   ├── olimex_stm32_h103.cfg
    │       │   │   │   │   ├── olimex_stm32_h107.cfg
    │       │   │   │   │   ├── olimex_stm32_h405.cfg
    │       │   │   │   │   ├── olimex_stm32_p107.cfg
    │       │   │   │   │   ├── omap2420_h4.cfg
    │       │   │   │   │   ├── openrd.cfg
    │       │   │   │   │   ├── or1k_generic.cfg
    │       │   │   │   │   ├── osk5912.cfg
    │       │   │   │   │   ├── phone_se_j100i.cfg
    │       │   │   │   │   ├── phytec_lpc3250.cfg
    │       │   │   │   │   ├── pic-p32mx.cfg
    │       │   │   │   │   ├── pico-debug.cfg
    │       │   │   │   │   ├── pipistrello.cfg
    │       │   │   │   │   ├── propox_mmnet1001.cfg
    │       │   │   │   │   ├── pxa255_sst.cfg
    │       │   │   │   │   ├── quark_d2000_refboard.cfg
    │       │   │   │   │   ├── quark_x10xx_board.cfg
    │       │   │   │   │   ├── quicklogic_quickfeather.cfg
    │       │   │   │   │   ├── radiona_ulx3s.cfg
    │       │   │   │   │   ├── redbee.cfg
    │       │   │   │   │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │       │   │   │   │   ├── renesas_dk-s7g2.cfg
    │       │   │   │   │   ├── renesas_falcon.cfg
    │       │   │   │   │   ├── renesas_gr_peach.cfg
    │       │   │   │   │   ├── renesas_porter.cfg
    │       │   │   │   │   ├── renesas_salvator-xs.cfg
    │       │   │   │   │   ├── renesas_silk.cfg
    │       │   │   │   │   ├── renesas_stout.cfg
    │       │   │   │   │   ├── rigado_bmd300_ek.cfg
    │       │   │   │   │   ├── rpi3.cfg
    │       │   │   │   │   ├── rpi4b.cfg
    │       │   │   │   │   ├── rsc-w910.cfg
    │       │   │   │   │   ├── sayma_amc.cfg
    │       │   │   │   │   ├── sheevaplug.cfg
    │       │   │   │   │   ├── sifive-e31arty.cfg
    │       │   │   │   │   ├── sifive-e51arty.cfg
    │       │   │   │   │   ├── sifive-hifive1-revb.cfg
    │       │   │   │   │   ├── sifive-hifive1.cfg
    │       │   │   │   │   ├── smdk6410.cfg
    │       │   │   │   │   ├── snps_em_sk.cfg
    │       │   │   │   │   ├── snps_em_sk_v1.cfg
    │       │   │   │   │   ├── snps_em_sk_v2.1.cfg
    │       │   │   │   │   ├── snps_em_sk_v2.2.cfg
    │       │   │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │       │   │   │   │   ├── spansion_sk-fm4-u120-9b560.cfg
    │       │   │   │   │   ├── spear300evb.cfg
    │       │   │   │   │   ├── spear300evb_mod.cfg
    │       │   │   │   │   ├── spear310evb20.cfg
    │       │   │   │   │   ├── spear310evb20_mod.cfg
    │       │   │   │   │   ├── spear320cpu.cfg
    │       │   │   │   │   ├── spear320cpu_mod.cfg
    │       │   │   │   │   ├── st_b-l475e-iot01a.cfg
    │       │   │   │   │   ├── st_nucleo_8l152r8.cfg
    │       │   │   │   │   ├── st_nucleo_8s208rb.cfg
    │       │   │   │   │   ├── st_nucleo_f0.cfg
    │       │   │   │   │   ├── st_nucleo_f103rb.cfg
    │       │   │   │   │   ├── st_nucleo_f3.cfg
    │       │   │   │   │   ├── st_nucleo_f4.cfg
    │       │   │   │   │   ├── st_nucleo_f7.cfg
    │       │   │   │   │   ├── st_nucleo_g0.cfg
    │       │   │   │   │   ├── st_nucleo_g4.cfg
    │       │   │   │   │   ├── st_nucleo_h743zi.cfg
    │       │   │   │   │   ├── st_nucleo_h745zi.cfg
    │       │   │   │   │   ├── st_nucleo_l073rz.cfg
    │       │   │   │   │   ├── st_nucleo_l1.cfg
    │       │   │   │   │   ├── st_nucleo_l4.cfg
    │       │   │   │   │   ├── st_nucleo_l5.cfg
    │       │   │   │   │   ├── st_nucleo_wb55.cfg
    │       │   │   │   │   ├── steval-idb007v1.cfg
    │       │   │   │   │   ├── steval-idb008v1.cfg
    │       │   │   │   │   ├── steval-idb011v1.cfg
    │       │   │   │   │   ├── steval-idb012v1.cfg
    │       │   │   │   │   ├── steval_pcc010.cfg
    │       │   │   │   │   ├── stm320518_eval.cfg
    │       │   │   │   │   ├── stm320518_eval_stlink.cfg
    │       │   │   │   │   ├── stm32100b_eval.cfg
    │       │   │   │   │   ├── stm3210b_eval.cfg
    │       │   │   │   │   ├── stm3210c_eval.cfg
    │       │   │   │   │   ├── stm3210e_eval.cfg
    │       │   │   │   │   ├── stm3220g_eval.cfg
    │       │   │   │   │   ├── stm3220g_eval_stlink.cfg
    │       │   │   │   │   ├── stm3241g_eval.cfg
    │       │   │   │   │   ├── stm3241g_eval_stlink.cfg
    │       │   │   │   │   ├── stm32429i_eval.cfg
    │       │   │   │   │   ├── stm32429i_eval_stlink.cfg
    │       │   │   │   │   ├── stm32439i_eval.cfg
    │       │   │   │   │   ├── stm32439i_eval_stlink.cfg
    │       │   │   │   │   ├── stm327x6g_eval.cfg
    │       │   │   │   │   ├── stm32f0discovery.cfg
    │       │   │   │   │   ├── stm32f103c8_blue_pill.cfg
    │       │   │   │   │   ├── stm32f334discovery.cfg
    │       │   │   │   │   ├── stm32f3discovery.cfg
    │       │   │   │   │   ├── stm32f412g-disco.cfg
    │       │   │   │   │   ├── stm32f413h-disco.cfg
    │       │   │   │   │   ├── stm32f429disc1.cfg
    │       │   │   │   │   ├── stm32f429discovery.cfg
    │       │   │   │   │   ├── stm32f469discovery.cfg
    │       │   │   │   │   ├── stm32f469i-disco.cfg
    │       │   │   │   │   ├── stm32f4discovery.cfg
    │       │   │   │   │   ├── stm32f723e-disco.cfg
    │       │   │   │   │   ├── stm32f746g-disco.cfg
    │       │   │   │   │   ├── stm32f769i-disco.cfg
    │       │   │   │   │   ├── stm32f7discovery.cfg
    │       │   │   │   │   ├── stm32h735g-disco.cfg
    │       │   │   │   │   ├── stm32h745i-disco.cfg
    │       │   │   │   │   ├── stm32h747i-disco.cfg
    │       │   │   │   │   ├── stm32h750b-disco.cfg
    │       │   │   │   │   ├── stm32h7b3i-disco.cfg
    │       │   │   │   │   ├── stm32h7x3i_eval.cfg
    │       │   │   │   │   ├── stm32h7x_dual_qspi.cfg
    │       │   │   │   │   ├── stm32l0discovery.cfg
    │       │   │   │   │   ├── stm32l476g-disco.cfg
    │       │   │   │   │   ├── stm32l496g-disco.cfg
    │       │   │   │   │   ├── stm32l4discovery.cfg
    │       │   │   │   │   ├── stm32l4p5g-disco.cfg
    │       │   │   │   │   ├── stm32l4r9i-disco.cfg
    │       │   │   │   │   ├── stm32ldiscovery.cfg
    │       │   │   │   │   ├── stm32mp13x_dk.cfg
    │       │   │   │   │   ├── stm32mp15x_dk2.cfg
    │       │   │   │   │   ├── stm32vldiscovery.cfg
    │       │   │   │   │   ├── str910-eval.cfg
    │       │   │   │   │   ├── telo.cfg
    │       │   │   │   │   ├── ti_am335xevm.cfg
    │       │   │   │   │   ├── ti_am437x_idk.cfg
    │       │   │   │   │   ├── ti_am43xx_evm.cfg
    │       │   │   │   │   ├── ti_am625evm.cfg
    │       │   │   │   │   ├── ti_am642evm.cfg
    │       │   │   │   │   ├── ti_am654evm.cfg
    │       │   │   │   │   ├── ti_beagleboard.cfg
    │       │   │   │   │   ├── ti_beagleboard_xm.cfg
    │       │   │   │   │   ├── ti_beaglebone-base.cfg
    │       │   │   │   │   ├── ti_beaglebone.cfg
    │       │   │   │   │   ├── ti_beaglebone_black.cfg
    │       │   │   │   │   ├── ti_blaze.cfg
    │       │   │   │   │   ├── ti_cc13x0_launchpad.cfg
    │       │   │   │   │   ├── ti_cc13x2_launchpad.cfg
    │       │   │   │   │   ├── ti_cc26x0_launchpad.cfg
    │       │   │   │   │   ├── ti_cc26x2_launchpad.cfg
    │       │   │   │   │   ├── ti_cc3200_launchxl.cfg
    │       │   │   │   │   ├── ti_cc3220sf_launchpad.cfg
    │       │   │   │   │   ├── ti_cc32xx_launchpad.cfg
    │       │   │   │   │   ├── ti_dk-tm4c129.cfg
    │       │   │   │   │   ├── ti_ek-tm4c123gxl.cfg
    │       │   │   │   │   ├── ti_ek-tm4c1294xl.cfg
    │       │   │   │   │   ├── ti_j7200evm.cfg
    │       │   │   │   │   ├── ti_j721evm.cfg
    │       │   │   │   │   ├── ti_j721s2evm.cfg
    │       │   │   │   │   ├── ti_msp432_launchpad.cfg
    │       │   │   │   │   ├── ti_pandaboard.cfg
    │       │   │   │   │   ├── ti_pandaboard_es.cfg
    │       │   │   │   │   ├── ti_tmdx570ls20susb.cfg
    │       │   │   │   │   ├── ti_tmdx570ls31usb.cfg
    │       │   │   │   │   ├── tocoding_poplar.cfg
    │       │   │   │   │   ├── topas910.cfg
    │       │   │   │   │   ├── topasa900.cfg
    │       │   │   │   │   ├── tp-link_tl-mr3020.cfg
    │       │   │   │   │   ├── tp-link_wdr4300.cfg
    │       │   │   │   │   ├── twr-k60f120m.cfg
    │       │   │   │   │   ├── twr-k60n512.cfg
    │       │   │   │   │   ├── twr-vf65gs10.cfg
    │       │   │   │   │   ├── twr-vf65gs10_cmsisdap.cfg
    │       │   │   │   │   ├── tx25_stk5.cfg
    │       │   │   │   │   ├── tx27_stk5.cfg
    │       │   │   │   │   ├── unknown_at91sam9260.cfg
    │       │   │   │   │   ├── uptech_2410.cfg
    │       │   │   │   │   ├── vd_a53x2_jtag.cfg
    │       │   │   │   │   ├── vd_m4_jtag.cfg
    │       │   │   │   │   ├── vd_pulpissimo_jtag.cfg
    │       │   │   │   │   ├── vd_swerv_jtag.cfg
    │       │   │   │   │   ├── verdex.cfg
    │       │   │   │   │   ├── voipac.cfg
    │       │   │   │   │   ├── voltcraft_dso-3062c.cfg
    │       │   │   │   │   ├── x300t.cfg
    │       │   │   │   │   ├── xmc-2go.cfg
    │       │   │   │   │   ├── xmc1100-boot-kit.cfg
    │       │   │   │   │   ├── xmc4200-application-kit-actuator.cfg
    │       │   │   │   │   ├── xmc4300-relax.cfg
    │       │   │   │   │   ├── xmc4500-application-kit-general.cfg
    │       │   │   │   │   ├── xmc4500-application-kit-sdram.cfg
    │       │   │   │   │   ├── xmc4500-relax.cfg
    │       │   │   │   │   ├── xmc4700-relax.cfg
    │       │   │   │   │   ├── xmc4800-relax.cfg
    │       │   │   │   │   └── xmos_xk-xac-xa8_arm.cfg
    │       │   │   │   ├── chip/
    │       │   │   │   │   ├── atmel/
    │       │   │   │   │   │   └── at91/
    │       │   │   │   │   │       ├── aic.tcl
    │       │   │   │   │   │       ├── at91_pio.cfg
    │       │   │   │   │   │       ├── at91_pmc.cfg
    │       │   │   │   │   │       ├── at91_rstc.cfg
    │       │   │   │   │   │       ├── at91_wdt.cfg
    │       │   │   │   │   │       ├── at91sam7x128.tcl
    │       │   │   │   │   │       ├── at91sam7x256.tcl
    │       │   │   │   │   │       ├── at91sam9261.cfg
    │       │   │   │   │   │       ├── at91sam9261_matrix.cfg
    │       │   │   │   │   │       ├── at91sam9263.cfg
    │       │   │   │   │   │       ├── at91sam9263_matrix.cfg
    │       │   │   │   │   │       ├── at91sam9_init.cfg
    │       │   │   │   │   │       ├── at91sam9_sdramc.cfg
    │       │   │   │   │   │       ├── at91sam9_smc.cfg
    │       │   │   │   │   │       ├── hardware.cfg
    │       │   │   │   │   │       ├── pmc.tcl
    │       │   │   │   │   │       ├── rtt.tcl
    │       │   │   │   │   │       ├── sam9_smc.cfg
    │       │   │   │   │   │       └── usarts.tcl
    │       │   │   │   │   ├── st/
    │       │   │   │   │   │   ├── spear/
    │       │   │   │   │   │   │   ├── quirk_no_srst.tcl
    │       │   │   │   │   │   │   ├── spear3xx.tcl
    │       │   │   │   │   │   │   └── spear3xx_ddr.tcl
    │       │   │   │   │   │   └── stm32/
    │       │   │   │   │   │       ├── stm32.tcl
    │       │   │   │   │   │       ├── stm32_rcc.tcl
    │       │   │   │   │   │       └── stm32_regs.tcl
    │       │   │   │   │   └── ti/
    │       │   │   │   │       └── lm3s/
    │       │   │   │   │           ├── lm3s.tcl
    │       │   │   │   │           └── lm3s_regs.tcl
    │       │   │   │   ├── cpld/
    │       │   │   │   │   ├── altera-5m570z-cpld.cfg
    │       │   │   │   │   ├── altera-epm240.cfg
    │       │   │   │   │   ├── jtagspi.cfg
    │       │   │   │   │   ├── lattice-lc4032ze.cfg
    │       │   │   │   │   ├── xilinx-xc6s.cfg
    │       │   │   │   │   ├── xilinx-xc7.cfg
    │       │   │   │   │   ├── xilinx-xcf-p.cfg
    │       │   │   │   │   ├── xilinx-xcf-s.cfg
    │       │   │   │   │   ├── xilinx-xcr3256.cfg
    │       │   │   │   │   └── xilinx-xcu.cfg
    │       │   │   │   ├── cpu/
    │       │   │   │   │   ├── arc/
    │       │   │   │   │   │   ├── common.tcl
    │       │   │   │   │   │   ├── em.tcl
    │       │   │   │   │   │   ├── hs.tcl
    │       │   │   │   │   │   └── v2.tcl
    │       │   │   │   │   └── arm/
    │       │   │   │   │       ├── arm7tdmi.tcl
    │       │   │   │   │       ├── arm920.tcl
    │       │   │   │   │       ├── arm946.tcl
    │       │   │   │   │       ├── arm966.tcl
    │       │   │   │   │       └── cortex_m3.tcl
    │       │   │   │   ├── fpga/
    │       │   │   │   │   ├── altera-10m50.cfg
    │       │   │   │   │   ├── altera-ep3c10.cfg
    │       │   │   │   │   ├── altera-ep4ce10.cfg
    │       │   │   │   │   ├── lattice_ecp5.cfg
    │       │   │   │   │   ├── xilinx-dna.cfg
    │       │   │   │   │   └── xilinx-xadc.cfg
    │       │   │   │   ├── interface/
    │       │   │   │   │   ├── altera-usb-blaster.cfg
    │       │   │   │   │   ├── altera-usb-blaster2.cfg
    │       │   │   │   │   ├── arm-jtag-ew.cfg
    │       │   │   │   │   ├── at91rm9200.cfg
    │       │   │   │   │   ├── beaglebone-jtag-native.cfg
    │       │   │   │   │   ├── beaglebone-swd-native.cfg
    │       │   │   │   │   ├── buspirate.cfg
    │       │   │   │   │   ├── calao-usb-a9260.cfg
    │       │   │   │   │   ├── chameleon.cfg
    │       │   │   │   │   ├── cmsis-dap.cfg
    │       │   │   │   │   ├── dln-2-gpiod.cfg
    │       │   │   │   │   ├── dummy.cfg
    │       │   │   │   │   ├── estick.cfg
    │       │   │   │   │   ├── flashlink.cfg
    │       │   │   │   │   ├── ft232r/
    │       │   │   │   │   │   └── radiona_ulx3s.cfg
    │       │   │   │   │   ├── ft232r.cfg
    │       │   │   │   │   ├── ftdi/
    │       │   │   │   │   │   ├── 100ask-openjtag.cfg
    │       │   │   │   │   │   ├── ashling-opella-ld-jtag.cfg
    │       │   │   │   │   │   ├── ashling-opella-ld-swd.cfg
    │       │   │   │   │   │   ├── axm0432.cfg
    │       │   │   │   │   │   ├── c232hm.cfg
    │       │   │   │   │   │   ├── calao-usb-a9260-c01.cfg
    │       │   │   │   │   │   ├── calao-usb-a9260-c02.cfg
    │       │   │   │   │   │   ├── cortino.cfg
    │       │   │   │   │   │   ├── digilent-hs1.cfg
    │       │   │   │   │   │   ├── digilent-hs2.cfg
    │       │   │   │   │   │   ├── digilent_jtag_hs3.cfg
    │       │   │   │   │   │   ├── digilent_jtag_smt2.cfg
    │       │   │   │   │   │   ├── digilent_jtag_smt2_nc.cfg
    │       │   │   │   │   │   ├── dlp-usb1232h.cfg
    │       │   │   │   │   │   ├── dp_busblaster.cfg
    │       │   │   │   │   │   ├── dp_busblaster_kt-link.cfg
    │       │   │   │   │   │   ├── esp32s2_kaluga_v1.cfg
    │       │   │   │   │   │   ├── flossjtag-noeeprom.cfg
    │       │   │   │   │   │   ├── flossjtag.cfg
    │       │   │   │   │   │   ├── flyswatter.cfg
    │       │   │   │   │   │   ├── flyswatter2.cfg
    │       │   │   │   │   │   ├── ft232h-module-swd.cfg
    │       │   │   │   │   │   ├── gw16042.cfg
    │       │   │   │   │   │   ├── hie-jtag.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx10_etm.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx500_etm.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx500_re.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx50_etm.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx50_re.cfg
    │       │   │   │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   │   │   ├── icebear.cfg
    │       │   │   │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   │   │   ├── incircuit-icprog.cfg
    │       │   │   │   │   │   ├── iotlab-usb.cfg
    │       │   │   │   │   │   ├── isodebug.cfg
    │       │   │   │   │   │   ├── jtag-lock-pick_tiny_2.cfg
    │       │   │   │   │   │   ├── jtagkey.cfg
    │       │   │   │   │   │   ├── jtagkey2.cfg
    │       │   │   │   │   │   ├── jtagkey2p.cfg
    │       │   │   │   │   │   ├── kt-link.cfg
    │       │   │   │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   │   │   ├── lisa-l.cfg
    │       │   │   │   │   │   ├── luminary-icdi.cfg
    │       │   │   │   │   │   ├── luminary-lm3s811.cfg
    │       │   │   │   │   │   ├── luminary.cfg
    │       │   │   │   │   │   ├── m53evk.cfg
    │       │   │   │   │   │   ├── mbftdi.cfg
    │       │   │   │   │   │   ├── minimodule-swd.cfg
    │       │   │   │   │   │   ├── minimodule.cfg
    │       │   │   │   │   │   ├── minispartan6.cfg
    │       │   │   │   │   │   ├── miniwiggler.cfg
    │       │   │   │   │   │   ├── neodb.cfg
    │       │   │   │   │   │   ├── ngxtech.cfg
    │       │   │   │   │   │   ├── olimex-arm-jtag-swd.cfg
    │       │   │   │   │   │   ├── olimex-arm-usb-ocd-h.cfg
    │       │   │   │   │   │   ├── olimex-arm-usb-ocd.cfg
    │       │   │   │   │   │   ├── olimex-arm-usb-tiny-h.cfg
    │       │   │   │   │   │   ├── olimex-jtag-tiny.cfg
    │       │   │   │   │   │   ├── oocdlink.cfg
    │       │   │   │   │   │   ├── opendous_ftdi.cfg
    │       │   │   │   │   │   ├── openocd-usb-hs.cfg
    │       │   │   │   │   │   ├── openocd-usb.cfg
    │       │   │   │   │   │   ├── openrd.cfg
    │       │   │   │   │   │   ├── pipistrello.cfg
    │       │   │   │   │   │   ├── pls_spc5.cfg
    │       │   │   │   │   │   ├── redbee-econotag.cfg
    │       │   │   │   │   │   ├── redbee-usb.cfg
    │       │   │   │   │   │   ├── rowley-cc-arm-swd.cfg
    │       │   │   │   │   │   ├── sheevaplug.cfg
    │       │   │   │   │   │   ├── signalyzer-lite.cfg
    │       │   │   │   │   │   ├── signalyzer.cfg
    │       │   │   │   │   │   ├── snps_sdp.cfg
    │       │   │   │   │   │   ├── steppenprobe.cfg
    │       │   │   │   │   │   ├── stm32-stick.cfg
    │       │   │   │   │   │   ├── swd-resistor-hack.cfg
    │       │   │   │   │   │   ├── ti-icdi.cfg
    │       │   │   │   │   │   ├── tigard.cfg
    │       │   │   │   │   │   ├── tumpa-lite.cfg
    │       │   │   │   │   │   ├── tumpa.cfg
    │       │   │   │   │   │   ├── turtelizer2-revB.cfg
    │       │   │   │   │   │   ├── turtelizer2-revC.cfg
    │       │   │   │   │   │   ├── um232h.cfg
    │       │   │   │   │   │   ├── vpaclink.cfg
    │       │   │   │   │   │   ├── xds100v2.cfg
    │       │   │   │   │   │   └── xds100v3.cfg
    │       │   │   │   │   ├── imx-native.cfg
    │       │   │   │   │   ├── jlink.cfg
    │       │   │   │   │   ├── jtag_dpi.cfg
    │       │   │   │   │   ├── jtag_hat_rpi2.cfg
    │       │   │   │   │   ├── jtag_vpi.cfg
    │       │   │   │   │   ├── kitprog.cfg
    │       │   │   │   │   ├── nds32-aice.cfg
    │       │   │   │   │   ├── nulink.cfg
    │       │   │   │   │   ├── opendous.cfg
    │       │   │   │   │   ├── openjtag.cfg
    │       │   │   │   │   ├── osbdm.cfg
    │       │   │   │   │   ├── parport.cfg
    │       │   │   │   │   ├── parport_dlc5.cfg
    │       │   │   │   │   ├── raspberrypi-native.cfg
    │       │   │   │   │   ├── raspberrypi2-native.cfg
    │       │   │   │   │   ├── rlink.cfg
    │       │   │   │   │   ├── rshim.cfg
    │       │   │   │   │   ├── stlink-dap.cfg
    │       │   │   │   │   ├── stlink-v1.cfg
    │       │   │   │   │   ├── stlink-v2-1.cfg
    │       │   │   │   │   ├── stlink-v2.cfg
    │       │   │   │   │   ├── stlink.cfg
    │       │   │   │   │   ├── sysfsgpio-raspberrypi.cfg
    │       │   │   │   │   ├── ti-icdi.cfg
    │       │   │   │   │   ├── ulink.cfg
    │       │   │   │   │   ├── usb-jtag.cfg
    │       │   │   │   │   ├── usbprog.cfg
    │       │   │   │   │   ├── vdebug.cfg
    │       │   │   │   │   ├── vsllink.cfg
    │       │   │   │   │   └── xds110.cfg
    │       │   │   │   ├── mem_helper.tcl
    │       │   │   │   ├── memory.tcl
    │       │   │   │   ├── mmr_helpers.tcl
    │       │   │   │   ├── target/
    │       │   │   │   │   ├── 1986ве1т.cfg
    │       │   │   │   │   ├── adsp-sc58x.cfg
    │       │   │   │   │   ├── aduc702x.cfg
    │       │   │   │   │   ├── aducm360.cfg
    │       │   │   │   │   ├── allwinner_v3s.cfg
    │       │   │   │   │   ├── alphascale_asm9260t.cfg
    │       │   │   │   │   ├── altera_fpgasoc.cfg
    │       │   │   │   │   ├── altera_fpgasoc_arria10.cfg
    │       │   │   │   │   ├── am335x.cfg
    │       │   │   │   │   ├── am437x.cfg
    │       │   │   │   │   ├── amdm37x.cfg
    │       │   │   │   │   ├── ampere_emag.cfg
    │       │   │   │   │   ├── ar71xx.cfg
    │       │   │   │   │   ├── arm_corelink_sse200.cfg
    │       │   │   │   │   ├── armada370.cfg
    │       │   │   │   │   ├── at32ap7000.cfg
    │       │   │   │   │   ├── at91r40008.cfg
    │       │   │   │   │   ├── at91rm9200.cfg
    │       │   │   │   │   ├── at91sam3XXX.cfg
    │       │   │   │   │   ├── at91sam3ax_4x.cfg
    │       │   │   │   │   ├── at91sam3ax_8x.cfg
    │       │   │   │   │   ├── at91sam3ax_xx.cfg
    │       │   │   │   │   ├── at91sam3nXX.cfg
    │       │   │   │   │   ├── at91sam3sXX.cfg
    │       │   │   │   │   ├── at91sam3u1c.cfg
    │       │   │   │   │   ├── at91sam3u1e.cfg
    │       │   │   │   │   ├── at91sam3u2c.cfg
    │       │   │   │   │   ├── at91sam3u2e.cfg
    │       │   │   │   │   ├── at91sam3u4c.cfg
    │       │   │   │   │   ├── at91sam3u4e.cfg
    │       │   │   │   │   ├── at91sam3uxx.cfg
    │       │   │   │   │   ├── at91sam4XXX.cfg
    │       │   │   │   │   ├── at91sam4c32x.cfg
    │       │   │   │   │   ├── at91sam4cXXX.cfg
    │       │   │   │   │   ├── at91sam4lXX.cfg
    │       │   │   │   │   ├── at91sam4sXX.cfg
    │       │   │   │   │   ├── at91sam4sd32x.cfg
    │       │   │   │   │   ├── at91sam7a2.cfg
    │       │   │   │   │   ├── at91sam7se512.cfg
    │       │   │   │   │   ├── at91sam7sx.cfg
    │       │   │   │   │   ├── at91sam7x256.cfg
    │       │   │   │   │   ├── at91sam7x512.cfg
    │       │   │   │   │   ├── at91sam9.cfg
    │       │   │   │   │   ├── at91sam9260.cfg
    │       │   │   │   │   ├── at91sam9260_ext_RAM_ext_flash.cfg
    │       │   │   │   │   ├── at91sam9261.cfg
    │       │   │   │   │   ├── at91sam9263.cfg
    │       │   │   │   │   ├── at91sam9g10.cfg
    │       │   │   │   │   ├── at91sam9g20.cfg
    │       │   │   │   │   ├── at91sam9g45.cfg
    │       │   │   │   │   ├── at91sam9rl.cfg
    │       │   │   │   │   ├── at91sama5d2.cfg
    │       │   │   │   │   ├── at91samdXX.cfg
    │       │   │   │   │   ├── at91samg5x.cfg
    │       │   │   │   │   ├── atheros_ar2313.cfg
    │       │   │   │   │   ├── atheros_ar2315.cfg
    │       │   │   │   │   ├── atheros_ar9331.cfg
    │       │   │   │   │   ├── atheros_ar9344.cfg
    │       │   │   │   │   ├── atmega128.cfg
    │       │   │   │   │   ├── atmega128rfa1.cfg
    │       │   │   │   │   ├── atsame5x.cfg
    │       │   │   │   │   ├── atsaml1x.cfg
    │       │   │   │   │   ├── atsamv.cfg
    │       │   │   │   │   ├── avr32.cfg
    │       │   │   │   │   ├── bcm2711.cfg
    │       │   │   │   │   ├── bcm281xx.cfg
    │       │   │   │   │   ├── bcm2835.cfg
    │       │   │   │   │   ├── bcm2836.cfg
    │       │   │   │   │   ├── bcm2837.cfg
    │       │   │   │   │   ├── bcm4706.cfg
    │       │   │   │   │   ├── bcm4718.cfg
    │       │   │   │   │   ├── bcm47xx.cfg
    │       │   │   │   │   ├── bcm5352e.cfg
    │       │   │   │   │   ├── bcm6348.cfg
    │       │   │   │   │   ├── bluefield.cfg
    │       │   │   │   │   ├── bluenrg-x.cfg
    │       │   │   │   │   ├── c100.cfg
    │       │   │   │   │   ├── c100config.tcl
    │       │   │   │   │   ├── c100helper.tcl
    │       │   │   │   │   ├── c100regs.tcl
    │       │   │   │   │   ├── cc2538.cfg
    │       │   │   │   │   ├── cs351x.cfg
    │       │   │   │   │   ├── davinci.cfg
    │       │   │   │   │   ├── dragonite.cfg
    │       │   │   │   │   ├── dsp56321.cfg
    │       │   │   │   │   ├── dsp568013.cfg
    │       │   │   │   │   ├── dsp568037.cfg
    │       │   │   │   │   ├── efm32.cfg
    │       │   │   │   │   ├── em357.cfg
    │       │   │   │   │   ├── em358.cfg
    │       │   │   │   │   ├── eos_s3.cfg
    │       │   │   │   │   ├── epc9301.cfg
    │       │   │   │   │   ├── esi32xx.cfg
    │       │   │   │   │   ├── esp32s2.cfg
    │       │   │   │   │   ├── exynos5250.cfg
    │       │   │   │   │   ├── faux.cfg
    │       │   │   │   │   ├── feroceon.cfg
    │       │   │   │   │   ├── fm3.cfg
    │       │   │   │   │   ├── fm4.cfg
    │       │   │   │   │   ├── fm4_mb9bf.cfg
    │       │   │   │   │   ├── fm4_s6e2cc.cfg
    │       │   │   │   │   ├── gd32e23x.cfg
    │       │   │   │   │   ├── gd32vf103.cfg
    │       │   │   │   │   ├── gp326xxxa.cfg
    │       │   │   │   │   ├── hi3798.cfg
    │       │   │   │   │   ├── hi6220.cfg
    │       │   │   │   │   ├── hilscher_netx10.cfg
    │       │   │   │   │   ├── hilscher_netx50.cfg
    │       │   │   │   │   ├── hilscher_netx500.cfg
    │       │   │   │   │   ├── icepick.cfg
    │       │   │   │   │   ├── imx.cfg
    │       │   │   │   │   ├── imx21.cfg
    │       │   │   │   │   ├── imx25.cfg
    │       │   │   │   │   ├── imx27.cfg
    │       │   │   │   │   ├── imx28.cfg
    │       │   │   │   │   ├── imx31.cfg
    │       │   │   │   │   ├── imx35.cfg
    │       │   │   │   │   ├── imx51.cfg
    │       │   │   │   │   ├── imx53.cfg
    │       │   │   │   │   ├── imx6.cfg
    │       │   │   │   │   ├── imx6sx.cfg
    │       │   │   │   │   ├── imx6ul.cfg
    │       │   │   │   │   ├── imx7.cfg
    │       │   │   │   │   ├── imx7ulp.cfg
    │       │   │   │   │   ├── imx8m.cfg
    │       │   │   │   │   ├── imx8qm.cfg
    │       │   │   │   │   ├── infineon/
    │       │   │   │   │   │   └── tle987x.cfg
    │       │   │   │   │   ├── is5114.cfg
    │       │   │   │   │   ├── ixp42x.cfg
    │       │   │   │   │   ├── k1921vk01t.cfg
    │       │   │   │   │   ├── k40.cfg
    │       │   │   │   │   ├── k60.cfg
    │       │   │   │   │   ├── ke0x.cfg
    │       │   │   │   │   ├── ke1xf.cfg
    │       │   │   │   │   ├── ke1xz.cfg
    │       │   │   │   │   ├── kl25.cfg
    │       │   │   │   │   ├── kl46.cfg
    │       │   │   │   │   ├── klx.cfg
    │       │   │   │   │   ├── ks869x.cfg
    │       │   │   │   │   ├── kx.cfg
    │       │   │   │   │   ├── lpc11xx.cfg
    │       │   │   │   │   ├── lpc12xx.cfg
    │       │   │   │   │   ├── lpc13xx.cfg
    │       │   │   │   │   ├── lpc17xx.cfg
    │       │   │   │   │   ├── lpc1850.cfg
    │       │   │   │   │   ├── lpc1xxx.cfg
    │       │   │   │   │   ├── lpc2103.cfg
    │       │   │   │   │   ├── lpc2124.cfg
    │       │   │   │   │   ├── lpc2129.cfg
    │       │   │   │   │   ├── lpc2148.cfg
    │       │   │   │   │   ├── lpc2294.cfg
    │       │   │   │   │   ├── lpc2378.cfg
    │       │   │   │   │   ├── lpc2460.cfg
    │       │   │   │   │   ├── lpc2478.cfg
    │       │   │   │   │   ├── lpc2900.cfg
    │       │   │   │   │   ├── lpc2xxx.cfg
    │       │   │   │   │   ├── lpc3131.cfg
    │       │   │   │   │   ├── lpc3250.cfg
    │       │   │   │   │   ├── lpc40xx.cfg
    │       │   │   │   │   ├── lpc4350.cfg
    │       │   │   │   │   ├── lpc4357.cfg
    │       │   │   │   │   ├── lpc4370.cfg
    │       │   │   │   │   ├── lpc84x.cfg
    │       │   │   │   │   ├── lpc8nxx.cfg
    │       │   │   │   │   ├── lpc8xx.cfg
    │       │   │   │   │   ├── ls1012a.cfg
    │       │   │   │   │   ├── ls1028a.cfg
    │       │   │   │   │   ├── ls1046a.cfg
    │       │   │   │   │   ├── ls1088a.cfg
    │       │   │   │   │   ├── lsch3_common.cfg
    │       │   │   │   │   ├── marvell/
    │       │   │   │   │   │   ├── 88f3710.cfg
    │       │   │   │   │   │   ├── 88f3720.cfg
    │       │   │   │   │   │   └── 88f37x0.cfg
    │       │   │   │   │   ├── max32620.cfg
    │       │   │   │   │   ├── max32625.cfg
    │       │   │   │   │   ├── max3263x.cfg
    │       │   │   │   │   ├── mc13224v.cfg
    │       │   │   │   │   ├── mdr32f9q2i.cfg
    │       │   │   │   │   ├── nds32v2.cfg
    │       │   │   │   │   ├── nds32v3.cfg
    │       │   │   │   │   ├── nds32v3m.cfg
    │       │   │   │   │   ├── nds32v5.cfg
    │       │   │   │   │   ├── nhs31xx.cfg
    │       │   │   │   │   ├── npcx.cfg
    │       │   │   │   │   ├── nrf51.cfg
    │       │   │   │   │   ├── nrf52.cfg
    │       │   │   │   │   ├── nuc910.cfg
    │       │   │   │   │   ├── numicro.cfg
    │       │   │   │   │   ├── omap2420.cfg
    │       │   │   │   │   ├── omap3530.cfg
    │       │   │   │   │   ├── omap4430.cfg
    │       │   │   │   │   ├── omap4460.cfg
    │       │   │   │   │   ├── omap5912.cfg
    │       │   │   │   │   ├── omapl138.cfg
    │       │   │   │   │   ├── or1k.cfg
    │       │   │   │   │   ├── pic32mx.cfg
    │       │   │   │   │   ├── psoc4.cfg
    │       │   │   │   │   ├── psoc5lp.cfg
    │       │   │   │   │   ├── psoc6.cfg
    │       │   │   │   │   ├── pxa255.cfg
    │       │   │   │   │   ├── pxa270.cfg
    │       │   │   │   │   ├── pxa3xx.cfg
    │       │   │   │   │   ├── qualcomm_qca4531.cfg
    │       │   │   │   │   ├── quark_d20xx.cfg
    │       │   │   │   │   ├── quark_x10xx.cfg
    │       │   │   │   │   ├── readme.txt
    │       │   │   │   │   ├── renesas_r7s72100.cfg
    │       │   │   │   │   ├── renesas_rcar_gen2.cfg
    │       │   │   │   │   ├── renesas_rcar_gen3.cfg
    │       │   │   │   │   ├── renesas_rcar_reset_common.cfg
    │       │   │   │   │   ├── renesas_rz_five.cfg
    │       │   │   │   │   ├── renesas_rz_g2.cfg
    │       │   │   │   │   ├── renesas_s7g2.cfg
    │       │   │   │   │   ├── rk3308.cfg
    │       │   │   │   │   ├── rk3399.cfg
    │       │   │   │   │   ├── rp2040-core0.cfg
    │       │   │   │   │   ├── samsung_s3c2410.cfg
    │       │   │   │   │   ├── samsung_s3c2440.cfg
    │       │   │   │   │   ├── samsung_s3c2450.cfg
    │       │   │   │   │   ├── samsung_s3c4510.cfg
    │       │   │   │   │   ├── samsung_s3c6410.cfg
    │       │   │   │   │   ├── sharp_lh79532.cfg
    │       │   │   │   │   ├── sim3x.cfg
    │       │   │   │   │   ├── smp8634.cfg
    │       │   │   │   │   ├── snps_em_sk_fpga.cfg
    │       │   │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   │   ├── spear3xx.cfg
    │       │   │   │   │   ├── stellaris.cfg
    │       │   │   │   │   ├── stm32f0x.cfg
    │       │   │   │   │   ├── stm32f1x.cfg
    │       │   │   │   │   ├── stm32f2x.cfg
    │       │   │   │   │   ├── stm32f3x.cfg
    │       │   │   │   │   ├── stm32f4x.cfg
    │       │   │   │   │   ├── stm32f7x.cfg
    │       │   │   │   │   ├── stm32g0x.cfg
    │       │   │   │   │   ├── stm32g4x.cfg
    │       │   │   │   │   ├── stm32h7x.cfg
    │       │   │   │   │   ├── stm32h7x_dual_bank.cfg
    │       │   │   │   │   ├── stm32l0.cfg
    │       │   │   │   │   ├── stm32l0_dual_bank.cfg
    │       │   │   │   │   ├── stm32l1.cfg
    │       │   │   │   │   ├── stm32l1x_dual_bank.cfg
    │       │   │   │   │   ├── stm32l4x.cfg
    │       │   │   │   │   ├── stm32l5x.cfg
    │       │   │   │   │   ├── stm32mp13x.cfg
    │       │   │   │   │   ├── stm32mp15x.cfg
    │       │   │   │   │   ├── stm32u5x.cfg
    │       │   │   │   │   ├── stm32w108xx.cfg
    │       │   │   │   │   ├── stm32wbx.cfg
    │       │   │   │   │   ├── stm32wlx.cfg
    │       │   │   │   │   ├── stm32x5x_common.cfg
    │       │   │   │   │   ├── stm32xl.cfg
    │       │   │   │   │   ├── stm8l.cfg
    │       │   │   │   │   ├── stm8l152.cfg
    │       │   │   │   │   ├── stm8s.cfg
    │       │   │   │   │   ├── stm8s003.cfg
    │       │   │   │   │   ├── stm8s103.cfg
    │       │   │   │   │   ├── stm8s105.cfg
    │       │   │   │   │   ├── str710.cfg
    │       │   │   │   │   ├── str730.cfg
    │       │   │   │   │   ├── str750.cfg
    │       │   │   │   │   ├── str912.cfg
    │       │   │   │   │   ├── swj-dp.tcl
    │       │   │   │   │   ├── swm050.cfg
    │       │   │   │   │   ├── test_reset_syntax_error.cfg
    │       │   │   │   │   ├── test_syntax_error.cfg
    │       │   │   │   │   ├── ti-ar7.cfg
    │       │   │   │   │   ├── ti-cjtag.cfg
    │       │   │   │   │   ├── ti_calypso.cfg
    │       │   │   │   │   ├── ti_cc13x0.cfg
    │       │   │   │   │   ├── ti_cc13x2.cfg
    │       │   │   │   │   ├── ti_cc26x0.cfg
    │       │   │   │   │   ├── ti_cc26x2.cfg
    │       │   │   │   │   ├── ti_cc3220sf.cfg
    │       │   │   │   │   ├── ti_cc32xx.cfg
    │       │   │   │   │   ├── ti_dm355.cfg
    │       │   │   │   │   ├── ti_dm365.cfg
    │       │   │   │   │   ├── ti_dm6446.cfg
    │       │   │   │   │   ├── ti_k3.cfg
    │       │   │   │   │   ├── ti_msp432.cfg
    │       │   │   │   │   ├── ti_rm4x.cfg
    │       │   │   │   │   ├── ti_tms570.cfg
    │       │   │   │   │   ├── ti_tms570ls20xxx.cfg
    │       │   │   │   │   ├── ti_tms570ls3137.cfg
    │       │   │   │   │   ├── tmpa900.cfg
    │       │   │   │   │   ├── tmpa910.cfg
    │       │   │   │   │   ├── tnetc4401.cfg
    │       │   │   │   │   ├── u8500.cfg
    │       │   │   │   │   ├── vd_aarch64.cfg
    │       │   │   │   │   ├── vd_cortex_m.cfg
    │       │   │   │   │   ├── vd_riscv.cfg
    │       │   │   │   │   ├── vybrid_vf6xx.cfg
    │       │   │   │   │   ├── xilinx_zynqmp.cfg
    │       │   │   │   │   ├── xmc1xxx.cfg
    │       │   │   │   │   ├── xmc4xxx.cfg
    │       │   │   │   │   ├── xmos_xs1-xau8a-10_arm.cfg
    │       │   │   │   │   ├── zynq_7000.cfg
    │       │   │   │   │   └── к1879xб1я.cfg
    │       │   │   │   ├── test/
    │       │   │   │   │   ├── selftest.cfg
    │       │   │   │   │   └── syntax1.cfg
    │       │   │   │   └── tools/
    │       │   │   │       ├── firmware-recovery.tcl
    │       │   │   │       ├── memtest.tcl
    │       │   │   │       └── test_cpu_speed.tcl
    │       │   │   └── share/
    │       │   │       ├── info/
    │       │   │       │   ├── dir
    │       │   │       │   ├── openocd.info
    │       │   │       │   ├── openocd.info-1
    │       │   │       │   └── openocd.info-2
    │       │   │       ├── man/
    │       │   │       │   └── man1/
    │       │   │       │       └── openocd.1
    │       │   │       └── openocd/
    │       │   │           ├── contrib/
    │       │   │           │   ├── 60-openocd.rules
    │       │   │           │   └── libdcc/
    │       │   │           │       ├── README
    │       │   │           │       ├── dcc_stdio.c
    │       │   │           │       ├── dcc_stdio.h
    │       │   │           │       └── example.c
    │       │   │           └── scripts/
    │       │   │               ├── bitsbytes.tcl
    │       │   │               ├── board/
    │       │   │               │   ├── 8devices-lima.cfg
    │       │   │               │   ├── actux3.cfg
    │       │   │               │   ├── adapteva_parallella1.cfg
    │       │   │               │   ├── adsp-sc584-ezbrd.cfg
    │       │   │               │   ├── alphascale_asm9260_ek.cfg
    │       │   │               │   ├── altera_sockit.cfg
    │       │   │               │   ├── am3517evm.cfg
    │       │   │               │   ├── ampere_emag8180.cfg
    │       │   │               │   ├── arm_evaluator7t.cfg
    │       │   │               │   ├── arm_musca_a.cfg
    │       │   │               │   ├── arty_s7.cfg
    │       │   │               │   ├── asus-rt-n16.cfg
    │       │   │               │   ├── asus-rt-n66u.cfg
    │       │   │               │   ├── at91cap7a-stk-sdram.cfg
    │       │   │               │   ├── at91eb40a.cfg
    │       │   │               │   ├── at91rm9200-dk.cfg
    │       │   │               │   ├── at91rm9200-ek.cfg
    │       │   │               │   ├── at91sam9261-ek.cfg
    │       │   │               │   ├── at91sam9263-ek.cfg
    │       │   │               │   ├── at91sam9g20-ek.cfg
    │       │   │               │   ├── atmel_at91sam7s-ek.cfg
    │       │   │               │   ├── atmel_at91sam9260-ek.cfg
    │       │   │               │   ├── atmel_at91sam9rl-ek.cfg
    │       │   │               │   ├── atmel_sam3n_ek.cfg
    │       │   │               │   ├── atmel_sam3s_ek.cfg
    │       │   │               │   ├── atmel_sam3u_ek.cfg
    │       │   │               │   ├── atmel_sam3x_ek.cfg
    │       │   │               │   ├── atmel_sam4e_ek.cfg
    │       │   │               │   ├── atmel_sam4l8_xplained_pro.cfg
    │       │   │               │   ├── atmel_sam4s_ek.cfg
    │       │   │               │   ├── atmel_sam4s_xplained_pro.cfg
    │       │   │               │   ├── atmel_samc20_xplained_pro.cfg
    │       │   │               │   ├── atmel_samc21_xplained_pro.cfg
    │       │   │               │   ├── atmel_samd10_xplained_mini.cfg
    │       │   │               │   ├── atmel_samd11_xplained_pro.cfg
    │       │   │               │   ├── atmel_samd20_xplained_pro.cfg
    │       │   │               │   ├── atmel_samd21_xplained_pro.cfg
    │       │   │               │   ├── atmel_same70_xplained.cfg
    │       │   │               │   ├── atmel_samg53_xplained_pro.cfg
    │       │   │               │   ├── atmel_samg55_xplained_pro.cfg
    │       │   │               │   ├── atmel_saml21_xplained_pro.cfg
    │       │   │               │   ├── atmel_samr21_xplained_pro.cfg
    │       │   │               │   ├── atmel_samv71_xplained_ultra.cfg
    │       │   │               │   ├── avnet_ultrazed-eg.cfg
    │       │   │               │   ├── balloon3-cpu.cfg
    │       │   │               │   ├── bcm28155_ap.cfg
    │       │   │               │   ├── bluefield.cfg
    │       │   │               │   ├── bt-homehubv1.cfg
    │       │   │               │   ├── colibri.cfg
    │       │   │               │   ├── crossbow_tech_imote2.cfg
    │       │   │               │   ├── csb337.cfg
    │       │   │               │   ├── csb732.cfg
    │       │   │               │   ├── da850evm.cfg
    │       │   │               │   ├── digi_connectcore_wi-9c.cfg
    │       │   │               │   ├── digilent_analog_discovery.cfg
    │       │   │               │   ├── digilent_atlys.cfg
    │       │   │               │   ├── digilent_nexys_video.cfg
    │       │   │               │   ├── digilent_zedboard.cfg
    │       │   │               │   ├── diolan_lpc4350-db1.cfg
    │       │   │               │   ├── diolan_lpc4357-db1.cfg
    │       │   │               │   ├── dk-tm4c129.cfg
    │       │   │               │   ├── dm355evm.cfg
    │       │   │               │   ├── dm365evm.cfg
    │       │   │               │   ├── dm6446evm.cfg
    │       │   │               │   ├── dp_busblaster_v3.cfg
    │       │   │               │   ├── dp_busblaster_v4.cfg
    │       │   │               │   ├── dptechnics_dpt-board-v1.cfg
    │       │   │               │   ├── efikamx.cfg
    │       │   │               │   ├── efm32.cfg
    │       │   │               │   ├── eir.cfg
    │       │   │               │   ├── ek-lm3s1968.cfg
    │       │   │               │   ├── ek-lm3s3748.cfg
    │       │   │               │   ├── ek-lm3s6965.cfg
    │       │   │               │   ├── ek-lm3s811-revb.cfg
    │       │   │               │   ├── ek-lm3s811.cfg
    │       │   │               │   ├── ek-lm3s8962.cfg
    │       │   │               │   ├── ek-lm3s9b9x.cfg
    │       │   │               │   ├── ek-lm3s9d92.cfg
    │       │   │               │   ├── ek-lm4f120xl.cfg
    │       │   │               │   ├── ek-lm4f232.cfg
    │       │   │               │   ├── ek-tm4c123gxl.cfg
    │       │   │               │   ├── ek-tm4c1294xl.cfg
    │       │   │               │   ├── embedded-artists_lpc2478-32.cfg
    │       │   │               │   ├── emcraft_imx8m-som-bsb.cfg
    │       │   │               │   ├── emcraft_twr-vf6-som-bsb.cfg
    │       │   │               │   ├── emcraft_vf6-som.cfg
    │       │   │               │   ├── esp32s2-kaluga-1.cfg
    │       │   │               │   ├── ethernut3.cfg
    │       │   │               │   ├── evb-lan9255.cfg
    │       │   │               │   ├── frdm-kl25z.cfg
    │       │   │               │   ├── frdm-kl46z.cfg
    │       │   │               │   ├── fsl_imx6q_sabresd.cfg
    │       │   │               │   ├── glyn_tonga2.cfg
    │       │   │               │   ├── gti/
    │       │   │               │   │   └── espressobin.cfg
    │       │   │               │   ├── gumstix-aerocore.cfg
    │       │   │               │   ├── hammer.cfg
    │       │   │               │   ├── hilscher_nxdb500sys.cfg
    │       │   │               │   ├── hilscher_nxeb500hmi.cfg
    │       │   │               │   ├── hilscher_nxhx10.cfg
    │       │   │               │   ├── hilscher_nxhx50.cfg
    │       │   │               │   ├── hilscher_nxhx500.cfg
    │       │   │               │   ├── hilscher_nxsb100.cfg
    │       │   │               │   ├── hitex_lpc1768stick.cfg
    │       │   │               │   ├── hitex_lpc2929.cfg
    │       │   │               │   ├── hitex_stm32-performancestick.cfg
    │       │   │               │   ├── hitex_str9-comstick.cfg
    │       │   │               │   ├── iar_lpc1768.cfg
    │       │   │               │   ├── iar_str912_sk.cfg
    │       │   │               │   ├── icnova_imx53_sodimm.cfg
    │       │   │               │   ├── icnova_sam9g45_sodimm.cfg
    │       │   │               │   ├── imx27ads.cfg
    │       │   │               │   ├── imx27lnst.cfg
    │       │   │               │   ├── imx28evk.cfg
    │       │   │               │   ├── imx31pdk.cfg
    │       │   │               │   ├── imx35pdk.cfg
    │       │   │               │   ├── imx53-m53evk.cfg
    │       │   │               │   ├── imx53loco.cfg
    │       │   │               │   ├── imx8mp-evk.cfg
    │       │   │               │   ├── insignal_arndale.cfg
    │       │   │               │   ├── kasli.cfg
    │       │   │               │   ├── kc100.cfg
    │       │   │               │   ├── kc705.cfg
    │       │   │               │   ├── kcu105.cfg
    │       │   │               │   ├── keil_mcb1700.cfg
    │       │   │               │   ├── keil_mcb2140.cfg
    │       │   │               │   ├── kindle2.cfg
    │       │   │               │   ├── kontron_sl28.cfg
    │       │   │               │   ├── kwikstik.cfg
    │       │   │               │   ├── la_fonera-fon2200.cfg
    │       │   │               │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │               │   ├── lemaker_hikey.cfg
    │       │   │               │   ├── linksys-wag200g.cfg
    │       │   │               │   ├── linksys-wrt54gl.cfg
    │       │   │               │   ├── linksys_nslu2.cfg
    │       │   │               │   ├── lisa-l.cfg
    │       │   │               │   ├── logicpd_imx27.cfg
    │       │   │               │   ├── lpc1850_spifi_generic.cfg
    │       │   │               │   ├── lpc4350_spifi_generic.cfg
    │       │   │               │   ├── lubbock.cfg
    │       │   │               │   ├── marsohod.cfg
    │       │   │               │   ├── marsohod2.cfg
    │       │   │               │   ├── marsohod3.cfg
    │       │   │               │   ├── mbed-lpc11u24.cfg
    │       │   │               │   ├── mbed-lpc1768.cfg
    │       │   │               │   ├── mcb1700.cfg
    │       │   │               │   ├── microchip_explorer16.cfg
    │       │   │               │   ├── microchip_sama5d27_som1_kit1.cfg
    │       │   │               │   ├── microchip_same51_curiosity_nano.cfg
    │       │   │               │   ├── microchip_same54_xplained_pro.cfg
    │       │   │               │   ├── microchip_saml11_xplained_pro.cfg
    │       │   │               │   ├── mini2440.cfg
    │       │   │               │   ├── mini6410.cfg
    │       │   │               │   ├── minispartan6.cfg
    │       │   │               │   ├── nds32_corvettef1.cfg
    │       │   │               │   ├── nds32_xc5.cfg
    │       │   │               │   ├── nds32_xc7.cfg
    │       │   │               │   ├── netgear-dg834v3.cfg
    │       │   │               │   ├── netgear-wg102.cfg
    │       │   │               │   ├── nordic_nrf51822_mkit.cfg
    │       │   │               │   ├── nordic_nrf51_dk.cfg
    │       │   │               │   ├── nordic_nrf52_dk.cfg
    │       │   │               │   ├── nordic_nrf52_ftx232.cfg
    │       │   │               │   ├── novena-internal-fpga.cfg
    │       │   │               │   ├── npcx_evb.cfg
    │       │   │               │   ├── numato_mimas_a7.cfg
    │       │   │               │   ├── numato_opsis.cfg
    │       │   │               │   ├── nxp_frdm-k64f.cfg
    │       │   │               │   ├── nxp_frdm-ls1012a.cfg
    │       │   │               │   ├── nxp_imx7sabre.cfg
    │       │   │               │   ├── nxp_lpc-link2.cfg
    │       │   │               │   ├── nxp_mcimx8m-evk.cfg
    │       │   │               │   ├── nxp_rdb-ls1046a.cfg
    │       │   │               │   ├── nxp_rdb-ls1088a.cfg
    │       │   │               │   ├── olimex_LPC2378STK.cfg
    │       │   │               │   ├── olimex_lpc_h2148.cfg
    │       │   │               │   ├── olimex_sam7_ex256.cfg
    │       │   │               │   ├── olimex_sam7_la2.cfg
    │       │   │               │   ├── olimex_sam9_l9260.cfg
    │       │   │               │   ├── olimex_stm32_h103.cfg
    │       │   │               │   ├── olimex_stm32_h107.cfg
    │       │   │               │   ├── olimex_stm32_h405.cfg
    │       │   │               │   ├── olimex_stm32_p107.cfg
    │       │   │               │   ├── omap2420_h4.cfg
    │       │   │               │   ├── openrd.cfg
    │       │   │               │   ├── or1k_generic.cfg
    │       │   │               │   ├── osk5912.cfg
    │       │   │               │   ├── phone_se_j100i.cfg
    │       │   │               │   ├── phytec_lpc3250.cfg
    │       │   │               │   ├── pic-p32mx.cfg
    │       │   │               │   ├── pico-debug.cfg
    │       │   │               │   ├── pipistrello.cfg
    │       │   │               │   ├── propox_mmnet1001.cfg
    │       │   │               │   ├── pxa255_sst.cfg
    │       │   │               │   ├── quark_d2000_refboard.cfg
    │       │   │               │   ├── quark_x10xx_board.cfg
    │       │   │               │   ├── quicklogic_quickfeather.cfg
    │       │   │               │   ├── radiona_ulx3s.cfg
    │       │   │               │   ├── redbee.cfg
    │       │   │               │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │       │   │               │   ├── renesas_dk-s7g2.cfg
    │       │   │               │   ├── renesas_falcon.cfg
    │       │   │               │   ├── renesas_gr_peach.cfg
    │       │   │               │   ├── renesas_porter.cfg
    │       │   │               │   ├── renesas_salvator-xs.cfg
    │       │   │               │   ├── renesas_silk.cfg
    │       │   │               │   ├── renesas_stout.cfg
    │       │   │               │   ├── rigado_bmd300_ek.cfg
    │       │   │               │   ├── rpi3.cfg
    │       │   │               │   ├── rpi4b.cfg
    │       │   │               │   ├── rsc-w910.cfg
    │       │   │               │   ├── sayma_amc.cfg
    │       │   │               │   ├── sheevaplug.cfg
    │       │   │               │   ├── sifive-e31arty.cfg
    │       │   │               │   ├── sifive-e51arty.cfg
    │       │   │               │   ├── sifive-hifive1-revb.cfg
    │       │   │               │   ├── sifive-hifive1.cfg
    │       │   │               │   ├── smdk6410.cfg
    │       │   │               │   ├── snps_em_sk.cfg
    │       │   │               │   ├── snps_em_sk_v1.cfg
    │       │   │               │   ├── snps_em_sk_v2.1.cfg
    │       │   │               │   ├── snps_em_sk_v2.2.cfg
    │       │   │               │   ├── snps_hsdk.cfg
    │       │   │               │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │       │   │               │   ├── spansion_sk-fm4-u120-9b560.cfg
    │       │   │               │   ├── spear300evb.cfg
    │       │   │               │   ├── spear300evb_mod.cfg
    │       │   │               │   ├── spear310evb20.cfg
    │       │   │               │   ├── spear310evb20_mod.cfg
    │       │   │               │   ├── spear320cpu.cfg
    │       │   │               │   ├── spear320cpu_mod.cfg
    │       │   │               │   ├── st_b-l475e-iot01a.cfg
    │       │   │               │   ├── st_nucleo_8l152r8.cfg
    │       │   │               │   ├── st_nucleo_8s208rb.cfg
    │       │   │               │   ├── st_nucleo_f0.cfg
    │       │   │               │   ├── st_nucleo_f103rb.cfg
    │       │   │               │   ├── st_nucleo_f3.cfg
    │       │   │               │   ├── st_nucleo_f4.cfg
    │       │   │               │   ├── st_nucleo_f7.cfg
    │       │   │               │   ├── st_nucleo_g0.cfg
    │       │   │               │   ├── st_nucleo_g4.cfg
    │       │   │               │   ├── st_nucleo_h743zi.cfg
    │       │   │               │   ├── st_nucleo_h745zi.cfg
    │       │   │               │   ├── st_nucleo_l073rz.cfg
    │       │   │               │   ├── st_nucleo_l1.cfg
    │       │   │               │   ├── st_nucleo_l4.cfg
    │       │   │               │   ├── st_nucleo_l5.cfg
    │       │   │               │   ├── st_nucleo_wb55.cfg
    │       │   │               │   ├── steval-idb007v1.cfg
    │       │   │               │   ├── steval-idb008v1.cfg
    │       │   │               │   ├── steval-idb011v1.cfg
    │       │   │               │   ├── steval-idb012v1.cfg
    │       │   │               │   ├── steval_pcc010.cfg
    │       │   │               │   ├── stm320518_eval.cfg
    │       │   │               │   ├── stm320518_eval_stlink.cfg
    │       │   │               │   ├── stm32100b_eval.cfg
    │       │   │               │   ├── stm3210b_eval.cfg
    │       │   │               │   ├── stm3210c_eval.cfg
    │       │   │               │   ├── stm3210e_eval.cfg
    │       │   │               │   ├── stm3220g_eval.cfg
    │       │   │               │   ├── stm3220g_eval_stlink.cfg
    │       │   │               │   ├── stm3241g_eval.cfg
    │       │   │               │   ├── stm3241g_eval_stlink.cfg
    │       │   │               │   ├── stm32429i_eval.cfg
    │       │   │               │   ├── stm32429i_eval_stlink.cfg
    │       │   │               │   ├── stm32439i_eval.cfg
    │       │   │               │   ├── stm32439i_eval_stlink.cfg
    │       │   │               │   ├── stm327x6g_eval.cfg
    │       │   │               │   ├── stm32f0discovery.cfg
    │       │   │               │   ├── stm32f103c8_blue_pill.cfg
    │       │   │               │   ├── stm32f334discovery.cfg
    │       │   │               │   ├── stm32f3discovery.cfg
    │       │   │               │   ├── stm32f412g-disco.cfg
    │       │   │               │   ├── stm32f413h-disco.cfg
    │       │   │               │   ├── stm32f429disc1.cfg
    │       │   │               │   ├── stm32f429discovery.cfg
    │       │   │               │   ├── stm32f469discovery.cfg
    │       │   │               │   ├── stm32f469i-disco.cfg
    │       │   │               │   ├── stm32f4discovery.cfg
    │       │   │               │   ├── stm32f723e-disco.cfg
    │       │   │               │   ├── stm32f746g-disco.cfg
    │       │   │               │   ├── stm32f769i-disco.cfg
    │       │   │               │   ├── stm32f7discovery.cfg
    │       │   │               │   ├── stm32h735g-disco.cfg
    │       │   │               │   ├── stm32h745i-disco.cfg
    │       │   │               │   ├── stm32h747i-disco.cfg
    │       │   │               │   ├── stm32h750b-disco.cfg
    │       │   │               │   ├── stm32h7b3i-disco.cfg
    │       │   │               │   ├── stm32h7x3i_eval.cfg
    │       │   │               │   ├── stm32h7x_dual_qspi.cfg
    │       │   │               │   ├── stm32l0discovery.cfg
    │       │   │               │   ├── stm32l476g-disco.cfg
    │       │   │               │   ├── stm32l496g-disco.cfg
    │       │   │               │   ├── stm32l4discovery.cfg
    │       │   │               │   ├── stm32l4p5g-disco.cfg
    │       │   │               │   ├── stm32l4r9i-disco.cfg
    │       │   │               │   ├── stm32ldiscovery.cfg
    │       │   │               │   ├── stm32mp13x_dk.cfg
    │       │   │               │   ├── stm32mp15x_dk2.cfg
    │       │   │               │   ├── stm32vldiscovery.cfg
    │       │   │               │   ├── str910-eval.cfg
    │       │   │               │   ├── telo.cfg
    │       │   │               │   ├── ti_am335xevm.cfg
    │       │   │               │   ├── ti_am437x_idk.cfg
    │       │   │               │   ├── ti_am43xx_evm.cfg
    │       │   │               │   ├── ti_am625evm.cfg
    │       │   │               │   ├── ti_am642evm.cfg
    │       │   │               │   ├── ti_am654evm.cfg
    │       │   │               │   ├── ti_beagleboard.cfg
    │       │   │               │   ├── ti_beagleboard_xm.cfg
    │       │   │               │   ├── ti_beaglebone-base.cfg
    │       │   │               │   ├── ti_beaglebone.cfg
    │       │   │               │   ├── ti_beaglebone_black.cfg
    │       │   │               │   ├── ti_blaze.cfg
    │       │   │               │   ├── ti_cc13x0_launchpad.cfg
    │       │   │               │   ├── ti_cc13x2_launchpad.cfg
    │       │   │               │   ├── ti_cc26x0_launchpad.cfg
    │       │   │               │   ├── ti_cc26x2_launchpad.cfg
    │       │   │               │   ├── ti_cc3200_launchxl.cfg
    │       │   │               │   ├── ti_cc3220sf_launchpad.cfg
    │       │   │               │   ├── ti_cc32xx_launchpad.cfg
    │       │   │               │   ├── ti_dk-tm4c129.cfg
    │       │   │               │   ├── ti_ek-tm4c123gxl.cfg
    │       │   │               │   ├── ti_ek-tm4c1294xl.cfg
    │       │   │               │   ├── ti_j7200evm.cfg
    │       │   │               │   ├── ti_j721evm.cfg
    │       │   │               │   ├── ti_j721s2evm.cfg
    │       │   │               │   ├── ti_msp432_launchpad.cfg
    │       │   │               │   ├── ti_pandaboard.cfg
    │       │   │               │   ├── ti_pandaboard_es.cfg
    │       │   │               │   ├── ti_tmdx570ls20susb.cfg
    │       │   │               │   ├── ti_tmdx570ls31usb.cfg
    │       │   │               │   ├── tocoding_poplar.cfg
    │       │   │               │   ├── topas910.cfg
    │       │   │               │   ├── topasa900.cfg
    │       │   │               │   ├── tp-link_tl-mr3020.cfg
    │       │   │               │   ├── tp-link_wdr4300.cfg
    │       │   │               │   ├── twr-k60f120m.cfg
    │       │   │               │   ├── twr-k60n512.cfg
    │       │   │               │   ├── twr-vf65gs10.cfg
    │       │   │               │   ├── twr-vf65gs10_cmsisdap.cfg
    │       │   │               │   ├── tx25_stk5.cfg
    │       │   │               │   ├── tx27_stk5.cfg
    │       │   │               │   ├── unknown_at91sam9260.cfg
    │       │   │               │   ├── uptech_2410.cfg
    │       │   │               │   ├── vd_a53x2_jtag.cfg
    │       │   │               │   ├── vd_m4_jtag.cfg
    │       │   │               │   ├── vd_pulpissimo_jtag.cfg
    │       │   │               │   ├── vd_swerv_jtag.cfg
    │       │   │               │   ├── verdex.cfg
    │       │   │               │   ├── voipac.cfg
    │       │   │               │   ├── voltcraft_dso-3062c.cfg
    │       │   │               │   ├── x300t.cfg
    │       │   │               │   ├── xmc-2go.cfg
    │       │   │               │   ├── xmc1100-boot-kit.cfg
    │       │   │               │   ├── xmc4200-application-kit-actuator.cfg
    │       │   │               │   ├── xmc4300-relax.cfg
    │       │   │               │   ├── xmc4500-application-kit-general.cfg
    │       │   │               │   ├── xmc4500-application-kit-sdram.cfg
    │       │   │               │   ├── xmc4500-relax.cfg
    │       │   │               │   ├── xmc4700-relax.cfg
    │       │   │               │   ├── xmc4800-relax.cfg
    │       │   │               │   └── xmos_xk-xac-xa8_arm.cfg
    │       │   │               ├── chip/
    │       │   │               │   ├── atmel/
    │       │   │               │   │   └── at91/
    │       │   │               │   │       ├── aic.tcl
    │       │   │               │   │       ├── at91_pio.cfg
    │       │   │               │   │       ├── at91_pmc.cfg
    │       │   │               │   │       ├── at91_rstc.cfg
    │       │   │               │   │       ├── at91_wdt.cfg
    │       │   │               │   │       ├── at91sam7x128.tcl
    │       │   │               │   │       ├── at91sam7x256.tcl
    │       │   │               │   │       ├── at91sam9261.cfg
    │       │   │               │   │       ├── at91sam9261_matrix.cfg
    │       │   │               │   │       ├── at91sam9263.cfg
    │       │   │               │   │       ├── at91sam9263_matrix.cfg
    │       │   │               │   │       ├── at91sam9_init.cfg
    │       │   │               │   │       ├── at91sam9_sdramc.cfg
    │       │   │               │   │       ├── at91sam9_smc.cfg
    │       │   │               │   │       ├── hardware.cfg
    │       │   │               │   │       ├── pmc.tcl
    │       │   │               │   │       ├── rtt.tcl
    │       │   │               │   │       ├── sam9_smc.cfg
    │       │   │               │   │       └── usarts.tcl
    │       │   │               │   ├── st/
    │       │   │               │   │   ├── spear/
    │       │   │               │   │   │   ├── quirk_no_srst.tcl
    │       │   │               │   │   │   ├── spear3xx.tcl
    │       │   │               │   │   │   └── spear3xx_ddr.tcl
    │       │   │               │   │   └── stm32/
    │       │   │               │   │       ├── stm32.tcl
    │       │   │               │   │       ├── stm32_rcc.tcl
    │       │   │               │   │       └── stm32_regs.tcl
    │       │   │               │   └── ti/
    │       │   │               │       └── lm3s/
    │       │   │               │           ├── lm3s.tcl
    │       │   │               │           └── lm3s_regs.tcl
    │       │   │               ├── cpld/
    │       │   │               │   ├── altera-5m570z-cpld.cfg
    │       │   │               │   ├── altera-epm240.cfg
    │       │   │               │   ├── jtagspi.cfg
    │       │   │               │   ├── lattice-lc4032ze.cfg
    │       │   │               │   ├── xilinx-xc6s.cfg
    │       │   │               │   ├── xilinx-xc7.cfg
    │       │   │               │   ├── xilinx-xcf-p.cfg
    │       │   │               │   ├── xilinx-xcf-s.cfg
    │       │   │               │   ├── xilinx-xcr3256.cfg
    │       │   │               │   └── xilinx-xcu.cfg
    │       │   │               ├── cpu/
    │       │   │               │   ├── arc/
    │       │   │               │   │   ├── common.tcl
    │       │   │               │   │   ├── em.tcl
    │       │   │               │   │   ├── hs.tcl
    │       │   │               │   │   └── v2.tcl
    │       │   │               │   └── arm/
    │       │   │               │       ├── arm7tdmi.tcl
    │       │   │               │       ├── arm920.tcl
    │       │   │               │       ├── arm946.tcl
    │       │   │               │       ├── arm966.tcl
    │       │   │               │       └── cortex_m3.tcl
    │       │   │               ├── fpga/
    │       │   │               │   ├── altera-10m50.cfg
    │       │   │               │   ├── altera-ep3c10.cfg
    │       │   │               │   ├── lattice_ecp5.cfg
    │       │   │               │   ├── xilinx-dna.cfg
    │       │   │               │   └── xilinx-xadc.cfg
    │       │   │               ├── interface/
    │       │   │               │   ├── altera-usb-blaster.cfg
    │       │   │               │   ├── altera-usb-blaster2.cfg
    │       │   │               │   ├── arm-jtag-ew.cfg
    │       │   │               │   ├── at91rm9200.cfg
    │       │   │               │   ├── beaglebone-jtag-native.cfg
    │       │   │               │   ├── beaglebone-swd-native.cfg
    │       │   │               │   ├── buspirate.cfg
    │       │   │               │   ├── calao-usb-a9260.cfg
    │       │   │               │   ├── chameleon.cfg
    │       │   │               │   ├── cmsis-dap.cfg
    │       │   │               │   ├── dln-2-gpiod.cfg
    │       │   │               │   ├── dummy.cfg
    │       │   │               │   ├── estick.cfg
    │       │   │               │   ├── flashlink.cfg
    │       │   │               │   ├── ft232r/
    │       │   │               │   │   └── radiona_ulx3s.cfg
    │       │   │               │   ├── ft232r.cfg
    │       │   │               │   ├── ftdi/
    │       │   │               │   │   ├── 100ask-openjtag.cfg
    │       │   │               │   │   ├── ashling-opella-ld-jtag.cfg
    │       │   │               │   │   ├── ashling-opella-ld-swd.cfg
    │       │   │               │   │   ├── axm0432.cfg
    │       │   │               │   │   ├── c232hm.cfg
    │       │   │               │   │   ├── calao-usb-a9260-c01.cfg
    │       │   │               │   │   ├── calao-usb-a9260-c02.cfg
    │       │   │               │   │   ├── cortino.cfg
    │       │   │               │   │   ├── digilent-hs1.cfg
    │       │   │               │   │   ├── digilent-hs2.cfg
    │       │   │               │   │   ├── digilent_jtag_hs3.cfg
    │       │   │               │   │   ├── digilent_jtag_smt2.cfg
    │       │   │               │   │   ├── digilent_jtag_smt2_nc.cfg
    │       │   │               │   │   ├── dlp-usb1232h.cfg
    │       │   │               │   │   ├── dp_busblaster.cfg
    │       │   │               │   │   ├── dp_busblaster_kt-link.cfg
    │       │   │               │   │   ├── esp32s2_kaluga_v1.cfg
    │       │   │               │   │   ├── flossjtag-noeeprom.cfg
    │       │   │               │   │   ├── flossjtag.cfg
    │       │   │               │   │   ├── flyswatter.cfg
    │       │   │               │   │   ├── flyswatter2.cfg
    │       │   │               │   │   ├── ft232h-module-swd.cfg
    │       │   │               │   │   ├── gw16042.cfg
    │       │   │               │   │   ├── hie-jtag.cfg
    │       │   │               │   │   ├── hilscher_nxhx10_etm.cfg
    │       │   │               │   │   ├── hilscher_nxhx500_etm.cfg
    │       │   │               │   │   ├── hilscher_nxhx500_re.cfg
    │       │   │               │   │   ├── hilscher_nxhx50_etm.cfg
    │       │   │               │   │   ├── hilscher_nxhx50_re.cfg
    │       │   │               │   │   ├── hitex_lpc1768stick.cfg
    │       │   │               │   │   ├── hitex_str9-comstick.cfg
    │       │   │               │   │   ├── icebear.cfg
    │       │   │               │   │   ├── imx8mp-evk.cfg
    │       │   │               │   │   ├── incircuit-icprog.cfg
    │       │   │               │   │   ├── iotlab-usb.cfg
    │       │   │               │   │   ├── isodebug.cfg
    │       │   │               │   │   ├── jtag-lock-pick_tiny_2.cfg
    │       │   │               │   │   ├── jtagkey.cfg
    │       │   │               │   │   ├── jtagkey2.cfg
    │       │   │               │   │   ├── jtagkey2p.cfg
    │       │   │               │   │   ├── kt-link.cfg
    │       │   │               │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │               │   │   ├── lisa-l.cfg
    │       │   │               │   │   ├── luminary-icdi.cfg
    │       │   │               │   │   ├── luminary-lm3s811.cfg
    │       │   │               │   │   ├── luminary.cfg
    │       │   │               │   │   ├── m53evk.cfg
    │       │   │               │   │   ├── mbftdi.cfg
    │       │   │               │   │   ├── minimodule-swd.cfg
    │       │   │               │   │   ├── minimodule.cfg
    │       │   │               │   │   ├── minispartan6.cfg
    │       │   │               │   │   ├── miniwiggler.cfg
    │       │   │               │   │   ├── neodb.cfg
    │       │   │               │   │   ├── ngxtech.cfg
    │       │   │               │   │   ├── olimex-arm-jtag-swd.cfg
    │       │   │               │   │   ├── olimex-arm-usb-ocd-h.cfg
    │       │   │               │   │   ├── olimex-arm-usb-ocd.cfg
    │       │   │               │   │   ├── olimex-arm-usb-tiny-h.cfg
    │       │   │               │   │   ├── olimex-jtag-tiny.cfg
    │       │   │               │   │   ├── oocdlink.cfg
    │       │   │               │   │   ├── opendous_ftdi.cfg
    │       │   │               │   │   ├── openocd-usb-hs.cfg
    │       │   │               │   │   ├── openocd-usb.cfg
    │       │   │               │   │   ├── openrd.cfg
    │       │   │               │   │   ├── pipistrello.cfg
    │       │   │               │   │   ├── pls_spc5.cfg
    │       │   │               │   │   ├── redbee-econotag.cfg
    │       │   │               │   │   ├── redbee-usb.cfg
    │       │   │               │   │   ├── rowley-cc-arm-swd.cfg
    │       │   │               │   │   ├── sheevaplug.cfg
    │       │   │               │   │   ├── signalyzer-lite.cfg
    │       │   │               │   │   ├── signalyzer.cfg
    │       │   │               │   │   ├── snps_sdp.cfg
    │       │   │               │   │   ├── steppenprobe.cfg
    │       │   │               │   │   ├── stm32-stick.cfg
    │       │   │               │   │   ├── swd-resistor-hack.cfg
    │       │   │               │   │   ├── ti-icdi.cfg
    │       │   │               │   │   ├── tigard.cfg
    │       │   │               │   │   ├── tumpa-lite.cfg
    │       │   │               │   │   ├── tumpa.cfg
    │       │   │               │   │   ├── turtelizer2-revB.cfg
    │       │   │               │   │   ├── turtelizer2-revC.cfg
    │       │   │               │   │   ├── um232h.cfg
    │       │   │               │   │   ├── vpaclink.cfg
    │       │   │               │   │   ├── xds100v2.cfg
    │       │   │               │   │   └── xds100v3.cfg
    │       │   │               │   ├── imx-native.cfg
    │       │   │               │   ├── jlink.cfg
    │       │   │               │   ├── jtag_dpi.cfg
    │       │   │               │   ├── jtag_hat_rpi2.cfg
    │       │   │               │   ├── jtag_vpi.cfg
    │       │   │               │   ├── kitprog.cfg
    │       │   │               │   ├── nds32-aice.cfg
    │       │   │               │   ├── nulink.cfg
    │       │   │               │   ├── opendous.cfg
    │       │   │               │   ├── openjtag.cfg
    │       │   │               │   ├── osbdm.cfg
    │       │   │               │   ├── parport.cfg
    │       │   │               │   ├── parport_dlc5.cfg
    │       │   │               │   ├── raspberrypi-native.cfg
    │       │   │               │   ├── raspberrypi2-native.cfg
    │       │   │               │   ├── rlink.cfg
    │       │   │               │   ├── rshim.cfg
    │       │   │               │   ├── stlink-dap.cfg
    │       │   │               │   ├── stlink-v1.cfg
    │       │   │               │   ├── stlink-v2-1.cfg
    │       │   │               │   ├── stlink-v2.cfg
    │       │   │               │   ├── stlink.cfg
    │       │   │               │   ├── sysfsgpio-raspberrypi.cfg
    │       │   │               │   ├── ti-icdi.cfg
    │       │   │               │   ├── ulink.cfg
    │       │   │               │   ├── usb-jtag.cfg
    │       │   │               │   ├── usbprog.cfg
    │       │   │               │   ├── vdebug.cfg
    │       │   │               │   ├── vsllink.cfg
    │       │   │               │   └── xds110.cfg
    │       │   │               ├── mem_helper.tcl
    │       │   │               ├── memory.tcl
    │       │   │               ├── mmr_helpers.tcl
    │       │   │               ├── target/
    │       │   │               │   ├── 1986ве1т.cfg
    │       │   │               │   ├── adsp-sc58x.cfg
    │       │   │               │   ├── aduc702x.cfg
    │       │   │               │   ├── aducm360.cfg
    │       │   │               │   ├── allwinner_v3s.cfg
    │       │   │               │   ├── alphascale_asm9260t.cfg
    │       │   │               │   ├── altera_fpgasoc.cfg
    │       │   │               │   ├── altera_fpgasoc_arria10.cfg
    │       │   │               │   ├── am335x.cfg
    │       │   │               │   ├── am437x.cfg
    │       │   │               │   ├── amdm37x.cfg
    │       │   │               │   ├── ampere_emag.cfg
    │       │   │               │   ├── ar71xx.cfg
    │       │   │               │   ├── arm_corelink_sse200.cfg
    │       │   │               │   ├── armada370.cfg
    │       │   │               │   ├── at32ap7000.cfg
    │       │   │               │   ├── at91r40008.cfg
    │       │   │               │   ├── at91rm9200.cfg
    │       │   │               │   ├── at91sam3XXX.cfg
    │       │   │               │   ├── at91sam3ax_4x.cfg
    │       │   │               │   ├── at91sam3ax_8x.cfg
    │       │   │               │   ├── at91sam3ax_xx.cfg
    │       │   │               │   ├── at91sam3nXX.cfg
    │       │   │               │   ├── at91sam3sXX.cfg
    │       │   │               │   ├── at91sam3u1c.cfg
    │       │   │               │   ├── at91sam3u1e.cfg
    │       │   │               │   ├── at91sam3u2c.cfg
    │       │   │               │   ├── at91sam3u2e.cfg
    │       │   │               │   ├── at91sam3u4c.cfg
    │       │   │               │   ├── at91sam3u4e.cfg
    │       │   │               │   ├── at91sam3uxx.cfg
    │       │   │               │   ├── at91sam4XXX.cfg
    │       │   │               │   ├── at91sam4c32x.cfg
    │       │   │               │   ├── at91sam4cXXX.cfg
    │       │   │               │   ├── at91sam4lXX.cfg
    │       │   │               │   ├── at91sam4sXX.cfg
    │       │   │               │   ├── at91sam4sd32x.cfg
    │       │   │               │   ├── at91sam7a2.cfg
    │       │   │               │   ├── at91sam7se512.cfg
    │       │   │               │   ├── at91sam7sx.cfg
    │       │   │               │   ├── at91sam7x256.cfg
    │       │   │               │   ├── at91sam7x512.cfg
    │       │   │               │   ├── at91sam9.cfg
    │       │   │               │   ├── at91sam9260.cfg
    │       │   │               │   ├── at91sam9260_ext_RAM_ext_flash.cfg
    │       │   │               │   ├── at91sam9261.cfg
    │       │   │               │   ├── at91sam9263.cfg
    │       │   │               │   ├── at91sam9g10.cfg
    │       │   │               │   ├── at91sam9g20.cfg
    │       │   │               │   ├── at91sam9g45.cfg
    │       │   │               │   ├── at91sam9rl.cfg
    │       │   │               │   ├── at91sama5d2.cfg
    │       │   │               │   ├── at91samdXX.cfg
    │       │   │               │   ├── at91samg5x.cfg
    │       │   │               │   ├── atheros_ar2313.cfg
    │       │   │               │   ├── atheros_ar2315.cfg
    │       │   │               │   ├── atheros_ar9331.cfg
    │       │   │               │   ├── atheros_ar9344.cfg
    │       │   │               │   ├── atmega128.cfg
    │       │   │               │   ├── atmega128rfa1.cfg
    │       │   │               │   ├── atsame5x.cfg
    │       │   │               │   ├── atsaml1x.cfg
    │       │   │               │   ├── atsamv.cfg
    │       │   │               │   ├── avr32.cfg
    │       │   │               │   ├── bcm2711.cfg
    │       │   │               │   ├── bcm281xx.cfg
    │       │   │               │   ├── bcm2835.cfg
    │       │   │               │   ├── bcm2836.cfg
    │       │   │               │   ├── bcm2837.cfg
    │       │   │               │   ├── bcm4706.cfg
    │       │   │               │   ├── bcm4718.cfg
    │       │   │               │   ├── bcm47xx.cfg
    │       │   │               │   ├── bcm5352e.cfg
    │       │   │               │   ├── bcm6348.cfg
    │       │   │               │   ├── bluefield.cfg
    │       │   │               │   ├── bluenrg-x.cfg
    │       │   │               │   ├── c100.cfg
    │       │   │               │   ├── c100config.tcl
    │       │   │               │   ├── c100helper.tcl
    │       │   │               │   ├── c100regs.tcl
    │       │   │               │   ├── cc2538.cfg
    │       │   │               │   ├── cs351x.cfg
    │       │   │               │   ├── davinci.cfg
    │       │   │               │   ├── dragonite.cfg
    │       │   │               │   ├── dsp56321.cfg
    │       │   │               │   ├── dsp568013.cfg
    │       │   │               │   ├── dsp568037.cfg
    │       │   │               │   ├── efm32.cfg
    │       │   │               │   ├── em357.cfg
    │       │   │               │   ├── em358.cfg
    │       │   │               │   ├── eos_s3.cfg
    │       │   │               │   ├── epc9301.cfg
    │       │   │               │   ├── esi32xx.cfg
    │       │   │               │   ├── esp32s2.cfg
    │       │   │               │   ├── exynos5250.cfg
    │       │   │               │   ├── faux.cfg
    │       │   │               │   ├── feroceon.cfg
    │       │   │               │   ├── fm3.cfg
    │       │   │               │   ├── fm4.cfg
    │       │   │               │   ├── fm4_mb9bf.cfg
    │       │   │               │   ├── fm4_s6e2cc.cfg
    │       │   │               │   ├── gd32e23x.cfg
    │       │   │               │   ├── gd32vf103.cfg
    │       │   │               │   ├── gp326xxxa.cfg
    │       │   │               │   ├── hi3798.cfg
    │       │   │               │   ├── hi6220.cfg
    │       │   │               │   ├── hilscher_netx10.cfg
    │       │   │               │   ├── hilscher_netx50.cfg
    │       │   │               │   ├── hilscher_netx500.cfg
    │       │   │               │   ├── icepick.cfg
    │       │   │               │   ├── imx.cfg
    │       │   │               │   ├── imx21.cfg
    │       │   │               │   ├── imx25.cfg
    │       │   │               │   ├── imx27.cfg
    │       │   │               │   ├── imx28.cfg
    │       │   │               │   ├── imx31.cfg
    │       │   │               │   ├── imx35.cfg
    │       │   │               │   ├── imx51.cfg
    │       │   │               │   ├── imx53.cfg
    │       │   │               │   ├── imx6.cfg
    │       │   │               │   ├── imx6sx.cfg
    │       │   │               │   ├── imx6ul.cfg
    │       │   │               │   ├── imx7.cfg
    │       │   │               │   ├── imx7ulp.cfg
    │       │   │               │   ├── imx8m.cfg
    │       │   │               │   ├── imx8qm.cfg
    │       │   │               │   ├── infineon/
    │       │   │               │   │   └── tle987x.cfg
    │       │   │               │   ├── is5114.cfg
    │       │   │               │   ├── ixp42x.cfg
    │       │   │               │   ├── k1921vk01t.cfg
    │       │   │               │   ├── k40.cfg
    │       │   │               │   ├── k60.cfg
    │       │   │               │   ├── ke0x.cfg
    │       │   │               │   ├── ke1xf.cfg
    │       │   │               │   ├── ke1xz.cfg
    │       │   │               │   ├── kl25.cfg
    │       │   │               │   ├── kl46.cfg
    │       │   │               │   ├── klx.cfg
    │       │   │               │   ├── ks869x.cfg
    │       │   │               │   ├── kx.cfg
    │       │   │               │   ├── lpc11xx.cfg
    │       │   │               │   ├── lpc12xx.cfg
    │       │   │               │   ├── lpc13xx.cfg
    │       │   │               │   ├── lpc17xx.cfg
    │       │   │               │   ├── lpc1850.cfg
    │       │   │               │   ├── lpc1xxx.cfg
    │       │   │               │   ├── lpc2103.cfg
    │       │   │               │   ├── lpc2124.cfg
    │       │   │               │   ├── lpc2129.cfg
    │       │   │               │   ├── lpc2148.cfg
    │       │   │               │   ├── lpc2294.cfg
    │       │   │               │   ├── lpc2378.cfg
    │       │   │               │   ├── lpc2460.cfg
    │       │   │               │   ├── lpc2478.cfg
    │       │   │               │   ├── lpc2900.cfg
    │       │   │               │   ├── lpc2xxx.cfg
    │       │   │               │   ├── lpc3131.cfg
    │       │   │               │   ├── lpc3250.cfg
    │       │   │               │   ├── lpc40xx.cfg
    │       │   │               │   ├── lpc4350.cfg
    │       │   │               │   ├── lpc4357.cfg
    │       │   │               │   ├── lpc4370.cfg
    │       │   │               │   ├── lpc84x.cfg
    │       │   │               │   ├── lpc8nxx.cfg
    │       │   │               │   ├── lpc8xx.cfg
    │       │   │               │   ├── ls1012a.cfg
    │       │   │               │   ├── ls1028a.cfg
    │       │   │               │   ├── ls1046a.cfg
    │       │   │               │   ├── ls1088a.cfg
    │       │   │               │   ├── lsch3_common.cfg
    │       │   │               │   ├── marvell/
    │       │   │               │   │   ├── 88f3710.cfg
    │       │   │               │   │   ├── 88f3720.cfg
    │       │   │               │   │   └── 88f37x0.cfg
    │       │   │               │   ├── max32620.cfg
    │       │   │               │   ├── max32625.cfg
    │       │   │               │   ├── max3263x.cfg
    │       │   │               │   ├── mc13224v.cfg
    │       │   │               │   ├── mdr32f9q2i.cfg
    │       │   │               │   ├── nds32v2.cfg
    │       │   │               │   ├── nds32v3.cfg
    │       │   │               │   ├── nds32v3m.cfg
    │       │   │               │   ├── nds32v5.cfg
    │       │   │               │   ├── nhs31xx.cfg
    │       │   │               │   ├── npcx.cfg
    │       │   │               │   ├── nrf51.cfg
    │       │   │               │   ├── nrf52.cfg
    │       │   │               │   ├── nuc910.cfg
    │       │   │               │   ├── numicro.cfg
    │       │   │               │   ├── omap2420.cfg
    │       │   │               │   ├── omap3530.cfg
    │       │   │               │   ├── omap4430.cfg
    │       │   │               │   ├── omap4460.cfg
    │       │   │               │   ├── omap5912.cfg
    │       │   │               │   ├── omapl138.cfg
    │       │   │               │   ├── or1k.cfg
    │       │   │               │   ├── pic32mx.cfg
    │       │   │               │   ├── psoc4.cfg
    │       │   │               │   ├── psoc5lp.cfg
    │       │   │               │   ├── psoc6.cfg
    │       │   │               │   ├── pxa255.cfg
    │       │   │               │   ├── pxa270.cfg
    │       │   │               │   ├── pxa3xx.cfg
    │       │   │               │   ├── qualcomm_qca4531.cfg
    │       │   │               │   ├── quark_d20xx.cfg
    │       │   │               │   ├── quark_x10xx.cfg
    │       │   │               │   ├── readme.txt
    │       │   │               │   ├── renesas_r7s72100.cfg
    │       │   │               │   ├── renesas_rcar_gen2.cfg
    │       │   │               │   ├── renesas_rcar_gen3.cfg
    │       │   │               │   ├── renesas_rcar_reset_common.cfg
    │       │   │               │   ├── renesas_rz_five.cfg
    │       │   │               │   ├── renesas_rz_g2.cfg
    │       │   │               │   ├── renesas_s7g2.cfg
    │       │   │               │   ├── rk3308.cfg
    │       │   │               │   ├── rk3399.cfg
    │       │   │               │   ├── rp2040-core0.cfg
    │       │   │               │   ├── samsung_s3c2410.cfg
    │       │   │               │   ├── samsung_s3c2440.cfg
    │       │   │               │   ├── samsung_s3c2450.cfg
    │       │   │               │   ├── samsung_s3c4510.cfg
    │       │   │               │   ├── samsung_s3c6410.cfg
    │       │   │               │   ├── sharp_lh79532.cfg
    │       │   │               │   ├── sim3x.cfg
    │       │   │               │   ├── smp8634.cfg
    │       │   │               │   ├── snps_em_sk_fpga.cfg
    │       │   │               │   ├── snps_hsdk.cfg
    │       │   │               │   ├── spear3xx.cfg
    │       │   │               │   ├── stellaris.cfg
    │       │   │               │   ├── stm32f0x.cfg
    │       │   │               │   ├── stm32f1x.cfg
    │       │   │               │   ├── stm32f2x.cfg
    │       │   │               │   ├── stm32f3x.cfg
    │       │   │               │   ├── stm32f4x.cfg
    │       │   │               │   ├── stm32f7x.cfg
    │       │   │               │   ├── stm32g0x.cfg
    │       │   │               │   ├── stm32g4x.cfg
    │       │   │               │   ├── stm32h7x.cfg
    │       │   │               │   ├── stm32h7x_dual_bank.cfg
    │       │   │               │   ├── stm32l0.cfg
    │       │   │               │   ├── stm32l0_dual_bank.cfg
    │       │   │               │   ├── stm32l1.cfg
    │       │   │               │   ├── stm32l1x_dual_bank.cfg
    │       │   │               │   ├── stm32l4x.cfg
    │       │   │               │   ├── stm32l5x.cfg
    │       │   │               │   ├── stm32mp13x.cfg
    │       │   │               │   ├── stm32mp15x.cfg
    │       │   │               │   ├── stm32u5x.cfg
    │       │   │               │   ├── stm32w108xx.cfg
    │       │   │               │   ├── stm32wbx.cfg
    │       │   │               │   ├── stm32wlx.cfg
    │       │   │               │   ├── stm32x5x_common.cfg
    │       │   │               │   ├── stm32xl.cfg
    │       │   │               │   ├── stm8l.cfg
    │       │   │               │   ├── stm8l152.cfg
    │       │   │               │   ├── stm8s.cfg
    │       │   │               │   ├── stm8s003.cfg
    │       │   │               │   ├── stm8s103.cfg
    │       │   │               │   ├── stm8s105.cfg
    │       │   │               │   ├── str710.cfg
    │       │   │               │   ├── str730.cfg
    │       │   │               │   ├── str750.cfg
    │       │   │               │   ├── str912.cfg
    │       │   │               │   ├── swj-dp.tcl
    │       │   │               │   ├── swm050.cfg
    │       │   │               │   ├── test_reset_syntax_error.cfg
    │       │   │               │   ├── test_syntax_error.cfg
    │       │   │               │   ├── ti-ar7.cfg
    │       │   │               │   ├── ti-cjtag.cfg
    │       │   │               │   ├── ti_calypso.cfg
    │       │   │               │   ├── ti_cc13x0.cfg
    │       │   │               │   ├── ti_cc13x2.cfg
    │       │   │               │   ├── ti_cc26x0.cfg
    │       │   │               │   ├── ti_cc26x2.cfg
    │       │   │               │   ├── ti_cc3220sf.cfg
    │       │   │               │   ├── ti_cc32xx.cfg
    │       │   │               │   ├── ti_dm355.cfg
    │       │   │               │   ├── ti_dm365.cfg
    │       │   │               │   ├── ti_dm6446.cfg
    │       │   │               │   ├── ti_k3.cfg
    │       │   │               │   ├── ti_msp432.cfg
    │       │   │               │   ├── ti_rm4x.cfg
    │       │   │               │   ├── ti_tms570.cfg
    │       │   │               │   ├── ti_tms570ls20xxx.cfg
    │       │   │               │   ├── ti_tms570ls3137.cfg
    │       │   │               │   ├── tmpa900.cfg
    │       │   │               │   ├── tmpa910.cfg
    │       │   │               │   ├── tnetc4401.cfg
    │       │   │               │   ├── u8500.cfg
    │       │   │               │   ├── vd_aarch64.cfg
    │       │   │               │   ├── vd_cortex_m.cfg
    │       │   │               │   ├── vd_riscv.cfg
    │       │   │               │   ├── vybrid_vf6xx.cfg
    │       │   │               │   ├── xilinx_zynqmp.cfg
    │       │   │               │   ├── xmc1xxx.cfg
    │       │   │               │   ├── xmc4xxx.cfg
    │       │   │               │   ├── xmos_xs1-xau8a-10_arm.cfg
    │       │   │               │   ├── zynq_7000.cfg
    │       │   │               │   └── к1879xб1я.cfg
    │       │   │               ├── test/
    │       │   │               │   ├── selftest.cfg
    │       │   │               │   └── syntax1.cfg
    │       │   │               └── tools/
    │       │   │                   ├── firmware-recovery.tcl
    │       │   │                   ├── memtest.tcl
    │       │   │                   └── test_cpu_speed.tcl
    │       │   ├── README.md
    │       │   └── translations/
    │       │       ├── qt_ar.qm
    │       │       ├── qt_bg.qm
    │       │       ├── qt_ca.qm
    │       │       ├── qt_cs.qm
    │       │       ├── qt_da.qm
    │       │       ├── qt_de.qm
    │       │       ├── qt_en.qm
    │       │       ├── qt_es.qm
    │       │       ├── qt_fa.qm
    │       │       ├── qt_fi.qm
    │       │       ├── qt_fr.qm
    │       │       ├── qt_gd.qm
    │       │       ├── qt_he.qm
    │       │       ├── qt_hr.qm
    │       │       ├── qt_hu.qm
    │       │       ├── qt_it.qm
    │       │       ├── qt_ja.qm
    │       │       ├── qt_ko.qm
    │       │       ├── qt_lv.qm
    │       │       ├── qt_nl.qm
    │       │       ├── qt_nn.qm
    │       │       ├── qt_pl.qm
    │       │       ├── qt_pt_BR.qm
    │       │       ├── qt_ru.qm
    │       │       ├── qt_sk.qm
    │       │       ├── qt_tr.qm
    │       │       ├── qt_uk.qm
    │       │       ├── qt_zh_CN.qm
    │       │       └── qt_zh_TW.qm
    │       ├── OpenOCD_CH347/
    │       │   ├── README.md
    │       │   ├── bin/
    │       │   │   └── ch347.cfg
    │       │   ├── contrib/
    │       │   │   ├── 60-openocd.rules
    │       │   │   └── libdcc/
    │       │   │       ├── README
    │       │   │       ├── dcc_stdio.c
    │       │   │       ├── dcc_stdio.h
    │       │   │       └── example.c
    │       │   ├── scripts/
    │       │   │   ├── bitsbytes.tcl
    │       │   │   ├── board/
    │       │   │   │   ├── 8devices-lima.cfg
    │       │   │   │   ├── actux3.cfg
    │       │   │   │   ├── adapteva_parallella1.cfg
    │       │   │   │   ├── adsp-sc584-ezbrd.cfg
    │       │   │   │   ├── alphascale_asm9260_ek.cfg
    │       │   │   │   ├── altera_sockit.cfg
    │       │   │   │   ├── am3517evm.cfg
    │       │   │   │   ├── ampere_emag8180.cfg
    │       │   │   │   ├── arm_evaluator7t.cfg
    │       │   │   │   ├── arm_musca_a.cfg
    │       │   │   │   ├── arty_s7.cfg
    │       │   │   │   ├── asus-rt-n16.cfg
    │       │   │   │   ├── asus-rt-n66u.cfg
    │       │   │   │   ├── at91cap7a-stk-sdram.cfg
    │       │   │   │   ├── at91eb40a.cfg
    │       │   │   │   ├── at91rm9200-dk.cfg
    │       │   │   │   ├── at91rm9200-ek.cfg
    │       │   │   │   ├── at91sam9261-ek.cfg
    │       │   │   │   ├── at91sam9263-ek.cfg
    │       │   │   │   ├── at91sam9g20-ek.cfg
    │       │   │   │   ├── atmel_at91sam7s-ek.cfg
    │       │   │   │   ├── atmel_at91sam9260-ek.cfg
    │       │   │   │   ├── atmel_at91sam9rl-ek.cfg
    │       │   │   │   ├── atmel_sam3n_ek.cfg
    │       │   │   │   ├── atmel_sam3s_ek.cfg
    │       │   │   │   ├── atmel_sam3u_ek.cfg
    │       │   │   │   ├── atmel_sam3x_ek.cfg
    │       │   │   │   ├── atmel_sam4e_ek.cfg
    │       │   │   │   ├── atmel_sam4l8_xplained_pro.cfg
    │       │   │   │   ├── atmel_sam4s_ek.cfg
    │       │   │   │   ├── atmel_sam4s_xplained_pro.cfg
    │       │   │   │   ├── atmel_samc20_xplained_pro.cfg
    │       │   │   │   ├── atmel_samc21_xplained_pro.cfg
    │       │   │   │   ├── atmel_samd10_xplained_mini.cfg
    │       │   │   │   ├── atmel_samd11_xplained_pro.cfg
    │       │   │   │   ├── atmel_samd20_xplained_pro.cfg
    │       │   │   │   ├── atmel_samd21_xplained_pro.cfg
    │       │   │   │   ├── atmel_same70_xplained.cfg
    │       │   │   │   ├── atmel_samg53_xplained_pro.cfg
    │       │   │   │   ├── atmel_samg55_xplained_pro.cfg
    │       │   │   │   ├── atmel_saml21_xplained_pro.cfg
    │       │   │   │   ├── atmel_samr21_xplained_pro.cfg
    │       │   │   │   ├── atmel_samv71_xplained_ultra.cfg
    │       │   │   │   ├── avnet_ultrazed-eg.cfg
    │       │   │   │   ├── balloon3-cpu.cfg
    │       │   │   │   ├── bcm28155_ap.cfg
    │       │   │   │   ├── bluefield.cfg
    │       │   │   │   ├── bt-homehubv1.cfg
    │       │   │   │   ├── colibri.cfg
    │       │   │   │   ├── crossbow_tech_imote2.cfg
    │       │   │   │   ├── csb337.cfg
    │       │   │   │   ├── csb732.cfg
    │       │   │   │   ├── da850evm.cfg
    │       │   │   │   ├── digi_connectcore_wi-9c.cfg
    │       │   │   │   ├── digilent_analog_discovery.cfg
    │       │   │   │   ├── digilent_atlys.cfg
    │       │   │   │   ├── digilent_nexys_video.cfg
    │       │   │   │   ├── digilent_zedboard.cfg
    │       │   │   │   ├── diolan_lpc4350-db1.cfg
    │       │   │   │   ├── diolan_lpc4357-db1.cfg
    │       │   │   │   ├── dk-tm4c129.cfg
    │       │   │   │   ├── dm355evm.cfg
    │       │   │   │   ├── dm365evm.cfg
    │       │   │   │   ├── dm6446evm.cfg
    │       │   │   │   ├── dp_busblaster_v3.cfg
    │       │   │   │   ├── dp_busblaster_v4.cfg
    │       │   │   │   ├── dptechnics_dpt-board-v1.cfg
    │       │   │   │   ├── efikamx.cfg
    │       │   │   │   ├── efm32.cfg
    │       │   │   │   ├── eir.cfg
    │       │   │   │   ├── ek-lm3s1968.cfg
    │       │   │   │   ├── ek-lm3s3748.cfg
    │       │   │   │   ├── ek-lm3s6965.cfg
    │       │   │   │   ├── ek-lm3s811-revb.cfg
    │       │   │   │   ├── ek-lm3s811.cfg
    │       │   │   │   ├── ek-lm3s8962.cfg
    │       │   │   │   ├── ek-lm3s9b9x.cfg
    │       │   │   │   ├── ek-lm3s9d92.cfg
    │       │   │   │   ├── ek-lm4f120xl.cfg
    │       │   │   │   ├── ek-lm4f232.cfg
    │       │   │   │   ├── ek-tm4c123gxl.cfg
    │       │   │   │   ├── ek-tm4c1294xl.cfg
    │       │   │   │   ├── embedded-artists_lpc2478-32.cfg
    │       │   │   │   ├── emcraft_imx8m-som-bsb.cfg
    │       │   │   │   ├── emcraft_twr-vf6-som-bsb.cfg
    │       │   │   │   ├── emcraft_vf6-som.cfg
    │       │   │   │   ├── esp32s2-kaluga-1.cfg
    │       │   │   │   ├── ethernut3.cfg
    │       │   │   │   ├── evb-lan9255.cfg
    │       │   │   │   ├── frdm-kl25z.cfg
    │       │   │   │   ├── frdm-kl46z.cfg
    │       │   │   │   ├── fsl_imx6q_sabresd.cfg
    │       │   │   │   ├── glyn_tonga2.cfg
    │       │   │   │   ├── gti/
    │       │   │   │   │   └── espressobin.cfg
    │       │   │   │   ├── gumstix-aerocore.cfg
    │       │   │   │   ├── hammer.cfg
    │       │   │   │   ├── hilscher_nxdb500sys.cfg
    │       │   │   │   ├── hilscher_nxeb500hmi.cfg
    │       │   │   │   ├── hilscher_nxhx10.cfg
    │       │   │   │   ├── hilscher_nxhx50.cfg
    │       │   │   │   ├── hilscher_nxhx500.cfg
    │       │   │   │   ├── hilscher_nxsb100.cfg
    │       │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   ├── hitex_lpc2929.cfg
    │       │   │   │   ├── hitex_stm32-performancestick.cfg
    │       │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   ├── iar_lpc1768.cfg
    │       │   │   │   ├── iar_str912_sk.cfg
    │       │   │   │   ├── icnova_imx53_sodimm.cfg
    │       │   │   │   ├── icnova_sam9g45_sodimm.cfg
    │       │   │   │   ├── imx27ads.cfg
    │       │   │   │   ├── imx27lnst.cfg
    │       │   │   │   ├── imx28evk.cfg
    │       │   │   │   ├── imx31pdk.cfg
    │       │   │   │   ├── imx35pdk.cfg
    │       │   │   │   ├── imx53-m53evk.cfg
    │       │   │   │   ├── imx53loco.cfg
    │       │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   ├── insignal_arndale.cfg
    │       │   │   │   ├── kasli.cfg
    │       │   │   │   ├── kc100.cfg
    │       │   │   │   ├── kc705.cfg
    │       │   │   │   ├── kcu105.cfg
    │       │   │   │   ├── keil_mcb1700.cfg
    │       │   │   │   ├── keil_mcb2140.cfg
    │       │   │   │   ├── kindle2.cfg
    │       │   │   │   ├── kontron_sl28.cfg
    │       │   │   │   ├── kwikstik.cfg
    │       │   │   │   ├── la_fonera-fon2200.cfg
    │       │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   ├── lemaker_hikey.cfg
    │       │   │   │   ├── linksys-wag200g.cfg
    │       │   │   │   ├── linksys-wrt54gl.cfg
    │       │   │   │   ├── linksys_nslu2.cfg
    │       │   │   │   ├── lisa-l.cfg
    │       │   │   │   ├── logicpd_imx27.cfg
    │       │   │   │   ├── lpc1850_spifi_generic.cfg
    │       │   │   │   ├── lpc4350_spifi_generic.cfg
    │       │   │   │   ├── lubbock.cfg
    │       │   │   │   ├── marsohod.cfg
    │       │   │   │   ├── marsohod2.cfg
    │       │   │   │   ├── marsohod3.cfg
    │       │   │   │   ├── mbed-lpc11u24.cfg
    │       │   │   │   ├── mbed-lpc1768.cfg
    │       │   │   │   ├── mcb1700.cfg
    │       │   │   │   ├── microchip_explorer16.cfg
    │       │   │   │   ├── microchip_sama5d27_som1_kit1.cfg
    │       │   │   │   ├── microchip_same51_curiosity_nano.cfg
    │       │   │   │   ├── microchip_same54_xplained_pro.cfg
    │       │   │   │   ├── microchip_saml11_xplained_pro.cfg
    │       │   │   │   ├── mini2440.cfg
    │       │   │   │   ├── mini6410.cfg
    │       │   │   │   ├── minispartan6.cfg
    │       │   │   │   ├── nds32_corvettef1.cfg
    │       │   │   │   ├── nds32_xc5.cfg
    │       │   │   │   ├── nds32_xc7.cfg
    │       │   │   │   ├── netgear-dg834v3.cfg
    │       │   │   │   ├── netgear-wg102.cfg
    │       │   │   │   ├── nordic_nrf51822_mkit.cfg
    │       │   │   │   ├── nordic_nrf51_dk.cfg
    │       │   │   │   ├── nordic_nrf52_dk.cfg
    │       │   │   │   ├── nordic_nrf52_ftx232.cfg
    │       │   │   │   ├── novena-internal-fpga.cfg
    │       │   │   │   ├── npcx_evb.cfg
    │       │   │   │   ├── numato_mimas_a7.cfg
    │       │   │   │   ├── numato_opsis.cfg
    │       │   │   │   ├── nxp_frdm-k64f.cfg
    │       │   │   │   ├── nxp_frdm-ls1012a.cfg
    │       │   │   │   ├── nxp_imx7sabre.cfg
    │       │   │   │   ├── nxp_lpc-link2.cfg
    │       │   │   │   ├── nxp_mcimx8m-evk.cfg
    │       │   │   │   ├── nxp_rdb-ls1046a.cfg
    │       │   │   │   ├── nxp_rdb-ls1088a.cfg
    │       │   │   │   ├── olimex_LPC2378STK.cfg
    │       │   │   │   ├── olimex_lpc_h2148.cfg
    │       │   │   │   ├── olimex_sam7_ex256.cfg
    │       │   │   │   ├── olimex_sam7_la2.cfg
    │       │   │   │   ├── olimex_sam9_l9260.cfg
    │       │   │   │   ├── olimex_stm32_h103.cfg
    │       │   │   │   ├── olimex_stm32_h107.cfg
    │       │   │   │   ├── olimex_stm32_h405.cfg
    │       │   │   │   ├── olimex_stm32_p107.cfg
    │       │   │   │   ├── omap2420_h4.cfg
    │       │   │   │   ├── openrd.cfg
    │       │   │   │   ├── or1k_generic.cfg
    │       │   │   │   ├── osk5912.cfg
    │       │   │   │   ├── phone_se_j100i.cfg
    │       │   │   │   ├── phytec_lpc3250.cfg
    │       │   │   │   ├── pic-p32mx.cfg
    │       │   │   │   ├── pico-debug.cfg
    │       │   │   │   ├── pipistrello.cfg
    │       │   │   │   ├── propox_mmnet1001.cfg
    │       │   │   │   ├── pxa255_sst.cfg
    │       │   │   │   ├── quark_d2000_refboard.cfg
    │       │   │   │   ├── quark_x10xx_board.cfg
    │       │   │   │   ├── quicklogic_quickfeather.cfg
    │       │   │   │   ├── radiona_ulx3s.cfg
    │       │   │   │   ├── redbee.cfg
    │       │   │   │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │       │   │   │   ├── renesas_dk-s7g2.cfg
    │       │   │   │   ├── renesas_falcon.cfg
    │       │   │   │   ├── renesas_gr_peach.cfg
    │       │   │   │   ├── renesas_porter.cfg
    │       │   │   │   ├── renesas_salvator-xs.cfg
    │       │   │   │   ├── renesas_silk.cfg
    │       │   │   │   ├── renesas_stout.cfg
    │       │   │   │   ├── rigado_bmd300_ek.cfg
    │       │   │   │   ├── rpi3.cfg
    │       │   │   │   ├── rpi4b.cfg
    │       │   │   │   ├── rsc-w910.cfg
    │       │   │   │   ├── sayma_amc.cfg
    │       │   │   │   ├── sheevaplug.cfg
    │       │   │   │   ├── sifive-e31arty.cfg
    │       │   │   │   ├── sifive-e51arty.cfg
    │       │   │   │   ├── sifive-hifive1-revb.cfg
    │       │   │   │   ├── sifive-hifive1.cfg
    │       │   │   │   ├── smdk6410.cfg
    │       │   │   │   ├── snps_em_sk.cfg
    │       │   │   │   ├── snps_em_sk_v1.cfg
    │       │   │   │   ├── snps_em_sk_v2.1.cfg
    │       │   │   │   ├── snps_em_sk_v2.2.cfg
    │       │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │       │   │   │   ├── spansion_sk-fm4-u120-9b560.cfg
    │       │   │   │   ├── spear300evb.cfg
    │       │   │   │   ├── spear300evb_mod.cfg
    │       │   │   │   ├── spear310evb20.cfg
    │       │   │   │   ├── spear310evb20_mod.cfg
    │       │   │   │   ├── spear320cpu.cfg
    │       │   │   │   ├── spear320cpu_mod.cfg
    │       │   │   │   ├── st_b-l475e-iot01a.cfg
    │       │   │   │   ├── st_nucleo_8l152r8.cfg
    │       │   │   │   ├── st_nucleo_8s208rb.cfg
    │       │   │   │   ├── st_nucleo_f0.cfg
    │       │   │   │   ├── st_nucleo_f103rb.cfg
    │       │   │   │   ├── st_nucleo_f3.cfg
    │       │   │   │   ├── st_nucleo_f4.cfg
    │       │   │   │   ├── st_nucleo_f7.cfg
    │       │   │   │   ├── st_nucleo_g0.cfg
    │       │   │   │   ├── st_nucleo_g4.cfg
    │       │   │   │   ├── st_nucleo_h743zi.cfg
    │       │   │   │   ├── st_nucleo_h745zi.cfg
    │       │   │   │   ├── st_nucleo_l073rz.cfg
    │       │   │   │   ├── st_nucleo_l1.cfg
    │       │   │   │   ├── st_nucleo_l4.cfg
    │       │   │   │   ├── st_nucleo_l5.cfg
    │       │   │   │   ├── st_nucleo_wb55.cfg
    │       │   │   │   ├── steval-idb007v1.cfg
    │       │   │   │   ├── steval-idb008v1.cfg
    │       │   │   │   ├── steval-idb011v1.cfg
    │       │   │   │   ├── steval-idb012v1.cfg
    │       │   │   │   ├── steval_pcc010.cfg
    │       │   │   │   ├── stm320518_eval.cfg
    │       │   │   │   ├── stm320518_eval_stlink.cfg
    │       │   │   │   ├── stm32100b_eval.cfg
    │       │   │   │   ├── stm3210b_eval.cfg
    │       │   │   │   ├── stm3210c_eval.cfg
    │       │   │   │   ├── stm3210e_eval.cfg
    │       │   │   │   ├── stm3220g_eval.cfg
    │       │   │   │   ├── stm3220g_eval_stlink.cfg
    │       │   │   │   ├── stm3241g_eval.cfg
    │       │   │   │   ├── stm3241g_eval_stlink.cfg
    │       │   │   │   ├── stm32429i_eval.cfg
    │       │   │   │   ├── stm32429i_eval_stlink.cfg
    │       │   │   │   ├── stm32439i_eval.cfg
    │       │   │   │   ├── stm32439i_eval_stlink.cfg
    │       │   │   │   ├── stm327x6g_eval.cfg
    │       │   │   │   ├── stm32f0discovery.cfg
    │       │   │   │   ├── stm32f103c8_blue_pill.cfg
    │       │   │   │   ├── stm32f334discovery.cfg
    │       │   │   │   ├── stm32f3discovery.cfg
    │       │   │   │   ├── stm32f412g-disco.cfg
    │       │   │   │   ├── stm32f413h-disco.cfg
    │       │   │   │   ├── stm32f429disc1.cfg
    │       │   │   │   ├── stm32f429discovery.cfg
    │       │   │   │   ├── stm32f469discovery.cfg
    │       │   │   │   ├── stm32f469i-disco.cfg
    │       │   │   │   ├── stm32f4discovery.cfg
    │       │   │   │   ├── stm32f723e-disco.cfg
    │       │   │   │   ├── stm32f746g-disco.cfg
    │       │   │   │   ├── stm32f769i-disco.cfg
    │       │   │   │   ├── stm32f7discovery.cfg
    │       │   │   │   ├── stm32h735g-disco.cfg
    │       │   │   │   ├── stm32h745i-disco.cfg
    │       │   │   │   ├── stm32h747i-disco.cfg
    │       │   │   │   ├── stm32h750b-disco.cfg
    │       │   │   │   ├── stm32h7b3i-disco.cfg
    │       │   │   │   ├── stm32h7x3i_eval.cfg
    │       │   │   │   ├── stm32h7x_dual_qspi.cfg
    │       │   │   │   ├── stm32l0discovery.cfg
    │       │   │   │   ├── stm32l476g-disco.cfg
    │       │   │   │   ├── stm32l496g-disco.cfg
    │       │   │   │   ├── stm32l4discovery.cfg
    │       │   │   │   ├── stm32l4p5g-disco.cfg
    │       │   │   │   ├── stm32l4r9i-disco.cfg
    │       │   │   │   ├── stm32ldiscovery.cfg
    │       │   │   │   ├── stm32mp13x_dk.cfg
    │       │   │   │   ├── stm32mp15x_dk2.cfg
    │       │   │   │   ├── stm32vldiscovery.cfg
    │       │   │   │   ├── str910-eval.cfg
    │       │   │   │   ├── telo.cfg
    │       │   │   │   ├── ti_am335xevm.cfg
    │       │   │   │   ├── ti_am437x_idk.cfg
    │       │   │   │   ├── ti_am43xx_evm.cfg
    │       │   │   │   ├── ti_am625evm.cfg
    │       │   │   │   ├── ti_am642evm.cfg
    │       │   │   │   ├── ti_am654evm.cfg
    │       │   │   │   ├── ti_beagleboard.cfg
    │       │   │   │   ├── ti_beagleboard_xm.cfg
    │       │   │   │   ├── ti_beaglebone-base.cfg
    │       │   │   │   ├── ti_beaglebone.cfg
    │       │   │   │   ├── ti_beaglebone_black.cfg
    │       │   │   │   ├── ti_blaze.cfg
    │       │   │   │   ├── ti_cc13x0_launchpad.cfg
    │       │   │   │   ├── ti_cc13x2_launchpad.cfg
    │       │   │   │   ├── ti_cc26x0_launchpad.cfg
    │       │   │   │   ├── ti_cc26x2_launchpad.cfg
    │       │   │   │   ├── ti_cc3200_launchxl.cfg
    │       │   │   │   ├── ti_cc3220sf_launchpad.cfg
    │       │   │   │   ├── ti_cc32xx_launchpad.cfg
    │       │   │   │   ├── ti_dk-tm4c129.cfg
    │       │   │   │   ├── ti_ek-tm4c123gxl.cfg
    │       │   │   │   ├── ti_ek-tm4c1294xl.cfg
    │       │   │   │   ├── ti_j7200evm.cfg
    │       │   │   │   ├── ti_j721evm.cfg
    │       │   │   │   ├── ti_j721s2evm.cfg
    │       │   │   │   ├── ti_msp432_launchpad.cfg
    │       │   │   │   ├── ti_pandaboard.cfg
    │       │   │   │   ├── ti_pandaboard_es.cfg
    │       │   │   │   ├── ti_tmdx570ls20susb.cfg
    │       │   │   │   ├── ti_tmdx570ls31usb.cfg
    │       │   │   │   ├── tocoding_poplar.cfg
    │       │   │   │   ├── topas910.cfg
    │       │   │   │   ├── topasa900.cfg
    │       │   │   │   ├── tp-link_tl-mr3020.cfg
    │       │   │   │   ├── tp-link_wdr4300.cfg
    │       │   │   │   ├── twr-k60f120m.cfg
    │       │   │   │   ├── twr-k60n512.cfg
    │       │   │   │   ├── twr-vf65gs10.cfg
    │       │   │   │   ├── twr-vf65gs10_cmsisdap.cfg
    │       │   │   │   ├── tx25_stk5.cfg
    │       │   │   │   ├── tx27_stk5.cfg
    │       │   │   │   ├── unknown_at91sam9260.cfg
    │       │   │   │   ├── uptech_2410.cfg
    │       │   │   │   ├── vd_a53x2_jtag.cfg
    │       │   │   │   ├── vd_m4_jtag.cfg
    │       │   │   │   ├── vd_pulpissimo_jtag.cfg
    │       │   │   │   ├── vd_swerv_jtag.cfg
    │       │   │   │   ├── verdex.cfg
    │       │   │   │   ├── voipac.cfg
    │       │   │   │   ├── voltcraft_dso-3062c.cfg
    │       │   │   │   ├── x300t.cfg
    │       │   │   │   ├── xmc-2go.cfg
    │       │   │   │   ├── xmc1100-boot-kit.cfg
    │       │   │   │   ├── xmc4200-application-kit-actuator.cfg
    │       │   │   │   ├── xmc4300-relax.cfg
    │       │   │   │   ├── xmc4500-application-kit-general.cfg
    │       │   │   │   ├── xmc4500-application-kit-sdram.cfg
    │       │   │   │   ├── xmc4500-relax.cfg
    │       │   │   │   ├── xmc4700-relax.cfg
    │       │   │   │   ├── xmc4800-relax.cfg
    │       │   │   │   └── xmos_xk-xac-xa8_arm.cfg
    │       │   │   ├── chip/
    │       │   │   │   ├── atmel/
    │       │   │   │   │   └── at91/
    │       │   │   │   │       ├── aic.tcl
    │       │   │   │   │       ├── at91_pio.cfg
    │       │   │   │   │       ├── at91_pmc.cfg
    │       │   │   │   │       ├── at91_rstc.cfg
    │       │   │   │   │       ├── at91_wdt.cfg
    │       │   │   │   │       ├── at91sam7x128.tcl
    │       │   │   │   │       ├── at91sam7x256.tcl
    │       │   │   │   │       ├── at91sam9261.cfg
    │       │   │   │   │       ├── at91sam9261_matrix.cfg
    │       │   │   │   │       ├── at91sam9263.cfg
    │       │   │   │   │       ├── at91sam9263_matrix.cfg
    │       │   │   │   │       ├── at91sam9_init.cfg
    │       │   │   │   │       ├── at91sam9_sdramc.cfg
    │       │   │   │   │       ├── at91sam9_smc.cfg
    │       │   │   │   │       ├── hardware.cfg
    │       │   │   │   │       ├── pmc.tcl
    │       │   │   │   │       ├── rtt.tcl
    │       │   │   │   │       ├── sam9_smc.cfg
    │       │   │   │   │       └── usarts.tcl
    │       │   │   │   ├── st/
    │       │   │   │   │   ├── spear/
    │       │   │   │   │   │   ├── quirk_no_srst.tcl
    │       │   │   │   │   │   ├── spear3xx.tcl
    │       │   │   │   │   │   └── spear3xx_ddr.tcl
    │       │   │   │   │   └── stm32/
    │       │   │   │   │       ├── stm32.tcl
    │       │   │   │   │       ├── stm32_rcc.tcl
    │       │   │   │   │       └── stm32_regs.tcl
    │       │   │   │   └── ti/
    │       │   │   │       └── lm3s/
    │       │   │   │           ├── lm3s.tcl
    │       │   │   │           └── lm3s_regs.tcl
    │       │   │   ├── cpld/
    │       │   │   │   ├── altera-5m570z-cpld.cfg
    │       │   │   │   ├── altera-epm240.cfg
    │       │   │   │   ├── jtagspi.cfg
    │       │   │   │   ├── lattice-lc4032ze.cfg
    │       │   │   │   ├── xilinx-xc6s.cfg
    │       │   │   │   ├── xilinx-xc7.cfg
    │       │   │   │   ├── xilinx-xcf-p.cfg
    │       │   │   │   ├── xilinx-xcf-s.cfg
    │       │   │   │   ├── xilinx-xcr3256.cfg
    │       │   │   │   └── xilinx-xcu.cfg
    │       │   │   ├── cpu/
    │       │   │   │   ├── arc/
    │       │   │   │   │   ├── common.tcl
    │       │   │   │   │   ├── em.tcl
    │       │   │   │   │   ├── hs.tcl
    │       │   │   │   │   └── v2.tcl
    │       │   │   │   └── arm/
    │       │   │   │       ├── arm7tdmi.tcl
    │       │   │   │       ├── arm920.tcl
    │       │   │   │       ├── arm946.tcl
    │       │   │   │       ├── arm966.tcl
    │       │   │   │       └── cortex_m3.tcl
    │       │   │   ├── fpga/
    │       │   │   │   ├── altera-10m50.cfg
    │       │   │   │   ├── altera-ep3c10.cfg
    │       │   │   │   ├── altera-ep4ce10.cfg
    │       │   │   │   ├── lattice_ecp5.cfg
    │       │   │   │   ├── xilinx-dna.cfg
    │       │   │   │   └── xilinx-xadc.cfg
    │       │   │   ├── interface/
    │       │   │   │   ├── altera-usb-blaster.cfg
    │       │   │   │   ├── altera-usb-blaster2.cfg
    │       │   │   │   ├── arm-jtag-ew.cfg
    │       │   │   │   ├── at91rm9200.cfg
    │       │   │   │   ├── beaglebone-jtag-native.cfg
    │       │   │   │   ├── beaglebone-swd-native.cfg
    │       │   │   │   ├── buspirate.cfg
    │       │   │   │   ├── calao-usb-a9260.cfg
    │       │   │   │   ├── chameleon.cfg
    │       │   │   │   ├── cmsis-dap.cfg
    │       │   │   │   ├── dln-2-gpiod.cfg
    │       │   │   │   ├── dummy.cfg
    │       │   │   │   ├── estick.cfg
    │       │   │   │   ├── flashlink.cfg
    │       │   │   │   ├── ft232r/
    │       │   │   │   │   └── radiona_ulx3s.cfg
    │       │   │   │   ├── ft232r.cfg
    │       │   │   │   ├── ftdi/
    │       │   │   │   │   ├── 100ask-openjtag.cfg
    │       │   │   │   │   ├── ashling-opella-ld-jtag.cfg
    │       │   │   │   │   ├── ashling-opella-ld-swd.cfg
    │       │   │   │   │   ├── axm0432.cfg
    │       │   │   │   │   ├── c232hm.cfg
    │       │   │   │   │   ├── calao-usb-a9260-c01.cfg
    │       │   │   │   │   ├── calao-usb-a9260-c02.cfg
    │       │   │   │   │   ├── cortino.cfg
    │       │   │   │   │   ├── digilent-hs1.cfg
    │       │   │   │   │   ├── digilent-hs2.cfg
    │       │   │   │   │   ├── digilent_jtag_hs3.cfg
    │       │   │   │   │   ├── digilent_jtag_smt2.cfg
    │       │   │   │   │   ├── digilent_jtag_smt2_nc.cfg
    │       │   │   │   │   ├── dlp-usb1232h.cfg
    │       │   │   │   │   ├── dp_busblaster.cfg
    │       │   │   │   │   ├── dp_busblaster_kt-link.cfg
    │       │   │   │   │   ├── esp32s2_kaluga_v1.cfg
    │       │   │   │   │   ├── flossjtag-noeeprom.cfg
    │       │   │   │   │   ├── flossjtag.cfg
    │       │   │   │   │   ├── flyswatter.cfg
    │       │   │   │   │   ├── flyswatter2.cfg
    │       │   │   │   │   ├── ft232h-module-swd.cfg
    │       │   │   │   │   ├── gw16042.cfg
    │       │   │   │   │   ├── hie-jtag.cfg
    │       │   │   │   │   ├── hilscher_nxhx10_etm.cfg
    │       │   │   │   │   ├── hilscher_nxhx500_etm.cfg
    │       │   │   │   │   ├── hilscher_nxhx500_re.cfg
    │       │   │   │   │   ├── hilscher_nxhx50_etm.cfg
    │       │   │   │   │   ├── hilscher_nxhx50_re.cfg
    │       │   │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   │   ├── icebear.cfg
    │       │   │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   │   ├── incircuit-icprog.cfg
    │       │   │   │   │   ├── iotlab-usb.cfg
    │       │   │   │   │   ├── isodebug.cfg
    │       │   │   │   │   ├── jtag-lock-pick_tiny_2.cfg
    │       │   │   │   │   ├── jtagkey.cfg
    │       │   │   │   │   ├── jtagkey2.cfg
    │       │   │   │   │   ├── jtagkey2p.cfg
    │       │   │   │   │   ├── kt-link.cfg
    │       │   │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   │   ├── lisa-l.cfg
    │       │   │   │   │   ├── luminary-icdi.cfg
    │       │   │   │   │   ├── luminary-lm3s811.cfg
    │       │   │   │   │   ├── luminary.cfg
    │       │   │   │   │   ├── m53evk.cfg
    │       │   │   │   │   ├── mbftdi.cfg
    │       │   │   │   │   ├── minimodule-swd.cfg
    │       │   │   │   │   ├── minimodule.cfg
    │       │   │   │   │   ├── minispartan6.cfg
    │       │   │   │   │   ├── miniwiggler.cfg
    │       │   │   │   │   ├── neodb.cfg
    │       │   │   │   │   ├── ngxtech.cfg
    │       │   │   │   │   ├── olimex-arm-jtag-swd.cfg
    │       │   │   │   │   ├── olimex-arm-usb-ocd-h.cfg
    │       │   │   │   │   ├── olimex-arm-usb-ocd.cfg
    │       │   │   │   │   ├── olimex-arm-usb-tiny-h.cfg
    │       │   │   │   │   ├── olimex-jtag-tiny.cfg
    │       │   │   │   │   ├── oocdlink.cfg
    │       │   │   │   │   ├── opendous_ftdi.cfg
    │       │   │   │   │   ├── openocd-usb-hs.cfg
    │       │   │   │   │   ├── openocd-usb.cfg
    │       │   │   │   │   ├── openrd.cfg
    │       │   │   │   │   ├── pipistrello.cfg
    │       │   │   │   │   ├── pls_spc5.cfg
    │       │   │   │   │   ├── redbee-econotag.cfg
    │       │   │   │   │   ├── redbee-usb.cfg
    │       │   │   │   │   ├── rowley-cc-arm-swd.cfg
    │       │   │   │   │   ├── sheevaplug.cfg
    │       │   │   │   │   ├── signalyzer-lite.cfg
    │       │   │   │   │   ├── signalyzer.cfg
    │       │   │   │   │   ├── snps_sdp.cfg
    │       │   │   │   │   ├── steppenprobe.cfg
    │       │   │   │   │   ├── stm32-stick.cfg
    │       │   │   │   │   ├── swd-resistor-hack.cfg
    │       │   │   │   │   ├── ti-icdi.cfg
    │       │   │   │   │   ├── tigard.cfg
    │       │   │   │   │   ├── tumpa-lite.cfg
    │       │   │   │   │   ├── tumpa.cfg
    │       │   │   │   │   ├── turtelizer2-revB.cfg
    │       │   │   │   │   ├── turtelizer2-revC.cfg
    │       │   │   │   │   ├── um232h.cfg
    │       │   │   │   │   ├── vpaclink.cfg
    │       │   │   │   │   ├── xds100v2.cfg
    │       │   │   │   │   └── xds100v3.cfg
    │       │   │   │   ├── imx-native.cfg
    │       │   │   │   ├── jlink.cfg
    │       │   │   │   ├── jtag_dpi.cfg
    │       │   │   │   ├── jtag_hat_rpi2.cfg
    │       │   │   │   ├── jtag_vpi.cfg
    │       │   │   │   ├── kitprog.cfg
    │       │   │   │   ├── nds32-aice.cfg
    │       │   │   │   ├── nulink.cfg
    │       │   │   │   ├── opendous.cfg
    │       │   │   │   ├── openjtag.cfg
    │       │   │   │   ├── osbdm.cfg
    │       │   │   │   ├── parport.cfg
    │       │   │   │   ├── parport_dlc5.cfg
    │       │   │   │   ├── raspberrypi-native.cfg
    │       │   │   │   ├── raspberrypi2-native.cfg
    │       │   │   │   ├── rlink.cfg
    │       │   │   │   ├── rshim.cfg
    │       │   │   │   ├── stlink-dap.cfg
    │       │   │   │   ├── stlink-v1.cfg
    │       │   │   │   ├── stlink-v2-1.cfg
    │       │   │   │   ├── stlink-v2.cfg
    │       │   │   │   ├── stlink.cfg
    │       │   │   │   ├── sysfsgpio-raspberrypi.cfg
    │       │   │   │   ├── ti-icdi.cfg
    │       │   │   │   ├── ulink.cfg
    │       │   │   │   ├── usb-jtag.cfg
    │       │   │   │   ├── usbprog.cfg
    │       │   │   │   ├── vdebug.cfg
    │       │   │   │   ├── vsllink.cfg
    │       │   │   │   └── xds110.cfg
    │       │   │   ├── mem_helper.tcl
    │       │   │   ├── memory.tcl
    │       │   │   ├── mmr_helpers.tcl
    │       │   │   ├── target/
    │       │   │   │   ├── 1986ве1т.cfg
    │       │   │   │   ├── adsp-sc58x.cfg
    │       │   │   │   ├── aduc702x.cfg
    │       │   │   │   ├── aducm360.cfg
    │       │   │   │   ├── allwinner_v3s.cfg
    │       │   │   │   ├── alphascale_asm9260t.cfg
    │       │   │   │   ├── altera_fpgasoc.cfg
    │       │   │   │   ├── altera_fpgasoc_arria10.cfg
    │       │   │   │   ├── am335x.cfg
    │       │   │   │   ├── am437x.cfg
    │       │   │   │   ├── amdm37x.cfg
    │       │   │   │   ├── ampere_emag.cfg
    │       │   │   │   ├── ar71xx.cfg
    │       │   │   │   ├── arm_corelink_sse200.cfg
    │       │   │   │   ├── armada370.cfg
    │       │   │   │   ├── at32ap7000.cfg
    │       │   │   │   ├── at91r40008.cfg
    │       │   │   │   ├── at91rm9200.cfg
    │       │   │   │   ├── at91sam3XXX.cfg
    │       │   │   │   ├── at91sam3ax_4x.cfg
    │       │   │   │   ├── at91sam3ax_8x.cfg
    │       │   │   │   ├── at91sam3ax_xx.cfg
    │       │   │   │   ├── at91sam3nXX.cfg
    │       │   │   │   ├── at91sam3sXX.cfg
    │       │   │   │   ├── at91sam3u1c.cfg
    │       │   │   │   ├── at91sam3u1e.cfg
    │       │   │   │   ├── at91sam3u2c.cfg
    │       │   │   │   ├── at91sam3u2e.cfg
    │       │   │   │   ├── at91sam3u4c.cfg
    │       │   │   │   ├── at91sam3u4e.cfg
    │       │   │   │   ├── at91sam3uxx.cfg
    │       │   │   │   ├── at91sam4XXX.cfg
    │       │   │   │   ├── at91sam4c32x.cfg
    │       │   │   │   ├── at91sam4cXXX.cfg
    │       │   │   │   ├── at91sam4lXX.cfg
    │       │   │   │   ├── at91sam4sXX.cfg
    │       │   │   │   ├── at91sam4sd32x.cfg
    │       │   │   │   ├── at91sam7a2.cfg
    │       │   │   │   ├── at91sam7se512.cfg
    │       │   │   │   ├── at91sam7sx.cfg
    │       │   │   │   ├── at91sam7x256.cfg
    │       │   │   │   ├── at91sam7x512.cfg
    │       │   │   │   ├── at91sam9.cfg
    │       │   │   │   ├── at91sam9260.cfg
    │       │   │   │   ├── at91sam9260_ext_RAM_ext_flash.cfg
    │       │   │   │   ├── at91sam9261.cfg
    │       │   │   │   ├── at91sam9263.cfg
    │       │   │   │   ├── at91sam9g10.cfg
    │       │   │   │   ├── at91sam9g20.cfg
    │       │   │   │   ├── at91sam9g45.cfg
    │       │   │   │   ├── at91sam9rl.cfg
    │       │   │   │   ├── at91sama5d2.cfg
    │       │   │   │   ├── at91samdXX.cfg
    │       │   │   │   ├── at91samg5x.cfg
    │       │   │   │   ├── atheros_ar2313.cfg
    │       │   │   │   ├── atheros_ar2315.cfg
    │       │   │   │   ├── atheros_ar9331.cfg
    │       │   │   │   ├── atheros_ar9344.cfg
    │       │   │   │   ├── atmega128.cfg
    │       │   │   │   ├── atmega128rfa1.cfg
    │       │   │   │   ├── atsame5x.cfg
    │       │   │   │   ├── atsaml1x.cfg
    │       │   │   │   ├── atsamv.cfg
    │       │   │   │   ├── avr32.cfg
    │       │   │   │   ├── bcm2711.cfg
    │       │   │   │   ├── bcm281xx.cfg
    │       │   │   │   ├── bcm2835.cfg
    │       │   │   │   ├── bcm2836.cfg
    │       │   │   │   ├── bcm2837.cfg
    │       │   │   │   ├── bcm4706.cfg
    │       │   │   │   ├── bcm4718.cfg
    │       │   │   │   ├── bcm47xx.cfg
    │       │   │   │   ├── bcm5352e.cfg
    │       │   │   │   ├── bcm6348.cfg
    │       │   │   │   ├── bluefield.cfg
    │       │   │   │   ├── bluenrg-x.cfg
    │       │   │   │   ├── c100.cfg
    │       │   │   │   ├── c100config.tcl
    │       │   │   │   ├── c100helper.tcl
    │       │   │   │   ├── c100regs.tcl
    │       │   │   │   ├── cc2538.cfg
    │       │   │   │   ├── cs351x.cfg
    │       │   │   │   ├── davinci.cfg
    │       │   │   │   ├── dragonite.cfg
    │       │   │   │   ├── dsp56321.cfg
    │       │   │   │   ├── dsp568013.cfg
    │       │   │   │   ├── dsp568037.cfg
    │       │   │   │   ├── efm32.cfg
    │       │   │   │   ├── em357.cfg
    │       │   │   │   ├── em358.cfg
    │       │   │   │   ├── eos_s3.cfg
    │       │   │   │   ├── epc9301.cfg
    │       │   │   │   ├── esi32xx.cfg
    │       │   │   │   ├── esp32s2.cfg
    │       │   │   │   ├── exynos5250.cfg
    │       │   │   │   ├── faux.cfg
    │       │   │   │   ├── feroceon.cfg
    │       │   │   │   ├── fm3.cfg
    │       │   │   │   ├── fm4.cfg
    │       │   │   │   ├── fm4_mb9bf.cfg
    │       │   │   │   ├── fm4_s6e2cc.cfg
    │       │   │   │   ├── gd32e23x.cfg
    │       │   │   │   ├── gd32vf103.cfg
    │       │   │   │   ├── gp326xxxa.cfg
    │       │   │   │   ├── hi3798.cfg
    │       │   │   │   ├── hi6220.cfg
    │       │   │   │   ├── hilscher_netx10.cfg
    │       │   │   │   ├── hilscher_netx50.cfg
    │       │   │   │   ├── hilscher_netx500.cfg
    │       │   │   │   ├── icepick.cfg
    │       │   │   │   ├── imx.cfg
    │       │   │   │   ├── imx21.cfg
    │       │   │   │   ├── imx25.cfg
    │       │   │   │   ├── imx27.cfg
    │       │   │   │   ├── imx28.cfg
    │       │   │   │   ├── imx31.cfg
    │       │   │   │   ├── imx35.cfg
    │       │   │   │   ├── imx51.cfg
    │       │   │   │   ├── imx53.cfg
    │       │   │   │   ├── imx6.cfg
    │       │   │   │   ├── imx6sx.cfg
    │       │   │   │   ├── imx6ul.cfg
    │       │   │   │   ├── imx7.cfg
    │       │   │   │   ├── imx7ulp.cfg
    │       │   │   │   ├── imx8m.cfg
    │       │   │   │   ├── imx8qm.cfg
    │       │   │   │   ├── infineon/
    │       │   │   │   │   └── tle987x.cfg
    │       │   │   │   ├── is5114.cfg
    │       │   │   │   ├── ixp42x.cfg
    │       │   │   │   ├── k1921vk01t.cfg
    │       │   │   │   ├── k40.cfg
    │       │   │   │   ├── k60.cfg
    │       │   │   │   ├── ke0x.cfg
    │       │   │   │   ├── ke1xf.cfg
    │       │   │   │   ├── ke1xz.cfg
    │       │   │   │   ├── kl25.cfg
    │       │   │   │   ├── kl46.cfg
    │       │   │   │   ├── klx.cfg
    │       │   │   │   ├── ks869x.cfg
    │       │   │   │   ├── kx.cfg
    │       │   │   │   ├── lpc11xx.cfg
    │       │   │   │   ├── lpc12xx.cfg
    │       │   │   │   ├── lpc13xx.cfg
    │       │   │   │   ├── lpc17xx.cfg
    │       │   │   │   ├── lpc1850.cfg
    │       │   │   │   ├── lpc1xxx.cfg
    │       │   │   │   ├── lpc2103.cfg
    │       │   │   │   ├── lpc2124.cfg
    │       │   │   │   ├── lpc2129.cfg
    │       │   │   │   ├── lpc2148.cfg
    │       │   │   │   ├── lpc2294.cfg
    │       │   │   │   ├── lpc2378.cfg
    │       │   │   │   ├── lpc2460.cfg
    │       │   │   │   ├── lpc2478.cfg
    │       │   │   │   ├── lpc2900.cfg
    │       │   │   │   ├── lpc2xxx.cfg
    │       │   │   │   ├── lpc3131.cfg
    │       │   │   │   ├── lpc3250.cfg
    │       │   │   │   ├── lpc40xx.cfg
    │       │   │   │   ├── lpc4350.cfg
    │       │   │   │   ├── lpc4357.cfg
    │       │   │   │   ├── lpc4370.cfg
    │       │   │   │   ├── lpc84x.cfg
    │       │   │   │   ├── lpc8nxx.cfg
    │       │   │   │   ├── lpc8xx.cfg
    │       │   │   │   ├── ls1012a.cfg
    │       │   │   │   ├── ls1028a.cfg
    │       │   │   │   ├── ls1046a.cfg
    │       │   │   │   ├── ls1088a.cfg
    │       │   │   │   ├── lsch3_common.cfg
    │       │   │   │   ├── marvell/
    │       │   │   │   │   ├── 88f3710.cfg
    │       │   │   │   │   ├── 88f3720.cfg
    │       │   │   │   │   └── 88f37x0.cfg
    │       │   │   │   ├── max32620.cfg
    │       │   │   │   ├── max32625.cfg
    │       │   │   │   ├── max3263x.cfg
    │       │   │   │   ├── mc13224v.cfg
    │       │   │   │   ├── mdr32f9q2i.cfg
    │       │   │   │   ├── nds32v2.cfg
    │       │   │   │   ├── nds32v3.cfg
    │       │   │   │   ├── nds32v3m.cfg
    │       │   │   │   ├── nds32v5.cfg
    │       │   │   │   ├── nhs31xx.cfg
    │       │   │   │   ├── npcx.cfg
    │       │   │   │   ├── nrf51.cfg
    │       │   │   │   ├── nrf52.cfg
    │       │   │   │   ├── nuc910.cfg
    │       │   │   │   ├── numicro.cfg
    │       │   │   │   ├── omap2420.cfg
    │       │   │   │   ├── omap3530.cfg
    │       │   │   │   ├── omap4430.cfg
    │       │   │   │   ├── omap4460.cfg
    │       │   │   │   ├── omap5912.cfg
    │       │   │   │   ├── omapl138.cfg
    │       │   │   │   ├── or1k.cfg
    │       │   │   │   ├── pic32mx.cfg
    │       │   │   │   ├── psoc4.cfg
    │       │   │   │   ├── psoc5lp.cfg
    │       │   │   │   ├── psoc6.cfg
    │       │   │   │   ├── pxa255.cfg
    │       │   │   │   ├── pxa270.cfg
    │       │   │   │   ├── pxa3xx.cfg
    │       │   │   │   ├── qualcomm_qca4531.cfg
    │       │   │   │   ├── quark_d20xx.cfg
    │       │   │   │   ├── quark_x10xx.cfg
    │       │   │   │   ├── readme.txt
    │       │   │   │   ├── renesas_r7s72100.cfg
    │       │   │   │   ├── renesas_rcar_gen2.cfg
    │       │   │   │   ├── renesas_rcar_gen3.cfg
    │       │   │   │   ├── renesas_rcar_reset_common.cfg
    │       │   │   │   ├── renesas_rz_five.cfg
    │       │   │   │   ├── renesas_rz_g2.cfg
    │       │   │   │   ├── renesas_s7g2.cfg
    │       │   │   │   ├── rk3308.cfg
    │       │   │   │   ├── rk3399.cfg
    │       │   │   │   ├── rp2040-core0.cfg
    │       │   │   │   ├── samsung_s3c2410.cfg
    │       │   │   │   ├── samsung_s3c2440.cfg
    │       │   │   │   ├── samsung_s3c2450.cfg
    │       │   │   │   ├── samsung_s3c4510.cfg
    │       │   │   │   ├── samsung_s3c6410.cfg
    │       │   │   │   ├── sharp_lh79532.cfg
    │       │   │   │   ├── sim3x.cfg
    │       │   │   │   ├── smp8634.cfg
    │       │   │   │   ├── snps_em_sk_fpga.cfg
    │       │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   ├── spear3xx.cfg
    │       │   │   │   ├── stellaris.cfg
    │       │   │   │   ├── stm32f0x.cfg
    │       │   │   │   ├── stm32f1x.cfg
    │       │   │   │   ├── stm32f2x.cfg
    │       │   │   │   ├── stm32f3x.cfg
    │       │   │   │   ├── stm32f4x.cfg
    │       │   │   │   ├── stm32f7x.cfg
    │       │   │   │   ├── stm32g0x.cfg
    │       │   │   │   ├── stm32g4x.cfg
    │       │   │   │   ├── stm32h7x.cfg
    │       │   │   │   ├── stm32h7x_dual_bank.cfg
    │       │   │   │   ├── stm32l0.cfg
    │       │   │   │   ├── stm32l0_dual_bank.cfg
    │       │   │   │   ├── stm32l1.cfg
    │       │   │   │   ├── stm32l1x_dual_bank.cfg
    │       │   │   │   ├── stm32l4x.cfg
    │       │   │   │   ├── stm32l5x.cfg
    │       │   │   │   ├── stm32mp13x.cfg
    │       │   │   │   ├── stm32mp15x.cfg
    │       │   │   │   ├── stm32u5x.cfg
    │       │   │   │   ├── stm32w108xx.cfg
    │       │   │   │   ├── stm32wbx.cfg
    │       │   │   │   ├── stm32wlx.cfg
    │       │   │   │   ├── stm32x5x_common.cfg
    │       │   │   │   ├── stm32xl.cfg
    │       │   │   │   ├── stm8l.cfg
    │       │   │   │   ├── stm8l152.cfg
    │       │   │   │   ├── stm8s.cfg
    │       │   │   │   ├── stm8s003.cfg
    │       │   │   │   ├── stm8s103.cfg
    │       │   │   │   ├── stm8s105.cfg
    │       │   │   │   ├── str710.cfg
    │       │   │   │   ├── str730.cfg
    │       │   │   │   ├── str750.cfg
    │       │   │   │   ├── str912.cfg
    │       │   │   │   ├── swj-dp.tcl
    │       │   │   │   ├── swm050.cfg
    │       │   │   │   ├── test_reset_syntax_error.cfg
    │       │   │   │   ├── test_syntax_error.cfg
    │       │   │   │   ├── ti-ar7.cfg
    │       │   │   │   ├── ti-cjtag.cfg
    │       │   │   │   ├── ti_calypso.cfg
    │       │   │   │   ├── ti_cc13x0.cfg
    │       │   │   │   ├── ti_cc13x2.cfg
    │       │   │   │   ├── ti_cc26x0.cfg
    │       │   │   │   ├── ti_cc26x2.cfg
    │       │   │   │   ├── ti_cc3220sf.cfg
    │       │   │   │   ├── ti_cc32xx.cfg
    │       │   │   │   ├── ti_dm355.cfg
    │       │   │   │   ├── ti_dm365.cfg
    │       │   │   │   ├── ti_dm6446.cfg
    │       │   │   │   ├── ti_k3.cfg
    │       │   │   │   ├── ti_msp432.cfg
    │       │   │   │   ├── ti_rm4x.cfg
    │       │   │   │   ├── ti_tms570.cfg
    │       │   │   │   ├── ti_tms570ls20xxx.cfg
    │       │   │   │   ├── ti_tms570ls3137.cfg
    │       │   │   │   ├── tmpa900.cfg
    │       │   │   │   ├── tmpa910.cfg
    │       │   │   │   ├── tnetc4401.cfg
    │       │   │   │   ├── u8500.cfg
    │       │   │   │   ├── vd_aarch64.cfg
    │       │   │   │   ├── vd_cortex_m.cfg
    │       │   │   │   ├── vd_riscv.cfg
    │       │   │   │   ├── vybrid_vf6xx.cfg
    │       │   │   │   ├── xilinx_zynqmp.cfg
    │       │   │   │   ├── xmc1xxx.cfg
    │       │   │   │   ├── xmc4xxx.cfg
    │       │   │   │   ├── xmos_xs1-xau8a-10_arm.cfg
    │       │   │   │   ├── zynq_7000.cfg
    │       │   │   │   └── к1879xб1я.cfg
    │       │   │   ├── test/
    │       │   │   │   ├── selftest.cfg
    │       │   │   │   └── syntax1.cfg
    │       │   │   └── tools/
    │       │   │       ├── firmware-recovery.tcl
    │       │   │       ├── memtest.tcl
    │       │   │       └── test_cpu_speed.tcl
    │       │   └── share/
    │       │       ├── info/
    │       │       │   ├── dir
    │       │       │   ├── openocd.info
    │       │       │   ├── openocd.info-1
    │       │       │   └── openocd.info-2
    │       │       └── man/
    │       │           └── man1/
    │       │               └── openocd.1
    │       └── OpenOCD_SourceCode_CH347/
    │           ├── .checkpatch.conf
    │           ├── .gitignore
    │           ├── .gitmodules
    │           ├── .travis.yml
    │           ├── AUTHORS
    │           ├── AUTHORS.ChangeLog
    │           ├── BUGS
    │           ├── COPYING
    │           ├── ChangeLog
    │           ├── HACKING
    │           ├── LICENSES/
    │           │   ├── exceptions/
    │           │   │   └── eCos-exception-2.0
    │           │   ├── license-rules.txt
    │           │   ├── preferred/
    │           │   │   ├── BSD-1-Clause
    │           │   │   ├── BSD-2-Clause
    │           │   │   ├── BSD-2-Clause-Views
    │           │   │   ├── BSD-3-Clause
    │           │   │   ├── BSD-Source-Code
    │           │   │   ├── GFDL-1.2
    │           │   │   ├── GPL-2.0
    │           │   │   ├── MIT
    │           │   │   └── gfdl-1.2.texi.readme
    │           │   └── stand-alone/
    │           │       └── GPL-3.0
    │           ├── Makefile.am
    │           ├── NEWS
    │           ├── NEWS-0.10.0
    │           ├── NEWS-0.11.0
    │           ├── NEWS-0.12.0
    │           ├── NEWS-0.2.0
    │           ├── NEWS-0.3.0
    │           ├── NEWS-0.4.0
    │           ├── NEWS-0.5.0
    │           ├── NEWS-0.6.0
    │           ├── NEWS-0.7.0
    │           ├── NEWS-0.8.0
    │           ├── NEWS-0.9.0
    │           ├── NEWTAPS
    │           ├── README
    │           ├── README.Windows
    │           ├── README.macOS
    │           ├── TODO
    │           ├── bootstrap
    │           ├── config_subdir.m4
    │           ├── configure.ac
    │           ├── contrib/
    │           │   ├── 60-openocd.rules
    │           │   ├── buildroot/
    │           │   │   └── openocd_be_defconfig
    │           │   ├── coresight-trace.txt
    │           │   ├── cross-build.sh
    │           │   ├── gen-stellaris-part-header.pl
    │           │   ├── itmdump.c
    │           │   ├── libdcc/
    │           │   │   ├── README
    │           │   │   ├── dcc_stdio.c
    │           │   │   ├── dcc_stdio.h
    │           │   │   └── example.c
    │           │   ├── list_example.c
    │           │   ├── loaders/
    │           │   │   ├── README
    │           │   │   ├── checksum/
    │           │   │   │   ├── armv4_5_crc.inc
    │           │   │   │   ├── armv4_5_crc.s
    │           │   │   │   ├── armv7m_crc.inc
    │           │   │   │   ├── armv7m_crc.s
    │           │   │   │   ├── mips32.s
    │           │   │   │   ├── riscv32_crc.inc
    │           │   │   │   ├── riscv64_crc.inc
    │           │   │   │   └── riscv_crc.c
    │           │   │   ├── debug/
    │           │   │   │   └── xscale/
    │           │   │   │       ├── debug_handler.S
    │           │   │   │       ├── debug_handler.inc
    │           │   │   │       ├── debug_handler.ld
    │           │   │   │       └── protocol.h
    │           │   │   ├── erase_check/
    │           │   │   │   ├── armv4_5_erase_check.inc
    │           │   │   │   ├── armv4_5_erase_check.s
    │           │   │   │   ├── armv7m_erase_check.inc
    │           │   │   │   ├── armv7m_erase_check.s
    │           │   │   │   ├── stm8_erase_check.inc
    │           │   │   │   └── stm8_erase_check.s
    │           │   │   ├── flash/
    │           │   │   │   ├── armv4_5_cfi_intel_16.s
    │           │   │   │   ├── armv4_5_cfi_intel_32.s
    │           │   │   │   ├── armv4_5_cfi_intel_8.s
    │           │   │   │   ├── armv4_5_cfi_span_16.s
    │           │   │   │   ├── armv4_5_cfi_span_16_dq7.s
    │           │   │   │   ├── armv4_5_cfi_span_32.s
    │           │   │   │   ├── armv4_5_cfi_span_8.s
    │           │   │   │   ├── armv7m_cfi_span_16.s
    │           │   │   │   ├── armv7m_cfi_span_16_dq7.s
    │           │   │   │   ├── armv7m_io.s
    │           │   │   │   ├── at91sam7x/
    │           │   │   │   │   ├── at91sam7x_ocl_flash.script
    │           │   │   │   │   ├── at91sam7x_ram.ld
    │           │   │   │   │   ├── crt.s
    │           │   │   │   │   ├── dcc.c
    │           │   │   │   │   ├── dcc.h
    │           │   │   │   │   ├── main.c
    │           │   │   │   │   ├── makefile
    │           │   │   │   │   ├── ocl.h
    │           │   │   │   │   ├── platform.h
    │           │   │   │   │   ├── samflash.c
    │           │   │   │   │   ├── samflash.h
    │           │   │   │   │   └── samregs.h
    │           │   │   │   ├── bluenrg-x/
    │           │   │   │   │   ├── bluenrg-x_write.c
    │           │   │   │   │   └── bluenrg-x_write.inc
    │           │   │   │   ├── cc26xx/
    │           │   │   │   │   ├── cc26x0/
    │           │   │   │   │   │   └── cc26x0r2f.lds
    │           │   │   │   │   ├── cc26x0_algo.inc
    │           │   │   │   │   ├── cc26x2/
    │           │   │   │   │   │   └── cc26x2r1f.lds
    │           │   │   │   │   ├── cc26x2_algo.inc
    │           │   │   │   │   ├── flash.c
    │           │   │   │   │   ├── flash.h
    │           │   │   │   │   ├── flashloader.c
    │           │   │   │   │   ├── flashloader.h
    │           │   │   │   │   ├── hw_regs.h
    │           │   │   │   │   ├── main.c
    │           │   │   │   │   └── startup.c
    │           │   │   │   ├── cc3220sf/
    │           │   │   │   │   ├── cc3220sf.inc
    │           │   │   │   │   └── cc3220sf.s
    │           │   │   │   ├── cortex-m0.S
    │           │   │   │   ├── efm32.S
    │           │   │   │   ├── fespi/
    │           │   │   │   │   ├── riscv.lds
    │           │   │   │   │   ├── riscv32_fespi.inc
    │           │   │   │   │   ├── riscv64_fespi.inc
    │           │   │   │   │   ├── riscv_fespi.c
    │           │   │   │   │   └── riscv_wrapper.S
    │           │   │   │   ├── fm4/
    │           │   │   │   │   ├── erase.S
    │           │   │   │   │   ├── erase.inc
    │           │   │   │   │   ├── fm4.h
    │           │   │   │   │   ├── write.S
    │           │   │   │   │   └── write.inc
    │           │   │   │   ├── fpga/
    │           │   │   │   │   └── xilinx_bscan_spi.py
    │           │   │   │   ├── gd32vf103/
    │           │   │   │   │   ├── gd32vf103.c
    │           │   │   │   │   └── gd32vf103.inc
    │           │   │   │   ├── k1921vk01t.S
    │           │   │   │   ├── kinetis/
    │           │   │   │   │   ├── kinetis_flash.inc
    │           │   │   │   │   └── kinetis_flash.s
    │           │   │   │   ├── kinetis_ke/
    │           │   │   │   │   ├── kinetis_ke_flash.inc
    │           │   │   │   │   ├── kinetis_ke_flash.s
    │           │   │   │   │   ├── kinetis_ke_watchdog.inc
    │           │   │   │   │   └── kinetis_ke_watchdog.s
    │           │   │   │   ├── lpcspifi_erase.S
    │           │   │   │   ├── lpcspifi_init.S
    │           │   │   │   ├── lpcspifi_write.S
    │           │   │   │   ├── max32xxx/
    │           │   │   │   │   ├── max32xxx.inc
    │           │   │   │   │   └── max32xxx.s
    │           │   │   │   ├── mdr32fx.S
    │           │   │   │   ├── mrvlqspi_write.S
    │           │   │   │   ├── msp432/
    │           │   │   │   │   ├── MSP432E4_FlashLibIf.h
    │           │   │   │   │   ├── MSP432P4_FlashLibIf.h
    │           │   │   │   │   ├── driverlib.c
    │           │   │   │   │   ├── driverlib.h
    │           │   │   │   │   ├── main_msp432e4x.c
    │           │   │   │   │   ├── main_msp432p401x.c
    │           │   │   │   │   ├── main_msp432p411x.c
    │           │   │   │   │   ├── msp432e4x/
    │           │   │   │   │   │   └── msp432e4x.lds
    │           │   │   │   │   ├── msp432e4x.h
    │           │   │   │   │   ├── msp432e4x_algo.inc
    │           │   │   │   │   ├── msp432p401x/
    │           │   │   │   │   │   └── msp432p401x.lds
    │           │   │   │   │   ├── msp432p401x.h
    │           │   │   │   │   ├── msp432p401x_algo.inc
    │           │   │   │   │   ├── msp432p411x/
    │           │   │   │   │   │   └── msp432p411x.lds
    │           │   │   │   │   ├── msp432p411x.h
    │           │   │   │   │   ├── msp432p411x_algo.inc
    │           │   │   │   │   ├── startup_msp432e4.c
    │           │   │   │   │   └── startup_msp432p4.c
    │           │   │   │   ├── npcx/
    │           │   │   │   │   ├── npcx_algo.inc
    │           │   │   │   │   ├── npcx_flash.c
    │           │   │   │   │   ├── npcx_flash.h
    │           │   │   │   │   ├── npcx_flash.lds
    │           │   │   │   │   └── npcx_flash_config.h
    │           │   │   │   ├── nrf5/
    │           │   │   │   │   ├── nrf5.S
    │           │   │   │   │   └── nrf5.inc
    │           │   │   │   ├── numicro/
    │           │   │   │   │   ├── numicro_m0.S
    │           │   │   │   │   ├── numicro_m0.inc
    │           │   │   │   │   ├── numicro_m4.S
    │           │   │   │   │   └── numicro_m4.inc
    │           │   │   │   ├── pic32mx.s
    │           │   │   │   ├── rsl10/
    │           │   │   │   │   ├── rom_launcher.S
    │           │   │   │   │   └── rom_launcher.inc
    │           │   │   │   ├── sh_qspi/
    │           │   │   │   │   ├── sh_qspi.S
    │           │   │   │   │   ├── sh_qspi.inc
    │           │   │   │   │   └── sh_qspi.ld
    │           │   │   │   ├── sim3x.s
    │           │   │   │   ├── stellaris.s
    │           │   │   │   ├── stm32/
    │           │   │   │   │   ├── stm32f1x.S
    │           │   │   │   │   ├── stm32f1x.inc
    │           │   │   │   │   ├── stm32f2x.S
    │           │   │   │   │   ├── stm32f2x.inc
    │           │   │   │   │   ├── stm32h7x.S
    │           │   │   │   │   ├── stm32h7x.inc
    │           │   │   │   │   ├── stm32l4x.c
    │           │   │   │   │   ├── stm32l4x.inc
    │           │   │   │   │   ├── stm32lx.S
    │           │   │   │   │   └── stm32lx.inc
    │           │   │   │   ├── stmqspi/
    │           │   │   │   │   ├── gpio_conf_stm32.pl
    │           │   │   │   │   ├── stmoctospi_crc32.S
    │           │   │   │   │   ├── stmoctospi_crc32.inc
    │           │   │   │   │   ├── stmoctospi_erase_check.S
    │           │   │   │   │   ├── stmoctospi_erase_check.inc
    │           │   │   │   │   ├── stmoctospi_read.S
    │           │   │   │   │   ├── stmoctospi_read.inc
    │           │   │   │   │   ├── stmoctospi_write.S
    │           │   │   │   │   ├── stmoctospi_write.inc
    │           │   │   │   │   ├── stmqspi_crc32.S
    │           │   │   │   │   ├── stmqspi_crc32.inc
    │           │   │   │   │   ├── stmqspi_erase_check.S
    │           │   │   │   │   ├── stmqspi_erase_check.inc
    │           │   │   │   │   ├── stmqspi_read.S
    │           │   │   │   │   ├── stmqspi_read.inc
    │           │   │   │   │   ├── stmqspi_write.S
    │           │   │   │   │   └── stmqspi_write.inc
    │           │   │   │   ├── str7x.s
    │           │   │   │   ├── str9x.s
    │           │   │   │   └── xmc1xxx/
    │           │   │   │       ├── erase.S
    │           │   │   │       ├── erase.inc
    │           │   │   │       ├── erase_check.S
    │           │   │   │       ├── erase_check.inc
    │           │   │   │       ├── write.S
    │           │   │   │       ├── write.inc
    │           │   │   │       └── xmc1xxx.S
    │           │   │   ├── reset/
    │           │   │   │   └── espressif/
    │           │   │   │       ├── common.mk
    │           │   │   │       ├── esp32/
    │           │   │   │       │   ├── cpu_reset_handler_code.inc
    │           │   │   │       │   └── esp32_cpu_reset_handler.S
    │           │   │   │       └── esp32s3/
    │           │   │   │           ├── cpu_reset_handler_code.inc
    │           │   │   │           └── esp32s3_cpu_reset_handler.S
    │           │   │   └── watchdog/
    │           │   │       ├── armv7m_kinetis_wdog.inc
    │           │   │       ├── armv7m_kinetis_wdog.s
    │           │   │       ├── armv7m_kinetis_wdog32.inc
    │           │   │       └── armv7m_kinetis_wdog32.s
    │           │   ├── remote_bitbang/
    │           │   │   └── remote_bitbang_sysfsgpio.c
    │           │   ├── rpc_examples/
    │           │   │   ├── ocd_rpc_example.py
    │           │   │   └── ocdrpc.hs
    │           │   ├── rtos-helpers/
    │           │   │   ├── FreeRTOS-openocd.c
    │           │   │   └── uCOS-III-openocd.c
    │           │   └── xsvf_tools/
    │           │       ├── svf2xsvf.py
    │           │       └── xsvfdump.py
    │           ├── doc/
    │           │   ├── .gitattributes
    │           │   ├── Makefile.am
    │           │   ├── checkpatch.rst
    │           │   ├── fdl.texi
    │           │   ├── manual/
    │           │   │   ├── app.txt
    │           │   │   ├── endianness.txt
    │           │   │   ├── flash.txt
    │           │   │   ├── helper.txt
    │           │   │   ├── jtag/
    │           │   │   │   └── drivers/
    │           │   │   │       └── remote_bitbang.txt
    │           │   │   ├── jtag.txt
    │           │   │   ├── main.txt
    │           │   │   ├── primer/
    │           │   │   │   ├── autotools.txt
    │           │   │   │   ├── commands.txt
    │           │   │   │   ├── docs.txt
    │           │   │   │   ├── jtag.txt
    │           │   │   │   └── tcl.txt
    │           │   │   ├── release.txt
    │           │   │   ├── scripting.txt
    │           │   │   ├── server.txt
    │           │   │   ├── style.txt
    │           │   │   ├── target/
    │           │   │   │   ├── mips.txt
    │           │   │   │   └── notarm.txt
    │           │   │   └── target.txt
    │           │   ├── openocd.1
    │           │   ├── openocd.texi
    │           │   └── usb_adapters/
    │           │       ├── cmsis_dap/
    │           │       │   ├── 04b4_f155_cypress_kitprog3.txt
    │           │       │   ├── 0d28_0204_nxp_daplink.txt
    │           │       │   ├── 1a6a_2000_spansion_sk_fm4.txt
    │           │       │   ├── 2a86_8011_wch_link.txt
    │           │       │   ├── c251_2722_keil_ulink2.txt
    │           │       │   ├── c251_2723_keil_ulink_me.txt
    │           │       │   ├── c251_2750_keil_ulinkplus.txt
    │           │       │   └── c251_f001_jixin.pro.txt
    │           │       ├── dump.sh
    │           │       ├── esp_usb_jtag/
    │           │       │   └── 303a_1001_esp_usb_jtag.txt
    │           │       ├── ft232r/
    │           │       │   └── 0403_6001_ft232r.txt
    │           │       ├── ftdi/
    │           │       │   ├── 0403_6010_ft2232h.txt
    │           │       │   ├── 0403_6014_digilent_hs2.txt
    │           │       │   ├── 0403_cff8_amontec_jtagkey2.txt
    │           │       │   ├── 09fb_6001_altera_blaster.txt
    │           │       │   └── 9e88_9e8f_sheevaplug_jtagkey.txt
    │           │       ├── icdi/
    │           │       │   └── 1cbe_00fd_ti_icdi.txt
    │           │       ├── jlink/
    │           │       │   ├── 1366_0101_segger_jlink.txt
    │           │       │   └── 1366_0101_segger_jlink_plus_10_1.txt
    │           │       ├── kitprog/
    │           │       │   └── 04b4_f139_cypress_kitprog.txt
    │           │       ├── nulink/
    │           │       │   ├── 0416_511d_nuvoton_nulink.txt
    │           │       │   └── 0416_5200_nuvoton_nulink.txt
    │           │       ├── readme.txt
    │           │       ├── stlink/
    │           │       │   ├── 0483_3744_stlinkv1.txt
    │           │       │   ├── 0483_3748_stlinkv2.txt
    │           │       │   ├── 0483_374b_stlinkv2.txt
    │           │       │   ├── 0483_374d_stlinkv3.txt
    │           │       │   ├── 0483_374e_stlinkv3.txt
    │           │       │   ├── 0483_374f_stlinkv3.txt
    │           │       │   ├── 0483_3752_stlinkv2.txt
    │           │       │   ├── 0483_3753_stlinkv3.txt
    │           │       │   ├── 0483_3755_stlinkv3pwr.txt
    │           │       │   └── 0483_3757_stlinkv3pwr.txt
    │           │       └── xds110/
    │           │           └── 0451_0451_ti_xds110.txt
    │           ├── guess-rev.sh
    │           ├── src/
    │           │   ├── Makefile.am
    │           │   ├── flash/
    │           │   │   ├── Makefile.am
    │           │   │   ├── common.c
    │           │   │   ├── common.h
    │           │   │   ├── nand/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── arm_io.c
    │           │   │   │   ├── arm_io.h
    │           │   │   │   ├── at91sam9.c
    │           │   │   │   ├── core.c
    │           │   │   │   ├── core.h
    │           │   │   │   ├── davinci.c
    │           │   │   │   ├── driver.c
    │           │   │   │   ├── driver.h
    │           │   │   │   ├── ecc.c
    │           │   │   │   ├── ecc_kw.c
    │           │   │   │   ├── fileio.c
    │           │   │   │   ├── fileio.h
    │           │   │   │   ├── imp.h
    │           │   │   │   ├── lpc3180.c
    │           │   │   │   ├── lpc3180.h
    │           │   │   │   ├── lpc32xx.c
    │           │   │   │   ├── lpc32xx.h
    │           │   │   │   ├── mx3.c
    │           │   │   │   ├── mx3.h
    │           │   │   │   ├── mxc.c
    │           │   │   │   ├── mxc.h
    │           │   │   │   ├── nonce.c
    │           │   │   │   ├── nuc910.c
    │           │   │   │   ├── nuc910.h
    │           │   │   │   ├── orion.c
    │           │   │   │   ├── s3c2410.c
    │           │   │   │   ├── s3c2412.c
    │           │   │   │   ├── s3c2440.c
    │           │   │   │   ├── s3c2443.c
    │           │   │   │   ├── s3c24xx.c
    │           │   │   │   ├── s3c24xx.h
    │           │   │   │   ├── s3c24xx_regs.h
    │           │   │   │   ├── s3c6400.c
    │           │   │   │   └── tcl.c
    │           │   │   ├── nor/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── aduc702x.c
    │           │   │   │   ├── aducm360.c
    │           │   │   │   ├── ambiqmicro.c
    │           │   │   │   ├── at91sam3.c
    │           │   │   │   ├── at91sam4.c
    │           │   │   │   ├── at91sam4l.c
    │           │   │   │   ├── at91sam7.c
    │           │   │   │   ├── at91samd.c
    │           │   │   │   ├── ath79.c
    │           │   │   │   ├── atsame5.c
    │           │   │   │   ├── atsamv.c
    │           │   │   │   ├── avrf.c
    │           │   │   │   ├── bluenrg-x.c
    │           │   │   │   ├── bluenrg-x.h
    │           │   │   │   ├── cc26xx.c
    │           │   │   │   ├── cc26xx.h
    │           │   │   │   ├── cc3220sf.c
    │           │   │   │   ├── cc3220sf.h
    │           │   │   │   ├── cfi.c
    │           │   │   │   ├── cfi.h
    │           │   │   │   ├── core.c
    │           │   │   │   ├── core.h
    │           │   │   │   ├── driver.h
    │           │   │   │   ├── drivers.c
    │           │   │   │   ├── dsp5680xx_flash.c
    │           │   │   │   ├── efm32.c
    │           │   │   │   ├── em357.c
    │           │   │   │   ├── esirisc_flash.c
    │           │   │   │   ├── faux.c
    │           │   │   │   ├── fespi.c
    │           │   │   │   ├── fm3.c
    │           │   │   │   ├── fm4.c
    │           │   │   │   ├── imp.h
    │           │   │   │   ├── jtagspi.c
    │           │   │   │   ├── kinetis.c
    │           │   │   │   ├── kinetis_ke.c
    │           │   │   │   ├── lpc2000.c
    │           │   │   │   ├── lpc288x.c
    │           │   │   │   ├── lpc2900.c
    │           │   │   │   ├── lpcspifi.c
    │           │   │   │   ├── max32xxx.c
    │           │   │   │   ├── mdr.c
    │           │   │   │   ├── mrvlqspi.c
    │           │   │   │   ├── msp432.c
    │           │   │   │   ├── msp432.h
    │           │   │   │   ├── niietcm4.c
    │           │   │   │   ├── non_cfi.c
    │           │   │   │   ├── non_cfi.h
    │           │   │   │   ├── npcx.c
    │           │   │   │   ├── nrf5.c
    │           │   │   │   ├── numicro.c
    │           │   │   │   ├── ocl.c
    │           │   │   │   ├── ocl.h
    │           │   │   │   ├── pic32mx.c
    │           │   │   │   ├── psoc4.c
    │           │   │   │   ├── psoc5lp.c
    │           │   │   │   ├── psoc6.c
    │           │   │   │   ├── qn908x.c
    │           │   │   │   ├── renesas_rpchf.c
    │           │   │   │   ├── rp2040.c
    │           │   │   │   ├── rsl10.c
    │           │   │   │   ├── sfdp.c
    │           │   │   │   ├── sfdp.h
    │           │   │   │   ├── sh_qspi.c
    │           │   │   │   ├── sim3x.c
    │           │   │   │   ├── spi.c
    │           │   │   │   ├── spi.h
    │           │   │   │   ├── stellaris.c
    │           │   │   │   ├── stm32f1x.c
    │           │   │   │   ├── stm32f2x.c
    │           │   │   │   ├── stm32h7x.c
    │           │   │   │   ├── stm32l4x.c
    │           │   │   │   ├── stm32l4x.h
    │           │   │   │   ├── stm32lx.c
    │           │   │   │   ├── stmqspi.c
    │           │   │   │   ├── stmqspi.h
    │           │   │   │   ├── stmsmi.c
    │           │   │   │   ├── str7x.c
    │           │   │   │   ├── str9x.c
    │           │   │   │   ├── str9xpec.c
    │           │   │   │   ├── swm050.c
    │           │   │   │   ├── tcl.c
    │           │   │   │   ├── tms470.c
    │           │   │   │   ├── virtual.c
    │           │   │   │   ├── w600.c
    │           │   │   │   ├── xcf.c
    │           │   │   │   ├── xmc1xxx.c
    │           │   │   │   └── xmc4xxx.c
    │           │   │   └── startup.tcl
    │           │   ├── hello.c
    │           │   ├── hello.h
    │           │   ├── helper/
    │           │   │   ├── Makefile.am
    │           │   │   ├── align.h
    │           │   │   ├── bin2char.sh
    │           │   │   ├── binarybuffer.c
    │           │   │   ├── binarybuffer.h
    │           │   │   ├── bits.h
    │           │   │   ├── command.c
    │           │   │   ├── command.h
    │           │   │   ├── compiler.h
    │           │   │   ├── configuration.c
    │           │   │   ├── configuration.h
    │           │   │   ├── crc32.c
    │           │   │   ├── crc32.h
    │           │   │   ├── fileio.c
    │           │   │   ├── fileio.h
    │           │   │   ├── jep106.c
    │           │   │   ├── jep106.h
    │           │   │   ├── jep106.inc
    │           │   │   ├── jim-nvp.c
    │           │   │   ├── jim-nvp.h
    │           │   │   ├── list.h
    │           │   │   ├── log.c
    │           │   │   ├── log.h
    │           │   │   ├── nvp.c
    │           │   │   ├── nvp.h
    │           │   │   ├── options.c
    │           │   │   ├── replacements.c
    │           │   │   ├── replacements.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── system.h
    │           │   │   ├── time_support.c
    │           │   │   ├── time_support.h
    │           │   │   ├── time_support_common.c
    │           │   │   ├── types.h
    │           │   │   ├── update_jep106.pl
    │           │   │   ├── util.c
    │           │   │   └── util.h
    │           │   ├── jtag/
    │           │   │   ├── Makefile.am
    │           │   │   ├── adapter.c
    │           │   │   ├── adapter.h
    │           │   │   ├── commands.c
    │           │   │   ├── commands.h
    │           │   │   ├── core.c
    │           │   │   ├── drivers/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── Makefile.rlink
    │           │   │   │   ├── OpenULINK/
    │           │   │   │   │   ├── README
    │           │   │   │   │   ├── include/
    │           │   │   │   │   │   ├── common.h
    │           │   │   │   │   │   ├── delay.h
    │           │   │   │   │   │   ├── io.h
    │           │   │   │   │   │   ├── jtag.h
    │           │   │   │   │   │   ├── main.h
    │           │   │   │   │   │   ├── msgtypes.h
    │           │   │   │   │   │   ├── protocol.h
    │           │   │   │   │   │   ├── reg_ezusb.h
    │           │   │   │   │   │   └── usb.h
    │           │   │   │   │   ├── src/
    │           │   │   │   │   │   ├── USBJmpTb.a51
    │           │   │   │   │   │   ├── delay.c
    │           │   │   │   │   │   ├── jtag.c
    │           │   │   │   │   │   ├── main.c
    │           │   │   │   │   │   ├── protocol.c
    │           │   │   │   │   │   └── usb.c
    │           │   │   │   │   └── ulink_firmware.hex
    │           │   │   │   ├── am335xgpio.c
    │           │   │   │   ├── amt_jtagaccel.c
    │           │   │   │   ├── arm-jtag-ew.c
    │           │   │   │   ├── at91rm9200.c
    │           │   │   │   ├── bcm2835gpio.c
    │           │   │   │   ├── bitbang.c
    │           │   │   │   ├── bitbang.h
    │           │   │   │   ├── bitq.c
    │           │   │   │   ├── bitq.h
    │           │   │   │   ├── buspirate.c
    │           │   │   │   ├── ch347.c
    │           │   │   │   ├── cmsis_dap.c
    │           │   │   │   ├── cmsis_dap.h
    │           │   │   │   ├── cmsis_dap_usb_bulk.c
    │           │   │   │   ├── cmsis_dap_usb_hid.c
    │           │   │   │   ├── driver.c
    │           │   │   │   ├── dummy.c
    │           │   │   │   ├── ep93xx.c
    │           │   │   │   ├── esp_usb_jtag.c
    │           │   │   │   ├── ft232r.c
    │           │   │   │   ├── ftdi.c
    │           │   │   │   ├── gw16012.c
    │           │   │   │   ├── imx_gpio.c
    │           │   │   │   ├── jlink.c
    │           │   │   │   ├── jtag_dpi.c
    │           │   │   │   ├── jtag_vpi.c
    │           │   │   │   ├── kitprog.c
    │           │   │   │   ├── libftdi_helper.h
    │           │   │   │   ├── libusb_helper.c
    │           │   │   │   ├── libusb_helper.h
    │           │   │   │   ├── linuxgpiod.c
    │           │   │   │   ├── minidriver_imp.h
    │           │   │   │   ├── mpsse.c
    │           │   │   │   ├── mpsse.h
    │           │   │   │   ├── nulink_usb.c
    │           │   │   │   ├── opendous.c
    │           │   │   │   ├── openjtag.c
    │           │   │   │   ├── osbdm.c
    │           │   │   │   ├── parport.c
    │           │   │   │   ├── presto.c
    │           │   │   │   ├── remote_bitbang.c
    │           │   │   │   ├── rlink.c
    │           │   │   │   ├── rlink.h
    │           │   │   │   ├── rlink_call.m4
    │           │   │   │   ├── rlink_dtc_cmd.h
    │           │   │   │   ├── rlink_ep1_cmd.h
    │           │   │   │   ├── rlink_init.m4
    │           │   │   │   ├── rlink_speed_table.c
    │           │   │   │   ├── rlink_st7.h
    │           │   │   │   ├── rshim.c
    │           │   │   │   ├── stlink_usb.c
    │           │   │   │   ├── sysfsgpio.c
    │           │   │   │   ├── ti_icdi_usb.c
    │           │   │   │   ├── ulink.c
    │           │   │   │   ├── usb_blaster/
    │           │   │   │   │   ├── Makefile.am
    │           │   │   │   │   ├── README.CheapClone
    │           │   │   │   │   ├── ublast2_access_libusb.c
    │           │   │   │   │   ├── ublast_access.h
    │           │   │   │   │   ├── ublast_access_ftdi.c
    │           │   │   │   │   └── usb_blaster.c
    │           │   │   │   ├── usbprog.c
    │           │   │   │   ├── vdebug.c
    │           │   │   │   ├── versaloon/
    │           │   │   │   │   ├── usbtoxxx/
    │           │   │   │   │   │   ├── usbtogpio.c
    │           │   │   │   │   │   ├── usbtojtagraw.c
    │           │   │   │   │   │   ├── usbtopwr.c
    │           │   │   │   │   │   ├── usbtoswd.c
    │           │   │   │   │   │   ├── usbtoxxx.c
    │           │   │   │   │   │   ├── usbtoxxx.h
    │           │   │   │   │   │   └── usbtoxxx_internal.h
    │           │   │   │   │   ├── versaloon.c
    │           │   │   │   │   ├── versaloon.h
    │           │   │   │   │   ├── versaloon_include.h
    │           │   │   │   │   └── versaloon_internal.h
    │           │   │   │   ├── vsllink.c
    │           │   │   │   ├── xds110.c
    │           │   │   │   └── xlnx-pcie-xvc.c
    │           │   │   ├── hla/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── hla_interface.c
    │           │   │   │   ├── hla_interface.h
    │           │   │   │   ├── hla_layout.c
    │           │   │   │   ├── hla_layout.h
    │           │   │   │   ├── hla_transport.c
    │           │   │   │   └── hla_transport.h
    │           │   │   ├── interface.c
    │           │   │   ├── interface.h
    │           │   │   ├── interfaces.c
    │           │   │   ├── interfaces.h
    │           │   │   ├── jtag.h
    │           │   │   ├── minidriver.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── swd.h
    │           │   │   ├── swim.c
    │           │   │   ├── swim.h
    │           │   │   ├── tcl.c
    │           │   │   └── tcl.h
    │           │   ├── main.c
    │           │   ├── openocd.c
    │           │   ├── openocd.h
    │           │   ├── pld/
    │           │   │   ├── Makefile.am
    │           │   │   ├── certus.c
    │           │   │   ├── certus.h
    │           │   │   ├── ecp2_3.c
    │           │   │   ├── ecp2_3.h
    │           │   │   ├── ecp5.c
    │           │   │   ├── ecp5.h
    │           │   │   ├── efinix.c
    │           │   │   ├── gatemate.c
    │           │   │   ├── gowin.c
    │           │   │   ├── intel.c
    │           │   │   ├── lattice.c
    │           │   │   ├── lattice.h
    │           │   │   ├── lattice_bit.c
    │           │   │   ├── lattice_bit.h
    │           │   │   ├── lattice_cmd.h
    │           │   │   ├── pld.c
    │           │   │   ├── pld.h
    │           │   │   ├── raw_bit.c
    │           │   │   ├── raw_bit.h
    │           │   │   ├── virtex2.c
    │           │   │   ├── virtex2.h
    │           │   │   ├── xilinx_bit.c
    │           │   │   └── xilinx_bit.h
    │           │   ├── rtos/
    │           │   │   ├── FreeRTOS.c
    │           │   │   ├── Makefile.am
    │           │   │   ├── ThreadX.c
    │           │   │   ├── chibios.c
    │           │   │   ├── chromium-ec.c
    │           │   │   ├── eCos.c
    │           │   │   ├── embKernel.c
    │           │   │   ├── hwthread.c
    │           │   │   ├── linux.c
    │           │   │   ├── linux_header.h
    │           │   │   ├── mqx.c
    │           │   │   ├── nuttx.c
    │           │   │   ├── riot.c
    │           │   │   ├── rtkernel.c
    │           │   │   ├── rtos.c
    │           │   │   ├── rtos.h
    │           │   │   ├── rtos_chibios_stackings.c
    │           │   │   ├── rtos_chibios_stackings.h
    │           │   │   ├── rtos_ecos_stackings.c
    │           │   │   ├── rtos_ecos_stackings.h
    │           │   │   ├── rtos_embkernel_stackings.c
    │           │   │   ├── rtos_embkernel_stackings.h
    │           │   │   ├── rtos_mqx_stackings.c
    │           │   │   ├── rtos_mqx_stackings.h
    │           │   │   ├── rtos_nuttx_stackings.c
    │           │   │   ├── rtos_nuttx_stackings.h
    │           │   │   ├── rtos_riot_stackings.c
    │           │   │   ├── rtos_riot_stackings.h
    │           │   │   ├── rtos_standard_stackings.c
    │           │   │   ├── rtos_standard_stackings.h
    │           │   │   ├── rtos_ucos_iii_stackings.c
    │           │   │   ├── rtos_ucos_iii_stackings.h
    │           │   │   ├── uCOS-III.c
    │           │   │   └── zephyr.c
    │           │   ├── rtt/
    │           │   │   ├── Makefile.am
    │           │   │   ├── rtt.c
    │           │   │   ├── rtt.h
    │           │   │   └── tcl.c
    │           │   ├── server/
    │           │   │   ├── Makefile.am
    │           │   │   ├── gdb_server.c
    │           │   │   ├── gdb_server.h
    │           │   │   ├── ipdbg.c
    │           │   │   ├── ipdbg.h
    │           │   │   ├── rtt_server.c
    │           │   │   ├── rtt_server.h
    │           │   │   ├── server.c
    │           │   │   ├── server.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── tcl_server.c
    │           │   │   ├── tcl_server.h
    │           │   │   ├── telnet_server.c
    │           │   │   └── telnet_server.h
    │           │   ├── svf/
    │           │   │   ├── Makefile.am
    │           │   │   ├── svf.c
    │           │   │   └── svf.h
    │           │   ├── target/
    │           │   │   ├── Makefile.am
    │           │   │   ├── a64_disassembler.c
    │           │   │   ├── a64_disassembler.h
    │           │   │   ├── aarch64.c
    │           │   │   ├── aarch64.h
    │           │   │   ├── adi_v5_dapdirect.c
    │           │   │   ├── adi_v5_jtag.c
    │           │   │   ├── adi_v5_swd.c
    │           │   │   ├── algorithm.c
    │           │   │   ├── algorithm.h
    │           │   │   ├── arc.c
    │           │   │   ├── arc.h
    │           │   │   ├── arc_cmd.c
    │           │   │   ├── arc_cmd.h
    │           │   │   ├── arc_jtag.c
    │           │   │   ├── arc_jtag.h
    │           │   │   ├── arc_mem.c
    │           │   │   ├── arc_mem.h
    │           │   │   ├── arm.h
    │           │   │   ├── arm11.c
    │           │   │   ├── arm11.h
    │           │   │   ├── arm11_dbgtap.c
    │           │   │   ├── arm11_dbgtap.h
    │           │   │   ├── arm720t.c
    │           │   │   ├── arm720t.h
    │           │   │   ├── arm7_9_common.c
    │           │   │   ├── arm7_9_common.h
    │           │   │   ├── arm7tdmi.c
    │           │   │   ├── arm7tdmi.h
    │           │   │   ├── arm920t.c
    │           │   │   ├── arm920t.h
    │           │   │   ├── arm926ejs.c
    │           │   │   ├── arm926ejs.h
    │           │   │   ├── arm946e.c
    │           │   │   ├── arm946e.h
    │           │   │   ├── arm966e.c
    │           │   │   ├── arm966e.h
    │           │   │   ├── arm9tdmi.c
    │           │   │   ├── arm9tdmi.h
    │           │   │   ├── arm_adi_v5.c
    │           │   │   ├── arm_adi_v5.h
    │           │   │   ├── arm_coresight.h
    │           │   │   ├── arm_cti.c
    │           │   │   ├── arm_cti.h
    │           │   │   ├── arm_dap.c
    │           │   │   ├── arm_disassembler.c
    │           │   │   ├── arm_disassembler.h
    │           │   │   ├── arm_dpm.c
    │           │   │   ├── arm_dpm.h
    │           │   │   ├── arm_jtag.c
    │           │   │   ├── arm_jtag.h
    │           │   │   ├── arm_opcodes.h
    │           │   │   ├── arm_semihosting.c
    │           │   │   ├── arm_semihosting.h
    │           │   │   ├── arm_simulator.c
    │           │   │   ├── arm_simulator.h
    │           │   │   ├── arm_tpiu_swo.c
    │           │   │   ├── arm_tpiu_swo.h
    │           │   │   ├── armv4_5.c
    │           │   │   ├── armv4_5.h
    │           │   │   ├── armv4_5_cache.c
    │           │   │   ├── armv4_5_cache.h
    │           │   │   ├── armv4_5_mmu.c
    │           │   │   ├── armv4_5_mmu.h
    │           │   │   ├── armv7a.c
    │           │   │   ├── armv7a.h
    │           │   │   ├── armv7a_cache.c
    │           │   │   ├── armv7a_cache.h
    │           │   │   ├── armv7a_cache_l2x.c
    │           │   │   ├── armv7a_cache_l2x.h
    │           │   │   ├── armv7a_mmu.c
    │           │   │   ├── armv7a_mmu.h
    │           │   │   ├── armv7m.c
    │           │   │   ├── armv7m.h
    │           │   │   ├── armv7m_trace.c
    │           │   │   ├── armv7m_trace.h
    │           │   │   ├── armv8.c
    │           │   │   ├── armv8.h
    │           │   │   ├── armv8_cache.c
    │           │   │   ├── armv8_cache.h
    │           │   │   ├── armv8_dpm.c
    │           │   │   ├── armv8_dpm.h
    │           │   │   ├── armv8_opcodes.c
    │           │   │   ├── armv8_opcodes.h
    │           │   │   ├── avr32_ap7k.c
    │           │   │   ├── avr32_ap7k.h
    │           │   │   ├── avr32_jtag.c
    │           │   │   ├── avr32_jtag.h
    │           │   │   ├── avr32_mem.c
    │           │   │   ├── avr32_mem.h
    │           │   │   ├── avr32_regs.c
    │           │   │   ├── avr32_regs.h
    │           │   │   ├── avrt.c
    │           │   │   ├── avrt.h
    │           │   │   ├── breakpoints.c
    │           │   │   ├── breakpoints.h
    │           │   │   ├── cortex_a.c
    │           │   │   ├── cortex_a.h
    │           │   │   ├── cortex_m.c
    │           │   │   ├── cortex_m.h
    │           │   │   ├── dsp563xx.c
    │           │   │   ├── dsp563xx.h
    │           │   │   ├── dsp563xx_once.c
    │           │   │   ├── dsp563xx_once.h
    │           │   │   ├── dsp5680xx.c
    │           │   │   ├── dsp5680xx.h
    │           │   │   ├── embeddedice.c
    │           │   │   ├── embeddedice.h
    │           │   │   ├── esirisc.c
    │           │   │   ├── esirisc.h
    │           │   │   ├── esirisc_jtag.c
    │           │   │   ├── esirisc_jtag.h
    │           │   │   ├── esirisc_regs.h
    │           │   │   ├── esirisc_trace.c
    │           │   │   ├── esirisc_trace.h
    │           │   │   ├── espressif/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── esp.c
    │           │   │   │   ├── esp.h
    │           │   │   │   ├── esp32.c
    │           │   │   │   ├── esp32_apptrace.c
    │           │   │   │   ├── esp32_apptrace.h
    │           │   │   │   ├── esp32_sysview.c
    │           │   │   │   ├── esp32_sysview.h
    │           │   │   │   ├── esp32s2.c
    │           │   │   │   ├── esp32s3.c
    │           │   │   │   ├── esp_semihosting.c
    │           │   │   │   ├── esp_semihosting.h
    │           │   │   │   ├── esp_xtensa.c
    │           │   │   │   ├── esp_xtensa.h
    │           │   │   │   ├── esp_xtensa_apptrace.c
    │           │   │   │   ├── esp_xtensa_apptrace.h
    │           │   │   │   ├── esp_xtensa_semihosting.c
    │           │   │   │   ├── esp_xtensa_semihosting.h
    │           │   │   │   ├── esp_xtensa_smp.c
    │           │   │   │   ├── esp_xtensa_smp.h
    │           │   │   │   └── segger_sysview.h
    │           │   │   ├── etb.c
    │           │   │   ├── etb.h
    │           │   │   ├── etm.c
    │           │   │   ├── etm.h
    │           │   │   ├── etm_dummy.c
    │           │   │   ├── etm_dummy.h
    │           │   │   ├── fa526.c
    │           │   │   ├── feroceon.c
    │           │   │   ├── hla_target.c
    │           │   │   ├── image.c
    │           │   │   ├── image.h
    │           │   │   ├── lakemont.c
    │           │   │   ├── lakemont.h
    │           │   │   ├── ls1_sap.c
    │           │   │   ├── mem_ap.c
    │           │   │   ├── mips32.c
    │           │   │   ├── mips32.h
    │           │   │   ├── mips32_dmaacc.c
    │           │   │   ├── mips32_dmaacc.h
    │           │   │   ├── mips32_pracc.c
    │           │   │   ├── mips32_pracc.h
    │           │   │   ├── mips64.c
    │           │   │   ├── mips64.h
    │           │   │   ├── mips64_pracc.c
    │           │   │   ├── mips64_pracc.h
    │           │   │   ├── mips_ejtag.c
    │           │   │   ├── mips_ejtag.h
    │           │   │   ├── mips_m4k.c
    │           │   │   ├── mips_m4k.h
    │           │   │   ├── mips_mips64.c
    │           │   │   ├── mips_mips64.h
    │           │   │   ├── openrisc/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── jsp_server.c
    │           │   │   │   ├── jsp_server.h
    │           │   │   │   ├── or1k.c
    │           │   │   │   ├── or1k.h
    │           │   │   │   ├── or1k_du.h
    │           │   │   │   ├── or1k_du_adv.c
    │           │   │   │   ├── or1k_tap.h
    │           │   │   │   ├── or1k_tap_mohor.c
    │           │   │   │   ├── or1k_tap_vjtag.c
    │           │   │   │   └── or1k_tap_xilinx_bscan.c
    │           │   │   ├── quark_d20xx.c
    │           │   │   ├── quark_x10xx.c
    │           │   │   ├── register.c
    │           │   │   ├── register.h
    │           │   │   ├── riscv/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── asm.h
    │           │   │   │   ├── batch.c
    │           │   │   │   ├── batch.h
    │           │   │   │   ├── debug_defines.h
    │           │   │   │   ├── encoding.h
    │           │   │   │   ├── gdb_regs.h
    │           │   │   │   ├── opcodes.h
    │           │   │   │   ├── program.c
    │           │   │   │   ├── program.h
    │           │   │   │   ├── riscv-011.c
    │           │   │   │   ├── riscv-013.c
    │           │   │   │   ├── riscv.c
    │           │   │   │   ├── riscv.h
    │           │   │   │   └── riscv_semihosting.c
    │           │   │   ├── rtt.c
    │           │   │   ├── rtt.h
    │           │   │   ├── semihosting_common.c
    │           │   │   ├── semihosting_common.h
    │           │   │   ├── smp.c
    │           │   │   ├── smp.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── stm8.c
    │           │   │   ├── stm8.h
    │           │   │   ├── target.c
    │           │   │   ├── target.h
    │           │   │   ├── target_request.c
    │           │   │   ├── target_request.h
    │           │   │   ├── target_type.h
    │           │   │   ├── testee.c
    │           │   │   ├── trace.c
    │           │   │   ├── trace.h
    │           │   │   ├── x86_32_common.c
    │           │   │   ├── x86_32_common.h
    │           │   │   ├── xscale.c
    │           │   │   ├── xscale.h
    │           │   │   └── xtensa/
    │           │   │       ├── Makefile.am
    │           │   │       ├── xtensa.c
    │           │   │       ├── xtensa.h
    │           │   │       ├── xtensa_chip.c
    │           │   │       ├── xtensa_chip.h
    │           │   │       ├── xtensa_debug_module.c
    │           │   │       ├── xtensa_debug_module.h
    │           │   │       ├── xtensa_fileio.c
    │           │   │       ├── xtensa_fileio.h
    │           │   │       └── xtensa_regs.h
    │           │   ├── transport/
    │           │   │   ├── Makefile.am
    │           │   │   ├── transport.c
    │           │   │   └── transport.h
    │           │   └── xsvf/
    │           │       ├── Makefile.am
    │           │       ├── xsvf.c
    │           │       └── xsvf.h
    │           ├── tcl/
    │           │   ├── bitsbytes.tcl
    │           │   ├── board/
    │           │   │   ├── 8devices-lima.cfg
    │           │   │   ├── actux3.cfg
    │           │   │   ├── adapteva_parallella1.cfg
    │           │   │   ├── adsp-sc584-ezbrd.cfg
    │           │   │   ├── alphascale_asm9260_ek.cfg
    │           │   │   ├── altera_sockit.cfg
    │           │   │   ├── am3517evm.cfg
    │           │   │   ├── ampere_emag8180.cfg
    │           │   │   ├── ampere_qs_mq_1s.cfg
    │           │   │   ├── ampere_qs_mq_2s.cfg
    │           │   │   ├── arm_evaluator7t.cfg
    │           │   │   ├── arm_musca_a.cfg
    │           │   │   ├── arty_s7.cfg
    │           │   │   ├── asus-rt-n16.cfg
    │           │   │   ├── asus-rt-n66u.cfg
    │           │   │   ├── at91cap7a-stk-sdram.cfg
    │           │   │   ├── at91eb40a.cfg
    │           │   │   ├── at91rm9200-dk.cfg
    │           │   │   ├── at91rm9200-ek.cfg
    │           │   │   ├── at91sam9261-ek.cfg
    │           │   │   ├── at91sam9263-ek.cfg
    │           │   │   ├── at91sam9g20-ek.cfg
    │           │   │   ├── atmel_at91sam7s-ek.cfg
    │           │   │   ├── atmel_at91sam9260-ek.cfg
    │           │   │   ├── atmel_at91sam9rl-ek.cfg
    │           │   │   ├── atmel_sam3n_ek.cfg
    │           │   │   ├── atmel_sam3s_ek.cfg
    │           │   │   ├── atmel_sam3u_ek.cfg
    │           │   │   ├── atmel_sam3x_ek.cfg
    │           │   │   ├── atmel_sam4e_ek.cfg
    │           │   │   ├── atmel_sam4l8_xplained_pro.cfg
    │           │   │   ├── atmel_sam4s_ek.cfg
    │           │   │   ├── atmel_sam4s_xplained_pro.cfg
    │           │   │   ├── atmel_samc20_xplained_pro.cfg
    │           │   │   ├── atmel_samc21_xplained_pro.cfg
    │           │   │   ├── atmel_samd10_xplained_mini.cfg
    │           │   │   ├── atmel_samd11_xplained_pro.cfg
    │           │   │   ├── atmel_samd20_xplained_pro.cfg
    │           │   │   ├── atmel_samd21_xplained_pro.cfg
    │           │   │   ├── atmel_same70_xplained.cfg
    │           │   │   ├── atmel_samg53_xplained_pro.cfg
    │           │   │   ├── atmel_samg55_xplained_pro.cfg
    │           │   │   ├── atmel_saml21_xplained_pro.cfg
    │           │   │   ├── atmel_samr21_xplained_pro.cfg
    │           │   │   ├── atmel_samv71_xplained_ultra.cfg
    │           │   │   ├── avnet_ultrazed-eg.cfg
    │           │   │   ├── balloon3-cpu.cfg
    │           │   │   ├── bcm28155_ap.cfg
    │           │   │   ├── bemicro_cycloneiii.cfg
    │           │   │   ├── bluefield.cfg
    │           │   │   ├── bt-homehubv1.cfg
    │           │   │   ├── calao-usb-a9260.cfg
    │           │   │   ├── calao-usb-a9g20-c01.cfg
    │           │   │   ├── certuspro_evaluation.cfg
    │           │   │   ├── colibri.cfg
    │           │   │   ├── crossbow_tech_imote2.cfg
    │           │   │   ├── csb337.cfg
    │           │   │   ├── csb732.cfg
    │           │   │   ├── da850evm.cfg
    │           │   │   ├── digi_connectcore_wi-9c.cfg
    │           │   │   ├── digilent_analog_discovery.cfg
    │           │   │   ├── digilent_atlys.cfg
    │           │   │   ├── digilent_nexys_video.cfg
    │           │   │   ├── digilent_zedboard.cfg
    │           │   │   ├── diolan_lpc4350-db1.cfg
    │           │   │   ├── diolan_lpc4357-db1.cfg
    │           │   │   ├── dk-tm4c129.cfg
    │           │   │   ├── dm355evm.cfg
    │           │   │   ├── dm365evm.cfg
    │           │   │   ├── dm6446evm.cfg
    │           │   │   ├── dp_busblaster_v3.cfg
    │           │   │   ├── dp_busblaster_v4.cfg
    │           │   │   ├── dptechnics_dpt-board-v1.cfg
    │           │   │   ├── ecp5_evaluation.cfg
    │           │   │   ├── efikamx.cfg
    │           │   │   ├── efm32.cfg
    │           │   │   ├── eir.cfg
    │           │   │   ├── ek-lm3s1968.cfg
    │           │   │   ├── ek-lm3s3748.cfg
    │           │   │   ├── ek-lm3s6965.cfg
    │           │   │   ├── ek-lm3s811-revb.cfg
    │           │   │   ├── ek-lm3s811.cfg
    │           │   │   ├── ek-lm3s8962.cfg
    │           │   │   ├── ek-lm3s9b9x.cfg
    │           │   │   ├── ek-lm3s9d92.cfg
    │           │   │   ├── ek-lm4f120xl.cfg
    │           │   │   ├── ek-lm4f232.cfg
    │           │   │   ├── ek-tm4c123gxl.cfg
    │           │   │   ├── ek-tm4c1294xl.cfg
    │           │   │   ├── embedded-artists_lpc2478-32.cfg
    │           │   │   ├── emcraft_imx8m-som-bsb.cfg
    │           │   │   ├── emcraft_twr-vf6-som-bsb.cfg
    │           │   │   ├── emcraft_vf6-som.cfg
    │           │   │   ├── esp32-bridge.cfg
    │           │   │   ├── esp32-ethernet-kit-3.3v.cfg
    │           │   │   ├── esp32-wrover-kit-1.8v.cfg
    │           │   │   ├── esp32-wrover-kit-3.3v.cfg
    │           │   │   ├── esp32s2-bridge.cfg
    │           │   │   ├── esp32s2-kaluga-1.cfg
    │           │   │   ├── esp32s3-bridge.cfg
    │           │   │   ├── esp32s3-builtin.cfg
    │           │   │   ├── esp32s3-ftdi.cfg
    │           │   │   ├── ethernut3.cfg
    │           │   │   ├── evb-lan9255.cfg
    │           │   │   ├── frdm-kl25z.cfg
    │           │   │   ├── frdm-kl46z.cfg
    │           │   │   ├── fsl_imx6q_sabresd.cfg
    │           │   │   ├── gatemate_eval.cfg
    │           │   │   ├── glyn_tonga2.cfg
    │           │   │   ├── gowin_runber.cfg
    │           │   │   ├── gti/
    │           │   │   │   └── espressobin.cfg
    │           │   │   ├── gumstix-aerocore.cfg
    │           │   │   ├── hammer.cfg
    │           │   │   ├── hilscher_nxdb500sys.cfg
    │           │   │   ├── hilscher_nxeb500hmi.cfg
    │           │   │   ├── hilscher_nxhx10.cfg
    │           │   │   ├── hilscher_nxhx50.cfg
    │           │   │   ├── hilscher_nxhx500.cfg
    │           │   │   ├── hilscher_nxsb100.cfg
    │           │   │   ├── hitex_lpc1768stick.cfg
    │           │   │   ├── hitex_lpc2929.cfg
    │           │   │   ├── hitex_stm32-performancestick.cfg
    │           │   │   ├── hitex_str9-comstick.cfg
    │           │   │   ├── iar_lpc1768.cfg
    │           │   │   ├── iar_str912_sk.cfg
    │           │   │   ├── icnova_imx53_sodimm.cfg
    │           │   │   ├── icnova_sam9g45_sodimm.cfg
    │           │   │   ├── imx27ads.cfg
    │           │   │   ├── imx27lnst.cfg
    │           │   │   ├── imx28evk.cfg
    │           │   │   ├── imx31pdk.cfg
    │           │   │   ├── imx35pdk.cfg
    │           │   │   ├── imx53-m53evk.cfg
    │           │   │   ├── imx53loco.cfg
    │           │   │   ├── imx8mp-evk.cfg
    │           │   │   ├── insignal_arndale.cfg
    │           │   │   ├── kasli.cfg
    │           │   │   ├── kc100.cfg
    │           │   │   ├── kc705.cfg
    │           │   │   ├── kcu105.cfg
    │           │   │   ├── keil_mcb1700.cfg
    │           │   │   ├── keil_mcb2140.cfg
    │           │   │   ├── kindle2.cfg
    │           │   │   ├── kontron_sl28.cfg
    │           │   │   ├── kwikstik.cfg
    │           │   │   ├── la_fonera-fon2200.cfg
    │           │   │   ├── lambdaconcept_ecpix-5.cfg
    │           │   │   ├── lemaker_hikey.cfg
    │           │   │   ├── linksys-wag200g.cfg
    │           │   │   ├── linksys-wrt54gl.cfg
    │           │   │   ├── linksys_nslu2.cfg
    │           │   │   ├── lisa-l.cfg
    │           │   │   ├── logicpd_imx27.cfg
    │           │   │   ├── lpc1850_spifi_generic.cfg
    │           │   │   ├── lpc4350_spifi_generic.cfg
    │           │   │   ├── lubbock.cfg
    │           │   │   ├── marsohod.cfg
    │           │   │   ├── marsohod2.cfg
    │           │   │   ├── marsohod3.cfg
    │           │   │   ├── mbed-lpc11u24.cfg
    │           │   │   ├── mbed-lpc1768.cfg
    │           │   │   ├── mcb1700.cfg
    │           │   │   ├── microchip_explorer16.cfg
    │           │   │   ├── microchip_sama5d27_som1_kit1.cfg
    │           │   │   ├── microchip_same51_curiosity_nano.cfg
    │           │   │   ├── microchip_same54_xplained_pro.cfg
    │           │   │   ├── microchip_saml11_xplained_pro.cfg
    │           │   │   ├── mini2440.cfg
    │           │   │   ├── mini6410.cfg
    │           │   │   ├── minispartan6.cfg
    │           │   │   ├── nds32_corvettef1.cfg
    │           │   │   ├── nds32_xc7.cfg
    │           │   │   ├── netgear-dg834v3.cfg
    │           │   │   ├── netgear-wg102.cfg
    │           │   │   ├── nordic_nrf51822_mkit.cfg
    │           │   │   ├── nordic_nrf51_dk.cfg
    │           │   │   ├── nordic_nrf52_dk.cfg
    │           │   │   ├── nordic_nrf52_ftx232.cfg
    │           │   │   ├── novena-internal-fpga.cfg
    │           │   │   ├── npcx_evb.cfg
    │           │   │   ├── numato_mimas_a7.cfg
    │           │   │   ├── numato_opsis.cfg
    │           │   │   ├── nxp_frdm-k64f.cfg
    │           │   │   ├── nxp_frdm-ls1012a.cfg
    │           │   │   ├── nxp_imx7sabre.cfg
    │           │   │   ├── nxp_lpc-link2.cfg
    │           │   │   ├── nxp_mcimx8m-evk.cfg
    │           │   │   ├── nxp_rdb-ls1046a.cfg
    │           │   │   ├── nxp_rdb-ls1088a.cfg
    │           │   │   ├── olimex_LPC2378STK.cfg
    │           │   │   ├── olimex_lpc_h2148.cfg
    │           │   │   ├── olimex_sam7_ex256.cfg
    │           │   │   ├── olimex_sam7_la2.cfg
    │           │   │   ├── olimex_sam9_l9260.cfg
    │           │   │   ├── olimex_stm32_h103.cfg
    │           │   │   ├── olimex_stm32_h107.cfg
    │           │   │   ├── olimex_stm32_h405.cfg
    │           │   │   ├── olimex_stm32_p107.cfg
    │           │   │   ├── omap2420_h4.cfg
    │           │   │   ├── openrd.cfg
    │           │   │   ├── or1k_generic.cfg
    │           │   │   ├── osk5912.cfg
    │           │   │   ├── phone_se_j100i.cfg
    │           │   │   ├── phytec_lpc3250.cfg
    │           │   │   ├── pic-p32mx.cfg
    │           │   │   ├── pico-debug.cfg
    │           │   │   ├── pipistrello.cfg
    │           │   │   ├── propox_mmnet1001.cfg
    │           │   │   ├── pxa255_sst.cfg
    │           │   │   ├── quark_d2000_refboard.cfg
    │           │   │   ├── quark_x10xx_board.cfg
    │           │   │   ├── quicklogic_quickfeather.cfg
    │           │   │   ├── radiona_ulx3s.cfg
    │           │   │   ├── redbee.cfg
    │           │   │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │           │   │   ├── renesas_dk-s7g2.cfg
    │           │   │   ├── renesas_falcon.cfg
    │           │   │   ├── renesas_gr_peach.cfg
    │           │   │   ├── renesas_porter.cfg
    │           │   │   ├── renesas_salvator-xs.cfg
    │           │   │   ├── renesas_silk.cfg
    │           │   │   ├── renesas_stout.cfg
    │           │   │   ├── rigado_bmd300_ek.cfg
    │           │   │   ├── rpi3.cfg
    │           │   │   ├── rpi4b.cfg
    │           │   │   ├── rsc-w910.cfg
    │           │   │   ├── sayma_amc.cfg
    │           │   │   ├── sheevaplug.cfg
    │           │   │   ├── sifive-e31arty.cfg
    │           │   │   ├── sifive-e51arty.cfg
    │           │   │   ├── sifive-hifive1-revb.cfg
    │           │   │   ├── sifive-hifive1.cfg
    │           │   │   ├── smdk6410.cfg
    │           │   │   ├── snps_em_sk.cfg
    │           │   │   ├── snps_em_sk_v1.cfg
    │           │   │   ├── snps_em_sk_v2.1.cfg
    │           │   │   ├── snps_em_sk_v2.2.cfg
    │           │   │   ├── snps_hsdk.cfg
    │           │   │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │           │   │   ├── spansion_sk-fm4-u120-9b560.cfg
    │           │   │   ├── spear300evb.cfg
    │           │   │   ├── spear300evb_mod.cfg
    │           │   │   ├── spear310evb20.cfg
    │           │   │   ├── spear310evb20_mod.cfg
    │           │   │   ├── spear320cpu.cfg
    │           │   │   ├── spear320cpu_mod.cfg
    │           │   │   ├── st_b-l475e-iot01a.cfg
    │           │   │   ├── st_nucleo_8l152r8.cfg
    │           │   │   ├── st_nucleo_8s208rb.cfg
    │           │   │   ├── st_nucleo_f0.cfg
    │           │   │   ├── st_nucleo_f103rb.cfg
    │           │   │   ├── st_nucleo_f3.cfg
    │           │   │   ├── st_nucleo_f4.cfg
    │           │   │   ├── st_nucleo_f7.cfg
    │           │   │   ├── st_nucleo_g0.cfg
    │           │   │   ├── st_nucleo_g4.cfg
    │           │   │   ├── st_nucleo_h743zi.cfg
    │           │   │   ├── st_nucleo_h745zi.cfg
    │           │   │   ├── st_nucleo_l073rz.cfg
    │           │   │   ├── st_nucleo_l1.cfg
    │           │   │   ├── st_nucleo_l4.cfg
    │           │   │   ├── st_nucleo_l5.cfg
    │           │   │   ├── st_nucleo_wb55.cfg
    │           │   │   ├── steval-idb007v1.cfg
    │           │   │   ├── steval-idb008v1.cfg
    │           │   │   ├── steval-idb011v1.cfg
    │           │   │   ├── steval-idb012v1.cfg
    │           │   │   ├── steval_pcc010.cfg
    │           │   │   ├── stm320518_eval.cfg
    │           │   │   ├── stm320518_eval_stlink.cfg
    │           │   │   ├── stm32100b_eval.cfg
    │           │   │   ├── stm3210b_eval.cfg
    │           │   │   ├── stm3210c_eval.cfg
    │           │   │   ├── stm3210e_eval.cfg
    │           │   │   ├── stm3220g_eval.cfg
    │           │   │   ├── stm3220g_eval_stlink.cfg
    │           │   │   ├── stm3241g_eval.cfg
    │           │   │   ├── stm3241g_eval_stlink.cfg
    │           │   │   ├── stm32429i_eval.cfg
    │           │   │   ├── stm32429i_eval_stlink.cfg
    │           │   │   ├── stm32439i_eval.cfg
    │           │   │   ├── stm32439i_eval_stlink.cfg
    │           │   │   ├── stm327x6g_eval.cfg
    │           │   │   ├── stm32f0discovery.cfg
    │           │   │   ├── stm32f103c8_blue_pill.cfg
    │           │   │   ├── stm32f334discovery.cfg
    │           │   │   ├── stm32f3discovery.cfg
    │           │   │   ├── stm32f412g-disco.cfg
    │           │   │   ├── stm32f413h-disco.cfg
    │           │   │   ├── stm32f429disc1.cfg
    │           │   │   ├── stm32f429discovery.cfg
    │           │   │   ├── stm32f469discovery.cfg
    │           │   │   ├── stm32f469i-disco.cfg
    │           │   │   ├── stm32f4discovery.cfg
    │           │   │   ├── stm32f723e-disco.cfg
    │           │   │   ├── stm32f746g-disco.cfg
    │           │   │   ├── stm32f769i-disco.cfg
    │           │   │   ├── stm32f7discovery.cfg
    │           │   │   ├── stm32h735g-disco.cfg
    │           │   │   ├── stm32h745i-disco.cfg
    │           │   │   ├── stm32h747i-disco.cfg
    │           │   │   ├── stm32h750b-disco.cfg
    │           │   │   ├── stm32h7b3i-disco.cfg
    │           │   │   ├── stm32h7x3i_eval.cfg
    │           │   │   ├── stm32h7x_dual_qspi.cfg
    │           │   │   ├── stm32l0discovery.cfg
    │           │   │   ├── stm32l476g-disco.cfg
    │           │   │   ├── stm32l496g-disco.cfg
    │           │   │   ├── stm32l4discovery.cfg
    │           │   │   ├── stm32l4p5g-disco.cfg
    │           │   │   ├── stm32l4r9i-disco.cfg
    │           │   │   ├── stm32ldiscovery.cfg
    │           │   │   ├── stm32mp13x_dk.cfg
    │           │   │   ├── stm32mp15x_dk2.cfg
    │           │   │   ├── stm32vldiscovery.cfg
    │           │   │   ├── str910-eval.cfg
    │           │   │   ├── telo.cfg
    │           │   │   ├── ti_am335xevm.cfg
    │           │   │   ├── ti_am437x_idk.cfg
    │           │   │   ├── ti_am43xx_evm.cfg
    │           │   │   ├── ti_am625evm.cfg
    │           │   │   ├── ti_am642evm.cfg
    │           │   │   ├── ti_am654evm.cfg
    │           │   │   ├── ti_beagleboard.cfg
    │           │   │   ├── ti_beagleboard_xm.cfg
    │           │   │   ├── ti_beaglebone-base.cfg
    │           │   │   ├── ti_beaglebone.cfg
    │           │   │   ├── ti_beaglebone_black.cfg
    │           │   │   ├── ti_blaze.cfg
    │           │   │   ├── ti_cc13x0_launchpad.cfg
    │           │   │   ├── ti_cc13x2_launchpad.cfg
    │           │   │   ├── ti_cc26x0_launchpad.cfg
    │           │   │   ├── ti_cc26x2_launchpad.cfg
    │           │   │   ├── ti_cc3200_launchxl.cfg
    │           │   │   ├── ti_cc3220sf_launchpad.cfg
    │           │   │   ├── ti_cc32xx_launchpad.cfg
    │           │   │   ├── ti_dk-tm4c129.cfg
    │           │   │   ├── ti_ek-tm4c123gxl.cfg
    │           │   │   ├── ti_ek-tm4c1294xl.cfg
    │           │   │   ├── ti_j7200evm.cfg
    │           │   │   ├── ti_j721evm.cfg
    │           │   │   ├── ti_j721s2evm.cfg
    │           │   │   ├── ti_msp432_launchpad.cfg
    │           │   │   ├── ti_pandaboard.cfg
    │           │   │   ├── ti_pandaboard_es.cfg
    │           │   │   ├── ti_tmdx570ls20susb.cfg
    │           │   │   ├── ti_tmdx570ls31usb.cfg
    │           │   │   ├── tocoding_poplar.cfg
    │           │   │   ├── topas910.cfg
    │           │   │   ├── topasa900.cfg
    │           │   │   ├── tp-link_tl-mr3020.cfg
    │           │   │   ├── tp-link_wdr4300.cfg
    │           │   │   ├── trion_t20_bga256.cfg
    │           │   │   ├── twr-k60f120m.cfg
    │           │   │   ├── twr-k60n512.cfg
    │           │   │   ├── twr-vf65gs10.cfg
    │           │   │   ├── twr-vf65gs10_cmsisdap.cfg
    │           │   │   ├── tx25_stk5.cfg
    │           │   │   ├── tx27_stk5.cfg
    │           │   │   ├── unknown_at91sam9260.cfg
    │           │   │   ├── uptech_2410.cfg
    │           │   │   ├── vd_a53x2_dap.cfg
    │           │   │   ├── vd_a53x2_jtag.cfg
    │           │   │   ├── vd_m4_dap.cfg
    │           │   │   ├── vd_m4_jtag.cfg
    │           │   │   ├── vd_m7_jtag.cfg
    │           │   │   ├── vd_pulpissimo_jtag.cfg
    │           │   │   ├── vd_swerv_jtag.cfg
    │           │   │   ├── vd_xt8_jtag.cfg
    │           │   │   ├── verdex.cfg
    │           │   │   ├── voipac.cfg
    │           │   │   ├── voltcraft_dso-3062c.cfg
    │           │   │   ├── x300t.cfg
    │           │   │   ├── xmc-2go.cfg
    │           │   │   ├── xmc1100-boot-kit.cfg
    │           │   │   ├── xmc4200-application-kit-actuator.cfg
    │           │   │   ├── xmc4300-relax.cfg
    │           │   │   ├── xmc4500-application-kit-general.cfg
    │           │   │   ├── xmc4500-application-kit-sdram.cfg
    │           │   │   ├── xmc4500-relax.cfg
    │           │   │   ├── xmc4700-relax.cfg
    │           │   │   ├── xmc4800-relax.cfg
    │           │   │   ├── xmos_xk-xac-xa8_arm.cfg
    │           │   │   ├── xtensa-kc705-ext-dap.cfg
    │           │   │   ├── xtensa-kc705-ext.cfg
    │           │   │   ├── xtensa-kc705-onboard.cfg
    │           │   │   ├── xtensa-palladium-vdebug.cfg
    │           │   │

================================================
FILE CONTENTS
================================================

================================================
FILE: CN/README-old-2.md
================================================
# **完整设备仿真定制固件开发指南**

---

## **目录**

### **第1部分:基础概念**

1. [介绍](#1-介绍)
   - [1.1 本指南的目的](#11-本指南的目的)
   - [1.2 目标受众](#12-目标受众)
   - [1.3 如何使用本指南](#13-如何使用本指南)
2. [关键定义](#2-关键定义)
3. [设备兼容性](#3-设备兼容性)
   - [3.1 支持的基于FPGA的硬件](#31-支持的基于fpga的硬件)
   - [3.2 PCIe硬件注意事项](#32-pcie硬件注意事项)
   - [3.3 系统要求](#33-系统要求)
4. [要求](#4-要求)
   - [4.1 硬件](#41-硬件)
   - [4.2 软件](#42-软件)
   - [4.3 环境设置](#43-环境设置)
5. [收集捐赠设备信息](#5-收集捐赠设备信息)
   - [5.1 使用Arbor进行PCIe设备扫描](#51-使用arbor进行pcie设备扫描)
   - [5.2 提取和记录设备属性](#52-提取和记录设备属性)
6. [初始固件定制](#6-初始固件定制)
   - [6.1 修改配置空间](#61-修改配置空间)
   - [6.2 插入设备序列号(DSN)](#62-插入设备序列号dsn)
7. [Vivado项目设置和定制](#7-vivado项目设置和定制)
   - [7.1 生成Vivado项目文件](#71-生成vivado项目文件)
   - [7.2 修改IP模块](#72-修改ip模块)

### **第2部分:中级概念与实现**

8. [高级固件定制](#8-高级固件定制)
   - [8.1 为仿真配置PCIe参数](#81-为仿真配置pcie参数)
   - [8.2 调整BAR和内存映射](#82-调整bar和内存映射)
   - [8.3 仿真设备电源管理和中断](#83-仿真设备电源管理和中断)
9. [仿真设备特定功能](#9-仿真设备特定功能)
   - [9.1 实现高级PCIe功能](#91-实现高级pcie功能)
   - [9.2 仿真供应商特定特性](#92-仿真供应商特定特性)
10. [事务层数据包(TLP)仿真](#10-事务层数据包tlp仿真)
    - [10.1 理解和捕获TLP](#101-理解和捕获tlp)
    - [10.2 为特定操作制作自定义TLP](#102-为特定操作制作自定义tlp)

### **第3部分:高级技术与优化**

11. [构建、烧录和测试](#11-构建烧录和测试)
    - [11.1 综合与实现](#111-综合与实现)
    - [11.2 烧录比特流](#112-烧录比特流)
    - [11.3 测试与验证](#113-测试与验证)
12. [高级调试技术](#12-高级调试技术)
    - [12.1 使用Vivado的集成逻辑分析器](#121-使用vivado的集成逻辑分析器)
    - [12.2 PCIe流量分析工具](#122-pcie流量分析工具)
13. [故障排除](#13-故障排除)
    - [13.1 设备检测问题](#131-设备检测问题)
    - [13.2 内存映射和BAR配置错误](#132-内存映射和bar配置错误)
    - [13.3 DMA性能和TLP错误](#133-dma性能和tlp错误)
14. [仿真准确性和优化](#14-仿真准确性和优化)
    - [14.1 精确计时仿真技术](#141-精确计时仿真技术)
    - [14.2 对系统调用的动态响应](#142-对系统调用的动态响应)
15. [固件开发最佳实践](#15-固件开发最佳实践)
    - [15.1 持续测试和文档编制](#151-持续测试和文档编制)
    - [15.2 管理固件版本](#152-管理固件版本)
    - [15.3 安全考虑](#153-安全考虑)
16. [其他资源](#16-其他资源)
17. [联系信息](#17-联系信息)
18. [支持与贡献](#18-支持与贡献)

---

## **前言**

对于那些想要学习的人,你们选择了真正启迪的道路。你们用本指南所构建的东西将超越这些人能想象的一切。你们正在走向卓越,我们将一起超越他们所建立的失败。

---

## **第1部分:基础概念**

---

## **1. 介绍**

### **1.1 本指南的目的**

本指南的主要目的是提供一种分步方法,开发用于基于FPGA设备的自定义直接内存访问(DMA)固件,以准确仿真PCIe硬件。这使得能够实现硬件测试、系统调试、安全研究和硬件仿真等应用。

通过遵循本指南,您将学习如何:

- 从捐赠设备收集必要信息。
- 定制固件以仿真特定的硬件设备。
- 使用Vivado和Visual Studio Code等工具设置开发环境。
- 了解与PCIe和DMA操作相关的关键概念。

### **1.2 目标受众**

本指南适用于:

- **固件开发人员**:对创建用于硬件仿真、测试或绕过硬件限制的自定义固件感兴趣的工程师。
- **硬件工程师**:需要仿真特定设备进行硬件测试和开发的专业人员。
- **安全研究人员**:进行漏洞评估、恶意软件分析或需要硬件仿真的安全测试的个人。
- **FPGA爱好者**:对FPGA定制和低级硬件仿真感兴趣的爱好者和学习者。

### **1.3 如何使用本指南**

本指南分为三个部分:

- **第1部分:基础概念**:涵盖开始设备仿真所需的基本概念、设置和初始步骤的固件开发。
- **第2部分:中级概念与实现**:深入讨论更复杂的主题,如高级固件定制、TLP仿真和初始调试技术。
- **第3部分:高级技术与优化**:探索高级调试、故障排除、优化策略和最佳实践。

建议按照指南的顺序进行,以建立牢固的理解,然后再处理高级主题。

---

## **2. 关键定义**

理解术语对于有效地遵循本指南至关重要。以下是与PCIe、DMA和设备仿真相关的关键定义:

- **DMA(直接内存访问)**:一种允许硬件设备直接从系统内存读取或写入数据的功能,无需CPU干预,实现高速数据传输。
- **TLP(事务层数据包)**:PCIe架构中的基本通信单位,封装控制和数据信息。
- **BAR(基地址寄存器)**:PCIe设备中的寄存器,定义内存和I/O地址区域,将设备内存映射到系统内存空间。
- **FPGA(现场可编程门阵列)**:一种可重配置的集成电路,可编程以执行特定的硬件功能。
- **MSI/MSI-X(消息信号中断)**:PCIe设备用于向CPU发送中断的机制,无需使用传统的中断线。
- **设备序列号(DSN)**:与特定设备关联的唯一标识符,通常用于高级设备识别。
- **PCIe配置空间**:标准化的内存区域,PCIe设备在其中提供关于自身的信息并配置操作参数。
- **捐赠设备**:用于提取配置和识别详细信息以在FPGA上仿真其行为的PCIe硬件设备。

---

## **3. 设备兼容性**

### **3.1 支持的基于FPGA的硬件**

虽然本指南主要关注**Squirrel DMA(35T)**卡,因为它易于获取,但这些方法也可适用于其他基于FPGA的DMA硬件:

- **Squirrel(35T)**
  - **描述**:经济实惠的基于FPGA的DMA设备,适用于标准内存获取和设备仿真。
- **Enigma-X1(75T)**
  - **描述**:中端FPGA,提供增强的资源,适合更高要求的内存操作。
- **ZDMA(100T)**
  - **描述**:高性能FPGA,针对快速内存交互进行了优化,适用于广泛的内存读/写。
- **Kintex-7**
  - **描述**:高级FPGA,具有强大的功能,适用于复杂项目和大规模DMA解决方案。

### **3.2 PCIe硬件注意事项**

为了确保平滑的仿真,必须解决多个PCIe特定功能:

- **IOMMU/VT-d设置**
  - **建议**:禁用IOMMU(Intel的VT-d)或AMD的等效功能,以允许不受限制的DMA访问。
  - **理由**:IOMMU可能会限制DMA操作,可能会干扰内存获取和仿真。
- **内核DMA保护**
  - **建议**:在现代系统中禁用内核DMA保护功能。
  - **步骤**:
    - **Windows**:在BIOS/UEFI设置中禁用安全启动或基于虚拟化的安全性(VBS)等功能。
    - **注意**:禁用这些功能可能会使系统暴露于安全风险中;确保您在安全的环境中操作。
- **PCIe插槽要求**
  - **建议**:使用与FPGA设备要求匹配的兼容PCIe插槽(例如,x1、x4)。
  - **理由**:确保与主机系统的最佳性能和兼容性。

### **3.3 系统要求**

- **主机系统**
  - **处理器**:多核CPU(Intel i5/i7或AMD等效)
  - **内存**:至少16 GB RAM
  - **存储**:至少有100 GB可用空间的SSD
  - **操作系统**:Windows 10/11(64位)或兼容的Linux发行版
- **外围设备**
  - **JTAG编程器**:用于将固件烧录到FPGA
  - **PCIe插槽**:确保主机系统有一个兼容DMA卡的可用PCIe插槽

---

## **4. 要求**

### **4.1 硬件**

- **捐赠PCIe设备**
  - **目的**:用于仿真提取设备ID和配置数据的来源。
  - **示例**:网络适配器、存储控制器或任何未使用的通用PCIe卡。
- **DMA FPGA卡**
  - **描述**:能够执行DMA操作的基于FPGA的设备。
  - **示例**:Squirrel(35T)、Enigma-X1(75T)、ZDMA(100T)、Kintex-7
- **JTAG编程器**
  - **目的**:用于将固件烧录到FPGA上。
  - **示例**:Xilinx Platform Cable USB II、Digilent JTAG-HS3

### **4.2 软件**

- **Xilinx Vivado设计套件**
  - **描述**:用于综合和构建固件项目的FPGA开发软件。
  - **下载**:[Xilinx Vivado](https://www.xilinx.com/support/download.html)
- **Visual Studio Code**
  - **描述**:用于编辑Verilog或VHDL代码的代码编辑器。
  - **下载**:[Visual Studio Code](https://code.visualstudio.com/)
- **PCILeech-FPGA**
  - **描述**:用于DMA固件开发的代码库和基础代码。
  - **代码库**:[PCILeech-FPGA在GitHub上](https://github.com/ufrisk/pcileech-fpga)
- **Arbor**
  - **描述**:用于收集设备信息的PCIe设备扫描工具。
  - **下载**:[Arbor by MindShare](https://www.mindshare.com/software/Arbor)
  - **注意**:需要创建账户;提供14天试用。
- **替代工具**
  - **Telescan PE**
    - **描述**:作为Arbor替代的PCIe流量分析工具。
    - **下载**:[Teledyne LeCroy Telescan PE](https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software)
    - **注意**:免费但需要手动注册批准。

### **4.3 环境设置**

#### **4.3.1 安装Xilinx Vivado设计套件**

- **步骤**:

  1. 访问[Xilinx Vivado下载页面](https://www.xilinx.com/support/download.html)。
  2. 下载与您的FPGA设备兼容的适当版本。
  3. 运行安装程序并按照屏幕指示进行操作。
  4. 在安装过程中选择必要的组件。
  5. 启动Vivado以确保正确安装。

#### **4.3.2 安装Visual Studio Code**

- **步骤**:

  1. 访问[Visual Studio Code下载页面](https://code.visualstudio.com/)。
  2. 下载并安装适用于您的操作系统的版本。
  3. 安装支持Verilog或VHDL的扩展(例如,**Verilog-HDL/SystemVerilog**)。

#### **4.3.3 克隆PCILeech-FPGA代码库**

- **步骤**:

  1. 打开终端或命令提示符。
  2. 导航到您想要的目录:

     ```bash
     cd ~/Projects/
     ```

  3. 克隆代码库:

     ```bash
     git clone https://github.com/ufrisk/pcileech-fpga.git
     ```

  4. 进入克隆的目录:

     ```bash
     cd pcileech-fpga
     ```

#### **4.3.4 设置干净的开发环境**

- **建议**:在隔离的环境中工作,以防止意外的交互。
- **步骤**:

  1. 使用专用的开发机器或虚拟机。
  2. 确保没有其他应用程序干扰PCIe操作或FPGA编程。

---

## **5. 收集捐赠设备信息**

准确的设备仿真依赖于仔细提取并复制捐赠设备的关键信息。全面的数据收集使您的FPGA能够忠实地模仿目标硬件的PCIe配置和行为,确保与主机系统的兼容性和功能。

### **5.1 使用Arbor进行PCIe设备扫描**

**Arbor**是一款功能强大且用户友好的工具,专为深入扫描PCIe设备而设计。它提供了连接硬件的配置空间的详细见解,使其成为提取设备仿真所需信息的宝贵资源。

#### **5.1.1 安装Arbor**

要开始使用Arbor进行设备扫描,您必须首先在系统上安装该软件。

**步骤**:

1. **访问Arbor下载页面**:

   - 使用您的首选浏览器,导航到官方[Arbor下载页面](https://www.mindshare.com/software/Arbor)。
   - 确保您直接访问该网站,以避免任何恶意重定向。

2. **创建账户(如果需要)**:

   - Arbor可能需要您创建用户账户以访问下载链接。
   - 提供必要的信息,例如您的姓名、电子邮件地址和组织。
   - 如果提示,请验证您的电子邮件以激活账户。

3. **下载Arbor**:

   - 登录后,找到Arbor的下载部分。
   - 选择与您的操作系统兼容的版本(例如,Windows 10/11 64位)。
   - 点击**下载**按钮,将安装程序保存到计算机上的已知位置。

4. **安装Arbor**:

   - 找到下载的安装程序文件(例如,`ArborSetup.exe`)。
   - 右键单击安装程序,选择**以管理员身份运行**,以确保其具有必要的权限。
   - 按照屏幕上的指示完成安装过程。
     - 接受许可协议。
     - 选择安装目录。
     - 如果需要,可选择创建桌面快捷方式。

5. **验证安装**:

   - 完成后,确保Arbor列在您的开始菜单或桌面上。
   - 启动Arbor,确认其无错误打开。

#### **5.1.2 扫描PCIe设备**

安装Arbor后,您可以继续扫描系统中连接的PCIe设备。

**步骤**:

1. **启动Arbor**:

   - 双击桌面上的Arbor图标,或通过开始菜单找到它。
   - 如果用户帐户控制(UAC)提示,请允许应用程序对您的设备进行更改。

2. **导航到本地系统选项卡**:

   - 在Arbor界面中,找到导航窗格或选项卡。
   - 点击**Local System**以访问扫描本地计算机的工具。

3. **扫描PCIe设备**:

   - 找到通常位于界面顶部或底部的**Scan**或**Rescan**按钮。
   - 点击**Scan/Rescan**以启动检测过程。
   - 等待扫描过程完成;根据连接的设备数量,这可能需要一些时间。

4. **查看检测到的设备**:

   - 扫描完成后,Arbor将显示所有检测到的PCIe设备列表。
   - 设备通常以其名称、设备ID和其他识别信息列出。

#### **5.1.3 识别捐赠设备**

正确识别捐赠设备对于准确的仿真至关重要。

**步骤**:

1. **在列表中找到您的捐赠设备**:

   - 滚动浏览Arbor检测到的设备列表。
   - 查找与您的捐赠硬件型号匹配的设备。
   - 设备可能按供应商名称、设备类型或功能列出。

2. **验证设备详细信息**:

   - 点击设备以选择它。
   - 确认**设备ID**和**供应商ID**与您的捐赠设备匹配。
     - **提示**:这些ID通常可以在设备的文档或制造商的网站上找到。

3. **查看详细配置**:

   - 选择设备后,找到并点击**查看详细信息**或**属性**等选项。
   - 这将打开一个详细视图,显示设备的配置空间和功能。

4. **与物理硬件进行交叉引用**:

   - 如果列出了多个类似的设备,请将**插槽编号**或**总线地址**与安装捐赠设备的物理插槽进行比较。

#### **5.1.4 捕获设备数据**

从捐赠设备中提取详细信息对于准确的仿真至关重要。

**要提取的信息**:

- **设备ID(0xXXXX)**:
  - 一个唯一的16位设备型号标识符。
- **供应商ID(0xYYYY)**:
  - 分配给制造商的16位标识符。
- **子系统ID(0xZZZZ)**:
  - 标识特定的子系统或变体。
- **子系统供应商ID(0xWWWW)**:
  - 标识子系统的供应商。
- **修订ID(0xRR)**:
  - 指示设备的修订级别。
- **类代码(0xCCCCCC)**:
  - 定义设备类型的24位代码(例如,网络控制器、存储设备)。
- **基地址寄存器(BARs)**:
  - 定义设备使用的内存或I/O空间的寄存器。
  - 包括BAR0到BAR5,每个可能为32位或64位。
- **功能**:
  - 列出支持的功能,如MSI/MSI-X、电源管理、PCIe链路速度和宽度。
- **设备序列号(DSN)**:
  - 如果设备支持,则为64位唯一标识符。

**步骤**:

1. **导航到PCI配置选项卡**:

   - 在设备的详细视图中,找到并选择**PCI Config**或**Configuration Space**选项卡。

2. **记录相关细节**:

   - 仔细记录每个所需的字段。
   - 为了准确性,可以使用截图或将值复制到文本文件或电子表格中。
   - 确保十六进制值记录正确,包括`0x`前缀(如果使用)。

3. **展开功能列表**:

   - 查找标记为**Capabilities**或**Advanced Features**的部分。
   - 记录每个功能及其参数(例如,MSI数量、支持的电源状态)。

4. **详细检查BARs**:

   - 对于每个BAR,注意:
     - **BAR编号(例如,BAR0)**:
     - **类型(内存或I/O)**:
     - **位宽(32位或64位)**:
     - **大小(例如,256 MB)**:
     - **可预取状态(是/否)**:

5. **保存数据以供参考**:

   - 将所有信息编入组织良好的文档中。
   - 清晰地标记每个部分,便于在固件定制期间参考。

6. **仔细检查条目**:

   - 重新检查所有记录的数据以确保准确性。
   - 通过重新访问Arbor界面,纠正任何差异。

### **5.2 提取和记录设备属性**

在捕获数据后,理解每个属性的意义并确保其已被准确记录至关重要。

**确保您已准确记录以下内容**:

1. **设备ID**:

   - **目的**:唯一标识设备型号。
   - **用途**:对于主机操作系统加载正确的驱动程序至关重要。

2. **供应商ID**:

   - **目的**:标识制造商。
   - **用途**:与设备ID一起用于匹配设备驱动程序。

3. **子系统ID和子系统供应商ID**:

   - **目的**:指定子系统的设备和供应商ID,允许区分变体。
   - **用途**:对于具有多种配置或OEM特定版本的设备很重要。

4. **修订ID**:

   - **目的**:指示硬件修订版本。
   - **用途**:有助于识别可能需要不同驱动程序或固件的特定硬件版本。

5. **类代码**:

   - **目的**:对设备类型进行分类(例如,大容量存储、网络控制器)。
   - **用途**:允许操作系统了解设备的主要功能。

6. **基地址寄存器(BARs)**:

   - **目的**:定义设备将使用的内存或I/O地址区域。
   - **用途**:对于将设备内存映射到系统地址空间至关重要。

7. **功能**:

   - **目的**:列出设备支持的高级功能。
   - **示例**:
     - **MSI/MSI-X**:用于高效中断处理的消息信号中断。
     - **电源管理**:如D0、D1、D2、D3hot、D3cold状态。
     - **PCIe链路速度/宽度**:确定数据传输能力。

8. **设备序列号(DSN)**:

   - **目的**:设备的唯一64位标识符。
   - **用途**:用于高级识别,可能是某些驱动程序所必需的。

**最佳实践**:

- **组织数据**:

  - 创建一个结构化的文档或电子表格。
  - 使用清晰的标题和子标题标记每个属性。

- **包括单位和格式**:

  - 指明大小的单位(例如,MB、KB)。
  - 对十六进制值使用一致的格式(例如,`0x1234`)。

- **与规格交叉引用**:

  - 如果可用,请查阅设备的数据表以验证值。
  - 这有助于识别任何差异或不寻常的配置。

- **保护数据**:

  - 安全地存储收集的信息。
  - 注意任何专有或机密信息。

---

## **6. 初始固件定制**

在详细记录了捐赠设备的信息后,下一步是定制您的FPGA固件,以准确仿真捐赠设备。这涉及修改PCIe配置空间,并确保内存映射正确对齐。

### **6.1 修改配置空间**

PCIe配置空间是定义设备如何被识别和与主机系统交互的关键组件。将此空间定制为匹配捐赠设备对于成功的仿真至关重要。

#### **6.1.1 导航到配置文件**

配置空间在您的项目中定义在特定的SystemVerilog(.sv)文件中。

**路径**:

- **标准路径**:

  ```
  pcileech-fpga/pcileech-wifi-main/src/pcileech_pcie_cfg_a7.sv
  ```

- **备用路径(取决于目录结构)**:

  ```
  pcileech-fpga/src/pcileech_pcie_cfg_a7.sv
  ```

**注意**:

- 确保您位于正确的项目目录中。
- 文件名可能会根据FPGA型号略有变化(例如,`_a7`表示Artix-7系列)。

#### **6.1.2 在Visual Studio Code中打开文件**

编辑配置文件需要一个支持SystemVerilog语法高亮的合适代码编辑器。

**步骤**:

1. **启动Visual Studio Code**:

   - 点击VS Code图标,或通过开始菜单找到它。

2. **打开文件**:

   - 使用**文件 > 打开文件**,或按`Ctrl + O`。
   - 导航到上述的配置文件路径。
   - 选择`pcileech_pcie_cfg_a7.sv`,然后点击**打开**。

3. **验证语法高亮**:

   - 确保编辑器识别`.sv`文件扩展名。
   - 如果需要,安装支持SystemVerilog的扩展。

4. **熟悉文件结构**:

   - 滚动浏览文件,了解现有的赋值和注释。
   - 查找定义配置寄存器的部分。

#### **6.1.3 修改设备ID和供应商ID**

更新这些标识符对于主机系统将仿真设备识别为捐赠设备至关重要。

**步骤**:

1. **搜索`cfg_deviceid`**:

   - 使用搜索功能(`Ctrl + F`)。
   - 找到定义`cfg_deviceid`的行。

2. **更新设备ID**:

   ```verilog
   cfg_deviceid <= 16'hXXXX;  // 用捐赠设备的设备ID替换XXXX
   ```

   - **示例**:
     - 如果捐赠设备的设备ID是`0x1234`,则更新为:

       ```verilog
       cfg_deviceid <= 16'h1234;
       ```

3. **搜索`cfg_vendorid`**:

   - 找到定义`cfg_vendorid`的行。

4. **更新供应商ID**:

   ```verilog
   cfg_vendorid <= 16'hYYYY;  // 用捐赠设备的供应商ID替换YYYY
   ```

   - **示例**:
     - 如果捐赠设备的供应商ID是`0xABCD`,则更新为:

       ```verilog
       cfg_vendorid <= 16'hABCD;
       ```

5. **确保正确的格式**:

   - 确认十六进制值以`16'h`为前缀。
   - 保持一致的缩进和注释风格。

#### **6.1.4 修改子系统ID和修订ID**

这些标识符提供有关设备变体和硬件修订的其他详细信息。

**步骤**:

1. **搜索`cfg_subsysid`**:

   - 找到定义`cfg_subsysid`的行。

2. **更新子系统ID**:

   ```verilog
   cfg_subsysid <= 16'hZZZZ;  // 用捐赠设备的子系统ID替换ZZZZ
   ```

   - **示例**:
     - 如果捐赠设备的子系统ID是`0x5678`,则更新为:

       ```verilog
       cfg_subsysid <= 16'h5678;
       ```

3. **搜索`cfg_subsysvendorid`**:

   - 找到定义`cfg_subsysvendorid`的行。

4. **更新子系统供应商ID(如果适用)**:

   ```verilog
   cfg_subsysvendorid <= 16'hWWWW;  // 用捐赠设备的子系统供应商ID替换WWWW
   ```

   - **示例**:
     - 如果捐赠设备的子系统供应商ID是`0x9ABC`,则更新为:

       ```verilog
       cfg_subsysvendorid <= 16'h9ABC;
       ```

5. **搜索`cfg_revisionid`**:

   - 找到定义`cfg_revisionid`的行。

6. **更新修订ID**:

   ```verilog
   cfg_revisionid <= 8'hRR;   // 用捐赠设备的修订ID替换RR
   ```

   - **示例**:
     - 如果捐赠设备的修订ID是`0x01`,则更新为:

       ```verilog
       cfg_revisionid <= 8'h01;
       ```

#### **6.1.5 更新类代码**

类代码告知主机设备的类型和功能。

**步骤**:

1. **搜索`cfg_classcode`**:

   - 找到定义`cfg_classcode`的行。

2. **更新类代码**:

   ```verilog
   cfg_classcode <= 24'hCCCCCC;  // 用捐赠设备的类代码替换CCCCCC
   ```

   - **示例**:
     - 如果捐赠设备的类代码是`0x020000`(以太网控制器),则更新为:

       ```verilog
       cfg_classcode <= 24'h020000;
       ```

3. **验证正确的位宽**:

   - 确保类代码是24位值。
   - 十六进制值应以`24'h`为前缀。

#### **6.1.6 保存更改**

在进行所有修改后,保存并查看更改非常重要。

**步骤**:

1. **保存文件**:

   - 点击**文件 > 保存**,或按`Ctrl + S`。

2. **查看更改**:

   - 重新阅读修改的行以确认准确性。
   - 检查是否有任何语法错误或拼写错误。

3. **可选 - 使用版本控制**:

   - 如果使用Git或其他版本控制系统,用有意义的消息提交您的更改。

     - **示例**:

       ```
       git add pcileech_pcie_cfg_a7.sv
       git commit -m "更新PCIe配置,包含捐赠设备标识符"
       ```

### **6.2 插入设备序列号(DSN)**

设备序列号(DSN)是某些设备用于高级功能的唯一标识符。包括它可增强仿真的真实性。

#### **6.2.1 找到DSN字段**

DSN通常在同一配置文件中定义。

**步骤**:

1. **搜索`cfg_dsn`**:

   - 在`pcileech_pcie_cfg_a7.sv`中,使用搜索功能(`Ctrl + F`)查找`cfg_dsn`。

2. **了解现有赋值**:

   - DSN可能设置为默认值或清零。

     ```verilog
     cfg_dsn <= 64'h0000000000000000;  // 默认DSN
     ```

#### **6.2.2 插入DSN**

更新DSN涉及将其设置为捐赠设备的确切值。

**步骤**:

1. **更新`cfg_dsn`**:

   ```verilog
   cfg_dsn <= 64'hXXXXXXXX_YYYYYYYY;  // 用捐赠设备的DSN替换
   ```

   - **示例**:
     - 如果捐赠设备的DSN是`0x0011223344556677`,则更新为:

       ```verilog
       cfg_dsn <= 64'h0011223344556677;
       ```

2. **处理DSN不可用的情况**:

   - 如果捐赠设备没有DSN或不需要DSN,将其设置为零:

     ```verilog
     cfg_dsn <= 64'h0000000000000000;  // 无DSN
     ```

3. **确保正确的格式**:

   - DSN是一个64位值;确保其格式正确。
   - 对十六进制值使用`64'h`前缀。

4. **添加注释以增加清晰度**:

   - 包括一条注释,指明DSN的来源。

     ```verilog
     cfg_dsn <= 64'h0011223344556677;  // 捐赠设备的DSN
     ```

#### **6.2.3 保存更改**

通过保存和查看,完成修改。

**步骤**:

1. **保存文件**:

   - 点击**文件 > 保存**,或按`Ctrl + S`。

2. **验证语法**:

   - 查找编辑器中的任何红色下划线或错误指示。
   - 在继续之前,纠正任何问题。

3. **记录更改**:

   - 如果使用版本控制,请用适当的消息提交更新。

     - **示例**:

       ```
       git commit -am "在配置中插入捐赠设备的序列号(DSN)"
       ```

---

## **7. Vivado项目设置和定制**

在将固件文件更新为反映捐赠设备的配置后,下一步是将这些更改集成到Vivado项目中。这涉及生成项目文件、定制IP核,并为综合和实现准备设计。

### **7.1 生成Vivado项目文件**

Vivado使用Tcl脚本自动创建和配置项目。通过运行这些脚本,您可以确保所有设置都根据您的FPGA设备正确应用。

#### **7.1.1 打开Vivado**

从一个新的Vivado会话开始,确保先前的设置或项目不会干扰您当前的工作。

**步骤**:

1. **启动Vivado**:

   - 在开始菜单或桌面上找到Vivado应用程序。
   - 点击打开它。

2. **选择正确的版本**:

   - 如果安装了多个版本,确保您使用的版本与您的FPGA兼容(例如,Vivado 2020.1)。

3. **等待启动屏幕**:

   - 允许Vivado完全初始化,然后再继续。

#### **7.1.2 访问Tcl控制台**

Tcl控制台允许您直接执行脚本和命令。

**步骤**:

1. **打开Tcl控制台**:

   - 在Vivado界面中,转到菜单栏。
   - 点击**窗口** > **Tcl控制台**。
   - Tcl控制台将出现在窗口底部。

2. **调整控制台大小(可选)**:

   - 拖动控制台的顶部边框,以调整其大小,便于查看。

3. **清除先前的命令**:

   - 如果存在任何命令,您可以清除它们,以便干净地开始。

#### **7.1.3 导航到项目目录**

确保Tcl控制台指向您的项目脚本所在的正确目录。

**对于Squirrel DMA(35T)**:

**路径**:

- 您的项目目录,通常是:

  ```
  C:/Users/YourUsername/Documents/pcileech-fpga/pcileech-wifi-main/
  ```

**步骤**:

1. **设置工作目录**:

   - 在Tcl控制台中输入:

     ```tcl
     cd C:/Users/YourUsername/Documents/pcileech-fpga/pcileech-wifi-main/
     ```

     - 用您系统上的实际位置替换路径。

2. **验证目录更改**:

   - 在Tcl控制台中输入`pwd`。
   - 控制台应显示当前目录,确认更改。

#### **7.1.4 生成Vivado项目**

运行适当的Tcl脚本将设置项目,包含所有必要的配置。

**步骤**:

1. **运行Tcl脚本**:

   - 对于**Squirrel(35T)**:

     ```tcl
     source vivado_generate_project_squirrel.tcl -notrace
     ```

   - 对于**Enigma-X1(75T)**:

     ```tcl
     source vivado_generate_project_enigma_x1.tcl -notrace
     ```

   - 对于**ZDMA(100T)**:

     ```tcl
     source vivado_generate_project_100t.tcl -notrace
     ```

2. **等待脚本完成**:

   - 该脚本将执行多个命令:
     - 创建项目。
     - 添加源文件。
     - 配置项目设置。
   - 监视Tcl控制台的进度消息。
   - 解决可能出现的任何错误,例如缺少文件或路径不正确。

3. **确认项目生成**:

   - 完成后,控制台将指示项目已创建。
   - 项目文件(`.xpr`和相关目录)将出现在项目目录中。

#### **7.1.5 打开生成的项目**

现在项目已生成,您可以在Vivado中打开它以进行进一步的定制。

**步骤**:

1. **打开项目**:

   - 在Vivado中,点击**文件** > **打开项目**。
   - 导航到您的项目目录。

2. **选择项目文件**:

   - 对于**Squirrel**:

     ```
     pcileech_squirrel_top.xpr
     ```

   - 点击`.xpr`文件以选择它。

3. **点击打开**:

   - Vivado将加载项目,显示设计层次结构和源文件。

4. **验证项目内容**:

   - 在**项目管理器**窗口中,确保所有源文件都列出。
   - 检查打开时是否有任何警告或错误。

### **7.2 修改IP模块**

PCIe IP核是一个关键组件,必须配置以匹配捐赠设备的规格。定制IP核可确保FPGA在PCIe协议级别与捐赠硬件的行为相同。

#### **7.2.1 访问PCIe IP核**

PCIe IP核是在您的Vivado项目中实例化的IP模块。

**步骤**:

1. **找到PCIe IP核**:

   - 在**源文件**窗格中,确保选择了**层次结构**选项卡。
   - 展开设计层次结构,找到PCIe IP核。
     - 通常命名为`pcie_7x_0.xci`或类似名称。

2. **打开IP定制窗口**:

   - 右键点击`pcie_7x_0.xci`。
   - 从上下文菜单中选择**定制IP**。
   - **IP配置**窗口将打开。

3. **等待IP设置加载**:

   - IP定制界面可能需要一些时间初始化。
   - 在继续之前,确保所有选项和选项卡都已完全加载。

#### **7.2.2 定制设备ID和BARs**

在IP核中配置设备标识符对于主机系统正确枚举设备至关重要。

**步骤**:

1. **导航到设备和供应商标识符**:

   - 在IP定制窗口中,选择**设备和供应商标识符**选项卡或部分。

2. **输入设备ID**:

   - 找到标记为**Device ID**的字段。
   - 输入捐赠设备的设备ID(例如,`0x1234`)。

3. **输入供应商ID**:

   - 找到**Vendor ID**字段。
   - 输入捐赠设备的供应商ID(例如,`0xABCD`)。

4. **输入子系统ID和子系统供应商ID**:

   - 输入**Subsystem ID**(例如,`0x5678`)。
   - 输入**Subsystem Vendor ID**(例如,`0x9ABC`)。

5. **设置修订ID**:

   - 输入**Revision ID**(例如,`0x01`)。

6. **设置类代码**:

   - 输入**Class Code**(例如,`0x020000`用于以太网控制器)。

7. **配置其他标识符(如果可用)**:

   - 一些IP核允许设置**编程接口**、**设备功能**等。
   - 根据需要将其与捐赠设备匹配。

#### **7.2.3 配置BAR大小**

BAR定义了设备如何将其内部内存和寄存器映射到主机系统。

**步骤**:

1. **导航到基地址寄存器(BARs)**:

   - 在IP定制窗口中,选择**BARs**选项卡或部分。

2. **配置每个BAR**:

   - 对于**BAR0**到**BAR5**,根据捐赠设备设置以下参数:

     - **启用BAR**:选中或取消选中以匹配捐赠设备。
     - **BAR大小**:从下拉列表中选择大小(例如,**256 MB**、**64 KB**)。
     - **BAR类型**:
       - **内存(32位寻址)**
       - **内存(64位寻址)**
       - **I/O**
     - **可预取**:如果捐赠设备的BAR可预取,则选中。

3. **示例配置**:

   - **BAR0**:
     - 已启用
     - 大小:**256 MB**
     - 类型:**内存(64位)**
     - 可预取:**是**
   - **BAR1**:
     - 已禁用(如果捐赠设备不使用BAR1)

4. **确保对齐和不重叠空间**:

   - 确认映射的总内存不超过FPGA的能力。
   - 确保BAR大小符合PCIe规范要求。

5. **高级设置(如果适用)**:

   - 某些设备可能有特殊要求,如扩展ROM BAR。
   - 如果必要,配置这些设置。

#### **7.2.4 完成IP定制**

在配置所有必要的设置后,您需要应用更改。

**步骤**:

1. **审查所有设置**:

   - 浏览IP定制窗口中的每个选项卡。
   - 确认所有条目与捐赠设备的规格相匹配。

2. **应用更改**:

   - 点击**OK**或**Generate**以应用设置。
   - 如果提示,确认您希望继续更改。

3. **重新生成IP核**:

   - Vivado将重新生成IP核以反映新配置。
   - 监视**消息**窗格以获取任何错误或警告。

4. **更新项目中的IP**:

   - 确保更新的IP核已正确集成到您的项目中。
   - Vivado可能会提示更新IP依赖项;允许其执行此操作。

#### **7.2.5 锁定IP核**

锁定IP核可防止在综合和实现期间的意外更改。

**目的**:

- **防止覆盖**:确保您的手动配置被保留。
- **保持一致性**:在整个构建过程中保持IP核处于已知状态。

**步骤**:

1. **打开Tcl控制台**:

   - 在Vivado中,如果尚未打开,转到**窗口** > **Tcl控制台**。

2. **执行锁定命令**:

   - 输入以下命令:

     ```tcl
     set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
     ```

   - 按**Enter**执行。

3. **验证锁定**:

   - 检查**消息**窗格以确认。
   - IP核现在应标记为已锁定。

4. **解锁(如有必要)**:

   - 要在将来进行进一步更改,可以解锁IP核:

     ```tcl
     set_property -name {IP_LOCKED} -value false -objects [get_ips pcie_7x_0]
     ```

   - 记得在进行更改后重新锁定它。

5. **记录操作**:

   - 在您的项目文档中注明IP核已被锁定。
   - 这有助于团队成员了解项目的配置状态。

---

### **第2部分:中级概念与实现**

---

## **8. 高级固件定制**

为了实现对捐赠设备的精确仿真,需要进一步深入定制固件。这包括调整PCIe参数、调整基地址寄存器(BARs)、以及仿真电源管理和中断机制,以匹配捐赠设备的规格。这些步骤确保仿真设备能够与主机系统无缝交互,其行为与原始硬件完全一致。

### **8.1 为仿真配置PCIe参数**

准确的仿真要求您的FPGA设备的PCIe参数与捐赠设备精确匹配。这包括设置如PCIe链路速度、链路宽度、能力指针和最大有效载荷大小等。正确的配置确保与主机系统的兼容性,以及与设备驱动程序和应用程序的正确交互。

#### **8.1.1 匹配PCIe链路速度和宽度**

PCIe链路速度和宽度是决定设备数据吞吐量和性能的关键参数。匹配这些设置对于准确仿真至关重要。

**步骤**:

1. **访问PCIe IP核设置**:

   - **打开您的Vivado项目**:
     - 启动Vivado并打开您之前创建或修改的项目。
     - 确保所有源文件都已正确添加到项目中。

   - **找到PCIe IP核**:
     - 在**源文件**窗格中,展开层次结构,找到PCIe IP核实例,通常命名为`pcie_7x_0`。
     - 与IP核关联的文件通常是`pcie_7x_0.xci`。

   - **定制IP核**:
     - 右键点击`pcie_7x_0.xci`,选择**定制IP**。
     - IP配置窗口将打开,显示各种配置选项。

2. **设置最大链路速度**:

   - **导航到链路参数**:
     - 在IP配置窗口中,点击**Link Parameters**选项卡或部分。
     - 该部分包含与PCIe链路特性相关的设置。

   - **配置最大链路速度**:
     - 找到**Maximum Link Speed**选项。
     - 设置为与捐赠设备的链路速度相匹配。
       - **示例**:
         - 如果捐赠设备以**Gen2(5.0 GT/s)**运行,选择**5.0 GT/s**。
         - 如果以**Gen1(2.5 GT/s)**或**Gen3(8.0 GT/s)**运行,选择相应的选项。
       - **注意**:确保您的FPGA和物理硬件支持所选的链路速度。

3. **设置链路宽度**:

   - **配置链路宽度**:
     - 在同一**Link Parameters**部分,找到**Link Width**设置。
     - 设置为与捐赠设备的链路宽度相匹配。
       - **示例**:
         - 如果捐赠设备使用**x4**链路,将**Link Width**设置为**4**。
         - 选项通常包括**1**、**2**、**4**、**8**、**16**通道。
       - **注意**:物理连接器和FPGA必须支持所选的链路宽度。

4. **保存并重新生成**:

   - **应用更改**:
     - 配置链路速度和宽度后,点击**OK**应用更改。
     - Vivado可能提示您由于更改需要重新生成IP核。
     - 确认并允许重新生成过程完成。

   - **验证设置**:
     - 重新生成完成后,重新查看IP核设置,确保配置已正确应用。
     - 检查**消息**窗口中的任何警告或错误。

#### **8.1.2 设置能力指针**

PCIe配置空间中的能力指针指向各种能力结构,如MSI、电源管理等。正确设置这些指针确保主机系统能够找到并利用设备的功能。

**步骤**:

1. **在固件中找到能力指针**:

   - **打开配置文件**:
     - 在Visual Studio Code中,打开`pcileech_pcie_cfg_a7.sv`文件,位于:

       ```
       pcileech-fpga/pcileech-wifi-main/src/pcileech_pcie_cfg_a7.sv
       ```

   - **了解能力指针**:
     - 能力指针是一个8位寄存器,指向PCIe配置空间中的第一个能力结构,通常从标准配置头之后开始。

2. **设置能力指针值**:

   - **找到`cfg_cap_pointer`的赋值**:
     - 搜索代码中`cfg_cap_pointer`的定义行。

       ```verilog
       cfg_cap_pointer <= 8'hXX; // 当前值
       ```

   - **更新能力指针**:
     - 将`XX`替换为捐赠设备的能力指针值。
       - **示例**:
         - 如果捐赠设备的能力指针是`0x60`,则更新为:

           ```verilog
           cfg_cap_pointer <= 8'h60; // 更新以匹配捐赠设备
           ```

     - **确保正确对齐**:
       - 能力结构必须在4字节边界上对齐。
       - 能力指针应指向配置空间内的有效偏移量。

3. **保存更改**:

   - **保存配置文件**:
     - 进行更改后,点击**文件 > 保存**或按`Ctrl + S`保存文件。

   - **验证语法**:
     - 确保更改未引入语法错误。

   - **添加注释以增加清晰度**:
     - 添加注释,说明更改的原因,便于将来参考。

       ```verilog
       cfg_cap_pointer <= 8'h60; // 设置为捐赠设备在偏移量0x60的能力指针
       ```

#### **8.1.3 调整最大有效载荷和读取请求大小**

这些参数定义了在单个PCIe事务中可以传输的最大数据量。与捐赠设备匹配这些设置可确保兼容性和最佳性能。

**步骤**:

1. **设置最大有效载荷大小**:

   - **访问设备功能**:
     - 在PCIe IP核定制窗口中,导航到**Device Capabilities**或**Capabilities**选项卡。

   - **配置支持的最大有效载荷大小**:
     - 找到**Max Payload Size Supported**设置。
     - 将其设置为捐赠设备支持的值。
       - **选项**:
         - **128字节**、**256字节**、**512字节**、**1024字节**、**2048字节**、**4096字节**。
       - **示例**:
         - 如果捐赠设备支持最大有效载荷大小为**256字节**,请选择**256字节**。

2. **设置最大读取请求大小**:

   - **配置支持的最大读取请求大小**:
     - 在同一选项卡中,找到**Max Read Request Size Supported**设置。
     - 将其设置为与捐赠设备的能力相匹配。
       - **示例**:
         - 如果捐赠设备支持最大读取请求大小为**512字节**,请选择**512字节**。

3. **调整固件参数**:

   - **打开`pcileech_pcie_cfg_a7.sv`**:
     - 确保配置文件在Visual Studio Code中打开。

   - **更新固件常量**:
     - 找到定义`max_payload_size_supported`和`max_read_request_size_supported`的行。

       ```verilog
       max_payload_size_supported <= 3'bZZZ; // 当前值
       max_read_request_size_supported <= 3'bWWW; // 当前值
       ```

   - **设置适当的值**:
     - 将`ZZZ`和`WWW`替换为大小的二进制表示。

       - **映射关系**:
         - **128字节**:`3'b000`
         - **256字节**:`3'b001`
         - **512字节**:`3'b010`
         - **1024字节**:`3'b011`
         - **2048字节**:`3'b100`
         - **4096字节**:`3'b101`

       - **示例**:
         - 对于**256字节**的有效载荷大小:

           ```verilog
           max_payload_size_supported <= 3'b001; // 支持高达256字节
           ```

         - 对于**512字节**的读取请求大小:

           ```verilog
           max_read_request_size_supported <= 3'b010; // 支持高达512字节
           ```

4. **保存更改**:

   - **保存文件**:
     - 更新值后,保存文件。

   - **验证一致性**:
     - 确保固件中的值与PCIe IP核中配置的值匹配。

   - **添加注释**:
     - 记录更改,便于将来参考。

       ```verilog
       max_payload_size_supported <= 3'b001; // 根据捐赠设备支持256字节
       max_read_request_size_supported <= 3'b010; // 根据捐赠设备支持512字节
       ```

### **8.2 调整BAR和内存映射**

基地址寄存器(BARs)定义了设备向主机暴露的内存区域。正确配置BARs和内存映射对于准确仿真和设备驱动程序的正常运行至关重要。

#### **8.2.1 设置BAR大小**

配置BAR大小可确保设备在枚举期间请求正确的地址空间,并且主机正确映射这些区域。

**步骤**:

1. **访问BAR配置**:

   - **定制PCIe IP核**:
     - 在Vivado中,右键点击`pcie_7x_0.xci`,选择**定制IP**。

   - **导航到BARs选项卡**:
     - 在IP配置窗口中,点击**Base Address Registers (BARs)**选项卡。

2. **配置BAR大小和类型**:

   - **匹配捐赠设备的BARs**:
     - 对于每个BAR(BAR0至BAR5),设置大小和类型以匹配捐赠设备。

   - **设置BAR大小**:
     - 从下拉菜单中为每个BAR选择适当的大小。
       - **示例**:
         - 如果**BAR0**是**64 KB**,将**BAR0 Size**设置为**64 KB**。
         - 如果**BAR1**是**128 MB**,将**BAR1 Size**设置为**128 MB**。

   - **设置BAR类型**:
     - 为每个BAR选择**32位**或**64位**寻址。
     - 指定BAR的类型是**内存**还是**I/O**。
     - 根据捐赠设备设置**可预取**状态。

   - **启用或禁用BARs**:
     - 确保仅启用了捐赠设备使用的BARs。

3. **更新BRAM配置**:

   - **调整BRAM IP核**:
     - 在`ip`目录中,找到与BARs对应的BRAM配置。

       - **文件**:

         ```
         pcileech-fpga/pcileech-wifi-main/ip/bram_bar_zero4k.xci
         pcileech-fpga/pcileech-wifi-main/ip/bram_pcie_cfgspace.xci
         ```

   - **修改BRAM大小**:
     - 打开每个BRAM IP核,调整内存大小以匹配相应的BAR大小。
     - 确保总内存不超过FPGA的容量。

4. **保存并重新生成**:

   - **应用更改**:
     - 配置BARs并更新BRAM大小后,点击**OK**。

   - **重新生成IP核**:
     - Vivado可能会提示由于更改需要重新生成IP核。
     - 允许重新生成完成。

   - **检查错误**:
     - 查看**消息**窗口中的任何与BAR配置相关的警告或错误。

#### **8.2.2 在固件中定义BAR地址空间**

设置BAR大小和类型后,您需要定义固件如何处理对这些BAR的访问。

**步骤**:

1. **打开BAR控制器文件**:

   - **找到源文件**:
     - 在Visual Studio Code中,打开:

       ```
       pcileech-fpga/pcileech-wifi-main/src/pcileech_tlps128_bar_controller.sv
       ```

2. **映射地址范围**:

   - **定义地址解码逻辑**:
     - 实现逻辑以检测何时访问BAR,基于地址。

       ```verilog
       always_comb begin
         if (bar_hit[0]) begin
           // 处理对BAR0的访问
         end else if (bar_hit[1]) begin
           // 处理对BAR1的访问
         end
         // 继续处理其他BAR
       end
       ```

   - **实现BAR访问处理**:
     - 对于每个BAR,定义如何管理读写操作。

       - **示例**:

         ```verilog
         if (bar_hit[0]) begin
           case (addr_offset)
             16'h0000: data_out <= reg0;
             16'h0004: data_out <= reg1;
             // 其他寄存器
             default: data_out <= 32'h0;
           endcase
         end
         ```

3. **实现地址解码逻辑**:

   - **计算地址偏移量**:

     ```verilog
     addr_offset = incoming_address - bar_base_address[0];
     ```

   - **处理数据传输**:

     ```verilog
     if (cfg_write) begin
       // 将数据写入适当的寄存器
     end else if (cfg_read) begin
       // 从适当的寄存器读取数据
     end
     ```

4. **保存更改**:

   - **保存文件**:
     - 实现逻辑后,保存`pcileech_tlps128_bar_controller.sv`文件。

   - **验证功能**:
     - 确保逻辑正确处理所有可能的访问。

#### **8.2.3 处理多个BAR**

正确管理多个BAR对于暴露多个内存或I/O区域的设备至关重要。

**步骤**:

1. **为每个BAR实现逻辑**:

   - **分离逻辑块**:
     - 为了清晰起见,在控制器内为每个BAR创建单独的代码块。

       ```verilog
       // BAR0处理
       if (bar_hit[0]) begin
         // BAR0特定逻辑
       end
       // BAR1处理
       if (bar_hit[1]) begin
         // BAR1特定逻辑
       end
       ```

   - **定义寄存器和内存**:
     - 根据需要为每个BAR分配寄存器或内存块。

2. **确保地址空间不重叠**:

   - **验证地址范围**:
     - 确认每个BAR的地址空间不重叠。
     - 根据PCIe规范要求,将BAR大小对齐到2的幂边界。

   - **更新地址解码**:
     - 调整地址解码逻辑,以考虑每个BAR的大小和基地址。

3. **测试BAR访问**:

   - **仿真测试**:
     - 使用仿真工具测试对每个BAR的读写操作。
     - 验证读取或写入的数据是否正确。

   - **硬件测试**:
     - 编程FPGA,使用主机上的软件访问每个BAR。
       - **示例**:
         - 在Linux上使用`lspci`检查BAR映射。
         - 编写执行内存映射I/O到BAR的测试程序。

### **8.3 仿真设备电源管理和中断**

仿真电源管理功能并实现中断对于需要与主机操作系统的电源和中断处理机制紧密交互的设备至关重要。

#### **8.3.1 电源管理配置**

实现电源管理允许设备支持各种电源状态,有助于系统范围的电源效率,并符合操作系统的期望。

**步骤**:

1. **在PCIe IP核中启用电源管理**:

   - **访问功能选项**:
     - 在PCIe IP核配置窗口中,选择**Capabilities**选项卡。

   - **启用电源管理**:
     - 勾选**Power Management**选项,以在设备的配置空间中包含此功能。

2. **设置支持的电源状态**:

   - **配置支持的状态**:
     - 指定设备支持哪些电源状态,例如:
       - **D0(完全开启)**
       - **D1、D2(中间状态)**
       - **D3hot、D3cold(低功耗状态)**
     - 将这些设置与捐赠设备的功能相匹配。

3. **在固件中实现电源状态逻辑**:

   - **打开`pcileech_pcie_cfg_a7.sv`**:
     - 修改固件以处理电源状态转换。

   - **处理电源管理控制和状态寄存器(PMCSR)**:
     - 实现对PMCSR的读写访问。

       ```verilog
       // PMCSR地址
       localparam PMCSR_ADDRESS = 12'h44; // 示例地址

       // PMCSR寄存器
       reg [15:0] pmcsr_reg;

       // 处理PMCSR写操作
       always @(posedge clk) begin
         if (cfg_write && cfg_address == PMCSR_ADDRESS) begin
           pmcsr_reg <= cfg_writedata[15:0];
           // 根据pmcsr_reg[1:0]更新电源状态
         end
       end
       ```

   - **管理电源状态效果**:
     - 实现逻辑,根据当前的电源状态改变设备行为。

4. **保存更改**:

   - **保存固件文件**:
     - 确保所有修改都已保存。

   - **验证功能**:
     - 通过仿真或硬件测试,测试电源管理功能。

#### **8.3.2 MSI/MSI-X配置**

实现MSI/MSI-X允许设备使用基于消息的中断,这比传统的基于引脚的中断更高效和可扩展。

**步骤**:

1. **在PCIe IP核中启用MSI/MSI-X**:

   - **访问中断配置**:
     - 在PCIe IP核配置窗口中,导航到**Interrupts**或**MSI/MSI-X**选项卡。

   - **选择中断类型**:
     - 根据捐赠设备,选择**MSI**或**MSI-X**。

   - **配置支持的向量数量**:
     - 设置与捐赠设备匹配的中断向量数量。
       - **MSI**支持最多32个向量。
       - **MSI-X**支持最多2048个向量。

   - **启用功能**:
     - 确保MSI或MSI-X功能包含在设备的配置空间中。

2. **在固件中实现中断逻辑**:

   - **打开`pcileech_pcie_tlp_a7.sv`**:
     - 修改固件以处理中断生成。

   - **定义中断信号**:

     ```verilog
     reg msi_req;
     ```

   - **实现中断生成逻辑**:

     ```verilog
     // 示例中断条件
     wire interrupt_condition = /* 条件逻辑 */;

     // 生成MSI中断
     always @(posedge clk) begin
       if (interrupt_condition) begin
         msi_req <= 1'b1;
       end else begin
         msi_req <= 1'b0;
       end
     end
     ```

   - **连接到PCIe核心**:
     - 确保`msi_req`信号正确连接到PCIe IP核的中断接口。

3. **保存更改**:

   - **保存固件文件**:
     - 实现中断逻辑后,保存文件。

   - **检查时序约束**:
     - 确认新逻辑未引入时序违规。

#### **8.3.3 实现中断处理逻辑**

定义何时以及如何生成中断对于设备与主机的中断处理机制的交互至关重要。

**步骤**:

1. **定义中断条件**:

   - **识别触发事件**:
     - 确定应引起中断的特定事件。
       - **示例**:
         - 数据已准备好处理。
         - 错误条件。
         - 任务完成。

   - **实现条件逻辑**:
     - 使用组合逻辑或时序逻辑来检测这些事件。

2. **创建中断生成模块**:

   - **模块化设计**:
     - 将中断逻辑实现为一个独立的模块,以提高清晰度和可重用性。

       ```verilog
       module interrupt_controller(
         input wire clk,
         input wire reset,
         input wire event_trigger,
         output reg msi_req
       );
         always @(posedge clk or posedge reset) begin
           if (reset) begin
             msi_req <= 1'b0;
           end else if (event_trigger) begin
             msi_req <= 1'b1;
           end else begin
             msi_req <= 1'b0;
           end
         end
       endmodule
       ```

   - **与主固件集成**:
     - 实例化模块,并将其连接到主固件逻辑。

3. **确保正确的时序和顺序**:

   - **遵守PCIe规范**:
     - 确保中断按照协议正确生成和清除。

   - **管理中断延迟**:
     - 优化逻辑,最小化事件发生和中断生成之间的延迟。

4. **测试中断传递**:

   - **仿真**:
     - 使用仿真工具验证中断是否正确生成。

   - **硬件测试**:
     - 编程FPGA,使用主机端软件确认中断已接收并处理。

   - **调试工具**:
     - 利用集成逻辑分析器(ILA)核实时监控信号。

5. **保存更改**:

   - **最终确定代码**:
     - 确保所有更改都已保存并记录。

   - **审查和改进**:
     - 根据测试结果迭代设计。

---

## **10. 事务层数据包(TLP)仿真**

事务层数据包(TLP)是PCIe通信的基本单位。准确的TLP仿真对于设备正确地与主机系统交互至关重要。

### **10.1 理解和捕获TLP**

#### **10.1.1 学习TLP结构**

- **组成部分**:

  - **头部**:包含字段,如**事务层数据包类型(Type)**、**长度**、**请求者ID**、**标签**、**地址**等。
  - **数据负载**:存在于内存写入和其他一些TLP中。
  - **CRC**:确保数据完整性。

- **理解TLP类型**:

  - **内存读取请求**
  - **内存读取完成**
  - **内存写入**
  - **配置读取/写入**
  - **供应商定义的消息**

#### **10.1.2 从捐赠设备捕获TLP**

- **步骤**:

  1. **设置PCIe协议分析仪**:

     - 使用如**Teledyne LeCroy PCIe分析仪**的硬件工具。

  2. **捕获事务**:

     - 在捐赠设备正常运行期间进行监控,记录TLP。

  3. **分析捕获的TLP**:

     - 使用分析仪的软件,剖析TLP,理解其结构和序列。

#### **10.1.3 记录关键TLP事务**

- **步骤**:

  1. **识别关键事务**:

     - 关注设备初始化、配置、数据传输和错误处理所必需的TLP。

  2. **创建详细文档**:

     - 对于每个关键TLP,记录字段值、序列和发送条件。

  3. **理解时序和顺序**:

     - 注意TLP之间的时序,以及所需的响应时间。

### **10.2 为特定操作制作自定义TLP**

#### **10.2.1 在固件中实现TLP处理**

- **需要修改的文件**:

  - `pcileech_pcie_tlp_a7.sv`

    ```
    pcileech-wifi-main/src/pcileech_pcie_tlp_a7.sv
    ```

- **步骤**:

  1. **创建TLP生成函数**:

     - 在`pcileech_pcie_tlp_a7.sv`中,编写函数,组装具有所需头部和负载的TLP。

       - **示例**:

         ```verilog
         function automatic [127:0] generate_tlp;
           input [15:0] requester_id;
           input [7:0] tag;
           input [7:0] length;
           input [31:0] address;
           input [31:0] data;
           begin
             generate_tlp = { /* TLP头部和负载 */ };
           end
         endfunction
         ```

  2. **处理TLP接收**:

     - 实现逻辑,解析接收到的TLP,提取必要信息。
     - 使用状态机管理不同的TLP类型。

  3. **确保合规性**:

     - 验证TLP符合PCIe规范的格式和时序。

  4. **实现完成处理**:

     - 对于内存读取请求,生成适当的完成TLP。

  5. **保存更改**:

     - 实现更改后,保存文件。

#### **10.2.2 处理不同的TLP类型**

- **内存读取请求**:

  - **实现**:

    - 解析请求头部。
    - 从适当的内存位置获取数据。
    - 组装并发送包含数据的完成TLP。

- **内存写入请求**:

  - **实现**:

    - 接收TLP并提取数据负载。
    - 将数据写入指定的内存位置。

- **配置读取/写入请求**:

  - **实现**:

    - 访问配置空间寄存器。
    - 对于读取,返回请求的数据。
    - 对于写入,更新寄存器值。

- **供应商定义的消息**:

  - **实现**:

    - 根据捐赠设备的协议,实现解析和响应逻辑。

#### **10.2.3 验证TLP时序和序列**

- **步骤**:

  1. **使用仿真工具**:

     - 使用测试平台仿真固件,验证TLP处理。

  2. **使用ILA监控**:

     - 插入ILA核,捕获TLP相关信号的硬件测试。

  3. **检查时序约束**:

     - 确保TLP在PCIe标准允许的时序窗口内处理和响应。

  4. **合规性测试**:

     - 使用PCIe合规性工具验证对标准的遵从。

  5. **保存更改**:

     - 测试和验证后,保存所有修改的文件。

---

## **第3部分:高级技术与优化**

---

## **11. 构建、烧录和测试**

完成所有定制后,接下来是构建固件,将其编程到FPGA上,并彻底测试以确保其正常功能。

### **11.1 综合与实现**

#### **11.1.1 运行综合**

综合将您的高级代码转换为门级表示。

- **步骤**:

  1. **启动综合**:

     - 在Vivado中,点击**Flow Navigator**中的**Run Synthesis**。

  2. **监视进度**:

     - 注意任何警告或错误。

     - **常见警告**:

       - **未连接端口**:确保所有必要的信号已连接。

       - **未满足时序约束**:可能需要调整约束。

  3. **查看综合报告**:

     - 检查**利用率摘要**,确保设计适合FPGA。

#### **11.1.2 运行实现**

实现将综合的设计映射到FPGA的资源上。

- **步骤**:

  1. **启动实现**:

     - 综合成功后,点击**Run Implementation**。

  2. **分析时序报告**:

     - 确保所有时序约束都已满足。

     - **解决违规**:

       - 调整逻辑或约束,以修复建立或保持时间违规。

  3. **验证布局**:

     - 检查关键组件已被优化地放置。

#### **11.1.3 生成比特流**

比特流是用于编程FPGA的二进制文件。

- **步骤**:

  1. **生成比特流**:

     - 点击**Generate Bitstream**。

  2. **等待完成**:

     - 根据设计的复杂性,这可能需要一些时间。

  3. **查看比特流生成日志**:

     - 确保生成过程中没有发生错误。

### **11.2 烧录比特流**

#### **11.2.1 连接FPGA设备**

- **步骤**:

  1. **准备硬件**:

     - 确保FPGA板已通电,并通过JTAG连接。

     - 参考您的FPGA板手册,获取特定的连接说明。

  2. **打开硬件管理器**:

     - 在Vivado中,导航到**Flow Navigator > Program and Debug > Open Hardware Manager**。

#### **11.2.2 编程FPGA**

- **步骤**:

  1. **连接到目标设备**:

     - 在硬件管理器中,点击**Open Target**,选择**Auto Connect**。

     - Vivado应检测到您的FPGA设备。

  2. **编程设备**:

     - 在硬件窗口中,右键点击您的FPGA设备,选择**Program Device**。

     - 选择生成的比特流文件(扩展名为`.bit`)。

     - 点击**Program**,将固件烧录到FPGA上。

     - 等待编程过程完成。

#### **11.2.3 验证编程**

- **步骤**:

  1. **检查状态**:

     - 确保编程无错误地完成。

     - Vivado将在完成后显示成功消息。

  2. **观察LED或指示灯**:

     - 一些FPGA板具有指示成功编程或活动状态的LED。

### **11.3 测试与验证**

#### **11.3.1 验证设备枚举**

- **Windows**:

  - **步骤**:

    1. **打开设备管理器**:

       - 按`Win + X`,选择**设备管理器**。

    2. **检查设备属性**:

       - 在适当的设备类别下查找(例如,**网络适配器**、**存储控制器**)。

       - 确认**设备ID**、**供应商ID**和其他标识符与捐赠设备匹配。

- **Linux**:

  - **步骤**:

    1. **使用lspci**:

       ```bash
       lspci -nn
       ```

    2. **验证设备列表**:

       - 检查仿真设备是否以正确的ID出现。

       - **示例输出**:

         ```
         03:00.0 Network controller [0280]: VendorID DeviceID
         ```

#### **11.3.2 测试设备功能**

- **步骤**:

  1. **安装必要的驱动程序**:

     - 如有需要,使用捐赠设备的驱动程序。

     - 按制造商的说明进行安装。

  2. **执行功能测试**:

     - 运行与设备交互的应用程序。

     - 测试数据传输、配置和任何特殊功能。

     - **示例**:

       - 对于网络卡,执行ping测试或数据流传输。

       - 对于存储控制器,执行读/写操作。

  3. **监视系统行为**:

     - 检查系统稳定性,是否无错误。

     - 确保设备在各种负载下按预期运行。

#### **11.3.3 监控错误**

- **Windows**:

  - **步骤**:

    1. **检查事件查看器**:

       - 按`Win + X`,选择**事件查看器**。

       - 导航到**Windows日志 > 系统**。

    2. **查找与PCIe相关的错误**:

       - 搜索与PCIe或特定设备相关的警告或错误。

- **Linux**:

  - **步骤**:

    1. **检查dmesg日志**:

       ```bash
       dmesg | grep pci
       ```

    2. **识别问题**:

       - 查找指示PCIe通信或设备初始化问题的消息。

---

## **12. 高级调试技术**

当出现问题时,高级调试工具和技术可以帮助有效地识别和解决问题。

### **12.1 使用Vivado的集成逻辑分析器**

集成逻辑分析器(ILA)允许实时监控FPGA内部信号。

#### **12.1.1 插入ILA核**

- **步骤**:

  1. **添加ILA IP核**:

     - 在Vivado中,打开**IP目录**。

     - 搜索**ILA**。

     - 在设计中实例化ILA核。

  2. **连接信号**:

     - 将您希望监控的信号连接到ILA探针。

     - **示例**:

       ```verilog
       ila_0 your_ila_instance (
         .clk(clk),
         .probe0(signal_to_monitor)
       );
       ```

     - **文件路径**:

       ```
       pcileech-wifi-main/src/pcileech_squirrel_top.sv
       ```

#### **12.1.2 配置触发条件**

- **步骤**:

  1. **设置探针属性**:

     - 定义每个探针的宽度,以匹配信号宽度。

  2. **定义触发器**:

     - 在ILA仪表板中,设置触发数据捕获的条件。

     - **示例**:

       - 当检测到特定的TLP类型或发生错误条件时触发。

#### **12.1.3 捕获和分析数据**

- **步骤**:

  1. **运行设计**:

     - 使用包含ILA的比特流编程FPGA。

  2. **打开硬件管理器**:

     - 在Vivado中访问ILA界面。

  3. **捕获数据**:

     - 臂ILA,等待触发条件。

     - 触发后,ILA将捕获波形数据。

  4. **分析波形**:

     - 使用波形查看器检查信号行为。

     - 识别异常或验证正确的操作。

### **12.2 PCIe流量分析工具**

使用外部工具可以深入了解PCIe通信。

#### **12.2.1 PCIe协议分析仪**

- **示例**:

  - **Teledyne LeCroy PCIe分析仪**

  - **Keysight PCIe分析仪**

- **步骤**:

  1. **设置分析仪**:

     - 将分析仪连接在主机系统和FPGA设备之间。

  2. **配置捕获设置**:

     - 定义要捕获的数据范围(例如,特定的TLP类型、错误条件)。

  3. **捕获流量**:

     - 在设备运行期间记录PCIe事务。

  4. **分析结果**:

     - 检查TLP的合规性和正确性。

     - 识别任何协议违规或意外行为。

#### **12.2.2 基于软件的工具**

- **示例**:

  - **Wireshark与PCIe插件**

  - **ChipScope Pro**(适用于Xilinx设备)

- **步骤**:

  1. **安装必要的插件**:

     - 确保工具中启用了PCIe支持。

  2. **监控PCIe总线**:

     - 捕获并显示PCIe数据包。

  3. **分析通信**:

     - 查找数据中的异常或错误。

     - 验证TLP的正确形成和顺序。

---

## **13. 故障排除**

本节提供了您在固件开发和测试过程中可能遇到的常见问题的解决方案。

### **13.1 设备检测问题**

**问题**:FPGA设备未被主机系统识别。

#### **可能的原因和解决方案**:

1. **设备ID不正确**:

   - **原因**:固件中的ID与主机期望的不匹配。

   - **解决方案**:验证并纠正固件中的**设备ID**、**供应商ID**和**子系统ID**。

2. **PCIe链路训练失败**:

   - **原因**:PCIe链路未建立。

   - **解决方案**:

     - 检查物理连接。

     - 确保**链路宽度**和**链路速度**已正确配置。

3. **电源问题**:

   - **原因**:FPGA设备供电不足。

   - **解决方案**:验证电源连接和电压水平。

4. **固件错误**:

   - **原因**:固件中的错误阻止正常运行。

   - **解决方案**:检查代码中的语法错误或配置错误。

### **13.2 内存映射和BAR配置错误**

**问题**:设备的内存区域不可访问,或访问它们导致系统错误。

#### **可能的原因和解决方案**:

1. **BAR大小或类型不正确**:

   - **原因**:BAR配置与捐赠设备不匹配。

   - **解决方案**:在PCIe IP核和固件中调整BAR大小和类型。

2. **地址解码错误**:

   - **原因**:固件未正确解释地址。

   - **解决方案**:调试固件中的地址解码逻辑。

3. **地址空间重叠**:

   - **原因**:BARs重叠或与其他设备冲突。

   - **解决方案**:确保BAR地址正确对齐且不重叠。

### **13.3 DMA性能和TLP错误**

**问题**:DMA操作期间发生数据传输速率低或错误,或TLP格式错误。

#### **可能的原因和解决方案**:

1. **DMA逻辑效率低下**:

   - **原因**:DMA引擎未优化。

   - **解决方案**:实现缓冲和流水线以提高吞吐量。

2. **TLP格式错误**:

   - **原因**:TLP格式不正确。

   - **解决方案**:检查TLP组装代码,确保符合PCIe规范。

3. **流控制问题**:

   - **原因**:未正确处理流控制信用。

   - **解决方案**:在固件中实现正确的流控制机制。

---

## **14. 仿真准确性和优化**

提高仿真准确性可确保兼容性和性能,使仿真设备与捐赠设备无异。

### **14.1 精确计时仿真技术**

- **实施时序约束**:

  - 使用Vivado的时序约束,匹配捐赠设备的时序特性。

  - 将约束应用于关键路径,确保它们满足所需的建立和保持时间。

- **使用时钟域交叉(CDC)技术**:

  - 正确处理跨越不同时钟域的信号,防止亚稳态。

  - 根据需要使用同步器或FIFO。

- **仿真设备行为**:

  - 使用仿真工具对设备行为进行建模和验证。

  - 确认操作的时序和顺序与捐赠设备匹配。

### **14.2 对系统调用的动态响应**

- **实现状态机**:

  - 设计状态机,允许设备对各种命令和状态进行动态响应。

  - 确保设备能够优雅地处理意外或乱序的请求。

- **监控并响应主机命令**:

  - 实现逻辑,解码并响应配置写入、供应商特定命令和其他交互。

  - 相应地更新内部寄存器和状态。

- **优化固件逻辑**:

  - 精简固件代码,减少延迟,提高响应速度。

  - 删除不必要的延迟或数据路径中的瓶颈。

---

## **15. 固件开发最佳实践**

遵循最佳实践有助于维护代码质量,促进协作,并确保项目的长期可行性。

### **15.1 持续测试和文档编制**

- **定期测试**:

  - 在每次重要更改后测试固件,及早发现问题。

  - 在实现之前,使用测试平台和仿真验证逻辑。

- **自动化测试**:

  - 实现自动化测试脚本,验证功能和性能。

  - 如果在团队环境中工作,使用持续集成工具。

- **维护文档**:

  - 记录设计,包括框图、状态机和接口。

  - 通过清晰的提交消息跟踪更改,并相应地更新设计文档。

### **15.2 管理固件版本**

- **使用版本控制系统**:

  - 使用**Git**等系统管理代码版本并与他人协作。

  - 使用清晰的目录结构和命名约定组织代码库。

- **标记发布和里程碑**:

  - 为固件的稳定版本打标签,供将来参考。

  - 为实验性功能或重大更改使用分支。

- **备份和恢复**:

  - 定期备份您的工作,以防止数据丢失。

  - 根据需要使用云端代码库或本地备份。

### **15.3 安全考虑**

- **安全编码实践**:

  - 遵循指南,防止常见漏洞,如缓冲区溢出或竞争条件。

  - 验证所有输入,优雅地处理错误。

- **数据保护**:

  - 确保设备处理的任何敏感数据都受到保护。

  - 如果必要,实施加密或访问控制。

- **合规和道德**:

  - 了解与设备仿真相关的法律和道德考虑。

  - 确保遵守相关的法律、法规和许可协议。

---

## **16. 其他资源**

通过以下资源增强您的理解并保持更新:

- **Xilinx文档**
  - [Xilinx用户指南](https://www.xilinx.com/support/documentation/user_guides.htm)
  - 包含有关Vivado、IP核和FPGA开发的详细信息。

- **PCI-SIG规范**
  - [PCI Express基本规范](https://pcisig.com/specifications)
  - PCIe标准的官方规范。

- **FPGA教程和论坛**
  - [FPGA4Fun](http://www.fpga4fun.com/)
  - [Stack Overflow的FPGA问题](https://stackoverflow.com/questions/tagged/fpga)
  - 由社区驱动的讨论和教程。

- **Verilog和VHDL资源**
  - [ASIC World Verilog教程](https://www.asic-world.com/verilog/index.html)
  - [VHDL参考指南](https://www.vhdlwhiz.com/vhdl-reference-guide/)

- **Vivado设计套件用户指南**
  - [Vivado用户指南](https://www.xilinx.com/support/documentation/sw_manuals/xilinx2020_1/ug893-vivado-ip-subsystems.pdf)

- **PCIe协议分析工具**
  - [Teledyne LeCroy](https://teledynelecroy.com/protocolanalyzer/)
  - 提供一系列PCIe分析工具。

---

## **17. 联系信息**

如果您需要帮助、有疑问或希望合作,欢迎随时联系。我可以提供指导,解决复杂问题,或详细讨论想法。

### **Discord**: [**VCPU**](https://discord.com/users/196741541094621184) | [**服务器邀请链接**](https://discord.gg/dS2gDUDQmV)

---

## **18. 支持与贡献**

您的支持有助于维护和改进本指南和相关项目。

### **捐赠**

- **加密货币捐赠(LTC)**:
  - **地址**:`MPMyQD5zgy2b2CpDn1C1KZ31KmHpT7AwRi`

如果您发现本指南有用,并希望支持正在进行的工作,请考虑贡献。每一份捐赠都有助于继续创建、分享和支持社区。

**特别奖励**:如果您进行了捐赠,请在Discord上联系我(VCPU),以收到个人感谢,可能还有额外的资源或帮助。

**注意**:如果您需要我查看您的实现或解决问题,请在相关部分标注`//VCPU-REVIEW//`,并提供您遇到的问题的详细说明。

---

**指南结束**


================================================
FILE: CN/README-old.md
================================================
# **全设备仿真的定制固件开发指南**

## **目录**

1. [介绍](#1-介绍)
   - [1.1 指南目的](#11-指南目的)
   - [1.2 目标受众](#12-目标受众)
2. [关键定义](#2-关键定义)
3. [设备兼容性](#3-设备兼容性)
   - [3.1 支持的基于FPGA的硬件](#31-支持的基于FPGA的硬件)
   - [3.2 PCIe硬件考虑事项](#32-pcie硬件考虑事项)
   - [3.3 系统要求](#33-系统要求)
4. [需求](#4-需求)
   - [4.1 硬件](#41-硬件)
   - [4.2 软件](#42-软件)
   - [4.3 环境设置](#43-环境设置)
5. [收集捐赠设备信息](#5-收集捐赠设备信息)
   - [5.1 使用Arbor进行PCIe设备扫描](#51-使用arbor进行pcie设备扫描)
   - [5.2 提取和记录设备属性](#52-提取和记录设备属性)
6. [初始固件定制](#6-初始固件定制)
   - [6.1 修改配置空间](#61-修改配置空间)
   - [6.2 插入设备序列号(DSN)](#62-插入设备序列号-dsn)
7. [Vivado项目设置与定制](#7-vivado项目设置与定制)
   - [7.1 生成Vivado项目文件](#71-生成vivado项目文件)
   - [7.2 修改IP模块](#72-修改ip模块)
8. [高级固件定制](#8-高级固件定制)
   - [8.1 配置用于仿真的PCIe参数](#81-配置用于仿真的pcie参数)
   - [8.2 调整BAR和内存映射](#82-调整bar和内存映射)
   - [8.3 仿真设备电源管理和中断](#83-仿真设备电源管理和中断)
9. [仿真设备特定功能](#9-仿真设备特定功能)
   - [9.1 实现高级PCIe功能](#91-实现高级pcie功能)
   - [9.2 仿真厂商特定功能](#92-仿真厂商特定功能)
10. [事务层数据包(TLP)仿真](#10-事务层数据包-tlp-仿真)
    - [10.1 理解和捕获TLP](#101-理解和捕获tlp)
    - [10.2 为特定操作制作自定义TLP](#102-为特定操作制作自定义tlp)
11. [构建、闪存和测试](#11-构建、闪存和测试)
    - [11.1 综合与实现](#111-综合与实现)
    - [11.2 闪存比特流](#112-闪存比特流)
    - [11.3 测试与验证](#113-测试与验证)
12. [高级调试技术](#12-高级调试技术)
    - [12.1 使用Vivado的集成逻辑分析仪](#121-使用vivado的集成逻辑分析仪)
    - [12.2 PCIe流量分析工具](#122-pcie流量分析工具)
13. [故障排除](#13-故障排除)
    - [13.1 设备检测问题](#131-设备检测问题)
    - [13.2 内存映射和BAR配置错误](#132-内存映射和bar配置错误)
    - [13.3 DMA性能和TLP错误](#133-dma性能和tlp错误)
14. [仿真精度和优化](#14-仿真精度和优化)
    - [14.1 精确时序仿真的技术](#141-精确时序仿真的技术)
    - [14.2 对系统调用的动态响应](#142-对系统调用的动态响应)
15. [固件开发的最佳实践](#15-固件开发的最佳实践)
    - [15.1 持续测试和文档记录](#151-持续测试和文档记录)
    - [15.2 管理固件版本](#152-管理固件版本)
    - [15.3 安全考虑](#153-安全考虑)
16. [附加资源](#16-附加资源)

---

## **前言**

**注意,你们这些盗贼渣滓。** 我不是来溺爱或纵容你们可悲的阴谋的。**去你妈的AQUA**,也就是更广为人知的Aqua Teen Paster Force——对任何有一点诚信的人来说都是耻辱。**去你妈的DIVINER**,还有DUCK?去别的地方贬低自己。**DMA KINGDOM**?你和你们寄生的帝国以及这些骗子一起在地狱里腐烂。**SHITLETTE**和你们这些贪图金钱的贼人,准备迎接报应。**神的愤怒**?你们即将理解真正毁灭的意义。要么为你们的贪婪赎罪,要么被你们应得的毁灭席卷而去。既然我们谈到这个话题,**比尔·盖茨你也去他妈的。**

对于那些**来学习**的人,你们选择了**真正启蒙**的道路。你们用这本指南构建的东西将超越这些江湖骗子能梦想到的任何东西。你们正走在**卓越**的道路上,携手一起焚烧他们建立财富所基于的失败。

---

## **联系方式**

如果您需要帮助、有疑问或希望合作,请随时联系。我可以提供指导、排除复杂问题或详细讨论想法。

### **Discord** - **VCPU** | [**服务器**](https://discord.gg/dS2gDUDQmV)

---

## **支持我的工作**

如果您觉得这本指南有帮助,并希望支持更多项目,请考虑捐助以帮助维持一切运作。每一笔捐款都能帮助我继续创建、分享和支持社区,衷心感谢。

### **买杯咖啡**  
- [ko-fi.com/virtualcpu](https://ko-fi.com/virtualcpu)  
- [buymeacoffee.com/vcpu](https://buymeacoffee.com/vcpu)  

### **加密捐赠(LTC)**  
- MPMyQD5zgy2b2CpDn1C1KZ31KmHpT7AwRi

我通过销售固件赚得不多——大约5笔销售,总额约300美元——但我知道许多使用这本指南的人将会赚得更多。如果这本指南帮助您走上成功之路,请考虑回馈,以便我可以继续为大家提供这些资源。

### **特别奖励**  
如果您捐赠,请通过Discord(VCPU)联系我并告知。我很乐意亲自感谢您,并提供一些回报。我甚至会进行随机抽奖——无论是免费固件、私人源代码,还是一些绕过ACS的见解,都会有特别的东西给您。

您的支持对我意义重大,我们可以一起继续建设和分享未来。谢谢!

---

没有时间或精力自己制作固件?我提供最低60美元的固件服务。也欢迎转售商!

随时联系以获取支持或进一步讨论本指南或相关主题。无论您是需要深入帮助的开发人员,还是深入FPGA仿真的研究人员,我都在这里确保您的成功之路顺利且信息充分。让我们一起构建一些卓越的东西。

如果您不确定是否正确完成了某个步骤,或希望我审核您的实现,我会这样做,但您必须在需要审核的部分标记为 //VCPU-REVIEW// 并解释您的问题,以免浪费我的时间。

我相信你们中的很多人将超越我的能力。如果您发现了新东西或制作了一些很棒的固件,我很想看到它的实际运行。此外,我还有一些非常强大的字节和位可以分享,但如果我在这里分享,Riot PD会把我抓到警车上。

分享知识,传播充满爱的善意。愿上帝保佑。

---

## **1. 介绍**

### **1.1 指南目的**

本指南的主要目标是为开发人员、安全研究人员和硬件工程师提供必要的知识和实际步骤,以开发用于精确1:1硬件设备仿真的定制DMA固件,使用基于FPGA的系统如**PCILeech-FPGA**。这使得在硬件测试、系统调试、恶意软件分析以及其他需要不可检测或看似合法的设备仿真的场景中应用成为可能。

### **1.2 目标受众**

- **固件开发人员**:为硬件仿真、测试或绕过硬件限制构建定制固件的工程师。
- **硬件测试人员**:仿真故障或过时的硬件设备,以评估系统弹性或兼容性的专业人士。
- **安全研究人员**:利用定制固件进行漏洞测试、恶意软件分析或安全评估的个人。
- **FPGA爱好者**:探索FPGA定制和低级硬件仿真的爱好者。

---

## **2. 关键定义**

理解术语对于有效地遵循本指南至关重要。以下是与PCIe、DMA和设备仿真相关的关键定义:

- **DMA(直接内存访问)**:一种允许硬件设备直接从系统内存读取或写入数据而无需CPU干预的能力,促进快速数据传输。
- **TLP(事务层数据包)**:PCIe架构中通信的基本单元,封装控制和数据信息。
- **BAR(基地址寄存器)**:PCIe设备中的寄存器,将设备内存映射到系统内存空间,定义内存和I/O地址区域。
- **FPGA(现场可编程门阵列)**:一种可重新配置的集成电路,可编程以执行特定的硬件功能,实现定制的设备仿真。
- **MSI/MSI-X(消息信号中断)**:PCIe设备用于向CPU发送中断的机制,处理异步事件。
- **设备序列号(DSN)**:与特定设备相关联的唯一标识符,通常用于高级设备识别和验证。
- **PCIe配置空间**:PCIe设备提供有关自身信息和配置操作参数的内存区域。
- **捐赠卡**:用于提取配置和识别详细信息以在FPGA上仿真其行为的PCIe设备。

---

## **3. 设备兼容性**

### **3.1 支持的基于FPGA的硬件**

虽然本指南主要关注**Squirrel DMA(35T)**卡,但所述方法可适用于其他基于FPGA的DMA硬件。以下是兼容设备列表:

- **Squirrel (35T)**
  - **描述**:价格实惠且广泛可获取的基于FPGA的DMA设备。
  - **使用案例**:适用于标准内存获取和设备仿真任务。

- **EnigmaX1 (75T)**
  - **描述**:中档FPGA,提供增强的资源和性能。
  - **使用案例**:适合需要更高带宽的更具挑战性的内存操作。

- **ZDMA (100T)**
  - **描述**:高性能FPGA,优化用于快速内存交互。
  - **使用案例**:最适合需要快速和广泛内存读写的场景。

- **Kintex-7**
  - **描述**:先进的FPGA,具备强大的能力用于复杂项目。
  - **使用案例**:适用于大规模或高度定制的DMA解决方案。

### **3.2 PCIe硬件考虑事项**

为确保顺利仿真,必须解决多个PCIe特定功能:

- **IOMMU/VT-d设置**
  - **建议**:禁用IOMMU(英特尔的VT-d),以允许不受限制的DMA访问。
  - **理由**:IOMMU可能会限制DMA操作,可能干扰内存获取和仿真。

- **内核DMA保护**
  - **建议**:禁用现代系统中的内核DMA保护功能。
  - **步骤**:
    - **Windows**:这可能涉及禁用安全启动或基于虚拟化的安全性(VBS)。
    - **BIOS/UEFI**:访问固件设置以关闭相关安全功能。
  - **注意**:禁用这些功能可能会使系统面临风险;确保在安全和隔离的环境中操作。

- **PCIe插槽要求**
  - **建议**:使用与FPGA设备要求匹配的兼容PCIe插槽(例如x1、x4、x16)。
  - **理由**:确保与主机系统的最佳性能和兼容性。

### **3.3 系统要求**

- **主机系统**
  - **处理器**:多核CPU(Intel i5/i7或同等)
  - **内存**:至少16GB RAM
  - **存储**:至少100GB可用空间的SSD
  - **操作系统**:Windows 10/11(64位)或兼容的Linux发行版(例如Ubuntu、Debian)及必要的驱动程序

- **外围设备**
  - **JTAG适配器**:用于将固件闪存到FPGA
  - **PCIe插槽**:确保主机系统有可用的与DMA卡兼容的PCIe插槽

---

## **4. 需求**

### **4.1 硬件**

- **捐赠PCIe设备**
  - **用途**:用于欺骗的设备ID和配置数据来源。
  - **示例**:网络适配器、存储控制器或任何不在主机PC上使用的通用PCIe卡。

- **DMA FPGA卡**
  - **描述**:能够执行DMA操作的基于FPGA的设备。
  - **示例**:Squirrel (35T)、EnigmaX1 (75T)、ZDMA (100T)、Kintex-7

- **JTAG程序员**
  - **用途**:用于将固件闪存到FPGA。
  - **示例**:Xilinx Platform Cable USB、Digilent JTAG USB Cable

### **4.2 软件**

- **Vivado**
  - **描述**:Xilinx的FPGA开发软件,用于综合和构建固件项目。
  - **下载**: [Xilinx Vivado](https://www.xilinx.com/support/download.html)

- **Visual Studio**
  - **描述**:用于编辑Verilog或VHDL代码的集成开发环境(IDE)。
  - **下载**: [Visual Studio Community](https://visualstudio.microsoft.com/vs/community/)

- **PCILeech-FPGA**
  - **描述**:用于DMA固件开发的存储库和基础代码。
  - **存储库**: [PCILeech-FPGA 在 GitHub 上](https://github.com/ufrisk/pcileech-fpga)

- **Arbor**
  - **描述**:用于收集设备信息的PCIe设备扫描工具。
  - **下载**: [MindShare 的 Arbor](https://www.mindshare.com/software/Arbor)
  - **注意**:需要创建账户;提供14天试用。

- **替代工具**
  - **Telescan PE**
    - **描述**:可以作为Arbor替代的PCIe流量分析工具。
    - **下载**: [Teledyne LeCroy Telescan PE](https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software)
    - **注意**:免费但需要手动注册批准。

### **4.3 环境设置**

1. **安装Vivado**
   - **步骤**:
     1. 访问 [Xilinx Vivado 下载页面](https://www.xilinx.com/support/download.html)。
     2. 下载与您的FPGA设备兼容的适当版本。
     3. 按照Xilinx提供的安装说明进行安装。
     4. 启动Vivado并确保其正确配置。

2. **安装Visual Studio**
   - **步骤**:
     1. 访问 [Visual Studio 下载页面](https://visualstudio.microsoft.com/vs/community/)。
     2. 下载并安装 **Visual Studio Community Edition**。
     3. 在安装过程中,确保包括与**使用C++进行桌面开发**相关的工作负载,以支持硬件描述语言(HDL)如Verilog或VHDL。

3. **克隆PCILeech-FPGA存储库**
   - **步骤**:
     1. 打开终端或命令提示符。
     2. 使用Git克隆存储库:
        ```bash
        git clone https://github.com/ufrisk/pcileech-fpga.git
        ```
     3. 进入克隆的目录:
        ```bash
        cd pcileech-fpga
        ```

4. **设置干净的开发环境**
   - **建议**:在隔离的环境中工作,以防止意外交互,尤其是如果使用固件进行敏感任务如恶意软件分析。
   - **步骤**:
     1. 使用专用的开发机器或虚拟环境。
     2. 确保没有其他应用程序干扰PCIe操作或FPGA编程。

---

## **5. 收集捐赠设备信息**

精确的设备仿真依赖于从捐赠设备中提取关键信息。这些数据使您的FPGA能够在PCIe配置和行为方面模拟目标硬件。

### **5.1 使用Arbor进行PCIe设备扫描**

**Arbor**是一个强大的工具,用于扫描PCIe设备并提取必要的信息。按照以下步骤收集捐赠设备的详细信息:

1. **安装Arbor**
   - **步骤**:
     1. 访问 [Arbor下载页面](https://www.mindshare.com/software/Arbor)。
     2. 如果需要,创建一个账户。
     3. 下载并安装Arbor到您的系统上。

2. **扫描PCIe设备**
   - **步骤**:
     1. 启动Arbor。
     2. 导航到 **本地系统** 标签。
     3. 在 **扫描选项** 下,确保默认设置适当。
     4. 点击 **扫描/重新扫描** 以检测所有连接的PCIe设备。

3. **识别捐赠设备**
   - **标准**:
     - 不应在主机PC上使用。
     - 示例:PCIe WiFi卡、存储控制器或通用PCIe设备。
   - **步骤**:
     1. 在扫描设备列表中找到您的捐赠设备。
     2. 点击设备以查看详细配置。

4. **捕获设备数据**
   - **需要提取的信息**:
     - **设备ID**
     - **厂商ID**
     - **子系统ID**
     - **修订ID**
     - **基地址寄存器(BARs)**
     - **功能**(例如,MSI、电源管理、PCIe链路宽度/速度)
     - **设备序列号(DSN)**(如果可用)

   - **步骤**:
     1. 导航到Arbor中的 **PCI配置** 标签。
     2. 滚动浏览 **解码** 部分,找到并记录上述详细信息。
     3. 截屏或记录每个值,以便在固件定制过程中参考。

   - **示例提取**:

     ![设备ID](https://github.com/Silverr12/DMA-CFW-Guide/assets/89455475/8baec3fe-c4bd-478e-9f95-d262804d6f67)

     ![厂商ID](https://github.com/Silverr12/DMA-CFW-Guide/assets/89455475/39c7de6d-d8db-4744-b0a0-ddeca0dfd7d7)

     ![修订ID](https://github.com/Silverr12/DMA-CFW-Guide/assets/89455475/c2374ea7-ca9c-47b7-8a8d-4ceff5dffe3b)

     ![BAR大小](https://github.com/Silverr12/DMA-CFW-Guide/assets/89455475/19239179-057a-4ed5-a79f-45cf242787a5)

     ![子系统ID](https://github.com/Silverr12/DMA-CFW-Guide/assets/89455475/94522a95-70bd-4336-8e38-58c0839e38ad)

     ![DSN](https://github.com/Silverr12/DMA-CFW-Guide/assets/89455475/595ae3e2-4cd8-4b3d-bcfa-cf6a59f289d5)

   - **注意**:并非所有设备都包含DSN。如果不可用,在定制过程中DSN字段使用零即可。

### **5.2 提取和记录设备属性**

扫描后,确保准确记录捐赠设备的以下属性:

1. **设备ID**:硬件设备的唯一标识符。
2. **厂商ID**:设备制造商的标识符。
3. **子系统ID**:标识与设备相关联的特定子系统。
4. **修订ID**:硬件版本的修订号。
5. **基地址寄存器(BARs)**:定义设备的内存和I/O地址区域。
6. **功能**:如电源管理(PM)、MSI/MSI-X、PCIe链路速度和宽度。
7. **设备序列号(DSN)**:如果适用,与设备关联的唯一序列号。

**重要注意事项**:

- **BAR大小**:确保内存映射I/O区域与捐赠设备的配置匹配。
- **功能**:正确仿真所有功能以确保与主机系统的无缝集成。
- **DSN**:提高仿真的逼真度;如果可用,请使用。

---

## **6. 初始固件定制**

在掌握必要的捐赠设备信息后,继续定制固件中的PCIe配置空间和内存映射,以欺骗捐赠设备。

### **6.1 修改配置空间**

1. **导航到配置文件**
   - **路径**:`/PCIeSquirrel/src/pcileech_pcie_cfg_a7.sv`
   - **描述**:此Verilog文件包含设备的PCIe配置逻辑。

2. **在Visual Studio中打开文件**
   - **步骤**:
     1. 启动 **Visual Studio**。
     2. 打开位于 `/PCIeSquirrel/src/` 目录下的 `pcileech_pcie_cfg_a7.sv` 文件。

3. **修改设备ID和厂商ID**
   - **步骤**:
     1. 使用 **Ctrl + F** 搜索 `cfg_deviceid`。
     2. 使用捐赠设备的值更新设备ID:
        ```verilog
        cfg_deviceid <= 16'hXXXX;  // 将XXXX替换为捐赠设备的设备ID
        ```
     3. 同样,搜索 `cfg_vendorid` 并更新:
        ```verilog
        cfg_vendorid <= 16'hYYYY;  // 将YYYY替换为捐赠设备的厂商ID
        ```

4. **修改子系统ID**
   - **步骤**:
     1. 搜索 `cfg_subsysid`。
     2. 更新子系统ID:
        ```verilog
        cfg_subsysid <= 16'hZZZZ;  // 将ZZZZ替换为捐赠设备的子系统ID
        ```

5. **根据捐赠设备调整BARs**
   - **步骤**:
     1. 找到BAR大小配置。
     2. 设置BAR大小以匹配捐赠设备:
        ```verilog
        bar0_size <= 32'hXXXX_YYYY;  // 将XXXX_YYYY替换为捐赠设备的BAR0大小
        ```
     3. 根据需要重复设置其他BAR(BAR1, BAR2等)。

   - **示例**:
     ```verilog
     bar0_size <= 32'h00004000;  // BAR0的16KB
     ```

### **6.2 插入设备序列号(DSN)**

如果您的捐赠设备有**设备序列号(DSN)**,将其纳入固件可以增强仿真的逼真度。

1. **定位DSN字段**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中搜索 `rw[127:64]`。
     2. 该字段代表 `cfg_dsn`(配置空间设备序列号)。

2. **插入DSN**
   - **步骤**:
     1. 用捐赠设备的DSN替换占位符:
        ```verilog
        rw[127:64] <= 64'hXXXXXXXX_YYYYYYYY;  // 将X和Y替换为捐赠设备的DSN
        ```
     2. **示例**:
        - **捐赠设备DSN**:上DW:`01 00 00 00`,下DW:`68 4C E0 00`
        - **组合DSN**:`64'h01000000684CE000`
        ```verilog
        rw[127:64] <= 64'h01000000684CE000;  // 捐赠设备的DSN
        ```
     - **无DSN可用**:
        ```verilog
        rw[127:64] <= 64'h0000000000000000;  // 无DSN
        ```

3. **保存更改**
   - **步骤**:
     1. 修改DSN后,保存文件以保留更改。

---

## **7. Vivado项目设置与定制**

在定制配置空间后,将这些更改集成到Vivado项目中,以准备固件进行综合和实现。

### **7.1 生成Vivado项目文件**

1. **打开Vivado**
   - **步骤**:
     1. 在您的开发机器上启动 **Vivado**。
     2. 确保Vivado已正确安装并为您的FPGA设备配置。

2. **访问Tcl控制台**
   - **步骤**:
     1. 在Vivado中,找到应用程序窗口底部的 **Tcl控制台**。
     2. 如果不可见,导航到 **窗口 > Tcl控制台** 以显示它。

3. **导航到PCIeSquirrel目录**
   - **步骤**:
     1. 在Tcl控制台中,确定当前目录:
        ```tcl
        pwd
        ```
     2. 切换到克隆的 `pcileech-fpga` 存储库中的 `PCIeSquirrel` 文件夹:
        ```tcl
        cd C:/Users/YourUsername/Desktop/pcileech-fpga/PCIeSquirrel
        ```
        *根据您的设置替换 `YourUsername` 和路径。*

     - **注意**:如果遇到反斜杠 (`\`) 的错误,使用正斜杠 (`/`):
       ```tcl
       cd C:/Users/YourUsername/Desktop/pcileech-fpga/PCIeSquirrel
       ```

4. **生成Vivado项目**
   - **步骤**:
     1. 在Tcl控制台中,执行项目生成脚本:
        ```tcl
        source vivado_generate_project.tcl -notrace
        ```
     2. 等待脚本完成。此过程将使用必要的配置设置Vivado项目。

5. **打开生成的项目**
   - **步骤**:
     1. 成功生成后,Vivado应自动打开 `.xpr`(Vivado项目)文件。
     2. 保持项目打开以进行进一步的定制。

### **7.2 修改IP模块**

1. **访问PCIe IP核**
   - **步骤**:
     1. 在 **Sources** 窗格中,导航到:
        ```
        pcileech_squirrel_top > i_pcileech_pcie_a7 : pcileech_pcie_a7
        ```
     2. 双击PCIe IP核 (`i_pcie_7x_0 : pcie_7x_0`) 以打开 **重新定制IP** 窗口。

2. **定制设备ID和BARs**
   - **步骤**:
     1. 在 **重新定制IP** 对话框中,导航到 **IDs** 标签。
     2. 输入从捐赠设备收集的 **设备ID**、**厂商ID** 和 **子系统ID**。
     3. 验证 **类代码**:
        - 返回Arbor或您的扫描工具,以确定捐赠设备的类代码。
        - 在 **重新定制IP** 窗口中,设置类代码以匹配捐赠设备。
     4. **示例**:
        - **设备ID**:`0x1234`
        - **厂商ID**:`0xABCD`
        - **子系统ID**:`0x5678`
        - **类代码**:`0x030000`(例如,网络控制器)

3. **配置BAR大小**
   - **步骤**:
     1. 在 **重新定制IP** 对话框中导航到 **BARs** 标签。
     2. 设置 **BAR0大小** 以匹配捐赠设备的BAR0大小。
        - **示例**:如果捐赠设备的BAR0是16KB:
          ```tcl
          BAR0 Size: 16KB
          ```
     3. 如果捐赠设备使用了额外的BAR(BAR1、BAR2等),请重复设置。

4. **完成IP定制**
   - **步骤**:
     1. 设置所有必要参数后,点击 **确定** 以应用更改。
     2. Vivado可能会提示重新生成IP核;确认并允许过程完成。

5. **锁定IP核**
   - **目的**:防止Vivado在综合过程中覆盖手动配置。
   - **步骤**:
     1. 打开Vivado中的 **Tcl控制台**。
     2. 执行以下命令以锁定IP核:
        ```tcl
        set_property is_managed false [get_files pcie_7x_0.xci]
        ```
     3. **解锁**(如果将来需要):
        ```tcl
        set_property is_managed true [get_files pcie_7x_0.xci]
        ```

---

## **8. 高级固件定制**

为了实现精确的1:1仿真,进一步定制PCIe参数、BARs、内存映射、电源管理和中断处理。

### **8.1 配置用于仿真的PCIe参数**

1. **匹配PCIe链路速度和宽度**
   - **重要性**:确保仿真设备以与捐赠设备相同的速度和宽度进行通信。
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中,找到PCIe链路速度和宽度配置。
     2. 更新这些参数以匹配捐赠设备的规格。
        ```verilog
        pcie_link_speed <= 4'bXXXX;  // 将XXXX替换为捐赠设备的PCIe链路速度
        pcie_link_width <= 8'b00000100;  // 将其替换为捐赠设备的PCIe链路宽度(例如x1、x4、x8)
        ```
     - **示例**:
       - **捐赠设备PCIe链路速度**:Gen3(8 GT/s)
       - **捐赠设备PCIe链路宽度**:x4
         ```verilog
         pcie_link_speed <= 4'b0011;  // Gen3
         pcie_link_width <= 8'b00000100;  // x4
         ```

2. **设置能力指针**
   - **目的**:确保PCIe功能正确链接并被主机系统识别。
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中找到能力指针配置。
     2. 设置能力指针以匹配捐赠设备的配置。
        ```verilog
        capability_pointer <= 8'h40;  // 示例值;根据捐赠设备的能力指针替换
        ```

### **8.2 调整BAR和内存映射**

精确的内存映射对于仿真硬件设备至关重要。基地址寄存器(BARs)定义设备的内存和寄存器在系统内存空间中的位置。

1. **设置BAR大小**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中,找到BAR大小分配。
     2. 将BAR大小设置为与捐赠设备匹配。
        ```verilog
        bar0_size <= 32'h00004000;  // BAR0的16KB
        bar1_size <= 32'h00008000;  // BAR1的32KB(如果适用)
        ```

2. **定义BAR地址空间**
   - **步骤**:
     1. 确保BAR地址空间不重叠,并与捐赠设备的内存布局匹配。
     2. 使用记录的BAR大小适当地设置地址范围。
        ```verilog
        bar0_addr <= 32'hF0000000;  // 示例地址;根据捐赠设备的BAR0地址替换
        bar1_addr <= 32'hF0004000;  // 示例地址;根据需要替换
        ```

3. **处理多个BAR**
   - **步骤**:
     1. 如果捐赠设备使用多个BAR,请重复配置每个BAR。
     2. 确保每个BAR的大小和地址与捐赠设备的规格一致。

### **8.3 仿真设备电源管理和中断**

正确仿真电源管理和中断处理确保主机系统与仿真设备无缝交互。

1. **电源管理(PM)配置**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中,找到电源管理能力设置。
     2. 设置PM能力以匹配捐赠设备。
        ```verilog
        PM_CAP_VERSION <= 4'b0011;  // 示例版本;根据捐赠设备的PM版本替换
        PM_CAP_D1SUPPORT <= 1'b1;   // 如果捐赠设备支持D1,则启用
        PM_CAP_AUXCURRENT <= 4'b1000; // 示例值;根据捐赠设备调整
        PM_CSR_NOSOFTRST <= 1'b0;   // 示例值;根据需要调整
        ```

2. **MSI/MSI-X(中断)配置**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中找到MSI/MSI-X配置。
     2. 启用并配置MSI/MSI-X以正确处理中断。
        ```verilog
        MSI_CAP_64_BIT_ADDR_CAPABLE <= 1'b1;  // 如果支持,启用64位MSI
        cfg_interrupt <= 1'b1;               // 启用MSI中断
        ```

3. **实现中断处理逻辑**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中,确保中断信号正确路由。
        ```verilog
        assign cfg_interrupt_di = cfg_int_di;
        assign cfg_interrupt_assert = cfg_int_assert;
        ```
     2. 测试中断功能,确保主机系统正确接收和处理来自仿真设备的中断。
   
---

## **9. 仿真设备特定功能**

为了实现真正的1:1仿真,除了基本的PCIe交互之外,还必须复制捐赠设备的独特功能。

### **9.1 实现高级PCIe功能**

大多数PCIe设备支持**高级错误报告(AER)**、**链路速度协商**和**扩展能力**等高级功能。仿真这些功能确保主机系统将仿真设备视为与捐赠设备相同。

1. **高级错误报告(AER)**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中,找到AER配置。
     2. 如果捐赠设备支持,启用AER。
        ```verilog
        AER_CAP_VERSION <= 4'b0001;  // 示例版本;根据捐赠设备的AER版本替换
        AER_CAP_NEXTPTR <= 8'h00;    // 适当地设置下一个指针
        ```
     3. 实现错误处理逻辑以管理与AER相关的事件。

2. **链路速度协商**
   - **步骤**:
     1. 确保PCIe链路速度和宽度协商与捐赠设备匹配。
     2. 如 **8.1** 所述,调整链路速度设置。

3. **扩展能力**
   - **步骤**:
     1. 确定捐赠设备使用的任何扩展能力(例如,厂商特定的扩展能力、LTR、VSEC)。
     2. 通过在 `pcileech_pcie_cfg_a7.sv` 中定义适当的寄存器和逻辑,实现场这些能力。
        ```verilog
        // 示例:厂商特定的扩展能力
        VSEC_CAP_ID <= 16'hXXXX;       // 将XXXX替换为厂商特定的ID
        VSEC_CAP_VERSION <= 8'hYY;    // 将YY替换为版本
        VSEC_CAP_NEXTPTR <= 8'hZZ;    // 下一个能力指针
        ```

### **9.2 仿真厂商特定功能**

一些设备包含专有或厂商特定的功能,必须准确仿真以确保与主机系统的无缝集成。

1. **识别厂商特定功能**
   - **步骤**:
     1. 使用PCIe流量分析工具(例如,Wireshark、Teledyne LeCroy)监控厂商特定的TLP。
     2. 记录捐赠设备在典型操作中使用的独特寄存器、命令或行为。

2. **实现厂商特定逻辑**
   - **步骤**:
     1. 在 `pcileech_pcie_cfg_a7.sv` 中,添加逻辑以处理厂商特定功能。
        ```verilog
        // 示例:厂商特定寄存器
        vendor_specific_reg <= 32'hXXXXXXXX;  // 将其替换为实际值
        ```
     2. 确保任何专有命令或响应被准确复制。

3. **测试厂商特定功能**
   - **步骤**:
     1. 使用厂商特定的驱动程序或应用程序与仿真设备交互。
     2. 验证所有专有功能是否按预期运行。

---

## **10. 事务层数据包(TLP)仿真**

准确仿真事务层数据包(TLP)对于确保基于FPGA的设备与主机系统无缝通信至关重要,模仿捐赠设备的行为。

### **10.1 理解和捕获TLP**

TLP是PCIe通信的基本单元,处理内存读写、配置访问和中断信号。

1. **从捐赠设备捕获TLP**
   - **步骤**:
     1. 使用PCIe分析工具如 **Teledyne LeCroy的Telescan PE** 或支持PCIe的 **Wireshark** 监控捐赠设备生成的TLP。
     2. 记录捐赠设备在典型操作中使用的TLP的结构、类型和模式。

2. **分析TLP结构**
   - **TLP的组成部分**:
     - **头字段**:定义类型、格式、地址和其他控制信息。
     - **数据载荷**:实际传输的数据。
     - **尾字段**:附加信息,如字节计数和序列号。

   - **示例TLP结构**:
     ```verilog
     tlps_static.tdata[127:0] = {TLP头字段, 数据载荷};
     ```

3. **仿真合法流量**
   - **步骤**:
     1. 确保FPGA生成的TLP在类型、地址、长度和数据方面与捐赠设备捕获的TLP一致。
     2. 实现处理不同类型TLP的逻辑,如内存写、内存读和配置访问。

### **10.2 为特定操作制作自定义TLP**

为了准确模仿捐赠设备,您必须制作自定义TLP,以复制其在各种操作中的行为。

1. **内存写TLP示例**
   - **描述**:表示对系统内存的写操作。
   - **Verilog示例**:
     ```verilog
     tlp_mem_write <= {
         1'b0,                    // 保留位
         7'b10_00000,             // TLP类型:内存写
         1'b0,                    // TLP格式
         address[31:0],           // 写入地址
         data[31:0]               // 数据载荷
     };
     ```

2. **内存读TLP示例**
   - **描述**:表示从系统内存的读操作。
   - **Verilog示例**:
     ```verilog
     tlp_mem_read <= {
         1'b0,                    // 保留位
         7'b00_00000,             // TLP类型:内存读
         1'b0,                    // TLP格式
         address[31:0],           // 读取地址
         tag[7:0]                 // 事务识别标签
     };
     ```

3. **配置访问TLP示例**
   - **描述**:表示配置空间访问。
   - **Verilog示例**:
     ```verilog
     tlp_config_access <= {
         1'b0,                    // 保留位
         7'b01_00000,             // TLP类型:配置读/写
         1'b0,                    // TLP格式
         config_address[31:0],    // 配置空间地址
         config_data[31:0]        // 配置数据载荷
     };
     ```

4. **中断信号TLP示例**
   - **描述**:表示向CPU发送中断信号。
   - **Verilog示例**:
     ```verilog
     tlp_interrupt <= {
         1'b0,                    // 保留位
         7'b11_00000,             // TLP类型:中断
         1'b0,                    // TLP格式
         interrupt_address[31:0], // 与中断相关的地址
         interrupt_data[31:0]     // 中断数据载荷
     };
     ```

5. **实现TLP处理器**
   - **步骤**:
     1. 在固件中,实现不同TLP类型的处理器,以确保正确处理和响应。
     2. 使用状态机或逻辑块管理TLP生成、处理和响应处理。

---

## **11. 构建、闪存和测试**

在定制固件并确保所有配置与捐赠设备一致后,继续在您的FPGA设备上构建、闪存和测试固件。

### **11.1 综合与实现**

1. **运行综合**
   - **步骤**:
     1. 在Vivado中,点击 **运行综合**。
     2. 监控综合过程中的任何警告或错误。
     3. 在继续之前解决任何关键问题。

2. **运行实现**
   - **步骤**:
     1. 综合成功后,启动 **运行实现**。
     2. 确保实现阶段在没有关键警告的情况下完成。
     3. 查看实现报告以识别任何潜在问题。

3. **生成比特流**
   - **步骤**:
     1. 一旦实现完成,点击 **生成比特流**。
     2. 确认生成比特流的任何提示。
     3. 等待比特流生成成功完成。

### **11.2 闪存比特流**

1. **通过JTAG连接FPGA**
   - **步骤**:
     1. 确保您的FPGA设备通过JTAG接口连接到主机系统。
     2. 为FPGA设备供电。

2. **打开Vivado硬件管理器**
   - **步骤**:
     1. 在Vivado中,导航到 **窗口 > 硬件管理器**。
     2. 点击 **打开目标 > 自动连接** 以检测连接的FPGA设备。

3. **编程FPGA**
   - **步骤**:
     1. 在硬件管理器中,右键点击检测到的设备并选择 **编程设备**。
     2. 浏览到生成的比特流文件(`pcileech_squirrel_top.bit`)。
     3. 点击 **编程** 以将固件闪存到FPGA。
     4. 通过硬件管理器控制台确认编程成功。

### **11.3 测试与验证**

1. **验证设备检测**
   - **步骤**:
     1. 使用 **lspci**(在Linux上)或 **设备管理器**(在Windows上)验证FPGA是否被检测为捐赠设备。
     2. 确认 **设备ID**、**厂商ID**、**子系统ID** 和 **BARs** 是否与捐赠设备的规格匹配。

   - **示例(Linux)**:
     ```bash
     lspci -vvv -s <PCI地址>
     ```

2. **内存映射测试**
   - **步骤**:
     1. 访问设备的 **BARs** 以确保正确的内存映射。
     2. 使用内存访问工具或简单的读写操作测试响应性。

3. **中断测试**
   - **步骤**:
     1. 通过仿真设备触发中断。
     2. 验证主机系统是否正确接收和处理这些中断。
     3. 使用系统日志或诊断工具确认中断处理。

4. **性能测试**
   - **步骤**:
     1. 运行DMA速度测试工具以测量数据传输速率。
     2. 将性能指标与预期值进行比较,以确保固件的稳定性和效率。

   - **示例工具**:
     - **PCILeech DMA速度测试**:在PCILeech工具集中可用。
     - **自定义基准测试脚本**:执行读写操作以测量性能。

5. **配置空间验证**
   - **步骤**:
     1. 使用诊断工具检查PCIe配置空间。
     2. 确保所有字段(设备ID、厂商ID、BARs、功能)正确设置并与捐赠设备匹配。

   - **示例(Linux)**:
     ```bash
     lspci -vvv -s <PCI地址>
     ```

---

## **12. 高级调试技术**

在开发定制固件时,遇到问题是常见的。高级调试技术可以帮助有效地识别和解决这些问题。

### **12.1 使用Vivado的集成逻辑分析仪**

Vivado的**集成逻辑分析仪(ILA)**允许实时监控内部FPGA信号,有助于调试和验证。

1. **设置ILA探针**
   - **步骤**:
     1. 在Vivado中,导航到 **Sources > 添加源** 并添加一个 **集成逻辑分析仪**。
     2. 在PCIe通信路径的关键点插入ILA探针,例如TLP生成器或BAR访问控制器。
        ```verilog
        // 示例:为TLP数据添加ILA探针
        wire [127:0] tlp_data;
        assign tlp_data = tlps_static.tdata[127:0];
        ila_0 probe (
            .clk(clk),
            .probe0(tlp_data)
        );
        ```

2. **配置触发器**
   - **步骤**:
     1. 打开 **ILA** 配置对话框。
     2. 根据特定事件设置触发条件,例如TLP生成或内存访问。
        ```verilog
        // 示例触发条件:内存写TLP的开始
        if (tlp_type == MEMORY_WRITE && tlp_valid) begin
            trigger_signal <= 1;
        end
        ```

3. **分析信号波形**
   - **步骤**:
     1. 启用ILA探针运行FPGA。
     2. 使用Vivado的 **波形查看器** 检查捕获的信号波形。
     3. 识别时序问题、不正确的逻辑状态或意外行为。

   - **优势**:
     - 实时查看内部信号。
     - 能够捕获和分析TLP处理过程中的瞬态问题。

### **12.2 PCIe流量分析工具**

除了Vivado的ILA,外部PCIe流量分析工具提供了深入了解FPGA与主机系统之间PCIe通信的能力。

1. **带有PCIe扩展的Wireshark**
   - **描述**:Wireshark可以通过适当的扩展或插件捕获和分析PCIe流量。
   - **步骤**:
     1. 安装带有PCIe支持的Wireshark。
     2. 配置Wireshark以捕获PCIe流量。
     3. 分析捕获的TLP,以确保其符合预期的捐赠设备行为。

2. **Teledyne LeCroy Telescan PE**
   - **描述**:专业级PCIe流量分析工具,提供全面的PCIe流量监控和分析功能。
   - **步骤**:
     1. 安装Teledyne LeCroy的Telescan PE。
     2. 将其连接到您的系统以监控PCIe流量。
     3. 使用其分析功能捕获和解析FPGA与主机系统之间交换的TLP。

3. **Total Phase Beagle**
   - **描述**:PCIe流量分析仪,允许实时捕获和分析PCIe通信。
   - **步骤**:
     1. 使用Total Phase Beagle PCIe分析仪设置您的系统。
     2. 配置其以监控和捕获PCIe流量。
     3. 使用其分析功能验证TLP的完整性和行为。

**使用PCIe流量分析工具的优势**:

- **全面的TLP分析**:详细检查TLP,确保准确的仿真。
- **错误检测**:识别格式错误的TLP或意外的事务模式。
- **性能指标**:测量数据传输速率并识别瓶颈。

---

## **13. 故障排除**

在固件开发过程中遇到问题是常见的。本节提供了在仿真过程中可能遇到的常见问题的解决方案。

### **13.1 设备检测问题**

**问题**:主机系统未能检测到FPGA作为捐赠设备。

**解决方案**:

1. **验证设备ID**
   - **步骤**:
     1. 仔细检查固件中的 **设备ID**、**厂商ID** 和 **子系统ID** 是否与捐赠设备匹配。
     2. 确保配置空间中没有拼写错误或不正确的值。

2. **检查PCIe链路训练**
   - **步骤**:
     1. 使用PCIe诊断工具验证PCIe链路是否正确训练。
     2. 确保链路速度和宽度配置与捐赠设备匹配。

3. **确保正确的BAR配置**
   - **步骤**:
     1. 确认 **BAR大小** 和 **地址范围** 是否准确设置。
     2. 确保没有重叠或冲突的BAR配置。

4. **电源和连接检查**
   - **步骤**:
     1. 确保FPGA设备已正确连接并通电。
     2. 重新插拔PCIe卡以确保连接牢固。

### **13.2 内存映射和BAR配置错误**

**问题**:不正确的内存映射导致内存访问失败或不准确。

**解决方案**:

1. **仔细检查BAR大小和地址**
   - **步骤**:
     1. 验证固件中的每个BAR大小是否与捐赠设备的配置匹配。
     2. 确保BAR地址空间设置正确且不重叠。

2. **使用诊断工具**
   - **步骤**:
     1. 利用 **lspci** 或 **Arbor** 等工具检查PCIe配置空间。
     2. 确认BARs是否正确映射并可访问。

3. **调整内存区域**
   - **步骤**:
     1. 如果内存区域不可访问,调整BAR配置以更好地匹配系统的内存映射。
     2. 确保固件逻辑正确处理内存读/写操作。

### **13.3 DMA性能和TLP错误**

**问题**:DMA性能缓慢或与事务层数据包(TLP)相关的错误。

**解决方案**:

1. **优化TLP生成**
   - **步骤**:
     1. 确保TLP格式正确且无错误。
     2. 使用Vivado的ILA和PCIe流量分析工具识别并修正格式错误的TLP。

2. **调整有效载荷大小**
   - **步骤**:
     1. 将最大读取请求和有效载荷大小设置为4KB或捐赠设备支持的最高值。
        ```verilog
        max_read_request_size <= 4;  // 4KB
        max_payload_size <= 4;       // 4KB
        ```
     2. 避免设置超出捐赠设备支持的有效载荷大小,以防止系统不稳定。

3. **检查PCIe链路设置**
   - **步骤**:
     1. 验证PCIe链路速度和宽度是否正确配置。
     2. 确保FPGA与主机系统准确协商链路参数。

4. **固件完整性**
   - **步骤**:
     1. 审查并验证固件的所有最近更改,确保没有引入无意的修改。
     2. 如果性能问题持续存在,恢复到已知稳定的固件版本。

---

## **14. 仿真精度和优化**

确保仿真的精度对于无缝集成和不可检测的行为至关重要。本节概述了提高仿真精确度和优化性能的技术。

### **14.1 精确时序仿真的技术**

匹配捐赠设备的时序特性确保主机系统与仿真设备交互时如同与原始硬件设备一样。

1. **使用匹配的时钟域**
   - **步骤**:
     1. 确保FPGA的时钟与PCIe链路的时钟速率匹配。
     2. 同步FPGA内部的时钟,以符合PCIe时序要求。

2. **控制响应延迟**
   - **步骤**:
     1. 实现寄存器或计数器,以管理TLP确认和中断处理的响应时间。
     2. 确保响应延迟与捐赠设备的典型响应时间匹配。

3. **实现流水线阶段**
   - **步骤**:
     1. 在FPGA设计中使用流水线技术,以与捐赠设备的数据处理阶段对齐。
     2. 这减少了延迟,并确保及时的TLP生成和处理。

### **14.2 对系统调用的动态响应**

基于系统交互仿真设备的动态行为,确保FPGA设备在各种条件下适当响应。

1. **实现状态机**
   - **步骤**:
     1. 在FPGA中设计状态机,以管理仿真设备的不同操作状态。
     2. 确保状态之间的过渡基于系统调用和交互,模仿捐赠设备的行为。

2. **跟踪并响应系统请求**
   - **步骤**:
     1. 监控传入的系统请求,并动态调整设备的响应。
     2. 确保FPGA固件能够处理不同的工作负载,并准确响应不同类型的TLP。

3. **处理异步事件**
   - **步骤**:
     1. 实现逻辑,以管理异步事件如中断或错误条件。
     2. 确保固件能够以与捐赠设备一致的方式生成和响应这些事件。

---

## **15. 固件开发的最佳实践**

遵循最佳实践确保开发过程高效、可维护且安全。

### **15.1 持续测试和文档记录**

- **频繁测试**
  - **步骤**:
    1. 每次修改后进行定期测试,以确保固件按预期运行。
    2. 使用自动化脚本或测试台持续验证固件功能。

- **记录更改**
  - **步骤**:
    1. 为固件的每次更改保持详细的文档记录。
    2. 包括更改的原因及其对整体设计的影响。

### **15.2 管理固件版本**

- **使用版本控制**
  - **步骤**:
    1. 实施版本控制系统(例如 **Git**),以管理固件的不同迭代版本。
    2. 定期提交更改,并附上描述性消息,以跟踪项目的演变。

- **分支策略**
  - **步骤**:
    1. 使用分支管理功能开发、修复漏洞和实验性更改。
    2. 仅在彻底测试后将稳定分支合并到主分支。

### **15.3 安全考虑**

- **防止未经授权的访问**
  - **步骤**:
    1. 确保固件不会将系统内存或硬件暴露给未经授权的访问。
    2. 在固件中实施访问控制和验证检查。

- **保护固件完整性**
  - **步骤**:
    1. 避免在固件开发过程中引入漏洞或后门。
    2. 定期进行安全审查和代码审计,以维护固件的完整性。

- **安全处理敏感数据**
  - **步骤**:
    1. 如果固件与敏感数据交互,实施加密和安全的数据处理实践。
    2. 确保通过固件接口或日志不泄露敏感信息。

---

## **16. 附加资源**

为了进一步提升您在开发用于设备仿真的定制固件方面的理解和能力,以下资源非常宝贵:

- **PCILeech-FPGA 存储库**
  - **链接**: [https://github.com/ufrisk/pcileech-fpga](https://github.com/ufrisk/pcileech-fpga)

- **Vivado FPGA 文档**
  - **链接**: [Xilinx Vivado 文档](https://www.xilinx.com/support/documentation.html)

- **PCI-SIG 规范**
  - **链接**: [PCI-SIG](https://pcisig.com)

- **PCIe TLP 初学者教程**
  - **链接**: [PCIe TLP 初学者教程](https://www.xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1)

- **Teledyne LeCroy Telescan PE 文档**
  - **链接**: [Teledyne LeCroy Telescan PE](https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software)

- **Wireshark PCIe 扩展**
  - **链接**: [Wireshark 扩展](https://www.wireshark.org/docs/)

- **现场可编程门阵列(FPGA)基础**
  - **链接**: [FPGA 基础](https://www.xilinx.com/support/documentation/sw_manuals/xilinx2020_2/ug901-vivado-tutorial.pdf)

- **Arbor 软件用户指南**
  - **链接**: [Arbor 用户指南](https://www.mindshare.com/software/Arbor)

- **PCIe 规范和指南**
  - **链接**: [PCIe 规范](https://pcisig.com/specifications)


================================================
FILE: CN/README.md
================================================
# **全设备仿真的定制固件开发指南**

---

**特别鸣谢慷慨捐助的传奇人物,我将很快与您联系。如果您愿意,请DM我,我会在本文中添加鸣谢并提供更多信息!**

正在将此指南整理到[维基](https://github.com/JPShag/PCILeech-DMA-Firmware/wiki/Introduction)中。欢迎提供帮助!

----

**作者留言及指南状态:**

我正在透明地分享这一切,因为最近的日子异常艰难。除了因欺诈性退款造成的巨大经济损失外,我还面临多重生活和健康困境,严重影响了我上网和投入项目的时间。坦率地说,在这些个人困难中,继续创作像本指南这样全面的资源已成为一项深刻的挣扎。

这预计是主指南的最后一次重大迭代。对于已经熟悉基本硬件概念(例如,FTDI芯片的功能)的更有经验的用户,我们将提供一个简洁的精简版。

如果您觉得这项工作有价值并能够提供帮助,任何形式的支持都将不胜感激。您的慷慨使我尽管面临持续的挑战,仍能继续为这个社区做出贡献。我真诚地希望本指南已经并将继续成为一份宝贵的资源。

---

## 纪念与献词

![Ross](https://github.com/user-attachments/assets/de7f12fe-8992-4738-a6af-712dc48217ee)

本指南谨献给
**Ross Freeman (1947–1989)** 的记忆

作为一位富有远见的工程师、杰出的密歇根人,以及Xilinx的联合创始人,Ross Freeman被广泛认为是现场可编程门阵列(FPGA)技术之父,该技术彻底改变了计算领域。

在1984年,半导体行业主要专注于固定功能芯片之时,Freeman敢于想象一种不同的范式:制造后可以重新编程的硬件。他的革命性专利(#4,870,302)和对可重构计算的不懈倡导,开启了一个四十年后仍在改变我们世界的科技范式。

他的开创性创新使得在无需承担传统ASIC开发高昂成本的情况下,快速原型化和部署定制芯片解决方案成为可能,从而使硬件设计民主化,并加速了无数领域的技术进步。

如今,Freeman的愿景驱动着人工智能、高性能计算、电信、汽车系统、航空航天应用以及他在世时仅是梦想的许多其他领域的尖端发展。

他于2009年被追授进入国家发明家名人堂,其遗产不仅体现在硅片中,更体现在挑战我们所有人质疑既定限制并想象新可能性的技术勇气精神中。

*"FPGA的最终目标是制造可编程逻辑器件,以取代标准数字芯片。"* — Ross Freeman

---

## **目录**

### **第一部分:基础概念**

1.  [引言](#1-引言)
    *   [1.1 本指南的目的](#11-本指南的目的)
    *   [1.2 目标读者](#12-目标读者)
    *   [1.3 如何使用本指南](#13-如何使用本指南)
2.  [关键定义](#2-关键定义)
3.  [设备兼容性](#3-设备兼容性)
    *   [3.1 支持的基于FPGA的硬件](#31-支持的基于fpga的硬件)
    *   [3.2 PCIe硬件注意事项](#32-pcie硬件注意事项)
    *   [3.3 系统要求](#33-系统要求)
4.  [要求](#4-要求)
    *   [4.1 硬件](#41-硬件)
    *   [4.2 软件](#42-软件)
    *   [4.3 环境设置](#43-环境设置)
5.  [收集捐赠设备信息](#5-收集捐赠设备信息)
    *   [5.1 使用Arbor进行PCIe设备扫描](#51-使用arbor进行pcie设备扫描)
    *   [5.2 提取和记录设备属性](#52-提取和记录设备属性)
6.  [初始固件定制](#6-初始固件定制)
    *   [6.1 修改配置空间](#61-修改配置空间)
    *   [6.2 插入设备序列号(DSN)](#62-插入设备序列号dsn)
7.  [Vivado项目设置与定制](#7-vivado项目设置与定制)
    *   [7.1 生成Vivado项目文件](#71-生成vivado项目文件)
    *   [7.2 修改IP核](#72-修改ip核)

### **第二部分:中级概念与实现**

8.  [高级固件定制](#8-高级固件定制)
    *   [8.1 配置PCIe参数以进行仿真](#81-配置pcie参数以进行仿真)
    *   [8.2 调整BARs和内存映射](#82-调整bars和内存映射)
    *   [8.3 仿真设备电源管理和中断](#83-仿真设备电源管理和中断)
9.  [仿真设备特定功能](#9-仿真设备特定功能)
    *   [9.1 实现高级PCIe功能](#91-实现高级pcie功能)
    *   [9.2 仿真厂商特定功能](#92-仿真厂商特定功能)
10. [事务层数据包(TLP)仿真](#10-事务层数据包tlp仿真)
    *   [10.1 理解和捕获TLP](#101-理解和捕获tlp)
    *   [10.2 制作用于特定操作的定制TLP](#102-制作用于特定操作的定制tlp)

### **第三部分:高级技术与优化**

11. [构建、烧录与测试](#11-构建烧录与测试)
    *   [11.1 综合与实现](#111-综合与实现)
    *   [11.2 烧录比特流](#112-烧录比特流)
    *   [11.3 测试与验证](#113-测试与验证)
12. [高级调试技术](#12-高级调试技术)
    *   [12.1 使用Vivado的集成逻辑分析仪](#121-使用vivado的集成逻辑分析仪)
    *   [12.2 PCIe流量分析工具](#122-pcie流量分析工具)
13. [故障排除](#13-故障排除)
    *   [13.1 设备检测问题](#131-设备检测问题)
    *   [13.2 内存映射和BAR配置错误](#132-内存映射和bar配置错误)
    *   [13.3 DMA性能和TLP错误](#133-dma性能和tlp错误)
14. [仿真精度与优化](#14-仿真精度与优化)
    *   [14.1 精确定时仿真技术](#141-精确定时仿真技术)
    *   [14.2 对系统调用的动态响应](#142-对系统调用的动态响应)
15. [固件开发最佳实践](#15-固件开发最佳实践)
    *   [15.1 持续测试与文档](#151-持续测试与文档)
    *   [15.2 管理固件版本](#152-管理固件版本)
    *   [15.3 安全注意事项](#153-安全注意事项)
16. [其他资源](#16-其他资源)
17. [联系方式](#17-联系方式)
18. [支持与贡献](#18-支持与贡献)

---

## **第一部分:基础概念**

---

## **1. 引言**

### **1.1 本指南的目的**

本指南的总体目标是让您掌握开发基于现场可编程门阵列(FPGA)设备的定制直接内存访问(DMA)固件的知识和实践技能。这种专用固件允许您的FPGA精确地仿真其他PCIe(Peripheral Component Interconnect Express)硬件设备的身份和行为。这种仿真是一种强大的技术,在多个高级领域具有深远意义:

**硬件安全研究**:
*   **漏洞发现**:通过仿真设备,您可以创建一个受控环境,向主机驱动程序发送格式错误或意外数据,系统性地进行模糊测试,以发现可能通过硬件外设利用的漏洞(例如,缓冲区溢出、竞态条件)。
*   **驱动程序分析**:观察操作系统和特定驱动程序如何与硬件交互。您可以仿真具有非标准配置或未文档化功能的设备,以了解驱动程序行为、识别安全假设或逆向工程专有协议。
*   **侧信道分析**:虽然更复杂,但仿真设备可以通过精确控制外设操作,潜在地协助进行与通过时序或功耗分析进行信息泄漏相关的实验。

**红队演练与渗透测试**:
*   **绕过安全措施**:仿真一个看似良性或白名单的硬件设备(例如,一个常见的网卡或存储控制器),以获取DMA权限。一旦实现,这允许直接与系统内存交互,可能绕过在更高软件层运行的端点检测和响应(EDR)系统或反恶意软件解决方案。
*   **隐蔽持久性**:仿真恶意设备可以提供一种隐蔽的方式来维护对受损系统的访问,因为它可能比基于软件的植入物更难检测。
*   **利用信任关系**:系统通常对连接的硬件有隐式信任。定制固件可以通过模仿被授予特定权限或访问的设备来利用这一点。

**系统调试与诊断**:
*   **可复现的测试平台**:创建高度特定的硬件场景,以可靠地复现可能仅在特定设备状态或数据模式下发生的难以捉摸的错误。
*   **故障注入**:故意仿真有缺陷的设备行为(例如,错误的TLP形成、延迟响应),以测试主机系统及其驱动程序的健壮性和错误处理能力。

**硬件测试与验证**:
*   **驱动程序开发**:在物理原型可用之前,或为了模拟比物理可访问的更广泛的硬件变体,针对仿真硬件配置文件测试新的或修改的驱动程序。
*   **合规性测试**:虽然不能替代官方合规性测试,但仿真设备可以帮助预验证PCIe协议遵守的某些方面。

**传统系统支持与互操作性**:
*   仿真老旧、停产或难以采购的PCIe设备,以保持传统系统运行或弥合不同硬件代之间的兼容性差距。

通过学习本指南,您将熟练掌握:
*   精细地从物理“捐赠”PCIe设备中提取识别属性和配置细节。
*   修改和扩展现有开源FPGA固件框架(主要关注广泛使用的PCILeech-FPGA项目),以采用捐赠设备的身份。
*   配置和利用以Xilinx Vivado为核心的专业FPGA开发工具链,以及Visual Studio Code等基本代码编辑工具。
*   对PCIe架构的分层模型、DMA数据传输机制以及低级别复制硬件行为的固件开发细微之处,形成扎实的理解。

### **1.2 目标读者**

本指南专为已具备计算机系统、硬件原理和软件开发基础到中级知识的个人量身定制。内容技术性强,并假定读者具备进行详细、低级别工作的能力。具体来说,它面向以下人群:

*   **固件开发人员**:旨在为FPGA设计或改编固件的工程师,特别是涉及高速数据传输(DMA)和通过PCIe直接硬件接口操作的应用。强烈建议具备Verilog/VHDL背景和FPGA开发工具经验。
*   **硬件工程师**:参与PCIe硬件设计、测试或验证的专业人员。本指南可以帮助创建复杂的测试线束或在更大的系统设计中仿真组件。预计熟悉PCIe协议和数字设计。
*   **网络安全专业人员与研究人员**:
    *   **漏洞研究员与漏洞利用开发人员**:希望探索硬件级攻击面或开发利用DMA的概念验证漏洞。操作系统内部、内存管理和驱动程序架构的理解至关重要。
    *   **红队成员**:寻求通过直接硬件操作来获取系统访问、持久性和数据窃取的先进技术操作员。
    *   **数字取证与事件响应人员**:虽然本指南侧重于攻击,但理解这些技术有助于识别和分析复杂的基于硬件的攻击。
*   **FPGA爱好者与高级业余爱好者**:有FPGA项目经验,渴望应对PCIe通信和硬件仿真等复杂挑战的个人。愿意深入研究数据手册和技术规范是关键。

学习曲线可能很陡峭,特别是如果PCIe或高级FPGA概念是新知识。然而,本指南旨在将复杂主题分解为可管理的步骤。

### **1.3 如何使用本指南**

本指南分为三个逻辑递进的部分,旨在逐步构建您的知识:

*   **第一部分:基础概念**:这第一部分至关重要。它介绍了核心术语、PCIe和DMA的基本原理、必要的硬件和软件堆栈(包括Xilinx Vivado和PCILeech-FPGA框架等工具的设置说明),以及从目标“捐赠”设备获取重要信息和进行基本固件修改的初始程序。强烈建议按顺序彻底学习本部分。
*   **第二部分:中级概念与实现**:(后续章节)在基础知识之上,本部分将引导您进行更高级的固件定制。主题将包括微调PCIe操作参数、仿真设备特定寄存器和功能(如电源管理状态和消息信号中断 - MSI/MSI-X),以及初步理解事务层数据包(TLP)的构建和解释。
*   **第三部分:高级技术与优化**:(后续章节)最后一部分将探讨复杂的调试方法(包括使用集成逻辑分析仪 - ILA和外部PCIe协议分析仪)、优化固件性能和仿真精度的技术、常见和复杂问题的全面故障排除,以及关于最佳实践的关键讨论,特别关注开发和部署仿真PCIe设备的安全影响。

**学习本指南的步骤**:
*   **顺序学习**:特别是对于第一部分和第二部分,请按顺序学习各节,因为后面的概念建立在前面的基础之上。
*   **动手实践**:这是一份实践指南。请在您自己的硬件上积极执行设置步骤、代码修改和实验。
*   **适应您的环境**:文件路径、特定设备ID和软件版本可能有所不同。理解指令背后的概念,以使其适应您的特定设置。
*   **查阅外部资源**:PCIe规范和FPGA文档是您的最终参考。本指南进行简化和引导,但深入研究通常需要查阅原始资料。
*   **迭代开发**:固件开发很少是线性的。预期会进行迭代、调试和改进您的设计。广泛使用故障排除部分和调试技术。

您将使用HDL(PCILeech-FPGA中的SystemVerilog)、FPGA综合和实现工具(Vivado),并可能使用主机端编程工具和PCIe分析实用程序。

---

## **2. 关键定义**

牢固掌握以下术语对于理解PCIe设备仿真和定制固件开发的复杂性至关重要。这些术语将在整个指南中广泛使用。

*   **DMA (Direct Memory Access)** (直接内存访问):
    *   **定义**:现代计算机体系结构的一项基本功能,允许硬件外设(如网卡、GPU或您的基于FPGA的仿真设备)直接读取和写入主系统内存(RAM),而无需CPU参与每个字节的传输。
    *   **重要性**:DMA对于高性能I/O操作至关重要。通过将数据传输任务从CPU卸载,它使CPU能够执行其他计算,显著提高整体系统吞吐量和效率。在本指南中,您的FPGA将利用DMA与主机系统的内存进行交互,这是一种在安全研究和红队演练中经常被利用的强大功能。

*   **PCIe (Peripheral Component Interconnect Express)** (外围组件互连高速):
    *   **定义**:一种高速串行计算机扩展总线标准,旨在取代旧的总线标准,如PCI、PCI-X和AGP。它采用点对点拓扑结构,每个设备通过独立的串行链路连接到根联合体(通常是芯片组或CPU的一部分)。通信通过数据包进行。
    *   **重要性**:PCIe是连接高性能外设到主板的主导标准。理解其协议、分层架构(物理层、数据链路层、事务层)和配置机制对于仿真任何现代硬件设备至关重要。

*   **TLP (Transaction Layer Packet)** (事务层数据包):
    *   **定义**:PCIe协议事务层的数据交换基本单位。TLP负责在PCIe设备之间传输请求(例如,内存读/写、I/O读/写、配置读/写)和完成(对请求的响应)。每个TLP由一个报头、一个可选的数据有效载荷和一个可选的端到端CRC(ECRC)组成。
    *   **重要性**:为了精确仿真设备,您的FPGA固件必须能够正确地形成、传输、接收和解释与捐赠设备行为匹配的TLP。理解TLP类型、格式和流控制对于高级仿真至关重要。

*   **BAR (Base Address Register)** (基地址寄存器):
    *   **定义**:位于PCIe设备的配置空间内,BAR是特殊的寄存器,设备通过它们向主机系统请求地址空间资源。一个设备最多可以有六个32位BAR(或更少,或成对的32位BAR可以形成64位BAR)。这些寄存器定义了设备用于向主机CPU公开其寄存器和内部内存的内存映射I/O(MMIO)区域或I/O端口区域的起始地址和大小。
    *   **重要性**:当主机系统枚举PCIe设备时,它会读取BAR以确定设备的内存和I/O要求,然后分配并用系统中物理地址图中的实际基地址来编程这些BAR。您的仿真设备必须精确定义其BAR以匹配捐赠设备,以便主机操作系统和驱动程序能够正确地与其交互。

*   **FPGA (Field-Programmable Gate Array)** (现场可编程门阵列):
    *   **定义**:一种集成电路(IC),可以在制造后由设计者或客户进行配置——因此称为“现场可编程”。FPGA包含一个可编程逻辑块阵列和可重构互连的层次结构,允许这些块“连接”起来以实现定制数字逻辑电路。
    *   **重要性**:FPGA是本指南中使用的核心硬件。其可重构特性使其成为仿真其他硬件设备的理想选择,因为您可以定义精确的逻辑和接口来模仿捐赠设备的PCIe存在和行为。

*   **MSI/MSI-X (Message Signaled Interrupts / Message Signaled Interrupts Extended)** (消息信号中断 / 扩展消息信号中断):
    *   **定义**:允许PCIe设备通过向系统定义的内存地址写入特殊消息(TLP,特别是内存写入TLP)来向CPU传递中断的机制,而不是使用专用的物理中断线(如传统PCI)。MSI-X是MSI的增强版,提供更多的中断向量和更大的灵活性。
    *   **重要性**:大多数现代PCIe设备使用MSI或MSI-X以实现更高效、更灵活的中断处理。精确仿真通常需要实现捐赠设备选择的中断机制,包括配置MSI/MSI-X能力结构并正确生成中断消息。

*   **DSN (Device Serial Number)** (设备序列号):
    *   **定义**:一个64位全局唯一标识符,可由PCIe设备可选实现。如果存在,它通常位于设备配置空间内的扩展能力结构中。
    *   **重要性**:虽然并非所有设备都具有DSN,但某些驱动程序或管理软件可能会使用它进行唯一标识、许可或跟踪。正确仿真它对于完全透明和避免检测到仿真设备可能很重要。

*   **PCIe Configuration Space** (PCIe配置空间):
    *   **定义**:与每个PCIe功能(一个设备可以有多个功能)关联的标准化256字节(对于Type 0、端点设备)或4KB地址区域。此空间包含有关设备的重要信息,包括其厂商ID、设备ID、类别代码、修订ID、BAR、能力指针以及各种状态和控制寄存器。主机系统使用特殊的配置读和配置写TLP访问此空间。
    *   **重要性**:配置空间是PCIe设备的“身份证”。设备仿真的第一步就是将捐赠设备配置空间的相关部分精确复制到您的FPGA固件中。主机系统使用此信息来识别、配置和分配资源给设备。

*   **Donor Device** (捐赠设备):
    *   **定义**:您旨在在FPGA上仿真其身份和行为的物理PCIe硬件设备。该设备作为提取配置细节(厂商ID、设备ID、BAR设置、能力等)和行为模式的来源。
    *   **重要性**:您的仿真 fidelity 直接取决于您能够多么精确和完整地收集并复制捐赠设备的特性。

*   **Root Complex (RC)** (根联合体):
    *   **定义**:PCIe层级结构中将CPU和内存子系统连接到PCIe结构的实体。它代表CPU生成PCIe事务,并处理下游PCIe设备发起的事务。它还执行初始的总线枚举和配置。
    *   **重要性**:您的仿真设备在与主机系统通信时,将主要与根联合体(或与其连接的交换机)交互。

*   **Endpoint (EP)** (端点):
    *   **定义**:位于PCIe结构外围,消费或生产数据的一种PCIe设备。示例包括网卡、显卡、存储控制器以及您将要编程的FPGA设备。端点请求资源并向根联合体发起事务。
    *   **重要性**:在本指南中,您的FPGA将被编程为充当一个端点设备,仿真一个特定的捐赠端点。

*   **HDL (Hardware Description Language)** (硬件描述语言):
    *   **定义**:一种专用计算机语言,用于描述电子电路的结构、设计和操作,特别是数字逻辑电路。常见的HDL包括Verilog和VHDL。
    *   **重要性**:您将在PCILeech-FPGA项目中使用Verilog(特别是SystemVerilog,Verilog的扩展)来定义仿真设备的定制逻辑。

*   **Bitstream** (比特流):
    *   **定义**:加载到FPGA上的最终配置文件,用于编程其逻辑块和互连,从而实现您的定制硬件设计。它是FPGA开发工具(如Xilinx Vivado)的编译输出。
    *   **重要性**:生成和烧录正确的比特流是将定制固件部署到FPGA的最终步骤。

---

## **3. 设备兼容性**

成功且精确的PCIe设备仿真取决于确保您选择的基于FPGA的硬件和主机系统配置完全兼容。本节详细介绍了支持的FPGA平台、关键的PCIe硬件注意事项以及设置开发环境所需的系统要求。

### **3.1 支持的基于FPGA的硬件**

虽然本指南提供了一种可适用于各种基于FPGA的DMA硬件的通用方法,但我们的主要示例和具体说明将侧重于 **Xilinx 7系列FPGA**,由于其性能和可访问性的平衡,它们在开源DMA板中很常见。**Squirrel DMA (35T)** 卡因其受欢迎程度以及与PCILeech-FPGA框架的良好兼容性而受到强调。

定制PCIe IP核和开发硬件描述语言(HDL)逻辑的核心原则和技术广泛适用于以下FPGA系列和特定板卡:

*   **Squirrel (Artix-7 35T)**
    *   **描述**:一种广泛可用且经济高效的基于FPGA的DMA设备,采用Xilinx Artix-7 35T FPGA。它为标准内存采集任务以及各种基本到中级设备仿真项目提供了足够的逻辑资源和内存。它是初次接触基于FPGA的DMA的优秀起点。
    *   **主要特点**:Artix-7提供了良好的性能价格比,适用于教育和研究目的。
*   **Enigma-X1 (Artix-7 75T)**
    *   **描述**:与35T相比,提供增强的逻辑和内存资源的中级FPGA,通常基于Xilinx Artix-7 75T FPGA。这为更复杂的仿真场景、更大的内存映射区域或需要额外FPGA逻辑的更复杂的DMA操作提供了更大的灵活性。
    *   **主要特点**:增加的逻辑单元和块RAM(BRAM)支持更复杂的设计。
*   **ZDMA (Artix-7 100T)**
    *   **描述**:基于更高性能的Artix-7 100T FPGA,针对要求更高的内存交互和大量的读/写操作进行了优化。此板卡适用于大规模DMA解决方案、高吞吐量仿真或需要大量片上内存的项目。
    *   **主要特点**:100T变体在资源方面提供了显著升级,是突破仿真界限的理想选择。
*   **Kintex-7 (K325T, K410T等)**
    *   **描述**:代表高级别,Kintex-7 FPGA(例如K325T、K410T)为高度复杂的项目、大规模DMA解决方案以及需要更高PCIe通道数或速度(例如,Gen3 x8/x16)的应用提供了强大的功能。虽然价格更昂贵,但它们提供了更多的逻辑、DSP切片和内存,从而能够仿真高度复杂和苛刻的捐赠设备。
    *   **主要特点**:用于更快PCIe世代的高性能收发器,丰富的逻辑和内存资源,适用于复杂设计。

**关于FPGA系列的重要说明**:尽管原理相似,但不同的Xilinx 7系列FPGA(Artix-7、Kintex-7、Zynq-7000 PS/PL)之间,特定的IP核配置和时钟结构可能略有不同。请始终参考特定板卡文档和您所选FPGA系列的Xilinx PCIe IP核用户指南。PCILeech-FPGA项目通常提供板卡特定的Tcl脚本和源文件以简化此过程。

### **3.2 PCIe硬件注意事项**

为了确保基于FPGA的DMA设备在仿真中平稳无限制地运行,需要仔细考虑一些PCIe特定和主机系统功能,并在某些情况下进行修改。

*   **IOMMU / VT-d / AMD-Vi 设置**
    *   **建议**:对于初始设置和测试,**强烈建议在系统的BIOS/UEFI设置中禁用IOMMU(Intel的定向I/O虚拟化技术 - VT-d)或AMD的等效技术(AMD-Vi)**。
    *   **理由**:IOMMU是为DMA功能设备提供内存管理单元的硬件组件。它们执行地址转换,类似于CPU的MMU,并且可以强制执行内存访问权限。虽然它们对于安全和虚拟化(防止恶意设备访问未经授权的内存区域)至关重要,但它们**会**限制DMA设备对系统内存的访问,可能干扰内存采集和设备仿真。禁用IOMMU允许DMA设备不受限制地访问内存,这对于高级仿真和安全研究目的通常是必要的。
    *   **位置**:通常在BIOS/UEFI中的“CPU Configuration”、“Virtualization”、“Advanced Settings”或“I/O Virtualization”下找到。
*   **内核DMA保护(Windows)/ Thunderbolt安全级别(Linux)**
    *   **建议(Windows)**:在现代Windows系统中禁用**内核DMA保护**功能。这包括**基于虚拟化的安全性(VBS)**和**内存完整性(HVCI)**等设置。这些功能利用IOMMU来防止通过Thunderbolt或PCIe连接的外部外设进行未经授权的DMA攻击。
    *   **步骤(Windows)**:
        *   访问Windows安全设置:**开始 > 设置 > 隐私和安全性 > Windows 安全中心 > 设备安全性**。
        *   在“核心隔离”下,点击“核心隔离详细信息”。
        *   关闭“内存完整性”。
        *   您可能还需要在BIOS/UEFI中禁用安全启动,因为VBS通常依赖于它。
        *   **注意**:禁用这些功能会显著**降低您系统的安全态势**,使其容易受到包括涉及恶意DMA设备的各种攻击。这应该只在专用测试系统上进行,而不是在您的主机器上,并且在您了解风险的安全、隔离环境中进行。
    *   **建议(Linux/Thunderbolt)**:如果使用带有Thunderbolt端口的系统,请了解并可能调整BIOS/UEFI中的**Thunderbolt安全级别**。较低的安全级别(例如,“无安全”、“用户授权”)通常是任意Thunderbolt/PCIe设备在未经明确主机批准的情况下执行DMA所必需的。
*   **PCIe插槽要求**
    *   **建议**:使用与FPGA设备要求物理匹配的兼容PCIe插槽。大多数基于Artix-7的DMA卡在PCIe Gen2 x1或x4下运行。
    *   **理由**:
        *   **物理匹配**:x1卡可以插入x1、x4、x8或x16插槽,但x4卡至少需要x4插槽。
        *   **性能**:虽然x4卡*可能*在x1插槽中工作(如果物理连接是开放式或已修改的),但它将以x1速度运行,严重限制数据传输速率。为了获得最佳性能和精确仿真捐赠设备的功能,请确保FPGA板卡安装在提供至少*仿真*链路宽度和速度的插槽中(例如,如果您要仿真Gen2 x4设备,请在主机上使用Gen2 x4插槽)。
    *   **主板BIOS设置**:一些主板允许配置PCIe插槽速度(例如,强制Gen1或Gen2)。确保这些设置不与您期望的仿真速度冲突。

### **3.3 系统要求**

建立一个健壮的开发环境对于高效的固件开发、综合和调试至关重要。

*   **主机系统**
    *   **处理器**:现代多核CPU对于运行Vivado等FPGA开发工具至关重要,这些工具在综合和实现过程中计算密集。(例如,Intel Core i5/i7/i9 或 AMD Ryzen 5/7/9 等效处理器,建议8代或更新)。
    *   **内存(RAM)**:强烈建议最低16 GB RAM;对于复杂FPGA设计,**32 GB 或更高是理想选择**,因为Vivado会消耗大量内存,尤其是在实现阶段。
    *   **存储**:一个固态硬盘(SSD)并至少有 **200 GB 的可用空间** 至关重要。FPGA工具安装(仅Vivado就可能超过50 GB)、项目文件以及综合/实现输出会迅速占用磁盘空间。SSD的速度能显著缩短构建时间。
    *   **操作系统**:
        *   **Windows 10/11 (64位 专业版或企业版)**:Xilinx Vivado 和许多硬件调试工具广泛支持。请记住内核DMA保护的注意事项。
        *   **兼容的Linux发行版 (64位)**:Ubuntu LTS(长期支持)版本(例如 20.04、22.04)是Vivado常用且支持良好的系统。Linux通常为脚本编写和低级PCIe交互工具提供更灵活的环境。
*   **外围设备**
    *   **JTAG编程器**:将编译后的比特流烧录到基于FPGA的DMA卡上绝对必需。示例包括Xilinx Platform Cable USB II、Digilent JTAG-HS3 或某些开发板上集成的JTAG编程器。确保它与您的FPGA板卡和Vivado兼容。
    *   **PCIe插槽**:如第3.2节所述,确保您的主机系统有可用的兼容PCIe插槽用于DMA卡。
    *   **USB端口**:用于连接JTAG编程器,并可能用于连接FPGA板卡的UART/串行控制台以进行调试输出。

---

## **4. 要求**

本节概述了进行PCIe设备仿真定制固件开发所必需的基本硬件和软件组件,以及推荐的环境设置。在开始之前,具备这些先决条件将简化您的开发过程。

### **4.1 硬件**

*   **捐赠PCIe设备**
    *   **目的**:这是您打算在FPGA上仿真其配置和行为的物理硬件设备。它作为关键识别细节、寄存器值和操作特性的权威来源。
    *   **示例**:常见示例包括标准网卡(NIC)、SATA或NVMe存储控制器、USB控制器,或任何其他您可以安全地从系统中移除进行分析的通用PCIe扩展卡。强烈建议使用对系统操作非必需的设备,因为您将检查其低级配置。
*   **DMA FPGA卡**
    *   **描述**:一种基于FPGA的开发板,专门设计或改编用于通过PCIe接口执行直接内存访问(DMA)操作。这是您的定制固件将加载到的平台。
    *   **示例**:如第3.1节所述,兼容卡包括 **Squirrel (Artix-7 35T)**、**Enigma-X1 (Artix-7 75T)**、**ZDMA (Artix-7 100T)** 或各种基于 **Kintex-7** 的解决方案。确保您选择的卡具有PCIe金手指连接器。
*   **JTAG编程器**
    *   **目的**:这个关键工具促进了您的开发PC与DMA卡上FPGA之间的通信。它用于将编译后的比特流编程(烧录)到FPGA上,更重要的是,用于使用Vivado的硬件管理器和集成逻辑分析仪(ILA)等工具进行交互式调试。
    *   **示例**:
        *   **Xilinx Platform Cable USB II**:Xilinx FPGA传统且广泛兼容的编程器。确保您已安装必要的驱动程序。
        *   **Digilent JTAG-HS3 / JTAG-HS2**:流行且可靠的编程器,以良好的Vivado集成和支持而闻名。HS3提供更快的编程速度。
        *   **集成JTAG**:某些FPGA板可能具有板载USB转JTAG桥(例如FTDI芯片),这消除了对独立编程器的需求。请查阅您的板卡文档。

### **4.2 软件**

*   **Xilinx Vivado Design Suite**
    *   **描述**:Xilinx(现为AMD)官方的、全面的FPGA开发环境。Vivado对于综合您的HDL代码、将设计实现到目标FPGA上、生成最终比特流以及执行硬件调试至关重要。它包括必要的IP核、编译器和实用程序。
    *   **下载**:访问Xilinx(AMD)官方下载页面:[https://www.xilinx.com/support/download.html](https://www.xilinx.com/support/download.html)。
    *   **版本说明**:虽然一些旧指南可能引用Vivado 2020.1等旧版本,但强烈建议下载与您的目标FPGA系列(Artix-7、Kintex-7)兼容的**最新稳定版本**(例如Vivado 2023.x或更高版本)。PCILeech-FPGA项目通常支持较新的Vivado版本。
*   **Visual Studio Code**
    *   **描述**:Microsoft出品的高度可定制且功能丰富的代码编辑器。它是编写和编辑Verilog/SystemVerilog HDL代码的绝佳选择,因为它拥有广泛的扩展生态系统,提供语法高亮、代码检查、自动补全和版本控制集成等功能。
    *   **下载**:[https://code.visualstudio.com/](https://code.visualstudio.com/)
*   **PCILeech-FPGA**
    *   **描述**:一个用于基于FPGA的DMA开发的开源框架和基础代码库。它提供了即插即用的PCIe IP核实例化和一个结构良好的项目,是定制固件的绝佳起点。本指南将大量利用其架构。
    *   **仓库**:[https://github.com/ufrisk/pcileech-fpga](https://github.com/ufrisk/pcileech-fpga)
*   **Arbor (MindShare)**
    *   **描述**:一款强大且用户友好的软件工具,专门设计用于深入扫描和分析PCIe设备。它提供了对连接PCIe硬件的配置空间、功能和寄存器的详细洞察,对于收集捐赠设备信息来说非常有价值。
    *   **下载**:可从MindShare网站获取:[https://www.mindshare.com/](https://www.mindshare.com/)(您可能需要导航到他们的软件部分)。
    *   **注意**:通常需要创建账户,并且可能提供限时试用。
*   **替代PCIe设备分析工具**
    *   **Telescan PE (Teledyne LeCroy)**:
        *   **描述**:Teledyne LeCroy提供的一款免费PCIe流量分析和设备枚举工具。虽然它主要是一款与其硬件协议分析仪交互的软件工具,但它也可以在没有专用硬件的情况下提供一些基本的配置空间视图。
        *   **下载**:[https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software](https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software)
        *   **注意**:需要手动注册和批准才能下载。
    *   **OS原生工具(用于基本检查)**:
        *   **Windows设备管理器**:在设备属性的“详细信息”选项卡下提供基本的厂商ID、设备ID、子系统ID和类别代码信息。
        *   **Linux `lspci` 工具**:一个强大的命令行工具,用于检查PCIe设备。使用`lspci -nn`查看厂商/设备ID,`lspci -vvv`查看包括BAR和功能在内的详细信息,`lspci -s <BUS:DEV.FUN> -xxxx`用于原始配置空间转储。

### **4.3 环境设置**

一个干净且正确配置的开发环境对于避免常见陷阱并确保流畅的工作流程至关重要。

#### **4.3.1 安装Xilinx Vivado设计套件**

**步骤**:
1.  **访问Xilinx (AMD) Vivado下载页面**:[https://www.xilinx.com/support/download.html](https://www.xilinx.com/support/download.html)。
2.  **下载适当版本**:选择与您的操作系统兼容的最新稳定版Vivado,更重要的是,它必须与您的特定FPGA设备(例如Artix-7、Kintex-7)兼容。查阅Vivado发行说明以了解设备支持情况。
3.  **运行安装程序**:执行下载的安装程序并仔细遵循屏幕上的说明。
4.  **选择必要组件**:在安装过程中,系统会提示您选择要安装的设备家族。**至关重要的是,选择与您的FPGA板卡对应的设备家族(例如,Artix-7/Kintex-7的“7 Series”)**。这与安装所有家族相比,能节省大量磁盘空间。确保您选择“设计工具”(综合、实现)和“编程与调试”组件。
5.  **启动Vivado**:安装完成后,启动Vivado以确认它能无错误打开,并且许可证(如果适用)已正确配置。

#### **4.3.2 安装Visual Studio Code**

**步骤**:
1.  **访问Visual Studio Code下载页面**:[https://code.visualstudio.com/](https://code.visualstudio.com/)。
2.  **下载并安装**:下载适用于您操作系统的安装程序,并遵循标准安装提示。
3.  **安装HDL支持扩展**:安装VS Code后,打开它并导航到扩展视图(Ctrl+Shift+X或Cmd+Shift+X)。搜索并安装适用于Verilog/SystemVerilog的相关扩展,例如:
    *   **Verilog-HDL/SystemVerilog** (由mshr-h提供)
    *   **VHDL** (如果您也使用VHDL)
    这些扩展提供了语法高亮、代码检查和其他有用的功能。

#### **4.3.3 克隆PCILeech-FPGA仓库**

此仓库包含您将要修改的基础固件结构和脚本。

**步骤**:
1.  **打开终端或命令提示符**:(例如,Windows上的Git Bash,Linux上的Terminal)。
2.  **导航到您想要的目录**:选择一个您想存储项目的位置。
    ```bash
    cd ~/Projects/ # 在Linux/macOS上
    cd C:\Users\YourUsername\Documents\Projects\ # 在Windows上
    ```
3.  **克隆仓库**:
    ```bash
    git clone https://github.com/ufrisk/pcileech-fpga.git
    ```
4.  **导航到克隆的目录**:
    ```bash
    cd pcileech-fpga
    ```
    这将是您的主项目目录。PCILeech-FPGA项目通常包含不同板卡变体的子目录(例如`pcileech-artix-7-50t`、`pcileech-squirrel-35t`)。您将根据您的特定硬件导航到相关的板卡特定目录。

#### **4.3.4 设置一个干净的开发环境**

**建议**:始终在隔离或专用的环境中工作,尤其是在处理低级硬件和潜在的安全隐患时。

**步骤**:
1.  **使用专用开发机或虚拟机**:
    *   **物理机**:如果可能,使用一台单独的物理计算机进行FPGA开发和测试。这可以防止在您的主机器上发生意外的系统不稳定或安全风险。
    *   **虚拟机(VM)**:虚拟机可以是隔离开发环境的好选择。然而,通常需要向虚拟机进行直接PCIe直通(PCIe热插拔或VT-d直通),FPGA卡才能被正确检测和操作,这可能配置复杂,并且如果操作不当,仍然可能暴露主机。对于初始工具安装和代码编辑,虚拟机完全没问题。
2.  **最小化后台应用程序**:确保没有其他资源密集型应用程序正在运行,这些应用程序可能会干扰Vivado在综合和实现过程中的性能。
3.  **禁用冲突软件**:在开发和测试期间,暂时禁用任何可能干扰低级硬件访问或JTAG通信的防病毒、防火墙或安全软件。完成工作后请记得重新启用它们。

---

## **5. 收集捐赠设备信息**

精确的设备仿真取决于精细地提取和复制捐赠设备的关键信息。这种全面的数据收集使您的FPGA能够忠实地模仿目标硬件的PCIe配置和行为,确保与主机系统接口时的兼容性和功能性。

### **5.1 使用Arbor进行PCIe设备扫描**

**Arbor** 是一款强大且用户友好的工具,专为深入扫描PCIe设备而设计。它提供了对连接硬件配置空间的详细洞察,使其成为提取设备仿真所需信息的宝贵资源。

#### **5.1.1 安装Arbor**

要开始使用Arbor进行设备扫描,您必须首先在系统上安装该软件。

**步骤:**

1.  **访问Arbor下载页面:**
    *   使用您偏好的网页浏览器导航到MindShare官方网站([https://www.mindshare.com/](https://www.mindshare.com/))。您需要找到他们的“Software”或“Downloads”部分来定位Arbor。
    *   确保您直接访问该网站,以避免任何恶意重定向。
2.  **创建账户(如果需要):**
    *   Arbor可能要求您创建用户账户才能访问下载链接。
    *   提供必要的信息,例如您的姓名、电子邮件地址和组织。
    *   如果出现提示,请验证您的电子邮件以激活您的账户。
3.  **下载Arbor:**
    *   登录后,找到Arbor的下载部分。
    *   选择与您的操作系统兼容的版本(例如,Windows 10/11 64位)。
    *   点击 **Download** 按钮并将安装程序保存到计算机上已知的位置。
4.  **安装Arbor:**
    *   找到下载的安装程序文件(例如,`ArborSetup.exe`)。
    *   右键单击安装程序并选择 **以管理员身份运行** 以确保它具有必要的权限。
    *   按照屏幕上的说明完成安装过程。
        *   接受许可协议。
        *   选择安装目录。
        *   如果需要,选择创建桌面快捷方式。
5.  **验证安装:**
    *   安装完成后,确保Arbor列在您的“开始”菜单或桌面上。
    *   启动Arbor以确认它能无错误打开。

#### **5.1.2 扫描PCIe设备**

安装Arbor后,您可以继续扫描系统中的PCIe设备。

**步骤:**

1.  **启动Arbor:**
    *   双击桌面上的Arbor图标或通过“开始”菜单找到它。
    *   如果用户账户控制(UAC)提示,允许应用程序对设备进行更改。
2.  **导航到本地系统选项卡:**
    *   在Arbor界面中,找到导航窗格或选项卡。
    *   单击 **Local System** 以访问扫描本地机器的工具。
3.  **扫描PCIe设备:**
    *   查找 **Scan** 或 **Rescan** 按钮,通常位于界面的顶部或底部。
    *   点击 **Scan/Rescan** 以启动检测过程。
    *   等待扫描过程完成;这可能需要几分钟,具体取决于连接的设备数量。
4.  **审查检测到的设备:**
    *   扫描完成后,Arbor将显示所有检测到的PCIe设备的列表。
    *   设备通常会列出其名称、设备ID和其他识别信息。

#### **5.1.3 识别捐赠设备**

识别正确的捐赠设备对于精确仿真至关重要。

**步骤:**

1.  **在列表中找到您的捐赠设备:**
    *   滚动浏览Arbor检测到的设备列表。
    *   查找与您的捐赠硬件的品牌和型号匹配的设备。
    *   设备可能按其厂商名称、设备类型或功能列出。
2.  **验证设备详细信息:**
    *   单击设备以选中它。
    *   确认 **Device ID** 和 **Vendor ID** 与您的捐赠设备匹配。
        *   **提示:** 这些ID通常可以在设备文档或制造商网站上找到。对于常见设备,快速在网上搜索“\[设备名称] Vendor ID Device ID”通常能得到结果。
3.  **查看详细配置:**
    *   选中设备后,找到并单击类似 **View Details** 或 **Properties** 的选项。
    *   这将打开一个详细视图,显示设备的配置空间和功能。
4.  **与物理硬件交叉引用:**
    *   如果列出了多个类似设备,请将 **Slot Number** 或 **Bus Address** 与安装捐赠设备的物理插槽交叉引用。这有助于确认您正在分析正确的硬件。

#### **5.1.4 捕获设备数据**

从捐赠设备中提取详细信息对于精确仿真至关重要。

**要提取的信息:**

*   **设备ID (0xXXXX):** 唯一标识设备型号的16位标识符。
*   **厂商ID (0xYYYY):** 分配给制造商的16位标识符。
*   **子系统ID (0xZZZZ):** 标识特定子系统或变体(例如,产品线中的特定型号)。
*   **子系统厂商ID (0xWWWW):** 标识子系统的厂商(通常与主厂商ID相同,但对于OEM版本可能会有所不同)。
*   **修订ID (0xRR):** 指示设备的硬件修订级别。
*   **类别代码 (0xCCCCCC):** 一个24位代码,定义设备的主要功能/类型(例如,`0x020000`用于以太网控制器,`0x010802`用于NVMe控制器)。这有助于操作系统加载通用驱动程序。
*   **基地址寄存器 (BARs):**
    *   定义设备使用的内存或I/O地址区域的寄存器。
    *   包括BAR0到BAR5,每个都可能是32位或64位。对于每个BAR,请记录其 **类型(内存或I/O)**、**位宽(32位或64位)**、**大小(例如,256 MB,4KB)** 和 **可预取状态(是/否)**。这对于内存映射至关重要。
*   **功能:** 列出支持的功能及其配置,通常在配置空间中的链表结构中找到。示例包括:
    *   **PCIe功能结构**:PCIe链路速度(例如,Gen2,Gen3),链路宽度(例如,x1,x4),最大载荷大小,最大读取请求大小。
    *   **MSI/MSI-X功能结构**:消息信号中断信息,包括支持的向量数量。
    *   **电源管理功能结构**:支持的电源状态(D0,D1,D2,D3hot,D3cold)。
*   **设备序列号 (DSN):** 一个64位唯一标识符,如果设备支持(在“设备序列号”扩展功能中找到)。并非所有设备都实现了此功能。

**步骤:**

1.  **导航到PCI配置选项卡:**
    *   在设备详细视图中,找到并选择 **PCI Config** 或 **Configuration Space** 选项卡。这通常会以解码视图显示原始配置空间寄存器。
2.  **记录相关详细信息:**
    *   仔细记录上面列出的每个所需字段。
    *   使用截图或将值复制到文本文件、专用电子表格或结构化文档格式中以确保准确性。
    *   确保十六进制值正确记录,包括是否使用`0x`前缀。
3.  **展开功能列表:**
    *   查找标记为 **Capabilities** 或 **Advanced Features** 的部分。这些通常是可点击或可展开以显示子部分的。
    *   记录存在的每个功能及其相关参数(例如,MSI消息控制,电源状态标志,当前/最大PCIe链路设置)。
4.  **详细检查BAR:**
    *   在配置空间中,找到BAR0到BAR5的条目。
    *   对于每个活动的BAR,记录其分配的大小、是内存映射还是I/O、其位宽(32位或64位)以及是否可预取。这些信息通常在Arbor的GUI中清晰显示。
5.  **保存数据以备参考:**
    *   将所有提取的信息编译成一个组织良好的文档(例如,Markdown文件、`.txt`文件或Excel电子表格)。
    *   为每个部分清晰标记,以便在固件定制期间轻松参考。

### **5.2 提取和记录设备属性**

捕获数据后,理解每个属性的重要性并确保其准确记录对于成功仿真至关重要。

**确保您已准确记录以下内容:**

1.  **设备ID:**
    *   **目的:** 唯一标识PCIe设备的特定型号。
    *   **仿真用法:** 对于主机操作系统(OS)正确识别仿真设备至关重要,更重要的是,它能尝试加载适当的设备驱动程序。
2.  **厂商ID:**
    *   **目的:** 标识PCIe设备的制造商。
    *   **仿真用法:** 与设备ID结合使用,形成主机操作系统用于将设备与相应驱动程序匹配的唯一标识符(`VendorID:DeviceID`)。
3.  **子系统ID和子系统厂商ID:**
    *   **目的:** 这些可选ID允许区分同一厂商设备的变体,或区分主厂商/设备ID可能为通用的OEM特定版本。
    *   **仿真用法:** 对于仿真具有多种配置的设备或OEM提供的设备很重要,因为驱动程序可能会专门查找这些值。
4.  **修订ID:**
    *   **目的:** 指示设备的硬件修订级别。
    *   **仿真用法:** 有助于识别可能需要不同驱动程序、固件或具有细微行为差异的特定硬件版本。
5.  **类别代码:**
    *   **目的:** 一个24位代码,用于对设备的通用功能进行分类(例如,`0x020000`用于以太网控制器,`0x010802`用于NVMe控制器,`0x0C0300`用于USB主机控制器)。它由基本类别、子类别和编程接口组成。
    *   **仿真用法:** 允许操作系统理解设备的通用功能,并在找不到特定厂商驱动程序时加载通用类别驱动程序。这对于初始设备识别至关重要。
6.  **基地址寄存器(BARs):**
    *   **目的:** 定义设备用于寄存器、内部缓冲区或配置空间扩展的内存映射或I/O端口地址区域。主机操作系统在枚举期间将物理地址分配给这些BAR。
    *   **仿真用法:** 对于将仿真设备的内部内存和寄存器映射到主机系统的地址空间至关重要。每个BAR的大小、类型(内存/I/O,32/64位)和可预取状态必须与捐赠设备精确匹配。
7.  **功能:**
    *   **目的:** 列出设备支持的高级功能,如高级错误报告、电源管理、MSI/MSI-X、PCIe高级功能(如AER、VC/PF)等。每个功能由一个具有其自身寄存器的结构定义。
    *   **仿真用法:** 对于准确复制捐赠设备如何宣传其功能以及主机系统如何与这些功能交互(例如,中断传递机制、电源状态转换、错误报告)至关重要。
8.  **设备序列号(DSN):**
    *   **目的:** 设备的唯一64位标识符,通常是可选的扩展功能。
    *   **仿真用法:** 虽然可选,但某些驱动程序或管理应用程序可能会专门查询并依赖DSN进行识别、许可或安全检查。准确仿真此功能可以防止您的设备被检测为通用或修改的外设。

**数据收集的最佳实践:**

*   **组织数据:** 创建一个结构化的文档或电子表格。为每个属性使用清晰的标题和子标题。模板会很有益。
*   **包含单位和格式:** 始终注明大小的单位(例如,MB、KB),并为十六进制值使用一致的格式(例如,`0x1234`、`16'h1234`)。
*   **与规范交叉引用(如果可能):** 如果可用,查阅捐赠设备的数据手册或公开可用的规范以验证值。这有助于识别原始扫描中不明显或不寻常的配置。
*   **保护数据:** 安全存储收集到的信息。请注意,这些数据可能包含专有或敏感信息。
*   **理解“缺少什么”:** 像Arbor这样的专业工具非常出色,但它们可能无法捕捉复杂、高度专有设备的每一个细微之处(例如,标准配置空间之外的特定厂商定义寄存器)。对于高级仿真,您可能需要将此信息与捐赠设备驱动程序的逆向工程结合起来。

---

## **6. 初始固件定制**

在细致地记录了捐赠设备的信息之后,下一个关键阶段是定制您的FPGA固件,以准确仿真捐赠设备。这个过程首先要修改PCIe配置空间中的关键识别寄存器,并确保设备序列号等特定标识符被正确集成。

### **6.1 修改配置空间**

PCIe配置空间是定义设备如何被识别并与主机系统在枚举期间交互的基本组件。精确定制此空间以匹配捐赠设备的配置文件对于成功仿真绝对至关重要,它能让主机操作系统加载正确的驱动程序并按预期交互。

#### **6.1.1 导航到配置文件**

PCIe配置空间参数通常在PCILeech-FPGA项目中的特定SystemVerilog(`.sv`)文件中定义。此文件将综合成配置PCIe IP核并向主机公开设备身份的逻辑。

**PCILeech-FPGA(基于Artix-7的板卡,如Squirrel)的常见路径:**
找到负责为您特定板卡配置PCIe参数的文件。对于许多Artix-7 PCILeech变体,这将是:
```
pcileech-fpga/<your_board_variant>/src/pcileech_pcie_cfg_a7.sv
```
*   **示例(对于Squirrel 35T)**:
    ```
    pcileech-fpga/pcileech-squirrel-35t/src/pcileech_pcie_cfg_a7.sv
    ```
    *注意:实际的文件夹名称,如`pcileech-squirrel-35t`,可能会根据您克隆的PCILeech-FPGA的具体版本或分支略有不同。克隆主仓库后,请始终导航到相关的板卡特定子目录。*

#### **6.1.2 在Visual Studio Code中打开文件**

编辑配置文件需要一个合适的代码编辑器,该编辑器支持SystemVerilog(或Verilog)的语法高亮,使代码更易于阅读和修改。

**步骤:**

1.  **启动Visual Studio Code:**
    *   点击VS Code图标或通过“开始”菜单找到它。
2.  **打开文件:**
    *   使用 **文件 > 打开文件** 或按下 `Ctrl + O`(macOS上为 `Cmd + O`)。
    *   导航到第6.1.1节中确定的配置文件路径(例如,`pcileech-fpga/pcileech-squirrel-35t/src/pcileech_pcie_cfg_a7.sv`)。
    *   选择文件并点击 **打开**。
3.  **验证语法高亮:**
    *   确保编辑器识别 `.sv` 文件扩展名并应用正确的SystemVerilog语法高亮。如果不行,请返回第4.3.2节,确保您已安装推荐的Verilog/SystemVerilog扩展程序。
4.  **熟悉文件结构:**
    *   滚动浏览文件。您通常会发现使用`localparam`或`reg`赋值定义的参数,通常附有解释其目的的注释。查找定义和赋值标准PCIe配置寄存器(厂商ID、设备ID等)的部分。

#### **6.1.3 修改设备ID和厂商ID**

更新这些基本标识符是主机系统正确将仿真设备识别为您的捐赠设备的最关键步骤。操作系统严重依赖 `Vendor ID` 和 `Device ID` 对来识别连接的硬件并加载适当的设备驱动程序。

**步骤:**

1.  **搜索 `cfg_deviceid`:**
    *   在VS Code中使用搜索功能(`Ctrl + F`或`Cmd + F`)。
    *   找到定义`cfg_deviceid`的行。它通常看起来像这样:
        ```verilog
        reg [15:0] cfg_deviceid = 16'hAAAA; // 默认或占位符设备ID
        ```
2.  **更新设备ID:**
    *   将`AAAA`替换为您使用Arbor从捐赠设备中提取的16位十六进制设备ID(例如,`0x1234`)。
    *   **示例:**
        如果捐赠设备的设备ID是`0x1234`,则将该行更新为:
        ```verilog
        reg [15:0] cfg_deviceid = 16'h1234; // 更新为捐赠设备的设备ID(例如,来自网卡)
        ```
3.  **搜索 `cfg_vendorid`:**
    *   找到定义`cfg_vendorid`的行。其格式将类似于`cfg_deviceid`:
        ```verilog
        reg [15:0] cfg_vendorid = 16'hBBBB; // 默认或占位符厂商ID
        ```
4.  **更新厂商ID:**
    *   将`BBBB`替换为您从捐赠设备中提取的16位十六进制厂商ID(例如,`0xABCD`)。
    *   **示例:**
        如果捐赠设备的厂商ID是`0xABCD`,则将该行更新为:
        ```verilog
        reg [15:0] cfg_vendorid = 16'hABCD; // 更新为捐赠设备的厂商ID(例如,Intel Corporation)
        ```
5.  **确保格式正确:**
    *   验证十六进制值是否正确以`16'h`为前缀(表示一个16位十六进制数)。
    *   保持一致的缩进和注释风格以提高可读性。

#### **6.1.4 修改子系统ID和修订ID**

这些标识符提供了关于设备变体、特定产品型号或硬件修订的额外详细信息。虽然通常是可选的,但匹配它们能增强仿真的真实性,并且对于执行细粒度检查的驱动程序可能至关重要。

**步骤:**

1.  **搜索 `cfg_subsysid`:**
    *   找到定义`cfg_subsysid`的行。
    ```verilog
    reg [15:0] cfg_subsysid = 16'hCCCC; // 占位符子系统ID
    ```
2.  **更新子系统ID:**
    *   将`CCCC`替换为您捐赠设备的16位十六进制子系统ID(例如,`0x5678`)。
    *   **示例:**
        ```verilog
        reg [15:0] cfg_subsysid = 16'h5678; // 设置为捐赠设备的子系统ID
        ```
3.  **搜索 `cfg_subsysvendorid`:**
    *   找到定义`cfg_subsysvendorid`的行。
    ```verilog
    reg [15:0] cfg_subsysvendorid = 16'hDDDD; // 占位符子系统厂商ID
    ```
4.  **更新子系统厂商ID(如果适用):**
    *   将`DDDD`替换为您捐赠设备的16位十六进制子系统厂商ID(例如,`0x9ABC`)。如果您的捐赠设备没有唯一的子系统厂商ID(即与主厂商ID相同),您仍应将其设置为该值。
    *   **示例:**
        ```verilog
        reg [15:0] cfg_subsysvendorid = 16'h9ABC; // 设置为捐赠设备的子系统厂商ID
        ```
5.  **搜索 `cfg_revisionid`:**
    *   找到定义`cfg_revisionid`的行。
    ```verilog
    reg [7:0] cfg_revisionid = 8'hEE; // 占位符修订ID
    ```
6.  **更新修订ID:**
    *   将`EE`替换为您捐赠设备的8位十六进制修订ID(例如,`0x01`)。
    *   **示例:**
        ```verilog
        reg [7:0] cfg_revisionid = 8'h01; // 设置为捐赠设备的修订ID
        ```

#### **6.1.5 更新类别代码**

类别代码通知主机操作系统设备的通用类型和功能(例如,网络控制器、存储设备)。这对于操作系统加载通用类别驱动程序至关重要,即使没有安装特定厂商驱动程序。

**步骤:**

1.  **搜索 `cfg_classcode`:**
    *   找到定义`cfg_classcode`的行。
    ```verilog
    reg [23:0] cfg_classcode = 24'hFFFFFF; // 默认或占位符类别代码
    ```
2.  **更新类别代码:**
    *   将`FFFFFF`替换为您从捐赠设备中提取的24位十六进制类别代码(例如,`0x020000`用于以太网控制器)。请记住格式:基本类别、子类别、编程接口。
    *   **示例:**
        如果捐赠设备的类别代码是`0x020000`(表示基本类别:0x02 - 网络控制器,子类别:0x00 - 以太网控制器,编程接口:0x00),则更新为:
        ```verilog
        reg [23:0] cfg_classcode = 24'h020000; // 设置为捐赠设备的类别代码(例如,以太网控制器)
        ```
3.  **验证正确的位宽:**
    *   确保类别代码使用`24'h`前缀正确表示为24位十六进制值。

#### **6.1.6 保存更改**

在对配置参数进行所有修改后,保存和审查更改至关重要。

**步骤:**

1.  **保存文件:**
    *   在VS Code中点击 **文件 > 保存**,或按下 `Ctrl + S`(macOS上为 `Cmd + S`)。
2.  **审查更改:**
    *   在关闭之前,快速重新阅读修改过的行,以根据您的捐赠设备信息文档确认其准确性。
    *   检查是否有任何明显的语法错误或拼写错误(VS Code的扩展可能会高亮显示这些)。
3.  **可选 - 使用版本控制:**
    *   如果您正在使用Git(强烈推荐用于任何代码项目,尤其是固件),请以清晰且有意义的消息提交您的更改。这将创建您的修改历史记录。
    *   **示例Git命令:**
        ```bash
        git add pcileech_pcie_cfg_a7.sv
        git commit -m "更新PCIe配置寄存器(VID, DID, SubIDs, Revision, Class Code)以匹配捐赠设备:[捐赠设备名称]"
        ```

### **6.2 插入设备序列号(DSN)**

设备序列号(DSN)是一些PCIe设备(特别是那些具有高级功能或特定驱动程序的设备)可能使用的独特64位标识符。包含它能增强仿真的真实性,并有助于绕过明确查询此值的驱动程序中的检查。

#### **6.2.1 定位DSN字段**

DSN(如果由捐赠设备实现)是PCIe扩展能力的一部分。在PCILeech-FPGA框架中,DSN字段通常作为您一直在编辑的同一配置文件中的可配置参数公开。

**步骤:**

1.  **搜索 `cfg_dsn`:**
    *   在 `pcileech_pcie_cfg_a7.sv`(或您的板卡等效配置文件)中,使用搜索功能(`Ctrl + F` 或 `Cmd + F`)查找 `cfg_dsn`。
2.  **理解现有赋值:**
    *   DSN可能被设置为默认值(通常是全零)或被注释掉。它通常看起来像这样:
        ```verilog
        reg [63:0] cfg_dsn = 64'h0000000000000000; // 默认DSN(如果未使用,通常为0)
        ```

#### **6.2.2 插入DSN**

更新DSN涉及将其设置为从捐赠设备捕获的精确64位十六进制值。

**步骤:**

1.  **更新 `cfg_dsn`:**
    *   将现有的十六进制值替换为您使用Arbor从捐赠设备中提取的64位DSN。
    *   **示例:**
        如果捐赠设备的DSN是`0x0011223344556677`,则更新为:
        ```verilog
        reg [63:0] cfg_dsn = 64'h0011223344556677; // 捐赠设备序列号
        ```
2.  **处理DSN不可用或不相关的情况:**
    *   如果您的捐赠设备*没有*DSN,或者您已确定它不是您目标驱动程序所需的参数,您可以简单地将其保留为零:
        ```verilog
        reg [63:0] cfg_dsn = 64'h0000000000000000; // 捐赠设备没有特定DSN,保留为默认0
        ```
    *   **注意**:对于关键仿真,如果捐赠设备有DSN,最好准确仿真它。
3.  **确保格式正确:**
    *   DSN是64位值;确保它以`64'h`前缀正确格式化为十六进制值。

#### **6.2.3 保存更改**

通过保存和审查文件来完成DSN修改。

**步骤:**

1.  **保存文件:**
    *   在VS Code中点击 **文件 > 保存**,或按下 `Ctrl + S`。
2.  **验证语法:**
    *   检查VS Code的语法检查器是否有任何红色下划线或错误指示。立即纠正任何问题。
3.  **记录更改:**
    *   如果使用版本控制,请使用适当的消息提交更新。
    *   **示例Git命令:**
        ```bash
        git commit -am "在PCIe配置中插入捐赠设备序列号(DSN)"
        ```

---

## **7. Vivado项目设置与定制**

在固件文件更新以反映捐赠设备的关键识别和配置数据后,下一个关键步骤是将这些更改集成到Vivado项目中。这包括为您的特定FPGA板卡生成项目文件,定制嵌入式PCIe IP核,并准备整个设计以进行综合和实现阶段。

### **7.1 生成Vivado项目文件**

Vivado是Xilinx(AMD)开发套件,使用Tcl(工具命令语言)脚本来自动化项目创建、添加源文件和配置项目设置。通过运行PCILeech-FPGA框架提供的这些脚本,您可以确保您的Vivado项目已为目标FPGA板卡正确设置。

#### **7.1.1 打开Vivado**

启动Vivado的新会话可确保之前会话中没有残留设置或打开项目干扰当前工作。

**步骤:**

1.  **启动Vivado:**
    *   在“开始”菜单(Windows)或“应用程序”文件夹(Linux/macOS)中找到Vivado应用程序图标。
    *   点击打开。
2.  **选择正确的版本:**
    *   如果您安装了多个Vivado版本,请确保您启动的是与您的FPGA板卡和PCILeech-FPGA项目兼容的版本(如第4.3.1节所述,建议使用Vivado 2023.x等最新稳定版本)。
3.  **等待启动界面:**
    *   让Vivado完全初始化并显示欢迎界面或项目仪表板,然后才能继续。

#### **7.1.2 访问Tcl控制台**

Vivado内的Tcl控制台是您执行脚本和直接命令的主要界面。您将在此处运行项目生成脚本。

**步骤:**

1.  **打开Tcl控制台:**
    *   在Vivado界面中,导航到菜单栏。
    *   单击 **Window** > **Tcl Console**。
    *   Tcl控制台窗格通常会出现在Vivado窗口的底部。
2.  **调整控制台大小(可选):**
    *   您可以拖动控制台的顶部边框来调整其大小,使其更高以便更好地查看命令和输出。
3.  **清除先前命令(可选但推荐):**
    *   如果存在任何先前的命令或消息,您可以在控制台内右键单击并选择“Clear Console”以获得一个干净的开始。

#### **7.1.3 导航到项目目录**

在运行Tcl脚本之前,您必须确保Tcl控制台的当前工作目录已设置为您的板卡特定PCILeech-FPGA项目脚本所在的正确位置。

**对于Squirrel DMA (Artix-7 35T) 或类似板卡:**

**典型路径(克隆`pcileech-fpga`并导航到您的板卡变体后):**
```
C:/Users/YourUsername/Documents/pcileech-fpga/pcileech-squirrel-35t/  # 在Windows上
~/Projects/pcileech-fpga/pcileech-squirrel-35t/  # 在Linux/macOS上
```
*注意:将`<your_board_variant>`替换为您的板卡子目录的实际名称(例如,`pcileech-squirrel-35t`,`pcileech-artix-7-50t`)。*

**步骤:**

1.  **在Tcl控制台中设置工作目录:**
    *   在Vivado Tcl控制台中,输入`cd`命令,后跟您的板卡项目目录的完整路径。
    *   **示例(Windows):**
        ```tcl
        cd C:/Users/YourUsername/Documents/pcileech-fpga/pcileech-squirrel-35t/
        ```
    *   **示例(Linux/macOS):**
        ```tcl
        cd ~/Projects/pcileech-fpga/pcileech-squirrel-35t/
        ```
    *   *自我纠正提示:即使在Windows上,Tcl路径也使用正斜杠(`/`)。*
2.  **验证目录更改:**
    *   要确认您处于正确的目录中,请在Tcl控制台中输入`pwd`(打印工作目录)。
    *   控制台应显示您刚刚设置的完整路径,确认更改。

#### **7.1.4 生成Vivado项目**

运行适用于您的FPGA板卡的相应Tcl脚本将自动化Vivado内部的整个项目设置过程。这包括创建项目、添加所有必要的源文件(HDL、约束)以及配置核心项目设置。

**步骤:**

1.  **运行Tcl脚本:**
    *   输入`source`命令,后跟您的板卡的项​​目生成脚本的名称。PCILeech-FPGA项目通常在主板卡目录中提供这些脚本。
    *   **对于Squirrel (Artix-7 35T)(以及类似的Artix-7板卡):**
        ```tcl
        source vivado_generate_project_squirrel.tcl -notrace
        ```
    *   **对于Enigma-X1 (Artix-7 75T):**
        ```tcl
        source vivado_generate_project_enigma_x1.tcl -notrace
        ```
    *   **对于ZDMA (Artix-7 100T):**
        ```tcl
        source vivado_generate_project_100t.tcl -notrace
        ```
    *   `-notrace`选项可防止每个Tcl命令的详细输出,使控制台更整洁。
2.  **等待脚本完成:**
    *   脚本将按顺序执行许多命令。此过程可能需要几分钟,具体取决于您的系统性能和项目的复杂性。
    *   监控Tcl控制台的进度消息。脚本将:
        *   在当前目录中创建一个新的Vivado项目(`.xpr`文件)。
        *   添加所有SystemVerilog/Verilog源文件(`.sv`,`.v`)。
        *   添加Xilinx IP核配置(`.xci`)。
        *   添加XDC(Xilinx设计约束)文件。
        *   可能配置各种项目设置。
    *   **处理任何错误**:如果发生任何错误(例如,“文件未找到”、“无效命令”),脚本通常会停止。检查错误消息,纠正底层问题(例如,路径不正确、文件丢失),然后重新运行脚本。
3.  **确认项目生成:**
    *   成功完成后,Tcl控制台通常会指示项目已创建,并且您应该在项目目录中看到新生成的项目文件(例如,`pcileech_squirrel_top.xpr`)和相关目录(例如,`pcileech_squirrel_top.runs`,`pcileech_squirrel_top.ip`)。

#### **7.1.5 打开生成的项目**

现在Vivado项目文件已成功由Tcl脚本生成,您可以在Vivado GUI中打开该项目以进行进一步检查和定制。

**步骤:**

1.  **打开项目:**
    *   在Vivado中,点击 **文件** > **打开项目**。
    *   导航到您的项目目录(与您在第7.1.3节中在Tcl控制台中设置的目录相同)。
2.  **选择项目文件:**
    *   找到并选择与您的板卡对应的Vivado项目文件(`.xpr`扩展名)。
    *   **对于Squirrel:** 文件名通常为 `pcileech_squirrel_top.xpr`。
    *   点击 `.xpr` 文件以选择它。
3.  **点击打开:**
    *   Vivado将加载项目,显示设计层次结构、源文件、IP集成器块设计(如果使用)和各种设计视图。这可能需要一些时间。
4.  **验证项目内容:**
    *   在 **项目管理器** 窗口(通常在左侧)中,展开 **源文件** 窗格。
    *   确保所有预期的源文件(Verilog/SystemVerilog、XDC、IP核)都已列出,并且设计层次结构看起来正确。
    *   检查 **消息** 窗格(底部)中打开项目时出现的任何警告或严重警告,因为这些可能表明潜在问题。

### **7.2 修改IP核**

PCIe IP核是设备PCIe接口的核心。它是一个经过Xilinx(AMD)预验证、可配置的模块,用于处理复杂的PCIe协议层。尽管某些配置空间值在SystemVerilog文件中处理(第6.1节),但其他核心PCIe参数,特别是与链路能力和BAR结构相关的参数,是在Vivado中直接通过PCIe IP核的定制设置进行配置的。定制IP核可确保您的FPGA在PCIe协议级别上与捐赠硬件的行为完全一致。

#### **7.2.1 访问PCIe IP核**

PCIe IP核在您的Vivado项目中被实例化为一个IP块。您需要打开其定制GUI来修改其参数。

**步骤:**

1.  **定位PCIe IP核:**
    *   在 **Sources**(源文件)窗格(位于 **Project Manager**(项目管理器)窗口内)中,确保已选择 **Hierarchy**(层次结构)选项卡。
    *   展开设计层次结构,直到找到PCIe IP核的实例。
    *   对于7系列FPGA(如Squirrel中使用的Artix-7),它通常被命名为 `pcie_7x_0.xci` 或类似名称,通常位于项目源文件的 `ip` 子目录中。
2.  **打开IP定制窗口:**
    *   **右键单击** `pcie_7x_0.xci` 文件。
    *   从上下文菜单中选择 **Customize IP**(定制IP)。
    *   将打开 **IP Configuration**(IP配置)窗口(或类似名称,如“Customize IP”或“Re-customize IP”),显示带有各种选项卡和选项的图形界面,用于配置PCIe核。
3.  **等待IP设置加载:**
    *   IP定制界面可能需要几分钟才能初始化并填充所有设置。在您开始进行更改之前,请确保所有选项和选项卡都已完全加载并响应。

#### **7.2.2 在IP核内部定制设备ID和BAR**

尽管某些设备标识符在`pcileech_pcie_cfg_a7.sv`中设置,但PCIe IP核本身也包含设备ID、厂商ID以及至关重要的基地址寄存器(BARs)的定义参数。您必须确保这些参数保持一致。`.sv`文件中的某些值可能会覆盖或输入到IP核中,但在此处也确保一致性是一个好习惯。IP核中的BAR设置尤其重要,因为它们决定了内存映射的硬件实现。

**步骤:**

1.  **导航到基本/识别参数:**
    *   在IP定制窗口中,查找与 **基本**、**设备和厂商标识符**、**通用** 或 **PCIe能力** 相关的选项卡或部分。这是定义基本ID和初始链路设置的地方。
2.  **验证/输入设备ID、厂商ID、子系统ID、修订ID、类别代码:**
    *   **至关重要:请确认这些值与您在`pcileech_pcie_cfg_a7.sv`中设置的以及从捐赠设备中获取的值相匹配。**
    *   查找以下字段:
        *   **设备ID**:输入`0xXXXX`(例如,`0x1234`)。
        *   **厂商ID**:输入`0xYYYY`(例如,`0xABCD`)。
        *   **子系统ID**:输入`0xZZZZ`(例如,`0x5678`)。
        *   **子系统厂商ID**:输入`0xWWWW`(例如,`0x9ABC`)。
        *   **修订ID**:输入`0xRR`(例如,`0x01`)。
        *   **类别代码**:输入`0xCCCCCC`(例如,`0x020000`)。
    *   **重要提示**:某些IP核版本或特定配置可能会直接从用户逻辑(如`pcileech_pcie_cfg_a7.sv`)拉取这些值,或者可能允许直接在此处设置它们。最可靠的方法是,如果IP GUI中提供此选项,则在两个位置都保持一致设置。
3.  **导航到基地址寄存器(BARs)选项卡:**
    *   在IP定制窗口中,找到并选择 **BARs** 选项卡或部分。这是您定义PCIe设备暴露的内存区域的地方。
4.  **配置每个BAR:**
    *   对于您的捐赠设备使用的每个BAR(BAR0到BAR5),根据您使用Arbor提取的信息,仔细配置以下参数:
        *   **启用BAR**:仅当捐赠设备使用此特定BAR时才选中此框。禁用(取消选中)捐赠设备不使用的任何BAR。
        *   **BAR大小**:从下拉列表中选择精确的大小(例如,**256 MB**,**64 KB**,**4 KB**)。这对于主机操作系统分配正确数量的内存至关重要。
        *   **BAR类型**:选择适当的类型:
            *   **Memory (32-bit Addressing)**(内存(32位寻址)): 用于32位地址可访问的内存映射区域。
            *   **Memory (64-bit Addressing)**(内存(64位寻址)): 用于可以驻留在64位地址空间中任何位置的内存映射区域(对于大内存区域或如果捐赠设备使用它,则需要)。
            *   **I/O**: 用于传统I/O端口区域(在现代PCIe中较不常见,但仍然可能)。
        *   **可预取**:如果捐赠设备的BAR被标记为可预取,则选中此框。此属性允许主机系统从此区域缓存或预取数据以提高性能。
    *   **示例配置(基于您的捐赠设备):**
        *   **BAR0**:
            *   启用:是
            *   大小:**256 MB**
            *   类型:**Memory (64-bit Addressing)**
            *   可预取:是
        *   **BAR1**:
            *   启用:否(如果捐赠设备不使用BAR1)
        *   *继续配置BAR2-BAR5,镜像捐赠设备的配置。*
5.  **确保对齐和非重叠空间**:
    *   Vivado IP核通常会根据您选择的大小自动处理对齐。但是,请注意PCIe规范要求BAR大小是2的幂,并且BAR必须对其大小进行对齐。
    *   确保所有活动BAR映射的总内存不超过FPGA可用的块RAM(BRAM)或外部内存容量。

#### **7.2.3 完成IP定制**

在IP核定制窗口中配置所有必要的设置后,您必须应用这些更改,使其在Vivado项目中生效。

**步骤:**

1.  **审查所有设置:**
    *   在应用之前,花点时间快速最后一次审查IP定制窗口中的每个选项卡。
    *   确认所有条目都与您捐赠设备的文档规范精确匹配。这里的一个小错误可能导致设备检测或功能问题。
2.  **应用更改:**
    *   点击IP定制窗口底部的 **OK** 或 **Generate** 按钮(标签可能不同)。
    *   如果Vivado提示您确认是否继续更改并重新生成IP输出产品,请点击 **Yes** 确认。
3.  **重新生成IP核:**
    *   Vivado现在将重新生成IP核的输出产品(例如,网表、仿真模型、新的`.xci`配置文件),以反映您的新配置。
    *   监控 **消息** 窗格(Vivado窗口底部),查看在此重新生成过程中可能出现的任何错误、警告或严重警告。立即解决任何严重警告。
4.  **更新项目中的IP:**
    *   在IP核重新生成后,Vivado可能会自动更新或提示您更新项目中的任何IP依赖项。允许它这样做,以确保在整个设计中使用最新的配置。

#### **7.2.4 锁定IP核**

锁定IP核是Vivado中推荐的最佳实践,可防止在后续综合和实现运行期间意外修改或重新定制,这可能会潜在地恢复您精心配置的设置。

**锁定的目的:**

*   **防止覆盖:** 确保您在IP核GUI中进行的手动配置得以保留,不会因Vivado自动化或IP因细微项目更改而被检测为“过时”而意外覆盖。
*   **保持一致性:** 在整个构建过程中保持IP核处于已知、稳定的状态,这对于PCIe接口等关键组件尤其重要。

**步骤:**

1.  **打开Tcl控制台:**
    *   在Vivado中,如果Tcl控制台尚未打开,请转到 **Window** > **Tcl Console**。
2.  **执行锁定命令:**
    *   在Tcl控制台中,精确输入以下命令。此命令将PCIe IP核实例(`pcie_7x_0`)的`IP_LOCKED`属性设置为`true`。
    ```tcl
    set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
    ```
    *   按 **Enter** 执行命令。
3.  **验证锁定:**
    *   检查 **消息** 窗格。您应该会看到一条确认属性已设置的消息。
    *   您还可以右键单击源文件窗格中的 `pcie_7x_0.xci`,选择“IP Properties”(IP属性),并验证 `IP_LOCKED` 是否设置为 `true`。您可能还会注意到“Customize IP”(定制IP)选项现在已灰显,或者只允许“Re-customize IP”(重新定制IP),然后会警告您关于锁定。
4.  **解锁(如果需要):**
    *   如果您将来需要对PCIe IP核的设置进行进一步修改,则必须先将其解锁。使用以下Tcl命令:
    ```tcl
    set_property -name {IP_LOCKED} -value false -objects [get_ips pcie_7x_0]
    ```
    *   请记住在进行和应用更改后重新锁定它。
5.  **记录操作:**
    *   在您的项目文档(例如,README文件、项目说明)中注明PCIe IP核已锁定是一个好习惯。这有助于项目中其他人理解其配置状态并避免混淆。

---

## **第二部分:中级概念与实现**

---

## **8. 高级固件定制**

为了实现对捐赠设备精确且令人信服的仿真,除了基本识别之外,还需要对FPGA固件进行更深入的定制。这包括调整PCIe参数(例如链路速度和事务大小),细致地调整基地址寄存器(BARs)及其相关的内存映射,以及准确仿真电源管理和中断机制。这些步骤确保仿真设备不仅在主机系统看来与原始硬件相同,而且在协议和功能级别上行为也完全一致。

### **8.1 配置PCIe参数以进行仿真**

精确仿真要求您的FPGA设备的PCIe操作参数经过细致配置,以匹配捐赠设备的参数。这包括PCIe链路速度、链路宽度、能力指针和最大有效载荷大小等设置。正确的配置可确保与主机系统的兼容性、驱动程序和应用程序与设备交互的正确操作以及数据传输的最佳性能。

#### **8.1.1 匹配PCIe链路速度和宽度**

PCIe链路速度(例如,Gen1、Gen2、Gen3)和链路宽度(例如,x1、x4、x8)是决定设备最大理论数据吞吐量和性能的关键参数。将这些设置与捐赠设备匹配对于精确仿真至关重要,因为驱动程序或系统组件可能期望特定的链路能力。

**步骤:**

1.  **访问PCIe IP核设置:**
    *   **打开您的Vivado项目:** 启动Vivado并打开您之前创建或修改的项目(例如,`pcileech_squirrel_top.xpr`)。确保所有源文件都已正确添加到项目中。
    *   **定位PCIe IP核:** 在 **Sources**(源文件)窗格(通常在左侧)中,展开设计层次结构以找到PCIe IP核实例。对于Xilinx 7系列设计(如Squirrel中使用的Artix-7),这通常被命名为 `pcie_7x_0.xci`。
    *   **定制IP核:** 右键单击 `pcie_7x_0.xci` 并选择 **Customize IP**(定制IP)。IP定制窗口将打开,显示多个选项卡中的各种配置选项。

2.  **设置最大链路速度:**
    *   **导航到链路参数:** 在IP定制窗口中,点击 **PCIe Capabilities**(PCIe功能)选项卡(有时是“PCIe Configuration”或“General”)。在此选项卡内,查找与 **Link Parameters**(链路参数)或 **Link Capability Register**(链路能力寄存器)相关的部分。
    *   **配置最大链路速度:** 找到标有 **Maximum Link Speed**(最大链路速度)的选项(或“Target Link Speed”)。
    *   将其设置为与您的捐赠设备支持和广告的最大链路速度相匹配。
        *   **示例:**
            *   如果捐赠设备在 **PCIe Gen2 (5.0 GT/s)** 下运行,选择 **5.0 GT/s**。
            *   如果它在 **PCIe Gen1 (2.5 GT/s)** 或 **PCIe Gen3 (8.0 GT/s)** 下运行,请选择相应的选项。
    *   **注意**:确保您的FPGA的收发器和物理硬件(主板PCIe插槽)支持所选的链路速度。FPGA只会协商到其配置的最大速度。

3.  **设置链路宽度:**
    *   **配置链路宽度:** 在相同的 **Link Parameters**(链路参数)部分中,找到 **Link Width**(链路宽度)设置(或“PCIe Link Width”、“Target Link Width”)。
    *   将其设置为与您的捐赠设备广告的最大链路宽度相匹配。
        *   **示例:**
            *   如果捐赠设备使用 **x4** 链路,将 **Link Width** 设置为 **4**。
            *   选项通常包括 **1**、**2**、**4**、**8**、**16** 通道。
    *   **注意**:物理PCIe插槽和FPGA的封装必须支持所选的链路宽度。尝试配置大于物理连接的宽度将导致链路协商问题。

4.  **保存并重新生成:**
    *   **应用更改:** 配置链路速度和宽度后,点击 **OK** 以在IP定制窗口中应用更改。
    *   **重新生成IP输出产品:** Vivado很可能会提示您由于所做的更改而重新生成IP核的输出产品。确认并允许重新生成过程完成。这可能需要一些时间。
    *   **验证设置:** 一旦重新生成完成,您可以选择性地重新访问IP核设置,以确保配置已正确应用。检查Vivado中 **Messages**(消息)窗口中是否有任何警告或错误。

#### **8.1.2 设置能力指针**

PCIe配置空间中的能力指针是8位寄存器,它们形成一个链表,指向各种能力结构(例如,电源管理、MSI/MSI-X、PCIe Express能力)。正确设置这些指针可确保主机系统能够遍历能力列表并定位和利用设备广告的功能。

**步骤:**

1.  **在固件中定位能力指针:**
    *   **打开配置文件:** 在Visual Studio Code中,打开您的板卡的主配置文件,通常是`pcileech_pcie_cfg_a7.sv`,位于`pcileech-fpga/<your_board_variant>/src/pcileech_pcie_cfg_a7.sv`。
    *   **理解能力指针:** 此文件中的能力指针(`cfg_cap_pointer`)指向PCIe配置空间中的*第一个*能力结构,通常从标准64字节配置头之后开始。后续的能力通过其“下一个能力指针”字段链接起来。

2.  **设置能力指针值:**
    *   **找到`cfg_cap_pointer`的赋值:** 在代码中搜索定义`cfg_cap_pointer`的行。
        ```verilog
        reg [7:0] cfg_cap_pointer = 8'hXX; // 当前值(例如,默认的8'h40)
        ```
    *   **更新能力指针:** 将`XX`替换为您使用Arbor从捐赠设备观察到的8位十六进制能力指针值。此值通常指向设备特定配置空间(通常在偏移量`0x3F`结束)之后第一个能力结构的偏移量。能力常见的起始点是`0x40`或`0x60`。
        *   **示例:**
            *   如果捐赠设备的第一个能力指针是`0x60`(表示其第一个能力结构在配置空间中从偏移量`0x60`开始),将该行更新为:
                ```verilog
                reg [7:0] cfg_cap_pointer = 8'h60; // 更新以匹配捐赠设备的第一个能力偏移量
                ```
    *   **确保正确对齐:** 能力结构必须对齐到4字节边界。能力指针应始终指向配置空间中有效的4字节对齐偏移量。

3.  **保存更改:**
    *   **保存配置文件:** 进行更改后,点击 **文件 > 保存** 或按下 `Ctrl + S` 保存文件。
    *   **验证语法:** 确保更改未引入任何语法错误(VS Code通常会高亮显示这些错误)。
    *   **添加注释以清晰说明:** 添加注释解释更改,以便将来参考和维护。
        ```verilog
        reg [7:0] cfg_cap_pointer = 8'h60; // 设置为捐赠设备的能力指针(例如,PCIe能力位于0x60)
        ```

#### **8.1.3 调整最大载荷和读取请求大小**

这些参数定义了单个PCIe事务层数据包(TLP)中可以传输的最大数据量,以及非posted内存读取请求TLP的最大大小。将这些设置与捐赠设备匹配可确保兼容性并优化数据传输操作的性能。不匹配可能导致吞吐量降低或通信错误。

**步骤:**

1.  **设置支持的最大载荷大小(IP核):**
    *   **访问设备功能:** 在PCIe IP核定制窗口(Vivado中的`pcie_7x_0.xci`)中,导航到 **PCIe Capabilities**(PCIe功能)选项卡。
    *   **配置支持的最大载荷大小:** 找到标有 **Max Payload Size Supported**(支持的最大载荷大小)的设置(或类似名称)。
    *   将其设置为与您的捐赠设备支持和广告的值相匹配(例如,128字节、256字节、512字节、1024字节、2048字节、4096字节)。
        *   **示例:** 如果捐赠设备支持的最大载荷大小为 **256字节**,请从下拉列表中选择 **256字节**。

2.  **设置支持的最大读取请求大小(IP核):**
    *   **配置支持的最大读取请求大小:** 在同一选项卡中,找到 **Max Read Request Size Supported**(支持的最大读取请求大小)设置。
    *   将其设置为与捐赠设备的能力相匹配。这指定了设备在单个读取事务中可以请求的最大数据量。
        *   **示例:** 如果捐赠设备支持的最大读取请求大小为 **512字节**,请选择 **512字节**。

3.  **调整固件参数(匹配IP核):**
    *   **打开 `pcileech_pcie_cfg_a7.sv`:** 确保配置文件在Visual Studio Code中打开。
    *   **更新固件常量:** 找到定义`max_payload_size_supported`和`max_read_request_size_supported`的行。这些通常是与您在IP核中选择的字节大小对应的位编码值。
        ```verilog
        reg [2:0] max_payload_size_supported = 3'bZZZ;   // 当前值
        reg [2:0] max_read_request_size_supported = 3'bWWW; // 当前值
        ```
    *   **设置适当的值:** 将`ZZZ`和`WWW`替换为与所选大小对应的3位二进制表示。
        *   **映射(根据PCIe规范):**
            *   **128字节**:`3'b000`
            *   **256字节**:`3'b001`
            *   **512字节**:`3'b010`
            *   **1024字节**:`3'b011`
            *   **2048字节**:`3'b100`
            *   **4096字节**:`3'b101`
        *   **示例:**
            *   对于 **256字节** 载荷大小:
                ```verilog
                reg [2:0] max_payload_size_supported = 3'b001; // 支持最大256字节 (0x100)
                ```
            *   对于 **512字节** 读取请求大小:
                ```verilog
                reg [2:0] max_read_request_size_supported = 3'b010; // 支持最大512字节 (0x200)
                ```
    *   **原因**:这些固件参数通常决定了与PCIe核接口的用户逻辑的行为,确保您的逻辑遵循配置的最大值。

4.  **保存更改:**
    *   **保存文件:** 更新`pcileech_pcie_cfg_a7.sv`中的值后,保存文件。
    *   **验证一致性:** Vivado PCIe IP核GUI中配置的值*必须*与您的HDL配置文件中设置的值*匹配*。任何不匹配都可能导致意外行为或链路训练问题。
    *   **添加注释:** 在您的代码中清晰地记录这些更改,以便将来参考。

### **8.2 调整BARs和内存映射**

基地址寄存器(BARs)是PCIe设备向主机系统公开其内部内存和寄存器的基本方式。正确配置BARs并在FPGA的BRAMs(块RAMs)和逻辑中定义它们的内存映射对于精确仿真和主机端设备驱动程序的正常运行至关重要。

#### **8.2.1 设置BAR大小和类型(IP核和BRAM)**

配置BAR大小和类型可确保您的仿真设备在枚举期间向主机请求正确的地址空间量,并且主机适当地分配和映射这些区域。这还涉及将这些地址区域与FPGA内的物理内存块关联起来。

**步骤:**

1.  **访问BAR配置(PCIe IP核):**
    *   **定制PCIe IP核:** 在Vivado中,右键单击 `pcie_7x_0.xci` 并选择 **Customize IP**(定制IP)以打开其配置GUI。
    *   **导航到BARs选项卡:** 在IP定制窗口中,点击 **Base Address Registers (BARs)**(基地址寄存器(BARs))选项卡。

2.  **配置每个BAR(IP核):**
    *   **匹配捐赠设备的BARs:** 对于每个BAR(BAR0到BAR5),根据您使用Arbor从捐赠设备中提取的信息,细致地设置大小、类型和可预取状态。
    *   **启用/禁用BARs:** 确保只启用捐赠设备实际使用的BARs。禁用(取消选中)任何未使用的BARs。
    *   **设置BAR大小:** 为每个*已启用*的BAR从下拉列表中选择适当的大小。这将是2的幂次(例如,4KB、8KB、64KB、1MB、256MB、1GB)。
        *   **示例:**
            *   如果 **BAR0** 是 **64 KB**,将 **BAR0 Size** 设置为 **64 KB**。
            *   如果 **BAR1** 是 **128 MB**,将 **BAR1 Size** 设置为 **128 MB**。
    *   **设置BAR类型:**
        *   如果BAR是内存映射的,选择 **Memory (32-bit Addressing)**(内存(32位寻址))或 **Memory (64-bit Addressing)**(内存(64位寻址))。如果捐赠设备的BAR是64位或您需要访问4GB以上的地址,请选择 **64-bit Addressing**。
        *   如果BAR用于I/O端口空间(现代PCIe设备较少见),选择 **I/O**。
    *   **设置可预取状态**:如果捐赠设备的BAR被识别为可预取,请选中“Prefetchable”(可预取)框。此位允许主机预取该区域的数据,可能提高性能。

3.  **更新BRAM配置(如果适用):**
    *   许多PCILeech-FPGA项目使用Xilinx块RAM(BRAM)IP核来表示BARs暴露的内存区域。这些BRAM提供仿真设备内存的物理存储。
    *   **定位BRAM IP核:** 在您的Vivado项目 **Sources**(源文件)窗格中,在`ip`子目录(或类似目录)中,您可能会找到BRAM的`.xci`文件,名称可能类似:
        ```
        pcileech-fpga/<your_board_variant>/ip/bram_bar_zero4k.xci
        pcileech-fpga/<your_board_variant>/ip/bram_pcie_cfgspace.xci
        # 可能还有BAR1、BAR2等的其他文件
        ```
    *   **修改BRAM大小:** 对于与*已启用*BAR关联的每个BRAM IP核,您可能需要 **Customize IP**(定制IP)(右键单击`.xci`文件)并调整其内存大小配置,以精确匹配相应的BAR大小。
        *   **示例:** 如果BAR0是256MB,请确保连接到BAR0的BRAM大小为256MB。
        *   **注意**:确保所有活动BAR所需的总内存不超过您的FPGA设备的物理BRAM容量。超出容量将导致实现失败。

4.  **保存并重新生成:**
    *   **应用更改(IP核):** 在PCIe IP核中配置BAR后,点击IP定制窗口中的 **OK**。
    *   **重新生成IP核:** Vivado将提示您由于所做的更改而重新生成PCIe IP核和任何相关的BRAM IP核。允许重新生成完成。这可确保硬件网表反映您的新BAR定义。
    *   **检查错误:** 检查 **Messages**(消息)窗口中是否有与BAR配置或BRAM实例化相关的任何警告或错误。

#### **8.2.2 在固件中定义BAR地址空间**

尽管PCIe IP核配置了BAR的*硬件*方面,但您的定制固件(SystemVerilog代码)需要定义当主机CPU对这些BAR区域内的地址执行读写操作时,仿真设备如何响应的*逻辑*。这涉及地址解码和实现寄存器/内存访问逻辑。

**步骤:**

1.  **打开BAR控制器文件:**
    *   在Visual Studio Code中,打开负责处理BAR访问的SystemVerilog文件。对于PCILeech-FPGA,这通常是:
        ```
        pcileech-fpga/<your_board_variant>/src/pcileech_tlps128_bar_controller.sv
        ```
        此模块通常接收PCIe内存读/写TLP,并解码地址以确定正在访问哪个BAR(以及该BAR内的哪个偏移量)。

2.  **实现地址解码逻辑:**
    *   在`pcileech_tlps128_bar_controller.sv`模块中,您会找到确定传入事务目标是哪个BAR的逻辑。这通常涉及根据配置的BAR大小检查地址位。
    *   您需要定义传入地址`req_addr`(来自TLP)如何映射到您的特定BAR内的偏移量。
    *   **概念示例:**
        ```verilog
        // 示例:BAR0的逻辑(假设它是一个256MB的64位内存BAR,用于寄存器/数据)
        // 'bar_hit[0]'是一个指示命中BAR0的输入信号,通常来自PCIe核。
        // 'req_addr'是传入的PCIe地址。
        // 'req_be'是来自TLP的字节使能。
        // 'req_data'是传入的写入数据。
        // 'rsp_data'是传出的读取数据。

        // 假设BAR0是256MB (2^28字节),地址位 [27:0] 在BAR范围内。
        localparam BAR0_SIZE_BITS = 28; // 2^28 = 256MB

        reg [31:0] internal_register_0; // BAR0内的示例寄存器
        reg [31:0] internal_register_1; // 另一个示例寄存器

        assign bar0_offset = req_addr[BAR0_SIZE_BITS-1:0]; // 提取BAR0内的偏移量

        always_comb begin
            // 默认响应
            rsp_data = 32'hFFFFFFFF; // 默认值为全F或类似值,表示未映射区域

            if (bar_hit[0]) begin // 如果事务目标是BAR0
                if (req_write) begin // 这是写入操作
                    case (bar0_offset)
                        // 示例:将偏移量0x0映射到internal_register_0
                        32'h0000_0000: begin
                            if (req_be[3]) internal_register_0[31:24] = req_data[31:24];
                            if (req_be[2]) internal_register_0[23:16] = req_data[23:16];
                            if (req_be[1]) internal_register_0[15:8]  = req_data[15:8];
                            if (req_be[0]) internal_register_0[7:0]   = req_data[7:0];
                        end
                        // 示例:将偏移量0x4映射到internal_register_1
                        32'h0000_0004: begin
                            if (req_be[3]) internal_register_1[31:24] = req_data[31:24];
                            if (req_be[2]) internal_register_1[23:16] = req_data[23:16];
                            if (req_be[1]) internal_register_1[15:8]  = req_data[15:8];
                            if (req_be[0]) internal_register_1[7:0]   = req_data[7:0];
                        end
                        // 添加更多寄存器映射或内存访问(例如,BRAM访问)
                        default: begin
                            // 处理BAR0内未映射的写入,例如,忽略或记录
                        end
                    endcase
                end else if (req_read) begin // 这是读取操作
                    case (bar0_offset)
                        // 示例:从internal_register_0读取
                        32'h0000_0000: rsp_data = internal_register_0;
                        // 示例:从internal_register_1读取
                        32'h0000_0004: rsp_data = internal_register_1;
                        // 添加更多寄存器映射或内存访问(例如,BRAM访问)
                        default: begin
                            rsp_data = 32'h0; // 对于未映射的读取返回0或特定错误值
                        end
                    endcase
                end
            end
        end
        ```
    *   **处理数据传输:** `always_comb`块(或`always_ff`用于时序逻辑)应定义如何为读取生成`rsp_data`,以及如何根据`bar0_offset`和字节使能(`req_be`)更新内部寄存器/内存。

3.  **实现BRAM访问(如果BAR映射到BRAM):**
    *   如果BAR映射到大块内存(例如,256MB),您通常会实例化一个BRAM IP核(如8.2.1所述)并将其`bar_controller`逻辑与它连接。`bar_controller`将向BRAM提供地址和控制信号。
    *   **概念性BRAM集成(简化):**
        ```verilog
        // 在pcileech_tlps128_bar_controller.sv或子模块中
        // BRAM接口
        wire [BAR0_SIZE_BITS-1:0] bram_addr;
        wire [31:0] bram_wr_data;
        wire [3:0] bram_wr_en; // BRAM的字节使能
        wire bram_wr_ce;
        wire bram_rd_ce;
        wire [31:0] bram_rd_data;

        // 将TLP信号映射到BRAM接口
        assign bram_addr = bar0_offset;
        assign bram_wr_data = req_data;
        assign bram_wr_en = req_be;
        assign bram_wr_ce = bar_hit[0] && req_write;
        assign bram_rd_ce = bar_hit[0] && req_read;

        // 实例化BRAM IP核
        bram_bar_zero bram_inst ( // 假设'bram_bar_zero'是您的BRAM IP模块
            .clka(clk),
            .ena(1'b1),
            .wea(bram_wr_en),
            .addra(bram_addr),
            .dina(bram_wr_data),
            .douta(bram_rd_data)
        );

        // 对于从BAR0的读取,输出BRAM的数据
        if (bar_hit[0] && req_read) begin
            rsp_data = bram_rd_data;
        end
        ```

4.  **保存更改:**
    *   实现每个BAR的逻辑后,保存`pcileech_tlps128_bar_controller.sv`文件。
    *   **验证功能:** 此逻辑很复杂。彻底的仿真(使用测试平台)和后续的硬件测试对于确保正确行为至关重要。

#### **8.2.3 处理多个BAR**

正确管理多个BAR对于暴露多个独立内存或I/O区域的设备至关重要。`bar_controller`模块通常处理所有BAR。

**步骤:**

1.  **实现每个BAR的逻辑:**
    *   在`pcileech_tlps128_bar_controller.sv`内部,扩展逻辑以处理您的捐赠设备使用的所有已启用BAR(BAR0、BAR1、BAR2等)。
    *   **独立逻辑块:** 为清晰和可维护性,创建独立的`if/else if`块或`case`语句,根据哪个`bar_hit`信号被断言而激活。
        ```verilog
        // BAR0处理
        if (bar_hit[0]) begin
            // BAR0特定读/写逻辑,用于其寄存器/内存
        end else if (bar_hit[1]) begin
            // BAR1特定读/写逻辑,用于其寄存器/内存
        end else if (bar_hit[2]) begin
            // BAR2特定逻辑
        end
        // ... 继续其他BAR
        ```
    *   **定义寄存器和内存:** 根据需要为每个BAR分配独立的寄存器集或连接不同的BRAM实例。

2.  **确保非重叠地址空间:**
    *   虽然PCIe IP核处理与主机操作系统的每个BAR的不同地址空间的协商,但您的内部固件逻辑*必须*假定这些空间是独立的且不重叠的。
    *   **验证地址范围**:仔细检查PCIe IP核中的BAR大小配置,以确保它们是独立的,并且根据PCIe规范正确地对齐到2的幂次方边界。
    *   **更新地址解码**:您的`bar_controller`逻辑依赖于PCIe IP核生成的`bar_hit`信号。确保这些信号被正确解释并导致每个BAR的独特处理逻辑。

3.  **测试BAR访问:**
    *   **仿真测试:** 在硬件部署之前,使用仿真工具(例如Vivado仿真器)和全面的测试平台来验证对每个BAR的所有读写操作。
        *   向每个BAR内的特定偏移量发送内存写入TLP。
        *   向每个BAR内的特定偏移量发送内存读取TLP并验证返回的数据。
    *   **硬件测试:** 编程FPGA后,使用主机端软件工具(如PCILeech客户端软件或定制C/Python脚本)访问和验证每个BAR。
        *   **Linux**:使用`lspci -vvv`检查BAR映射(`Memory at XXXX (64-bit, prefetchable) [size=YYYY]`)。然后可以使用`devmem2`或自定义内核模块来读/写这些映射地址。
        *   **Windows**:使用“RW-Everything”等工具或自定义用户模式应用程序来检查和与映射的内存区域交互。
        *   执行各种读/写模式以确保所有BAR之间的数据完整性和正确寻址。

---

### **8.3 仿真设备电源管理和中断**

实现电源管理功能和中断对于需要与主机操作系统的电源管理和中断处理机制密切高效交互的设备至关重要。没有这些,仿真设备可能无法完全正常工作,或者性能可能不理想。

#### **8.3.1 电源管理配置**

实现电源管理允许仿真设备支持各种电源状态(例如D0、D3hot),有助于系统范围的电源效率并符合操作系统的预期。主机操作系统将查询设备的功能并发送命令以在这些状态之间转换。

**步骤:**

1.  **在PCIe IP核中启用电源管理:**
    *   **访问功能:** 在PCIe IP核定制窗口(`pcie_7x_0.xci`)中,导航到 **PCIe Capabilities**(PCIe功能)选项卡。
    *   **启用电源管理:** 查找与 **Power Management Capability**(电源管理功能)相关的部分或选项。确保已选中或启用此选项,以便在设备的配置空间中包含电源管理(PM)功能结构。

2.  **设置支持的电源状态:**
    *   **配置支持的状态:** 在IP核的电源管理功能部分,指定设备支持的电源状态。这些通常是复选框或下拉菜单。将这些设置与您通过Arbor观察到的捐赠设备的能力相匹配。
        *   **D0(完全开启/运行)**:始终支持。
        *   **D1、D2(中间状态)**:可选,用于低功耗空闲状态。
        *   **D3hot(断电,辅助电源存在)**:设备逻辑关闭,但可以响应PM事件。
        *   **D3cold(完全断电)**:设备没有电源。
    *   **示例**:如果捐赠设备仅支持D0和D3hot,则只启用它们。

3.  **在固件中实现电源状态逻辑:**
    *   **打开 `pcileech_pcie_cfg_a7.sv`(或相关控制模块):** 您通常需要修改固件以反映并可能响应主机命令的电源状态转换。PCIe核本身处理大部分协议,但您的用户逻辑需要知道当前状态。
    *   **处理电源管理控制和状态寄存器(PMCSR)写入:** 主机操作系统通过写入PMCSR中的特定位来改变设备的电源状态,PMCSR是PM能力结构的一部分。您的固件理想情况下应有逻辑来读取这些位并调整设备行为(例如,暂停/恢复操作,启用/禁用时钟)。
        ```verilog
        // 示例:pcileech_pcie_cfg_a7.sv或专用PM模块的一部分
        // 假设'cfg_write'在配置写入时被断言,'cfg_address'是偏移量,'cfg_writedata'是数据。
        // D状态位位于PM能力结构中偏移量0x04处,位[1:0]。

        // PMCSR寄存器(内部表示)
        reg [15:0] pmcsr_reg = 16'h0000; // 初始化为D0

        // 用户逻辑信号,指示当前电源状态
        reg [1:0] current_d_state = 2'b00; // 00 = D0, 01 = D1, 10 = D2, 11 = D3hot

        always @(posedge clk) begin
            if (reset) begin
                pmcsr_reg <= 16'h0000;
                current_d_state <= 2'b00; // 重置为D0
            end else begin
                // 示例:捕获对PMCSR的写入(如果直接在用户逻辑中处理)
                // 注意:PCIe IP核管理大部分内容,但您的用户逻辑可能需要从中读取值。
                // 假设PCIe核提供一个反映当前D状态的输出:
                // assign current_d_state = pcie_core_d_state_output;

                // 如果用户逻辑*需要*写入PMCSR(较少见,通常是只读状态)
                // 或者它需要处理命令
                // if (cfg_write && (cfg_address == PM_CAP_OFFSET + 2'h04)) begin // PMCSR在PM Cap基础地址+0x04
                //     pmcsr_reg[1:0] <= cfg_writedata[1:0]; // 捕获新D状态
                //     // current_d_state <= cfg_writedata[1:0]; // 更新内部状态
                // end

                // 在PCILeech中,PCIe核管理PMCSR。您可能会从核读取信号。
                // 为了演示,假设'pcie_d_state'是来自IP核的输入。
                current_d_state <= pcie_d_state; // 根据PCIe核的状态更新
            end
        end

        // 示例:响应D状态变化的逻辑
        always @(*) begin
            if (current_d_state == 2'b11) begin // D3hot状态
                // 禁用非必要模块的电源,暂停操作,
                // 断言信号给主DMA逻辑以停止活动。
                // 例如:dma_engine_enable = 1'b0;
            end else if (current_d_state == 2'b00) begin // D0状态
                // 启用全部功能
                // 例如:dma_engine_enable = 1'b1;
            end
        end
        ```
    *   **管理电源状态效果:** 实现逻辑以根据`current_d_state`更改设备的内部行为(例如,启用/禁用时钟,将子模块置于低功耗模式)。这对于精确的功耗仿真以及确保设备正确响应操作系统命令至关重要。

4.  **保存更改:**
    *   保存任何修改过的固件文件。
    *   通过仿真或硬件测试(例如,Windows“睡眠”或“休眠”功能,或Linux `poweroff`命令)彻底测试电源管理功能,以查看设备是否正确转换。

#### **8.3.2 MSI/MSI-X配置**

实现消息信号中断(MSI)或其扩展版本(MSI-X)允许仿真设备使用基于消息的中断。这些中断比传统的引脚中断(INTx)效率更高、可扩展性更强,是现代PCIe设备的优选方法。MSI/MSI-X允许设备通过向特定内存地址写入特殊TLP来通知CPU。

**步骤:**

1.  **在PCIe IP核中启用MSI/MSI-X:**
    *   **访问中断配置:** 在PCIe IP核定制窗口(`pcie_7x_0.xci`)中,导航到 **Interrupts**(中断)选项卡或专门标记为 **MSI/MSI-X Capabilities**(MSI/MSI-X功能)的部分。
    *   **选择中断类型:** 根据捐赠设备的功能,选择 **MSI** 或 **MSI-X**。MSI-X通常因其灵活性(更多向量,每个向量可屏蔽)而受到青睐。
    *   **配置支持的向量数量:** 设置设备将支持的中断向量(消息)数量。这应与捐赠设备匹配。
        *   **MSI** 支持最多32个向量(通常是1、2、4、8、16或32)。
        *   **MSI-X** 支持最多2048个向量,允许更细粒度的中断源。
    *   **启用功能:** 确保MSI或MSI-X功能结构已明确启用,以便包含在设备的配置空间中。这是主机操作系统发现设备中断能力的方式。

2.  **在固件中实现中断逻辑:**
    *   **打开 `pcileech_pcie_tlp_a7.sv`(或用户逻辑模块):** 此文件通常负责用户定义的TLP生成,并且可能是启动MSI/MSI-X消息的合适位置。但是,中断的*触发*将来自您的自定义逻辑。
    *   **定义中断信号:** 声明内部信号,指示何时需要生成中断。
        ```verilog
        // 在自定义模块中(例如,'my_device_logic.sv'),该模块与TLP生成逻辑接口
        reg msi_trigger_signal; // 当发生中断条件时断言此信号
        ```
    *   **实现中断生成逻辑:** 定义应该触发中断的条件。这通常涉及在仿真设备的逻辑中检测事件。
        ```verilog
        // 在'my_device_logic.sv'内部
        input wire clk;
        input wire reset;
        input wire event_data_ready; // 示例:当数据就绪时来自您的逻辑的输入

        always @(posedge clk or posedge reset) begin
            if (reset) begin
                msi_trigger_signal <= 1'b0;
            end else if (event_data_ready) begin // 当特定事件发生时
                msi_trigger_signal <= 1'b1; // 触发MSI
            end else begin
                msi_trigger_signal <= 1'b0; // 一个周期后或被确认后清除
            end
        end
        ```
    *   **连接到PCIe核的MSI接口:** `msi_trigger_signal`(或您的自定义逻辑的类似输出)需要连接到PCIe IP核的适当输入(例如,如果使用AXI-Stream接口进行MSI TLP,则连接到`s_axis_tdata_tready`、`s_axis_tdata_tvalid`、`s_axis_tdata_tlast`;或者连接到IP核提供的专用MSI请求端口)。然后PCIe核会形成并发送实际的MSI/MSI-X TLP。有关精确的接口详细信息,请查阅Xilinx PCIe IP核文档。

3.  **保存更改:**
    *   实现中断逻辑后,保存所有修改过的固件文件。
    *   **检查时序约束:** 新逻辑,特别是中断路径,可能对时序很敏感。确保综合和实现工具不会报告与您的中断生成逻辑相关的任何时序违规。

#### **8.3.3 实现中断处理逻辑(设备端)**

除了启用功能之外,定义仿真设备何时以及如何生成中断对于其与主机中断处理机制和驱动程序行为的正确交互至关重要。这涉及创建断言中断请求的内部逻辑。

**步骤:**

1.  **定义中断条件:**
    *   **识别触发事件:** 根据您的捐赠设备的行为,确定哪些特定的内部事件应导致您的仿真设备生成中断。
        *   **示例**:数据传输完成、接收缓冲区中有新数据、内部错误条件、特定命令完成、链路状态更改。
    *   **实现条件逻辑:** 在您的自定义SystemVerilog模块中使用组合逻辑或时序逻辑,精确检测这些事件并生成一个短脉冲或电平信号,指示中断请求。

2.  **创建中断生成模块(模块化设计):**
    *   将中断生成逻辑封装到一个单独的专用模块中是一个好习惯,这样可以提高清晰度、可重用性并方便调试。此模块将内部事件作为输入,并产生一个连接到PCIe核的`msi_req`(或类似)输出。
        ```verilog
        // 文件:interrupt_generator.sv
        module interrupt_generator (
            input wire clk,
            input wire reset,
            input wire event_trigger,        // 来自您的自定义逻辑的输入信号(例如,data_ready, error_flag)
            output reg msi_req_o            // 输出:断言此信号以请求MSI/MSI-X
        );

        // MSI的简单脉冲发生器(一次性中断)
        reg event_trigger_d1;

        always @(posedge clk or posedge reset) begin
            if (reset) begin
                msi_req_o <= 1'b0;
                event_trigger_d1 <= 1'b0;
            end else begin
                event_trigger_d1 <= event_trigger;
                // 当event_trigger从低到高跳变时,生成一个单周期脉冲
                if (event_trigger && !event_trigger_d1) begin
                    msi_req_o <= 1'b1; // 断言MSI请求
                end else begin
                    msi_req_o <= 1'b0; // 一个周期后取消断言
                end
            end
        end

        endmodule // interrupt_generator
        ```
    *   **与主固件集成:** 在您的顶层用户逻辑中(例如,在`pcileech_squirrel_top.sv`或其实例化的模块中)实例化此`interrupt_generator`模块,并将其`msi_req_o`输出连接到PCIe IP核的MSI输入。

3.  **确保正确的时序和序列:**
    *   **遵守PCIe规范:** MSI/MSI-X消息是TLP。确保这些消息的生成符合PCIe TLP格式、流控制和时序要求。PCIe IP核处理大部分内容,但您提供给它的输入信号必须稳定且时序正确。
    *   **管理中断延迟:** 优化您的逻辑,以最大限度地减少内部事件发生与`msi_req_o`信号断言之间的任何不必要延迟。

4.  **测试中断传递:**
    *   **仿真:** 使用全面的测试平台模拟应生成中断的场景。验证您的`msi_req_o`信号是否按预期工作,以及PCIe核是否生成正确的MSI/MSI-X TLP。
    *   **硬件测试:**
        *   用更新的固件编程FPGA。
        *   使用主机端软件触发应引起中断的事件(例如,启动完成的DMA传输)。
        *   确认主机操作系统接收到中断。在Linux上,`dmesg`可以显示中断消息。在Windows上,您可以使用特定的驱动程序调试工具或事件查看器。
        *   **调试工具:** 利用Vivado的集成逻辑分析仪(ILA)核(如第12节所述)实时监控`event_trigger`、`msi_req_o`和PCIe核的TLP输出信号,以验证正确的中断生成。

5.  **保存更改:**
    *   完成所有代码修改并保存相关固件文件。
    *   根据测试结果审查并改进您的中断逻辑,以确保可靠性。

---

## **9. 仿真设备特定功能**

除了标准的PCIe配置空间和通用DMA功能之外,许多捐赠设备还具有独特的功能、自定义寄存器或厂商特定功能,这些对于其完整功能或与其专有驱动程序交互至关重要。精确的仿真需要理解和复制这些细微之处。本节将深入探讨如何实现这些高级功能,从而实现更忠实和功能更全面的仿真。

### **9.1 实现高级PCIe功能**

PCIe规范包含除了基本配置空间之外的各种*扩展功能*。这些功能提供了高级错误报告、电源管理、虚拟化等特性。实现这些功能有助于您的仿真设备显得更合法,并与现代主机系统正确交互。

**步骤:**

1.  **识别所需的扩展功能:**
    *   在使用Arbor等工具收集捐赠设备信息时,请仔细查找并记录捐赠设备配置空间中存在的任何扩展功能。这些通常在标准配置空间的初始256字节之外找到。
    *   **常见示例:**
        *   **高级错误报告(AER)**:为PCIe链路提供强大的错误检测、日志记录和报告机制。
        *   **设备序列号(DSN)**:(已在第6.2节中介绍)。
        *   **电源管理(PM)**:(已在第8.3.1节中介绍)。
        *   **PCI Express(PCIe)功能结构**:(已在第8.1节中介绍链路速度/宽度、最大载荷/读取请求,但也包括其他字段,如设备控制/状态、链路控制/状态)。
        *   **虚拟通道(VC)/多功能虚拟通道(MFVC)**:用于服务质量(QoS)和流量管理。
        *   **精确时间测量(PTM)**:用于设备之间的时间同步。
        *   **延迟容忍报告(LTR)**:基于延迟要求进行电源管理。
        *   **可重置FPC(功能级重置)**:用于更细粒度的重置。

2.  **在Vivado PCIe IP核中启用功能:**
    *   访问Vivado中的PCIe IP核定制窗口(`pcie_7x_0.xci`)。
    *   导航到各个选项卡(例如,“PCIe Capabilities”、“Extended Capabilities”、“Advanced Options”)。
    *   查找复选框或下拉菜单,以启用和配置从捐赠设备中识别出的特定扩展功能。
    *   **示例(AER):** 您会找到一个“高级错误报告”部分,您可以在其中启用它并配置其寄存器(例如,严重性掩码)。
    *   **注意:** Xilinx PCIe IP核为许多标准和扩展功能提供了高度可配置性。通常只需在GUI中启用正确的选项即可。

3.  **实现功能寄存器的固件逻辑(如果需要):**
    *   虽然PCIe IP核处理这些功能的*存在*和大部分*协议*,但某些功能会暴露您的自定义固件可能需要读写或其值需要固件响应的寄存器。
    *   **示例(AER):** 如果您的仿真设备检测到应通过AER报告的内部错误,您的固件需要写入特定的AER错误状态寄存器(这些寄存器可能作为BAR的一部分暴露,或由PCIe核内部处理,然后反映到用户逻辑)。然后您的用户逻辑将向PCIe核断言错误输入。
    *   **示例(电源管理):** 如8.3.1节所述,您的固件需要响应PCIe核发出的D状态变化。
    *   **流程:**
        *   识别您的捐赠设备驱动程序交互的每个已启用功能结构中的特定寄存器。
        *   在PCILeech-FPGA框架中找到与这些寄存器接口的相应信号或逻辑(通常在`pcileech_pcie_cfg_a7.sv`或`bar_controller`中)。
        *   实现这些寄存器的读写逻辑,确保您的仿真设备的内部状态准确反映驱动程序期望的值。

### **9.2 仿真厂商特定功能**

这是真正的“全设备仿真”变得高度专业化的部分。许多实际设备具有独特的寄存器、未文档化的命令、自定义数据格式或专有控制流程,这些都使其与众不同。复制这些需要更深入的分析和定制HDL开发。

**步骤:**

1.  **逆向工程厂商特定行为:**
    *   这通常是最具挑战性的部分。
    *   **静态分析(驱动程序/固件):** 反汇编捐赠设备的官方驱动程序(Windows `.sys`,Linux `.ko`)或设备的原始固件(如果可用)。查找独特的I/O或MMIO访问模式、魔术值或寄存器写入序列。Ghidra、IDA Pro或objdump等工具会非常有价值。
    *   **动态分析(驱动程序执行):** 运行捐赠设备及其驱动程序,并使用**PCIe协议分析仪**(例如,Teledyne LeCroy,Keysight,如第12.2节所述)监控PCIe流量。这是理解实际TLP交换,包括厂商定义消息和寄存器访问序列的黄金标准。请注意:
        *   BARs中访问的特定内存地址。
        *   对这些地址的读/写模式。
        *   写入或读取特定寄存器的值。
        *   命令和响应之间的时序关系。
    *   **系统调用/API监控**:在主机上,使用Procmon(Windows)或`strace`(Linux)等工具查看驱动程序如何与操作系统交互以及它使用了哪些特定的设备I/O控制(IOCTL)代码,这些代码可能对应于特定的硬件操作。
    *   **硬件嗅探**:如果可能,使用硬件嗅探器(如Saleae逻辑分析仪)捕获设备内部总线(例如SPI,I2C)上的信号,如果它有外部闪存或组件。

2.  **在BARs中实现自定义寄存器和逻辑:**
    *   一旦您识别出厂商特定的寄存器或命令协议,您将需要将这些定义到您的FPGA固件中,通常作为可通过您的某个BAR访问的内存映射寄存器。
    *   **创建内部寄存器:** 在您的SystemVerilog代码中声明`reg`变量来表示这些自定义寄存器。
        ```verilog
        // 在pcileech_tlps128_bar_controller.sv或子模块中
        reg [31:0] custom_control_reg;
        reg [31:0] custom_status_reg;
        reg [31:0] custom_data_reg;

        // 示例:将它们映射到BAR0中的特定偏移量(假设BAR0足够大)
        // 调整'bar0_offset' case语句(来自第8.2.2节)
        // ...
        if (bar_hit[0]) begin
            if (req_write) begin
                case (bar0_offset)
                    32'h0000_1000: custom_control_reg <= req_data; // 自定义控制寄存器
                    32'h0000_1004: custom_data_reg <= req_data;    // 自定义数据写入寄存器
                    // ... 其他映射
                endcase
            end else if (req_read) begin
                case (bar0_offset)
                    32'h0000_1000: rsp_data = custom_control_reg; // 读取控制寄存器
                    32'h0000_1008: rsp_data = custom_status_reg;  // 自定义状态寄存器
                    // ... 其他映射
                endcase
            end
        end
        // ...
        ```
    *   **实现行为逻辑:** 创建SystemVerilog逻辑(状态机、组合逻辑),用于:
        *   响应对`custom_control_reg`的写入。例如,此寄存器中的某个特定位可能触发DMA传输、清除状态标志或启动内部操作。
        *   根据仿真设备的内部状态更新`custom_status_reg`(例如,“操作完成”、“发生错误”、“数据可用”)。
        *   处理写入`custom_data_reg`的数据,或在读取时从中提供数据,模仿捐赠设备的数据路径。

3.  **仿真厂商特定消息(如果适用):**
    *   一些复杂设备可能通过PCIe使用“厂商定义消息”(VDM)进行特定控制或通信。如果您的分析揭示了此类消息,您将需要:
        *   在PCIe IP核中启用VDM支持(如果可用)。
        *   实现TLP生成逻辑(如第10节所述)来制作和发送这些VDM。
        *   实现TLP接收和解析逻辑来解释来自主机的传入VDM。

4.  **验证仿真行为:**
    *   **迭代测试:** 这是一个高度迭代的过程。进行小修改,编译,烧录,然后测试。
    *   **驱动程序加载:** 捐赠设备的驱动程序是否正确加载而没有错误?
    *   **功能测试:** 驱动程序能否启动基本操作?它是否从您的仿真寄存器获得预期的响应?
    *   **应用程序测试:** 依赖捐赠设备的应用程序能否在您的仿真版本下正常运行?
    *   **调试:** 广泛使用ILA和PCIe协议分析仪来比较您的仿真设备的行为与真实捐赠设备捕获的行为。寻找TLP时序、寄存器值和总体协议流中的差异。

---

## **10. 事务层数据包(TLP)仿真**

事务层数据包(TLP)是PCIe架构中通信的基本单位。主机系统与PCIe设备之间的每一次交互,从配置读取到数据传输,都被封装在一个或多个TLP中。精确的TLP仿真不仅重要;它对于您的仿真设备与主机系统正确交互,确保驱动程序正常运行和数据按预期移动,是*至关重要*的。

### **10.1 理解和捕获TLP**

在您能够制作自定义TLP之前,您必须深入理解它们的结构和常见类型。从您的捐赠设备捕获真实世界的TLP可提供最精确的蓝图。

*   **TLP结构的学习**:
    TLP通常由报头、可选数据载荷和可选的端到端CRC(ECRC)组成。报头至关重要,它定义了TLP的类型、事务细节和路由信息。

    *   **TLP的组成部分**:
        *   **报头(Header)**:最重要的部分,通常是3或4个双字(Dword = 4字节)。它包含定义TLP目的和处理方式的关键字段:
            *   **Fmt(格式)和 Type(类型)**:定义TLP的格式(3DW/4DW,带/不带数据)及其特定目的(例如,内存读取请求、内存写入、完成、配置读取/写入)。
            *   **Length(长度)**:指定数据载荷的长度(以双字为单位)。
            *   **Requester ID(总线、设备、功能)**:标识发起请求的PCIe功能。对于将完成数据路由回正确的源头至关重要。
            *   **Tag(标签)**:由请求者分配给事务的唯一标识符,允许完成者将完成TLP与其原始请求TLP匹配。
            *   **Address(地址)**:对于内存/IO事务,这是目标内存或I/O地址。
            *   **First DW Byte Enable (FBE)** 和 **Last DW Byte Enable (LBE)**:指定数据载荷的第一个和最后一个双字中哪些字节对于写入操作有效,或哪些字节正在请求读取完成。
            *   **Traffic Class (TC)** 和 **Transaction ID (TID)**:用于QoS和排序规则。
        *   **数据载荷(可选)**:存在于内存写入、配置写入和读取完成等TLP中。它包含实际传输的数据。
        *   **端到端CRC (ECRC)(可选)**:一个32位CRC,覆盖整个TLP,确保从源到目的地的数据完整性,通常由软件生成/检查。

*   **理解常见的TLP类型**:您的固件将主要处理这些类型:
    *   **Memory Read Request (MRd)**:由请求者(例如,主机CPU,或您的FPGA作为DMA主设备)发送的TLP,用于从特定内存地址读取数据。
    *   **Memory Read Completion (CplD)**:由完成者(例如,您的FPGA响应主机MRd)发送的TLP,携带请求的数据。
    *   **Memory Write (MWr)**:由请求者(例如,主机CPU,或您的FPGA)发送的TLP,用于向特定内存地址写入数据。
    *   **Completion Without Data (Cpl)**:由完成者发送的TLP,用于确认不返回数据的请求(例如,成功的MWr)。
    *   **Configuration Read Request (CfgRd)**:来自主机的TLP,用于读取设备配置空间中的寄存器。
    *   **Configuration Read Completion (CplD)**:来自设备返回CfgRd数据数据的TLP。
    *   **Configuration Write Request (CfgWr)**:来自主机的TLP,用于写入设备配置空间中的寄存器。
    *   **Vendor-Defined Messages (VDM)**:特定厂商用于专有通信的自定义TLP。

#### **10.1.2 从捐赠设备捕获TLP**

从您的捐赠设备捕获真实的PCIe流量是无价的。它提供了TLP结构、序列和时序的具体示例,使您能够精确地复制它们。

*   **步骤**:
    1.  **设置PCIe协议分析仪**:
        *   最有效的方法是使用专用的硬件工具,通常称为“PCIe协议分析仪”。这些设备位于主机和捐赠PCIe卡之间,被动捕获所有流量。
        *   **示例**:
            *   **Teledyne LeCroy PCIe 分析仪**:行业标准,功能强大,但投资巨大。
            *   **Keysight PCIe 分析仪**:另一个领先的供应商。
            *   (对于基本调试,一些带PCIe解码器的高端逻辑分析仪可能提供有限的TLP查看功能,但真正的协议分析仪更优越)。
    2.  **捕获事务**:
        *   在连接了协议分析仪的测试系统中安装捐赠设备。
        *   运行捐赠设备的驱动程序和任何相关应用程序。
        *   在正常操作期间,尤其是关键阶段,监控和记录PCIe事务,例如:
            *   设备枚举(操作系统首次检测到它时)。
            *   驱动程序加载和初始化。
            *   典型数据传输操作(例如,存储设备的大文件复制,网卡的网络流量)。
            *   设备特定命令或诊断。
    3.  **分析捕获的TLP**:
        *   使用协议分析仪的先进软件解剖捕获的TLP。软件将解码字段,提供时间顺序视图,并允许过滤和搜索。
        *   密切关注:
            *   精确的`Fmt`和`Type`字段。
            *   `Requester ID`和`Tag`值(特别是对于完成)。
            *   内存事务的`Address`和`Length`。
            *   写入和读取完成的`Data Payload`内容。
            *   任何厂商特定字段或自定义TLP。

#### **10.1.3 记录关键TLP事务**

对捕获的TLP进行结构化文档创建了一个用于您的仿真的蓝图。

*   **步骤**:
    1.  **识别关键事务**:
        *   重点关注对设备核心功能至关重要的TLP。这包括:
            *   **初始化序列**:操作系统在枚举期间执行的一系列配置读/写。
            *   **驱动程序初始化**:驱动程序启动时交换的命令和数据。
            *   **主要数据传输**:`MWr`和`MRd` TLP如何为设备的主要功能构建和完成。
            *   **错误处理**:设备如何报告错误(例如,带有Completer Abort (CA)、Unsupported Request (UR)的Completion)。
            *   **电源管理转换**:与D状态变化相关的TLP。
            *   **中断生成**:MSI/MSI-X消息如何发送。
        *   协议分析仪的截图在这里会非常有帮助。
    2.  **创建详细文档**:
        *   对于每个关键TLP序列,记录:
            *   **TLP类型**(例如,MWr、MRd、CplD)。
            *   其**报头字段**(Fmt、Type、Requester ID、Tag、Length、Address、Byte Enables)。
            *   **数据载荷**(如果适用)。
            *   事务中的**序列号**或顺序。
            *   发送它的**条件**(例如,“主机在驱动程序初始化时发送”,“设备在DMA完成时发送”)。
            *   任何**预期的响应**或后续TLP。
        *   协议分析仪的截图在这里会非常有帮助。
    3.  **理解时序和序列**:
        *   除了TLP内容,TLP的*时序*和*序列*至关重要。PCIe有严格的排序规则和流控制机制。注意:
            *   **请求和完成之间的延迟**:真实设备响应的速度。
            *   **流控制信用**:设备如何管理其传入/传出TLP的缓冲区空间。虽然Xilinx PCIe IP核处理基本的流控制,但对于高级仿真,了解捐赠设备的典型信用使用情况会有所帮助。
            *   **事务层数据包排序**:理解posted(写入)和non-posted(读取、完成)事务如何排序。

### **10.2 制作用于特定操作的定制TLP**

一旦您理解了蓝图,您就可以将这些知识转化为您的FPGA固件(SystemVerilog),以主动生成和响应TLP。PCILeech-FPGA框架提供了抽象层,但对于深度仿真,您可能需要直接与TLP生成/解析逻辑交互。

#### **10.2.1 在固件中实现TLP处理**

您的固件需要逻辑来发送和接收TLP。PCIe IP核处理物理层和数据链路层,向您的用户逻辑暴露一个事务层接口(通常是AXI-Stream)。

*   **要修改的文件(主要)**:
    *   `pcileech-fpga/<your_board_variant>/src/pcileech_pcie_tlp_a7.sv`(或类似文件,取决于板卡变体)
        *   此文件通常包含将用户请求转换为出站TLP并将传入TLP解析为用户逻辑信号的核心逻辑。
    *   `pcileech-fpga/<your_board_variant>/src/pcileech_tlps128_bar_controller.sv`
        *   此模块专门处理解析目标为设备BAR的传入内存读/写TLP,并生成相应的完成TLP。

*   **步骤**:

    1.  **理解PCIe IP核接口**:
        *   在编写TLP逻辑之前,请彻底阅读Xilinx PCIe IP核用户指南(特别是关于用户应用接口或AXI4-Stream接口的部分)。这定义了您的SystemVerilog逻辑如何连接到PCIe核以发送和接收TLP。您通常会与`s_axis_rx_tdata`(接收到的TLP数据)、`s_axis_rx_tvalid`(接收到有效TLP)、`m_axis_tx_tdata`(传出TLP数据)、`m_axis_tx_tready`(核已准备好接受TLP)等进行交互。

    2.  **创建TLP生成函数(用于出站TLP)**:
        *   在`pcileech_pcie_tlp_a7.sv`(或与`m_axis_tx_*`接口的模块)中,您将编写逻辑来组装具有所需报头和载荷的TLP。这通常涉及将各种字段组合成一个`[127:0]`(对于128位接口)或`[63:0]`(对于64位接口)总线,该总线馈送PCIe核。
        *   **示例(概念性,简化函数,用于3DW TLP报头):**
            ```verilog
            // 这是一个概念性辅助函数。实际上,您将构建一个状态机
            // 通过AXI-Stream接口发送TLP,可能使用FIFO。
            function automatic [95:0] create_3dw_tlp_header; // 假设3个双字 = 96位
                input logic [7:0] tlp_type_fmt;   // 格式和类型字段
                input logic [15:0] requester_id;  // BDF
                input logic [7:0] tag;
                input logic [7:0] lower_address_bits; // 或更复杂的地址
                input logic [7:0] byte_enables;   // 第一个双字字节使能

                begin
                    create_3dw_tlp_header = {
                        tlp_type_fmt,                     // Fmt[6:4], Type[3:0]
                        8'b0,                             // 保留
                        4'b0,                             // TC[3:0] (流量类别)
                        3'b0,                             // Attr[2:0]
                        1'b0,                             // TH (TLP提示)
                        2'b0,                             // D(igest) (ECRC存在)
                        1'b0,                             // EP (Poisoned)
                        1'b0,                             // TD (类型依赖)
                        // DW0: Fmt, Type, TC, Attr, TH, D, EP, TD, Length (不在3DW中, 4DW有)

                        requester_id,                     // 请求者ID (Bus[7:0], Device[4:0], Function[2:0])
                        tag,                              // 标签
                        lower_address_bits,               // 示例:地址的低位或数据的一部分
                        byte_enables,                     // 第一个双字字节使能
                        4'b0,                             // 保留
                        4'b0                              // 最后一个双字字节使能 (通常用于MWr)
                        // DW1, DW2... 字段
                    };
                end
            endfunction

            // 示例:在状态机中生成带数据的完成(CplD)
            // 这只是一个片段,不是完整实现
            localparam  CPLD_3DW_FMT = 8'h4A; // Fmt=100 (4DW, 带数据), Type=1010 (Cpl)
            localparam  CPL_D_FMT_TYPE_LEN = 8'h4A; // 根据PCIe规范调整。(带数据的4DW报头)

            // ... 发送TLP的状态机
            // 在准备发送CplD的状态下
            if (tx_ready_from_pcie_core) begin
                // 构建报头和载荷
                // 对于CplD,您需要Compliter ID, Status, Byte Count, Requester ID, Tag, Completion ID, Lower Address
                // 然后是实际的读取数据载荷
                m_axis_tx_tdata_reg = {
                    CPL_D_FMT_TYPE_LEN,         // 字节0: Fmt/Type
                    tlp_length_dw_minus_one,    // 字节1: TLP长度 (以双字为单位) - 1
                    status_completion_bits,     // 字节2: Cpl Status, BCM, Rsvd
                    byte_count_dws_upper,       // 字节3: 字节计数 (高位)
                    requester_id,               // 字节4-5: 请求者ID (来自原始MRd)
                    tag,                        // 字节6: 标签 (来自原始MRd)
                    byte_count_dws_lower,       // 字节7: 字节计数 (低位)
                    completion_id,              // 字节8-9: 完成ID (您的BDF)
                    lower_address_from_request  // 字节10-11: 请求的低位地址
                    // ... 接着是实际的数据载荷
                };
                m_axis_tx_tvalid_reg = 1'b1;
                m_axis_tx_tlast_reg = 1'b1; // 最后一个TLP片段
                // ... 状态转换以等待tready
            end
            ```
        *   **注意**:实际实现涉及状态机、FIFO,以及遵循PCIe IP核的AXI-Stream协议。PCILeech-FPGA框架已经为此提供了良好的基础,但您可能需要为非常特定的TLP行为进行扩展或修改。

    3.  **处理TLP接收(用于入站TLP)**:
        *   实现逻辑以解析来自PCIe核接收接口的传入TLP(例如,`s_axis_rx_tdata`、`s_axis_rx_tvalid`)。
        *   此解析包括:
            *   检查`s_axis_rx_tvalid`以判断是否存在TLP。
            *   从TLP报头中读取`Fmt`和`Type`字段以确定其目的。
            *   提取`Requester ID`、`Tag`、`Address`、`Length`和`Data Payload`等相关字段。
        *   使用`case`语句或`if/else if`块,根据TLP类型将信息路由到适当的内部逻辑(例如,用于内存写入的`bar_controller`,用于配置写入的配置模块)。
        *   **示例(概念性,简化解析):**
            ```verilog
            // 在pcileech_pcie_tlp_a7.sv或TLP解析模块中
            input wire [127:0] s_axis_rx_tdata;
            input wire s_axis_rx_tvalid;
            output wire s_axis_rx_tready; // 需要断言此信号以接受更多数据

            reg [7:0] received_tlp_fmt_type;
            reg [15:0] received_requester_id;
            // ... 声明其他已解析的字段

            assign s_axis_rx_tready = 1'b1; // 为简化起见始终准备好接收,在实际设计中管理反压

            always @(posedge clk) begin
                if (s_axis_rx_tvalid) begin
                    received_tlp_fmt_type = s_axis_rx_tdata[127:120]; // 假设最高位
                    received_requester_id = s_axis_rx_tdata[111:96]; // 示例偏移量

                    // 根据TLP类型解码
                    case (received_tlp_fmt_type[3:0]) // 仅TLP类型位
                        4'h0: // 内存写入 (3DW或4DW取决于Fmt)
                            // 提取地址、长度、载荷并传递给BAR控制器
                            begin
                                // 传递给BAR控制器,用于写入仿真内存
                                // bar_write_enable = 1'b1;
                                // bar_write_address = s_axis_rx_tdata[...];
                                // bar_write_data = s_axis_rx_tdata[...];
                            end
                        4'h1: // 内存读取
                            // 提取地址、长度,并传递给BAR控制器进行读取
                            begin
                                // bar_read_enable = 1'b1;
                                // bar_read_address = s_axis_rx_tdata[...];
                                // (完成将由BAR控制器生成)
                            end
                        // ... 其他TLP类型
                        default: begin
                            // 处理不支持或保留的TLP类型(例如,日志记录、错误)
                        end
                    endcase
                end
            end
            ```

    4.  **确保符合性**:
        *   严格验证您生成和解析的TLP是否符合PCIe规范的格式、字段定义和时序。偏差将导致通信失败。

    5.  **实现完成处理**:
        *   对于从主机接收到的内存读取请求(MRd)和配置读取请求(CfgRd),您的设备必须在指定的时间内返回适当的完成TLP(CplD表示数据,Cpl表示无数据)。`bar_controller`模块(第8.2.2节)是此BAR读取逻辑所在的位置。

    6.  **保存更改**:
        *   保存文件(`pcileech_pcie_tlp_a7.sv`、`pcileech_tlps128_bar_controller.sv`或任何自定义模块)后,实现更改。

#### **10.2.2 处理不同TLP类型**

每种TLP类型都有特定的报头格式和行为。您的固件必须擅长处理与您的捐赠设备相关的那些类型。

*   **内存读取请求(MRd)**:
    *   **实现**:
        *   当接收到MRd TLP(由`pcileech_pcie_tlp_a7.sv`解析并路由到`bar_controller`)时,`bar_controller`需要:
            *   解析请求的地址和长度。
            *   从适当的内部内存位置(例如,连接到BAR的BRAM)或内部寄存器中获取数据。
            *   组装一个**带数据的完成(CplD)** TLP。关键是,此TLP必须包含来自MRd请求的原始`Requester ID`、`Tag`和`Completion ID`(您的设备BDF),以及获取的数据载荷。
            *   通过PCIe IP核的传输接口将CplD TLP发送回主机。

*   **内存写入请求(MWr)**:
    *   **实现**:
        *   当接收到MWr TLP时,`bar_controller`需要:
            *   解析目标地址、长度和`Byte Enables`(FBE/LBE)。
            *   提取`数据载荷`。
            *   将数据写入仿真设备内的指定内存位置(例如,BRAM或内部寄存器),并遵循字节使能。
        *   内存写入是“posted事务”,这意味着它们不需要完成TLP进行确认,除非发生错误。

*   **配置读/写请求(CfgRd/CfgWr)**:
    *   **实现**:
        *   这些TLP针对设备的配置空间(厂商ID、设备ID、BAR、功能等)。Xilinx PCIe IP核根据其配置自动处理大部分标准配置空间访问。
        *   但是,如果您的配置空间中存在非标准的自定义寄存器或扩展功能,您可能需要特定的逻辑来:
            *   对于CfgRd:从您的内部`cfg_`寄存器返回请求的数据。
            *   对于CfgWr:更新您的内部`cfg_`寄存器或根据写入的数据触发操作。
        *   配置读取需要**带数据的完成(CplD)**,而配置写入需要**不带数据的完成(Cpl)**。

*   **厂商定义消息(VDM)**:
    *   **实现**:
        *   如果您的捐赠设备使用VDM,这将需要专门的解析和响应逻辑。
        *   **解析传入VDM**:根据其`Fmt`和`Type`字段识别VDM。提取厂商特定数据并根据您的逆向工程发现进行解释。
        *   **制作出站VDM**:当您的仿真设备需要发送VDM时,创建逻辑来组装具有精确厂商特定报头和载荷格式的VDM。

#### **10.2.3 验证TLP时序和序列**

即使TLP格式完美,不正确的时序或序列也会导致设备故障或被检测为不兼容。

*   **步骤**:

    1.  **使用仿真工具**:
        *   **测试平台**:为您的TLP生成和解析模块开发全面的SystemVerilog测试平台。
        *   模拟各种场景(例如,主机发送MRd,您的设备发送CplD;主机发送MWr;主机枚举设备),以验证TLP是否正确形成、传输、接收和处理。
        *   验证TLP的序列,并确保在合理的时间内发送完成。

    2.  **使用ILA监控(集成逻辑分析仪)**:
        *   如第12.1节所述,在您的Vivado设计中插入一个ILA核。
        *   将ILA探头连接到PCIe IP核的AXI-Stream接口(例如,`s_axis_rx_tdata`、`s_axis_rx_tvalid`、`m_axis_tx_tdata`、`m_axis_tx_tready`)。
        *   设置触发器以捕获特定TLP(例如,在`m_axis_tx_tvalid`上针对某种TLP类型触发)。
        *   这使您可以在硬件操作期间实时查看FPGA上的实际TLP位,验证您的固件是否向/从PCIe IP核发送/接收正确的数据和控制信号。

    3.  **检查时序约束**:
        *   PCIe IP核对其AXI-Stream接口有严格的时序要求。确保您的用户逻辑向`m_axis_tx_tdata`提供数据和处理`s_axis_rx_tdata`满足这些时序约束。
        *   Vivado的时序分析报告(综合和实现后)将标记任何违规。通过优化您的逻辑或在可能的情况下调整时钟来解决这些问题。

    4.  **符合性测试(高级)**:
        *   对于高保真仿真,请考虑使用专用的PCIe符合性测试套件(通常与高端协议分析仪集成)。这些测试系统地检查是否符合PCIe规范,揭示细微的协议违规。

    5.  **保存更改**:
        *   在彻底测试和验证后保存所有修改过的文件。迭代是TLP级调试的关键。

---

## **第三部分:高级技术与优化**

---

## **11. 构建、烧录与测试**

完成所有定制后,就到了验证的时刻:构建固件,将其编程到您的FPGA上,并严格测试其功能,以确保它与捐赠设备的行为完全一致。此阶段将您的设计从代码转换为可工作的硬件仿真。

### **11.1 综合与实现**

这是FPGA设计流程中的核心步骤,您的SystemVerilog高级代码将被转换为可以加载到FPGA上的低级硬件配置。

#### **11.1.1 运行综合**

综合是Vivado将您的HDL代码转换为门级网表(逻辑门及其互连的描述)的过程。它还执行初步的时序分析和资源估算。

*   **步骤**:
    1.  **开始综合**:
        *   在Vivado GUI中,在 **Flow Navigator**(流程导航器)窗格(通常在左侧)中,在“Synthesis”(综合)下,点击 **Run Synthesis**(运行综合)。
    2.  **监控进度**:
        *   Vivado将打开一个“Launch Runs”(启动运行)对话框。您通常只需点击“OK”。
        *   监控Vivado窗口底部的 **Messages**(消息)选项卡。它将显示综合运行的进度。
        *   **常见警告/错误关注点**:
            *   **`[Synth 8-327]` Unconnected Ports / Unused Inputs(未连接端口/未使用的输入)**:这表明您设计中的信号或端口未连接到任何东西。虽然有时是故意的(例如,FPGA上未使用的引脚),但它们也可能指向端口名称中的拼写错误或遗忘的连接。检查每个警告以确保这不是功能问题。
            *   **`[Synth 8-256]` Registers/Wires Not Optimized(寄存器/线未优化)**:这可能表明逻辑推断不正确,或者您有冗余逻辑可以优化。
            *   **Syntax Errors(语法错误)**:如果您的SystemVerilog代码中有致命的语法错误,综合将立即失败。请在Visual Studio Code中修复这些错误。
    3.  **审查综合报告**:
        *   成功完成后,Vivado将询问您下一步要做什么。选择 **Open Synthesized Design**(打开综合设计)或 **Open Report**(打开报告)。
        *   最重要的是,查看综合报告中的 **Utilization Summary**(资源利用率摘要)。这显示了您的设计消耗了FPGA多少资源(LUT、触发器、BRAM、DSP)。确保设计适合您的目标FPGA的容量(例如,对于Artix-7 35T,您应该在其限制内)。

#### **11.1.2 运行实现**

实现是最耗时的一步。它接收综合后的网表并将其物理映射到FPGA的资源上(放置逻辑块,布线连接),然后执行详细的时序分析,以确保设计能够以指定的时钟频率运行。

*   **步骤**:
    1.  **开始实现**:
        *   成功综合后,在 **Flow Navigator**(流程导航器)中,在“Implementation”(实现)下,点击 **Run Implementation**(运行实现)。
        *   确认“Launch Runs”(启动运行)对话框。
    2.  **监控进度**:
        *   实现包括几个阶段:Opt Design(优化设计)、Power Opt Design(功耗优化设计)、Place Design(放置设计)、Post-Placement Phys Opt Design(后放置物理优化设计)、Route Design(布线设计)、Post-Route Phys Opt Design(后布线物理优化设计)。每个阶段都可能需要大量时间。
        *   监控 **Messages**(消息)选项卡以了解进度和潜在问题。
    3.  **分析时序报告**:
        *   这是实现后*最关键的步骤*。完成后,Vivado会再次询问下一步做什么。选择 **Open Implemented Design**(打开已实现设计),或者更重要的是,选择 **Open Report**(打开报告),然后选择 **Report Timing Summary**(报告时序摘要)。
        *   **确保所有时序约束都得到满足。** 查找“WNS (Worst Negative Slack)”值。
            *   **正WNS**:表示所有时序路径都满足其要求(有余量)。这是您想要的结果。
            *   **负WNS**:表示**时序违规**,这意味着您的设计无法在所需的时钟频率下运行,或者数据可能不稳定。**这是一个必须解决的关键问题。**
        *   **解决违规**:
            *   如果您有负余量,请调查失败的具体路径。Vivado的时序报告将显示失败路径的源、目标和组件。
            *   解决方案可以包括:
                *   优化HDL代码以减少逻辑深度或关键路径延迟。
                *   添加流水线级(寄存器)以打断长组合路径。
                *   改进XDC(约束)文件,确保所有时钟都正确定义和传播。
                *   调整时钟频率(如果应用程序允许)。
                *   在Vivado中使用更快的时序收敛策略。
                *   确保您的自定义逻辑与PCIe核的AXI-Stream接口时序要求正确接口。
    4.  **验证布局(可选)**:
        *   在已实现的设计中,您可以打开“Device”(器件)视图,查看您的逻辑如何在FPGA上布局。这通常适用于高级用户,以确认关键组件是否最佳布局(例如,靠近PCIe收发器)。

#### **11.1.3 生成比特流**

比特流是最终的二进制配置文件(`.bit`扩展名),将被加载到您的FPGA上。它是综合和实现的成果。

*   **步骤**:
    1.  **生成比特流**:
        *   成功实现后(没有严重的时序违规),在 **Flow Navigator**(流程导航器)中,在“Program and Debug”(编程和调试)下,点击 **Generate Bitstream**(生成比特流)。
    2.  **等待完成**:
        *   此过程通常比实现花费的时间少,但仍可能因设计复杂性而异。
    3.  **审查比特流生成日志**:
        *   完成后,Vivado会指示成功。审查日志中是否有任何警告,但通常如果实现顺利通过,比特流生成也会顺利通过。
        *   `.bit`文件将生成在您的项目目录`pcileech_squirrel_top.runs/impl_1/`(或您的板卡类似路径)中。

### **11.2 烧录比特流**

编程(烧录)比特流会将您编译的设计加载到FPGA上,使您的仿真设备激活。

#### **11.2.1 连接FPGA设备**

*   **步骤**:
    1.  **准备硬件**:
        *   确保您的基于FPGA的DMA板卡已正确插入主机系统的兼容PCIe插槽。
        *   将JTAG编程器(例如,Digilent HS3,Xilinx Platform Cable)连接到FPGA板卡上的JTAG接口和开发PC的USB端口。
        *   打开主机系统电源。
        *   请参阅您的特定FPGA板卡手册,了解精确的电源、JTAG和PCIe连接说明。
    2.  **打开硬件管理器**:
        *   在Vivado中,导航到 **Flow Navigator > Program and Debug > Open Hardware Manager**(流程导航器 > 编程和调试 > 打开硬件管理器)。
        *   如果Vivado未运行,您可以作为独立应用程序启动硬件管理器。

#### **11.2.2 编程FPGA**

*   **步骤**:
    1.  **连接到目标**:
        *   在硬件管理器窗口中,点击 **Open Target**(打开目标)(通常是一个大按钮或链接),然后选择 **Auto Connect**(自动连接)。
        *   Vivado应该自动检测到您的JTAG编程器,然后检测到JTAG链上连接的FPGA设备。如果检测失败,请检查JTAG电缆连接、板卡电源以及PC上的JTAG驱动程序。
    2.  **编程设备**:
        *   一旦您的FPGA设备在硬件窗口中被检测并显示,**右键单击** 您的FPGA设备(例如,`xc7a35t_0`)并选择 **Program Device**(编程设备)。
        *   将出现一个对话框。点击“Bitstream file”(比特流文件)字段旁边的“...”按钮,导航到您生成的比特流文件(例如,`pcileech_squirrel_top.runs/impl_1/pcileech_squirrel_top.bit`)。
        *   点击 **Program**(编程)开始将固件烧录到FPGA上。
        *   等待编程过程完成。您将看到一个进度条。

#### **11.2.3 验证编程**

*   **步骤**:
    1.  **检查状态**:
        *   确保编程在Vivado的硬件管理器中无错误地完成。Vivado将在完成后显示“Program Device”成功消息。
    2.  **观察LED或指示灯**:
        *   许多FPGA板卡都有状态LED。成功的编程操作通常会导致特定LED亮起或改变状态(例如,“DONE”LED)。这是一个快速的视觉确认。
    3.  **主机系统重启(有时需要)**:
        *   为了让主机操作系统正确识别新编程的PCIe设备,通常需要系统重启,尤其是在Windows上,以触发完整的PCIe枚举过程。

### **11.3 测试与验证**

编程完成后,关键一步是验证您的仿真设备是否被主机正确检测,并且其功能是否按预期工作,模仿捐赠设备。

#### **11.3.1 验证设备枚举**

这证实主机操作系统根据您编程的ID将您的FPGA识别为捐赠设备。

*   **Windows**:
    *   **步骤**:
        1.  **打开设备管理器**:按下 `Win + X` 并从快速链接菜单中选择 **Device Manager**(设备管理器)。
        2.  **检查设备属性**:
            *   在适当的设备类别下查找(例如,**Network Adapters**(网络适配器)、**Storage Controllers**(存储控制器)、**System devices**(系统设备))。
            *   找到您的仿真设备。它现在应该显示为*捐赠设备的名称*(例如,“Intel(R) Ethernet Connection...”)。
            *   右键单击该设备,选择 **Properties**(属性),然后转到 **Details**(详细信息)选项卡。
            *   在“Property”(属性)下拉菜单中,选择“Hardware Ids”(硬件ID)。确认 **设备ID(DID)** 和 **厂商ID(VID)**(例如,`PCI\VEN_ABCD&DEV_1234`)与您编程到固件中的值匹配。
            *   还应检查“Class Code”(类别代码)和“Subsystem ID”(子系统ID)以进行进一步验证。
*   **Linux**:
    *   **步骤**:
        1.  **使用 `lspci`**:打开终端并使用`lspci`命令。
            ```bash
            lspci -nn # 显示厂商ID:设备ID
            lspci -vvv # 显示包括BAR、功能等详细信息
            ```
        2.  **验证设备列表**:
            *   检查仿真设备是否在`lspci`输出中显示了正确的厂商ID、设备ID和类别代码。
            *   **示例输出(仿真Intel NIC)**:
                ```
                03:00.0 Network controller [0280]: Intel Corporation Ethernet Connection I219-V [8086:1570] (rev 21)
                ```
                (`8086`是Intel的厂商ID,`1570`是I219-V的设备ID,`0280`是网络控制器类别代码)。
            *   使用`lspci -vvv`确认BAR是否以正确的大小和类型枚举,与您的捐赠设备配置匹配。

#### **11.3.2 测试设备功能**

一旦设备被枚举,最终的测试是它是否像原始设备一样工作。

*   **步骤**:
    1.  **安装必要的驱动程序**:
        *   如果主机操作系统未自动加载合适的驱动程序,您将需要手动安装捐赠设备的官方驱动程序。从制造商网站下载它们。
        *   按照制造商的说明进行安装。如果仿真成功,驱动程序应该安装并识别您的FPGA为真实硬件。
    2.  **执行功能测试**:
        *   运行通常与捐赠设备交互的应用程序或实用程序。
        *   **示例**:
            *   **网卡**:执行ping测试、浏览网页或启动大文件传输以测试吞吐量。
            *   **存储控制器**:尝试格式化模拟驱动器(如果您的仿真包括存储功能),执行读/写操作,或运行磁盘基准测试。
            *   **USB控制器**:连接USB设备(如果您的仿真包括USB主机功能)并测试它们的检测和操作。
        *   监控主机系统以获取预期的行为和性能特征。
    3.  **监控系统行为**:
        *   检查系统稳定性(Windows上没有蓝屏,Linux上没有内核崩溃)。
        *   在系统日志中查找设备特定错误(Windows上的事件查看器,Linux上的`dmesg`或`journalctl`)。
        *   确保仿真设备在各种工作负载下(包括大数据传输或压力测试)按预期运行。

#### **11.3.3 监控错误**

主动的错误监控对于识别可能不会立即导致崩溃的细微仿真问题至关重要。

*   **Windows**:
    *   **步骤**:
        1.  **检查事件查看器**:按下 `Win + X` 并选择 **Event Viewer**(事件查看器)。
        2.  **查找与PCIe相关的错误**:导航到 **Windows Logs > System**(Windows 日志 > 系统)。筛选或搜索与“PCIe”、“PCI Express”相关的警告、错误或关键事件,或源自特定设备驱动程序的事件(查找与您的仿真设备驱动程序匹配的源名称)。
            *   常见错误包括资源冲突、驱动程序初始化失败或意外的设备响应。
*   **Linux**:
    *   **步骤**:
        1.  **检查 `dmesg` 日志**:打开终端并输入:
            ```bash
            dmesg | grep -i pci # 不区分大小写地搜索pci消息
            dmesg | grep -i <VendorID> # 过滤您的设备的厂商ID
            ```
        2.  **识别问题**:查找指示PCIe链路训练问题、设备初始化问题、内存分配失败或意外DMA活动的消息。Linux内核的PCIe子系统非常详细。
    *   **Systemd Journal (现代Linux)**:
        ```bash
        journalctl -b | grep -i pci # 当前引导日志
        ```

---

## **12. 高级调试技术**

当问题出现时,特别是在复杂的PCIe设备仿真中,基本的故障排除可能不足以解决问题。高级调试工具和技术提供对FPGA内部逻辑和PCIe总线的深入可见性,使您能够高效地识别和解决问题。

### **12.1 使用Vivado的集成逻辑分析仪(ILA)**

集成逻辑分析仪(ILA)是Xilinx提供的一种强大、可配置的调试IP核,您可以直接将其嵌入到FPGA设计中。它允许您监控内部FPGA信号(线和寄存器)的实时行为,而无需外部探测硬件,其功能类似于一个强大的内部示波器或逻辑分析仪。

#### **12.1.1 插入ILA核**

*   **步骤**:
    1.  **规划您的探头**:确定您需要观察的关键信号。对于PCIe仿真,这些信号通常包括:
        *   PCIe IP核的AXI-Stream接口(例如,`s_axis_rx_tdata`、`s_axis_rx_tvalid`、`m_axis_tx_tdata`、`m_axis_tx_tready`)。
        *   内部状态机信号(`current_state`、`next_state`)。
        *   BAR地址解码输出(`bar_hit[0]`、`bar_hit[1]`)。
        *   自定义寄存器值(`custom_control_reg`、`custom_status_reg`)。
        *   中断请求信号(`msi_trigger_signal`)。
    2.  **添加ILA IP核**:
        *   在Vivado中,打开 **IP Catalog**(IP目录)(通常在 **Flow Navigator**(流程导航器)窗格中)。
        *   搜索“ILA”(Integrated Logic Analyzer)。
        *   双击“Debug Bridge”(用于基本ILA)或“Integrated Logic Analyzer (ILA)”以打开其定制GUI。
        *   配置ILA:
            *   设置您需要的**捕获数据端口数量**(探头)。
            *   设置每个探头的**宽度**以匹配您计划连接的信号。
            *   配置**采样深度**(在触发前/后存储多少个样本)。更深的深度会消耗更多BRAM。
            *   点击“OK”并让Vivado生成IP。
    3.  **实例化并连接信号**:
        *   Vivado将生成ILA的`.xci`文件。您可以将其直接实例化在您的顶层SystemVerilog文件(例如,`pcileech_squirrel_top.sv`)中,或在可用信号的模块中。
        *   **示例(在`pcileech_squirrel_top.sv`或子模块中):**
            ```verilog
            // 假设您已从IP Catalog生成了ila_0
            // 连接到您设计的时钟和感兴趣的信号
            ila_0 your_ila_instance (
                .clk(clk_125mhz), // 连接到您设计中稳定的时钟,通常是PCIe用户时钟
                .probe0(pcie_s_axis_rx_tdata),    // 示例:PCIe入站TLP数据
                .probe1(pcie_s_axis_rx_tvalid),   // 示例:PCIe入站TLP有效
                .probe2(pcie_m_axis_tx_tdata),    // 示例:PCIe出站TLP数据
                .probe3(my_bar_controller_state), // 示例:您的BAR逻辑状态
                .probe4(my_custom_register),      // 示例:自定义寄存器的值
                // 根据需要添加更多探头
                .probeN(signal_to_monitor_N)
            );
            ```
        *   **替代方法(标记用于调试):** 对于更简单的信号,有时可以直接在HDL代码中标记它们用于调试。使用`(* mark_debug = "true" *) wire my_signal;` 或 `(* mark_debug = "true" *) reg my_register;`。Vivado随后会自动建议将它们添加到ILA中。

#### **12.1.2 配置触发条件**

当您配置智能触发条件以精确地在感兴趣的事件发生时(例如,错误、特定TLP类型、状态转换)捕获数据时,ILA最强大。

*   **步骤**:
    1.  **生成带有ILA的比特流**:插入并连接ILA后,您必须运行综合、实现并生成新的比特流。ILA核消耗FPGA资源,并将嵌入到您的设计中。
    2.  **打开硬件管理器**:使用支持ILA的比特流编程您的FPGA(第11.2节)。然后,在Vivado中,打开硬件管理器并连接到您的目标。
    3.  **访问ILA仪表板**:在硬件管理器中,选择您的ILA实例(例如,`hw_ila_1`)。这将打开ILA仪表板。
    4.  **定义触发器**:
        *   选择要用作触发输入的探头。
        *   设置特定的**触发模式**(例如,`pcie_s_axis_rx_tdata`为`0x4A`以触发完成TLP)。
        *   配置**触发条件**(例如,“等于”、“不等于”、“上升沿”、“下降沿”)。
        *   设置**触发位置**(在触发事件*之前*捕获多少样本,用于预触发可见性)。
        *   您可以设置多个触发序列以检测复杂事件。
        *   **触发器示例场景**:
            *   在收到的TLP中触发特定的`Fmt/Type`以分析传入命令。
            *   当特定寄存器(`my_custom_register`)达到某个值时触发。
            *   在`pcie_m_axis_tx_tvalid`断言 AND `pcie_m_axis_tx_tdata[3:0]` == `4'hC`(用于内存写入TLP)时触发,以分析出站写入。
            *   在错误信号断言时触发。

#### **12.1.3 捕获和分析数据**

*   **步骤**:
    1.  **运行设计**:让您的主机系统与已编程的FPGA交互,从而引发您要调试的事件。
    2.  **布防ILA**:在ILA仪表板中,点击 **Run Trigger**(运行触发器)按钮(通常是绿色的“播放”图标)。ILA将等待定义的触发条件。
    3.  **捕获数据**:一旦满足触发条件,ILA将把信号快照捕获到其内部内存缓冲区中。
    4.  **分析波形**:
        *   捕获的数据将出现在波形查看器中。
        *   检查信号随时间的变化行为。放大、添加光标并解码值。
        *   寻找:
            *   **意外的跳变**:信号在错误的时间改变。
            *   **不正确的值**:寄存器中保存了错误的数据。
            *   **协议违规**:您的逻辑在PCIe接口上发送了不正确的数据。
            *   **时序问题**:如果信号在预期时不稳定(尽管完整的时序分析在实现中完成,但ILA显示运行时行为)。
        *   将捕获到的行为与您的预期设计逻辑和捐赠设备的观察行为(如果您使用协议分析仪捕获了它)进行比较。

### **12.2 PCIe流量分析工具**

虽然ILA提供了FPGA内部可见性,但外部PCIe流量分析工具提供了对您的仿真设备和主机之间PCIe总线上实际通信的无与伦比的视图。这对于验证协议符合性和调试链路级问题至关重要。

#### **12.2.1 PCIe协议分析仪(硬件)**

*   **示例**:
    *   **Teledyne LeCroy PCIe 分析仪**:深度分析的黄金标准,完整的协议解码,高级触发,以及错误注入功能。
    *   **Keysight PCIe 分析仪**:另一个领先的供应商,具有类似的高端功能。
*   **步骤**:
    1.  **设置分析仪**:将硬件分析仪串联连接在主机系统的PCIe插槽和您的基于FPGA的DMA设备之间。这通常涉及一个特殊的中间卡。
    2.  **配置捕获设置**:使用分析仪的软件定义要捕获的流量。您可以按TLP类型、地址、请求者ID、错误条件等进行过滤,以关注相关事件。
    3.  **捕获流量**:在主机上运行您的仿真设备。分析仪将被动记录所有PCIe事务。
    4.  **分析结果**:
        *   使用分析仪强大的软件查看解码的TLP、事务列表和波形视图。
        *   **检查TLP的符合性和正确性**:所有字段都正确吗?序列是否正确?
        *   **识别任何协议违规或意外行为**:这是您发现驱动程序可能失败的原因(例如,您的设备发送了带数据的完成,而规范要求不带数据的完成,或者响应太慢)。
        *   **与捐赠设备捕获进行比较**:直接比较您的仿真设备捕获的流量与您从真实捐赠设备捕获的流量。这是仿真准确性的最终测试。

#### **12.2.2 基于软件的工具**

对于基本的PCIe总线检查,或者在没有专用硬件分析仪的情况下,一些软件工具可以提供有限的洞察。

*   **示例**:
    *   **Wireshark with PCIe Plugins**:虽然Wireshark主要用于网络流量,但通过专用硬件(例如,将PCIe跟踪暴露给操作系统的网卡,或特定的捕获硬件/驱动程序),它有时可以捕获和解码PCIe数据包。这高度依赖于系统。
    *   **ChipScope Pro(传统Xilinx,现已集成到Vivado中)**:Integrated Logic Analyzer (ILA) 是现代的等效工具,但ChipScope曾是一个独立工具。
    *   **`lspci` (Linux)**:如第11.3.1节所述,`lspci -vvv`提供了广泛的静态配置空间信息。您可以将其与`watch`或脚本结合使用来监控随时间的变化。
    *   **`pcileech`客户端(来自PCILeech框架)**:`pcileech`客户端软件本身可以通过您的FPGA执行内存和配置空间的读写操作,并可用于测试基本的DMA功能。虽然不是“流量分析仪”,但它对于测试功能接口至关重要。
*   **步骤**:
    1.  **安装必要的工具/插件**:确保工具已安装并配置了任何所需的驱动程序或插件。
    2.  **监控PCIe总线**:运行软件工具以捕获和显示PCIe相关信息。
    3.  **分析通信**:
        *   查找设备配置中的差异。
        *   如果工具支持,分析捕获数据包的结构是否存在异常或错误。
        *   验证您的仿真设备是否正确响应了配置请求。

---

## **13. 故障排除**

本节提供了在PCIe设备仿真定制固件开发、比特流编程和硬件测试过程中可能遇到的常见问题的解决方案。固件调试可能具有挑战性,因此采用系统方法是关键。

### **13.1 设备检测问题**

**问题**:您的基于FPGA的DMA设备在编程后未被主机系统识别,或者在设备管理器/lspci中显示为不正确的ID(例如,“未知设备”)或错误符号。

#### **可能原因及解决方案**:

1.  **设备ID、厂商ID、子系统ID或类别代码不正确**:
    *   **原因**:最常见的原因。您编程到FPGA固件中的识别值与主机操作系统预期或您打算仿真的值不匹配。
    *   **解决方案**:
        *   **验证**:仔细检查`pcileech_pcie_cfg_a7.sv`(或等效文件)中的所有`cfg_deviceid`、`cfg_vendorid`、`cfg_subsysid`、`cfg_subsysvendorid`、`cfg_revisionid`和`cfg_classcode`参数,与您精心记录的捐赠设备信息(来自第5节)进行比对。
        *   **一致性**:确保这些值在Vivado PCIe IP核定制GUI(第7.2.2节)中也保持一致设置。
        *   **重新构建并重新烧录**:进行任何更改后,始终重新综合、重新实现、生成新的比特流并重新烧录FPGA(第11.1、11.2节)。
        *   **重启主机**:烧录后务必重启主机系统,因为Windows通常需要完全重启才能正确重新枚举PCIe设备。

2.  **PCIe链路训练失败**:
    *   **原因**:主机根联合体与您的FPGA卡之间的基本PCIe链路未能建立。这发生在任何配置空间读取之前。症状包括设备完全不出现(`lspci`在该总线/插槽上没有任何显示,或设备管理器显示“PCI Express Root Port”错误)。
    *   **解决方案**:
        *   **物理连接**:确保FPGA板卡牢固地插入PCIe插槽,并且所有电源连接都牢固。如果可能,尝试不同的PCIe插槽。
        *   **电源**:验证FPGA板卡是否获得足够的电源。某些板卡需要辅助PCIe电源连接器。
        *   **链路速度/宽度**:
            *   检查Vivado PCIe IP核中的`Max Link Speed`和`Link Width`设置(第8.1.1节)。
            *   尝试将链路速度设置为较低的代数(例如,Gen1 / 2.5 GT/s)并将宽度设置为x1,即使您的板卡支持更高。有时,在较高速度下与特定主板会产生兼容性问题。
            *   检查主板BIOS设置中的PCIe插槽速度选项。
        *   **复位**:确保FPGA的复位逻辑正确实现(例如,与PCIe参考时钟同步),并在上电/重启时正确断言/去断言。
        *   **PCIe IP核**:确保PCIe IP核正确实例化,并且其时钟和复位在您的顶层设计中正确连接。

3.  **电源问题(电源不足或不稳定)**:
    *   **原因**:FPGA板卡未获得足够的稳定电源,或电源供应不稳定,导致操作不可靠。
    *   **解决方案**:
        *   **验证连接**:仔细检查所有电源线(主PCIe插槽电源、辅助PCIe电源、如果使用则包括外部直流插孔)。
        *   **电源供应**:确保您的主机系统电源(PSU)具有足够的瓦数和稳定的12V电压轨。对于高功耗FPGA,弱电源可能导致问题。
        *   **外部电源**:如果板卡有外部电源插孔,请确保使用正确电压和电流额定值的电源。

4.  **固件错误(早期阶段)**:
    *   **原因**:SystemVerilog代码中的逻辑错误,特别是顶层模块或PCIe核的包装器中,导致PCIe核无法初始化或正确呈现自身。
    *   **解决方案**:
        *   **Vivado消息**:仔细检查Vivado的综合和实现日志中与PCIe IP核相关的**严重警告**或**错误**。这些通常是配置错误或连接不当的指示。
        *   **ILA调试**:如果链路尝试训练但失败,请使用连接到PCIe IP核的状态信号(例如,`link_up`、`link_speed`、`link_width`)和AXI-Stream接口的ILA(第12.1节),以查看链路协商在哪个点失败,或者核是否生成了意外流量。

### **13.2 内存映射和BAR配置错误**

**问题**:仿真设备已检测到,但当主机操作系统或驱动程序尝试通过BAR访问其内存映射寄存器或缓冲区时,系统崩溃、冻结或报告错误。

#### **可能原因及解决方案**:

1.  **BAR大小或类型不正确(IP核和固件)**:
    *   **原因**:您在Vivado PCIe IP核(第7.2.2节)中配置的BAR大小或类型(32位/64位、内存/I/O、可预取/不可预取)和/或在`pcileech_tlps128_bar_controller.sv`中处理的值与捐赠设备实际提供的值不匹配。这可能导致主机分配不正确的地址空间或尝试不支持的访问。
    *   **解决方案**:
        *   **交叉验证**:返回到您的Arbor/协议分析仪数据(第5节),重新验证每个BAR配置(大小、类型、可预取)。
        *   **一致性**:确保这些值在PCIe IP核定制中完全匹配,并且您的`bar_controller`逻辑正确处理每个BAR的大小(地址解码范围)和类型。
        *   **BRAM大小**:如果您的BAR映射到BRAM,请确认BRAM IP核的大小(第8.2.1节)与BAR大小完全匹配。

2.  **固件中的地址解码错误**:
    *   **原因**:您的`pcileech_tlps128_bar_controller.sv`(或自定义BAR逻辑)错误地解释了传入的PCIe地址,导致访问了不正确的内部寄存器或内存位置。
    *   **解决方案**:
        *   **审查逻辑**:仔细审查`bar_controller`中的`case`语句和地址计算。
        *   **仿真**:在您的SystemVerilog测试平台中开发特定的测试用例,模拟主机对每个BAR中不同偏移量的读写访问。验证内部`bar_hit`信号是否正确,以及数据是否正确路由到/从正确的内部寄存器/BRAM。
        *   **ILA调试**:在`req_addr`、`req_write`、`req_read`、`req_data`、`rsp_data`以及`bar_controller`中与您的地址解码和寄存器访问相关的内部信号上放置ILA探头。实时观察地址如何解码以及正在读/写的数据。

3.  **内部地址空间重叠**:
    *   **原因**:虽然PCIe标准确保不同设备的BAR在主机的内存映射中不重叠,但在FPGA*内部*,您可能会意外地将不同的逻辑组件映射到单个BAR中的相同物理地址空间。
    *   **解决方案**:
        *   **仔细映射**:在BAR中定义内部寄存器和内存块时,显式为每个寄存器和内存块分配唯一的、不重叠的偏移量。使用`localparam`来定义这些偏移量以防止错误。
        *   **设计审查**:需要对您的`bar_controller`进行彻底的设计审查,以确保每个地址范围都得到唯一处理。

4.  **BRAM访问问题**:
    *   **原因**:您的逻辑与BRAM IP核接口存在问题(例如,不正确的BRAM时钟、异步复位、错误的字节使能或不正确的写入使能逻辑)。
    *   **解决方案**:
        *   **BRAM文档**:查阅Xilinx BRAM IP核文档,了解正确的实例化和接口信号。
        *   **ILA**:在BRAM接口信号(地址、写入使能、数据输入、数据输出)上放置ILA探头,以验证您的逻辑是否向BRAM发送了正确的控制信号。

### **13.3 DMA性能和TLP错误**

**问题**:设备已检测到并功能上看起来正常,但在大型DMA操作期间,数据传输速率缓慢,或者系统间歇性崩溃、挂起或报错。PCIe协议分析仪报告TLP格式错误或流控制问题。

#### **可能原因及解决方案**:

1.  **TLP格式错误(报头/载荷)**:
    *   **原因**:您的固件生成的TLP(特别是您的FPGA作为DMA主设备时发送的完成或出站内存写入)具有不正确的报头、长度、字节使能或载荷。主机系统的PCIe核或驱动程序将其检测为违规。
    *   **解决方案**:
        *   **PCIe协议分析仪**:这是最好的工具(第12.2.1节)。捕获流量并仔细比较您生成的TLP与PCIe规范,更重要的是,与您*真实捐赠设备*的捕获进行比较。
        *   **TLP生成逻辑**:审查您的TLP组装代码(`pcileech_pcie_tlp_a7.sv`及相关模块)。确保所有字段(Fmt、Type、Requester ID、Tag、Completion ID、Length、Byte Enables、Address)都正确派生并打包到TLP结构中。
        *   **错误检查**:在固件中实现基本的错误检查(例如,检查是否存在意外的`req_valid`而没有`req_ready`,反之亦然)。

2.  **流控制问题**:
    *   **原因**:PCIe使用基于信用的流控制机制。如果您的固件(或PCIe IP核与其的交互)错误地管理信用,可能导致死锁、超时或丢包。症状包括PCIe链路“停滞”、超时或低吞吐量。
    *   **解决方案**:
        *   **PCIe IP核配置**:确保Vivado PCIe IP核定制中的流控制设置适用于您预期的流量模式。默认设置通常是健壮的。
        *   **用户逻辑反压**:您的用户逻辑向PCIe IP核发送TLP(`m_axis_tx_*`接口)*必须*遵守来自IP核的`m_axis_tx_tready`信号。如果`tready`被去断言,您*必须*暂停发送数据。否则将导致核的缓冲区溢出。
        *   **ILA调试**:将ILA探头连接到PCIe IP核的流控制接口信号和您的用户逻辑,以观察`tvalid`/`tready`握手是否正常工作。

3.  **DMA逻辑效率低下/缓冲问题**:
    *   **原因**:FPGA内部的DMA引擎实现(读取/写入主机内存数据的部分)未优化,导致瓶颈。这可能涉及:
        *   缺少流水线。
        *   BRAM使用效率低下。
        *   外部内存访问延迟导致的停滞。
        *   突发大小过小。
    *   **解决方案**:
        *   **流水线**:将长组合路径分解为更小、更连续的阶段,使用寄存器。这允许更高的时钟频率和更好的吞吐量。
        *   **缓冲**:使用FIFO(先进先出缓冲区)来解耦发送方和接收方逻辑,平滑数据流并防止停滞。
        *   **突发传输**:利用PCIe执行突发读/写的能力以提高效率。确保您的DMA逻辑以适当的突发大小请求和处理数据。
        *   **内存带宽**:确保您的BRAM或外部DDR内存接口能够足够快地提供/消耗数据,以满足您所需的DMA速率。
        *   **ILA**:监控您的DMA引擎的内部状态、读写指针和数据路径信号,以识别瓶颈。

4.  **完成超时/不支持的请求**:
    *   **原因**:主机发送请求(例如MRd、CfgRd),但您的FPGA设备未在允许的超时时间内响应完成TLP,或者它以错误状态(例如,带有Unsupported Request (UR) 或 Completer Abort (CA) 的完成)进行响应。
    *   **解决方案**:
        *   **响应逻辑**:验证您的`bar_controller`(用于MRd)和`pcileech_pcie_cfg_a7.sv`(用于自定义配置空间的CfgRd)是否正确识别请求并生成适当的完成。
        *   **超时值**:审查您的捐赠设备预期的完成延迟。虽然PCIe定义了默认超时,但某些驱动程序可能对此敏感。
        *   **ILA/协议分析仪**:对于查明*为什么*未发送完成或完成格式错误至关重要。请求TLP是否甚至到达了您的用户逻辑?您的逻辑是否生成了响应?PCIe核是否成功发送了响应?

---

## **14. 仿真精度与优化**

实现真正令人信服的仿真意味着让您的基于FPGA的设备与捐赠设备难以区分,不仅在ID上,而且在行为上。这需要对时序、响应速度和微妙的操作细节进行细致的关注。

### **14.1 精确定时仿真技术**

精确的时序在硬件中至关重要,特别是对于PCIe这样的高速接口。不匹配可能导致驱动程序超时、数据解释不正确或系统不稳定。

*   **实现时序约束(XDC文件)**:
    *   **目的**:时序约束是 Vivado 综合和实现工具的指令,告诉它们您的设计需要运行多快。它们定义了时钟周期、输入/输出延迟和路径延迟。
    *   **用法**:PCILeech-FPGA项目包含 XDC 文件(例如,`pcileech_squirrel_top.xdc`),它们定义了主时钟(例如,`create_clock -name sys_clk_p -period 8.0 [get_ports sys_clk_p]`)。
    *   **优化**:如果您的仿真需要非常特定的内部时序或对时间敏感的命令做出反应,您可能需要在自定义逻辑中添加进一步的约束(`set_max_delay`、`set_input_delay`、`set_output_delay`)到关键路径。
    *   **目标**:确保 Vivado 在实现后报告所有路径的 **正 WNS(最差负余量)**,表明设计满足其时序要求。

*   **使用时钟域交叉(CDC)技术**:
    *   **目的**:PCIe设计通常涉及多个时钟域(例如,125MHz PCIe用户时钟,自定义逻辑的单独时钟)。在这些域之间异步移动信号(没有适当的同步)可能导致**亚稳态**,从而导致不可靠的行为。
    *   **实现**:对于跨时钟域的信号,始终使用适当的CDC电路:
        *   **双触发器同步器**:用于单比特控制信号。
        *   **异步FIFO(先进先出)**:用于多比特数据路径,提供时钟域之间的数据缓冲和流控制。
        *   **格雷码编码器/解码器**:用于跨域的计数器或地址,以确保每次只有一个比特发生变化。
    *   **Vivado 工具**:Vivado 包含 CDC 分析工具(例如,`report_cdc`),可以识别潜在的亚稳态问题。

*   **使用时间精确模型仿真设备行为**:
    *   **高级测试平台**:使用 SystemVerilog 测试平台,其中包含真实的定时延迟,甚至提供时间精确的 PCIe 总线功能模型(BFM)。
    *   **验证**:这使您可以观察您的仿真设备的内部状态以及外部 TLP 生成/响应时序在各种条件下如何表现,确保它们与您捕获的捐赠设备行为相匹配。

### **14.2 对系统调用的动态响应**

真正精确的仿真不仅能呈现正确的ID;它还能智能且动态地响应主机系统的命令和查询,模仿真实、活动设备的行为。

*   **实现设备控制的状态机**:
    *   **目的**:设计健壮的 SystemVerilog 状态机来管理设备的操作模式、命令处理和数据流。
    *   **响应性**:确保状态机能够逻辑地、快速地响应传入命令(例如,写入 BAR 中的控制寄存器,特定的 TLP)。
    *   **优雅处理**:状态机应能够优雅地处理意外或无序的请求,可能返回错误 TLP 或仅仅忽略无效命令,而不是崩溃或冻结。

*   **监控和响应主机命令(超越简单的读写)**:
    *   **配置写入**:除了初始枚举之外,驱动程序通常会写入配置空间寄存器以启用功能、设置阈值或清除状态位。您的固件必须处理这些写入并相应地更新内部状态。
    *   **厂商特定命令**:如第9.2节所述,如果捐赠设备具有专有命令(通过自定义寄存器或厂商定义消息访问),您的固件必须解析这些命令并触发适当的仿真行为。
    *   **电源管理命令**:通过启用/禁用内部逻辑并确认状态更改来响应主机发起的电源状态转换(D0、D1、D3hot 等)。
    *   **中断确认**:如果主机驱动程序通过写入特定寄存器来确认中断,请确保您的固件能够检测到此并清除内部中断请求。

*   **优化固件逻辑以提高响应性**:
    *   **降低延迟**:关键数据路径和控制路径应优化,以最小化组合逻辑深度和流水线停顿。
    *   **并行性**:利用 FPGA 固有的并行性来同时执行多个操作,提高吞吐量和响应时间。
    *   **高效内存访问**:优化对内部 BRAM 或外部 DDR 内存的访问,以确保在需要时为 DMA 传输或寄存器读取提供数据。
    *   **硬件加速**:对于捐赠设备执行的复杂计算或数据操作,请考虑在 FPGA 上实现专用的硬件加速器,而不是尝试以缓慢、类似软件的方式执行它们。

---

## **15. 固件开发最佳实践**

在定制固件开发中遵循最佳实践对于保持代码质量、促进协作(如果团队合作)、简化调试以及确保项目的长期可维护性和可靠性至关重要。这对于安全敏感的应用尤为如此。

### **15.1 持续测试与文档**

*   **定期、增量测试**:
    *   **单元测试**:使用专用测试平台隔离测试小型独立模块(例如,TLP解析器、寄存器块)。
    *   **集成测试**:验证不同模块是否协同工作。
    *   **系统测试**:烧录后,与主机系统执行端到端测试,确保整体功能。
    *   **尽早测试,经常测试**:在每次重大更改后,无论多小,都要测试固件,以便尽早发现问题,此时问题更容易调试。

*   **自动化测试(高级)**:
    *   对于复杂项目,在主机端实现自动化测试脚本(例如,使用Python和硬件抽象层)以重复验证功能和性能。
    *   在团队环境中,考虑与持续集成(CI)工具(例如,Jenkins、GitLab CI)集成,以自动化每次代码提交的构建、测试和静态分析。

*   **维护全面的文档**:
    *   **设计文档**:创建并更新描述固件架构的文档,包括:
        *   **框图**:说明主要模块及其互连。
        *   **状态机图**:适用于所有有状态逻辑。
        *   **接口规范**:详细说明模块之间的输入/输出信号、时序和协议。
        *   **内存映射**:针对所有BAR,定义寄存器地址、位域及其功能。
    *   **代码注释**:在SystemVerilog代码中使用清晰、简洁的注释来解释复杂的逻辑、信号的目的以及任何不明显的设计选择。
    *   **更改日志/提交消息**:维护更改日志或使用详细的Git提交消息来跟踪所有修改、错误修复和功能添加,解释*为什么*进行更改。
    *   **用户指南**:对于您的定制固件,一个简单的用户指南,解释如何从主机端构建、烧录和与仿真设备交互,是无价的。

### **15.2 管理固件版本**

正确的版本控制对于跟踪更改、有效协作和管理发布至关重要。

*   **使用版本控制系统(VCS)**:
    *   **Git**:强烈推荐。使用Git管理您的HDL源代码、约束文件和项目脚本。
    *   **组织仓库**:保持清晰的目录结构(例如,为`src`、`xdc`、`ip`、`scripts`、`doc`等设置单独的文件夹)。
    *   **分支**:使用功能分支开发新功能或进行重大更改。在彻底测试后合并回`main`或`develop`分支。
    *   **定期提交**:频繁提交,提交内容原子化,提交消息有意义。

*   **标记发布和里程碑**:
    *   **稳定版本**:使用Git标签(例如,`v1.0.0`、`v1.0.1_bugfix`)标记固件的稳定、经过测试的版本。这使得回溯或部署已知良好状态变得容易。
    *   **里程碑**:标记重要的开发里程碑(例如,“基本枚举工作正常”、“DMA读/写功能正常”)。

*   **备份和恢复策略**:
    *   **基于云的仓库**:将您的Git仓库托管在GitHub、GitLab或Bitbucket等平台上。这提供了异地备份并促进了协作。
    *   **本地备份**:即使有云仓库,也要定期对整个Vivado项目目录进行本地备份(由于生成的文件,它可能非常大)。

### **15.3 安全注意事项**

开发用于PCIe设备仿真(特别是能够直接内存访问的设备)的定制固件具有重要的安全影响。这项技术本质上是一种“两用”能力,意味着它既可以用于合法目的(例如,硬件测试、安全研究),也可以用于恶意目的(例如,DMA攻击、安全绕过)。**理解并负责任地管理这些风险至关重要。**

*   **两用性质与道德影响**:
    *   **道德黑客行为与恶意使用**:明确区分将这些知识用于授权安全测试(红队演练、渗透测试)和未经授权的非法活动。
    *   **负责任的披露**:如果您使用这些技术发现漏洞,请遵循负责任的披露准则。
    *   **法律和许可合规性**:了解并遵守所有与硬件逆向工程和设备修改相关的法律、法规和许可协议(例如,PCIe-SIG规范、Xilinx EULA)。
    *   **“武器化”**:认识到精确仿真受信任硬件的能力可以被武器化用于高级持久威胁(APTs)或复杂恶意软件。

*   **理解攻击向量(攻击视角)**:
    *   **内存窃取**:恶意仿真设备可以执行DMA读取,以访问任何物理内存地址,包括内核、用户进程中的敏感数据、加密密钥或网络缓冲区。
    *   **内存注入/修改**:恶意仿真设备可以执行DMA写入以任意修改内存,从而实现:
        *   **权限提升**:修改内核数据结构(例如,进程令牌、SID)以获得管理员或系统权限。
        *   **代码注入**:将恶意代码注入正在运行的进程或内核,然后触发其执行。
        *   **安全软件绕过**:通过直接修改内存来禁用或颠覆端点检测和响应(EDR)、防病毒或防火墙软件。
    *   **模糊测试和崩溃**:发送格式错误或不符合规范的TLP/命令,以触发驱动程序漏洞,导致系统崩溃(蓝屏死机)或潜在的可利用内存损坏。
    *   **固件/BIOS操作**:在某些高级场景中,DMA设备可能能够与包含BIOS/UEFI的主机SPI闪存进行交互,可能用于持久性修改。

*   **防御措施和缓解策略(防御视角)**:
    *   **IOMMU/VT-d/AMD-Vi**:如第3.2节所述,这些技术旨在通过为外设提供内存保护来缓解DMA攻击。**对于合法测试,您会禁用它们,但在生产系统中,它们应始终启用。** 它们阻止外设未经授权的内存访问。
    *   **内核DMA保护(Windows)/ Thunderbolt安全(Linux)**:现代操作系统功能专门解决“冷启动”DMA攻击(攻击者在系统关闭或锁定时连接恶意设备)。在生产系统上保持这些功能启用。
    *   **安全启动**:虽然不是直接的DMA保护,但安全启动有助于确保只加载受信任的引导加载程序和内核模块,从而减少攻击者注入恶意内核组件以绕过DMA保护的机会。
    *   **物理安全**:最基本但最关键的防御。如果攻击者可以物理访问PCIe插槽或Thunderbolt端口,他们可以绕过许多软件保护。保护对关键系统的物理访问。
    *   **驱动程序强化**:驱动程序应以防御性方式编写,严格验证来自硬件的所有输入并在严格的内存边界内操作。
    *   **内存强化**:操作系统级的内存保护(例如KASLR、DEP、SMAP/SMEP)有助于减少内存损坏的影响,但直接DMA攻击会绕过这些保护。
    *   **监控和日志记录**:虽然在硬件层面很难,但异常的DMA活动或未知PCIe设备的枚举应在安全监控系统中触发警报。

*   **固件安全编码实践**:
    *   **输入验证**:如果您的固件接受任何输入(例如,通过UART调试接口,或由主机写入的内部寄存器),请严格验证它们,以防止缓冲区溢出、整数溢出或意外行为。
    *   **最小权限**:设计您的固件逻辑,使其仅执行其功能绝对必要的操作。避免授予不必要的功能。
    *   **状态管理**:实现健壮的状态机,以防止由于无效状态转换而导致的意外行为。
    *   **无硬编码秘密**:避免直接在固件中嵌入敏感信息(例如,加密密钥、硬编码凭据),如果它们可以轻易被提取。
    *   **篡改检测**:对于生产固件,考虑实现检测固件本身是否已被篡改或是否加载了未经授权配置的机制。

---

## **16. 其他资源**

为了加深您对FPGA开发、PCIe和硬件安全等动态领域的理解并保持更新,请查阅以下资源:

*   **Xilinx (AMD) 文档**:您获取Vivado和Xilinx FPGA所有信息的主要来源。
    *   **主文档门户**:[https://docs.amd.com/](https://docs.amd.com/)(原Xilinx.com/support/documentation)。
    *   **Vivado 设计套件用户指南**:
        *   **UG900 - 入门指南**:Vivado新用户必备。
        *   **UG901 - 逻辑综合**:深入了解综合。
        *   **UG904 - 实现**:关于放置和布线的详细指南。
        *   **UG912 - Tcl 命令参考指南**:对于脚本编写价值巨大。
        *   **UG939 - 调试**:ILA和其他调试功能的综合指南。
    *   **PCI Express IP 核用户指南**:理解Xilinx PCIe IP至关重要(例如,**PG054 for 7 Series Integrated Block for PCI Express**)。在文档门户上搜索“PCI Express”。这详细介绍了核的配置、接口和限制。

*   **PCI-SIG 规范**:PCIe 标准的权威来源。
    *   **PCI Express Base Specification**:基础文档。虽然不公开免费,但基于它的摘要和教育材料广泛可用。您通常可以在其网站上找到信息:[https://pcisig.com/specifications](https://pcisig.com/specifications)(注意:完整规范通常需要PCI-SIG会员资格)。

*   **FPGA 教程和学习平台**:
    *   **FPGA4Fun**:[http://www.fpga4fun.com/](http://www.fpga4fun.com/) - 一个经典网站,提供许多实用的FPGA项目和教程。
    *   **Verilog/VHDL 教程**:
        *   **ASIC World Verilog 教程**:[https://www.asic-world.com/verilog/index.html](https://www.asic-world.com/verilog/index.html) - 很好的Verilog基础参考。
        *   **VHDLwhiz**:[https://www.vhdlwhiz.com/](https://www.vhdlwhiz.com/) - VHDL 参考和教程。
    *   **Stack Overflow (FPGA/Verilog/PCIe 标签)**:[https://stackoverflow.com/questions/tagged/fpga](https://stackoverflow.com/questions/tagged/fpga) - 社区驱动的针对特定技术问题的问答。

*   **PCIe 协议分析工具**:
    *   **Teledyne LeCroy Protocol Analyzers**:[https://teledynelecroy.com/protocolanalyzer/](https://teledynelecroy.com/protocolanalyzer/) - 探索他们的高性能PCIe分析仪和软件系列。
    *   **Telescan PE Software**:[https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software](https://www.teledynelecroy.com/protocolanalyzer/pci-express/telescan-pe-software/resources/analysis-software) - 一款免费软件工具,提供一些PCIe分析功能(需要注册)。

*   **PCILeech 社区和资源**:
    *   `ufrisk/pcileech` GitHub 仓库是核心。积极关注其更新和问题。
    *   寻找致力于PCILeech或类似开源DMA项目的社区论坛或Discord服务器。

*   **硬件安全与逆向工程**:
    *   关于硬件黑客、逆向工程和低级系统利用的书籍。
    *   Black Hat、DEF CON、Recon 和 Troopers 等会议通常会举办关于 PCIe 和 DMA 攻击的讲座。
    *   专注于硬件的安全研究人员的博客和研究论文。

---

## **17. 联系方式**

如果您需要帮助、有疑问或希望就本指南、固件开发或硬件安全相关主题进行合作,请随时联系。我乐意提供指导、解决复杂问题或详细讨论想法。

### **Discord**:
*   **用户**:[**VCPU**](https://discord.com/users/196741541094621184)
*   **服务器邀请链接**:[**加入硬件黑客与固件开发Discord**](https://discord.gg/dS2gDUDQmV)

---

## **18. 支持与贡献**

您的支持有助于维护和改进本指南及相关项目。创建和更新全面的技术文档以及开源硬件项目需要大量时间和精力。

### **捐赠**

如果您觉得本指南有帮助并希望支持正在进行的工作,请考虑捐赠。每一笔捐款,无论大小,都有助于我们继续通过进一步的研究、开发和文档工作来创建、分享和支持社区。

*   **加密货币捐赠(LTC - 莱特币)**:
    *   **地址**:`MPMyQD5zgy2b2CpDn1C1KZ31KmHpT7AwRi`

**特别奖励**:如果您捐赠,请随时在Discord上(VCPU)与我联系,以获得个人感谢,并可能获得额外资源、新内容的早期访问或项目上的个性化帮助。

**注意**:如果您需要我审查您实现的特定部分、解决问题或提供详细的代码反馈,请在您的代码中用`//VCPU-REVIEW//`注释标记相关部分,并提供您遇到的问题或疑问的详细说明。这有助于我集中精力并提供最有效的支持。

愿上帝保佑您的灵魂。

---

**指南结束**


================================================
FILE: CN/核对表.md
================================================
# 固件修改清单

使用此清单来指导您的固件创建过程。

---

## **1. 收集捐赠设备信息**

从捐赠的PCIe设备收集以下信息:

- [ ] **设备ID** (`0xXXXX`)
- [ ] **供应商ID** (`0xYYYY`)
- [ ] **子系统ID** (`0xZZZZ`)
- [ ] **子系统供应商ID** (`0xWWWW`)
- [ ] **修订ID** (`0xRR`)
- [ ] **类代码** (`0xCCCCCC`)
- [ ] **基地址寄存器(BARs)配置**:
  - [ ] **BAR0**至**BAR5**的大小、类型(内存或I/O)、可预取状态
- [ ] **功能**:
  - [ ] 电源管理设置
  - [ ] MSI/MSI-X设置
- [ ] **设备序列号(DSN)** (`0xXXXXXXXXYYYYYYYY`)

---

## **2. 修改固件配置文件**

### **2.1. 打开固件配置文件**

- [ ] **要编辑的文件**:`pcileech_pcie_cfg_a7.sv`
- [ ] **位置**:`pcileech-fpga/pcileech-wifi-main/src/pcileech_pcie_cfg_a7.sv`

### **2.2. 更新设备和供应商ID**

- [ ] **修改** `cfg_deviceid`:

  ```verilog
  cfg_deviceid <= 16'hXXXX;  // 将XXXX替换为捐赠设备的设备ID
  ```

- [ ] **修改** `cfg_vendorid`:

  ```verilog
  cfg_vendorid <= 16'hYYYY;  // 将YYYY替换为捐赠设备的供应商ID
  ```

### **2.3. 更新子系统ID和修订ID**

- [ ] **修改** `cfg_subsysid`:

  ```verilog
  cfg_subsysid <= 16'hZZZZ;  // 将ZZZZ替换为捐赠设备的子系统ID
  ```

- [ ] **修改** `cfg_subsysvendorid`:

  ```verilog
  cfg_subsysvendorid <= 16'hWWWW;  // 将WWWW替换为捐赠设备的子系统供应商ID
  ```

- [ ] **修改** `cfg_revisionid`:

  ```verilog
  cfg_revisionid <= 8'hRR;  // 将RR替换为捐赠设备的修订ID
  ```

### **2.4. 更新类代码**

- [ ] **修改** `cfg_classcode`:

  ```verilog
  cfg_classcode <= 24'hCCCCCC;  // 将CCCCCC替换为捐赠设备的类代码
  ```

### **2.5. 插入设备序列号(DSN)**

- [ ] **修改** `cfg_dsn`:

  ```verilog
  cfg_dsn <= 64'hXXXXXXXXYYYYYYYY;  // 替换为捐赠设备的DSN
  ```

---

## **3. 定制Vivado项目**

### **3.1. 生成Vivado项目文件**

- [ ] **打开Vivado**,并在Tcl控制台中运行相应的Tcl脚本:

  ```tcl
  cd <project_directory>
  source vivado_generate_project_<your_board>.tcl -notrace
  ```

  - 将`<project_directory>`替换为您的项目路径。
  - 将`<your_board>`替换为您的FPGA板标识符(例如,`squirrel`)。

### **3.2. 打开生成的项目**

- [ ] **文件**:在Vivado中打开生成的`.xpr`项目文件。

---

## **4. 修改PCIe IP核**

### **4.1. 打开PCIe IP核配置**

- [ ] **要编辑的文件**:`pcie_7x_0.xci`
- [ ] **操作**:右键点击并选择**定制IP**。

### **4.2. 设置设备标识符**

- [ ] **设备ID**:设置为捐赠设备的设备ID。
- [ ] **供应商ID**:设置为捐赠设备的供应商ID。
- [ ] **子系统ID**:设置为捐赠设备的子系统ID。
- [ ] **子系统供应商ID**:设置为捐赠设备的子系统供应商ID。
- [ ] **修订ID**:设置为捐赠设备的修订ID。
- [ ] **类代码**:设置为捐赠设备的类代码。

### **4.3. 配置BARs**

对于每个BAR(BAR0至BAR5):

- [ ] **启用/禁用**:与捐赠设备匹配。
- [ ] **类型**:内存(32位或64位)或I/O。
- [ ] **大小**:设置为捐赠设备的BAR大小。
- [ ] **可预取**:与捐赠设备的设置匹配。

### **4.4. 匹配PCIe链路参数**

- [ ] **最大链路速度**:设置为匹配捐赠设备(例如,**Gen2**、**Gen3**)。
- [ ] **链路宽度**:设置为匹配捐赠设备(例如,**x1**、**x4**)。

### **4.5. 配置功能**

- [ ] **启用电源管理**(如果捐赠设备支持)。
- [ ] **启用MSI/MSI-X**(如果捐赠设备支持)。

### **4.6. 应用更改并锁定IP核**

- [ ] **应用**:点击**OK**保存IP核设置。
- [ ] **锁定IP核**:在Tcl控制台中运行:

  ```tcl
  set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
  ```

---

## **5. 为高级功能调整固件**

### **5.1. 更新能力指针**

- [ ] **要编辑的文件**:`pcileech_pcie_cfg_a7.sv`
- [ ] **修改** `cfg_cap_pointer`:

  ```verilog
  cfg_cap_pointer <= 8'hXX;  // 将XX替换为捐赠设备的能力指针
  ```

### **5.2. 调整最大有效载荷和读取请求大小**

- [ ] **在PCIe IP核中**:将**最大有效载荷大小**和**最大读取请求大小**设置为匹配捐赠设备。

- [ ] **在固件中(`pcileech_pcie_cfg_a7.sv`)**:

  ```verilog
  max_payload_size_supported <= 3'bYYY;  // 二进制值,对应于捐赠设备的最大有效载荷大小
  ```

  - **映射关系**:

    | 有效载荷大小(字节) | 二进制值   |
    |----------------------|------------|
    | 128                  | `3'b000`   |
    | 256                  | `3'b001`   |
    | 512                  | `3'b010`   |
    | 1024                 | `3'b011`   |
    | 2048                 | `3'b100`   |
    | 4096                 | `3'b101`   |

### **5.3. 实现电源管理逻辑**

- [ ] **要编辑的文件**:`pcileech_pcie_cfg_a7.sv`
- [ ] **添加逻辑**以处理电源状态转换(如果适用)。

### **5.4. 实现MSI/MSI-X中断**

- [ ] **在PCIe IP核中**:启用MSI或MSI-X功能,并设置支持的向量数量。

- [ ] **在固件中(`pcileech_pcie_tlp_a7.sv`)**:

  - [ ] **添加中断逻辑**以处理MSI/MSI-X中断。

---

## **6. 调整固件中的BAR处理**

### **6.1. 打开BAR控制器文件**

- [ ] **要编辑的文件**:`pcileech_tlps128_bar_controller.sv`
- [ ] **位置**:`pcileech-fpga/pcileech-wifi-main/src/pcileech_tlps128_bar_controller.sv`

### **6.2. 更新BAR地址解码**

- [ ] **修改**地址解码逻辑,以匹配捐赠设备的BAR大小和地址。

### **6.3. 实现BAR访问逻辑**

对于每个启用的BAR:

- [ ] **实现读/写处理程序**,对应于BAR的用途。

---

## **7. 实现TLP处理**

### **7.1. 打开TLP处理文件**

- [ ] **要编辑的文件**:`pcileech_pcie_tlp_a7.sv`

### **7.2. 修改TLP处理逻辑**

- [ ] **实现**处理捐赠设备所需的特定TLP类型的逻辑:

  - [ ] 内存读取请求
  - [ ] 内存写入请求
  - [ ] 配置读取/写入请求
  - [ ] 供应商定义的消息

### **7.3. 确保TLP合规**

- [ ] **验证**TLP按照PCIe规范正确格式化。

---

## **8. 构建并烧录固件**

### **8.1. 运行综合和实现**

在Vivado中:

- [ ] **运行综合**
- [ ] **运行实现**
- [ ] **生成比特流**

### **8.2. 编程FPGA**

- [ ] **通过JTAG连接**您的FPGA设备。
- [ ] **打开硬件管理器**。
- [ ] **使用生成的比特流编程设备**。

---

## **9. 测试与验证**

### **9.1. 验证设备枚举**

- [ ] **检查**FPGA是否在主机系统上显示为捐赠设备。

### **9.2. 安装必要的驱动程序**

- [ ] **使用**捐赠设备的驱动程序(如果需要)。

### **9.3. 执行功能测试**

- [ ] **测试**捐赠设备预期的所有功能。

### **9.4. 监控错误**

- [ ] **检查**系统日志中与设备相关的任何错误或警告。

---

## **10. 根据需要调试和优化**

### **10.1. 使用集成逻辑分析器(ILA)**

- [ ] **插入**ILA核以监控内部信号(如果必要)。

### **10.2. 分析PCIe流量**

- [ ] **使用**PCIe协议分析仪,调试通信问题。

### **10.3. 精炼固件**

- [ ] **迭代**您的固件代码,修复错误并提高性能。


================================================
FILE: CN/版本 4.md
================================================
# **第一部分:基础概念**

## **1. 引言**

### **1.1 本指南的目的**

本指南概述了一条详细的路线图,用于在基于 FPGA 的设备上创建自定义的直接内存访问 (DMA) 固件,最终目标是精确地仿真 PCIe 硬件。这种仿真可用于以下广泛应用场景:

- **硬件开发与测试**  
  - 使用基于 FPGA 的仿真来复制在开发过程中所需的各类硬件设备。  
  - 在无需昂贵或受限于特定捐赠硬件的情况下,进行系统级测试。

- **系统调试与诊断**  
  - 在可控环境中重现复杂的硬件行为,以便查找驱动程序相关的 bug 或问题。  
  - 在交易层 (TLP) 或内存映射 I/O 级别进行追踪分析。

- **安全与恶意软件研究**  
  - 调查 PCIe 低级漏洞或与硬件直接交互的高级恶意软件。  
  - 当硬件签名部分或全部被伪造时,观察特定设备驱动程序的行为。

- **硬件仿真与旧版支持**  
  - 用 FPGA 解决方案替代老化的硬件,通过仿真捐赠设备的 PCIe ID、BAR 布局和中断。  
  - 在新系统上通过仿真较旧或停产的 PCIe 设备来保持传统工作流程。

通过阅读本指南,你将学会如何:
1. **收集** 实体“捐赠” PCIe 卡的必要设备信息。  
2. **定制** FPGA 固件,使其呈现相同的设备/厂商 ID、BAR 布局和功能。  
3. **构建与配置** 开发环境(如 Xilinx Vivado、Visual Studio Code 等)。  
4. **理解** PCIe 与 DMA 的基本原理,这对于可靠的设备仿真至关重要。

> **为何这很重要**  
> 适当的硬件仿真可以节省工作量、降低成本,并允许快速迭代。基于 FPGA 的卡可以随时重新编程,从而让你比固定硬件更容易地适应多种设备或固件变体。

---

### **1.2 目标受众**

本资源适用于广泛的专业人士和爱好者:

- **固件开发人员**  
  对操控低级系统交互、驱动程序设计或高级硬件/固件栈调试感兴趣。

- **硬件与验证工程师**  
  寻求一种可控方式来测试具有多种设备配置和条件的系统组件——而无需每次都更换 PCIe 卡。

- **安全研究人员**  
  专注于分析 DMA 引入的威胁向量,探索 PCIe 交互中的潜在漏洞,或对恶意代码进行安全沙箱仿真。

- **FPGA 爱好者与创客**  
  渴望通过构建自定义 PCIe 核、学习高级硬件描述语言及探索实际设备枚举来扩展他们的 FPGA 知识。

---

### **1.3 如何使用本指南**

本指南分为三个部分,每个部分都在前一部分的基础上进一步深入:

1. **第一部分:基础概念**  
   - 涵盖先决知识、环境设置、提取捐赠设备数据以及初步固件调整。
2. **第二部分:中级概念与实现**  
   - 深入讨论固件定制、TLP 级别的操作、调试策略,以及如何细化仿真设备的行为以匹配或超越捐赠设备的功能。
3. **第三部分:高级技术与优化**  
   - 探讨深入的调试工具、性能调优和最佳实践,以确保你的基于 FPGA 的 DMA 解决方案具有长期可维护性。

> **建议**:在进入下一部分之前,请彻底完成第一部分。跳过或部分实施这些基础步骤可能会导致后续阶段中的混乱或配置错误。

---

## **2. 关键定义**

精确定义术语对于成功进行基于 FPGA 的 PCIe 仿真至关重要。下列列表详细解释了各相关术语:

1. **DMA (直接内存访问)**  
   - **定义**:无需 CPU 干预,由硬件直接在设备与系统内存之间传输数据。  
   - **相关性**:仿真设备高度依赖 DMA 以达到高吞吐量。确保正确配置 DMA 对于功能正常的 FPGA 设计至关重要。

2. **TLP (交易层数据包)**  
   - **定义**:PCIe 中的基本通信单元,封装了头部信息和数据有效载荷。  
   - **相关性**:理解 TLP 结构对于修改或分析 PCIe 交易层数据十分关键。

3. **BAR (基地址寄存器)**  
   - **定义**:寄存器,用于指定设备资源在系统地址空间中显示的地址范围(内存或 I/O)。  
   - **相关性**:准确复制捐赠设备的 BAR 布局是确保驱动程序正确加载和内存映射 I/O 处理的关键。

4. **FPGA (现场可编程门阵列)**  
   - **定义**:一种可重构芯片,其内部电路可以通过 HDL 重新设计,以实现定制硬件逻辑。  
   - **相关性**:FPGA 使你可以快速迭代 PCIe 设备设计,通过最小的硬件更改便可切换仿真设备。

5. **MSI/MSI-X (消息信号中断)**  
   - **定义**:符合 PCIe 标准的中断方法,允许设备通过带内消息而非专用线路触发 CPU 中断。  
   - **相关性**:复制捐赠中断行为(特别是支持的 MSI 向量数量)对于预期使用特定中断机制的驱动程序至关重要。

6. **设备序列号 (DSN)**  
   - **定义**:某些 PCIe 设备用于许可、认证或高级驱动程序校验的 64 位唯一标识符。  
   - **相关性**:若捐赠设备依赖 DSN,一些驱动程序可能会拒绝加载或运行,除非 DSN 匹配预期的硬件。

7. **PCIe 配置空间**  
   - **定义**:定义的区域(PCI 为 256 字节,PCIe 扩展为 4 KB),详细列出了设备 ID、厂商 ID、功能和操作参数。  
   - **相关性**:确保 FPGA 设备的配置空间与捐赠设备完全一致(或包含正确的子集)对于让主机将其视为真实设备至关重要。

8. **捐赠设备**  
   - **定义**:你从中提取数据(如 ID、类代码等)以进行仿真的实际 PCIe 卡。  
   - **相关性**:你复制的数据越准确,你的 FPGA 在枚举和功能上就越能接近真实硬件。

---

## **3. 设备兼容性**

### **3.1 支持的基于 FPGA 的硬件**

1. **Squirrel (35T)**  
   - 基于 Artix-7 的性价比较高的 FPGA 板,支持基本的 DMA 操作。推荐给刚接触基于 FPGA 的 PCIe 开发的用户。

2. **Enigma-X1 (75T)**  
   - 提供比 35T 更多的逻辑资源(LUTs、块 RAM),适用于中等复杂度任务或扩展调试/追踪功能。

3. **ZDMA (100T)**  
   - 针对高性能应用,具备大量 FPGA 资源,适合密集数据传输或多个并发 DMA 通道。

4. **Kintex-7**  
   - 一个更高级的 FPGA 系列,具备先进的 PCIe IP 核,通常用于要求高或大规模仿真任务。

> **提示**:始终检查你的 FPGA 卡的具体通道配置(x1、x4、x8)和速度等级(Gen1、Gen2 等),确保它满足或超过主板支持的要求。

---

### **3.2 PCIe 硬件考虑因素**

- **IOMMU / VT-d**  
  - *建议*:为了避免 DMA 区域受限,建议暂时禁用,尤其是在需要完全内存访问以进行充分测试时。

- **内核 DMA 保护**  
  - *Windows VBS / Secure Boot*:在某些情况下,这些功能会截获或限制直接的 PCIe 内存映射。  
  - *Linux IOMMU 或 AppArmor/SELinux 规则*:请根据需要调整,以确保 FPGA 能够访问仿真所需的内存区域。

- **PCIe 插槽要求**  
  - 选择物理 PCIe 插槽时,确保有足够的通道,并确认 BIOS 已正确分配通道。  
  - 如果发现性能问题或部分枚举,请确认系统没有将较大插槽强制为 x1 操作。

---

### **3.3 系统要求**

1. **硬件**  
   - **CPU**:至少需要四核 Intel 或 AMD,以便顺畅运行 Vivado 综合和管理操作系统开销。  
   - **内存**:建议 16 GB 或更多,以便在多小时的综合运行中获得舒适体验。  
   - **存储**:建议 100 GB SSD 以加快项目构建;机械硬盘可能会大幅降低构建速度。  
   - **操作系统**:支持 Windows 10/11(64 位)或主流 Linux 发行版(例如 Ubuntu LTS、RHEL/CentOS),用于运行 Xilinx Vivado。

2. **外设设备**  
   - **JTAG 编程器**:  
     - 如 Xilinx Platform Cable USB II、Digilent HS3 或类似设备,用于将生成的比特流下载到 FPGA 上,或在实时调试固件时使用。  
   - **专用机器**:  
     - 强烈建议使用专用测试机(或精心配置的双启动/虚拟机)以便在修改 BIOS 设置(如 VT-d)或需要一个无其他 PCIe 设备干扰的环境时使用。

---

## **4. 需求**

### **4.1 硬件**

1. **捐赠 PCIe 设备**  
   - 目的:你需要提取设备的厂商/设备 ID、子系统 ID、类代码、BAR 大小和功能。  
   - 示例:旧款网络接口卡(NIC)、基本存储控制器,或其他你希望复制或扩展的专用 PCIe 设备。

2. **DMA FPGA 卡**  
   - 目的:运行 FPGA 逻辑、实现 PCIe 接口的实际硬件平台。  
   - 示例:Squirrel 35T、Enigma-X1 或 ZDMA 100T 板。

3. **JTAG 编程器**  
   - 用于连接 FPGA 板上的 JTAG 引脚,便于使用 Vivado 加载综合生成的比特流或实时调试固件。

---

### **4.2 软件**

1. **Xilinx Vivado 设计套件**  
   - 用于创建、综合和实现 FPGA 设计。  
   - 请从 [Xilinx](https://www.xilinx.com/support/download.html) 下载,确保选择与你的板卡 IP 要求相符的版本。

2. **Visual Studio Code**  
   - 一个灵活的跨平台编辑器,支持 Verilog/SystemVerilog,并有额外插件。  
   - 帮助保持一致的代码风格,追踪变更,并通过版本控制(如 Git)简化协作。

3. **PCILeech-FPGA**  
   - GitHub 仓库:[PCILeech-FPGA](https://github.com/ufrisk/pcileech-fpga)。  
   - 提供针对各 FPGA 板的基本 DMA 设计,你可以在此基础上进行定制,以复制捐赠设备的 PCIe 配置。

4. **Arbor(PCIe 设备扫描工具)**  
   - 一个用户友好的 GUI 工具,可对已连接的 PCIe 设备进行详细分析。  
   - 替代方案:Telescan PE 用于流量捕获,或者在 Linux 中使用命令行工具 `lspci -vvv` 进行检查。

---

### **4.3 环境设置**

1. **安装 Vivado**  
   - 按照 Xilinx 官方安装程序进行安装,选择相应的 FPGA 系列(Artix-7、Kintex-7 等)。  
   - 可能需要注册 Xilinx 账户以下载设计套件或获取更新。

2. **安装 Visual Studio Code**  
   - 从 [Visual Studio Code](https://code.visualstudio.com/) 下载。  
   - 安装推荐插件:*Verilog-HDL/SystemVerilog* 和 *Git* 集成插件(若你计划使用版本控制)。

3. **克隆 PCILeech-FPGA 仓库**  
   ```bash
   cd ~/Projects/
   git clone https://github.com/ufrisk/pcileech-fpga.git
   cd pcileech-fpga
   ```
   - 确保你已安装并配置 Git。

4. **隔离开发环境**  
   - 建议使用专用测试机(或经过精心配置的双启动/虚拟机),以减少风险。  
   - 这种方式允许你更自由地禁用内核 DMA 保护、IOMMU 或安全启动,而不会影响主要生产系统。

---

## **5. 收集捐赠设备信息**

要有效地仿真设备,必须复制其 PCIe 配置空间。这意味着需要捕获从设备/厂商 ID 到高级功能的所有信息。

### **5.1 使用 Arbor 进行 PCIe 设备扫描**

#### **5.1.1 安装并启动 Arbor**

1. **获取 Arbor**  
   - 在 Arbor 官方网站注册并下载。  
   - 以管理员权限安装。

2. **启动 Arbor**  
   - 如果 Windows 的 UAC 提示,请确认允许该应用以管理员权限运行。  
   - 你应看到一个列出所有 PCI/PCIe 设备的界面。

#### **5.1.2 扫描设备**

1. **本地系统标签**  
   - 导航至 Arbor 的“Local System”或“Scan”区域。  
2. **点击“Scan”**  
   - Arbor 将枚举所有 PCIe 总线上的设备。  
3. **识别捐赠设备**  
   - 根据品牌名称或厂商 ID 与已知的捐赠硬件相匹配。如果不易识别,请参照硬件文档中的已知 ID 进行比对。

#### **5.1.3 提取关键属性**

从 Arbor 的详细视图中收集以下信息:

- **厂商 ID / 设备 ID**:例如,0x8086 / 0x10D3(Intel NIC)。  
- **子系统厂商 ID / 子系统 ID**:例如,0x8086 / 0xA02F。  
- **修订版本 ID**:例如,0x01。  
- **类代码**:例如,0x020000(用于以太网控制器)。  
- **BARs (基地址寄存器)**:  
  - 对于每个 BAR,注意其是否启用、内存大小(256 MB、64 KB 等)以及是否支持预取或是 32 位/64 位。  
- **功能**:  
  - MSI 或 MSI-X 详情(支持的中断向量数量)。  
  - 扩展配置或高级电源管理功能。  
- **设备序列号 (DSN)**(如有):  
  - 某些设备具有唯一 DSN 字段,特别是用于许可或特殊驱动检查时。

> **组织提示**:  
> 使用电子表格或结构化文档记录这些数值,确保你不会忽略高级功能或扩展功能等细节。

---

## **6. 初步固件定制**

获取捐赠设备的 PCIe 属性后,开始定制 FPGA 固件以匹配这些设置。

### **6.1 修改 PCIe 配置空间**

你的 FPGA 设计中可能包含一个顶层文件,用于设置 PCIe 配置寄存器。例如,在 `pcileech-fpga` 仓库中,查找类似 `pcileech_pcie_cfg_a7.sv` 或 `pcie_7x_0_core_top.v` 的文件。

1. **在 VS Code 中打开文件**  
   - 搜索定义 `cfg_deviceid`、`cfg_vendorid`、`cfg_subsysid` 等的代码行。

2. **赋予正确的 ID**  
   ```verilog
   cfg_deviceid        <= 16'h10D3; // 示例设备 ID
   cfg_vendorid        <= 16'h8086; // 示例厂商 ID
   cfg_subsysid        <= 16'h1234;
   cfg_subsysvendorid  <= 16'h5678;
   cfg_revisionid      <= 8'h01;
   cfg_classcode       <= 24'h020000; // 例如以太网控制器
   ```
   - 将上述示例替换为从 Arbor(或捐赠设备数据手册)中获得的确切值。

3. **如有需要,插入 DSN**  
   ```verilog
   cfg_dsn             <= 64'h0011223344556677;
   ```
   - 如果捐赠设备不依赖 DSN,则可省略或置为 0。

4. **保存并检查**  
   - 任一字段的单个数字错误都可能导致操作系统错误识别或拒绝该设备。请仔细核对每一行。

---

### **6.2 考虑 BAR 配置**

虽然有些 PCIe IP 核会在相同的 SystemVerilog 文件中存储 BAR 设置,但也有些依赖于 Vivado 的 IP 定制 GUI:

- **检查捐赠设备使用了多少个 BAR**(0 到 6 个)。  
- **设置每个 BAR**(例如,内存类型、大小、是否支持预取、是 64 位还是 32 位)。  
- 如果捐赠设备具有较大 BAR 区域(例如 256 MB 或更大),请确保你的 FPGA 板卡在 IP 核设置中可以容纳。

---

## **7. Vivado 工程设置与定制**

### **7.1 生成 Vivado 工程文件**

为便于组织所有设计文件,许多仓库都包含 Tcl 脚本:

1. **启动 Vivado**  
   - 确保你使用的 Vivado 版本与 FPGA 系列(Artix-7、Kintex-7 等)匹配。

2. **打开 Tcl 控制台**  
   - 在 Vivado 顶部菜单中选择 **Window > Tcl Console**。

3. **进入工程目录**  
   ```tcl
   cd C:/path/to/pcileech-fpga/pcileech-wifi-main/
   pwd
   ```
   - 使用 `pwd` 命令确认控制台已进入正确的文件夹。

4. **运行生成脚本**  
   ```tcl
   source vivado_generate_project_squirrel.tcl -notrace
   ```
   - 如果使用 Enigma-X1 或 ZDMA,请运行相应的脚本(例如 `vivado_generate_project_enigma_x1.tcl`)。

5. **打开生成的工程**  
   - 通过 **File > Open Project**,定位并选择 `.xpr` 文件(例如 `pcileech_squirrel_top.xpr`)。  
   - 检查 **Project Manager** 窗口,确保所有源文件已正确导入。

---

### **7.2 定制 PCIe IP 核**

在 Vivado 中,你可能会找到一个 PCIe IP 核(例如 `pcie_7x_0.xci`),位于 **Sources** 下:

1. **右键点击 -> Customize IP**  
   - 更新厂商/设备 ID、修订版本和子系统字段。  
   - 按照捐赠设备的 BAR 配置(大小、内存类型等)进行匹配。

2. **生成/更新 IP**  
   - 点击 **OK** 或 **Generate** 以重建 IP 核。  
   - 如果 IP 版本发生变化,Vivado 可能会提示升级或确认依赖项。

3. **锁定 IP 核**  
   ```tcl
   set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
   ```
   - 这可以防止将来脚本意外覆盖你的手动更改。

---

## **附加最佳实践**

1. **版本控制** - *强烈推荐*  
   - 经常提交你的修改(使用 Git 或其他版本控制系统)。  
   - 对重大更改进行打标签或分支,以便在出现问题时能快速回退。

2. **文档记录**  
   - 保留笔记、电子表格或 Wiki,总结捐赠设备的详细信息、特殊偏移或功能缺陷。  
   - 记录定制 FPGA 固件的每一步操作。

3. **在主机上测试**  
   - 生成比特流后,将其烧录到 FPGA,然后检查:  
     - **Windows**:使用设备管理器或 `devcon.exe` 检查设备是否以正确的 ID 枚举。  
     - **Linux**:使用 `lspci -vvv` 检查设备是否正确显示,包括 BAR、类代码、子系统等信息。

4. **安全考虑**  
   - 禁用 VT-d 或安全启动等功能可能会使系统面临安全风险。建议使用专用测试平台或将环境隔离,以确保操作安全。

5. **接下来的内容**  
   - 在 **第二部分** 中,你将学到如何基于这些基础知识进一步进行 TLP 操作、部分重配置策略、固件调试以及任何高级 ID 伪装或握手仿真。

---

# **第二部分:中级概念与实现**

---

## **8. 高级固件定制**

为了精确仿真捐赠设备,你必须扩展基础配置,使高级 PCIe 参数、BAR 设置以及电源管理与中断机制完全与捐赠设备一致。这确保你的基于 FPGA 的仿真设备能与主机像真实硬件一样交互。

---

### **8.1 配置 PCIe 参数以实现仿真**

精确的 PCIe 仿真要求设备的链路特性、功能指针以及数据传输参数(有效载荷和读请求大小)与捐赠设备一致。

#### **8.1.1 匹配 PCIe 链路速度和宽度**

**目的:**  
PCIe 链路速度(例如,Gen1 为 2.5 GT/s,Gen2 为 5.0 GT/s,Gen3 为 8.0 GT/s)和链路宽度(例如,x1、x4、x8)直接影响性能与兼容性。必须复制捐赠设备的参数,确保主机系统和驱动程序能够无缝识别和操作仿真设备。

**步骤:**

1. **启动 Vivado 并打开工程**  
   - 打开你的 Vivado 工程(例如 `pcileech_squirrel_top.xpr`),确认所有源文件均已导入,工程层次结构完整。

2. **进入 PCIe IP 核设置**  
   - 在 **Sources** 面板中找到 PCIe IP 核(通常命名为 `pcie_7x_0.xci`)。  
   - 右键点击该文件,选择 **Customize IP** 以打开配置 GUI。

3. **设置最大链路速度**  
   - 导航至 **Link Parameters** 选项卡。  
   - 找到“Maximum Link Speed”选项,并选择与捐赠设备匹配的速度(例如,对于 Gen2 选择 5.0 GT/s)。  
   - *注意:* 验证 FPGA 板和物理插槽是否均支持所选速度。

4. **配置链路宽度**  
   - 在同一选项卡中,找到“Link Width”。  
   - 选择适当的宽度(例如,x4)以匹配捐赠设备。  
   - *注意:* 常见选项包括 1、2、4、8 或 16 条通道。

5. **应用并重新生成**  
   - 点击 **OK** 保存更改。Vivado 可能会提示你重新生成 IP 核,允许该过程完成。  
   - 最后,在 **Messages** 窗口检查任何警告或错误信息。

---

#### **8.1.2 设置功能指针**

**目的:**  
PCIe 配置空间中的功能指针引导主机定位扩展功能(如 MSI/MSI‑X、电源管理等)。匹配这些指针可确保主机按照与捐赠设备相同的方式访问这些功能。

**步骤:**

1. **打开固件配置文件**  
   - 在 Visual Studio Code 中,打开位于 `pcileech-fpga/pcileech-wifi-main/src/` 下的文件(例如 `pcileech_pcie_cfg_a7.sv`)。

2. **查找并更新功能指针赋值**  
   - 找到 `cfg_cap_pointer` 的赋值语句,例如:
     ```verilog
     cfg_cap_pointer <= 8'hXX; // 当前默认值
     ```
   - 将 `XX` 替换为正确的捐赠设备偏移(例如,如果捐赠设备的功能指针在 0x60 处,则写为 `8'h60`):
     ```verilog
     cfg_cap_pointer <= 8'h60; // 设置为捐赠设备在 0x60 偏移处的功能指针
     ```
   - *验证:* 确保功能结构按照 PCIe 要求对齐到 4 字节边界。

3. **保存文件并添加注释说明更改**  
   - 保存文件(Ctrl+S),并在代码中添加内联注释以备将来参考。

---

#### **8.1.3 调整最大有效载荷和读请求大小**

**目的:**  
PCIe 设备在交易中协商每个传输的数据量。“最大有效载荷大小”(MPS)和“最大读请求大小”(MRRS)必须设置为与捐赠设备一致,以确保驱动程序兼容性和最佳数据吞吐量。

**步骤:**

1. **在 PCIe IP 核中配置**  
   - 在 IP 定制 GUI 中(位于 PCIe IP 核设置中),导航至 **Device Capabilities** 或 **Capabilities** 选项卡。  
   - 设置 **Maximum Payload Size Supported**(例如 256 字节)和 **Maximum Read Request Size Supported**(例如 512 字节),使其与捐赠设备一致。

2. **更新固件常量**  
   - 在 Visual Studio Code 中打开 `pcileech_pcie_cfg_a7.sv`。  
   - 查找定义有效载荷和读请求大小的参数,例如:
     ```verilog
     max_payload_size_supported       <= 3'bZZZ; // 当前值
     max_read_request_size_supported  <= 3'bWWW; // 当前值
     ```
   - 替换为正确的二进制编码:  
     - **示例映射:**
       - 128 字节: `3'b000`
       - 256 字节: `3'b001`
       - 512 字节: `3'b010`
       - 1024 字节: `3'b011`
       - 2048 字节: `3'b100`
       - 4096 字节: `3'b101`
     - 例如,如果捐赠设备支持 256 字节有效载荷和 512 字节读请求:
       ```verilog
       max_payload_size_supported       <= 3'b001; // 256 字节
       max_read_request_size_supported  <= 3'b010; // 512 字节
       ```

3. **重新构建并验证**  
   - 保存修改后重新运行综合,确保 IP 核设置与固件常量之间一致。

---

### **8.2 调整 BAR 与内存映射**

BAR(基地址寄存器)决定了设备用于内存或 I/O 的地址空间。正确配置 BAR 对于驱动程序操作和操作系统资源分配至关重要。

#### **8.2.1 设置 BAR 大小**

**目的:**  
确保每个 BAR 设置了正确的大小和类型(32 位与 64 位;内存与 I/O)以保证主机分配正确的地址空间。

**步骤:**

1. **在 PCIe IP 核中定制 BAR**  
   - 在 Vivado 中,右键点击 `pcie_7x_0.xci`,选择 **Customize IP**。  
   - 导航到 **BARs** 选项卡。  
   - 对于每个 BAR(BAR0–BAR5):  
     - **设置大小:** 选择与捐赠设备相同的大小(例如 64 KB、128 MB)。  
     - **设置类型:** 选择 32 位或 64 位内存寻址(或 I/O 空间)。  
     - **启用或禁用:** 仅启用捐赠设备使用的 BAR。

2. **与片上内存(如适用)同步**  
   - 如果使用块 RAM(BRAM)来支持仿真 BAR 区域,请打开相关的 BRAM IP 核文件(例如 `bram_bar_zero4k.xci`),确保内存大小与 BAR 配置相对应。

3. **保存、重新生成并验证**  
   - 保存更改,让 Vivado 重新生成 IP 核。  
   - 检查 **Messages** 窗口,确保无配置警告。

---

#### **8.2.2 在固件中定义 BAR 地址空间**

**目的:**  
实现逻辑,用以解码针对 BAR 的地址并正确路由读/写操作。

**步骤:**

1. **打开 BAR 控制器源文件**  
   - 例如,在 Visual Studio Code 中打开 `pcileech_tlps128_bar_controller.sv`。

2. **实现地址解码逻辑**  
   - 使用组合逻辑确定访问的是哪个 BAR:
     ```verilog
     always_comb begin
       if (bar_hit[0]) begin
         // 处理对 BAR0 的访问
       end else if (bar_hit[1]) begin
         // 处理对 BAR1 的访问
       end
       // 根据需要继续处理其他 BAR
     end
     ```

3. **为每个 BAR 实现读/写处理**  
   - 在每个分支内,创建 case 语句或条件块,将特定地址偏移映射到内部寄存器:
     ```verilog
     if (bar_hit[0]) begin
       case (addr_offset)
         16'h0000: data_out <= reg0;
         16'h0004: data_out <= reg1;
         // 根据需要添加其他寄存器
         default: data_out <= 32'h0;
       endcase
     end
     ```

4. **保存并仿真验证**  
   - 保存更改后,进行仿真以验证地址解码与数据传输是否正确。

---

#### **8.2.3 处理多个 BAR**

**目的:**  
如果设备暴露多个 BAR,必须确保每个 BAR 的逻辑独立,并且它们的地址空间不冲突。

**步骤:**

1. **分离 BAR 逻辑**  
   - 考虑将每个 BAR 的逻辑模块化,分离为不同的代码块或模块(例如 `bar0_controller.sv`、`bar1_controller.sv`)。

2. **验证地址范围**  
   - 确保每个 BAR 分配了唯一且不重叠的地址范围。  
   - 确保大小符合 PCIe 规范中要求的幂次对齐。

3. **测试**  
   - 既使用测试平台仿真(测试基准)又使用硬件工具(如在 Linux 中用 `lspci -vvv` 或在 Windows 中使用设备管理器)验证映射与访问是否正确。

---

### **8.3 仿真设备的电源管理与中断**

高级仿真需要支持设备电源管理状态和中断处理,这对于驱动程序的正常工作和系统稳定性至关重要。

---

#### **8.3.1 电源管理配置**

**目的:**  
启用电源管理功能使设备支持各种电源状态(D0 到 D3),这对提高能效及确保操作系统行为正常非常重要。

**步骤:**

1. **在 PCIe IP 核中启用电源管理**  
   - 在 IP 定制窗口中,导航到 **Capabilities** 选项卡,并启用 “Power Management”。  
   - 选择支持的电源状态(例如,D0 完全开启、D1/D2 中间状态,以及 D3 低功耗)。

2. **在固件中实现 PMCSR 逻辑**  
   - 在你的配置文件(例如 `pcileech_pcie_cfg_a7.sv`)中,实现处理电源管理控制/状态寄存器(PMCSR)写操作的逻辑:
     ```verilog
     localparam PMCSR_ADDRESS = 12'h44; // PMCSR 的示例地址
     reg [15:0] pmcsr_reg;

     always @(posedge clk) begin
       if (cfg_write && cfg_address == PMCSR_ADDRESS) begin
         pmcsr_reg <= cfg_writedata[15:0];
         // 根据 pmcsr_reg[1:0] 更新内部电源状态
       end
     end
     ```
   - *注意:* 如果进入低功耗状态,请根据需要更新设备操作行为。

3. **测试实现**  
   - 仿真电源状态转换,验证 PMCSR 是否按照预期运行。

---

#### **8.3.2 MSI/MSI-X 配置与设备“激活”行为**

**理解“激活设备”:**  
在固件术语中,“激活设备”指的是那些定期发起 DMA 传输并在传输完成时通过中断通知主机的设备。这里的“激活”并非泛指激活状态,而是指设备主动“敲门”通知 CPU 数据已就绪。在高效中断信号传递要求较高的系统中,这一概念至关重要。

**MSI 与 MSI-X:**  
- **MSI:** 使用 Xilinx PCIe IP 核提供的内置中断接口。  
- **MSI-X:** 由于内置接口不原生支持 MSI-X,固件需要手动构造并发送一个 MEMWR64 TLP 作为“门铃”中断。

**使用 MSI(基于内置接口)的步骤:**

1. **在 PCIe IP 核中配置 MSI**  
   - 在 IP 核定制中,找到 **Interrupt** 或 **MSI/MSI-X** 部分。  
   - 启用 MSI 并设置支持的向量数量(通常最多 32 个)。

2. **在固件中实现中断接口**  
   - 在配置文件中,将中断信号连接如下:
     ```verilog
     assign ctx.cfg_interrupt_di             = cfg_int_di;
     assign ctx.cfg_pciecap_interrupt_msgnum = cfg_msg_num;
     assign ctx.cfg_interrupt_assert         = cfg_int_assert;
     assign ctx.cfg_interrupt                = cfg_int_valid;
     assign ctx.cfg_interrupt_stat           = cfg_int_stat;
     ```
   - 然后,添加一个进程,当事件发生(例如 DMA 完成)时断言 `cfg_int_valid`:
     ```verilog
     always @(posedge clk_pcie) begin
       if (rst) begin
         cfg_int_valid <= 1'b0;
         cfg_msg_num   <= 5'b0;
         cfg_int_assert<= 1'b0;
         cfg_int_di    <= 8'b0;
         cfg_int_stat  <= 1'b0;
       end else if (cfg_int_ready && cfg_int_valid) begin
         cfg_int_valid <= 1'b0;
       end else if (o_int) begin
         cfg_int_valid <= 1'b0; // 根据中断生成时序进行调整
       end
     end

     // 示例:中断计数器,用于生成周期性中断:
     reg [31:0] int_cnt;
     always @(posedge clk_pcie) begin
       if (rst)
         int_cnt <= 0;
       else if (int_cnt == 32'd100000)
         int_cnt <= 0;
       else if (int_enable)
         int_cnt <= int_cnt + 1;
     end
     assign o_int = (int_cnt == 32'd100000);
     ```

**使用 MSI-X(手动构造 TLP)的步骤:**

1. **手动构造 MSI-X TLP**  
   - 由于 Xilinx IP 核中断接口不支持 MSI-X,你必须构造一个 MEMWR64 TLP 以信号中断。  
   - 定义 TLP 字段如下(根据捐赠设备的规格适当修改):
     ```verilog
     // 定义 MEMWR64 TLP 的头部字段
     wire [31:0] HDR_MEMWR64 = 32'b01000000_00000000_00000000_00000001;
     // 构造后续数据字(注意位拼接正确):
     wire [31:0] MWR64_DW2   = { _bs16(pcie_id), 8'b0, 8'b00001111 };
     wire [31:0] MWR64_DW3   = { i_addr[31:2], 2'b0 };
     wire [31:0] MWR64_DW4   = i_data;
     ```

2. **与 TLP 输出集成**  
   - 在你的 TLP 发送逻辑中(例如 `pcileech_pcie_tlp_a7.sv` 内),将构造的 TLP 分配如下:
     ```verilog
     reg         msix_valid;
     reg         msix_has_data;
     reg [127:0] msix_tlp;

     assign tlps_static.tdata   = msix_tlp;
     assign tlps_static.tkeepdw = 4'hF;
     assign tlps_static.tlast   = 1'b1;
     assign tlps_static.tuser[0]= 1'b1;
     assign tlps_static.tvalid  = msix_valid;
     assign tlps_static.has_data= msix_has_data;

     always @(posedge clk_pcie) begin
       if (rst) begin
         msix_valid    <= 1'b0;
         msix_has_data <= 1'b0;
         msix_tlp      <= 128'b0;
       end else if (msix_valid) begin
         msix_valid <= 1'b0;
       end else if (msix_has_data && tlps_static.tready) begin
         msix_valid    <= 1'b1;
         msix_has_data <= 1'b0;
         msix_tlp      <= { MWR64_DW4, MWR64_DW3, MWR64_DW2, HDR_MEMWR64 };
       end else if (o_int) begin
         msix_has_data <= 1'b1;
       end
     end
     // 如有需要,使用类似的中断计数器以生成周期性中断。
     ```
   - *验证:* 确保组装的 TLP 符合 PCIe 对 MEMWR64 数据包的规格要求。建议使用仿真和集成逻辑分析器(ILA)进行硬件测试。

---

#### **8.3 实现中断处理逻辑**

**目的:**  
定义明确的条件和专用模块,用于在满足特定事件(例如 DMA 传输完成)时生成中断。这对于一个“激活”设备(频繁向主机发起“门铃”通知)至关重要。

**步骤:**

1. **定义中断触发条件**  
   - 确定哪些事件应生成中断,可能包括:  
     - DMA 传输完成。  
     - 数据就绪。  
     - 错误状态等。
   - 实现组合或时序逻辑检测这些事件。

2. **模块化中断控制器**  
   - 建议将中断逻辑封装在一个独立模块中,例如:
     ```verilog
     module interrupt_controller(
       input  wire clk,
       input  wire rst,
       input  wire event_trigger,
       output reg  msi_req
     );
       always @(posedge clk or posedge rst) begin
         if (rst)
           msi_req <= 1'b0;
         else if (event_trigger)
           msi_req <= 1'b1;
         else
           msi_req <= 1'b0;
       end
     endmodule
     ```
   - 将该模块集成到你的主固件逻辑中。

3. **确保正确时序**  
   - 验证中断信号的断言与撤销是否符合 PCIe 的时序要求。  
   - 使用仿真和硬件调试工具(例如 ILA)确认主机能够正确接收中断信号。

---

### **8.4 “FULL EMU” 与 “DUMP EMU” 有何区别?**

**术语理解:**

- **DUMP EMU:**  
  一种固件方法,其基本上“转储”了捐赠设备的 BAR 和功能寄存器(通常通过 Arbor 扫描获得)到 FPGA 中。该方法只复制静态配置数据。

- **FULL EMU:**  
  真正的全仿真不仅复制静态配置(ID、BAR、功能),而且仿真捐赠设备的动态行为,包括:  
  - 正确生成 TLP(读取、写入、完成、厂商自定义消息)。  
  - 处理电源管理状态转换。  
  - 实现中断生成及正确的“门铃”通知(特别是在 MSI‑X 情况下)。  
  - 支持主动 DMA 传输与实时响应,与捐赠设备完全一致。

**未来改进:**  
计划中的更新可能包括检测方法,以验证固件项目是真正的“FULL EMU”(具有主动动态行为)还是仅为静态的“DUMP EMU”。例如,可以使用基于 Realtek 的网卡进行高级测试作为基准。

---

## **10. 交易层数据包 (TLP) 仿真**

TLP 是 PCIe 通信的基本单元。为了实现完全功能的仿真,你的设计不仅要复制配置空间,还必须准确地生成和响应 TLP,就像真实设备一样。

### **10.1 理解并捕获 TLP**

#### **10.1.1 学习 TLP 结构**

- **头部:**  
  包含字段如:  
  - TLP 类型(例如内存读取、内存写入、配置、厂商自定义)  
  - 长度、请求者 ID、标签、地址  
- **数据有效载荷:**  
  存在于如内存写入等交易中。必须遵循协商的最大有效载荷大小。  
- **CRC:**  
  用于数据完整性校验。

#### **10.1.2 捕获捐赠设备的 TLP**

1. **使用 PCIe 协议分析仪**  
   - 使用 Teledyne LeCroy 分析仪或 Xilinx ILA 方案捕获实时 TLP。
2. **捕获并分析交易**  
   - 监控正常操作期间的 TLP,记录头部字段、顺序和时序。
3. **记录关键交易**  
   - 重点关注初始化序列、内存读写交换以及厂商自定义消息。

---

### **10.2 针对特定操作构造自定义 TLP**

#### **10.2.1 在固件中实现 TLP 处理**

1. **TLP 生成函数**  
   - 在你的 TLP 模块(例如 `pcileech_pcie_tlp_a7.sv`)中,创建函数以组装 TLP。例如:
     ```verilog
     function automatic [127:0] generate_tlp(
       input [15:0] requester_id,
       input [7:0]  tag,
       input [7:0]  length,
       input [31:0] address,
       input [31:0] data
     );
       // 构造并返回一个包含头部和载荷的 128 位 TLP
     endfunction
     ```
2. **TLP 接收与解析**  
   - 实现状态机以解析传入的 TLP,并根据类型(例如区分内存读与写)进行路由。

3. **完成处理**  
   - 对于内存读请求,生成包含请求数据的完成 TLP,确保遵守 PCIe 的时序和 CRC 要求。

---

#### **10.2.2 处理不同类型的 TLP**

1. **内存读请求:**  
   - 解析 TLP 头部,从正确的内存区域读取数据,并发送完成 TLP。
2. **内存写请求:**  
   - 提取数据有效载荷,并将数据写入仿真寄存器或内存块。
3. **配置读/写:**  
   - 分别访问配置空间寄存器。
4. **厂商自定义消息:**  
   - 如果捐赠设备使用专有 TLP,实现特殊处理。

---

#### **10.2.3 验证 TLP 的时序和顺序**

1. **仿真测试:**  
   - 开发测试平台仿真 TLP 交换,并验证头部、载荷以及响应时序的正确性。
2. **硬件调试:**  
   - 使用 ILA 核实时监控 TLP 总线信号。
3. **合规性验证:**  
   - 如有可能,使用 PCIe 合规性工具验证你的 TLP 实现是否符合规范。

---

## **结论**

通过遵循第二部分中的详细步骤,你不仅扩展了对静态寄存器复制的仿真,还配置了关键的 PCIe 链路参数,确保正确的 BAR 和内存映射,实现了完整的电源管理以及同时支持 MSI 与 MSI‑X 中断。此外,你已经建立了一个基础,能够构造和验证自定义 TLP,从而实现一个真正“FULL EMU”的固件解决方案——其动态行为与捐赠设备完全一致。

**关键要点:**

1. **精确匹配高级 PCIe 参数:**  
   - 链路速度、链路宽度、功能指针和有效载荷大小必须与捐赠设备一致。

2. **BAR 配置与地址解码:**  
   - 正确设置 BAR 的大小与类型,并实现健壮的地址解码逻辑。

3. **中断 – MSI 与 MSI‑X:**  
   - 对于 MSI 使用内置中断接口;对于 MSI‑X 则需手动构造 MEMWR64 TLP。

4. **主动设备行为:**  
   - 通过仿真频繁的 DMA 传输和“门铃”中断信号,模仿真实硬件的动态行为。

5. **TLP 仿真:**  
   - 确保 TLP 的生成、接收和时序完全符合 PCIe 标准,实现完整仿真。

在 **第三部分** 中,我们将以此为基础,进一步讨论性能优化、深入调试技巧以及生产级最佳实践。请继续根据捐赠设备的规格验证每个功能,以实现真正难以区分的仿真效果。

---

# **第三部分:高级技术与优化**

*(第三部分内容将在后续详细介绍,包括性能优化、扩展调试方法以及长远维护的最佳实践。)*


================================================
FILE: Checklist.md
================================================
# Firmware Modification Checklist

Use this checklist to guide you through the firmware creation.

---

## **1. Gather Donor Device Information**

Collect the following information from the donor PCIe device:

- [ ] **Device ID** (`0xXXXX`)
- [ ] **Vendor ID** (`0xYYYY`)
- [ ] **Subsystem ID** (`0xZZZZ`)
- [ ] **Subsystem Vendor ID** (`0xWWWW`)
- [ ] **Revision ID** (`0xRR`)
- [ ] **Class Code** (`0xCCCCCC`)
- [ ] **Base Address Registers (BARs) Configuration**:
  - [ ] **BAR0** to **BAR5** sizes, types (Memory or I/O), prefetchable status
- [ ] **Capabilities**:
  - [ ] Power Management settings
  - [ ] MSI/MSI-X settings
- [ ] **Device Serial Number (DSN)** (`0xXXXXXXXXYYYYYYYY`)

---

## **2. Modify Firmware Configuration Files**

### **2.1. Open Firmware Configuration File**

### **2.2. Update Device and Vendor IDs**

- [ ] **Modify** `cfg_deviceid`:

  ```verilog
  cfg_deviceid <= 16'hXXXX;  // Replace XXXX with donor's Device ID
  ```

- [ ] **Modify** `cfg_vendorid`:

  ```verilog
  cfg_vendorid <= 16'hYYYY;  // Replace YYYY with donor's Vendor ID
  ```

### **2.3. Update Subsystem IDs and Revision ID**

- [ ] **Modify** `cfg_subsysid`:

  ```verilog
  cfg_subsysid <= 16'hZZZZ;  // Replace ZZZZ with donor's Subsystem ID
  ```

- [ ] **Modify** `cfg_subsysvendorid`:

  ```verilog
  cfg_subsysvendorid <= 16'hWWWW;  // Replace WWWW with donor's Subsystem Vendor ID
  ```

- [ ] **Modify** `cfg_revisionid`:

  ```verilog
  cfg_revisionid <= 8'hRR;  // Replace RR with donor's Revision ID
  ```

### **2.4. Update Class Code**

- [ ] **Modify** `cfg_classcode`:

  ```verilog
  cfg_classcode <= 24'hCCCCCC;  // Replace CCCCCC with donor's Class Code
  ```

### **2.5. Insert Device Serial Number (DSN)**

- [ ] **Modify** `cfg_dsn`:

  ```verilog
  cfg_dsn <= 64'hXXXXXXXXYYYYYYYY;  // Replace with donor's DSN
  ```

---

## **3. Customize Vivado Project**

### **3.1. Generate Vivado Project Files**

- [ ] **Open Vivado** and run the appropriate Tcl script in the Tcl Console:

  ```tcl
  cd <project_directory>
  source vivado_generate_project_<your_board>.tcl -notrace
  ```

  - Replace `<project_directory>` with your project path.
  - Replace `<your_board>` with your FPGA board identifier (e.g., `squirrel`).

### **3.2. Open Generated Project**

- [ ] **File**: Open the generated `.xpr` project file in Vivado.

---

## **4. Modify PCIe IP Core**

### **4.1. Open PCIe IP Core Configuration**

- [ ] **File to Edit**: `pcie_7x_0.xci`
- [ ] **Action**: Right-click and select **Customize IP**.

### **4.2. Set Device Identifiers**

- [ ] **Device ID**: Set to donor's Device ID.
- [ ] **Vendor ID**: Set to donor's Vendor ID.
- [ ] **Subsystem ID**: Set to donor's Subsystem ID.
- [ ] **Subsystem Vendor ID**: Set to donor's Subsystem Vendor ID.
- [ ] **Revision ID**: Set to donor's Revision ID.
- [ ] **Class Code**: Set to donor's Class Code.

### **4.3. Configure BARs**

For each BAR (BAR0 to BAR5):

- [ ] **Enable/Disable**: Match donor device.
- [ ] **Type**: Memory (32-bit or 64-bit) or I/O.
- [ ] **Size**: Set to donor's BAR size.
- [ ] **Prefetchable**: Match donor's setting.

### **4.4. Match PCIe Link Parameters**

- [ ] **Maximum Link Speed**: Set to match donor device (e.g., **Gen2**, **Gen3**).
- [ ] **Link Width**: Set to match donor device (e.g., **x1**, **x4**).

### **4.5. Configure Capabilities**

- [ ] **Enable Power Management** if the donor device supports it.
- [ ] **Enable MSI/MSI-X** if the donor device supports it.

### **4.6. Apply Changes and Lock IP Core**

- [ ] **Apply**: Click **OK** to save IP core settings.
- [ ] **Lock IP Core**: In the Tcl Console, run:

  ```tcl
  set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
  ```

---

## **5. Adjust Firmware for Advanced Features**

### **5.1. Update Capability Pointer**

- [ ] **File to Edit**: `pcileech_pcie_cfg_a7.sv`
- [ ] **Modify** `cfg_cap_pointer`:

  ```verilog
  cfg_cap_pointer <= 8'hXX;  // Replace XX with donor's capability pointer
  ```

### **5.2. Adjust Max Payload and Read Request Sizes**

- [ ] **In PCIe IP Core**: Set **Max Payload Size** and **Max Read Request Size** to match donor device.

- [ ] **In Firmware (`pcileech_pcie_cfg_a7.sv`)**:

  ```verilog
  max_payload_size_supported <= 3'bYYY;  // Binary value corresponding to donor's Max Payload Size
  ```

  - **Mapping**:

    | Payload Size (Bytes) | Binary Value |
    |----------------------|--------------|
    | 128                  | `3'b000`     |
    | 256                  | `3'b001`     |
    | 512                  | `3'b010`     |
    | 1024                 | `3'b011`     |
    | 2048                 | `3'b100`     |
    | 4096                 | `3'b101`     |

### **5.3. Implement Power Management Logic**

- [ ] **File to Edit**: `pcileech_pcie_cfg_a7.sv`
- [ ] **Add Logic** to handle power state transitions if applicable.

### **5.4. Implement MSI/MSI-X Interrupts**

- [ ] **In PCIe IP Core**: Enable MSI or MSI-X capability and set the number of supported vectors.

- [ ] **In Firmware (`pcileech_pcie_tlp_a7.sv`)**:

  - [ ] **Add Interrupt Logic** to handle MSI/MSI-X interrupts.

---

## **6. Adjust BAR Handling in Firmware**

### **6.1. Open BAR Controller File**

- [ ] **File to Edit**: `pcileech_tlps128_bar_controller.sv`
- [ ] **Location**: `pcileech-fpga/pcileech-wifi-main/src/pcileech_tlps128_bar_controller.sv`

### **6.2. Update BAR Address Decoding**

- [ ] **Modify** the address decoding logic to match the BAR sizes and addresses of the donor device.

### **6.3. Implement BAR Access Logic**

For each enabled BAR:

- [ ] **Implement
Download .txt
Showing preview only (301K chars total). Download the full file or copy to clipboard to get everything.
gitextract_gv5nd5na/

├── CN/
│   ├── README-old-2.md
│   ├── README-old.md
│   ├── README.md
│   ├── 核对表.md
│   └── 版本 4.md
├── Checklist.md
├── FW-Guide-v4.md
├── Lesson 3_ Advanced PCIe Configuration and Interrupt Handling.md
├── README-old.md
├── README-v2-old.md
├── README.md
├── RU/
│   └── README.md
└── Tools/
    ├── CH347/
    │   └── ch347-main/
    │       ├── CH347FPGATool/
    │       │   ├── FPGABit/
    │       │   │   ├── bscan_spi_xc3s100e.bit
    │       │   │   ├── bscan_spi_xc3s1200e.bit
    │       │   │   ├── bscan_spi_xc3s1400a.bit
    │       │   │   ├── bscan_spi_xc3s1400an.bit
    │       │   │   ├── bscan_spi_xc3s1600e.bit
    │       │   │   ├── bscan_spi_xc3s200a.bit
    │       │   │   ├── bscan_spi_xc3s200an.bit
    │       │   │   ├── bscan_spi_xc3s250e.bit
    │       │   │   ├── bscan_spi_xc3s400a.bit
    │       │   │   ├── bscan_spi_xc3s400an.bit
    │       │   │   ├── bscan_spi_xc3s500e.bit
    │       │   │   ├── bscan_spi_xc3s50a.bit
    │       │   │   ├── bscan_spi_xc3s50an.bit
    │       │   │   ├── bscan_spi_xc3s700a.bit
    │       │   │   ├── bscan_spi_xc3s700an.bit
    │       │   │   ├── bscan_spi_xc3sd1800a.bit
    │       │   │   ├── bscan_spi_xc3sd3400a.bit
    │       │   │   ├── bscan_spi_xc6slx100.bit
    │       │   │   ├── bscan_spi_xc6slx100t.bit
    │       │   │   ├── bscan_spi_xc6slx150.bit
    │       │   │   ├── bscan_spi_xc6slx150t.bit
    │       │   │   ├── bscan_spi_xc6slx16.bit
    │       │   │   ├── bscan_spi_xc6slx25.bit
    │       │   │   ├── bscan_spi_xc6slx25t.bit
    │       │   │   ├── bscan_spi_xc6slx4.bit
    │       │   │   ├── bscan_spi_xc6slx45.bit
    │       │   │   ├── bscan_spi_xc6slx45t.bit
    │       │   │   ├── bscan_spi_xc6slx75.bit
    │       │   │   ├── bscan_spi_xc6slx75t.bit
    │       │   │   ├── bscan_spi_xc6slx9.bit
    │       │   │   ├── bscan_spi_xc7a100t.bit
    │       │   │   ├── bscan_spi_xc7a12t.bit
    │       │   │   ├── bscan_spi_xc7a15t.bit
    │       │   │   ├── bscan_spi_xc7a200t.bit
    │       │   │   ├── bscan_spi_xc7a25t.bit
    │       │   │   ├── bscan_spi_xc7a35t.bit
    │       │   │   ├── bscan_spi_xc7a50t.bit
    │       │   │   ├── bscan_spi_xc7a75t.bit
    │       │   │   ├── bscan_spi_xc7k160t.bit
    │       │   │   ├── bscan_spi_xc7k325t-debug.bit
    │       │   │   ├── bscan_spi_xc7k325t.bit
    │       │   │   ├── bscan_spi_xc7k355t.bit
    │       │   │   ├── bscan_spi_xc7k410t.bit
    │       │   │   ├── bscan_spi_xc7k420t.bit
    │       │   │   ├── bscan_spi_xc7k480t.bit
    │       │   │   ├── bscan_spi_xc7k70t.bit
    │       │   │   ├── bscan_spi_xc7s25.bit
    │       │   │   ├── bscan_spi_xc7s50.bit
    │       │   │   ├── bscan_spi_xc7v2000t.bit
    │       │   │   ├── bscan_spi_xc7v585t.bit
    │       │   │   ├── bscan_spi_xc7vh580t.bit
    │       │   │   ├── bscan_spi_xc7vh870t.bit
    │       │   │   ├── bscan_spi_xc7vx1140t.bit
    │       │   │   ├── bscan_spi_xc7vx330t.bit
    │       │   │   ├── bscan_spi_xc7vx415t.bit
    │       │   │   ├── bscan_spi_xc7vx485t.bit
    │       │   │   ├── bscan_spi_xc7vx550t.bit
    │       │   │   ├── bscan_spi_xc7vx690t.bit
    │       │   │   ├── bscan_spi_xc7vx980t.bit
    │       │   │   └── bscan_spi_xcku040.bit
    │       │   ├── OpenOCD_CH347/
    │       │   │   ├── bin/
    │       │   │   │   └── ch347.cfg
    │       │   │   ├── contrib/
    │       │   │   │   ├── 60-openocd.rules
    │       │   │   │   └── libdcc/
    │       │   │   │       ├── README
    │       │   │   │       ├── dcc_stdio.c
    │       │   │   │       ├── dcc_stdio.h
    │       │   │   │       └── example.c
    │       │   │   ├── scripts/
    │       │   │   │   ├── bitsbytes.tcl
    │       │   │   │   ├── board/
    │       │   │   │   │   ├── 8devices-lima.cfg
    │       │   │   │   │   ├── actux3.cfg
    │       │   │   │   │   ├── adapteva_parallella1.cfg
    │       │   │   │   │   ├── adsp-sc584-ezbrd.cfg
    │       │   │   │   │   ├── alphascale_asm9260_ek.cfg
    │       │   │   │   │   ├── altera_sockit.cfg
    │       │   │   │   │   ├── am3517evm.cfg
    │       │   │   │   │   ├── ampere_emag8180.cfg
    │       │   │   │   │   ├── arm_evaluator7t.cfg
    │       │   │   │   │   ├── arm_musca_a.cfg
    │       │   │   │   │   ├── arty_s7.cfg
    │       │   │   │   │   ├── asus-rt-n16.cfg
    │       │   │   │   │   ├── asus-rt-n66u.cfg
    │       │   │   │   │   ├── at91cap7a-stk-sdram.cfg
    │       │   │   │   │   ├── at91eb40a.cfg
    │       │   │   │   │   ├── at91rm9200-dk.cfg
    │       │   │   │   │   ├── at91rm9200-ek.cfg
    │       │   │   │   │   ├── at91sam9261-ek.cfg
    │       │   │   │   │   ├── at91sam9263-ek.cfg
    │       │   │   │   │   ├── at91sam9g20-ek.cfg
    │       │   │   │   │   ├── atmel_at91sam7s-ek.cfg
    │       │   │   │   │   ├── atmel_at91sam9260-ek.cfg
    │       │   │   │   │   ├── atmel_at91sam9rl-ek.cfg
    │       │   │   │   │   ├── atmel_sam3n_ek.cfg
    │       │   │   │   │   ├── atmel_sam3s_ek.cfg
    │       │   │   │   │   ├── atmel_sam3u_ek.cfg
    │       │   │   │   │   ├── atmel_sam3x_ek.cfg
    │       │   │   │   │   ├── atmel_sam4e_ek.cfg
    │       │   │   │   │   ├── atmel_sam4l8_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_sam4s_ek.cfg
    │       │   │   │   │   ├── atmel_sam4s_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samc20_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samc21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samd10_xplained_mini.cfg
    │       │   │   │   │   ├── atmel_samd11_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samd20_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samd21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_same70_xplained.cfg
    │       │   │   │   │   ├── atmel_samg53_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samg55_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_saml21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samr21_xplained_pro.cfg
    │       │   │   │   │   ├── atmel_samv71_xplained_ultra.cfg
    │       │   │   │   │   ├── avnet_ultrazed-eg.cfg
    │       │   │   │   │   ├── balloon3-cpu.cfg
    │       │   │   │   │   ├── bcm28155_ap.cfg
    │       │   │   │   │   ├── bluefield.cfg
    │       │   │   │   │   ├── bt-homehubv1.cfg
    │       │   │   │   │   ├── colibri.cfg
    │       │   │   │   │   ├── crossbow_tech_imote2.cfg
    │       │   │   │   │   ├── csb337.cfg
    │       │   │   │   │   ├── csb732.cfg
    │       │   │   │   │   ├── da850evm.cfg
    │       │   │   │   │   ├── digi_connectcore_wi-9c.cfg
    │       │   │   │   │   ├── digilent_analog_discovery.cfg
    │       │   │   │   │   ├── digilent_atlys.cfg
    │       │   │   │   │   ├── digilent_nexys_video.cfg
    │       │   │   │   │   ├── digilent_zedboard.cfg
    │       │   │   │   │   ├── diolan_lpc4350-db1.cfg
    │       │   │   │   │   ├── diolan_lpc4357-db1.cfg
    │       │   │   │   │   ├── dk-tm4c129.cfg
    │       │   │   │   │   ├── dm355evm.cfg
    │       │   │   │   │   ├── dm365evm.cfg
    │       │   │   │   │   ├── dm6446evm.cfg
    │       │   │   │   │   ├── dp_busblaster_v3.cfg
    │       │   │   │   │   ├── dp_busblaster_v4.cfg
    │       │   │   │   │   ├── dptechnics_dpt-board-v1.cfg
    │       │   │   │   │   ├── efikamx.cfg
    │       │   │   │   │   ├── efm32.cfg
    │       │   │   │   │   ├── eir.cfg
    │       │   │   │   │   ├── ek-lm3s1968.cfg
    │       │   │   │   │   ├── ek-lm3s3748.cfg
    │       │   │   │   │   ├── ek-lm3s6965.cfg
    │       │   │   │   │   ├── ek-lm3s811-revb.cfg
    │       │   │   │   │   ├── ek-lm3s811.cfg
    │       │   │   │   │   ├── ek-lm3s8962.cfg
    │       │   │   │   │   ├── ek-lm3s9b9x.cfg
    │       │   │   │   │   ├── ek-lm3s9d92.cfg
    │       │   │   │   │   ├── ek-lm4f120xl.cfg
    │       │   │   │   │   ├── ek-lm4f232.cfg
    │       │   │   │   │   ├── ek-tm4c123gxl.cfg
    │       │   │   │   │   ├── ek-tm4c1294xl.cfg
    │       │   │   │   │   ├── embedded-artists_lpc2478-32.cfg
    │       │   │   │   │   ├── emcraft_imx8m-som-bsb.cfg
    │       │   │   │   │   ├── emcraft_twr-vf6-som-bsb.cfg
    │       │   │   │   │   ├── emcraft_vf6-som.cfg
    │       │   │   │   │   ├── esp32s2-kaluga-1.cfg
    │       │   │   │   │   ├── ethernut3.cfg
    │       │   │   │   │   ├── evb-lan9255.cfg
    │       │   │   │   │   ├── frdm-kl25z.cfg
    │       │   │   │   │   ├── frdm-kl46z.cfg
    │       │   │   │   │   ├── fsl_imx6q_sabresd.cfg
    │       │   │   │   │   ├── glyn_tonga2.cfg
    │       │   │   │   │   ├── gti/
    │       │   │   │   │   │   └── espressobin.cfg
    │       │   │   │   │   ├── gumstix-aerocore.cfg
    │       │   │   │   │   ├── hammer.cfg
    │       │   │   │   │   ├── hilscher_nxdb500sys.cfg
    │       │   │   │   │   ├── hilscher_nxeb500hmi.cfg
    │       │   │   │   │   ├── hilscher_nxhx10.cfg
    │       │   │   │   │   ├── hilscher_nxhx50.cfg
    │       │   │   │   │   ├── hilscher_nxhx500.cfg
    │       │   │   │   │   ├── hilscher_nxsb100.cfg
    │       │   │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   │   ├── hitex_lpc2929.cfg
    │       │   │   │   │   ├── hitex_stm32-performancestick.cfg
    │       │   │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   │   ├── iar_lpc1768.cfg
    │       │   │   │   │   ├── iar_str912_sk.cfg
    │       │   │   │   │   ├── icnova_imx53_sodimm.cfg
    │       │   │   │   │   ├── icnova_sam9g45_sodimm.cfg
    │       │   │   │   │   ├── imx27ads.cfg
    │       │   │   │   │   ├── imx27lnst.cfg
    │       │   │   │   │   ├── imx28evk.cfg
    │       │   │   │   │   ├── imx31pdk.cfg
    │       │   │   │   │   ├── imx35pdk.cfg
    │       │   │   │   │   ├── imx53-m53evk.cfg
    │       │   │   │   │   ├── imx53loco.cfg
    │       │   │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   │   ├── insignal_arndale.cfg
    │       │   │   │   │   ├── kasli.cfg
    │       │   │   │   │   ├── kc100.cfg
    │       │   │   │   │   ├── kc705.cfg
    │       │   │   │   │   ├── kcu105.cfg
    │       │   │   │   │   ├── keil_mcb1700.cfg
    │       │   │   │   │   ├── keil_mcb2140.cfg
    │       │   │   │   │   ├── kindle2.cfg
    │       │   │   │   │   ├── kontron_sl28.cfg
    │       │   │   │   │   ├── kwikstik.cfg
    │       │   │   │   │   ├── la_fonera-fon2200.cfg
    │       │   │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   │   ├── lemaker_hikey.cfg
    │       │   │   │   │   ├── linksys-wag200g.cfg
    │       │   │   │   │   ├── linksys-wrt54gl.cfg
    │       │   │   │   │   ├── linksys_nslu2.cfg
    │       │   │   │   │   ├── lisa-l.cfg
    │       │   │   │   │   ├── logicpd_imx27.cfg
    │       │   │   │   │   ├── lpc1850_spifi_generic.cfg
    │       │   │   │   │   ├── lpc4350_spifi_generic.cfg
    │       │   │   │   │   ├── lubbock.cfg
    │       │   │   │   │   ├── marsohod.cfg
    │       │   │   │   │   ├── marsohod2.cfg
    │       │   │   │   │   ├── marsohod3.cfg
    │       │   │   │   │   ├── mbed-lpc11u24.cfg
    │       │   │   │   │   ├── mbed-lpc1768.cfg
    │       │   │   │   │   ├── mcb1700.cfg
    │       │   │   │   │   ├── microchip_explorer16.cfg
    │       │   │   │   │   ├── microchip_sama5d27_som1_kit1.cfg
    │       │   │   │   │   ├── microchip_same51_curiosity_nano.cfg
    │       │   │   │   │   ├── microchip_same54_xplained_pro.cfg
    │       │   │   │   │   ├── microchip_saml11_xplained_pro.cfg
    │       │   │   │   │   ├── mini2440.cfg
    │       │   │   │   │   ├── mini6410.cfg
    │       │   │   │   │   ├── minispartan6.cfg
    │       │   │   │   │   ├── nds32_corvettef1.cfg
    │       │   │   │   │   ├── nds32_xc5.cfg
    │       │   │   │   │   ├── nds32_xc7.cfg
    │       │   │   │   │   ├── netgear-dg834v3.cfg
    │       │   │   │   │   ├── netgear-wg102.cfg
    │       │   │   │   │   ├── nordic_nrf51822_mkit.cfg
    │       │   │   │   │   ├── nordic_nrf51_dk.cfg
    │       │   │   │   │   ├── nordic_nrf52_dk.cfg
    │       │   │   │   │   ├── nordic_nrf52_ftx232.cfg
    │       │   │   │   │   ├── novena-internal-fpga.cfg
    │       │   │   │   │   ├── npcx_evb.cfg
    │       │   │   │   │   ├── numato_mimas_a7.cfg
    │       │   │   │   │   ├── numato_opsis.cfg
    │       │   │   │   │   ├── nxp_frdm-k64f.cfg
    │       │   │   │   │   ├── nxp_frdm-ls1012a.cfg
    │       │   │   │   │   ├── nxp_imx7sabre.cfg
    │       │   │   │   │   ├── nxp_lpc-link2.cfg
    │       │   │   │   │   ├── nxp_mcimx8m-evk.cfg
    │       │   │   │   │   ├── nxp_rdb-ls1046a.cfg
    │       │   │   │   │   ├── nxp_rdb-ls1088a.cfg
    │       │   │   │   │   ├── olimex_LPC2378STK.cfg
    │       │   │   │   │   ├── olimex_lpc_h2148.cfg
    │       │   │   │   │   ├── olimex_sam7_ex256.cfg
    │       │   │   │   │   ├── olimex_sam7_la2.cfg
    │       │   │   │   │   ├── olimex_sam9_l9260.cfg
    │       │   │   │   │   ├── olimex_stm32_h103.cfg
    │       │   │   │   │   ├── olimex_stm32_h107.cfg
    │       │   │   │   │   ├── olimex_stm32_h405.cfg
    │       │   │   │   │   ├── olimex_stm32_p107.cfg
    │       │   │   │   │   ├── omap2420_h4.cfg
    │       │   │   │   │   ├── openrd.cfg
    │       │   │   │   │   ├── or1k_generic.cfg
    │       │   │   │   │   ├── osk5912.cfg
    │       │   │   │   │   ├── phone_se_j100i.cfg
    │       │   │   │   │   ├── phytec_lpc3250.cfg
    │       │   │   │   │   ├── pic-p32mx.cfg
    │       │   │   │   │   ├── pico-debug.cfg
    │       │   │   │   │   ├── pipistrello.cfg
    │       │   │   │   │   ├── propox_mmnet1001.cfg
    │       │   │   │   │   ├── pxa255_sst.cfg
    │       │   │   │   │   ├── quark_d2000_refboard.cfg
    │       │   │   │   │   ├── quark_x10xx_board.cfg
    │       │   │   │   │   ├── quicklogic_quickfeather.cfg
    │       │   │   │   │   ├── radiona_ulx3s.cfg
    │       │   │   │   │   ├── redbee.cfg
    │       │   │   │   │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │       │   │   │   │   ├── renesas_dk-s7g2.cfg
    │       │   │   │   │   ├── renesas_falcon.cfg
    │       │   │   │   │   ├── renesas_gr_peach.cfg
    │       │   │   │   │   ├── renesas_porter.cfg
    │       │   │   │   │   ├── renesas_salvator-xs.cfg
    │       │   │   │   │   ├── renesas_silk.cfg
    │       │   │   │   │   ├── renesas_stout.cfg
    │       │   │   │   │   ├── rigado_bmd300_ek.cfg
    │       │   │   │   │   ├── rpi3.cfg
    │       │   │   │   │   ├── rpi4b.cfg
    │       │   │   │   │   ├── rsc-w910.cfg
    │       │   │   │   │   ├── sayma_amc.cfg
    │       │   │   │   │   ├── sheevaplug.cfg
    │       │   │   │   │   ├── sifive-e31arty.cfg
    │       │   │   │   │   ├── sifive-e51arty.cfg
    │       │   │   │   │   ├── sifive-hifive1-revb.cfg
    │       │   │   │   │   ├── sifive-hifive1.cfg
    │       │   │   │   │   ├── smdk6410.cfg
    │       │   │   │   │   ├── snps_em_sk.cfg
    │       │   │   │   │   ├── snps_em_sk_v1.cfg
    │       │   │   │   │   ├── snps_em_sk_v2.1.cfg
    │       │   │   │   │   ├── snps_em_sk_v2.2.cfg
    │       │   │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │       │   │   │   │   ├── spansion_sk-fm4-u120-9b560.cfg
    │       │   │   │   │   ├── spear300evb.cfg
    │       │   │   │   │   ├── spear300evb_mod.cfg
    │       │   │   │   │   ├── spear310evb20.cfg
    │       │   │   │   │   ├── spear310evb20_mod.cfg
    │       │   │   │   │   ├── spear320cpu.cfg
    │       │   │   │   │   ├── spear320cpu_mod.cfg
    │       │   │   │   │   ├── st_b-l475e-iot01a.cfg
    │       │   │   │   │   ├── st_nucleo_8l152r8.cfg
    │       │   │   │   │   ├── st_nucleo_8s208rb.cfg
    │       │   │   │   │   ├── st_nucleo_f0.cfg
    │       │   │   │   │   ├── st_nucleo_f103rb.cfg
    │       │   │   │   │   ├── st_nucleo_f3.cfg
    │       │   │   │   │   ├── st_nucleo_f4.cfg
    │       │   │   │   │   ├── st_nucleo_f7.cfg
    │       │   │   │   │   ├── st_nucleo_g0.cfg
    │       │   │   │   │   ├── st_nucleo_g4.cfg
    │       │   │   │   │   ├── st_nucleo_h743zi.cfg
    │       │   │   │   │   ├── st_nucleo_h745zi.cfg
    │       │   │   │   │   ├── st_nucleo_l073rz.cfg
    │       │   │   │   │   ├── st_nucleo_l1.cfg
    │       │   │   │   │   ├── st_nucleo_l4.cfg
    │       │   │   │   │   ├── st_nucleo_l5.cfg
    │       │   │   │   │   ├── st_nucleo_wb55.cfg
    │       │   │   │   │   ├── steval-idb007v1.cfg
    │       │   │   │   │   ├── steval-idb008v1.cfg
    │       │   │   │   │   ├── steval-idb011v1.cfg
    │       │   │   │   │   ├── steval-idb012v1.cfg
    │       │   │   │   │   ├── steval_pcc010.cfg
    │       │   │   │   │   ├── stm320518_eval.cfg
    │       │   │   │   │   ├── stm320518_eval_stlink.cfg
    │       │   │   │   │   ├── stm32100b_eval.cfg
    │       │   │   │   │   ├── stm3210b_eval.cfg
    │       │   │   │   │   ├── stm3210c_eval.cfg
    │       │   │   │   │   ├── stm3210e_eval.cfg
    │       │   │   │   │   ├── stm3220g_eval.cfg
    │       │   │   │   │   ├── stm3220g_eval_stlink.cfg
    │       │   │   │   │   ├── stm3241g_eval.cfg
    │       │   │   │   │   ├── stm3241g_eval_stlink.cfg
    │       │   │   │   │   ├── stm32429i_eval.cfg
    │       │   │   │   │   ├── stm32429i_eval_stlink.cfg
    │       │   │   │   │   ├── stm32439i_eval.cfg
    │       │   │   │   │   ├── stm32439i_eval_stlink.cfg
    │       │   │   │   │   ├── stm327x6g_eval.cfg
    │       │   │   │   │   ├── stm32f0discovery.cfg
    │       │   │   │   │   ├── stm32f103c8_blue_pill.cfg
    │       │   │   │   │   ├── stm32f334discovery.cfg
    │       │   │   │   │   ├── stm32f3discovery.cfg
    │       │   │   │   │   ├── stm32f412g-disco.cfg
    │       │   │   │   │   ├── stm32f413h-disco.cfg
    │       │   │   │   │   ├── stm32f429disc1.cfg
    │       │   │   │   │   ├── stm32f429discovery.cfg
    │       │   │   │   │   ├── stm32f469discovery.cfg
    │       │   │   │   │   ├── stm32f469i-disco.cfg
    │       │   │   │   │   ├── stm32f4discovery.cfg
    │       │   │   │   │   ├── stm32f723e-disco.cfg
    │       │   │   │   │   ├── stm32f746g-disco.cfg
    │       │   │   │   │   ├── stm32f769i-disco.cfg
    │       │   │   │   │   ├── stm32f7discovery.cfg
    │       │   │   │   │   ├── stm32h735g-disco.cfg
    │       │   │   │   │   ├── stm32h745i-disco.cfg
    │       │   │   │   │   ├── stm32h747i-disco.cfg
    │       │   │   │   │   ├── stm32h750b-disco.cfg
    │       │   │   │   │   ├── stm32h7b3i-disco.cfg
    │       │   │   │   │   ├── stm32h7x3i_eval.cfg
    │       │   │   │   │   ├── stm32h7x_dual_qspi.cfg
    │       │   │   │   │   ├── stm32l0discovery.cfg
    │       │   │   │   │   ├── stm32l476g-disco.cfg
    │       │   │   │   │   ├── stm32l496g-disco.cfg
    │       │   │   │   │   ├── stm32l4discovery.cfg
    │       │   │   │   │   ├── stm32l4p5g-disco.cfg
    │       │   │   │   │   ├── stm32l4r9i-disco.cfg
    │       │   │   │   │   ├── stm32ldiscovery.cfg
    │       │   │   │   │   ├── stm32mp13x_dk.cfg
    │       │   │   │   │   ├── stm32mp15x_dk2.cfg
    │       │   │   │   │   ├── stm32vldiscovery.cfg
    │       │   │   │   │   ├── str910-eval.cfg
    │       │   │   │   │   ├── telo.cfg
    │       │   │   │   │   ├── ti_am335xevm.cfg
    │       │   │   │   │   ├── ti_am437x_idk.cfg
    │       │   │   │   │   ├── ti_am43xx_evm.cfg
    │       │   │   │   │   ├── ti_am625evm.cfg
    │       │   │   │   │   ├── ti_am642evm.cfg
    │       │   │   │   │   ├── ti_am654evm.cfg
    │       │   │   │   │   ├── ti_beagleboard.cfg
    │       │   │   │   │   ├── ti_beagleboard_xm.cfg
    │       │   │   │   │   ├── ti_beaglebone-base.cfg
    │       │   │   │   │   ├── ti_beaglebone.cfg
    │       │   │   │   │   ├── ti_beaglebone_black.cfg
    │       │   │   │   │   ├── ti_blaze.cfg
    │       │   │   │   │   ├── ti_cc13x0_launchpad.cfg
    │       │   │   │   │   ├── ti_cc13x2_launchpad.cfg
    │       │   │   │   │   ├── ti_cc26x0_launchpad.cfg
    │       │   │   │   │   ├── ti_cc26x2_launchpad.cfg
    │       │   │   │   │   ├── ti_cc3200_launchxl.cfg
    │       │   │   │   │   ├── ti_cc3220sf_launchpad.cfg
    │       │   │   │   │   ├── ti_cc32xx_launchpad.cfg
    │       │   │   │   │   ├── ti_dk-tm4c129.cfg
    │       │   │   │   │   ├── ti_ek-tm4c123gxl.cfg
    │       │   │   │   │   ├── ti_ek-tm4c1294xl.cfg
    │       │   │   │   │   ├── ti_j7200evm.cfg
    │       │   │   │   │   ├── ti_j721evm.cfg
    │       │   │   │   │   ├── ti_j721s2evm.cfg
    │       │   │   │   │   ├── ti_msp432_launchpad.cfg
    │       │   │   │   │   ├── ti_pandaboard.cfg
    │       │   │   │   │   ├── ti_pandaboard_es.cfg
    │       │   │   │   │   ├── ti_tmdx570ls20susb.cfg
    │       │   │   │   │   ├── ti_tmdx570ls31usb.cfg
    │       │   │   │   │   ├── tocoding_poplar.cfg
    │       │   │   │   │   ├── topas910.cfg
    │       │   │   │   │   ├── topasa900.cfg
    │       │   │   │   │   ├── tp-link_tl-mr3020.cfg
    │       │   │   │   │   ├── tp-link_wdr4300.cfg
    │       │   │   │   │   ├── twr-k60f120m.cfg
    │       │   │   │   │   ├── twr-k60n512.cfg
    │       │   │   │   │   ├── twr-vf65gs10.cfg
    │       │   │   │   │   ├── twr-vf65gs10_cmsisdap.cfg
    │       │   │   │   │   ├── tx25_stk5.cfg
    │       │   │   │   │   ├── tx27_stk5.cfg
    │       │   │   │   │   ├── unknown_at91sam9260.cfg
    │       │   │   │   │   ├── uptech_2410.cfg
    │       │   │   │   │   ├── vd_a53x2_jtag.cfg
    │       │   │   │   │   ├── vd_m4_jtag.cfg
    │       │   │   │   │   ├── vd_pulpissimo_jtag.cfg
    │       │   │   │   │   ├── vd_swerv_jtag.cfg
    │       │   │   │   │   ├── verdex.cfg
    │       │   │   │   │   ├── voipac.cfg
    │       │   │   │   │   ├── voltcraft_dso-3062c.cfg
    │       │   │   │   │   ├── x300t.cfg
    │       │   │   │   │   ├── xmc-2go.cfg
    │       │   │   │   │   ├── xmc1100-boot-kit.cfg
    │       │   │   │   │   ├── xmc4200-application-kit-actuator.cfg
    │       │   │   │   │   ├── xmc4300-relax.cfg
    │       │   │   │   │   ├── xmc4500-application-kit-general.cfg
    │       │   │   │   │   ├── xmc4500-application-kit-sdram.cfg
    │       │   │   │   │   ├── xmc4500-relax.cfg
    │       │   │   │   │   ├── xmc4700-relax.cfg
    │       │   │   │   │   ├── xmc4800-relax.cfg
    │       │   │   │   │   └── xmos_xk-xac-xa8_arm.cfg
    │       │   │   │   ├── chip/
    │       │   │   │   │   ├── atmel/
    │       │   │   │   │   │   └── at91/
    │       │   │   │   │   │       ├── aic.tcl
    │       │   │   │   │   │       ├── at91_pio.cfg
    │       │   │   │   │   │       ├── at91_pmc.cfg
    │       │   │   │   │   │       ├── at91_rstc.cfg
    │       │   │   │   │   │       ├── at91_wdt.cfg
    │       │   │   │   │   │       ├── at91sam7x128.tcl
    │       │   │   │   │   │       ├── at91sam7x256.tcl
    │       │   │   │   │   │       ├── at91sam9261.cfg
    │       │   │   │   │   │       ├── at91sam9261_matrix.cfg
    │       │   │   │   │   │       ├── at91sam9263.cfg
    │       │   │   │   │   │       ├── at91sam9263_matrix.cfg
    │       │   │   │   │   │       ├── at91sam9_init.cfg
    │       │   │   │   │   │       ├── at91sam9_sdramc.cfg
    │       │   │   │   │   │       ├── at91sam9_smc.cfg
    │       │   │   │   │   │       ├── hardware.cfg
    │       │   │   │   │   │       ├── pmc.tcl
    │       │   │   │   │   │       ├── rtt.tcl
    │       │   │   │   │   │       ├── sam9_smc.cfg
    │       │   │   │   │   │       └── usarts.tcl
    │       │   │   │   │   ├── st/
    │       │   │   │   │   │   ├── spear/
    │       │   │   │   │   │   │   ├── quirk_no_srst.tcl
    │       │   │   │   │   │   │   ├── spear3xx.tcl
    │       │   │   │   │   │   │   └── spear3xx_ddr.tcl
    │       │   │   │   │   │   └── stm32/
    │       │   │   │   │   │       ├── stm32.tcl
    │       │   │   │   │   │       ├── stm32_rcc.tcl
    │       │   │   │   │   │       └── stm32_regs.tcl
    │       │   │   │   │   └── ti/
    │       │   │   │   │       └── lm3s/
    │       │   │   │   │           ├── lm3s.tcl
    │       │   │   │   │           └── lm3s_regs.tcl
    │       │   │   │   ├── cpld/
    │       │   │   │   │   ├── altera-5m570z-cpld.cfg
    │       │   │   │   │   ├── altera-epm240.cfg
    │       │   │   │   │   ├── jtagspi.cfg
    │       │   │   │   │   ├── lattice-lc4032ze.cfg
    │       │   │   │   │   ├── xilinx-xc6s.cfg
    │       │   │   │   │   ├── xilinx-xc7.cfg
    │       │   │   │   │   ├── xilinx-xcf-p.cfg
    │       │   │   │   │   ├── xilinx-xcf-s.cfg
    │       │   │   │   │   ├── xilinx-xcr3256.cfg
    │       │   │   │   │   └── xilinx-xcu.cfg
    │       │   │   │   ├── cpu/
    │       │   │   │   │   ├── arc/
    │       │   │   │   │   │   ├── common.tcl
    │       │   │   │   │   │   ├── em.tcl
    │       │   │   │   │   │   ├── hs.tcl
    │       │   │   │   │   │   └── v2.tcl
    │       │   │   │   │   └── arm/
    │       │   │   │   │       ├── arm7tdmi.tcl
    │       │   │   │   │       ├── arm920.tcl
    │       │   │   │   │       ├── arm946.tcl
    │       │   │   │   │       ├── arm966.tcl
    │       │   │   │   │       └── cortex_m3.tcl
    │       │   │   │   ├── fpga/
    │       │   │   │   │   ├── altera-10m50.cfg
    │       │   │   │   │   ├── altera-ep3c10.cfg
    │       │   │   │   │   ├── altera-ep4ce10.cfg
    │       │   │   │   │   ├── lattice_ecp5.cfg
    │       │   │   │   │   ├── xilinx-dna.cfg
    │       │   │   │   │   └── xilinx-xadc.cfg
    │       │   │   │   ├── interface/
    │       │   │   │   │   ├── altera-usb-blaster.cfg
    │       │   │   │   │   ├── altera-usb-blaster2.cfg
    │       │   │   │   │   ├── arm-jtag-ew.cfg
    │       │   │   │   │   ├── at91rm9200.cfg
    │       │   │   │   │   ├── beaglebone-jtag-native.cfg
    │       │   │   │   │   ├── beaglebone-swd-native.cfg
    │       │   │   │   │   ├── buspirate.cfg
    │       │   │   │   │   ├── calao-usb-a9260.cfg
    │       │   │   │   │   ├── chameleon.cfg
    │       │   │   │   │   ├── cmsis-dap.cfg
    │       │   │   │   │   ├── dln-2-gpiod.cfg
    │       │   │   │   │   ├── dummy.cfg
    │       │   │   │   │   ├── estick.cfg
    │       │   │   │   │   ├── flashlink.cfg
    │       │   │   │   │   ├── ft232r/
    │       │   │   │   │   │   └── radiona_ulx3s.cfg
    │       │   │   │   │   ├── ft232r.cfg
    │       │   │   │   │   ├── ftdi/
    │       │   │   │   │   │   ├── 100ask-openjtag.cfg
    │       │   │   │   │   │   ├── ashling-opella-ld-jtag.cfg
    │       │   │   │   │   │   ├── ashling-opella-ld-swd.cfg
    │       │   │   │   │   │   ├── axm0432.cfg
    │       │   │   │   │   │   ├── c232hm.cfg
    │       │   │   │   │   │   ├── calao-usb-a9260-c01.cfg
    │       │   │   │   │   │   ├── calao-usb-a9260-c02.cfg
    │       │   │   │   │   │   ├── cortino.cfg
    │       │   │   │   │   │   ├── digilent-hs1.cfg
    │       │   │   │   │   │   ├── digilent-hs2.cfg
    │       │   │   │   │   │   ├── digilent_jtag_hs3.cfg
    │       │   │   │   │   │   ├── digilent_jtag_smt2.cfg
    │       │   │   │   │   │   ├── digilent_jtag_smt2_nc.cfg
    │       │   │   │   │   │   ├── dlp-usb1232h.cfg
    │       │   │   │   │   │   ├── dp_busblaster.cfg
    │       │   │   │   │   │   ├── dp_busblaster_kt-link.cfg
    │       │   │   │   │   │   ├── esp32s2_kaluga_v1.cfg
    │       │   │   │   │   │   ├── flossjtag-noeeprom.cfg
    │       │   │   │   │   │   ├── flossjtag.cfg
    │       │   │   │   │   │   ├── flyswatter.cfg
    │       │   │   │   │   │   ├── flyswatter2.cfg
    │       │   │   │   │   │   ├── ft232h-module-swd.cfg
    │       │   │   │   │   │   ├── gw16042.cfg
    │       │   │   │   │   │   ├── hie-jtag.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx10_etm.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx500_etm.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx500_re.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx50_etm.cfg
    │       │   │   │   │   │   ├── hilscher_nxhx50_re.cfg
    │       │   │   │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   │   │   ├── icebear.cfg
    │       │   │   │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   │   │   ├── incircuit-icprog.cfg
    │       │   │   │   │   │   ├── iotlab-usb.cfg
    │       │   │   │   │   │   ├── isodebug.cfg
    │       │   │   │   │   │   ├── jtag-lock-pick_tiny_2.cfg
    │       │   │   │   │   │   ├── jtagkey.cfg
    │       │   │   │   │   │   ├── jtagkey2.cfg
    │       │   │   │   │   │   ├── jtagkey2p.cfg
    │       │   │   │   │   │   ├── kt-link.cfg
    │       │   │   │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   │   │   ├── lisa-l.cfg
    │       │   │   │   │   │   ├── luminary-icdi.cfg
    │       │   │   │   │   │   ├── luminary-lm3s811.cfg
    │       │   │   │   │   │   ├── luminary.cfg
    │       │   │   │   │   │   ├── m53evk.cfg
    │       │   │   │   │   │   ├── mbftdi.cfg
    │       │   │   │   │   │   ├── minimodule-swd.cfg
    │       │   │   │   │   │   ├── minimodule.cfg
    │       │   │   │   │   │   ├── minispartan6.cfg
    │       │   │   │   │   │   ├── miniwiggler.cfg
    │       │   │   │   │   │   ├── neodb.cfg
    │       │   │   │   │   │   ├── ngxtech.cfg
    │       │   │   │   │   │   ├── olimex-arm-jtag-swd.cfg
    │       │   │   │   │   │   ├── olimex-arm-usb-ocd-h.cfg
    │       │   │   │   │   │   ├── olimex-arm-usb-ocd.cfg
    │       │   │   │   │   │   ├── olimex-arm-usb-tiny-h.cfg
    │       │   │   │   │   │   ├── olimex-jtag-tiny.cfg
    │       │   │   │   │   │   ├── oocdlink.cfg
    │       │   │   │   │   │   ├── opendous_ftdi.cfg
    │       │   │   │   │   │   ├── openocd-usb-hs.cfg
    │       │   │   │   │   │   ├── openocd-usb.cfg
    │       │   │   │   │   │   ├── openrd.cfg
    │       │   │   │   │   │   ├── pipistrello.cfg
    │       │   │   │   │   │   ├── pls_spc5.cfg
    │       │   │   │   │   │   ├── redbee-econotag.cfg
    │       │   │   │   │   │   ├── redbee-usb.cfg
    │       │   │   │   │   │   ├── rowley-cc-arm-swd.cfg
    │       │   │   │   │   │   ├── sheevaplug.cfg
    │       │   │   │   │   │   ├── signalyzer-lite.cfg
    │       │   │   │   │   │   ├── signalyzer.cfg
    │       │   │   │   │   │   ├── snps_sdp.cfg
    │       │   │   │   │   │   ├── steppenprobe.cfg
    │       │   │   │   │   │   ├── stm32-stick.cfg
    │       │   │   │   │   │   ├── swd-resistor-hack.cfg
    │       │   │   │   │   │   ├── ti-icdi.cfg
    │       │   │   │   │   │   ├── tigard.cfg
    │       │   │   │   │   │   ├── tumpa-lite.cfg
    │       │   │   │   │   │   ├── tumpa.cfg
    │       │   │   │   │   │   ├── turtelizer2-revB.cfg
    │       │   │   │   │   │   ├── turtelizer2-revC.cfg
    │       │   │   │   │   │   ├── um232h.cfg
    │       │   │   │   │   │   ├── vpaclink.cfg
    │       │   │   │   │   │   ├── xds100v2.cfg
    │       │   │   │   │   │   └── xds100v3.cfg
    │       │   │   │   │   ├── imx-native.cfg
    │       │   │   │   │   ├── jlink.cfg
    │       │   │   │   │   ├── jtag_dpi.cfg
    │       │   │   │   │   ├── jtag_hat_rpi2.cfg
    │       │   │   │   │   ├── jtag_vpi.cfg
    │       │   │   │   │   ├── kitprog.cfg
    │       │   │   │   │   ├── nds32-aice.cfg
    │       │   │   │   │   ├── nulink.cfg
    │       │   │   │   │   ├── opendous.cfg
    │       │   │   │   │   ├── openjtag.cfg
    │       │   │   │   │   ├── osbdm.cfg
    │       │   │   │   │   ├── parport.cfg
    │       │   │   │   │   ├── parport_dlc5.cfg
    │       │   │   │   │   ├── raspberrypi-native.cfg
    │       │   │   │   │   ├── raspberrypi2-native.cfg
    │       │   │   │   │   ├── rlink.cfg
    │       │   │   │   │   ├── rshim.cfg
    │       │   │   │   │   ├── stlink-dap.cfg
    │       │   │   │   │   ├── stlink-v1.cfg
    │       │   │   │   │   ├── stlink-v2-1.cfg
    │       │   │   │   │   ├── stlink-v2.cfg
    │       │   │   │   │   ├── stlink.cfg
    │       │   │   │   │   ├── sysfsgpio-raspberrypi.cfg
    │       │   │   │   │   ├── ti-icdi.cfg
    │       │   │   │   │   ├── ulink.cfg
    │       │   │   │   │   ├── usb-jtag.cfg
    │       │   │   │   │   ├── usbprog.cfg
    │       │   │   │   │   ├── vdebug.cfg
    │       │   │   │   │   ├── vsllink.cfg
    │       │   │   │   │   └── xds110.cfg
    │       │   │   │   ├── mem_helper.tcl
    │       │   │   │   ├── memory.tcl
    │       │   │   │   ├── mmr_helpers.tcl
    │       │   │   │   ├── target/
    │       │   │   │   │   ├── 1986ве1т.cfg
    │       │   │   │   │   ├── adsp-sc58x.cfg
    │       │   │   │   │   ├── aduc702x.cfg
    │       │   │   │   │   ├── aducm360.cfg
    │       │   │   │   │   ├── allwinner_v3s.cfg
    │       │   │   │   │   ├── alphascale_asm9260t.cfg
    │       │   │   │   │   ├── altera_fpgasoc.cfg
    │       │   │   │   │   ├── altera_fpgasoc_arria10.cfg
    │       │   │   │   │   ├── am335x.cfg
    │       │   │   │   │   ├── am437x.cfg
    │       │   │   │   │   ├── amdm37x.cfg
    │       │   │   │   │   ├── ampere_emag.cfg
    │       │   │   │   │   ├── ar71xx.cfg
    │       │   │   │   │   ├── arm_corelink_sse200.cfg
    │       │   │   │   │   ├── armada370.cfg
    │       │   │   │   │   ├── at32ap7000.cfg
    │       │   │   │   │   ├── at91r40008.cfg
    │       │   │   │   │   ├── at91rm9200.cfg
    │       │   │   │   │   ├── at91sam3XXX.cfg
    │       │   │   │   │   ├── at91sam3ax_4x.cfg
    │       │   │   │   │   ├── at91sam3ax_8x.cfg
    │       │   │   │   │   ├── at91sam3ax_xx.cfg
    │       │   │   │   │   ├── at91sam3nXX.cfg
    │       │   │   │   │   ├── at91sam3sXX.cfg
    │       │   │   │   │   ├── at91sam3u1c.cfg
    │       │   │   │   │   ├── at91sam3u1e.cfg
    │       │   │   │   │   ├── at91sam3u2c.cfg
    │       │   │   │   │   ├── at91sam3u2e.cfg
    │       │   │   │   │   ├── at91sam3u4c.cfg
    │       │   │   │   │   ├── at91sam3u4e.cfg
    │       │   │   │   │   ├── at91sam3uxx.cfg
    │       │   │   │   │   ├── at91sam4XXX.cfg
    │       │   │   │   │   ├── at91sam4c32x.cfg
    │       │   │   │   │   ├── at91sam4cXXX.cfg
    │       │   │   │   │   ├── at91sam4lXX.cfg
    │       │   │   │   │   ├── at91sam4sXX.cfg
    │       │   │   │   │   ├── at91sam4sd32x.cfg
    │       │   │   │   │   ├── at91sam7a2.cfg
    │       │   │   │   │   ├── at91sam7se512.cfg
    │       │   │   │   │   ├── at91sam7sx.cfg
    │       │   │   │   │   ├── at91sam7x256.cfg
    │       │   │   │   │   ├── at91sam7x512.cfg
    │       │   │   │   │   ├── at91sam9.cfg
    │       │   │   │   │   ├── at91sam9260.cfg
    │       │   │   │   │   ├── at91sam9260_ext_RAM_ext_flash.cfg
    │       │   │   │   │   ├── at91sam9261.cfg
    │       │   │   │   │   ├── at91sam9263.cfg
    │       │   │   │   │   ├── at91sam9g10.cfg
    │       │   │   │   │   ├── at91sam9g20.cfg
    │       │   │   │   │   ├── at91sam9g45.cfg
    │       │   │   │   │   ├── at91sam9rl.cfg
    │       │   │   │   │   ├── at91sama5d2.cfg
    │       │   │   │   │   ├── at91samdXX.cfg
    │       │   │   │   │   ├── at91samg5x.cfg
    │       │   │   │   │   ├── atheros_ar2313.cfg
    │       │   │   │   │   ├── atheros_ar2315.cfg
    │       │   │   │   │   ├── atheros_ar9331.cfg
    │       │   │   │   │   ├── atheros_ar9344.cfg
    │       │   │   │   │   ├── atmega128.cfg
    │       │   │   │   │   ├── atmega128rfa1.cfg
    │       │   │   │   │   ├── atsame5x.cfg
    │       │   │   │   │   ├── atsaml1x.cfg
    │       │   │   │   │   ├── atsamv.cfg
    │       │   │   │   │   ├── avr32.cfg
    │       │   │   │   │   ├── bcm2711.cfg
    │       │   │   │   │   ├── bcm281xx.cfg
    │       │   │   │   │   ├── bcm2835.cfg
    │       │   │   │   │   ├── bcm2836.cfg
    │       │   │   │   │   ├── bcm2837.cfg
    │       │   │   │   │   ├── bcm4706.cfg
    │       │   │   │   │   ├── bcm4718.cfg
    │       │   │   │   │   ├── bcm47xx.cfg
    │       │   │   │   │   ├── bcm5352e.cfg
    │       │   │   │   │   ├── bcm6348.cfg
    │       │   │   │   │   ├── bluefield.cfg
    │       │   │   │   │   ├── bluenrg-x.cfg
    │       │   │   │   │   ├── c100.cfg
    │       │   │   │   │   ├── c100config.tcl
    │       │   │   │   │   ├── c100helper.tcl
    │       │   │   │   │   ├── c100regs.tcl
    │       │   │   │   │   ├── cc2538.cfg
    │       │   │   │   │   ├── cs351x.cfg
    │       │   │   │   │   ├── davinci.cfg
    │       │   │   │   │   ├── dragonite.cfg
    │       │   │   │   │   ├── dsp56321.cfg
    │       │   │   │   │   ├── dsp568013.cfg
    │       │   │   │   │   ├── dsp568037.cfg
    │       │   │   │   │   ├── efm32.cfg
    │       │   │   │   │   ├── em357.cfg
    │       │   │   │   │   ├── em358.cfg
    │       │   │   │   │   ├── eos_s3.cfg
    │       │   │   │   │   ├── epc9301.cfg
    │       │   │   │   │   ├── esi32xx.cfg
    │       │   │   │   │   ├── esp32s2.cfg
    │       │   │   │   │   ├── exynos5250.cfg
    │       │   │   │   │   ├── faux.cfg
    │       │   │   │   │   ├── feroceon.cfg
    │       │   │   │   │   ├── fm3.cfg
    │       │   │   │   │   ├── fm4.cfg
    │       │   │   │   │   ├── fm4_mb9bf.cfg
    │       │   │   │   │   ├── fm4_s6e2cc.cfg
    │       │   │   │   │   ├── gd32e23x.cfg
    │       │   │   │   │   ├── gd32vf103.cfg
    │       │   │   │   │   ├── gp326xxxa.cfg
    │       │   │   │   │   ├── hi3798.cfg
    │       │   │   │   │   ├── hi6220.cfg
    │       │   │   │   │   ├── hilscher_netx10.cfg
    │       │   │   │   │   ├── hilscher_netx50.cfg
    │       │   │   │   │   ├── hilscher_netx500.cfg
    │       │   │   │   │   ├── icepick.cfg
    │       │   │   │   │   ├── imx.cfg
    │       │   │   │   │   ├── imx21.cfg
    │       │   │   │   │   ├── imx25.cfg
    │       │   │   │   │   ├── imx27.cfg
    │       │   │   │   │   ├── imx28.cfg
    │       │   │   │   │   ├── imx31.cfg
    │       │   │   │   │   ├── imx35.cfg
    │       │   │   │   │   ├── imx51.cfg
    │       │   │   │   │   ├── imx53.cfg
    │       │   │   │   │   ├── imx6.cfg
    │       │   │   │   │   ├── imx6sx.cfg
    │       │   │   │   │   ├── imx6ul.cfg
    │       │   │   │   │   ├── imx7.cfg
    │       │   │   │   │   ├── imx7ulp.cfg
    │       │   │   │   │   ├── imx8m.cfg
    │       │   │   │   │   ├── imx8qm.cfg
    │       │   │   │   │   ├── infineon/
    │       │   │   │   │   │   └── tle987x.cfg
    │       │   │   │   │   ├── is5114.cfg
    │       │   │   │   │   ├── ixp42x.cfg
    │       │   │   │   │   ├── k1921vk01t.cfg
    │       │   │   │   │   ├── k40.cfg
    │       │   │   │   │   ├── k60.cfg
    │       │   │   │   │   ├── ke0x.cfg
    │       │   │   │   │   ├── ke1xf.cfg
    │       │   │   │   │   ├── ke1xz.cfg
    │       │   │   │   │   ├── kl25.cfg
    │       │   │   │   │   ├── kl46.cfg
    │       │   │   │   │   ├── klx.cfg
    │       │   │   │   │   ├── ks869x.cfg
    │       │   │   │   │   ├── kx.cfg
    │       │   │   │   │   ├── lpc11xx.cfg
    │       │   │   │   │   ├── lpc12xx.cfg
    │       │   │   │   │   ├── lpc13xx.cfg
    │       │   │   │   │   ├── lpc17xx.cfg
    │       │   │   │   │   ├── lpc1850.cfg
    │       │   │   │   │   ├── lpc1xxx.cfg
    │       │   │   │   │   ├── lpc2103.cfg
    │       │   │   │   │   ├── lpc2124.cfg
    │       │   │   │   │   ├── lpc2129.cfg
    │       │   │   │   │   ├── lpc2148.cfg
    │       │   │   │   │   ├── lpc2294.cfg
    │       │   │   │   │   ├── lpc2378.cfg
    │       │   │   │   │   ├── lpc2460.cfg
    │       │   │   │   │   ├── lpc2478.cfg
    │       │   │   │   │   ├── lpc2900.cfg
    │       │   │   │   │   ├── lpc2xxx.cfg
    │       │   │   │   │   ├── lpc3131.cfg
    │       │   │   │   │   ├── lpc3250.cfg
    │       │   │   │   │   ├── lpc40xx.cfg
    │       │   │   │   │   ├── lpc4350.cfg
    │       │   │   │   │   ├── lpc4357.cfg
    │       │   │   │   │   ├── lpc4370.cfg
    │       │   │   │   │   ├── lpc84x.cfg
    │       │   │   │   │   ├── lpc8nxx.cfg
    │       │   │   │   │   ├── lpc8xx.cfg
    │       │   │   │   │   ├── ls1012a.cfg
    │       │   │   │   │   ├── ls1028a.cfg
    │       │   │   │   │   ├── ls1046a.cfg
    │       │   │   │   │   ├── ls1088a.cfg
    │       │   │   │   │   ├── lsch3_common.cfg
    │       │   │   │   │   ├── marvell/
    │       │   │   │   │   │   ├── 88f3710.cfg
    │       │   │   │   │   │   ├── 88f3720.cfg
    │       │   │   │   │   │   └── 88f37x0.cfg
    │       │   │   │   │   ├── max32620.cfg
    │       │   │   │   │   ├── max32625.cfg
    │       │   │   │   │   ├── max3263x.cfg
    │       │   │   │   │   ├── mc13224v.cfg
    │       │   │   │   │   ├── mdr32f9q2i.cfg
    │       │   │   │   │   ├── nds32v2.cfg
    │       │   │   │   │   ├── nds32v3.cfg
    │       │   │   │   │   ├── nds32v3m.cfg
    │       │   │   │   │   ├── nds32v5.cfg
    │       │   │   │   │   ├── nhs31xx.cfg
    │       │   │   │   │   ├── npcx.cfg
    │       │   │   │   │   ├── nrf51.cfg
    │       │   │   │   │   ├── nrf52.cfg
    │       │   │   │   │   ├── nuc910.cfg
    │       │   │   │   │   ├── numicro.cfg
    │       │   │   │   │   ├── omap2420.cfg
    │       │   │   │   │   ├── omap3530.cfg
    │       │   │   │   │   ├── omap4430.cfg
    │       │   │   │   │   ├── omap4460.cfg
    │       │   │   │   │   ├── omap5912.cfg
    │       │   │   │   │   ├── omapl138.cfg
    │       │   │   │   │   ├── or1k.cfg
    │       │   │   │   │   ├── pic32mx.cfg
    │       │   │   │   │   ├── psoc4.cfg
    │       │   │   │   │   ├── psoc5lp.cfg
    │       │   │   │   │   ├── psoc6.cfg
    │       │   │   │   │   ├── pxa255.cfg
    │       │   │   │   │   ├── pxa270.cfg
    │       │   │   │   │   ├── pxa3xx.cfg
    │       │   │   │   │   ├── qualcomm_qca4531.cfg
    │       │   │   │   │   ├── quark_d20xx.cfg
    │       │   │   │   │   ├── quark_x10xx.cfg
    │       │   │   │   │   ├── readme.txt
    │       │   │   │   │   ├── renesas_r7s72100.cfg
    │       │   │   │   │   ├── renesas_rcar_gen2.cfg
    │       │   │   │   │   ├── renesas_rcar_gen3.cfg
    │       │   │   │   │   ├── renesas_rcar_reset_common.cfg
    │       │   │   │   │   ├── renesas_rz_five.cfg
    │       │   │   │   │   ├── renesas_rz_g2.cfg
    │       │   │   │   │   ├── renesas_s7g2.cfg
    │       │   │   │   │   ├── rk3308.cfg
    │       │   │   │   │   ├── rk3399.cfg
    │       │   │   │   │   ├── rp2040-core0.cfg
    │       │   │   │   │   ├── samsung_s3c2410.cfg
    │       │   │   │   │   ├── samsung_s3c2440.cfg
    │       │   │   │   │   ├── samsung_s3c2450.cfg
    │       │   │   │   │   ├── samsung_s3c4510.cfg
    │       │   │   │   │   ├── samsung_s3c6410.cfg
    │       │   │   │   │   ├── sharp_lh79532.cfg
    │       │   │   │   │   ├── sim3x.cfg
    │       │   │   │   │   ├── smp8634.cfg
    │       │   │   │   │   ├── snps_em_sk_fpga.cfg
    │       │   │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   │   ├── spear3xx.cfg
    │       │   │   │   │   ├── stellaris.cfg
    │       │   │   │   │   ├── stm32f0x.cfg
    │       │   │   │   │   ├── stm32f1x.cfg
    │       │   │   │   │   ├── stm32f2x.cfg
    │       │   │   │   │   ├── stm32f3x.cfg
    │       │   │   │   │   ├── stm32f4x.cfg
    │       │   │   │   │   ├── stm32f7x.cfg
    │       │   │   │   │   ├── stm32g0x.cfg
    │       │   │   │   │   ├── stm32g4x.cfg
    │       │   │   │   │   ├── stm32h7x.cfg
    │       │   │   │   │   ├── stm32h7x_dual_bank.cfg
    │       │   │   │   │   ├── stm32l0.cfg
    │       │   │   │   │   ├── stm32l0_dual_bank.cfg
    │       │   │   │   │   ├── stm32l1.cfg
    │       │   │   │   │   ├── stm32l1x_dual_bank.cfg
    │       │   │   │   │   ├── stm32l4x.cfg
    │       │   │   │   │   ├── stm32l5x.cfg
    │       │   │   │   │   ├── stm32mp13x.cfg
    │       │   │   │   │   ├── stm32mp15x.cfg
    │       │   │   │   │   ├── stm32u5x.cfg
    │       │   │   │   │   ├── stm32w108xx.cfg
    │       │   │   │   │   ├── stm32wbx.cfg
    │       │   │   │   │   ├── stm32wlx.cfg
    │       │   │   │   │   ├── stm32x5x_common.cfg
    │       │   │   │   │   ├── stm32xl.cfg
    │       │   │   │   │   ├── stm8l.cfg
    │       │   │   │   │   ├── stm8l152.cfg
    │       │   │   │   │   ├── stm8s.cfg
    │       │   │   │   │   ├── stm8s003.cfg
    │       │   │   │   │   ├── stm8s103.cfg
    │       │   │   │   │   ├── stm8s105.cfg
    │       │   │   │   │   ├── str710.cfg
    │       │   │   │   │   ├── str730.cfg
    │       │   │   │   │   ├── str750.cfg
    │       │   │   │   │   ├── str912.cfg
    │       │   │   │   │   ├── swj-dp.tcl
    │       │   │   │   │   ├── swm050.cfg
    │       │   │   │   │   ├── test_reset_syntax_error.cfg
    │       │   │   │   │   ├── test_syntax_error.cfg
    │       │   │   │   │   ├── ti-ar7.cfg
    │       │   │   │   │   ├── ti-cjtag.cfg
    │       │   │   │   │   ├── ti_calypso.cfg
    │       │   │   │   │   ├── ti_cc13x0.cfg
    │       │   │   │   │   ├── ti_cc13x2.cfg
    │       │   │   │   │   ├── ti_cc26x0.cfg
    │       │   │   │   │   ├── ti_cc26x2.cfg
    │       │   │   │   │   ├── ti_cc3220sf.cfg
    │       │   │   │   │   ├── ti_cc32xx.cfg
    │       │   │   │   │   ├── ti_dm355.cfg
    │       │   │   │   │   ├── ti_dm365.cfg
    │       │   │   │   │   ├── ti_dm6446.cfg
    │       │   │   │   │   ├── ti_k3.cfg
    │       │   │   │   │   ├── ti_msp432.cfg
    │       │   │   │   │   ├── ti_rm4x.cfg
    │       │   │   │   │   ├── ti_tms570.cfg
    │       │   │   │   │   ├── ti_tms570ls20xxx.cfg
    │       │   │   │   │   ├── ti_tms570ls3137.cfg
    │       │   │   │   │   ├── tmpa900.cfg
    │       │   │   │   │   ├── tmpa910.cfg
    │       │   │   │   │   ├── tnetc4401.cfg
    │       │   │   │   │   ├── u8500.cfg
    │       │   │   │   │   ├── vd_aarch64.cfg
    │       │   │   │   │   ├── vd_cortex_m.cfg
    │       │   │   │   │   ├── vd_riscv.cfg
    │       │   │   │   │   ├── vybrid_vf6xx.cfg
    │       │   │   │   │   ├── xilinx_zynqmp.cfg
    │       │   │   │   │   ├── xmc1xxx.cfg
    │       │   │   │   │   ├── xmc4xxx.cfg
    │       │   │   │   │   ├── xmos_xs1-xau8a-10_arm.cfg
    │       │   │   │   │   ├── zynq_7000.cfg
    │       │   │   │   │   └── к1879xб1я.cfg
    │       │   │   │   ├── test/
    │       │   │   │   │   ├── selftest.cfg
    │       │   │   │   │   └── syntax1.cfg
    │       │   │   │   └── tools/
    │       │   │   │       ├── firmware-recovery.tcl
    │       │   │   │       ├── memtest.tcl
    │       │   │   │       └── test_cpu_speed.tcl
    │       │   │   └── share/
    │       │   │       ├── info/
    │       │   │       │   ├── dir
    │       │   │       │   ├── openocd.info
    │       │   │       │   ├── openocd.info-1
    │       │   │       │   └── openocd.info-2
    │       │   │       ├── man/
    │       │   │       │   └── man1/
    │       │   │       │       └── openocd.1
    │       │   │       └── openocd/
    │       │   │           ├── contrib/
    │       │   │           │   ├── 60-openocd.rules
    │       │   │           │   └── libdcc/
    │       │   │           │       ├── README
    │       │   │           │       ├── dcc_stdio.c
    │       │   │           │       ├── dcc_stdio.h
    │       │   │           │       └── example.c
    │       │   │           └── scripts/
    │       │   │               ├── bitsbytes.tcl
    │       │   │               ├── board/
    │       │   │               │   ├── 8devices-lima.cfg
    │       │   │               │   ├── actux3.cfg
    │       │   │               │   ├── adapteva_parallella1.cfg
    │       │   │               │   ├── adsp-sc584-ezbrd.cfg
    │       │   │               │   ├── alphascale_asm9260_ek.cfg
    │       │   │               │   ├── altera_sockit.cfg
    │       │   │               │   ├── am3517evm.cfg
    │       │   │               │   ├── ampere_emag8180.cfg
    │       │   │               │   ├── arm_evaluator7t.cfg
    │       │   │               │   ├── arm_musca_a.cfg
    │       │   │               │   ├── arty_s7.cfg
    │       │   │               │   ├── asus-rt-n16.cfg
    │       │   │               │   ├── asus-rt-n66u.cfg
    │       │   │               │   ├── at91cap7a-stk-sdram.cfg
    │       │   │               │   ├── at91eb40a.cfg
    │       │   │               │   ├── at91rm9200-dk.cfg
    │       │   │               │   ├── at91rm9200-ek.cfg
    │       │   │               │   ├── at91sam9261-ek.cfg
    │       │   │               │   ├── at91sam9263-ek.cfg
    │       │   │               │   ├── at91sam9g20-ek.cfg
    │       │   │               │   ├── atmel_at91sam7s-ek.cfg
    │       │   │               │   ├── atmel_at91sam9260-ek.cfg
    │       │   │               │   ├── atmel_at91sam9rl-ek.cfg
    │       │   │               │   ├── atmel_sam3n_ek.cfg
    │       │   │               │   ├── atmel_sam3s_ek.cfg
    │       │   │               │   ├── atmel_sam3u_ek.cfg
    │       │   │               │   ├── atmel_sam3x_ek.cfg
    │       │   │               │   ├── atmel_sam4e_ek.cfg
    │       │   │               │   ├── atmel_sam4l8_xplained_pro.cfg
    │       │   │               │   ├── atmel_sam4s_ek.cfg
    │       │   │               │   ├── atmel_sam4s_xplained_pro.cfg
    │       │   │               │   ├── atmel_samc20_xplained_pro.cfg
    │       │   │               │   ├── atmel_samc21_xplained_pro.cfg
    │       │   │               │   ├── atmel_samd10_xplained_mini.cfg
    │       │   │               │   ├── atmel_samd11_xplained_pro.cfg
    │       │   │               │   ├── atmel_samd20_xplained_pro.cfg
    │       │   │               │   ├── atmel_samd21_xplained_pro.cfg
    │       │   │               │   ├── atmel_same70_xplained.cfg
    │       │   │               │   ├── atmel_samg53_xplained_pro.cfg
    │       │   │               │   ├── atmel_samg55_xplained_pro.cfg
    │       │   │               │   ├── atmel_saml21_xplained_pro.cfg
    │       │   │               │   ├── atmel_samr21_xplained_pro.cfg
    │       │   │               │   ├── atmel_samv71_xplained_ultra.cfg
    │       │   │               │   ├── avnet_ultrazed-eg.cfg
    │       │   │               │   ├── balloon3-cpu.cfg
    │       │   │               │   ├── bcm28155_ap.cfg
    │       │   │               │   ├── bluefield.cfg
    │       │   │               │   ├── bt-homehubv1.cfg
    │       │   │               │   ├── colibri.cfg
    │       │   │               │   ├── crossbow_tech_imote2.cfg
    │       │   │               │   ├── csb337.cfg
    │       │   │               │   ├── csb732.cfg
    │       │   │               │   ├── da850evm.cfg
    │       │   │               │   ├── digi_connectcore_wi-9c.cfg
    │       │   │               │   ├── digilent_analog_discovery.cfg
    │       │   │               │   ├── digilent_atlys.cfg
    │       │   │               │   ├── digilent_nexys_video.cfg
    │       │   │               │   ├── digilent_zedboard.cfg
    │       │   │               │   ├── diolan_lpc4350-db1.cfg
    │       │   │               │   ├── diolan_lpc4357-db1.cfg
    │       │   │               │   ├── dk-tm4c129.cfg
    │       │   │               │   ├── dm355evm.cfg
    │       │   │               │   ├── dm365evm.cfg
    │       │   │               │   ├── dm6446evm.cfg
    │       │   │               │   ├── dp_busblaster_v3.cfg
    │       │   │               │   ├── dp_busblaster_v4.cfg
    │       │   │               │   ├── dptechnics_dpt-board-v1.cfg
    │       │   │               │   ├── efikamx.cfg
    │       │   │               │   ├── efm32.cfg
    │       │   │               │   ├── eir.cfg
    │       │   │               │   ├── ek-lm3s1968.cfg
    │       │   │               │   ├── ek-lm3s3748.cfg
    │       │   │               │   ├── ek-lm3s6965.cfg
    │       │   │               │   ├── ek-lm3s811-revb.cfg
    │       │   │               │   ├── ek-lm3s811.cfg
    │       │   │               │   ├── ek-lm3s8962.cfg
    │       │   │               │   ├── ek-lm3s9b9x.cfg
    │       │   │               │   ├── ek-lm3s9d92.cfg
    │       │   │               │   ├── ek-lm4f120xl.cfg
    │       │   │               │   ├── ek-lm4f232.cfg
    │       │   │               │   ├── ek-tm4c123gxl.cfg
    │       │   │               │   ├── ek-tm4c1294xl.cfg
    │       │   │               │   ├── embedded-artists_lpc2478-32.cfg
    │       │   │               │   ├── emcraft_imx8m-som-bsb.cfg
    │       │   │               │   ├── emcraft_twr-vf6-som-bsb.cfg
    │       │   │               │   ├── emcraft_vf6-som.cfg
    │       │   │               │   ├── esp32s2-kaluga-1.cfg
    │       │   │               │   ├── ethernut3.cfg
    │       │   │               │   ├── evb-lan9255.cfg
    │       │   │               │   ├── frdm-kl25z.cfg
    │       │   │               │   ├── frdm-kl46z.cfg
    │       │   │               │   ├── fsl_imx6q_sabresd.cfg
    │       │   │               │   ├── glyn_tonga2.cfg
    │       │   │               │   ├── gti/
    │       │   │               │   │   └── espressobin.cfg
    │       │   │               │   ├── gumstix-aerocore.cfg
    │       │   │               │   ├── hammer.cfg
    │       │   │               │   ├── hilscher_nxdb500sys.cfg
    │       │   │               │   ├── hilscher_nxeb500hmi.cfg
    │       │   │               │   ├── hilscher_nxhx10.cfg
    │       │   │               │   ├── hilscher_nxhx50.cfg
    │       │   │               │   ├── hilscher_nxhx500.cfg
    │       │   │               │   ├── hilscher_nxsb100.cfg
    │       │   │               │   ├── hitex_lpc1768stick.cfg
    │       │   │               │   ├── hitex_lpc2929.cfg
    │       │   │               │   ├── hitex_stm32-performancestick.cfg
    │       │   │               │   ├── hitex_str9-comstick.cfg
    │       │   │               │   ├── iar_lpc1768.cfg
    │       │   │               │   ├── iar_str912_sk.cfg
    │       │   │               │   ├── icnova_imx53_sodimm.cfg
    │       │   │               │   ├── icnova_sam9g45_sodimm.cfg
    │       │   │               │   ├── imx27ads.cfg
    │       │   │               │   ├── imx27lnst.cfg
    │       │   │               │   ├── imx28evk.cfg
    │       │   │               │   ├── imx31pdk.cfg
    │       │   │               │   ├── imx35pdk.cfg
    │       │   │               │   ├── imx53-m53evk.cfg
    │       │   │               │   ├── imx53loco.cfg
    │       │   │               │   ├── imx8mp-evk.cfg
    │       │   │               │   ├── insignal_arndale.cfg
    │       │   │               │   ├── kasli.cfg
    │       │   │               │   ├── kc100.cfg
    │       │   │               │   ├── kc705.cfg
    │       │   │               │   ├── kcu105.cfg
    │       │   │               │   ├── keil_mcb1700.cfg
    │       │   │               │   ├── keil_mcb2140.cfg
    │       │   │               │   ├── kindle2.cfg
    │       │   │               │   ├── kontron_sl28.cfg
    │       │   │               │   ├── kwikstik.cfg
    │       │   │               │   ├── la_fonera-fon2200.cfg
    │       │   │               │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │               │   ├── lemaker_hikey.cfg
    │       │   │               │   ├── linksys-wag200g.cfg
    │       │   │               │   ├── linksys-wrt54gl.cfg
    │       │   │               │   ├── linksys_nslu2.cfg
    │       │   │               │   ├── lisa-l.cfg
    │       │   │               │   ├── logicpd_imx27.cfg
    │       │   │               │   ├── lpc1850_spifi_generic.cfg
    │       │   │               │   ├── lpc4350_spifi_generic.cfg
    │       │   │               │   ├── lubbock.cfg
    │       │   │               │   ├── marsohod.cfg
    │       │   │               │   ├── marsohod2.cfg
    │       │   │               │   ├── marsohod3.cfg
    │       │   │               │   ├── mbed-lpc11u24.cfg
    │       │   │               │   ├── mbed-lpc1768.cfg
    │       │   │               │   ├── mcb1700.cfg
    │       │   │               │   ├── microchip_explorer16.cfg
    │       │   │               │   ├── microchip_sama5d27_som1_kit1.cfg
    │       │   │               │   ├── microchip_same51_curiosity_nano.cfg
    │       │   │               │   ├── microchip_same54_xplained_pro.cfg
    │       │   │               │   ├── microchip_saml11_xplained_pro.cfg
    │       │   │               │   ├── mini2440.cfg
    │       │   │               │   ├── mini6410.cfg
    │       │   │               │   ├── minispartan6.cfg
    │       │   │               │   ├── nds32_corvettef1.cfg
    │       │   │               │   ├── nds32_xc5.cfg
    │       │   │               │   ├── nds32_xc7.cfg
    │       │   │               │   ├── netgear-dg834v3.cfg
    │       │   │               │   ├── netgear-wg102.cfg
    │       │   │               │   ├── nordic_nrf51822_mkit.cfg
    │       │   │               │   ├── nordic_nrf51_dk.cfg
    │       │   │               │   ├── nordic_nrf52_dk.cfg
    │       │   │               │   ├── nordic_nrf52_ftx232.cfg
    │       │   │               │   ├── novena-internal-fpga.cfg
    │       │   │               │   ├── npcx_evb.cfg
    │       │   │               │   ├── numato_mimas_a7.cfg
    │       │   │               │   ├── numato_opsis.cfg
    │       │   │               │   ├── nxp_frdm-k64f.cfg
    │       │   │               │   ├── nxp_frdm-ls1012a.cfg
    │       │   │               │   ├── nxp_imx7sabre.cfg
    │       │   │               │   ├── nxp_lpc-link2.cfg
    │       │   │               │   ├── nxp_mcimx8m-evk.cfg
    │       │   │               │   ├── nxp_rdb-ls1046a.cfg
    │       │   │               │   ├── nxp_rdb-ls1088a.cfg
    │       │   │               │   ├── olimex_LPC2378STK.cfg
    │       │   │               │   ├── olimex_lpc_h2148.cfg
    │       │   │               │   ├── olimex_sam7_ex256.cfg
    │       │   │               │   ├── olimex_sam7_la2.cfg
    │       │   │               │   ├── olimex_sam9_l9260.cfg
    │       │   │               │   ├── olimex_stm32_h103.cfg
    │       │   │               │   ├── olimex_stm32_h107.cfg
    │       │   │               │   ├── olimex_stm32_h405.cfg
    │       │   │               │   ├── olimex_stm32_p107.cfg
    │       │   │               │   ├── omap2420_h4.cfg
    │       │   │               │   ├── openrd.cfg
    │       │   │               │   ├── or1k_generic.cfg
    │       │   │               │   ├── osk5912.cfg
    │       │   │               │   ├── phone_se_j100i.cfg
    │       │   │               │   ├── phytec_lpc3250.cfg
    │       │   │               │   ├── pic-p32mx.cfg
    │       │   │               │   ├── pico-debug.cfg
    │       │   │               │   ├── pipistrello.cfg
    │       │   │               │   ├── propox_mmnet1001.cfg
    │       │   │               │   ├── pxa255_sst.cfg
    │       │   │               │   ├── quark_d2000_refboard.cfg
    │       │   │               │   ├── quark_x10xx_board.cfg
    │       │   │               │   ├── quicklogic_quickfeather.cfg
    │       │   │               │   ├── radiona_ulx3s.cfg
    │       │   │               │   ├── redbee.cfg
    │       │   │               │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │       │   │               │   ├── renesas_dk-s7g2.cfg
    │       │   │               │   ├── renesas_falcon.cfg
    │       │   │               │   ├── renesas_gr_peach.cfg
    │       │   │               │   ├── renesas_porter.cfg
    │       │   │               │   ├── renesas_salvator-xs.cfg
    │       │   │               │   ├── renesas_silk.cfg
    │       │   │               │   ├── renesas_stout.cfg
    │       │   │               │   ├── rigado_bmd300_ek.cfg
    │       │   │               │   ├── rpi3.cfg
    │       │   │               │   ├── rpi4b.cfg
    │       │   │               │   ├── rsc-w910.cfg
    │       │   │               │   ├── sayma_amc.cfg
    │       │   │               │   ├── sheevaplug.cfg
    │       │   │               │   ├── sifive-e31arty.cfg
    │       │   │               │   ├── sifive-e51arty.cfg
    │       │   │               │   ├── sifive-hifive1-revb.cfg
    │       │   │               │   ├── sifive-hifive1.cfg
    │       │   │               │   ├── smdk6410.cfg
    │       │   │               │   ├── snps_em_sk.cfg
    │       │   │               │   ├── snps_em_sk_v1.cfg
    │       │   │               │   ├── snps_em_sk_v2.1.cfg
    │       │   │               │   ├── snps_em_sk_v2.2.cfg
    │       │   │               │   ├── snps_hsdk.cfg
    │       │   │               │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │       │   │               │   ├── spansion_sk-fm4-u120-9b560.cfg
    │       │   │               │   ├── spear300evb.cfg
    │       │   │               │   ├── spear300evb_mod.cfg
    │       │   │               │   ├── spear310evb20.cfg
    │       │   │               │   ├── spear310evb20_mod.cfg
    │       │   │               │   ├── spear320cpu.cfg
    │       │   │               │   ├── spear320cpu_mod.cfg
    │       │   │               │   ├── st_b-l475e-iot01a.cfg
    │       │   │               │   ├── st_nucleo_8l152r8.cfg
    │       │   │               │   ├── st_nucleo_8s208rb.cfg
    │       │   │               │   ├── st_nucleo_f0.cfg
    │       │   │               │   ├── st_nucleo_f103rb.cfg
    │       │   │               │   ├── st_nucleo_f3.cfg
    │       │   │               │   ├── st_nucleo_f4.cfg
    │       │   │               │   ├── st_nucleo_f7.cfg
    │       │   │               │   ├── st_nucleo_g0.cfg
    │       │   │               │   ├── st_nucleo_g4.cfg
    │       │   │               │   ├── st_nucleo_h743zi.cfg
    │       │   │               │   ├── st_nucleo_h745zi.cfg
    │       │   │               │   ├── st_nucleo_l073rz.cfg
    │       │   │               │   ├── st_nucleo_l1.cfg
    │       │   │               │   ├── st_nucleo_l4.cfg
    │       │   │               │   ├── st_nucleo_l5.cfg
    │       │   │               │   ├── st_nucleo_wb55.cfg
    │       │   │               │   ├── steval-idb007v1.cfg
    │       │   │               │   ├── steval-idb008v1.cfg
    │       │   │               │   ├── steval-idb011v1.cfg
    │       │   │               │   ├── steval-idb012v1.cfg
    │       │   │               │   ├── steval_pcc010.cfg
    │       │   │               │   ├── stm320518_eval.cfg
    │       │   │               │   ├── stm320518_eval_stlink.cfg
    │       │   │               │   ├── stm32100b_eval.cfg
    │       │   │               │   ├── stm3210b_eval.cfg
    │       │   │               │   ├── stm3210c_eval.cfg
    │       │   │               │   ├── stm3210e_eval.cfg
    │       │   │               │   ├── stm3220g_eval.cfg
    │       │   │               │   ├── stm3220g_eval_stlink.cfg
    │       │   │               │   ├── stm3241g_eval.cfg
    │       │   │               │   ├── stm3241g_eval_stlink.cfg
    │       │   │               │   ├── stm32429i_eval.cfg
    │       │   │               │   ├── stm32429i_eval_stlink.cfg
    │       │   │               │   ├── stm32439i_eval.cfg
    │       │   │               │   ├── stm32439i_eval_stlink.cfg
    │       │   │               │   ├── stm327x6g_eval.cfg
    │       │   │               │   ├── stm32f0discovery.cfg
    │       │   │               │   ├── stm32f103c8_blue_pill.cfg
    │       │   │               │   ├── stm32f334discovery.cfg
    │       │   │               │   ├── stm32f3discovery.cfg
    │       │   │               │   ├── stm32f412g-disco.cfg
    │       │   │               │   ├── stm32f413h-disco.cfg
    │       │   │               │   ├── stm32f429disc1.cfg
    │       │   │               │   ├── stm32f429discovery.cfg
    │       │   │               │   ├── stm32f469discovery.cfg
    │       │   │               │   ├── stm32f469i-disco.cfg
    │       │   │               │   ├── stm32f4discovery.cfg
    │       │   │               │   ├── stm32f723e-disco.cfg
    │       │   │               │   ├── stm32f746g-disco.cfg
    │       │   │               │   ├── stm32f769i-disco.cfg
    │       │   │               │   ├── stm32f7discovery.cfg
    │       │   │               │   ├── stm32h735g-disco.cfg
    │       │   │               │   ├── stm32h745i-disco.cfg
    │       │   │               │   ├── stm32h747i-disco.cfg
    │       │   │               │   ├── stm32h750b-disco.cfg
    │       │   │               │   ├── stm32h7b3i-disco.cfg
    │       │   │               │   ├── stm32h7x3i_eval.cfg
    │       │   │               │   ├── stm32h7x_dual_qspi.cfg
    │       │   │               │   ├── stm32l0discovery.cfg
    │       │   │               │   ├── stm32l476g-disco.cfg
    │       │   │               │   ├── stm32l496g-disco.cfg
    │       │   │               │   ├── stm32l4discovery.cfg
    │       │   │               │   ├── stm32l4p5g-disco.cfg
    │       │   │               │   ├── stm32l4r9i-disco.cfg
    │       │   │               │   ├── stm32ldiscovery.cfg
    │       │   │               │   ├── stm32mp13x_dk.cfg
    │       │   │               │   ├── stm32mp15x_dk2.cfg
    │       │   │               │   ├── stm32vldiscovery.cfg
    │       │   │               │   ├── str910-eval.cfg
    │       │   │               │   ├── telo.cfg
    │       │   │               │   ├── ti_am335xevm.cfg
    │       │   │               │   ├── ti_am437x_idk.cfg
    │       │   │               │   ├── ti_am43xx_evm.cfg
    │       │   │               │   ├── ti_am625evm.cfg
    │       │   │               │   ├── ti_am642evm.cfg
    │       │   │               │   ├── ti_am654evm.cfg
    │       │   │               │   ├── ti_beagleboard.cfg
    │       │   │               │   ├── ti_beagleboard_xm.cfg
    │       │   │               │   ├── ti_beaglebone-base.cfg
    │       │   │               │   ├── ti_beaglebone.cfg
    │       │   │               │   ├── ti_beaglebone_black.cfg
    │       │   │               │   ├── ti_blaze.cfg
    │       │   │               │   ├── ti_cc13x0_launchpad.cfg
    │       │   │               │   ├── ti_cc13x2_launchpad.cfg
    │       │   │               │   ├── ti_cc26x0_launchpad.cfg
    │       │   │               │   ├── ti_cc26x2_launchpad.cfg
    │       │   │               │   ├── ti_cc3200_launchxl.cfg
    │       │   │               │   ├── ti_cc3220sf_launchpad.cfg
    │       │   │               │   ├── ti_cc32xx_launchpad.cfg
    │       │   │               │   ├── ti_dk-tm4c129.cfg
    │       │   │               │   ├── ti_ek-tm4c123gxl.cfg
    │       │   │               │   ├── ti_ek-tm4c1294xl.cfg
    │       │   │               │   ├── ti_j7200evm.cfg
    │       │   │               │   ├── ti_j721evm.cfg
    │       │   │               │   ├── ti_j721s2evm.cfg
    │       │   │               │   ├── ti_msp432_launchpad.cfg
    │       │   │               │   ├── ti_pandaboard.cfg
    │       │   │               │   ├── ti_pandaboard_es.cfg
    │       │   │               │   ├── ti_tmdx570ls20susb.cfg
    │       │   │               │   ├── ti_tmdx570ls31usb.cfg
    │       │   │               │   ├── tocoding_poplar.cfg
    │       │   │               │   ├── topas910.cfg
    │       │   │               │   ├── topasa900.cfg
    │       │   │               │   ├── tp-link_tl-mr3020.cfg
    │       │   │               │   ├── tp-link_wdr4300.cfg
    │       │   │               │   ├── twr-k60f120m.cfg
    │       │   │               │   ├── twr-k60n512.cfg
    │       │   │               │   ├── twr-vf65gs10.cfg
    │       │   │               │   ├── twr-vf65gs10_cmsisdap.cfg
    │       │   │               │   ├── tx25_stk5.cfg
    │       │   │               │   ├── tx27_stk5.cfg
    │       │   │               │   ├── unknown_at91sam9260.cfg
    │       │   │               │   ├── uptech_2410.cfg
    │       │   │               │   ├── vd_a53x2_jtag.cfg
    │       │   │               │   ├── vd_m4_jtag.cfg
    │       │   │               │   ├── vd_pulpissimo_jtag.cfg
    │       │   │               │   ├── vd_swerv_jtag.cfg
    │       │   │               │   ├── verdex.cfg
    │       │   │               │   ├── voipac.cfg
    │       │   │               │   ├── voltcraft_dso-3062c.cfg
    │       │   │               │   ├── x300t.cfg
    │       │   │               │   ├── xmc-2go.cfg
    │       │   │               │   ├── xmc1100-boot-kit.cfg
    │       │   │               │   ├── xmc4200-application-kit-actuator.cfg
    │       │   │               │   ├── xmc4300-relax.cfg
    │       │   │               │   ├── xmc4500-application-kit-general.cfg
    │       │   │               │   ├── xmc4500-application-kit-sdram.cfg
    │       │   │               │   ├── xmc4500-relax.cfg
    │       │   │               │   ├── xmc4700-relax.cfg
    │       │   │               │   ├── xmc4800-relax.cfg
    │       │   │               │   └── xmos_xk-xac-xa8_arm.cfg
    │       │   │               ├── chip/
    │       │   │               │   ├── atmel/
    │       │   │               │   │   └── at91/
    │       │   │               │   │       ├── aic.tcl
    │       │   │               │   │       ├── at91_pio.cfg
    │       │   │               │   │       ├── at91_pmc.cfg
    │       │   │               │   │       ├── at91_rstc.cfg
    │       │   │               │   │       ├── at91_wdt.cfg
    │       │   │               │   │       ├── at91sam7x128.tcl
    │       │   │               │   │       ├── at91sam7x256.tcl
    │       │   │               │   │       ├── at91sam9261.cfg
    │       │   │               │   │       ├── at91sam9261_matrix.cfg
    │       │   │               │   │       ├── at91sam9263.cfg
    │       │   │               │   │       ├── at91sam9263_matrix.cfg
    │       │   │               │   │       ├── at91sam9_init.cfg
    │       │   │               │   │       ├── at91sam9_sdramc.cfg
    │       │   │               │   │       ├── at91sam9_smc.cfg
    │       │   │               │   │       ├── hardware.cfg
    │       │   │               │   │       ├── pmc.tcl
    │       │   │               │   │       ├── rtt.tcl
    │       │   │               │   │       ├── sam9_smc.cfg
    │       │   │               │   │       └── usarts.tcl
    │       │   │               │   ├── st/
    │       │   │               │   │   ├── spear/
    │       │   │               │   │   │   ├── quirk_no_srst.tcl
    │       │   │               │   │   │   ├── spear3xx.tcl
    │       │   │               │   │   │   └── spear3xx_ddr.tcl
    │       │   │               │   │   └── stm32/
    │       │   │               │   │       ├── stm32.tcl
    │       │   │               │   │       ├── stm32_rcc.tcl
    │       │   │               │   │       └── stm32_regs.tcl
    │       │   │               │   └── ti/
    │       │   │               │       └── lm3s/
    │       │   │               │           ├── lm3s.tcl
    │       │   │               │           └── lm3s_regs.tcl
    │       │   │               ├── cpld/
    │       │   │               │   ├── altera-5m570z-cpld.cfg
    │       │   │               │   ├── altera-epm240.cfg
    │       │   │               │   ├── jtagspi.cfg
    │       │   │               │   ├── lattice-lc4032ze.cfg
    │       │   │               │   ├── xilinx-xc6s.cfg
    │       │   │               │   ├── xilinx-xc7.cfg
    │       │   │               │   ├── xilinx-xcf-p.cfg
    │       │   │               │   ├── xilinx-xcf-s.cfg
    │       │   │               │   ├── xilinx-xcr3256.cfg
    │       │   │               │   └── xilinx-xcu.cfg
    │       │   │               ├── cpu/
    │       │   │               │   ├── arc/
    │       │   │               │   │   ├── common.tcl
    │       │   │               │   │   ├── em.tcl
    │       │   │               │   │   ├── hs.tcl
    │       │   │               │   │   └── v2.tcl
    │       │   │               │   └── arm/
    │       │   │               │       ├── arm7tdmi.tcl
    │       │   │               │       ├── arm920.tcl
    │       │   │               │       ├── arm946.tcl
    │       │   │               │       ├── arm966.tcl
    │       │   │               │       └── cortex_m3.tcl
    │       │   │               ├── fpga/
    │       │   │               │   ├── altera-10m50.cfg
    │       │   │               │   ├── altera-ep3c10.cfg
    │       │   │               │   ├── lattice_ecp5.cfg
    │       │   │               │   ├── xilinx-dna.cfg
    │       │   │               │   └── xilinx-xadc.cfg
    │       │   │               ├── interface/
    │       │   │               │   ├── altera-usb-blaster.cfg
    │       │   │               │   ├── altera-usb-blaster2.cfg
    │       │   │               │   ├── arm-jtag-ew.cfg
    │       │   │               │   ├── at91rm9200.cfg
    │       │   │               │   ├── beaglebone-jtag-native.cfg
    │       │   │               │   ├── beaglebone-swd-native.cfg
    │       │   │               │   ├── buspirate.cfg
    │       │   │               │   ├── calao-usb-a9260.cfg
    │       │   │               │   ├── chameleon.cfg
    │       │   │               │   ├── cmsis-dap.cfg
    │       │   │               │   ├── dln-2-gpiod.cfg
    │       │   │               │   ├── dummy.cfg
    │       │   │               │   ├── estick.cfg
    │       │   │               │   ├── flashlink.cfg
    │       │   │               │   ├── ft232r/
    │       │   │               │   │   └── radiona_ulx3s.cfg
    │       │   │               │   ├── ft232r.cfg
    │       │   │               │   ├── ftdi/
    │       │   │               │   │   ├── 100ask-openjtag.cfg
    │       │   │               │   │   ├── ashling-opella-ld-jtag.cfg
    │       │   │               │   │   ├── ashling-opella-ld-swd.cfg
    │       │   │               │   │   ├── axm0432.cfg
    │       │   │               │   │   ├── c232hm.cfg
    │       │   │               │   │   ├── calao-usb-a9260-c01.cfg
    │       │   │               │   │   ├── calao-usb-a9260-c02.cfg
    │       │   │               │   │   ├── cortino.cfg
    │       │   │               │   │   ├── digilent-hs1.cfg
    │       │   │               │   │   ├── digilent-hs2.cfg
    │       │   │               │   │   ├── digilent_jtag_hs3.cfg
    │       │   │               │   │   ├── digilent_jtag_smt2.cfg
    │       │   │               │   │   ├── digilent_jtag_smt2_nc.cfg
    │       │   │               │   │   ├── dlp-usb1232h.cfg
    │       │   │               │   │   ├── dp_busblaster.cfg
    │       │   │               │   │   ├── dp_busblaster_kt-link.cfg
    │       │   │               │   │   ├── esp32s2_kaluga_v1.cfg
    │       │   │               │   │   ├── flossjtag-noeeprom.cfg
    │       │   │               │   │   ├── flossjtag.cfg
    │       │   │               │   │   ├── flyswatter.cfg
    │       │   │               │   │   ├── flyswatter2.cfg
    │       │   │               │   │   ├── ft232h-module-swd.cfg
    │       │   │               │   │   ├── gw16042.cfg
    │       │   │               │   │   ├── hie-jtag.cfg
    │       │   │               │   │   ├── hilscher_nxhx10_etm.cfg
    │       │   │               │   │   ├── hilscher_nxhx500_etm.cfg
    │       │   │               │   │   ├── hilscher_nxhx500_re.cfg
    │       │   │               │   │   ├── hilscher_nxhx50_etm.cfg
    │       │   │               │   │   ├── hilscher_nxhx50_re.cfg
    │       │   │               │   │   ├── hitex_lpc1768stick.cfg
    │       │   │               │   │   ├── hitex_str9-comstick.cfg
    │       │   │               │   │   ├── icebear.cfg
    │       │   │               │   │   ├── imx8mp-evk.cfg
    │       │   │               │   │   ├── incircuit-icprog.cfg
    │       │   │               │   │   ├── iotlab-usb.cfg
    │       │   │               │   │   ├── isodebug.cfg
    │       │   │               │   │   ├── jtag-lock-pick_tiny_2.cfg
    │       │   │               │   │   ├── jtagkey.cfg
    │       │   │               │   │   ├── jtagkey2.cfg
    │       │   │               │   │   ├── jtagkey2p.cfg
    │       │   │               │   │   ├── kt-link.cfg
    │       │   │               │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │               │   │   ├── lisa-l.cfg
    │       │   │               │   │   ├── luminary-icdi.cfg
    │       │   │               │   │   ├── luminary-lm3s811.cfg
    │       │   │               │   │   ├── luminary.cfg
    │       │   │               │   │   ├── m53evk.cfg
    │       │   │               │   │   ├── mbftdi.cfg
    │       │   │               │   │   ├── minimodule-swd.cfg
    │       │   │               │   │   ├── minimodule.cfg
    │       │   │               │   │   ├── minispartan6.cfg
    │       │   │               │   │   ├── miniwiggler.cfg
    │       │   │               │   │   ├── neodb.cfg
    │       │   │               │   │   ├── ngxtech.cfg
    │       │   │               │   │   ├── olimex-arm-jtag-swd.cfg
    │       │   │               │   │   ├── olimex-arm-usb-ocd-h.cfg
    │       │   │               │   │   ├── olimex-arm-usb-ocd.cfg
    │       │   │               │   │   ├── olimex-arm-usb-tiny-h.cfg
    │       │   │               │   │   ├── olimex-jtag-tiny.cfg
    │       │   │               │   │   ├── oocdlink.cfg
    │       │   │               │   │   ├── opendous_ftdi.cfg
    │       │   │               │   │   ├── openocd-usb-hs.cfg
    │       │   │               │   │   ├── openocd-usb.cfg
    │       │   │               │   │   ├── openrd.cfg
    │       │   │               │   │   ├── pipistrello.cfg
    │       │   │               │   │   ├── pls_spc5.cfg
    │       │   │               │   │   ├── redbee-econotag.cfg
    │       │   │               │   │   ├── redbee-usb.cfg
    │       │   │               │   │   ├── rowley-cc-arm-swd.cfg
    │       │   │               │   │   ├── sheevaplug.cfg
    │       │   │               │   │   ├── signalyzer-lite.cfg
    │       │   │               │   │   ├── signalyzer.cfg
    │       │   │               │   │   ├── snps_sdp.cfg
    │       │   │               │   │   ├── steppenprobe.cfg
    │       │   │               │   │   ├── stm32-stick.cfg
    │       │   │               │   │   ├── swd-resistor-hack.cfg
    │       │   │               │   │   ├── ti-icdi.cfg
    │       │   │               │   │   ├── tigard.cfg
    │       │   │               │   │   ├── tumpa-lite.cfg
    │       │   │               │   │   ├── tumpa.cfg
    │       │   │               │   │   ├── turtelizer2-revB.cfg
    │       │   │               │   │   ├── turtelizer2-revC.cfg
    │       │   │               │   │   ├── um232h.cfg
    │       │   │               │   │   ├── vpaclink.cfg
    │       │   │               │   │   ├── xds100v2.cfg
    │       │   │               │   │   └── xds100v3.cfg
    │       │   │               │   ├── imx-native.cfg
    │       │   │               │   ├── jlink.cfg
    │       │   │               │   ├── jtag_dpi.cfg
    │       │   │               │   ├── jtag_hat_rpi2.cfg
    │       │   │               │   ├── jtag_vpi.cfg
    │       │   │               │   ├── kitprog.cfg
    │       │   │               │   ├── nds32-aice.cfg
    │       │   │               │   ├── nulink.cfg
    │       │   │               │   ├── opendous.cfg
    │       │   │               │   ├── openjtag.cfg
    │       │   │               │   ├── osbdm.cfg
    │       │   │               │   ├── parport.cfg
    │       │   │               │   ├── parport_dlc5.cfg
    │       │   │               │   ├── raspberrypi-native.cfg
    │       │   │               │   ├── raspberrypi2-native.cfg
    │       │   │               │   ├── rlink.cfg
    │       │   │               │   ├── rshim.cfg
    │       │   │               │   ├── stlink-dap.cfg
    │       │   │               │   ├── stlink-v1.cfg
    │       │   │               │   ├── stlink-v2-1.cfg
    │       │   │               │   ├── stlink-v2.cfg
    │       │   │               │   ├── stlink.cfg
    │       │   │               │   ├── sysfsgpio-raspberrypi.cfg
    │       │   │               │   ├── ti-icdi.cfg
    │       │   │               │   ├── ulink.cfg
    │       │   │               │   ├── usb-jtag.cfg
    │       │   │               │   ├── usbprog.cfg
    │       │   │               │   ├── vdebug.cfg
    │       │   │               │   ├── vsllink.cfg
    │       │   │               │   └── xds110.cfg
    │       │   │               ├── mem_helper.tcl
    │       │   │               ├── memory.tcl
    │       │   │               ├── mmr_helpers.tcl
    │       │   │               ├── target/
    │       │   │               │   ├── 1986ве1т.cfg
    │       │   │               │   ├── adsp-sc58x.cfg
    │       │   │               │   ├── aduc702x.cfg
    │       │   │               │   ├── aducm360.cfg
    │       │   │               │   ├── allwinner_v3s.cfg
    │       │   │               │   ├── alphascale_asm9260t.cfg
    │       │   │               │   ├── altera_fpgasoc.cfg
    │       │   │               │   ├── altera_fpgasoc_arria10.cfg
    │       │   │               │   ├── am335x.cfg
    │       │   │               │   ├── am437x.cfg
    │       │   │               │   ├── amdm37x.cfg
    │       │   │               │   ├── ampere_emag.cfg
    │       │   │               │   ├── ar71xx.cfg
    │       │   │               │   ├── arm_corelink_sse200.cfg
    │       │   │               │   ├── armada370.cfg
    │       │   │               │   ├── at32ap7000.cfg
    │       │   │               │   ├── at91r40008.cfg
    │       │   │               │   ├── at91rm9200.cfg
    │       │   │               │   ├── at91sam3XXX.cfg
    │       │   │               │   ├── at91sam3ax_4x.cfg
    │       │   │               │   ├── at91sam3ax_8x.cfg
    │       │   │               │   ├── at91sam3ax_xx.cfg
    │       │   │               │   ├── at91sam3nXX.cfg
    │       │   │               │   ├── at91sam3sXX.cfg
    │       │   │               │   ├── at91sam3u1c.cfg
    │       │   │               │   ├── at91sam3u1e.cfg
    │       │   │               │   ├── at91sam3u2c.cfg
    │       │   │               │   ├── at91sam3u2e.cfg
    │       │   │               │   ├── at91sam3u4c.cfg
    │       │   │               │   ├── at91sam3u4e.cfg
    │       │   │               │   ├── at91sam3uxx.cfg
    │       │   │               │   ├── at91sam4XXX.cfg
    │       │   │               │   ├── at91sam4c32x.cfg
    │       │   │               │   ├── at91sam4cXXX.cfg
    │       │   │               │   ├── at91sam4lXX.cfg
    │       │   │               │   ├── at91sam4sXX.cfg
    │       │   │               │   ├── at91sam4sd32x.cfg
    │       │   │               │   ├── at91sam7a2.cfg
    │       │   │               │   ├── at91sam7se512.cfg
    │       │   │               │   ├── at91sam7sx.cfg
    │       │   │               │   ├── at91sam7x256.cfg
    │       │   │               │   ├── at91sam7x512.cfg
    │       │   │               │   ├── at91sam9.cfg
    │       │   │               │   ├── at91sam9260.cfg
    │       │   │               │   ├── at91sam9260_ext_RAM_ext_flash.cfg
    │       │   │               │   ├── at91sam9261.cfg
    │       │   │               │   ├── at91sam9263.cfg
    │       │   │               │   ├── at91sam9g10.cfg
    │       │   │               │   ├── at91sam9g20.cfg
    │       │   │               │   ├── at91sam9g45.cfg
    │       │   │               │   ├── at91sam9rl.cfg
    │       │   │               │   ├── at91sama5d2.cfg
    │       │   │               │   ├── at91samdXX.cfg
    │       │   │               │   ├── at91samg5x.cfg
    │       │   │               │   ├── atheros_ar2313.cfg
    │       │   │               │   ├── atheros_ar2315.cfg
    │       │   │               │   ├── atheros_ar9331.cfg
    │       │   │               │   ├── atheros_ar9344.cfg
    │       │   │               │   ├── atmega128.cfg
    │       │   │               │   ├── atmega128rfa1.cfg
    │       │   │               │   ├── atsame5x.cfg
    │       │   │               │   ├── atsaml1x.cfg
    │       │   │               │   ├── atsamv.cfg
    │       │   │               │   ├── avr32.cfg
    │       │   │               │   ├── bcm2711.cfg
    │       │   │               │   ├── bcm281xx.cfg
    │       │   │               │   ├── bcm2835.cfg
    │       │   │               │   ├── bcm2836.cfg
    │       │   │               │   ├── bcm2837.cfg
    │       │   │               │   ├── bcm4706.cfg
    │       │   │               │   ├── bcm4718.cfg
    │       │   │               │   ├── bcm47xx.cfg
    │       │   │               │   ├── bcm5352e.cfg
    │       │   │               │   ├── bcm6348.cfg
    │       │   │               │   ├── bluefield.cfg
    │       │   │               │   ├── bluenrg-x.cfg
    │       │   │               │   ├── c100.cfg
    │       │   │               │   ├── c100config.tcl
    │       │   │               │   ├── c100helper.tcl
    │       │   │               │   ├── c100regs.tcl
    │       │   │               │   ├── cc2538.cfg
    │       │   │               │   ├── cs351x.cfg
    │       │   │               │   ├── davinci.cfg
    │       │   │               │   ├── dragonite.cfg
    │       │   │               │   ├── dsp56321.cfg
    │       │   │               │   ├── dsp568013.cfg
    │       │   │               │   ├── dsp568037.cfg
    │       │   │               │   ├── efm32.cfg
    │       │   │               │   ├── em357.cfg
    │       │   │               │   ├── em358.cfg
    │       │   │               │   ├── eos_s3.cfg
    │       │   │               │   ├── epc9301.cfg
    │       │   │               │   ├── esi32xx.cfg
    │       │   │               │   ├── esp32s2.cfg
    │       │   │               │   ├── exynos5250.cfg
    │       │   │               │   ├── faux.cfg
    │       │   │               │   ├── feroceon.cfg
    │       │   │               │   ├── fm3.cfg
    │       │   │               │   ├── fm4.cfg
    │       │   │               │   ├── fm4_mb9bf.cfg
    │       │   │               │   ├── fm4_s6e2cc.cfg
    │       │   │               │   ├── gd32e23x.cfg
    │       │   │               │   ├── gd32vf103.cfg
    │       │   │               │   ├── gp326xxxa.cfg
    │       │   │               │   ├── hi3798.cfg
    │       │   │               │   ├── hi6220.cfg
    │       │   │               │   ├── hilscher_netx10.cfg
    │       │   │               │   ├── hilscher_netx50.cfg
    │       │   │               │   ├── hilscher_netx500.cfg
    │       │   │               │   ├── icepick.cfg
    │       │   │               │   ├── imx.cfg
    │       │   │               │   ├── imx21.cfg
    │       │   │               │   ├── imx25.cfg
    │       │   │               │   ├── imx27.cfg
    │       │   │               │   ├── imx28.cfg
    │       │   │               │   ├── imx31.cfg
    │       │   │               │   ├── imx35.cfg
    │       │   │               │   ├── imx51.cfg
    │       │   │               │   ├── imx53.cfg
    │       │   │               │   ├── imx6.cfg
    │       │   │               │   ├── imx6sx.cfg
    │       │   │               │   ├── imx6ul.cfg
    │       │   │               │   ├── imx7.cfg
    │       │   │               │   ├── imx7ulp.cfg
    │       │   │               │   ├── imx8m.cfg
    │       │   │               │   ├── imx8qm.cfg
    │       │   │               │   ├── infineon/
    │       │   │               │   │   └── tle987x.cfg
    │       │   │               │   ├── is5114.cfg
    │       │   │               │   ├── ixp42x.cfg
    │       │   │               │   ├── k1921vk01t.cfg
    │       │   │               │   ├── k40.cfg
    │       │   │               │   ├── k60.cfg
    │       │   │               │   ├── ke0x.cfg
    │       │   │               │   ├── ke1xf.cfg
    │       │   │               │   ├── ke1xz.cfg
    │       │   │               │   ├── kl25.cfg
    │       │   │               │   ├── kl46.cfg
    │       │   │               │   ├── klx.cfg
    │       │   │               │   ├── ks869x.cfg
    │       │   │               │   ├── kx.cfg
    │       │   │               │   ├── lpc11xx.cfg
    │       │   │               │   ├── lpc12xx.cfg
    │       │   │               │   ├── lpc13xx.cfg
    │       │   │               │   ├── lpc17xx.cfg
    │       │   │               │   ├── lpc1850.cfg
    │       │   │               │   ├── lpc1xxx.cfg
    │       │   │               │   ├── lpc2103.cfg
    │       │   │               │   ├── lpc2124.cfg
    │       │   │               │   ├── lpc2129.cfg
    │       │   │               │   ├── lpc2148.cfg
    │       │   │               │   ├── lpc2294.cfg
    │       │   │               │   ├── lpc2378.cfg
    │       │   │               │   ├── lpc2460.cfg
    │       │   │               │   ├── lpc2478.cfg
    │       │   │               │   ├── lpc2900.cfg
    │       │   │               │   ├── lpc2xxx.cfg
    │       │   │               │   ├── lpc3131.cfg
    │       │   │               │   ├── lpc3250.cfg
    │       │   │               │   ├── lpc40xx.cfg
    │       │   │               │   ├── lpc4350.cfg
    │       │   │               │   ├── lpc4357.cfg
    │       │   │               │   ├── lpc4370.cfg
    │       │   │               │   ├── lpc84x.cfg
    │       │   │               │   ├── lpc8nxx.cfg
    │       │   │               │   ├── lpc8xx.cfg
    │       │   │               │   ├── ls1012a.cfg
    │       │   │               │   ├── ls1028a.cfg
    │       │   │               │   ├── ls1046a.cfg
    │       │   │               │   ├── ls1088a.cfg
    │       │   │               │   ├── lsch3_common.cfg
    │       │   │               │   ├── marvell/
    │       │   │               │   │   ├── 88f3710.cfg
    │       │   │               │   │   ├── 88f3720.cfg
    │       │   │               │   │   └── 88f37x0.cfg
    │       │   │               │   ├── max32620.cfg
    │       │   │               │   ├── max32625.cfg
    │       │   │               │   ├── max3263x.cfg
    │       │   │               │   ├── mc13224v.cfg
    │       │   │               │   ├── mdr32f9q2i.cfg
    │       │   │               │   ├── nds32v2.cfg
    │       │   │               │   ├── nds32v3.cfg
    │       │   │               │   ├── nds32v3m.cfg
    │       │   │               │   ├── nds32v5.cfg
    │       │   │               │   ├── nhs31xx.cfg
    │       │   │               │   ├── npcx.cfg
    │       │   │               │   ├── nrf51.cfg
    │       │   │               │   ├── nrf52.cfg
    │       │   │               │   ├── nuc910.cfg
    │       │   │               │   ├── numicro.cfg
    │       │   │               │   ├── omap2420.cfg
    │       │   │               │   ├── omap3530.cfg
    │       │   │               │   ├── omap4430.cfg
    │       │   │               │   ├── omap4460.cfg
    │       │   │               │   ├── omap5912.cfg
    │       │   │               │   ├── omapl138.cfg
    │       │   │               │   ├── or1k.cfg
    │       │   │               │   ├── pic32mx.cfg
    │       │   │               │   ├── psoc4.cfg
    │       │   │               │   ├── psoc5lp.cfg
    │       │   │               │   ├── psoc6.cfg
    │       │   │               │   ├── pxa255.cfg
    │       │   │               │   ├── pxa270.cfg
    │       │   │               │   ├── pxa3xx.cfg
    │       │   │               │   ├── qualcomm_qca4531.cfg
    │       │   │               │   ├── quark_d20xx.cfg
    │       │   │               │   ├── quark_x10xx.cfg
    │       │   │               │   ├── readme.txt
    │       │   │               │   ├── renesas_r7s72100.cfg
    │       │   │               │   ├── renesas_rcar_gen2.cfg
    │       │   │               │   ├── renesas_rcar_gen3.cfg
    │       │   │               │   ├── renesas_rcar_reset_common.cfg
    │       │   │               │   ├── renesas_rz_five.cfg
    │       │   │               │   ├── renesas_rz_g2.cfg
    │       │   │               │   ├── renesas_s7g2.cfg
    │       │   │               │   ├── rk3308.cfg
    │       │   │               │   ├── rk3399.cfg
    │       │   │               │   ├── rp2040-core0.cfg
    │       │   │               │   ├── samsung_s3c2410.cfg
    │       │   │               │   ├── samsung_s3c2440.cfg
    │       │   │               │   ├── samsung_s3c2450.cfg
    │       │   │               │   ├── samsung_s3c4510.cfg
    │       │   │               │   ├── samsung_s3c6410.cfg
    │       │   │               │   ├── sharp_lh79532.cfg
    │       │   │               │   ├── sim3x.cfg
    │       │   │               │   ├── smp8634.cfg
    │       │   │               │   ├── snps_em_sk_fpga.cfg
    │       │   │               │   ├── snps_hsdk.cfg
    │       │   │               │   ├── spear3xx.cfg
    │       │   │               │   ├── stellaris.cfg
    │       │   │               │   ├── stm32f0x.cfg
    │       │   │               │   ├── stm32f1x.cfg
    │       │   │               │   ├── stm32f2x.cfg
    │       │   │               │   ├── stm32f3x.cfg
    │       │   │               │   ├── stm32f4x.cfg
    │       │   │               │   ├── stm32f7x.cfg
    │       │   │               │   ├── stm32g0x.cfg
    │       │   │               │   ├── stm32g4x.cfg
    │       │   │               │   ├── stm32h7x.cfg
    │       │   │               │   ├── stm32h7x_dual_bank.cfg
    │       │   │               │   ├── stm32l0.cfg
    │       │   │               │   ├── stm32l0_dual_bank.cfg
    │       │   │               │   ├── stm32l1.cfg
    │       │   │               │   ├── stm32l1x_dual_bank.cfg
    │       │   │               │   ├── stm32l4x.cfg
    │       │   │               │   ├── stm32l5x.cfg
    │       │   │               │   ├── stm32mp13x.cfg
    │       │   │               │   ├── stm32mp15x.cfg
    │       │   │               │   ├── stm32u5x.cfg
    │       │   │               │   ├── stm32w108xx.cfg
    │       │   │               │   ├── stm32wbx.cfg
    │       │   │               │   ├── stm32wlx.cfg
    │       │   │               │   ├── stm32x5x_common.cfg
    │       │   │               │   ├── stm32xl.cfg
    │       │   │               │   ├── stm8l.cfg
    │       │   │               │   ├── stm8l152.cfg
    │       │   │               │   ├── stm8s.cfg
    │       │   │               │   ├── stm8s003.cfg
    │       │   │               │   ├── stm8s103.cfg
    │       │   │               │   ├── stm8s105.cfg
    │       │   │               │   ├── str710.cfg
    │       │   │               │   ├── str730.cfg
    │       │   │               │   ├── str750.cfg
    │       │   │               │   ├── str912.cfg
    │       │   │               │   ├── swj-dp.tcl
    │       │   │               │   ├── swm050.cfg
    │       │   │               │   ├── test_reset_syntax_error.cfg
    │       │   │               │   ├── test_syntax_error.cfg
    │       │   │               │   ├── ti-ar7.cfg
    │       │   │               │   ├── ti-cjtag.cfg
    │       │   │               │   ├── ti_calypso.cfg
    │       │   │               │   ├── ti_cc13x0.cfg
    │       │   │               │   ├── ti_cc13x2.cfg
    │       │   │               │   ├── ti_cc26x0.cfg
    │       │   │               │   ├── ti_cc26x2.cfg
    │       │   │               │   ├── ti_cc3220sf.cfg
    │       │   │               │   ├── ti_cc32xx.cfg
    │       │   │               │   ├── ti_dm355.cfg
    │       │   │               │   ├── ti_dm365.cfg
    │       │   │               │   ├── ti_dm6446.cfg
    │       │   │               │   ├── ti_k3.cfg
    │       │   │               │   ├── ti_msp432.cfg
    │       │   │               │   ├── ti_rm4x.cfg
    │       │   │               │   ├── ti_tms570.cfg
    │       │   │               │   ├── ti_tms570ls20xxx.cfg
    │       │   │               │   ├── ti_tms570ls3137.cfg
    │       │   │               │   ├── tmpa900.cfg
    │       │   │               │   ├── tmpa910.cfg
    │       │   │               │   ├── tnetc4401.cfg
    │       │   │               │   ├── u8500.cfg
    │       │   │               │   ├── vd_aarch64.cfg
    │       │   │               │   ├── vd_cortex_m.cfg
    │       │   │               │   ├── vd_riscv.cfg
    │       │   │               │   ├── vybrid_vf6xx.cfg
    │       │   │               │   ├── xilinx_zynqmp.cfg
    │       │   │               │   ├── xmc1xxx.cfg
    │       │   │               │   ├── xmc4xxx.cfg
    │       │   │               │   ├── xmos_xs1-xau8a-10_arm.cfg
    │       │   │               │   ├── zynq_7000.cfg
    │       │   │               │   └── к1879xб1я.cfg
    │       │   │               ├── test/
    │       │   │               │   ├── selftest.cfg
    │       │   │               │   └── syntax1.cfg
    │       │   │               └── tools/
    │       │   │                   ├── firmware-recovery.tcl
    │       │   │                   ├── memtest.tcl
    │       │   │                   └── test_cpu_speed.tcl
    │       │   ├── README.md
    │       │   └── translations/
    │       │       ├── qt_ar.qm
    │       │       ├── qt_bg.qm
    │       │       ├── qt_ca.qm
    │       │       ├── qt_cs.qm
    │       │       ├── qt_da.qm
    │       │       ├── qt_de.qm
    │       │       ├── qt_en.qm
    │       │       ├── qt_es.qm
    │       │       ├── qt_fa.qm
    │       │       ├── qt_fi.qm
    │       │       ├── qt_fr.qm
    │       │       ├── qt_gd.qm
    │       │       ├── qt_he.qm
    │       │       ├── qt_hr.qm
    │       │       ├── qt_hu.qm
    │       │       ├── qt_it.qm
    │       │       ├── qt_ja.qm
    │       │       ├── qt_ko.qm
    │       │       ├── qt_lv.qm
    │       │       ├── qt_nl.qm
    │       │       ├── qt_nn.qm
    │       │       ├── qt_pl.qm
    │       │       ├── qt_pt_BR.qm
    │       │       ├── qt_ru.qm
    │       │       ├── qt_sk.qm
    │       │       ├── qt_tr.qm
    │       │       ├── qt_uk.qm
    │       │       ├── qt_zh_CN.qm
    │       │       └── qt_zh_TW.qm
    │       ├── OpenOCD_CH347/
    │       │   ├── README.md
    │       │   ├── bin/
    │       │   │   └── ch347.cfg
    │       │   ├── contrib/
    │       │   │   ├── 60-openocd.rules
    │       │   │   └── libdcc/
    │       │   │       ├── README
    │       │   │       ├── dcc_stdio.c
    │       │   │       ├── dcc_stdio.h
    │       │   │       └── example.c
    │       │   ├── scripts/
    │       │   │   ├── bitsbytes.tcl
    │       │   │   ├── board/
    │       │   │   │   ├── 8devices-lima.cfg
    │       │   │   │   ├── actux3.cfg
    │       │   │   │   ├── adapteva_parallella1.cfg
    │       │   │   │   ├── adsp-sc584-ezbrd.cfg
    │       │   │   │   ├── alphascale_asm9260_ek.cfg
    │       │   │   │   ├── altera_sockit.cfg
    │       │   │   │   ├── am3517evm.cfg
    │       │   │   │   ├── ampere_emag8180.cfg
    │       │   │   │   ├── arm_evaluator7t.cfg
    │       │   │   │   ├── arm_musca_a.cfg
    │       │   │   │   ├── arty_s7.cfg
    │       │   │   │   ├── asus-rt-n16.cfg
    │       │   │   │   ├── asus-rt-n66u.cfg
    │       │   │   │   ├── at91cap7a-stk-sdram.cfg
    │       │   │   │   ├── at91eb40a.cfg
    │       │   │   │   ├── at91rm9200-dk.cfg
    │       │   │   │   ├── at91rm9200-ek.cfg
    │       │   │   │   ├── at91sam9261-ek.cfg
    │       │   │   │   ├── at91sam9263-ek.cfg
    │       │   │   │   ├── at91sam9g20-ek.cfg
    │       │   │   │   ├── atmel_at91sam7s-ek.cfg
    │       │   │   │   ├── atmel_at91sam9260-ek.cfg
    │       │   │   │   ├── atmel_at91sam9rl-ek.cfg
    │       │   │   │   ├── atmel_sam3n_ek.cfg
    │       │   │   │   ├── atmel_sam3s_ek.cfg
    │       │   │   │   ├── atmel_sam3u_ek.cfg
    │       │   │   │   ├── atmel_sam3x_ek.cfg
    │       │   │   │   ├── atmel_sam4e_ek.cfg
    │       │   │   │   ├── atmel_sam4l8_xplained_pro.cfg
    │       │   │   │   ├── atmel_sam4s_ek.cfg
    │       │   │   │   ├── atmel_sam4s_xplained_pro.cfg
    │       │   │   │   ├── atmel_samc20_xplained_pro.cfg
    │       │   │   │   ├── atmel_samc21_xplained_pro.cfg
    │       │   │   │   ├── atmel_samd10_xplained_mini.cfg
    │       │   │   │   ├── atmel_samd11_xplained_pro.cfg
    │       │   │   │   ├── atmel_samd20_xplained_pro.cfg
    │       │   │   │   ├── atmel_samd21_xplained_pro.cfg
    │       │   │   │   ├── atmel_same70_xplained.cfg
    │       │   │   │   ├── atmel_samg53_xplained_pro.cfg
    │       │   │   │   ├── atmel_samg55_xplained_pro.cfg
    │       │   │   │   ├── atmel_saml21_xplained_pro.cfg
    │       │   │   │   ├── atmel_samr21_xplained_pro.cfg
    │       │   │   │   ├── atmel_samv71_xplained_ultra.cfg
    │       │   │   │   ├── avnet_ultrazed-eg.cfg
    │       │   │   │   ├── balloon3-cpu.cfg
    │       │   │   │   ├── bcm28155_ap.cfg
    │       │   │   │   ├── bluefield.cfg
    │       │   │   │   ├── bt-homehubv1.cfg
    │       │   │   │   ├── colibri.cfg
    │       │   │   │   ├── crossbow_tech_imote2.cfg
    │       │   │   │   ├── csb337.cfg
    │       │   │   │   ├── csb732.cfg
    │       │   │   │   ├── da850evm.cfg
    │       │   │   │   ├── digi_connectcore_wi-9c.cfg
    │       │   │   │   ├── digilent_analog_discovery.cfg
    │       │   │   │   ├── digilent_atlys.cfg
    │       │   │   │   ├── digilent_nexys_video.cfg
    │       │   │   │   ├── digilent_zedboard.cfg
    │       │   │   │   ├── diolan_lpc4350-db1.cfg
    │       │   │   │   ├── diolan_lpc4357-db1.cfg
    │       │   │   │   ├── dk-tm4c129.cfg
    │       │   │   │   ├── dm355evm.cfg
    │       │   │   │   ├── dm365evm.cfg
    │       │   │   │   ├── dm6446evm.cfg
    │       │   │   │   ├── dp_busblaster_v3.cfg
    │       │   │   │   ├── dp_busblaster_v4.cfg
    │       │   │   │   ├── dptechnics_dpt-board-v1.cfg
    │       │   │   │   ├── efikamx.cfg
    │       │   │   │   ├── efm32.cfg
    │       │   │   │   ├── eir.cfg
    │       │   │   │   ├── ek-lm3s1968.cfg
    │       │   │   │   ├── ek-lm3s3748.cfg
    │       │   │   │   ├── ek-lm3s6965.cfg
    │       │   │   │   ├── ek-lm3s811-revb.cfg
    │       │   │   │   ├── ek-lm3s811.cfg
    │       │   │   │   ├── ek-lm3s8962.cfg
    │       │   │   │   ├── ek-lm3s9b9x.cfg
    │       │   │   │   ├── ek-lm3s9d92.cfg
    │       │   │   │   ├── ek-lm4f120xl.cfg
    │       │   │   │   ├── ek-lm4f232.cfg
    │       │   │   │   ├── ek-tm4c123gxl.cfg
    │       │   │   │   ├── ek-tm4c1294xl.cfg
    │       │   │   │   ├── embedded-artists_lpc2478-32.cfg
    │       │   │   │   ├── emcraft_imx8m-som-bsb.cfg
    │       │   │   │   ├── emcraft_twr-vf6-som-bsb.cfg
    │       │   │   │   ├── emcraft_vf6-som.cfg
    │       │   │   │   ├── esp32s2-kaluga-1.cfg
    │       │   │   │   ├── ethernut3.cfg
    │       │   │   │   ├── evb-lan9255.cfg
    │       │   │   │   ├── frdm-kl25z.cfg
    │       │   │   │   ├── frdm-kl46z.cfg
    │       │   │   │   ├── fsl_imx6q_sabresd.cfg
    │       │   │   │   ├── glyn_tonga2.cfg
    │       │   │   │   ├── gti/
    │       │   │   │   │   └── espressobin.cfg
    │       │   │   │   ├── gumstix-aerocore.cfg
    │       │   │   │   ├── hammer.cfg
    │       │   │   │   ├── hilscher_nxdb500sys.cfg
    │       │   │   │   ├── hilscher_nxeb500hmi.cfg
    │       │   │   │   ├── hilscher_nxhx10.cfg
    │       │   │   │   ├── hilscher_nxhx50.cfg
    │       │   │   │   ├── hilscher_nxhx500.cfg
    │       │   │   │   ├── hilscher_nxsb100.cfg
    │       │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   ├── hitex_lpc2929.cfg
    │       │   │   │   ├── hitex_stm32-performancestick.cfg
    │       │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   ├── iar_lpc1768.cfg
    │       │   │   │   ├── iar_str912_sk.cfg
    │       │   │   │   ├── icnova_imx53_sodimm.cfg
    │       │   │   │   ├── icnova_sam9g45_sodimm.cfg
    │       │   │   │   ├── imx27ads.cfg
    │       │   │   │   ├── imx27lnst.cfg
    │       │   │   │   ├── imx28evk.cfg
    │       │   │   │   ├── imx31pdk.cfg
    │       │   │   │   ├── imx35pdk.cfg
    │       │   │   │   ├── imx53-m53evk.cfg
    │       │   │   │   ├── imx53loco.cfg
    │       │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   ├── insignal_arndale.cfg
    │       │   │   │   ├── kasli.cfg
    │       │   │   │   ├── kc100.cfg
    │       │   │   │   ├── kc705.cfg
    │       │   │   │   ├── kcu105.cfg
    │       │   │   │   ├── keil_mcb1700.cfg
    │       │   │   │   ├── keil_mcb2140.cfg
    │       │   │   │   ├── kindle2.cfg
    │       │   │   │   ├── kontron_sl28.cfg
    │       │   │   │   ├── kwikstik.cfg
    │       │   │   │   ├── la_fonera-fon2200.cfg
    │       │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   ├── lemaker_hikey.cfg
    │       │   │   │   ├── linksys-wag200g.cfg
    │       │   │   │   ├── linksys-wrt54gl.cfg
    │       │   │   │   ├── linksys_nslu2.cfg
    │       │   │   │   ├── lisa-l.cfg
    │       │   │   │   ├── logicpd_imx27.cfg
    │       │   │   │   ├── lpc1850_spifi_generic.cfg
    │       │   │   │   ├── lpc4350_spifi_generic.cfg
    │       │   │   │   ├── lubbock.cfg
    │       │   │   │   ├── marsohod.cfg
    │       │   │   │   ├── marsohod2.cfg
    │       │   │   │   ├── marsohod3.cfg
    │       │   │   │   ├── mbed-lpc11u24.cfg
    │       │   │   │   ├── mbed-lpc1768.cfg
    │       │   │   │   ├── mcb1700.cfg
    │       │   │   │   ├── microchip_explorer16.cfg
    │       │   │   │   ├── microchip_sama5d27_som1_kit1.cfg
    │       │   │   │   ├── microchip_same51_curiosity_nano.cfg
    │       │   │   │   ├── microchip_same54_xplained_pro.cfg
    │       │   │   │   ├── microchip_saml11_xplained_pro.cfg
    │       │   │   │   ├── mini2440.cfg
    │       │   │   │   ├── mini6410.cfg
    │       │   │   │   ├── minispartan6.cfg
    │       │   │   │   ├── nds32_corvettef1.cfg
    │       │   │   │   ├── nds32_xc5.cfg
    │       │   │   │   ├── nds32_xc7.cfg
    │       │   │   │   ├── netgear-dg834v3.cfg
    │       │   │   │   ├── netgear-wg102.cfg
    │       │   │   │   ├── nordic_nrf51822_mkit.cfg
    │       │   │   │   ├── nordic_nrf51_dk.cfg
    │       │   │   │   ├── nordic_nrf52_dk.cfg
    │       │   │   │   ├── nordic_nrf52_ftx232.cfg
    │       │   │   │   ├── novena-internal-fpga.cfg
    │       │   │   │   ├── npcx_evb.cfg
    │       │   │   │   ├── numato_mimas_a7.cfg
    │       │   │   │   ├── numato_opsis.cfg
    │       │   │   │   ├── nxp_frdm-k64f.cfg
    │       │   │   │   ├── nxp_frdm-ls1012a.cfg
    │       │   │   │   ├── nxp_imx7sabre.cfg
    │       │   │   │   ├── nxp_lpc-link2.cfg
    │       │   │   │   ├── nxp_mcimx8m-evk.cfg
    │       │   │   │   ├── nxp_rdb-ls1046a.cfg
    │       │   │   │   ├── nxp_rdb-ls1088a.cfg
    │       │   │   │   ├── olimex_LPC2378STK.cfg
    │       │   │   │   ├── olimex_lpc_h2148.cfg
    │       │   │   │   ├── olimex_sam7_ex256.cfg
    │       │   │   │   ├── olimex_sam7_la2.cfg
    │       │   │   │   ├── olimex_sam9_l9260.cfg
    │       │   │   │   ├── olimex_stm32_h103.cfg
    │       │   │   │   ├── olimex_stm32_h107.cfg
    │       │   │   │   ├── olimex_stm32_h405.cfg
    │       │   │   │   ├── olimex_stm32_p107.cfg
    │       │   │   │   ├── omap2420_h4.cfg
    │       │   │   │   ├── openrd.cfg
    │       │   │   │   ├── or1k_generic.cfg
    │       │   │   │   ├── osk5912.cfg
    │       │   │   │   ├── phone_se_j100i.cfg
    │       │   │   │   ├── phytec_lpc3250.cfg
    │       │   │   │   ├── pic-p32mx.cfg
    │       │   │   │   ├── pico-debug.cfg
    │       │   │   │   ├── pipistrello.cfg
    │       │   │   │   ├── propox_mmnet1001.cfg
    │       │   │   │   ├── pxa255_sst.cfg
    │       │   │   │   ├── quark_d2000_refboard.cfg
    │       │   │   │   ├── quark_x10xx_board.cfg
    │       │   │   │   ├── quicklogic_quickfeather.cfg
    │       │   │   │   ├── radiona_ulx3s.cfg
    │       │   │   │   ├── redbee.cfg
    │       │   │   │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │       │   │   │   ├── renesas_dk-s7g2.cfg
    │       │   │   │   ├── renesas_falcon.cfg
    │       │   │   │   ├── renesas_gr_peach.cfg
    │       │   │   │   ├── renesas_porter.cfg
    │       │   │   │   ├── renesas_salvator-xs.cfg
    │       │   │   │   ├── renesas_silk.cfg
    │       │   │   │   ├── renesas_stout.cfg
    │       │   │   │   ├── rigado_bmd300_ek.cfg
    │       │   │   │   ├── rpi3.cfg
    │       │   │   │   ├── rpi4b.cfg
    │       │   │   │   ├── rsc-w910.cfg
    │       │   │   │   ├── sayma_amc.cfg
    │       │   │   │   ├── sheevaplug.cfg
    │       │   │   │   ├── sifive-e31arty.cfg
    │       │   │   │   ├── sifive-e51arty.cfg
    │       │   │   │   ├── sifive-hifive1-revb.cfg
    │       │   │   │   ├── sifive-hifive1.cfg
    │       │   │   │   ├── smdk6410.cfg
    │       │   │   │   ├── snps_em_sk.cfg
    │       │   │   │   ├── snps_em_sk_v1.cfg
    │       │   │   │   ├── snps_em_sk_v2.1.cfg
    │       │   │   │   ├── snps_em_sk_v2.2.cfg
    │       │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │       │   │   │   ├── spansion_sk-fm4-u120-9b560.cfg
    │       │   │   │   ├── spear300evb.cfg
    │       │   │   │   ├── spear300evb_mod.cfg
    │       │   │   │   ├── spear310evb20.cfg
    │       │   │   │   ├── spear310evb20_mod.cfg
    │       │   │   │   ├── spear320cpu.cfg
    │       │   │   │   ├── spear320cpu_mod.cfg
    │       │   │   │   ├── st_b-l475e-iot01a.cfg
    │       │   │   │   ├── st_nucleo_8l152r8.cfg
    │       │   │   │   ├── st_nucleo_8s208rb.cfg
    │       │   │   │   ├── st_nucleo_f0.cfg
    │       │   │   │   ├── st_nucleo_f103rb.cfg
    │       │   │   │   ├── st_nucleo_f3.cfg
    │       │   │   │   ├── st_nucleo_f4.cfg
    │       │   │   │   ├── st_nucleo_f7.cfg
    │       │   │   │   ├── st_nucleo_g0.cfg
    │       │   │   │   ├── st_nucleo_g4.cfg
    │       │   │   │   ├── st_nucleo_h743zi.cfg
    │       │   │   │   ├── st_nucleo_h745zi.cfg
    │       │   │   │   ├── st_nucleo_l073rz.cfg
    │       │   │   │   ├── st_nucleo_l1.cfg
    │       │   │   │   ├── st_nucleo_l4.cfg
    │       │   │   │   ├── st_nucleo_l5.cfg
    │       │   │   │   ├── st_nucleo_wb55.cfg
    │       │   │   │   ├── steval-idb007v1.cfg
    │       │   │   │   ├── steval-idb008v1.cfg
    │       │   │   │   ├── steval-idb011v1.cfg
    │       │   │   │   ├── steval-idb012v1.cfg
    │       │   │   │   ├── steval_pcc010.cfg
    │       │   │   │   ├── stm320518_eval.cfg
    │       │   │   │   ├── stm320518_eval_stlink.cfg
    │       │   │   │   ├── stm32100b_eval.cfg
    │       │   │   │   ├── stm3210b_eval.cfg
    │       │   │   │   ├── stm3210c_eval.cfg
    │       │   │   │   ├── stm3210e_eval.cfg
    │       │   │   │   ├── stm3220g_eval.cfg
    │       │   │   │   ├── stm3220g_eval_stlink.cfg
    │       │   │   │   ├── stm3241g_eval.cfg
    │       │   │   │   ├── stm3241g_eval_stlink.cfg
    │       │   │   │   ├── stm32429i_eval.cfg
    │       │   │   │   ├── stm32429i_eval_stlink.cfg
    │       │   │   │   ├── stm32439i_eval.cfg
    │       │   │   │   ├── stm32439i_eval_stlink.cfg
    │       │   │   │   ├── stm327x6g_eval.cfg
    │       │   │   │   ├── stm32f0discovery.cfg
    │       │   │   │   ├── stm32f103c8_blue_pill.cfg
    │       │   │   │   ├── stm32f334discovery.cfg
    │       │   │   │   ├── stm32f3discovery.cfg
    │       │   │   │   ├── stm32f412g-disco.cfg
    │       │   │   │   ├── stm32f413h-disco.cfg
    │       │   │   │   ├── stm32f429disc1.cfg
    │       │   │   │   ├── stm32f429discovery.cfg
    │       │   │   │   ├── stm32f469discovery.cfg
    │       │   │   │   ├── stm32f469i-disco.cfg
    │       │   │   │   ├── stm32f4discovery.cfg
    │       │   │   │   ├── stm32f723e-disco.cfg
    │       │   │   │   ├── stm32f746g-disco.cfg
    │       │   │   │   ├── stm32f769i-disco.cfg
    │       │   │   │   ├── stm32f7discovery.cfg
    │       │   │   │   ├── stm32h735g-disco.cfg
    │       │   │   │   ├── stm32h745i-disco.cfg
    │       │   │   │   ├── stm32h747i-disco.cfg
    │       │   │   │   ├── stm32h750b-disco.cfg
    │       │   │   │   ├── stm32h7b3i-disco.cfg
    │       │   │   │   ├── stm32h7x3i_eval.cfg
    │       │   │   │   ├── stm32h7x_dual_qspi.cfg
    │       │   │   │   ├── stm32l0discovery.cfg
    │       │   │   │   ├── stm32l476g-disco.cfg
    │       │   │   │   ├── stm32l496g-disco.cfg
    │       │   │   │   ├── stm32l4discovery.cfg
    │       │   │   │   ├── stm32l4p5g-disco.cfg
    │       │   │   │   ├── stm32l4r9i-disco.cfg
    │       │   │   │   ├── stm32ldiscovery.cfg
    │       │   │   │   ├── stm32mp13x_dk.cfg
    │       │   │   │   ├── stm32mp15x_dk2.cfg
    │       │   │   │   ├── stm32vldiscovery.cfg
    │       │   │   │   ├── str910-eval.cfg
    │       │   │   │   ├── telo.cfg
    │       │   │   │   ├── ti_am335xevm.cfg
    │       │   │   │   ├── ti_am437x_idk.cfg
    │       │   │   │   ├── ti_am43xx_evm.cfg
    │       │   │   │   ├── ti_am625evm.cfg
    │       │   │   │   ├── ti_am642evm.cfg
    │       │   │   │   ├── ti_am654evm.cfg
    │       │   │   │   ├── ti_beagleboard.cfg
    │       │   │   │   ├── ti_beagleboard_xm.cfg
    │       │   │   │   ├── ti_beaglebone-base.cfg
    │       │   │   │   ├── ti_beaglebone.cfg
    │       │   │   │   ├── ti_beaglebone_black.cfg
    │       │   │   │   ├── ti_blaze.cfg
    │       │   │   │   ├── ti_cc13x0_launchpad.cfg
    │       │   │   │   ├── ti_cc13x2_launchpad.cfg
    │       │   │   │   ├── ti_cc26x0_launchpad.cfg
    │       │   │   │   ├── ti_cc26x2_launchpad.cfg
    │       │   │   │   ├── ti_cc3200_launchxl.cfg
    │       │   │   │   ├── ti_cc3220sf_launchpad.cfg
    │       │   │   │   ├── ti_cc32xx_launchpad.cfg
    │       │   │   │   ├── ti_dk-tm4c129.cfg
    │       │   │   │   ├── ti_ek-tm4c123gxl.cfg
    │       │   │   │   ├── ti_ek-tm4c1294xl.cfg
    │       │   │   │   ├── ti_j7200evm.cfg
    │       │   │   │   ├── ti_j721evm.cfg
    │       │   │   │   ├── ti_j721s2evm.cfg
    │       │   │   │   ├── ti_msp432_launchpad.cfg
    │       │   │   │   ├── ti_pandaboard.cfg
    │       │   │   │   ├── ti_pandaboard_es.cfg
    │       │   │   │   ├── ti_tmdx570ls20susb.cfg
    │       │   │   │   ├── ti_tmdx570ls31usb.cfg
    │       │   │   │   ├── tocoding_poplar.cfg
    │       │   │   │   ├── topas910.cfg
    │       │   │   │   ├── topasa900.cfg
    │       │   │   │   ├── tp-link_tl-mr3020.cfg
    │       │   │   │   ├── tp-link_wdr4300.cfg
    │       │   │   │   ├── twr-k60f120m.cfg
    │       │   │   │   ├── twr-k60n512.cfg
    │       │   │   │   ├── twr-vf65gs10.cfg
    │       │   │   │   ├── twr-vf65gs10_cmsisdap.cfg
    │       │   │   │   ├── tx25_stk5.cfg
    │       │   │   │   ├── tx27_stk5.cfg
    │       │   │   │   ├── unknown_at91sam9260.cfg
    │       │   │   │   ├── uptech_2410.cfg
    │       │   │   │   ├── vd_a53x2_jtag.cfg
    │       │   │   │   ├── vd_m4_jtag.cfg
    │       │   │   │   ├── vd_pulpissimo_jtag.cfg
    │       │   │   │   ├── vd_swerv_jtag.cfg
    │       │   │   │   ├── verdex.cfg
    │       │   │   │   ├── voipac.cfg
    │       │   │   │   ├── voltcraft_dso-3062c.cfg
    │       │   │   │   ├── x300t.cfg
    │       │   │   │   ├── xmc-2go.cfg
    │       │   │   │   ├── xmc1100-boot-kit.cfg
    │       │   │   │   ├── xmc4200-application-kit-actuator.cfg
    │       │   │   │   ├── xmc4300-relax.cfg
    │       │   │   │   ├── xmc4500-application-kit-general.cfg
    │       │   │   │   ├── xmc4500-application-kit-sdram.cfg
    │       │   │   │   ├── xmc4500-relax.cfg
    │       │   │   │   ├── xmc4700-relax.cfg
    │       │   │   │   ├── xmc4800-relax.cfg
    │       │   │   │   └── xmos_xk-xac-xa8_arm.cfg
    │       │   │   ├── chip/
    │       │   │   │   ├── atmel/
    │       │   │   │   │   └── at91/
    │       │   │   │   │       ├── aic.tcl
    │       │   │   │   │       ├── at91_pio.cfg
    │       │   │   │   │       ├── at91_pmc.cfg
    │       │   │   │   │       ├── at91_rstc.cfg
    │       │   │   │   │       ├── at91_wdt.cfg
    │       │   │   │   │       ├── at91sam7x128.tcl
    │       │   │   │   │       ├── at91sam7x256.tcl
    │       │   │   │   │       ├── at91sam9261.cfg
    │       │   │   │   │       ├── at91sam9261_matrix.cfg
    │       │   │   │   │       ├── at91sam9263.cfg
    │       │   │   │   │       ├── at91sam9263_matrix.cfg
    │       │   │   │   │       ├── at91sam9_init.cfg
    │       │   │   │   │       ├── at91sam9_sdramc.cfg
    │       │   │   │   │       ├── at91sam9_smc.cfg
    │       │   │   │   │       ├── hardware.cfg
    │       │   │   │   │       ├── pmc.tcl
    │       │   │   │   │       ├── rtt.tcl
    │       │   │   │   │       ├── sam9_smc.cfg
    │       │   │   │   │       └── usarts.tcl
    │       │   │   │   ├── st/
    │       │   │   │   │   ├── spear/
    │       │   │   │   │   │   ├── quirk_no_srst.tcl
    │       │   │   │   │   │   ├── spear3xx.tcl
    │       │   │   │   │   │   └── spear3xx_ddr.tcl
    │       │   │   │   │   └── stm32/
    │       │   │   │   │       ├── stm32.tcl
    │       │   │   │   │       ├── stm32_rcc.tcl
    │       │   │   │   │       └── stm32_regs.tcl
    │       │   │   │   └── ti/
    │       │   │   │       └── lm3s/
    │       │   │   │           ├── lm3s.tcl
    │       │   │   │           └── lm3s_regs.tcl
    │       │   │   ├── cpld/
    │       │   │   │   ├── altera-5m570z-cpld.cfg
    │       │   │   │   ├── altera-epm240.cfg
    │       │   │   │   ├── jtagspi.cfg
    │       │   │   │   ├── lattice-lc4032ze.cfg
    │       │   │   │   ├── xilinx-xc6s.cfg
    │       │   │   │   ├── xilinx-xc7.cfg
    │       │   │   │   ├── xilinx-xcf-p.cfg
    │       │   │   │   ├── xilinx-xcf-s.cfg
    │       │   │   │   ├── xilinx-xcr3256.cfg
    │       │   │   │   └── xilinx-xcu.cfg
    │       │   │   ├── cpu/
    │       │   │   │   ├── arc/
    │       │   │   │   │   ├── common.tcl
    │       │   │   │   │   ├── em.tcl
    │       │   │   │   │   ├── hs.tcl
    │       │   │   │   │   └── v2.tcl
    │       │   │   │   └── arm/
    │       │   │   │       ├── arm7tdmi.tcl
    │       │   │   │       ├── arm920.tcl
    │       │   │   │       ├── arm946.tcl
    │       │   │   │       ├── arm966.tcl
    │       │   │   │       └── cortex_m3.tcl
    │       │   │   ├── fpga/
    │       │   │   │   ├── altera-10m50.cfg
    │       │   │   │   ├── altera-ep3c10.cfg
    │       │   │   │   ├── altera-ep4ce10.cfg
    │       │   │   │   ├── lattice_ecp5.cfg
    │       │   │   │   ├── xilinx-dna.cfg
    │       │   │   │   └── xilinx-xadc.cfg
    │       │   │   ├── interface/
    │       │   │   │   ├── altera-usb-blaster.cfg
    │       │   │   │   ├── altera-usb-blaster2.cfg
    │       │   │   │   ├── arm-jtag-ew.cfg
    │       │   │   │   ├── at91rm9200.cfg
    │       │   │   │   ├── beaglebone-jtag-native.cfg
    │       │   │   │   ├── beaglebone-swd-native.cfg
    │       │   │   │   ├── buspirate.cfg
    │       │   │   │   ├── calao-usb-a9260.cfg
    │       │   │   │   ├── chameleon.cfg
    │       │   │   │   ├── cmsis-dap.cfg
    │       │   │   │   ├── dln-2-gpiod.cfg
    │       │   │   │   ├── dummy.cfg
    │       │   │   │   ├── estick.cfg
    │       │   │   │   ├── flashlink.cfg
    │       │   │   │   ├── ft232r/
    │       │   │   │   │   └── radiona_ulx3s.cfg
    │       │   │   │   ├── ft232r.cfg
    │       │   │   │   ├── ftdi/
    │       │   │   │   │   ├── 100ask-openjtag.cfg
    │       │   │   │   │   ├── ashling-opella-ld-jtag.cfg
    │       │   │   │   │   ├── ashling-opella-ld-swd.cfg
    │       │   │   │   │   ├── axm0432.cfg
    │       │   │   │   │   ├── c232hm.cfg
    │       │   │   │   │   ├── calao-usb-a9260-c01.cfg
    │       │   │   │   │   ├── calao-usb-a9260-c02.cfg
    │       │   │   │   │   ├── cortino.cfg
    │       │   │   │   │   ├── digilent-hs1.cfg
    │       │   │   │   │   ├── digilent-hs2.cfg
    │       │   │   │   │   ├── digilent_jtag_hs3.cfg
    │       │   │   │   │   ├── digilent_jtag_smt2.cfg
    │       │   │   │   │   ├── digilent_jtag_smt2_nc.cfg
    │       │   │   │   │   ├── dlp-usb1232h.cfg
    │       │   │   │   │   ├── dp_busblaster.cfg
    │       │   │   │   │   ├── dp_busblaster_kt-link.cfg
    │       │   │   │   │   ├── esp32s2_kaluga_v1.cfg
    │       │   │   │   │   ├── flossjtag-noeeprom.cfg
    │       │   │   │   │   ├── flossjtag.cfg
    │       │   │   │   │   ├── flyswatter.cfg
    │       │   │   │   │   ├── flyswatter2.cfg
    │       │   │   │   │   ├── ft232h-module-swd.cfg
    │       │   │   │   │   ├── gw16042.cfg
    │       │   │   │   │   ├── hie-jtag.cfg
    │       │   │   │   │   ├── hilscher_nxhx10_etm.cfg
    │       │   │   │   │   ├── hilscher_nxhx500_etm.cfg
    │       │   │   │   │   ├── hilscher_nxhx500_re.cfg
    │       │   │   │   │   ├── hilscher_nxhx50_etm.cfg
    │       │   │   │   │   ├── hilscher_nxhx50_re.cfg
    │       │   │   │   │   ├── hitex_lpc1768stick.cfg
    │       │   │   │   │   ├── hitex_str9-comstick.cfg
    │       │   │   │   │   ├── icebear.cfg
    │       │   │   │   │   ├── imx8mp-evk.cfg
    │       │   │   │   │   ├── incircuit-icprog.cfg
    │       │   │   │   │   ├── iotlab-usb.cfg
    │       │   │   │   │   ├── isodebug.cfg
    │       │   │   │   │   ├── jtag-lock-pick_tiny_2.cfg
    │       │   │   │   │   ├── jtagkey.cfg
    │       │   │   │   │   ├── jtagkey2.cfg
    │       │   │   │   │   ├── jtagkey2p.cfg
    │       │   │   │   │   ├── kt-link.cfg
    │       │   │   │   │   ├── lambdaconcept_ecpix-5.cfg
    │       │   │   │   │   ├── lisa-l.cfg
    │       │   │   │   │   ├── luminary-icdi.cfg
    │       │   │   │   │   ├── luminary-lm3s811.cfg
    │       │   │   │   │   ├── luminary.cfg
    │       │   │   │   │   ├── m53evk.cfg
    │       │   │   │   │   ├── mbftdi.cfg
    │       │   │   │   │   ├── minimodule-swd.cfg
    │       │   │   │   │   ├── minimodule.cfg
    │       │   │   │   │   ├── minispartan6.cfg
    │       │   │   │   │   ├── miniwiggler.cfg
    │       │   │   │   │   ├── neodb.cfg
    │       │   │   │   │   ├── ngxtech.cfg
    │       │   │   │   │   ├── olimex-arm-jtag-swd.cfg
    │       │   │   │   │   ├── olimex-arm-usb-ocd-h.cfg
    │       │   │   │   │   ├── olimex-arm-usb-ocd.cfg
    │       │   │   │   │   ├── olimex-arm-usb-tiny-h.cfg
    │       │   │   │   │   ├── olimex-jtag-tiny.cfg
    │       │   │   │   │   ├── oocdlink.cfg
    │       │   │   │   │   ├── opendous_ftdi.cfg
    │       │   │   │   │   ├── openocd-usb-hs.cfg
    │       │   │   │   │   ├── openocd-usb.cfg
    │       │   │   │   │   ├── openrd.cfg
    │       │   │   │   │   ├── pipistrello.cfg
    │       │   │   │   │   ├── pls_spc5.cfg
    │       │   │   │   │   ├── redbee-econotag.cfg
    │       │   │   │   │   ├── redbee-usb.cfg
    │       │   │   │   │   ├── rowley-cc-arm-swd.cfg
    │       │   │   │   │   ├── sheevaplug.cfg
    │       │   │   │   │   ├── signalyzer-lite.cfg
    │       │   │   │   │   ├── signalyzer.cfg
    │       │   │   │   │   ├── snps_sdp.cfg
    │       │   │   │   │   ├── steppenprobe.cfg
    │       │   │   │   │   ├── stm32-stick.cfg
    │       │   │   │   │   ├── swd-resistor-hack.cfg
    │       │   │   │   │   ├── ti-icdi.cfg
    │       │   │   │   │   ├── tigard.cfg
    │       │   │   │   │   ├── tumpa-lite.cfg
    │       │   │   │   │   ├── tumpa.cfg
    │       │   │   │   │   ├── turtelizer2-revB.cfg
    │       │   │   │   │   ├── turtelizer2-revC.cfg
    │       │   │   │   │   ├── um232h.cfg
    │       │   │   │   │   ├── vpaclink.cfg
    │       │   │   │   │   ├── xds100v2.cfg
    │       │   │   │   │   └── xds100v3.cfg
    │       │   │   │   ├── imx-native.cfg
    │       │   │   │   ├── jlink.cfg
    │       │   │   │   ├── jtag_dpi.cfg
    │       │   │   │   ├── jtag_hat_rpi2.cfg
    │       │   │   │   ├── jtag_vpi.cfg
    │       │   │   │   ├── kitprog.cfg
    │       │   │   │   ├── nds32-aice.cfg
    │       │   │   │   ├── nulink.cfg
    │       │   │   │   ├── opendous.cfg
    │       │   │   │   ├── openjtag.cfg
    │       │   │   │   ├── osbdm.cfg
    │       │   │   │   ├── parport.cfg
    │       │   │   │   ├── parport_dlc5.cfg
    │       │   │   │   ├── raspberrypi-native.cfg
    │       │   │   │   ├── raspberrypi2-native.cfg
    │       │   │   │   ├── rlink.cfg
    │       │   │   │   ├── rshim.cfg
    │       │   │   │   ├── stlink-dap.cfg
    │       │   │   │   ├── stlink-v1.cfg
    │       │   │   │   ├── stlink-v2-1.cfg
    │       │   │   │   ├── stlink-v2.cfg
    │       │   │   │   ├── stlink.cfg
    │       │   │   │   ├── sysfsgpio-raspberrypi.cfg
    │       │   │   │   ├── ti-icdi.cfg
    │       │   │   │   ├── ulink.cfg
    │       │   │   │   ├── usb-jtag.cfg
    │       │   │   │   ├── usbprog.cfg
    │       │   │   │   ├── vdebug.cfg
    │       │   │   │   ├── vsllink.cfg
    │       │   │   │   └── xds110.cfg
    │       │   │   ├── mem_helper.tcl
    │       │   │   ├── memory.tcl
    │       │   │   ├── mmr_helpers.tcl
    │       │   │   ├── target/
    │       │   │   │   ├── 1986ве1т.cfg
    │       │   │   │   ├── adsp-sc58x.cfg
    │       │   │   │   ├── aduc702x.cfg
    │       │   │   │   ├── aducm360.cfg
    │       │   │   │   ├── allwinner_v3s.cfg
    │       │   │   │   ├── alphascale_asm9260t.cfg
    │       │   │   │   ├── altera_fpgasoc.cfg
    │       │   │   │   ├── altera_fpgasoc_arria10.cfg
    │       │   │   │   ├── am335x.cfg
    │       │   │   │   ├── am437x.cfg
    │       │   │   │   ├── amdm37x.cfg
    │       │   │   │   ├── ampere_emag.cfg
    │       │   │   │   ├── ar71xx.cfg
    │       │   │   │   ├── arm_corelink_sse200.cfg
    │       │   │   │   ├── armada370.cfg
    │       │   │   │   ├── at32ap7000.cfg
    │       │   │   │   ├── at91r40008.cfg
    │       │   │   │   ├── at91rm9200.cfg
    │       │   │   │   ├── at91sam3XXX.cfg
    │       │   │   │   ├── at91sam3ax_4x.cfg
    │       │   │   │   ├── at91sam3ax_8x.cfg
    │       │   │   │   ├── at91sam3ax_xx.cfg
    │       │   │   │   ├── at91sam3nXX.cfg
    │       │   │   │   ├── at91sam3sXX.cfg
    │       │   │   │   ├── at91sam3u1c.cfg
    │       │   │   │   ├── at91sam3u1e.cfg
    │       │   │   │   ├── at91sam3u2c.cfg
    │       │   │   │   ├── at91sam3u2e.cfg
    │       │   │   │   ├── at91sam3u4c.cfg
    │       │   │   │   ├── at91sam3u4e.cfg
    │       │   │   │   ├── at91sam3uxx.cfg
    │       │   │   │   ├── at91sam4XXX.cfg
    │       │   │   │   ├── at91sam4c32x.cfg
    │       │   │   │   ├── at91sam4cXXX.cfg
    │       │   │   │   ├── at91sam4lXX.cfg
    │       │   │   │   ├── at91sam4sXX.cfg
    │       │   │   │   ├── at91sam4sd32x.cfg
    │       │   │   │   ├── at91sam7a2.cfg
    │       │   │   │   ├── at91sam7se512.cfg
    │       │   │   │   ├── at91sam7sx.cfg
    │       │   │   │   ├── at91sam7x256.cfg
    │       │   │   │   ├── at91sam7x512.cfg
    │       │   │   │   ├── at91sam9.cfg
    │       │   │   │   ├── at91sam9260.cfg
    │       │   │   │   ├── at91sam9260_ext_RAM_ext_flash.cfg
    │       │   │   │   ├── at91sam9261.cfg
    │       │   │   │   ├── at91sam9263.cfg
    │       │   │   │   ├── at91sam9g10.cfg
    │       │   │   │   ├── at91sam9g20.cfg
    │       │   │   │   ├── at91sam9g45.cfg
    │       │   │   │   ├── at91sam9rl.cfg
    │       │   │   │   ├── at91sama5d2.cfg
    │       │   │   │   ├── at91samdXX.cfg
    │       │   │   │   ├── at91samg5x.cfg
    │       │   │   │   ├── atheros_ar2313.cfg
    │       │   │   │   ├── atheros_ar2315.cfg
    │       │   │   │   ├── atheros_ar9331.cfg
    │       │   │   │   ├── atheros_ar9344.cfg
    │       │   │   │   ├── atmega128.cfg
    │       │   │   │   ├── atmega128rfa1.cfg
    │       │   │   │   ├── atsame5x.cfg
    │       │   │   │   ├── atsaml1x.cfg
    │       │   │   │   ├── atsamv.cfg
    │       │   │   │   ├── avr32.cfg
    │       │   │   │   ├── bcm2711.cfg
    │       │   │   │   ├── bcm281xx.cfg
    │       │   │   │   ├── bcm2835.cfg
    │       │   │   │   ├── bcm2836.cfg
    │       │   │   │   ├── bcm2837.cfg
    │       │   │   │   ├── bcm4706.cfg
    │       │   │   │   ├── bcm4718.cfg
    │       │   │   │   ├── bcm47xx.cfg
    │       │   │   │   ├── bcm5352e.cfg
    │       │   │   │   ├── bcm6348.cfg
    │       │   │   │   ├── bluefield.cfg
    │       │   │   │   ├── bluenrg-x.cfg
    │       │   │   │   ├── c100.cfg
    │       │   │   │   ├── c100config.tcl
    │       │   │   │   ├── c100helper.tcl
    │       │   │   │   ├── c100regs.tcl
    │       │   │   │   ├── cc2538.cfg
    │       │   │   │   ├── cs351x.cfg
    │       │   │   │   ├── davinci.cfg
    │       │   │   │   ├── dragonite.cfg
    │       │   │   │   ├── dsp56321.cfg
    │       │   │   │   ├── dsp568013.cfg
    │       │   │   │   ├── dsp568037.cfg
    │       │   │   │   ├── efm32.cfg
    │       │   │   │   ├── em357.cfg
    │       │   │   │   ├── em358.cfg
    │       │   │   │   ├── eos_s3.cfg
    │       │   │   │   ├── epc9301.cfg
    │       │   │   │   ├── esi32xx.cfg
    │       │   │   │   ├── esp32s2.cfg
    │       │   │   │   ├── exynos5250.cfg
    │       │   │   │   ├── faux.cfg
    │       │   │   │   ├── feroceon.cfg
    │       │   │   │   ├── fm3.cfg
    │       │   │   │   ├── fm4.cfg
    │       │   │   │   ├── fm4_mb9bf.cfg
    │       │   │   │   ├── fm4_s6e2cc.cfg
    │       │   │   │   ├── gd32e23x.cfg
    │       │   │   │   ├── gd32vf103.cfg
    │       │   │   │   ├── gp326xxxa.cfg
    │       │   │   │   ├── hi3798.cfg
    │       │   │   │   ├── hi6220.cfg
    │       │   │   │   ├── hilscher_netx10.cfg
    │       │   │   │   ├── hilscher_netx50.cfg
    │       │   │   │   ├── hilscher_netx500.cfg
    │       │   │   │   ├── icepick.cfg
    │       │   │   │   ├── imx.cfg
    │       │   │   │   ├── imx21.cfg
    │       │   │   │   ├── imx25.cfg
    │       │   │   │   ├── imx27.cfg
    │       │   │   │   ├── imx28.cfg
    │       │   │   │   ├── imx31.cfg
    │       │   │   │   ├── imx35.cfg
    │       │   │   │   ├── imx51.cfg
    │       │   │   │   ├── imx53.cfg
    │       │   │   │   ├── imx6.cfg
    │       │   │   │   ├── imx6sx.cfg
    │       │   │   │   ├── imx6ul.cfg
    │       │   │   │   ├── imx7.cfg
    │       │   │   │   ├── imx7ulp.cfg
    │       │   │   │   ├── imx8m.cfg
    │       │   │   │   ├── imx8qm.cfg
    │       │   │   │   ├── infineon/
    │       │   │   │   │   └── tle987x.cfg
    │       │   │   │   ├── is5114.cfg
    │       │   │   │   ├── ixp42x.cfg
    │       │   │   │   ├── k1921vk01t.cfg
    │       │   │   │   ├── k40.cfg
    │       │   │   │   ├── k60.cfg
    │       │   │   │   ├── ke0x.cfg
    │       │   │   │   ├── ke1xf.cfg
    │       │   │   │   ├── ke1xz.cfg
    │       │   │   │   ├── kl25.cfg
    │       │   │   │   ├── kl46.cfg
    │       │   │   │   ├── klx.cfg
    │       │   │   │   ├── ks869x.cfg
    │       │   │   │   ├── kx.cfg
    │       │   │   │   ├── lpc11xx.cfg
    │       │   │   │   ├── lpc12xx.cfg
    │       │   │   │   ├── lpc13xx.cfg
    │       │   │   │   ├── lpc17xx.cfg
    │       │   │   │   ├── lpc1850.cfg
    │       │   │   │   ├── lpc1xxx.cfg
    │       │   │   │   ├── lpc2103.cfg
    │       │   │   │   ├── lpc2124.cfg
    │       │   │   │   ├── lpc2129.cfg
    │       │   │   │   ├── lpc2148.cfg
    │       │   │   │   ├── lpc2294.cfg
    │       │   │   │   ├── lpc2378.cfg
    │       │   │   │   ├── lpc2460.cfg
    │       │   │   │   ├── lpc2478.cfg
    │       │   │   │   ├── lpc2900.cfg
    │       │   │   │   ├── lpc2xxx.cfg
    │       │   │   │   ├── lpc3131.cfg
    │       │   │   │   ├── lpc3250.cfg
    │       │   │   │   ├── lpc40xx.cfg
    │       │   │   │   ├── lpc4350.cfg
    │       │   │   │   ├── lpc4357.cfg
    │       │   │   │   ├── lpc4370.cfg
    │       │   │   │   ├── lpc84x.cfg
    │       │   │   │   ├── lpc8nxx.cfg
    │       │   │   │   ├── lpc8xx.cfg
    │       │   │   │   ├── ls1012a.cfg
    │       │   │   │   ├── ls1028a.cfg
    │       │   │   │   ├── ls1046a.cfg
    │       │   │   │   ├── ls1088a.cfg
    │       │   │   │   ├── lsch3_common.cfg
    │       │   │   │   ├── marvell/
    │       │   │   │   │   ├── 88f3710.cfg
    │       │   │   │   │   ├── 88f3720.cfg
    │       │   │   │   │   └── 88f37x0.cfg
    │       │   │   │   ├── max32620.cfg
    │       │   │   │   ├── max32625.cfg
    │       │   │   │   ├── max3263x.cfg
    │       │   │   │   ├── mc13224v.cfg
    │       │   │   │   ├── mdr32f9q2i.cfg
    │       │   │   │   ├── nds32v2.cfg
    │       │   │   │   ├── nds32v3.cfg
    │       │   │   │   ├── nds32v3m.cfg
    │       │   │   │   ├── nds32v5.cfg
    │       │   │   │   ├── nhs31xx.cfg
    │       │   │   │   ├── npcx.cfg
    │       │   │   │   ├── nrf51.cfg
    │       │   │   │   ├── nrf52.cfg
    │       │   │   │   ├── nuc910.cfg
    │       │   │   │   ├── numicro.cfg
    │       │   │   │   ├── omap2420.cfg
    │       │   │   │   ├── omap3530.cfg
    │       │   │   │   ├── omap4430.cfg
    │       │   │   │   ├── omap4460.cfg
    │       │   │   │   ├── omap5912.cfg
    │       │   │   │   ├── omapl138.cfg
    │       │   │   │   ├── or1k.cfg
    │       │   │   │   ├── pic32mx.cfg
    │       │   │   │   ├── psoc4.cfg
    │       │   │   │   ├── psoc5lp.cfg
    │       │   │   │   ├── psoc6.cfg
    │       │   │   │   ├── pxa255.cfg
    │       │   │   │   ├── pxa270.cfg
    │       │   │   │   ├── pxa3xx.cfg
    │       │   │   │   ├── qualcomm_qca4531.cfg
    │       │   │   │   ├── quark_d20xx.cfg
    │       │   │   │   ├── quark_x10xx.cfg
    │       │   │   │   ├── readme.txt
    │       │   │   │   ├── renesas_r7s72100.cfg
    │       │   │   │   ├── renesas_rcar_gen2.cfg
    │       │   │   │   ├── renesas_rcar_gen3.cfg
    │       │   │   │   ├── renesas_rcar_reset_common.cfg
    │       │   │   │   ├── renesas_rz_five.cfg
    │       │   │   │   ├── renesas_rz_g2.cfg
    │       │   │   │   ├── renesas_s7g2.cfg
    │       │   │   │   ├── rk3308.cfg
    │       │   │   │   ├── rk3399.cfg
    │       │   │   │   ├── rp2040-core0.cfg
    │       │   │   │   ├── samsung_s3c2410.cfg
    │       │   │   │   ├── samsung_s3c2440.cfg
    │       │   │   │   ├── samsung_s3c2450.cfg
    │       │   │   │   ├── samsung_s3c4510.cfg
    │       │   │   │   ├── samsung_s3c6410.cfg
    │       │   │   │   ├── sharp_lh79532.cfg
    │       │   │   │   ├── sim3x.cfg
    │       │   │   │   ├── smp8634.cfg
    │       │   │   │   ├── snps_em_sk_fpga.cfg
    │       │   │   │   ├── snps_hsdk.cfg
    │       │   │   │   ├── spear3xx.cfg
    │       │   │   │   ├── stellaris.cfg
    │       │   │   │   ├── stm32f0x.cfg
    │       │   │   │   ├── stm32f1x.cfg
    │       │   │   │   ├── stm32f2x.cfg
    │       │   │   │   ├── stm32f3x.cfg
    │       │   │   │   ├── stm32f4x.cfg
    │       │   │   │   ├── stm32f7x.cfg
    │       │   │   │   ├── stm32g0x.cfg
    │       │   │   │   ├── stm32g4x.cfg
    │       │   │   │   ├── stm32h7x.cfg
    │       │   │   │   ├── stm32h7x_dual_bank.cfg
    │       │   │   │   ├── stm32l0.cfg
    │       │   │   │   ├── stm32l0_dual_bank.cfg
    │       │   │   │   ├── stm32l1.cfg
    │       │   │   │   ├── stm32l1x_dual_bank.cfg
    │       │   │   │   ├── stm32l4x.cfg
    │       │   │   │   ├── stm32l5x.cfg
    │       │   │   │   ├── stm32mp13x.cfg
    │       │   │   │   ├── stm32mp15x.cfg
    │       │   │   │   ├── stm32u5x.cfg
    │       │   │   │   ├── stm32w108xx.cfg
    │       │   │   │   ├── stm32wbx.cfg
    │       │   │   │   ├── stm32wlx.cfg
    │       │   │   │   ├── stm32x5x_common.cfg
    │       │   │   │   ├── stm32xl.cfg
    │       │   │   │   ├── stm8l.cfg
    │       │   │   │   ├── stm8l152.cfg
    │       │   │   │   ├── stm8s.cfg
    │       │   │   │   ├── stm8s003.cfg
    │       │   │   │   ├── stm8s103.cfg
    │       │   │   │   ├── stm8s105.cfg
    │       │   │   │   ├── str710.cfg
    │       │   │   │   ├── str730.cfg
    │       │   │   │   ├── str750.cfg
    │       │   │   │   ├── str912.cfg
    │       │   │   │   ├── swj-dp.tcl
    │       │   │   │   ├── swm050.cfg
    │       │   │   │   ├── test_reset_syntax_error.cfg
    │       │   │   │   ├── test_syntax_error.cfg
    │       │   │   │   ├── ti-ar7.cfg
    │       │   │   │   ├── ti-cjtag.cfg
    │       │   │   │   ├── ti_calypso.cfg
    │       │   │   │   ├── ti_cc13x0.cfg
    │       │   │   │   ├── ti_cc13x2.cfg
    │       │   │   │   ├── ti_cc26x0.cfg
    │       │   │   │   ├── ti_cc26x2.cfg
    │       │   │   │   ├── ti_cc3220sf.cfg
    │       │   │   │   ├── ti_cc32xx.cfg
    │       │   │   │   ├── ti_dm355.cfg
    │       │   │   │   ├── ti_dm365.cfg
    │       │   │   │   ├── ti_dm6446.cfg
    │       │   │   │   ├── ti_k3.cfg
    │       │   │   │   ├── ti_msp432.cfg
    │       │   │   │   ├── ti_rm4x.cfg
    │       │   │   │   ├── ti_tms570.cfg
    │       │   │   │   ├── ti_tms570ls20xxx.cfg
    │       │   │   │   ├── ti_tms570ls3137.cfg
    │       │   │   │   ├── tmpa900.cfg
    │       │   │   │   ├── tmpa910.cfg
    │       │   │   │   ├── tnetc4401.cfg
    │       │   │   │   ├── u8500.cfg
    │       │   │   │   ├── vd_aarch64.cfg
    │       │   │   │   ├── vd_cortex_m.cfg
    │       │   │   │   ├── vd_riscv.cfg
    │       │   │   │   ├── vybrid_vf6xx.cfg
    │       │   │   │   ├── xilinx_zynqmp.cfg
    │       │   │   │   ├── xmc1xxx.cfg
    │       │   │   │   ├── xmc4xxx.cfg
    │       │   │   │   ├── xmos_xs1-xau8a-10_arm.cfg
    │       │   │   │   ├── zynq_7000.cfg
    │       │   │   │   └── к1879xб1я.cfg
    │       │   │   ├── test/
    │       │   │   │   ├── selftest.cfg
    │       │   │   │   └── syntax1.cfg
    │       │   │   └── tools/
    │       │   │       ├── firmware-recovery.tcl
    │       │   │       ├── memtest.tcl
    │       │   │       └── test_cpu_speed.tcl
    │       │   └── share/
    │       │       ├── info/
    │       │       │   ├── dir
    │       │       │   ├── openocd.info
    │       │       │   ├── openocd.info-1
    │       │       │   └── openocd.info-2
    │       │       └── man/
    │       │           └── man1/
    │       │               └── openocd.1
    │       └── OpenOCD_SourceCode_CH347/
    │           ├── .checkpatch.conf
    │           ├── .gitignore
    │           ├── .gitmodules
    │           ├── .travis.yml
    │           ├── AUTHORS
    │           ├── AUTHORS.ChangeLog
    │           ├── BUGS
    │           ├── COPYING
    │           ├── ChangeLog
    │           ├── HACKING
    │           ├── LICENSES/
    │           │   ├── exceptions/
    │           │   │   └── eCos-exception-2.0
    │           │   ├── license-rules.txt
    │           │   ├── preferred/
    │           │   │   ├── BSD-1-Clause
    │           │   │   ├── BSD-2-Clause
    │           │   │   ├── BSD-2-Clause-Views
    │           │   │   ├── BSD-3-Clause
    │           │   │   ├── BSD-Source-Code
    │           │   │   ├── GFDL-1.2
    │           │   │   ├── GPL-2.0
    │           │   │   ├── MIT
    │           │   │   └── gfdl-1.2.texi.readme
    │           │   └── stand-alone/
    │           │       └── GPL-3.0
    │           ├── Makefile.am
    │           ├── NEWS
    │           ├── NEWS-0.10.0
    │           ├── NEWS-0.11.0
    │           ├── NEWS-0.12.0
    │           ├── NEWS-0.2.0
    │           ├── NEWS-0.3.0
    │           ├── NEWS-0.4.0
    │           ├── NEWS-0.5.0
    │           ├── NEWS-0.6.0
    │           ├── NEWS-0.7.0
    │           ├── NEWS-0.8.0
    │           ├── NEWS-0.9.0
    │           ├── NEWTAPS
    │           ├── README
    │           ├── README.Windows
    │           ├── README.macOS
    │           ├── TODO
    │           ├── bootstrap
    │           ├── config_subdir.m4
    │           ├── configure.ac
    │           ├── contrib/
    │           │   ├── 60-openocd.rules
    │           │   ├── buildroot/
    │           │   │   └── openocd_be_defconfig
    │           │   ├── coresight-trace.txt
    │           │   ├── cross-build.sh
    │           │   ├── gen-stellaris-part-header.pl
    │           │   ├── itmdump.c
    │           │   ├── libdcc/
    │           │   │   ├── README
    │           │   │   ├── dcc_stdio.c
    │           │   │   ├── dcc_stdio.h
    │           │   │   └── example.c
    │           │   ├── list_example.c
    │           │   ├── loaders/
    │           │   │   ├── README
    │           │   │   ├── checksum/
    │           │   │   │   ├── armv4_5_crc.inc
    │           │   │   │   ├── armv4_5_crc.s
    │           │   │   │   ├── armv7m_crc.inc
    │           │   │   │   ├── armv7m_crc.s
    │           │   │   │   ├── mips32.s
    │           │   │   │   ├── riscv32_crc.inc
    │           │   │   │   ├── riscv64_crc.inc
    │           │   │   │   └── riscv_crc.c
    │           │   │   ├── debug/
    │           │   │   │   └── xscale/
    │           │   │   │       ├── debug_handler.S
    │           │   │   │       ├── debug_handler.inc
    │           │   │   │       ├── debug_handler.ld
    │           │   │   │       └── protocol.h
    │           │   │   ├── erase_check/
    │           │   │   │   ├── armv4_5_erase_check.inc
    │           │   │   │   ├── armv4_5_erase_check.s
    │           │   │   │   ├── armv7m_erase_check.inc
    │           │   │   │   ├── armv7m_erase_check.s
    │           │   │   │   ├── stm8_erase_check.inc
    │           │   │   │   └── stm8_erase_check.s
    │           │   │   ├── flash/
    │           │   │   │   ├── armv4_5_cfi_intel_16.s
    │           │   │   │   ├── armv4_5_cfi_intel_32.s
    │           │   │   │   ├── armv4_5_cfi_intel_8.s
    │           │   │   │   ├── armv4_5_cfi_span_16.s
    │           │   │   │   ├── armv4_5_cfi_span_16_dq7.s
    │           │   │   │   ├── armv4_5_cfi_span_32.s
    │           │   │   │   ├── armv4_5_cfi_span_8.s
    │           │   │   │   ├── armv7m_cfi_span_16.s
    │           │   │   │   ├── armv7m_cfi_span_16_dq7.s
    │           │   │   │   ├── armv7m_io.s
    │           │   │   │   ├── at91sam7x/
    │           │   │   │   │   ├── at91sam7x_ocl_flash.script
    │           │   │   │   │   ├── at91sam7x_ram.ld
    │           │   │   │   │   ├── crt.s
    │           │   │   │   │   ├── dcc.c
    │           │   │   │   │   ├── dcc.h
    │           │   │   │   │   ├── main.c
    │           │   │   │   │   ├── makefile
    │           │   │   │   │   ├── ocl.h
    │           │   │   │   │   ├── platform.h
    │           │   │   │   │   ├── samflash.c
    │           │   │   │   │   ├── samflash.h
    │           │   │   │   │   └── samregs.h
    │           │   │   │   ├── bluenrg-x/
    │           │   │   │   │   ├── bluenrg-x_write.c
    │           │   │   │   │   └── bluenrg-x_write.inc
    │           │   │   │   ├── cc26xx/
    │           │   │   │   │   ├── cc26x0/
    │           │   │   │   │   │   └── cc26x0r2f.lds
    │           │   │   │   │   ├── cc26x0_algo.inc
    │           │   │   │   │   ├── cc26x2/
    │           │   │   │   │   │   └── cc26x2r1f.lds
    │           │   │   │   │   ├── cc26x2_algo.inc
    │           │   │   │   │   ├── flash.c
    │           │   │   │   │   ├── flash.h
    │           │   │   │   │   ├── flashloader.c
    │           │   │   │   │   ├── flashloader.h
    │           │   │   │   │   ├── hw_regs.h
    │           │   │   │   │   ├── main.c
    │           │   │   │   │   └── startup.c
    │           │   │   │   ├── cc3220sf/
    │           │   │   │   │   ├── cc3220sf.inc
    │           │   │   │   │   └── cc3220sf.s
    │           │   │   │   ├── cortex-m0.S
    │           │   │   │   ├── efm32.S
    │           │   │   │   ├── fespi/
    │           │   │   │   │   ├── riscv.lds
    │           │   │   │   │   ├── riscv32_fespi.inc
    │           │   │   │   │   ├── riscv64_fespi.inc
    │           │   │   │   │   ├── riscv_fespi.c
    │           │   │   │   │   └── riscv_wrapper.S
    │           │   │   │   ├── fm4/
    │           │   │   │   │   ├── erase.S
    │           │   │   │   │   ├── erase.inc
    │           │   │   │   │   ├── fm4.h
    │           │   │   │   │   ├── write.S
    │           │   │   │   │   └── write.inc
    │           │   │   │   ├── fpga/
    │           │   │   │   │   └── xilinx_bscan_spi.py
    │           │   │   │   ├── gd32vf103/
    │           │   │   │   │   ├── gd32vf103.c
    │           │   │   │   │   └── gd32vf103.inc
    │           │   │   │   ├── k1921vk01t.S
    │           │   │   │   ├── kinetis/
    │           │   │   │   │   ├── kinetis_flash.inc
    │           │   │   │   │   └── kinetis_flash.s
    │           │   │   │   ├── kinetis_ke/
    │           │   │   │   │   ├── kinetis_ke_flash.inc
    │           │   │   │   │   ├── kinetis_ke_flash.s
    │           │   │   │   │   ├── kinetis_ke_watchdog.inc
    │           │   │   │   │   └── kinetis_ke_watchdog.s
    │           │   │   │   ├── lpcspifi_erase.S
    │           │   │   │   ├── lpcspifi_init.S
    │           │   │   │   ├── lpcspifi_write.S
    │           │   │   │   ├── max32xxx/
    │           │   │   │   │   ├── max32xxx.inc
    │           │   │   │   │   └── max32xxx.s
    │           │   │   │   ├── mdr32fx.S
    │           │   │   │   ├── mrvlqspi_write.S
    │           │   │   │   ├── msp432/
    │           │   │   │   │   ├── MSP432E4_FlashLibIf.h
    │           │   │   │   │   ├── MSP432P4_FlashLibIf.h
    │           │   │   │   │   ├── driverlib.c
    │           │   │   │   │   ├── driverlib.h
    │           │   │   │   │   ├── main_msp432e4x.c
    │           │   │   │   │   ├── main_msp432p401x.c
    │           │   │   │   │   ├── main_msp432p411x.c
    │           │   │   │   │   ├── msp432e4x/
    │           │   │   │   │   │   └── msp432e4x.lds
    │           │   │   │   │   ├── msp432e4x.h
    │           │   │   │   │   ├── msp432e4x_algo.inc
    │           │   │   │   │   ├── msp432p401x/
    │           │   │   │   │   │   └── msp432p401x.lds
    │           │   │   │   │   ├── msp432p401x.h
    │           │   │   │   │   ├── msp432p401x_algo.inc
    │           │   │   │   │   ├── msp432p411x/
    │           │   │   │   │   │   └── msp432p411x.lds
    │           │   │   │   │   ├── msp432p411x.h
    │           │   │   │   │   ├── msp432p411x_algo.inc
    │           │   │   │   │   ├── startup_msp432e4.c
    │           │   │   │   │   └── startup_msp432p4.c
    │           │   │   │   ├── npcx/
    │           │   │   │   │   ├── npcx_algo.inc
    │           │   │   │   │   ├── npcx_flash.c
    │           │   │   │   │   ├── npcx_flash.h
    │           │   │   │   │   ├── npcx_flash.lds
    │           │   │   │   │   └── npcx_flash_config.h
    │           │   │   │   ├── nrf5/
    │           │   │   │   │   ├── nrf5.S
    │           │   │   │   │   └── nrf5.inc
    │           │   │   │   ├── numicro/
    │           │   │   │   │   ├── numicro_m0.S
    │           │   │   │   │   ├── numicro_m0.inc
    │           │   │   │   │   ├── numicro_m4.S
    │           │   │   │   │   └── numicro_m4.inc
    │           │   │   │   ├── pic32mx.s
    │           │   │   │   ├── rsl10/
    │           │   │   │   │   ├── rom_launcher.S
    │           │   │   │   │   └── rom_launcher.inc
    │           │   │   │   ├── sh_qspi/
    │           │   │   │   │   ├── sh_qspi.S
    │           │   │   │   │   ├── sh_qspi.inc
    │           │   │   │   │   └── sh_qspi.ld
    │           │   │   │   ├── sim3x.s
    │           │   │   │   ├── stellaris.s
    │           │   │   │   ├── stm32/
    │           │   │   │   │   ├── stm32f1x.S
    │           │   │   │   │   ├── stm32f1x.inc
    │           │   │   │   │   ├── stm32f2x.S
    │           │   │   │   │   ├── stm32f2x.inc
    │           │   │   │   │   ├── stm32h7x.S
    │           │   │   │   │   ├── stm32h7x.inc
    │           │   │   │   │   ├── stm32l4x.c
    │           │   │   │   │   ├── stm32l4x.inc
    │           │   │   │   │   ├── stm32lx.S
    │           │   │   │   │   └── stm32lx.inc
    │           │   │   │   ├── stmqspi/
    │           │   │   │   │   ├── gpio_conf_stm32.pl
    │           │   │   │   │   ├── stmoctospi_crc32.S
    │           │   │   │   │   ├── stmoctospi_crc32.inc
    │           │   │   │   │   ├── stmoctospi_erase_check.S
    │           │   │   │   │   ├── stmoctospi_erase_check.inc
    │           │   │   │   │   ├── stmoctospi_read.S
    │           │   │   │   │   ├── stmoctospi_read.inc
    │           │   │   │   │   ├── stmoctospi_write.S
    │           │   │   │   │   ├── stmoctospi_write.inc
    │           │   │   │   │   ├── stmqspi_crc32.S
    │           │   │   │   │   ├── stmqspi_crc32.inc
    │           │   │   │   │   ├── stmqspi_erase_check.S
    │           │   │   │   │   ├── stmqspi_erase_check.inc
    │           │   │   │   │   ├── stmqspi_read.S
    │           │   │   │   │   ├── stmqspi_read.inc
    │           │   │   │   │   ├── stmqspi_write.S
    │           │   │   │   │   └── stmqspi_write.inc
    │           │   │   │   ├── str7x.s
    │           │   │   │   ├── str9x.s
    │           │   │   │   └── xmc1xxx/
    │           │   │   │       ├── erase.S
    │           │   │   │       ├── erase.inc
    │           │   │   │       ├── erase_check.S
    │           │   │   │       ├── erase_check.inc
    │           │   │   │       ├── write.S
    │           │   │   │       ├── write.inc
    │           │   │   │       └── xmc1xxx.S
    │           │   │   ├── reset/
    │           │   │   │   └── espressif/
    │           │   │   │       ├── common.mk
    │           │   │   │       ├── esp32/
    │           │   │   │       │   ├── cpu_reset_handler_code.inc
    │           │   │   │       │   └── esp32_cpu_reset_handler.S
    │           │   │   │       └── esp32s3/
    │           │   │   │           ├── cpu_reset_handler_code.inc
    │           │   │   │           └── esp32s3_cpu_reset_handler.S
    │           │   │   └── watchdog/
    │           │   │       ├── armv7m_kinetis_wdog.inc
    │           │   │       ├── armv7m_kinetis_wdog.s
    │           │   │       ├── armv7m_kinetis_wdog32.inc
    │           │   │       └── armv7m_kinetis_wdog32.s
    │           │   ├── remote_bitbang/
    │           │   │   └── remote_bitbang_sysfsgpio.c
    │           │   ├── rpc_examples/
    │           │   │   ├── ocd_rpc_example.py
    │           │   │   └── ocdrpc.hs
    │           │   ├── rtos-helpers/
    │           │   │   ├── FreeRTOS-openocd.c
    │           │   │   └── uCOS-III-openocd.c
    │           │   └── xsvf_tools/
    │           │       ├── svf2xsvf.py
    │           │       └── xsvfdump.py
    │           ├── doc/
    │           │   ├── .gitattributes
    │           │   ├── Makefile.am
    │           │   ├── checkpatch.rst
    │           │   ├── fdl.texi
    │           │   ├── manual/
    │           │   │   ├── app.txt
    │           │   │   ├── endianness.txt
    │           │   │   ├── flash.txt
    │           │   │   ├── helper.txt
    │           │   │   ├── jtag/
    │           │   │   │   └── drivers/
    │           │   │   │       └── remote_bitbang.txt
    │           │   │   ├── jtag.txt
    │           │   │   ├── main.txt
    │           │   │   ├── primer/
    │           │   │   │   ├── autotools.txt
    │           │   │   │   ├── commands.txt
    │           │   │   │   ├── docs.txt
    │           │   │   │   ├── jtag.txt
    │           │   │   │   └── tcl.txt
    │           │   │   ├── release.txt
    │           │   │   ├── scripting.txt
    │           │   │   ├── server.txt
    │           │   │   ├── style.txt
    │           │   │   ├── target/
    │           │   │   │   ├── mips.txt
    │           │   │   │   └── notarm.txt
    │           │   │   └── target.txt
    │           │   ├── openocd.1
    │           │   ├── openocd.texi
    │           │   └── usb_adapters/
    │           │       ├── cmsis_dap/
    │           │       │   ├── 04b4_f155_cypress_kitprog3.txt
    │           │       │   ├── 0d28_0204_nxp_daplink.txt
    │           │       │   ├── 1a6a_2000_spansion_sk_fm4.txt
    │           │       │   ├── 2a86_8011_wch_link.txt
    │           │       │   ├── c251_2722_keil_ulink2.txt
    │           │       │   ├── c251_2723_keil_ulink_me.txt
    │           │       │   ├── c251_2750_keil_ulinkplus.txt
    │           │       │   └── c251_f001_jixin.pro.txt
    │           │       ├── dump.sh
    │           │       ├── esp_usb_jtag/
    │           │       │   └── 303a_1001_esp_usb_jtag.txt
    │           │       ├── ft232r/
    │           │       │   └── 0403_6001_ft232r.txt
    │           │       ├── ftdi/
    │           │       │   ├── 0403_6010_ft2232h.txt
    │           │       │   ├── 0403_6014_digilent_hs2.txt
    │           │       │   ├── 0403_cff8_amontec_jtagkey2.txt
    │           │       │   ├── 09fb_6001_altera_blaster.txt
    │           │       │   └── 9e88_9e8f_sheevaplug_jtagkey.txt
    │           │       ├── icdi/
    │           │       │   └── 1cbe_00fd_ti_icdi.txt
    │           │       ├── jlink/
    │           │       │   ├── 1366_0101_segger_jlink.txt
    │           │       │   └── 1366_0101_segger_jlink_plus_10_1.txt
    │           │       ├── kitprog/
    │           │       │   └── 04b4_f139_cypress_kitprog.txt
    │           │       ├── nulink/
    │           │       │   ├── 0416_511d_nuvoton_nulink.txt
    │           │       │   └── 0416_5200_nuvoton_nulink.txt
    │           │       ├── readme.txt
    │           │       ├── stlink/
    │           │       │   ├── 0483_3744_stlinkv1.txt
    │           │       │   ├── 0483_3748_stlinkv2.txt
    │           │       │   ├── 0483_374b_stlinkv2.txt
    │           │       │   ├── 0483_374d_stlinkv3.txt
    │           │       │   ├── 0483_374e_stlinkv3.txt
    │           │       │   ├── 0483_374f_stlinkv3.txt
    │           │       │   ├── 0483_3752_stlinkv2.txt
    │           │       │   ├── 0483_3753_stlinkv3.txt
    │           │       │   ├── 0483_3755_stlinkv3pwr.txt
    │           │       │   └── 0483_3757_stlinkv3pwr.txt
    │           │       └── xds110/
    │           │           └── 0451_0451_ti_xds110.txt
    │           ├── guess-rev.sh
    │           ├── src/
    │           │   ├── Makefile.am
    │           │   ├── flash/
    │           │   │   ├── Makefile.am
    │           │   │   ├── common.c
    │           │   │   ├── common.h
    │           │   │   ├── nand/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── arm_io.c
    │           │   │   │   ├── arm_io.h
    │           │   │   │   ├── at91sam9.c
    │           │   │   │   ├── core.c
    │           │   │   │   ├── core.h
    │           │   │   │   ├── davinci.c
    │           │   │   │   ├── driver.c
    │           │   │   │   ├── driver.h
    │           │   │   │   ├── ecc.c
    │           │   │   │   ├── ecc_kw.c
    │           │   │   │   ├── fileio.c
    │           │   │   │   ├── fileio.h
    │           │   │   │   ├── imp.h
    │           │   │   │   ├── lpc3180.c
    │           │   │   │   ├── lpc3180.h
    │           │   │   │   ├── lpc32xx.c
    │           │   │   │   ├── lpc32xx.h
    │           │   │   │   ├── mx3.c
    │           │   │   │   ├── mx3.h
    │           │   │   │   ├── mxc.c
    │           │   │   │   ├── mxc.h
    │           │   │   │   ├── nonce.c
    │           │   │   │   ├── nuc910.c
    │           │   │   │   ├── nuc910.h
    │           │   │   │   ├── orion.c
    │           │   │   │   ├── s3c2410.c
    │           │   │   │   ├── s3c2412.c
    │           │   │   │   ├── s3c2440.c
    │           │   │   │   ├── s3c2443.c
    │           │   │   │   ├── s3c24xx.c
    │           │   │   │   ├── s3c24xx.h
    │           │   │   │   ├── s3c24xx_regs.h
    │           │   │   │   ├── s3c6400.c
    │           │   │   │   └── tcl.c
    │           │   │   ├── nor/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── aduc702x.c
    │           │   │   │   ├── aducm360.c
    │           │   │   │   ├── ambiqmicro.c
    │           │   │   │   ├── at91sam3.c
    │           │   │   │   ├── at91sam4.c
    │           │   │   │   ├── at91sam4l.c
    │           │   │   │   ├── at91sam7.c
    │           │   │   │   ├── at91samd.c
    │           │   │   │   ├── ath79.c
    │           │   │   │   ├── atsame5.c
    │           │   │   │   ├── atsamv.c
    │           │   │   │   ├── avrf.c
    │           │   │   │   ├── bluenrg-x.c
    │           │   │   │   ├── bluenrg-x.h
    │           │   │   │   ├── cc26xx.c
    │           │   │   │   ├── cc26xx.h
    │           │   │   │   ├── cc3220sf.c
    │           │   │   │   ├── cc3220sf.h
    │           │   │   │   ├── cfi.c
    │           │   │   │   ├── cfi.h
    │           │   │   │   ├── core.c
    │           │   │   │   ├── core.h
    │           │   │   │   ├── driver.h
    │           │   │   │   ├── drivers.c
    │           │   │   │   ├── dsp5680xx_flash.c
    │           │   │   │   ├── efm32.c
    │           │   │   │   ├── em357.c
    │           │   │   │   ├── esirisc_flash.c
    │           │   │   │   ├── faux.c
    │           │   │   │   ├── fespi.c
    │           │   │   │   ├── fm3.c
    │           │   │   │   ├── fm4.c
    │           │   │   │   ├── imp.h
    │           │   │   │   ├── jtagspi.c
    │           │   │   │   ├── kinetis.c
    │           │   │   │   ├── kinetis_ke.c
    │           │   │   │   ├── lpc2000.c
    │           │   │   │   ├── lpc288x.c
    │           │   │   │   ├── lpc2900.c
    │           │   │   │   ├── lpcspifi.c
    │           │   │   │   ├── max32xxx.c
    │           │   │   │   ├── mdr.c
    │           │   │   │   ├── mrvlqspi.c
    │           │   │   │   ├── msp432.c
    │           │   │   │   ├── msp432.h
    │           │   │   │   ├── niietcm4.c
    │           │   │   │   ├── non_cfi.c
    │           │   │   │   ├── non_cfi.h
    │           │   │   │   ├── npcx.c
    │           │   │   │   ├── nrf5.c
    │           │   │   │   ├── numicro.c
    │           │   │   │   ├── ocl.c
    │           │   │   │   ├── ocl.h
    │           │   │   │   ├── pic32mx.c
    │           │   │   │   ├── psoc4.c
    │           │   │   │   ├── psoc5lp.c
    │           │   │   │   ├── psoc6.c
    │           │   │   │   ├── qn908x.c
    │           │   │   │   ├── renesas_rpchf.c
    │           │   │   │   ├── rp2040.c
    │           │   │   │   ├── rsl10.c
    │           │   │   │   ├── sfdp.c
    │           │   │   │   ├── sfdp.h
    │           │   │   │   ├── sh_qspi.c
    │           │   │   │   ├── sim3x.c
    │           │   │   │   ├── spi.c
    │           │   │   │   ├── spi.h
    │           │   │   │   ├── stellaris.c
    │           │   │   │   ├── stm32f1x.c
    │           │   │   │   ├── stm32f2x.c
    │           │   │   │   ├── stm32h7x.c
    │           │   │   │   ├── stm32l4x.c
    │           │   │   │   ├── stm32l4x.h
    │           │   │   │   ├── stm32lx.c
    │           │   │   │   ├── stmqspi.c
    │           │   │   │   ├── stmqspi.h
    │           │   │   │   ├── stmsmi.c
    │           │   │   │   ├── str7x.c
    │           │   │   │   ├── str9x.c
    │           │   │   │   ├── str9xpec.c
    │           │   │   │   ├── swm050.c
    │           │   │   │   ├── tcl.c
    │           │   │   │   ├── tms470.c
    │           │   │   │   ├── virtual.c
    │           │   │   │   ├── w600.c
    │           │   │   │   ├── xcf.c
    │           │   │   │   ├── xmc1xxx.c
    │           │   │   │   └── xmc4xxx.c
    │           │   │   └── startup.tcl
    │           │   ├── hello.c
    │           │   ├── hello.h
    │           │   ├── helper/
    │           │   │   ├── Makefile.am
    │           │   │   ├── align.h
    │           │   │   ├── bin2char.sh
    │           │   │   ├── binarybuffer.c
    │           │   │   ├── binarybuffer.h
    │           │   │   ├── bits.h
    │           │   │   ├── command.c
    │           │   │   ├── command.h
    │           │   │   ├── compiler.h
    │           │   │   ├── configuration.c
    │           │   │   ├── configuration.h
    │           │   │   ├── crc32.c
    │           │   │   ├── crc32.h
    │           │   │   ├── fileio.c
    │           │   │   ├── fileio.h
    │           │   │   ├── jep106.c
    │           │   │   ├── jep106.h
    │           │   │   ├── jep106.inc
    │           │   │   ├── jim-nvp.c
    │           │   │   ├── jim-nvp.h
    │           │   │   ├── list.h
    │           │   │   ├── log.c
    │           │   │   ├── log.h
    │           │   │   ├── nvp.c
    │           │   │   ├── nvp.h
    │           │   │   ├── options.c
    │           │   │   ├── replacements.c
    │           │   │   ├── replacements.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── system.h
    │           │   │   ├── time_support.c
    │           │   │   ├── time_support.h
    │           │   │   ├── time_support_common.c
    │           │   │   ├── types.h
    │           │   │   ├── update_jep106.pl
    │           │   │   ├── util.c
    │           │   │   └── util.h
    │           │   ├── jtag/
    │           │   │   ├── Makefile.am
    │           │   │   ├── adapter.c
    │           │   │   ├── adapter.h
    │           │   │   ├── commands.c
    │           │   │   ├── commands.h
    │           │   │   ├── core.c
    │           │   │   ├── drivers/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── Makefile.rlink
    │           │   │   │   ├── OpenULINK/
    │           │   │   │   │   ├── README
    │           │   │   │   │   ├── include/
    │           │   │   │   │   │   ├── common.h
    │           │   │   │   │   │   ├── delay.h
    │           │   │   │   │   │   ├── io.h
    │           │   │   │   │   │   ├── jtag.h
    │           │   │   │   │   │   ├── main.h
    │           │   │   │   │   │   ├── msgtypes.h
    │           │   │   │   │   │   ├── protocol.h
    │           │   │   │   │   │   ├── reg_ezusb.h
    │           │   │   │   │   │   └── usb.h
    │           │   │   │   │   ├── src/
    │           │   │   │   │   │   ├── USBJmpTb.a51
    │           │   │   │   │   │   ├── delay.c
    │           │   │   │   │   │   ├── jtag.c
    │           │   │   │   │   │   ├── main.c
    │           │   │   │   │   │   ├── protocol.c
    │           │   │   │   │   │   └── usb.c
    │           │   │   │   │   └── ulink_firmware.hex
    │           │   │   │   ├── am335xgpio.c
    │           │   │   │   ├── amt_jtagaccel.c
    │           │   │   │   ├── arm-jtag-ew.c
    │           │   │   │   ├── at91rm9200.c
    │           │   │   │   ├── bcm2835gpio.c
    │           │   │   │   ├── bitbang.c
    │           │   │   │   ├── bitbang.h
    │           │   │   │   ├── bitq.c
    │           │   │   │   ├── bitq.h
    │           │   │   │   ├── buspirate.c
    │           │   │   │   ├── ch347.c
    │           │   │   │   ├── cmsis_dap.c
    │           │   │   │   ├── cmsis_dap.h
    │           │   │   │   ├── cmsis_dap_usb_bulk.c
    │           │   │   │   ├── cmsis_dap_usb_hid.c
    │           │   │   │   ├── driver.c
    │           │   │   │   ├── dummy.c
    │           │   │   │   ├── ep93xx.c
    │           │   │   │   ├── esp_usb_jtag.c
    │           │   │   │   ├── ft232r.c
    │           │   │   │   ├── ftdi.c
    │           │   │   │   ├── gw16012.c
    │           │   │   │   ├── imx_gpio.c
    │           │   │   │   ├── jlink.c
    │           │   │   │   ├── jtag_dpi.c
    │           │   │   │   ├── jtag_vpi.c
    │           │   │   │   ├── kitprog.c
    │           │   │   │   ├── libftdi_helper.h
    │           │   │   │   ├── libusb_helper.c
    │           │   │   │   ├── libusb_helper.h
    │           │   │   │   ├── linuxgpiod.c
    │           │   │   │   ├── minidriver_imp.h
    │           │   │   │   ├── mpsse.c
    │           │   │   │   ├── mpsse.h
    │           │   │   │   ├── nulink_usb.c
    │           │   │   │   ├── opendous.c
    │           │   │   │   ├── openjtag.c
    │           │   │   │   ├── osbdm.c
    │           │   │   │   ├── parport.c
    │           │   │   │   ├── presto.c
    │           │   │   │   ├── remote_bitbang.c
    │           │   │   │   ├── rlink.c
    │           │   │   │   ├── rlink.h
    │           │   │   │   ├── rlink_call.m4
    │           │   │   │   ├── rlink_dtc_cmd.h
    │           │   │   │   ├── rlink_ep1_cmd.h
    │           │   │   │   ├── rlink_init.m4
    │           │   │   │   ├── rlink_speed_table.c
    │           │   │   │   ├── rlink_st7.h
    │           │   │   │   ├── rshim.c
    │           │   │   │   ├── stlink_usb.c
    │           │   │   │   ├── sysfsgpio.c
    │           │   │   │   ├── ti_icdi_usb.c
    │           │   │   │   ├── ulink.c
    │           │   │   │   ├── usb_blaster/
    │           │   │   │   │   ├── Makefile.am
    │           │   │   │   │   ├── README.CheapClone
    │           │   │   │   │   ├── ublast2_access_libusb.c
    │           │   │   │   │   ├── ublast_access.h
    │           │   │   │   │   ├── ublast_access_ftdi.c
    │           │   │   │   │   └── usb_blaster.c
    │           │   │   │   ├── usbprog.c
    │           │   │   │   ├── vdebug.c
    │           │   │   │   ├── versaloon/
    │           │   │   │   │   ├── usbtoxxx/
    │           │   │   │   │   │   ├── usbtogpio.c
    │           │   │   │   │   │   ├── usbtojtagraw.c
    │           │   │   │   │   │   ├── usbtopwr.c
    │           │   │   │   │   │   ├── usbtoswd.c
    │           │   │   │   │   │   ├── usbtoxxx.c
    │           │   │   │   │   │   ├── usbtoxxx.h
    │           │   │   │   │   │   └── usbtoxxx_internal.h
    │           │   │   │   │   ├── versaloon.c
    │           │   │   │   │   ├── versaloon.h
    │           │   │   │   │   ├── versaloon_include.h
    │           │   │   │   │   └── versaloon_internal.h
    │           │   │   │   ├── vsllink.c
    │           │   │   │   ├── xds110.c
    │           │   │   │   └── xlnx-pcie-xvc.c
    │           │   │   ├── hla/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── hla_interface.c
    │           │   │   │   ├── hla_interface.h
    │           │   │   │   ├── hla_layout.c
    │           │   │   │   ├── hla_layout.h
    │           │   │   │   ├── hla_transport.c
    │           │   │   │   └── hla_transport.h
    │           │   │   ├── interface.c
    │           │   │   ├── interface.h
    │           │   │   ├── interfaces.c
    │           │   │   ├── interfaces.h
    │           │   │   ├── jtag.h
    │           │   │   ├── minidriver.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── swd.h
    │           │   │   ├── swim.c
    │           │   │   ├── swim.h
    │           │   │   ├── tcl.c
    │           │   │   └── tcl.h
    │           │   ├── main.c
    │           │   ├── openocd.c
    │           │   ├── openocd.h
    │           │   ├── pld/
    │           │   │   ├── Makefile.am
    │           │   │   ├── certus.c
    │           │   │   ├── certus.h
    │           │   │   ├── ecp2_3.c
    │           │   │   ├── ecp2_3.h
    │           │   │   ├── ecp5.c
    │           │   │   ├── ecp5.h
    │           │   │   ├── efinix.c
    │           │   │   ├── gatemate.c
    │           │   │   ├── gowin.c
    │           │   │   ├── intel.c
    │           │   │   ├── lattice.c
    │           │   │   ├── lattice.h
    │           │   │   ├── lattice_bit.c
    │           │   │   ├── lattice_bit.h
    │           │   │   ├── lattice_cmd.h
    │           │   │   ├── pld.c
    │           │   │   ├── pld.h
    │           │   │   ├── raw_bit.c
    │           │   │   ├── raw_bit.h
    │           │   │   ├── virtex2.c
    │           │   │   ├── virtex2.h
    │           │   │   ├── xilinx_bit.c
    │           │   │   └── xilinx_bit.h
    │           │   ├── rtos/
    │           │   │   ├── FreeRTOS.c
    │           │   │   ├── Makefile.am
    │           │   │   ├── ThreadX.c
    │           │   │   ├── chibios.c
    │           │   │   ├── chromium-ec.c
    │           │   │   ├── eCos.c
    │           │   │   ├── embKernel.c
    │           │   │   ├── hwthread.c
    │           │   │   ├── linux.c
    │           │   │   ├── linux_header.h
    │           │   │   ├── mqx.c
    │           │   │   ├── nuttx.c
    │           │   │   ├── riot.c
    │           │   │   ├── rtkernel.c
    │           │   │   ├── rtos.c
    │           │   │   ├── rtos.h
    │           │   │   ├── rtos_chibios_stackings.c
    │           │   │   ├── rtos_chibios_stackings.h
    │           │   │   ├── rtos_ecos_stackings.c
    │           │   │   ├── rtos_ecos_stackings.h
    │           │   │   ├── rtos_embkernel_stackings.c
    │           │   │   ├── rtos_embkernel_stackings.h
    │           │   │   ├── rtos_mqx_stackings.c
    │           │   │   ├── rtos_mqx_stackings.h
    │           │   │   ├── rtos_nuttx_stackings.c
    │           │   │   ├── rtos_nuttx_stackings.h
    │           │   │   ├── rtos_riot_stackings.c
    │           │   │   ├── rtos_riot_stackings.h
    │           │   │   ├── rtos_standard_stackings.c
    │           │   │   ├── rtos_standard_stackings.h
    │           │   │   ├── rtos_ucos_iii_stackings.c
    │           │   │   ├── rtos_ucos_iii_stackings.h
    │           │   │   ├── uCOS-III.c
    │           │   │   └── zephyr.c
    │           │   ├── rtt/
    │           │   │   ├── Makefile.am
    │           │   │   ├── rtt.c
    │           │   │   ├── rtt.h
    │           │   │   └── tcl.c
    │           │   ├── server/
    │           │   │   ├── Makefile.am
    │           │   │   ├── gdb_server.c
    │           │   │   ├── gdb_server.h
    │           │   │   ├── ipdbg.c
    │           │   │   ├── ipdbg.h
    │           │   │   ├── rtt_server.c
    │           │   │   ├── rtt_server.h
    │           │   │   ├── server.c
    │           │   │   ├── server.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── tcl_server.c
    │           │   │   ├── tcl_server.h
    │           │   │   ├── telnet_server.c
    │           │   │   └── telnet_server.h
    │           │   ├── svf/
    │           │   │   ├── Makefile.am
    │           │   │   ├── svf.c
    │           │   │   └── svf.h
    │           │   ├── target/
    │           │   │   ├── Makefile.am
    │           │   │   ├── a64_disassembler.c
    │           │   │   ├── a64_disassembler.h
    │           │   │   ├── aarch64.c
    │           │   │   ├── aarch64.h
    │           │   │   ├── adi_v5_dapdirect.c
    │           │   │   ├── adi_v5_jtag.c
    │           │   │   ├── adi_v5_swd.c
    │           │   │   ├── algorithm.c
    │           │   │   ├── algorithm.h
    │           │   │   ├── arc.c
    │           │   │   ├── arc.h
    │           │   │   ├── arc_cmd.c
    │           │   │   ├── arc_cmd.h
    │           │   │   ├── arc_jtag.c
    │           │   │   ├── arc_jtag.h
    │           │   │   ├── arc_mem.c
    │           │   │   ├── arc_mem.h
    │           │   │   ├── arm.h
    │           │   │   ├── arm11.c
    │           │   │   ├── arm11.h
    │           │   │   ├── arm11_dbgtap.c
    │           │   │   ├── arm11_dbgtap.h
    │           │   │   ├── arm720t.c
    │           │   │   ├── arm720t.h
    │           │   │   ├── arm7_9_common.c
    │           │   │   ├── arm7_9_common.h
    │           │   │   ├── arm7tdmi.c
    │           │   │   ├── arm7tdmi.h
    │           │   │   ├── arm920t.c
    │           │   │   ├── arm920t.h
    │           │   │   ├── arm926ejs.c
    │           │   │   ├── arm926ejs.h
    │           │   │   ├── arm946e.c
    │           │   │   ├── arm946e.h
    │           │   │   ├── arm966e.c
    │           │   │   ├── arm966e.h
    │           │   │   ├── arm9tdmi.c
    │           │   │   ├── arm9tdmi.h
    │           │   │   ├── arm_adi_v5.c
    │           │   │   ├── arm_adi_v5.h
    │           │   │   ├── arm_coresight.h
    │           │   │   ├── arm_cti.c
    │           │   │   ├── arm_cti.h
    │           │   │   ├── arm_dap.c
    │           │   │   ├── arm_disassembler.c
    │           │   │   ├── arm_disassembler.h
    │           │   │   ├── arm_dpm.c
    │           │   │   ├── arm_dpm.h
    │           │   │   ├── arm_jtag.c
    │           │   │   ├── arm_jtag.h
    │           │   │   ├── arm_opcodes.h
    │           │   │   ├── arm_semihosting.c
    │           │   │   ├── arm_semihosting.h
    │           │   │   ├── arm_simulator.c
    │           │   │   ├── arm_simulator.h
    │           │   │   ├── arm_tpiu_swo.c
    │           │   │   ├── arm_tpiu_swo.h
    │           │   │   ├── armv4_5.c
    │           │   │   ├── armv4_5.h
    │           │   │   ├── armv4_5_cache.c
    │           │   │   ├── armv4_5_cache.h
    │           │   │   ├── armv4_5_mmu.c
    │           │   │   ├── armv4_5_mmu.h
    │           │   │   ├── armv7a.c
    │           │   │   ├── armv7a.h
    │           │   │   ├── armv7a_cache.c
    │           │   │   ├── armv7a_cache.h
    │           │   │   ├── armv7a_cache_l2x.c
    │           │   │   ├── armv7a_cache_l2x.h
    │           │   │   ├── armv7a_mmu.c
    │           │   │   ├── armv7a_mmu.h
    │           │   │   ├── armv7m.c
    │           │   │   ├── armv7m.h
    │           │   │   ├── armv7m_trace.c
    │           │   │   ├── armv7m_trace.h
    │           │   │   ├── armv8.c
    │           │   │   ├── armv8.h
    │           │   │   ├── armv8_cache.c
    │           │   │   ├── armv8_cache.h
    │           │   │   ├── armv8_dpm.c
    │           │   │   ├── armv8_dpm.h
    │           │   │   ├── armv8_opcodes.c
    │           │   │   ├── armv8_opcodes.h
    │           │   │   ├── avr32_ap7k.c
    │           │   │   ├── avr32_ap7k.h
    │           │   │   ├── avr32_jtag.c
    │           │   │   ├── avr32_jtag.h
    │           │   │   ├── avr32_mem.c
    │           │   │   ├── avr32_mem.h
    │           │   │   ├── avr32_regs.c
    │           │   │   ├── avr32_regs.h
    │           │   │   ├── avrt.c
    │           │   │   ├── avrt.h
    │           │   │   ├── breakpoints.c
    │           │   │   ├── breakpoints.h
    │           │   │   ├── cortex_a.c
    │           │   │   ├── cortex_a.h
    │           │   │   ├── cortex_m.c
    │           │   │   ├── cortex_m.h
    │           │   │   ├── dsp563xx.c
    │           │   │   ├── dsp563xx.h
    │           │   │   ├── dsp563xx_once.c
    │           │   │   ├── dsp563xx_once.h
    │           │   │   ├── dsp5680xx.c
    │           │   │   ├── dsp5680xx.h
    │           │   │   ├── embeddedice.c
    │           │   │   ├── embeddedice.h
    │           │   │   ├── esirisc.c
    │           │   │   ├── esirisc.h
    │           │   │   ├── esirisc_jtag.c
    │           │   │   ├── esirisc_jtag.h
    │           │   │   ├── esirisc_regs.h
    │           │   │   ├── esirisc_trace.c
    │           │   │   ├── esirisc_trace.h
    │           │   │   ├── espressif/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── esp.c
    │           │   │   │   ├── esp.h
    │           │   │   │   ├── esp32.c
    │           │   │   │   ├── esp32_apptrace.c
    │           │   │   │   ├── esp32_apptrace.h
    │           │   │   │   ├── esp32_sysview.c
    │           │   │   │   ├── esp32_sysview.h
    │           │   │   │   ├── esp32s2.c
    │           │   │   │   ├── esp32s3.c
    │           │   │   │   ├── esp_semihosting.c
    │           │   │   │   ├── esp_semihosting.h
    │           │   │   │   ├── esp_xtensa.c
    │           │   │   │   ├── esp_xtensa.h
    │           │   │   │   ├── esp_xtensa_apptrace.c
    │           │   │   │   ├── esp_xtensa_apptrace.h
    │           │   │   │   ├── esp_xtensa_semihosting.c
    │           │   │   │   ├── esp_xtensa_semihosting.h
    │           │   │   │   ├── esp_xtensa_smp.c
    │           │   │   │   ├── esp_xtensa_smp.h
    │           │   │   │   └── segger_sysview.h
    │           │   │   ├── etb.c
    │           │   │   ├── etb.h
    │           │   │   ├── etm.c
    │           │   │   ├── etm.h
    │           │   │   ├── etm_dummy.c
    │           │   │   ├── etm_dummy.h
    │           │   │   ├── fa526.c
    │           │   │   ├── feroceon.c
    │           │   │   ├── hla_target.c
    │           │   │   ├── image.c
    │           │   │   ├── image.h
    │           │   │   ├── lakemont.c
    │           │   │   ├── lakemont.h
    │           │   │   ├── ls1_sap.c
    │           │   │   ├── mem_ap.c
    │           │   │   ├── mips32.c
    │           │   │   ├── mips32.h
    │           │   │   ├── mips32_dmaacc.c
    │           │   │   ├── mips32_dmaacc.h
    │           │   │   ├── mips32_pracc.c
    │           │   │   ├── mips32_pracc.h
    │           │   │   ├── mips64.c
    │           │   │   ├── mips64.h
    │           │   │   ├── mips64_pracc.c
    │           │   │   ├── mips64_pracc.h
    │           │   │   ├── mips_ejtag.c
    │           │   │   ├── mips_ejtag.h
    │           │   │   ├── mips_m4k.c
    │           │   │   ├── mips_m4k.h
    │           │   │   ├── mips_mips64.c
    │           │   │   ├── mips_mips64.h
    │           │   │   ├── openrisc/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── jsp_server.c
    │           │   │   │   ├── jsp_server.h
    │           │   │   │   ├── or1k.c
    │           │   │   │   ├── or1k.h
    │           │   │   │   ├── or1k_du.h
    │           │   │   │   ├── or1k_du_adv.c
    │           │   │   │   ├── or1k_tap.h
    │           │   │   │   ├── or1k_tap_mohor.c
    │           │   │   │   ├── or1k_tap_vjtag.c
    │           │   │   │   └── or1k_tap_xilinx_bscan.c
    │           │   │   ├── quark_d20xx.c
    │           │   │   ├── quark_x10xx.c
    │           │   │   ├── register.c
    │           │   │   ├── register.h
    │           │   │   ├── riscv/
    │           │   │   │   ├── Makefile.am
    │           │   │   │   ├── asm.h
    │           │   │   │   ├── batch.c
    │           │   │   │   ├── batch.h
    │           │   │   │   ├── debug_defines.h
    │           │   │   │   ├── encoding.h
    │           │   │   │   ├── gdb_regs.h
    │           │   │   │   ├── opcodes.h
    │           │   │   │   ├── program.c
    │           │   │   │   ├── program.h
    │           │   │   │   ├── riscv-011.c
    │           │   │   │   ├── riscv-013.c
    │           │   │   │   ├── riscv.c
    │           │   │   │   ├── riscv.h
    │           │   │   │   └── riscv_semihosting.c
    │           │   │   ├── rtt.c
    │           │   │   ├── rtt.h
    │           │   │   ├── semihosting_common.c
    │           │   │   ├── semihosting_common.h
    │           │   │   ├── smp.c
    │           │   │   ├── smp.h
    │           │   │   ├── startup.tcl
    │           │   │   ├── stm8.c
    │           │   │   ├── stm8.h
    │           │   │   ├── target.c
    │           │   │   ├── target.h
    │           │   │   ├── target_request.c
    │           │   │   ├── target_request.h
    │           │   │   ├── target_type.h
    │           │   │   ├── testee.c
    │           │   │   ├── trace.c
    │           │   │   ├── trace.h
    │           │   │   ├── x86_32_common.c
    │           │   │   ├── x86_32_common.h
    │           │   │   ├── xscale.c
    │           │   │   ├── xscale.h
    │           │   │   └── xtensa/
    │           │   │       ├── Makefile.am
    │           │   │       ├── xtensa.c
    │           │   │       ├── xtensa.h
    │           │   │       ├── xtensa_chip.c
    │           │   │       ├── xtensa_chip.h
    │           │   │       ├── xtensa_debug_module.c
    │           │   │       ├── xtensa_debug_module.h
    │           │   │       ├── xtensa_fileio.c
    │           │   │       ├── xtensa_fileio.h
    │           │   │       └── xtensa_regs.h
    │           │   ├── transport/
    │           │   │   ├── Makefile.am
    │           │   │   ├── transport.c
    │           │   │   └── transport.h
    │           │   └── xsvf/
    │           │       ├── Makefile.am
    │           │       ├── xsvf.c
    │           │       └── xsvf.h
    │           ├── tcl/
    │           │   ├── bitsbytes.tcl
    │           │   ├── board/
    │           │   │   ├── 8devices-lima.cfg
    │           │   │   ├── actux3.cfg
    │           │   │   ├── adapteva_parallella1.cfg
    │           │   │   ├── adsp-sc584-ezbrd.cfg
    │           │   │   ├── alphascale_asm9260_ek.cfg
    │           │   │   ├── altera_sockit.cfg
    │           │   │   ├── am3517evm.cfg
    │           │   │   ├── ampere_emag8180.cfg
    │           │   │   ├── ampere_qs_mq_1s.cfg
    │           │   │   ├── ampere_qs_mq_2s.cfg
    │           │   │   ├── arm_evaluator7t.cfg
    │           │   │   ├── arm_musca_a.cfg
    │           │   │   ├── arty_s7.cfg
    │           │   │   ├── asus-rt-n16.cfg
    │           │   │   ├── asus-rt-n66u.cfg
    │           │   │   ├── at91cap7a-stk-sdram.cfg
    │           │   │   ├── at91eb40a.cfg
    │           │   │   ├── at91rm9200-dk.cfg
    │           │   │   ├── at91rm9200-ek.cfg
    │           │   │   ├── at91sam9261-ek.cfg
    │           │   │   ├── at91sam9263-ek.cfg
    │           │   │   ├── at91sam9g20-ek.cfg
    │           │   │   ├── atmel_at91sam7s-ek.cfg
    │           │   │   ├── atmel_at91sam9260-ek.cfg
    │           │   │   ├── atmel_at91sam9rl-ek.cfg
    │           │   │   ├── atmel_sam3n_ek.cfg
    │           │   │   ├── atmel_sam3s_ek.cfg
    │           │   │   ├── atmel_sam3u_ek.cfg
    │           │   │   ├── atmel_sam3x_ek.cfg
    │           │   │   ├── atmel_sam4e_ek.cfg
    │           │   │   ├── atmel_sam4l8_xplained_pro.cfg
    │           │   │   ├── atmel_sam4s_ek.cfg
    │           │   │   ├── atmel_sam4s_xplained_pro.cfg
    │           │   │   ├── atmel_samc20_xplained_pro.cfg
    │           │   │   ├── atmel_samc21_xplained_pro.cfg
    │           │   │   ├── atmel_samd10_xplained_mini.cfg
    │           │   │   ├── atmel_samd11_xplained_pro.cfg
    │           │   │   ├── atmel_samd20_xplained_pro.cfg
    │           │   │   ├── atmel_samd21_xplained_pro.cfg
    │           │   │   ├── atmel_same70_xplained.cfg
    │           │   │   ├── atmel_samg53_xplained_pro.cfg
    │           │   │   ├── atmel_samg55_xplained_pro.cfg
    │           │   │   ├── atmel_saml21_xplained_pro.cfg
    │           │   │   ├── atmel_samr21_xplained_pro.cfg
    │           │   │   ├── atmel_samv71_xplained_ultra.cfg
    │           │   │   ├── avnet_ultrazed-eg.cfg
    │           │   │   ├── balloon3-cpu.cfg
    │           │   │   ├── bcm28155_ap.cfg
    │           │   │   ├── bemicro_cycloneiii.cfg
    │           │   │   ├── bluefield.cfg
    │           │   │   ├── bt-homehubv1.cfg
    │           │   │   ├── calao-usb-a9260.cfg
    │           │   │   ├── calao-usb-a9g20-c01.cfg
    │           │   │   ├── certuspro_evaluation.cfg
    │           │   │   ├── colibri.cfg
    │           │   │   ├── crossbow_tech_imote2.cfg
    │           │   │   ├── csb337.cfg
    │           │   │   ├── csb732.cfg
    │           │   │   ├── da850evm.cfg
    │           │   │   ├── digi_connectcore_wi-9c.cfg
    │           │   │   ├── digilent_analog_discovery.cfg
    │           │   │   ├── digilent_atlys.cfg
    │           │   │   ├── digilent_nexys_video.cfg
    │           │   │   ├── digilent_zedboard.cfg
    │           │   │   ├── diolan_lpc4350-db1.cfg
    │           │   │   ├── diolan_lpc4357-db1.cfg
    │           │   │   ├── dk-tm4c129.cfg
    │           │   │   ├── dm355evm.cfg
    │           │   │   ├── dm365evm.cfg
    │           │   │   ├── dm6446evm.cfg
    │           │   │   ├── dp_busblaster_v3.cfg
    │           │   │   ├── dp_busblaster_v4.cfg
    │           │   │   ├── dptechnics_dpt-board-v1.cfg
    │           │   │   ├── ecp5_evaluation.cfg
    │           │   │   ├── efikamx.cfg
    │           │   │   ├── efm32.cfg
    │           │   │   ├── eir.cfg
    │           │   │   ├── ek-lm3s1968.cfg
    │           │   │   ├── ek-lm3s3748.cfg
    │           │   │   ├── ek-lm3s6965.cfg
    │           │   │   ├── ek-lm3s811-revb.cfg
    │           │   │   ├── ek-lm3s811.cfg
    │           │   │   ├── ek-lm3s8962.cfg
    │           │   │   ├── ek-lm3s9b9x.cfg
    │           │   │   ├── ek-lm3s9d92.cfg
    │           │   │   ├── ek-lm4f120xl.cfg
    │           │   │   ├── ek-lm4f232.cfg
    │           │   │   ├── ek-tm4c123gxl.cfg
    │           │   │   ├── ek-tm4c1294xl.cfg
    │           │   │   ├── embedded-artists_lpc2478-32.cfg
    │           │   │   ├── emcraft_imx8m-som-bsb.cfg
    │           │   │   ├── emcraft_twr-vf6-som-bsb.cfg
    │           │   │   ├── emcraft_vf6-som.cfg
    │           │   │   ├── esp32-bridge.cfg
    │           │   │   ├── esp32-ethernet-kit-3.3v.cfg
    │           │   │   ├── esp32-wrover-kit-1.8v.cfg
    │           │   │   ├── esp32-wrover-kit-3.3v.cfg
    │           │   │   ├── esp32s2-bridge.cfg
    │           │   │   ├── esp32s2-kaluga-1.cfg
    │           │   │   ├── esp32s3-bridge.cfg
    │           │   │   ├── esp32s3-builtin.cfg
    │           │   │   ├── esp32s3-ftdi.cfg
    │           │   │   ├── ethernut3.cfg
    │           │   │   ├── evb-lan9255.cfg
    │           │   │   ├── frdm-kl25z.cfg
    │           │   │   ├── frdm-kl46z.cfg
    │           │   │   ├── fsl_imx6q_sabresd.cfg
    │           │   │   ├── gatemate_eval.cfg
    │           │   │   ├── glyn_tonga2.cfg
    │           │   │   ├── gowin_runber.cfg
    │           │   │   ├── gti/
    │           │   │   │   └── espressobin.cfg
    │           │   │   ├── gumstix-aerocore.cfg
    │           │   │   ├── hammer.cfg
    │           │   │   ├── hilscher_nxdb500sys.cfg
    │           │   │   ├── hilscher_nxeb500hmi.cfg
    │           │   │   ├── hilscher_nxhx10.cfg
    │           │   │   ├── hilscher_nxhx50.cfg
    │           │   │   ├── hilscher_nxhx500.cfg
    │           │   │   ├── hilscher_nxsb100.cfg
    │           │   │   ├── hitex_lpc1768stick.cfg
    │           │   │   ├── hitex_lpc2929.cfg
    │           │   │   ├── hitex_stm32-performancestick.cfg
    │           │   │   ├── hitex_str9-comstick.cfg
    │           │   │   ├── iar_lpc1768.cfg
    │           │   │   ├── iar_str912_sk.cfg
    │           │   │   ├── icnova_imx53_sodimm.cfg
    │           │   │   ├── icnova_sam9g45_sodimm.cfg
    │           │   │   ├── imx27ads.cfg
    │           │   │   ├── imx27lnst.cfg
    │           │   │   ├── imx28evk.cfg
    │           │   │   ├── imx31pdk.cfg
    │           │   │   ├── imx35pdk.cfg
    │           │   │   ├── imx53-m53evk.cfg
    │           │   │   ├── imx53loco.cfg
    │           │   │   ├── imx8mp-evk.cfg
    │           │   │   ├── insignal_arndale.cfg
    │           │   │   ├── kasli.cfg
    │           │   │   ├── kc100.cfg
    │           │   │   ├── kc705.cfg
    │           │   │   ├── kcu105.cfg
    │           │   │   ├── keil_mcb1700.cfg
    │           │   │   ├── keil_mcb2140.cfg
    │           │   │   ├── kindle2.cfg
    │           │   │   ├── kontron_sl28.cfg
    │           │   │   ├── kwikstik.cfg
    │           │   │   ├── la_fonera-fon2200.cfg
    │           │   │   ├── lambdaconcept_ecpix-5.cfg
    │           │   │   ├── lemaker_hikey.cfg
    │           │   │   ├── linksys-wag200g.cfg
    │           │   │   ├── linksys-wrt54gl.cfg
    │           │   │   ├── linksys_nslu2.cfg
    │           │   │   ├── lisa-l.cfg
    │           │   │   ├── logicpd_imx27.cfg
    │           │   │   ├── lpc1850_spifi_generic.cfg
    │           │   │   ├── lpc4350_spifi_generic.cfg
    │           │   │   ├── lubbock.cfg
    │           │   │   ├── marsohod.cfg
    │           │   │   ├── marsohod2.cfg
    │           │   │   ├── marsohod3.cfg
    │           │   │   ├── mbed-lpc11u24.cfg
    │           │   │   ├── mbed-lpc1768.cfg
    │           │   │   ├── mcb1700.cfg
    │           │   │   ├── microchip_explorer16.cfg
    │           │   │   ├── microchip_sama5d27_som1_kit1.cfg
    │           │   │   ├── microchip_same51_curiosity_nano.cfg
    │           │   │   ├── microchip_same54_xplained_pro.cfg
    │           │   │   ├── microchip_saml11_xplained_pro.cfg
    │           │   │   ├── mini2440.cfg
    │           │   │   ├── mini6410.cfg
    │           │   │   ├── minispartan6.cfg
    │           │   │   ├── nds32_corvettef1.cfg
    │           │   │   ├── nds32_xc7.cfg
    │           │   │   ├── netgear-dg834v3.cfg
    │           │   │   ├── netgear-wg102.cfg
    │           │   │   ├── nordic_nrf51822_mkit.cfg
    │           │   │   ├── nordic_nrf51_dk.cfg
    │           │   │   ├── nordic_nrf52_dk.cfg
    │           │   │   ├── nordic_nrf52_ftx232.cfg
    │           │   │   ├── novena-internal-fpga.cfg
    │           │   │   ├── npcx_evb.cfg
    │           │   │   ├── numato_mimas_a7.cfg
    │           │   │   ├── numato_opsis.cfg
    │           │   │   ├── nxp_frdm-k64f.cfg
    │           │   │   ├── nxp_frdm-ls1012a.cfg
    │           │   │   ├── nxp_imx7sabre.cfg
    │           │   │   ├── nxp_lpc-link2.cfg
    │           │   │   ├── nxp_mcimx8m-evk.cfg
    │           │   │   ├── nxp_rdb-ls1046a.cfg
    │           │   │   ├── nxp_rdb-ls1088a.cfg
    │           │   │   ├── olimex_LPC2378STK.cfg
    │           │   │   ├── olimex_lpc_h2148.cfg
    │           │   │   ├── olimex_sam7_ex256.cfg
    │           │   │   ├── olimex_sam7_la2.cfg
    │           │   │   ├── olimex_sam9_l9260.cfg
    │           │   │   ├── olimex_stm32_h103.cfg
    │           │   │   ├── olimex_stm32_h107.cfg
    │           │   │   ├── olimex_stm32_h405.cfg
    │           │   │   ├── olimex_stm32_p107.cfg
    │           │   │   ├── omap2420_h4.cfg
    │           │   │   ├── openrd.cfg
    │           │   │   ├── or1k_generic.cfg
    │           │   │   ├── osk5912.cfg
    │           │   │   ├── phone_se_j100i.cfg
    │           │   │   ├── phytec_lpc3250.cfg
    │           │   │   ├── pic-p32mx.cfg
    │           │   │   ├── pico-debug.cfg
    │           │   │   ├── pipistrello.cfg
    │           │   │   ├── propox_mmnet1001.cfg
    │           │   │   ├── pxa255_sst.cfg
    │           │   │   ├── quark_d2000_refboard.cfg
    │           │   │   ├── quark_x10xx_board.cfg
    │           │   │   ├── quicklogic_quickfeather.cfg
    │           │   │   ├── radiona_ulx3s.cfg
    │           │   │   ├── redbee.cfg
    │           │   │   ├── reflexces_achilles_i-dev_kit_arria10.cfg
    │           │   │   ├── renesas_dk-s7g2.cfg
    │           │   │   ├── renesas_falcon.cfg
    │           │   │   ├── renesas_gr_peach.cfg
    │           │   │   ├── renesas_porter.cfg
    │           │   │   ├── renesas_salvator-xs.cfg
    │           │   │   ├── renesas_silk.cfg
    │           │   │   ├── renesas_stout.cfg
    │           │   │   ├── rigado_bmd300_ek.cfg
    │           │   │   ├── rpi3.cfg
    │           │   │   ├── rpi4b.cfg
    │           │   │   ├── rsc-w910.cfg
    │           │   │   ├── sayma_amc.cfg
    │           │   │   ├── sheevaplug.cfg
    │           │   │   ├── sifive-e31arty.cfg
    │           │   │   ├── sifive-e51arty.cfg
    │           │   │   ├── sifive-hifive1-revb.cfg
    │           │   │   ├── sifive-hifive1.cfg
    │           │   │   ├── smdk6410.cfg
    │           │   │   ├── snps_em_sk.cfg
    │           │   │   ├── snps_em_sk_v1.cfg
    │           │   │   ├── snps_em_sk_v2.1.cfg
    │           │   │   ├── snps_em_sk_v2.2.cfg
    │           │   │   ├── snps_hsdk.cfg
    │           │   │   ├── spansion_sk-fm4-176l-s6e2cc.cfg
    │           │   │   ├── spansion_sk-fm4-u120-9b560.cfg
    │           │   │   ├── spear300evb.cfg
    │           │   │   ├── spear300evb_mod.cfg
    │           │   │   ├── spear310evb20.cfg
    │           │   │   ├── spear310evb20_mod.cfg
    │           │   │   ├── spear320cpu.cfg
    │           │   │   ├── spear320cpu_mod.cfg
    │           │   │   ├── st_b-l475e-iot01a.cfg
    │           │   │   ├── st_nucleo_8l152r8.cfg
    │           │   │   ├── st_nucleo_8s208rb.cfg
    │           │   │   ├── st_nucleo_f0.cfg
    │           │   │   ├── st_nucleo_f103rb.cfg
    │           │   │   ├── st_nucleo_f3.cfg
    │           │   │   ├── st_nucleo_f4.cfg
    │           │   │   ├── st_nucleo_f7.cfg
    │           │   │   ├── st_nucleo_g0.cfg
    │           │   │   ├── st_nucleo_g4.cfg
    │           │   │   ├── st_nucleo_h743zi.cfg
    │           │   │   ├── st_nucleo_h745zi.cfg
    │           │   │   ├── st_nucleo_l073rz.cfg
    │           │   │   ├── st_nucleo_l1.cfg
    │           │   │   ├── st_nucleo_l4.cfg
    │           │   │   ├── st_nucleo_l5.cfg
    │           │   │   ├── st_nucleo_wb55.cfg
    │           │   │   ├── steval-idb007v1.cfg
    │           │   │   ├── steval-idb008v1.cfg
    │           │   │   ├── steval-idb011v1.cfg
    │           │   │   ├── steval-idb012v1.cfg
    │           │   │   ├── steval_pcc010.cfg
    │           │   │   ├── stm320518_eval.cfg
    │           │   │   ├── stm320518_eval_stlink.cfg
    │           │   │   ├── stm32100b_eval.cfg
    │           │   │   ├── stm3210b_eval.cfg
    │           │   │   ├── stm3210c_eval.cfg
    │           │   │   ├── stm3210e_eval.cfg
    │           │   │   ├── stm3220g_eval.cfg
    │           │   │   ├── stm3220g_eval_stlink.cfg
    │           │   │   ├── stm3241g_eval.cfg
    │           │   │   ├── stm3241g_eval_stlink.cfg
    │           │   │   ├── stm32429i_eval.cfg
    │           │   │   ├── stm32429i_eval_stlink.cfg
    │           │   │   ├── stm32439i_eval.cfg
    │           │   │   ├── stm32439i_eval_stlink.cfg
    │           │   │   ├── stm327x6g_eval.cfg
    │           │   │   ├── stm32f0discovery.cfg
    │           │   │   ├── stm32f103c8_blue_pill.cfg
    │           │   │   ├── stm32f334discovery.cfg
    │           │   │   ├── stm32f3discovery.cfg
    │           │   │   ├── stm32f412g-disco.cfg
    │           │   │   ├── stm32f413h-disco.cfg
    │           │   │   ├── stm32f429disc1.cfg
    │           │   │   ├── stm32f429discovery.cfg
    │           │   │   ├── stm32f469discovery.cfg
    │           │   │   ├── stm32f469i-disco.cfg
    │           │   │   ├── stm32f4discovery.cfg
    │           │   │   ├── stm32f723e-disco.cfg
    │           │   │   ├── stm32f746g-disco.cfg
    │           │   │   ├── stm32f769i-disco.cfg
    │           │   │   ├── stm32f7discovery.cfg
    │           │   │   ├── stm32h735g-disco.cfg
    │           │   │   ├── stm32h745i-disco.cfg
    │           │   │   ├── stm32h747i-disco.cfg
    │           │   │   ├── stm32h750b-disco.cfg
    │           │   │   ├── stm32h7b3i-disco.cfg
    │           │   │   ├── stm32h7x3i_eval.cfg
    │           │   │   ├── stm32h7x_dual_qspi.cfg
    │           │   │   ├── stm32l0discovery.cfg
    │           │   │   ├── stm32l476g-disco.cfg
    │           │   │   ├── stm32l496g-disco.cfg
    │           │   │   ├── stm32l4discovery.cfg
    │           │   │   ├── stm32l4p5g-disco.cfg
    │           │   │   ├── stm32l4r9i-disco.cfg
    │           │   │   ├── stm32ldiscovery.cfg
    │           │   │   ├── stm32mp13x_dk.cfg
    │           │   │   ├── stm32mp15x_dk2.cfg
    │           │   │   ├── stm32vldiscovery.cfg
    │           │   │   ├── str910-eval.cfg
    │           │   │   ├── telo.cfg
    │           │   │   ├── ti_am335xevm.cfg
    │           │   │   ├── ti_am437x_idk.cfg
    │           │   │   ├── ti_am43xx_evm.cfg
    │           │   │   ├── ti_am625evm.cfg
    │           │   │   ├── ti_am642evm.cfg
    │           │   │   ├── ti_am654evm.cfg
    │           │   │   ├── ti_beagleboard.cfg
    │           │   │   ├── ti_beagleboard_xm.cfg
    │           │   │   ├── ti_beaglebone-base.cfg
    │           │   │   ├── ti_beaglebone.cfg
    │           │   │   ├── ti_beaglebone_black.cfg
    │           │   │   ├── ti_blaze.cfg
    │           │   │   ├── ti_cc13x0_launchpad.cfg
    │           │   │   ├── ti_cc13x2_launchpad.cfg
    │           │   │   ├── ti_cc26x0_launchpad.cfg
    │           │   │   ├── ti_cc26x2_launchpad.cfg
    │           │   │   ├── ti_cc3200_launchxl.cfg
    │           │   │   ├── ti_cc3220sf_launchpad.cfg
    │           │   │   ├── ti_cc32xx_launchpad.cfg
    │           │   │   ├── ti_dk-tm4c129.cfg
    │           │   │   ├── ti_ek-tm4c123gxl.cfg
    │           │   │   ├── ti_ek-tm4c1294xl.cfg
    │           │   │   ├── ti_j7200evm.cfg
    │           │   │   ├── ti_j721evm.cfg
    │           │   │   ├── ti_j721s2evm.cfg
    │           │   │   ├── ti_msp432_launchpad.cfg
    │           │   │   ├── ti_pandaboard.cfg
    │           │   │   ├── ti_pandaboard_es.cfg
    │           │   │   ├── ti_tmdx570ls20susb.cfg
    │           │   │   ├── ti_tmdx570ls31usb.cfg
    │           │   │   ├── tocoding_poplar.cfg
    │           │   │   ├── topas910.cfg
    │           │   │   ├── topasa900.cfg
    │           │   │   ├── tp-link_tl-mr3020.cfg
    │           │   │   ├── tp-link_wdr4300.cfg
    │           │   │   ├── trion_t20_bga256.cfg
    │           │   │   ├── twr-k60f120m.cfg
    │           │   │   ├── twr-k60n512.cfg
    │           │   │   ├── twr-vf65gs10.cfg
    │           │   │   ├── twr-vf65gs10_cmsisdap.cfg
    │           │   │   ├── tx25_stk5.cfg
    │           │   │   ├── tx27_stk5.cfg
    │           │   │   ├── unknown_at91sam9260.cfg
    │           │   │   ├── uptech_2410.cfg
    │           │   │   ├── vd_a53x2_dap.cfg
    │           │   │   ├── vd_a53x2_jtag.cfg
    │           │   │   ├── vd_m4_dap.cfg
    │           │   │   ├── vd_m4_jtag.cfg
    │           │   │   ├── vd_m7_jtag.cfg
    │           │   │   ├── vd_pulpissimo_jtag.cfg
    │           │   │   ├── vd_swerv_jtag.cfg
    │           │   │   ├── vd_xt8_jtag.cfg
    │           │   │   ├── verdex.cfg
    │           │   │   ├── voipac.cfg
    │           │   │   ├── voltcraft_dso-3062c.cfg
    │           │   │   ├── x300t.cfg
    │           │   │   ├── xmc-2go.cfg
    │           │   │   ├── xmc1100-boot-kit.cfg
    │           │   │   ├── xmc4200-application-kit-actuator.cfg
    │           │   │   ├── xmc4300-relax.cfg
    │           │   │   ├── xmc4500-application-kit-general.cfg
    │           │   │   ├── xmc4500-application-kit-sdram.cfg
    │           │   │   ├── xmc4500-relax.cfg
    │           │   │   ├── xmc4700-relax.cfg
    │           │   │   ├── xmc4800-relax.cfg
    │           │   │   ├── xmos_xk-xac-xa8_arm.cfg
    │           │   │   ├── xtensa-kc705-ext-dap.cfg
    │           │   │   ├── xtensa-kc705-ext.cfg
    │           │   │   ├── xtensa-kc705-onboard.cfg
    │           │   │   ├── xtensa-palladium-vdebug.cfg
    │           │   │   └── xtensa-rt685-ext.cfg
    │           │   ├── chip/
    │           │   │   ├── atmel/
    │           │   │   │   └── at91/
  
Download .txt
Showing preview only (1,049K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (12120 symbols across 600 files)

FILE: Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/libdcc/dcc_stdio.c
  function dbg_write (line 42) | void dbg_write(unsigned long dcc_data)
  function dbg_write (line 59) | void dbg_write(unsigned long dcc_data)
  function dbg_trace_point (line 74) | void dbg_trace_point(unsigned long number)
  function dbg_write_u32 (line 79) | void dbg_write_u32(const unsigned long *val, long len)
  function dbg_write_u16 (line 92) | void dbg_write_u16(const unsigned short *val, long len)
  function dbg_write_u8 (line 110) | void dbg_write_u8(const unsigned char *val, long len)
  function dbg_write_str (line 130) | void dbg_write_str(const char *msg)
  function dbg_write_char (line 152) | void dbg_write_char(char msg)

FILE: Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/libdcc/example.c
  function main (line 33) | int main(void)

FILE: Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/share/openocd/contrib/libdcc/dcc_stdio.c
  function dbg_write (line 42) | void dbg_write(unsigned long dcc_data)
  function dbg_write (line 59) | void dbg_write(unsigned long dcc_data)
  function dbg_trace_point (line 74) | void dbg_trace_point(unsigned long number)
  function dbg_write_u32 (line 79) | void dbg_write_u32(const unsigned long *val, long len)
  function dbg_write_u16 (line 92) | void dbg_write_u16(const unsigned short *val, long len)
  function dbg_write_u8 (line 110) | void dbg_write_u8(const unsigned char *val, long len)
  function dbg_write_str (line 130) | void dbg_write_str(const char *msg)
  function dbg_write_char (line 152) | void dbg_write_char(char msg)

FILE: Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/share/openocd/contrib/libdcc/example.c
  function main (line 33) | int main(void)

FILE: Tools/CH347/ch347-main/OpenOCD_CH347/contrib/libdcc/dcc_stdio.c
  function dbg_write (line 42) | void dbg_write(unsigned long dcc_data)
  function dbg_write (line 59) | void dbg_write(unsigned long dcc_data)
  function dbg_trace_point (line 74) | void dbg_trace_point(unsigned long number)
  function dbg_write_u32 (line 79) | void dbg_write_u32(const unsigned long *val, long len)
  function dbg_write_u16 (line 92) | void dbg_write_u16(const unsigned short *val, long len)
  function dbg_write_u8 (line 110) | void dbg_write_u8(const unsigned char *val, long len)
  function dbg_write_str (line 130) | void dbg_write_str(const char *msg)
  function dbg_write_char (line 152) | void dbg_write_char(char msg)

FILE: Tools/CH347/ch347-main/OpenOCD_CH347/contrib/libdcc/example.c
  function main (line 33) | int main(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/itmdump.c
  function show_task (line 46) | static void show_task(int port, unsigned data)
  function show_reserved (line 78) | static void show_reserved(FILE *f, char *label, int c)
  function read_varlen (line 99) | static bool read_varlen(FILE *f, int c, unsigned *value)
  function show_hard (line 136) | static void show_hard(FILE *f, int c)
  function show_swit (line 238) | static void show_swit(FILE *f, int c)
  function show_timestamp (line 273) | static void show_timestamp(FILE *f, int c)
  function main (line 357) | int main(int argc, char **argv)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/libdcc/dcc_stdio.c
  function dbg_write (line 31) | void dbg_write(unsigned long dcc_data)
  function dbg_write (line 48) | void dbg_write(unsigned long dcc_data)
  function dbg_trace_point (line 63) | void dbg_trace_point(unsigned long number)
  function dbg_write_u32 (line 68) | void dbg_write_u32(const unsigned long *val, long len)
  function dbg_write_u16 (line 81) | void dbg_write_u16(const unsigned short *val, long len)
  function dbg_write_u8 (line 99) | void dbg_write_u8(const unsigned char *val, long len)
  function dbg_write_str (line 119) | void dbg_write_str(const char *msg)
  function dbg_write_char (line 141) | void dbg_write_char(char msg)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/libdcc/example.c
  function main (line 22) | int main(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/list_example.c
  type thread (line 17) | struct thread {
  function insert (line 23) | void insert(struct thread *t)
  function remove (line 28) | void remove(struct thread *t)
  type thread (line 33) | struct thread
  type thread (line 35) | struct thread
  type thread (line 43) | struct thread
  type thread (line 45) | struct thread
  function main (line 53) | int main(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/checksum/riscv_crc.c
  function xcrc32 (line 126) | unsigned int

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/at91sam7x/dcc.c
  function uint32 (line 11) | uint32 dcc_rd(void)
  function dcc_wr (line 25) | int dcc_wr(uint32 data)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/at91sam7x/main.c
  function cmd_flash (line 17) | void cmd_flash(uint32 cmd)
  function main (line 66) | int main (void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/at91sam7x/platform.h
  type int8 (line 24) | typedef signed char int8;
  type uint8 (line 25) | typedef unsigned char uint8;
  type int16 (line 27) | typedef signed short int16;
  type uint16 (line 28) | typedef unsigned short uint16;
  type int32 (line 30) | typedef signed int int32;
  type uint32 (line 31) | typedef unsigned int uint32;

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/at91sam7x/samflash.c
  function flash_init (line 18) | int flash_init(void)
  function flash_page_program (line 63) | int flash_page_program(uint32 *data, int page_num)
  function flash_erase_plane (line 113) | int flash_erase_plane(int efc_ofs)
  function flash_erase_all (line 161) | int flash_erase_all(void)
  function flash_verify (line 174) | int flash_verify(uint32 adr, unsigned int len, uint8 *src)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/bluenrg-x/bluenrg-x_write.c
  type work_area_t (line 35) | typedef struct {
  function flashWrite (line 41) | static inline __attribute__((always_inline)) uint32_t flashWrite(uint32_...
  function write (line 72) | __attribute__((naked)) __attribute__((noreturn)) void write(uint8_t *wor...

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/cc26xx/flash.c
  function flash_sector_erase (line 57) | uint32_t flash_sector_erase(uint32_t sector_address)
  function flash_bank_erase (line 78) | uint32_t flash_bank_erase(bool force_precondition)
  function flash_program (line 140) | uint32_t flash_program(uint8_t *data_buffer, uint32_t address, uint32_t ...
  function flash_disable_sectors_for_write (line 162) | void flash_disable_sectors_for_write(void)
  function issue_fsm_command (line 188) | static void issue_fsm_command(flash_state_command_t command)
  function enable_sectors_for_write (line 217) | static void enable_sectors_for_write(void)
  function trim_for_write (line 252) | static void trim_for_write(void)
  function scale_cycle_values (line 673) | static uint32_t scale_cycle_values(uint32_t specified_timing,
  function set_read_mode (line 688) | static void set_read_mode(void)
  function set_write_mode (line 825) | static void set_write_mode(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/cc26xx/flash.h
  type flash_state_command_t (line 95) | typedef enum {
  type fwp_write_byte (line 145) | typedef volatile uint8_t fwp_write_byte;
  function flash_sector_size_get (line 165) | static inline uint32_t flash_sector_size_get(void)
  function flash_size_get (line 186) | static inline uint32_t flash_size_get(void)
  function flash_check_fsm_for_error (line 216) | static inline uint32_t flash_check_fsm_for_error(void)
  function flash_check_fsm_for_ready (line 241) | static inline uint32_t flash_check_fsm_for_ready(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/cc26xx/flashloader.c
  function flashloader_init (line 19) | uint32_t flashloader_init(struct flash_params *params, uint8_t *buf1,
  function flashloader_erase_and_program (line 33) | uint32_t flashloader_erase_and_program(uint8_t *src, uint32_t address,
  function flashloader_program_with_retain (line 51) | uint32_t flashloader_program_with_retain(uint8_t *src, uint32_t address,
  function flashloader_erase_all (line 101) | uint32_t flashloader_erase_all(void)
  function flashloader_erase_sectors (line 111) | uint32_t flashloader_erase_sectors(uint32_t address, uint32_t byte_count)
  function flashloader_program (line 141) | uint32_t flashloader_program(uint8_t *src, uint32_t address,

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/cc26xx/flashloader.h
  type flash_params (line 20) | struct __attribute__((__packed__)) flash_params {
  type flash_commands_t (line 28) | typedef enum {
  type flash_handshake_t (line 38) | typedef enum {
  type flash_status_t (line 50) | typedef enum {
  type flash_params (line 73) | struct flash_params
  function flashloader_address_to_sector (line 158) | static inline uint32_t flashloader_address_to_sector(uint32_t address)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/cc26xx/main.c
  type flash_params (line 17) | struct flash_params
  function disable_flash_cache (line 43) | static void disable_flash_cache()
  function restore_cache_state (line 71) | static void restore_cache_state()
  function main (line 85) | int main(void)
  function _exit (line 147) | void _exit(int status)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/cc26xx/startup.c
  function entry (line 42) | __attribute__ ((section(".entry")))

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/fespi/riscv_fespi.c
  function flash_fespi (line 115) | int flash_fespi(volatile uint32_t *ctrl_base, uint32_t page_size,
  function fespi_read_reg (line 166) | static uint32_t fespi_read_reg(volatile uint32_t *ctrl_base, unsigned ad...
  function fespi_write_reg (line 171) | static void fespi_write_reg(volatile uint32_t *ctrl_base, unsigned addre...
  function fespi_disable_hw_mode (line 176) | static void fespi_disable_hw_mode(volatile uint32_t *ctrl_base)
  function fespi_enable_hw_mode (line 182) | static void fespi_enable_hw_mode(volatile uint32_t *ctrl_base)
  function fespi_txwm_wait (line 189) | static int fespi_txwm_wait(volatile uint32_t *ctrl_base)
  function fespi_set_dir (line 202) | static void fespi_set_dir(volatile uint32_t *ctrl_base, bool dir)
  function fespi_tx (line 210) | static int fespi_tx(volatile uint32_t *ctrl_base, uint8_t in)
  function fespi_rx (line 225) | static int fespi_rx(volatile uint32_t *ctrl_base, uint8_t *out)
  function fespi_wip (line 242) | static int fespi_wip(volatile uint32_t *ctrl_base)
  function fespi_write_buffer (line 275) | static int fespi_write_buffer(volatile uint32_t *ctrl_base,

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/fpga/xilinx_bscan_spi.py
  class JTAG2SPI (line 44) | class JTAG2SPI(mg.Module):
    method __init__ (line 45) | def __init__(self, spi=None, bits=32):
  class JTAG2SPITest (line 129) | class JTAG2SPITest(unittest.TestCase):
    method setUp (line 130) | def setUp(self):
    method test_instantiate (line 134) | def test_instantiate(self):
    method test_initial_conditions (line 137) | def test_initial_conditions(self):
    method test_enable (line 146) | def test_enable(self):
    method run_seq (line 157) | def run_seq(self, tdi, tdo, spi=None):
    method test_shift (line 177) | def test_shift(self):
  class Spartan3 (line 192) | class Spartan3(mg.Module):
    method __init__ (line 196) | def __init__(self, platform):
  class Spartan3A (line 211) | class Spartan3A(Spartan3):
  class Spartan6 (line 215) | class Spartan6(mg.Module):
    method __init__ (line 218) | def __init__(self, platform):
  class Series7 (line 234) | class Series7(mg.Module):
    method __init__ (line 237) | def __init__(self, platform):
  class Ultrascale (line 270) | class Ultrascale(mg.Module):
    method __init__ (line 273) | def __init__(self, platform):
  class XilinxBscanSpi (line 307) | class XilinxBscanSpi(xilinx.XilinxPlatform):
    method __init__ (line 413) | def __init__(self, device, pins, std, toolchain="ise"):
    method make_spi (line 425) | def make_spi(i, pins, std, toolchain):
    method make (line 443) | def make(cls, target, errors=False):

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/gd32vf103/gd32vf103.c
  function flash_write (line 14) | void flash_write(volatile uint32_t *flash_sr,

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/MSP432E4_FlashLibIf.h
  type flash_command (line 25) | enum flash_command {
  type flash_interface (line 85) | struct flash_interface {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/MSP432P4_FlashLibIf.h
  type flash_command (line 25) | enum flash_command {
  type flash_interface (line 85) | struct flash_interface {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/driverlib.c
  function cpu_cpsid (line 17) | uint32_t __attribute__((naked)) cpu_cpsid(void)
  function cpu_wfi (line 37) | void __attribute__((naked)) cpu_wfi(void)
  function __pcm_set_core_voltage_level_advanced (line 47) | static bool __pcm_set_core_voltage_level_advanced(uint_fast8_t voltage_l...
  function pcm_set_core_voltage_level (line 108) | bool pcm_set_core_voltage_level(uint_fast8_t voltage_level)
  function pcm_get_power_mode (line 113) | uint8_t pcm_get_power_mode(void)
  function pcm_get_core_voltage_level (line 139) | uint8_t pcm_get_core_voltage_level(void)
  function __pcm_set_power_mode_advanced (line 164) | static bool __pcm_set_power_mode_advanced(uint_fast8_t power_mode,
  function pcm_set_power_mode (line 244) | bool pcm_set_power_mode(uint_fast8_t power_mode)
  function __pcm_set_power_state_advanced (line 249) | static bool __pcm_set_power_state_advanced(uint_fast8_t power_state,
  function pcm_set_power_state (line 334) | bool pcm_set_power_state(uint_fast8_t power_state)
  function pcm_shutdown_device (line 339) | bool pcm_shutdown_device(uint32_t shutdown_mode)
  function pcm_goto_lpm4 (line 359) | bool pcm_goto_lpm4(void)
  function pcm_goto_lpm0 (line 369) | bool pcm_goto_lpm0(void)
  function pcm_goto_lpm3 (line 382) | bool pcm_goto_lpm3(void)
  function pcm_get_power_state (line 416) | uint8_t pcm_get_power_state(void)
  function rtc_c_hold_clock (line 426) | void rtc_c_hold_clock(void)
  function wdt_a_hold_timer (line 438) | void wdt_a_hold_timer(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/driverlib.h
  type SCB_Type (line 30) | struct SCB_Type {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/main_msp432e4x.c
  function main (line 23) | int main(void)
  function msp432_flash_init (line 69) | void msp432_flash_init(void)
  function msp432_flash_mass_erase (line 76) | void msp432_flash_mass_erase(void)
  function msp432_flash_sector_erase (line 99) | void msp432_flash_sector_erase(void)
  function msp432_flash_continous_write (line 125) | void msp432_flash_continous_write(void)
  function msp432_flash_exit (line 321) | void msp432_flash_exit(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/main_msp432p401x.c
  type backup_params (line 31) | struct backup_params {
  function main (line 42) | int main(void)
  function msp432_flash_init (line 92) | void msp432_flash_init(void)
  function msp432_flash_mass_erase (line 126) | void msp432_flash_mass_erase(void)
  function msp432_flash_sector_erase (line 151) | void msp432_flash_sector_erase(void)
  function msp432_flash_write (line 176) | void msp432_flash_write(void)
  function msp432_flash_continous_write (line 205) | void msp432_flash_continous_write(void)
  function unlock_flash_sectors (line 272) | void unlock_flash_sectors(void)
  function unlock_all_flash_sectors (line 290) | void unlock_all_flash_sectors(void)
  function lock_all_flash_sectors (line 303) | void lock_all_flash_sectors(void)
  function __cs_set_dco_frequency_range (line 315) | void __cs_set_dco_frequency_range(uint32_t dco_freq)
  function msp432_flash_exit (line 328) | void msp432_flash_exit(void)
  function program_device (line 356) | static bool program_device(void *src, void *dest, uint32_t length)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/main_msp432p411x.c
  type backup_params (line 31) | struct backup_params {
  function main (line 45) | int main(void)
  function msp432_flash_init (line 95) | void msp432_flash_init(void)
  function msp432_flash_mass_erase (line 129) | void msp432_flash_mass_erase(void)
  function msp432_flash_sector_erase (line 154) | void msp432_flash_sector_erase(void)
  function msp432_flash_write (line 179) | void msp432_flash_write(void)
  function msp432_flash_continous_write (line 208) | void msp432_flash_continous_write(void)
  function unlock_flash_sectors (line 265) | void unlock_flash_sectors(void)
  function unlock_all_flash_sectors (line 282) | void unlock_all_flash_sectors(void)
  function lock_all_flash_sectors (line 295) | void lock_all_flash_sectors(void)
  function __cs_set_dco_frequency_range (line 304) | void __cs_set_dco_frequency_range(uint32_t dco_freq)
  function msp432_flash_exit (line 317) | void msp432_flash_exit(void)
  function program_device (line 345) | static bool program_device(void *src, void *dest, uint32_t length)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/msp432e4x.h
  type flash_ctrl (line 19) | struct flash_ctrl {
  type sys_ctrl (line 37) | struct sys_ctrl {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/msp432p401x.h
  type cs (line 28) | struct cs {
  type dio_port_odd_int (line 37) | struct dio_port_odd_int {
  type dio_port_even_int (line 44) | struct dio_port_even_int {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/msp432p411x.h
  type cs (line 40) | struct cs {
  type pcm (line 49) | struct pcm {
  type rtc_c (line 58) | struct rtc_c {
  type wdt_a (line 78) | struct wdt_a {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/startup_msp432e4.c
  function reset_handler (line 63) | __attribute__((section(".reset"))) __attribute__((naked))
  function default_handler (line 91) | void default_handler(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/msp432/startup_msp432p4.c
  function reset_handler (line 63) | __attribute__((section(".reset"))) __attribute__((naked))
  function default_handler (line 91) | void default_handler(void)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/npcx/npcx_flash.c
  function flash_execute_cmd (line 16) | static void flash_execute_cmd(uint8_t code, uint8_t cts)
  function flash_cs_level (line 27) | static void flash_cs_level(uint8_t level)
  function flash_set_address (line 36) | static void flash_set_address(uint32_t dest_addr)
  function delay (line 46) | void delay(uint32_t i)
  function flash_wait_ready (line 52) | static int flash_wait_ready(uint32_t timeout)
  function flash_write_enable (line 82) | static int flash_write_enable(void)
  function flash_burst_write (line 98) | static void flash_burst_write(uint32_t dest_addr, uint16_t bytes,
  function flash_program_write (line 118) | static int flash_program_write(uint32_t addr, uint32_t size,
  function flash_physical_write (line 129) | int flash_physical_write(uint32_t offset, uint32_t size, const uint8_t *...
  function flash_physical_erase (line 165) | int flash_physical_erase(uint32_t offset, uint32_t size)
  function flash_physical_erase_all (line 188) | int flash_physical_erase_all(void)
  function flash_physical_clear_stsreg (line 206) | int flash_physical_clear_stsreg(void)
  function flash_get_id (line 235) | int flash_get_id(uint32_t *id)
  function flashloader_init (line 246) | uint32_t flashloader_init(struct npcx_flash_params *params)
  type npcx_flash_params (line 259) | struct npcx_flash_params
  function main (line 264) | int main(void)
  function entry (line 333) | __attribute__ ((section(".entry")))

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/npcx/npcx_flash.h
  type npcx_flash_params (line 149) | struct __attribute__((__packed__)) npcx_flash_params {
  type npcx_flash_handshake (line 157) | enum npcx_flash_handshake {
  type npcx_flash_commands (line 163) | enum npcx_flash_commands {
  type npcx_flash_status (line 172) | enum npcx_flash_status {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/loaders/flash/stm32/stm32l4x.c
  function copy_buffer_u32 (line 13) | static inline __attribute__((always_inline))
  function write (line 24) | void write(volatile struct stm32l4_work_area *work_area,
  function main (line 149) | int main()

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/remote_bitbang/remote_bitbang_sysfsgpio.c
  function is_gpio_valid (line 54) | static int is_gpio_valid(int gpio)
  function open_write_close (line 65) | static int open_write_close(const char *name, const char *valstr)
  function unexport_sysfs_gpio (line 81) | static void unexport_sysfs_gpio(int gpio)
  function setup_sysfs_gpio (line 104) | static int setup_sysfs_gpio(int gpio, int is_output, int init_high)
  function sysfsgpio_read (line 163) | static int sysfsgpio_read(void)
  function sysfsgpio_write (line 185) | static void sysfsgpio_write(int tck, int tms, int tdi)
  function sysfsgpio_reset (line 233) | static void sysfsgpio_reset(int trst, int srst)
  function cleanup_fd (line 263) | static void cleanup_fd(int fd, int gpio)
  function cleanup_all_fds (line 273) | static void cleanup_all_fds(void)
  function process_remote_protocol (line 283) | static void process_remote_protocol(void)
  function main (line 308) | int main(int argc, char *argv[])

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/rpc_examples/ocd_rpc_example.py
  function strToHex (line 31) | def strToHex(data):
  function hexify (line 34) | def hexify(data):
  function compareData (line 37) | def compareData(a, b):
  class OpenOcd (line 43) | class OpenOcd:
    method __init__ (line 45) | def __init__(self, verbose=False):
    method __enter__ (line 53) | def __enter__(self):
    method __exit__ (line 57) | def __exit__(self, type, value, traceback):
    method connect (line 60) | def connect(self):
    method disconnect (line 63) | def disconnect(self):
    method send (line 69) | def send(self, cmd):
    method _recv (line 78) | def _recv(self):
    method readVariable (line 95) | def readVariable(self, address):
    method readMemory (line 99) | def readMemory(self, wordLen, address, n):
    method writeVariable (line 103) | def writeVariable(self, address, value):
    method writeMemory (line 107) | def writeMemory(self, wordLen, address, data):
  function show (line 113) | def show(*args):

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/xsvf_tools/svf2xsvf.py
  function s_ident (line 85) | def s_ident(scanner, token): return ("ident", token.upper(), LineNumber)
  function s_hex (line 87) | def s_hex(scanner, token):
  function s_int (line 93) | def s_int(scanner, token): return ("int", int(token), LineNumber)
  function s_float (line 94) | def s_float(scanner, token): return ("float", float(token), LineNumber)
  function s_semicolon (line 96) | def s_semicolon(scanner, token): return ("semi", token, LineNumber)
  function s_nl (line 98) | def s_nl(scanner,token):
  function nextTok (line 143) | def nextTok():
  class ParseError (line 152) | class ParseError(Exception):
    method __init__ (line 154) | def __init__(self, linenumber, token, message):
    method __str__ (line 158) | def __str__(self):
  class MASKSET (line 164) | class MASKSET(object):
    method __init__ (line 171) | def __init__(self, name):
    method empty (line 175) | def empty(self):
    method syncLengths (line 182) | def syncLengths( self, sawTDI, sawTDO, sawMASK, sawSMASK, newSize ):
  function makeBitArray (line 221) | def makeBitArray( hexString, bitCount ):
  function makeXSVFbytes (line 253) | def makeXSVFbytes( bitarray ):
  function writeComment (line 279) | def writeComment( outputFile, shiftOp_linenum, shiftOp ):
  function combineBitVectors (line 290) | def combineBitVectors( trailer, meat, header ):
  function writeRUNTEST (line 303) | def writeRUNTEST( outputFile, run_state, end_state, run_count, min_time,...

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/contrib/xsvf_tools/xsvfdump.py
  function ReadSDRMASKS (line 46) | def ReadSDRMASKS( f, len ):
  function bytes2hexString (line 61) | def bytes2hexString( f, len ):
  function ReadByte (line 71) | def ReadByte( f ):
  function ShowState (line 80) | def ShowState( state ):
  function ShowOpcode (line 90) | def ShowOpcode( op, f ):
  function main (line 234) | def main():

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/common.c
  function get_flash_name_index (line 14) | unsigned get_flash_name_index(const char *name)
  function flash_driver_name_matches (line 27) | bool flash_driver_name_matches(const char *name, const char *expected)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/arm_io.c
  function arm_code_to_working_area (line 33) | static int arm_code_to_working_area(struct target *target,
  function arm_nandwrite (line 80) | int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size)
  function arm_nandread (line 190) | int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/arm_io.h
  type arm_nand_op (line 12) | enum arm_nand_op {
  type arm_nand_data (line 22) | struct arm_nand_data {
  type arm_nand_data (line 41) | struct arm_nand_data
  type arm_nand_data (line 42) | struct arm_nand_data

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/at91sam9.c
  type at91sam9_pin (line 28) | struct at91sam9_pin {
  type at91sam9_nand (line 39) | struct at91sam9_nand {
  function at91sam9_halted (line 69) | static int at91sam9_halted(struct target *target, const char *label)
  function at91sam9_init (line 84) | static int at91sam9_init(struct nand_device *nand)
  function at91sam9_enable (line 100) | static int at91sam9_enable(struct nand_device *nand)
  function at91sam9_disable (line 114) | static int at91sam9_disable(struct nand_device *nand)
  function at91sam9_command (line 129) | static int at91sam9_command(struct nand_device *nand, uint8_t command)
  function at91sam9_reset (line 148) | static int at91sam9_reset(struct nand_device *nand)
  function at91sam9_address (line 163) | static int at91sam9_address(struct nand_device *nand, uint8_t address)
  function at91sam9_read_data (line 182) | static int at91sam9_read_data(struct nand_device *nand, void *data)
  function at91sam9_write_data (line 201) | static int at91sam9_write_data(struct nand_device *nand, uint16_t data)
  function at91sam9_nand_ready (line 219) | static int at91sam9_nand_ready(struct nand_device *nand, int timeout)
  function at91sam9_read_block_data (line 249) | static int at91sam9_read_block_data(struct nand_device *nand, uint8_t *d...
  function at91sam9_write_block_data (line 273) | static int at91sam9_write_block_data(struct nand_device *nand, uint8_t *...
  function at91sam9_ecc_init (line 295) | static int at91sam9_ecc_init(struct target *target, struct at91sam9_nand...
  type nand_device (line 316) | struct nand_device
  function at91sam9_read_page (line 350) | static int at91sam9_read_page(struct nand_device *nand, uint32_t page,
  function at91sam9_write_page (line 425) | static int at91sam9_write_page(struct nand_device *nand, uint32_t page,
  function NAND_DEVICE_COMMAND_HANDLER (line 483) | NAND_DEVICE_COMMAND_HANDLER(at91sam9_nand_device_command)
  function COMMAND_HANDLER (line 532) | COMMAND_HANDLER(handle_at91sam9_cle_command)
  function COMMAND_HANDLER (line 562) | COMMAND_HANDLER(handle_at91sam9_ale_command)
  function COMMAND_HANDLER (line 590) | COMMAND_HANDLER(handle_at91sam9_rdy_busy_command)
  function COMMAND_HANDLER (line 621) | COMMAND_HANDLER(handle_at91sam9_ce_command)
  type command_registration (line 648) | struct command_registration
  type command_registration (line 682) | struct command_registration
  type nand_flash_controller (line 696) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/core.c
  type nand_device (line 18) | struct nand_device
  function nand_device_add (line 20) | void nand_device_add(struct nand_device *c)
  type nand_info (line 42) | struct nand_info
  type nand_manufacturer (line 129) | struct nand_manufacturer
  type nand_ecclayout (line 147) | struct nand_ecclayout
  type nand_device (line 166) | struct nand_device
  type nand_device (line 171) | struct nand_device
  type nand_device (line 184) | struct nand_device
  type nand_device (line 186) | struct nand_device
  function nand_build_bbt (line 215) | int nand_build_bbt(struct nand_device *nand, int first, int last)
  function nand_read_status (line 249) | int nand_read_status(struct nand_device *nand, uint8_t *status)
  function nand_poll_ready (line 271) | static int nand_poll_ready(struct nand_device *nand, int timeout)
  function nand_probe (line 291) | int nand_probe(struct nand_device *nand)
  function nand_erase (line 502) | int nand_erase(struct nand_device *nand, int first_block, int last_block)
  function nand_read_plain (line 584) | static int nand_read_plain(struct nand_device *nand,
  function nand_write_plain (line 622) | static int nand_write_plain(struct nand_device *nand,
  function nand_write_page (line 661) | int nand_write_page(struct nand_device *nand, uint32_t page,
  function nand_read_page (line 680) | int nand_read_page(struct nand_device *nand, uint32_t page,
  function nand_page_command (line 693) | int nand_page_command(struct nand_device *nand, uint32_t page,
  function nand_read_data_page (line 757) | int nand_read_data_page(struct nand_device *nand, uint8_t *data, uint32_...
  function nand_read_page_raw (line 778) | int nand_read_page_raw(struct nand_device *nand, uint32_t page,
  function nand_write_data_page (line 797) | int nand_write_data_page(struct nand_device *nand, uint8_t *data, uint32...
  function nand_write_finish (line 827) | int nand_write_finish(struct nand_device *nand)
  function nand_write_page_raw (line 855) | int nand_write_page_raw(struct nand_device *nand, uint32_t page,

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/core.h
  type nand_block (line 21) | struct nand_block {
  type nand_oobfree (line 35) | struct nand_oobfree {
  type nand_ecclayout (line 40) | struct nand_ecclayout {
  type nand_device (line 47) | struct nand_device {
  type nand_manufacturer (line 77) | struct nand_manufacturer {
  type nand_info (line 82) | struct nand_info {
  type oob_formats (line 170) | enum oob_formats {
  type nand_device (line 182) | struct nand_device
  type nand_device (line 184) | struct nand_device
  type nand_device (line 186) | struct nand_device
  type nand_device (line 189) | struct nand_device
  type nand_device (line 190) | struct nand_device
  type nand_device (line 193) | struct nand_device
  type nand_device (line 195) | struct nand_device
  type nand_device (line 197) | struct nand_device
  type nand_device (line 200) | struct nand_device
  type nand_device (line 202) | struct nand_device
  type nand_device (line 204) | struct nand_device
  type nand_device (line 206) | struct nand_device
  type command_context (line 209) | struct command_context

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/davinci.c
  type ecc (line 22) | enum ecc {
  type davinci_nand (line 28) | struct davinci_nand {
  function halted (line 58) | static int halted(struct target *target, const char *label)
  function davinci_init (line 67) | static int davinci_init(struct nand_device *nand)
  function davinci_reset (line 92) | static int davinci_reset(struct nand_device *nand)
  function davinci_nand_ready (line 97) | static int davinci_nand_ready(struct nand_device *nand, int timeout)
  function davinci_command (line 120) | static int davinci_command(struct nand_device *nand, uint8_t command)
  function davinci_address (line 132) | static int davinci_address(struct nand_device *nand, uint8_t address)
  function davinci_write_data (line 144) | static int davinci_write_data(struct nand_device *nand, uint16_t data)
  function davinci_read_data (line 156) | static int davinci_read_data(struct nand_device *nand, void *data)
  function davinci_read_block_data (line 170) | static int davinci_read_block_data(struct nand_device *nand,
  function davinci_write_block_data (line 203) | static int davinci_write_block_data(struct nand_device *nand,
  function davinci_write_page (line 239) | static int davinci_write_page(struct nand_device *nand, uint32_t page,
  function davinci_read_page (line 290) | static int davinci_read_page(struct nand_device *nand, uint32_t page,
  function davinci_write_pagecmd (line 303) | static void davinci_write_pagecmd(struct nand_device *nand, uint8_t cmd,...
  function davinci_seek_column (line 326) | static int davinci_seek_column(struct nand_device *nand, uint16_t column)
  function davinci_writepage_tail (line 347) | static int davinci_writepage_tail(struct nand_device *nand,
  function davinci_write_page_ecc1 (line 379) | static int davinci_write_page_ecc1(struct nand_device *nand, uint32_t page,
  function davinci_write_page_ecc4 (line 446) | static int davinci_write_page_ecc4(struct nand_device *nand, uint32_t page,
  function davinci_write_page_ecc4infix (line 548) | static int davinci_write_page_ecc4infix(struct nand_device *nand, uint32...
  function davinci_read_page_ecc4infix (line 603) | static int davinci_read_page_ecc4infix(struct nand_device *nand, uint32_...
  function NAND_DEVICE_COMMAND_HANDLER (line 661) | NAND_DEVICE_COMMAND_HANDLER(davinci_nand_device_command)
  type nand_flash_controller (line 765) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/driver.c
  type nand_flash_controller (line 16) | struct nand_flash_controller
  type nand_flash_controller (line 34) | struct nand_flash_controller
  type nand_flash_controller (line 37) | struct nand_flash_controller
  function nand_driver_walk (line 43) | int nand_driver_walk(nand_driver_walker_t f, void *x)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/driver.h
  type nand_device (line 13) | struct nand_device
  type nand_flash_controller (line 23) | struct nand_flash_controller {
  type nand_flash_controller (line 78) | struct nand_flash_controller
  type nand_flash_controller (line 81) | struct nand_flash_controller
  type nand_flash_controller (line 92) | struct nand_flash_controller
  type nand_flash_controller (line 93) | struct nand_flash_controller
  type nand_flash_controller (line 94) | struct nand_flash_controller
  type nand_flash_controller (line 95) | struct nand_flash_controller
  type nand_flash_controller (line 96) | struct nand_flash_controller
  type nand_flash_controller (line 97) | struct nand_flash_controller
  type nand_flash_controller (line 98) | struct nand_flash_controller
  type nand_flash_controller (line 99) | struct nand_flash_controller
  type nand_flash_controller (line 100) | struct nand_flash_controller
  type nand_flash_controller (line 101) | struct nand_flash_controller
  type nand_flash_controller (line 102) | struct nand_flash_controller
  type nand_flash_controller (line 103) | struct nand_flash_controller
  type nand_flash_controller (line 104) | struct nand_flash_controller
  type nand_flash_controller (line 105) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/ecc.c
  function nand_calculate_ecc (line 48) | int nand_calculate_ecc(struct nand_device *nand, const uint8_t *dat, uin...
  function countbits (line 101) | static inline int countbits(uint32_t b)
  function nand_correct_data (line 113) | int nand_correct_data(struct nand_device *nand, u_char *dat,

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/ecc_kw.c
  function gf_build_log_exp_table (line 39) | static void gf_build_log_exp_table(void)
  function nand_calculate_ecc_kw (line 93) | int nand_calculate_ecc_kw(struct nand_device *nand, const uint8_t *data,...

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/fileio.c
  type nand_ecclayout (line 18) | struct nand_ecclayout
  type nand_ecclayout (line 27) | struct nand_ecclayout
  function nand_fileio_init (line 40) | void nand_fileio_init(struct nand_fileio_state *state)
  function nand_fileio_start (line 46) | int nand_fileio_start(struct command_invocation *cmd,
  function nand_fileio_cleanup (line 86) | int nand_fileio_cleanup(struct nand_fileio_state *state)
  function nand_fileio_finish (line 98) | int nand_fileio_finish(struct nand_fileio_state *state)
  type nand_device (line 114) | struct nand_device
  function nand_fileio_read (line 171) | int nand_fileio_read(struct nand_device *nand, struct nand_fileio_state *s)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/fileio.h
  type nand_fileio_state (line 13) | struct nand_fileio_state {
  type nand_fileio_state (line 32) | struct nand_fileio_state
  type command_invocation (line 33) | struct command_invocation
  type nand_device (line 34) | struct nand_device
  type nand_fileio_state (line 35) | struct nand_fileio_state
  type nand_fileio_state (line 36) | struct nand_fileio_state
  type nand_fileio_state (line 37) | struct nand_fileio_state
  type nand_device (line 43) | struct nand_device
  type nand_fileio_state (line 43) | struct nand_fileio_state

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/imp.h
  type nand_device (line 13) | struct nand_device
  type nand_device (line 15) | struct nand_device
  type nand_device (line 19) | struct nand_device
  type nand_device (line 23) | struct nand_device
  type nand_device (line 24) | struct nand_device
  type nand_device (line 25) | struct nand_device

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/lpc3180.c
  type nand_device (line 19) | struct nand_device
  type nand_device (line 20) | struct nand_device
  type nand_device (line 21) | struct nand_device
  function NAND_DEVICE_COMMAND_HANDLER (line 29) | NAND_DEVICE_COMMAND_HANDLER(lpc3180_nand_device_command)
  function lpc3180_pll (line 55) | static int lpc3180_pll(int fclkin, uint32_t pll_ctrl)
  function lpc3180_cycle_time (line 83) | static float lpc3180_cycle_time(struct nand_device *nand)
  function lpc3180_init (line 127) | static int lpc3180_init(struct nand_device *nand)
  function lpc3180_reset (line 260) | static int lpc3180_reset(struct nand_device *nand)
  function lpc3180_command (line 294) | static int lpc3180_command(struct nand_device *nand, uint8_t command)
  function lpc3180_address (line 318) | static int lpc3180_address(struct nand_device *nand, uint8_t address)
  function lpc3180_write_data (line 342) | static int lpc3180_write_data(struct nand_device *nand, uint16_t data)
  function lpc3180_read_data (line 366) | static int lpc3180_read_data(struct nand_device *nand, void *data)
  function lpc3180_write_page (line 412) | static int lpc3180_write_page(struct nand_device *nand,
  function lpc3180_read_page (line 796) | static int lpc3180_read_page(struct nand_device *nand,
  function lpc3180_controller_ready (line 1150) | static int lpc3180_controller_ready(struct nand_device *nand, int timeout)
  function lpc3180_nand_ready (line 1193) | static int lpc3180_nand_ready(struct nand_device *nand, int timeout)
  function lpc3180_tc_ready (line 1236) | static int lpc3180_tc_ready(struct nand_device *nand, int timeout)
  function COMMAND_HANDLER (line 1268) | COMMAND_HANDLER(handle_lpc3180_select_command)
  type command_registration (line 1313) | struct command_registration
  type command_registration (line 1324) | struct command_registration
  type nand_flash_controller (line 1335) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/lpc3180.h
  type lpc3180_selected_controller (line 11) | enum lpc3180_selected_controller {
  type lpc3180_nand_controller (line 17) | struct lpc3180_nand_controller {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/lpc32xx.c
  type nand_device (line 24) | struct nand_device
  type nand_device (line 25) | struct nand_device
  type nand_device (line 26) | struct nand_device
  type dmac_ll (line 50) | struct dmac_ll {
  type dmac_ll (line 57) | struct dmac_ll
  function NAND_DEVICE_COMMAND_HANDLER (line 61) | NAND_DEVICE_COMMAND_HANDLER(lpc32xx_nand_device_command)
  function lpc32xx_pll (line 88) | static int lpc32xx_pll(int fclkin, uint32_t pll_ctrl)
  function lpc32xx_cycle_time (line 116) | static float lpc32xx_cycle_time(struct nand_device *nand)
  function lpc32xx_init (line 177) | static int lpc32xx_init(struct nand_device *nand)
  function lpc32xx_reset (line 379) | static int lpc32xx_reset(struct nand_device *nand)
  function lpc32xx_command (line 425) | static int lpc32xx_command(struct nand_device *nand, uint8_t command)
  function lpc32xx_address (line 459) | static int lpc32xx_address(struct nand_device *nand, uint8_t address)
  function lpc32xx_write_data (line 493) | static int lpc32xx_write_data(struct nand_device *nand, uint16_t data)
  function lpc32xx_read_data (line 527) | static int lpc32xx_read_data(struct nand_device *nand, void *data)
  function lpc32xx_write_page_mlc (line 577) | static int lpc32xx_write_page_mlc(struct nand_device *nand, uint32_t page,
  function lpc32xx_make_dma_list (line 736) | static int lpc32xx_make_dma_list(uint32_t target_mem_base, uint32_t page...
  function lpc32xx_start_slc_dma (line 883) | static int lpc32xx_start_slc_dma(struct nand_device *nand, uint32_t count,
  function lpc32xx_dma_ready (line 951) | static int lpc32xx_dma_ready(struct nand_device *nand, int timeout)
  function slc_ecc_copy_to_buffer (line 991) | static uint32_t slc_ecc_copy_to_buffer(uint8_t *spare,
  function lpc32xx_dump_oob (line 1005) | static void lpc32xx_dump_oob(uint8_t *oob, uint32_t oob_size)
  function lpc32xx_write_page_slc (line 1018) | static int lpc32xx_write_page_slc(struct nand_device *nand,
  function lpc32xx_write_page (line 1209) | static int lpc32xx_write_page(struct nand_device *nand, uint32_t page,
  function lpc32xx_read_page_mlc (line 1273) | static int lpc32xx_read_page_mlc(struct nand_device *nand, uint32_t page,
  function lpc32xx_read_page_slc (line 1429) | static int lpc32xx_read_page_slc(struct nand_device *nand,
  function lpc32xx_read_page (line 1560) | static int lpc32xx_read_page(struct nand_device *nand, uint32_t page,
  function lpc32xx_controller_ready (line 1603) | static int lpc32xx_controller_ready(struct nand_device *nand, int timeout)
  function lpc32xx_nand_ready (line 1656) | static int lpc32xx_nand_ready(struct nand_device *nand, int timeout)
  function lpc32xx_tc_ready (line 1710) | static int lpc32xx_tc_ready(struct nand_device *nand, int timeout)
  function COMMAND_HANDLER (line 1736) | COMMAND_HANDLER(handle_lpc32xx_select_command)
  type command_registration (line 1774) | struct command_registration
  type command_registration (line 1784) | struct command_registration
  type nand_flash_controller (line 1795) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/lpc32xx.h
  type lpc32xx_selected_controller (line 11) | enum lpc32xx_selected_controller {
  type lpc32xx_nand_controller (line 17) | struct lpc32xx_nand_controller {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/mx3.c
  type target (line 39) | struct target
  type nand_device (line 41) | struct nand_device
  type target (line 42) | struct target
  type target (line 43) | struct target
  type target (line 45) | struct target
  type nand_device (line 46) | struct nand_device
  type nand_device (line 47) | struct nand_device
  type nand_device (line 49) | struct nand_device
  type nand_device (line 50) | struct nand_device
  function NAND_DEVICE_COMMAND_HANDLER (line 52) | NAND_DEVICE_COMMAND_HANDLER(imx31_nand_device_command)
  function imx31_init (line 85) | static int imx31_init(struct nand_device *nand)
  function imx31_read_data (line 194) | static int imx31_read_data(struct nand_device *nand, void *data)
  function imx31_write_data (line 225) | static int imx31_write_data(struct nand_device *nand, uint16_t data)
  function imx31_reset (line 231) | static int imx31_reset(struct nand_device *nand)
  function imx31_command (line 244) | static int imx31_command(struct nand_device *nand, uint8_t command)
  function imx31_address (line 312) | static int imx31_address(struct nand_device *nand, uint8_t address)
  function imx31_nand_ready (line 339) | static int imx31_nand_ready(struct nand_device *nand, int tout)
  function imx31_write_page (line 363) | static int imx31_write_page(struct nand_device *nand, uint32_t page,
  function imx31_read_page (line 452) | static int imx31_read_page(struct nand_device *nand, uint32_t page,
  function test_iomux_settings (line 505) | static int test_iomux_settings(struct target *target, uint32_t address,
  function initialize_nf_controller (line 517) | static int initialize_nf_controller(struct nand_device *nand)
  function get_next_byte_from_sram_buffer (line 565) | static int get_next_byte_from_sram_buffer(struct target *target, uint8_t...
  function get_next_halfword_from_sram_buffer (line 595) | static int get_next_halfword_from_sram_buffer(struct target *target,
  function poll_for_complete_op (line 609) | static int poll_for_complete_op(struct target *target, const char *text)
  function validate_target_state (line 625) | static int validate_target_state(struct nand_device *nand)
  function do_data_output (line 645) | static int do_data_output(struct nand_device *nand)
  type nand_flash_controller (line 694) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/mx3.h
  type mx_dataout_type (line 78) | enum mx_dataout_type {
  type mx_nf_finalize_action (line 83) | enum mx_nf_finalize_action {
  type mx3_nf_flags (line 88) | struct mx3_nf_flags {
  type mx3_nf_controller (line 95) | struct mx3_nf_controller {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/mxc.c
  type nand_device (line 64) | struct nand_device
  type nand_device (line 65) | struct nand_device
  type nand_device (line 66) | struct nand_device
  type nand_device (line 67) | struct nand_device
  type nand_device (line 68) | struct nand_device
  type nand_device (line 69) | struct nand_device
  type nand_device (line 70) | struct nand_device
  type nand_device (line 72) | struct nand_device
  type nand_device (line 73) | struct nand_device
  function NAND_DEVICE_COMMAND_HANDLER (line 75) | NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command)
  function COMMAND_HANDLER (line 139) | COMMAND_HANDLER(handle_mxc_biswap_command)
  type command_registration (line 168) | struct command_registration
  type command_registration (line 180) | struct command_registration
  function mxc_init (line 191) | static int mxc_init(struct nand_device *nand)
  function mxc_read_data (line 279) | static int mxc_read_data(struct nand_device *nand, void *data)
  function mxc_write_data (line 308) | static int mxc_write_data(struct nand_device *nand, uint16_t data)
  function mxc_reset (line 314) | static int mxc_reset(struct nand_device *nand)
  function mxc_command (line 327) | static int mxc_command(struct nand_device *nand, uint8_t command)
  function mxc_address (line 399) | static int mxc_address(struct nand_device *nand, uint8_t address)
  function mxc_nand_ready (line 424) | static int mxc_nand_ready(struct nand_device *nand, int tout)
  function mxc_write_page (line 448) | static int mxc_write_page(struct nand_device *nand, uint32_t page,
  function mxc_read_page (line 577) | static int mxc_read_page(struct nand_device *nand, uint32_t page,
  function align_address_v2 (line 683) | static uint32_t align_address_v2(struct nand_device *nand, uint32_t addr)
  function initialize_nf_controller (line 695) | static int initialize_nf_controller(struct nand_device *nand)
  function get_next_byte_from_sram_buffer (line 768) | static int get_next_byte_from_sram_buffer(struct nand_device *nand, uint...
  function get_next_halfword_from_sram_buffer (line 804) | static int get_next_halfword_from_sram_buffer(struct nand_device *nand, ...
  function poll_for_complete_op (line 823) | static int poll_for_complete_op(struct nand_device *nand, const char *text)
  function validate_target_state (line 832) | static int validate_target_state(struct nand_device *nand)
  function ecc_status_v1 (line 852) | static int ecc_status_v1(struct nand_device *nand)
  function ecc_status_v2 (line 878) | static int ecc_status_v2(struct nand_device *nand)
  function do_data_output (line 901) | static int do_data_output(struct nand_device *nand)
  type nand_flash_controller (line 936) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/mxc.h
  type mxc_version (line 121) | enum mxc_version {
  type mxc_dataout_type (line 129) | enum mxc_dataout_type {
  type mxc_nf_finalize_action (line 135) | enum mxc_nf_finalize_action {
  type mxc_nf_flags (line 140) | struct mxc_nf_flags {
  type mxc_nf_controller (line 148) | struct mxc_nf_controller {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/nonce.c
  function nonce_nand_command (line 14) | static int nonce_nand_command(struct nand_device *nand, uint8_t command)
  function nonce_nand_address (line 18) | static int nonce_nand_address(struct nand_device *nand, uint8_t address)
  function nonce_nand_read (line 22) | static int nonce_nand_read(struct nand_device *nand, void *data)
  function nonce_nand_write (line 26) | static int nonce_nand_write(struct nand_device *nand, uint16_t data)
  function nonce_nand_fast_block_write (line 30) | static int nonce_nand_fast_block_write(struct nand_device *nand,
  function nonce_nand_reset (line 36) | static int nonce_nand_reset(struct nand_device *nand)
  function NAND_DEVICE_COMMAND_HANDLER (line 41) | NAND_DEVICE_COMMAND_HANDLER(nonce_nand_device_command)
  function nonce_nand_init (line 46) | static int nonce_nand_init(struct nand_device *nand)
  type nand_flash_controller (line 51) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/nuc910.c
  type nuc910_nand_controller (line 21) | struct nuc910_nand_controller {
  function validate_target_state (line 25) | static int validate_target_state(struct nand_device *nand)
  function nuc910_nand_command (line 37) | static int nuc910_nand_command(struct nand_device *nand, uint8_t command)
  function nuc910_nand_address (line 50) | static int nuc910_nand_address(struct nand_device *nand, uint8_t address)
  function nuc910_nand_read (line 63) | static int nuc910_nand_read(struct nand_device *nand, void *data)
  function nuc910_nand_write (line 76) | static int nuc910_nand_write(struct nand_device *nand, uint16_t data)
  function nuc910_nand_read_block_data (line 89) | static int nuc910_nand_read_block_data(struct nand_device *nand,
  function nuc910_nand_write_block_data (line 113) | static int nuc910_nand_write_block_data(struct nand_device *nand,
  function nuc910_nand_reset (line 137) | static int nuc910_nand_reset(struct nand_device *nand)
  function nuc910_nand_ready (line 142) | static int nuc910_nand_ready(struct nand_device *nand, int timeout)
  function NAND_DEVICE_COMMAND_HANDLER (line 157) | NAND_DEVICE_COMMAND_HANDLER(nuc910_nand_device_command)
  function nuc910_nand_init (line 171) | static int nuc910_nand_init(struct nand_device *nand)
  type nand_flash_controller (line 204) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/orion.c
  type orion_nand_controller (line 20) | struct orion_nand_controller {
  function orion_nand_command (line 36) | static int orion_nand_command(struct nand_device *nand, uint8_t command)
  function orion_nand_address (line 46) | static int orion_nand_address(struct nand_device *nand, uint8_t address)
  function orion_nand_read (line 56) | static int orion_nand_read(struct nand_device *nand, void *data)
  function orion_nand_write (line 66) | static int orion_nand_write(struct nand_device *nand, uint16_t data)
  function orion_nand_slow_block_write (line 76) | static int orion_nand_slow_block_write(struct nand_device *nand, uint8_t...
  function orion_nand_fast_block_write (line 83) | static int orion_nand_fast_block_write(struct nand_device *nand, uint8_t...
  function orion_nand_reset (line 97) | static int orion_nand_reset(struct nand_device *nand)
  function NAND_DEVICE_COMMAND_HANDLER (line 102) | NAND_DEVICE_COMMAND_HANDLER(orion_nand_device_command)
  function orion_nand_init (line 134) | static int orion_nand_init(struct nand_device *nand)
  type nand_flash_controller (line 139) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c2410.c
  function NAND_DEVICE_COMMAND_HANDLER (line 20) | NAND_DEVICE_COMMAND_HANDLER(s3c2410_nand_device_command)
  function s3c2410_init (line 34) | static int s3c2410_init(struct nand_device *nand)
  function s3c2410_write_data (line 45) | static int s3c2410_write_data(struct nand_device *nand, uint16_t data)
  function s3c2410_read_data (line 58) | static int s3c2410_read_data(struct nand_device *nand, void *data)
  function s3c2410_nand_ready (line 71) | static int s3c2410_nand_ready(struct nand_device *nand, int timeout)
  type nand_flash_controller (line 93) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c2412.c
  function NAND_DEVICE_COMMAND_HANDLER (line 20) | NAND_DEVICE_COMMAND_HANDLER(s3c2412_nand_device_command)
  function s3c2412_init (line 34) | static int s3c2412_init(struct nand_device *nand)
  type nand_flash_controller (line 50) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c2440.c
  function NAND_DEVICE_COMMAND_HANDLER (line 20) | NAND_DEVICE_COMMAND_HANDLER(s3c2440_nand_device_command)
  function s3c2440_init (line 34) | static int s3c2440_init(struct nand_device *nand)
  function s3c2440_nand_ready (line 49) | int s3c2440_nand_ready(struct nand_device *nand, int timeout)
  function s3c2440_read_block_data (line 75) | int s3c2440_read_block_data(struct nand_device *nand, uint8_t *data, int...
  function s3c2440_write_block_data (line 111) | int s3c2440_write_block_data(struct nand_device *nand, uint8_t *data, in...
  type nand_flash_controller (line 141) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c2443.c
  function NAND_DEVICE_COMMAND_HANDLER (line 20) | NAND_DEVICE_COMMAND_HANDLER(s3c2443_nand_device_command)
  function s3c2443_init (line 34) | static int s3c2443_init(struct nand_device *nand)
  type nand_flash_controller (line 50) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c24xx.c
  type s3c24xx_nand_controller (line 24) | struct s3c24xx_nand_controller
  type s3c24xx_nand_controller (line 25) | struct s3c24xx_nand_controller
  function s3c24xx_reset (line 37) | int s3c24xx_reset(struct nand_device *nand)
  function s3c24xx_command (line 52) | int s3c24xx_command(struct nand_device *nand, uint8_t command)
  function s3c24xx_address (line 66) | int s3c24xx_address(struct nand_device *nand, uint8_t address)
  function s3c24xx_write_data (line 80) | int s3c24xx_write_data(struct nand_device *nand, uint16_t data)
  function s3c24xx_read_data (line 94) | int s3c24xx_read_data(struct nand_device *nand, void *data)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c24xx.h
  type s3c24xx_nand_controller (line 21) | struct s3c24xx_nand_controller {
  type nand_device (line 47) | struct nand_device
  type nand_device (line 49) | struct nand_device
  type nand_device (line 50) | struct nand_device
  type nand_device (line 52) | struct nand_device
  type nand_device (line 53) | struct nand_device
  type nand_device (line 60) | struct nand_device
  type nand_device (line 62) | struct nand_device
  type nand_device (line 64) | struct nand_device

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/s3c6400.c
  function NAND_DEVICE_COMMAND_HANDLER (line 17) | NAND_DEVICE_COMMAND_HANDLER(s3c6400_nand_device_command)
  function s3c6400_init (line 31) | static int s3c6400_init(struct nand_device *nand)
  type nand_flash_controller (line 47) | struct nand_flash_controller

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nand/tcl.c
  function COMMAND_HANDLER (line 20) | COMMAND_HANDLER(handle_nand_list_command)
  function COMMAND_HANDLER (line 45) | COMMAND_HANDLER(handle_nand_info_command)
  function COMMAND_HANDLER (line 124) | COMMAND_HANDLER(handle_nand_probe_command)
  function COMMAND_HANDLER (line 143) | COMMAND_HANDLER(handle_nand_erase_command)
  function COMMAND_HANDLER (line 187) | COMMAND_HANDLER(handle_nand_check_bad_blocks_command)
  function COMMAND_HANDLER (line 229) | COMMAND_HANDLER(handle_nand_write_command)
  function COMMAND_HANDLER (line 269) | COMMAND_HANDLER(handle_nand_verify_command)
  function COMMAND_HANDLER (line 328) | COMMAND_HANDLER(handle_nand_dump_command)
  function COMMAND_HANDLER (line 370) | COMMAND_HANDLER(handle_nand_raw_access_command)
  type command_registration (line 394) | struct command_registration
  function nand_init (line 464) | static int nand_init(struct command_context *cmd_ctx)
  function COMMAND_HANDLER (line 472) | COMMAND_HANDLER(handle_nand_init_command)
  function nand_list_walker (line 488) | static int nand_list_walker(struct nand_flash_controller *c, void *x)
  function COMMAND_HANDLER (line 495) | COMMAND_HANDLER(handle_nand_list_drivers)
  type target (line 505) | struct target
  type nand_device (line 521) | struct nand_device
  function COMMAND_HANDLER (line 556) | COMMAND_HANDLER(handle_nand_device_command)
  type command_registration (line 575) | struct command_registration
  type command_registration (line 600) | struct command_registration
  function nand_register_commands (line 611) | int nand_register_commands(struct command_context *cmd_ctx)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/aduc702x.c
  type flash_bank (line 19) | struct flash_bank
  type target (line 20) | struct target
  type target (line 21) | struct target
  function FLASH_BANK_COMMAND_HANDLER (line 35) | FLASH_BANK_COMMAND_HANDLER(aduc702x_flash_bank_command)
  function aduc702x_build_sector_list (line 45) | static int aduc702x_build_sector_list(struct flash_bank *bank)
  function aduc702x_erase (line 65) | static int aduc702x_erase(struct flash_bank *bank, unsigned int first,
  function aduc702x_write_block (line 121) | static int aduc702x_write_block(struct flash_bank *bank,
  function aduc702x_write_single (line 262) | static int aduc702x_write_single(struct flash_bank *bank,
  function aduc702x_write (line 304) | static int aduc702x_write(struct flash_bank *bank, const uint8_t *buffer...
  function aduc702x_probe (line 327) | static int aduc702x_probe(struct flash_bank *bank)
  function aduc702x_set_write_enable (line 334) | static int aduc702x_set_write_enable(struct target *target, int enable)
  function aduc702x_check_flash_completion (line 347) | static int aduc702x_check_flash_completion(struct target *target, unsign...
  type flash_driver (line 370) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/aducm360.c
  type flash_bank (line 37) | struct flash_bank
  type target (line 38) | struct target
  type target (line 39) | struct target
  function FLASH_BANK_COMMAND_HANDLER (line 62) | FLASH_BANK_COMMAND_HANDLER(aducm360_flash_bank_command)
  function aducm360_build_sector_list (line 75) | static int aducm360_build_sector_list(struct flash_bank *bank)
  function aducm360_mass_erase (line 94) | static int aducm360_mass_erase(struct target *target)
  function aducm360_page_erase (line 123) | static int aducm360_page_erase(struct target *target, uint32_t padd)
  function aducm360_erase (line 155) | static int aducm360_erase(struct flash_bank *bank, unsigned int first,
  function aducm360_write_block_sync (line 180) | static int aducm360_write_block_sync(
  function aducm360_write_block_async (line 300) | static int aducm360_write_block_async(
  function aducm360_write_block (line 416) | static int aducm360_write_block(struct flash_bank *bank,
  function aducm360_write_modified (line 437) | static int aducm360_write_modified(struct flash_bank *bank,
  function aducm360_write (line 471) | static int aducm360_write(struct flash_bank *bank, const uint8_t *buffer...
  function aducm360_probe (line 494) | static int aducm360_probe(struct flash_bank *bank)
  function aducm360_set_write_enable (line 502) | static int aducm360_set_write_enable(struct target *target, int enable)
  function aducm360_check_flash_completion (line 523) | static int aducm360_check_flash_completion(struct target *target, unsign...
  type flash_driver (line 544) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/ambiqmicro.c
  type ambiqmicro_flash_bank (line 67) | struct ambiqmicro_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 120) | FLASH_BANK_COMMAND_HANDLER(ambiqmicro_flash_bank_command)
  function get_ambiqmicro_info (line 139) | static int get_ambiqmicro_info(struct flash_bank *bank, struct command_i...
  function ambiqmicro_read_part_info (line 169) | static int ambiqmicro_read_part_info(struct flash_bank *bank)
  function ambiqmicro_protect_check (line 246) | static int ambiqmicro_protect_check(struct flash_bank *bank)
  function check_flash_status (line 264) | static int check_flash_status(struct target *target, uint32_t address)
  function ambiqmicro_exec_command (line 283) | static int ambiqmicro_exec_command(struct target *target,
  function ambiqmicro_mass_erase (line 330) | static int ambiqmicro_mass_erase(struct flash_bank *bank)
  function ambiqmicro_erase (line 400) | static int ambiqmicro_erase(struct flash_bank *bank, unsigned int first,
  function ambiqmicro_protect (line 501) | static int ambiqmicro_protect(struct flash_bank *bank, int set,
  function ambiqmicro_write_block (line 520) | static int ambiqmicro_write_block(struct flash_bank *bank,
  function ambiqmicro_write (line 611) | static int ambiqmicro_write(struct flash_bank *bank, const uint8_t *buffer,
  function ambiqmicro_probe (line 624) | static int ambiqmicro_probe(struct flash_bank *bank)
  function ambiqmicro_otp_program (line 666) | static int ambiqmicro_otp_program(struct flash_bank *bank,
  function COMMAND_HANDLER (line 745) | COMMAND_HANDLER(ambiqmicro_handle_mass_erase_command)
  function COMMAND_HANDLER (line 763) | COMMAND_HANDLER(ambiqmicro_handle_page_erase_command)
  function COMMAND_HANDLER (line 791) | COMMAND_HANDLER(ambiqmicro_handle_program_otp_command)
  type command_registration (line 817) | struct command_registration
  type command_registration (line 842) | struct command_registration
  type flash_driver (line 853) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/at91sam3.c
  function _tomhz (line 70) | static float _tomhz(uint32_t freq_hz)
  type sam3_cfg (line 79) | struct sam3_cfg {
  type sam3_bank_private (line 145) | struct sam3_bank_private {
  type sam3_chip_details (line 168) | struct sam3_chip_details {
  type sam3_chip (line 190) | struct sam3_chip {
  type sam3_reg_list (line 201) | struct sam3_reg_list {
  type sam3_chip (line 206) | struct sam3_chip
  type sam3_chip (line 208) | struct sam3_chip
  type command_invocation (line 208) | struct command_invocation
  type target (line 210) | struct target
  type sam3_chip (line 211) | struct sam3_chip
  type sam3_chip_details (line 237) | struct sam3_chip_details
  function efc_get_status (line 1998) | static int efc_get_status(struct sam3_bank_private *private, uint32_t *v)
  function efc_get_result (line 2018) | static int efc_get_result(struct sam3_bank_private *private, uint32_t *v)
  function efc_start_command (line 2031) | static int efc_start_command(struct sam3_bank_private *private,
  function efc_perform_command (line 2126) | static int efc_perform_command(struct sam3_bank_private *private,
  function flashd_read_uid (line 2170) | static int flashd_read_uid(struct sam3_bank_private *private)
  function flashd_erase_entire_bank (line 2210) | static int flashd_erase_entire_bank(struct sam3_bank_private *private)
  function flashd_get_gpnvm (line 2223) | static int flashd_get_gpnvm(struct sam3_bank_private *private, unsigned ...
  function flashd_clr_gpnvm (line 2264) | static int flashd_clr_gpnvm(struct sam3_bank_private *private, unsigned ...
  function flashd_set_gpnvm (line 2296) | static int flashd_set_gpnvm(struct sam3_bank_private *private, unsigned ...
  function flashd_get_lock_bits (line 2330) | static int flashd_get_lock_bits(struct sam3_bank_private *private, uint3...
  function flashd_unlock (line 2348) | static int flashd_unlock(struct sam3_bank_private *private,
  function flashd_lock (line 2378) | static int flashd_lock(struct sam3_bank_private *private,
  function sam3_reg_fieldname (line 2405) | static uint32_t sam3_reg_fieldname(struct sam3_chip *chip,
  type archnames (line 2494) | struct archnames { unsigned value; const char *name; }
  function sam3_explain_ckgr_mor (line 2557) | static void sam3_explain_ckgr_mor(struct sam3_chip *chip)
  function sam3_explain_chipid_cidr (line 2601) | static void sam3_explain_chipid_cidr(struct sam3_chip *chip)
  function sam3_explain_ckgr_mcfr (line 2640) | static void sam3_explain_ckgr_mcfr(struct sam3_chip *chip)
  function sam3_explain_ckgr_plla (line 2658) | static void sam3_explain_ckgr_plla(struct sam3_chip *chip)
  function sam3_explain_mckr (line 2678) | static void sam3_explain_mckr(struct sam3_chip *chip)
  type sam3_chip (line 2765) | struct sam3_chip
  type target (line 2765) | struct target
  type sam3_chip (line 2767) | struct sam3_chip
  type sam3_cfg (line 2783) | struct sam3_cfg
  type sam3_reg_list (line 2783) | struct sam3_reg_list
  type sam3_reg_list (line 2799) | struct sam3_reg_list
  type sam3_bank_private (line 2823) | struct sam3_bank_private
  type flash_bank (line 2823) | struct flash_bank
  type sam3_reg_list (line 2832) | struct sam3_reg_list
  type sam3_chip (line 2832) | struct sam3_chip
  type sam3_reg_list (line 2834) | struct sam3_reg_list
  function sam3_read_this_reg (line 2859) | static int sam3_read_this_reg(struct sam3_chip *chip, uint32_t *goes_here)
  function sam3_read_all_regs (line 2876) | static int sam3_read_all_regs(struct sam3_chip *chip)
  function sam3_get_info (line 2915) | static int sam3_get_info(struct sam3_chip *chip)
  function sam3_protect_check (line 2950) | static int sam3_protect_check(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 2983) | FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command)
  function sam3_free_driver_priv (line 3058) | static void sam3_free_driver_priv(struct flash_bank *bank)
  function sam3_get_details (line 3069) | static int sam3_get_details(struct sam3_bank_private *private)
  function _sam3_probe (line 3128) | static int _sam3_probe(struct flash_bank *bank, int noise)
  function sam3_probe (line 3200) | static int sam3_probe(struct flash_bank *bank)
  function sam3_auto_probe (line 3205) | static int sam3_auto_probe(struct flash_bank *bank)
  function sam3_erase (line 3210) | static int sam3_erase(struct flash_bank *bank, unsigned int first,
  function sam3_protect (line 3241) | static int sam3_protect(struct flash_bank *bank, int set, unsigned int f...
  function sam3_page_read (line 3267) | static int sam3_page_read(struct sam3_bank_private *private, unsigned pa...
  function sam3_page_write (line 3286) | static int sam3_page_write(struct sam3_bank_private *private, unsigned p...
  function sam3_write (line 3344) | static int sam3_write(struct flash_bank *bank,
  function COMMAND_HANDLER (line 3493) | COMMAND_HANDLER(sam3_handle_info_command)
  function COMMAND_HANDLER (line 3550) | COMMAND_HANDLER(sam3_handle_gpnvm_command)
  function COMMAND_HANDLER (line 3635) | COMMAND_HANDLER(sam3_handle_slowclk_command)
  type command_registration (line 3671) | struct command_registration
  type command_registration (line 3699) | struct command_registration
  type flash_driver (line 3710) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/at91sam4.c
  function _tomhz (line 65) | static float _tomhz(uint32_t freq_hz)
  type sam4_cfg (line 74) | struct sam4_cfg {
  type sam4_bank_private (line 125) | struct sam4_bank_private {
  type sam4_chip_details (line 148) | struct sam4_chip_details {
  type sam4_chip (line 170) | struct sam4_chip {
  type sam4_reg_list (line 181) | struct sam4_reg_list {
  type sam4_chip (line 186) | struct sam4_chip
  type sam4_chip (line 188) | struct sam4_chip
  type command_invocation (line 188) | struct command_invocation
  type target (line 190) | struct target
  type sam4_chip (line 191) | struct sam4_chip
  type sam4_chip_details (line 222) | struct sam4_chip_details
  function efc_get_status (line 1448) | static int efc_get_status(struct sam4_bank_private *private, uint32_t *v)
  function efc_get_result (line 1468) | static int efc_get_result(struct sam4_bank_private *private, uint32_t *v)
  function efc_start_command (line 1481) | static int efc_start_command(struct sam4_bank_private *private,
  function efc_perform_command (line 1576) | static int efc_perform_command(struct sam4_bank_private *private,
  function flashd_read_uid (line 1620) | static int flashd_read_uid(struct sam4_bank_private *private)
  function flashd_erase_entire_bank (line 1660) | static int flashd_erase_entire_bank(struct sam4_bank_private *private)
  function flashd_erase_pages (line 1673) | static int flashd_erase_pages(struct sam4_bank_private *private,
  function flashd_get_gpnvm (line 1719) | static int flashd_get_gpnvm(struct sam4_bank_private *private, unsigned ...
  function flashd_clr_gpnvm (line 1760) | static int flashd_clr_gpnvm(struct sam4_bank_private *private, unsigned ...
  function flashd_set_gpnvm (line 1792) | static int flashd_set_gpnvm(struct sam4_bank_private *private, unsigned ...
  function flashd_get_lock_bits (line 1826) | static int flashd_get_lock_bits(struct sam4_bank_private *private, uint3...
  function flashd_unlock (line 1848) | static int flashd_unlock(struct sam4_bank_private *private,
  function flashd_lock (line 1878) | static int flashd_lock(struct sam4_bank_private *private,
  function sam4_reg_fieldname (line 1905) | static uint32_t sam4_reg_fieldname(struct sam4_chip *chip,
  type archnames (line 1994) | struct archnames { unsigned value; const char *name; }
  function sam4_explain_ckgr_mor (line 2066) | static void sam4_explain_ckgr_mor(struct sam4_chip *chip)
  function sam4_explain_chipid_cidr (line 2110) | static void sam4_explain_chipid_cidr(struct sam4_chip *chip)
  function sam4_explain_ckgr_mcfr (line 2149) | static void sam4_explain_ckgr_mcfr(struct sam4_chip *chip)
  function sam4_explain_ckgr_plla (line 2167) | static void sam4_explain_ckgr_plla(struct sam4_chip *chip)
  function sam4_explain_mckr (line 2187) | static void sam4_explain_mckr(struct sam4_chip *chip)
  type sam4_chip (line 2274) | struct sam4_chip
  type target (line 2274) | struct target
  type sam4_chip (line 2276) | struct sam4_chip
  type sam4_cfg (line 2292) | struct sam4_cfg
  type sam4_reg_list (line 2292) | struct sam4_reg_list
  type sam4_reg_list (line 2308) | struct sam4_reg_list
  type sam4_bank_private (line 2330) | struct sam4_bank_private
  type flash_bank (line 2330) | struct flash_bank
  type sam4_reg_list (line 2339) | struct sam4_reg_list
  type sam4_chip (line 2339) | struct sam4_chip
  type sam4_reg_list (line 2341) | struct sam4_reg_list
  function sam4_read_this_reg (line 2366) | static int sam4_read_this_reg(struct sam4_chip *chip, uint32_t *goes_here)
  function sam4_read_all_regs (line 2383) | static int sam4_read_all_regs(struct sam4_chip *chip)
  function sam4_get_info (line 2403) | static int sam4_get_info(struct sam4_chip *chip)
  function sam4_protect_check (line 2443) | static int sam4_protect_check(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 2476) | FLASH_BANK_COMMAND_HANDLER(sam4_flash_bank_command)
  function sam4_free_driver_priv (line 2544) | static void sam4_free_driver_priv(struct flash_bank *bank)
  function sam4_get_details (line 2555) | static int sam4_get_details(struct sam4_bank_private *private)
  function sam4_info (line 2616) | static int sam4_info(struct flash_bank *bank, struct command_invocation ...
  function sam4_probe (line 2634) | static int sam4_probe(struct flash_bank *bank)
  function sam4_auto_probe (line 2709) | static int sam4_auto_probe(struct flash_bank *bank)
  function sam4_erase (line 2720) | static int sam4_erase(struct flash_bank *bank, unsigned int first,
  function sam4_protect (line 2773) | static int sam4_protect(struct flash_bank *bank, int set, unsigned int f...
  function sam4_page_read (line 2799) | static int sam4_page_read(struct sam4_bank_private *private, unsigned pa...
  function sam4_set_wait (line 2818) | static int sam4_set_wait(struct sam4_bank_private *private)
  function sam4_page_write (line 2844) | static int sam4_page_write(struct sam4_bank_private *private, unsigned p...
  function sam4_write (line 2888) | static int sam4_write(struct flash_bank *bank,
  function COMMAND_HANDLER (line 3041) | COMMAND_HANDLER(sam4_handle_info_command)
  function COMMAND_HANDLER (line 3098) | COMMAND_HANDLER(sam4_handle_gpnvm_command)
  function COMMAND_HANDLER (line 3183) | COMMAND_HANDLER(sam4_handle_slowclk_command)
  type command_registration (line 3219) | struct command_registration
  type command_registration (line 3247) | struct command_registration
  type flash_driver (line 3258) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/at91sam4l.c
  type sam4l_chip_info (line 76) | struct sam4l_chip_info {
  type sam4l_chip_info (line 83) | struct sam4l_chip_info
  type sam4l_info (line 110) | struct sam4l_info {
  function sam4l_flash_wait_until_ready (line 125) | static int sam4l_flash_wait_until_ready(struct target *target)
  function sam4l_flash_check_error (line 139) | static int sam4l_flash_check_error(struct target *target, uint32_t *err)
  function sam4l_flash_command (line 152) | static int sam4l_flash_command(struct target *target, uint8_t cmd, int p...
  function FLASH_BANK_COMMAND_HANDLER (line 193) | FLASH_BANK_COMMAND_HANDLER(sam4l_flash_bank_command)
  type sam4l_chip_info (line 218) | struct sam4l_chip_info
  function sam4l_check_page_erased (line 232) | static int sam4l_check_page_erased(struct flash_bank *bank, uint32_t pn,
  function sam4l_probe (line 258) | static int sam4l_probe(struct flash_bank *bank)
  function sam4l_protect_check (line 346) | static int sam4l_protect_check(struct flash_bank *bank)
  function sam4l_protect (line 374) | static int sam4l_protect(struct flash_bank *bank, int set, unsigned int ...
  function sam4l_erase (line 414) | static int sam4l_erase(struct flash_bank *bank, unsigned int first,
  function sam4l_write_page (line 481) | static int sam4l_write_page(struct sam4l_info *chip, struct target *target,
  function sam4l_write_page_partial (line 515) | static int sam4l_write_page_partial(struct sam4l_info *chip,
  function sam4l_write (line 547) | static int sam4l_write(struct flash_bank *bank, const uint8_t *buffer,
  function COMMAND_HANDLER (line 622) | COMMAND_HANDLER(sam4l_handle_reset_deassert)
  type command_registration (line 656) | struct command_registration
  type command_registration (line 667) | struct command_registration
  type flash_driver (line 678) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/at91sam7.c
  type flash_bank (line 87) | struct flash_bank
  type flash_bank (line 88) | struct flash_bank
  type target (line 91) | struct target
  type flash_bank (line 92) | struct flash_bank
  type flash_bank (line 93) | struct flash_bank
  type flash_bank (line 94) | struct flash_bank
  type at91sam7_flash_bank (line 104) | struct at91sam7_flash_bank {
  function at91sam7_get_flash_status (line 168) | static uint32_t at91sam7_get_flash_status(struct target *target, int ban...
  function at91sam7_read_clock_info (line 177) | static void at91sam7_read_clock_info(struct flash_bank *bank)
  function at91sam7_set_flash_mode (line 247) | static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode)
  function at91sam7_wait_status_busy (line 288) | static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint3...
  function at91sam7_flash_command (line 314) | static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, ...
  function at91sam7_read_part_info (line 341) | static int at91sam7_read_part_info(struct flash_bank *bank)
  function at91sam7_erase_check (line 627) | static int at91sam7_erase_check(struct flash_bank *bank)
  function at91sam7_protect_check (line 641) | static int at91sam7_protect_check(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 682) | FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command)
  function at91sam7_erase (line 782) | static int at91sam7_erase(struct flash_bank *bank, unsigned int first,
  function at91sam7_protect (line 834) | static int at91sam7_protect(struct flash_bank *bank, int set,
  function at91sam7_write (line 876) | static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer...
  function at91sam7_probe (line 943) | static int at91sam7_probe(struct flash_bank *bank)
  function get_at91sam7_info (line 961) | static int get_at91sam7_info(struct flash_bank *bank, struct command_inv...
  function COMMAND_HANDLER (line 1010) | COMMAND_HANDLER(at91sam7_handle_gpnvm_command)
  type command_registration (line 1077) | struct command_registration
  type command_registration (line 1088) | struct command_registration
  type flash_driver (line 1099) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/at91samd.c
  type samd_part (line 83) | struct samd_part {
  type samd_part (line 92) | struct samd_part
  type samd_part (line 98) | struct samd_part
  type samd_part (line 111) | struct samd_part
  type samd_part (line 125) | struct samd_part
  type samd_part (line 144) | struct samd_part
  type samd_part (line 219) | struct samd_part
  type samd_part (line 255) | struct samd_part
  type samd_part (line 268) | struct samd_part
  type samd_part (line 286) | struct samd_part
  type samd_family (line 306) | struct samd_family {
  type samd_family (line 316) | struct samd_family
  type samd_info (line 346) | struct samd_info {
  type samd_family (line 362) | struct samd_family
  type samd_part (line 383) | struct samd_part
  type samd_family (line 386) | struct samd_family
  function samd_protect_check (line 398) | static int samd_protect_check(struct flash_bank *bank)
  function samd_get_flash_page_info (line 415) | static int samd_get_flash_page_info(struct target *target,
  function samd_probe (line 437) | static int samd_probe(struct flash_bank *bank)
  function samd_check_error (line 505) | static int samd_check_error(struct target *target)
  function samd_issue_nvmctrl_command (line 564) | static int samd_issue_nvmctrl_command(struct target *target, uint16_t cmd)
  function samd_erase_row (line 590) | static int samd_erase_row(struct target *target, uint32_t address)
  function samd_get_reservedmask (line 617) | static int samd_get_reservedmask(struct target *target, uint64_t *mask)
  function read_userrow (line 637) | static int read_userrow(struct target *target, uint64_t *userrow)
  function samd_modify_user_row_masked (line 660) | static int samd_modify_user_row_masked(struct target *target,
  function samd_modify_user_row (line 737) | static int samd_modify_user_row(struct target *target, uint64_t value,
  function samd_protect (line 748) | static int samd_protect(struct flash_bank *bank, int set,
  function samd_erase (line 798) | static int samd_erase(struct flash_bank *bank, unsigned int first,
  function samd_write (line 828) | static int samd_write(struct flash_bank *bank, const uint8_t *buffer,
  function FLASH_BANK_COMMAND_HANDLER (line 942) | FLASH_BANK_COMMAND_HANDLER(samd_flash_bank_command)
  function COMMAND_HANDLER (line 967) | COMMAND_HANDLER(samd_handle_chip_erase_command)
  function COMMAND_HANDLER (line 989) | COMMAND_HANDLER(samd_handle_set_security_command)
  function COMMAND_HANDLER (line 1017) | COMMAND_HANDLER(samd_handle_eeprom_command)
  function COMMAND_HANDLER (line 1069) | COMMAND_HANDLER(samd_handle_nvmuserrow_command)
  function COMMAND_HANDLER (line 1119) | COMMAND_HANDLER(samd_handle_bootloader_command)
  function COMMAND_HANDLER (line 1184) | COMMAND_HANDLER(samd_handle_reset_deassert)
  type command_registration (line 1219) | struct command_registration
  type command_registration (line 1279) | struct command_registration
  type flash_driver (line 1290) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/ath79.c
  type ath79_spi_ctx (line 73) | struct ath79_spi_ctx {
  type ath79_flash_bank (line 79) | struct ath79_flash_bank {
  type ath79_target (line 87) | struct ath79_target {
  type ath79_target (line 93) | struct ath79_target
  function ath79_pracc_addn (line 105) | static void ath79_pracc_addn(struct pracc_queue_info *ctx,
  function ath79_spi_bitbang_codegen (line 113) | static int ath79_spi_bitbang_codegen(struct ath79_flash_bank *ath79_info,
  function ath79_spi_bitbang_chunk (line 233) | static int ath79_spi_bitbang_chunk(struct flash_bank *bank,
  function ath79_spi_bitbang_prepare (line 317) | static void ath79_spi_bitbang_prepare(struct flash_bank *bank)
  function ath79_spi_bitbang_bytes (line 324) | static int ath79_spi_bitbang_bytes(struct flash_bank *bank,
  function FLASH_BANK_COMMAND_HANDLER (line 347) | FLASH_BANK_COMMAND_HANDLER(ath79_flash_bank_command)
  function read_status_reg (line 383) | static int read_status_reg(struct flash_bank *bank, uint32_t *status)
  function wait_till_ready (line 401) | static int wait_till_ready(struct flash_bank *bank, int timeout)
  function ath79_write_enable (line 424) | static int ath79_write_enable(struct flash_bank *bank)
  function erase_command (line 454) | static int erase_command(struct flash_bank *bank, int sector)
  function ath79_erase_sector (line 473) | static int ath79_erase_sector(struct flash_bank *bank, int sector)
  function ath79_erase (line 489) | static int ath79_erase(struct flash_bank *bank, unsigned int first,
  function ath79_protect (line 533) | static int ath79_protect(struct flash_bank *bank, int set, unsigned int ...
  function ath79_write_page (line 541) | static int ath79_write_page(struct flash_bank *bank, const uint8_t *buffer,
  function ath79_write_buffer (line 603) | static int ath79_write_buffer(struct flash_bank *bank, const uint8_t *bu...
  function ath79_write (line 633) | static int ath79_write(struct flash_bank *bank, const uint8_t *buffer,
  function ath79_read_buffer (line 668) | static int ath79_read_buffer(struct flash_bank *bank, uint8_t *buffer,
  function ath79_read (line 702) | static int ath79_read(struct flash_bank *bank, uint8_t *buffer,
  function read_flash_id (line 724) | static int read_flash_id(struct flash_bank *bank, uint32_t *id)
  function ath79_probe (line 754) | static int ath79_probe(struct flash_bank *bank)
  function ath79_auto_probe (line 845) | static int ath79_auto_probe(struct flash_bank *bank)
  function ath79_flash_blank_check (line 854) | static int ath79_flash_blank_check(struct flash_bank *bank)
  function ath79_protect_check (line 860) | static int ath79_protect_check(struct flash_bank *bank)
  function get_ath79_info (line 866) | static int get_ath79_info(struct flash_bank *bank, struct command_invoca...
  type flash_driver (line 882) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/atsame5.c
  type samd_part (line 98) | struct samd_part {
  type samd_part (line 108) | struct samd_part
  type samd_part (line 121) | struct samd_part
  type samd_part (line 132) | struct samd_part
  type samd_part (line 144) | struct samd_part
  type samd_family (line 154) | struct samd_family {
  type samd_family (line 163) | struct samd_family
  type samd_info (line 174) | struct samd_info {
  type samd_family (line 191) | struct samd_family
  type samd_part (line 212) | struct samd_part
  type samd_family (line 215) | struct samd_family
  function same5_protect_check (line 227) | static int same5_protect_check(struct flash_bank *bank)
  function samd_get_flash_page_info (line 244) | static int samd_get_flash_page_info(struct target *target,
  function same5_probe (line 266) | static int same5_probe(struct flash_bank *bank)
  function same5_wait_and_check_error (line 334) | static int same5_wait_and_check_error(struct target *target)
  function same5_issue_nvmctrl_command (line 398) | static int same5_issue_nvmctrl_command(struct target *target, uint16_t cmd)
  function same5_erase_block (line 424) | static int same5_erase_block(struct target *target, uint32_t address)
  function same5_pre_write_check (line 446) | static int same5_pre_write_check(struct target *target)
  function same5_modify_user_row_masked (line 482) | static int same5_modify_user_row_masked(struct target *target,
  function same5_modify_user_row (line 553) | static int same5_modify_user_row(struct target *target, uint32_t value,
  function same5_protect (line 567) | static int same5_protect(struct flash_bank *bank, int set, unsigned int ...
  function same5_erase (line 619) | static int same5_erase(struct flash_bank *bank, unsigned int first,
  function same5_write (line 647) | static int same5_write(struct flash_bank *bank, const uint8_t *buffer,
  function FLASH_BANK_COMMAND_HANDLER (line 734) | FLASH_BANK_COMMAND_HANDLER(same5_flash_bank_command)
  function COMMAND_HANDLER (line 758) | COMMAND_HANDLER(same5_handle_chip_erase_command)
  function COMMAND_HANDLER (line 780) | COMMAND_HANDLER(same5_handle_userpage_command)
  function COMMAND_HANDLER (line 826) | COMMAND_HANDLER(same5_handle_bootloader_command)
  function COMMAND_HANDLER (line 863) | COMMAND_HANDLER(samd_handle_reset_deassert)
  type command_registration (line 900) | struct command_registration
  type command_registration (line 939) | struct command_registration
  type flash_driver (line 950) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/atsamv.c
  type samv_flash_bank (line 56) | struct samv_flash_bank {
  function samv_efc_get_status (line 69) | static int samv_efc_get_status(struct target *target, uint32_t *v)
  function samv_efc_get_result (line 75) | static int samv_efc_get_result(struct target *target, uint32_t *v)
  function samv_efc_start_command (line 84) | static int samv_efc_start_command(struct target *target,
  function samv_efc_perform_command (line 102) | static int samv_efc_perform_command(struct target *target,
  function samv_erase_pages (line 136) | static int samv_erase_pages(struct target *target,
  function samv_get_gpnvm (line 169) | static int samv_get_gpnvm(struct target *target, unsigned gpnvm, unsigne...
  function samv_clear_gpnvm (line 193) | static int samv_clear_gpnvm(struct target *target, unsigned gpnvm)
  function samv_set_gpnvm (line 212) | static int samv_set_gpnvm(struct target *target, unsigned gpnvm)
  function samv_flash_unlock (line 233) | static int samv_flash_unlock(struct target *target,
  function samv_flash_lock (line 253) | static int samv_flash_lock(struct target *target,
  function samv_protect_check (line 273) | static int samv_protect_check(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 293) | FLASH_BANK_COMMAND_HANDLER(samv_flash_bank_command)
  function samv_get_device_id (line 302) | static int samv_get_device_id(struct flash_bank *bank, uint32_t *device_id)
  function samv_probe (line 307) | static int samv_probe(struct flash_bank *bank)
  function samv_auto_probe (line 358) | static int samv_auto_probe(struct flash_bank *bank)
  function samv_erase (line 366) | static int samv_erase(struct flash_bank *bank, unsigned int first,
  function samv_protect (line 404) | static int samv_protect(struct flash_bank *bank, int set, unsigned int f...
  function samv_page_read (line 421) | static int samv_page_read(struct target *target,
  function samv_page_write (line 432) | static int samv_page_write(struct target *target,
  function samv_write (line 460) | static int samv_write(struct flash_bank *bank, const uint8_t *buffer,
  function samv_get_info (line 567) | static int samv_get_info(struct flash_bank *bank, struct command_invocat...
  function COMMAND_HANDLER (line 580) | COMMAND_HANDLER(samv_handle_gpnvm_command)
  type command_registration (line 663) | struct command_registration
  type command_registration (line 676) | struct command_registration
  type flash_driver (line 687) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/avrf.c
  type avrf_type (line 39) | struct avrf_type {
  type avrf_flash_bank (line 48) | struct avrf_flash_bank {
  type avrf_type (line 53) | struct avrf_type
  function avr_jtag_reset (line 71) | static int avr_jtag_reset(struct avr_common *avr, uint32_t reset)
  function avr_jtag_read_jtagid (line 79) | static int avr_jtag_read_jtagid(struct avr_common *avr, uint32_t *id)
  function avr_jtagprg_enterprogmode (line 87) | static int avr_jtagprg_enterprogmode(struct avr_common *avr)
  function avr_jtagprg_leaveprogmode (line 97) | static int avr_jtagprg_leaveprogmode(struct avr_common *avr)
  function avr_jtagprg_chiperase (line 111) | static int avr_jtagprg_chiperase(struct avr_common *avr)
  function avr_jtagprg_writeflashpage (line 135) | static int avr_jtagprg_writeflashpage(struct avr_common *avr,
  function FLASH_BANK_COMMAND_HANDLER (line 196) | FLASH_BANK_COMMAND_HANDLER(avrf_flash_bank_command)
  function avrf_erase (line 211) | static int avrf_erase(struct flash_bank *bank, unsigned int first,
  function avrf_write (line 236) | static int avrf_write(struct flash_bank *bank, const uint8_t *buffer, ui...
  function avrf_probe (line 292) | static int avrf_probe(struct flash_bank *bank)
  function avrf_auto_probe (line 352) | static int avrf_auto_probe(struct flash_bank *bank)
  function avrf_info (line 360) | static int avrf_info(struct flash_bank *bank, struct command_invocation ...
  function avrf_mass_erase (line 403) | static int avrf_mass_erase(struct flash_bank *bank)
  function COMMAND_HANDLER (line 421) | COMMAND_HANDLER(avrf_handle_mass_erase_command)
  type command_registration (line 440) | struct command_registration
  type command_registration (line 450) | struct command_registration
  type flash_driver (line 461) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/bluenrg-x.c
  type flash_ctrl_priv_data (line 29) | struct flash_ctrl_priv_data {
  type flash_ctrl_priv_data (line 39) | struct flash_ctrl_priv_data
  type flash_ctrl_priv_data (line 49) | struct flash_ctrl_priv_data
  type flash_ctrl_priv_data (line 59) | struct flash_ctrl_priv_data
  type flash_ctrl_priv_data (line 69) | struct flash_ctrl_priv_data
  type bluenrgx_flash_bank (line 79) | struct bluenrgx_flash_bank {
  type flash_ctrl_priv_data (line 85) | struct flash_ctrl_priv_data
  function FLASH_BANK_COMMAND_HANDLER (line 92) | FLASH_BANK_COMMAND_HANDLER(bluenrgx_flash_bank_command)
  function bluenrgx_get_flash_reg (line 117) | static inline uint32_t bluenrgx_get_flash_reg(struct flash_bank *bank, u...
  function bluenrgx_read_flash_reg (line 123) | static inline int bluenrgx_read_flash_reg(struct flash_bank *bank, uint3...
  function bluenrgx_write_flash_reg (line 128) | static inline int bluenrgx_write_flash_reg(struct flash_bank *bank, uint...
  function bluenrgx_erase (line 133) | static int bluenrgx_erase(struct flash_bank *bank, unsigned int first,
  function bluenrgx_write (line 232) | static int bluenrgx_write(struct flash_bank *bank, const uint8_t *buffer,
  function bluenrgx_probe (line 381) | static int bluenrgx_probe(struct flash_bank *bank)
  function bluenrgx_auto_probe (line 433) | static int bluenrgx_auto_probe(struct flash_bank *bank)
  function bluenrgx_get_info (line 444) | static int bluenrgx_get_info(struct flash_bank *bank, struct command_inv...
  type flash_driver (line 465) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/cc26xx.c
  type cc26xx_bank (line 21) | struct cc26xx_bank {
  type flash_bank (line 47) | struct flash_bank
  function cc26xx_device_type (line 49) | static uint32_t cc26xx_device_type(uint32_t icepick_id, uint32_t user_id)
  function cc26xx_sector_length (line 75) | static uint32_t cc26xx_sector_length(uint32_t icepick_id)
  function cc26xx_wait_algo_done (line 96) | static int cc26xx_wait_algo_done(struct flash_bank *bank, uint32_t param...
  function cc26xx_init (line 129) | static int cc26xx_init(struct flash_bank *bank)
  function cc26xx_quit (line 188) | static int cc26xx_quit(struct flash_bank *bank)
  function cc26xx_mass_erase (line 208) | static int cc26xx_mass_erase(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 245) | FLASH_BANK_COMMAND_HANDLER(cc26xx_flash_bank_command)
  function cc26xx_erase (line 269) | static int cc26xx_erase(struct flash_bank *bank, unsigned int first,
  function cc26xx_write (line 318) | static int cc26xx_write(struct flash_bank *bank, const uint8_t *buffer,
  function cc26xx_probe (line 402) | static int cc26xx_probe(struct flash_bank *bank)
  function cc26xx_auto_probe (line 491) | static int cc26xx_auto_probe(struct flash_bank *bank)
  function cc26xx_info (line 503) | static int cc26xx_info(struct flash_bank *bank, struct command_invocatio...
  type flash_driver (line 537) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/cc26xx.h
  type cc26xx_algo_params (line 73) | struct cc26xx_algo_params {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/cc3220sf.c
  type cc3220sf_bank (line 20) | struct cc3220sf_bank {
  function cc3220sf_mass_erase (line 30) | static int cc3220sf_mass_erase(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 83) | FLASH_BANK_COMMAND_HANDLER(cc3220sf_flash_bank_command)
  function cc3220sf_erase (line 104) | static int cc3220sf_erase(struct flash_bank *bank, unsigned int first,
  function cc3220sf_write (line 172) | static int cc3220sf_write(struct flash_bank *bank, const uint8_t *buffer,
  function cc3220sf_probe (line 424) | static int cc3220sf_probe(struct flash_bank *bank)
  function cc3220sf_auto_probe (line 463) | static int cc3220sf_auto_probe(struct flash_bank *bank)
  function cc3220sf_info (line 475) | static int cc3220sf_info(struct flash_bank *bank, struct command_invocat...
  type flash_driver (line 481) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/cfi.c
  type cfi_unlock_addresses (line 33) | struct cfi_unlock_addresses
  type flash_bank (line 41) | struct flash_bank
  type flash_bank (line 42) | struct flash_bank
  type flash_bank (line 43) | struct flash_bank
  type flash_bank (line 44) | struct flash_bank
  type flash_bank (line 45) | struct flash_bank
  type cfi_fixup (line 48) | struct cfi_fixup
  type cfi_fixup (line 85) | struct cfi_fixup
  function cfi_fixup (line 89) | static void cfi_fixup(struct flash_bank *bank, const struct cfi_fixup *f...
  function cfi_flash_address (line 100) | uint32_t cfi_flash_address(struct flash_bank *bank, int sector, uint32_t...
  function cfi_target_write_memory (line 119) | static int cfi_target_write_memory(struct flash_bank *bank, target_addr_...
  function cfi_target_read_memory (line 131) | int cfi_target_read_memory(struct flash_bank *bank, target_addr_t addr,
  function cfi_command (line 143) | static void cfi_command(struct flash_bank *bank, uint8_t cmd, uint8_t *c...
  function cfi_send_command (line 162) | int cfi_send_command(struct flash_bank *bank, uint8_t cmd, uint32_t addr...
  function cfi_query_u8 (line 174) | static int cfi_query_u8(struct flash_bank *bank, int sector, uint32_t of...
  function cfi_get_u8 (line 197) | static int cfi_get_u8(struct flash_bank *bank, int sector, uint32_t offs...
  function cfi_query_u16 (line 223) | static int cfi_query_u16(struct flash_bank *bank, int sector, uint32_t o...
  function cfi_query_u32 (line 251) | static int cfi_query_u32(struct flash_bank *bank, int sector, uint32_t o...
  function cfi_reset (line 282) | int cfi_reset(struct flash_bank *bank)
  function cfi_intel_clear_status_register (line 307) | static void cfi_intel_clear_status_register(struct flash_bank *bank)
  function cfi_intel_wait_status_busy (line 312) | static int cfi_intel_wait_status_busy(struct flash_bank *bank, int timeo...
  function cfi_spansion_wait_status_busy (line 363) | int cfi_spansion_wait_status_busy(struct flash_bank *bank, int timeout)
  function cfi_read_intel_pri_ext (line 409) | static int cfi_read_intel_pri_ext(struct flash_bank *bank)
  function cfi_read_spansion_pri_ext (line 505) | static int cfi_read_spansion_pri_ext(struct flash_bank *bank)
  function cfi_read_atmel_pri_ext (line 606) | static int cfi_read_atmel_pri_ext(struct flash_bank *bank)
  function cfi_read_0002_pri_ext (line 710) | static int cfi_read_0002_pri_ext(struct flash_bank *bank)
  function cfi_spansion_info (line 720) | static int cfi_spansion_info(struct flash_bank *bank, struct command_inv...
  function cfi_intel_info (line 746) | static int cfi_intel_info(struct flash_bank *bank, struct command_invoca...
  function cfi_flash_bank_cmd (line 778) | int cfi_flash_bank_cmd(struct flash_bank *bank, unsigned int argc, const...
  function FLASH_BANK_COMMAND_HANDLER (line 835) | FLASH_BANK_COMMAND_HANDLER(cfi_flash_bank_command)
  function cfi_intel_erase (line 840) | static int cfi_intel_erase(struct flash_bank *bank, unsigned int first,
  function cfi_spansion_unlock_seq (line 876) | int cfi_spansion_unlock_seq(struct flash_bank *bank)
  function cfi_spansion_erase (line 893) | static int cfi_spansion_erase(struct flash_bank *bank, unsigned int first,
  function cfi_erase (line 931) | int cfi_erase(struct flash_bank *bank, unsigned int first,
  function cfi_intel_protect (line 961) | static int cfi_intel_protect(struct flash_bank *bank, int set,
  function cfi_protect (line 1073) | int cfi_protect(struct flash_bank *bank, int set, unsigned int first,
  function cfi_command_val (line 1096) | static uint32_t cfi_command_val(struct flash_bank *bank, uint8_t cmd)
  function cfi_intel_write_block (line 1116) | static int cfi_intel_write_block(struct flash_bank *bank, const uint8_t ...
  function cfi_spansion_write_block_mips (line 1365) | static int cfi_spansion_write_block_mips(struct flash_bank *bank, const ...
  function cfi_spansion_write_block (line 1577) | static int cfi_spansion_write_block(struct flash_bank *bank, const uint8...
  function cfi_intel_write_word (line 1956) | static int cfi_intel_write_word(struct flash_bank *bank, uint8_t *word, ...
  function cfi_intel_write_words (line 1988) | static int cfi_intel_write_words(struct flash_bank *bank, const uint8_t ...
  function cfi_spansion_write_word (line 2072) | static int cfi_spansion_write_word(struct flash_bank *bank, uint8_t *wor...
  function cfi_spansion_write_words (line 2103) | static int cfi_spansion_write_words(struct flash_bank *bank, const uint8...
  function cfi_write_word (line 2170) | int cfi_write_word(struct flash_bank *bank, uint8_t *word, uint32_t addr...
  function cfi_write_words (line 2188) | static int cfi_write_words(struct flash_bank *bank, const uint8_t *word,
  function cfi_read (line 2213) | static int cfi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t o...
  function cfi_write (line 2281) | static int cfi_write(struct flash_bank *bank, const uint8_t *buffer, uin...
  function cfi_fixup_reversed_erase_regions (line 2451) | static void cfi_fixup_reversed_erase_regions(struct flash_bank *bank, co...
  function cfi_fixup_0002_erase_regions (line 2460) | static void cfi_fixup_0002_erase_regions(struct flash_bank *bank, const ...
  function cfi_fixup_0002_unlock_addresses (line 2480) | static void cfi_fixup_0002_unlock_addresses(struct flash_bank *bank, con...
  function cfi_fixup_0002_polling_bits (line 2490) | static void cfi_fixup_0002_polling_bits(struct flash_bank *bank, const v...
  function cfi_query_string (line 2499) | static int cfi_query_string(struct flash_bank *bank, int address)
  function cfi_probe (line 2532) | int cfi_probe(struct flash_bank *bank)
  function cfi_auto_probe (line 2864) | int cfi_auto_probe(struct flash_bank *bank)
  function cfi_intel_protect_check (line 2872) | static int cfi_intel_protect_check(struct flash_bank *bank)
  function cfi_spansion_protect_check (line 2901) | static int cfi_spansion_protect_check(struct flash_bank *bank)
  function cfi_protect_check (line 2930) | int cfi_protect_check(struct flash_bank *bank)
  function cfi_get_info (line 2956) | int cfi_get_info(struct flash_bank *bank, struct command_invocation *cmd)
  function cfi_fixup_0002_write_buffer (line 3030) | static void cfi_fixup_0002_write_buffer(struct flash_bank *bank, const v...
  type flash_driver (line 3038) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/cfi.h
  type cfi_flash_bank (line 14) | struct cfi_flash_bank {
  type cfi_intel_pri_ext (line 77) | struct cfi_intel_pri_ext {
  type cfi_spansion_pri_ext (line 96) | struct cfi_spansion_pri_ext {
  type cfi_atmel_pri_ext (line 119) | struct cfi_atmel_pri_ext {
  type cfi_unlock_addresses (line 134) | struct cfi_unlock_addresses {
  type cfi_fixup (line 139) | struct cfi_fixup {
  type flash_bank (line 146) | struct flash_bank
  type flash_bank (line 147) | struct flash_bank
  type flash_bank (line 149) | struct flash_bank
  type flash_bank (line 150) | struct flash_bank
  type flash_bank (line 151) | struct flash_bank
  type flash_bank (line 152) | struct flash_bank
  type command_invocation (line 152) | struct command_invocation
  type flash_bank (line 153) | struct flash_bank
  type flash_bank (line 155) | struct flash_bank
  type flash_bank (line 156) | struct flash_bank
  type flash_bank (line 157) | struct flash_bank
  type flash_bank (line 158) | struct flash_bank
  type flash_bank (line 159) | struct flash_bank
  type flash_bank (line 160) | struct flash_bank
  type flash_bank (line 162) | struct flash_bank

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/core.c
  type flash_bank (line 27) | struct flash_bank
  function flash_driver_erase (line 29) | int flash_driver_erase(struct flash_bank *bank, unsigned int first,
  function flash_driver_protect (line 41) | int flash_driver_protect(struct flash_bank *bank, int set, unsigned int ...
  function flash_driver_write (line 85) | int flash_driver_write(struct flash_bank *bank,
  function flash_driver_read (line 102) | int flash_driver_read(struct flash_bank *bank,
  function default_flash_read (line 121) | int default_flash_read(struct flash_bank *bank,
  function flash_driver_verify (line 127) | int flash_driver_verify(struct flash_bank *bank,
  function default_flash_verify (line 142) | int default_flash_verify(struct flash_bank *bank,
  function flash_bank_add (line 164) | void flash_bank_add(struct flash_bank *bank)
  type flash_bank (line 183) | struct flash_bank
  type flash_bank (line 188) | struct flash_bank
  type flash_bank (line 190) | struct flash_bank
  function flash_get_bank_count (line 201) | unsigned int flash_get_bank_count(void)
  function default_flash_free_driver_priv (line 210) | void default_flash_free_driver_priv(struct flash_bank *bank)
  function flash_free_all_banks (line 216) | void flash_free_all_banks(void)
  type flash_bank (line 243) | struct flash_bank
  type flash_bank (line 248) | struct flash_bank
  function get_flash_bank_by_name (line 261) | int get_flash_bank_by_name(const char *name, struct flash_bank **bank_re...
  function get_flash_bank_by_num (line 280) | int get_flash_bank_by_num(unsigned int num, struct flash_bank **bank)
  function get_flash_bank_by_addr (line 300) | int get_flash_bank_by_addr(struct target *target,
  function default_flash_mem_blank_check (line 333) | static int default_flash_mem_blank_check(struct flash_bank *bank)
  function default_flash_blank_check (line 380) | int default_flash_blank_check(struct flash_bank *bank)
  function flash_iterate_address_range_inner (line 448) | static int flash_iterate_address_range_inner(struct target *target,
  function flash_iterate_address_range (line 578) | static int flash_iterate_address_range(struct target *target,
  function flash_erase_address_range (line 613) | int flash_erase_address_range(struct target *target,
  function flash_driver_unprotect (line 620) | static int flash_driver_unprotect(struct flash_bank *bank, unsigned int ...
  function flash_unlock_address_range (line 626) | int flash_unlock_address_range(struct target *target, target_addr_t addr,
  function compare_section (line 637) | static int compare_section(const void *a, const void *b)
  function target_addr_t (line 654) | target_addr_t flash_write_align_start(struct flash_bank *bank, target_ad...
  function target_addr_t (line 678) | target_addr_t flash_write_align_end(struct flash_bank *bank, target_addr...
  function flash_write_check_gap (line 701) | static bool flash_write_check_gap(struct flash_bank *bank,
  function flash_write_unlock_verify (line 730) | int flash_write_unlock_verify(struct target *target, struct image *image,
  function flash_write (line 996) | int flash_write(struct target *target, struct image *image,
  type flash_sector (line 1002) | struct flash_sector
  type flash_sector (line 1005) | struct flash_sector
  type flash_sector (line 1005) | struct flash_sector

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/core.h
  type image (line 21) | struct image
  type flash_sector (line 28) | struct flash_sector {
  type flash_bank (line 75) | struct flash_bank {
  type command_context (line 132) | struct command_context
  type target (line 141) | struct target
  type target (line 144) | struct target
  type flash_bank (line 153) | struct flash_bank
  type flash_bank (line 161) | struct flash_bank
  type target (line 173) | struct target
  type image (line 174) | struct image
  type flash_bank (line 186) | struct flash_bank
  type flash_bank (line 199) | struct flash_bank
  type flash_bank (line 210) | struct flash_bank
  type flash_bank (line 219) | struct flash_bank
  type flash_bank (line 227) | struct flash_bank
  type flash_bank (line 235) | struct flash_bank
  type flash_bank (line 242) | struct flash_bank
  type flash_bank (line 273) | struct flash_bank
  type target (line 282) | struct target
  type flash_bank (line 283) | struct flash_bank
  type flash_sector (line 291) | struct flash_sector

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/driver.h
  type flash_bank (line 14) | struct flash_bank
  type flash_driver (line 39) | struct flash_driver {
  type flash_driver (line 238) | struct flash_driver
  type flash_driver (line 240) | struct flash_driver
  type flash_driver (line 241) | struct flash_driver
  type flash_driver (line 242) | struct flash_driver
  type flash_driver (line 243) | struct flash_driver
  type flash_driver (line 244) | struct flash_driver
  type flash_driver (line 245) | struct flash_driver
  type flash_driver (line 246) | struct flash_driver
  type flash_driver (line 247) | struct flash_driver
  type flash_driver (line 248) | struct flash_driver
  type flash_driver (line 249) | struct flash_driver
  type flash_driver (line 250) | struct flash_driver
  type flash_driver (line 251) | struct flash_driver
  type flash_driver (line 252) | struct flash_driver
  type flash_driver (line 253) | struct flash_driver
  type flash_driver (line 254) | struct flash_driver
  type flash_driver (line 255) | struct flash_driver
  type flash_driver (line 256) | struct flash_driver
  type flash_driver (line 257) | struct flash_driver
  type flash_driver (line 258) | struct flash_driver
  type flash_driver (line 259) | struct flash_driver
  type flash_driver (line 260) | struct flash_driver
  type flash_driver (line 261) | struct flash_driver
  type flash_driver (line 262) | struct flash_driver
  type flash_driver (line 263) | struct flash_driver
  type flash_driver (line 264) | struct flash_driver
  type flash_driver (line 265) | struct flash_driver
  type flash_driver (line 266) | struct flash_driver
  type flash_driver (line 267) | struct flash_driver
  type flash_driver (line 268) | struct flash_driver
  type flash_driver (line 269) | struct flash_driver
  type flash_driver (line 270) | struct flash_driver
  type flash_driver (line 271) | struct flash_driver
  type flash_driver (line 272) | struct flash_driver
  type flash_driver (line 273) | struct flash_driver
  type flash_driver (line 274) | struct flash_driver
  type flash_driver (line 275) | struct flash_driver
  type flash_driver (line 276) | struct flash_driver
  type flash_driver (line 277) | struct flash_driver
  type flash_driver (line 278) | struct flash_driver
  type flash_driver (line 279) | struct flash_driver
  type flash_driver (line 280) | struct flash_driver
  type flash_driver (line 281) | struct flash_driver
  type flash_driver (line 282) | struct flash_driver
  type flash_driver (line 283) | struct flash_driver
  type flash_driver (line 284) | struct flash_driver
  type flash_driver (line 285) | struct flash_driver
  type flash_driver (line 286) | struct flash_driver
  type flash_driver (line 287) | struct flash_driver
  type flash_driver (line 288) | struct flash_driver
  type flash_driver (line 289) | struct flash_driver
  type flash_driver (line 290) | struct flash_driver
  type flash_driver (line 291) | struct flash_driver
  type flash_driver (line 292) | struct flash_driver
  type flash_driver (line 293) | struct flash_driver
  type flash_driver (line 294) | struct flash_driver
  type flash_driver (line 295) | struct flash_driver
  type flash_driver (line 296) | struct flash_driver
  type flash_driver (line 297) | struct flash_driver
  type flash_driver (line 298) | struct flash_driver
  type flash_driver (line 299) | struct flash_driver
  type flash_driver (line 300) | struct flash_driver
  type flash_driver (line 301) | struct flash_driver
  type flash_driver (line 302) | struct flash_driver
  type flash_driver (line 303) | struct flash_driver
  type flash_driver (line 304) | struct flash_driver
  type flash_driver (line 305) | struct flash_driver
  type flash_driver (line 306) | struct flash_driver
  type flash_driver (line 307) | struct flash_driver
  type flash_driver (line 308) | struct flash_driver
  type flash_driver (line 309) | struct flash_driver
  type flash_driver (line 310) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/drivers.c
  type flash_driver (line 16) | struct flash_driver
  type flash_driver (line 91) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/dsp5680xx_flash.c
  function dsp5680xx_build_sector_list (line 35) | static int dsp5680xx_build_sector_list(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 51) | FLASH_BANK_COMMAND_HANDLER(dsp5680xx_flash_bank_command)
  function dsp5680xx_flash_protect_check (line 70) | static int dsp5680xx_flash_protect_check(struct flash_bank *bank)
  function dsp5680xx_flash_protect (line 108) | static int dsp5680xx_flash_protect(struct flash_bank *bank, int set,
  function dsp5680xx_flash_write (line 136) | static int dsp5680xx_flash_write(struct flash_bank *bank, const uint8_t ...
  function dsp5680xx_probe (line 155) | static int dsp5680xx_probe(struct flash_bank *bank)
  function dsp5680xx_flash_erase (line 174) | static int dsp5680xx_flash_erase(struct flash_bank *bank, unsigned int f...
  function dsp5680xx_flash_erase_check (line 188) | static int dsp5680xx_flash_erase_check(struct flash_bank *bank)
  type flash_driver (line 210) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/efm32.c
  type efm32_bank_index (line 81) | enum efm32_bank_index {
  function efm32x_get_bank_index (line 88) | static int efm32x_get_bank_index(target_addr_t base)
  type efm32_family_data (line 102) | struct efm32_family_data {
  type efm32_info (line 117) | struct efm32_info {
  type efm32x_flash_chip (line 127) | struct efm32x_flash_chip {
  type efm32_family_data (line 136) | struct efm32_family_data
  type flash_driver (line 196) | struct flash_driver
  type flash_bank (line 198) | struct flash_bank
  type flash_bank (line 201) | struct flash_bank
  function efm32x_get_flash_size (line 203) | static int efm32x_get_flash_size(struct flash_bank *bank, uint16_t *flas...
  function efm32x_get_ram_size (line 208) | static int efm32x_get_ram_size(struct flash_bank *bank, uint16_t *ram_sz)
  function efm32x_get_part_num (line 213) | static int efm32x_get_part_num(struct flash_bank *bank, uint16_t *pnum)
  function efm32x_get_part_family (line 218) | static int efm32x_get_part_family(struct flash_bank *bank, uint8_t *pfam...
  function efm32x_get_prod_rev (line 223) | static int efm32x_get_prod_rev(struct flash_bank *bank, uint8_t *prev)
  function efm32x_read_reg_u32 (line 228) | static int efm32x_read_reg_u32(struct flash_bank *bank, target_addr_t of...
  function efm32x_write_reg_u32 (line 237) | static int efm32x_write_reg_u32(struct flash_bank *bank, target_addr_t o...
  function efm32x_read_info (line 246) | static int efm32x_read_info(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 345) | FLASH_BANK_COMMAND_HANDLER(efm32x_flash_bank_command)
  function efm32x_free_driver_priv (line 386) | static void efm32x_free_driver_priv(struct flash_bank *bank)
  function efm32x_set_reg_bits (line 403) | static int efm32x_set_reg_bits(struct flash_bank *bank, uint32_t reg,
  function efm32x_set_wren (line 421) | static int efm32x_set_wren(struct flash_bank *bank, int write_enable)
  function efm32x_msc_lock (line 427) | static int efm32x_msc_lock(struct flash_bank *bank, int lock)
  function efm32x_wait_status (line 434) | static int efm32x_wait_status(struct flash_bank *bank, int timeout,
  function efm32x_erase_page (line 466) | static int efm32x_erase_page(struct flash_bank *bank, uint32_t addr)
  function efm32x_erase (line 511) | static int efm32x_erase(struct flash_bank *bank, unsigned int first,
  function efm32x_read_lock_data (line 549) | static int efm32x_read_lock_data(struct flash_bank *bank)
  function efm32x_write_only_lockbits (line 625) | static int efm32x_write_only_lockbits(struct flash_bank *bank)
  function efm32x_write_lock_data (line 631) | static int efm32x_write_lock_data(struct flash_bank *bank)
  function efm32x_get_page_lock (line 670) | static int efm32x_get_page_lock(struct flash_bank *bank, size_t page)
  function efm32x_set_page_lock (line 694) | static int efm32x_set_page_lock(struct flash_bank *bank, size_t page, in...
  function efm32x_protect (line 716) | static int efm32x_protect(struct flash_bank *bank, int set, unsigned int...
  function efm32x_write_block (line 744) | static int efm32x_write_block(struct flash_bank *bank, const uint8_t *buf,
  function efm32x_write_word (line 900) | static int efm32x_write_word(struct flash_bank *bank, uint32_t addr,
  function efm32x_priv_write (line 975) | static int efm32x_priv_write(struct flash_bank *bank, const uint8_t *buf...
  function efm32x_write (line 1050) | static int efm32x_write(struct flash_bank *bank, const uint8_t *buffer,
  function efm32x_probe (line 1060) | static int efm32x_probe(struct flash_bank *bank)
  function efm32x_auto_probe (line 1113) | static int efm32x_auto_probe(struct flash_bank *bank)
  function efm32x_protect_check (line 1125) | static int efm32x_protect_check(struct flash_bank *bank)
  function get_efm32x_info (line 1149) | static int get_efm32x_info(struct flash_bank *bank, struct command_invoc...
  function COMMAND_HANDLER (line 1165) | COMMAND_HANDLER(efm32x_handle_debuglock_command)
  type command_registration (line 1201) | struct command_registration
  type command_registration (line 1212) | struct command_registration
  type flash_driver (line 1223) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/em357.c
  type em357_options (line 70) | struct em357_options {
  type em357_flash_bank (line 76) | struct em357_flash_bank {
  type flash_bank (line 82) | struct flash_bank
  function FLASH_BANK_COMMAND_HANDLER (line 86) | FLASH_BANK_COMMAND_HANDLER(em357_flash_bank_command)
  function em357_get_flash_status (line 101) | static inline int em357_get_flash_status(struct flash_bank *bank, uint32...
  function em357_wait_status_busy (line 107) | static int em357_wait_status_busy(struct flash_bank *bank, int timeout)
  function em357_read_options (line 148) | static int em357_read_options(struct flash_bank *bank)
  function em357_erase_options (line 179) | static int em357_erase_options(struct flash_bank *bank)
  function em357_write_options (line 225) | static int em357_write_options(struct flash_bank *bank)
  function em357_protect_check (line 300) | static int em357_protect_check(struct flash_bank *bank)
  function em357_erase (line 335) | static int em357_erase(struct flash_bank *bank, unsigned int first,
  function em357_protect (line 383) | static int em357_protect(struct flash_bank *bank, int set, unsigned int ...
  function em357_write_block (line 444) | static int em357_write_block(struct flash_bank *bank, const uint8_t *buf...
  function em357_write (line 571) | static int em357_write(struct flash_bank *bank, const uint8_t *buffer,
  function em357_probe (line 661) | static int em357_probe(struct flash_bank *bank)
  function em357_auto_probe (line 733) | static int em357_auto_probe(struct flash_bank *bank)
  function COMMAND_HANDLER (line 741) | COMMAND_HANDLER(em357_handle_lock_command)
  function COMMAND_HANDLER (line 781) | COMMAND_HANDLER(em357_handle_unlock_command)
  function em357_mass_erase (line 817) | static int em357_mass_erase(struct flash_bank *bank)
  function COMMAND_HANDLER (line 856) | COMMAND_HANDLER(em357_handle_mass_erase_command)
  type command_registration (line 875) | struct command_registration
  type command_registration (line 900) | struct command_registration
  type flash_driver (line 911) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/esirisc_flash.c
  type esirisc_flash_bank (line 89) | struct esirisc_flash_bank {
  type command_registration (line 96) | struct command_registration
  function FLASH_BANK_COMMAND_HANDLER (line 98) | FLASH_BANK_COMMAND_HANDLER(esirisc_flash_bank_command)
  function esirisc_flash_unlock (line 124) | static int esirisc_flash_unlock(struct flash_bank *bank)
  function esirisc_flash_disable_protect (line 136) | static int esirisc_flash_disable_protect(struct flash_bank *bank)
  function esirisc_flash_enable_protect (line 155) | static int esirisc_flash_enable_protect(struct flash_bank *bank)
  function esirisc_flash_check_status (line 174) | static int esirisc_flash_check_status(struct flash_bank *bank)
  function esirisc_flash_clear_status (line 189) | static int esirisc_flash_clear_status(struct flash_bank *bank)
  function esirisc_flash_wait (line 199) | static int esirisc_flash_wait(struct flash_bank *bank, int ms)
  function esirisc_flash_control (line 219) | static int esirisc_flash_control(struct flash_bank *bank, uint32_t control)
  function esirisc_flash_recall (line 237) | static int esirisc_flash_recall(struct flash_bank *bank)
  function esirisc_flash_erase (line 242) | static int esirisc_flash_erase(struct flash_bank *bank, unsigned int first,
  function esirisc_flash_mass_erase (line 271) | static int esirisc_flash_mass_erase(struct flash_bank *bank)
  function esirisc_flash_ref_erase (line 298) | static int esirisc_flash_ref_erase(struct flash_bank *bank)
  function esirisc_flash_fill_pb (line 317) | static int esirisc_flash_fill_pb(struct flash_bank *bank,
  function esirisc_flash_write (line 348) | static int esirisc_flash_write(struct flash_bank *bank,
  function esirisc_flash_num_cycles (line 394) | static uint32_t esirisc_flash_num_cycles(struct flash_bank *bank, uint64...
  function esirisc_flash_init (line 408) | static int esirisc_flash_init(struct flash_bank *bank)
  function esirisc_flash_probe (line 446) | static int esirisc_flash_probe(struct flash_bank *bank)
  function esirisc_flash_auto_probe (line 469) | static int esirisc_flash_auto_probe(struct flash_bank *bank)
  function esirisc_flash_info (line 479) | static int esirisc_flash_info(struct flash_bank *bank, struct command_in...
  function COMMAND_HANDLER (line 493) | COMMAND_HANDLER(handle_esirisc_flash_mass_erase_command)
  function COMMAND_HANDLER (line 513) | COMMAND_HANDLER(handle_esirisc_flash_ref_erase_command)
  type command_registration (line 533) | struct command_registration
  type command_registration (line 551) | struct command_registration
  type flash_driver (line 562) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/faux.c
  type faux_flash_bank (line 16) | struct faux_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 27) | FLASH_BANK_COMMAND_HANDLER(faux_flash_bank_command)
  function faux_erase (line 69) | static int faux_erase(struct flash_bank *bank, unsigned int first,
  function faux_write (line 77) | static int faux_write(struct flash_bank *bank, const uint8_t *buffer, ui...
  function faux_info (line 84) | static int faux_info(struct flash_bank *bank, struct command_invocation ...
  function faux_probe (line 90) | static int faux_probe(struct flash_bank *bank)
  type command_registration (line 95) | struct command_registration
  type flash_driver (line 106) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/fespi.c
  type fespi_flash_bank (line 113) | struct fespi_flash_bank {
  type fespi_target (line 119) | struct fespi_target {
  type fespi_target (line 126) | struct fespi_target
  function FLASH_BANK_COMMAND_HANDLER (line 133) | FLASH_BANK_COMMAND_HANDLER(fespi_flash_bank_command)
  function fespi_read_reg (line 160) | static int fespi_read_reg(struct flash_bank *bank, uint32_t *value, targ...
  function fespi_write_reg (line 174) | static int fespi_write_reg(struct flash_bank *bank, target_addr_t addres...
  function fespi_disable_hw_mode (line 188) | static int fespi_disable_hw_mode(struct flash_bank *bank)
  function fespi_enable_hw_mode (line 196) | static int fespi_enable_hw_mode(struct flash_bank *bank)
  function fespi_set_dir (line 204) | static int fespi_set_dir(struct flash_bank *bank, bool dir)
  function fespi_txwm_wait (line 214) | static int fespi_txwm_wait(struct flash_bank *bank)
  function fespi_tx (line 234) | static int fespi_tx(struct flash_bank *bank, uint8_t in)
  function fespi_rx (line 254) | static int fespi_rx(struct flash_bank *bank, uint8_t *out)
  function fespi_wip (line 278) | static int fespi_wip(struct flash_bank *bank, int timeout)
  function fespi_erase_sector (line 311) | static int fespi_erase_sector(struct flash_bank *bank, int sector)
  function fespi_erase (line 356) | static int fespi_erase(struct flash_bank *bank, unsigned int first,
  function fespi_protect (line 421) | static int fespi_protect(struct flash_bank *bank, int set,
  function slow_fespi_write_buffer (line 429) | static int slow_fespi_write_buffer(struct flash_bank *bank,
  function fespi_write (line 481) | static int fespi_write(struct flash_bank *bank, const uint8_t *buffer,
  function fespi_read_flash_id (line 671) | static int fespi_read_flash_id(struct flash_bank *bank, uint32_t *id)
  function fespi_probe (line 723) | static int fespi_probe(struct flash_bank *bank)
  function fespi_auto_probe (line 820) | static int fespi_auto_probe(struct flash_bank *bank)
  function fespi_protect_check (line 828) | static int fespi_protect_check(struct flash_bank *bank)
  function get_fespi_info (line 834) | static int get_fespi_info(struct flash_bank *bank, struct command_invoca...
  type flash_driver (line 850) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/fm3.c
  type fm3_variant (line 24) | enum fm3_variant {
  type fm3_flash_type (line 44) | enum fm3_flash_type {
  type fm3_flash_bank (line 50) | struct fm3_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 56) | FLASH_BANK_COMMAND_HANDLER(fm3_flash_bank_command)
  function fm3_busy_wait (line 130) | static int fm3_busy_wait(struct target *target, uint32_t offset, int tim...
  function fm3_erase (line 193) | static int fm3_erase(struct flash_bank *bank, unsigned int first,
  function fm3_write_block (line 337) | static int fm3_write_block(struct flash_bank *bank, const uint8_t *buffer,
  function fm3_probe (line 622) | static int fm3_probe(struct flash_bank *bank)
  function fm3_auto_probe (line 793) | static int fm3_auto_probe(struct flash_bank *bank)
  function fm3_chip_erase (line 802) | static int fm3_chip_erase(struct flash_bank *bank)
  function COMMAND_HANDLER (line 933) | COMMAND_HANDLER(fm3_handle_chip_erase_command)
  type command_registration (line 952) | struct command_registration
  type command_registration (line 963) | struct command_registration
  type flash_driver (line 974) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/fm4.c
  type fm4_variant (line 32) | enum fm4_variant {
  type fm4_flash_bank (line 46) | struct fm4_flash_bank {
  function fm4_disable_hw_watchdog (line 52) | static int fm4_disable_hw_watchdog(struct target *target)
  function fm4_enter_flash_cpu_programming_mode (line 71) | static int fm4_enter_flash_cpu_programming_mode(struct target *target)
  function fm4_enter_flash_cpu_rom_mode (line 87) | static int fm4_enter_flash_cpu_rom_mode(struct target *target)
  function fm4_flash_erase (line 103) | static int fm4_flash_erase(struct flash_bank *bank, unsigned int first,
  function fm4_flash_write (line 201) | static int fm4_flash_write(struct flash_bank *bank, const uint8_t *buffer,
  function mb9bf_probe (line 347) | static int mb9bf_probe(struct flash_bank *bank)
  function s6e2cc_init_sector (line 393) | static void s6e2cc_init_sector(struct flash_sector *sector, int sa)
  function s6e2cc_probe (line 406) | static int s6e2cc_probe(struct flash_bank *bank)
  function s6e2dh_probe (line 467) | static int s6e2dh_probe(struct flash_bank *bank)
  function fm4_probe (line 492) | static int fm4_probe(struct flash_bank *bank)
  function fm4_auto_probe (line 532) | static int fm4_auto_probe(struct flash_bank *bank)
  function fm4_get_info_command (line 542) | static int fm4_get_info_command(struct flash_bank *bank, struct command_...
  function fm4_name_match (line 599) | static bool fm4_name_match(const char *s, const char *pattern)
  function mb9bf_bank_setup (line 615) | static int mb9bf_bank_setup(struct flash_bank *bank, const char *variant)
  function s6e2cc_bank_setup (line 637) | static int s6e2cc_bank_setup(struct flash_bank *bank, const char *variant)
  function FLASH_BANK_COMMAND_HANDLER (line 655) | FLASH_BANK_COMMAND_HANDLER(fm4_flash_bank_command)
  type flash_driver (line 691) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/imp.h
  type flash_bank (line 22) | struct flash_bank
  type flash_bank (line 27) | struct flash_bank
  type flash_bank (line 29) | struct flash_bank
  type flash_bank (line 31) | struct flash_bank
  type flash_bank (line 33) | struct flash_bank
  type flash_bank (line 35) | struct flash_bank
  type flash_bank (line 37) | struct flash_bank
  type target (line 41) | struct target
  type image (line 41) | struct image

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/jtagspi.c
  type jtagspi_flash_bank (line 19) | struct jtagspi_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 29) | FLASH_BANK_COMMAND_HANDLER(jtagspi_flash_bank_command)
  function jtagspi_set_ir (line 55) | static void jtagspi_set_ir(struct flash_bank *bank)
  function flip_u8 (line 69) | static void flip_u8(const uint8_t *in, uint8_t *out, unsigned int len)
  function jtagspi_cmd (line 75) | static int jtagspi_cmd(struct flash_bank *bank, uint8_t cmd,
  function COMMAND_HANDLER (line 150) | COMMAND_HANDLER(jtagspi_handle_set)
  function COMMAND_HANDLER (line 301) | COMMAND_HANDLER(jtagspi_handle_cmd)
  function COMMAND_HANDLER (line 352) | COMMAND_HANDLER(jtagspi_handle_always_4byte)
  function jtagspi_probe (line 377) | static int jtagspi_probe(struct flash_bank *bank)
  function jtagspi_auto_probe (line 449) | static int jtagspi_auto_probe(struct flash_bank *bank)
  function jtagspi_read_status (line 458) | static int jtagspi_read_status(struct flash_bank *bank, uint32_t *status)
  function jtagspi_wait (line 469) | static int jtagspi_wait(struct flash_bank *bank, int timeout_ms)
  function jtagspi_write_enable (line 493) | static int jtagspi_write_enable(struct flash_bank *bank)
  function jtagspi_bulk_erase (line 509) | static int jtagspi_bulk_erase(struct flash_bank *bank)
  function jtagspi_sector_erase (line 541) | static int jtagspi_sector_erase(struct flash_bank *bank, unsigned int se...
  function jtagspi_erase (line 565) | static int jtagspi_erase(struct flash_bank *bank, unsigned int first,
  function jtagspi_protect (line 615) | static int jtagspi_protect(struct flash_bank *bank, int set, unsigned in...
  function jtagspi_read (line 623) | static int jtagspi_read(struct flash_bank *bank, uint8_t *buffer, uint32...
  function jtagspi_page_write (line 664) | static int jtagspi_page_write(struct flash_bank *bank, const uint8_t *bu...
  function jtagspi_write (line 684) | static int jtagspi_write(struct flash_bank *bank, const uint8_t *buffer,...
  function jtagspi_info (line 717) | static int jtagspi_info(struct flash_bank *bank, struct command_invocati...
  type command_registration (line 744) | struct command_registration
  type command_registration (line 771) | struct command_registration
  type flash_driver (line 782) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/kinetis.c
  type kinetis_flash_bank (line 233) | struct kinetis_flash_bank {
  type kinetis_chip (line 255) | struct kinetis_chip {
  type kinetis_type (line 315) | struct kinetis_type {
  type kinetis_type (line 320) | struct kinetis_type
  type flash_driver (line 391) | struct flash_driver
  type flash_bank (line 392) | struct flash_bank
  type kinetis_chip (line 394) | struct kinetis_chip
  type flash_bank (line 395) | struct flash_bank
  function kinetis_mdm_write_register (line 398) | static int kinetis_mdm_write_register(struct adiv5_dap *dap, unsigned re...
  function kinetis_mdm_read_register (line 426) | static int kinetis_mdm_read_register(struct adiv5_dap *dap, unsigned reg...
  function kinetis_mdm_poll_register (line 452) | static int kinetis_mdm_poll_register(struct adiv5_dap *dap, unsigned reg,
  function COMMAND_HANDLER (line 477) | COMMAND_HANDLER(kinetis_mdm_halt)
  function COMMAND_HANDLER (line 540) | COMMAND_HANDLER(kinetis_mdm_reset)
  function COMMAND_HANDLER (line 581) | COMMAND_HANDLER(kinetis_mdm_mass_erase)
  function COMMAND_HANDLER (line 733) | COMMAND_HANDLER(kinetis_check_flash_security_status)
  type kinetis_chip (line 853) | struct kinetis_chip
  type target (line 853) | struct target
  type flash_bank (line 855) | struct flash_bank
  type kinetis_flash_bank (line 856) | struct kinetis_flash_bank
  function kinetis_chip_options (line 874) | static int kinetis_chip_options(struct kinetis_chip *k_chip, int argc, c...
  function FLASH_BANK_COMMAND_HANDLER (line 886) | FLASH_BANK_COMMAND_HANDLER(kinetis_flash_bank_command)
  function kinetis_free_driver_priv (line 930) | static void kinetis_free_driver_priv(struct flash_bank *bank)
  function kinetis_create_missing_banks (line 946) | static int kinetis_create_missing_banks(struct kinetis_chip *k_chip)
  function kinetis_disable_wdog_algo (line 1027) | static int kinetis_disable_wdog_algo(struct target *target, size_t code_...
  function kinetis_disable_wdog_kx (line 1071) | static int kinetis_disable_wdog_kx(struct target *target)
  function kinetis_disable_wdog32 (line 1103) | static int kinetis_disable_wdog32(struct target *target, uint32_t wdog_b...
  function kinetis_disable_wdog (line 1136) | static int kinetis_disable_wdog(struct kinetis_chip *k_chip)
  function COMMAND_HANDLER (line 1186) | COMMAND_HANDLER(kinetis_disable_wdog_handler)
  function kinetis_ftfx_decode_error (line 1203) | static int kinetis_ftfx_decode_error(uint8_t fstat)
  function kinetis_ftfx_clear_error (line 1224) | static int kinetis_ftfx_clear_error(struct target *target)
  function kinetis_ftfx_prepare (line 1231) | static int kinetis_ftfx_prepare(struct target *target)
  function kinetis_write_block (line 1263) | static int kinetis_write_block(struct flash_bank *bank, const uint8_t *b...
  function kinetis_protect (line 1354) | static int kinetis_protect(struct flash_bank *bank, int set, unsigned in...
  function kinetis_protect_check (line 1377) | static int kinetis_protect_check(struct flash_bank *bank)
  function kinetis_fill_fcf (line 1422) | static int kinetis_fill_fcf(struct flash_bank *bank, uint8_t *fcf)
  function kinetis_ftfx_command (line 1481) | static int kinetis_ftfx_command(struct target *target, uint8_t fcmd, uin...
  function kinetis_read_pmstat (line 1530) | static int kinetis_read_pmstat(struct kinetis_chip *k_chip, uint8_t *pms...
  function kinetis_check_run_mode (line 1561) | static int kinetis_check_run_mode(struct kinetis_chip *k_chip)
  function kinetis_invalidate_flash_cache (line 1621) | static void kinetis_invalidate_flash_cache(struct kinetis_chip *k_chip)
  function kinetis_erase (line 1648) | static int kinetis_erase(struct flash_bank *bank, unsigned int first,
  function kinetis_make_ram_ready (line 1706) | static int kinetis_make_ram_ready(struct target *target)
  function kinetis_write_sections (line 1737) | static int kinetis_write_sections(struct flash_bank *bank, const uint8_t...
  function kinetis_write_inner (line 1834) | static int kinetis_write_inner(struct flash_bank *bank, const uint8_t *b...
  function kinetis_write (line 1934) | static int kinetis_write(struct flash_bank *bank, const uint8_t *buffer,
  function kinetis_probe_chip (line 2051) | static int kinetis_probe_chip(struct kinetis_chip *k_chip)
  function kinetis_probe (line 2681) | static int kinetis_probe(struct flash_bank *bank)
  function kinetis_auto_probe (line 2819) | static int kinetis_auto_probe(struct flash_bank *bank)
  function kinetis_info (line 2829) | static int kinetis_info(struct flash_bank *bank, struct command_invocati...
  function kinetis_blank_check (line 2848) | static int kinetis_blank_check(struct flash_bank *bank)
  function COMMAND_HANDLER (line 2917) | COMMAND_HANDLER(kinetis_nvm_partition)
  function COMMAND_HANDLER (line 3065) | COMMAND_HANDLER(kinetis_fcf_source_handler)
  function COMMAND_HANDLER (line 3091) | COMMAND_HANDLER(kinetis_fopt_handler)
  function COMMAND_HANDLER (line 3105) | COMMAND_HANDLER(kinetis_create_banks_handler)
  type command_registration (line 3116) | struct command_registration
  type command_registration (line 3148) | struct command_registration
  type command_registration (line 3196) | struct command_registration
  type flash_driver (line 3209) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/kinetis_ke.c
  type kinetis_ke_flash_bank (line 95) | struct kinetis_ke_flash_bank {
  function kinetis_ke_mdm_write_register (line 137) | static int kinetis_ke_mdm_write_register(struct adiv5_dap *dap, unsigned...
  function kinetis_ke_mdm_read_register (line 164) | static int kinetis_ke_mdm_read_register(struct adiv5_dap *dap, unsigned ...
  function kinetis_ke_mdm_poll_register (line 190) | static int kinetis_ke_mdm_poll_register(struct adiv5_dap *dap, unsigned ...
  function kinetis_ke_prepare_flash (line 208) | static int kinetis_ke_prepare_flash(struct flash_bank *bank)
  function kinetis_ke_stop_watchdog (line 441) | static int kinetis_ke_stop_watchdog(struct target *target)
  function COMMAND_HANDLER (line 494) | COMMAND_HANDLER(kinetis_ke_disable_wdog_handler)
  function COMMAND_HANDLER (line 504) | COMMAND_HANDLER(kinetis_ke_mdm_mass_erase)
  function COMMAND_HANDLER (line 581) | COMMAND_HANDLER(kinetis_ke_check_flash_security_status)
  function FLASH_BANK_COMMAND_HANDLER (line 665) | FLASH_BANK_COMMAND_HANDLER(kinetis_ke_flash_bank_command)
  function kinetis_ke_write_words (line 688) | static int kinetis_ke_write_words(struct flash_bank *bank, const uint8_t...
  function kinetis_ke_protect (line 771) | static int kinetis_ke_protect(struct flash_bank *bank, int set,
  function kinetis_ke_protect_check (line 785) | static int kinetis_ke_protect_check(struct flash_bank *bank)
  function kinetis_ke_ftmrx_command (line 880) | static int kinetis_ke_ftmrx_command(struct flash_bank *bank, uint8_t count,
  function kinetis_ke_erase (line 939) | static int kinetis_ke_erase(struct flash_bank *bank, unsigned int first,
  function kinetis_ke_write (line 986) | static int kinetis_ke_write(struct flash_bank *bank, const uint8_t *buffer,
  function kinetis_ke_probe (line 1038) | static int kinetis_ke_probe(struct flash_bank *bank)
  function kinetis_ke_auto_probe (line 1133) | static int kinetis_ke_auto_probe(struct flash_bank *bank)
  function kinetis_ke_info (line 1143) | static int kinetis_ke_info(struct flash_bank *bank, struct command_invoc...
  function kinetis_ke_blank_check (line 1151) | static int kinetis_ke_blank_check(struct flash_bank *bank)
  type command_registration (line 1210) | struct command_registration
  type command_registration (line 1228) | struct command_registration
  type command_registration (line 1246) | struct command_registration
  type flash_driver (line 1257) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/lpc2000.c
  type lpc2000_variant (line 275) | typedef enum {
  type lpc2000_flash_bank (line 287) | struct lpc2000_flash_bank {
  type lpc2000_status_codes (line 300) | enum lpc2000_status_codes {
  function lpc2000_build_sector_list (line 326) | static int lpc2000_build_sector_list(struct flash_bank *bank)
  function lpc2000_iap_working_area_init (line 675) | static int lpc2000_iap_working_area_init(struct flash_bank *bank, struct...
  function lpc2000_iap_call (line 721) | static int lpc2000_iap_call(struct flash_bank *bank, struct working_area...
  function lpc2000_iap_blank_check (line 855) | static int lpc2000_iap_blank_check(struct flash_bank *bank, unsigned int...
  function FLASH_BANK_COMMAND_HANDLER (line 910) | FLASH_BANK_COMMAND_HANDLER(lpc2000_flash_bank_command)
  function lpc2000_erase (line 971) | static int lpc2000_erase(struct flash_bank *bank, unsigned int first,
  function lpc2000_write (line 1048) | static int lpc2000_write(struct flash_bank *bank, const uint8_t *buffer,...
  function get_lpc2000_part_id (line 1221) | static int get_lpc2000_part_id(struct flash_bank *bank, uint32_t *part_id)
  function lpc2000_auto_probe_flash (line 1252) | static int lpc2000_auto_probe_flash(struct flash_bank *bank)
  function lpc2000_probe (line 1509) | static int lpc2000_probe(struct flash_bank *bank)
  function lpc2000_erase_check (line 1534) | static int lpc2000_erase_check(struct flash_bank *bank)
  function get_lpc2000_info (line 1544) | static int get_lpc2000_info(struct flash_bank *bank, struct command_invo...
  function COMMAND_HANDLER (line 1554) | COMMAND_HANDLER(lpc2000_handle_part_id_command)
  type command_registration (line 1582) | struct command_registration
  type command_registration (line 1592) | struct command_registration
  type flash_driver (line 1603) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/lpc288x.c
  type lpc288x_flash_bank (line 76) | struct lpc288x_flash_bank {
  type flash_bank (line 88) | struct flash_bank
  type target (line 89) | struct target
  type flash_bank (line 90) | struct flash_bank
  type flash_bank (line 91) | struct flash_bank
  function lpc288x_wait_status_busy (line 93) | static uint32_t lpc288x_wait_status_busy(struct flash_bank *bank, int ti...
  function lpc288x_read_part_info (line 111) | static int lpc288x_read_part_info(struct flash_bank *bank)
  function lpc288x_protect_check (line 160) | static int lpc288x_protect_check(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 166) | FLASH_BANK_COMMAND_HANDLER(lpc288x_flash_bank_command)
  function lpc288x_set_flash_clk (line 188) | static void lpc288x_set_flash_clk(struct flash_bank *bank)
  function lpc288x_load_timer (line 203) | static void lpc288x_load_timer(int erase, struct target *target)
  function lpc288x_system_ready (line 211) | static uint32_t lpc288x_system_ready(struct flash_bank *bank)
  function lpc288x_erase (line 224) | static int lpc288x_erase(struct flash_bank *bank, unsigned int first,
  function lpc288x_write (line 257) | static int lpc288x_write(struct flash_bank *bank, const uint8_t *buffer,...
  function lpc288x_probe (line 350) | static int lpc288x_probe(struct flash_bank *bank)
  function lpc288x_protect (line 370) | static int lpc288x_protect(struct flash_bank *bank, int set, unsigned in...
  type flash_driver (line 404) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/lpc2900.c
  type lpc2900_flash_bank (line 114) | struct lpc2900_flash_bank {
  type flash_bank (line 159) | struct flash_bank
  type flash_bank (line 160) | struct flash_bank
  type flash_bank (line 161) | struct flash_bank
  type flash_bank (line 162) | struct flash_bank
  type flash_bank (line 163) | struct flash_bank
  type flash_bank (line 166) | struct flash_bank
  function lpc2900_wait_status (line 180) | static uint32_t lpc2900_wait_status(struct flash_bank *bank,
  function lpc2900_setup (line 208) | static void lpc2900_setup(struct flash_bank *bank)
  function lpc2900_is_ready (line 227) | static uint32_t lpc2900_is_ready(struct flash_bank *bank)
  function lpc2900_read_security_status (line 247) | static uint32_t lpc2900_read_security_status(struct flash_bank *bank)
  function lpc2900_run_bist128 (line 312) | static uint32_t lpc2900_run_bist128(struct flash_bank *bank,
  function lpc2900_address2sector (line 348) | static unsigned int lpc2900_address2sector(struct flash_bank *bank,
  function lpc2900_write_index_page (line 371) | static int lpc2900_write_index_page(struct flash_bank *bank,
  function lpc2900_calc_tr (line 448) | static uint32_t lpc2900_calc_tr(uint32_t clock_var, uint32_t time_var)
  function COMMAND_HANDLER (line 469) | COMMAND_HANDLER(lpc2900_handle_signature_command)
  function COMMAND_HANDLER (line 507) | COMMAND_HANDLER(lpc2900_handle_read_custom_command)
  function COMMAND_HANDLER (line 569) | COMMAND_HANDLER(lpc2900_handle_password_command)
  function COMMAND_HANDLER (line 599) | COMMAND_HANDLER(lpc2900_handle_write_custom_command)
  function COMMAND_HANDLER (line 697) | COMMAND_HANDLER(lpc2900_handle_secure_sector_command)
  function COMMAND_HANDLER (line 778) | COMMAND_HANDLER(lpc2900_handle_secure_jtag_command)
  type command_registration (line 824) | struct command_registration
  type command_registration (line 874) | struct command_registration
  function FLASH_BANK_COMMAND_HANDLER (line 886) | FLASH_BANK_COMMAND_HANDLER(lpc2900_flash_bank_command)
  function lpc2900_erase (line 935) | static int lpc2900_erase(struct flash_bank *bank, unsigned int first,
  function lpc2900_write (line 1045) | static int lpc2900_write(struct flash_bank *bank, const uint8_t *buffer,
  function lpc2900_probe (line 1360) | static int lpc2900_probe(struct flash_bank *bank)
  function lpc2900_erase_check (line 1519) | static int lpc2900_erase_check(struct flash_bank *bank)
  function lpc2900_protect_check (line 1567) | static int lpc2900_protect_check(struct flash_bank *bank)
  type flash_driver (line 1572) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/lpcspifi.c
  type lpcspifi_flash_bank (line 38) | struct lpcspifi_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 50) | FLASH_BANK_COMMAND_HANDLER(lpcspifi_flash_bank_command)
  function ioconfig_write_reg (line 69) | static inline int ioconfig_write_reg(struct target *target, uint32_t ioc...
  function ssp_write_reg (line 74) | static inline int ssp_write_reg(struct target *target, uint32_t ssp_base...
  function io_write_reg (line 79) | static inline int io_write_reg(struct target *target, uint32_t io_base, ...
  function ssp_read_reg (line 84) | static inline int ssp_read_reg(struct target *target, uint32_t ssp_base,...
  function ssp_setcs (line 89) | static int ssp_setcs(struct target *target, uint32_t io_base, unsigned i...
  function poll_ssp_busy (line 96) | static int poll_ssp_busy(struct target *target, uint32_t ssp_base, int t...
  function lpcspifi_set_hw_mode (line 123) | static int lpcspifi_set_hw_mode(struct flash_bank *bank)
  function lpcspifi_set_sw_mode (line 225) | static int lpcspifi_set_sw_mode(struct flash_bank *bank)
  function read_status_reg (line 279) | static int read_status_reg(struct flash_bank *bank, uint32_t *status)
  function wait_till_ready (line 313) | static int wait_till_ready(struct flash_bank *bank, int timeout)
  function lpcspifi_write_enable (line 336) | static int lpcspifi_write_enable(struct flash_bank *bank)
  function lpcspifi_bulk_erase (line 370) | static int lpcspifi_bulk_erase(struct flash_bank *bank)
  function lpcspifi_erase (line 406) | static int lpcspifi_erase(struct flash_bank *bank, unsigned int first,
  function lpcspifi_protect (line 562) | static int lpcspifi_protect(struct flash_bank *bank, int set,
  function lpcspifi_write (line 570) | static int lpcspifi_write(struct flash_bank *bank, const uint8_t *buffer,
  function lpcspifi_read_flash_id (line 758) | static int lpcspifi_read_flash_id(struct flash_bank *bank, uint32_t *id)
  function lpcspifi_probe (line 830) | static int lpcspifi_probe(struct flash_bank *bank)
  function lpcspifi_auto_probe (line 904) | static int lpcspifi_auto_probe(struct flash_bank *bank)
  function lpcspifi_protect_check (line 912) | static int lpcspifi_protect_check(struct flash_bank *bank)
  function get_lpcspifi_info (line 918) | static int get_lpcspifi_info(struct flash_bank *bank, struct command_inv...
  type flash_driver (line 934) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/max32xxx.c
  type flash_bank (line 60) | struct flash_bank
  type max32xxx_flash_bank (line 62) | struct max32xxx_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 81) | FLASH_BANK_COMMAND_HANDLER(max32xxx_flash_bank_command)
  function get_info (line 106) | static int get_info(struct flash_bank *bank, struct command_invocation *...
  function max32xxx_flash_op_pre (line 121) | static int max32xxx_flash_op_pre(struct flash_bank *bank)
  function max32xxx_flash_op_post (line 179) | static int max32xxx_flash_op_post(struct flash_bank *bank)
  function max32xxx_protect_check (line 195) | static int max32xxx_protect_check(struct flash_bank *bank)
  function max32xxx_erase (line 224) | static int max32xxx_erase(struct flash_bank *bank, unsigned int first,
  function max32xxx_protect (line 309) | static int max32xxx_protect(struct flash_bank *bank, int set,
  function max32xxx_write_block (line 350) | static int max32xxx_write_block(struct flash_bank *bank, const uint8_t *...
  function max32xxx_write (line 427) | static int max32xxx_write(struct flash_bank *bank, const uint8_t *buffer,
  function max32xxx_probe (line 632) | static int max32xxx_probe(struct flash_bank *bank)
  function max32xxx_mass_erase (line 678) | static int max32xxx_mass_erase(struct flash_bank *bank)
  function COMMAND_HANDLER (line 749) | COMMAND_HANDLER(max32xxx_handle_mass_erase_command)
  function COMMAND_HANDLER (line 770) | COMMAND_HANDLER(max32xxx_handle_protection_set_command)
  function COMMAND_HANDLER (line 826) | COMMAND_HANDLER(max32xxx_handle_protection_clr_command)
  function COMMAND_HANDLER (line 882) | COMMAND_HANDLER(max32xxx_handle_protection_check_command)
  type command_registration (line 917) | struct command_registration
  type command_registration (line 949) | struct command_registration
  type flash_driver (line 960) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/mdr.c
  type mdr_flash_bank (line 53) | struct mdr_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 61) | FLASH_BANK_COMMAND_HANDLER(mdr_flash_bank_command)
  function mdr_mass_erase (line 78) | static int mdr_mass_erase(struct flash_bank *bank)
  function mdr_erase (line 116) | static int mdr_erase(struct flash_bank *bank, unsigned int first,
  function mdr_write_block (line 204) | static int mdr_write_block(struct flash_bank *bank, const uint8_t *buffer,
  function mdr_write (line 295) | static int mdr_write(struct flash_bank *bank, const uint8_t *buffer,
  function mdr_read (line 461) | static int mdr_read(struct flash_bank *bank, uint8_t *buffer,
  function mdr_probe (line 555) | static int mdr_probe(struct flash_bank *bank)
  function mdr_auto_probe (line 580) | static int mdr_auto_probe(struct flash_bank *bank)
  function get_mdr_info (line 588) | static int get_mdr_info(struct flash_bank *bank, struct command_invocati...
  type flash_driver (line 597) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/mrvlqspi.c
  type mrvlqspi_flash_bank (line 64) | struct mrvlqspi_flash_bank {
  function mrvlqspi_get_reg (line 71) | static inline uint32_t mrvlqspi_get_reg(struct flash_bank *bank, uint32_...
  function mrvlqspi_set_din_cnt (line 77) | static inline int mrvlqspi_set_din_cnt(struct flash_bank *bank, uint32_t...
  function mrvlqspi_set_addr (line 84) | static inline int mrvlqspi_set_addr(struct flash_bank *bank, uint32_t addr)
  function mrvlqspi_set_instr (line 91) | static inline int mrvlqspi_set_instr(struct flash_bank *bank, uint32_t i...
  function mrvlqspi_set_hdr_cnt (line 98) | static inline int mrvlqspi_set_hdr_cnt(struct flash_bank *bank, uint32_t...
  function mrvlqspi_set_conf (line 105) | static int mrvlqspi_set_conf(struct flash_bank *bank, uint32_t conf_val)
  function mrvlqspi_set_ss_state (line 123) | static int mrvlqspi_set_ss_state(struct flash_bank *bank, bool state, in...
  function mrvlqspi_start_transfer (line 162) | static int mrvlqspi_start_transfer(struct flash_bank *bank, bool rw_mode)
  function mrvlqspi_stop_transfer (line 192) | static int mrvlqspi_stop_transfer(struct flash_bank *bank)
  function mrvlqspi_fifo_flush (line 251) | static int mrvlqspi_fifo_flush(struct flash_bank *bank, int timeout)
  function mrvlqspi_read_byte (line 287) | static int mrvlqspi_read_byte(struct flash_bank *bank, uint8_t *data)
  function mrvlqspi_flash_busy_status (line 315) | static int mrvlqspi_flash_busy_status(struct flash_bank *bank, int timeout)
  function mrvlqspi_set_write_status (line 366) | static int mrvlqspi_set_write_status(struct flash_bank *bank, bool mode)
  function mrvlqspi_read_id (line 402) | static int mrvlqspi_read_id(struct flash_bank *bank, uint32_t *id)
  function mrvlqspi_block_erase (line 454) | static int mrvlqspi_block_erase(struct flash_bank *bank, uint32_t offset)
  function mrvlqspi_bulk_erase (line 490) | static int mrvlqspi_bulk_erase(struct flash_bank *bank)
  function mrvlqspi_flash_erase (line 519) | static int mrvlqspi_flash_erase(struct flash_bank *bank, unsigned int fi...
  function mrvlqspi_flash_write (line 578) | static int mrvlqspi_flash_write(struct flash_bank *bank, const uint8_t *...
  function mrvlqspi_flash_read (line 753) | static int mrvlqspi_flash_read(struct flash_bank *bank, uint8_t *buffer,
  function mrvlqspi_probe (line 818) | static int mrvlqspi_probe(struct flash_bank *bank)
  function mrvlqspi_auto_probe (line 892) | static int mrvlqspi_auto_probe(struct flash_bank *bank)
  function mrvlqspi_flash_erase_check (line 900) | static int mrvlqspi_flash_erase_check(struct flash_bank *bank)
  function mrvlqspi_get_info (line 906) | static int mrvlqspi_get_info(struct flash_bank *bank, struct command_inv...
  function FLASH_BANK_COMMAND_HANDLER (line 922) | FLASH_BANK_COMMAND_HANDLER(mrvlqspi_flash_bank_command)
  type flash_driver (line 943) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/msp432.c
  type msp432_bank (line 35) | struct msp432_bank {
  type flash_bank (line 63) | struct flash_bank
  function msp432_device_type (line 65) | static int msp432_device_type(uint32_t family_type, uint32_t device_id,
  function msp432_init_params (line 171) | static void msp432_init_params(struct msp432_algo_params *algo_params)
  function msp432_exec_cmd (line 184) | static int msp432_exec_cmd(struct target *target, struct msp432_algo_params
  function msp432_wait_return_code (line 207) | static int msp432_wait_return_code(struct target *target)
  function msp432_wait_inactive (line 237) | static int msp432_wait_inactive(struct target *target, uint32_t buffer)
  function msp432_init (line 279) | static int msp432_init(struct flash_bank *bank)
  function msp432_quit (line 401) | static int msp432_quit(struct flash_bank *bank)
  function msp432_mass_erase (line 432) | static int msp432_mass_erase(struct flash_bank *bank, bool all)
  function COMMAND_HANDLER (line 478) | COMMAND_HANDLER(msp432_mass_erase_command)
  function COMMAND_HANDLER (line 529) | COMMAND_HANDLER(msp432_bsl_command)
  function FLASH_BANK_COMMAND_HANDLER (line 568) | FLASH_BANK_COMMAND_HANDLER(msp432_flash_bank_command)
  function msp432_erase (line 598) | static int msp432_erase(struct flash_bank *bank, unsigned int first,
  function msp432_write (line 673) | static int msp432_write(struct flash_bank *bank, const uint8_t *buffer,
  function msp432_probe (line 808) | static int msp432_probe(struct flash_bank *bank)
  function msp432_auto_probe (line 964) | static int msp432_auto_probe(struct flash_bank *bank)
  function msp432_info (line 983) | static int msp432_info(struct flash_bank *bank, struct command_invocatio...
  function msp432_protect_check (line 1030) | static int msp432_protect_check(struct flash_bank *bank)
  function msp432_flash_free_driver_priv (line 1036) | static void msp432_flash_free_driver_priv(struct flash_bank *bank)
  type command_registration (line 1049) | struct command_registration
  type command_registration (line 1067) | struct command_registration
  type flash_driver (line 1078) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/msp432.h
  type msp432_algo_params (line 92) | struct msp432_algo_params {

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/niietcm4.c
  type niietcm4_flash_bank (line 114) | struct niietcm4_flash_bank {
  function niietcm4_opstatus_check (line 142) | static int niietcm4_opstatus_check(struct flash_bank *bank)
  function niietcm4_uopstatus_check (line 179) | static int niietcm4_uopstatus_check(struct flash_bank *bank)
  function niietcm4_dump_uflash_page (line 219) | static int niietcm4_dump_uflash_page(struct flash_bank *bank, uint32_t *...
  function niietcm4_load_uflash_page (line 255) | static int niietcm4_load_uflash_page(struct flash_bank *bank, uint32_t *...
  function niietcm4_uflash_page_erase (line 291) | static int niietcm4_uflash_page_erase(struct flash_bank *bank, int page_...
  function niietcm4_uflash_protect (line 322) | static int niietcm4_uflash_protect(struct flash_bank *bank, int mem_type,
  function COMMAND_HANDLER (line 377) | COMMAND_HANDLER(niietcm4_handle_uflash_read_byte_command)
  function COMMAND_HANDLER (line 424) | COMMAND_HANDLER(niietcm4_handle_uflash_write_byte_command)
  function COMMAND_HANDLER (line 480) | COMMAND_HANDLER(niietcm4_handle_uflash_full_erase_command)
  function COMMAND_HANDLER (line 518) | COMMAND_HANDLER(niietcm4_handle_uflash_erase_command)
  function COMMAND_HANDLER (line 561) | COMMAND_HANDLER(niietcm4_handle_uflash_protect_check_command)
  function COMMAND_HANDLER (line 652) | COMMAND_HANDLER(niietcm4_handle_uflash_protect_command)
  function COMMAND_HANDLER (line 704) | COMMAND_HANDLER(niietcm4_handle_bflash_info_remap_command)
  function COMMAND_HANDLER (line 754) | COMMAND_HANDLER(niietcm4_handle_extmem_cfg_command)
  function COMMAND_HANDLER (line 831) | COMMAND_HANDLER(niietcm4_handle_extmem_boot_command)
  function COMMAND_HANDLER (line 882) | COMMAND_HANDLER(niietcm4_handle_service_mode_erase_command)
  function COMMAND_HANDLER (line 921) | COMMAND_HANDLER(niietcm4_handle_driver_info_command)
  type command_registration (line 941) | struct command_registration
  type command_registration (line 1022) | struct command_registration
  function FLASH_BANK_COMMAND_HANDLER (line 1038) | FLASH_BANK_COMMAND_HANDLER(niietcm4_flash_bank_command)
  function niietcm4_protect_check (line 1067) | static int niietcm4_protect_check(struct flash_bank *bank)
  function niietcm4_mass_erase (line 1135) | static int niietcm4_mass_erase(struct flash_bank *bank)
  function niietcm4_erase (line 1156) | static int niietcm4_erase(struct flash_bank *bank, unsigned int first,
  function niietcm4_protect (line 1203) | static int niietcm4_protect(struct flash_bank *bank, int set,
  function niietcm4_write_block (line 1265) | static int niietcm4_write_block(struct flash_bank *bank, const uint8_t *...
  function niietcm4_write (line 1359) | static int niietcm4_write(struct flash_bank *bank, const uint8_t *buffer,
  function niietcm4_probe_k1921vk01t (line 1463) | static int niietcm4_probe_k1921vk01t(struct flash_bank *bank)
  function niietcm4_probe (line 1664) | static int niietcm4_probe(struct flash_bank *bank)
  function niietcm4_auto_probe (line 1701) | static int niietcm4_auto_probe(struct flash_bank *bank)
  function get_niietcm4_info (line 1709) | static int get_niietcm4_info(struct flash_bank *bank, struct command_inv...
  type flash_driver (line 1718) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/non_cfi.c
  type non_cfi (line 23) | struct non_cfi
  function cfi_fixup_non_cfi (line 458) | void cfi_fixup_non_cfi(struct flash_bank *bank)

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/non_cfi.h
  type non_cfi (line 11) | struct non_cfi {
  type flash_bank (line 23) | struct flash_bank

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/npcx.c
  type npcx_flash_device_index (line 28) | enum npcx_flash_device_index {
  type npcx_flash_bank (line 35) | struct npcx_flash_bank {
  type npcx_flash_info (line 49) | struct npcx_flash_info {
  type npcx_flash_info (line 55) | struct npcx_flash_info
  function npcx_init (line 77) | static int npcx_init(struct flash_bank *bank)
  function npcx_quit (line 136) | static int npcx_quit(struct flash_bank *bank)
  function npcx_wait_algo_done (line 154) | static int npcx_wait_algo_done(struct flash_bank *bank, uint32_t params_...
  function npcx_get_flash_id (line 184) | static enum npcx_flash_device_index npcx_get_flash_id(struct flash_bank ...
  function npcx_get_flash (line 228) | static int npcx_get_flash(uint32_t flash_id)
  function npcx_probe (line 238) | static int npcx_probe(struct flash_bank *bank)
  function npcx_auto_probe (line 288) | static int npcx_auto_probe(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 299) | FLASH_BANK_COMMAND_HANDLER(npcx_flash_bank_command)
  function npcx_chip_erase (line 323) | static int npcx_chip_erase(struct flash_bank *bank)
  function npcx_erase (line 370) | static int npcx_erase(struct flash_bank *bank, unsigned int first,
  function npcx_write (line 428) | static int npcx_write(struct flash_bank *bank, const uint8_t *buffer,
  function npcx_info (line 500) | static int npcx_info(struct flash_bank *bank, struct command_invocation ...
  type flash_driver (line 511) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/nrf5.c
  type nrf5_ficr_registers (line 29) | enum nrf5_ficr_registers {
  type nrf5_uicr_registers (line 80) | enum nrf5_uicr_registers {
  type nrf5_nvmc_registers (line 92) | enum nrf5_nvmc_registers {
  type nrf5_nvmc_config_bits (line 107) | enum nrf5_nvmc_config_bits {
  type nrf52_ficr_info (line 114) | struct nrf52_ficr_info {
  type nrf5_features (line 122) | enum nrf5_features {
  type nrf5_device_spec (line 129) | struct nrf5_device_spec {
  type nrf5_info (line 138) | struct nrf5_info {
  type nrf5_device_spec (line 194) | struct nrf5_device_spec
  type nrf5_device_package (line 266) | struct nrf5_device_package {
  type nrf5_device_package (line 273) | struct nrf5_device_package
  type flash_driver (line 280) | struct flash_driver
  function nrf5_bank_is_probed (line 282) | static bool nrf5_bank_is_probed(const struct flash_bank *bank)
  type flash_bank (line 290) | struct flash_bank
  function nrf5_get_probed_chip_if_halted (line 292) | static int nrf5_get_probed_chip_if_halted(struct flash_bank *bank, struc...
  function nrf5_wait_for_nvmc (line 308) | static int nrf5_wait_for_nvmc(struct nrf5_info *chip)
  function nrf5_nvmc_erase_enable (line 333) | static int nrf5_nvmc_erase_enable(struct nrf5_info *chip)
  function nrf5_nvmc_write_enable (line 356) | static int nrf5_nvmc_write_enable(struct nrf5_info *chip)
  function nrf5_nvmc_read_only (line 379) | static int nrf5_nvmc_read_only(struct nrf5_info *chip)
  function nrf5_nvmc_generic_erase (line 401) | static int nrf5_nvmc_generic_erase(struct nrf5_info *chip,
  function nrf5_protect_check_clenr0 (line 430) | static int nrf5_protect_check_clenr0(struct flash_bank *bank)
  function nrf5_protect_check_bprot (line 462) | static int nrf5_protect_check_bprot(struct flash_bank *bank)
  function nrf5_protect_check (line 489) | static int nrf5_protect_check(struct flash_bank *bank)
  function nrf5_protect_clenr0 (line 510) | static int nrf5_protect_clenr0(struct flash_bank *bank, int set, unsigne...
  function nrf5_protect (line 570) | static int nrf5_protect(struct flash_bank *bank, int set, unsigned int f...
  function nrf5_info_variant_to_str (line 593) | static bool nrf5_info_variant_to_str(uint32_t variant, char *bf)
  function get_nrf5_chip_type_str (line 617) | static int get_nrf5_chip_type_str(const struct nrf5_info *chip, char *bu...
  function nrf5_info (line 642) | static int nrf5_info(struct flash_bank *bank, struct command_invocation ...
  function nrf5_read_ficr_info (line 656) | static int nrf5_read_ficr_info(struct nrf5_info *chip)
  function nrf5_get_ram_size (line 722) | static int nrf5_get_ram_size(struct target *target, uint32_t *ram_size)
  function nrf5_probe (line 755) | static int nrf5_probe(struct flash_bank *bank)
  function nrf5_auto_probe (line 869) | static int nrf5_auto_probe(struct flash_bank *bank)
  function nrf5_erase_all (line 877) | static int nrf5_erase_all(struct nrf5_info *chip)
  function nrf5_erase_page (line 885) | static int nrf5_erase_page(struct flash_bank *bank,
  function nrf5_ll_flash_write (line 930) | static int nrf5_ll_flash_write(struct nrf5_info *chip, uint32_t address,...
  function nrf5_write (line 1024) | static int nrf5_write(struct flash_bank *bank, const uint8_t *buffer,
  function nrf5_erase (line 1080) | static int nrf5_erase(struct flash_bank *bank, unsigned int first,
  function nrf5_free_driver_priv (line 1122) | static void nrf5_free_driver_priv(struct flash_bank *bank)
  type nrf5_info (line 1136) | struct nrf5_info
  type target (line 1136) | struct target
  type flash_bank (line 1138) | struct flash_bank
  type nrf5_bank (line 1148) | struct nrf5_bank
  function FLASH_BANK_COMMAND_HANDLER (line 1158) | FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
  function COMMAND_HANDLER (line 1201) | COMMAND_HANDLER(nrf5_handle_mass_erase_command)
  function COMMAND_HANDLER (line 1248) | COMMAND_HANDLER(nrf5_handle_info_command)
  type command_registration (line 1380) | struct command_registration
  type command_registration (line 1398) | struct command_registration
  type flash_driver (line 1416) | struct flash_driver
  type flash_driver (line 1434) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/numicro.c
  type numicro_flash_bank_type (line 110) | struct numicro_flash_bank_type {
  type numicro_cpu_type (line 116) | struct numicro_cpu_type {
  type numicro_cpu_type (line 131) | struct numicro_cpu_type
  type numicro_flash_bank (line 532) | struct  numicro_flash_bank {
  function numicro_get_arm_arch (line 543) | static int numicro_get_arm_arch(struct target *target)
  function numicro_reg_unlock (line 560) | static int numicro_reg_unlock(struct target *target)
  function numicro_init_isp (line 597) | static int numicro_init_isp(struct target *target)
  function numicro_fmc_cmd (line 639) | static uint32_t numicro_fmc_cmd(struct target *target, uint32_t cmd, uin...
  function numicro_writeblock (line 692) | static int numicro_writeblock(struct flash_bank *bank, const uint8_t *bu...
  function numicro_protect_check (line 809) | static int numicro_protect_check(struct flash_bank *bank)
  function numicro_erase (line 855) | static int numicro_erase(struct flash_bank *bank, unsigned int first,
  function numicro_write (line 926) | static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
  function numicro_get_cpu_type (line 1027) | static int numicro_get_cpu_type(struct target *target, const struct numi...
  function numicro_get_flash_size (line 1053) | static int numicro_get_flash_size(struct flash_bank *bank, const struct ...
  function numicro_probe (line 1066) | static int numicro_probe(struct flash_bank *bank)
  function numicro_auto_probe (line 1109) | static int numicro_auto_probe(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 1119) | FLASH_BANK_COMMAND_HANDLER(numicro_flash_bank_command)
  function COMMAND_HANDLER (line 1138) | COMMAND_HANDLER(numicro_handle_read_isp_command)
  function COMMAND_HANDLER (line 1165) | COMMAND_HANDLER(numicro_handle_write_isp_command)
  function COMMAND_HANDLER (line 1192) | COMMAND_HANDLER(numicro_handle_chip_erase_command)
  type command_registration (line 1218) | struct command_registration
  type command_registration (line 1243) | struct command_registration
  type flash_driver (line 1254) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/ocl.c
  type ocl_priv (line 16) | struct ocl_priv {
  function FLASH_BANK_COMMAND_HANDLER (line 23) | FLASH_BANK_COMMAND_HANDLER(ocl_flash_bank_command)
  function ocl_erase (line 43) | static int ocl_erase(struct flash_bank *bank, unsigned int first,
  function ocl_write (line 94) | static int ocl_write(struct flash_bank *bank, const uint8_t *buffer, uin...
  function ocl_probe (line 194) | static int ocl_probe(struct flash_bank *bank)
  function ocl_auto_probe (line 296) | static int ocl_auto_probe(struct flash_bank *bank)
  type flash_driver (line 306) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/pic32mx.c
  type pic32mx_flash_bank (line 86) | struct pic32mx_flash_bank {
  type pic32mx_devs_s (line 95) | struct pic32mx_devs_s {
  function FLASH_BANK_COMMAND_HANDLER (line 193) | FLASH_BANK_COMMAND_HANDLER(pic32mx_flash_bank_command)
  function pic32mx_get_flash_status (line 209) | static uint32_t pic32mx_get_flash_status(struct flash_bank *bank)
  function pic32mx_wait_status_busy (line 219) | static uint32_t pic32mx_wait_status_busy(struct flash_bank *bank, int ti...
  function pic32mx_nvm_exec (line 234) | static int pic32mx_nvm_exec(struct flash_bank *bank, uint32_t op, uint32...
  function pic32mx_protect_check (line 256) | static int pic32mx_protect_check(struct flash_bank *bank)
  function pic32mx_erase (line 312) | static int pic32mx_erase(struct flash_bank *bank, unsigned int first,
  function pic32mx_protect (line 350) | static int pic32mx_protect(struct flash_bank *bank, int set, unsigned in...
  function pic32mx_write_block (line 432) | static int pic32mx_write_block(struct flash_bank *bank, const uint8_t *b...
  function pic32mx_write_word (line 586) | static int pic32mx_write_word(struct flash_bank *bank, uint32_t address,...
  function pic32mx_write (line 596) | static int pic32mx_write(struct flash_bank *bank, const uint8_t *buffer,...
  function pic32mx_probe (line 679) | static int pic32mx_probe(struct flash_bank *bank)
  function pic32mx_auto_probe (line 784) | static int pic32mx_auto_probe(struct flash_bank *bank)
  function pic32mx_info (line 792) | static int pic32mx_info(struct flash_bank *bank, struct command_invocati...
  function COMMAND_HANDLER (line 826) | COMMAND_HANDLER(pic32mx_handle_pgm_word_command)
  function COMMAND_HANDLER (line 862) | COMMAND_HANDLER(pic32mx_handle_unlock_command)
  type command_registration (line 923) | struct command_registration
  type command_registration (line 941) | struct command_registration
  type flash_driver (line 952) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/psoc4.c
  type psoc4_chip_family (line 125) | struct psoc4_chip_family {
  type psoc4_chip_family (line 131) | struct psoc4_chip_family
  type psoc4_flash_bank (line 146) | struct psoc4_flash_bank {
  type psoc4_chip_family (line 160) | struct psoc4_chip_family
  type psoc4_chip_family (line 162) | struct psoc4_chip_family
  function FLASH_BANK_COMMAND_HANDLER (line 189) | FLASH_BANK_COMMAND_HANDLER(psoc4_flash_bank_command)
  function psoc4_sysreq (line 214) | static int psoc4_sysreq(struct flash_bank *bank, uint8_t cmd,
  function psoc4_get_silicon_id (line 361) | static int psoc4_get_silicon_id(struct flash_bank *bank, uint32_t *silic...
  function psoc4_get_family (line 401) | static int psoc4_get_family(struct target *target, uint16_t *family_id)
  function psoc4_flash_prepare (line 433) | static int psoc4_flash_prepare(struct flash_bank *bank)
  function psoc4_protect_check (line 481) | static int psoc4_protect_check(struct flash_bank *bank)
  function psoc4_mass_erase (line 504) | static int psoc4_mass_erase(struct flash_bank *bank)
  function psoc4_erase (line 518) | static int psoc4_erase(struct flash_bank *bank, unsigned int first,
  function psoc4_protect (line 536) | static int psoc4_protect(struct flash_bank *bank, int set, unsigned int ...
  function COMMAND_HANDLER (line 602) | COMMAND_HANDLER(psoc4_handle_flash_autoerase_command)
  function psoc4_write (line 630) | static int psoc4_write(struct flash_bank *bank, const uint8_t *buffer,
  function psoc4_test_flash_wounding (line 700) | static int psoc4_test_flash_wounding(struct target *target, uint32_t fla...
  function psoc4_probe (line 714) | static int psoc4_probe(struct flash_bank *bank)
  function psoc4_auto_probe (line 822) | static int psoc4_auto_probe(struct flash_bank *bank)
  function get_psoc4_info (line 831) | static int get_psoc4_info(struct flash_bank *bank, struct command_invoca...
  function COMMAND_HANDLER (line 871) | COMMAND_HANDLER(psoc4_handle_mass_erase_command)
  type command_registration (line 891) | struct command_registration
  type command_registration (line 909) | struct command_registration
  type flash_driver (line 920) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/psoc5lp.c
  type psoc5lp_device (line 103) | struct psoc5lp_device {
  type psoc5lp_device (line 115) | struct psoc5lp_device
  function psoc5lp_get_part_number (line 190) | static void psoc5lp_get_part_number(const struct psoc5lp_device *dev, ch...
  function psoc5lp_get_device_id (line 233) | static int psoc5lp_get_device_id(struct target *target, uint32_t *id)
  function psoc5lp_find_device (line 244) | static int psoc5lp_find_device(struct target *target,
  function psoc5lp_spc_enable_clock (line 269) | static int psoc5lp_spc_enable_clock(struct target *target)
  function psoc5lp_spc_write_opcode (line 290) | static int psoc5lp_spc_write_opcode(struct target *target, uint8_t opcode)
  function psoc5lp_spc_write_opcode_buffer (line 304) | static void psoc5lp_spc_write_opcode_buffer(struct target *target,
  function psoc5lp_spc_busy_wait_data (line 312) | static int psoc5lp_spc_busy_wait_data(struct target *target)
  function psoc5lp_spc_busy_wait_idle (line 335) | static int psoc5lp_spc_busy_wait_idle(struct target *target)
  function psoc5lp_spc_load_byte (line 358) | static int psoc5lp_spc_load_byte(struct target *target,
  function psoc5lp_spc_load_row (line 383) | static int psoc5lp_spc_load_row(struct target *target,
  function psoc5lp_spc_read_byte (line 409) | static int psoc5lp_spc_read_byte(struct target *target,
  function psoc5lp_spc_write_row (line 439) | static int psoc5lp_spc_write_row(struct target *target,
  function psoc5lp_spc_write_user_nvl (line 470) | static int psoc5lp_spc_write_user_nvl(struct target *target,
  function psoc5lp_spc_erase_sector (line 489) | static int psoc5lp_spc_erase_sector(struct target *target,
  function psoc5lp_spc_erase_all (line 511) | static int psoc5lp_spc_erase_all(struct target *target)
  function psoc5lp_spc_read_hidden_row (line 526) | static int psoc5lp_spc_read_hidden_row(struct target *target,
  function psoc5lp_spc_get_temp (line 558) | static int psoc5lp_spc_get_temp(struct target *target, uint8_t samples,
  function psoc5lp_spc_read_volatile_byte (line 588) | static int psoc5lp_spc_read_volatile_byte(struct target *target,
  type psoc5lp_nvl_flash_bank (line 622) | struct psoc5lp_nvl_flash_bank {
  function psoc5lp_nvl_read (line 627) | static int psoc5lp_nvl_read(struct flash_bank *bank,
  function psoc5lp_nvl_erase (line 649) | static int psoc5lp_nvl_erase(struct flash_bank *bank, unsigned int first,
  function psoc5lp_nvl_erase_check (line 656) | static int psoc5lp_nvl_erase_check(struct flash_bank *bank)
  function psoc5lp_nvl_write (line 664) | static int psoc5lp_nvl_write(struct flash_bank *bank,
  function psoc5lp_nvl_get_info_command (line 744) | static int psoc5lp_nvl_get_info_command(struct flash_bank *bank,
  function psoc5lp_nvl_probe (line 757) | static int psoc5lp_nvl_probe(struct flash_bank *bank)
  function psoc5lp_nvl_auto_probe (line 789) | static int psoc5lp_nvl_auto_probe(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 799) | FLASH_BANK_COMMAND_HANDLER(psoc5lp_nvl_flash_bank_command)
  type flash_driver (line 814) | struct flash_driver
  type psoc5lp_eeprom_flash_bank (line 831) | struct psoc5lp_eeprom_flash_bank {
  function psoc5lp_eeprom_erase (line 836) | static int psoc5lp_eeprom_erase(struct flash_bank *bank, unsigned int fi...
  function psoc5lp_eeprom_write (line 851) | static int psoc5lp_eeprom_write(struct flash_bank *bank,
  function psoc5lp_eeprom_get_info_command (line 910) | static int psoc5lp_eeprom_get_info_command(struct flash_bank *bank, stru...
  function psoc5lp_eeprom_probe (line 922) | static int psoc5lp_eeprom_probe(struct flash_bank *bank)
  function psoc5lp_eeprom_auto_probe (line 971) | static int psoc5lp_eeprom_auto_probe(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 981) | FLASH_BANK_COMMAND_HANDLER(psoc5lp_eeprom_flash_bank_command)
  type flash_driver (line 997) | struct flash_driver
  type psoc5lp_flash_bank (line 1014) | struct psoc5lp_flash_bank {
  function psoc5lp_erase (line 1024) | static int psoc5lp_erase(struct flash_bank *bank, unsigned int first,
  function psoc5lp_erase_check (line 1056) | static int psoc5lp_erase_check(struct flash_bank *bank)
  function psoc5lp_write (line 1119) | static int psoc5lp_write(struct flash_bank *bank, const uint8_t *buffer,
  function psoc5lp_protect_check (line 1306) | static int psoc5lp_protect_check(struct flash_bank *bank)
  function psoc5lp_get_info_command (line 1357) | static int psoc5lp_get_info_command(struct flash_bank *bank, struct comm...
  function psoc5lp_probe (line 1371) | static int psoc5lp_probe(struct flash_bank *bank)
  function psoc5lp_auto_probe (line 1443) | static int psoc5lp_auto_probe(struct flash_bank *bank)
  function COMMAND_HANDLER (line 1448) | COMMAND_HANDLER(psoc5lp_handle_mass_erase_command)
  function FLASH_BANK_COMMAND_HANDLER (line 1469) | FLASH_BANK_COMMAND_HANDLER(psoc5lp_flash_bank_command)
  type command_registration (line 1485) | struct command_registration
  type command_registration (line 1498) | struct command_registration
  type flash_driver (line 1509) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/psoc6.c
  type psoc6_target_info (line 76) | struct psoc6_target_info {
  type timeout (line 84) | struct timeout {
  type row_region (line 89) | struct row_region {
  type row_region (line 94) | struct row_region
  type working_area (line 103) | struct working_area
  type armv7m_algorithm (line 104) | struct armv7m_algorithm
  function timeout_init (line 111) | static void timeout_init(struct timeout *to, long timeout_ms)
  function timeout_expired (line 122) | static bool timeout_expired(struct timeout *to)
  function sromalgo_prepare (line 135) | static int sromalgo_prepare(struct target *target)
  function sromalgo_release (line 187) | static void sromalgo_release(struct target *target)
  function ipc_poll_lock_stat (line 223) | static int ipc_poll_lock_stat(struct target *target, uint32_t ipc_id, bo...
  function ipc_acquire (line 267) | static int ipc_acquire(struct target *target, char ipc_id)
  function call_sromapi (line 315) | static int call_sromapi(struct target *target,
  function get_silicon_id (line 377) | static int get_silicon_id(struct target *target, uint32_t *si_id, uint8_...
  function psoc6_protect_check (line 412) | static int psoc6_protect_check(struct flash_bank *bank)
  function psoc6_protect (line 445) | static int psoc6_protect(struct flash_bank *bank, int set, unsigned int ...
  function psoc6_get_info (line 485) | static int psoc6_get_info(struct flash_bank *bank, struct command_invoca...
  function is_sflash_bank (line 513) | static bool is_sflash_bank(struct flash_bank *bank)
  function is_wflash_bank (line 528) | static inline bool is_wflash_bank(struct flash_bank *bank)
  function is_mflash_bank (line 538) | static inline bool is_mflash_bank(struct flash_bank *bank)
  function psoc6_probe (line 551) | static int psoc6_probe(struct flash_bank *bank)
  function psoc6_auto_probe (line 619) | static int psoc6_auto_probe(struct flash_bank *bank)
  function psoc6_erase_sector (line 639) | static int psoc6_erase_sector(struct flash_bank *bank, struct working_ar...
  function psoc6_erase_row (line 668) | static int psoc6_erase_row(struct flash_bank *bank, struct working_area ...
  function psoc6_erase (line 699) | static int psoc6_erase(struct flash_bank *bank, unsigned int first,
  function psoc6_program_row (line 759) | static int psoc6_program_row(struct flash_bank *bank,
  function psoc6_program (line 816) | static int psoc6_program(struct flash_bank *bank,
  function COMMAND_HANDLER (line 860) | COMMAND_HANDLER(psoc6_handle_mass_erase_command)
  function handle_reset_halt (line 886) | static int handle_reset_halt(struct target *target)
  function COMMAND_HANDLER (line 968) | COMMAND_HANDLER(psoc6_handle_reset_halt)
  function FLASH_BANK_COMMAND_HANDLER (line 977) | FLASH_BANK_COMMAND_HANDLER(psoc6_flash_bank_command)
  type command_registration (line 992) | struct command_registration
  type command_registration (line 1010) | struct command_registration
  type flash_driver (line 1021) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/qn908x.c
  type qn908x_info_page_flash_size (line 66) | enum qn908x_info_page_flash_size {
  type qn908x_flash_page_lock (line 172) | struct qn908x_flash_page_lock {
  type qn908x_flash_bank (line 209) | struct qn908x_flash_bank {
  type flash_bank (line 229) | struct flash_bank
  type flash_bank (line 230) | struct flash_bank
  function qn908x_update_reg (line 236) | static int qn908x_update_reg(struct target *target, target_addr_t reg,
  function qn908x_load_lock_stat (line 271) | static int qn908x_load_lock_stat(struct target *target)
  function qn908x_init_flash (line 297) | static int qn908x_init_flash(struct target *target)
  function FLASH_BANK_COMMAND_HANDLER (line 352) | FLASH_BANK_COMMAND_HANDLER(qn908x_flash_bank_command)
  function qn908x_read_page_lock (line 389) | static int qn908x_read_page_lock(struct flash_bank *bank)
  function qn908x_busy_check (line 416) | static int qn908x_busy_check(struct target *target)
  function qn908x_status_check (line 431) | static int qn908x_status_check(struct target *target)
  function qn908x_wait_for_idle (line 468) | static int qn908x_wait_for_idle(struct target *target, int64_t timeout_ms)
  function qn908x_setup_erase (line 486) | static int qn908x_setup_erase(struct target *target)
  function qn908x_erase (line 524) | static int qn908x_erase(struct flash_bank *bank, unsigned int first,
  function qn908x_protect (line 576) | static int qn908x_protect(struct flash_bank *bank, int set, unsigned int...
  function qn908x_write (line 671) | static int qn908x_write(struct flash_bank *bank, const uint8_t *buffer,
  function is_flash_protected (line 807) | static int is_flash_protected(struct flash_bank *bank, bool *is_protected)
  function qn908x_probe (line 822) | static int qn908x_probe(struct flash_bank *bank)
  function qn908x_auto_probe (line 915) | static int qn908x_auto_probe(struct flash_bank *bank)
  function qn908x_protect_check (line 924) | static int qn908x_protect_check(struct flash_bank *bank)
  function qn908x_get_info (line 942) | static int qn908x_get_info(struct flash_bank *bank,
  function COMMAND_HANDLER (line 985) | COMMAND_HANDLER(qn908x_handle_allow_brick_command)
  function COMMAND_HANDLER (line 1010) | COMMAND_HANDLER(qn908x_handle_disable_wdog_command)
  function COMMAND_HANDLER (line 1037) | COMMAND_HANDLER(qn908x_handle_mass_erase_command)
  type command_registration (line 1145) | struct command_registration
  type command_registration (line 1172) | struct command_registration
  type flash_driver (line 1183) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/renesas_rpchf.c
  type rpc_hf_size (line 156) | enum rpc_hf_size {
  function rpc_hf_wait_tend (line 162) | static int rpc_hf_wait_tend(struct target *target)
  function clrsetbits_u32 (line 186) | static int clrsetbits_u32(struct target *target, uint32_t reg,
  function rpc_hf_mode (line 202) | static int rpc_hf_mode(struct target *target, bool manual)
  function rpc_hf_xfer (line 263) | static int rpc_hf_xfer(struct target *target, target_addr_t addr,
  function rpchf_target_write_memory (line 381) | static int rpchf_target_write_memory(struct flash_bank *bank, target_add...
  function rpchf_target_read_memory (line 396) | static int rpchf_target_read_memory(struct flash_bank *bank, target_addr...
  function FLASH_BANK_COMMAND_HANDLER (line 415) | FLASH_BANK_COMMAND_HANDLER(rpchf_flash_bank_command)
  function rpchf_spansion_write_words (line 431) | static int rpchf_spansion_write_words(struct flash_bank *bank, const uin...
  function rpchf_write_words (line 487) | static int rpchf_write_words(struct flash_bank *bank, const uint8_t *word,
  function rpchf_write (line 493) | static int rpchf_write(struct flash_bank *bank, const uint8_t *buffer, u...
  function rpchf_read (line 611) | static int rpchf_read(struct flash_bank *bank, uint8_t *buffer, uint32_t...
  type flash_driver (line 634) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/rp2040.c
  type rp2040_flash_bank (line 35) | struct rp2040_flash_bank {
  type flash_device (line 54) | struct flash_device
  function rp2040_lookup_symbol (line 57) | static uint32_t rp2040_lookup_symbol(struct target *target, uint32_t tag...
  function rp2040_call_rom_func (line 93) | static int rp2040_call_rom_func(struct target *target, struct rp2040_fla...
  function rp2040_finalize_stack_free (line 152) | static int rp2040_finalize_stack_free(struct flash_bank *bank)
  function rp2040_stack_grab_and_prep (line 184) | static int rp2040_stack_grab_and_prep(struct flash_bank *bank)
  function rp2040_flash_write (line 214) | static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *bu...
  function rp2040_flash_erase (line 278) | static int rp2040_flash_erase(struct flash_bank *bank, unsigned int firs...
  function rp2040_ssel_active (line 328) | static int rp2040_ssel_active(struct target *target, bool active)
  function rp2040_spi_read_flash_id (line 349) | static int rp2040_spi_read_flash_id(struct target *target, uint32_t *devid)
  function rp2040_flash_probe (line 379) | static int rp2040_flash_probe(struct flash_bank *bank)
  function rp2040_flash_auto_probe (line 492) | static int rp2040_flash_auto_probe(struct flash_bank *bank)
  function rp2040_flash_free_driver_priv (line 502) | static void rp2040_flash_free_driver_priv(struct flash_bank *bank)
  function FLASH_BANK_COMMAND_HANDLER (line 511) | FLASH_BANK_COMMAND_HANDLER(rp2040_flash_bank_command)
  type flash_driver (line 523) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/rsl10.c
  type rsl10_flash_status (line 86) | enum rsl10_flash_status {
  type rsl10_flash_status (line 110) | enum rsl10_flash_status
  type flash_driver (line 117) | struct flash_driver
  type rsl10_info (line 119) | struct rsl10_info {
  function rsl10_bank_is_probed (line 131) | static bool rsl10_bank_is_probed(const struct flash_bank *bank)
  type flash_bank (line 138) | struct flash_bank
  function rsl10_get_probed_chip_if_halted (line 140) | static int rsl10_get_probed_chip_if_halted(struct flash_bank *bank, stru...
  function rsl10_protect_check (line 156) | static int rsl10_protect_check(struct flash_bank *bank)
  function rsl10_protect (line 194) | static int rsl10_protect(struct flash_bank *bank, int set, unsigned int ...
  function rsl10_check_device (line 260) | static int rsl10_check_device(struct flash_bank *bank)
  function rsl10_probe (line 274) | static int rsl10_probe(struct flash_bank *bank)
  function rsl10_auto_probe (line 332) | static int rsl10_auto_probe(struct flash_bank *bank)
  function rsl10_ll_flash_erase (line 340) | static int rsl10_ll_flash_erase(struct rsl10_info *chip, uint32_t address)
  function rsl10_ll_flash_write (line 397) | static int rsl10_ll_flash_write(struct rsl10_info *chip, uint32_t addres...
  function rsl10_mass_erase (line 501) | static int rsl10_mass_erase(struct target *target)
  function rsl10_write (line 554) | static int rsl10_write(struct flash_bank *bank, const uint8_t *buffer, u...
  function rsl10_erase (line 565) | static int rsl10_erase(struct flash_bank *bank, unsigned int first, unsi...
  function rsl10_free_driver_priv (line 584) | static void rsl10_free_driver_priv(struct flash_bank *bank)
  type rsl10_info (line 598) | struct rsl10_info
  type target (line 598) | struct target
  type flash_bank (line 600) | struct flash_bank
  type rsl10_bank (line 610) | struct rsl10_bank
  function FLASH_BANK_COMMAND_HANDLER (line 620) | FLASH_BANK_COMMAND_HANDLER(rsl10_flash_bank_command)
  function COMMAND_HANDLER (line 674) | COMMAND_HANDLER(rsl10_lock_command)
  function COMMAND_HANDLER (line 721) | COMMAND_HANDLER(rsl10_unlock_command)
  function COMMAND_HANDLER (line 781) | COMMAND_HANDLER(rsl10_mass_erase_command)
  type command_registration (line 796) | struct command_registration
  type command_registration (line 820) | struct command_registration
  type flash_driver (line 830) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/sfdp.c
  type sfdp_hdr (line 22) | struct sfdp_hdr {
  type sfdp_phdr (line 27) | struct sfdp_phdr {
  type sfdp_basic_flash_param (line 32) | struct sfdp_basic_flash_param {
  type sfdp_4byte_addr_param (line 55) | struct sfdp_4byte_addr_param {
  function spi_sfdp (line 61) | int spi_sfdp(struct flash_bank *bank, struct flash_device *dev,

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/sfdp.h
  type flash_bank (line 18) | struct flash_bank
  type flash_bank (line 21) | struct flash_bank
  type flash_device (line 21) | struct flash_device

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/sh_qspi.c
  type sh_qspi_flash_bank (line 78) | struct sh_qspi_flash_bank {
  type sh_qspi_target (line 87) | struct sh_qspi_target {
  type sh_qspi_target (line 93) | struct sh_qspi_target
  function sh_qspi_init (line 99) | static int sh_qspi_init(struct flash_bank *bank)
  function sh_qspi_cs_activate (line 191) | static int sh_qspi_cs_activate(struct flash_bank *bank)
  function sh_qspi_cs_deactivate (line 246) | static int sh_qspi_cs_deactivate(struct flash_bank *bank)
  function sh_qspi_wait_for_bit (line 263) | static int sh_qspi_wait_for_bit(struct flash_bank *bank, uint8_t reg,
  function sh_qspi_xfer_common (line 292) | static int sh_qspi_xfer_common(struct flash_bank *bank,
  function sh_qspi_write_enable (line 366) | static int sh_qspi_write_enable(struct flash_bank *bank)
  function read_status_reg (line 374) | static int read_status_reg(struct flash_bank *bank, uint32_t *status)
  function wait_till_ready (line 391) | static int wait_till_ready(struct flash_bank *bank, int timeout)
  function sh_qspi_erase_sector (line 413) | static int sh_qspi_erase_sector(struct flash_bank *bank, int sector)
  function sh_qspi_erase (line 441) | static int sh_qspi_erase(struct flash_bank *bank, unsigned int first,
  function sh_qspi_write (line 485) | static int sh_qspi_write(struct flash_bank *bank, const uint8_t *buffer,
  function sh_qspi_read (line 589) | static int sh_qspi_read(struct flash_bank *bank, uint8_t *buffer,
  function read_flash_id (line 661) | static int read_flash_id(struct flash_bank *bank, uint32_t *id)
  function sh_qspi_protect (line 687) | static int sh_qspi_protect(struct flash_bank *bank, int set,
  function sh_qspi_upload_helper (line 696) | static int sh_qspi_upload_helper(struct flash_bank *bank)
  function sh_qspi_probe (line 749) | static int sh_qspi_probe(struct flash_bank *bank)
  function sh_qspi_auto_probe (line 836) | static int sh_qspi_auto_probe(struct flash_bank *bank)
  function sh_qspi_flash_blank_check (line 846) | static int sh_qspi_flash_blank_check(struct flash_bank *bank)
  function sh_qspi_protect_check (line 852) | static int sh_qspi_protect_check(struct flash_bank *bank)
  function sh_qspi_get_info (line 858) | static int sh_qspi_get_info(struct flash_bank *bank, struct command_invo...
  function FLASH_BANK_COMMAND_HANDLER (line 874) | FLASH_BANK_COMMAND_HANDLER(sh_qspi_flash_bank_command)
  type flash_driver (line 899) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/sim3x.c
  type sim3x_info (line 123) | struct sim3x_info {
  function FLASH_BANK_COMMAND_HANDLER (line 135) | FLASH_BANK_COMMAND_HANDLER(sim3x_flash_bank_command)
  function sim3x_init (line 153) | static int sim3x_init(struct flash_bank *bank)
  function sim3x_erase_page (line 214) | static int sim3x_erase_page(struct flash_bank *bank, uint32_t addr)
  function sim3x_flash_erase (line 270) | static int sim3x_flash_erase(struct flash_bank *bank, unsigned int first,
  function sim3x_write_block (line 329) | static int sim3x_write_block(struct flash_bank *bank, const uint8_t *buf,
  function sim3x_flash_write (line 465) | static int sim3x_flash_write(struct flash_bank *bank, const uint8_t *buf...
  function sim3x_flash_lock_check (line 521) | static int sim3x_flash_lock_check(struct flash_bank *bank)
  function sim3x_flash_protect_check (line 539) | static int sim3x_flash_protect_check(struct flash_bank *bank)
  function sim3x_flash_protect (line 562) | static int sim3x_flash_protect(struct flash_bank *bank, int set,
  function sim3x_read_deviceid (line 627) | static int sim3x_read_deviceid(struct flash_bank *bank)
  function sim3x_parse_part_info (line 681) | static int sim3x_parse_part_info(struct sim3x_info *sim3x_info)
  function sim3x_read_info (line 730) | static int sim3x_read_info(struct flash_bank *bank)
  function sim3x_probe (line 776) | static int sim3x_probe(struct flash_bank *bank)
  function sim3x_auto_probe (line 813) | static int sim3x_auto_probe(struct flash_bank *bank)
  function sim3x_flash_info (line 827) | static int sim3x_flash_info(struct flash_bank *bank, struct command_invo...
  function ap_write_register (line 862) | static int ap_write_register(struct adiv5_dap *dap, unsigned reg, uint32...
  function ap_read_register (line 889) | static int ap_read_register(struct adiv5_dap *dap, unsigned reg, uint32_...
  function ap_poll_register (line 915) | static int ap_poll_register(struct adiv5_dap *dap, unsigned reg, uint32_...
  function COMMAND_HANDLER (line 932) | COMMAND_HANDLER(sim3x_mass_erase)
  function COMMAND_HANDLER (line 977) | COMMAND_HANDLER(sim3x_lock)
  type command_registration (line 1065) | struct command_registration
  type command_registration (line 1083) | struct command_registration
  type flash_driver (line 1094) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/spi.c
  type flash_device (line 24) | struct flash_device

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/spi.h
  type flash_device (line 20) | struct flash_device {
  type flash_device (line 61) | struct flash_device

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/stellaris.c
  type flash_bank (line 82) | struct flash_bank
  type flash_bank (line 83) | struct flash_bank
  type stellaris_flash_bank (line 85) | struct stellaris_flash_bank {
  function FLASH_BANK_COMMAND_HANDLER (line 449) | FLASH_BANK_COMMAND_HANDLER(stellaris_flash_bank_command)
  function get_stellaris_info (line 472) | static int get_stellaris_info(struct flash_bank *bank, struct command_in...
  function stellaris_set_flash_timing (line 519) | static void stellaris_set_flash_timing(struct flash_bank *bank)
  function stellaris_read_clock_info (line 567) | static void stellaris_read_clock_info(struct flash_bank *bank)
  function stellaris_read_part_info (line 650) | static int stellaris_read_part_info(struct flash_bank *bank)
  function stellaris_protect_check (line 780) | static int stellaris_protect_check(struct flash_bank *bank)
  function stellaris_erase (line 828) | static int stellaris_erase(struct flash_bank *bank, unsigned int first,
  function stellaris_protect (line 884) | static int stellaris_protect(struct flash_bank *bank, int set,
  function stellaris_write_block (line 1019) | static int stellaris_write_block(struct flash_bank *bank,
  function stellaris_write (line 1101) | static int stellaris_write(struct flash_bank *bank, const uint8_t *buffer,
  function stellaris_probe (line 1214) | static int stellaris_probe(struct flash_bank *bank)
  function stellaris_mass_erase (line 1249) | static int stellaris_mass_erase(struct flash_bank *bank)
  function COMMAND_HANDLER (line 1299) | COMMAND_HANDLER(stellaris_handle_mass_erase_command)
  function COMMAND_HANDLER (line 1326) | COMMAND_HANDLER(stellaris_handle_recover_command)
  type command_registration (line 1387) | struct command_registration
  type command_registration (line 1404) | struct command_registration
  type flash_driver (line 1415) | struct flash_driver

FILE: Tools/CH347/ch347-main/OpenOCD_SourceCode_CH347/src/flash/nor/stm32f1x.c
  type stm32x_options (line 100) | struct stm32x_options {
  type stm32x_flash_bank (line 107) | struct stm32x_flash_bank {
  type flash_bank (line 122) | struct flash_bank
  type flash_bank (line 123) | struct flash_bank
  function FLASH_BANK_COMMAND_HANDLER (line 128) | FLASH_BANK_COMMAND_HANDLER(stm32x_flash_bank_command)
  function stm32x_get_flash_reg (line 150) | static inline int stm32x_get_flash_reg(struct flash_bank *bank, uint32_t...
  function stm32x_get_flash_status (line 156) | static inline int stm32x_get_flash_status(struct flash_bank *bank, uint3...
  function stm32x_wait_status_busy (line 162) | static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
  function stm32x_check_operation_supported (line 204) | static int stm32x_check_operation_supported(struct flash_bank *bank)
  function stm32x_read_options (line 218) | static int stm32x_read_options(struct flash_bank *bank)
  function stm32x_erase_options (line 242) | static int stm32x_erase_options(struct flash_bank *bank)
  function stm32x_write_options (line 289) | static int stm32x_write_options(struct flash_bank *bank)
  function stm32x_protect_check (line 344) | static int stm32x_protect_check(struct flash_bank *bank)
  function stm32x_erase (line 366) | static int stm32x_erase(struct flash_bank *bank, unsigned int first,
  function stm32x_protect (line 414) | static int stm32x_protect(struct flash_bank *bank, int set, unsigned int...
  function stm32x_write_block_async (line 445) | static int stm32x_write_block_async(struct flash_bank *bank, const uint8...
  function stm32x_write_block_riscv (line 543) | static int stm32x_write_block_riscv(struct flash_bank *bank, const uint8...
  function stm32x_write_block (line 650) | static int stm32x_write_block(struct flash_bank *bank,
  function stm32x_write (line 692) | static int stm32x_write(struct flash_bank *bank, const uint8_t *buffer,
  type stm32x_property_addr (line 734) | struct stm32x_property_addr {
  function stm32x_get_property_addr (line 739) | static int stm32x_get_property_addr(struct target *target, struct stm32x...
  function stm32x_get_device_id (line 781) | static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *devic...
  function stm32x_get_flash_size (line 793) | static int stm32x_get_flash_size(struct flash_bank *bank, uint16_t *flas...
  function stm32x_probe (line 805) | static int stm32x_probe(struct flash_bank *bank)
  function stm32x_auto_probe (line 1052) | static int stm32x_auto_probe(struct flash_bank *bank)
  function COMMAND_HANDLER (line 1061) | COMMAND_HANDLER(stm32x_handle_part_id_command)
  function get_stm32x_info (line 1082) | static int get_stm32x_info(struct flash_bank *bank, struct command_invoc...
  function COMMAND_HANDLER (line 1322) | COMMAND_HANDLER(stm32x_handle_lock_command)
 
Copy disabled (too large) Download .json
Condensed preview — 4657 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (22,489K chars).
[
  {
    "path": "CN/README-old-2.md",
    "chars": 39890,
    "preview": "# **完整设备仿真定制固件开发指南**\n\n---\n\n## **目录**\n\n### **第1部分:基础概念**\n\n1. [介绍](#1-介绍)\n   - [1.1 本指南的目的](#11-本指南的目的)\n   - [1.2 目标受众](#1"
  },
  {
    "path": "CN/README-old.md",
    "chars": 26427,
    "preview": "# **全设备仿真的定制固件开发指南**\n\n## **目录**\n\n1. [介绍](#1-介绍)\n   - [1.1 指南目的](#11-指南目的)\n   - [1.2 目标受众](#12-目标受众)\n2. [关键定义](#2-关键定义)\n3"
  },
  {
    "path": "CN/README.md",
    "chars": 101512,
    "preview": "# **全设备仿真的定制固件开发指南**\n\n---\n\n**特别鸣谢慷慨捐助的传奇人物,我将很快与您联系。如果您愿意,请DM我,我会在本文中添加鸣谢并提供更多信息!**\n\n正在将此指南整理到[维基](https://github.com/JP"
  },
  {
    "path": "CN/核对表.md",
    "chars": 4797,
    "preview": "# 固件修改清单\n\n使用此清单来指导您的固件创建过程。\n\n---\n\n## **1. 收集捐赠设备信息**\n\n从捐赠的PCIe设备收集以下信息:\n\n- [ ] **设备ID** (`0xXXXX`)\n- [ ] **供应商ID** (`0xY"
  },
  {
    "path": "CN/版本 4.md",
    "chars": 21049,
    "preview": "# **第一部分:基础概念**\n\n## **1. 引言**\n\n### **1.1 本指南的目的**\n\n本指南概述了一条详细的路线图,用于在基于 FPGA 的设备上创建自定义的直接内存访问 (DMA) 固件,最终目标是精确地仿真 PCIe 硬"
  },
  {
    "path": "Checklist.md",
    "chars": 7371,
    "preview": "# Firmware Modification Checklist\n\nUse this checklist to guide you through the firmware creation.\n\n---\n\n## **1. Gather D"
  },
  {
    "path": "FW-Guide-v4.md",
    "chars": 39953,
    "preview": "## Need DMA Equiptment? I recommend shopping with [DMAPolice.com](https://dmapolice.com/)\n\n# **Part 1: Foundational Conc"
  },
  {
    "path": "Lesson 3_ Advanced PCIe Configuration and Interrupt Handling.md",
    "chars": 22691,
    "preview": "# Lesson: Understanding PCIe Configuration and Interrupt Handling on Xilinx Artix-7 Platforms\n\n## **Overview**\n\nPlease l"
  },
  {
    "path": "README-old.md",
    "chars": 79867,
    "preview": "## Need DMA Equiptment? I recommend shopping with [DMAPolice.com](https://dmapolice.com/)\n\n# **Custom Firmware Developme"
  },
  {
    "path": "README-v2-old.md",
    "chars": 51594,
    "preview": "# **Custom Firmware Development Guide for Full Device Emulation**\n\n\n## **Table of Contents**\n\n1. [Introduction](#1-intro"
  },
  {
    "path": "README.md",
    "chars": 213499,
    "preview": "# **Custom Firmware Development Guide for Full Device Emulation**\n\n---\n\n**Shout out to the legend that donated, I will b"
  },
  {
    "path": "RU/README.md",
    "chars": 233288,
    "preview": "# **Руководство по разработке пользовательской прошивки для полной эмуляции устройства**\n\n---\n\n**Выражаю огромную благод"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/bin/ch347.cfg",
    "chars": 169,
    "preview": "# 指定CH347-JTAG 调试器\nadapter driver ch347\nch347 vid_pid 0x1a86 0x55dd\n\n# 设置TCK时钟频率\nadapter speed 10000\n\nsource [find cpld/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/60-openocd.rules",
    "chars": 11585,
    "preview": "# Copy this file to /etc/udev/rules.d/\n# If rules fail to reload automatically, you can refresh udev rules\n# with the co"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/libdcc/README",
    "chars": 415,
    "preview": "This code is an example of using the openocd debug message system.\n\nBefore the message output is seen in the debug windo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/libdcc/dcc_stdio.c",
    "chars": 4369,
    "preview": "/***************************************************************************\n *   Copyright (C) 2008 by Dominic Rath    "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/libdcc/dcc_stdio.h",
    "chars": 1814,
    "preview": "/***************************************************************************\n *   Copyright (C) 2008 by Dominic Rath    "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/contrib/libdcc/example.c",
    "chars": 2282,
    "preview": "/***************************************************************************\n *   Copyright (C) 2008 by Spencer Oliver  "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/bitsbytes.tcl",
    "chars": 1614,
    "preview": "#----------------------------------------\n# Purpose - Create some $BIT variables\n#           Create $K and $M variables\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/8devices-lima.cfg",
    "chars": 825,
    "preview": "# Product page:\n# https://www.8devices.com/products/lima\n#\n# Location of JTAG pins:\n# J2 GPIO0\tJTAG TCK\n# J2 GPIO1\tJTAG "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/actux3.cfg",
    "chars": 2115,
    "preview": "# board config file for AcTux3/XBA IXP42x board\n# Date:   2010-12-16\n# Author: Michael Schwingen <michael@schwingen.org>"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/adapteva_parallella1.cfg",
    "chars": 126,
    "preview": "#\n# Adapteva Parallella-I board (via Porcupine-1 adapter board)\n#\n\nreset_config srst_only\n\nsource [find target/zynq_7000"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/adsp-sc584-ezbrd.cfg",
    "chars": 1226,
    "preview": "#\n# Analog Devices ADSP-SC584-EZBRD evaluation board\n#\n# Evaluation boards by Analog Devices (and designs derived from t"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/alphascale_asm9260_ek.cfg",
    "chars": 1761,
    "preview": "source [find target/alphascale_asm9260t.cfg]\n\nreset_config trst_and_srst\n\n$_TARGETNAME configure -event reset-init {\n\tec"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/altera_sockit.cfg",
    "chars": 489,
    "preview": "#\n# Cyclone V SocKit board\n# http://www.altera.com/b/arrow-sockit.html\n#\n# Software support page:\n# http://www.rocketboa"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/am3517evm.cfg",
    "chars": 656,
    "preview": "# DANGER!!!! early work in progress for this PCB/target.\n#\n# The most basic operations work well enough that it is\n# use"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ampere_emag8180.cfg",
    "chars": 887,
    "preview": "#\n# OpenOCD Board Configuration for eMAG Development Platform\n#\n# Copyright (c) 2019-2021, Ampere Computing LLC\n#\n# This"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/arm_evaluator7t.cfg",
    "chars": 195,
    "preview": "# This board is from ARM and has an samsung s3c45101x01 chip\n\nsource [find target/samsung_s3c4510.cfg]\n\n#\n# FIXME:\n#  Ad"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/arm_musca_a.cfg",
    "chars": 1286,
    "preview": "#\n# Configuration script for ARM Musca-A development board\n#\n# For now we do not support Musca A flash programming using"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/arty_s7.cfg",
    "chars": 1066,
    "preview": "#\n# Arty S7: Spartan7 25/50 FPGA Board for Makers and Hobbyists\n#\n# https://www.xilinx.com/products/boards-and-kits/1-pn"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/asus-rt-n16.cfg",
    "chars": 423,
    "preview": "#\n# http://wikidevi.com/wiki/ASUS_RT-N16\n#\n\nset partition_list {\n    CFE\t\t{ Bootloader\t\t\t0xbc000000 0x00040000 }\n    fir"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/asus-rt-n66u.cfg",
    "chars": 635,
    "preview": "#\n# http://wikidevi.com/wiki/Asus_RT-N66U\n#\n\necho \"ATTENTION: you need to solder a 4.7-10k pullup resistor to pin 21 of "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91cap7a-stk-sdram.cfg",
    "chars": 3672,
    "preview": "# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4394\n#\n# use combined on interfaces or targets that can't set"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91eb40a.cfg",
    "chars": 1763,
    "preview": "#Script for AT91EB40a\n\n# FIXME use some standard target config, maybe create one from this\n#\n#\tsource [find target/...cf"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91rm9200-dk.cfg",
    "chars": 2144,
    "preview": "#\n# This is for the \"at91rm9200-DK\" (not the EK) eval board.\n#\n# The two are probably very simular.... I have DK...\n#\n# "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91rm9200-ek.cfg",
    "chars": 2824,
    "preview": "#\n# Copyright 2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>\n#\n# under GPLv2 Only\n#\n# This is for the \"at"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91sam9261-ek.cfg",
    "chars": 2434,
    "preview": "################################################################################\n# Atmel AT91SAM9261-EK eval board\n#####"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91sam9263-ek.cfg",
    "chars": 2460,
    "preview": "################################################################################\n# Atmel AT91SAM9263-EK eval board\n#####"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/at91sam9g20-ek.cfg",
    "chars": 9028,
    "preview": "#################################################################################################\n#\t\t\t\t\t\t\t\t\t\t\t\t#\n# Autho"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_at91sam7s-ek.cfg",
    "chars": 149,
    "preview": "# Atmel AT91SAM7S-EK\n# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3784\n\nset CHIPNAME at91sam7s256\n\nsource "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_at91sam9260-ek.cfg",
    "chars": 3292,
    "preview": "################################################################################\n# Atmel AT91SAM9260-EK eval board\n#\n# h"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_at91sam9rl-ek.cfg",
    "chars": 3066,
    "preview": "################################################################################\n#\n# Generated for Atmel AT91SAM9RL-EK e"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam3n_ek.cfg",
    "chars": 154,
    "preview": "\n#\n# Board configuration for Atmel's SAM3N-EK\n#\n\nreset_config srst_only\n\nset CHIPNAME at91sam3n4c\n\nadapter speed 32\n\nsou"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam3s_ek.cfg",
    "chars": 37,
    "preview": "source [find target/at91sam3sXX.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam3u_ek.cfg",
    "chars": 61,
    "preview": "source [find target/at91sam3u4e.cfg]\n\nreset_config srst_only\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam3x_ek.cfg",
    "chars": 63,
    "preview": "source [find target/at91sam3ax_8x.cfg]\n\nreset_config srst_only\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam4e_ek.cfg",
    "chars": 172,
    "preview": "# This is an SAM4E-EK board with a single SAM4E16 chip.\n# http://www.atmel.com/tools/sam4e-ek.aspx\n\n# chip name\nset CHIP"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam4l8_xplained_pro.cfg",
    "chars": 211,
    "preview": "#\n# Atmel SAM4L8 Xplained Pro evaluation kit.\n# http://www.atmel.com/tools/ATSAM4L8-XPRO.aspx\n#\n\nsource [find interface/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam4s_ek.cfg",
    "chars": 37,
    "preview": "source [find target/at91sam4sXX.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_sam4s_xplained_pro.cfg",
    "chars": 211,
    "preview": "#\n# Atmel SAM4S Xplained Pro evaluation kit.\n# http://www.atmel.com/tools/ATSAM4S-XPRO.aspx\n#\n\nsource [find interface/cm"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samc20_xplained_pro.cfg",
    "chars": 164,
    "preview": "#\n# Atmel SAMC20 Xplained Pro evaluation kit.\n#\n\nsource [find interface/cmsis-dap.cfg]\n\n# chip name\nset CHIPNAME at91sam"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samc21_xplained_pro.cfg",
    "chars": 212,
    "preview": "#\n# Atmel SAMC21 Xplained Pro evaluation kit.\n# http://www.atmel.com/tools/ATSAMC21-XPRO.aspx\n#\n\nsource [find interface/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samd10_xplained_mini.cfg",
    "chars": 212,
    "preview": "#\n# Atmel SAMD10 Xplained mini evaluation kit.\n# http://www.atmel.com/tools/atsamd10-xmini.aspx\n\nsource [find interface/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samd11_xplained_pro.cfg",
    "chars": 164,
    "preview": "#\n# Atmel SAMD11 Xplained Pro evaluation kit.\n#\n\nsource [find interface/cmsis-dap.cfg]\n\n# chip name\nset CHIPNAME at91sam"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samd20_xplained_pro.cfg",
    "chars": 212,
    "preview": "#\n# Atmel SAMD20 Xplained Pro evaluation kit.\n# http://www.atmel.com/tools/ATSAMD20-XPRO.aspx\n#\n\nsource [find interface/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samd21_xplained_pro.cfg",
    "chars": 164,
    "preview": "#\n# Atmel SAMD21 Xplained Pro evaluation kit.\n#\n\nsource [find interface/cmsis-dap.cfg]\n\n# chip name\nset CHIPNAME at91sam"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_same70_xplained.cfg",
    "chars": 267,
    "preview": "#\n# Atmel SAME70 Xplained evaluation kit.\n# http://www.atmel.com/tools/ATSAME70-XPLD.aspx\n#\n# Connect using the EDBG chi"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samg53_xplained_pro.cfg",
    "chars": 210,
    "preview": "#\n# Atmel SAMG53 Xplained Pro evaluation kit.\n# http://www.atmel.com/tools/ATSAMG53-XPRO.aspx\n#\n\nsource [find interface/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samg55_xplained_pro.cfg",
    "chars": 210,
    "preview": "#\n# Atmel SAMG55 Xplained Pro evaluation kit.\n# http://www.atmel.com/tools/ATSAMG55-XPRO.aspx\n#\n\nsource [find interface/"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_saml21_xplained_pro.cfg",
    "chars": 164,
    "preview": "#\n# Atmel SAML21 Xplained Pro evaluation kit.\n#\n\nsource [find interface/cmsis-dap.cfg]\n\n# chip name\nset CHIPNAME at91sam"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samr21_xplained_pro.cfg",
    "chars": 164,
    "preview": "#\n# Atmel SAMR21 Xplained Pro evaluation kit.\n#\n\nsource [find interface/cmsis-dap.cfg]\n\n# chip name\nset CHIPNAME at91sam"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/atmel_samv71_xplained_ultra.cfg",
    "chars": 379,
    "preview": "#\n# Atmel SAMV71 Xplained Ultra evaluation kit.\n# http://www.atmel.com/tools/ATSAMV71-XULT.aspx\n#\n# To connect using the"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/avnet_ultrazed-eg.cfg",
    "chars": 348,
    "preview": "#\n# AVNET UltraZED EG StarterKit\n# ZynqMP UlraScale-EG plus IO Carrier with on-board digilent smt2\n#\nsource [find interf"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/balloon3-cpu.cfg",
    "chars": 553,
    "preview": "# Config for balloon3 board, cpu JTAG port. http://balloonboard.org/\n# The board has separate JTAG ports for cpu and CPL"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/bcm28155_ap.cfg",
    "chars": 120,
    "preview": "# BCM28155_AP\n\nadapter speed 20000\n\nset CHIPNAME bcm28155\nsource [find target/bcm281xx.cfg]\n\nreset_config trst_and_srst\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/bluefield.cfg",
    "chars": 115,
    "preview": "#\n# Board configuration for BlueField SoC.\n#\n\nsource [find interface/rshim.cfg]\nsource [find target/bluefield.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/bt-homehubv1.cfg",
    "chars": 436,
    "preview": "#\n# BT HomeHub v1\n#\n\nset partition_list {\n    CFE       { Bootloader              0xbe400000 0x00020000 }\n    firmware  "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/colibri.cfg",
    "chars": 325,
    "preview": "# Toradex Colibri PXA270\nsource [find target/pxa270.cfg]\nreset_config trst_and_srst srst_push_pull\nadapter srst pulse_wi"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/crossbow_tech_imote2.cfg",
    "chars": 297,
    "preview": "# Crossbow Technology iMote2\n\nset  CHIPNAME imote2\nsource [find target/pxa270.cfg]\n\n# longer-than-normal reset delay\nada"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/csb337.cfg",
    "chars": 2964,
    "preview": "# Cogent CSB337\n#   http://cogcomp.com/csb_csb337.htm\n\nsource [find target/at91rm9200.cfg]\n\n# boots from NOR on CS0:  8 "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/csb732.cfg",
    "chars": 1437,
    "preview": "# The Cogent CSB732 board has a single i.MX35 chip\nsource [find target/imx35.cfg]\n\n# Determined by trial and error\nreset"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/da850evm.cfg",
    "chars": 442,
    "preview": "#DA850 EVM board\n# http://focus.ti.com/dsp/docs/thirdparty/catalog/devtoolsproductfolder.tsp?actionPerformed=productFold"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/digi_connectcore_wi-9c.cfg",
    "chars": 3797,
    "preview": "######################################\n# Target: DIGI ConnectCore Wi-9C\n######################################\n\nreset_co"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/digilent_analog_discovery.cfg",
    "chars": 420,
    "preview": "#\n# Digilent Analog Discovery\n#\n# http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,842,1018&Prod=ANALOG-DISCOVER"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/digilent_atlys.cfg",
    "chars": 590,
    "preview": "# http://digilentinc.com/atlys/\n#\n# The Digilent Atlys normally requires proprietary tools to program and will\n# enumera"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/digilent_nexys_video.cfg",
    "chars": 632,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n\n# Digilent Nexys Video with Xilinx Artix-7 FPGA\n# https://reference.digilen"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/digilent_zedboard.cfg",
    "chars": 228,
    "preview": "#\n# Digilent Zedboard Rev.C, Rev.D with Xilinx Zynq chip\n#\n# http://zedboard.com/product/zedboard\n#\n\nsource [find interf"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/diolan_lpc4350-db1.cfg",
    "chars": 171,
    "preview": "#\n# Diolan LPC-4350-DB1 development board\n#\n\nset CHIPNAME lpc4350\n\nsource [find target/lpc4350.cfg]\n\nflash bank $_CHIPNA"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/diolan_lpc4357-db1.cfg",
    "chars": 171,
    "preview": "#\n# Diolan LPC-4357-DB1 development board\n#\n\nset CHIPNAME lpc4357\n\nsource [find target/lpc4357.cfg]\n\nflash bank $_CHIPNA"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dk-tm4c129.cfg",
    "chars": 132,
    "preview": "echo \"WARNING: board/dk-tm4c129.cfg is deprecated, please switch to board/ti_dk-tm4c129.cfg\"\n\nsource [find board/ti_dk-t"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dm355evm.cfg",
    "chars": 5318,
    "preview": "# DM355 EVM board\n#   http://focus.ti.com/docs/toolsw/folders/print/tmdsevm355.html\n#   http://c6000.spectrumdigital.com"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dm365evm.cfg",
    "chars": 3768,
    "preview": "# DM365 EVM board -- Beta\n#   http://focus.ti.com/docs/toolsw/folders/print/tmdxevm365.html\n#   http://support.spectrumd"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dm6446evm.cfg",
    "chars": 2229,
    "preview": "# DM6446 EVM board\n#   http://focus.ti.com/docs/toolsw/folders/print/tmdsevm6446.html\n#   http://c6000.spectrumdigital.c"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dp_busblaster_v3.cfg",
    "chars": 352,
    "preview": "#\n# Dangerous Prototypes - Bus Blaster\n#\n# http://dangerousprototypes.com/docs/Bus_Blaster\n#\n# To reprogram the on-board"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dp_busblaster_v4.cfg",
    "chars": 688,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# Dangerous Prototypes - Bus Blaster\n#\n# http://dangerousprototypes.com/do"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/dptechnics_dpt-board-v1.cfg",
    "chars": 915,
    "preview": "# Product page:\n# https://www.dptechnics.com/en/products/dpt-board-v1.html\n#\n# JTAG is a 5 pin array located close to ma"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/efikamx.cfg",
    "chars": 245,
    "preview": "# Genesi USA EfikaMX\n#  http://www.genesi-usa.com/products/efika\n\n# Fall back to 6MHz if RTCK is not supported\njtag_rclk"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/efm32.cfg",
    "chars": 245,
    "preview": "# Configuration for EFM32 boards with on-board SEGGER J-Link\n#\n# Tested with Tiny, Giant and Zero Gecko Starter Kit.\n#\n\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/eir.cfg",
    "chars": 2319,
    "preview": "# Elector Internet Radio board\n# http://www.ethernut.de/en/hardware/eir/index.html\n\nsource [find target/at91sam7se512.cf"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s1968.cfg",
    "chars": 581,
    "preview": "#\n# TI/Luminary Stellaris LM3S1968 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s1968\n#\n\n# NOTE:  to use J-Link inst"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s3748.cfg",
    "chars": 352,
    "preview": "#\n# TI/Luminary Stellaris lm3s3748 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s3748\n#\n\n# NOTE:  using the on-board"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s6965.cfg",
    "chars": 380,
    "preview": "#\n# TI/Luminary Stellaris LM3S6965 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s6965\n#\n\n# NOTE:  using the on-board"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s811-revb.cfg",
    "chars": 363,
    "preview": "#\n# TI/Luminary Stellaris LM3S811 Evaluation Kits (rev B and earlier)\n#\n# http://www.ti.com/tool/ek-lm3s811\n#\n\n# NOTE: n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s811.cfg",
    "chars": 423,
    "preview": "#\n# TI/Luminary Stellaris LM3S811 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s811\n#\n\n# NOTE:  using the on-board F"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s8962.cfg",
    "chars": 381,
    "preview": "#\n# TI/Luminary Stellaris LM3S8962 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s8962\n#\n\n# NOTE:  using the on-board"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s9b9x.cfg",
    "chars": 371,
    "preview": "#\n# TI/Luminary Stellaris LM3S9B9x Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s9b90\n# http://www.ti.com/tool/ek-lm"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm3s9d92.cfg",
    "chars": 354,
    "preview": "#\n# TI/Luminary Stellaris LM3S9D92 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm3s9d92\n#\n\n# NOTE:  using the bundled "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm4f120xl.cfg",
    "chars": 364,
    "preview": "#\n# TI Stellaris Launchpad ek-lm4f120xl Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm4f120xl\n#\n\n#\n# NOTE: using the b"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-lm4f232.cfg",
    "chars": 343,
    "preview": "#\n# TI Stellaris LM4F232 Evaluation Kits\n#\n# http://www.ti.com/tool/ek-lm4f232\n#\n\n#\n# NOTE: using the bundled ICDI inter"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-tm4c123gxl.cfg",
    "chars": 141,
    "preview": "echo \"WARNING: board/ek-tm4c123gxl.cfg is deprecated, please switch to board/ti_ek-tm4c123gxl.cfg\"\n\nsource [find board/t"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ek-tm4c1294xl.cfg",
    "chars": 141,
    "preview": "echo \"WARNING: board/ek-tm4c1294xl.cfg is deprecated, please switch to board/ti_ek-tm4c1294xl.cfg\"\n\nsource [find board/t"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/embedded-artists_lpc2478-32.cfg",
    "chars": 6245,
    "preview": "# Embedded Artists eval board for LPC2478\n# http://www.embeddedartists.com/\n\n# Target device: LPC2478\nset CCLK 72000\nsou"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/emcraft_imx8m-som-bsb.cfg",
    "chars": 421,
    "preview": "#\n# configuration file for Emcraft IMX8M-SOM-BSB\n#\n\n# only JTAG supported\ntransport select jtag\n\n# set a safe JTAG clock"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/emcraft_twr-vf6-som-bsb.cfg",
    "chars": 163,
    "preview": "#\n# EmCraft Systems TWR-VF6-SOM-BSB\n#\n# http://www.emcraft.com/products/259#twr-kit\n#\n\nsource [find board/emcraft_vf6-so"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/emcraft_vf6-som.cfg",
    "chars": 139,
    "preview": "#\n# EmCraft Systems Vybrid VF6 SOM\n#\n# http://www.emcraft.com/products/259#som\n#\n\nset CHIPNAME vf610\nsource [find target"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/esp32s2-kaluga-1.cfg",
    "chars": 664,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# Example OpenOCD configuration file for ESP32-S2 Kaluga board.\n#\n# For ex"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/ethernut3.cfg",
    "chars": 1551,
    "preview": "#\n# Ethernut 3 board configuration file\n#\n# http://www.ethernut.de/en/hardware/enut3/\n\n\n# AT91R40008-66AU ARM7TDMI Micro"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/evb-lan9255.cfg",
    "chars": 225,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# Microchip LAN9255 evaluation board\n# https://www.microchip.com/en-us/dev"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/frdm-kl25z.cfg",
    "chars": 345,
    "preview": "# This is an Freescale Freedom eval board with a single MKL25Z128VLK4 chip.\n# http://www.freescale.com/webapp/sps/site/p"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/frdm-kl46z.cfg",
    "chars": 345,
    "preview": "# This is an Freescale Freedom eval board with a single MKL46Z256VLL4 chip.\n# http://www.freescale.com/webapp/sps/site/p"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/fsl_imx6q_sabresd.cfg",
    "chars": 4101,
    "preview": "#\n# Board configuration file for the Freescale IMX6Q Sabre SD EVM\n#\n# This board does not have an embedded JTAG adapter,"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/glyn_tonga2.cfg",
    "chars": 7025,
    "preview": "#\n# Glyn Tonga2 SO-DIMM CPU module (Toshiba TMPA900CMXBG, ARM9)\n#\n# http://toshiba-mikrocontroller.de/sites/TMPA900CPUBO"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/gti/espressobin.cfg",
    "chars": 172,
    "preview": "# config for ESPRESSObin from\n# Globalscale Technologies Inc.\n\n# srst is isolated through missing resistor\nreset_config "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/gumstix-aerocore.cfg",
    "chars": 309,
    "preview": "# JTAG for the STM32F4x chip used on the Gumstix AeroCore is available on\n# the first interface of a Quad FTDI chip.  nT"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hammer.cfg",
    "chars": 1079,
    "preview": "# Target Configuration for the TinCanTools S3C2410 Based Hammer Module\n# http://www.tincantools.com\n\nsource [find target"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hilscher_nxdb500sys.cfg",
    "chars": 1054,
    "preview": "################################################################################\n# Author: Michael Trensch (MTrensch@goo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hilscher_nxeb500hmi.cfg",
    "chars": 1041,
    "preview": "################################################################################\n# Author: Michael Trensch (MTrensch@goo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hilscher_nxhx10.cfg",
    "chars": 2257,
    "preview": "################################################################################\n# Author: Michael Trensch (MTrensch@goo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hilscher_nxhx50.cfg",
    "chars": 1045,
    "preview": "################################################################################\n# Author: Michael Trensch (MTrensch@goo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hilscher_nxhx500.cfg",
    "chars": 1051,
    "preview": "################################################################################\n# Author: Michael Trensch (MTrensch@goo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hilscher_nxsb100.cfg",
    "chars": 728,
    "preview": "################################################################################\n# Author: Michael Trensch (MTrensch@goo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hitex_lpc1768stick.cfg",
    "chars": 212,
    "preview": "# Hitex LPC1768 Stick\n#\n# http://www.hitex.com/?id=1602\n#\n\nreset_config trst_and_srst\n\nsource [find interface/ftdi/hitex"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hitex_lpc2929.cfg",
    "chars": 4282,
    "preview": "# Hitex eval board for LPC2929/LPC2939\n# http://www.hitex.com/\n\n# Delays on reset lines\nadapter srst delay 50\njtag_ntrst"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hitex_stm32-performancestick.cfg",
    "chars": 434,
    "preview": "# Hitex stm32 performance stick\n\nreset_config trst_and_srst\n\nsource [find interface/ftdi/stm32-stick.cfg]\n\nset  CHIPNAME"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/hitex_str9-comstick.cfg",
    "chars": 2181,
    "preview": "# Hitex STR9-comStick\n# http://www.hitex.com/index.php?id=383\n# This works for the STR9-comStick revisions STR912CS-A1 a"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/iar_lpc1768.cfg",
    "chars": 361,
    "preview": "# Board from IAR KickStart Kit for LPC1768\n# See www.iar.com and also\n# http://www.olimex.com/dev/lpc-1766stk.html\n#\n\nso"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/iar_str912_sk.cfg",
    "chars": 95,
    "preview": "# The IAR str912-sk evaluation kick start board has an str912\n\nsource [find target/str912.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/icnova_imx53_sodimm.cfg",
    "chars": 16341,
    "preview": "#################################################################################################\n# Author: Benjamin Tie"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/icnova_sam9g45_sodimm.cfg",
    "chars": 8770,
    "preview": "#################################################################################################\n#\t\t\t\t\t\t\t\t\t\t\t\t         "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx27ads.cfg",
    "chars": 1939,
    "preview": "# The IMX27 ADS eval board has a single IMX27 chip\n# Note: tested on IMX27ADS Board REV-2.6 and REV-2.8\nsource [find tar"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx27lnst.cfg",
    "chars": 1355,
    "preview": "# The Linuxstamp-mx27 is board has a single IMX27 chip\n# For further info see http://opencircuits.com/Linuxstamp_mx27#Op"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx28evk.cfg",
    "chars": 5108,
    "preview": "# The IMX28EVK eval board has a IMX28 chip\n# Tested on SCH-26241 Rev D board with Olimex ARM-USB-OCD\n# Date:\t201-02-01\n#"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx31pdk.cfg",
    "chars": 2022,
    "preview": "# The IMX31PDK eval board has a single IMX31 chip\nsource [find target/imx31.cfg]\nsource [find target/imx.cfg]\n$_TARGETNA"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx35pdk.cfg",
    "chars": 6652,
    "preview": "# The IMX35PDK eval board has a single IMX35 chip\nsource [find target/imx35.cfg]\nsource [find target/imx.cfg]\n$_TARGETNA"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx53-m53evk.cfg",
    "chars": 8953,
    "preview": "#######################################\n# DENX M53EVK                         #\n# http://www.denx-cs.de/?q=M53EVK     #\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx53loco.cfg",
    "chars": 10048,
    "preview": "##################################################################################\n# Author: Wjatscheslaw Stoljarski (Sl"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/imx8mp-evk.cfg",
    "chars": 278,
    "preview": "#\n# configuration file for NXP MC-IMX8MP-EVK\n#\n# Board includes FTDI-based JTAG adapter: interface/ftdi/imx8mp-evk.cfg\n#"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/insignal_arndale.cfg",
    "chars": 135,
    "preview": "#\n# InSignal Arndale board\n#\n\nsource [find target/exynos5250.cfg]\n\n# Experimentally determined highest working speed\nada"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kasli.cfg",
    "chars": 349,
    "preview": "adapter driver ftdi\nftdi device_desc \"Quad RS232-HS\"\nftdi vid_pid 0x0403 0x6011\nftdi channel 0\nftdi layout_init 0x0008 0"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kc100.cfg",
    "chars": 1424,
    "preview": "# Knovative KC-100 cable modem\n\n# TNETC4401PYP, 208-QFP U3\nsource [find target/tnetc4401.cfg]\n\n# 14-pin EJTAG on JP1. St"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kc705.cfg",
    "chars": 570,
    "preview": "# http://www.xilinx.com/products/boards-and-kits/ek-k7-kc705-g.html\n\nsource [find interface/ftdi/digilent-hs1.cfg]\nsourc"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kcu105.cfg",
    "chars": 274,
    "preview": "# xilinx ultrascale\n# http://www.xilinx.com/support/documentation/user_guides/ug570-ultrascale-configuration.pdf\n\nsource"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/keil_mcb1700.cfg",
    "chars": 108,
    "preview": "#\n# Keil MCB1700 eval board\n#\n# http://www.keil.com/mcb1700/picture.asp\n#\n\nsource [find target/lpc17xx.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/keil_mcb2140.cfg",
    "chars": 108,
    "preview": "#\n# Keil MCB2140 eval board\n#\n# http://www.keil.com/mcb2140/picture.asp\n#\n\nsource [find target/lpc2148.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kindle2.cfg",
    "chars": 3724,
    "preview": "# Board configuration file for Amazon Kindle Model No. D00701 and D00801\n# AKA Kindle 2nd generation and Kindle DX\n# usi"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kontron_sl28.cfg",
    "chars": 268,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n# Kontron SMARC-sAL28\n\ntransport select jtag\nreset_config srst_only srst_nog"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/kwikstik.cfg",
    "chars": 169,
    "preview": "#\n# Freescale KwikStik development board\n#\n\n#\n# JLINK interface is onboard\n#\nsource [find interface/jlink.cfg]\n\nsource ["
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/la_fonera-fon2200.cfg",
    "chars": 68,
    "preview": "source [find target/atheros_ar2315.cfg]\n\nreset_config trst_and_srst\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/lambdaconcept_ecpix-5.cfg",
    "chars": 895,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# LambdaConcept ECPIX-5\n# http://docs.lambdaconcept.com/ecpix-5/\n# Current"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/lemaker_hikey.cfg",
    "chars": 423,
    "preview": "#\n# board configuration for LeMaker Hikey\n#\n\n# board does not feature anything but JTAG\ntransport select jtag\n\n# SRST-on"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/linksys-wag200g.cfg",
    "chars": 946,
    "preview": "#\n# Linksys WAG200G Router\n#\n# The stock firmware Flash layout is organized as follow:\n#\n#   Start       End         Dev"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/linksys-wrt54gl.cfg",
    "chars": 400,
    "preview": "#\n# Linksys WRT54GL v1.1\n#\n\nsource [find target/bcm5352e.cfg]\n\nset partition_list {\n    CFE\t\t{ Bootloader\t\t\t0x1c000000 0"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/linksys_nslu2.cfg",
    "chars": 249,
    "preview": "# This is for the LinkSys (CISCO) NSLU2 board\n# It is an Intel XSCALE IXP420 CPU.\n\nsource [find target/ixp42x.cfg]\n# The"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/lisa-l.cfg",
    "chars": 200,
    "preview": "# the Lost Illusions Serendipitous Autopilot\n# http://paparazzi.enac.fr/wiki/Lisa\n\n# Work-area size (RAM size) = 20kB fo"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/logicpd_imx27.cfg",
    "chars": 334,
    "preview": "# The LogicPD Eval IMX27 eval board has a single IMX27 chip\nsource [find target/imx27.cfg]\n\n# The Logic PD board has a N"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/lpc1850_spifi_generic.cfg",
    "chars": 586,
    "preview": "#\n# Generic LPC1850 board w/ SPIFI flash.\n# This config file is intended as an example of how to\n# use the lpcspifi flas"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/lpc4350_spifi_generic.cfg",
    "chars": 421,
    "preview": "#\n# Generic LPC4350 board w/ SPIFI flash.\n# This config file is intended as an example of how to\n# use the lpcspifi flas"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/lubbock.cfg",
    "chars": 2751,
    "preview": "# Intel \"Lubbock\" Development Board with PXA255 (dbpxa255)\n#  Obsolete; this was Intel's original PXA255 development sys"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/marsohod.cfg",
    "chars": 277,
    "preview": "#\n# Marsohod CPLD Development and Education board\n#\n# http://marsohod.org/howtostart/plata\n#\n\n# Recommended MBFTDI progr"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/marsohod2.cfg",
    "chars": 274,
    "preview": "#\n# Marsohod2 FPGA Development and Education board\n#\n# http://www.marsohod.org/prodmarsohod2\n#\n\n# Built-in MBFTDI progra"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/marsohod3.cfg",
    "chars": 276,
    "preview": "#\n# Marsohod3 FPGA Development and Education board\n#\n# http://www.marsohod.org/plata-marsokhod3\n#\n\n# Built-in MBFTDI pro"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/mbed-lpc11u24.cfg",
    "chars": 261,
    "preview": "# This is an mbed eval board with a single NXP LPC11U24 chip.\n# http://mbed.org/handbook/mbed-NXP-LPC11U24\n#\n\nsource [fi"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/mbed-lpc1768.cfg",
    "chars": 180,
    "preview": "# This is an mbed eval board with a single NXP LPC1768 chip.\n# http://mbed.org/handbook/mbed-NXP-LPC1768\n#\n\nsource [find"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/mcb1700.cfg",
    "chars": 1870,
    "preview": "# Keil MCB1700 PCB with 1768\n#\n# Reset init script sets it to 100MHz\nset CCLK 100000\n\nsource [find target/lpc17xx.cfg]\n\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/microchip_explorer16.cfg",
    "chars": 287,
    "preview": "# Microchip Explorer 16 with PIC32MX360F512L PIM module.\n# http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PA"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/microchip_sama5d27_som1_kit1.cfg",
    "chars": 818,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# Microchip SAMA5D27-SOM1-EK1\n# https://www.microchip.com/DevelopmentTools"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/microchip_same51_curiosity_nano.cfg",
    "chars": 279,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# Microchip SAME51 Curiosity Nano evaluation kit.\n#\n# https://www.microchi"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/microchip_same54_xplained_pro.cfg",
    "chars": 272,
    "preview": "#\n# Microchip (former Atmel) SAM E54 Xplained Pro evaluation kit.\n# http://www.microchip.com/developmenttools/productdet"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/microchip_saml11_xplained_pro.cfg",
    "chars": 252,
    "preview": "#\n# Microchip (formerly Atmel) SAM L11 Xplained Pro Evaluation Kit.\n# https://www.microchip.com/DevelopmentTools/Product"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/mini2440.cfg",
    "chars": 11508,
    "preview": "#-------------------------------------------------------------------------\n# Mini2440 Samsung s3c2440A Processor with 64"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/mini6410.cfg",
    "chars": 4202,
    "preview": "# Target configuration for the Samsung s3c6410 system on chip\n# Tested on a tiny6410\n# Processor       : ARM1176\n# Info "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/minispartan6.cfg",
    "chars": 913,
    "preview": "# https://www.scarabhardware.com/minispartan6/\n\nsource [find interface/ftdi/minispartan6.cfg]\nsource [find cpld/xilinx-x"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nds32_corvettef1.cfg",
    "chars": 555,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n# ADP-Corvette-F1 R1.0\n# http://www.andestech.com/en/products-solutions/ande"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nds32_xc5.cfg",
    "chars": 89,
    "preview": "set _CPUTAPID 0x1000063d\nset _CHIPNAME nds32\nsource [find target/nds32v3.cfg]\n\njtag init\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nds32_xc7.cfg",
    "chars": 182,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n# ADP-XC7K160/410\n# http://www.andestech.com/en/products-solutions/andeshape"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/netgear-dg834v3.cfg",
    "chars": 638,
    "preview": "#\n# Netgear DG834v3 Router\n# Internal 4Kb RAM (@0x80000000)\n# Flash is located at 0x90000000 (CS0) and RAM is located at"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/netgear-wg102.cfg",
    "chars": 1040,
    "preview": "source [find target/atheros_ar2313.cfg]\n\nreset_config trst_and_srst\n\n$_TARGETNAME configure -event reset-init {\n\tmips32 "
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nordic_nrf51822_mkit.cfg",
    "chars": 132,
    "preview": "#\n# Nordic Semiconductor PCA10024 board (aka nRF51822-mKIT)\n#\n\nsource [find interface/cmsis-dap.cfg]\nsource [find target"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nordic_nrf51_dk.cfg",
    "chars": 148,
    "preview": "#\n# Nordic Semiconductor NRF51 Development Kit (nRF6824)\n#\n\nsource [find interface/jlink.cfg]\n\ntransport select swd\n\nsou"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nordic_nrf52_dk.cfg",
    "chars": 149,
    "preview": "#\n# Nordic Semiconductor NRF52 Development Kit (nRF52832)\n#\n\nsource [find interface/jlink.cfg]\n\ntransport select swd\n\nso"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nordic_nrf52_ftx232.cfg",
    "chars": 287,
    "preview": "#\n# nordic module NRF52 (nRF52832/52840) attached to an adafruit ft232h module\n# or any FT232H/FT2232H/FT4232H based boa"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/novena-internal-fpga.cfg",
    "chars": 820,
    "preview": "#\n# Novena open hardware and F/OSS-friendly computing platform\n#\n# Design documentation:\n# http://www.kosagi.com/w/index"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/npcx_evb.cfg",
    "chars": 164,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n\n# Nuvoton NPCX Evaluation Board\n\nsource [find interface/jlink.cfg]\ntranspor"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/numato_mimas_a7.cfg",
    "chars": 1262,
    "preview": "#\n# Numato Mimas A7 - Artix 7 FPGA Board\n#\n# https://numato.com/product/mimas-a7-artix-7-fpga-development-board-with-ddr"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/numato_opsis.cfg",
    "chars": 299,
    "preview": "# http://opsis.hdmi2usb.tv\n#\n# The Numato Opsis is an FPGA based, open video platform.\n#\n# The board is supported via ix"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_frdm-k64f.cfg",
    "chars": 440,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n\n# This is an NXP Freedom eval board with a single MK64FN1M0VLL12 chip.\n# ht"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_frdm-ls1012a.cfg",
    "chars": 230,
    "preview": "#\n# NXP FRDM-LS1012A (Freedom)\n#\n\n#\n# NXP Kinetis K20\n#\nsource [find interface/cmsis-dap.cfg]\ntransport select jtag\n\n# A"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_imx7sabre.cfg",
    "chars": 3193,
    "preview": "# NXP IMX7SABRE board\n# use on-board JTAG header\ntransport select jtag\n\n# set a safe speed, can be overridden\nadapter sp"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_lpc-link2.cfg",
    "chars": 286,
    "preview": "#\n# NXP LPC-Link2\n#\n# http://www.nxp.com/board/OM13054.html\n# https://www.lpcware.com/lpclink2\n# http://embeddedartists."
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_mcimx8m-evk.cfg",
    "chars": 453,
    "preview": "#\n# configuration file for NXP MC-IMX8M-EVK\n#\n\n# only JTAG supported\ntransport select jtag\n\n# set a safe JTAG clock spee"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_rdb-ls1046a.cfg",
    "chars": 506,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n# NXP LS1046ARDB (Reference Design Board)\n# This is for the \"console\" USB po"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/nxp_rdb-ls1088a.cfg",
    "chars": 432,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n# NXP LS1088ARDB (Reference Design Board)\n# This is for the \"main\" JTAG conn"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_LPC2378STK.cfg",
    "chars": 265,
    "preview": "#####################################################\n# Olimex LPC2378STK eval board\n#\n# http://olimex.com/dev/lpc-2378s"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_lpc_h2148.cfg",
    "chars": 113,
    "preview": "#\n# Olimex LPC-H2148 eval board\n#\n# http://www.olimex.com/dev/lpc-h2148.html\n#\n\nsource [find target/lpc2148.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_sam7_ex256.cfg",
    "chars": 99,
    "preview": "# Olimex SAM7-EX256 has a single Atmel at91sam7ex256 on it.\n\nsource [find target/at91sam7x256.cfg]\n"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_sam7_la2.cfg",
    "chars": 2038,
    "preview": "source [find target/at91sam7a2.cfg]\n\n# delays needed to get stable reads of cpu state\njtag_ntrst_delay 10\nadapter srst d"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_sam9_l9260.cfg",
    "chars": 5632,
    "preview": "################################################################################\n# Olimex SAM9-L9260 Development Board\n#"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_stm32_h103.cfg",
    "chars": 189,
    "preview": "# Olimex STM32-H103 eval board\n# http://olimex.com/dev/stm32-h103.html\n\n# Work-area size (RAM size) = 20kB for STM32F103"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_stm32_h107.cfg",
    "chars": 185,
    "preview": "#\n# Olimex STM32-H107\n#\n# http://olimex.com/dev/stm32-h107.html\n#\n\n# Work-area size (RAM size) = 64kB for STM32F107VC de"
  },
  {
    "path": "Tools/CH347/ch347-main/CH347FPGATool/OpenOCD_CH347/scripts/board/olimex_stm32_h405.cfg",
    "chars": 248,
    "preview": "# SPDX-License-Identifier: GPL-2.0-or-later\n# Olimex STM32-H405 eval board\n# https://www.olimex.com/Products/ARM/ST/STM3"
  }
]

// ... and 4457 more files (download for full content)

About this extraction

This page contains the full source code of the JPShag/PCILEECH-DMA-FW-Guide-2.0 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4657 files (19.5 MB), approximately 5.4M tokens, and a symbol index with 12120 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!