当前位置: 首页 > news >正文

Linux 中利用设备树学习Ⅳ

系列文章目录

第一章 Linux 中内核与驱动程序
第二章 Linux 设备驱动编写 (misc)
第三章 Linux 设备驱动编写及设备节点自动生成 (cdev)
第四章 Linux 平台总线platform与设备树
第五章 Linux 设备树中pinctrl与gpio(lichee nano pi)
第六章 Linux ioctl接口应用
第七章 Linux 中利用设备树点灯
第八章 Linux 中设备树学习Ⅳ
————————————————


文章目录

  • 系列文章目录
  • 前言
  • 一、设备树修改(device.c)
    • 1.设备树编写:pinctrl和gpio子系统
    • 2.DTC编译器
  • 二、驱动程序编写(driver.c)
    • 1、得到gpio口
    • 2、操纵gpio口
    • 3、测试程序
  • 三、很重要!


前言

在这里介绍一些基于pinctrl子系统和gpio子系统的设备树编写和驱动代码编写的例子。
有两部分(一)设备树编写,即device代码(二)驱动文件编写,即drive代码。
以“点亮四个LED灯”的程序为例进行讲解


一、设备树修改(device.c)

设备树文件其实不需要我们完全编写,我们需要的是在厂商工程师提供的代码上修改,技术的发展不应该是越来越复杂,它一定是越来越利于各位开发的。
例如采用imx6ull芯片的开发板:

厂商bsp工程师提供(基础)自己改写
imx6ull.dtsi开发板(百问/野火等)对应的硬件设备树

1.设备树编写:pinctrl和gpio子系统

在自己的设备树中如果要利用pinctrl子系统时,需要搞懂pinctrl的机制,有两点:1、怎样完成引脚配置(服务端);2、在那里激活配置(应用端)。上一节提到了这两部分,其实要完成配置有两部分:服务端()应用端
继续以东山的qume开发板(imx6ul芯片)进行讲解。首先在板子对应的内核树文件中找到iomuxc或者iomuxc_snvs。其中的宏定义可在手册上查看,我这里是根据设备树文件中其他的配置直接copy的,其中配置了4个引脚的复用关系设置为GPIO,电气属性为后面的数字串。请注意,这时候还没有设备节点激活该属性。引脚为对应原理图中四个LED的IO口。
在这里插入图片描述
pinctrl服务端设置好了,就该应用了,这次在根节点下,建立myled节点 (一个节点代表一个设备) ,其中的红框代表了该节点激活了对应的pinctrl配置。黄框led-gpios代表着myled设备节点配置了4个引脚。这里注意:在linux内核源码/Documentation/gpio/board.txt中提到,xxx-gpios的后缀必须为gpios或者gpio,这样在代码端就可以利用gpiod_get(dev, "xxx", 0);得到信息
在这里插入图片描述
这里需要注意:有的引脚可能被别的设备占用了,需要暂时注释掉,如下图GPIO1_3被adc1设备节点调用了,因此我在这里把设备节点adc1的state设置为了disabled,这样就不会抢占GPIO1_3引脚
在这里插入图片描述
在这里插入图片描述

2.DTC编译器

编写了xxx.dts之后文件要转变成xxx.dtb文件,可以利用DTC编译器完成。利用DTC编译器可以完成编译和反编译。具体指令如下

dtc -I dts -O dtb -o 1test.dtb 1test.dts //输入dts,输出dtb(名字自己指定即可)
dtc -I dtb -O dts -o 2test.dts 1test.dtb //输入dtb,输出dts

二、驱动程序编写(driver.c)

gpiod_get系列函数用法参考:

https://www.cnblogs.com/bforever/p/10528395.html
https://www.cnblogs.com/schips/p/linux_subsystem_using_gpio_ss.html

gpiod_get只能操纵一个gpio口,下文中利用的是gpio_get_index函数操纵多个gpio口。

1、得到gpio口

平台总线模型,硬件device.c部分即设备树写完了,驱动的完整程序在此:码云链接: link,link,link

https://gitee.com/zhaojiqi/linux-device-driver-routines/blob/master/b2_led_gpio_and_pinctrl/leddrv.c

很简单一个,可以作为后续字符设备驱动程序开发的框架。其中有open、write、close功能。当驱动和设备树转换成的device文件匹配之后,进入probe函数,完成GPIO读取和file operations结构体注册。
在这里插入图片描述
这里重点观察下gpio_get_index()函数,其中
第二个参数“led”就是前面myled结点中定义的属性中的led-gpios属性,只能说设备树太抽象了…。
第三个参数代表第几个gpio。
第四个参数指的是有效电平,有效电平指的是实际电路的电平。例如一个LED,拉低点亮。那么在配置设备树的时候这个GPIO就应该设置为GPIO_ACTIVE_LOW。还有个GPIO_ACTIVE_HIGH 。这里只是没用宏定义,直接填的0

2、操纵gpio口

在设备文件中的write函数中,根据应用程序传进来的参数来对gpio口进行操纵。
在这里插入图片描述
其中利用的函数为gpiod_set_value()函数,直接输出高低电平。

3、测试程序

具体见码云链接: link,link,link

https://gitee.com/zhaojiqi/linux-device-driver-routines/blob/master/b2_led_gpio_and_pinctrl/leddrv.c

make之后,在开发板加载驱动

insmod leddrv.ko

查看驱动和设备节点

lsmod //查看驱动,本文驱动名字leddrv
ls /dev //查看设备节点,本次实验设备节点为myled

利用测试程序开灯关灯

./ledtest myled on //测试程序+参数1(设备节点)+参数2(开/关)
./ledtest myled off

测试图片:
在这里插入图片描述
在这里插入图片描述

三、很重要!

其实,前面有一个地方设置出问题了pinctrl服务端设置了gpio14,但是没有设置gpio53,直接利用了gpio53,但是程序没有报错,gpio口的控制也可以正常跑通,这是因为gpio53可能默认复用的就是gpio功能。好多开发板都如此。

相关文章:

Linux 中利用设备树学习Ⅳ

系列文章目录 第一章 Linux 中内核与驱动程序 第二章 Linux 设备驱动编写 (misc) 第三章 Linux 设备驱动编写及设备节点自动生成 (cdev) 第四章 Linux 平台总线platform与设备树 第五章 Linux 设备树中pinctrl与gpio(…...

使用Spring Initializr方式构建Spring Boot项目

除了可以使用Maven方式构建Spring Boot项目外,还可以通过Spring Initializr方式快速构建Spring Boot项目。从本质上说,Spring lnitializr是一个Web应用,它提供了一个基本的项目结构,能够帮助我们快速构建一个基础的Spring Boot项目…...

Sentinel 2.0 微服务零信任的探索与实践

作者:涯客、十眠 从古典朴素的安全哲学谈起 网络安全现状 现在最常见的企业网络安全架构便是在企业网络边界处做安全防护,而在企业网络内部不做安全防范。这确实为企业的安全建设省了成本也为企业提供了一定的防护能力。但是这类比于现实情况的一个小…...

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参…...

harbor仓库安装部署(1.6.1)

目录 1、关闭防火墙 2、安装docker-ce(所有主机) 3、配置阿里云镜像加速器 4、部署Docker Compose 服务 5、部署 Harbor 服务 6、下载 Harbor 安装程序(两台harbor主机) 7、配置 Harbor 参数文件 8、启动并安装 Harbor …...

FastAPI 构建 API 高性能的 web 框架(一)

如果要部署一些大模型一般langchainfastapi,或者fastchat, 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址: https://fastapi.tiangolo.com/zh/ 1 案例1:复旦MOSS大模型fastapi接口服务 来源:大语言模型工程…...

Spring框架中的Bean的生命周期

Spring Bean 的生命周期总体分为四个阶段:实例化 》属性注入》初始化》销毁 实例化: (1)实例化bean:根据配置文件中Bean的定义,利用java Reflection 反射技术创建Bean的实例! 属性注入&#…...

vue3-ts-vite:vue 项目 配置 多页面应用

一、Vue项目,什么是多页面应用 Vue是一种单页面应用程序(SPA)框架,这意味着Vue应用程序通常只有一个HTML页面,而在该页面上进行动态的内容更改,而不是每次都加载新的HTML页面。 但是,有时候我…...

docker部署jenkins且jenkins中使用docker去部署项目

docker部署jenkins且jenkins中使用docker去部署项目 1、确定版本 2.346.1是最后一个支持jdk8的 2、编写docker-compose.yml并执行 在这个目录中新增data文件夹,注意data是用来跟docker中的文件进行映射的 docker-compose.yml version: "3.1" service…...

无锚框原理 TOOD:Task-aligned One-stage Object Detection

无锚框原理 TOOD:Task-aligned One-stage Object Detection 一 摘要二 引言TOOD设计 三 具体设计Task-aligned Head任务对齐的预测器 TAP预测对齐 TAL 任务对齐学习Task-aligned Sample Assignment多任务损失 一 摘要 一阶段目标检测通常通过优化两个子任务来实现&…...

配置Picgo图床之COS、OSS、Github图床

简介 PicGo是一款开源的图片上传和管理工具,它提供了简单易用的界面和丰富的功能,方便用户上传、管理和分享图片。 以下是PicGo的一些主要特点和功能: 图片上传:PicGo支持将本地图片快速上传到云存储服务,如七牛云、…...

【LangChain】Prompts之自定义提示模板

LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板 概要 假设我们希望LLM生成给定函数名称的英语解释。为了实现此任务,我们将创建一个自定义提示…...

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期,在ELFK的基础上,添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志:192.168.116.40,修改配置将采集到的日志转发给kafka; kafka集群&#xff…...

支付总架构解析

一、支付全局分层 一笔支付以用户为起点,经过众多支付参与者之后,到达央行的清算账户,完成最终的资金清算。那么我们研究支付宏观,可以站在央行清算账户位置,俯视整个支付金字塔,如图1所示: 图…...

【HCIP】OSPF综合实验

题目: 配置: R1 //ip分配 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 172.16.0.1 27 [r1-GigabitEthernet0/0/0]q [r1]int lo [r1]int LoopBack 0 [r1-LoopBack0]ip add 172.16.1.1 24//配置缺省 [r1]ip route-static 0.0.0.0 0 172.16.0.3 //启动…...

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战(10)——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中,模型…...

【工作记录】week7

day3 1.本地切换分支 本地切换分支时,可以直接用 vscode 集成的工具 点击后直接选择即可: 其中红框中为本地分支,蓝框中则是远程分支! 当在本地切换到一个本地不存在的远程分支时,会在本地创建一个同名的分支&…...

安防监控视频融合EasyCVR平台接入RTSP流后设备显示离线是什么原因?

安防监控视频EasyCVR视频汇聚融合平台基于云边端智能协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成&#xff…...

MongoDB:Linux环境全套安装指南

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: MongoDB:Linux环境全套安装指南 ⏱️ 创作时间&#xff1a…...

PostgreSql 启停

一、启动 直接运行 postgres 进程启动。使用 pg_ctl 命令启动。(pg_ctl 命令实际也是封装的 postgres 进程) 示例: pg_ctl -D /data/pg13/data start 或 postgres -D /data/pg13/data &二、停止 使用 pg_ctl 命令停止,优先…...

个人自动化技能库构建指南:从Python脚本到Cron定时任务

1. 项目概述:一个为“摸鱼”场景设计的自动化技能库最近在GitHub上看到一个挺有意思的项目,叫my-copaw-skill。光看这个名字,就透着一股子“打工人”的幽默感——“copaw”这个词,我琢磨着应该是“copilot”(副驾驶/助…...

【ZYNQ】AXI4总线协议实战:从握手时序到PS-PL高效通信

1. AXI4总线协议基础:从握手信号到通道架构 第一次接触ZYNQ的PS-PL通信时,我被AXI4协议里那些VALID/READY信号搞得头晕眼花。直到在示波器上抓到真实的握手波形,才突然理解这个看似复杂的协议其实像极了我们日常的对话机制——只有当说话方准…...

【人生底稿 28】新疆出差终章:几番波折终汇报,尽兴踏归津门路

三日游玩尽数落幕,忙碌工作正式回归。轻松的闲暇时光悄然收尾,紧绷的工作状态再次上线。整趟新疆之行,在起伏辗转中迎来最终收尾。一、深夜复盘材料,彻夜待汇报游玩结束回到酒店,我没有松懈休息,静下心重新…...

从零到一:Android Studio集成Uniapp离线SDK打包实战

1. 环境准备:工具选择与版本匹配 第一次接触Uniapp离线打包时,最让我头疼的就是工具版本匹配问题。记得去年接手一个混合开发项目时,因为HBuilderX和SDK版本不兼容,整整浪费了两天时间排查问题。为了避免大家重蹈覆辙&#xff0c…...

5分钟快速掌握Windows右键菜单终极管理神器ContextMenuManager

5分钟快速掌握Windows右键菜单终极管理神器ContextMenuManager 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是不是经常在右键文件时,面对几十个…...

NS-USBLoader终极指南:3步搞定Switch游戏管理与RCM注入的完整教程

NS-USBLoader终极指南:3步搞定Switch游戏管理与RCM注入的完整教程 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.c…...

如何在Mac上完美读写NTFS硬盘:Free NTFS for Mac终极指南

如何在Mac上完美读写NTFS硬盘:Free NTFS for Mac终极指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management…...

10分钟掌握Autovisor:智慧树网课自动化学习的完整解决方案

10分钟掌握Autovisor:智慧树网课自动化学习的完整解决方案 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor 还在为繁重的智慧树网课任务而烦恼吗&am…...

AI驱动的Web可访问性审查:LLM如何成为你的自动化无障碍专家

1. 项目概述:一个为AI智能体而生,却意外照亮了所有人的可访问性审查工具 最近在折腾AI智能体(AI Agent)的开发,一个老问题又浮上水面:怎么确保我造出来的这个“数字员工”,能真正服务好所有人&…...

Arm Iris调试接口:架构设计与工程实践详解

1. Iris调试与追踪接口深度解析调试与追踪技术是嵌入式系统开发的核心支柱,而Arm的Iris接口代表了这一领域的最新进展。作为一名长期从事嵌入式调试工具开发的工程师,我将带您深入剖析这套接口的设计哲学与实战应用。1.1 接口架构设计理念Iris的架构设计…...