Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
IOReturn WLCard::stopCapture() {
    //test
    if (_doCommand(wlcMonitorOff, 0) != kIOReturnSuccess) {
        WLLogErr("WLCard::stopCapture: _doCommand(wlcMonitorOff) failed\n");
        return kIOReturnError;
    }

    return kIOReturnSuccess;
    return _disable();
}
Example #5
0
/*
 * 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;
}
Example #6
0
//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 = "";
    }
}
Example #7
0
IOReturn WLCard::_enable()
{
    if (_doCommand(wlcEnable, 0) != kIOReturnSuccess) {
        WLLogErr("WLCard::startCapture: _doCommand(wlcEnable) failed\n");
        return kIOReturnError;
    }
    _isEnabled = true;

    enableInterrupts();

    return kIOReturnSuccess;
}
Example #8
0
IOReturn WLCard::_disable()
{
    disableInterrupts();
    ackAllInterrupts();
    
    if (_doCommand(wlcDisable, 0) != kIOReturnSuccess) {
        WLLogErr("WLCard::_disable: _doCommand(wlcDisable) failed\n");
        return kIOReturnError;
    }
    _isEnabled = false;

    return kIOReturnSuccess;
}
Example #9
0
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;
}