úterý 19. listopadu 2019

Build DigiTempu pro Turris

Nejprve je potřeba nainstalovat vše potřebné


apt-get install ca-certificates git build-essential zlib1g-dev gawk libssl-dev subversion unzip libncurses-dev wget python file rsync

pak již stačí naklonovat aktuální verzi zrojáků pro TurrisOS

https://gitlab.labs.nic.cz/turris/turris-build/-/archive/master/turris-build-master.zip

Obsah rozbalíme a spustíme skript compile_pkgs, parametr board nahradíme HW pro který balíček kompilujeme (turris, omnia, mox)

compile_pkgs prepare_tools -t <board>

Pak již stačí přidat do feeds.conf link na balíček DigiTempu.

src-git hnw_digitemp https://github.com/hnw/openwrt-packages-digitemp.git

A provést update a zkompilovat balíček DigiTempu

./scripts/feeds update -a
./scripts/feeds install digitemp
make defconfig
make package/toolchain/compile
make package/digitemp/compile

A je to, v in/packages/arm_cortex-a9_vfpv3/packages/
No tak ne, bude ještě potřebovat laborovat, balíček nám nejde nainstalovat:
root@JFila:digitem# opkg install digitemp_3.7.2-2_arm_cortex-a9_vfpv3.ipk 
Unknown package 'digitemp'.
Collected errors:
 * pkg_hash_fetch_best_installation_candidate: Packages for digitemp found, but incompatible with the architectures configured
 * opkg_install_cmd: Cannot install package digitemp.


https://gitlab.labs.nic.cz/turris/turris-build
https://github.com/hnw/openwrt-packages-digitemp

středa 3. července 2019

Dekódování certifikátu

openssl x509 -text -noout -in certificate.crt
openssl crl -inform DEM -text -noout -in certificate.crt

formát certifikátu:

-----BEGIN CERTIFICATE-----
MIIF+TCCBOGgAwIBAgIRAOUXUXsbB/LpS0VTQsz/HFcwDQYJKoZIhvcNAQELBQAw
gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
JU9CcMK//V5CIAjGNzV55hB7zFYAAAFoWw+eiwAABAMARzBFAiEAmdEbql+1pWWf
HmpkY34JziCOQzaDlFVtUFen+blgIWwCIBVnwDD3vnwSsrO2T5Clo5Pjqa+xxU7O
trLo/ZRGkICBMA0GCSqGSIb3DQEBCwUAA4IBAQAzOM9lS3RSU7rLy8T3BfixHvua
ErZ+YOHCHpYhlCeSuFZ66jVHueYWvgfF8A+enRdMM0k0z0PC9enREnumNDq3msCf
WYhSLd5lDXiEddg2GCrXkwhOFfOiG0tywS5CD+hLsTq1LQkWDQg7EKlIb6ddhaZO
IYEQ9xwE7aehynQEvAjv3UyevMYfvw7glY+MW5bkMfsxPndDD1gDbnYt8kyenjcv
odjnkvTw4ngnCy1gF9mVWkgQsE1j34FER1bVtR/FlspI0FB+ogV4Qhso1N23DwtF
VDKxH8p+ddYh1LX4b6Oy3dZqzt4HOcunPKsFv36ABpeTs8FPOjgQueTWfHQ4
-----END CERTIFICATE-----



https://www.sslmentor.cz/napoveda/formaty-certifikatu

sobota 29. června 2019

Raspberry Pi ladění

Jak jsem ji psal v předchozím příspěvku, Raspberry Pi má snadno dostupný JTAG a díky tomu je možné kód na něm pohodlně ladit. Jako převodník jsem použil čínský klon J-Linku a již dříve popsané OpenOCD.

openocd -f ..\scripts\interface\jlink.cfg -f ..\scripts\target\raspberry3.cfg

GNU MCU Eclipse OpenOCD, 64-bitOpen On-Chip Debugger 0.10.0+dev-00593-g23ad80df4 (2019-04-22-20:25)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain connect_deassert_srst
adapter speed: 1000 kHz
jtag_ntrst_delay: 500
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : J-Link ARM V8 compiled Nov 28 2014 13:44:46
Info : Hardware version: 8.00
Info : VTarget = 3.306 V
Info : clock speed 1000 kHz
Info : JTAG tap: rpi3.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : rpi3.a53.0: hardware has 6 breakpoints, 4 watchpoints
Info : rpi3.a53.1: hardware has 6 breakpoints, 4 watchpoints
Info : rpi3.a53.2: hardware has 6 breakpoints, 4 watchpoints
Info : rpi3.a53.3: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : Listening on port 3334 for gdb connections
Info : Listening on port 3335 for gdb connections
Info : Listening on port 3336 for gdb connections

po připojení telnetem (port 4444) se zobrazí toto:
Open On-Chip Debugger
> targets
    TargetName         Type       Endian TapName            State
--  ------------------ ---------- ------ ------------------ ------------
 0  rpi3.a53.0         aarch64    little rpi3.tap           running
 1  rpi3.a53.1         aarch64    little rpi3.tap           running
 2  rpi3.a53.2         aarch64    little rpi3.tap           running
 3* rpi3.a53.3         aarch64    little rpi3.tap           running
> halt
cannot read system control register in this mode
in procedure 'target'
> targets
    TargetName         Type       Endian TapName            State
--  ------------------ ---------- ------ ------------------ ------------
 0  rpi3.a53.0         aarch64    little rpi3.tap           running
 1  rpi3.a53.1         aarch64    little rpi3.tap           running
 2  rpi3.a53.2         aarch64    little rpi3.tap           running
 3* rpi3.a53.3         aarch64    little rpi3.tap           halted
> mww 0x3f200004 0x40240
> mdw 0x3f200000 0x50
0x3f200000: 00000000 00040240 086db6c0 00000009 3f200924 00000fff 00000000 6770696f
0x3f200020: 6770696f 6770696f 6770696f 6770696f 6770696f 1349c1ff 003efcff 00000000
0x3f200040: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x3f200060: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x3f200080: 00000000 00000000 00000000 00000000 00000000 00000002 00000000 00000000
0x3f2000a0: 00000000 ffffffff 003fffff 6770696f 00000000 6770696f 6770696f 6770696f
0x3f2000c0: 00000000 00000000 00000000 00000000 6770696f 6770696f 6770696f 6770696f
0x3f2000e0: 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f
0x3f200100: 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f
0x3f200120: 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f 6770696f

mdb u Raspberry Pi nefunguje, protože CPU umožňuje číst jen po 32 bitech
> mdb 0x3f200000
Opcode 0x1001e4d0, DSCR.ERR=1, DSCR.EL=2

stejně tak nebude fungovat s jinou adresou než dělitelnou čtyřkou (word)
> mdw 0x3f200001
Opcode 0x1004e490, DSCR.ERR=1, DSCR.EL=2

zapnutí LEDek (nastavení směru pro GPIO12,13 a 16)
mww 0x3f200004 0x40240

Stažení image (kernel7.img je po startu nakopírován GPU od adresy 0x8000):
> dump_image flash.bin 0x8000 0x1000
dumped 4096 bytes in 0.097825s (40.889 KiB/s)

Nyní ještě k jádrům, to je novinka oproti klasickým STM32F1, které mají jádro jen jedno. Napadlo vás někdy jak to vlastně funguje, když máme procesory třeba čtyři? Jak je třeba psát program pro čtyř jádrový procesor? Pokud napíšeme program, tak jak jsem to udělal v předchozím příspěvku, nulté jádro ho vykonává ale ostatní jadérka se nám "flákají".

nahrajeme program do RAM paměti
load_image "D:/vyvoj/GPIO_jinak/main.bin" 0x90000 bin

a spustíme
resume 0x90000

Zapojení pinů:

JTAG Pin
J-Link Pin
SoC Pin
Raspberry Pi pin
Vref
1

1
nRST
3
GPIO22
15
GND
4

6
TDI
5
GPIO26
37
TMS
7
GPIO27
13
TCK
9
GPIO25
22
RTCK
11
GPIO23
16
TDO
13
GPIO24
18





neděle 26. května 2019

RTL SDR pod Windows 10

Po přechodu na Windows 10 bylo nutné nainstalovat nové ovladače pro RTL2832U. V mém případě nestačilo jen stáhnout a dle obvyklého postupu "nahradit" původní ovladač WinUSB. Koumáním logu jsem zjistil, že při instalaci si program vytvoří v "Users/Jméno_uživatele/" složku usb_driver ale hledá ji v umístění "Users/Jméno_uživatele/./usb_driver/". Stačilo tedy, v rozšířeném módu, kliknout vedle tlačítka "Install Driver" nebo "Replace Driver" a vybrat příslušnou složku amd64 nebo x86. Viz následující obrázek.


Pokud po instalaci ovladače WinUSB není možné tuner najít, tak je potřeba podobně postupovat USB Driver Tool.

http://visualgdb.com/UsbDriverTool

Jako první jsem se pokusil naladit FM rádia, konkrétně Radiožurnál je u nás na frekvenci 88,5 MHz, musel jsem tedy vyštrachat FM anténu od staré TV karty. Pro příjem jsem použil SDRSharp viz následující obrázek, je nutné si trochu pohrát se ziskem vstupního zesilovače (RF Gain).




Nastavení.


Dálková ovládání jsou většinou v pásmu 433 MHz.

Dále je možné si pěkně naladit takové ty dětské vysílačky, jedna byla na frekvenci 27 MHz a druhá na 52,6 MHz.

Příjem AM (amplitudově modulovaného signálu) je možné si vyzkoušel například na vysílání letového provozu. Pásmo se nachází v rozsahu 108-136 MHz a používá se právě AM modulace.

Příklady frekvencí letišť, které mají přiděleny:
Mladá Boleslav                       123,6 MHz
Dvůr Králové nad Labem 119,65 MHz

Příklad komunikace je zde: Aha, zrovna nám okolo letí OK-RTR - CESSNA 172 SP  z odkazu zjistíme spoustu zajímavých podrobností.

Kromě příjmu FM rádií se podařilo zprovoznit i příjem ADS-B dat palubních odpovídačů letadel. Bylo nutné si vzpomenout, jak se počítala vlnová délka lambda a uskřípnout a připájet dva drátky o délce čtvrtiny vlnové délky. Pro kmitočet ADS-B 1090 MHz je délka jedné poloviny cca 6,9 cm, tím nám vznikl půlvlnný dipól.


Dále jsem se pokoušel zobrazit spektrum GPS signálu ale patrně již bylo mimo rozsah přijímače (1575,42 MHz) nebo napájením předzesilovače antény.

Další bezva věcí je možnost SDRSharp doplnit o měřič signálu (LEVELMETER) ideální pro nastavení anténního zesilovače.

Na závěr jsem se ještě pokoušel o příjem DAB ale bohužel se nezadařilo, přikládám tedy alespoň obrázek spektra.



Zdroje:
http://sdr.ipip.cz/rtl-sdr-ads-b
http://blueskyaviation.cz/pronajem-letadel/cessna-172-sp/
https://www.rtl-sdr.com/levelmeter-new-sdr-plugin/

sobota 11. května 2019

Pokračování s GDB


C:\Users\Jenda\Documents\ARM_GCC_Tools\bin>arm-none-eabi-gdb.exe "C:\Users\Jenda\Documents\STM32\STM32L1\Debug test\Debug\Debug test.elf"
C:\Users\Jenda\Documents\ARM_GCC_Tools\bin\arm-none-eabi-gdb.exe: warning: Couldn't determine a path for the index cache directory.
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=i686-w64-mingw32 --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from C:\Users\Jenda\Documents\STM32\STM32L1\Debug test\Debug\Debug test.elf...
 (gdb) target remote localhost:3333    # připojení k OpenOCD
Remote debugging using localhost:3333
0x00000000 in ?? ()
(gdb) load                              # nahrání proramu na MCU
Loading section .isr_vector, size 0x13c lma 0x8000000
Loading section .text, size 0x1474 lma 0x800013c
Loading section .rodata, size 0x1c lma 0x80015b0
Loading section .init_array, size 0x4 lma 0x80015cc
Loading section .fini_array, size 0x4 lma 0x80015d0
Loading section .data, size 0xc lma 0x80015d4
Start address 0x80014f4, load size 5600
Transfer rate: 5 KB/sec, 933 bytes/write.
(gdb) monitor reset halt               # zastavení MCU
Unable to match requested speed 300 kHz, using 240 kHz
Unable to match requested speed 300 kHz, using 240 kHz
adapter speed: 240 kHz
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080014f4 msp: 0x20004000
(gdb) l                                # zobrazení zdrojového kódu
warning: Source file is more recent than executable.
62      /**
63        * @brief  The application entry point.
64        * @retval int
65        */
66      int main(void)
67      {
68        /* USER CODE BEGIN 1 */
69
70        /* USER CODE END 1 */
71
(gdb) l 95                             # zobrazení zdrojového kódu od řádky 85
90        MX_GPIO_Init();
91        /* USER CODE BEGIN 2 */
92        volatile char array[10];
93        array[0] = 'a';
94        array[1] = 'b';
95        //array[25] = 'x';
96        array[2] = 'c';
97        array[3] = 'd';
98
99        for (int i = 8; i<10; i++) array[i] = i;
(gdb) b 97                             # přidání breakpointu na řádek 97
Breakpoint 1 at 0x8001242: file ..\Src\main.c, line 97.
(gdb) c                                # pokračování běhu programu
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, main () at ..\Src\main.c:97    # běh se zastavil na bteakpointu
97        array[3] = 'd';
(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
HAL_GPIO_ReadPin (GPIOx=0x40020000, GPIO_Pin=1) at ..\Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c:401
401     }
(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
0x0800076e in HAL_GPIO_ReadPin (GPIOx=0x40020000, GPIO_Pin=1) at ..\Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c:392
392       if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
0x08000764 in HAL_GPIO_ReadPin (GPIOx=0x40020000, GPIO_Pin=1) at ..\Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c:386
386     {
(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
0x08000782 in HAL_GPIO_ReadPin (GPIOx=0x40020000, GPIO_Pin=1) at ..\Drivers\STM32L1xx_HAL_Driver\Src\stm32l1xx_hal_gpio.c:401
401     }
(gdb) disas main          # disassemblování funkce main
Dump of assembler code for function main:
   0x08001224 <+0>:     push    {r7, lr}
   0x08001226 <+2>:     sub     sp, #16
   0x08001228 <+4>:     add     r7, sp, #0
   0x0800122a <+6>:     bl      0x800017c <HAL_Init>
   0x0800122e <+10>:    bl      0x80012a0 <SystemClock_Config>
   0x08001232 <+14>:    bl      0x800132c <MX_GPIO_Init>
   0x08001236 <+18>:    movs    r3, #97 ; 0x61
   0x08001238 <+20>:    strb    r3, [r7, #0]
   0x0800123a <+22>:    movs    r3, #98 ; 0x62
   0x0800123c <+24>:    strb    r3, [r7, #1]
   0x0800123e <+26>:    movs    r3, #99 ; 0x63
   0x08001240 <+28>:    strb    r3, [r7, #2]
=> 0x08001242 <+30>:    movs    r3, #100        ; 0x64
   0x08001244 <+32>:    strb    r3, [r7, #3]
   0x08001246 <+34>:    movs    r3, #8
   0x08001248 <+36>:    str     r3, [r7, #12]
   0x0800124a <+38>:    b.n     0x8001260 <main+60>
   0x0800124c <+40>:    ldr     r3, [r7, #12]
   0x0800124e <+42>:    uxtb    r1, r3
   0x08001250 <+44>:    mov     r2, r7
   0x08001252 <+46>:    ldr     r3, [r7, #12]
   0x08001254 <+48>:    add     r3, r2
   0x08001256 <+50>:    mov     r2, r1
   0x08001258 <+52>:    strb    r2, [r3, #0]
   0x0800125a <+54>:    ldr     r3, [r7, #12]
   0x0800125c <+56>:    adds    r3, #1
   0x0800125e <+58>:    str     r3, [r7, #12]
   0x08001260 <+60>:    ldr     r3, [r7, #12]
   0x08001262 <+62>:    cmp     r3, #11
   0x08001264 <+64>:    ble.n   0x800124c <main+40>
   0x08001266 <+66>:    movs    r1, #1
   0x08001268 <+68>:    ldr     r0, [pc, #44]   ; (0x8001298 <main+116>)
   0x0800126a <+70>:    bl      0x800075c <HAL_GPIO_ReadPin>
   0x0800126e <+74>:    mov     r3, r0
   0x08001270 <+76>:    cmp     r3, #1
   0x08001272 <+78>:    bne.n   0x8001266 <main+66>
   0x08001274 <+80>:    movs    r2, #0
   0x08001276 <+82>:    movs    r1, #64 ; 0x40
   0x08001278 <+84>:    ldr     r0, [pc, #32]   ; (0x800129c <main+120>)
   0x0800127a <+86>:    bl      0x800078a <HAL_GPIO_WritePin>
   0x0800127e <+90>:    movs    r0, #200        ; 0xc8
   0x08001280 <+92>:    bl      0x8000258 <HAL_Delay>
   0x08001284 <+96>:    movs    r2, #1
   0x08001286 <+98>:    movs    r1, #64 ; 0x40
   0x08001288 <+100>:   ldr     r0, [pc, #16]   ; (0x800129c <main+120>)
   0x0800128a <+102>:   bl      0x800078a <HAL_GPIO_WritePin>
   0x0800128e <+106>:   movs    r0, #200        ; 0xc8
--Type <RET> for more, q to quit, c to continue without paging--
   0x08001290 <+108>:   bl      0x8000258 <HAL_Delay>
   0x08001294 <+112>:   b.n     0x8001266 <main+66>
   0x08001296 <+114>:   nop
   0x08001298 <+116>:   movs    r0, r0
   0x0800129a <+118>:   ands    r2, r0
   0x0800129c <+120>:   lsls    r0, r0, #16
   0x0800129e <+122>:   ands    r2, r0
End of assembler dump.
(gdb) jump *0x80000  # spuštění kódu od adresy 0x80000

Continuing at 0x80000.
(gdb) i b                        # výpis aktivních breakpointů
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08001236 in main at ..\Src\main.c:93
        breakpoint already hit 1 time
2       breakpoint     keep y   0x08001242 in main at ..\Src\main.c:97
        breakpoint already hit 1 time

(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
0x08001270 in main () at ..\Src\main.c:110
110         /* USER CODE END WHILE */
(gdb) q
A debugging session is active.

        Inferior 1 [Remote target] will be detached.

Quit anyway? (y or n) y

Další zajímavostí je možnost tvorby vlastního skriptu:
(gdb) define hexdump
Type commands for definition of "hexdump".
End with a line saying just "end".
>dump binary memory dump.bin $arg0 $arg0+$arg1
>shell hexdump dump.bin -C
>end
(gdb) 
(gdb) hexdump 0x80000 0x100
00000000  a1 00 38 d5 21 04 40 92  61 00 00 b4 5f 20 03 d5  |..8.!.@.a..._ ..|
00000010  ff ff ff 17 61 01 00 58  3f 00 00 91 61 01 00 58  |....a..X?...a..X|
00000020  e2 00 00 18 82 00 00 34  3f 84 00 f8 42 04 00 51  |.......4?...B..Q|
00000030  a2 ff ff 35 07 00 00 94  f5 ff ff 17 02 00 00 00  |...5............|
00000040  00 00 08 00 00 00 00 00  60 02 08 00 00 00 00 00  |........`.......|
00000050  fd 7b bf a9 fd 03 00 91  08 00 00 94 00 00 00 90  |.{..............|
00000060  00 a0 08 91 5b 00 00 94  00 00 00 90 00 80 09 91  |....[...........|
00000070  58 00 00 94 00 00 00 14  f3 0f 1f f8 80 00 8a d2  |X...............|
00000080  20 e4 a7 f2 01 00 40 b9  80 00 8a d2 20 e4 a7 f2  | .....@..... ...|
00000090  21 00 00 32 01 00 00 b9  00 0c 8a d2 20 e4 a7 f2  |!..2........ ...|
000000a0  1f 00 00 b9 80 09 8a d2  20 e4 a7 f2 61 00 80 52  |........ ...a..R|
000000b0  01 00 00 b9 00 0a 8a d2  20 e4 a7 f2 1f 00 00 b9  |........ .......|
000000c0  80 08 8a d2 20 e4 a7 f2  1f 00 00 b9 00 09 8a d2  |.... ...........|
000000d0  20 e4 a7 f2 c1 18 80 52  01 00 00 b9 00 0d 8a d2  | ......R........|
000000e0  20 e4 a7 f2 c1 21 80 52  01 00 00 b9 80 00 80 d2  | ....!.R........|
000000f0  00 e4 a7 f2 13 00 40 b9  73 66 0e 12 00 00 84 52  |......@.sf.....R|
00000100


https://stackoverflow.com/questions/9233095/memory-dump-formatted-like-xxd-from-gdb