QNX操作系统是一个类Unix实时操作系统,遵从POSIX规范,驱动程序具有良好的可移植性。

编写任何驱动程序都会遇到同样的一个问题:应用程序与驱动程序之间是如何进行交互的。其实这个问题很简单,QNX有大量资料说明这一点。

当客户端调用fd = open(“dev/mydevice”,O_RDWR)打开设备mydevice,并期望从设定的地址上读写数据时,这个问题就产生了。实际上QNX提供了一套灵活的消息交互机制,大致上可以分为以下三个步骤:

第一,加载驱动程序,创建服务线程,把底层IO函数与POSIX函数进行连接,在命名空间注册设备名,通过Event loop或Thread

pool等待消息的接收,同时使父进程在后台运行以加载其他应用程序。

第二,当应用程序调用open()函数时,process manger受到请求在命名空间中找到名为dev/mydevice的resource

manger,QNX内核库打开它,应用程序通过返回的句柄与之建立连接。

第三,随后当调用read (fd, buf, 512)函数时,内核库发送了一个_IO_READ的消息,此时之前建立的Event loop或Thread

pool就可以接收到这个消息,通过判断消息的类型调用到相应的IO函数,比如:

int io_read (resmgr_context_t *ctp,  io_read_t *msgRESMGR_OCB_T*ocb);

其实可以看出来了,fd, buf, 512这几个参数主要就是通过io_read_t *msg这个参数传过来的。其实client主要指定了一个设备,希望向这个设备的某个地址读取长度为512字节的数据,然后放到buf当中。

接下来发生的事情就比较简单了,就是在自己实现的io_read函数中解析这个消息传递来的参数,并给出回复。在client-server消息交互模型中,此时client就处在了reply

blocked的状态等待server的回复。在io_read中做了哪些事情呢?首先要验证下传来的消息是否是正确的io_read消息,同时检查到底是否是nonblock方式打开。然后解析msg->i.nbytes来确定需要传递多少个数据,然后调用底层函数读取硬件数据,通过_IO_SET_READ_NBYTES

(ctp, msg->i.nbytes);来告诉client可以返回的数据量。

对于如何回复数据来说,QNX确实提供了不少简单的方法。可以使用return(ENOMEM)返回一个错误;或者使用return(EOK)返回操作成功。如果想返回一定量数据的话,可以设置IOV数组返回,

比如通过设置IOV来返回一个或多个数组,比如:

SETIOV (ctp->iov, buffer, nbytes);

return (_RESMGR_NPARTS(1));

或者直接调用宏返回一个完整的buffer:

return (_RESMGR_PTR(ctp, buffer, nbytes));

写数据的操作与读数据的操作类似,不再赘述。这样就完成了上层数据请求,下层数据读取并返回的过程,server重新回到receive blocked的状态。细心的朋友可能已经看出来了,既然是读写数据,那么地址是如何设置的呢?其实是通过devctl来设置的,其格式为

int devctl( int fd, int dcmd, void *data, size_t nbytes, int * return_info);

其中最值得一提的就是int dcmd这个参数,这是一个自定义的命令,可以通过这个命令传递一个结构体指针,比如:

Typedef struct{

Uint32_t addr_t;

Uint32_t status_r;

} my_cfg_t;

#define MYCMD_SET_ADDR  __DIOT(_DCMD_MISC, 0x01, my_cfg_t)

在client应用程序中定义my_cfg_t addr;通过命令

Devctl(fd, MYCMD_SET_ADDR,& addr,sizeof(my_cfg_t),NULL);

完成设置。对于底层来说就比较简单了,主要分为获取数据指针,解析传来的命令获得数据就可以了。

qnx 设备驱动开发_QNX驱动开发——应用层与resource manger交互 | 学步园相关推荐

  1. java调用hp打印机驱动_惠普打印机驱动修改JDK问题–现象:javac不能用了 | 学步园...

    机器上安装有JDK,然后在其上安装hp LaserJet 1300 PCL 6的驱动程序,一切正常,可以打印,也可以用javac编译文件. 重新启动机器后,发现javac不能用了,提示为:Error: ...

  2. s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(一 硬件驱动层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44303069 本文章是记录Android开发中驱动层.HAL层.应用层 ...

  3. Android应用开发 led 驱动层 hal硬件抽象层 应用层 详细教程记录(含源码)

    本篇文章是为了能够更好的搜索到介绍驱动到应用的详细介绍文章. 关于驱动层 hal硬件抽象层 应用层请参考s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录系列, ...

  4. Linux 设备驱动开发思想 —— 驱动分层与驱动分离

    前面我们学习I2C.USB.SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是: 1.XXX 设备驱动 2.XXX 核心层 3.XXX 主机控制器驱动 而需要我们编 ...

  5. iTOP-iMX6开发板-设备树内核-注册驱动例程

    本文档主要讲解在迅为iTOP-iMX6Q/D/PLUS 开发板的设备树内核(4.1.15)源码中,设备树注册 驱动和非设备树的类似. 1 注册驱动源码分析 设备树的内核驱动中,platform_dri ...

  6. <Linux开发>--驱动开发-- 字符设备驱动(3) 过程详细记录

    <Linux开发>–驱动开发-- 字符设备驱动(3) 过程详细记录 驱动开发是建立再系统之上的,前面作者也记录了系统移植的过程记录,如果有兴趣,可进入博主的主页查看相关文章,这里就不添加链 ...

  7. S3C2440 开发板实战(7):字符设备驱动框架+LED驱动

    在学习驱动的时候我遇到了很多问题,所以我的学习路线是这样的: 编写驱动发现.ko文件需要放入开发板的目录中,然后就学习通过nfs创建共享文件,在配置nfs时发现网络没有连接上,所以就学习怎样配置IP地 ...

  8. 字符设备驱动基础-linux驱动开发第2部分-朱有鹏-专题视频课程

    字符设备驱动基础-linux驱动开发第2部分-5673人已学习 课程介绍         本课程是linux驱动开发的第2个课程,从零开始带领大家逐渐熟悉内核模块,并且一步步写出一个字符设备驱动程序来 ...

  9. linux设备驱动模型-linux驱动开发第5部分-朱有鹏-专题视频课程

    linux设备驱动模型-linux驱动开发第5部分-4285人已学习 课程介绍         本课程是linux驱动开发的第5个课程,主要内容是linux的设备驱动模型,包括总线.类.设备.驱动等概 ...

最新文章

  1. 正式环境docker部署hyperf_应用部署 - Docker Swarm 集群搭建 - 《Hyperf v1.1.1 开发文档》 - 书栈网 · BookStack...
  2. Spring MVC实现Spring Security,Spring Stomp websocket Jetty嵌入式运行
  3. 手把手教你用EVO工具评估SLAM数据集TUM、KITTI、EuRoC(附代码)
  4. vim显示行号、多行复制和删除
  5. Python连接telnet客户端连接服务端程序
  6. 标准化设计解决方案 - 标记语言和样式手册 表单
  7. js系列教程9-表单元素全解
  8. C#读取匿名对象的属性值的方法总结
  9. 哪里可以免费下SketchUp草图插件?
  10. 使用apt更新和升级系统软件
  11. python:BeautifulSoup解析爬取网页文章demo
  12. 二分算法——二分法求方程的根
  13. 轻松学编曲,论FL钢琴卷帘
  14. ssh 提示Connection closed by * 的解决方案
  15. 联想小娜怎么开启_Win10下小娜打不开的解决方法
  16. 51单片机的1T和12T的区别
  17. 预约快递取件接口API对接demo
  18. 花两万学的python,总结了一点初学者的小技巧,免费送给大家
  19. 时间固定效应和个体固定效应的选择_STATA固定效应的时间固定和个体固定效应估计方法、检验策略和操作步骤...
  20. html可向下延伸输入框,转载 div下上自动延伸的

热门文章

  1. java 字段构造函数_依赖注入–字段vs构造函数vs方法
  2. Java中的观察者设计模式
  3. java word批注_使用反射处理Java批注
  4. gradle引入依赖:_Gradle入门:依赖管理
  5. 重新开始Java的原始字符串文字讨论
  6. Spring中@ Component,@ Service,@ Controller和@Repository之间的区别
  7. aws s3 命令行_通过命令行界面使用AWS ElasticMapReduce
  8. jenkins api_接触Jenkins(Hudson)API,第2部分
  9. Apache Storm的实时情绪分析示例
  10. apache.camel_Apache Camel 2.9发布–十大变化