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

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

摘要:本文将基于RockPI 4A单板,介绍Linux 4.4内核下RK3399 GPIO(通用输入输出)功能的使用方法。通过详细的代码解析和示例,帮助读者理解如何在Linux内核中使用GPIO,以及如何通过GPIO实现单板的基本控制和功能扩展。

  1. 引言

GPIO(通用输入输出)是嵌入式系统中的一个重要接口,用于实现对单板外设的控制和状态检测。在Linux内核中,GPIO通常由gpiochipgpio两个结构体来表示,其中gpiochip表示一个GPIO控制器,而gpio表示单个GPIO引脚。本文将基于RockPI 4A单板,介绍如何在Linux 4.4内核下使用RK3399 GPIO功能。

  1. RK3399 GPIO控制器简介

RK3399是Rockchip公司推出的一款高性能处理器,集成了丰富的外设和接口。在GPIO方面,RK3399提供了多达16个GPIO控制器,每个控制器可配置的GPIO引脚数量不等。本文将基于RockPI 4A单板,介绍其中一个GPIO控制器的基本配置和使用方法。

  1. 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控制器数组注册到内核中。

  1. 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控制函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCL 高阶多项式曲线回归拟合(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 高阶多项式曲线回归(Polynomial Regression)是一种线性回归模型的扩展,它允许数据拟合一个非线性的曲线。虽然多项式本身是非线性的,但我们可以通过引入新的变量(例如,原始变量的平方、立方等)来将问题转化为…

240508Scala笔记

240508Scala笔记 Scala概述: SCala是Java的拓展,在Java的基础上又拓展了一些语法,例如: 输出Hello World println("HelloWorld")System.out.println("Hello Scala from Java") 上面两段代码都可以输出内容. package chapter01 ​ /*object: 关键字,声明…

深度学习革命-AI发展详解

深度学习革命 《深度学习革命》是一部引人深思的作品&#xff0c;详细讲述了深度学习技术的发展历程及其对各个行业的深远影响。由杰出的计算机科学家、深度学习专家撰写&#xff0c;这本书不仅适合科技领域的专业人士阅读&#xff0c;也为普通读者提供了一个理解人工智能革命…

vue数组在浏览器里可以看到值, 但是length为空

arr数组 length为0, 检查了代码在created 里调用了 this.getEnergyList(); 和 this.initChart(); 问题就在这里, this.initChart用到了getEnergyList里的数据, 造成了数据异步, 把this.initChart(); 放入 this.getEnergyList(); 方法里即可解决问题

鸿蒙原生应用元服务开发-设备管理USB服务开发场景与接口

场景介绍 Host模式下&#xff0c;可以获取到已经连接的USB设备列表&#xff0c;并根据需要打开和关闭设备、控制设备权限、进行数据传输等。 接口说明 USB服务主要提供的功能有&#xff1a;查询USB设备列表、批量数据传输、控制命令传输、权限控制等。 USB类开放能力如下&#…

Web LLM 攻击技术

概述 在ChatGPT问世以来&#xff0c;我也尝试挖掘过ChatGPT的漏洞&#xff0c;不过仅仅发现过一些小问题&#xff1a;无法显示xml的bug和错误信息泄露&#xff0c;虽然也挖到过一些开源LLM的漏洞&#xff0c;比如前段时间发现的Jan的漏洞&#xff0c;但是不得不说传统漏洞越来…

快速入门链路追踪sleuth整合zipkin(代码演示)

1、演示项目背景 2、pom.xml 3、启动项目 4、测试 5、保存数据到数据库 6、通过mq保存数据到mysql 7、通过mq保存数据到es 1、演示项目背景 下载zipkin&#xff0c;建议使用2.x版本的&#xff0c;3.x版本的要求jdk高版本。如果自己是1.8&#xff0c;就下载2.x的 下载地…

一文看懂企业FTP服务器替代解决方案

FTP (File Transfer Protocol) 是一种用于在计算机网络上传输文件的协议。它基于客户端-服务器模型&#xff0c;用户可以通过一个支持FTP协议的客户端程序连接到远程FTP服务器&#xff0c;然后上传或下载文件。 FTP虽然是一种广泛使用的文件传输协议&#xff0c;但它也存在一些…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

QComboBox条目可选择状态

有时候下拉框需要根据情况&#xff0c;将某些条目设为不可点击状态&#xff0c;或者动态切换为可点击状态&#xff0c;可采用以下方法。 //item1可选ui->comboBox->setItemData(0, QVariant(-1), Qt::UserRole-1);//item2不可选ui->comboBox->setItemData(1, QVari…

树莓派4B_OpenCv学习笔记3: 系统自动更新时间_测试CSI摄像头_安装OpenCv_4.6(未成功编译源码)_备份树莓派镜像

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本文我只是安装了OpenCv 4.6&#xff0c;但编译源码失败了&#xff01;有关 OpenCv 部分仅做笔记暂存&#xff01; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令…

python ---使用python操作mysql ---> pymysql

本章内容: 1:能够完成从MySQL中读取出数据; [重点] 查询: execute()、fetchall() 2:能够将数据写入MySQL数据库。 [重点] 插入数据: execute() sql insert into xxx [掌握]pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和M…

怎么避免电脑磁盘数据泄露?磁盘数据保护方法介绍

电脑磁盘是电脑存储数据的基础&#xff0c;而为了避免磁盘数据泄露&#xff0c;我们需要保护电脑磁盘。下面我们就来了解一下磁盘数据保护的方法。 磁盘加密 磁盘加密可以通过专业的加密算法来加密保护磁盘数据&#xff0c;避免电脑磁盘数据泄露。在这里小编推荐使用文件夹只读…

E: Unable to locate package ros-kinetic-usb-cam

mkdir -p USB/src && cd USB/src catkin_init_workspace git clone https://github.com/bosch-ros-pkg/usb_cam.git cd .. catkin_make source devel/setup.bash echo "source ~/USB/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 编译过程报错&…

yum进阶——配置yum源

一、yum概述 yum的主要作用 解决依赖关系 自动安装 自动升级 各个系统中的安装软件服务 CentOS7 &#xff1a;yum -y 安装 rpm包 CentOS8 &#xff1a;dnf&#xff08;yum的升级版&#xff09;&#xff0c; Ubantu(22.04) &#xff1a;apt -y 安装&#xff0c;安装源为/…

vue面试题2-根据以下问题回答

以下是针对提供的关于Vue的问题的回答&#xff1a; Vue的基本原理&#xff1a; Vue.js是一个流行的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。其基本原理包括响应式数据、模板、组件系统、指令、生命周期钩子和虚拟DOM。 双向数据绑定的原理&#xff1a; Vue通…

【ROS2大白话】四、ROS2非常简单的传参方式

系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录前言一、launch文件传参的demo1. 编写launch.py文…

MySQL8.3日志文件占用硬盘空间过大,释放方法

执行 reset master; 即可解决问题&#xff0c;我写了个任务&#xff0c;定期执行 执行后目录效果

基于python flask的旅游景点评论数据可视化大屏实现,包括数据采集

背景 在旅游行业中&#xff0c;了解游客对旅游景点的评论和评价对于景点管理和市场营销至关重要。通过采集旅游景点评论数据并进行可视化分析&#xff0c;可以帮助景点管理者更好地了解游客对景点的看法和体验&#xff0c;发现优劣势&#xff0c;优化服务和提升用户满意度。基…

Web3的应用场景分析

Web3&#xff0c;即基于区块链技术的去中心化互联网&#xff0c;正逐渐改变我们与数字世界的互动方式。以下是Web3的一些主要应用场景。Web3技术正在各个领域推动创新&#xff0c;创造更多透明、开放和去中心化的解决方案&#xff0c;为用户带来更高的自主权和安全性。北京木奇…