热插拔驱动接口

更新时间:
2024-01-10
下载文档

热插拔驱动接口

热插拔设备驱动

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

安装驱动程序

内核线程调用 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 为打开热插拔设备模式。
  1. 关闭热插拔消息设备文件
static  INT  _hotplugClose(PLW_HOTPLUG_FILE      photplugfil);

函数 _hotplugClose 原型分析:

  • 函数成功返回 ERROR _NONE ,函数失败返回 PX_ERROR
  • 参数 Photplugfil 为热插拔消息文件。
  1. 读热插拔消息设备文件
static  ssize_t  _hotplugRead(PLW_HOTPLUG_FILE       photplugfil, 
                              PCHAR                  pcBuffer, 
                              size_t                 stMaxBytes);

函数 _hotplugRead 原型分析:

  • 函数成功返回读取的消息大小 sstRet ,函数失败返回 PX_ERROR
  • 参数 P hotplugfil 为热插拔消息文件。
  • 参数 pcBuffer 为接收缓冲区。
  • 参数 stMaxBytes 为接收缓冲区大小。
  1. 写热插拔消息设备文件
static  ssize_t  _hotplugWrite(PLW_HOTPLUG_FILE      photplugfil, 
                               PCHAR                 pcBuffer, 
                               size_t                stNBytes);

函数 _hotplugWrite 原型分析:

  • 函数默认返回 PX_ERROR ,SylixOS 热插拔消息由设备驱动完成,用户不需要向该设备写入内容。
  • 参数 Photplugfil 为热插拔消息文件。
  • 参数 pcBuffer 为接收缓冲区。
  • 参数 stNBytes 为接收缓冲区大小。
  1. 控制热插拔消息设备文件
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 表示消息长度。

热插拔支持

初始化 hotplug 库

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 处理线程中。

将 hotplug 事件加入处理队列

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

产生一个 hotplug 消息事件

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

加入循环检测函数

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

删除循环检测函数

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

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

函数 API_HotplugPollDelete 原型分析:

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

获得 hotplug 消息丢失数量

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

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

函数 API_HotplugGetLost 原型分析:

  • 函数返回 pjobq -> JOBQ_stLost 为丢失信息数量。
文档内容是否对您有所帮助?
有帮助
没帮助