mirror of https://github.com/probonopd/MiniDexed
Fix for Raspberry 3, thanks @rsta2
https://github.com/probonopd/MiniDexed/issues/16#issuecomment-1046260152pull/25/head
parent
1c03a935ff
commit
8ee512dd34
@ -0,0 +1,304 @@ |
||||
/**
|
||||
* This file has been taken from the circle-stdlib project: |
||||
* https://github.com/smuehlst/circle-stdlib
|
||||
* |
||||
* Convenience classes that package different levels |
||||
* of functionality of Circle applications. |
||||
* |
||||
* Derive the kernel class of the application from one of |
||||
* the CStdlibApp* classes and implement at least the |
||||
* Run () method. Extend the Initalize () and Cleanup () |
||||
* methods if necessary. |
||||
*/ |
||||
#ifndef _circle_stdlib_app_h |
||||
#define _circle_stdlib_app_h |
||||
|
||||
#include <circle/actled.h> |
||||
#include <circle/string.h> |
||||
#include <circle/koptions.h> |
||||
#include <circle/devicenameservice.h> |
||||
#include <circle/nulldevice.h> |
||||
#include <circle/exceptionhandler.h> |
||||
#include <circle/interrupt.h> |
||||
#include <circle/screen.h> |
||||
#include <circle/serial.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> |
||||
#include <circle/net/netsubsystem.h> |
||||
#include <wlan/bcm4343.h> |
||||
#include <wlan/hostap/wpa_supplicant/wpasupplicant.h> |
||||
|
||||
#include <circle_glue.h> |
||||
#include <string.h> |
||||
|
||||
/**
|
||||
* Basic Circle Stdlib application that supports GPIO access. |
||||
*/ |
||||
class CStdlibApp |
||||
{ |
||||
public: |
||||
enum TShutdownMode |
||||
{ |
||||
ShutdownNone, |
||||
ShutdownHalt, |
||||
ShutdownReboot |
||||
}; |
||||
|
||||
CStdlibApp (const char *kernel) : |
||||
FromKernel (kernel) |
||||
{ |
||||
} |
||||
|
||||
virtual ~CStdlibApp (void) |
||||
{ |
||||
} |
||||
|
||||
virtual bool Initialize (void) |
||||
{ |
||||
return mInterrupt.Initialize (); |
||||
} |
||||
|
||||
virtual void Cleanup (void) |
||||
{ |
||||
} |
||||
|
||||
virtual TShutdownMode Run (void) = 0; |
||||
|
||||
const char *GetKernelName(void) const |
||||
{ |
||||
return FromKernel; |
||||
} |
||||
|
||||
protected: |
||||
CActLED mActLED; |
||||
CKernelOptions mOptions; |
||||
CDeviceNameService mDeviceNameService; |
||||
CNullDevice mNullDevice; |
||||
CExceptionHandler mExceptionHandler; |
||||
CInterruptSystem mInterrupt; |
||||
|
||||
private: |
||||
char const *FromKernel; |
||||
}; |
||||
|
||||
/**
|
||||
* Stdlib application that adds screen support |
||||
* to the basic CStdlibApp features. |
||||
*/ |
||||
class CStdlibAppScreen : public CStdlibApp |
||||
{ |
||||
public: |
||||
CStdlibAppScreen(const char *kernel) |
||||
: CStdlibApp (kernel), |
||||
mScreen (mOptions.GetWidth (), mOptions.GetHeight ()), |
||||
mTimer (&mInterrupt), |
||||
mLogger (mOptions.GetLogLevel (), &mTimer) |
||||
{ |
||||
} |
||||
|
||||
virtual bool Initialize (void) |
||||
{ |
||||
if (!CStdlibApp::Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
if (!mScreen.Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
#if 0 |
||||
if (!mSerial.Initialize (115200)) |
||||
{ |
||||
return false; |
||||
} |
||||
#endif |
||||
CDevice *pTarget = |
||||
mDeviceNameService.GetDevice (mOptions.GetLogDevice (), false); |
||||
if (pTarget == 0) |
||||
{ |
||||
pTarget = &mScreen; |
||||
} |
||||
|
||||
if (!mLogger.Initialize (pTarget)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
return mTimer.Initialize (); |
||||
} |
||||
|
||||
protected: |
||||
CScreenDevice mScreen; |
||||
//CSerialDevice mSerial;
|
||||
CTimer mTimer; |
||||
CLogger mLogger; |
||||
}; |
||||
|
||||
/**
|
||||
* Stdlib application that adds stdio support |
||||
* to the CStdlibAppScreen functionality. |
||||
*/ |
||||
class CStdlibAppStdio: public CStdlibAppScreen |
||||
{ |
||||
private: |
||||
char const *mpPartitionName; |
||||
|
||||
public: |
||||
// TODO transform to constexpr
|
||||
// constexpr char static DefaultPartition[] = "emmc1-1";
|
||||
#define CSTDLIBAPP_LEGACY_DEFAULT_PARTITION "emmc1-1" |
||||
#define CSTDLIBAPP_DEFAULT_PARTITION "SD:" |
||||
|
||||
CStdlibAppStdio (const char *kernel, |
||||
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 (0, TRUE) |
||||
#else |
||||
mConsole (&mScreen) |
||||
#endif |
||||
{ |
||||
} |
||||
|
||||
virtual bool Initialize (void) |
||||
{ |
||||
if (!CStdlibAppScreen::Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
if (!mEMMC.Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
char const *partitionName = mpPartitionName; |
||||
|
||||
// Recognize the old default partion name
|
||||
if (strcmp(partitionName, CSTDLIBAPP_LEGACY_DEFAULT_PARTITION) == 0) |
||||
{ |
||||
partitionName = CSTDLIBAPP_DEFAULT_PARTITION; |
||||
} |
||||
|
||||
if (f_mount (&mFileSystem, partitionName, 1) != FR_OK) |
||||
{ |
||||
mLogger.Write (GetKernelName (), LogError, |
||||
"Cannot mount partition: %s", partitionName); |
||||
|
||||
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; |
||||
} |
||||
|
||||
// Initialize newlib stdio with a reference to Circle's file system and console
|
||||
CGlueStdioInit (mFileSystem, mConsole); |
||||
|
||||
mLogger.Write (GetKernelName (), LogNotice, "Compile time: " __DATE__ " " __TIME__); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
virtual void Cleanup (void) |
||||
{ |
||||
f_mount(0, "", 0); |
||||
|
||||
CStdlibAppScreen::Cleanup (); |
||||
} |
||||
|
||||
protected: |
||||
CUSBHCIDevice mUSBHCI; |
||||
CEMMCDevice mEMMC; |
||||
FATFS mFileSystem; |
||||
CConsole mConsole; |
||||
}; |
||||
|
||||
/**
|
||||
* Stdlib application that adds network functionality |
||||
* to the CStdlibAppStdio features. |
||||
*/ |
||||
class CStdlibAppNetwork: public CStdlibAppStdio |
||||
{ |
||||
public: |
||||
#define CSTDLIBAPP_WLAN_FIRMWARE_PATH CSTDLIBAPP_DEFAULT_PARTITION "/firmware/" |
||||
#define CSTDLIBAPP_WLAN_CONFIG_FILE CSTDLIBAPP_DEFAULT_PARTITION "/wpa_supplicant.conf" |
||||
|
||||
CStdlibAppNetwork (const char *kernel, |
||||
const char *pPartitionName = CSTDLIBAPP_DEFAULT_PARTITION, |
||||
const u8 *pIPAddress = 0, // use DHCP if pIPAddress == 0
|
||||
const u8 *pNetMask = 0, |
||||
const u8 *pDefaultGateway = 0, |
||||
const u8 *pDNSServer = 0, |
||||
TNetDeviceType DeviceType = NetDeviceTypeEthernet) |
||||
: CStdlibAppStdio(kernel, pPartitionName), |
||||
mDeviceType (DeviceType), |
||||
mWLAN (CSTDLIBAPP_WLAN_FIRMWARE_PATH), |
||||
mNet(pIPAddress, pNetMask, pDefaultGateway, pDNSServer, DEFAULT_HOSTNAME, DeviceType), |
||||
mWPASupplicant (CSTDLIBAPP_WLAN_CONFIG_FILE) |
||||
{ |
||||
} |
||||
|
||||
virtual bool Initialize (bool const bWaitForActivate = true) |
||||
{ |
||||
if (!CStdlibAppStdio::Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
if (mDeviceType == NetDeviceTypeWLAN) |
||||
{ |
||||
if (!mWLAN.Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
if (!mNet.Initialize (false)) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
if (mDeviceType == NetDeviceTypeWLAN) |
||||
{ |
||||
if (!mWPASupplicant.Initialize ()) |
||||
{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
while (bWaitForActivate && !mNet.IsRunning ()) |
||||
{ |
||||
mScheduler.Yield (); |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
protected: |
||||
CScheduler mScheduler; |
||||
TNetDeviceType mDeviceType; |
||||
CBcm4343Device mWLAN; |
||||
CNetSubSystem mNet; |
||||
CWPASupplicant mWPASupplicant; |
||||
}; |
||||
#endif |
Loading…
Reference in new issue