Rapport Fox g20
Rapport Fox g20
Rapport Fox g20
Rapport du TravauxPratiques
- TP -
Informatique Embarqué
Réalisé par :
Abdessamad bendaoud
Ayoub Fillali
Mohammed Azzimani
Encadré par :
Login : root
Password : netusg20
- On utilise la commande suivante pour afficher l’état de eth0 :
$ ifconfig ou $ifconfig eth0
- Pour allouer notre propre adresse IP s’il n’affiche pas un adresse nous
exécutons la commande linux suivante :
$ ifconfig eth0 192.168.x.xxx ( ex: 192.168.2.102 ).
Le rôle de la pile :
Si on tape la commande précédente sur une carte qui ne contient pas une
pile, on aura la date de
réalisation du kernel sur lequel elle fonctionne et même si on modifie la
date et l’heure, une fois que
la carte est redémarré elle ne va pas conserver la nouvelle date et la
commande ($date) va toujours
afficher la date de réalisation du kernel.
La solution c’est d’utiliser la plie qui a pour rôle d’alimenté la carte avec
une très faible tension pour
que le compteur de la date et l’heure ne s’arrête jamais même si la carte
est éteinte.
- Modification du date et heure :
Pour modifier la date et l’heure il suffit d’ajouter l’option –S à la
commande ($date) puis la date
qu’on veut saisir :
Exemple :
La carte FOX G20 contient 28 ports GPIO est chaque port est caractériser par :
- Le connecteur (J6 ou J7)
- La broche (la position sur la carte)
- Le pin ID
- Le nom de la ligne (exemple PA6)
Le systèmes d’exploitation Linuxe traite ces ports GPIO comme des fichiers chaque port a
deux fichier
principales qui sont la valeur (value) et la direction (Direction) ces deux fichiers se trouvent
dans un
répertoire qui porte le nom du pin utilisé.
-Direction : c’est un fichier qui contient soit la chaine de caractère out si le pin est une sortie
soit IN
s’il s’agit d’une entrée.
-Value : ce fichier contient soit la valeur 1 ou 0 .la valeur 1 pour un état haut du pin et la
valeur 0
pour l’état bas.
Avant de trouver ces fichiers il faut tout d’abord activer (exporter) le pin avec la commande
:
(écrire ’’IN’’ dans le fichier direction pour que la ligne sera considérer
comme une entrée)
(afficher la valeur du switch : 1 si le switch est dans l’état haut, 0 si le
switch est dans l’état bas)
# cat /sys/class/gpio/pioA11/value
While ($i eq 0)
(boucle infinie pour rester toujours dans le programme)
Do
Echo 1 >/sys/class/gpio/pioA22/value
(allumer la LED)
Sleep(1)
While ($i eq 0)
Do
A=$(< /sys/class/gpio/pioA11/value)
(boucle infinie pour rester toujours dans le
If [A eq 1]; then
programme)
Echo 1 >/sys/class/gpio/pioA22/value
Elif [A eq 0]; then
Echo 0 >/sys/class/gpio/pioA22/value
(allumer la LED)
(Etteindre la LED)
Programmation en C:
Driver utilisé :
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <time.h>
#define LOW 0
#define HIGH 1
#define IN 1
#define OUT 0
struct S_GPIO_LINE {
char id_line[5];
int id_pin;
int direction;
int value;
};
typedef struct S_GPIO_LINE S_GPIO_LINE;
/* ************ */
/* LOAD_GPIO_LINE */
/* Initialisation of a GPIO line */
/* ************ */
int load_gpio_line(S_GPIO_LINE *ps_line )
{
FILE *p_gpio_line;
return 0;
}
/* ************** */
/* SET_GPIO_DIRECTION */
/* Sets the direction (IN/OUT) of a GPIO line */
/* ************** */
int set_gpio_direction(S_GPIO_LINE *ps_line, int i_direction)
{
int fd;//file
char path[35];//chemin
snprintf(path,35, "/sys/class/gpio/pio%s/direction",ps_line->id_line);
printf("path:%s\n",path);
fd = open(path, O_WRONLY);
if (-1 == fd) {
fprintf(stderr, "Failed to open gpio direction for writing!\n");
exit(1);
}
if( i_direction ) {
if (-1 == write(fd, "in", 36)) {
fprintf(stderr, "Failed to set direction!\n");
exit(1);
}
}
else {
if (-1 == write(fd, "out", 36)) {
fprintf(stderr, "Failed to set direction!\n");
exit(1);
}
}
return 0;
}
/* *********** */
/* SET_GPIO_LINE */
/* Sets the value of a GPIO line */
/* *********** */
if( 1 ) {
sprintf(gpio_value, "/sys/class/gpio/pio%s/value",ps_line->id_line);
/* Setting value */
if ((p_gpio_value = fopen(gpio_value, "w")) == NULL)
{
printf("Cannot open value file.\n");
exit(1);
}
rewind(p_gpio_value);
sprintf(c_value, "%d", value);
ps_line->value = value;
fwrite(&c_value, sizeof(char), 1, p_gpio_value);
fclose(p_gpio_value);
}
else{
printf("Wrong access.\n");
exit(1);
}
return 0;
}
/* ************** */
/* GET_GPIO_LINE */
/* Gets value of a GPIO line */
/* ************** */
int get_gpio_line(S_GPIO_LINE *ps_line)
{
FILE *p_gpio_value;
char gpio_value[35];
int value = 0;
if( 1 )
{
sprintf(gpio_value, "/sys/class/gpio/pio%s/value", ps_line>id_line);
printf("*");
/* Getting value */
if ((p_gpio_value = fopen(gpio_value, "r")) == NULL)
{
printf("Cannot open value file.\n");
exit(1);
}
fclose(p_gpio_value);
}
else
{
printf("Wrong access.\n");
exit(1);
}
return value;
}
//compteur /décompteur commandé
void main(){
Int i,C[10][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1}
,{1,0,0,0},{1,0,0,1}};
S_GPIO_LINE S[4],E;
S[0].id_pin=50;
sprintf(S[0].id_line,"B18");
S[1].id_pin=51;
sprintf(S[1].id_line,"B19");
S[2].id_pin=50;
sprintf(S[2].id_line,"B16");
S[3].id_pin=50;
sprintf(S[3].id_line,"B17");
for(i=0;i<4;i++){
load_gpio_line(&S[i]);
set_gpio_direction(&S[i],0);
}
E.id_pin=11;
sprintf(E.id_line,"A11");
load_gpio_line(&E);
set_gpio_direction(&E,1);
while(1){
for(i=0;i<10;i=i){
set_gpio_line(&S[3],C[i][0]); // S : 0 1 2 3
set_gpio_line(&S[2],C[i][1]);
set_gpio_line(&S[1],C[i][2]);
set_gpio_line(&S[0],C[i][3]);
sleep(1);
if(get_gpio_line(&E)==0) i++; else { i--;if(i<0) i=9; }
}
}}
//shin 1 voie
void main(){
int i;
S_GPIO_LINE S[8],E;
S[0].id_pin=50;
sprintf(S[0].id_line,"B18");
S[1].id_pin=51;
sprintf(S[1].id_line,"B19");
S[2].id_pin=48;
sprintf(S[2].id_line,"B16");
S[3].id_pin=49;
sprintf(S[3].id_line,"B17");
S[4].id_pin=34;
sprintf(S[4].id_line,"B2");
S[5].id_pin=35;
sprintf(S[5].id_line,"B3");
S[6].id_pin=32;
sprintf(S[6].id_line,"B0");
S[7].id_pin=33;
sprintf(S[7].id_line,"B1");
for(i=0;i<8;i++){
load_gpio_line(&S[i]);
set_gpio_direction(&S[i],0);
}
E.id_pin=11;
sprintf(E.id_line,"A11");
load_gpio_line(&E);
set_gpio_direction(&E,1);
while(1){
for(i=0;i<8;i++){
set_gpio_line(&S[i],1); // S : 0 1 2 3 4 5 6 7
sleep(1);
set_gpio_line(&S[i],0);
}
}
}}
//shin 2 voie
void main(){
int i;
S_GPIO_LINE S[8],E;
S[0].id_pin=50;
sprintf(S[0].id_line,"B18");
S[1].id_pin=51;
sprintf(S[1].id_line,"B19");
S[2].id_pin=48;
sprintf(S[2].id_line,"B16");
S[3].id_pin=49;
sprintf(S[3].id_line,"B17");
S[4].id_pin=34;
sprintf(S[4].id_line,"B2");
S[5].id_pin=35;
sprintf(S[5].id_line,"B3");
S[6].id_pin=32;
sprintf(S[6].id_line,"B0");
S[7].id_pin=33;
sprintf(S[7].id_line,"B1");
for(i=0;i<8;i++){
load_gpio_line(&S[i]);
set_gpio_direction(&S[i],0);
}
E.id_pin=11;
sprintf(E.id_line,"A11");
load_gpio_line(&E);
set_gpio_direction(&E,1);
while(1){
for(i=0;i<8;i=i){
set_gpio_line(&S[i],1); // S : 0 1 2 3 4 5 6 7
sleep(1);
set_gpio_line(&S[i],0);
if(get_gpio_line(&E)==0) i++; else { i--;if(i<0) i=8; }
}
}}
//Allumer une LED
// (declaration d’une structure LED)
int main() { S_GPIO_LINE LED;
LED.id_pin=11; //(on utilise la ligne 11 , A11)
sprintf(LED.id_line, "A11");
load_gpio_line(&LED); //( Activation de la ligne)
//(declaration comme sortie)
set_gpio_direction(&LED, OUT); // (boucle infinie
pour ne pas sortir du programme )
while(1)
{
set_gpio_line(&LED, 1); //(Allumer)
sleep(1);
set_gpio_line(&LED, 0);
//( Etteindre)
sleep(1);
}
return 0;
}
//LED contrôlé par un switch
int main() {
//configuration de LED
S_GPIO_LINE LED;
LED.id_pin=11;
sprintf(LED.id_line, "A11"); //(LED est configuré sur la ligne A11)
load_gpio_line(&LED);
set_gpio_direction(&LED, 0);
//configuration PIN Switch
S_GPIO_LINE switx;
switx.id_pin=22;
sprintf(switx.id_line, "A22");
load_gpio_line(&switx); //(Switch est configuré sur la ligne A22)
set_gpio_direction(&switx, 1);
while(1){
if(get_gpio_line(&switx)==1) //( si le Switch est dans l’état haut alors
allumer la LED)
set_gpio_line(&LED, 1);
else;
set_gpio_line(&LED, 0);} //(sinon étteindre )
return 0;
}
Après la réalisation des programmes il faut les
exécuter dans la carte ceci par les étapes suivantes :