Nuttx驱动(一)简介

2023-05-16

第一次写Nuttx系统的驱动,用惯了rt-thread、FreeRTOS等RTOS或裸机的驱动编写。写Nuttx驱动感觉好蹩脚,顺便记录一下(by the way: 先完成,再完善

Nuttx驱动分类

Nuttx作为类linux的RTOS,驱动结构、风格与linux很相似

1. 字符驱动

例如串口设备、ADC、DAC、CAN、Timer、PWM、编码器、RTC、看门狗、按键等等

2. 块设备驱动

3. 特殊设备驱动

例如网卡、SPI、IIC、LCD、SDIO、USB、MIPI等

Nuttx驱动简介

1. 数据结构

Nuttx通过驱动注册接口,将驱动注册到文件系统中,并实现file_operations操作函数,应用层只需通过标准系统调用,即可调用底层驱动。
底层驱动有分为上半部分(upper_half)和下半部分(lower_half)
本质理解:驱动 = 总线 + 功能
总线:GPIO、SPI、IIC、CAN、USB、串口等;
功能:读写数据、存储、使能、传输等;

struct file_operationsfs.h
struct file_operations
{
  /* The device driver open method differs from the mountpoint open method */

  int     (*open)(FAR struct file *filep);

  /* The following methods must be identical in signature and position
   * because the struct file_operations and struct mountp_operations are
   * treated like unions.
   */

  int     (*close)(FAR struct file *filep);
  ssize_t (*read)(FAR struct file *filep, FAR char *buffer, size_t buflen);
  ssize_t (*write)(FAR struct file *filep, FAR const char *buffer,
                   size_t buflen);
  off_t   (*seek)(FAR struct file *filep, off_t offset, int whence);
  int     (*ioctl)(FAR struct file *filep, int cmd, unsigned long arg);

  /* The two structures need not be common after this point */

  int     (*poll)(FAR struct file *filep, struct pollfd *fds, bool setup);
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
  int     (*unlink)(FAR struct inode *inode);
#endif
};

// 与 struct file_operations 相关的数据结构
struct file
{
  int               f_oflags;   /* Open mode flags */
  off_t             f_pos;      /* File position */
  FAR struct inode *f_inode;    /* Driver or file system interface */
  FAR void         *f_priv;     /* Per file driver private data */
};

struct pollfd
{
  int fd;			/* File descriptor to poll.  */
  short int events;		/* Types of events poller cares about.  */
  short int revents;		/* Types of events that actually occurred.  */
};

struct inode
{
  FAR struct inode *i_parent;   /* Link to parent level inode */
  FAR struct inode *i_peer;     /* Link to same level inode */
  FAR struct inode *i_child;    /* Link to lower level inode */
  int16_t           i_crefs;    /* References to inode */
  uint16_t          i_flags;    /* Flags for inode */
  union inode_ops_u u;          /* Inode operations */
#ifdef CONFIG_PSEUDOFS_ATTRIBUTES
  mode_t            i_mode;     /* Access mode flags */
  uid_t             i_owner;    /* Owner */
  gid_t             i_group;    /* Group */
  struct timespec   i_atime;    /* Time of last access */
  struct timespec   i_mtime;    /* Time of last modification */
  struct timespec   i_ctime;    /* Time of last status change */
#endif
  FAR void         *i_private;  /* Per inode driver private data */
  char              i_name[1];  /* Name of inode (variable) */
};

1.1. open

要操作设备,第一步就是要打开相应的设备文件,即使用open()打开设备,其返回一个文件描述符fd。打开设备号之后对该设备的操作可以通过fd来完成。
应用中open()以设备的节点路径和操作权限为参数,操作进入VFS,调用fs_open.c中的open()函数,通过设备路径找到对应的inode节点,在进程的文件描述符链表中寻找并分配空闲可用的描述符fd和文件file,最后调用设备节点inode中的文件操作file_operation中的函数open()。应用程序调用成功时,返回本次分配的文件描述符fd,发生错误时,返回-1,错误码记录在errno中。

1.2. close

关闭设备文件,调用file_operationsclose()函数,释放设备文件、文件描述符fd

1.3. read

从设备读取数据。

  • 参数1:文件file指针
  • 参数2:数据buffer
  • 参数3:读取的buffer长度
1.4. write

往设备写数据。
参数同read

1.5. seek

查找或调整文件读写位置。

  • 参数1:文件file指针
  • 参数2:文件位置相对偏移
  • 参数3:设置位置起始点
1.6. ioctl

用于执行设备特定命令,如设置设备属性、配置设备寄存器等。

  • 参数1:文件file指针
  • 参数2: 控制命令
  • 参数3:命令参数
1.7. poll

查询指定的一组文件是否可读或可写。

首先初始化信号量,用于实现阻塞,直到文件可读或可写(亦可设置超时时间)

file_operationpoll()函数设计中,如果文件可读、写:

  1. 修改对应的pollfd中的返回事件标志为对应的事件;
  2. 释放信号量。
  • 参数1: poll_fd数组指针
  • 参数2:查询的文件数量
  • 参数3:等待时间
  • 返回正数:可读写的文件数量
  • 返回0:超时
  • 返回-1:错误
1.8. unlink

用于已挂载的设备或文件卸载,字符设备一般不涉及;常见于块设备。

2. 字符设备驱动注册、注销

Nuttx将驱动设备文件化,即VFS。
struct file_operations 设备文件操作的方法,通过register_driver接口将驱动设备挂到对应的struct inode节点中,struct inode 描述 了每个设备节点的位置和数据。当系统调用操作设备文件时,根据对应文件的inode就能索引到对应的函数。

int register_driver(FAR const char *path,
                    FAR const struct file_operations *fops,
                    mode_t mode, FAR void *priv)
{
  FAR struct inode *node;
  int ret;

  /* Insert a dummy node -- we need to hold the inode semaphore because we
   * will have a momentarily bad structure.
   */

  ret = inode_semtake();
  if (ret < 0)
    {
      return ret;
    }

  ret = inode_reserve(path, mode, &node);
  if (ret >= 0)
    {
      /* We have it, now populate it with driver specific information.
       * NOTE that the initial reference count on the new inode is zero.
       */

      INODE_SET_DRIVER(node);

      node->u.i_ops   = fops;
      node->i_private = priv;
      ret             = OK;
    }

  inode_semgive();
  return ret;
}
  • 参数1:设备路径,例如注册一个key驱动到/dev/key
  • 参数2:设备的文件操作指针,指向文件操作实例
  • 参数3:预算的设备访问权限
  • 参数4:为设备驱动传递的私有参数
  • 返回0:注册成功
  • 返回负数:注册失败,错误码
int unregister_driver(FAR const char *path)
{
  int ret;

  ret = inode_semtake();
  if (ret >= 0)
    {
      ret = inode_remove(path);
      inode_semgive();
    }

  return ret;
}
Nuttx驱动实例请看下一篇文章
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nuttx驱动(一)简介 的相关文章

  • PX4也是C++写的,而且是基于Nuttx操作系统

    PX4也是C 43 43 写的 xff0c 而且是基于Nuttx操作系统 要做PX4的二次开发估计也是用C 43 43 http shequ dimianzhan com users 84
  • nuttx和linux区别,Nuttx文件系统

    1 介绍 文件系统 xff0c 是对一个存储设备上的数据和元数据进行组织的机制 xff0c 它是操作系统管理持久性数据的子系统 xff0c 提供数据存储和访问功能 将一个文件系统与一个存储设备关联起来的过程叫做挂载 mount xff0c
  • nuttx-概述

    早期基于MSP430系列 STM32系列 EFM32系列 AT91SAM9X imx6ul系列做各种物联网产品 xff0c 近几年国芯片慢慢崛起 xff0c 加上ST芯片价格暴涨 xff0c 更是让国产芯片赢得了难得的发展机会 xff0c
  • Nuttx的源码构建和编译

    下载源码 sudo mkdir Nuttx cd Nuttx Nuttx xff1a git clone https bitbucket org nuttx nuttx gitapps xff1a git clone https bitbu
  • 为何选择nuttx

    裸机程序 xff0c 不能处理太复杂的逻辑 xff0c 系统越复杂 xff0c 越需要上os freertos 不支持posix api rtems是gpl版权 nuttx bsd版权 xff0c px4和apm开源飞控都使用nuttx 经
  • NuttX 介绍

    xff08 嵌入式 实时操作系统 rtos nuttx 7 1 xff09 NuttX 介绍 转载请注明出处 xff1a http blog csdn net zhumaill article details 24197637 1 Nutt
  • Atmel Cortex-A5跑Nuttx是如此酸爽

    开源RTOS Nuttx已经支持Atmel SAMA5系列MPU xff0c 而且看到Nuttx还支持Graphic API xff0c 决定尝试在Ateml SAMA5D3 Xplained上跑下Nuttx Nuttx是一款开源RTOS
  • Using NuttX OS as a library on Atmel Studio 7

    This document explains how to add NuttX OS to your application on Atmel Studio 7 using NuttX OS as a library With Atmel
  • PX4项目学习::(三)Nuttx操作系统

    50条消息 PX4代码解析 4 超级菜狗的博客 CSDN博客 px4代码解析
  • Nuttx驱动(一)简介

    第一次写Nuttx系统的驱动 xff0c 用惯了rt thread FreeRTOS等RTOS或裸机的驱动编写 写Nuttx驱动感觉好蹩脚 xff0c 顺便记录一下 xff08 by the way 先完成 xff0c 再完善 xff09
  • 记录ubuntu18.04下搭建nuttx RTOS的过程

    官方参考链接 xff1a https nuttx apache org docs latest quickstart install html Getting started 61 61 gt Installing 主要记录一下按照链接指导
  • 乐鑫多系列芯片支持 NuttX 和 Zephyr 操作系统

    乐鑫芯片凭借丰富的功能和广阔的应用 xff0c 在物联网市场广受欢迎 乐鑫还为用户提供了一个物联网开发框架 ESP IDF xff0c 集成大量软件组件 xff0c 包括 RTOS 外设驱动程序 网络栈和多种协议实现技术等 开发者能够在乐鑫
  • genromfs的使用及nuttx下romfs制作

    61 61 61 61 61 gt 我的博客目录导航 前言 这篇文章仅仅是为了记录如何使用genromfs制作romfs然后在nuttx上直接应用 xff0c 不会去详细介绍romfs的一系列特性 genromfs 首先去下载genromf
  • Nuttx下移植uorb笔记

    Nuttx下移植uorb笔记 之前接触过ros下的消息机制 xff08 生产者 消费者 xff09 模型 xff0c 第一感觉是灵活好用 xff0c 但是在资源有限的嵌入式环境里面 xff0c 邮箱 消息 显得就有点不那么灵活 xff0c
  • NuttX RTOS

    目录 综述 NuttX是什么 看看这些文件和功能 它怎么会是一个小小的操作系统呢 xff1f NuttX讨论组 你想谈谈NuttX的特性吗 xff1f 你需要帮助吗 xff1f 问题吗 错误吗 下载 我在哪里可以买到NuttX xff1f
  • nuttx操作系统的移植以及下载

    1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root 64 ubuntu apt get install gcc arm none eabi 编译器 3 kconfig f
  • NuttX 文件系统架构介绍(7.14)

  • nuttx操作系统的移植以及下载

    origin http blog csdn net seawolfe article details 70244672 1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root
  • 5.0 NuttX File System

    转载请注明出处 xff1a 5 0 NuttX File System Alvin Peng的博客 CSDN博客 文章均出自个人理解 前言 前一段时间折腾了几个驱动 xff08 PWM Serial I2C xff09 xff0c 这次来折
  • esp32c3 nuttx 移植 micropython 尝试

    源码来自 https github com apache incubator nuttx apps pull 840 和 https github com apache incubator nuttx apps tree 787ac9060

随机推荐

  • Ubuntu不同版本的python如何进行切换

    ubuntu系统自带的有python2 7和python3 6 xff0c 也可以下其他的 运行下面的程序 xff0c 为python赋予优先使用等级 sudo update alternatives install usr bin pyt
  • 如何计算旋转框的IOU

    一 先将两个框转换为角点形式 一般我们得到的是中心点 xff0c 宽高 xff0c 和旋转角度 通过矢量旋转公式得到角点形式 二 判断四个角点是否在对方的框里 xff0c 并保存在里面的角点 A的角点向B的相邻的两条边投影 任意的B的两条边
  • centerpoint论文和代码解读

    目录 一 序论 二 论文结构 三 代码 论文地址 xff1a https arxiv org pdf 2006 11275 pdf 代码地址 xff1a tianweiy CenterPoint github com 一 序论 centor
  • 关于严蔚敏教授的数据结构一书中return ok ,OK为1不为0的问题

    在主函数即Main 函数中的return 需要返回0 xff0c 表示成功完成本函数 但是在严教授的书中所写的多数函数 xff0c 是status函数类型 xff0c 也就是说并不是主函数 xff0c 是子函数 xff0c 原则上子函数的r
  • MTN模型LOSS均衡相关论文解读

    目录 一 综述 二 依据任务不确定性加权多任务损失 三 依据不同任务的梯度大小来动态修正其loss权重GradNorm 四 根据LOSS变化动态均衡任务权重Dynamic Weight Average xff08 DWA xff09 五 R
  • 安装ceres库的避坑指南(附官方文档)

    目录 写在前面 1 Failed to connect to ceres solver google com port 443 解决办法 xff1a 更换源 2 OpenSSL SSL read Connection was reset e
  • 一文搞清apt与apt-get的异同

    本文翻译自Difference Between apt and apt get Explained It 39 s FOSS 译者注 xff1a 本人尽量以通俗易懂的方式展现原文的内容 xff0c 限于经验和水平 xff0c 错误之处欢迎指
  • SLAM≠机器人自主定位导航

    SLAM技术作为机器人自主移动的关键技术 xff0c 让很多人都误解为 xff1a SLAM 61 机器人自主定位导航 其实 xff0c SLAM 机器人自主定位导航 xff0c 不解决行动问题 SLAM如其名一样 xff0c 主要解决的是
  • slam是什么意思?一文带你读懂SLAM

    SLAM是Simultaneous localization and mapping缩写 xff0c 意为 同步定位与建图 xff0c 主要用于解决机器人在未知环境运动时的定位与地图构建问题 xff0c 为了让大家更多的了解SLAM xff
  • 自带SLAM和定位,不需要里程计的全新建图传感器—— SLAMTEC Mapper来了

    这些年 xff0c 我们引领并见证了激光传感器行业的快速发展 xff0c 是时候 xff0c 我们来搞点新的名堂了 xff01 下面 xff0c 有请今天的主角SLAMTEC Mapper 正式登场 xff01 Slamtec Mapper
  • ROS机器人编程学习(六)——ROS工具

    第6章 ROS工具 本章介绍了ROS的实用工具 RViz 和 rqt RViz是ROS的三维可视化工具 xff0c 便于三维视图的构建和显示 rqt是GUI开发工具 xff0c 便于图像查看 xff0c 重点介绍了rqt plot rqt
  • ZED2双目相机+IMU标定

    本文主要使用了kalibr工具标定ZED2双目相机 43 IMU xff0c 并运行VINS Fusion 阐述了标定板的选择方法 xff0c 以及标定中的注意事项 ZED2双目相机 43 IMU联合标定 1 安装标定工具2 选择标定板3
  • ZED2相机运行VINS-Fusion和ORB-SLAM3

    ZED2相机运行VINS Fusion和ORB SLAM3 1 关于zed2标定2 运行VINS Fusion3 运行ORB SLAM3 1 关于zed2标定 我最开始被zed2的标定问题折磨了好久 xff0c 用kalibr工具标定出来的
  • 用自己的设备跑各种VI-SLAM算法(1)——VINS/PL-VINS/ROVIO/MSCKF

    用自己的设备跑各种VI SLAM算法 xff08 1 xff09 1 VINS Fusion2 PL VINS3 ROVIO4 MSCKF 本人用的设备是一个海康单目相机和一个MTI惯导 xff0c 已经预先用kalibr工具标定了内外参
  • 【语言-汇编】自然常数(e)的计算

    原理介绍 它就是当 时函数 值的极限 即 xff1a 同时它也等于 计算结果 编译平台 xff1a Microsoft Visual Studio 2010 项目 xff1a Win32项目 空项目 CPU xff1a Intel R Co
  • 从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导

    本节学习IMU预积分 xff0c 推导离散时间下的IMU预积分公式 xff0c 并解读相应代码 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff1a
  • 从零学习VINS-Mono/Fusion源代码(六):后端优化

    本节解析VINS后端优化 xff0c 包括优化变量 残差约束的构建 xff0c ceres求解器等 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff
  • TX2配置RealSense D455相机SDK和ros驱动

    TX2配置RealSense D455相机SDK和ros驱动 1 SDK安装2 RealSense ros安装3 bug及解决3 1 realsense viewer显示usb2 13 2 Could not found ddynamic
  • C++中:和::的含义与区别

    前言 xff1a 相信大多数读者和我一样在C 43 43 中总是分不清 xff1a 和 xff1a xff1a 的区别 xff0c 现在 xff0c 咱们就彻底解决它 一 1 类作用域操作符 指明了成员函数所属的类 如 xff1a M f
  • Nuttx驱动(一)简介

    第一次写Nuttx系统的驱动 xff0c 用惯了rt thread FreeRTOS等RTOS或裸机的驱动编写 写Nuttx驱动感觉好蹩脚 xff0c 顺便记录一下 xff08 by the way 先完成 xff0c 再完善 xff09