23
Univerzitet u Novom Sadu Fakultet tehničkih nauka Odsek za računarsku tehniku i računarske komunikacije Linuks u ugrađenim sistemima Prebacivanje Linuks kernela na drugu ploču

Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

  • Upload
    leduong

  • View
    226

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Univerzitet u Novom Sadu

Fakultet tehničkih nauka

Odsek za računarsku tehniku i računarske komunikacije

Linuks u ugrađenim sistemima

Prebacivanje Linuks kernela na drugu

ploču

Page 2: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

PREBACIVANJE LINUKS KERNELA NA DRUGU PLOČU

ARM primer

2

Page 3: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Prebacivanje (portovanje) Linuks kernela

Linuks kernel podržava veliki broj različitih arhitektura za procesore

Svaki od njih održava različita grupa kontributora

Pogledajte MAINTAINERS datoteku za detalje

Organizacija otvorenog koda i metode za portovanje Linuks kernela na novu ploču su veoma zavisne od arhitekture

Na primer, neke arhitekture koriste stablo uređaja, a neke ne koriste.

Fokusiraćemo se samo na ARM arhitekture

3

Page 4: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Arhitektura, CPU i mašina

U izvornom kodu, svaka arhitektura ima svoj direktorijum

arch/arm za ARM arhitekturu

Ovaj direktorijum sadrži generički ARM kod

boot, common, configs, kernel, lib, mm, nwfpe, vfp, oprofile, tools

I još mnogo drugih direktorijuma za različite SoC familije

mach-* direktorijumi: mach-pxa za PXA CPU-ove, mach-imx za Freescale iMX CPU-ove, itd.

Pre čišćenja ARM direktorijuma u njima se nalazila podrška za SoC familiju (GPIO, klokovi, pinmux, upravljanje prekidima, itd) za različite ploče.

Danas se tu nalazi mnogo manje koda, suštinski samo mala opisna datoteka za SoC, upravljanje napajanjem i SMP kod.

Neki tipovi CPU-ova dele isti kod u direktorijumima plat-*

Izvorni kod stabla uređaja se nalazi u arch/arm/boot/dts

4

Page 5: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Pre stabla uređaja i ARM čišćenja

Sve do 2011. godine ARM arhitektura nije koristila stablo uređaja i velikim delom SoC podrška se nalazila u arch/arm/mach-<foo>

Svaka ploča je bila podržana u kernelu preko jedinstvenog ID-a mašine

Čitava lista ovih ID-ova se može pronaći na http://www.arm.linux.org.uk/developer/machines/download.php i može slobodno da se registruje nov ID.

Linuks kernel je definisao strukturu mašine za svaku ploču koja je zauzimala ID mašine sa određenim informacijama i pozivima.

Bootloader je morao da prosledi kernelu ID mašine u specifičnom ARM registru. 5

Page 6: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Stablo uređaja i čišćenje ARM-a

Kako je ARM arhitektura postajala popularnija, velike promene su bile potrebne

Prvo, uvedeno je stablo uređaja u ARM: umesto korišćenja C koda za opis SoC-a i ploča, specijalizovan jezik se koristi.

Drugo, mnoge infrastrukture rukovalaca su napravljene da zamene postojeći kod u arch/arm/mach-<foo>

Radni okvir za radni takt u drivers/clk

pinctrl podsistem u drivers/pinctrl

irqchip podsistem u drivers/irqchip

Podsistem clocksource u drivers/clocksource

Ovim je značajno smanjena veličina koda u mach-<foo> 6

Page 7: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Dodavanje podrške za novu ARM ploču

Ako je korišteni SoC na ploči podržan u Linuks kernelu:

Kreira se datoteka stabla uređaja u arch/arm/boot/dts, generički nazvan <soc-name>-<board-name>.dts i treba da uključi relevantnu SoC .dtsi datoteku

Stablo uređaja će opisati sve periferije SoC-a koje su uključene, pinmuxing, kao i sve uređaje koji se nalaze na ploči

Modifikuje se arch/arm/boot/dts/Makefile da se osigura da stablo uređaja bude izgrađeno tokom prevođenja kernela

Ako je potrebno, razviti nedostajuće rukovaoce uređaja za uređaje koji su na ploči izvan SoC-a.

7

Page 8: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Primer Freescale iMX28 SoC-a

Platforma fizičke arhitekture korišćena na kursu je bazirana na procesoru BCM2709 od Broadcom

Ova platforma nasleđuje BCM283x familiju Broadcom, za koju duže postoji podrška u kernelu

Zbog toga i kompleksnosti procesora i platforme BCM2709 i BCM283x oni neće bit obrađivani u ovom kontekstu

Za ilustrovanje ove sekcije, uzet je primer na mlađoj Freescale iMX28 platformi

8

Page 9: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 platforma

Crystalfontz CFA-10036

Koristi Freescale iMX28 SoC, iz MXS familije

128MB RAM-a

1 serijski prolaz, 1 LED

1 I2C magistrala, sa OLED displejem

1 SD-Card ulaz

9

Page 10: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, header

Obavezna definicija jezika stabla uređaja

/dts-v1/

Uključivanje .dtsi datoteke koja opisuje SoC

#include "im28.dtsi"

Početak korena stabla

/ {

Čitljiv string za opis mašine

model = "Crystalfontz CFA-10036 Board";

Lista compatible stringova, od najspecifičnijeg do generičkog. Može da ga koristi kernel kod da uradi proveru SoC ili ploče. compatible = "crystalfontz,cfa10036","fsl,imx28";

10

Page 11: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, chosen/memory

Definicija podrazumevane kernel komandne linije. Neki dodatni unosi specifični za OS mogu biti dodati u chosen:

Definicija veličine i lokacija RAM-a:

11

memory {

device_type = "memory";

reg = <0x400000000x8000000>; /* 128 MB */

};

chosen {

bootargs = "console=ttyS0,115200 earlyprintk";

};

Page 12: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 magistrala / UART

Pokretanje internih SoC periferija

CFA-10036 iam jedan UART, tako da se uključuje odgovarajući kontroler:

12

duart: serial@80074000 {

pinctrl-names = "default";

pinctrl-0 = <&duart_pins_b>;

status = "okay";

};

apb@80000000 {

apbh@80000000 {

apbx@80040000 {

Page 13: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, muxing

Definicija nekoliko pinova koji će biti mux-ovane kao GPIO za LED-ove i reset.

13

pinctrl@80018000 {

ssd1306_cfa10036: ssd1306-10036@0 {

reg = <0>;

fsl,pinmux-ids = <

0x2073 /* MX28_PAD_SSP0_D7__GPIO_2_7 */

>;

fsl,drive-strength = <0>;

fsl,voltage = <1>;

fsl,pull-up = <0>;

};

led_pins_cfa10036: leds-10036@0 {

reg = <0>;

fsl,pinmux-ids = <

0x3043/* MX28_PAD_AUART1_RX__GPIO_3_4 */

>;

fsl,drive-strength = <0>;

fsl,voltage = <1>;

fsl,pull-up = <0>;

};

};

Page 14: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, LED

Jedan LED konektovan na ovu platformu. Primetite referencu na muxing konfiguraciju led_pins_cfa10036

14

leds {

compatible = "gpio-leds";

pinctrl-names = "default";

pinctrl-0 = <&led_pins_cfa10036>;

power {

gpios = <&gpio341>;

default-state = "on";

};

};

Page 15: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, SD kartica / USB

Platforma ima USB prolaz

I slot za SD karticu:

15

ssp0: ssp@80010000 {

compatible = "fsl,imx28-mmc";

pinctrl-names = "default";

pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_cd_cfg &mmc0_sck_cfg>;

bus-width = <4>;

status = "okay";

};

usb0: usb@80080000 {

pinctrl-names = "default";

pinctrl-0 = <&usb0_otg_cfa10036>;

status = "okay";

};

Page 16: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, I2C magistrala

I2C magistrala sa Solomon SSD1306 displejem povezana na ploču

16

i2c0: i2c@80058000 {

pinctrl-names = "default";

pinctrl-0 = <&i2c0_pins_b>;

clock-frequency = <400000>;

status = "okay";

ssd1306: oled@3c {

compatible = "solomon,ssd1306fb-i2c";

pinctrl-names = "default";

pinctrl-0 = <&ssd1306_cfa10036>;

reg = <0x3c>;

reset-gpios = <&gpio270>;

solomon,height = <32>;

solomon,width = <128>;

solomon,page-offset = <0>;

};

};

Page 17: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036 stablo uređaja, Breakout Boards

CFA-10036 može biti uključen u druge ploče (Breakout Boards) i stablo uređaja mora ovo da opiše korišćenjem uključivanja datoteka, ne primer CFA-10057:

#include "imx28-cfa10036.dts"

Ovo dozvoljava slojevit opis stabla uređaja. Ovo može da se uradi i za ploče koje imaju mnogo zajedničkih odlika, kao RPi2B+ i RPi3B ili BCM2835-bazirane ploče.

17

Page 18: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Crystalfontz CFA-10036: kreiranje DTB-a

Da bi se osigurali da se DTB kreira za ovu ploču u izvornom kodu stabla uređaja, mora da se doda u arch/arm/boot/dts/Makefile:

18

dtb-$(CONFIG_ARCH_MXS) += imx28-cfa10036.dtb \

imx28-cfa10037.dtb \

imx28-cfa10049.dtb \

imx28-cfa10055.dtb \

imx28-cfa10056.dtb \

imx28-cfa10057.dtb \

imx28-cfa10058.dtb \

imx28-evk.dtb

Page 19: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Razumevanje SoC podrške

Primer na drugoj ARM platformi: Marvell Armada 370/XP.

Za ovu platformu, jezgro SoC podrške se nalazi u arch/arm/mach-mvebu

board-v7.c datoteka sadrži “entry point” SoC definicije, DT_MACHINE_START .. DT_MACHINE_END defnicija:

Definiše listu compatible stringova za platofrmu, u ovom slučaju marvell,armada-370-xp. Ovo dozvoljava kernelu da zna koju DT_MACHINE strukturu da koristi u zavisnosti od DTB-a koji se prosledi u vremenu pokretanja.

Diniše razne povratne pozive za inicijalizaciju platforme, gde je najvažniji .init_machine povratni poziv, koji poziva of_platform_populate(). Ova funkcija prolazi kroz stablo uređaja i instancira sve uređaje.

19

Page 20: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

arch/arm/mach-mvebu/board-v7.c

20

static void __init mvebu_dt_init(void)

{

if (of_machine_is_compatible("marvell,armadaxp"))

i2c_quirk();

of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);

}

static const char * const armada_370_xp_dt_compat[] __initconst = {

"marvell,armada-370-xp",

NULL,

};

DT_MACHINE_START(ARMADA_370_XP_DT, "Marvell Armada 370/XP (Device Tree)")

.l2c_aux_val = 0,

.l2c_aux_mask = ~0,

.smp = smp_ops(armada_xp_smp_ops),

.init_machine = mvebu_dt_init,

.init_irq = mvebu_init_irq,

.restart = mvebu_restart,

.reserve = mvebu_memblock_reserve,

.dt_compat = armada_370_xp_dt_compat,

MACHINE_END

Page 21: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Komponente minimalističke SoC podrške

Minimalistička SoC podrška se sastoji od

Ulazna SoC datoteka, arch/arm/mach-mvebu/board-v7.c

Bar jedan SoC .dtsi DT i jedan .dts DT za ploču u arch/arm/boot/dts

Rukovalac kontroler prekida, drivers/irqchip/irq-armada-370-xp.c

Rukovalac vremenskog kontrolera, drivers/clocksource/time-armada-370-xp.c

earlyprintk implementacija da se dobiju rane poruke iz konzole, arch/arm/Kconfig.debug i arch/arm/include/debug

Rukovalac serijskim prolazom u drivers/tty/serial. Za Armada 370/XP koristi se 8250 rukovalac drivers/tty/serial/8250

Ovo dozvoljava pokretanje minimalističkog sistema do korisničkog prostora korišćenjem korenskog sistema direktorijuma u initramfs-u 21

Page 22: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Proširivanje minimalističke SoC podrške

Kada je minimalistička podrška postavljena, sledeći elementi bi trebali biti dodati:

Podrška za radni takt, koja obično zahteva neke rukovaoce radnim taktom

Podrška za pinmuxing

Podrška za GPIO

Podrška za SMP kroz struct smp_operations

Za Armada 370/XP pogledati u:

drivers/clk/mvebu, drivers/pinctrl/mvebu, drivers/gpio/gpio-mvebu.c, arch/arm/mach-mvebu/platsmp.c

22

Page 23: Linuks u ugrađenim sistemima ploču - rt-rk.uns.ac.rs · static const char * const armada_370_xp_dt_compat[] __initconst = { "marvell,armada-370-xp", NULL, };

Dodavanje rukovalaca uređajem

Kada je sve prethodno navedeno dodato u SoC podršku, ostaju rukovaoci da se dodaju za različite blokove fizičke arhitekture. Rukovoci za:

Ethernet drivers/net/ethernet/marvell/mvneta.c

SATA drivers/ata/sata_mv.c

I2C drivers/i2c/busses/i2c-mv64xxx.c

SPI drivers/spi/spi-orion.c

PCIe drivers/pci/host/pci-mvebu.c

USB drivers/usb/host/ehci-orion.c

Itd.

23