Skip to content

Commit

Permalink
Add USB Gadget Device support (#567)
Browse files Browse the repository at this point in the history
* Initial attempt to include USB Gadget Mode as a configuration option.  Note: Also requires a move to the latest release of circle.

* Set "official" (as allocated from pid.codes) USB vendor and device ID for MiniDexed
  • Loading branch information
diyelectromusic authored Nov 24, 2023
1 parent c5c4e13 commit 258a456
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 18 deletions.
2 changes: 2 additions & 0 deletions USBID.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
USB_VID=0x1209
USB_DID=0xF043
9 changes: 9 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ if [ "${RPI}" -gt "1" ]; then
OPTIONS="${OPTIONS} -o ARM_ALLOW_MULTI_CORE"
fi

# USB Vendor and Device ID for use with USB Gadget Mode
source USBID.sh
if [ "${USB_VID}" ] ; then
OPTIONS="${OPTIONS} -o USB_GADGET_VENDOR_ID=${USB_VID}"
fi
if [ "${USB_DID}" ] ; then
OPTIONS="${OPTIONS} -o USB_GADGET_DEVICE_ID=${USB_DID}"
fi

# Build circle-stdlib library
cd circle-stdlib/
make mrproper || true
Expand Down
1 change: 1 addition & 0 deletions src/Rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ LIBS += \
$(CIRCLEHOME)/addon/Properties/libproperties.a \
$(CIRCLEHOME)/addon/SDCard/libsdcard.a \
$(CIRCLEHOME)/lib/usb/libusb.a \
$(CIRCLEHOME)/lib/usb/gadget/libusbgadget.a \
$(CIRCLEHOME)/lib/input/libinput.a \
$(CIRCLEHOME)/lib/sound/libsound.a \
$(CIRCLEHOME)/addon/fatfs/libfatfs.a \
Expand Down
15 changes: 1 addition & 14 deletions src/circle_stdlib_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
#include <circle/writebuffer.h>
#include <circle/timer.h>
#include <circle/logger.h>
#include <circle/usb/usbhcidevice.h>
#include <SDCard/emmc.h>
#include <circle/input/console.h>
#include <circle/sched/scheduler.h>
Expand Down Expand Up @@ -160,7 +159,6 @@ class CStdlibAppStdio: public CStdlibAppScreen
const char *pPartitionName = CSTDLIBAPP_DEFAULT_PARTITION)
: CStdlibAppScreen (kernel),
mpPartitionName (pPartitionName),
mUSBHCI (&mInterrupt, &mTimer, TRUE),
mEMMC (&mInterrupt, &mTimer, &mActLED),
#if !defined(__aarch64__) || !defined(LEAVE_QEMU_ON_HALT)
//mConsole (&mScreen, TRUE)
Expand Down Expand Up @@ -199,16 +197,6 @@ class CStdlibAppStdio: public CStdlibAppScreen
return false;
}

#if !defined(__aarch64__) || !defined(LEAVE_QEMU_ON_HALT)
// The USB driver is not supported under 64-bit QEMU, so
// the initialization must be skipped in this case, or an
// exit happens here under 64-bit QEMU.
if (!mUSBHCI.Initialize ())
{
return false;
}
#endif

if (!mConsole.Initialize ())
{
return false;
Expand All @@ -223,7 +211,7 @@ class CStdlibAppStdio: public CStdlibAppScreen

return true;
}

virtual void Cleanup (void)
{
f_mount(0, "", 0);
Expand All @@ -232,7 +220,6 @@ class CStdlibAppStdio: public CStdlibAppScreen
}

protected:
CUSBHCIDevice mUSBHCI;
CEMMCDevice mEMMC;
FATFS mFileSystem;
CConsole mConsole;
Expand Down
7 changes: 7 additions & 0 deletions src/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ CConfig::~CConfig (void)
void CConfig::Load (void)
{
m_Properties.Load ();

m_bUSBGadgetMode = m_Properties.GetNumber ("USBGadget", 0) != 0;

m_SoundDevice = m_Properties.GetString ("SoundDevice", "pwm");

Expand Down Expand Up @@ -152,6 +154,11 @@ void CConfig::Load (void)
m_bPerformanceSelectChannel = m_Properties.GetNumber ("PerformanceSelectChannel", 0);
}

bool CConfig::GetUSBGadgetMode (void) const
{
return m_bUSBGadgetMode;
}

const char *CConfig::GetSoundDevice (void) const
{
return m_SoundDevice.c_str ();
Expand Down
5 changes: 5 additions & 0 deletions src/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ class CConfig // Configuration for MiniDexed
~CConfig (void);

void Load (void);

// USB Mode
bool GetUSBGadgetMode (void) const; // true if in USB gadget mode

// Sound device
const char *GetSoundDevice (void) const;
Expand Down Expand Up @@ -167,6 +170,8 @@ class CConfig // Configuration for MiniDexed

private:
CPropertiesFatFsFile m_Properties;

bool m_bUSBGadgetMode;

std::string m_SoundDevice;
unsigned m_nSampleRate;
Expand Down
20 changes: 19 additions & 1 deletion src/kernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include <circle/logger.h>
#include <circle/synchronize.h>
#include <assert.h>
#include <circle/usb/usbhcidevice.h>
#include <circle/usb/gadget/usbmidigadget.h>

LOGMODULE ("kernel");

Expand Down Expand Up @@ -63,7 +65,23 @@ bool CKernel::Initialize (void)
}

m_Config.Load ();

if (m_Config.GetUSBGadgetMode())
{
// Run the USB stack in USB Gadget (device) mode
m_pUSB = new CUSBMIDIGadget (&mInterrupt);
}
else
{
// Run the USB stack in USB Host (default) mode
m_pUSB = new CUSBHCIDevice (&mInterrupt, &mTimer, TRUE);
}

if (!m_pUSB->Initialize ())
{
return FALSE;
}

m_pDexed = new CMiniDexed (&m_Config, &mInterrupt, &m_GPIOManager, &m_I2CMaster,
&mFileSystem);
assert (m_pDexed);
Expand All @@ -82,7 +100,7 @@ CStdlibApp::TShutdownMode CKernel::Run (void)

while (42 == 42)
{
boolean bUpdated = mUSBHCI.UpdatePlugAndPlay ();
boolean bUpdated = m_pUSB->UpdatePlugAndPlay ();

m_pDexed->Process(bUpdated);

Expand Down
2 changes: 2 additions & 0 deletions src/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <circle/cputhrottle.h>
#include <circle/gpiomanager.h>
#include <circle/i2cmaster.h>
#include <circle/usb/usbcontroller.h>
#include "config.h"
#include "minidexed.h"

Expand Down Expand Up @@ -54,6 +55,7 @@ class CKernel : public CStdlibAppStdio
CGPIOManager m_GPIOManager;
CI2CMaster m_I2CMaster;
CMiniDexed *m_pDexed;
CUSBController *m_pUSB;

static CKernel *s_pThis;
};
Expand Down
9 changes: 9 additions & 0 deletions src/minidexed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,15 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_pTG[i]->setEngineType(pConfig->GetEngineType ());
m_pTG[i]->activate ();
}

if (pConfig->GetUSBGadgetMode())
{
LOGNOTE ("USB In Gadget (Device) Mode");
}
else
{
LOGNOTE ("USB In Host Mode");
}

for (unsigned i = 0; i < CConfig::MaxUSBMIDIDevices; i++)
{
Expand Down
15 changes: 12 additions & 3 deletions submod.sh
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
#!/bin/bash
set -ex
#
# Update top-level modules as a baseline
git submodule update --init --recursive
#
# Use fixed master branch of circle-stdlib then re-update
cd circle-stdlib/
git checkout e318f89 # Needed to support Circle develop?
git checkout 695ab4a
git submodule update --init --recursive
cd -
#
# Optional update submodules explicitly
cd circle-stdlib/libs/circle
git checkout ec09d7e # develop
git checkout fe09c4b
cd -
cd circle-stdlib/libs/circle-newlib
git checkout 48bf91d # needed for circle ec09d7e
#git checkout develop
cd -
#
# Use fixed master branch of Synth_Dexed
cd Synth_Dexed/
git checkout c9f5274
cd -

1 comment on commit 258a456

@loki666
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.