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为丢失信息数量。