覆盆子PI,原始读取C中的寄存器值

时间:2013-05-08 15:55:17

标签: c raspberry-pi raspbian

有人可以告诉我一些关于如何从Raspberry Pi寄存器读取值的示例吗? 我需要检查AUX_MU_LSR_REG(0x7E21 5054)中的字节,但我不知道如何在不使用任何其他库的情况下执行此操作。 我试过了: (这里我修改了oryginal帖子)

** * ** * ** * 的** * ** * ** * ** * **** *开始代码

#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;
}

` 的 * ** * ** * ** * ** * ** * ** * ** * *代码结束 现在我真的不记得我是如何显示0但是在上面的代码中我得到指针冲突。

指向的是什么?理论上它应该显示值,但几个星期后我无法运行。

希望你能以某种方式帮助我

1 个答案:

答案 0 :(得分:2)

我已经成功编译了示例here,并且能够通过对该代码进行一些修改,从GPIO引脚读取和写入数字值。

您基本上朝着正确的方向前进:mmap()数据表中为您的特定GPIO,SPI或您需要的任何寄存器指定的范围,然后从该地址读取和写入。这是RPi上所有GPIO编程的基础。

您应该注意一些特殊的位域,但正如我所提到的,这些都在elinux.org的Pi数据表中

注意:要mmap()系统注册,您需要以超级用户身份运行。