CN102129373A - 一种基于物联网终端设备驱动程序软件设计框架的方法 - Google Patents
一种基于物联网终端设备驱动程序软件设计框架的方法 Download PDFInfo
- Publication number
- CN102129373A CN102129373A CN2011100561159A CN201110056115A CN102129373A CN 102129373 A CN102129373 A CN 102129373A CN 2011100561159 A CN2011100561159 A CN 2011100561159A CN 201110056115 A CN201110056115 A CN 201110056115A CN 102129373 A CN102129373 A CN 102129373A
- Authority
- CN
- China
- Prior art keywords
- driver
- interface
- class
- driving
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明涉及一种基于物联网终端设备驱动程序软件设计框架的方法,具体涉及一种简洁明了,方便增加新的设备驱动的软件设计结构,能很大的程度的减轻/缩短研发人员的设计方案的工作量/时间,提高系统的稳定性与可控性。框架处在操作系统内核中,却是硬件与操作系统的桥梁,向操作系统注册了驱动接口来隐藏驱动细节亦提供控制接口,这样的设计非常方便调试与驱动部署,标准简明的linux风格的控制接口也为理解软件程序,移植驱动代码打好了基础。
Description
技术领域
本发明涉及通讯技术,尤其涉及一种在手机软件开发平台上如何方便的添加驱动程序来支持新的设备的手机驱动程序软件设计框架。
背景技术
手机的发展非常迅速,手机的外部设备也越来越多,外部设备的芯片型号也非常多,致使手机软件驱动的支持也变得越来越复杂,如何快速的根据客户要求来添加一个新的外部设备的驱动支持变得非常重要,如何管理这许多外设的驱动代码,以及如何适应电源管理,适合应用开发,适合开发过程中的调试,都需要一套良好的驱动框架来支持驱动开发。
发明内容
本发明所解决的技术问题在于提供一种基于物联网终端设备驱动程序软件设计框架的方法,以解决上述背景技术中的缺点。
本发明所解决的技术问题采用以下技术方案来实现:
一种基于物联网终端设备驱动程序软件设计框架的方法,一共分成三层:具体为设备驱动信息配置层、单独的驱动层、用户使用层,其具体信息为:
设备驱动信息配置层:用户提供一个新设备的驱动支持只需要在这个配置文件中配置该驱动的设备名称的字符串宏、设备驱动结构(包含设备名称的字符串、第几号设备号,一个备用的void型指针)数组、驱动创建结构体(一个包含设备字符串名与驱动创建函数createXXX---一般用来初始化驱动类)的结构体数组。
单独的驱动层:这个层实现具体的各个驱动类,每个类实现了标准的read,write,control接口方法,以及提供一个createXXX的C函数接口(该接口使用的参数即为第一层的设备驱动结构的三个成员)。
用户使用层:使用者可以是系统层(内核层)也可以是应用层。使用者通过设备字符串来遍历第一层提供的全局结构数组找到驱动创建结构体提供的创建函数createXXX,返回第二层实例化的驱动对象指针,再用此指针使用标准的接口方法。
同时,本发明的实现还应该包含三个步骤,具体为:
一:设备描述信息与配置信息
框架以一个的设备名(宽字符串型)加上一个设备号(无符号整型)来唯一标识一个特定的设备实例。这里讲的“设备”,可以是实际存在的硬件设备实体,也可以是虚拟的设备(或称伪设备)。通常情况下,设备名标识设备的类型,而设备号标识此类设备的一个实例,此时,应该注意设备名是大小写敏感的。
所有设备名在系统中共享同一个名字空间,所以必须是全局唯一的。一个设备名只能对应到唯一一个驱动程序,系统将以设备名来匹配相应的驱动程序。设备号将被当作参数传给相应的驱动程序创建函数。一个比较特殊的设备号是DEVICENO_NONE,它表示该类设备可以由设备名直接标识,而无需使用设备号。
对系统中已经存在的设备,它们的信息静态地放入一张全局设备配置表中。内核为这张全局设备配置表维护一个以struct DeviceConfig为元素类型的数组:g_deviceConfigs,再加一个uint_t类型的全局变量:NumberOfDeviceConfigs用来指明该数组的实际长度。我们给这个结构DeviceConfig定义如下:
对于g_deviceConfigs数组中的每一项,除了以设备名加上设备号构成的设备标识信息外,还有一项void*类型的pvParameter设备信息可以被用于为该设备附加上其特有的信息。该信息项也将被当作参数传给此设备的驱动程序创建函数,其具体含义由设备实例和驱动程序创建函数两者约定。
此外,还可以通过创建标准内核功能接口:RegisterDevice()函数动态地向系统注册设备信息,其原型设计如下:
INT RegisterDevice(
const wchar_t *wszDeviceName,uint uDeviceNo,void*pvParameter);
RegisterDevice()函数的三个参数与DeviceConfig结构的三个成员是一一对应的。
对称的,框架提供了一个标准内核功能接口:UnregisterDevice()函数动态地向系统注销指定的设备信息,其原型如下:
INT UnregisterDevice(
const wchar_t*wszDeviceName,uint uDeviceNo)。
二:驱动程序接口,实现与配置
设备驱动程序以静态方式被链入内核映像文件,成为内核的一部分。与内核的其他部分一样,设备驱动程序代码在处理器特权态下执行。除了这些特征之外,它们都必须通过暴露出一个统一的接口:IDriver来提供服务。这个IDriver接口是由系统预定义的,其原型如下:
所有的内核驱动程序都提供了一致的IDriver接口,但是却以各自特定于设备的方式来解释IDriver接口的精确语义。一般而言,IDriver接口的Read()方法用于从设备中读入数据;Write()方法用于向设备写数据;而Control()方法则用于向设备发送命令、获取状态信息等等。
推荐的标准驱动程序实现方法是通过将驱动程序定义为一个特定的C++类来完成,具体步骤如下:在驱动实现文件中定义一个驱动C++类,继承自一个由系统提供的虚基类:Driver。Driver基类继承了IDriver接口,并且提供了QueryInterface()、AddRef()/Release()的缺省实现,其定义如下:
除了上面提及的QueryInterface()、AddRef()/Release()的缺省实现之外,Driver基类还定义了一个名为Dispose()的纯虚函数,必须由派生自Driver的驱动类提供实现。此函数设计为在整个对象引用计数到0的时候被调用一次。因此派生的驱动类必须在其Dispose()函数实现中根据驱动类对象的分配策略采取相应释放动作,除非派生类重载了Driver基类的AddRef()/Release()实现。当然,IDriver接口的Read()、Write()、Control()方法也必须由派生的驱动类来实现。
在此过程中,对该驱动程序类的命名没有什么特殊规定,只要不引起编译冲突就行,可以将驱动程序所对应的设备名直接拿来作为类名。
其中,定义及命名的流程包括:
①、将驱动实例相关的数据定义为该驱动类的数据成员,将该驱动类相关的数据定义为该驱动类的静态数据成员或静态全局变量。并且将驱动类本身所需的初始化和析构化动作放在该驱动类的构造和析构函数中实现。
通常情况下,驱动程序中不依赖于硬件的软件状态初始化动作应该放在驱动类的构造函数中实现。而诸如检测并初始化硬件设备的操作因为有可能会失败,则应当在创建出驱动对象后再执行。
②、定义并实现继承自IDriver接口的Read()、Write()、Control()方法(以下就简称这三个方法为RWC方法)。设备的使用者通过调用驱动程序的RWC方法来请求I/O服务,也就是说RWC方法将由请求I/O服务的线程执行。RWC方法和从RWC方法中直接间接调用到的函数皆被视为驱动程序的上半部分(top half)。下半部分是指一些需要快速执行的,不可阻塞的部分,通常为中断服务等。驱动程序的上半部分在系统模式下执行,它既可以访问一些内核数据结构,也可以访问当前线程/进程上下文。因此,在上半部分的执行过程中,可以调用Sleep()例程使自己睡眠,也可以使用同步对象;调用其他可能会被阻塞的内核功能服务(如:分配内存)也都是可以的。另外值得特别注意的一点是:如果操作系统为完全可抢占式的,驱动程序的上半部分的运行会被其他更高优先级线程所抢占。
在此过程中,如果某个驱动程序会被多个用户并发访问,必须注意做好同步工作(关抢先或使用同步对象),以避免共享数据间的竞争条件。
另外,在上文中提及的驱动程序初始化和析构化动作也属于其上半部分。
③、为驱动程序实现一个创建函数(工厂方法),负责进行驱动对象的创建和初始化。所有的驱动对象创建函数在系统中共享同一个名字空间,所以必须拥有全局唯一的名字。建议的命名规则为:“CreateDeviceName”,其中“DeviceName”部分应被替换成具体驱动程序所对应的设备名。就上例而言,可命名为:“CreateMouse”。所有驱动程序的创建函数必须是如下一致的类型:
IDriver*CreateXyz(uint_t uDeviceNo,void*pvParameter);
驱动对象创建函数接收两个参数:设备号(uDeviceNo)——指明为该类设备中具体哪一个实例创建驱动对象;设备附加信息(pvParameter)——从系统中已注册的设备信息中直接传递过来。如果创建对象并初始化成功,驱动创建函数应该直接将创建出来的对象的引用以IDriver接口指针类型返回;如果创建或初始化失败,则返回NULL。
创建函数的具体实现也与该驱动程序所要求的创建模式有关。一般情况下一个驱动程序会有多个实例。此时,可以直接运用C++的new操作符从内核堆中分配驱动对象。
另外有种比较常见的情况是:一个驱动程序仅有一个静态实例(即SINGLETON模式)。此时,该驱动对象可定义为一个静态全局变量。相应的,在该驱动类的Dispose()方法中就无需进行释放操作了。
④、将驱动程序的信息静态地放入一张全局驱动配置表中。被放入驱动配置表中的驱动程序信息只需要有驱动程序所对应的设备名和驱动对象创建函数的地址这两项即可。
此时,需要注意对于设备的最终使用者而言,虽然他实际上必须通过驱动程序来请求设备I/O服务,但是他并不特别关心设备与驱动程序两者之间有何区别。而对于系统而言,设备与驱动程序之间的区别是很明显的。理论上讲,两者都可以独立存在。只不过没有对应驱动程序的设备无法为最终用户所用;而没有对应设备的驱动程序也无法发挥它的功能。因此,驱动配置表和设备配置表在概念也是独立的。
在内核初始化阶段,系统会读取设备配置表中的设备信息。此外,用户也会通过RegisterDevice()函数动态地向系统注册设备信息。无论是通过上述哪种方法,系统一旦感知到了新设备的存在,就会立即为其寻找所对应的驱动程序(通过匹配设备名)。如果能够找到,就会通过调用此对应的驱动程序的创建函数来创建相应的驱动实例。
三:使用设备驱动程序的服务
当系统成功创建出了一个驱动实例,就会通过框架的注册机制来注册这个驱动实例的IDriver接口。被注册的服务名为:“device:DeviceNameDeviceNo”(字符串类型),其中“DeviceName”部分应被替换成此驱动实例所对应的设备名,“DeviceNo”部分应被替换成此驱动实例所对应的设备号(以十进制表示)。一个特殊情况是:当设备号为DEVICENO_NONE时,被注册的服务名直接为:“device:DeviceName”,即没有“DeviceNo”部分了,此时,服务名也是大小写敏感的。
因而,客户程序可以通过双链表或者静态数组寻找特定的设备驱动实例提供的服务。如果能够获取到驱动程序的服务接口:IDriver,就可以通过IDriver的RWC方法来请求设备的I/O服务了。
当然,找到具体的驱动对象可以由内核对象来完成,也可以由上层应用程序来完成,这些内核对象是唯一的静态对象(单身模式),可以保证硬件某一时刻只有一个对象进行操纵。
有益效果:本发明所提的手机驱动程序的软件设计框架能更好的应用在各种手机软件平台上,极大的方便架设新的手机软件平台,更符合手机软件产品整体的结构化与软件代码的工厂化,有利于软件开发。
具体实施方式
下面将分为几个部分来说明,每一个部分都将详细的说明这些动作与细节。
在实施例一中,系统中静态配置有一个鼠标设备和两个IDE控制器,那么一个可能的g_deviceConfigs和NumberOfDeviceConfigs的实现如下:
此时需要向系统中动态注册一个键盘设备,则一个可能的实现如下:
对于g_driverConfigs数组中的每一项,DriverConfig结构体的原型为:
所以配置文件如下设计,如:
此时,鼠标驱动类的定义可以如下:
此时,定义了一个函数:InitHw(),来检测并初始化鼠标硬件设备。该函数将于驱动程序的创建方法中被调用。
此时,为驱动程序实现一个创建函数(工厂方法),负责进行驱动对象的创建和初始化。所有的驱动对象创建函数在系统中共享同一个名字空间,所以必须拥有全局唯一的名字。命名规则为:“CreateMouse”,所有驱动程序的创建函数必须是如下一致的类型:
IDriver*CreateXyz(uint_t uDeviceNo,void*pvParameter);
然后进行相关对象的驱动,可以实现如下:
同时,驱动类的Dispose()方法中应该运用C++的delete操作符来删除对象,以释放内存。可以实现如下:
接着,进行鼠标驱动,可以以如下方法配置鼠标驱动程序:
uint_t numberOfConfigs=lengthof(g_driverConfigs);
接着,客户程序可以通过双链表或者静态数组寻找特定的设备驱动实例提供的服务。如果能够获取到驱动程序的服务接口:IDriver,就可以通过IDriver的RWC方法来请求设备的I/O服务了。
在本实施例中,客户程序可以实现如下:
此时,整套驱动工作即可完成,所得的效果明显,整个编程时间在两个小时内即可完成,且无报错情况出现。
以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
Claims (1)
1.一种基于物联网终端设备驱动程序软件设计框架的方法,其特征在于,所述的方法包括下列步骤:
(1)驱动设备配置层的设计
添加设备名字符串,配置设备驱动结构数组(该该数组中结构的参数作为createXXX的参数,并能起到区分设备号的作用)和驱动创建结构体数组(该二维数组由设备名做索引,后面紧跟着相应的设备创建函数createXXX)。
(2)驱动类以及接口的设计
由共同的接口IDriver来派生每个单独的驱动类,这样方便用户定义查询接口的指针类型,创建类linux的read,write,control接口,并把类创建为静态对象,通过C接口createXXX返回类指针。
(3)对使用者接口的提供
使用者通过查询静态驱动创建结构体数组或者使用双向循环链表来查询特定的设备名称字符串对应的对象指针,通过指针使用驱动接口函数。双向循环链表可以在系统初始化时候配置初始化供以后使用。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011100561159A CN102129373A (zh) | 2011-03-09 | 2011-03-09 | 一种基于物联网终端设备驱动程序软件设计框架的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011100561159A CN102129373A (zh) | 2011-03-09 | 2011-03-09 | 一种基于物联网终端设备驱动程序软件设计框架的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102129373A true CN102129373A (zh) | 2011-07-20 |
Family
ID=44267464
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011100561159A Pending CN102129373A (zh) | 2011-03-09 | 2011-03-09 | 一种基于物联网终端设备驱动程序软件设计框架的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102129373A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102841798A (zh) * | 2012-03-30 | 2012-12-26 | 广东步步高电子工业有限公司 | 一种提高软件驱动兼容性的方法 |
CN104932926A (zh) * | 2015-07-09 | 2015-09-23 | 上海联彤网络通讯技术有限公司 | 智能操作系统平台中实现设备与驱动动态匹配的系统及方法 |
CN104954466A (zh) * | 2015-06-16 | 2015-09-30 | 南京邮电大学 | 一种基于软件定义的物联网智慧服务系统 |
CN105068792A (zh) * | 2015-07-15 | 2015-11-18 | 上海斐讯数据通信技术有限公司 | 一种驱动设备管理方法及嵌入式系统 |
CN105204383A (zh) * | 2015-08-11 | 2015-12-30 | 中国航空工业集团公司西安飞机设计研究所 | 应用伺服系统的生成方法和装置 |
CN107291554A (zh) * | 2013-12-18 | 2017-10-24 | 深圳市道通科技股份有限公司 | 硬件资源动态分配的实现方法及装置 |
CN109240751A (zh) * | 2018-09-04 | 2019-01-18 | 广东小天才科技有限公司 | 一种电子设备的外围模组兼容方法及电子设备 |
CN112859757A (zh) * | 2019-11-27 | 2021-05-28 | 宁波舜宇智能科技有限公司 | 边缘计算控制方法、装置、边缘计算机和可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050197824A1 (en) * | 2002-08-21 | 2005-09-08 | Van Dalen Rokus H.J. | Object-oriented design method for the time-effective and cost-effective development of production-grade embedded systems based on a standardized system architecture |
CN1932776A (zh) * | 2006-09-29 | 2007-03-21 | 上海科泰世纪科技有限公司 | 嵌入式操作系统中接口测试的自动化运行方法 |
CN101256752A (zh) * | 2008-03-31 | 2008-09-03 | 深圳创维-Rgb电子有限公司 | 一种自动配置lcd驱动程序的方法及装置 |
-
2011
- 2011-03-09 CN CN2011100561159A patent/CN102129373A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050197824A1 (en) * | 2002-08-21 | 2005-09-08 | Van Dalen Rokus H.J. | Object-oriented design method for the time-effective and cost-effective development of production-grade embedded systems based on a standardized system architecture |
CN1932776A (zh) * | 2006-09-29 | 2007-03-21 | 上海科泰世纪科技有限公司 | 嵌入式操作系统中接口测试的自动化运行方法 |
CN101256752A (zh) * | 2008-03-31 | 2008-09-03 | 深圳创维-Rgb电子有限公司 | 一种自动配置lcd驱动程序的方法及装置 |
Non-Patent Citations (1)
Title |
---|
郑任持 等: "一种新型的基于构件和微内核的设备驱动模型", 《计算机工程与应用》 * |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102841798A (zh) * | 2012-03-30 | 2012-12-26 | 广东步步高电子工业有限公司 | 一种提高软件驱动兼容性的方法 |
CN102841798B (zh) * | 2012-03-30 | 2016-08-24 | 维沃移动通信有限公司 | 一种提高软件驱动兼容性的方法 |
CN107291554A (zh) * | 2013-12-18 | 2017-10-24 | 深圳市道通科技股份有限公司 | 硬件资源动态分配的实现方法及装置 |
CN104954466A (zh) * | 2015-06-16 | 2015-09-30 | 南京邮电大学 | 一种基于软件定义的物联网智慧服务系统 |
CN104954466B (zh) * | 2015-06-16 | 2018-06-05 | 南京邮电大学 | 一种基于软件定义的物联网智慧服务系统 |
CN104932926B (zh) * | 2015-07-09 | 2018-01-12 | 上海联彤网络通讯技术有限公司 | 智能操作系统平台中实现设备与驱动动态匹配的系统及方法 |
CN104932926A (zh) * | 2015-07-09 | 2015-09-23 | 上海联彤网络通讯技术有限公司 | 智能操作系统平台中实现设备与驱动动态匹配的系统及方法 |
CN105068792A (zh) * | 2015-07-15 | 2015-11-18 | 上海斐讯数据通信技术有限公司 | 一种驱动设备管理方法及嵌入式系统 |
CN105068792B (zh) * | 2015-07-15 | 2018-03-02 | 上海斐讯数据通信技术有限公司 | 一种驱动设备管理方法及嵌入式系统 |
CN105204383B (zh) * | 2015-08-11 | 2018-03-02 | 中国航空工业集团公司西安飞机设计研究所 | 应用伺服系统的生成方法和装置 |
CN105204383A (zh) * | 2015-08-11 | 2015-12-30 | 中国航空工业集团公司西安飞机设计研究所 | 应用伺服系统的生成方法和装置 |
CN109240751A (zh) * | 2018-09-04 | 2019-01-18 | 广东小天才科技有限公司 | 一种电子设备的外围模组兼容方法及电子设备 |
CN112859757A (zh) * | 2019-11-27 | 2021-05-28 | 宁波舜宇智能科技有限公司 | 边缘计算控制方法、装置、边缘计算机和可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102129373A (zh) | 一种基于物联网终端设备驱动程序软件设计框架的方法 | |
CN100570565C (zh) | 在管理程序中提供基于策略的操作系统服务的方法和系统 | |
Rosenberg et al. | An end-to-end approach for QoS-aware service composition | |
Sugihara et al. | Programming models for sensor networks: A survey | |
EP3030969B1 (en) | Automated application test system | |
TWI333621B (en) | Facilitating allocation of resources in a heterogeneous computing environment | |
US7757204B2 (en) | Limiting extensibility of a visual modeling language | |
US10200247B2 (en) | First-class component extensions for multi-tenant environments | |
US8689174B2 (en) | Extensibility of pattern components | |
JP7112809B2 (ja) | ロボティックプロセスオートメーションのためのロボットのスケジューリング | |
US20120036252A1 (en) | Osgi-based heterogeneous service integrating system and method | |
CN102479100B (zh) | 一种普适计算环境虚拟机平台及其创建方法 | |
US10585653B2 (en) | Declarative programming model with a native programming language | |
US20170192761A1 (en) | Dynamic data and compute resource elasticity | |
CN103282883A (zh) | 在webtop应用托盘中显示安卓应用启动器的系统和方法 | |
EP2625600A1 (en) | Runtime agnostic representation of user code for execution with selected execution runtime | |
US20090112966A1 (en) | Assignment of application modulesto deployment targets | |
US20090049105A1 (en) | Extensible dependency management framework and method | |
Wang et al. | Transformer: a new paradigm for building data-parallel programming models | |
Gupta et al. | Spring Web MVC Framework for rapid open source J2EE application development: a case study | |
US20110214092A1 (en) | System and Method for Management of User Interactions Using Configurable Listeners in a Data Processing System | |
US11294901B1 (en) | Isolating the performance of functions included in queries | |
US8473954B2 (en) | Executing operations via asynchronous programming model | |
US11169986B1 (en) | Configurable commit in a content management system | |
JP2010531508A (ja) | 割り込み処理 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20110720 |