Linux嵌入式 驱动开发(设备树/设备树LED/Beep)

您所在的位置:网站首页 关闭网口linux Linux嵌入式 驱动开发(设备树/设备树LED/Beep)

Linux嵌入式 驱动开发(设备树/设备树LED/Beep)

2023-03-15 18:20| 来源: 网络整理| 查看: 265

Linux嵌入式 驱动开发(设备树/设备树LED/Beep) 1.什么是设备树?

描述设备树的文件叫做DTS(Device Tree Source),采取树形结构描述板级设备(开发板上的信息),比如CPU数量,内存基地址,IIC接口接了什么设备,SPI接口上接了哪些设备。

1.dts

.dts:设备树源码文件

.dtb:设备树二进制文件

DTC:把.dts文件编译成.dtb文件所需要的工具,编译dts文件的命令:make dtbs

.dtsi: 设备树头文件的扩展名

2.设备节点

设备树是采用树形结构来描述板子上的信息,每个设备都是一个节点(key),每个节点都通过一些属性信息来描述节点信息,属性(value)

3.标准属性

1.compatible属性:兼容性,用于将设备和驱动绑定起来。

2.model属性: 描述设备模块信息,比如名字

3.status属性:描述设备状态,比如“okay”就是可操作的

4.#address-cells 和#size-cells 属性:地址和地址长度

5.reg属性:reg属性的值一般是(address,length),某节点寄存器地址是address,所占长度为length。

6.ranges属性:ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成

4.根节点compatible属性

compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";

比如这里使用的是“imx6ull-14x14-evk”这个设备,第二个值描述了设备所使用的 SOC,

5.向节点追加或者修改内容

具体见书1124页,实验使用也多

6.设备树在系统中的体现

Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的/proc/devicetree 目录下根据节点名字创建不同文件夹

7.设备树常用OF操作函数

Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,所以在很多资料里面也被叫做 OF 函数。这些 OF 函数原型都定义在 include/linux/of.h 文件中。

1.查找节点的OF函数(常用)

of_find_node_by_name(按名字)

of_find_node_by_path(按路径)

2.查找父/子节点的OF函数

3.提取属性值的OF函数(常用)

of_find_property 函数用于查找指定的属性

4.其它OF函数

2.设备树下LED驱动实验1.修改设备树文件

在根节点“/”下创建一个名为“alphaled”的子节点

alphaled { #address-cells = ; #size-cells = ; compatible = "atkalpha-led"; status = "okay"; reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */ 0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */ 0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */ 0X0209C000 0X04 /* GPIO1_DR_BASE */ 0X0209C004 0X04 >; /* GPIO1_GDIR_BASE */ };

2,3行里面的数字都为1,表示属性起始地址占用一个字节,地址长度也占用一个字节

6行开始的reg,比如CCM_CCGR1_BASE那一行,表示这个东西的起始地址和地址长度

然后编译

2.驱动编写注意事项1.在desled设备结构体里面添加设备节点2.初始化流程

(1)获取设备树中的属性数据

1.获取设备节点,alphaled

2.获取compatible属性内容

3.获取status属性内容

4.获取reg属性内容

(2)初始化LED

1.寄存器地址映射(此时我们仍然使用虚拟地址)

2.使能gpio1时钟

3.设置GPIO1_IO03的复用功能,将其复用为GPIO1_IO03,并设置电气属性

4.设置GPIO1_IO03为输出功能

5.默认关闭LED

(3)注册字符设备驱动

1.创建设备号

2.初始化cdev

3.添加一个cdev

4.创建类

5.创建设备

3.pinctrl和gpio框架下的LED驱动实验1.pinctrl子系统

pinctrl(引脚控制):获取引脚信息,然后设置电气,复用等属性

这里说明一下两个概念:

IOMUXC和IOMUXCX_SNVS

前者是指接口电气属性

后者是指接口控制,指复用,设值等

(1)添加pinctrl节点,比如LED灯使用了GPIO1_IO03这个PIN,我们就打开我们所需要使用的设备树,然后在IOMUXC节点下

添加自己使用的字节点,假设命名为pinctrl_led,子节点内容如下:

pinctrl_led: ledgrp { fsl,pins = < MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 /* LED0 */ >; };

第三行:将GPIO1_IO03复用为GPIO1_IO03,并且设置电气属性值为0x10b0

上面这个是需要我们自己设置的,而IOMUXC_SNVS是不需要单独设置的,也介绍一下

#define MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x0090 0x031C 0x0000 0x5 0x0 //宏定义的意思:UART1_RTS_B 这个 IO 复用为 GPIO1_IO19

这个宏定义后面有五个值,分别代表

mux_reg :mux_reg寄存器偏移地址(就是父节点地址是X,我们加上这个变量的值之后,所得到的就是复用寄存器的地址)

conf_reg :conf_reg寄存器偏移地址

input_reg :input_reg寄存器偏移地址

mux_mode :mux_reg寄存器值,设置为0x5,就是将UART1_RTS_B 这个 IO 复用为 GPIO1_IO19

input_val:input_reg寄存器的值

而IOMUXC就是里面那个宏定义就是conf_reg寄存器的值

2.gpio子系统

初始化GPIO并提供相应的API函数,方便驱动开发使用GPIO相关信息,

(2)添加设备节点

在根节点“/”下创建LED灯节点,节点名为gpioled

gpioled { #address-cells = ; #size-cells = ; compatible = "atkalpha-gpioled"; pinctrl-names = "default"; pinctrl-0 = ; led-gpio = ; status = "okay"; };

6:pinctrl-0属性设备LED灯所使用的PIN对应的pinctrl节点,就是上面设置pinctrl节点

7:led-gpio指定了led灯所使用的GPIO,GPIO1_IO03,低电平有效

3.驱动程序编写

初始化流程

(1).设置LED所使用的GPIO

1.获取设备节点

2.获取设备树中的gpio属性,得到LED使用的LED编号(通过这个编号我们可以设置或者获得属性值)

of_get_named_gpio

3.设置GPIO1_IO03为输出,并且输出高电平,默认关闭LED灯

gpio_direction_output

(2)注册字符设备驱动

PS:减少了地址映射的步骤,直接通过GPIO子系统操作GPIO

4.Linux蜂鸣器实验

同3的LED,不再赘述

#Linux##c++##嵌入式工程师#

注意!此信息未认证,请谨慎判断信息的真实性!

提示


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3