第一次写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_OPERATIONSint     (*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_ATTRIBUTESmode_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 */
#endifFAR 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驱动实例请看下一篇文章

Nuttx驱动(一)简介相关推荐

  1. Nuttx驱动(二)实例

    接上一篇文章,这篇主要是nuttx驱动编写实践部分.基础部分请移驾<Nuttx驱动(一)简介> Nuttx驱动例程 在该例程中,假设有这么一个设备:有3个IO输出和一个IO输入的RGB_L ...

  2. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

  3. Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 阅读数:5070 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. ...

  4. linux驱动开发简介

    一.linux驱动开发简介 1.linux驱动和裸板驱动的异同 裸板驱动像写英语作文 linux驱动程序像做英语完形填空 2.linux下驱动程序开发需要具备的 硬件基础 能看懂电路原理图 阅读芯片的 ...

  5. 嵌入式linux设备驱动开发,嵌入式Linux设备驱动开发简介.pdf

    清远见--嵌入式培训专家 http :// "黑色经典"系列之<嵌入式Linux 应用程序开发详解> 11 章 嵌入式Linux 设备驱动开发 本章目标 本书从 6 章 ...

  6. ARM Linux驱动开发简介

    一.Linux驱动分类 Linux的驱动主要分为三种,分别为字符设备驱动.块设备驱动.网络设备驱动.其中字符设备驱动是最多的一类驱动,因为字符设备最多,从最简单的点灯到I2C.SPI.音频等都属于字符 ...

  7. 大话领域驱动设计——简介

    如果说当下最热门的技术概念或架构思想,那么领域驱动设计(DDD)一定占有一席之地. 上个系列,我讲了ABP vNext框架在微服务架构下的落地思路,而ABP vNext是基于DDD思想的完整框架之一, ...

  8. linux无线驱动接口简介

    http://blog.csdn.net/dickjtk/article/details/11862815 在分析wpa_supplicant软件linux版本下无线驱动事件和无线驱动配置代码之前,先 ...

  9. DDD领域驱动设计简介

    1.起源及阶段 2003年由Eric Evans完成了<Domain-Driver Design Tacking Complexity in the Heart of Software>一 ...

最新文章

  1. Python 正则匹配(re)组的应用
  2. 神策数据关海南:营销策略引擎解读,以平台化构建营销新生态
  3. ITK:应用SIN图像过滤器
  4. 常用的函数式接口_Function接口_默认方法andThen
  5. lnmp无法远程连接mysql_MySQL(一):设置root 可以远程连接MySQL
  6. 尚学堂java培训_IT培训教育平台课程分享
  7. 技术晨读_20160215
  8. 分水岭算法 matlab实现
  9. python零基础教学plc_Python从基础到开发精修全面学习视频教程
  10. itunes备份是整个手机备份吗_iTunes备份道理我都懂,但我依然不想备份的?
  11. 华为OD机试题:按区间反转文章片段
  12. 用matlab画出ex,如何用matlab画函数图形
  13. Java代码安装maven jar_Java中Maven项目导出jar包配置的示例代码
  14. Bellman——Ford算法
  15. 游戏制作之路(25)Camera(摄像机)的清除标志Solid color
  16. python怎么用散点图_Python利用matplotlib绘制散点图的新手教程
  17. Activity基础 - 任务栈
  18. Linux系统 | vim配置
  19. Alpha多样性之箱线图解读
  20. 【Linux】复制文件到当前目录 复制文件并重命名到当前目录

热门文章

  1. Comsol Multiphysics 粉末冶金过程计算机仿真
  2. iOS AR之视频特效挂件(GPUImage)
  3. 解决引入xm-select,报 xmSelect is not defined
  4. macbook 上怎样截图,以及对截图进行编辑
  5. 详解win10任务视图快捷键是什么
  6. 成为程序员/码农有哪些要求?
  7. 【selenium】关于cookie的操作和无头模式
  8. 面对“烟囱式”难题,联想企业网盘展现跨时空延展能力
  9. 如何进行拍照翻译?这几款软件能拍照翻译哦
  10. Windows驱动_WFP之一WFP是什么