SylixOS热插拔驱动接口(三)

本文介绍SylixOS操作系统中的热插拔设备驱动实现原理及关键接口使用方法,包括设备驱动安装、消息传递等功能。

1. 热插拔设备驱动

    SylixOS下创建插拔消息设备,应用程序可以读取此设备来获取系统热插拔消息。

1.1 安装驱动程序

    内核线程调用hotplugDrvInstall函数安装消息设备驱动程序。

#include <SylixOS.h>
INT _hotplugDrvInstall (VOID);

    函数_hotplugDrvInstall原型分析:

  • 函数成功返回ERROR_NONE,失败返回PX_ERROR;

    驱动程序调用hotplugDrvInstall函数向系统注册设备驱动程序,同时该函数安装驱动主设备号,并为该主设备号指定驱动程序的许可证信息、驱动程序的作者信息以及驱动程序的描述信息。

    hotplugDrvInstall函数向系统注册设备驱动程序如下:

   1.打开热插拔消息设备文件

static LONG  _hotplugOpen( PLW_HOTPLUG_DEV      photplugdev,
                           PCHAR                pcName,
                           INT                  iFlags,
                           INT                  iMode);

    函数_hotplugOpen原型分析:

  • 函数成功返回(LONG)photplugfil,失败返回PX_ERROR;
  • 参数Photplugdev为热插拔消息设备;
  • 参数pcName为热插拔名称;
  • 参数iFlags为打开热插拔设备标记;
  • 参数iMode为打开热插拔设备模式。

   2.关闭热插拔消息设备文件

static  INT  _hotplugClose(PLW_HOTPLUG_FILE      photplugfil);

    函数_hotplugClose原型分析:

  • 函数成功返回ERROR_NONE,函数失败返回PX_ERROR;
  • 参数Photplugfil为热插拔消息文件。

   3.读热插拔消息设备文件

static ssize_t  _hotplugRead(   PLW_HOTPLUG_FILE   photplugfil,
                                PCHAR              pcBuffer,
                                size_t             stMaxBytes);

   函数_hotplugRead原型分析:

  • 函数成功返回读取的消息大小sstRet,函数失败返回PX_ERROR;
  • 参数Photplugfil为热插拔消息文件;
  • 参数pcBuffer为接收缓冲区;
  • 参数stMaxBytes为接收缓冲区大小。

   4.写热插拔消息设备文件

static ssize_t  _hotplugWrite(  PLW_HOTPLUG_FILE    photplugfil,
                                PCHAR               pcBuffer,
                                size_t              stNBytes);

       函数_hotplugWrite原型分析:

  • 函数默认返回PX_ERROR,SylixOS热插拔消息由设备驱动完成,用户不需要向该设备写入内容。
  • 参数Photplugfil为热插拔消息文件;
  • 参数pcBuffer为接收缓冲区;
  • 参数stNBytes为接收缓冲区大小。

   5.控制热插拔消息设备文件

static  INT  _hotplugIoctl(  PLW_HOTPLUG_FILE         photplugfil,
                             INT                      iRequest,
                             LONG                     lArg);

       函数_hotplugIoctl原型分析:

  • 函数成功返回ERROR_NONE,函数失败返回PX_ERROR;
  • 参数Photplugfil为热插拔消息文件;
  • 参数iRequest为功能参数;
  • 参数lArg为传入参数。

    SylixOS下热插拔子系统针对热插拔设备提供ioctl操作,用户在应用层对热插拔设备操作时可调用ioctl函数,根据传入参数对热插拔设备进行操作。

    热插拔设备驱动提供设备创建接口,内核线程调用_hotplugDevCreate函数创建热插拔设备。

#include <SylixOS.h>
INT _hotplugDevCreate(VOID);

       函数_hotplugDevCreate原型分析:

  • 函数返回ERROR_NONE表示创建消息设备成功,返回PX_ERROR表示创建消息设备失败;

   SylixOS定义设备与文件结构体如下:

typedef struct {
    LW_DEV_HDR           HOTPDEV_devhdrHdr;           /*  设备头                 */
    LW_SEL_WAKEUPLIST    HOTPDEV_selwulList;          /*  等待链                 */
    LW_LIST_LINE_HEADER  HOTPDEV_plineFile;           /*  打开的文件链表         */
    LW_OBJECT_HANDLE     HOTPDEV_ulMutex;             /*  互斥操作               */
} LW_HOTPLUG_DEV;
typedef LW_HOTPLUG_DEV  *PLW_HOTPLUG_DEV;
 
typedef struct {
    LW_LIST_LINE           HOTPFIL_lineManage;           /*  文件链表                */
    INT                    HOTPFIL_iFlag;                /*  打开文件的选项          */
    INT                    HOTPFIL_iMsg;                 /*  关心的热插拔信息        */
    PLW_BMSG               HOTPFIL_pbmsg;                /*  消息缓冲区              */
    LW_OBJECT_HANDLE      HOTPFIL_ulReadSync;            /*  读取同步信号量          */
} LW_HOTPLUG_FILE;
typedef LW_HOTPLUG_FILE *PLW_HOTPLUG_FILE;

   热插拔设备驱动提供_hotplugDevPutMsg函数产生一条热插拔消息。

#include <SylixOS.h>
VOID  _hotplugDevPutMsg (INT  iMsg, CPVOID pvMsg, size_t stSize);

        函数_hotplugDevPutMsg原型分析:

  • 参数iMsg表示消息类型;
  • 参数pvMsg表示需要保存的消息;
  • 参数stSize表示消息长度。

   SylixOS下系统初始化函数_SysInit中调用_hotplugInit函数初始化热插拔库。

#include <SylixOS.h>
INT  _hotplugInit(VOID)

   函数_hotplugInit原型分析:

  • 函数返回ERROR_NONE表示初始化成功,返回PX_ERROR表示初始化失败;

   函数hotplugInit初始化全局工作队列_G_jobqHotplug,创建热插拔信号量并创建热插拔内核线程,同时初始化热插拔消息设备,代码片段如下:

#if LW_CFG_DEVICE_EN > 0
   _hotplugDrvInstall();
   _hotplugDevCreate();
#endif

   SylixOS提供API_HotplugContext函数判断线程是否在hotplug处理线程中。

#include <SylixOS.h>
BOOL API_HotplugContext (VOID)

   函数API_HotplugContext原型分析:

  • 函数返回LW_TRUE表示在hotplug处理线程中,返回LW_FALSE表示不在hotplug处理线程中。

   SylixOS提供API_HotplugEvent函数,该函数将需要处理的hotplug事件加入到处理队列中。API_HotplugEvent函数原型分析见1.2.1章节中热插拔事件。

   应用程序可以直接调用该接口产生热插拔消息事件,函数原型分析见1.2.2章节中消息传递部分。

   热插拔支持提供API_HotplugPollAdd函数,从hotplug事件处理上下文中添加一个循环检测函数。函数原型分析见1.2.1章节中循环检测。

   热插拔支持提供API_HotplugPollDelete函数接口,从hotplug事件处理上下文中删除一个循环检测函数。

#include <SylixOS.h>
INT API_HotplugPollDelete (VOIDFUNCPTR  pfunc, PVOID  pvArg)

   函数API_HotplugPollDelete原型分析:

  • 该函数返回ERROR_NONE表示执行成功,返回PX_ERROR表示执行失败;
  • 参数pfunc为函数指针;
  • 参数pvArg为函数参数。

   SylixOS热插拔系统中提供接口获得热插拔消息丢失数量。

#include <SylixOS.h>
size_t API_HotplugGetLost (VOID)

   函数API_HotplugGetLost原型分析:

  • 函数返回pjobq->JOBQ_stLost为丢失信息数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值