作者:Terry Ni,AMD工程师;来源:AMD开发者社区
通常在设计中,用户常常会使用GPIO来完成一些外设的控制,或者用来作为一些调试端口或者调试信号。那么,在Kernel中简单快速使用这些GPIO就会大大加快我们的开发周期。
对于不通的器件,我们先要明确的就是其MIO和EMIO的数量。例如:ZynqMP器件有一个GPIO控制器,有78个MIO以及96 个EMIO。Versal器件有两个GPIO控制器,一个是PMC GPIO,有52个MIO和64个EMIO;另一个是LPD GPIO,有26个MIO和32个EMIO。
了解清楚了MIO以及EMIO数量之后,我们就可以在kernel中对GPIO进行操作了。
在ZynqMP器件上,我们需要先找到哪个GPIO节点对应GPIO控制器。你可以通过查看其标签的方式将其找到,如下图所示。
从上图中我们可以发现,对应GPIO控制器的节点是gpiochip334,也就是说从334这个编号开始之后的174(78+96)个IO对应的就是GPIO上所有的MIO和EMIO通道了。
那么接下来,就可以根据你具体要控制的MIO或者EMIO来创建GPIO节点。例如你需要控制EMIO对应的bit2通道。你可以通过如下方法计算得到其对应的GPIO编号。
334+78+2=414
计算出编号之后,通过如下命令方式创建出控制节点。
成功执行之后,就会在系统中创建出gpio414这个控制节点,接下来你需要指定其输入输出方向。
最后,你就可以控制其高低电平了。
对于Versal器件来说,使用方法基本相同,先是需要找到pmc gpio和versal gpio(lpd gpio)对应的节点。
然后基于找到的节点,计算出你需要控制的GPIO节点编号,例如pmc mio的bit16通道,计算得到其对应的GPIO编号。
338+16=354
接着,通过如下命令方式创建出控制节点。
然后指定gpio354这个节点的输入输出方向。
最后,控制其电平值。
通过以上的方法,你可以方便的在你的设计中利用GPIO的特性,快速实现或者验证设计中的一些功能,加快整个开发过程。