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功能。好多开发板都如此。

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

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

相关文章

【传统视觉】C#创建、封装、调用类库

任务 因为实现代码相对简单,然后又没有使用Opencv,所以就直接用C#实现,C#调用。 1.创建类库 1.1新建一个类库 vs2015 > 文件 > 新建 > 项目 using System; using System.Collections.Generic; using System.Linq;namespace Yo…

【go-zero】docker镜像直接部署API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…

python#django数据库一对一/一对多/多对多

一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…

Session与Cookie的区别(五)

储存状态的方式 小明的故事说完了,该来把上面这一段变成网络的实际案例了。其实在网络世界中问题也是一样的。 前面已经提到过我们会把状态存在 Cookie 里面,让 Request 之间能够变得有关联。 假设我们今天要来做一个会员系统,那我要怎么知道…

云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步,但风电、光伏发电间歌性、波动性强,电网消纳压力较大,且电…

【C++】哈希闭散列

一.哈希的概念 在前面学习了二叉搜索树、AVL树、红黑树之后,我们得知顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须经过关键码的多次比较。顺序查找的时间复杂度为 O(N)&#xff0c…

【MapGIS精品教程】010:空间叠置分析案例教程

文章目录 一、叠置分析介绍(一) 什么是叠加分析(二)叠加分析的分类二、叠加分析操作一、叠置分析介绍 (一) 什么是叠加分析 叠加分析是依靠把分散在不同层上的空间属性信息按相同的空间位置加到一起,合为新的一层。该层的属性由被叠加层各自的属性组合而成,这种组合可…

Pytest测试框架3

目录: pytest结合数据驱动-yamlpytest结合数据驱动-excelpytest结合数据驱动-csvpytest结合数据驱动-jsonpytest测试用例生命周期管理(一)pytest测试用例生命周期管理(二)pytest测试用例生命周期管理(三&a…

【java安全】原生反序列化利用链JDK7u21

文章目录 【java安全】原生反序列化利用链JDK7u21前言原理equalsImpl()如何调用equalsImpl()?HashSet通过反序列化间接执行equals()方法如何使hash相等? 思路整理POCGadget为什么在HashSet#add()前要将HashMap的value设为其他值? 【java安全】…

轮足机器人硬件总结

简介 本文主要根据“轮腿机器人Hyun”总结的硬件部分。 轮腿机器人Hyun开源地址:https://github.com/HuGuoXuang/Hyun 1 电源部分 1.1 78M05 78M05是一款三端稳压器芯片,它可以将输入电压稳定输出为5V直流电压. 1.2 AMS1117-3.3 AMS1117-3.3是一种输…

【2.1】Java微服务:详解Hystrix

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 深度学习 ✨特色专栏: 知识分享 &…

pytorch实战-图像分类(二)(模型训练及验证)(基于迁移学习(理解+代码))

目录 1.迁移学习概念 2.数据预处理 3.训练模型(基于迁移学习) 3.1选择网络,这里用resnet 3.2如果用GPU训练,需要加入以下代码 3.3卷积层冻结模块 3.4加载resnet152模 3.5解释initialize_model函数 3.6迁移学习网络搭建 3.…