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-04
Revision:
0:b7d6879637a8
Child:
1:3b7bc4f87a61

File content as of revision 0:b7d6879637a8:

// BaseUsbHostBlkEp.cpp 2012/12/3
#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();
    TEST_ASSERT(td);
    m_pED->TailTd = td;
    m_pED->HeadTd = td; 

    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::read(uint8_t* buf, int len, int millisec)
{
    HCTD* data_td = m_pED->TailTd;
    TEST_ASSERT(data_td);
    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);
    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;
}

int BulkEp::write(const uint8_t* buf, int len, int millisec)
{
    HCTD* data_td = m_pED->TailTd;
    TEST_ASSERT(data_td);
    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);
    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;
}