fmql之Linux设备驱动框架

设备驱动框架

正点原子第39章---LED驱动框架

 

 

 

 

测试

成功:

贴代码

(不需要测试APP)

/***************************************************************Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.文件名    : leds-atk.c作者      : Skylar版本      : V1.0描述      : LED设备驱动框架其他      : 论坛      : www.openedv.com日志      : 初版V1.0 2024/10/8 创建***************************************************************/#include <linux/module.h>
#include <linux/of_gpio.h>
// #include <linux/cdev.h>
// #include <linux/uaccess.h>
#include <linux/platform_device.h>
#include <linux/leds.h>#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/of_address.h>
#include <linux/of.h>
#include <linux/kern_levels.h>#define MYLED_CNT   1
#define MYLED_NAME  "myled"struct myled_data {
/*	dev_t		devid;struct		cdev cdev;struct		class *class;struct		device *device;int			led_gpio;
*/struct led_classdev cdev;int gpio;
};/* 静态内敛函数* @ 通过struct myled_data结构体中的cdev变量的地址,*   得到struct myled_data结构体变量的地址* @ led_cdev: struct myled_data结构体中的cdev变量的地址* @ 执行成功返回struct myled_data结构体变量的地址*/
static inline struct myled_data * cdev_to_led_data(struct led_classdev *led_cdev)
{return container_of(led_cdev, struct myled_data, cdev);
}/* LED相关初始化操作* @ pdev: struct platform_device指针* 		   platform设备指针* @ 成功返回0,失败返回负数*/
static int myled_init(struct platform_device *pdev)
{struct myled_data *led_data = platform_get_drvdata(pdev);struct device *dev = &pdev->dev;int ret;led_data->gpio = of_get_named_gpio(dev->of_node, "led-gpio", 0);if(!gpio_is_valid(led_data->gpio)){dev_err(dev, "Failed t oget gpio");return -EINVAL;}ret = devm_gpio_request(dev, led_data->gpio, "fmql-led Gpio");if(ret){dev_err(dev, "Failde to request gpio");return ret;}gpio_direction_output(led_data->gpio, 0);return 0;
}/* 设置LED的亮度* @ 不可休眠* @ led_cdev: struct led_classdev类型的指针* @ 无返回值*/
static void myled_brightness_set(struct led_classdev *led_cdev,enum led_brightness value)
{struct myled_data *led_data = cdev_to_led_data(led_cdev);int level;if(value == LED_OFF)level = 0;elselevel = 1;gpio_set_value(led_data->gpio, level);
}/* 设置LED亮度* @ 可以休眠* @ led_cdev: struct led_classdev类型指针* @ value: 亮度值* @ 无返回值*/
static int myled_brightness_set_blocking(struct led_classdev *led_cdev,enum led_brightness value)
{myled_brightness_set(led_cdev, value);return 0;
}/* platform驱动的probe函数* @ 当驱动与设备匹配成功后此函数会执行* @ pdev: platforme设备指针* @ 成功返回0, 失败返回负值*/
static int myled_probe(struct platform_device *pdev)
{struct myled_data *led_data;struct led_classdev *led_cdev;int ret;dev_info(&pdev->dev, "Led driver and device have been matched\n");/* 为led_data指针分配内存 */led_data = devm_kzalloc(&pdev->dev, sizeof(struct myled_data), GFP_KERNEL);if(!led_data)return -ENOMEM;platform_set_drvdata(pdev, led_data);/* 初始化LED */ret = myled_init(pdev);if(ret){return ret;}/* 初始化led_cdev变量 */led_cdev							= &led_data->cdev;led_cdev->name						= "myled";	// 设备名字led_cdev->brightness				= LED_OFF;	// LED初始亮度led_cdev->max_brightness			= LED_FULL;	// LED最大亮度led_cdev->brightness_set			= myled_brightness_set;	// LED亮度设置函数-不可休眠led_cdev->brightness_set_blocking	= myled_brightness_set_blocking; // LED亮度设置函数-可休眠/* 注册LED设备 */return led_classdev_register(&pdev->dev, led_cdev);
}/* platform驱动模块卸载时* 此函数i执行* @ dev: platform设备指针* @ 成功返回0, 失败返回负值*/
static int myled_remove(struct platform_device *pdev)
{struct myled_data *led_data = platform_get_drvdata(pdev);led_classdev_unregister(&led_data->cdev);dev_info(&pdev->dev, "LED driver was removed\n");return 0;
}/* 匹配列表 */
static const struct of_device_id led_of_match[] = {{.compatible = "fmql,led"},{/* Sentinel */}
};static struct platform_driver myled_driver = {.driver = {.name			= "fmql-led3",		/* platform_driver name*/.of_match_table	= led_of_match,},.probe = myled_probe,.remove = myled_remove,
};module_platform_driver(myled_driver);MODULE_AUTHOR("Skylar <Skylar@33.com>");
MODULE_DESCRIPTION("FMQL LED Driver Framework");
MODULE_LICENSE("GPL");

代码解析

 

 内核自带的LED驱动

正点原子第40章内容

compatible属性一定要是“gpio-leds

驱动名称为“leds-gpio”        在/sys/bus/platform/drivers目录下

fmql自带的内核源码:

解析gpiogpios开头的属性

我自己改的dts如下:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Copilot重磅更新!OneDrive全新功能炸裂

今天早上一打开onedrive&#xff0c;就发现了弹窗提醒&#xff0c;它&#xff0c;终于来了&#xff1a; copilot in onedrive全新功能来袭&#xff01; 当我们在onedrive中随意选择一个文件&#xff0c;顶部功能栏便出现了copilot按钮&#xff1a; 点击按钮后出现三个选项&…

Tauri 2.0 稳定版发布

Tauri 2.0 稳定版发布 Tauri 是什么&#xff1f; Tauri 应用程序的前端使用您喜欢的 Web 前端栈编写。它在操作系统的 WebView 中运行&#xff0c;并与主要用 Rust 编写的应用核心进行通信。 我何时应该使用 Tauri&#xff1f; 如下任一一项符合&#xff0c;你应该使用 Ta…

立体扬声器棒球帽专利TRO维权,速查避免踩坑

案件基本情况起诉时间&#xff1a;2024-9-18案件号&#xff1a;24-cv-08626原告&#xff1a;Audiowear Technology Corporation原告律所&#xff1a;Loza & Loza, LLP起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Audiowear Technology Corporation&#xff0c;一家位于特…

SpringMVC框架:入门讲解和基础案例解析

Spring Web MVC是什么&#xff1f; Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。使用了MVC架构模式的思想&#xff0c;将web层进行职责解耦&#xff0c;基于请求驱动指的就是使用请求-响应模型 。框架的目的就是帮助我们简化开发&…

嵌入式设备硬件和软件安全设计

1. 引言 哪个领域的网络安全实施记录最差&#xff1f; 既不是 PKI/数字证书&#xff0c;也不是 密钥管理&#xff0c;也不是 OAuth。很可能是嵌入式设备和物联网 领域。 总的来说&#xff0c;这似乎是一个梦想&#xff0c;但如果可设计出“设计安全”的系统&#xff0c;而不…

DHCP Snooping典型配置举例(如何防止路由器乱接问题)

全局开启DHCP Snooping配置举例 组网需求 Router B通过以太网端口Ten-GigabitEthernet0/0/6连接到合法DHCP服务器&#xff0c;通过以太网端口Ten-GigabitEthernet0/0/8连接到非法DHCP服务器&#xff0c;通过Ten-GigabitEthernet0/0/7连接到DHCP客户端。要求&#xff1a; 与合…

各省常住人口及人口密度面板数据(2000-2022年)

常住人口指在某地区居住超过一定时间&#xff08;通常为半年以上&#xff09;的人口&#xff0c;而人口密度则指每平方千米或每公顷内的常住人口数。数据集的主要指标包括&#xff1a; 省份年份常住人口&#xff08;万人&#xff09;人口密度&#xff08;人/平方公里&#xff…

每日学习一个数据结构-图

文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对…

宠物咖啡馆业务自动化:SpringBoot框架的实现方法

3系统分析 3.1可行性分析 通过对本基于Spring Boot的宠物咖啡馆平台的设计与实现实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于Spring Boot的宠物咖啡馆…

(11)(2.1.4) DroneCAN ESCs

文章目录 前言 1 DroneCAN ESC列表 2 连接到飞行控制器 3 自动驾驶仪设置 4 记录和报告 5 附加资料 前言 Copter、Plane 和 Rover 支持 DroneCAN 电子速度控制器&#xff08;ESC&#xff09;&#xff0c;该控制器允许与自动驾驶仪进行双向通信&#xff0c;从而可能更容易…

数据库管理-第250期 深入浅出多主多活数据库技术- Cantian存储引擎(一)(20241009)

数据库管理250期 2024-10-09 数据库管理-第250期 深入浅出多主多活数据库技术- Cantian存储引擎&#xff08;一&#xff09;&#xff08;20241009&#xff09;1 简介2 引擎构成3 引擎架构4 文件分布5 分布式MVCC6 限制/要求总结 数据库管理-第250期 深入浅出多主多活数据库技术…

EtherCAT学习笔记

文章目录 前言一、EtherCAT介绍二、EtherCA系统组成2.1 ESC(EtherCAT从站控制器)2.2 从站控制微处理器2.3 物理层器件2.4 其它应用层器件 三、EtherCAT数据帧结构3.1 寻址方式3.2 时钟3.3 通信模式 四、状态机和通信初始化五、应用层协议六、ESC概述6.1 EtherCAT从站控制芯片6.…

02_InFluxDb

InFluxDb 初始化初始化流程 交互InFluxDbWebUI交互 数据模型行协议添加标签数据格式 数据类型空格索引 初始化 初始化流程 用户 密码 组织名称 Bucket—mysql里面的数据库概念 交互InFluxDb 暂用了8086端口.提供了 http api WebUI交互 略... 数据模型 这是mysql里面的表…

基于SSM的电脑硬件库存管理系统【附源码】

基于SSM的脑硬件库存管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 设计原则 4.2 功能结构设计 4.3 数据库设计 4.3.1 数据库概念设计 4.3.2 数据库物理设计 第5章 系统实现 5.1 管理员功能实现 5.1.1 硬件管理 5.1…

Java开发者测试:Junit5

Java开发者测试 实际代码编写中所用到的单元测试框架基本是Junit结合Mockito使用 Junit spring自带的单元测试框架,涵盖了大部分功能 通过Test注解即可直接生成测试用例 Test public void calTest(){Assert.assertEquals(junit.cal(1,2),3); }BeforeAll 表明在所有测试方法…

learn C++ NO.21——AVL树

简单介绍一下AVL树 AVL树是一种自平衡的二叉搜索树&#xff08;Balanced Binary Search Tree, BBST&#xff09;&#xff0c;由俄罗斯数学家G. M. Adelson-Velsky和E. M. Landis在1962年发明&#xff0c;因此以其名字首字母命名。AVL树通过保持任何节点的两个子树的高度最大差…

笔记 | ASPICE 简介

什么是 ASPICE&#xff08;Automotive SPICE&#xff09; Automotive SPICE&#xff08;简称 A-SPICE 或 ASPICE&#xff09;是欧洲 20 多家主要汽车制造商以ISO/IEC 15504&#xff08;SPICE&#xff0c;Software Process Improvement and Capability dEtermination&#xff0…

Java反射专题

目录 一.反射机制 1.Java Reflection 2.反射相关的主要类 3.反射的优缺点 4.反射调用优化—关闭访问检查 二.Class类 1.基本介绍 2.常用方法 3.获取Class对象的方式 4.那些类型有Class对象 三.类加载 1.介绍 2.类加载时机 3.类加载各阶段 四.获取类结构的信息 1…

基于微信小程序的网上商城+ssm论文源码调试讲解

2 系统开发环境 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行&#xff0c;目前微信开发者工具任然在不断的完善中&#xff0c;在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具&#xff0c;开发者工具将使用这个微信帐号的信息进行小程…

教育领域中聊天机器人和会话代理的使用分析和趋势:一项文献计量学回顾

英文标题: Analysis and Trends in the Use of Chatbots and Conversational Agents in Education: a Bibliometric Review 作者信息: Dennis Arias-Chvez, Universidad Continental, Arequipa, Per; dariascontinental.edu.pe; ORCID: ORCIDTeresa Ramos-Quispe, Universida…