gga*_*ngg 6 mmap linux-device-driver gpio ioports raspberry-pi2
我最近正在浏览pi2的GPIO驱动程序,我发现用户空间pi2 GPIO lib(如python的RPi.GPIO 0.5.11)/dev/mem用于BCM2708(从0x20000000开始,GPIO从0x200000开始相对)来mmap用户空间内存区域为了处理GPIO.但是我drivers/gpio在linux中发现源码树是专门为处理而设计的/sys/class/gpio/*.我发现没有像I/O端口映射喜欢request_io_region和__io_remap.我的问题是BCM2708的GPIO如何映射到内存中?还有其他司机吗?我可以通过R&W来处理GPIO /sys/class/gpio/*吗?
我发现没有像if_io_region和__io_remap那样的I/O端口映射.
ARM没有I/O端口空间.所有外设寄存器都分配给存储空间中的地址.
BCM2708的GPIO如何映射到内存中?
GPIO通常作为控制寄存器的外设实现,RPi的BCM2835中的GPIO遵循这一惯例.这组控制寄存器可以有不同的名称; 例如,Atmel将这些寄存器称为并行I/O(PIO)外设.
每个GPIO(或更准确地说,每个引脚)将由每个控制寄存器功能中的一个或多个位表示.控制寄存器功能包括引脚分配(也称为多路复用),将输出设置为高电平,将输出设置为低电平,读取引脚电平以及电平和边沿检测控制.
IOW没有一个可以读写的位与GPIO相对应.对于GPIO,特定寄存器中会有一点用于获取输入电平.另一个寄存器中有一位用于将GPIO输出设置为高电平,而另一个寄存器中的位用于将GPIO输出设置为低电平.
还有其他司机吗?
是.pinctrl(引脚控制)驱动程序是比GPIO更低层(即更接近HW).它是pinctrl层,用于处理引脚多路复用(即引脚是用于外设功能还是用作GPIO).
SoC的pinctrl驱动程序(例如drivers/pinctrl/pinctrl-bcm2835.c)是您可以找到devm_ioremap_resources()(后者又调用devm_request_mem_region()和devm_ioremap())的GPIO寄存器块.
我可以通过R&W处理GPIO到/ sys/class/gpio/*吗?
是.所述的sysfs接口被提供用于访问没有被分配给外设的那些引脚.
增编
的sysfs的 GPIO接口有能力有限.
显然,有用户空间库可以访问通常位于pinctrl驱动程序域中的其他引脚属性(例如,启用上拉或下拉电阻).通常,这些库直接通过/ dev/mem伪造的文件访问PIO硬件寄存器.要知道这些技术不安全并且可能会干扰其他设备驱动程序.