热插拔驱动接口
热插拔设备驱动
SylixOS 下创建插拔消息设备,应用程序可以读取此设备来获取系统热插拔消息。
安装驱动程序
内核线程调用 hotplugDrvInstall 函数安装消息设备驱动程序。
#include <SylixOS.h>
INT _hotplugDrvInstall(VOID);
函数 _hotplugDrvInstall 原型分析:
- 函数成功返回 ERROR_NONE ,失败返回 PX_ERROR 。
驱动程序调用 hotplugDrvInstall 函数向系统注册设备驱动程序,同时该函数安装驱动主设备号,并为该主设备号指定驱动程序的许可证信息、驱动程序的作者信息以及驱动程序的描述信息。
hotplugDrvInstall 函数向系统注册设备驱动程序如下:
- 打开热插拔消息设备文件
static LONG _hotplugOpen(PLW_HOTPLUG_DEV photplugdev,
PCHAR pcName,
INT iFlags,
INT iMode);
函数 _hotplugOpen 原型分析:
- 函数成功返回 (LONG)photplugfil ,失败返回 PX_ERROR 。
- 参数 Photplugdev 为热插拔消息设备。
- 参数 pcName 为热插拔名称。
- 参数 iFlags 为打开热插拔设备标记。
- 参数 iMode 为打开热插拔设备模式。
- 关闭热插拔消息设备文件
static INT _hotplugClose(PLW_HOTPLUG_FILE photplugfil);
函数 _hotplugClose 原型分析:
- 函数成功返回 ERROR _NONE ,函数失败返回 PX_ERROR 。
- 参数 Photplugfil 为热插拔消息文件。
- 读热插拔消息设备文件
static ssize_t _hotplugRead(PLW_HOTPLUG_FILE photplugfil,
PCHAR pcBuffer,
size_t stMaxBytes);
函数 _hotplugRead 原型分析:
- 函数成功返回读取的消息大小 sstRet ,函数失败返回 PX_ERROR ; 。
- 参数 P hotplugfil 为热插拔消息文件。
- 参数 pcBuffer 为接收缓冲区。
- 参数 stMaxBytes 为接收缓冲区大小。
- 写热插拔消息设备文件
static ssize_t _hotplugWrite(PLW_HOTPLUG_FILE photplugfil,
PCHAR pcBuffer,
size_t stNBytes);
函数 _hotplugWrite 原型分析:
- 函数默认返回 PX_ERROR ,SylixOS 热插拔消息由设备驱动完成,用户不需要向该设备写入内容。
- 参数 Photplugfil 为热插拔消息文件。
- 参数 pcBuffer 为接收缓冲区。
- 参数 stNBytes 为接收缓冲区大小。
- 控制热插拔消息设备文件
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 为丢失信息数量。