# IOC T1
https://hackmd.io/@Bles0CG0Rb-J4DaLgnwAEA/BJdKaG9qp
## Auteurs
- LYAUTEY Wilfrid 21310245
- COEFFIC-QABALI Riwan 21309062
## Réponses
- Connexion ssh a la rasberi pi
```sh
# carte 24, donc 62200 + 24
ssh -p 62224 pi@peri
```
Pour ne pas avoir a noter le mot de passe a chaque fois, on utilise `key-gen` pour generer clé privé / public, puis on ajoute la clé public sur le raspberry.
- Envoie de fichiers
```sh
scp -P 62224 test pi@peri:lyautey_qabali
```
- Pourquoi passer par la redirection des ports ?
- On ne peut pas se connecter directement aux IPs des raspberry car il faut passer par le routeur peri. On se connecte a peri en specifiant le port pour lui préciser l'emplacement de la raspberry, il fait ensuite la redirection port -> IP.
- source : https://fr.wikipedia.org/wiki/Redirection_de_port
- Fichiers dans un répertoire propre ?
- Pour éviter de surcharger la racine de la rasbery, on définit un dossier pour notre groupe, car on est pas les seuls a l'utiliser.
- Makefile
- `-static` est utilisé pour indiquer au compilateur que les biblioteques dynamiques doivent etre jointe a l'executable, et donc ne peuvent pas etre chargé dynamiquement lors du chargement du programme.
- Les règles par défauts de make s'occupe de compiler le fichier `helloworld.c`
```makefile
CC=bcm2708hardfp-gcc
CARD=24
NAME=lyautey_qabali
CFLAGS=-W -Wall -Wextra -Wfatal-errors -O2 -static
APP=helloworld
all: $(APP)
scp -P 622$(CARD) $^ pi@peri:$(NAME)
clean:
rm $(APP)
```
## VIM
```
H J K L pour se déplacer
U pour revenir en arrière
I pour insert/écrire
```
## Controle de GPIO
- Potentiel danger quand on se trompe de broche pour la config GPIO
- Certains GPIO nécessitent des conditions spécifiques, et donc si ils sont mal configurés, on risque des courts-circuits
- A quoi correspond `BCM2835_GPIO_BASE`
- Addresse mémoire physique raspberry linux -> addresse mémoire bus pour la config des GPIO
- Que représente `struct gpio_s`
- On utilise une structure C pour plus facilement acceder au differents données pour configurer GPIO. On map ensuite directement la config en mémoire dans la structure avec `gpio_mmap`
- Que contient `reg` dans `gpio_fsel`
- Dans `gpio_fsel`, on divise le pin par 10 pour récupérer le registre a modifier. C'est parce qu'il y a 3 bits de config par pin, et donc 10 pins dans un registre.
- Pourquoi écrire 2 addresses différentes dans `gpio_write`
- Eviter la copie (lire et réécrire la totalité du mot) : deux adresses pour la même case mémoire. Dans le mot destination, il y a uniquement ce bit qui va changer.
- Flags de `open`
- `O_SYNC` pour synchroniser et que ca s'ecrivent direct apres une modif
- `O_RDWR` pour lecture / ecriture
- Arguments de `mmap`
```c
mmap_result = mmap (
NULL // addresse virtuel, on laisse le kernel decider
, RPI_BLOCK_SIZE // taille de la mémoire voulu
, PROT_READ | PROT_WRITE // lecture / ecriture
, MAP_SHARED // mise a jour des données visible des autres processus
, mmap_fd // /dev/mem, correspond a la mémoire physique, a lancer en root
, BCM2835_GPIO_BASE // addresse physique que l'on veut mapper);
```
Source : https://man7.org/linux/man-pages/man2/mmap.2.html
- Que fait `delay`
- Fait dormir le processus pendant un temps en millisec
- Pourquoi utiliser `sudo`
- Pour avoir acces a `/dev/mem`
## Utilisation de pthread pour faire clignoter plusieurs led
```c
void* led1(void* ptr) {
int period = (int)(ptr) / 2;
...
}
void* led2(void* ptr) {
int period = (int)(ptr) / 2;
...
}
void main(..) {
phtread_t tled1;
phtread_t tled2;
pthread_create(&tled1, NULL, led1, (void*)period);
delay(period / 4);
pthread_create(&tled2, NULL, led2, (void*)period);
pthread_join(tled2, NULL);
pthread_join(tled1, NULL);
}
```
On a du modifier le Makefile et donc maintenant`LDFLAGS=-static -pthread`