USB host library, support isochronous,bulk,interrupt and control.

Dependents:   BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example

Import programBaseUsbHost_example

BaseUsbHost example program

BaseUsbHostBlkEp.cpp

Committer:
va009039
Date:
2012-12-11
Revision:
2:fe1e62051d88
Parent:
1:3b7bc4f87a61
Child:
3:ae77d63a1eda

File content as of revision 2:fe1e62051d88:

// BaseUsbHostBlkEp.cpp 2012/12/11
#include "mbed.h"
#include "rtos.h"
#include "BaseUsbHost.h"
//#define DEBUG
#include "BaseUsbHostDebug.h"
#define TEST
#include "BaseUsbHostTest.h"

BulkEp::BulkEp(int addr, uint8_t ep, uint16_t size): BaseEp(addr, ep, size)
{
    HCTD* td = new_HCTD();
    m_pED->TailTd = td;
    m_pED->HeadTd = td; 
    TEST_ASSERT(td);
    if (td == NULL) {
        return;
    }
    m_pED->Next = LPC_USB->HcBulkHeadED;
    LPC_USB->HcBulkHeadED = reinterpret_cast<uint32_t>(m_pED);
    
    DBG_OHCI(LPC_USB->HcBulkHeadED);
    DBG_ED(m_pED);

    LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
    LPC_USB->HcControl |= OR_CONTROL_BLE;
}

int BulkEp::bulkReceive(uint8_t* buf, int len, int millisec)
{
    if (m_td_queue_count == 0) {
        HCTD* data_td = m_pED->TailTd;
        TEST_ASSERT(data_td);
        if (data_td == NULL) {
            return USB_ERROR;
        }
        data_td->Control |= TD_IN;
        data_td->CurrBufPtr = buf;
        data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
        HCTD* blank_td = new_HCTD();
        TEST_ASSERT(blank_td);
        if (blank_td == NULL) {
            return USB_ERROR_MEMORY;
        }
        data_td->Next = reinterpret_cast<uint32_t>(blank_td);
        m_pED->TailTd = blank_td;
        m_td_queue_count++;
        DBG_ED(m_pED);
        LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
        LPC_USB->HcControl |= OR_CONTROL_BLE;
    }
    
    HCTD* td = get_queue_HCTD(millisec);
    if (td == NULL) {
        return USB_PROCESSING;
    }
    DBG_TD(td);
    int ret = len;
    if (td->CurrBufPtr) {
        ret = td->CurrBufPtr - buf;
    }
    delete_HCTD(td); 
    m_td_queue_count--;
    return ret;
}

int BulkEp::bulkSend(const uint8_t* buf, int len, int millisec)
{
    HCTD* data_td = m_pED->TailTd;
    TEST_ASSERT(data_td);
    if (data_td == NULL) {
        return USB_ERROR;
    }
    data_td->Control |= TD_OUT;
    data_td->CurrBufPtr = const_cast<uint8_t*>(buf);
    data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
    HCTD* blank_td = new_HCTD();
    TEST_ASSERT(blank_td);
    if (blank_td == NULL) {
        return USB_ERROR_MEMORY;
    }
    data_td->Next = reinterpret_cast<uint32_t>(blank_td);
    m_pED->TailTd = blank_td;
    m_td_queue_count++;
    DBG_ED(m_pED);
    
    LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
    LPC_USB->HcControl |= OR_CONTROL_BLE;
 
    HCTD* td = get_queue_HCTD(millisec);
    if (td) {
        DBG_TD(td);
        int ret = len;
        if (td->CurrBufPtr) {
            ret = td->CurrBufPtr - buf;
        }
        delete_HCTD(td); 
        m_td_queue_count--;
        return ret;
    }
    return USB_ERROR;
}