覆盆子pi中GPIO的内存映射区域

时间:2016-03-29 04:32:01

标签: linux-kernel arm raspberry-pi linux-device-driver embedded-linux

我真的很难理解数据表部分[BCM2835-ARM-Peripherals.pdf],其中涉及以下内容:

Q1:每个gpio有40个寄存器[参考:表6-1 GPIO寄存器分配]所有gpios都可以使用SET / CLEAR / GPFSEL [0-5]等,但GPIO的用途是什么功能选择寄存器,有10个FSEL(0-9)寄存器[参见:表6-2 - GPIO备用功能选择寄存器0]。

Q2:如何通过内存映射区域到达给定的GPIO? ,就像下面这样 情况#1:具有备用功能5的GPIO4作为输入: as(4< 10)它将使用“0x7E200000”和FSEL4寄存器[参见:表6-2 - GPIO备用功能选择寄存器0]具有000和010 = GPIO引脚9采用备用功能5。

情况#2:GPIO27具有备用功能3作为输出: as(27 <30)它将使用“0x7E20000C”和FSEL3寄存器[参见:表6-2 - GPIO备用功能选择寄存器0]具有001和111 = GPIO引脚9采用备用功能5.

请告诉我我的理解是否正确?

问题3:下表的目的是什么

表6-3 - GPIO备用功能选择寄存器1 表6-4 - GPIO备用功能选择寄存器2 表6-5 - GPIO备用功能选择寄存器3 表6-6 - GPIO备用功能选择寄存器4 表6-7 - GPIO备用功能选择寄存器5

BR, &安培; Sanumala

1 个答案:

答案 0 :(得分:1)

http://elinux.org/RPi_GPIO_Code_Samples

//
// Set up a memory regions to access GPIO
//

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

   /* mmap GPIO */
   gpio_map = mmap(
      NULL,             //Any adddress in our space will do
      BLOCK_SIZE,       //Map length
      PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
      MAP_SHARED,       //Shared with other processes
      mem_fd,           //File to map
      GPIO_BASE         //Offset to GPIO peripheral
   );

   close(mem_fd); //No need to keep mem_fd open after mmap

   if (gpio_map == MAP_FAILED) {
      printf("mmap error %d\n", (int)gpio_map);//errno also set!
      exit(-1);
   }

   // Always use volatile pointer!
   gpio = (volatile unsigned *)gpio_map;


} // setup_io