2013-05-08 2 views
4

Quelqu'un peut-il me montrer un exemple sur la façon de lire les valeurs des registres Raspberry Pi? J'ai besoin de vérifier octet dans AUX_MU_LSR_REG (0x7E21 5054) mais je ne sais pas comment faire cela sans l'utilisation de bibliothèques supplémentaires. J'ai essayé de: (ici je modifier le poste oryginal)Raspberry PI, lecture brute d'une valeur de registre en C

** * ** * ** * ** * ** * ** * ** * **** * Début du code

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <unistd.h> 
#include <errno.h> 



#define BCM2708  0x20000000 
#define UART_BASE (BCM2708+0x215000) 
#define PAGE_SIZE (4*1024) 
#define BLOCK_SIZE (4*1024) 



int mem_fd;     
void *uart_map;     
volatile unsigned *uart;    




int main() 
{ 

printf("start\n"); 

if((mem_fd=open("/dev/mem",O_RDWR|O_SYNC))<0) 
{ 
printf("can't open /dev/mem \n"); 
exit(-1); 
} 
else printf("stream_file open OK \n"); 

if((uart_map=malloc(BLOCK_SIZE))==0) 
printf("malloc fail\n"); 
else printf("GPIO_mallocation OK %d \n", (int)uart_map); 


uart_map=mmap (NULL,   //any address in our space 
BLOCK_SIZE,   //map length 
PROT_READ|PROT_WRITE, //Enable reading and writing to maped memmory 
MAP_SHARED,  //Shares with other processes 
mem_fd,   //File to map 
UART_BASE  //Offset toUART peripheral 
); 

if(uart_map==MAP_FAILED) 
{ 
printf("mmap error %d", (int)uart_map); 
exit(-1); 
} 
else printf("GPIO mapping OK \n"); 
uart=(volatile unsigned*)uart_map; 
int i; 

for(i=0;i<32;i++) 
{ 
printf("adress:%x ",uart+i); 
printf("value:%x\n",*(uart+i)); 
} 





printf("stop\n"); 
return 0; 
} 

` * ** * ** * ** * ** * ** * ** * ** * * fin du code maintenant Je ne me souviens pas vraiment comment j'affiche le 0 mais dans le code ci-dessus je reçois un conflit de pointeur.

À quoi sert le point uart? En théorie, il devrait afficher les valeurs, mais après quelques semaines, je ne peux pas le faire fonctionner.

espère que vous pouvez me aider en quelque sorte

+0

La technique que vous utilisez est la bonne façon de procéder. Pouvez-vous poster un extrait de votre code? Ce serait plus facile à lire que ce que vous avez posté. –

Répondre

2

J'ai compilé avec succès l'exemple here et été capable de lire et écrire des valeurs numériques des broches GPIO avec une petite modification de ce code.

Vous vous dirigez essentiellement dans la bonne direction: mmap() une plage spécifiée dans la fiche technique pour votre GPIO, SPI ou n'importe quel registre dont vous avez besoin, puis lisez et écrivez à partir de cette adresse. C'est la base de toute la programmation GPIO sur le RPi.

Il y a quelques bitfields spéciales que vous devez prêter attention, mais comme je l'ai mentionné, ce sont tous dans les fiches techniques pour Pi à elinux.org

Note: à mmap() le système que vous devez enregistre être en cours d'exécution en tant que superutilisateur.

+0

Idrumm. J'ai dans mon code d'application qui accède au GPIO exactement comme vous le décrivez et cela fonctionne parfaitement. J'ai essayé d'utiliser le même code et seulement changé l'adresse de la zone de mémoire de la GPIO_Base à l'UART_Base. Le problème est qu'il semble ne pas retourner les valeurs réelles de la mémoire comme tout est 0. – Gregorek

+0

@Gregorek: Si vous postez votre code, je peux l'essayer sur mon PI, et voir si je peux faire quelque chose d'autre. Sans code cependant, je suis perplexe. – ldrumm

+0

Idrumm j'ai ajouté le code dans le post oryginall. Impossible de le faire fonctionner maintenant en raison de conflits de pointeurs. – Gregorek