RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析

RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析
摘要:本文将基于RockPI 4A单板,介绍Linux 4.4内核下RK3399 GPIO(通用输入输出)功能的使用方法。通过详细的代码解析和示例,帮助读者理解如何在Linux内核中使用GPIO,以及如何通过GPIO实现单板的基本控制和功能扩展。
- 引言
GPIO(通用输入输出)是嵌入式系统中的一个重要接口,用于实现对单板外设的控制和状态检测。在Linux内核中,GPIO通常由gpiochip和gpio两个结构体来表示,其中gpiochip表示一个GPIO控制器,而gpio表示单个GPIO引脚。本文将基于RockPI 4A单板,介绍如何在Linux 4.4内核下使用RK3399 GPIO功能。
- RK3399 GPIO控制器简介
RK3399是Rockchip公司推出的一款高性能处理器,集成了丰富的外设和接口。在GPIO方面,RK3399提供了多达16个GPIO控制器,每个控制器可配置的GPIO引脚数量不等。本文将基于RockPI 4A单板,介绍其中一个GPIO控制器的基本配置和使用方法。
- GPIO控制器驱动配置
在Linux内核中,GPIO控制器驱动通常由gpiochip结构体来表示。为了使用RK3399的GPIO功能,首先需要配置GPIO控制器驱动。在RockPI 4A单板的Linux 4.4内核中,GPIO控制器驱动位于drivers/gpio/rockchip_gpio.c文件中。
3.1 配置GPIO控制器
在rockchip_gpio.c文件中,定义了一个rockchip_gpio_chip结构体,用于表示RK3399的GPIO控制器。该结构体包含了GPIO控制器的基本信息,如GPIO引脚数量、方向控制寄存器地址等。在配置GPIO控制器时,需要根据实际单板配置修改这些信息。
3.2 注册GPIO控制器
在GPIO控制器配置完成后,需要将其注册到内核中。在rockchip_gpio.c文件中,定义了一个rockchip_gpio_chip结构体数组,用于表示多个GPIO控制器。在驱动初始化函数rockchip_gpio_init中,将GPIO控制器数组注册到内核中。
- GPIO引脚操作
在GPIO控制器注册完成后,可以使用GPIO引脚进行基本控制和功能扩展。在Linux内核中,GPIO引脚操作通常由gpio结构体来表示。
4.1 获取GPIO引脚
在使用GPIO引脚之前,需要先获取GPIO引脚。在rockchip_gpio.c文件中,定义了一个rockchip_gpio_get函数,用于获取GPIO引脚。该函数接收GPIO引脚编号作为参数,返回一个gpio结构体。
4.2 设置GPIO引脚方向
在获取GPIO引脚后,可以设置GPIO引脚的方向。在rockchip_gpio.c文件中,定义了一个rockchip_gpio_set_direction函数,用于设置GPIO引脚的方向。该函数接收GPIO引脚和方向作为参数,将GPIO引脚设置为输入或输出模式。
4.3 读取GPIO引脚状态
在设置GPIO引脚方向后,可以读取GPIO引脚的状态。在rockchip_gpio.c文件中,定义了一个rockchip_gpio_get_value函数,用于读取GPIO引脚的状态。该函数接收GPIO引脚作为参数,返回GPIO引脚的当前状态。
4.4 设置GPIO引脚值
在设置GPIO引脚方向为输出模式后,可以设置GPIO引脚的值。在rockchip_gpio.c文件中,定义了一个rockchip_gpio_set_value函数,用于设置GPIO引脚的值。该函数接收GPIO引脚和值作为参数,将GPIO引脚设置为高电平或低电平。
5.示例代码
为了更好地理解如何在Linux内核中使用RK3399的GPIO功能,下面是一个简单的示例代码,展示了如何通过GPIO控制LED灯的亮灭。
首先,在rockchip_gpio.c文件中,定义一个rockchip_gpio_chip结构体,用于表示RK3399的GPIO控制器,并注册该控制器到内核中。
#include <linux/module.h>
#include <linux/gpio/driver.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>// 定义GPIO控制器结构体
struct rockchip_gpio_chip rockchip_gpio_chip = {.label = "rockchip_gpio_chip",.ngpio = 16, // RK3399支持16个GPIO控制器,这里使用第一个控制器.parent = &rockchip_gpio_chip,.owner = THIS_MODULE,.of_node = NULL,.base = 0,.get_direction = rockchip_gpio_get_direction,.get_value = rockchip_gpio_get_value,.set_value = rockchip_gpio_set_value,.set_direction = rockchip_gpio_set_direction,
};// 注册GPIO控制器
static int rockchip_gpio_probe(struct platform_device *pdev)
{int ret = 0;struct gpio_chip *gc = &rockchip_gpio_chip;ret = gpiochip_add_data(gc, &rockchip_gpio_chip);if (ret) {pr_err("Failed to add GPIO chip\n");return ret;}return 0;
}static int rockchip_gpio_remove(struct platform_device *pdev)
{struct gpio_chip *gc = &rockchip_gpio_chip;gpiochip_remove(gc);return 0;
}static const struct of_device_id rockchip_gpio_of_match[] = {{ .compatible = "rockchip,rockchip-gpio" },{ }
};static struct platform_driver rockchip_gpio_driver = {.probe = rockchip_gpio_probe,.remove = rockchip_gpio_remove,.driver = {.name = "rockchip-gpio",.of_match_table = rockchip_gpio_of_match,},
};module_platform_driver(rockchip_gpio_driver);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Rockchip GPIO driver");
接下来,在main.c文件中,定义一个简单的函数,用于通过GPIO控制LED灯的亮灭。
#include <linux/module.h>
#include <linux/gpio/driver.h>
#include <linux/of.h>
#include <linux/of_gpio.h>// 定义LED引脚编号
#define LED_GPIO 2 // 假设LED连接到GPIO编号为2的引脚// 定义LED控制函数
static int led_control(struct gpio_chip *gc, unsigned int offset, int value)
{// 获取LED引脚struct gpio_desc *gpio = gpiochip_get_desc(gc, offset);if (!gpio) {pr_err("Failed to get LED GPIO\n");return -ENODEV;}// 设置LED引脚值gpio_set_value(gpio, value);return 0;
}// 注册LED控制函数相关文章:
RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析
RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析 摘要:本文将基于RockPI 4A单板,介绍Linux 4.4内核下RK3399 GPIO(通用输入输出)功能的使用方法。通过详细的代码解析和示例,帮助读者理解如何在Linux内核中使用GPI…...
【Vue】Vue3.0(二十三)Vue3.0中$attrs 的概念和使用场景
文章目录 一、$attrs的概念和使用场景概念使用场景 二、代码解释Father.vueChild.vueGrandChild.vue 三、另一个$attrs使用的例子 一、$attrs的概念和使用场景 概念 在Vue 3.0中,$attrs是一个组件实例属性,它包含了父组件传递给子组件的所有非props属性…...
RHEL/CENTOS 7 ORACLE 19C-RAC安装(纯命令版)
一 首先需要安装两个CENTOS 7虚拟机(此处省略)。 由于我们是要安装ORCLE-RAC双节点集群所以至少每个CENTOS虚拟机上需要两块网卡,并且两块网卡都是HOST-ONLY具体步骤请看视频一《为虚拟机添加网卡》 这里大家需要注意的是,我们需要绑定两台机器的IP一共…...
CCSK:面试云计算岗的高频问题
在竞争激烈的云计算岗位求职市场中,拥有 CCSK云计算安全知识认证无疑能为你增添强大的竞争力。而深入了解云计算面试中的高频问题并熟练掌握答案,更是迈向成功的关键一步。 一、AWS 相关问题 AWS 是重要考点,常被问到其关键特性,…...
C++ String(1)
String的头文件是#include <string> String本质上是一个类,是C实现好的一个类 初学只用学重要的部分,不可能一次性全部学完 1.构造函数 我们先来看它的几个构造函数 首先(1)就是无参的构造 (2)是…...
ts 中 ReturnType 作用
ReturnType 用于获取函数的返回值类型。 一、基本概念和语法 1. 定义和语法结构 ReturnType是一个泛型类型,其语法为ReturnType<T>,其中T是一个函数类型。例如,如果有一个函数add,ReturnType<typeof add>就可以获取…...
Hadoop + Hive + Apache Ranger 源码编译记录
背景介绍 由于 CDH(Clouderas Distribution Hadoop )近几年已经开始收费并限制节点数量和版本升级,最近使用开源的 hadoop 搭了一套测试集群,其中的权限管理组件用到了Apache Ranger,所以记录一下编译打包过程。 组件…...
Java从入门到精通笔记篇(十二)
枚举类型与泛型 枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中 使用枚举类型设置常量 关键字为enum 枚举类型的常用方法 values()方法 枚举类型实例包含一个values()方法,该方法将枚举中所有的枚举值以数组的形式返回。 valueOf()可…...
入侵排查之Linux
目录 1.黑客入侵后的利用思路 2.入侵排查思路 2.1.账号安全 2.1.1.用户信息文件/etc/passwd 2.1.2.影子文件/etc/shadow 2.1.3.入侵排查 2.1.3.1.排查当前系统登录信息 2.1.4.2.查询可以远程登录的账号信息 2.2.历史命令 2.2.1.基本使用 2.2.1.1.root历史命令 2.2.…...
从0开始学习Linux——文件管理
往期目录: 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…...
全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程
一、软件系统设计开发运行安全 1、注重OpenSource组件安全检查和版本更新(black duck) 现在很多云、云服务器都是由开源的组件去搭成的,对于OpenSource组件应该去做一些安全检查和版本更新,尤其是版本管理,定期对在运…...
Leidenアルゴリズムの詳細解説:Pythonによるネットワーク分割の実装
Leidenアルゴリズムの詳細解説:Pythonによるネットワーク分割の実装 目次1. Leidenアルゴリズムの概要2. Python実装例3. グループ分けの結果分析4. なぜこのような分割になるのか5. Leidenアルゴリズムの仕組み6. 実践的な応用例7. 初心者へのアドバイス8. まとめ …...
安当ASP系统:适合中小企业的轻量级Radius认证服务器
安当ASP(Authentication Service Platform)身份认证系统是一款功能强大的身份认证服务平台,特别适用于中小企业。其中,简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍: 一、主要…...
Vue 组件间传值指南:Vue 组件通信的七种方法
前言 Vue 的组件系统非常强大,允许我们将应用程序拆分成独立且可复用的组件。随着前端开发的复杂性增加,组件间的数据传递和状态管理显得尤为重要。本文将详细介绍几种在 Vue 中常用的组件间传值方法,并结合实际代码示例,帮助您更…...
推荐一个超漂亮ui的网页应用设计
https://andi.cn/download/65211.html...
有什么初学算法的书籍推荐?
对于初学算法的读者,以下是一些值得推荐的书籍: 1、算法超简单:趣味游戏带你轻松入门与实践 作者:童晶 著 推荐理由:本书把趣味游戏应用于算法教学,提升读者的学习兴趣,并通过可视化的图解和动…...
自动化工作流建设指南
🚀 自动化工作流建设指南:CI/CD、Github Actions与自动化测试部署 打造现代化的自动化工作流,提升团队开发效率。今天咱们将深入探讨 CI/CD 最佳实践、Github Actions 实战经验以及自动化测试与部署策略。 📑 目录 CI/CD 最佳实践…...
[免费]SpringBoot+Vue3校园宿舍管理系统(优质版)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue3校园宿舍管理系统(优质版),分享下哈。 项目视频演示 【免费】SpringBootVue3校园宿舍管理系统(优质版) Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的不断发展&…...
SNK施努卡 - 机器人测温取样系统
机械手测温取样系统 有色行业自动化 机器人:机械手测温取样系统是以工业机器人为平台,技术相对成熟稳定,利用机器人的灵活性,自动往测温取样枪上安装探头,自动将探头伸进高温铜水内进行测温取样,自动拆除废…...
goframe开发一个企业网站 验证码17
Go验证码功能实现详解 目录结构 ├── internal │ ├── controller │ │ └── captcha │ │ └── captcha.go │ ├── logic │ │ └── captcha │ │ └── captcha.go │ └── service │ └── captcha.go1. Serv…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
