Skip to content

Commit

Permalink
Merge branch 'master' into sifive-pwm
Browse files Browse the repository at this point in the history
  • Loading branch information
bsousi5 authored Mar 19, 2020
2 parents 0680185 + 9d07b0a commit a62c37e
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 63 deletions.
57 changes: 37 additions & 20 deletions build.wake
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
tuple MachineExecutionEnvironment =
Job_: Job
IncludeDir_: String
LibDir_: String
LibMetal_: Path
LibMetalGloss_: Path
ConfigOptions: FreedomMetalConfigureOptions
AllOutputs_: List Path

global def getMachineExecutionEnvironmentJob = getMachineExecutionEnvironmentJob_
global def getMachineExecutionEnvironmentLibMetal = getMachineExecutionEnvironmentLibMetal_
global def getMachineExecutionEnvironmentLibMetalGloss = getMachineExecutionEnvironmentLibMetalGloss_
global def getMachineExecutionEnvironmentIncludeDir = getMachineExecutionEnvironmentIncludeDir_
Expand Down Expand Up @@ -55,8 +57,6 @@ global def runFreedomMetalInstall options =
def metalInline = options.getFreedomMetalConfigureOptionsMachineInlineHeader
def platformHeader = options.getFreedomMetalConfigureOptionsPlatformHeader

def wrapperScript = source "{here}/scripts/autoconf_wrapper"

def metalInstallDir = outputDir

def installedFreedomMetal =
Expand Down Expand Up @@ -87,16 +87,32 @@ global def runFreedomMetalInstall options =


def runDir = "{metalInstallDir}/freedom-metal"
def cmdline =
relative runDir wrapperScript.getPathName,
options.getFreedomMetalConfigureOptionsHost,
relative runDir metalHeader.getPathName,
relative runDir metalInline.getPathName,
relative runDir platformHeader.getPathName,
relative runDir outputDir,
Nil

def inputs = mkdir outputDir, wrapperScript, metalHeader, installedFreedomMetal
def cmdline = "bash", "-c", "%
set -eo pipefail
machine_header=$(pwd)/%{metalHeader.getPathName}
machine_inline=$(pwd)/%{metalInline.getPathName}
platform_header=$(pwd)/%{platformHeader.getPathName}
install_dir=$(pwd)/%{outputDir}
export RISCV_PATH=$RISCV
cd %{runDir}
./configure \
--host=%{options.getFreedomMetalConfigureOptionsHost} \
--with-builtin-libgloss \
--with-machine-header=$machine_header \
--with-machine-inline=$machine_inline \
--with-platform-header=$platform_header \
--prefix=
make \
RANLIB="riscv64-unknown-elf-ranlib -D" \
ARFLAGS=Dcr
make \
RANLIB="riscv64-unknown-elf-ranlib -D" \
ARFLAGS=Dcr \
DESTDIR=$install_dir \
install
%", Nil

def inputs = mkdir outputDir, metalHeader, installedFreedomMetal
def foutputs _ =
files "{outputDir}/include" `.*`
++ files "{outputDir}/lib" `.*`
Expand All @@ -106,20 +122,21 @@ global def runFreedomMetalInstall options =
def cmodel = options.getFreedomMetalConfigureOptionsRISCV_CMODEL
"CFLAGS=-march={march} -mabi={mabi} -g -mcmodel={cmodel}", _

def makeOutputs =
def job =
makePlan cmdline inputs
| setPlanLocalOnly True
| setPlanFnOutputs foutputs
| setPlanDirectory runDir
| setPlanResources options.getFreedomMetalConfigureOptionsResources
| editPlanEnvironment withCFlags
| runJob
| getJobOutputs
def makeOutputs = job.getJobOutputs

def getFile f msg =
filter (simplify f ==~ _.getPathName) makeOutputs
| head
| getOrElse msg.makeError.makeBadPath
def getFile f msg = match (makeOutputs | map getPathResult | findFail)
Fail e = makeBadPath e
Pass _ =
filter (simplify f ==~ _.getPathName) makeOutputs
| head
| getOrElse msg.makeError.makeBadPath

def libmetal =
def fileName = "{outputDir}/lib/libmetal.a"
Expand All @@ -131,4 +148,4 @@ global def runFreedomMetalInstall options =

def includeDir = "{outputDir}/include"
def libDir = "{outputDir}/lib"
MachineExecutionEnvironment includeDir libDir libmetal libmetalGloss options makeOutputs
MachineExecutionEnvironment job includeDir libDir libmetal libmetalGloss options makeOutputs
3 changes: 3 additions & 0 deletions metal/drivers/riscv_clint0.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@ struct __metal_driver_riscv_clint0 {
};
#undef __METAL_MACHINE_MACROS

int __metal_driver_riscv_clint0_command_request(
struct metal_interrupt *controller, int command, void *data);

#endif
3 changes: 3 additions & 0 deletions metal/drivers/sifive_clic0.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,7 @@ struct __metal_driver_sifive_clic0 {
};
#undef __METAL_MACHINE_MACROS

int __metal_driver_sifive_clic0_command_request(
struct metal_interrupt *controller, int command, void *data);

#endif
38 changes: 0 additions & 38 deletions scripts/autoconf_wrapper

This file was deleted.

38 changes: 38 additions & 0 deletions src/drivers/sifive_fe310-g000_pll.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include <metal/init.h>
#include <metal/machine.h>
#include <metal/machine/platform.h>

#include <metal/drivers/sifive_fe310-g000_pll.h>
#include <stdlib.h>
Expand Down Expand Up @@ -270,6 +271,19 @@ static int find_closest_config(long ref_hz, long rate) {
return closest_index;
}

/* The PLL needs 100 usec to stabilize before we test PLL_LOCK. Since LFROSC
* on all targets with the FE310-G000 PLL runs at 32768 Hz, we need to wait
* at least
*
* ceil(100 usec * 32768 ticks/sec * 1 sec / 1000000 usec) = 4 ticks
*
* of mtime before we test PLL_LOCK.
*
* TODO: Determine the mtime timebase at compile or runtime and use that
* here.
*/
#define PLL_LOCK_WAIT_TICKS 4

/* Configure the PLL and wait for it to lock */
static void configure_pll(__metal_io_u32 *pllcfg, __metal_io_u32 *plloutdiv,
const struct pll_config_t *config) {
Expand Down Expand Up @@ -297,6 +311,30 @@ static void configure_pll(__metal_io_u32 *pllcfg, __metal_io_u32 *plloutdiv,

__METAL_ACCESS_ONCE(pllcfg) &= ~(PLL_BYPASS);

/* Wait for the PLL to stabilize before testing it for lock */
#ifdef __METAL_DT_RISCV_CLINT0_HANDLE
unsigned long long mtime, mtime_end;
__metal_driver_riscv_clint0_command_request(__METAL_DT_RISCV_CLINT0_HANDLE,
METAL_TIMER_MTIME_GET, &mtime);
mtime_end = mtime + PLL_LOCK_WAIT_TICKS;
while (mtime <= mtime_end) {
__metal_driver_riscv_clint0_command_request(
__METAL_DT_RISCV_CLINT0_HANDLE, METAL_TIMER_MTIME_GET, &mtime);
}
#elif __METAL_DT_RISCV_CLIC0_HANDLE
unsigned long long mtime, mtime_end;
__metal_driver_sifive_clic0_command_request(__METAL_DT_RISCV_CLIC0_HANDLE,
METAL_TIMER_MTIME_GET, &mtime);
mtime_end = mtime + PLL_LOCK_WAIT_TICKS;
while (mtime <= mtime_end) {
__metal_driver_sifive_clic0_command_request(
__METAL_DT_RISCV_CLIC0_HANDLE, METAL_TIMER_MTIME_GET, &mtime);
}
#else
#pragma message( \
No handle for CLINT or CLIC found, PLL might race with lock signal !)
#endif

/* Wait for PLL to lock */
while ((__METAL_ACCESS_ONCE(pllcfg) & PLL_LOCK) == 0)
;
Expand Down
10 changes: 5 additions & 5 deletions src/drivers/sifive_spi0.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,19 +82,19 @@ static int configure_spi(struct __metal_driver_sifive_spi0 *spi,
/* Set Polarity */
if (config->polarity) {
METAL_SPI_REGW(METAL_SIFIVE_SPI0_SCKMODE) |=
(1 << METAL_SPI_SCKMODE_PHA_SHIFT);
(1 << METAL_SPI_SCKMODE_POL_SHIFT);
} else {
METAL_SPI_REGW(METAL_SIFIVE_SPI0_SCKMODE) &=
~(1 << METAL_SPI_SCKMODE_PHA_SHIFT);
~(1 << METAL_SPI_SCKMODE_POL_SHIFT);
}

/* Set Phase */
if (config->phase) {
METAL_SPI_REGW(METAL_SIFIVE_SPI0_SCKMODE) |=
(1 << METAL_SPI_SCKMODE_POL_SHIFT);
(1 << METAL_SPI_SCKMODE_PHA_SHIFT);
} else {
METAL_SPI_REGW(METAL_SIFIVE_SPI0_SCKMODE) &=
~(1 << METAL_SPI_SCKMODE_POL_SHIFT);
~(1 << METAL_SPI_SCKMODE_PHA_SHIFT);
}

/* Set Endianness */
Expand Down Expand Up @@ -123,7 +123,7 @@ static int configure_spi(struct __metal_driver_sifive_spi0 *spi,
}

/* Set CS line */
METAL_SPI_REGW(METAL_SIFIVE_SPI0_CSID) = 1 << (config->csid);
METAL_SPI_REGW(METAL_SIFIVE_SPI0_CSID) = config->csid;

/* Toggle off memory-mapped SPI flash mode, toggle on programmable IO mode
* It seems that with this line uncommented, the debugger cannot have access
Expand Down

0 comments on commit a62c37e

Please sign in to comment.