bool Ficgta01MultiplexerPlugin::detect( QSerialIODevice *device ) { // The FIC needs a special line discipline set on the device. QSerialPort *port = qobject_cast<QSerialPort *>( device ); if (port) { int discipline = N_TIHTC; ::ioctl(port->fd(), TIOCSETD, &discipline); } device->discard(); int rc; struct termios t; rc = tcgetattr(port->fd(), &t); t.c_cflag |= CRTSCTS; rc = tcsetattr(port->fd(), TCSANOW, &t); // Issue an innocuous command to wake up the device. // It will respond with either "OK" or "AT-Command Interpreter ready". // We will do this up to 10 times as the modem is losing the first at // commands (due waking up) int attempts = 10; while (--attempts >= 0 && !QSerialIODeviceMultiplexer::chat( device, "ATZ")); // Issue the AT+CMUX command to determine if this device // uses GSM 07.10-style multiplexing. #ifndef FICGTA01_NO_MUX return QGsm0710Multiplexer::cmuxChat( device, FICGTA01_FRAME_SIZE, true ); #else return true; #endif }
bool NeoMultiplexerPlugin::detect( QSerialIODevice *device ) { qLog(Hardware) << __PRETTY_FUNCTION__; // Power on modem via sysfs QFile f("/sys/bus/platform/devices/neo1973-pm-gsm.0/power_on"); if(f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { f.write("0"); f.close(); } if(f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { f.write("1"); f.close(); } else { qWarning() << "Modem power on failed "<< f.errorString(); } // The FIC needs a special line discipline set on the device. QSerialPort *port = qobject_cast<QSerialPort *>( device ); if (port) { int discipline = N_TIHTC; ::ioctl(port->fd(), TIOCSETD, &discipline); } device->discard(); int rc; struct termios t; rc = tcgetattr(port->fd(), &t); t.c_cflag |= CRTSCTS; rc = tcsetattr(port->fd(), TCSANOW, &t); QValueSpaceItem deviceString("/Hardware/Neo/Device"); if ( deviceString.value().toString() == "GTA02") { qLog(Hardware) << __PRETTY_FUNCTION__ << "is gta02"; muxEnabled = true; } else { qLog(Hardware) << __PRETTY_FUNCTION__ << "is gta01"; muxEnabled = false; } QSettings cfg("Trolltech", "Modem"); QString multiplexing = cfg.value("Multiplexing/Active", "yes").toString(); muxEnabled &= (multiplexing != "no"); qLog(Mux) << "Neo multiplexing " << (muxEnabled ? "enabled" : "disabled") << multiplexing; // Make the modem talk to us. It can be a bit rough to get // it initialized... So we will empty the current buffer // and then send ^Z\r\n and wait for an OK or AT from the modem. This is // mostly based on ideas from ogsmd device->readAll(); int attempts = 0; for (; attempts < 2; ++attempts) { if (QSerialIODeviceMultiplexer::chat(device, QChar(0x1a))) { qLog(Modem) << "Attempts needed to initialize the modem" << attempts; break; } } if (attempts == 2) { qWarning() << "Initializing the modem failed."; abort(); } // disable echoing of commands QSerialIODeviceMultiplexer::chat(device, "ATE0"); device->readAll(); if (muxEnabled) { // Issue the AT+CMUX command to determine if this device // uses GSM 07.10-style multiplexing. return QGsm0710Multiplexer::cmuxChat( device, NEO_FRAME_SIZE, true ); } return true; }