本文基于 RockPI 4A 单板 Linux 4.4 内核介绍 RK3399 Linux GPIO 功能。
GPIO(General Purpose Input/Output Port) :通用输入输出端口。
除作为一般的输入/输出功能外,还可以配置为中断和模拟 PWM、I2C 等接口功能。
RK3399 GPIO 属性如下:
1、一共有5组 GPIO(GPIO0~4) ,每组 GPIO 为一个 Bank ,共32个引脚。每个 Bank 包括4个 Group (GPIOA(0~7) ~ D(0~7)) 。不是所有 Bank 都有 GPIOA~D 的编号, RK3399 共122个 GPIO 引脚。
2、所有 GPIO 都可被配置为 CA55或CA53 的中断功能,且 GPIO0 和 GPIO1 可用于系统低功耗唤醒模式。
3、在上电复位后,所有 GPIO 默认输入状态。
4、软件可配置 GPIO 驱动强度。
RK3399 引脚在系统中显示如下:
RK3399 GPIO 引脚号计算方式:
例:
以 ROCKPI 4A 单板 WIFI 模块电源( GPIO0_B2 )为例,介绍 DTS 中 GPIO 配置。
在系统启动后,可以查看 GPIO ,命令如下:
注:
如果debugfs没有挂载,使用下面命令挂载
Linux 内核 GPIO 主要实现文件:
GPIO 子系统有两套 API :
1、基于描述符(descriptor-based)
前缀为: gpiod_ 。
参考: Documentation/gpio/consumer.txt
2、老版本接口(legacy)
前缀为: gpio_ 。
参考: Documentation/gpio/gpio-legacy.txt
3、常用API
GPIO 还有很多接口,就不一一列举了。
RK3399 GPIO 控制器驱动实现文件: drivers/pinctrl/pinctrl-rockchip.c ,涉及主要函数:
所有 GPIO 子系统的 API 最终都会调到 SOC 的 GPIO 控制器驱动函数。
ROCKPi 4A 单板有个40个引脚的扩展口,引用 radxa 图片,见下图。
1、进入测试目录
2、导出GPIO
在使用 GPIO2_A7 前,需要导出该引脚。方法:配置 export 后,会出现 gpio71 节点。
测试时,注意不要使用在程序中已经申请过或配置为其它功能的 GPIO 引脚。
3、配置GPIO方向
设置 GPIO2_A7 的输入/输出方向。
in :表示输入。
out :表示输出。
active_low :用于中断配置中高电平或低电平有效。
edge :用于中断配置中上升沿或下降沿有效。
4、配置GPIO输出值
在 GPIO 为输入时,通过 value 查询 GPIO 的输入电平(高或低电平)。
在 GPIO 为输出时,通过 value 配置 GPIO 的输出电平(高或低电平)。
5、查看GPIO
查看已经导出的 GPIO71 。
6、取消导出
使用完 GPIO2_A7 后,需要进行释放。方法:配置 unexport 后, gpio71 节点会消失。
嵌入式Linux中如何实现应用程序与驱动程序函数接口问题,以GPIO为例驱动中的函数定义:
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg >4) {
return -EINVAL
}
s3c2410_gpio_setpin(led_table[arg], !cmd)
return 0
default:
return -EINVAL
}
}
应用程序中的函数定义:
ioctl(fd, on, led_no)
不明白的地方是函数名都不一样,应用程序中的ioctl函数是如何将参数传递到驱动程序sbc2440_leds_ioctl中的?
xicain
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)