рд╣рдордиреЗ JTAG рд░рд╛рдЙрдЯрд░ рдХреЛ рдУрд╡рд░рдХреНрд▓реЙрдХ рдХрд┐рдпрд╛


рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдЪрд╛рдирдХ рдХреНрд░реАрдорд┐рдпрд╛ рдореЗрдВ рдХрдИ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ / рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЦрд┐рдордХреА рдореЗрдВ рдПрдХ рднрд░рд╡рд╛рдВ рдХрд╛рд░реНрдпрд╛рд▓рдп рд╕реЗ рдЪрд┐рдХрдирд╛рдИ рдкреАрдирд╛ред рдпрджрд┐ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдмреЛрд░реНрдб рдПрдХ рдЪрд▓рддреА рд╡рд╕реНрддреБ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЬреЗрдЯреАрдПрдЬреА рдбреАрдмрдЧрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ (рдмреЛрд░реНрдб рдПрдХ рдЧреБрдмреНрдмрд╛рд░реЗ / рдХреНрд╡рд╛рдбрдХреНрд░реЙрдкреНрдЯрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ)ред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдЪрд╛рдирдХ рдореЗрдЬрдмрд╛рди рдФрд░ рдмреЛрд░реНрдб рдХреЗ рдмреАрдЪ рдЧреИрд▓реНрд╡реЗрдирд┐рдХ рдЕрд▓рдЧрд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдЪреНрдЪ рд╡реЛрд▓реНрдЯреЗрдЬ рдбрд┐рд╡рд╛рдЗрд╕)ред рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдорд╛рддрд╛ (STM, рдмреНрд░реЙрдбрдХреЙрдо, Xilinx, рдЖрджрд┐) рдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (ARM, MIPS, FPGA, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╕рд╕реНрддрд╛, рд╣рдВрд╕рдореБрдЦ рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рд░рд╛рдЙрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рдВ, рдмрд╕ рдПрдХ рд░рд╛рдЙрдЯрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ред

рдЫрд╡рд┐
Sagemcom.ru рд╕реЗ рдЫрд╡рд┐

рдЖрдЗрдП рдЕрдВрджрд░ рджреЗрдЦреЗрдВ:

рдЫрд╡рд┐
wiki.openwrt.org

рддреЛ, рдпрд╣ Sagem F @ ST2704 V2 рд╣реИ, рдЬрд┐рд╕реЗ рдкреВрд░реЗ рджреЗрд╢ рдореЗрдВ рд░реЛрд╕реНрдЯреЗрд▓рдХреЙрдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ SoC BCM6328 MIPS рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛрд░, 320 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ, рд╕реЛрд▓реНрдбрд░реЗрдб USB рдкреЛрд░реНрдЯреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ [1]ред рд╡рд╛рдИрдлрд╛рдИ рдФрд░ рдИрдерд░рдиреЗрдЯ рд╣реИред рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдУрдкрдирд░ рдХреА рд░рд┐рд╣рд╛рдИ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╕реЗ рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рддреБрд░рдВрдд рд╣реА рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рд╕реЗрдВрдЯ-рд▓рд┐рдВрдХ рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдпреВрдПрд╕рдмреА рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдПрдХ рдмреИрд╕рд╛рдЦреА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рдУрд╡рд░рд╣реЗрдб рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред рд╣рдо рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдУрдкрдирдХрд╛рдЯ рдХреЛ рдУрдкрдирдХрд╛рдб рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕реЗрдВрдЯ-рд▓рд┐рдВрдХ рдпрд╛ рдПрдлрдбреАрдЖрдИ рдЪрд┐рдк рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреАрдбреАрдмреА рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдУрдкреЗрдиреЛрдХреНрд░реЙрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрдкрдирд░ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдБ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ sysfsgpio рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрддрд╛ рд╣реИред рдЪрд┐рдк рдХреЗ рд╕реЛрд▓реНрдбрд░ рдкрд┐рдВрд╕ рдкрд░ tck, tdi, tdo рд╕рд┐рдЧреНрдирд▓, рдирд┐рдпрдорд┐рдд OS linux рдЯреВрд▓реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ / sys / class / gpio рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЛ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ, рдЙрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдУрдкрдирдУрдб рдХреЗ рд╕рд╛рде рдУрдкрдирд░рдЯ (chaos_calmer рд╢рд╛рдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕реЛрд▓реНрдбрд░ рдХрд┐рдП рдЧрдП GPIO рдкрд░, рд▓рд╛рдЗрдЯ рдЗрдВрдбрд┐рдХреЗрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ, рд╕рд╛рде рд╣реА рдХреБрдЫ рдХрдорд╛рдВрдбреНрд╕ (rfkill, reset, рдФрд░ wpsc) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдмрдЯрди рднреА рд╣реИрдВред рддрд╛рдХрд┐ рд╡реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВ, рдореИрдВрдиреЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдЯрд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред

$cat target/linux/brcm63xx/config-3.18 b/target/linux/brcm63xx/config-3.18 ... # CONFIG_NEW_LEDS is not set тАж $cat .config тАж # CONFIG_PACKAGE_kmod-input-gpio-keys-polled is not set ... # CONFIG_PACKAGE_kmod-input-polldev is not set ... CONFIG_PACKAGE_openocd=y 

рдЦреБрдж рд╡рд┐рдзрд╛рдирд╕рднрд╛:

 ./scripts/feeds update -a ./scripts/feeds install -a make V=s 

рдлрд░реНрдорд╡реЗрдпрд░:

 mtd -q write openwrt-brcm63xx-generic-F@ST2704V2-squashfs-cfe.bin linux 

Sysfsgpio рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 root@OpenWrt:~# cat sysfs.cfg.2.11 interface sysfsgpio transport select swd sysfsgpio_swclk_num 482 sysfsgpio_swdio_num 491 source [find target/stm32f1x.cfg] 

рдлреЛрдЯреЛ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:



рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:

 root@OpenWrt:~# openocd -f sysfs.cfg.2.11 Open On-Chip Debugger 0.10.0+dev-00085-gfced6ac6-dirty (2017-03-xx-21:49) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html SysfsGPIO num: swclk = 482 SysfsGPIO num: swdio = 491 SysfsGPIO num: trst = 481 adapter speed: 1000 kHz adapter_nsrst_delay: 100 none separate cortex_m reset_config sysresetreq Info : SysfsGPIO JTAG/SWD bitbang driver Info : SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode) Warn : gpio 482 is already exported Warn : gpio 491 is already exported Info : This adapter doesn't support configurable speed Info : SWD DPIDR 0x1ba01477 Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints 

IDE рдореЗрдВ рдбреАрдмрдЧ рдЪрд▓рд╛рдПрдБ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдХреЗрд╡рд▓ рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗред

рд╣рдо рдЧрддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЯреЗрд▓рдиреЗрдЯ рд░рд╛рдЙрдЯрд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:

 telnet 10.65.9.239 4444 

рд╣рдо рдПрдХ рдореЗрдореЛрд░реА рдбрдВрдк рдмрдирд╛рддреЗ рд╣реИрдВред

 > dump_image dump.bin 0x08000000 0x1ffff dumped 131071 bytes in 55.013523s (2.327 KiB/s) 

рд╣рдореНрдо, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдореЗрдЬрдмрд╛рди рдкрд░ st-linkv2 рд▓рдЧрднрдЧ 45 KiB / s рдХреА рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред 20 рдЧреБрдирд╛ рдЕрдВрддрд░!



рдмрд┐рдВрджреБ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, / sys / class / gpio рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЖрд╕рдкрд╛рд╕ рдЦреБрд▓реЗ рдореЗрдВ рд╢реМрдЪ рдХрд░рдирд╛ред RaspberryPi (src / jtag / рдбреНрд░рд╛рдЗрд╡рд░ / bcm2835gpio.c) рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдЦреЛрдЬреЗрдВред рдкрд░реАрдХреНрд╖рдгреЛрдВ [5] рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрд╕рдореЗрдВ рд╕реЗрдВрдЯ-рд▓рд┐рдВрдХ рдХреЗ рд╕рдорд╛рди рдЧрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣, рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ, GPIO рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ SoC рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рдкреВрд░реЗ bcm63xx рдЪрд┐рдк рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рд╣реЛрдЧрд╛ред

рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдирд┐рдХрд▓рд╛
 /** * @file * This driver implements a bitbang jtag interface using gpio lines via * router ob BCM63XX SoC. * The aim of this driver implementation is use system GPIOs but avoid the * need for a additional kernel driver. * (Note memory mapped IO is another option, however it doesn't mix well with * the kernel gpiolib driver - which makes sense I guess.) * * A gpio is required for tck, tms, tdi and tdo. One or both of srst and trst * must be also be specified. The required jtag gpios are specified via the * bcm63xx_gpio_jtag_nums command or the relevant bcm63xx_gpio_XXX_num commang. * The srst and trst gpios are set via the bcm63xx_gpio_srst_num and * bcm63xx_gpio_trst_num respectively. GPIO numbering follows the kernel * convention of starting from 0. * * The gpios should not be in use by another entity, and must not be requested * by a kernel driver without also being exported by it (otherwise they can't * be exported by bcm63xx_). * * The bcm63xx gpio interface can only manipulate one gpio at a time, so the * bitbang write handler remembers the last state for tck, tms, tdi to avoid * superfluous writes. * For speed the bcm63xx "value" entry is opened at init and held open. * This results in considerable gains over open-write-close (45s vs 900s) * * Further work could address: * -srst and trst open drain/ push pull * -configurable active high/low for srst & trst */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <jtag/interface.h> #include "bitbang.h" #include <sys/mman.h> /* * Helper func to determine if gpio number valid * * Assume here that there will be less than 1000 gpios on a system */ static int is_gpio_valid(int gpio) { return gpio >= 0 && gpio < 32; } off_t address_dir = NULL; off_t address_val = NULL; static int dev_mem_fd = -1; static volatile uint32_t *pio_base = NULL; static volatile uint32_t *pval_base = NULL; static volatile uint32_t *pads_base = NULL; static unsigned int jtag_delay = 0; static void set_dir_gpio(const int gpio, const int direction) { if(direction) *pio_base |= 1 << gpio; else *pio_base &= ~(1 << gpio); } static void set_value_gpio(const int gpio, const int value) { if(value) *pval_base |= 1 << gpio; else *pval_base &= ~(1 << gpio); for (unsigned int i = 0; i < jtag_delay; i++) asm volatile (""); } static int read_gpio(const int gpio) { uint32_t val = *pval_base & (1 << gpio); val = val ? 1 : 0; return val; } static int setup_bcm63xx_gpio(int gpio, int is_output, int init_high) { char buf[40]; char gpiostr[4]; int ret; if (!is_gpio_valid(gpio)) return ERROR_OK; if((address_dir == NULL) || (address_val == NULL)){ perror("address of gpio register don't set"); return ERROR_FAIL; } if( dev_mem_fd < 0 ) { dev_mem_fd = open("/dev/mem", O_RDWR | O_SYNC); if (dev_mem_fd < 0) { perror("open"); return ERROR_FAIL; } const uint32_t mapped_size = getpagesize(); const off_t target_mmap = address_dir & ~(off_t)(mapped_size - 1); pads_base = mmap(NULL, mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, dev_mem_fd, target_mmap); if (pads_base == MAP_FAILED) { perror("mmap. Check correct register address."); close(dev_mem_fd); return ERROR_FAIL; } pio_base = (char*)pads_base + (unsigned)(address_dir - target_mmap); pval_base = (char*)pads_base + (unsigned)(address_val - target_mmap); } set_dir_gpio(gpio, is_output); set_value_gpio(gpio, init_high); return 0; } /* gpio numbers for each gpio. Negative values are invalid */ static int tck_gpio = -1; static int tms_gpio = -1; static int tdi_gpio = -1; static int tdo_gpio = -1; static int trst_gpio = -1; static int srst_gpio = -1; static int swclk_gpio = -1; static int swdio_gpio = -1; /* * file descriptors for /sys/class/gpio/gpioXX/value * Set up during init. */ static int tck_fd = -1; static int tms_fd = -1; static int tdi_fd = -1; static int tdo_fd = -1; static int trst_fd = -1; static int srst_fd = -1; static int swclk_fd = -1; static int swdio_fd = -1; static int last_swclk; static int last_swdio; static bool last_stored; static bool swdio_input; static void bcm63xx_gpio_swdio_drive(bool is_output) { set_dir_gpio(swdio_gpio, is_output ? 1 : 0); last_stored = false; swdio_input = !is_output; } static int bcm63xx_gpio_swdio_read(void) { return read_gpio(swdio_gpio); } static void bcm63xx_gpio_swdio_write(int swclk, int swdio) { const char one[] = "1"; const char zero[] = "0"; size_t bytes_written; if (!swdio_input) { if (!last_stored || (swdio != last_swdio)) { set_value_gpio(swdio_gpio, swdio ? 1 : 0); } } /* write swclk last */ if (!last_stored || (swclk != last_swclk)) { set_value_gpio(swclk_gpio, swclk ? 1 : 0); } last_swdio = swdio; last_swclk = swclk; last_stored = true; } /* * Bitbang interface read of TDO * * The bcm63xx value will read back either '0' or '1'. The trick here is to call * lseek to bypass buffering in the bcm63xx kernel driver. */ static int bcm63xx_gpio_read(void) { return read_gpio(tdo_gpio); } /* * Bitbang interface write of TCK, TMS, TDI * * Seeing as this is the only function where the outputs are changed, * we can cache the old value to avoid needlessly writing it. */ static void bcm63xx_gpio_write(int tck, int tms, int tdi) { if (swd_mode) { bcm63xx_gpio_swdio_write(tck, tdi); return; } const char one[] = "1"; const char zero[] = "0"; static int last_tck; static int last_tms; static int last_tdi; static int first_time; size_t bytes_written; if (!first_time) { last_tck = !tck; last_tms = !tms; last_tdi = !tdi; first_time = 1; } if (tdi != last_tdi) { set_value_gpio(tdi_gpio,tdi); } if (tms != last_tms) { set_value_gpio(tms_gpio,tms); } /* write clk last */ if (tck != last_tck) { set_value_gpio(tck_gpio,tck); } last_tdi = tdi; last_tms = tms; last_tck = tck; } /* * Bitbang interface to manipulate reset lines SRST and TRST * * (1) assert or (0) deassert reset lines */ static void bcm63xx_gpio_reset(int trst, int srst) { LOG_DEBUG("bcm63xx_gpio_reset"); const char one[] = "1"; const char zero[] = "0"; size_t bytes_written; /* assume active low */ if (srst_fd >= 0) { set_value_gpio(srst_gpio,srst); } /* assume active low */ if (trst_fd >= 0) { set_value_gpio(trst_gpio,trst); } } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionums) { if (CMD_ARGC == 4) { COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], tck_gpio); COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], tms_gpio); COMMAND_PARSE_NUMBER(int, CMD_ARGV[2], tdi_gpio); COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], tdo_gpio); } else if (CMD_ARGC != 0) { return ERROR_COMMAND_SYNTAX_ERROR; } command_print(CMD_CTX, "bcm63xx_GPIO nums: tck = %d, tms = %d, tdi = %d, tdo = %d", tck_gpio, tms_gpio, tdi_gpio, tdo_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionum_tck) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], tck_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: tck = %d", tck_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionum_tms) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], tms_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: tms = %d", tms_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionum_tdo) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], tdo_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: tdo = %d", tdo_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionum_tdi) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], tdi_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: tdi = %d", tdi_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionum_srst) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], srst_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: srst = %d", srst_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_jtag_gpionum_trst) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], trst_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: trst = %d", trst_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_swd_gpionums) { if (CMD_ARGC == 2) { COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], swclk_gpio); COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], swdio_gpio); } else if (CMD_ARGC != 0) { return ERROR_COMMAND_SYNTAX_ERROR; } command_print(CMD_CTX, "bcm63xx_GPIO nums: swclk = %d, swdio = %d", swclk_gpio, swdio_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_swd_gpionum_swclk) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], swclk_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: swclk = %d", swclk_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_handle_swd_gpionum_swdio) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], swdio_gpio); command_print(CMD_CTX, "bcm63xx_GPIO num: swdio = %d", swdio_gpio); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_jtag_delay) { if (CMD_ARGC == 1) COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], jtag_delay); command_print(CMD_CTX, "bcm63xx_GPIO jtag_delay:= %d tics", jtag_delay); return ERROR_OK; } COMMAND_HANDLER(bcm63xx_gpio_adresses) { if (CMD_ARGC == 2) { COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address_dir); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], address_val); } else if (CMD_ARGC != 0) { return ERROR_COMMAND_SYNTAX_ERROR; } command_print(CMD_CTX, "bcm63xx_GPIO address: direction = %x, value = %x", address_dir, address_val); return ERROR_OK; } static const struct command_registration bcm63xx_gpio_command_handlers[] = { { .name = "bcm63xx_gpio_jtag_nums", .handler = &bcm63xx_gpio_handle_jtag_gpionums, .mode = COMMAND_CONFIG, .help = "gpio numbers for tck, tms, tdi, tdo. (in that order)", .usage = "(tck tms tdi tdo)* ", }, { .name = "bcm63xx_gpio_tck_num", .handler = &bcm63xx_gpio_handle_jtag_gpionum_tck, .mode = COMMAND_CONFIG, .help = "gpio number for tck.", }, { .name = "bcm63xx_gpio_tms_num", .handler = &bcm63xx_gpio_handle_jtag_gpionum_tms, .mode = COMMAND_CONFIG, .help = "gpio number for tms.", }, { .name = "bcm63xx_gpio_tdo_num", .handler = &bcm63xx_gpio_handle_jtag_gpionum_tdo, .mode = COMMAND_CONFIG, .help = "gpio number for tdo.", }, { .name = "bcm63xx_gpio_tdi_num", .handler = &bcm63xx_gpio_handle_jtag_gpionum_tdi, .mode = COMMAND_CONFIG, .help = "gpio number for tdi.", }, { .name = "bcm63xx_gpio_srst_num", .handler = &bcm63xx_gpio_handle_jtag_gpionum_srst, .mode = COMMAND_CONFIG, .help = "gpio number for srst.", }, { .name = "bcm63xx_gpio_trst_num", .handler = &bcm63xx_gpio_handle_jtag_gpionum_trst, .mode = COMMAND_CONFIG, .help = "gpio number for trst.", }, { .name = "bcm63xx_gpio_swd_nums", .handler = &bcm63xx_gpio_handle_swd_gpionums, .mode = COMMAND_CONFIG, .help = "gpio numbers for swclk, swdio. (in that order)", .usage = "(swclk swdio)* ", }, { .name = "bcm63xx_gpio_swclk_num", .handler = &bcm63xx_gpio_handle_swd_gpionum_swclk, .mode = COMMAND_CONFIG, .help = "gpio number for swclk.", }, { .name = "bcm63xx_gpio_swdio_num", .handler = &bcm63xx_gpio_handle_swd_gpionum_swdio, .mode = COMMAND_CONFIG, .help = "gpio number for swdio.", }, { .name = "bcm63xx_gpio_jtag_delay", .handler = &bcm63xx_gpio_jtag_delay, .mode = COMMAND_CONFIG, .help = "qty tics gpio delay.", }, { .name = "bcm63xx_gpio_adresses", .handler = &bcm63xx_gpio_adresses, .mode = COMMAND_CONFIG, .help = "addresses for direction and value setup. (in that order)", .usage = "(address_dir address_val)* ", }, COMMAND_REGISTRATION_DONE }; static int bcm63xx_gpio_init(void); static int bcm63xx_gpio_quit(void); static const char * const bcm63xx_gpio_transports[] = { "jtag", "swd", NULL }; struct jtag_interface bcm63xxgpio_interface = { .name = "bcm63xxgpio", .supported = DEBUG_CAP_TMS_SEQ, .execute_queue = bitbang_execute_queue, .transports = bcm63xx_gpio_transports, .swd = &bitbang_swd, .commands = bcm63xx_gpio_command_handlers, .init = bcm63xx_gpio_init, .quit = bcm63xx_gpio_quit, }; static struct bitbang_interface bcm63xx_gpio_bitbang = { .read = bcm63xx_gpio_read, .write = bcm63xx_gpio_write, .reset = bcm63xx_gpio_reset, .swdio_read = bcm63xx_gpio_swdio_read, .swdio_drive = bcm63xx_gpio_swdio_drive, .blink = 0 }; static void unusing_all_gpio(void) { munmap(pads_base, sysconf(_SC_PAGE_SIZE)); close(dev_mem_fd); LOG_INFO("unusing_all_gpio\n"); } static bool bcm63xx_gpio_jtag_mode_possible(void) { if (!is_gpio_valid(tck_gpio)) return 0; if (!is_gpio_valid(tms_gpio)) return 0; if (!is_gpio_valid(tdi_gpio)) return 0; if (!is_gpio_valid(tdo_gpio)) return 0; return 1; } static bool bcm63xx_gpio_swd_mode_possible(void) { if (!is_gpio_valid(swclk_gpio)) return 0; if (!is_gpio_valid(swdio_gpio)) return 0; return 1; } static int bcm63xx_gpio_init(void) { bitbang_interface = &bcm63xx_gpio_bitbang; LOG_INFO("bcm63xx_gpio JTAG/SWD bitbang driver"); if (bcm63xx_gpio_jtag_mode_possible()) { if (bcm63xx_gpio_swd_mode_possible()) LOG_INFO("JTAG and SWD modes enabled"); else LOG_INFO("JTAG only mode enabled (specify swclk and swdio gpio to add SWD mode)"); if (!is_gpio_valid(trst_gpio) && !is_gpio_valid(srst_gpio)) { LOG_ERROR("Require at least one of trst or srst gpios to be specified"); return ERROR_JTAG_INIT_FAILED; } } else if (bcm63xx_gpio_swd_mode_possible()) { LOG_INFO("SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode)"); } else { LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode and/or swclk and swdio gpio for SWD mode"); return ERROR_JTAG_INIT_FAILED; } /* * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST * as outputs. Drive TDI and TCK low, and TMS/TRST/SRST high. * For SWD, SWCLK and SWDIO are configures as output high. */ if (tck_gpio >= 0) { tck_fd = setup_bcm63xx_gpio(tck_gpio, 1, 0); if (tck_fd < 0) goto out_error; } if (tms_gpio >= 0) { tms_fd = setup_bcm63xx_gpio(tms_gpio, 1, 1); if (tms_fd < 0) goto out_error; } if (tdi_gpio >= 0) { tdi_fd = setup_bcm63xx_gpio(tdi_gpio, 1, 0); if (tdi_fd < 0) goto out_error; } if (tdo_gpio >= 0) { tdo_fd = setup_bcm63xx_gpio(tdo_gpio, 0, 0); if (tdo_fd < 0) goto out_error; } /* assume active low*/ if (trst_gpio >= 0) { trst_fd = setup_bcm63xx_gpio(trst_gpio, 1, 1); if (trst_fd < 0) goto out_error; } /* assume active low*/ if (srst_gpio >= 0) { srst_fd = setup_bcm63xx_gpio(srst_gpio, 1, 1); if (srst_fd < 0) goto out_error; } if (swclk_gpio >= 0) { swclk_fd = setup_bcm63xx_gpio(swclk_gpio, 1, 0); if (swclk_fd < 0) goto out_error; } if (swdio_gpio >= 0) { swdio_fd = setup_bcm63xx_gpio(swdio_gpio, 1, 0); if (swdio_fd < 0) goto out_error; } if (bcm63xx_gpio_swd_mode_possible()) { if (swd_mode) bitbang_swd_switch_seq(JTAG_TO_SWD); else bitbang_swd_switch_seq(SWD_TO_JTAG); } return ERROR_OK; out_error: unusing_all_gpio(); return ERROR_JTAG_INIT_FAILED; } static int bcm63xx_gpio_quit(void) { unusing_all_gpio(); return ERROR_OK; } 


Sysfsgpio рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрд╕рдиреЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛:

  • bcm63xx_gpio_jtag_delay
  • bcm63xx_gpio_adresses

рдкрд╣рд▓реА рд╕реЗрдЯрд┐рдВрдЧ рдкрд┐рди рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рджреЗрд░реА рд╕реЗрдЯ рдХрд░рддреА рд╣реИ, рдпрд╣ рд░рд╛рд╕реНрдкрдмреЗрд░реАрдкреАрдЖрдИ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП bcm2835gpio_speed_coeffs рдХрд╛ рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЬреЛ рдЬреЗрдЯ рдЖрд╡реГрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реВрдиреНрдп рджреЗрд░реА рдХреЗ рд╕рд╛рде, рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдЖрд╡реГрддреНрддрд┐ рд▓рдЧрднрдЧ рдПрдХ рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рдереА, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдФрд░ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк bcm2835gpio_peripheral_base рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рджреЛ рдкрддреЗ рджрд░реНрдЬ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ, рдЬреЛ рдкрд┐рди рдХреЗ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ gpio рдкрд░ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рддрд╛рд░реНрдХрд┐рдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдпрд╣ рдХрд░реНрдиреЗрд▓ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рд╡реИрд▓реНрдпреВ рд▓реЗрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд░рд┐рдзреАрдп рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рд░реАрдореИрдк рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ gpio рдбреНрд░рд╛рдЗрд╡рд░ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди / proc / iomem рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Openocd рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝реЗрдВ

рдлрд╝реАрдбреНрд╕ / рдкреИрдХреЗрдЬ / рдпреВрдЯрд┐рд▓рд┐рдЯреА / рдУрдкреЗрдирдХрд╛рдб / рдореЗрдХрдлрд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ CONFIGURE_ARGS рдореЗрдВ --enable-bcm63xxgpio рдЬреЛрдбрд╝рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред

рд╣рдо рд░рд╛рдЙрдЯрд░ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг, рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

 root@OpenWrt:~# openocd -f interface/bcm63xx-swd.cfg -f target/stm32f1x.cfg Open On-Chip Debugger 0.10.0+dev-00085-gfced6ac6-dirty (2017-03-xx-21:49) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html bcm63xx_GPIO num: swclk = 2 bcm63xx_GPIO num: swdio = 11 bcm63xx_GPIO jtag_delay:= 10 tics bcm63xx_GPIO address: direction = 10000084, value = 1000008c adapter speed: 1000 kHz adapter_nsrst_delay: 100 none separate cortex_m reset_config sysresetreq Info : bcm63xx_gpio JTAG/SWD bitbang driver Info : SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode) Info : This adapter doesn't support configurable speed Info : SWD DPIDR 0x1ba01477 Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints 

рдбрдВрдк рдХреА рдЧрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

 > dump_image dump.bin 0x08000000 0x1ffff dumped 131071 bytes in 4.729815s (27.062 KiB/s) 

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛, рд╣рдо рджреЛ рдмрд╛рд░ рдХрд╣реАрдВ рд╕реЗрдВрдЯ-рд▓рд┐рдВрдХ рдФрд░ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдореЗрдВ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдВрдЦреЛрдВ рд╕реЗ рдЕрдВрддрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдлреНрд░рд┐рдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдФрд░ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рджреМрд░рд╛рди рдлреНрд▓реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ - "рджрд┐рдЦрд╛рд╡рд╛"ред

рд╕рднреА рдкрд░реАрдХреНрд╖рдг STM32F103C8T6 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдХрд┐рдП рдЧрдП рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдмреЛрд░реНрдб рдкрд░ рдХреЗрд╡рд▓ SWD рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдмреЛрд░реНрдб рдкрд░ рдХреЛрдИ jtag рдирд╣реАрдВ рдерд╛ред рддрджрдиреБрд╕рд╛рд░, рдореИрдВ jtag рдкрд░ рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рд╕реНрддрд░реЛрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдордХреЗ рдПрд╡реАрдЖрд░ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд░рд╛рдЙрдЯрд░ рдЦреБрдж рдХрдмрд╛рдбрд╝ рдХреЗ рдвреЗрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ Sagem F @ st 2704V2 рдФрд░ V7 рднрд░рд╛ рд╣реБрдЖ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдбрд┐рд╡рд╛рдЗрд╕ рдСрд░реНрдбрд░ рд╕реЗ рдмрд╛рд╣рд░ рдереЗред рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмреЛрд░реНрдб рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ (рджреЗрдЦреЗрдВ [реи])ред

рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдбрд┐рдмрдЧрд░ / рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рд╡рд╣ рдЕрдкрдиреЗ рд╕реНрдЯреЙрдХ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд╛рдЧрдд рдХреЗ рдЬрдирддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рднреЗрдЬрдиреЗ рдХреА рд╕рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдФрд░ рдзрди (рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рд╢рд╣рд░ рд╕реЗ)ред

рдпрд╣рд╛рдВ рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдореИрдВ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рд╕рдм, рдЕрдЪреНрдЫрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╣реИ!

рдЙрдкрдпреЛрдЧреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕реВрдЪреА


  1. wiki.openwrt.org/toh/sagem/fast2704
  2. radiohlam.ru/forum/viewtopic.php?f=54&t=3749
  3. openocd.org
  4. developer.mbed.org/handbook/CMSIS-DAP
  5. github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Programming-an-STM32F103XXX-with-a-generic-ST-Link-V2-programmer-from-Linux

Source: https://habr.com/ru/post/hi402233/


All Articles