• Aucun résultat trouvé

Syst`emes embarqu´es 5/7

N/A
N/A
Protected

Academic year: 2022

Partager "Syst`emes embarqu´es 5/7"

Copied!
20
0
0

Texte intégral

(1)

embarqu´es 5/7 J.-M Friedt

Syst` emes embarqu´ es 5/7

J.-M Friedt, G. Goavec-M´ erou FEMTO-ST/d´ epartement temps-fr´ equence

jmfriedt@femto-st.fr transparents ` a jmfriedt.free.fr

17 septembre 2017

1 / 20

(2)

embarqu´es 5/7

J.-M Friedt

Passage de param` etres du module

au driver

Dans la plateforme :

s t a t i c s t r u c t r e s o u r c e j m f r e s o u r c e s [ ] ={ {. s t a r t = 0 x378 ,

. end = 0 x379 ,

. f l a g s = IORESOURCE IO , // PAS IORESOURCE MEM . name =" io - m e m o r y 1 "

},

{. s t a r t = 0 x37a ,

. end = 0 x37b ,

. f l a g s = IORESOURCE IO , . name =" io - m e m o r y 2 "

}, };

s t a t i c s t r u c t p l a t f o r m d e v i c e ∗p d e v 1 ; s t a t i c i n t i n i t g p i o s i m p l e i n i t (v o i d)

{p d e v 1= p l a t f o r m d e v i c e r e g i s t e r s i m p l e (" jmf ", 0 , j m f r e s o u r c e s , ARRAY SIZE ( j m f r e s o u r c e s ) ) ; . . .

Noter les deux derniers arguments de

platform device register simple()

qui passent les ressources au driver.

2 / 20

(3)

embarqu´es 5/7

J.-M Friedt

Passage de param` etres du module

au driver

Dans le driver :

s t a t i c i n t g p i o s i m p l e p r o b e (s t r u c t p l a t f o r m d e v i c e ∗p d e v ) {s t r u c t r e s o u r c e∗r 1 ,∗r 2 ;

r 1= p l a t f o r m g e t r e s o u r c e ( pdev , IORESOURCE IO , 0 ) ; r 2= p l a t f o r m g e t r e s o u r c e ( pdev , IORESOURCE IO , 1 ) ;

p r i n t k ( KERN ALERT" jmf % d % x % x \ n ", pdev−>i d , (i n t) r 1−>s t a r t , (i n t) r 2−>s t a r t ) ; . . .

qui se traduit par (dmesg)

[ 331.353399] jmf 0 378 37a et

# cat /proc/ioports 0378-0379 : io-memory1 037a-037b : io-memory2

⇒ plusieurs configurations possibles pour un mˆ eme p´ eriph´ erique

3 / 20

(4)

embarqu´es 5/7

J.-M Friedt

Passage de param` etres du module

au driver

⇒ un mˆ eme driver re¸coit diverses configurations pour un mˆ eme p´ eriph´ erique plac´ e ` a diff´ erentes adresses :

Dans le module :

s t a t i c s t r u c t r e s o u r c e j m f r e s o u r c e s 1 [ ] ={

{. s t a r t =0x378 , . end=0x379 , . f l a g s =IORESOURCE IO , . name=" io - m e m o r y 1 "}, {. s t a r t =0x37a , . end=0x37b , . f l a g s =IORESOURCE IO , . name=" io - m e m o r y 2 "}, };

s t a t i c s t r u c t r e s o u r c e j m f r e s o u r c e s 2 [ ] ={

{. s t a r t =0x37c , . end=0x37d , . f l a g s =IORESOURCE IO , . name=" io - m e m o r y 3 "}, };

s t a t i c s t r u c t p l a t f o r m d e v i c e ∗pdev1 ,∗p d e v 2 ; s t a t i c i n t i n i t g p i o s i m p l e i n i t (v o i d)

{p d e v 1= p l a t f o r m d e v i c e r e g i s t e r s i m p l e (" jmf ", 0 , j m f r e s o u r c e s 1 , ARRAY SIZE ( j m f r e s o u r c e s 1 ) ) ; p d e v 2= p l a t f o r m d e v i c e r e g i s t e r s i m p l e (" jmf ", 1 , j m f r e s o u r c e s 2 , ARRAY SIZE ( j m f r e s o u r c e s 2 ) ) ; . . .

et dans le driver

s t a t i c i n t g p i o s i m p l e p r o b e (s t r u c t p l a t f o r m d e v i c e ∗p d e v ) {s t r u c t r e s o u r c e∗r 1 ,∗r 2 ;

p r i n t k (" r e s o u r c e s : % d ", pdev−>n u m r e s o u r c e s ) ; r 1= p l a t f o r m g e t r e s o u r c e ( pdev , IORESOURCE IO , 0 ) ; p r i n t k ( KERN ALERT" s t a r t 1 % d % x \ n ", pdev−>i d , (i n t) r 1−>s t a r t ) ; i f ( pdev−>n u m r e s o u r c e s>1)

{r 2= p l a t f o r m g e t r e s o u r c e ( pdev , IORESOURCE IO , 1 ) ; p r i n t k ( KERN ALERT" s t a r t 2 % d % x \ n ", pdev−>i d , (i n t) r 2−>s t a r t ) ; }// $LINUX/ D o c u m e n t a t i o n / d r i v e r−m o d e l / p l a t f o r m . t x t . . .

dmesg :

[ 187.705199] resources : 2 [ 187.705200] start1 0 378 [ 187.705653] start2 0 37a [ 187.706333] resources : 1 [ 187.706334] start1 1 37c

et on retrouve les entr´ ees dans /sys/bus/platform/devices/jmf*

4 / 20

(5)

embarqu´es 5/7

J.-M Friedt

Probl` eme de la description des

p´ eriph´ eriques

pour les bus ´ enum´ er´ es, un pilote est charg´ e lorsque le p´ eriph´ erique est d´ etect´ e (USB, PCI, firewire)

pour les autres bus (SPI, I

2

C, ISA/PC104), description du mat´ eriel

ins´ erer la description dans le code source du noyau ⇒ prolif´ eration des sources (un pilote par plateforme) et redondance

1

/* SPI */

static struct spi_board_info pcm037_spi_dev[] = { {

.modalias = "dac124s085", .max_speed_hz = 400000, .bus_num = 0,

.chip_select = 0, /* Index in pcm037_spi1_cs[] */

.mode = SPI_CPHA,

}, };

/* Platform Data for MXC CSPI */

static int pcm037_spi1_cs[] = {MXC_SPI_CS(1), IOMUX_TO_GPIO(MX31_PIN_KEY_COL7)};

static const struct spi_imx_master pcm037_spi1_pdata __initconst = { .chipselect = pcm037_spi1_cs,

.num_chipselect = ARRAY_SIZE(pcm037_spi1_cs), };

int __init pcm037_eet_init_devices(void) {[...]

/* SPI */

spi_register_board_info(pcm037_spi_dev, ARRAY_SIZE(pcm037_spi_dev));

imx31_add_spi_imx0(&pcm037_spi1_pdata);

1. linux-4.4.2/arch/arm/mach-imx/mach-pcm037 eet.c 5 / 20

(6)

embarqu´es 5/7

J.-M Friedt

Probl` eme de la description des

p´ eriph´ eriques

pour les bus ´ enum´ er´ es, un pilote est charg´ e lorsque le p´ eriph´ erique est d´ etect´ e (USB, PCI, firewire)

pour les autres bus (SPI, I

2

C, ISA/PC104), description du mat´ eriel

ins´ erer la description dans le code source du noyau ⇒ prolif´ eration des sources (un pilote par plateforme) et redondance

From Linus Torvalds <>

Date Thu, 17 Mar 2011 19:50:36 -0700

Subject Re: [GIT PULL] omap changes for v2.6.39 merge window

On Thu, Mar 17, 2011 at 11:30 AM, Tony Lindgren <tony@atomide.com> wrote:

> Please pull omap changes for this merge window from:

Gaah. Guys, this whole ARM thing is a f*cking pain in the ass.

You need to stop stepping on each others toes. There is no way that your changes to those crazy clock-data files should constantly result in those annoying conflicts, just because different people in

different ARM trees do some masturbatory renaming of some random device. Seriously.

[...] https://lkml.org/lkml/2011/3/17/492

6 / 20

(7)

embarqu´es 5/7

J.-M Friedt

Probl` eme de la description des

p´ eriph´ eriques

pour les bus ´ enum´ er´ es, un pilote est charg´ e lorsque le p´ eriph´ erique est d´ etect´ e (USB, PCI)

pour les autres bus (SPI, I

2

C), description du mat´ eriel

ins´ erer la description dans le code source du noyau ⇒ prolif´ eration des sources (un pilote par plateforme) et redondance

Solution issue de l’architecture PowerPC & SPARC port´ ee ` a ARM : le devicetree

2

pour d´ ecrire les p´ eriph´ eriques et leurs d´ ependances

⇒ un fichier ASCII d´ ecrivant les p´ eriph´ eriques et leurs d´ ependances, converti en fichier binaire pour exploitation par le noyau Linux lors de son d´ emarrage puis son ex´ ecution (overlay)

3 4

2. https://www.kernel.org/doc/Documentation/devicetree/usage-model.txt 3. T. Petazzoni,Introduction au “device tree” sur ARM, Opensilicium

Janvier-F´evrier-Mars 2016, pp. 46-59, `ajmfriedt.free.fr/devicetree_os19.pdf 4. T. Petazzoni,Device Tree for dummies, ELC 2014

https://events.linuxfoundation.org/sites/events/files/slides/

petazzoni-device-tree-dummies.pdf, conf´erence `a https://www.youtube.com/watch?v=uzBwHFjJ0vU

7 / 20

(8)

embarqu´es 5/7

J.-M Friedt

Architecture du devicetree

Hi´ erarchie de p´ eriph´ eriques : SoC=CPU+interfaces, sur une carte de d´ eveloppement

5

14 © 2014 Atmel Corporation Linux Device Tree Introduction 5/20/2014

Device Tree Implementation Layers

sama5d34ek.dtb sama5d3.dtsi

sama5d34ek.dts sama5d3x_cm.dtsi

sama5d3x_mb.dtsi

sama5d3x_dm.dtsi

Pas valable sur PC (architectures x86/amd64)

5. Atmel AN-8481,Linux Device Tree Introduction(2014),

http://atmel.force.com/support/servlet/fileField?id=0BEG0000000PDgm

8 / 20

(9)

embarqu´es 5/7

J.-M Friedt

Description du mat´ eriel

Exemple de

linux-4.4.2/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts

1. dans le devicetree :

#include "sun5i-a13.dtsi"

#include <dt-bindings/pinctrl/sun4i-a10.h>

[...]

&spi2 { // surchage la definition de SPI precedente pinctrl-0 = <&spi2_pins_a>, <&spi2_cs0_pins_a>;

status = "okay";

ad9834@0 {

compatible = "ad9834_2";

spi-max-frequency = <50000000>; // 5 MHz spi-cpol;

reg = <0>;

vcc-supply = <&reg_ad9834_vref>;

freq0 = <136727>;

};

};

reg_ad9834_vref: vref-reg@1 { compatible = "regulator-fixed";

regulator-max-microvolt = <3300000>;

[...]

} };

9 / 20

(10)

embarqu´es 5/7

J.-M Friedt

Lien avec le pilote

Exemple de

linux-4.4.2/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts

1. dans le devicetree :

#include "sun5i-a13.dtsi"

#include <dt-bindings/pinctrl/sun4i-a10.h>

[...]

&spi2 { // surchage la definition de SPI precedente pinctrl-0 = <&spi2_pins_a>, <&spi2_cs0_pins_a>;

status = "okay";

ad9834@0 {

compatible = "ad9834_2";

spi-max-frequency = <50000000>; // 5 MHz spi-cpol;

reg = <0>;

vcc-supply = <&reg_ad9834_vref>;

freq0 = <136727>;

};

};

2. et dans le pilote :

static const struct spi_device_id ad9834_id[] = { {"ad9834_2", ID_AD9834}, {}

};

MODULE_DEVICE_TABLE(spi, ad9834_id);

10 / 20

(11)

embarqu´es 5/7

J.-M Friedt

Compilation du devicetree

1

Le devicetree “d’origine” est dans

redpitaya/board/redpitaya/zynq-red_pitaya.dts

⇒ modifier ce fichier et compiler son noyau (n´ ecessite les droits d’´ ecriture sur le r´ epertoire buildroot)

2

binaire→ ASCII d’un devicetree existant

6

dtc -I dtb -O dts fichier.dtb

3

ou fdtdump zynq-red_pitaya.dtb

4

ASCII → binaire :

dtc -O dtb -o fichier.dtb fichier.dts

OF=OpenFirmware

7

6. scripthttps://git.kernel.org/cgit/utils/dtc/dtc.gitou

buildroot/output/host/usr/bin/dtc: penser `a prendre ledtcde buildroot et non celui de l’hˆote

7. https://www.openfirmware.info/Welcome_to_OpenBIOS

11 / 20

(12)

embarqu´es 5/7

J.-M Friedt

Ajouter une entr´ ee dans devicetree

# insmod composant.ko

ne fait rien tant qu’on n’a pas

# insmod dummy_platform.ko

qui ins` ere le composant dans la plateforme et fait appel au pilote

[ 838.108990] . Entering probe [ 838.111930] . Registering [ 838.114825] . Registered

⇒ ajout d’une entr´ ee pour faire appel ` a notre pilote depuis le devicetree

1

obtenir le devicetree courant dans la partition de boot

# mount /dev/mmcblk0p1 /mnt/

# ls /mnt/

... uImage zynq-red_pitaya.dtb

2

binaire → ASCII

3

ajouter un nœud faisant appel au pilote (compatible = description de la plateforme auparavant)

dummy_entry {compatible="composant1";};

4

ASCII → binaire

5

rebooter la Redpitaya pour tenir compte de la nouvelle configuration

12 / 20

(13)

embarqu´es 5/7

J.-M Friedt

Association pilote-devicetree

V´ erifier que le nouveau nœud est ins´ er´ e : arborescence du devicetree accessible dans /sys/firmware/devicetree/base :

⇒ pr´ esence de dummy entry

$ cat compatible composant1

dans le pilote, on ajoute les structures associant l’entr´ ee dans devicetree et l’identifiant

8

:

static const struct of_device_id composant_id_of[] = { // pour devicetree { .compatible="composant1",

.data=&composant_chip_info_tbl[ID_COMPOSANT12],},{} };

MODULE_DEVICE_TABLE(of, composant_id_of); // pour devicetree static struct platform_driver composant_driver = {

.driver = { .name = "composant", .owner = THIS_MODULE,

.of_match_table=of_match_ptr(composant_id_of), // pour devicetree },

.probe = composant_probe, .remove = composant_remove,

.id_table = composant_id, // pour platform };

module_platform_driver(composant_driver);

Cette fois, messages de probe() d` es le chargement du pilote

[ 5804.151642] . Entering probe [ 5804.154560] . Registering [ 5804.158091] . Registered

sans explicitement charger de plateforme.

8. http://events.linuxfoundation.org/sites/events/files/slides/dt_

internals_0.pdf

13 / 20

(14)

embarqu´es 5/7

J.-M Friedt

Passage de param` etres

Une fois le pilote charg´ e, passage de param` etres depuis le devicetree pour d´ ecrire la configuration du p´ eriph´ erique

dans le devicetree :

dummy_entry {compatible="composant1";toto32=<56>;};

dans le pilote :

static int composant_probe(struct platform_device *pdev) {u32 val32=42;u16 val16=42;

struct device_node *np = pdev->dev.of_node;

of_property_read_u32(np, "toto32", &val32);

of_property_read_u16(np, "toto16", &val16);

printk(KERN_ALERT ". Entering probe %u %u\n",val32,val16);

...

v´ erifier que la variable est prise en compte

/sys/firmware/devicetree/base/dummy_entry

# ls

compatible name toto32

# hexdump toto32 0000000 0000 3800 0000004

# insmod composant_comm.ko

[ 232.968359] . Entering probe 56 42

14 / 20

(15)

embarqu´es 5/7

J.-M Friedt

Overlay

Ajout dynamique d’entr´ ees dans le devicetree : les overlays

9 10

Pas encore support´ e dans le noyau linux officiel

Documentation dans

SRC_LINUX/Documentation/devicetree/overlay-notes.txt

Utile lors de l’ajout dynamique de p´ eriph´ eriques : IP FPGA et ressources associ´ ees d´ ecrites dans le devicetree

11

⇒ utile sur architectures combinant CPU + FPGA (Armadeus Systems, Xilinx Zynq, Intel/Altera SoC

9. M. Fischer,FPGA Manager & devicetree overlays, FOSDEM 2016, https://archive.fosdem.org/2016/schedule/event/fpga_devicetree/

10. P. Antoniou,Transactional Device Tree & Overlays – Making Reconfigurable Hardware Work, ELC 2015http://events.linuxfoundation.org/sites/events/

files/slides/dynamic-dt-elce14.pdfet conf´erence https://www.youtube.com/watch?v=3Ag7ZBC_Nts

11. https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/

tree/Documentation/devicetree/bindings/fpga/fpga-region.txt?id=refs/

tags/next-20161207

15 / 20

(16)

embarqu´es 5/7

J.-M Friedt

Overlay

L’ajout d’un overlay (fragments) dans le devicetree d´ eclenche la m´ ethode probe du module correspondant.

/dts-v1/;

/plugin/;

/ { compatible = "xlnx,zynq-7000";

fragment@0

{target-path = "/";

__overlay__

{ #address-cells = <1>;

#size-cells = <1>;

pilote_drv {compatible = "pilote_ctl";};

};

};

};

qui se compile par

BUILDROOT/output/host/usr/bin/dtc -@ -I dts -o pl_ovl.dtbo pl_ovl.dts

o` u “@” indique qu’on compile un overlay Pour ajouter l’overlay

mkdir /sys/kernel/config/device-tree/overlays/pilote

cat pl_ovl.dtbo > /sys/kernel/config/device-tree/overlays/pilote/dtbo cd /sys/firmware/devicetree/base/pilote_drv/

cat compatible

> pilote_ctl

16 / 20

(17)

embarqu´es 5/7

J.-M Friedt

Overlay

Le driver compatible avec cet overlay l’indique par

s t a t i c c o n s t s t r u c t o f d e v i c e i d c o m p o s a n t i d o f [ ] ={// p o u r d e v i c e t r e e {. c o m p a t i b l e=" p i l o t e _ c t l ", },

{}

};

MODULE DEVICE TABLE ( o f , c o m p o s a n t i d o f ) ; // p o u r d e v i c e t r e e s t a t i c s t r u c t p l a t f o r m d r i v e r p i l o t e d r i v e r ={

. d r i v e r ={. name =" p i l o t e _ d e _ j m f ", . o w n e r = THIS MODULE , . o f m a t c h t a b l e=o f m a t c h p t r ( c o m p o s a n t i d o f ) , },

. p r o b e = g p i o s i m p l e p r o b e , . r e m o v e= g p i o s i m p l e r e m o v e , };

m o d u l e p l a t f o r m d r i v e r ( p i l o t e d r i v e r ) ;

// f a b r i q u e l e i n i t ( ) e t e x i t ( ) a v e c p l a t f o r m r e g i s t e r e t p l a t f o r m u n r e g i s t e r s t a t i c i n t g p i o s i m p l e r e m o v e (s t r u c t p l a t f o r m d e v i c e∗p d e v )

{p r i n t k (" d r i v e r Au r e v o i r \ n ") ;r e t u r n 0;}

s t a t i c i n t g p i o s i m p l e p r o b e (s t r u c t p l a t f o r m d e v i c e ∗p d e v ) {p r i n t k (" d r i v e r B o n j o u r \ n ") ;r e t u r n 0;}

⇒ charger ce driver appelle imm´ ediatement la m´ ethode probe, sans avoir

`

a charger explicitement une plateforme (le devicetree s’en est charg´ e) Pour retirer l’overlay

rmdir /sys/kernel/config/device-tree/overlays/pilote/

17 / 20

(18)

embarqu´es 5/7

J.-M Friedt

Linux et les bitstreams FPGA

fpga manager (Linux) fournit une interface unifi´ ee pour les SoC

Vivado (Xilinx) fournit un bitstream en .bit. ` a convertir en .bin par le SDK Xilinx :

$VIVADO_SDK/bin/bootgen -image fichier_bif.bif -arch zynq \ -process_bitstream bin~

avec le fichier de configuration .bif :

all: {nom_bitstream.bit}

→ fichier .bit.bin

le fichier bit.bin est copi´ e dans /lib/firmware de la redpitaya.

pour transf´ erer le bitstream dans le FPGA

echo "nom_bitstream.bit.bin" > /sys/class/fpga_manager/fpga0/firmware

18 / 20

(19)

embarqu´es 5/7

J.-M Friedt

Overlay associ´ e ` a un bitstream

par overlay : description coh´ erente du bitstream, du driver et des ressources

/dts-v1/;

/plugin/;

/ { compatible = "xlnx,zynq-7000";

fragment@0 {

target = <&fpga_full>;

#address-cells = <1>;

#size-cells = <1>;

__overlay__ {

#address-cells = <1>;

#size-cells = <1>;

firmware-name = "top_redpitaya_axi_gpio_ctl.bin";

gpio1: gpio@43C00000 { compatible = "gpio_ctl";

reg = <0x43C00000 0x0001f>;

gpio-controller;

#gpio-cells = <1>;

ngpio= <8>;

};

};

};

};

19 / 20

(20)

embarqu´es 5/7

J.-M Friedt

Conclusion et mise en pratique

Exercice : modifier le devicetree et un pilote afin de charger automatiquement le pilote ` a l’insertion du module associ´ e Fonctions li´ ees au devicetree d´ eclar´ ees dans

#include <linux/of.h>

#include <linux/of_device.h>

Compatibilit´ e platform device + devicetree

12

static int composant_probe(struct platform_device *pdev) {struct composant_state *st;

if (pdev->dev.of_node)

st->chip_info=of_match_device(composant_id_of,&pdev->dev)->data; // dt else

st->chip_info = // plateforme

&composant_chip_info_tbl[platform_get_device_id(pdev)->driver_data];

Adapter le pilote d´ ebloquant read sur un timer pour recevoir la p´ eriode depuis une entr´ ee dans le devicetree.

Consulter LINUX/Documentation/devicetree

12. http://lxr.free-electrons.com/source/drivers/iio/adc/at91_adc.c l.1142 :static int at91 adc probe(struct platform device *pdev)

20 / 20

Références

Documents relatifs

timers : expiration d’un timer ou un tick (p ´eriode) d’horloge syst `eme autres p ´eriph ´eriques : touche clavier, clic souris, paquet ethernet,.. Exceptions et Interruptions

– Il ne peut y avoir plus d’un processus dans sa section critique en mˆeme temps – Un processus en dehors de sa section critique ne peut bloquer un autre

Adresse de p´eriph´erique.- Comme pour le microprocesseur, la partie essentielle d’un contrˆ oleur de p´eriph´erique est un circuit int´egr´e, que l’on peut consid´erer comme

• Alternative au temps r´ eel : le mat´ eriel reconfigurable se charge des op´ erations rapides et d´ echarge le processeur de tˆ aches imm´ ediates (UART, FIFO, ADC du coldfire

• Partant de l’exemple de module avec timer en /dev, impl´ ementer une m´ ethode read qui se d´ ebloque ` a intervalles de temps r´ eguliers (utiliser un mutex). • Proposer

• depuis le CPU (Linux) : pilote noyau pour communiquer avec les p´ eriph´ eriques. • description de la configuration mat´ erielle par le m´ ecanisme des devicetree consult´ e par

Notion de syst` eme embarqu´ e Architecture des processeurs Mat´ eriel v.s logiciel Rappels de C Les microcontrˆ oleurs 8 bits G´ en´ eralit´ es sur les syst` emes num´ eriques

L’approche consistant ` a modifier le pointeur vers la fonction impl´ ementant un appel syst` eme est tellement ´ evidente que les d´ eveloppeurs du noyau Linux essaient de brider