RTT设备驱动框架学习(GPIO)

ops/2024/12/22 18:17:01/

基类对象,定义在rtdef.h中

struct rt_object
{char name[RT_NAME_MAX];rt_uint8_t type; //设备类Devicert_uint8_t flag;rt_list_t list;
}; //同一类对象挂接在一个链表上

设备基类,定义在rtdef.h中(属于设备接口层)

struct rt_device
{struct rt_object parent;enum rt_device_class_type type;rt_uint16_t flag;rt_uint16_t open_flag;rt_uint8_t                ref_count;                /**< reference count */rt_uint8_t                device_id;                /**< 0 - 255 *//* device call back */rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);/* common device interface */rt_err_t  (*init)   (rt_device_t dev);rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);rt_err_t  (*close)  (rt_device_t dev);rt_ssize_t (*read)  (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);rt_ssize_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);void                     *user_data;                /**< device private data */
}

在pin.h中(属于设备驱动框架层)

struct rt_device_pin
{struct rt_device parent;const struct rt_pin_ops *ops;
};
struct rt_pin_ops
{void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode);void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_uint8_t value);rt_int8_t  (*pin_read)(struct rt_device *device, rt_base_t pin);rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_base_t pin,rt_uint8_t mode, void (*hdr)(void *args), void *args);rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_base_t pin);rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled);rt_base_t (*pin_get)(const char *name);
};

在drv_gpio.c中(属于设备驱动层)
实现了设备驱动框架层的操作接口

static const struct rt_pin_ops _stm32_pin_ops = 
{stm32_pin_mode,stm32_pin_write,stm32_pin_read,stm32_pin_attach_irq,stm32_pin_dettach_irq,stm32_pin_irq_enable,stm32_pin_get,
};

直接注册

rt_hw_pin_init(void)
{return rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
}

设备驱动框架层pin.c中定义了
static struct rt_device_pin _hw_pin;

struct rt_device_pin_value
{rt_base_t pin;rt_uint8_t value;
}
int rt_device_pin_register(const char*name, const struct rt_pin_ops *ops, void *user_data)
{_hw_pin.parent.type = RT_Device_Class_Pin;_hw_pin.parent.rx_indicate = RT_NULL;_hw_pin.parent.tx_complete = RT_NULL;_hw_pin.parent.init         = RT_NULL;_hw_pin.parent.open         = RT_NULL;_hw_pin.parent.close        = RT_NULL;_hw_pin.parent.read 		= _pin_read;_hw_pin.parent.write        = _pin_write;_hw_pin.parent.control      = _pin_control;_hw_pin.ops					= ops;_hw_pin.parent.user_data	= user_data;rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR);return 0;
}

http://www.ppmy.cn/ops/11941.html

相关文章

【Redis(5)】Redis哨兵模式配置示例

Redis的三种高可用方案对比参考上一篇博客&#xff1a;深入理解Redis三种高可用方案&#xff0c;以做出明智的选择&#xff0c;下面要探讨的是三种方案其中的一种。 在Redis的主从模式中&#xff0c;虽然可以从节点提供读取操作的负载均衡&#xff0c;并且作为数据的热备份&am…

【muzzik 分享】关于 MKFramework 的设计想法

MKFramework是我个人维护持续了几年的项目&#xff08;虽然公开只有一年左右&#xff09;&#xff0c;最开始由于自己从事QP类游戏开发&#xff0c;我很喜欢MVVM&#xff0c;于是想把他做成 MVVM 框架&#xff0c;在论坛第一个 MVVM 框架出来的时候&#xff0c;我的框架已经快完…

vue-Router 路由(常量路由)

1、安装 pnpm i vue-router 2、新建文件&#xff1a;src/routes.ts import { RouteRecordRaw } from vue-routerexport const constantRoute: RouteRecordRaw[] [{//path: /,redirect: /login,},{//path: /login,component: () > import(/views/Login/index.vue),name…

TypeScript 泛型

泛型 介绍 软件工程中&#xff0c;我们不仅要创建一致的定义良好的API&#xff0c;同时也要考虑可重用性。 组件不仅能够支持当前的数据类型&#xff0c;同时也能支持未来的数据类型&#xff0c;这在创建大型系统时为你提供了十分灵活的功能。 在像C#和Java这样的语言中&…

【后端】python2和python3的语法差异

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为何要了解不同版本的语法差异二、python2和python3的语法差异三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使…

TCP连接被远程主机强制关闭错误判断实例

如果你遇到错误消息 “An existing connection was forcibly closed by the remote host.”&#xff0c;这通常意味着远程服务器&#xff08;即“remote host”&#xff09;非正常地关闭了TCP连接。这可能是因为多种原因&#xff0c;比如服务器遇到了问题、服务器决定断开连接以…

基于C++ DNN部署Yolov8出现的问题记录

代码问题 报错行&#xff1a;net.forward(outputs, net.getUnconnectedOutLayersNames()) 错误展示 错误代码&#xff1a;Exception message: OpenCV(4.8.1) C:\GHA-OCV-2\_work\ci-gha-workflow\ci-gha-workflow\opencv\modules\dnn\src\layers\reshape_layer.cpp:109: err…

基于SpringBoot的“幼儿园管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“幼儿园管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 个人信息界面图 缴费信息管理界…