驱动开发 linux内核GPIO子系统、及其新版API的概念和使用,linux内核定时器

2023-09-18 17:13:05

1、GPIO子系统

概述:每一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动,我们只需要调用对应的厂商驱动就可以完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多,linux内核个会对厂商驱动做一些封装,会提供一系列的API,我们在自己编写设备驱动中只需要调用这些API即可访问对应厂商驱动,进而完成GPIO的控制。

2、框图

在用户层编写控制硬件的控制裸机,然后设备驱动层调用内核提供的API去管理厂商驱动,完成GPIO的控制,获取GPIO编号并申请,然后到核心层会有厂商驱动的相关细节,有上层接口提供给我们使用,最后会在厂商驱动层,完成对硬件层的控制。

3、GPIO子系统相关API

1、解析GPIO相关的设备数节点

struct device_node *of_find_node_by_path(const char *path)
//path 设备树节点路径
//返回值
//成功返回目标节点首地址,失败返回NULL

2、根据解析的相关GPIO节点信息获取GPIO编号

#include<linux/of_gpio.h>
int of_get_named_gpio(struct device_node *np,const char *propname,int index)
//功能:获取GPIO编号
参数:
    np:设备树节点指针
    proname:gpio编号信息对应到的键名
    index:管教在这个属性键值对中的索引号
返回值:成功返回GPIO编号,失败返回错误码

3、向内核申请要使用的GPIO编号

int gpio_request(unsigned gpio,const char *label)
功能:申请GPIO编号
参数:
    gpio:申请的GPIO编号
    label:标签,填NULL
返回值:成功返回0,失败返回错误码

4、将gpio编号对应的gpio管脚设置为输入

int gpio_direction_input(unsigned) gpio
功能:将gpio编号对应的gpio管脚设置为输入
参数:
    gpio:gpio编号
返回值:成功返回0,失败返回错误码

5、将gpio编号对应的gpio管脚设置为输出

int gpio_direction_output(unsigned gpio,int value)
功能:将gpio编号对应的gpio管脚设置为输出
参数: gpio:gpio编号
        value:默认的输出值 (1)高电平 (0)低电平
返回值:成功返回0,失败返回错误码

6、设置gpio编号对应的gpio管脚,输出高低电平

void gpio_set_value(unsigned gpio,int value)
功能:设置gpio编号对应的gpio引脚,输出高低电平
参数: gpio编号
        value:默认的输出值
返回值:无

7、获取gpio编号对应的GPIO引脚状态值

int gpio_get_value(unsigned gpio)

gpio:gpio编号
返回值:1(高电平) 0(低电平)

8、释放GPIO编号

void gpio_free(unsigned gpio)

4、linux内核定时器

linux内核定时器是设置一个定时事件,当时间达到之后会执行和定时器处理函数,可以执行一些周期性任务。

4.1步骤

       分配一个定时器对象

        初始化定时器对象

        注册定时器

        启用定时器

        注销定时器

4.2jiffies

        是内核中用来保存内核节拍数的一个变量,她的值从内核启动就不断从0开始增加

4.3内核频率

内核节拍数一秒钟增加的数量被称作为内核的频率,内核的频率在内核顶层目录下的.config文件中被设置

4.4内核定时器对象分析

struct timer_list {
    struct hlist_node  entry;//用于构成一个对象链表
    unsigned long       expires;//设置的时间阈值  定时一秒:jiffies+CONFIG_HZ
    void            (*function)(struct timer_list *);//定时器处理函数指针
    u32         flags;//标志,新版才有,填0即可
    };

4.5API

1.分配定时器对象
struct timer_list mytimer;
2.初始化定时器对象
void timer_setup(struct timer_list *timer,
            void (*func)(struct timer_list *), unsigned int flags);
 功能:初始化定时器对象,定时器对象中的expires需要手动初始化
 参数:
 timer:定时器对象指针
 func:定时器处理函数的函数指针
 flags:0
 返回值:无
3.void add_timer(struct timer_list *timer)
功能:注册定时器对象并启用定时器
参数:
    timer:定时器对象指针
返回值:无
4.再次启用定时器
int mod_timer(struct timer_list *timer, unsigned long expires)
功能:再次启用定时器
参数:
timer:定时器对象指针
expires:重新设置的定时器阈值
返回值:启用之前没启用的定时器返回0,启用之前启用的定时器返回1

5.注销定时器对象
int del_timer(struct timer_list *timer)

更多推荐

决策树案例分析

决策树(DecisionTree)常用于研究类别归属和预测关系的模型,比如是否抽烟、是否喝酒、年龄、体重等4项个人特征可能会影响到‘是否患癌症’,上述4项个人特征称作‘特征’,也即自变量(影响因素X),‘是否患癌症’称为‘标签’,也即因变量(被影响项Y)。决策树模型时,其可首先对年龄进行划分,比如以70岁为界,年龄大于

AI与传统数据库 - ChatGPT风过之后 | 从Duet AI说开来

作者:NiDemai,是NineData数据库产品专家,曾任阿里云数据库国际产品总负责人,华为高斯GaussDB创始团队核心架构师,IBMDb2资深研发工程师。Demai专注Cloud-Nativedatabase架构设计,分析型MPP,企业数据库开发及生态,并且积极参与开源社区建立和发展。OpenAI的突破震撼整个市

用青龙面板实现阿里云盘每日签到

什么是青龙面板?青龙面板是支持Python3、JavaScript、Shell、Typescript的定时任务管理平台。青龙面板从功能上看,和群晖的计划任务很像,都可以定时执行一个任务,并发送通知,只是青龙面板更强大一些。安装在群晖上以Docker方式安装。在注册表中搜索whyour,选择第一个whyour/qingl

迅为iTOP-RK3568开发板Sobel 算子边缘检测

本小节代码在配套资料“iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\04_OpenCV开发配套资料\32”目录下,如下图所示:Sobel(索贝尔)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。索贝尔算子把图像中每个像素的上下左右四领域

【数据结构】顺序表与ArrayList

作者主页:paperjie的博客本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。其他专栏:《算法详解》《C语言》《javaSE》等内容

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(七)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.模型训练1)数据集分析2)数据预处理3)模型创建4)模型训练5)获取特征矩阵2.后端Django3.前端微信小程序1)小程序全局配置文件2)推荐电影页面3)个人信息界面以及用户登录记录页面系统测试1.模型损失曲线2.测试效果相关其它博客工程源代码下载其它资料下

让机器人飞入寻常百姓家丨青源Workshop「人形机器人」观点集锦

人形机器人并非新事物,早在上世纪70年代,日本早稻田大学加藤一郎就带领团队研发出世界上第一台人形智能机器人——WABOT-1。而去年马斯克Optimus的发布,也对“机器人热”再度推波助澜。人形机器人领域的发展,需要软件和硬件的共同迭代和优化,同时相比于无人驾驶,人形机器人涉及更加复杂的真实世界多模态环境。机器人技术依

Cpp/Qt-day020918Qt

目录完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提

CSI及CPHY的学习知识点

1.CPHY不需要linecoding8b/10b这些线路编码是不需要的,CPHY的三线编码本身就解决了连续0/1的情况。2.CPHY的三线编码使用状态跳变传递信息的有六个线态(wirestate),每一个当前线态都可以跳变到另外5个线态。每一次跳变对应3bitsymbol【跳变有5种可能,用3bit表示,所以3bit

OpenCV自学笔记二十:图像分割和提取

1、用分水岭算法实现图像分割与提取分水岭算法是一种经典的图像分割算法,用于将图像中的前景和背景进行分离。它基于图像中的灰度值和梯度信息来确定边界,并通过填充区域将图像分割成多个连通的区域。以下是分水岭算法的基本原理:1.预处理:首先对输入图像进行预处理操作,例如灰度化、平滑滤波和边缘检测等,以便更好地捕捉图像的特征。2

新工具 !一键无限重置 Jetbrain 2023 最新版系列

今天逛github,看到了一个新的Jetbrains系列软件的无限30天试用的方法,体验了下,感觉还不错,使用方法很简单。我看介绍软件还处于测试阶段,大家感兴趣的可以试试看。演示软件RubyMine2023.1JetbrainKiller0.5.0使用方法软件名称叫JetbrainKiller,使用方法就是打开软件,一

热文推荐