Vxworks内核驱动基本结构:

三张表:1. 系统设备表  2. 系统驱动表 3. 文件描述符表

Vxworks 内部对每个设备使用DEV_HDR 数据结构进行表示:

Typedef struct

{

   DL_NODE    node;

   Short      drvnum;

   Char       *name;

}

该结构中给出了链接指针(用以将该结构串入队列中)、驱动索引号、设备节点名称。内核提供这个结构较为简单,只存储了一些设备的关键信息。底层驱动对其驱动的设备都有一个自定义数据结构表示,其中包含了驱动设备寄存器基地址,中断号,可能的数据缓冲区,保存内核回调函数的指针,以及一些标志位。最关键的一点是DEV_HDR必须是自定义数据结构的第一个成员变量,因为这个用户自定义结构最后需要添加到系统设备队列中,必须能够在用户定义结构与DEV_HDR结构之间进行转换,而将DEV_HDR结构设置为用户自定义结构的第一个成员变量就可以达到目的。

typedef struct

{

       DEV_HDR     pFCcardHdr;

       BOOL        created;

char *      buf_virts;

       UINT32      iobase;

       UINT32      membase;

char        irq;

       UINT32      irqvec;

       UINT32      pciBus;

       UINT32      pciDevice;

       UINT32      pciFunc;

}DRV_CTRL;

注:该结构是结合本人开发定义的Pci设备结构,后面的文章将会涉及到具体的开发。

系统提供了iosDevAdd(DEV_HDR *pDevHdr, char *name, int drvnum)用于驱动程序调用注册一个设备。

第三个参数是设备对应的驱动程序索引号。这个驱动号是iosDrvInstall函数的返回值,在设备初始化函数中,我们首先调用iosDrvInstall注册驱动,然后使用iosDrvInstall 函数返回的驱动号调用 iosDevAdd添加设备到系统中

通过这两步设备就可以被用户程序使用了。

用户调用open函数打开一个设备文件时,系统将以传入的文件路径名匹配系统设备的设备节点名,匹配方式是最佳匹配。

系统驱动表:

系统驱动表包含了当前注册到I/O子系统下的所有驱动。这些驱动可以直接驱动硬件工作的驱动层。系统驱动表底层实现是一个数组,数组元素数目在内核初始化过程中指定。I/O子系统提供iosDrvInstall供驱动程序注册,iosDrvInstall原型如下:

Int iosDrvInstall

(

  FUNCPTR  pCreate,   FUNCPTR  pDelete,

  FUNCPTR  pOpen,    FUNCPTR  pClose,

  FUNCPTR  pRead,    FUNCPTR  pWrite,

  FUNCPTR  pIoctl  /*pointer to driver ioctl function*/

)

一个设备驱动在初始化过程中一方面完成硬件设备寄存器配置,另一方面就是向I/O子系统注册驱动和设备。

一个驱动并不需要实现上述所有函数,无须实现的函数直接传递NULL指针就可以了。

iosDrvInstall 函数的基本实现即遍历drvTable数组,查询一个空闲表项,用传入的函数地址对各成员变量进行初始化。

系统文件描述符表

文件描述符表表项索引被用做文件描述符ID,即open函数返回值。对于文件描述符,需要注意:标准输入、标准输出、标准错误输出虽然使用0,1,2三个文件描述符,但是可能在系统文件描述符表中只占用一个表项,即都使用同一个表项。Vxworks内核将0,1,2三个标准文件描述符与系统文件描述符表中的内容分开进行管理。

系统文件描述符中的内容主要是针对硬件设备,使用一次open函数调用就占用一个表项:

int fd = open(DevName, 2,0);

应用程序每调用一次open函数,系统文件描述符表中就增加一个有效表项,直到数组满为止。此时open函数调用将以失败返回,因此注意如果需要反复打开设备的话,一定要在设备不用的时候调用close函数关闭该描述符指向的设备,并在每次调用open函数之后检查返回的文件描述符是否合法。

用户请求服务过程

vxworks驱动开发基础相关推荐

  1. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  2. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  3. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  5. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型

    文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离

    文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...

  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想

    文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...

  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之第一个驱动

    文章目录 前言 1.Hello驱动 1.1.APP打开的文件在内核中如何表示? 1.2.打开字符设备节点时,内核中也有对应的struct file 1.3.如何编写驱动程序? 1.4.驱动程序代码 1 ...

  9. 【Android底层学习总结】1. 驱动开发基础

    0 目录 1 前言 2 驱动开发认识 2.1 驱动 2.1.1 设备驱动程序的主要功能 2.1.2 驱动程序的主要类型 2.1.3 设备文件 2.1.4 sys文件系统: 3 基础编程 3.1 内核模 ...

最新文章

  1. 【 MATLAB 】信号处理工具箱之 dct 简介及案例分析
  2. HDU 3336 Count the string KMP
  3. C++在数字N中找到精确除以N的数字的算法(附完整源码)
  4. java ltpa_SystemOut频繁输出SECJ0369E: 使用 LTPA 时认证失败
  5. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
  6. Git之pull后回退版本
  7. python-55: 验证码的生成机制
  8. Fragment懒加载(三)
  9. Python 进阶——重访 list
  10. php 中文字符串长度_php中计算中文字符串长度、截取中文字符串的函数代码
  11. 后缀数组算法概述及习题
  12. Git储藏和引用日志
  13. 大学排行榜 : qs全球世界 大学排行榜
  14. 验票证明怎么打印_纳税人证明在哪里打印
  15. 轻量级Kubernetes k3s初探
  16. 【菜鸟练习】用Java实现高尔顿瓶
  17. 金士顿内存条真假测试软件,金士顿内存条真伪怎么看?金士顿内存条判别真伪的几种方法...
  18. oracle11g64为的安装,PLSQL Developer连接不上Win7 64为系统下安装的Oracle11g64位的解决办法...
  19. ofbiz UOM Conversion Relationship Not Found [单位转化关系没有找到] 问题解决:
  20. select vba 网页 翻页_通过VBA程序来实现Excel表格翻页的方法

热门文章

  1. python中的str方法和repr方法_详解Python中__str__和__repr__方法的区别
  2. 接口 vs 类型别名
  3. useState用法指南
  4. 表单html遇到的问题及处理,Html表单中遇到的问题
  5. java 命令行 解析_如何在Java中解析命令行参数?
  6. winpcap 目的ip 是0_IP基础
  7. day03:关于惯性导航工具箱的学习与使用:use of the progen
  8. mysql_real_connect段错误,mysql的多线程安全问题:在mysql_real_connect时出现段错误。...
  9. java zip 流压缩_关于zip:检测流是否用Java压缩的最佳方法
  10. VB 窗体实现文件拖拽获取路径方法