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

čtvrtek 3. července 2025

Build Linux pro RPi

 Instalovat:

sudo apt update
sudo apt install build-essential git cpio unzip rsync bc libncurses5-dev libssl-dev

Naklonovat repozitář:

git clone https://github.com/buildroot/buildroot.git
cd buildroot

Zkopírovat vzorový konfig pro RPi4

cp configs/raspberrypi4_64_defconfig .config

Upravit dle potřeby:

make menuconfig

vyřešit problém s mezerami v PATH:

#!/bin/bash
export PATH="/usr/local/bin:/usr/bin:/bin" # základní cesty bez mezer

Přeložit a čekat

make -j 6 # počet jader CPU pro kompilaci

Výsledný obraz nalezneme v output/images/sdcard.img

sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress && sync

Nyní vytvoříme helloword a pokusíme se ho spustit

nano hello.c
./buildroot/output/host/bin/aarch64-linux-gcc -o hello hello.c

#include <stdio.h> void main() { printf("Funguje to!\n"); }

pátek 3. ledna 2025

Přidání nového modulu do jádra a Device Tree na Raspberry Pi

V tomto článku se podíváme na proces přidání nového modulu do linuxového jádra na Raspberry Pi a jeho konfiguraci pomocí Device Tree (DT). Ukážeme si konkrétní příklad s EEPROM pamětí připojenou přes I2C sběrnici.


1. Stažení a příprava modulu

Nejprve stáhneme zdrojový kód ovladače z repozitáře Linuxu. Použijeme EEPROM ovladač at24:

wget https://raw.githubusercontent.com/torvalds/linux/refs/tags/v6.6/drivers/misc/eeprom/at24.c

Tento ovladač slouží k práci s paměťmi EEPROM přes sběrnici I2C. Zajišťuje správu komunikace mezi jádrem systému a zařízením připojeným přes I2C.


2. Vytvoření Makefile

Makefile definuje pravidla pro kompilaci modulu. Vytvořte soubor s názvem Makefile s následujícím obsahem:

obj-m += at24.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Popis obsahu Makefile:

  • obj-m += at24.o: Určuje, že chceme sestavit modul at24.
  • all: Používá se pro sestavení modulu pomocí Makefile. Spustí se příkaz pro kompilaci modulu ve správném adresáři jádra.
  • clean: Smaže dočasné soubory vytvořené během kompilace.

Pro spuštění kompilace použijte:

make

Výstupem bude soubor at24.ko, což je zkompilovaný modul jádra.


3. Vytvoření Device Tree pro I2C zařízení

Device Tree (DT) je systémová konfigurace, která popisuje hardwarová zařízení. Pro konfiguraci EEPROM pamětí vytvoříme soubor at24.dts s následujícím obsahem:

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";

    fragment@0 {
        target = <&i2c1>;  // Použití I2C-1
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;

            EEPROM1@50 {  // první EEPROM
                compatible = "at24,24c02";  // Typ EEPROM
                reg = <0x50>;               // Adresa na I2C sběrnici
                pagesize = <16>;            // Velikost stránky
                size = <256>;               // Celková velikost EEPROM
            };
            EEPROM2@57 {  // druhá EEPROM
                compatible = "at24,24c02";
                reg = <0x57>;               // Adresa na I2C sběrnici
                pagesize = <16>;
                size = <256>;
            };
        };
    };
};

Vysvětlení obsahu souboru:

  • compatible = "brcm,bcm2835";: Specifikuje, že konfigurace je určena pro BCM2835 (Raspberry Pi SoC).
  • reg = <0x50>;: Specifikuje skutečnou adresu zařízení na I2C sběrnici, která bude jádrem použita ke komunikaci se zařízením.
  • pagesize a size: Definují parametry paměti EEPROM.

4. Kompilace Device Tree

Pro převedení souboru na binární formát použijeme nástroj:

dtc -I dts -O dtb -o at24.dtbo at24.dts

Tímto příkazem vznikne binární soubor at24.dtbo, který je připraven pro použití.

Nahrání overlay:

Zkopírujeme výsledný soubor do adresáře s DT overlays:

sudo cp at24.dtbo /boot/firmware/overlays/

Přidáme overlay do konfiguračního souboru:

echo 'dtoverlay=at24' | sudo tee -a /boot/firmware/config.txt

5. Testování EEPROM

Zápis dat do EEPROM:

Pro otestování funkce EEPROM můžeme zapsat řetězec do paměti:

echo "Zapis do I2C EEPROM" | sudo dd of=/sys/bus/i2c/devices/1-0057/eeprom bs=1 seek=0

Čtení dat z EEPROM:

Následně ověříme zápis čtením obsahu EEPROM:

sudo hexdump -C /sys/bus/i2c/devices/1-0057/eeprom

Ukázkový výstup:

00000000  5a 61 70 69 73 20 64 6f  20 49 32 43 20 45 45 50  |Zapis do I2C EEP|
00000010  52 4f 4d 0a 01 00 0f 00  00 00 00 14 0f 14 2d 10  |ROM...........-.|

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





sobota 12. ledna 2019

Raspberry Pi programování bez OS

Před nějakou dobou jsem se pokoušel přeložit jednoduchý program pro Raspberry Pi bez takových zbytečností jako je linuxové jádro. :-) A jak na to?

pátek 8. června 2012

Ethernet, HDMI, SATA, USB co více si přát?

Na internetu jsem našel zajímavého konkurenta  Raspberry Pi, jedná se o multimediální přehrávač k TV MELE A2000. Hlavní výhodou je jeho snadná hacknutelnost a spuštění například Ubuntu. Odkazuji na fotky a stránku s popisem IO pinů:


 Cenou je cca o čtvrtinu dražší než Pi, ale je také nutné do výsledné ceny započítat napájecí adaptér, dálkový ovladač a 4 GB Flash! Na desce je také integrován WiFi  b/g/n modul. Jediným nedostatkem je asi nemožnost připojení kamery jako u PI ale nic nebrání tomu připojit libovolnou webkameru do USB portu. Také předpokládám, že u tohoto zařízení není tak kostrbaté řešení připojení Ethernetu pomocí USB sběrnice. Škoda, že jsem zatím nenašel nic o podpoře OpenWRTáku pro toto zařízení, bylo by tak možné realizovat levný a rychlý NAS, WEB server, WRT je možné nahradit například Debianem.

ARM Cortex A8 1GHz
RAM: DDR III 512MB
Storage: Built-in 4GB flash memory (firmware included)

http://rhombus-tech.net/allwinner_a10/hacking_the_mele_a1000/
dealextreme.com