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...........-.|