forked from qt-creator/qt-creator
TRK: Socket mode by option, activate COM port.
This commit is contained in:
@@ -39,7 +39,7 @@
|
|||||||
#include <QtNetwork/QLocalServer>
|
#include <QtNetwork/QLocalServer>
|
||||||
#include <QtNetwork/QLocalSocket>
|
#include <QtNetwork/QLocalSocket>
|
||||||
|
|
||||||
#if USE_NATIVE
|
#ifdef Q_OS_WIN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
// Non-blocking replacement for win-api ReadFile function
|
// Non-blocking replacement for win-api ReadFile function
|
||||||
@@ -60,6 +60,25 @@ BOOL WINAPI TryReadFile(HANDLE hFile,
|
|||||||
lpNumberOfBytesRead,
|
lpNumberOfBytesRead,
|
||||||
lpOverlapped);
|
lpOverlapped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format windows error from GetLastError() value.
|
||||||
|
QString winErrorMessage(unsigned long error)
|
||||||
|
{
|
||||||
|
QString rc = QString::fromLatin1("#%1: ").arg(error);
|
||||||
|
ushort *lpMsgBuf;
|
||||||
|
|
||||||
|
const int len = FormatMessage(
|
||||||
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
NULL, error, 0, (LPTSTR)&lpMsgBuf, 0, NULL);
|
||||||
|
if (len) {
|
||||||
|
rc = QString::fromUtf16(lpMsgBuf, len);
|
||||||
|
LocalFree(lpMsgBuf);
|
||||||
|
} else {
|
||||||
|
rc += QString::fromLatin1("<unknown error>");
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_UNIX
|
#ifdef Q_OS_UNIX
|
||||||
@@ -105,10 +124,11 @@ static inline void dumpRegister(int n, uint value, QByteArray &a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct AdapterOptions {
|
struct AdapterOptions {
|
||||||
AdapterOptions() : verbose(1),registerEndianness(BigEndian) {}
|
AdapterOptions() : verbose(1),registerEndianness(BigEndian),useSocket(false) {}
|
||||||
|
|
||||||
int verbose;
|
int verbose;
|
||||||
Endianness registerEndianness;
|
Endianness registerEndianness;
|
||||||
|
bool useSocket;
|
||||||
QString gdbServer;
|
QString gdbServer;
|
||||||
QString trkServer;
|
QString trkServer;
|
||||||
};
|
};
|
||||||
@@ -126,6 +146,7 @@ public:
|
|||||||
void setTrkServerName(const QString &name) { m_trkServerName = name; }
|
void setTrkServerName(const QString &name) { m_trkServerName = name; }
|
||||||
void setVerbose(int verbose) { m_verbose = verbose; }
|
void setVerbose(int verbose) { m_verbose = verbose; }
|
||||||
void setRegisterEndianness(Endianness r) { m_registerEndianness = r; }
|
void setRegisterEndianness(Endianness r) { m_registerEndianness = r; }
|
||||||
|
void setUseSocket(bool s) { m_useSocket = s; }
|
||||||
bool startServer();
|
bool startServer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -147,7 +168,7 @@ private:
|
|||||||
bool invokeOnFailure;
|
bool invokeOnFailure;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool openTrkPort(const QString &port); // or server name for local server
|
bool openTrkPort(const QString &port, QString *errorMessage); // or server name for local server
|
||||||
void sendTrkMessage(byte code,
|
void sendTrkMessage(byte code,
|
||||||
TrkCallBack calBack = 0,
|
TrkCallBack calBack = 0,
|
||||||
const QByteArray &data = QByteArray(),
|
const QByteArray &data = QByteArray(),
|
||||||
@@ -193,11 +214,10 @@ private:
|
|||||||
void startInferiorIfNeeded();
|
void startInferiorIfNeeded();
|
||||||
void interruptInferior();
|
void interruptInferior();
|
||||||
|
|
||||||
#if USE_NATIVE
|
#ifdef Q_OS_WIN
|
||||||
HANDLE m_hdevice;
|
HANDLE m_winComDevice;
|
||||||
#else
|
|
||||||
QLocalSocket *m_trkDevice;
|
|
||||||
#endif
|
#endif
|
||||||
|
QLocalSocket *m_socketDevice;
|
||||||
|
|
||||||
QString m_trkServerName;
|
QString m_trkServerName;
|
||||||
QByteArray m_trkReadBuffer;
|
QByteArray m_trkReadBuffer;
|
||||||
@@ -234,42 +254,40 @@ private:
|
|||||||
Snapshot m_snapshot; // local-ish data (memory and registers)
|
Snapshot m_snapshot; // local-ish data (memory and registers)
|
||||||
int m_verbose;
|
int m_verbose;
|
||||||
Endianness m_registerEndianness;
|
Endianness m_registerEndianness;
|
||||||
|
bool m_useSocket;
|
||||||
};
|
};
|
||||||
|
|
||||||
Adapter::Adapter() :
|
Adapter::Adapter() :
|
||||||
m_registerEndianness(BigEndian)
|
#ifdef Q_OS_WIN
|
||||||
{
|
m_winComDevice(NULL),
|
||||||
// Trk
|
|
||||||
#if USE_NATIVE
|
|
||||||
m_hdevice = NULL;
|
|
||||||
#else
|
|
||||||
m_trkDevice = 0;
|
|
||||||
#endif
|
#endif
|
||||||
m_trkWriteToken = 0;
|
m_socketDevice(0),
|
||||||
m_trkWriteBusy = false;
|
m_trkWriteToken(0),
|
||||||
//m_breakpoints.append(Breakpoint(0x0370));
|
m_trkWriteBusy(false),
|
||||||
//m_breakpoints.append(Breakpoint(0x0340));
|
m_gdbConnection(0),
|
||||||
//m_breakpoints.append(Breakpoint(0x0040)); // E32Main
|
m_gdbServerPort(0),
|
||||||
|
m_gdbAckMode(true),
|
||||||
|
m_verbose(1),
|
||||||
|
m_registerEndianness(BigEndian),
|
||||||
|
m_useSocket(false)
|
||||||
|
{
|
||||||
startTimer(100);
|
startTimer(100);
|
||||||
|
|
||||||
// Gdb
|
|
||||||
m_gdbConnection = 0;
|
|
||||||
m_gdbAckMode = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Adapter::~Adapter()
|
Adapter::~Adapter()
|
||||||
{
|
{
|
||||||
// Trk
|
// Trk
|
||||||
#if USE_NATIVE
|
#ifdef Q_OS_WIN
|
||||||
CloseHandle(m_hdevice);
|
if (m_winComDevice)
|
||||||
#else
|
CloseHandle(m_winComDevice);
|
||||||
m_trkDevice->abort();
|
|
||||||
delete m_trkDevice;
|
|
||||||
#endif
|
#endif
|
||||||
|
if (m_socketDevice) {
|
||||||
|
m_socketDevice->abort();
|
||||||
|
delete m_socketDevice;
|
||||||
|
}
|
||||||
|
|
||||||
// Gdb
|
// Gdb
|
||||||
m_gdbServer.close();
|
m_gdbServer.close();
|
||||||
//>disconnectFromServer();
|
|
||||||
logMessage("Shutting down.\n", true);
|
logMessage("Shutting down.\n", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,8 +305,9 @@ void Adapter::setGdbServerName(const QString &name)
|
|||||||
|
|
||||||
bool Adapter::startServer()
|
bool Adapter::startServer()
|
||||||
{
|
{
|
||||||
if (!openTrkPort(m_trkServerName)) {
|
QString errorMessage;
|
||||||
logMessage("Unable to connect to TRK server " + m_trkServerName + " " +m_trkDevice->errorString(), true);
|
if (!openTrkPort(m_trkServerName, &errorMessage)) {
|
||||||
|
logMessage(errorMessage, true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -743,10 +762,18 @@ void Adapter::readFromTrk()
|
|||||||
//logMessage("Read from gdb: " + ba);
|
//logMessage("Read from gdb: " + ba);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Adapter::openTrkPort(const QString &port)
|
bool Adapter::openTrkPort(const QString &port, QString *errorMessage)
|
||||||
{
|
{
|
||||||
#if USE_NATIVE
|
if (m_useSocket) {
|
||||||
m_hdevice = CreateFile(port.toStdWString().c_str(),
|
m_socketDevice = new QLocalSocket(this);
|
||||||
|
m_socketDevice->connectToServer(port);
|
||||||
|
const bool rc = m_socketDevice->waitForConnected();
|
||||||
|
if (!rc)
|
||||||
|
*errorMessage = "Unable to connect to TRK server " + m_trkServerName + ' ' + m_socketDevice->errorString();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
m_winComDevice = CreateFile(port.toStdWString().c_str(),
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -754,32 +781,31 @@ bool Adapter::openTrkPort(const QString &port)
|
|||||||
FILE_ATTRIBUTE_NORMAL,
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (INVALID_HANDLE_VALUE == m_hdevice){
|
if (INVALID_HANDLE_VALUE == m_winComDevice){
|
||||||
logMessage("Could not open device " + port);
|
*errorMessage = "Could not open device " + port + ' ' + winErrorMessage(GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
#if 0
|
logMessage("Not implemented", true);
|
||||||
m_trkDevice = new Win_QextSerialPort(port);
|
return false;
|
||||||
m_trkDevice->setBaudRate(BAUD115200);
|
#endif
|
||||||
m_trkDevice->setDataBits(DATA_8);
|
|
||||||
m_trkDevice->setParity(PAR_NONE);
|
|
||||||
//m_trkDevice->setStopBits(STO);
|
|
||||||
m_trkDevice->setFlowControl(FLOW_OFF);
|
|
||||||
m_trkDevice->setTimeout(0, 500);
|
|
||||||
|
|
||||||
if (!m_trkDevice->open(QIODevice::ReadWrite)) {
|
#if 0
|
||||||
QByteArray ba = m_trkDevice->errorString().toLatin1();
|
m_socketDevice = new Win_QextSerialPort(port);
|
||||||
|
m_socketDevice->setBaudRate(BAUD115200);
|
||||||
|
m_socketDevice->setDataBits(DATA_8);
|
||||||
|
m_socketDevice->setParity(PAR_NONE);
|
||||||
|
//m_socketDevice->setStopBits(STO);
|
||||||
|
m_socketDevice->setFlowControl(FLOW_OFF);
|
||||||
|
m_socketDevice->setTimeout(0, 500);
|
||||||
|
|
||||||
|
if (!m_socketDevice->open(QIODevice::ReadWrite)) {
|
||||||
|
QByteArray ba = m_socketDevice->errorString().toLatin1();
|
||||||
logMessage("Could not open device " << ba);
|
logMessage("Could not open device " << ba);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
#else
|
|
||||||
m_trkDevice = new QLocalSocket(this);
|
|
||||||
m_trkDevice->connectToServer(port);
|
|
||||||
return m_trkDevice->waitForConnected();
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -880,45 +906,43 @@ void Adapter::trkWrite(const TrkMessage &msg)
|
|||||||
if (m_verbose > 1)
|
if (m_verbose > 1)
|
||||||
logMessage("WRITE: " + stringFromArray(ba));
|
logMessage("WRITE: " + stringFromArray(ba));
|
||||||
|
|
||||||
#if USE_NATIVE
|
if (m_useSocket) {
|
||||||
DWORD charsWritten;
|
if (!m_socketDevice->write(ba))
|
||||||
if (!WriteFile(m_hdevice, ba.data(), ba.size(), &charsWritten, NULL))
|
logMessage("WRITE ERROR: " + m_socketDevice->errorString());
|
||||||
logMessage("WRITE ERROR: ");
|
m_socketDevice->flush();
|
||||||
|
} else {
|
||||||
FlushFileBuffers(m_hdevice);
|
#ifdef Q_OS_WIN
|
||||||
#else
|
DWORD charsWritten;
|
||||||
if (!m_trkDevice->write(ba))
|
if (!WriteFile(m_winComDevice, ba.data(), ba.size(), &charsWritten, NULL))
|
||||||
logMessage("WRITE ERROR: " + m_trkDevice->errorString());
|
logMessage("WRITE ERROR: " + winErrorMessage(GetLastError()));
|
||||||
m_trkDevice->flush();
|
FlushFileBuffers(m_winComDevice);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Adapter::tryTrkRead()
|
void Adapter::tryTrkRead()
|
||||||
{
|
{
|
||||||
//logMessage("TRY READ: " << m_trkDevice->bytesAvailable()
|
//logMessage("TRY READ: " << m_socketDevice->bytesAvailable()
|
||||||
// << stringFromArray(m_trkReadQueue);
|
// << stringFromArray(m_trkReadQueue);
|
||||||
|
if (m_useSocket) {
|
||||||
|
if (m_socketDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
#if USE_NATIVE
|
QByteArray res = m_socketDevice->readAll();
|
||||||
const DWORD BUFFERSIZE = 1024;
|
m_trkReadQueue.append(res);
|
||||||
char buffer[BUFFERSIZE];
|
} else {
|
||||||
DWORD charsRead;
|
#ifdef Q_OS_WIN
|
||||||
|
const DWORD BUFFERSIZE = 1024;
|
||||||
while (TryReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL)) {
|
char buffer[BUFFERSIZE];
|
||||||
m_trkReadQueue.append(buffer, charsRead);
|
DWORD charsRead;
|
||||||
if (isValidTrkResult(m_trkReadQueue))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else // USE_NATIVE
|
|
||||||
|
|
||||||
if (m_trkDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QByteArray res = m_trkDevice->readAll();
|
|
||||||
m_trkReadQueue.append(res);
|
|
||||||
|
|
||||||
|
|
||||||
|
while (TryReadFile(m_winComDevice, buffer, BUFFERSIZE, &charsRead, NULL)) {
|
||||||
|
m_trkReadQueue.append(buffer, charsRead);
|
||||||
|
if (isValidTrkResult(m_trkReadQueue))
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif // USE_NATIVE
|
#endif // USE_NATIVE
|
||||||
|
}
|
||||||
|
|
||||||
if (m_trkReadQueue.size() < 9) {
|
if (m_trkReadQueue.size() < 9) {
|
||||||
logMessage("ERROR READBUFFER INVALID (1): "
|
logMessage("ERROR READBUFFER INVALID (1): "
|
||||||
@@ -1469,6 +1493,8 @@ static bool readAdapterArgs(const QStringList &args, AdapterOptions *o)
|
|||||||
o->verbose = 0;
|
o->verbose = 0;
|
||||||
} else if (*it == QLatin1String("-l")) {
|
} else if (*it == QLatin1String("-l")) {
|
||||||
o->registerEndianness = LittleEndian;
|
o->registerEndianness = LittleEndian;
|
||||||
|
} else if (*it == QLatin1String("-s")) {
|
||||||
|
o->useSocket = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (argNumber++) {
|
switch (argNumber++) {
|
||||||
@@ -1494,9 +1520,10 @@ int main(int argc, char *argv[])
|
|||||||
AdapterOptions options;
|
AdapterOptions options;
|
||||||
|
|
||||||
if (!readAdapterArgs(app.arguments(), &options)) {
|
if (!readAdapterArgs(app.arguments(), &options)) {
|
||||||
qDebug("Usage: %s [-v|-q] [-l] <trkservername> <gdbserverport>\n"
|
qDebug("Usage: %s [-v|-q] [-s][-l] <trk com/trkservername> <gdbserverport>\n"
|
||||||
"Options: -v verbose\n"
|
"Options: -v verbose\n"
|
||||||
" -q quiet\n"
|
" -q quiet\n"
|
||||||
|
" -s Use socket (simulation)\n"
|
||||||
" -l Set register endianness to little\n", argv[0]);
|
" -l Set register endianness to little\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1506,6 +1533,7 @@ int main(int argc, char *argv[])
|
|||||||
adapter.setGdbServerName(options.gdbServer);
|
adapter.setGdbServerName(options.gdbServer);
|
||||||
adapter.setVerbose(options.verbose);
|
adapter.setVerbose(options.verbose);
|
||||||
adapter.setRegisterEndianness(options.registerEndianness);
|
adapter.setRegisterEndianness(options.registerEndianness);
|
||||||
|
adapter.setUseSocket(options.useSocket);
|
||||||
if (adapter.startServer())
|
if (adapter.startServer())
|
||||||
return app.exec();
|
return app.exec();
|
||||||
return 4;
|
return 4;
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
|
|
||||||
QT = core network
|
QT = core network
|
||||||
|
win32:CONFIG+=console
|
||||||
|
|
||||||
HEADERS += trkutils.h
|
HEADERS += trkutils.h
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
ADAPTER_OPTIONS=""
|
ADAPTER_OPTIONS="-s"
|
||||||
TRKSERVEROPTIONS=""
|
TRKSERVEROPTIONS=""
|
||||||
DUMP_POSTFIX='-BigEndian.bin'
|
DUMP_POSTFIX='-BigEndian.bin'
|
||||||
ENDIANESS='big'
|
ENDIANESS='big'
|
||||||
|
Reference in New Issue
Block a user