Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel Linux GPIO数字是如何获得其值的?_Linux Kernel_Linux Device Driver_Gpio - Fatal编程技术网

Linux kernel Linux GPIO数字是如何获得其值的?

Linux kernel Linux GPIO数字是如何获得其值的?,linux-kernel,linux-device-driver,gpio,Linux Kernel,Linux Device Driver,Gpio,我试图理解Linux GPIO数字是如何得到它们的值的。 e、 g 我试着阅读关于Pinctrl子系统的linux文档,并查看了英特尔焦耳中使用的GPIO驱动程序代码: 然而,这种方式看起来非常平台特定。我正在寻找一些通用的行业标准。请帮助或指导我阅读一些好文章。首先,必须获得全局系统GPIO编号(GSGN)与特定GPIO控制器之间的差异。早些时候,在GPIO描述符出现之前,已经使用了GSGN。切换到描述符方案后,编号方案将从(半)静态GSGN变为动态GSGN,因此对用户来说毫无意义。相反,p

我试图理解Linux GPIO数字是如何得到它们的值的。 e、 g

我试着阅读关于Pinctrl子系统的linux文档,并查看了英特尔焦耳中使用的GPIO驱动程序代码:


然而,这种方式看起来非常平台特定。我正在寻找一些通用的行业标准。请帮助或指导我阅读一些好文章。

首先,必须获得全局系统GPIO编号(GSGN)与特定GPIO控制器之间的差异。早些时候,在GPIO描述符出现之前,已经使用了GSGN。切换到描述符方案后,编号方案将从(半)静态GSGN变为动态GSGN,因此对用户来说毫无意义。相反,pin的标签(如果有)或一对GPIO控制器手柄(其编号为相对)开始使用。这是由资源提供者(如ACPI和设备树)指定的。如果出于某种原因,用户希望获得控制器对和相对编号,则库和工具提供了实现这一点的可能性

因此,焦耳GPIO编号方案的链接非常脆弱,用户不应该知道GSGN。有几种方法可以获取运行系统上的控制器和相对编号。但通常它都与驱动程序和ACPI表相关,不需要任何用户参与

示例:

考虑pin
UART\u 1\u TXD
(由于某种原因,该文件中的名称错误,应为
LPSS\u UART1\u TXD
)。根据这一点,是带有ACPI HID INT34D1和UID 1的GPIO控制器上的引脚43

列出所有枚举的GPIO控制器(可选步骤):

#gpiodetect
gpiochip0[INT34D1:00](83行)
gpiochip1[INT34D1:01](72行)
gpiochip2[INT34D1:02](42行)
gpiochip3[INT34D1:03](31行)
gpiochip4[INT34D1:04](20行)
找到一个UID为1的:

#grep-w 1/sys/bus/acpi/devices/INT34D1 \:0*/uid
/sys/bus/acpi/devices/INT34D1:00/uid:1
#gpiodetect | grep-w INT34D1:00
gpiochip0[INT34D1:00](83行)
因此,有趣的一对是:
gpiochip043

在实际的资源提供者中,它将如下所示(取自项目):

。。。
*引脚名称引脚编号led
*   -----------------------------------------
*心跳为35次
*ISH_GPIO_1_LS 33 sd卡
*ISH_GPIO_2_LS 31无线网络
*ISH_GPIO_3_LS 29 led-3
...
GpioIo(
...
“\\\\ U SB.GPO2”,//GPIO控制器
0)//必须是0
{
22,//ISH\u GPIO\u 0\u LS
23,//ISH_GPIO_1_LS
24,//ISH_GPIO_2_LS
25//ISH_GPIO_3_LS
}
...
在这里,您可以通过完整路径看到对设备对象的引用,即\\u SB.GPO2

您可以在project中找到更多示例

如果用户真的想要一个无意义的数字,这是一种方式:

#mount-t debugfs none/sys/kernel/debug/
#cat/sys/kernel/debug/pinctrl/INT34D1 \:00/gpio范围
处理的GPIO范围:
0:INT34D1:00GPIOS[429-460]引脚[0-31]
32:INT34D1:00GPIOS[461-492]引脚[32-63]
64:INT34D1:00GPIOS[493-511]引脚[64-82]
#echo$((43-32+461))
472

有关GPIO库和子系统的更多详细信息,请参见。

没有行业标准,每个端口的设计者都可以为其目标SoC的GPIO做一些有意义的事情,这就是为什么您会看到不同的变化。我可以回答你们的问题,但今天不行,周末就到了。简言之,您根本不应该关心全球系统编号。只有GPIO控制器名称(无论在某个系统上是什么意思)和与之相关的PIN码才有意义。真棒:)我能够很好地将其联系起来。事实上,我在另一个x86平台上反复检查了这个概念,这一切都是有道理的。谢谢:)一个愚蠢的问题:pinctrl broxton驱动程序:定义了这么多GPIO引脚。然而,Joule的文档说,该板公开了15个GPIO(我假设它只讨论LS扩展头)。pinctrl broxton驱动程序中定义的所有管脚都是物理存在的吗?@Inasecoder,它们是物理存在的,但并非所有的管脚都连接到PCB。最后一个问题(这是这个问题的jist):429是如何成为INT34D1:00(
0:INT34D1:00 GPIOS[429-460]管脚[0-31]
)的基址的?在后台发生了什么计算?@Inasecoder,默认情况下(但不保证!)x86系统上的最大GSGN为511(范围0-511),分配从范围的末尾开始。