winpr-comm: got IOCTL_SERIAL_SET_RTS / IOCTL_SERIAL_CLR_RTS
This commit is contained in:
parent
7684ff7bd4
commit
881370a338
@ -357,6 +357,22 @@ BOOL CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffe
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IOCTL_SERIAL_SET_RTS:
|
||||||
|
{
|
||||||
|
if (pRemoteSerialDriver->set_rts)
|
||||||
|
{
|
||||||
|
return pRemoteSerialDriver->set_rts(pComm);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IOCTL_SERIAL_CLR_RTS:
|
||||||
|
{
|
||||||
|
if (pRemoteSerialDriver->clear_rts)
|
||||||
|
{
|
||||||
|
return pRemoteSerialDriver->clear_rts(pComm);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_WARN(_T("unsupported IoControlCode: Ox%0.8x (remote serial driver: %s)"), dwIoControlCode, pRemoteSerialDriver->name);
|
DEBUG_WARN(_T("unsupported IoControlCode: Ox%0.8x (remote serial driver: %s)"), dwIoControlCode, pRemoteSerialDriver->name);
|
||||||
|
@ -55,8 +55,8 @@ extern "C" {
|
|||||||
#define IOCTL_SERIAL_SET_DTR 0x001B0024
|
#define IOCTL_SERIAL_SET_DTR 0x001B0024
|
||||||
#define IOCTL_SERIAL_CLR_DTR 0x001B0028
|
#define IOCTL_SERIAL_CLR_DTR 0x001B0028
|
||||||
/* IOCTL_SERIAL_RESET_DEVICE 0x001B002C */
|
/* IOCTL_SERIAL_RESET_DEVICE 0x001B002C */
|
||||||
/* IOCTL_SERIAL_SET_RTS 0x001B0030 */
|
#define IOCTL_SERIAL_SET_RTS 0x001B0030
|
||||||
/* IOCTL_SERIAL_CLR_RTS 0x001B0034 */
|
#define IOCTL_SERIAL_CLR_RTS 0x001B0034
|
||||||
/* IOCTL_SERIAL_SET_XOFF 0x001B0038 */
|
/* IOCTL_SERIAL_SET_XOFF 0x001B0038 */
|
||||||
/* IOCTL_SERIAL_SET_XON 0x001B003C */
|
/* IOCTL_SERIAL_SET_XON 0x001B003C */
|
||||||
/* IOCTL_SERIAL_SET_BREAK_ON 0x001B0010 */
|
/* IOCTL_SERIAL_SET_BREAK_ON 0x001B0010 */
|
||||||
@ -212,6 +212,8 @@ typedef struct _REMOTE_SERIAL_DRIVER
|
|||||||
BOOL (*get_timeouts)(WINPR_COMM *pComm, SERIAL_TIMEOUTS *pTimeouts);
|
BOOL (*get_timeouts)(WINPR_COMM *pComm, SERIAL_TIMEOUTS *pTimeouts);
|
||||||
BOOL (*set_dtr)(WINPR_COMM *pComm);
|
BOOL (*set_dtr)(WINPR_COMM *pComm);
|
||||||
BOOL (*clear_dtr)(WINPR_COMM *pComm);
|
BOOL (*clear_dtr)(WINPR_COMM *pComm);
|
||||||
|
BOOL (*set_rts)(WINPR_COMM *pComm);
|
||||||
|
BOOL (*clear_rts)(WINPR_COMM *pComm);
|
||||||
|
|
||||||
} REMOTE_SERIAL_DRIVER;
|
} REMOTE_SERIAL_DRIVER;
|
||||||
|
|
||||||
|
@ -70,6 +70,8 @@ static REMOTE_SERIAL_DRIVER _SerCx2Sys =
|
|||||||
.get_timeouts = NULL,
|
.get_timeouts = NULL,
|
||||||
.set_dtr = NULL,
|
.set_dtr = NULL,
|
||||||
.clear_dtr = NULL,
|
.clear_dtr = NULL,
|
||||||
|
.set_rts = NULL,
|
||||||
|
.clear_rts = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -99,6 +101,9 @@ REMOTE_SERIAL_DRIVER* SerCx2Sys_s()
|
|||||||
_SerCx2Sys.set_dtr = pSerialSys->set_dtr;
|
_SerCx2Sys.set_dtr = pSerialSys->set_dtr;
|
||||||
_SerCx2Sys.clear_dtr = pSerialSys->clear_dtr;
|
_SerCx2Sys.clear_dtr = pSerialSys->clear_dtr;
|
||||||
|
|
||||||
|
_SerCx2Sys.set_rts = pSerialSys->set_rts;
|
||||||
|
_SerCx2Sys.clear_rts = pSerialSys->clear_rts;
|
||||||
|
|
||||||
return &_SerCx2Sys;
|
return &_SerCx2Sys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -511,6 +511,8 @@ static REMOTE_SERIAL_DRIVER _SerCxSys =
|
|||||||
.get_timeouts = NULL,
|
.get_timeouts = NULL,
|
||||||
.set_dtr = NULL,
|
.set_dtr = NULL,
|
||||||
.clear_dtr = NULL,
|
.clear_dtr = NULL,
|
||||||
|
.set_rts = NULL,
|
||||||
|
.clear_rts = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -531,6 +533,9 @@ REMOTE_SERIAL_DRIVER* SerCxSys_s()
|
|||||||
_SerCxSys.set_dtr = pSerialSys->set_dtr;
|
_SerCxSys.set_dtr = pSerialSys->set_dtr;
|
||||||
_SerCxSys.clear_dtr = pSerialSys->clear_dtr;
|
_SerCxSys.clear_dtr = pSerialSys->clear_dtr;
|
||||||
|
|
||||||
|
_SerCxSys.set_rts = pSerialSys->set_rts;
|
||||||
|
_SerCxSys.clear_rts = pSerialSys->clear_rts;
|
||||||
|
|
||||||
return &_SerCxSys;
|
return &_SerCxSys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
|
||||||
@ -877,18 +878,70 @@ static BOOL _clear_line(WINPR_COMM *pComm, UINT32 line)
|
|||||||
|
|
||||||
static BOOL _set_dtr(WINPR_COMM *pComm)
|
static BOOL _set_dtr(WINPR_COMM *pComm)
|
||||||
{
|
{
|
||||||
/* FIXME: SERIAL_DTR_HANDSHAKE should be checked but is not supported as of today */
|
SERIAL_HANDFLOW handflow;
|
||||||
|
if (!_get_handflow(pComm, &handflow))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* SERIAL_DTR_HANDSHAKE not supported as of today */
|
||||||
|
assert((handflow.ControlHandShake & SERIAL_DTR_HANDSHAKE) == 0);
|
||||||
|
|
||||||
|
if (handflow.ControlHandShake & SERIAL_DTR_HANDSHAKE)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return _set_line(pComm, TIOCM_DTR);
|
return _set_line(pComm, TIOCM_DTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL _clear_dtr(WINPR_COMM *pComm)
|
static BOOL _clear_dtr(WINPR_COMM *pComm)
|
||||||
{
|
{
|
||||||
/* FIXME: SERIAL_DTR_HANDSHAKE should be checked but is not supported as of today */
|
SERIAL_HANDFLOW handflow;
|
||||||
|
if (!_get_handflow(pComm, &handflow))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* SERIAL_DTR_HANDSHAKE not supported as of today */
|
||||||
|
assert((handflow.ControlHandShake & SERIAL_DTR_HANDSHAKE) == 0);
|
||||||
|
|
||||||
|
if (handflow.ControlHandShake & SERIAL_DTR_HANDSHAKE)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return _clear_line(pComm, TIOCM_DTR);
|
return _clear_line(pComm, TIOCM_DTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL _set_rts(WINPR_COMM *pComm)
|
||||||
|
{
|
||||||
|
SERIAL_HANDFLOW handflow;
|
||||||
|
if (!_get_handflow(pComm, &handflow))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (handflow.FlowReplace & SERIAL_RTS_HANDSHAKE)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _set_line(pComm, TIOCM_RTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL _clear_rts(WINPR_COMM *pComm)
|
||||||
|
{
|
||||||
|
SERIAL_HANDFLOW handflow;
|
||||||
|
if (!_get_handflow(pComm, &handflow))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (handflow.FlowReplace & SERIAL_RTS_HANDSHAKE)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _clear_line(pComm, TIOCM_RTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static REMOTE_SERIAL_DRIVER _SerialSys =
|
static REMOTE_SERIAL_DRIVER _SerialSys =
|
||||||
{
|
{
|
||||||
@ -907,6 +960,8 @@ static REMOTE_SERIAL_DRIVER _SerialSys =
|
|||||||
.get_timeouts = _get_timeouts,
|
.get_timeouts = _get_timeouts,
|
||||||
.set_dtr = _set_dtr,
|
.set_dtr = _set_dtr,
|
||||||
.clear_dtr = _clear_dtr,
|
.clear_dtr = _clear_dtr,
|
||||||
|
.set_rts = _set_rts,
|
||||||
|
.clear_rts = _clear_rts,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user