驱动——gpio子系统(LED灯的操控实验)

该博客详细介绍了如何使用STM32的GPIO子系统来控制6个LED灯的亮灭。首先在设备树中定义LED灯,然后实现字符设备驱动创建设备节点。接着,通过设备树节点信息获取GPIO编号并申请使用权,设置GPIO方向为输出。最后,通过ioctl调用控制GPIO电平,实现LED灯的开关操作。实验代码包括驱动程序、头文件和应用层测试代码,实现了LED灯的周期性闪烁效果。

 使用GPIO子系统操控6盏LED灯的亮灭

1、编写设备树节点:

添加如下所示代码到stm32mp157a-fdmp1a.dts中根节点里面,给LED灯定义名字,并引用GPIO寄存器及相对应的引脚信息;

     myleds{
         myled1 = <&gpioe 10 0>;
         myled2 = <&gpiof 10 0>;
         myled3 = <&gpioe 8 0>;
         myled4 = <&gpioz 5 0>;
         myled5 = <&gpioz 6 0>;
         myled6 = <&gpioz 7 0>;          
     };
 

 2、实现字符设备驱动并创建与LED灯相应的6个设备节点(具体详情见驱动——串口点灯实验内容)

3、获取设备树节点信息(获取方式不唯一,本次采用通过节点名字获取)

struct device_node *of_find_node_by_path(const char *path)

功能:获取设备树节点信息通过路径

参数: path:节点路径

返回值:成功返回目标节点的信息结构体地址,失败返回NULL

 struct device_node *of_find_node_by_name(struct device_node *from, const char *name)

功能:通过节点名字获取节点信息

参数:from:已知设备树节点的首地址 (填NULL,默认从根节点解析)

name:设备树节点的名字 "myleds"

返回值:成功返回目标节点的信息结构体地址,失败返回NULL

 4、根据GPIO子系统函数API对LED灯进行操作(子系统函数有新旧两个版本,本次采用新版本)

 ①在在设备树节点信息结构体中获取并申请要使用的gpio编号

旧版本:

 int of_get_named_gpio(struct device_node *np, const char *propname, int index)

功能:根据gpio节点解析获取GPIO编号

参数:

np:节点结构体首地址

proname:键名

index:索引号

返回值:成功返回GPIO编号,失败返回错误码

int gpio_request(unsigned gpio, const char *label)

作用:申请指定GPIO编号的使用权

参数:

gpio:目标GPIO编号

label:一般填写NULL

成功返回0,失败返回错误码

新版本:

struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, const char *propname, int index, enum gpiod_flags dflags, const char *label)

功能:在设备树节点信息结构体中获取并申请要使用的gpio编号

参数:

node:设备树节点信息结构体指针

propname:键名

index:索引

dflags:gpio状态值

GPIOD_OUT_LOW

GPIOD_OUT_HIGH

label:标签,填写NULL

返回值:成功返回gpio描述结构体指针,失败返回错误码指针

②设置管脚为输出模式

 int gpio_direction_output(unsigned gpio, int value)

作用:设置GPIO为输出

参数:

gpio:GPIO编号 value:1:高电平 0:低电平

返回值:成功返回0,失败返回错误码

int gpio_direction_input(unsigned gpio)

作用:设置GPIO为输入

参数:gpio:GPIO编号

返回值:成功返回0,失败返回错误码

新版本:

 int gpiod_direction_input(struct gpio_desc *desc) -----》输入模式

int gpiod_direction_output(struct gpio_desc *desc, int value)------》输出模式

 ③通过ioctl函数传参获取信息,根据应用层逻辑让LED灯输出高低电平,达到操控灯亮灭的过程

旧版本:

int gpio_get_value(unsigned int gpio)

功能:获取GPIO电平状态

参数:GPIO编号

返回值: 1:高电平 0:低电平

void gpio_set_value(unsigned int gpio, int value)

作用:让GPIO输出高低电平

参数: gpio:GPIO编号

value:1:高电平 0:低电平

返回值:无

新版本 

int gpiod_get_value(const struc

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值