TRK: Socket mode by option, activate COM port.

This commit is contained in:
Friedemann Kleint
2009-08-03 10:40:35 +02:00
parent e93410897c
commit 6f2905f017
3 changed files with 112 additions and 83 deletions

View File

@@ -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;

View File

@@ -2,6 +2,7 @@
TEMPLATE = app TEMPLATE = app
QT = core network QT = core network
win32:CONFIG+=console
HEADERS += trkutils.h HEADERS += trkutils.h

View File

@@ -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'