Zobrazují se příspěvky se štítkemMCU. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemMCU. Zobrazit všechny příspěvky

středa 11. dubna 2018

USB Blaster + OpenOCD a STM32





root@Jenda:/usr/local/share/openocd# openocd -f interface/altera-usb-blaster.cfg  \
> -c "transport select jtag"  \
> -f target/stm32f3x.cfg
Open On-Chip Debugger 0.10.0+dev-00362-g78a44055 (2018-03-27-17:48)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
Warn : Transport "jtag" was already selected
jtag
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : usb blaster interface using libftdi
Info : This adapter doesn't support configurable speed
Info : JTAG tap: stm32f3x.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: stm32f3x.bs tap/device found: 0x06422041 (mfg: 0x020 (STMicroelectronics), part: 0x6422, ver: 0x0)
Info : stm32f3x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : accepting 'telnet' connection on tcp/4444
Error: Translation from khz to jtag_speed not implemented
in procedure 'reset' 
in procedure 'ocd_bouncer' 
in procedure 'ocd_process_reset' 
in procedure 'ocd_process_reset_inner' called at file "embedded:startup.tcl", line 248
in procedure 'stm32f3x.cpu' called at file "embedded:startup.tcl", line 286
in procedure 'ocd_bouncer'

Info : JTAG tap: stm32f3x.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: stm32f3x.bs tap/device found: 0x06422041 (mfg: 0x020 (STMicroelectronics), part: 0x6422, ver: 0x0)
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x0800045c msp: 0x20000408
===== arm v7m registers
(0) r0 (/32): 0x00000000
(1) r1 (/32): 0x00000000
(2) r2 (/32): 0x00000000
(3) r3 (/32): 0x00000000
(4) r4 (/32): 0x00000000
(5) r5 (/32): 0x00000000
(6) r6 (/32): 0x00000000
(7) r7 (/32): 0x00000000
(8) r8 (/32): 0x00000000
(9) r9 (/32): 0x00000000
(10) r10 (/32): 0x00000000
(11) r11 (/32): 0x00000000
(12) r12 (/32): 0x00000000
(13) sp (/32): 0x20000408
(14) lr (/32): 0xFFFFFFFF
(15) pc (/32): 0x0800045C
(16) xPSR (/32): 0x01000000
(17) msp (/32): 0x20000408
(18) psp (/32): 0x00000000
(19) primask (/1): 0x00
(20) basepri (/8): 0x00
(21) faultmask (/1): 0x00
(22) control (/2): 0x00
(23) d0 (/64): 0x0000000000000000
(24) d1 (/64): 0x0000000000000000
(25) d2 (/64): 0x0000000000000000
(26) d3 (/64): 0x0000000000000000
(27) d4 (/64): 0x0000000000000000
(28) d5 (/64): 0x0000000000000000
(29) d6 (/64): 0x0000000000000000
(30) d7 (/64): 0x0000000000000000
(31) d8 (/64): 0x0000000000000000
(32) d9 (/64): 0x0000000000000000
(33) d10 (/64): 0x0000000000000000
(34) d11 (/64): 0x0000000000000000
(35) d12 (/64): 0x0000000000000000
(36) d13 (/64): 0x0000000000000000
(37) d14 (/64): 0x0000000000000000
(38) d15 (/64): 0x0000000000000000
(39) fpscr (/32): 0x00000000
===== Cortex-M DWT registers
(40) dwt_ctrl (/32)
(41) dwt_cyccnt (/32)
(42) dwt_0_comp (/32)
(43) dwt_0_mask (/4)
(44) dwt_0_function (/32)
(45) dwt_1_comp (/32)
(46) dwt_1_mask (/4)
(47) dwt_1_function (/32)
(48) dwt_2_comp (/32)
(49) dwt_2_mask (/4)
(50) dwt_2_function (/32)
(51) dwt_3_comp (/32)
(52) dwt_3_mask (/4)
(53) dwt_3_function (/32)
https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_usb_blstr.pdf

neděle 25. března 2018

Reverzní inženýrství

Začalo to pokusem zprovoznit JTAG pod OpenOCD. S ASIX Presto jsem si s touto kombinací vylámal zuby už dávno ale s RaspberryPi 3 by to mohlo jít.

Nejprve je nutné OpenOCD pro RaspberryPi stáhnout a přeložit (tak například takto):

git clone git://git.code.sf.net/p/openocd/code openocd-code

Dále je potřeba v konfiguraci povolit veškeré požadované rozhraní (hlavně --enable-sysfsgpio --enable-bcm2835gpio ale FTDIčko také není na závadu)

./bootstrap
./configure

A potom už jen make a nainstalovat,

make
sudo make install

všechny potřebné skripty pro jeho používání nalezneme v /usr/local/share/openocd/scripts/

Nyní již stačí správně propojit drátky, kdo má drátků málo, tak použije SWD (SWDIO, SWDCLK, GND) kdo má drátků hodně nebo tak akorát může použít JTAG (TCK, TMS, TDI, TDO, TRST, SRST).

Pro RaspberryPi 3 jsem použil soubor s konfigurací raspberrypi2-native.cfg, zde je možné zvolit zda JTAG nebo SWD.

Po drobném laborování jsem si udělal upravil soubor raspberrypi2.cfg, tak aby bylo možné použít jedno nebo druhé se stejným zapojením:

#
# Config for using Raspberry Pi's expansion header
#
# This is best used with a fast enough buffer but also
# is suitable for direct connection if the target voltage
# matches RPi's 3.3V and the cable is short enough.
#
# Do not forget the GND connection, pin 6 of the expansion header.
#

interface bcm2835gpio

#RPi2 & RPi3
bcm2835gpio_peripheral_base 0x3F000000
#RPi1
#bcm2835gpio_peripheral_base 0x20000000

# Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
# These depend on system clock, calibrated for stock 700MHz
# bcm2835gpio_speed SPEED_COEFF SPEED_OFFSET
#RPi2 & RPi3
bcm2835gpio_speed_coeffs 146203 36
#RPi1
#bcm2835gpio_speed_coeffs 113714 28

# Each of the JTAG lines need a gpio number set: tck tms tdi tdo
# Header pin numbers: 23 22 19 21
bcm2835gpio_jtag_nums 11 25 10 9

# or if you have both connected,
# reset_config trst_and_srst srst_push_pull

# Each of the SWD lines need a gpio number set: swclk swdio
# Header pin numbers: 23 22
bcm2835gpio_swd_nums 11 25

# If you define trst or srst, use appropriate reset_config
# Header pin numbers: TRST - 26, SRST - 18

bcm2835gpio_trst_num 7
# reset_config trst_only

bcm2835gpio_srst_num 18
#reset_config srst_only srst_push_pull

# or if you have both connected,
reset_config trst_and_srst srst_push_pull

OpenOCD spustíme příkazem (pozor na pořadí parametrů):

sudo openocd -f interface/raspberrypi2-native.cfg -c "transport select swd" -f target/stm32f3x.cfg
nebo
sudo openocd -f interface/raspberrypi2-native.cfg -c "transport select jtag" -f target/stm32f3x.cfg

A už nám OpenOCD pěkně čeká na spojení (pozor na Discavery Boardech je třeba odpojit piny STLinku a někdy i tahá za další, takže odpojení a připojení napájení destičky vždy pomohlo).


Po připojení většinou procesor běží, je nutné ho zastavit příkazem:
reset halt

a nyní již můžeme vyčíst registry:


Dále si můžeme nechat zobrazit paměť (šuf obsah FLASH).


Dále se zeptáme na paměťové banky - ověříme si, že FLASH je zde namapována od adresy 0x08000000


A stáhneme si obsah flash paměti





a když už máme FW, tak co se takhle do něho podívat? Využil jsem to jako první seznámení s radare2:

ToDo:

pohrát si s binwalk, nejlépe si vyčíst FW z OpenWRT routeru.
https://www.youtube.com/watch?v=GIU4yJn2-2A
https://www.youtube.com/watch?v=8dXhrOEGHTY
https://www.youtube.com/watch?v=oXSx0Qo2Upk

Jinak OpenOCD bylo nutné přeložit, pro Presto je potřeba ještě přeložit také knihovnu libftdi a potom už svatá trojka.

nebo libftdi je možné nainstalovat sudo apt-get install libusb-1.0 libusb-dev a změnit --prefix na "--prefix=/usr/"

./configure \
--enable-ftdi \
--enable-stlink \
--enable-ti-icdi \
--enable-ulink \
--enable-dummy \
--enable-usb-blaster-2 \
--enable-jlink \
--enable-osbdm \
--enable-opendous \
--enable-aice \
--enable-vsllink \
--enable-usbprog \
--enable-rlink \
--enable-armjtagew \
--enable-parport \
--enable-jtag_vpi \
--enable-usb_blaster_libftdi \
--enable-amtjtagaccel \
--enable-gw16012 \
--enable-ep93xx \
--enable-presto_libftdi \
--enable-openjtag_ftdi \
--enable-buspirate \
--enable-sysfsgpio \
--enable-arm-jtag-ew \
--enable-bcm2835gpio \
--enable-at91rm9200 \
--enable-ft2232_libftdi \
--enable-parport-ppdev \
--enable-parport-giveio \
--enable-remote-bitbang \
--prefix=/home/pi/libftdi1-1.4/libftdi1-1.4/
make
make install

https://pinout.xyz/

pondělí 15. prosince 2014

WiFi modulek za 90 Kč

Náhodou jsem na eBay narazil na malý ale šikovný WiFi modulek Wi07c. Dokáže pracovat v režimech AP, jako klient a nebo obojí najednou. Po rozbalení stačilo připojit napájení, Rx a Tx a vývod CH_PD na +3,3 V.



sobota 8. listopadu 2014

Zprovoznění SPI, I2C a 1-wire na OpenWRT

Jak zprovoznit SPI na zařízení s OpenWRT, když nemá volný SPI port? Stačí jen najít několik volných GPIO pinů, nainstalovat pár balíčků a už to funguje.



čtvrtek 1. prosince 2011

ATmega8(L)

16 MHz (16MIPS)
8 KB FLASH, 1KB RAM, 512 B EEPROM
ISP, 2x 8-bit Timer, 16-bit Timer, RTC, PWM, 8-bit ADC, USART, SPI, Watchdog, komparátor
vnitřní RC oscilátor 1, 2, 4, 8 MHz

středa 12. října 2011

Maskování bitů

#define ZapBit(registr,pin) ((registr)|=1<<(pin))
#define VypBit(registr,pin) ((registr)&=~(1<<(pin)))
#define InvertBit(registr,pin) (registr^=1<<pin)
#define GetBit(registr,pin) ((registr)&(1<<(pin)))


debug &= 0xC;
debug = ~debug;
debug &= 0xC;
pokus ^= ~pokus;
//pokus |= debug;

pondělí 12. září 2011

UART na ADuC702x

Výpočet konstant pro určitou přenosovou rychlost.

BaudRate
Frekvence
CD
DL
Skytečný BaudRate
Chyba BaudRate v %

čtvrtek 1. září 2011

Programování FLASH ADuC702x

Pro programování FLASH paměti stačí připojit ADuC702x sériovou linkou. Pozor některé MCU mají I2C bootloadres, viz následující tabulka. I2C bootloader je označen I na konci zančení. Například ADuC7021BCPZ62 je s UARTEM a ADuC7021BCPZ62I je s I2C.

Popis ADuC7021

MCU s jádrem ARM7TDMI RISC 32bit
Periferie - AD převodník 12bit 1 MSPS
               - DA převodník 12bit
               - PWM
               - Komparátor
               - UART
               - I2C®
               - SPI
               - Programovatelná logika IO pinů (PLA)
               - PLL pro získání hodinového kmitočtu z vnitřního nebo externího 32,768 kHz oscilátoru

Taktování ADuC702x

Časování, různé módy a předděličku ovládá registr POWCON.

GPIO u ADuC702x

IO porty jsou 5V kompatibilní, mají vnitřní pull-up (100 kΩ). Pull-up je možné vypnout u P0.0, P0.4, P0.5, P0.6, P0.7 a GPIO pinů portu P1. Při uspání MCU se porty přepnou do stavu vysoké impedance.

Nastavení funkce pinů GPxCON.

úterý 5. dubna 2011

Sériová linka + přerušení



        org     0000H    ; začátek programu po resetu

        jmp     init
        org     000BH    ; přerušení od čítače/časovače0
        jmp     T0int
        org     0023H    ; přerušení od sériové linky
        jmp     Sint       
        org     30H

C0L     EQU     30h
C0H     EQU     31h
REZIM   EQU     32h 
CAS     EQU     33h
roste   BIT     0

úterý 15. března 2011

MAM Generátor průběhů


#include <reg51.h>
#define PortDA P1 
// 0 obdélník, 1 trojúhelník, 2 pila, 3 sinus
unsigned char sinus_pole[] = {127, 152, 176, 198, 217, 233, 244, 252, 254, 252, 244
,233, 217, 198, 176, 152, 127, 102, 79, 57, 37, 22, 10, 2, 0, 2, 10, 21, 37, 56, 78, 102} ;


úterý 8. března 2011

Ukazatel nebo pole?

// | ~ & µ $ ##include <reg552.h>
code unsigned char funkce_F[16] = {0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01, 0x00,0x01,0x00,0x01,0x01,0x01,0x00,0x01};
int main()
{
unsigned char vstup;
while(1)
{
vstup = P1;
//if (funkce_F[vstup]==1) P1|=0x04; else P1 &= ~0x04;
if (*(funkce_F+vstup)==1) P1|=0x04; else P1 &= ~0x04;
}
}