Linux Embarqué
Jour 1
INTRODUCTION
Organisation du cours:
La matière sera évalué avec:
- Un présentation orale en anglais (2-3 points)
- Une interro: 50% Cours / 50% Autres (8-9 points)
- Des TPs (8-9 points)
Pas de stresse, c'est pas un cours universitaire. Plutôt une formation d'entreprise.
Dans l'idée on va bosser Linux !
Soyez cool et participez !
8h30, petit tour de table, présentation, etc.
Etape exploratoire Prérequis: toolchain(cross compil, binoutils, flasher) Conception (choix du bootloader, choix du noyau, config du bootloader, rootfs, busybox, bibiliotèques)
Jour 2
TP0: préparation
On commence par noter l'adresse physique du Pc qui servira aux manips pour l'identifier sur le réseau via le DHCP du prof.
Pour sécuriser la connexion SSH entre notre groupe et le serveur (ordi du prof) on créer une paire de clé rsa avec PuTTyGEN.
On lance Putty, dans connection/Data, mettre le nom du groupe dans Auto-login Puis dans ssh/Auth/"Private key file" et sélectionner la clé privé sauvegarder avant.
On configure le SSH:
Dans session: Host name : 192.168.1.10
, puis on save session :sshlinux et cliquer sur save.
On a utiliser Filezilla pour récupérer des documents sur le serveur via le protocole SFTP.
A présent on set-up la connexion série entre la box et le pc de manip.
La variable exécutée au démarrage est: bootcmd
Son équivalent pour un démarrage pour disque dur est: run boot_hda_hda
Sauvegarder les variables même après poweroff: saveenv
Modifier la variable de démarrage pour démarrer sur un disque dur: setenv bootcmd "run boot_hda_hda"
TP1: Hello World
On a créer un fichier .c faisant Hello World. via FileZilla on le transfert sur le serveur. Via gcc ça fonctionne Via sh4... ça marche pas mais c'est fait exprès
On voit grâce au readelf que le programme compiler pour l’ordinateur est en architecture 64bit contrairement a celui dédié a la box qui est en 32bit.
On essaye de monter la clé usb wtf
Pour monter la clé usb:
- mkdir montage
- mount /dev/sdb1 /wymedia/montage/
TADA
TP2: Gestion de ventilateur
Pour gérer la vitesse du ventilateur on a chercher le fichier dans lequel est stocker la valeur du pwm du moteur.
Ce fichier est: /sys/devices/platform/stm-pwm/pwm1
Pour pouvoir modifier la valeur il faut désactiver la gestion automatique du ventilateur en tapant: ngc -d wyclimd
TP3: Utilisation de Git
mkdir TP3
cp TP2 TP3
cd /TP3
git init
git add .
git commit -m Vitesse
git branch smooth
git checkout smooth
git commit -m Smooth
TP4: Script Bash
#!/bin/bash
if [ "$1" == "sh4" ] ; then
export PATH=$PATH:/opt/STM/STLinux-2.3/devkit/sh4/bin/sh4-linux-gcc
echo "édité"
elif [ "$1" == "x86" ] ; then
export PATH="Le PATH original"
echo "édité"
else
echo "Erreur, met le paramètre abruti"
fi
TP5: Compiler le Kernel
tar -xjf kernel-wyplay.tar.bz2
Dans le Makefile un commentaire indique que pour spécifier l'archtecture on peut le mettre en argument du make make ARCH=ia64
, ou en ajoutant un variable d'environnement correspondante
On modifie donc le script:
#!/bin/bash
if [ "$1" == "sh4" ] ; then
export ARCH=sh
export CROSS_COMPILE=sh4-linux-
export PATH=$PATH:/opt/STM/STLinux-2.3/devkit/sh4/bin/
echo "édité"
elif [ "$1" == "x86" ] ; then
export ARCH=
export CROSS_COMPILE=
export PATH= "Le PATH original"
echo "édité"
else
echo "Erreur, met le paramètre abruti"
fi
PARTIE 2
source script.sh sh4
cd Cours/soucres/TP05-kernel/kernel-wyplay
make help
make wymdbox01_defconfig
make uImage -j
Jour 3
TP6: Bootloader en NFS
cd Cours/soucres/TP05-kernel/kernel-wyplay/arch/sh/boot
cp uImage ~/boot/
NFS Appropriate NFS support is enabled.
SERIAL Serial support is enabled.
Recherches:
nfsaddrs=
[NFS] :Deprecated. Use ip= instead. See Documentation/filesystems/nfs/nfsroot.txt.
nfsroot=
[NFS] :nfs root filesystem for disk-less boxes.See Documentation/filesystems/nfs/nfsroot.txt.
nfs.enable_ino64=
[NFS] :enable 64-bit inode numbers. If zero, the NFS client will fake up a 32-bit inode number for the readdir() and stat() syscalls instead of returning the full 64-bit number. The default is to return 64-bit inode numbers.
acpi_no_auto_serialize
[HW,ACPI] :Disable auto-serialization of AML methods AML control methods that contain the opcodes to create named objects will be marked as "Serialized" by the auto-serialization feature. This feature is enabled by default. This option allows to turn off the feature.
Dans le boot loader on modifie certain paramètre comme suivant:
setenv bootcmd "run boot_nfs_nfs"
saveenv
TP7: Gestion des LEDS
On repère dans le schéma éléctrique que les led sont appeller:
PIO1_3/SC1CG_CLK/DSSMCD_CLK PIO1_4/NRSSA_CLKOUT/ASC1_CTS PIO1_5/NRSSA_DATAIN/ASC1_RTS
On a ajouter des lignes dans
/home/groupe5/Cours/TP05-kernel/kernel-wyplay/arch/sh/boards/st/wymdbox01/gpio.c
pio_ptr = stpio_request_set_pin(1, 3, "LED3", STPIO_OUT, 1);
pio_ptr = stpio_request_set_pin(1, 4, "LED2", STPIO_OUT, 1);
pio_ptr = stpio_request_set_pin(1, 5, "LED1", STPIO_OUT, 1);
Puis on a recompiler le kernel
cd TP/TP4/
source script.sh sh4
cd Cours/soucres/TP05-kernel/kernel-wyplay
make help
make wymdbox01_defconfig
make uImage -j
cp Cours/soucres/TP05-kernel/kernel-wyplay/arch/sh/boot/uImage ~/boot/
TADAM on a les leds qui brillent
TP8 : Compilation statique
TP9 : Création d'un rootfs
Pour la création de l'architecture
mkdir -p {boot,dev,etc,lib,usr,bin,sbin,usr/bin,proc,sys,var,root,home,mnt,opt,tmp,media}
On make les modules via:
cd TP/TP4/
source script.sh sh4
cd Cours/soucres/TP05-kernel/kernel-wyplay
make help
make modules
export INSTALL_MOD_PATH=~/rootfs/
make modules_install
TP10 : Création du initramfs
On le fait pas
TP11 : Compilation de busybox
cd ~/Cours/sources/TP11-busybox/busybox
tar -xjf busybox.tar.bz2
make menuconfig
Pour le cross-compile de busybox on fait make busybox
On positionne dans menuconfig: /home/groupeX/rootfs
make install
setenv stlinux /home/groupe5/rootfs/
setenv bootfile ../boot/uImage
Jour 4
TP12 : libc
On va dans ~/Cours/sources, on copie libc.tar.bz2 dans ~/rootfs
On décompresse via tar -xjf libc.tar.bz2
On lance le programme
TADAM ça marche !!
TP13 : L'Init
On créer un script qui monte ce qu'il faut correctement
Pour se faire on a d'abord modifier une variable systeme de uImage, il s'agit de la variable arg_kgdb, on y met dedans init=/sbin/script.sh
. Cette modification permet de lancer notre programme init.
#!/bin/bash
echo "Debut montage"
/bin/mount proc /proc/ -t proc
/bin/mount sys /sys/ -t sysfs
echo "Fin montage"
TP14 : Le Process d'Init
setenv arg_kgdb init=/sbin/init.sh
saveenv
On cherche le module a charger en RAM Il faut ensuite le charger
depmod -ae
modprobe stm-pwm
On modifie notre script init.sh:
#!/bin/bash
echo "Debut montage"
/bin/mount proc /proc/ -t proc
/bin/mount sys /sys/ -t sysfs
echo "Fin montage"
echo "On va bientot allumer le ventilo"
source /sbin/fan start
echo "Le ventilo doit tourner"
/bin/bash
Et on créer un script fan.sh qui permettra via un paramètre de lancer ou arreter le ventilateur:
#!/bin/bash
depmod -ae
modprobe stm-pwm
echo "Module chargé"
if [ "$1" == "start" ] ; then
echo "On allume le ventilateur"
echo 255 > /sys/devices/platform/stm-pwm/pwm1
echo "Ventilateur allumé"
elif [ "$1" == "stop" ] ; then
echo "On eteint le ventilateur"
echo 0 > /sys/devices/platform/stm-pwm/pwm1
echo "Ventilateur eteint"
else
echo "met le paramètre abruti"
fi