USB composite device example program, drag-and-drop flash writer.

Dependencies:   SWD USBDevice mbed BaseDAP

USBMSD_LPC.cpp

Committer:
va009039
Date:
2013-09-17
Revision:
0:2385683c867a
Child:
1:ea8e179320d7

File content as of revision 0:2385683c867a:

// USBMSD_LPC.cpp 2013/9/17
#include "mbed.h"
#include "USBMSD_LPC.h"
#include "mydebug.h"

USBMSD_LPC::USBMSD_LPC(PinName swdio, PinName swclk, PinName reset, Serial* usbpc)
    : _target(swdio, swclk, reset), _pc(usbpc)
{
    _target.setup();
    _flash = new Flash(&_target, _pc);
    _status = 0x01;
    _prog_mode = false;  
    connect();
}

/* virtual */ int USBMSD_LPC::disk_initialize()
{
    _status = 0x00;
    return 0;
}

/* virtual */ int USBMSD_LPC::disk_status()
{
    return _status;
}

/* virtual */ int USBMSD_LPC::disk_read(uint8_t * data, uint64_t block)
{
    DBG("block=%d", (int)block);
    return _romdisk.read(data, block);
}

/* virtual */ int USBMSD_LPC::disk_write(const uint8_t * data, uint64_t block)
{
    DBG("block=%d", (int)block);
    if (_prog_mode == false) {
        if (_romdisk.is_data(block)) {
            _addr = 0;
            flashBinary(_addr, data, 512);
            _prev_block = block;
            _addr += 512;
            _prog_mode = true;
            _pc->printf("Writing.");
        }
    } else {
        if (!_romdisk.is_data(block)) {
            _pc->printf("passed.\n");
            _target.SoftwareReset();
            _prog_mode = false;
        } else if ((_prev_block+1) != block) {
            _prog_mode = false;
        } else {
            flashBinary(_addr, data, 512);
            _pc->printf(".");
            _prev_block = block;
            _addr += 512;
        }
    }    
    return _romdisk.write(data, block);
}

/* virtual */ uint64_t USBMSD_LPC::disk_sectors()
{
    return _romdisk.sectors();
}

/* virtual */ uint64_t USBMSD_LPC::disk_size()
{
    return _romdisk.sectors() * 512;
}

void USBMSD_LPC::flashBinary(int addr, const uint8_t* buf, int size)
{
    DBG("addr=%d(%d)", addr, size);
    if (addr == 0) {
        _flash->init();
        _flash->eraseAll();
    }
    _flash->write(addr, buf, size);
}