IOReturn WLCard::setRecord(UInt16 rid, void* buf, size_t n, bool swapBytes) { setRegister(wlSelect0, rid); setRegister(wlOffset0, 0); if (_waitForNotBusy(wlOffset0) != kIOReturnSuccess) { WLLogErr("WLCard::getRecord: _waitForNotBusy error\n"); return kIOReturnError; } UInt16 length = (n / 2) + 1; setRegister(wlData0, length); setRegister(wlData0, rid); UInt16* ui16buf = (UInt16*)buf; for (int i = 0; i < length; i++) { if (swapBytes) setRegister(wlData0, ui16buf[i]); else setRegister(wlData0, ui16buf[i], false); //*(UInt16*)((UInt16*)_ioBase + (unsigned long)wlData0) = ui16buf[i]; } if (_doCommand(wlcAccessWrite, rid) != kIOReturnSuccess) { WLLogErr("WLCard::setRecord: Write command failed\n"); return kIOReturnError; } return kIOReturnSuccess; }
IOReturn WLCard:: _reset() { if (_doCommand(wlcInit, 0) != kIOReturnSuccess) { WLLogErr("WLCard::_reset: _doCommand(wlcInit, 0) failed\n"); return kIOReturnError; } if (setValue(0xFC00, 0x3) != kIOReturnSuccess) { WLLogErr("WLCard::_reset: could not set port type\n"); return kIOReturnError; } disableInterrupts(); ackAllInterrupts(); /* * Write and check a magic number to the Software0 register */ UInt16 magic = 0x1ee7; setRegister(wlSwSupport0, magic); if (getRegister(wlSwSupport0) != 0x1ee7) { WLLogCrit("WLCard::_reset: Magic check failed\n"); return kIOReturnError; } /* * Set list of interesting events */ _interrupts = wleRx; _enable(); return kIOReturnSuccess; }
IOReturn WLCard::startCapture(IODataQueue* dq, UInt16 channel) { _packetQueue = dq; if (_disable() != kIOReturnSuccess) { WLLogErr("WLCard::startCapture: Couldn't disable card\n"); return kIOReturnError; } if (setChannel(channel) != kIOReturnSuccess) { WLLogErr("WLCard::startCapture: setChannel(%d) failed\n", channel); return kIOReturnError; } if (_doCommand(wlcMonitorOn, 0) != kIOReturnSuccess) { WLLogErr("WLCard::startCapture: _doCommand(wlcMonitorOn) failed\n"); return kIOReturnError; } if (_enable() != kIOReturnSuccess) { WLLogErr("WLCard::startCapture: Couldn't enable card\n"); return kIOReturnError; } _channel = channel; return kIOReturnSuccess; }
IOReturn WLCard::stopCapture() { //test if (_doCommand(wlcMonitorOff, 0) != kIOReturnSuccess) { WLLogErr("WLCard::stopCapture: _doCommand(wlcMonitorOff) failed\n"); return kIOReturnError; } return kIOReturnSuccess; return _disable(); }
/* * Read a record, specified by rid, into memory of size n bytes * pointed to by buf. The number of bytes read is stored in n before * returning. If swapBytes is true, the data is assumed to be * little-endian and is swapped. */ IOReturn WLCard::getRecord(UInt16 rid, void* buf, size_t* n, bool swapBytes) { if (_doCommand(wlcAccessRead, rid) != kIOReturnSuccess) { WLLogErr("WLCard::getRecord: Read command failed\n"); return kIOReturnError; } setRegister(wlSelect0, rid); setRegister(wlOffset0, 0); if (_waitForNotBusy(wlOffset0) != kIOReturnSuccess) { WLLogErr("WLCard::getRecord: _waitForNotBusy error\n"); return kIOReturnError; } WLOffset off; *((UInt16*)&off) = getRegister(wlOffset0); if (off.error) { WLLogErr("WLCard::getRecord: Error\n"); return kIOReturnError; } /* * Read and check the length */ UInt16 length = getRegister(wlData0); if (length > *n / 2 + 1) { WLLogCrit("WLCard::getRecord: Length too large (%d > %ld)\n", (length - 1) * 2, *n); return kIOReturnError; } /* * Read and check type */ UInt16 type = getRegister(wlData0); if (type != rid) { WLLogCrit("WLCard::getRecord: Type != RID (0x%x != 0x%x)\n", type, rid); return kIOReturnError; } UInt16* ui16Buf = (UInt16*)buf; for (int i = 0; i < (length - 1); i++) { if (swapBytes) ui16Buf[i] = getRegister(wlData0); else ui16Buf[i] = getRegister(wlData0,false);//ui16Buf[i] = *(UInt16*)((UInt16*)_ioBase + (unsigned long)wlData0); } *n = (length - 1) * 2; return kIOReturnSuccess; }
//SerialEventHandler void RoboDuino::doSerialEvent(char inputChar) { // add it to the inputString: _inputCommand += inputChar; // if the incoming character is a newline, set a flag // so the main loop can do something about it: // TODO: make new line configurable if (inputChar == '\n') { _doCommand(); _inputCommand = ""; } }
IOReturn WLCard::_enable() { if (_doCommand(wlcEnable, 0) != kIOReturnSuccess) { WLLogErr("WLCard::startCapture: _doCommand(wlcEnable) failed\n"); return kIOReturnError; } _isEnabled = true; enableInterrupts(); return kIOReturnSuccess; }
IOReturn WLCard::_disable() { disableInterrupts(); ackAllInterrupts(); if (_doCommand(wlcDisable, 0) != kIOReturnSuccess) { WLLogErr("WLCard::_disable: _doCommand(wlcDisable) failed\n"); return kIOReturnError; } _isEnabled = false; return kIOReturnSuccess; }
IOReturn WLCard:: _sendFrame(UInt8* data, IOByteCount size) { int id; if (size%2) { data[size]=0; size++; } WLLogInfo("WLCard::_sendFrame: %u\n", (int)size); if (_doCommand(wlcAllocMem, size) != kIOReturnSuccess) { WLLogCrit("WLCard::_sendFrame: failed to allocate %u bytes on NIC\n", (int)size); return kIOReturnError; } if (_waitForEvent(wleAlloc) != kIOReturnSuccess) { WLLogCrit("WLCard::_sendFrame: timeout failure\n"); return kIOReturnError; } setRegister(wlEvAck, wleAlloc); id = getRegister(wlAllocFID); WLLogInfo("WLCard::_sendFrame: FID is 0x%x\n", id); #ifdef WI_HERMES_AUTOINC_WAR again: #endif setRegister(wlSelect0, id); setRegister(wlOffset0, 0); if (_waitForNotBusy(wlOffset0) != kIOReturnSuccess) { WLLogErr("WLCard::_sendFrame: _waitForNotBusy error\n"); return kIOReturnError; } for (UInt32 i = 0; i < size; i+=2) setRegister(wlData0, *((UInt16*)&data[i]), false); //*(UInt16*)((UInt16*)_ioBase + (unsigned long)(wlData0>>1)) = *((UInt16*)&data[i]); #ifdef WI_HERMES_AUTOINC_WAR setRegister(wlSelect0, id); setRegister(wlOffset0, 0); if (_waitForNotBusy(wlOffset0) != kIOReturnSuccess) { WLLogErr("WLCard::_sendFrame: _waitForNotBusy error\n"); return kIOReturnError; } for (UInt32 i = 0;i<size;i+=2) if (getRegister(wlData0, false) != *((UInt16*)&data[i])) { WLLogCrit("WLCard::_sendFrame: autoinc error. Retrying...\n"); goto again; } #endif if (_doCommand(wlcTransmit, id) != kIOReturnSuccess) { WLLogCrit("WLCard::_sendFrame: could not transmit packet\n"); return kIOReturnError; } return kIOReturnSuccess; }