VxWorks驱动移植基础知识
VxWorks驱动架构:
一、在最新发布的VxWorks6.x版本中,devicedriver可以通过两种方式来实现
1、 VxBus-enabled devicedrivers
这种架构下编写的driver为OS和设备定义了一系列标准接口来和driver交互
2、as legacy(pre-VxBus) device drivers
这种结构下编写的驱动没有为OS和设备提供标准接口
VxBus驱动:
什么是VxBus
(类似Linux的设备树):总体上来说,它是指一种在最小BSP的支持下,为VxWorks中的设备驱动提供支持的特定框架。包括以下几点功能:
1) 提供设备驱动匹配设备的功能。
2) 提供驱动获取硬件设备的机制。
3) 提供软件环境的其他部分访问设备的功能。
4) 其他为了在VxWorks系统中把设备驱动封装为函数需要的函数(and other functionality required in order for device drivers to befunctional in a VxWorks system.)
另外VxBus有时候也指VxWorks操作系统的一系列通过workbench使用的Component,core VxBusfunctionality是一个Component,每个VxBus驱动也都是一个Component,VxBus支持的模块也是Component,每个Component可以单独的在workbench中选择。在VxWorks6.2版本以前设备驱动还没有整合到VxWorks工程配置中,每次添加或者去除支持都需要通知BSP和驱动,这样在添加或者删除驱动时需要更多精力来管理工程,VxWorks6.2版本以后就不需要这些操作。
VxBus驱动与设备的匹配:
1. 首先VxBus确定注册的bus type是否与设备所在的bus相同
3. 最后,如果驱动提供了Probe函数,这个函数会被调用来让驱动验证是否能和被发现的硬件正常工作。
第一步和第三步通常没有变化,然而根据bus_type的不同,第二步的变化会很大
当使用一个驱动函数的时候,发出申请的模块会去查询一个或者全部instance,这个请求可以是请求如何完成一个动作的信息也可能是一些驱动执行某些动作的请求。
图中的middleware是指VxWorks的中间件,中间件是介于操作系统和应用程序之间的一个软件层,运行于操作系统上。
设备驱动注意点:参考《vxworks_device_driver_developers_guide_vol1_6.7》
实时性和内存分配(codesize)都是VxWorks驱动考虑的重要部分
VxBus设备驱动初始化阶段
1、Driver Initialization Sequence
Device drivers do not play any role in the early boot process.Depending on which
processor architecture you are working with, the CPU typically jumpsto a
specified address at power-on and starts executing instructions.Those instructions
typically come from ROM or flash.
These early instructions initialize the memory controller and CPU,then start the
procedure for initializing VxWorks.
sysHwInit()是在BSP提供的函数,他在系统初始化上一阶段被调用,然后调用hardWareInterFaceInit():vxbUsrCmdLine.c(target\config\all) 399510 2016/8/4 星期四。hardWareInterFaceInit()函数首先初始化硬件内存申请机制,它在系统内存池初始化完成之前为设备驱动的内存申请提供了上下限。
然后调用hardWareInterFaceBusInit()函数,这时个别驱动通过注册到VxBus上,已经被激活。
首先被激活的驱动之一是PLB(processor local bus)设备驱动.
3、 driver registration with the OS
在设备和驱动匹配成功形成一个instance后,VxWorks会检查在驱动调用vxbDevRegister()时提供的注册结构体。
After all drivers have registered with VxWorks, thehardWareInterFaceBusInit( )
and hardWareInterFaceInit( ) routines return, sysHwInit( ) completesany
non-VxBus driver initialization and returns. After sysHwInit( ) iscomplete, the
VxWorks kernel is initialized. The next phase of VxBusinitialization occurs in
6、 phase 2, post-kernel initialization
By this point, kernel services are initialized and are accessible toyour driver.
7、 phase 3, asynchronous initialization
通过代码查看实际的初始化过程是这样的(以vxbOmap35xxIntCtlr中断控制器为例):
void sysHwInit (void)--> hardWareInterFaceInit ();--> hardWareInterFaceBusInit();--> vxbOmap35xxIntCtlrRegister();--> vxbDevRegister(struct vxbDevRegInfo *)&omapIntCtlrDevRegistration); vxbDevRegister()函数定定义在VxBus.c文件中
|
VxBus设备驱动编写步骤
installDir/vxworks-6.x/target/3rdparty //供应商或者用户编写的驱动
installDir/vxworks-6.x/target/src/hwif //windriver公司提供的驱动
installDir/vxworks-6.x/target/src/drv
a driver source file—implements the runtime logic of the driver driver source file是实现设备驱动的逻辑函数,一个设备驱动可以包含一个或者多个头文件,也可以包含多个源文件,具体的设备驱动架构参考《VxWorks设备驱动架构.docx》 |
a component description file (CDF) 关于CDF文件介绍及如何创建CDF参考《关于Component Description File.docx》 |
Driver Configuration Stub Files 对于一些BSP,VxWorks提供了两种不同的方式创建run_time镜像 (1) 使用workbench或者命令行创建image (2) 将make命令直接放在BSP目录下。 第一种方法支持所有的BSP 第二种方法允许你通过将make命令加入到BSP目录下的方式创建image,在BSP是通过自己的Makefile创建的情况下,在驱动的CDF下的配置信息不会被用来配置BSP,因而,BSP作者需要直接在BSP源码目录下通过添加或者删除component,通过在BSP的config.h文件中指定添加或者删除哪些component。 例如:如果你想在run-time镜像中添加CN3xxx timer driver,你可以在config.h文件中添加一行: #define DRV_TIMER_CN3XXX 注意:这种方法直接忽视了CN3xxx timer driver依赖其他component,如果CN3xxx timer driver也依赖别别的component,那么也需要在config.h中包含。 为了支持直接通过BSP创建driver,还必须添加两个配置文件 a driverName.dc file a driverName.dr file 这两个文件链接设备驱动和BSP命令行。 依然使用Cn3xxx timer driver 作为例子,那么就有vxbCn3xxxTimer.dc文件: IMPORT void vxbCn3xxxTimerDrvRegister(); 这个文件的目的是为设备驱动注册提供函数原型。 vxbCn3xxxTimer.dc文件也有相似的描述: #ifdef DRV_TIMER_CN3XXX vxbCn3xxxTimerDrvRegister (); #endif /* DRV_TIMER_CN3XXX */ 这个文件的目的是调用驱动注册函数,这个函数必须要通过#ifdef/#endif包围以来保证注册函数只有在config.h中包含了才能执行。 对于windriver驱动,.dr和.dc文件都放在target/config/comps/src/hwif 对于第三方驱动,这两个文件放在相应的驱动源文件目录中。 为了使得这两个文件有效,必须将它们合并到初始化文件中,VxWorks的makefile环境包含所有创建这个初始化文件必须的命令,如果在VxWorks的源码树上添加了一个新的驱动,初始化文件必须按照如下重新创建。 在命令行输入: % cd installDir/vxworks-6.x/target/config/comps/src/hwif % make vxbUsrCmdLine.c 运行上述命令后,VxWorks的Makefile会搜索所有的驱动配置文件,最后将其整合到target/config/all/目录下的vxbUsrCmdLine.c文件中。 |
a README file—provides versioning information |
a makefile (Makefile)—provides the make rules used to build the driver 为了使得设备驱动能够在VxWorks下正确的被编译,必须提供一个相应的Makefile使得你的设备驱动能够被整合到可以被链接到VxWorks的镜像的目标文件中,需要两个Makefile: 1、设备供应商的Makefile installDir/vxworks-6.x/target/3rdparty/vendor/ 2、设备驱动的Makefile installDir/vxworks-6.x/target/3rdparty/vendor/driver/ Makefile的内容可能比较复杂,可以拷贝相近的示例Makefile,然后修改 |
VxWorks驱动移植基础知识相关推荐
- NandFlash驱动移植基础知识
NandFlash驱动移植基础知识 文章借鉴博文:http://blog.csdn.net/leibniz_zsu/article/details/4977842 博文写的不错,谢谢分享 MTD 驱动 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用
文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架
文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树
文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型
文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离
文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之第一个驱动
文章目录 前言 1.Hello驱动 1.1.APP打开的文件在内核中如何表示? 1.2.打开字符设备节点时,内核中也有对应的struct file 1.3.如何编写驱动程序? 1.4.驱动程序代码 1 ...
最新文章
- MySQL 大表优化方案
- ORACLE 几个我忍了他很多年的问题
- springcloud 相同服务名_Spring 微服务从入门到入土
- 网页快照是什么?对SEO优化有什么作用?
- PLSQLDeveloper SQL查询内容中文显示乱码
- jenkins docker 自动部署 构建_jenkins+docker+vue项目的自动部署环境
- ajax请求接口连不上会报错吗_服务端有异常, 导致: Ajax 请求报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING...
- linux内核PID管理
- Java基础学习总结(111)——Java虚拟机JVM总结大全
- LinkedList和ArrayList异同
- 计算机应用0006作业2,〔计算机应用基本0006〕14秋在线作业2.doc
- 【人工智能】一文读懂人脸识别技术
- msgbox php,VBA消息框(MsgBox)
- 组态王——创建协议组件失败
- Unity手游制作记-制作通用镜头控制器
- session是什么
- 基于UGUI实现类似Excel表格功能
- PC机上的COM1口和COM2口
- JMS JMS背景 概述 JMS术语
- 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(1)——鸟头定理
热门文章
- STM32应用开发实践教程:环境光照强度监测的应用开发
- @sun.misc.Contended 伪共享
- Spring微服务实战第9章 使用Spring Cloud Sleuth和Zipkin进行分布式跟踪
- 对抗性自动编码器系列--自动编码器AutoEncoder的原理及实现-手写数字的重建
- 正厚知识 | 你被关在信息茧房中吗?
- chrome(谷歌)登录失败解决方案
- Rtools安装方法
- 讨厌领导又不想辞职,程序员惊现神操作:把领导推荐给猎头挖走了
- 计算机网络(四)-奈氏准则和香农公式
- 楼上常深夜响动,女子多次沟通无果,搭10个鞋盒放音箱“反击”