Tidy up the RISC-V_RV32_SiFive_HiFive1_GCC demo ready for its eventual release.

pull/8/head
Richard Barry 5 years ago
parent d4216903d9
commit 96e61a10a5

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.launchConfigurationType">
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.DeviceTreeArch" value="riscv:rv32"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.DeviceTreeCore" value="cpu@0"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.DeviceTreeExpr" value="bsp\design.dts"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.DeviceTreeHwBp" value="4"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.DeviceTreePath" value="C:\Users\ribarry\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Demo\RISC-V_RV32_SiFive_HiFive1_GCC\bsp\design.dts"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.HwBreakpointLimit" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.RegisterListExpr" value="${bsp_reglist}"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.TargetArch" value=""/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doConnectToRunning" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doContinue" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doDebugInRam" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doFirstReset" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doGdbServerAllocateConsole" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doGdbServerAllocateSemihostingConsole" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doGdbServerInitRegs" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doGdbServerLocalOnly" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doGdbServerSilent" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doGdbServerVerifyDownload" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doSecondReset" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doStartGdbServer" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.doUseDtsMemMap" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.enableFlashBreakpoints" value="true"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.enableSemihosting" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.enableSemihostingIoclientGdbClient" value="false"/>
<booleanAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.enableSemihostingIoclientTelnet" value="true"/>
<intAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.firstResetSpeed" value="1000"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.firstResetType" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbClientOtherCommands" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbClientOtherOptions" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerConnection" value="usb"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerConnectionAddress" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerDebugInterface" value="jtag"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerDeviceEndianness" value="little"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerDeviceName" value="FE310"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerDeviceSpeed" value="1000"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerExecutable" value="${jlink_gdbserver}"/>
<intAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerGdbPortNumber" value="2331"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerLog" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerOther" value="-singlerun -strict -timeout 0 -nogui"/>
<intAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerSwoPortNumber" value="2332"/>
<intAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.gdbServerTelnetPortNumber" value="2333"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.interfaceSpeed" value="auto"/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.otherInitCommands" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.otherRunCommands" value=""/>
<stringAttribute key="com.sifive.gnumcueclipse.debug.gdbjtag.jlink.secondResetType" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU J-Link"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="2331"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${jlink_gdbclient}"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\RTOSDemo"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RTOSDemo"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/RTOSDemo"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;&gt;&#13;&#10;&lt;memoryBlockExpression address=&quot;4096&quot; label=&quot;0x1000&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration>

@ -33,7 +33,7 @@
* in main.c. This file implements the simply blinky style version.
*
* NOTE 2: This file only contains the source code that is specific to the
* basic demo. Generic functions, such FreeRTOS hook functions, and functions
* blinky demo. Generic functions, such FreeRTOS hook functions, and functions
* required to configure the hardware are defined in main.c.
******************************************************************************
*
@ -52,15 +52,14 @@
* in this file. prvQueueReceiveTask() sits in a loop where it repeatedly
* blocks on attempts to read data from the queue that was created within
* main_blinky(). When data is received, the task checks the value of the
* data, and if the value equals the expected 100, writes 'Blink' to the UART
* (the UART is used in place of the LED to allow easy execution in QEMU). The
* 'block time' parameter passed to the queue receive function specifies that
* the task should be held in the Blocked state indefinitely to wait for data to
* be available on the queue. The queue receive task will only leave the
* Blocked state when the queue send task writes to the queue. As the queue
* send task writes to the queue every 1000 milliseconds, the queue receive
* task leaves the Blocked state every 1000 milliseconds, and therefore toggles
* the LED every 200 milliseconds.
* data, and if the value equals the expected 100, toggles an LED. The 'block
* time' parameter passed to the queue receive function specifies that the task
* should be held in the Blocked state indefinitely to wait for data to be
* available on the queue. The queue receive task will only leave the Blocked
* state when the queue send task writes to the queue. As the queue send task
* writes to the queue every 1000 milliseconds, the queue receive task leaves
* the Blocked state every 1000 milliseconds, and therefore toggles the LED
* every 200 milliseconds.
*/
/* Standard includes. */
@ -121,12 +120,12 @@ void main_blinky( void )
file. */
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
"Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
configMINIMAL_STACK_SIZE * 2U, /* The size of the stack to allocate to the task. */
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
NULL, /* The parameter passed to the task - not used in this case. */
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
NULL ); /* The task handle is not required, so NULL is passed. */
xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE * 2U, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );
xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );
/* Start the tasks and timer running. */
vTaskStartScheduler();
@ -173,8 +172,6 @@ static void prvQueueReceiveTask( void *pvParameters )
{
unsigned long ulReceivedValue;
const unsigned long ulExpectedValue = 100UL;
const char * const pcPassMessage = "Blink\r\n";
const char * const pcFailMessage = "Unexpected value received\r\n";
extern void vToggleLED( void );
/* Remove compiler warning about unused parameter. */

@ -1,52 +0,0 @@
# Copyright (c) 2019 SiFive Inc.
#
# Documentation Build
.PHONY: all
all: html pdf
.PHONY: clean
clean: clean-pdf clean-html clean-xml
##########################
# Build PDF Documentation
##########################
.PHONY: pdf
pdf: latex/FreedomMetal.pdf
latex/FreedomMetal.pdf: latex/FreedomMetal.tex
$(MAKE) -C latex
latex/FreedomMetal.tex: xml/index.xml sphinx/*
sphinx-build -b latex sphinx latex
.PHONY: clean-pdf
clean-pdf:
rm -rf latex
###########################
# Build HTML Documentation
###########################
.PHONY: html
html: html/index.html
# Use Sphinx to build HTML from Doxygen XML
html/index.html: xml/index.xml sphinx/*
sphinx-build -b html sphinx html
.PHONY: clean-html
clean-html:
rm -rf html/* html/.buildinfo html/.doctrees
##########################
# Build XML Documentation
##########################
xml/index.xml: ../metal/*.h
cd .. && doxygen
.PHONY: clean-xml
clean-xml:
rm -rf xml

@ -1,55 +0,0 @@
# Documentation Generation
## Requirements
You'll need the following software:
- [Doxygen](http://www.doxygen.nl/index.html)
- [Sphinx](http://www.sphinx-doc.org/en/master/index.html)
- LaTeX (For building a PDF)
### Ubuntu
You can install the required software on Ubuntu with the following:
```
sudo apt install doxygen python3-sphinx python3-breathe graphviz python3-pydot
sudo apt install texlive-full latexmk
```
The second line can be omitted if you don't intend to build the PDF.
### MacOS
You can install the required software on MacOS with the following:
```
brew install doxygen sphinx-doc graphviz
brew cask install mactex
```
The second line can be omitted if you don't intend to build the PDF.
## Building the Docs
You can generate both the HTML and PDF documentation with
```
make
```
Or only the HTML or PDF docs using
```
make html
```
or
```
make pdf
```
You can clean the build files and outputs with
```
make clean
```

@ -1,4 +0,0 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: ffa08ce00704f4402597c7a64e0c1102
tags: 645f666f9bcd5a90fca523b33c5a78b7

@ -1,13 +0,0 @@
API Reference
=============
The API documentation aims to provide a complete reference to the
Freedom Metal API.
The API documentation is split into sections corresponding to each feature:
.. toctree::
:glob:
apiref/*

@ -1,6 +0,0 @@
Buttons
=======
.. doxygenfile:: metal/button.h
:project: metal

@ -1,6 +0,0 @@
Caches
======
.. doxygenfile:: metal/cache.h
:project: metal

@ -1,6 +0,0 @@
Clocks
======
.. doxygenfile:: metal/clock.h
:project: metal

@ -1,6 +0,0 @@
Interrupts
==========
.. doxygenfile:: metal/interrupt.h
:project: metal

@ -1,7 +0,0 @@
ITIM
====
.. doxygenfile:: metal/itim.h
:project: metal
:no-link:

@ -1,6 +0,0 @@
Locks
=======
.. doxygenfile:: metal/lock.h
:project: metal

@ -1,6 +0,0 @@
Memory Enumeration
==================
.. doxygenfile:: metal/memory.h
:project: metal

@ -1,6 +0,0 @@
Shutdown
========
.. doxygenfile:: metal/shutdown.h
:project: metal

@ -1,6 +0,0 @@
Switches
========
.. doxygenfile:: metal/switch.h
:project: metal

@ -1,6 +0,0 @@
Timer API
=========
.. doxygenfile:: metal/timer.h
:project: metal

@ -1,9 +0,0 @@
Developer Guide
===============
.. toctree::
:maxdepth: 1
:glob:
devguide/*

@ -1,103 +0,0 @@
Exception Handlers
==================
CPU exceptions are the mechanism by which various execution and memory system
errors are handled. When an exception occurs, Freedom Metal will call the
corresponding exception handler function, if one has been registered by the
application.
Initializing the CPU
--------------------
When the user application enters the ``main()`` function, the Freedom Metal
framework has not yet performed the initialization necessary to register
exception handlers. If this initialization is not performed before an exception
occurs, any exception will cause the CPU to spin in a tight loop until reset.
To initialize the Freedom Metal exception handlers, initialize CPU interrupts:
.. code-block:: C
struct metal_cpu *cpu0 = metal_get_cpu(0);
if(!cpu) {
/* There was an error acquiring the CPU hart 0 handle */
}
struct metal_interrupt *cpu_int = metal_cpu_interrupt_controller(cpu0);
if(!cpu_int) {
/* There was an error acquiring the CPU interrupt controller */
}
metal_interrupt_init(cpu_int);
The Freedom Metal interrupt API is further documented in :doc:`/devguide/interrupts`
and :doc:`/apiref/interrupt`.
Defining an Exception Handler
-----------------------------
Exception handlers must conform to the following function signature:
.. doxygentypedef:: metal_exception_handler_t
:project: metal
:no-link:
Therefore, an example exception handler might look like:
.. code-block:: C
void my_exception_handler(struct metal_cpu *cpu, int ecode) {
/* Contents of handler */
}
Registering an Exception Handler
--------------------------------
Exception handlers are registered with a given CPU hart for an individual exception
code.
.. code-block:: C
/* CPU Hart 0's interrupt controller must be initialized
* if it is not already */
struct metal_cpu *cpu0 = metal_get_cpu(0);
int rc = metal_cpu_exception_register(cpu0,
<my_ecode>, /* Set to your desired value */
my_exception_handler);
if(rc != 0) {
/* Failed to register exception handler */
}
A single exception handler may be used for multiple exception codes. For this reason,
exception handlers receive the exception code as the ``ecode`` parameter and may use
this to determine how to handle the exception.
Returing Execution after a Faulting Instruction
-----------------------------------------------
The default behavior of a RISC-V CPU is to return execution to the faulting instruction.
If this is not the desired behavior, execution can be returned to the instruction after
the faulting instruction using the following method:
.. code-block:: C
void return_after_fault(struct metal_cpu *cpu, int ecode)
{
/* Get the faulting instruction address */
uintptr_t epc = metal_cpu_get_exception_pc(cpu);
/* Get the length of the faulting instruction */
size_t len = metal_cpu_get_instruction_length(cpu, epc);
/* Advance stored exception program counter by the
* instruction length */
metal_cpu_set_exception_pc(cpu, epc + len);
}
Additional Documentation
------------------------
Additional documentation for the exception handler API can be found in :doc:`The CPU API Reference </apiref/cpu>`.

@ -1,29 +0,0 @@
FE310-G00 PLL
=============
On targets with a PLL compatible with the FE310-G000 SoC, the PLL is configured
at program initialization with a constructor. This PLL sets the clock frequency
of the RISC-V CPU, and users of Freedom Metal who wish to set a specific clock
rate can use Freedom Metal to request that the PLL take on a certain output rate.
In the DeviceTree for your target, there should be a node like the following
(example taken from the SiFive HiFive1):
.. code-block:: DeviceTree
hfclk: clock@4 {
compatible = "sifive,fe310-g000,pll";
clocks = <&hfxoscout &hfroscout>;
clock-names = "pllref", "pllsel0";
reg = <&prci 0x8 &prci 0xc>;
reg-names = "config", "divider";
clock-frequency = <16000000>;
};
The ``clock-frequency`` property of the node sets the requested clock rate of
the FE310-G000 PLL. The PLL driver will attempt to configure the PLL to achieve
this clock rate.
Users should note that the FE310-G000 PLL only supports certain input/output
clock rate ratios, and so the effective output rate of the PLL may differ from
the requested rate.

@ -1,112 +0,0 @@
Interrupt Handlers
==================
The Interrupt Heirarchy
-----------------------
Freedom Metal conceptualizes interrupts as a heirarchy of interrupt controllers.
This heirarchy is established by the interrupt heirarchy of the target platform
itself. Presently, the interrupt heirarchy for a given platform is best documented
by the target's DeviceTree representation, which can be found in
``bsp/<target-name>/design.dts``.
In Freedom Metal, the heirarchy is a tree. The nodes of the tree consist of
``struct metal_interrupt``:
.. doxygenstruct:: metal_interrupt
:project: metal
And the vertices of the tree consist of interrupt ``id``.
.. digraph:: int_heirarchy_graph
cpu [label="CPU"];
cpu_int [label="CPU Interrupt Controller", shape=box];
timer_int [label="Timer Interrupt Controller", shape=box];
soft_int [label="Software Interrupt Controller", shape=box];
cpu -> cpu_int [label="ID = 0"];
cpu_int -> timer_int [label="ID = timer_id"];
cpu_int -> soft_int [label="ID = software_id"];
The CPU Interrupt Controller
----------------------------
The CPU interrupt controller is the top of the interrupt heirarchy. It must be
initialized before any other interrupt controllers are initialized. In example:
.. code-block:: C
struct metal_cpu *cpu0 = metal_get_cpu(0);
if(!cpu) {
/* Unable to get CPU handle */
}
struct metal_interrupt *cpu_int = metal_cpu_interrupt_controller(cpu0);
if(!cpu_int) {
/* Unable to get CPU interrupt handle */
}
metal_interrupt_init(cpu_int);
The CPU interrupt must be enabled for the CPU to receive any interrupts, and any
enabled interrupts can be masked by disabling the CPU interrupt.
.. code-block:: C
int rc = 0;
/* Enable the CPU interrupt */
rc = metal_interrupt_enable(cpu_int, 0);
if(rc != 0) {
/* Failed to enable the CPU interrupt */
}
/* Disable the CPU interrupt */
rc = metal_interrupt_disable(cpu_int, 0);
if(rc != 0) {
/* Failed to disable the CPU interrupt */
}
Interrupt Handlers
------------------
Interrupt handlers must conform to the following function signature:
.. doxygentypedef:: metal_interrupt_handler_t
:project: metal
Therefore, an interrupt handler might look like:
.. code-block:: C
void my_interrupt_handler(int id, void *priv_data) {
/* Contents of handler */
}
Registering an Interrupt Handler
--------------------------------
Interrupt handlers are registered with the interrupt controller for the interrupt
they are servicing. For example, if we want to register a CPU timer interrupt:
.. code-block:: C
struct metal_interrupt *timer_int = metal_cpu_timer_interrupt_controller(cpu0);
if(!timer_int) {
/* Failed to get timer interrupt controller */
}
metal_interrupt_init(timer_int);
int timer_id = metal_cpu_timer_get_interrupt_id(cpu0);
int rc = metal_interrupt_register_handler(timer_int, timer_id, my_interrupt_handler, cpu0);
if(rc != 0) {
/* Failed to register interrupt handler */
}
Additional Documentation
------------------------
Additional documentation for the interrupt handler API can be found in
:doc:`the CPU API reference </apiref/cpu>` and
:doc:`the Interrupt API reference </apiref/interrupt>`.

@ -1,41 +0,0 @@
Instruction Tightly Integrated Memory
=====================================
The Instruction Tightly Integrated Memory (ITIM) is an optional feature
on certain SiFive RISC-V CPUs. The ITIM is a memory device which is
optimized in the CoreIP memory heirarchy to provide low-latency
access to instruction memory.
Freedom Metal provides the ability to designate functions to run out of
the ITIM by decorating the functions with the following "decorator":
.. doxygendefine:: METAL_PLACE_IN_ITIM
:project: metal
For example:
.. code-block:: C
METAL_PLACE_IN_ITIM
void my_itim_func() {
/* This code will run out of the ITIM */
}
Caveats
-------
The ``METAL_PLACE_IN_ITIM`` decorator tells the toolchain to link the
decorated function into the ITIM memory. However, compiler optimizations
such as function inlining may cause execution to never transfer to
instructions fetched from the ITIM.
If this compiler optimization is not desired, one workaround is to
tell the compiler to not inline the function:
.. code-block:: C
__attribute__((noinline))
METAL_PLACE_IN_ITIM
void my_itim_func() {
/* This code will run out of the ITIM */
}

@ -1,88 +0,0 @@
Physical Memory Protection
==========================
Physical Memory Protection (PMP) is a part of the RISC-V Privileged Architecture
Specification which discribes the interface for a standard RISC-V memory
protection unit.
The PMP defines a finite number of PMP regions which can be individually configured
to enforce access permissions to a range of addresses in memory. Each PMP region
is configurable with the following options:
.. doxygenstruct:: metal_pmp_config
:project: metal
:members:
:no-link:
Initializing the PMP
--------------------
All PMP-related functions first depend on having a handle to the PMP device:
.. code-block:: C
struct metal_pmp *pmp = metal_pmp_get_device();
if(!pmp) {
/* Failed to get PMP device handle */
}
PMP initialization is optional and has the effect of disabling all PMP regions,
if possible:
.. code-block:: C
metal_pmp_init(pmp);
The number of PMP regions available can be retrieved from the PMP device handle:
.. doxygenstruct:: metal_pmp
:project: metal
:members:
:no-link:
Configuring a PMP Region
------------------------
Freedom Metal has a set of APIs for configuring a PMP region. The most generic of these
is
.. doxygenfunction:: metal_pmp_set_region
:project: metal
This function allows for the configuration of all PMP region settings.
Additional APIs are provided for granularly changing individual PMP region settings.
For example:
.. doxygenfunction:: metal_pmp_set_address
:project: metal
:no-link:
.. doxygenfunction:: metal_pmp_lock
:project: metal
:no-link:
.. doxygenfunction:: metal_pmp_set_writeable
:project: metal
:no-link:
Additional documentation for this API is provided in :doc:`the PMP API reference </apiref/pmp>`.
The RISC-V specification allows implementation of PMP to hard-wire the configuration
values of PMP regions. In these cases, attempts to configure these PMP regions will
fail.
Handling PMP Access Faults
--------------------------
Attempted memory accesses which the PMP is configured to prevent trigger a
CPU exception. These exceptions can be handled by installing a CPU exception
handler for exception codes related to memory access faults.
Additional documentation about creating and registering exception handlers can
be found in :doc:`the Exception Handlers Developer Guide </devguide/exceptions>`.
Additional Documentation
------------------------
Additional documentation about the Physical Memory Protection system and fault
handling on RISC-V systems can be found in
`The RISC-V Privileged ISA Specification v1.10 <https://riscv.org/specifications/privileged-isa/>`_.

@ -1,24 +0,0 @@
Standard I/O
============
Freedom Metal integrates with libc ``STDOUT`` to provide virtual terminal support.
The default ``STDOUT`` device is the first UART serial peripheral on the target.
If no UART serial peripheral is present, such as in the case of SiFive CoreIP
test harnesses, then the bytes sent to ``STDOUT`` are dropped.
Hello World
-----------
Using the virtual terminal with Freedom Metal is exactly what you might expect:
.. code-block:: C
:linenos:
#include <stdio.h>
int main(void) {
printf("Hello, world!");
return 0;
}

@ -1,25 +0,0 @@
Freedom Metal
=============
This is the documentation for the SiFive Freedom Metal library |version|.
Freedom Metal is generally available from the `Freedom Metal GitHub Repository`_.
.. _Freedom Metal GitHub Repository:
https://github.com/sifive/freedom-metal
Table of Contents
-----------------
.. toctree::
:maxdepth: 2
introduction
devguide
api
Indices and tables
------------------
* :ref:`genindex`
* :ref:`search`

@ -1,37 +0,0 @@
Introduction to Freedom Metal
=============================
What is Freedom Metal?
----------------------
Freedom Metal enables portable, bare-metal application development for all of
SiFive's RISC-V IP, FPGA evaluation targets, and development boards.
Freedom Metal provides:
- A bare-metal C application environment
- An API for controlling CPU features and peripherals
- The ability to retarget to any SiFive RISC-V product
This makes Freedom Metal suitable for:
- Writing portable hardware tests
- Bootstrapping bare metal application development
- A RISC-V hardware abstraction layer
- And more!
How Do I Use Freedom Metal?
---------------------------
The best way to get started writing applications with Freedom Metal is to use
the `SiFive Freedom E SDK`_ which bundles the build scripts and configuration
necessary to use Freedom Metal with SiFive's standard evaluation products.
If you prefer working with an Integrated Development Environment (IDE),
`SiFive Freedom Studio`_ comes packaged with a prebuilt toolchain and the same
Freedom Metal examples from Freedom E SDK.
.. _SiFive Freedom E SDK:
https://github.com/sifive/freedom-e-sdk
.. _SiFive Freedom Studio:
https://www.sifive.com/boards#software

Binary file not shown.

Before

Width:  |  Height:  |  Size: 673 B

@ -1,688 +0,0 @@
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Georgia, serif;
font-size: 17px;
background-color: #fff;
color: #000;
margin: 0;
padding: 0;
}
div.document {
width: 940px;
margin: 30px auto 0 auto;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 220px;
}
div.sphinxsidebar {
width: 220px;
font-size: 14px;
line-height: 1.5;
}
hr {
border: 1px solid #B1B4B6;
}
div.body {
background-color: #fff;
color: #3E4349;
padding: 0 30px 0 30px;
}
div.body > .section {
text-align: left;
}
div.footer {
width: 940px;
margin: 20px auto 30px auto;
font-size: 14px;
color: #888;
text-align: right;
}
div.footer a {
color: #888;
}
p.caption {
font-family: inherit;
font-size: inherit;
}
div.relations {
display: none;
}
div.sphinxsidebar a {
color: #444;
text-decoration: none;
border-bottom: 1px dotted #999;
}
div.sphinxsidebar a:hover {
border-bottom: 1px solid #999;
}
div.sphinxsidebarwrapper {
padding: 18px 10px;
}
div.sphinxsidebarwrapper p.logo {
padding: 0;
margin: -10px 0 0 0px;
text-align: center;
}
div.sphinxsidebarwrapper h1.logo {
margin-top: -10px;
text-align: center;
margin-bottom: 5px;
text-align: left;
}
div.sphinxsidebarwrapper h1.logo-name {
margin-top: 0px;
}
div.sphinxsidebarwrapper p.blurb {
margin-top: 0;
font-style: normal;
}
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
font-family: Georgia, serif;
color: #444;
font-size: 24px;
font-weight: normal;
margin: 0 0 5px 0;
padding: 0;
}
div.sphinxsidebar h4 {
font-size: 20px;
}
div.sphinxsidebar h3 a {
color: #444;
}
div.sphinxsidebar p.logo a,
div.sphinxsidebar h3 a,
div.sphinxsidebar p.logo a:hover,
div.sphinxsidebar h3 a:hover {
border: none;
}
div.sphinxsidebar p {
color: #555;
margin: 10px 0;
}
div.sphinxsidebar ul {
margin: 10px 0;
padding: 0;
color: #000;
}
div.sphinxsidebar ul li.toctree-l1 > a {
font-size: 120%;
}
div.sphinxsidebar ul li.toctree-l2 > a {
font-size: 110%;
}
div.sphinxsidebar input {
border: 1px solid #CCC;
font-family: Georgia, serif;
font-size: 1em;
}
div.sphinxsidebar hr {
border: none;
height: 1px;
color: #AAA;
background: #AAA;
text-align: left;
margin-left: 0;
width: 50%;
}
/* -- body styles ----------------------------------------------------------- */
a {
color: #004B6B;
text-decoration: underline;
}
a:hover {
color: #6D4100;
text-decoration: underline;
}
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Georgia, serif;
font-weight: normal;
margin: 30px 0px 10px 0px;
padding: 0;
}
div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
div.body h2 { font-size: 180%; }
div.body h3 { font-size: 150%; }
div.body h4 { font-size: 130%; }
div.body h5 { font-size: 100%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #DDD;
padding: 0 4px;
text-decoration: none;
}
a.headerlink:hover {
color: #444;
background: #EAEAEA;
}
div.body p, div.body dd, div.body li {
line-height: 1.4em;
}
div.admonition {
margin: 20px 0px;
padding: 10px 30px;
background-color: #EEE;
border: 1px solid #CCC;
}
div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fafafa;
}
div.admonition p.admonition-title {
font-family: Georgia, serif;
font-weight: normal;
font-size: 24px;
margin: 0 0 10px 0;
padding: 0;
line-height: 1;
}
div.admonition p.last {
margin-bottom: 0;
}
div.highlight {
background-color: #fff;
}
dt:target, .highlight {
background: #FAF3E8;
}
div.warning {
background-color: #FCC;
border: 1px solid #FAA;
}
div.danger {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.error {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.caution {
background-color: #FCC;
border: 1px solid #FAA;
}
div.attention {
background-color: #FCC;
border: 1px solid #FAA;
}
div.important {
background-color: #EEE;
border: 1px solid #CCC;
}
div.note {
background-color: #EEE;
border: 1px solid #CCC;
}
div.tip {
background-color: #EEE;
border: 1px solid #CCC;
}
div.hint {
background-color: #EEE;
border: 1px solid #CCC;
}
div.seealso {
background-color: #EEE;
border: 1px solid #CCC;
}
div.topic {
background-color: #EEE;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre, tt, code {
font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-size: 0.9em;
}
.hll {
background-color: #FFC;
margin: 0 -12px;
padding: 0 12px;
display: block;
}
img.screenshot {
}
tt.descname, tt.descclassname, code.descname, code.descclassname {
font-size: 0.95em;
}
tt.descname, code.descname {
padding-right: 0.08em;
}
img.screenshot {
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils {
border: 1px solid #888;
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils td, table.docutils th {
border: 1px solid #888;
padding: 0.25em 0.7em;
}
table.field-list, table.footnote {
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
table.footnote {
margin: 15px 0;
width: 100%;
border: 1px solid #EEE;
background: #FDFDFD;
font-size: 0.9em;
}
table.footnote + table.footnote {
margin-top: -15px;
border-top: none;
}
table.field-list th {
padding: 0 0.8em 0 0;
}
table.field-list td {
padding: 0;
}
table.field-list p {
margin-bottom: 0.8em;
}
/* Cloned from
* https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
*/
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
table.footnote td.label {
width: .1px;
padding: 0.3em 0 0.3em 0.5em;
}
table.footnote td {
padding: 0.3em 0.5em;
}
dl {
margin: 0;
padding: 0;
}
dl dd {
margin-left: 30px;
}
blockquote {
margin: 0 0 0 30px;
padding: 0;
}
ul, ol {
/* Matches the 30px from the narrow-screen "li > ul" selector below */
margin: 10px 0 10px 30px;
padding: 0;
}
pre {
background: #EEE;
padding: 7px 30px;
margin: 15px 0px;
line-height: 1.3em;
}
div.viewcode-block:target {
background: #ffd;
}
dl pre, blockquote pre, li pre {
margin-left: 0;
padding-left: 30px;
}
tt, code {
background-color: #ecf0f3;
color: #222;
/* padding: 1px 2px; */
}
tt.xref, code.xref, a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fff;
}
a.reference {
text-decoration: none;
border-bottom: 1px dotted #004B6B;
}
/* Don't put an underline on images */
a.image-reference, a.image-reference:hover {
border-bottom: none;
}
a.reference:hover {
border-bottom: 1px solid #6D4100;
}
a.footnote-reference {
text-decoration: none;
font-size: 0.7em;
vertical-align: top;
border-bottom: 1px dotted #004B6B;
}
a.footnote-reference:hover {
border-bottom: 1px solid #6D4100;
}
a:hover tt, a:hover code {
background: #EEE;
}
@media screen and (max-width: 870px) {
div.sphinxsidebar {
display: none;
}
div.document {
width: 100%;
}
div.documentwrapper {
margin-left: 0;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
}
div.bodywrapper {
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
}
ul {
margin-left: 0;
}
li > ul {
/* Matches the 30px from the "ul, ol" selector above */
margin-left: 30px;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.bodywrapper {
margin: 0;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
@media screen and (max-width: 875px) {
body {
margin: 0;
padding: 20px 30px;
}
div.documentwrapper {
float: none;
background: #fff;
}
div.sphinxsidebar {
display: block;
float: none;
width: 102.5%;
margin: 50px -30px -20px -30px;
padding: 10px 20px;
background: #333;
color: #FFF;
}
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #fff;
}
div.sphinxsidebar a {
color: #AAA;
}
div.sphinxsidebar p.logo {
display: none;
}
div.document {
width: 100%;
margin: 0;
}
div.footer {
display: none;
}
div.bodywrapper {
margin: 0;
}
div.body {
min-height: 0;
padding: 0;
}
.rtd_doc_footer {
display: none;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
/* misc. */
.revsys-inline {
display: none!important;
}
/* Make nested-list/multi-paragraph items look better in Releases changelog
* pages. Without this, docutils' magical list fuckery causes inconsistent
* formatting between different release sub-lists.
*/
div#changelog > div.section > ul > li > p:only-child {
margin-bottom: 0;
}
/* Hide fugly table cell borders in ..bibliography:: directive output */
table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
border: none;
/* Below needed in some edge cases; if not applied, bottom shadows appear */
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
/* relbar */
.related {
line-height: 30px;
width: 100%;
font-size: 0.9rem;
}
.related.top {
border-bottom: 1px solid #EEE;
margin-bottom: 20px;
}
.related.bottom {
border-top: 1px solid #EEE;
}
.related ul {
padding: 0;
margin: 0;
list-style: none;
}
.related li {
display: inline;
}
nav#rellinks {
float: right;
}
nav#rellinks li+li:before {
content: "|";
}
nav#breadcrumbs li+li:before {
content: "\00BB";
}
/* Hide certain items when printing */
@media print {
div.related {
display: none;
}
}

@ -1,665 +0,0 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
dl {
margin-bottom: 15px;
}
dd p {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
div.code-block-caption {
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
div.code-block-caption + div > div.highlight > pre {
margin-top: 0;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
padding: 1em 1em 0;
}
div.literal-block-wrapper div.highlight {
margin: 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: relative;
left: 0px;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 641 B

@ -1,313 +0,0 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var bbox = span.getBBox();
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
var parentOfText = node.parentNode.parentNode;
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined')
return string;
return (typeof translated === 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
$(document).keyup(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box or textarea
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
}
case 39: // right
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
}
}
});
}
};
// quick alias for translations
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

@ -1,9 +0,0 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: 'v201905',
LANGUAGE: 'None',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 B

@ -1,69 +0,0 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #333333 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #208050 } /* Literal.Number.Bin */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #06287e } /* Name.Function.Magic */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

@ -1,761 +0,0 @@
/*
* searchtools.js_t
* ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilities for the full-text search.
*
* :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* Non-minified version JS is _stemmer.js if file is provided */
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}
/**
* Simple result scoring code.
*/
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score]
// and returns the new score.
/*
score: function(result) {
return result[4];
},
*/
// query matches the full name of an object
objNameMatch: 11,
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5}, // used to be unimportantResults
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
// query found in terms
term: 5
};
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}
/**
* Search Module
*/
var Search = {
_index : null,
_queued_query : null,
_pulse_status : -1,
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
hasIndex : function() {
return this._index !== null;
},
deferQuery : function(query) {
this._queued_query = query;
},
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch : function(query) {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p style="display: none"></p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
},
/**
* execute search (requires search index to be loaded)
*/
query : function(query) {
var i;
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
// stem the searchterms and add them to the correct list
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = splitQuery(query);
var objectterms = [];
for (i = 0; i < tmp.length; i++) {
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase());
}
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase());
// prevent stemmer from cutting word smaller than two chars
if(word.length < 3 && tmp[i].length >= 3) {
word = tmp[i];
}
var toAppend;
// select the correct list
if (word[0] == '-') {
toAppend = excluded;
word = word.substr(1);
}
else {
toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
}
// only add if not already in the list
if (!$u.contains(toAppend, word))
toAppend.push(word);
}
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// prepare search
var terms = this._index.terms;
var titleterms = this._index.titleterms;
// array of [filename, title, anchor, descr, score]
var results = [];
$('#search-progress').empty();
// lookup as object
for (i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0, i),
objectterms.slice(i+1, objectterms.length));
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
// lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
// now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then
// alphabetically
results.sort(function(a, b) {
var left = a[4];
var right = b[4];
if (left > right) {
return 1;
} else if (left < right) {
return -1;
} else {
// same score: sort alphabetically
left = a[1].toLowerCase();
right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
}
});
// for debugging
//Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li style="display:none"></li>');
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
listItem.append($('<a/>').attr('href',
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
highlightstring + item[2]).html(item[1]));
} else {
// normal html builders
listItem.append($('<a/>').attr('href',
item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
highlightstring + item[2]).html(item[1]));
}
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
if (suffix === undefined) {
suffix = '.txt';
}
$.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}});
} else {
// no source available, just display title
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
},
/**
* search for object names
*/
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var docnames = this._index.docnames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
var i;
var results = [];
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
if (fullname.toLowerCase().indexOf(object) > -1) {
var score = 0;
var parts = fullname.split('.');
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullname == object || parts[parts.length - 1] == object) {
score += Scorer.objNameMatch;
// matches in last name
} else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch;
}
var match = objects[prefix][name];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3];
if (anchor === '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) {
score += Scorer.objPrio[match[2]];
} else {
score += Scorer.objPrioDefault;
}
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
}
}
}
return results;
},
/**
* search for full-text terms in the index
*/
performTermsSearch : function(searchterms, excluded, terms, titleterms) {
var docnames = this._index.docnames;
var filenames = this._index.filenames;
var titles = this._index.titles;
var i, j, file;
var fileMap = {};
var scoreMap = {};
var results = [];
// perform the search on the required terms
for (i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
var files = [];
var _o = [
{files: terms[word], score: Scorer.term},
{files: titleterms[word], score: Scorer.title}
];
// no match but word was a required one
if ($u.every(_o, function(o){return o.files === undefined;})) {
break;
}
// found search word in contents
$u.each(_o, function(o) {
var _files = o.files;
if (_files === undefined)
return
if (_files.length === undefined)
_files = [_files];
files = files.concat(_files);
// set score for the word in each file to Scorer.term
for (j = 0; j < _files.length; j++) {
file = _files[j];
if (!(file in scoreMap))
scoreMap[file] = {}
scoreMap[file][word] = o.score;
}
});
// create the mapping
for (j = 0; j < files.length; j++) {
file = files[j];
if (file in fileMap)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
// now check if the files don't contain excluded terms
for (file in fileMap) {
var valid = true;
// check if all requirements are matched
if (fileMap[file].length != searchterms.length)
continue;
// ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
titleterms[excluded[i]] == file ||
$u.contains(terms[excluded[i]] || [], file) ||
$u.contains(titleterms[excluded[i]] || [], file)) {
valid = false;
break;
}
}
// if we have still a valid result we can add it to the result list
if (valid) {
// select one (max) score for the file.
// for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
}
}
return results;
},
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed
* words. the first one is used to find the occurrence, the
* latter for highlighting it.
*/
makeSearchSummary : function(text, keywords, hlwords) {
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<div class="context"></div>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
};
$(document).ready(function() {
Search.init();
});

@ -1,999 +0,0 @@
// Underscore.js 1.3.1
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function() {
// Baseline setup
// --------------
// Establish the root object, `window` in the browser, or `global` on the server.
var root = this;
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
// Establish the object that gets returned to break out of a loop iteration.
var breaker = {};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
var slice = ArrayProto.slice,
unshift = ArrayProto.unshift,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeForEach = ArrayProto.forEach,
nativeMap = ArrayProto.map,
nativeReduce = ArrayProto.reduce,
nativeReduceRight = ArrayProto.reduceRight,
nativeFilter = ArrayProto.filter,
nativeEvery = ArrayProto.every,
nativeSome = ArrayProto.some,
nativeIndexOf = ArrayProto.indexOf,
nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) { return new wrapper(obj); };
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object via a string identifier,
// for Closure Compiler "advanced" mode.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root['_'] = _;
}
// Current version.
_.VERSION = '1.3.1';
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results[results.length] = iterator.call(context, value, index, list);
});
if (obj.length === +obj.length) results.length = obj.length;
return results;
};
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduce && obj.reduce === nativeReduce) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
}
each(obj, function(value, index, list) {
if (!initial) {
memo = value;
initial = true;
} else {
memo = iterator.call(context, memo, value, index, list);
}
});
if (!initial) throw new TypeError('Reduce of empty array with no initial value');
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
var reversed = _.toArray(obj).reverse();
if (context && !initial) iterator = _.bind(iterator, context);
return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, iterator, context) {
var result;
any(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (!iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, iterator, context) {
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
var any = _.some = _.any = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
each(obj, function(value, index, list) {
if (result || (result = iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
// Determine if a given value is included in the array or object using `===`.
// Aliased as `contains`.
_.include = _.contains = function(obj, target) {
var found = false;
if (obj == null) return found;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
found = any(obj, function(value) {
return value === target;
});
return found;
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
return _.map(obj, function(value) {
return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, function(value){ return value[key]; });
};
// Return the maximum element or (element-based computation).
_.max = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
if (!iterator && _.isEmpty(obj)) return -Infinity;
var result = {computed : -Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed >= result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
if (!iterator && _.isEmpty(obj)) return Infinity;
var result = {computed : Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed < result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Shuffle an array.
_.shuffle = function(obj) {
var shuffled = [], rand;
each(obj, function(value, index, list) {
if (index == 0) {
shuffled[0] = value;
} else {
rand = Math.floor(Math.random() * (index + 1));
shuffled[index] = shuffled[rand];
shuffled[rand] = value;
}
});
return shuffled;
};
// Sort the object's values by a criterion produced by an iterator.
_.sortBy = function(obj, iterator, context) {
return _.pluck(_.map(obj, function(value, index, list) {
return {
value : value,
criteria : iterator.call(context, value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}), 'value');
};
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = function(obj, val) {
var result = {};
var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
each(obj, function(value, index) {
var key = iterator(value, index);
(result[key] || (result[key] = [])).push(value);
});
return result;
};
// Use a comparator function to figure out at what index an object should
// be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iterator) {
iterator || (iterator = _.identity);
var low = 0, high = array.length;
while (low < high) {
var mid = (low + high) >> 1;
iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
}
return low;
};
// Safely convert anything iterable into a real, live array.
_.toArray = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
if (_.isArray(iterable)) return slice.call(iterable);
if (_.isArguments(iterable)) return slice.call(iterable);
return _.values(iterable);
};
// Return the number of elements in an object.
_.size = function(obj) {
return _.toArray(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head`. The **guard** check allows it to work
// with `_.map`.
_.first = _.head = function(array, n, guard) {
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
};
// Returns everything but the last entry of the array. Especcialy useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
_.initial = function(array, n, guard) {
return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
};
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
if ((n != null) && !guard) {
return slice.call(array, Math.max(array.length - n, 0));
} else {
return array[array.length - 1];
}
};
// Returns everything but the first entry of the array. Aliased as `tail`.
// Especially useful on the arguments object. Passing an **index** will return
// the rest of the values in the array from that index onward. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = function(array, index, guard) {
return slice.call(array, (index == null) || guard ? 1 : index);
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, function(value){ return !!value; });
};
// Return a completely flattened version of an array.
_.flatten = function(array, shallow) {
return _.reduce(array, function(memo, value) {
if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
memo[memo.length] = value;
return memo;
}, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
return _.difference(array, slice.call(arguments, 1));
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iterator) {
var initial = iterator ? _.map(array, iterator) : array;
var result = [];
_.reduce(initial, function(memo, el, i) {
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
memo[memo.length] = el;
result[result.length] = array[i];
}
return memo;
}, []);
return result;
};
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
return _.uniq(_.flatten(arguments, true));
};
// Produce an array that contains every item shared between all the
// passed-in arrays. (Aliased as "intersect" for back-compat.)
_.intersection = _.intersect = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.indexOf(other, item) >= 0;
});
});
};
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
var rest = _.flatten(slice.call(arguments, 1));
return _.filter(array, function(value){ return !_.include(rest, value); });
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
var args = slice.call(arguments);
var length = _.max(_.pluck(args, 'length'));
var results = new Array(length);
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
return results;
};
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i, l;
if (isSorted) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
_.lastIndexOf = function(array, item) {
if (array == null) return -1;
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
var i = array.length;
while (i--) if (i in array && array[i] === item) return i;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = arguments[2] || 1;
var len = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
var range = new Array(len);
while(idx < len) {
range[idx++] = start;
start += step;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Reusable constructor function for prototype setting.
var ctor = function(){};
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Binding with arguments is also known as `curry`.
// Delegates to **ECMAScript 5**'s native `Function.bind` if available.
// We check for `func.bind` first, to fail fast when `func` is undefined.
_.bind = function bind(func, context) {
var bound, args;
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError;
args = slice.call(arguments, 2);
return bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
ctor.prototype = func.prototype;
var self = new ctor;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (Object(result) === result) return result;
return self;
};
};
// Bind all of an object's methods to that object. Useful for ensuring that
// all callbacks defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length == 0) funcs = _.functions(obj);
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memo = {};
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){ return func.apply(func, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time.
_.throttle = function(func, wait) {
var context, args, timeout, throttling, more;
var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
return function() {
context = this; args = arguments;
var later = function() {
timeout = null;
if (more) func.apply(context, args);
whenDone();
};
if (!timeout) timeout = setTimeout(later, wait);
if (throttling) {
more = true;
} else {
func.apply(context, args);
}
whenDone();
throttling = true;
};
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds.
_.debounce = function(func, wait) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
func.apply(context, args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
return memo = func.apply(this, arguments);
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return function() {
var args = [func].concat(slice.call(arguments, 0));
return wrapper.apply(this, args);
};
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var funcs = arguments;
return function() {
var args = arguments;
for (var i = funcs.length - 1; i >= 0; i--) {
args = [funcs[i].apply(this, args)];
}
return args[0];
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
if (times <= 0) return func();
return function() {
if (--times < 1) { return func.apply(this, arguments); }
};
};
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
return _.map(obj, _.identity);
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
obj[prop] = source[prop];
}
});
return obj;
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (obj[prop] == null) obj[prop] = source[prop];
}
});
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Internal recursive comparison function.
function eq(a, b, stack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
if (a === b) return a !== 0 || 1 / a == 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
if (a._chain) a = a._wrapped;
if (b._chain) b = b._wrapped;
// Invoke a custom `isEqual` method if one is provided.
if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className != toString.call(b)) return false;
switch (className) {
// Strings, numbers, dates, and booleans are compared by value.
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return a == String(b);
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
// other numeric values.
return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a == +b;
// RegExps are compared by their source patterns and flags.
case '[object RegExp]':
return a.source == b.source &&
a.global == b.global &&
a.multiline == b.multiline &&
a.ignoreCase == b.ignoreCase;
}
if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
var length = stack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (stack[length] == a) return true;
}
// Add the first object to the stack of traversed objects.
stack.push(a);
var size = 0, result = true;
// Recursively compare objects and arrays.
if (className == '[object Array]') {
// Compare array lengths to determine if a deep comparison is necessary.
size = a.length;
result = size == b.length;
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
// Ensure commutative equality for sparse arrays.
if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
}
}
} else {
// Objects with different constructors are not equivalent.
if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
// Deep compare objects.
for (var key in a) {
if (_.has(a, key)) {
// Count the expected number of properties.
size++;
// Deep compare each member.
if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
}
}
// Ensure that both objects contain the same number of properties.
if (result) {
for (key in b) {
if (_.has(b, key) && !(size--)) break;
}
result = !size;
}
}
// Remove the first object from the stack of traversed objects.
stack.pop();
return result;
}
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
return eq(a, b, []);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType == 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
return obj === Object(obj);
};
// Is a given variable an arguments object?
_.isArguments = function(obj) {
return toString.call(obj) == '[object Arguments]';
};
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return !!(obj && _.has(obj, 'callee'));
};
}
// Is a given value a function?
_.isFunction = function(obj) {
return toString.call(obj) == '[object Function]';
};
// Is a given value a string?
_.isString = function(obj) {
return toString.call(obj) == '[object String]';
};
// Is a given value a number?
_.isNumber = function(obj) {
return toString.call(obj) == '[object Number]';
};
// Is the given value `NaN`?
_.isNaN = function(obj) {
// `NaN` is the only value for which `===` is not reflexive.
return obj !== obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};
// Is a given value a date?
_.isDate = function(obj) {
return toString.call(obj) == '[object Date]';
};
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return toString.call(obj) == '[object RegExp]';
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Has own property?
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iterators.
_.identity = function(value) {
return value;
};
// Run a function **n** times.
_.times = function (n, iterator, context) {
for (var i = 0; i < n; i++) iterator.call(context, i);
};
// Escape a string for HTML interpolation.
_.escape = function(string) {
return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
};
// Add your own custom functions to the Underscore object, ensuring that
// they're correctly added to the OOP wrapper as well.
_.mixin = function(obj) {
each(_.functions(obj), function(name){
addToWrapper(name, _[name] = obj[name]);
});
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = idCounter++;
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /.^/;
// Within an interpolation, evaluation, or escaping, remove HTML escaping
// that had been previously added.
var unescape = function(code) {
return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
};
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'with(obj||{}){__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.escape || noMatch, function(match, code) {
return "',_.escape(" + unescape(code) + "),'";
})
.replace(c.interpolate || noMatch, function(match, code) {
return "'," + unescape(code) + ",'";
})
.replace(c.evaluate || noMatch, function(match, code) {
return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
+ "');}return __p.join('');";
var func = new Function('obj', '_', tmpl);
if (data) return func(data, _);
return function(data) {
return func.call(this, data, _);
};
};
// Add a "chain" function, which will delegate to the wrapper.
_.chain = function(obj) {
return _(obj).chain();
};
// The OOP Wrapper
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
var wrapper = function(obj) { this._wrapped = obj; };
// Expose `wrapper.prototype` as `_.prototype`
_.prototype = wrapper.prototype;
// Helper function to continue chaining intermediate results.
var result = function(obj, chain) {
return chain ? _(obj).chain() : obj;
};
// A method to easily add functions to the OOP wrapper.
var addToWrapper = function(name, func) {
wrapper.prototype[name] = function() {
var args = slice.call(arguments);
unshift.call(args, this._wrapped);
return result(func.apply(_, args), this._chain);
};
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
var wrapped = this._wrapped;
method.apply(wrapped, arguments);
var length = wrapped.length;
if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
return result(wrapped, this._chain);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
return result(method.apply(this._wrapped, arguments), this._chain);
};
});
// Start chaining a wrapped Underscore object.
wrapper.prototype.chain = function() {
this._chain = true;
return this;
};
// Extracts the result from a wrapped and chained object.
wrapper.prototype.value = function() {
return this._wrapped;
};
}).call(this);

@ -1,31 +0,0 @@
// Underscore.js 1.3.1
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 B

@ -1,808 +0,0 @@
/*
* websupport.js
* ~~~~~~~~~~~~~
*
* sphinx.websupport utilities for all documentation.
*
* :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
(function($) {
$.fn.autogrow = function() {
return this.each(function() {
var textarea = this;
$.fn.autogrow.resize(textarea);
$(textarea)
.focus(function() {
textarea.interval = setInterval(function() {
$.fn.autogrow.resize(textarea);
}, 500);
})
.blur(function() {
clearInterval(textarea.interval);
});
});
};
$.fn.autogrow.resize = function(textarea) {
var lineHeight = parseInt($(textarea).css('line-height'), 10);
var lines = textarea.value.split('\n');
var columns = textarea.cols;
var lineCount = 0;
$.each(lines, function() {
lineCount += Math.ceil(this.length / columns) || 1;
});
var height = lineHeight * (lineCount + 1);
$(textarea).css('height', height);
};
})(jQuery);
(function($) {
var comp, by;
function init() {
initEvents();
initComparator();
}
function initEvents() {
$(document).on("click", 'a.comment-close', function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
});
$(document).on("click", 'a.vote', function(event) {
event.preventDefault();
handleVote($(this));
});
$(document).on("click", 'a.reply', function(event) {
event.preventDefault();
openReply($(this).attr('id').substring(2));
});
$(document).on("click", 'a.close-reply', function(event) {
event.preventDefault();
closeReply($(this).attr('id').substring(2));
});
$(document).on("click", 'a.sort-option', function(event) {
event.preventDefault();
handleReSort($(this));
});
$(document).on("click", 'a.show-proposal', function(event) {
event.preventDefault();
showProposal($(this).attr('id').substring(2));
});
$(document).on("click", 'a.hide-proposal', function(event) {
event.preventDefault();
hideProposal($(this).attr('id').substring(2));
});
$(document).on("click", 'a.show-propose-change', function(event) {
event.preventDefault();
showProposeChange($(this).attr('id').substring(2));
});
$(document).on("click", 'a.hide-propose-change', function(event) {
event.preventDefault();
hideProposeChange($(this).attr('id').substring(2));
});
$(document).on("click", 'a.accept-comment', function(event) {
event.preventDefault();
acceptComment($(this).attr('id').substring(2));
});
$(document).on("click", 'a.delete-comment', function(event) {
event.preventDefault();
deleteComment($(this).attr('id').substring(2));
});
$(document).on("click", 'a.comment-markup', function(event) {
event.preventDefault();
toggleCommentMarkupBox($(this).attr('id').substring(2));
});
}
/**
* Set comp, which is a comparator function used for sorting and
* inserting comments into the list.
*/
function setComparator() {
// If the first three letters are "asc", sort in ascending order
// and remove the prefix.
if (by.substring(0,3) == 'asc') {
var i = by.substring(3);
comp = function(a, b) { return a[i] - b[i]; };
} else {
// Otherwise sort in descending order.
comp = function(a, b) { return b[by] - a[by]; };
}
// Reset link styles and format the selected sort option.
$('a.sel').attr('href', '#').removeClass('sel');
$('a.by' + by).removeAttr('href').addClass('sel');
}
/**
* Create a comp function. If the user has preferences stored in
* the sortBy cookie, use those, otherwise use the default.
*/
function initComparator() {
by = 'rating'; // Default to sort by rating.
// If the sortBy cookie is set, use that instead.
if (document.cookie.length > 0) {
var start = document.cookie.indexOf('sortBy=');
if (start != -1) {
start = start + 7;
var end = document.cookie.indexOf(";", start);
if (end == -1) {
end = document.cookie.length;
by = unescape(document.cookie.substring(start, end));
}
}
}
setComparator();
}
/**
* Show a comment div.
*/
function show(id) {
$('#ao' + id).hide();
$('#ah' + id).show();
var context = $.extend({id: id}, opts);
var popup = $(renderTemplate(popupTemplate, context)).hide();
popup.find('textarea[name="proposal"]').hide();
popup.find('a.by' + by).addClass('sel');
var form = popup.find('#cf' + id);
form.submit(function(event) {
event.preventDefault();
addComment(form);
});
$('#s' + id).after(popup);
popup.slideDown('fast', function() {
getComments(id);
});
}
/**
* Hide a comment div.
*/
function hide(id) {
$('#ah' + id).hide();
$('#ao' + id).show();
var div = $('#sc' + id);
div.slideUp('fast', function() {
div.remove();
});
}
/**
* Perform an ajax request to get comments for a node
* and insert the comments into the comments tree.
*/
function getComments(id) {
$.ajax({
type: 'GET',
url: opts.getCommentsURL,
data: {node: id},
success: function(data, textStatus, request) {
var ul = $('#cl' + id);
var speed = 100;
$('#cf' + id)
.find('textarea[name="proposal"]')
.data('source', data.source);
if (data.comments.length === 0) {
ul.html('<li>No comments yet.</li>');
ul.data('empty', true);
} else {
// If there are comments, sort them and put them in the list.
var comments = sortComments(data.comments);
speed = data.comments.length * 100;
appendComments(comments, ul);
ul.data('empty', false);
}
$('#cn' + id).slideUp(speed + 200);
ul.slideDown(speed);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem retrieving the comments.');
},
dataType: 'json'
});
}
/**
* Add a comment via ajax and insert the comment into the comment tree.
*/
function addComment(form) {
var node_id = form.find('input[name="node"]').val();
var parent_id = form.find('input[name="parent"]').val();
var text = form.find('textarea[name="comment"]').val();
var proposal = form.find('textarea[name="proposal"]').val();
if (text == '') {
showError('Please enter a comment.');
return;
}
// Disable the form that is being submitted.
form.find('textarea,input').attr('disabled', 'disabled');
// Send the comment to the server.
$.ajax({
type: "POST",
url: opts.addCommentURL,
dataType: 'json',
data: {
node: node_id,
parent: parent_id,
text: text,
proposal: proposal
},
success: function(data, textStatus, error) {
// Reset the form.
if (node_id) {
hideProposeChange(node_id);
}
form.find('textarea')
.val('')
.add(form.find('input'))
.removeAttr('disabled');
var ul = $('#cl' + (node_id || parent_id));
if (ul.data('empty')) {
$(ul).empty();
ul.data('empty', false);
}
insertComment(data.comment);
var ao = $('#ao' + node_id);
ao.find('img').attr({'src': opts.commentBrightImage});
if (node_id) {
// if this was a "root" comment, remove the commenting box
// (the user can get it back by reopening the comment popup)
$('#ca' + node_id).slideUp();
}
},
error: function(request, textStatus, error) {
form.find('textarea,input').removeAttr('disabled');
showError('Oops, there was a problem adding the comment.');
}
});
}
/**
* Recursively append comments to the main comment list and children
* lists, creating the comment tree.
*/
function appendComments(comments, ul) {
$.each(comments, function() {
var div = createCommentDiv(this);
ul.append($(document.createElement('li')).html(div));
appendComments(this.children, div.find('ul.comment-children'));
// To avoid stagnating data, don't store the comments children in data.
this.children = null;
div.data('comment', this);
});
}
/**
* After adding a new comment, it must be inserted in the correct
* location in the comment tree.
*/
function insertComment(comment) {
var div = createCommentDiv(comment);
// To avoid stagnating data, don't store the comments children in data.
comment.children = null;
div.data('comment', comment);
var ul = $('#cl' + (comment.node || comment.parent));
var siblings = getChildren(ul);
var li = $(document.createElement('li'));
li.hide();
// Determine where in the parents children list to insert this comment.
for(var i=0; i < siblings.length; i++) {
if (comp(comment, siblings[i]) <= 0) {
$('#cd' + siblings[i].id)
.parent()
.before(li.html(div));
li.slideDown('fast');
return;
}
}
// If we get here, this comment rates lower than all the others,
// or it is the only comment in the list.
ul.append(li.html(div));
li.slideDown('fast');
}
function acceptComment(id) {
$.ajax({
type: 'POST',
url: opts.acceptCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
$('#cm' + id).fadeOut('fast');
$('#cd' + id).removeClass('moderate');
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem accepting the comment.');
}
});
}
function deleteComment(id) {
$.ajax({
type: 'POST',
url: opts.deleteCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
var div = $('#cd' + id);
if (data == 'delete') {
// Moderator mode: remove the comment and all children immediately
div.slideUp('fast', function() {
div.remove();
});
return;
}
// User mode: only mark the comment as deleted
div
.find('span.user-id:first')
.text('[deleted]').end()
.find('div.comment-text:first')
.text('[deleted]').end()
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
.remove();
var comment = div.data('comment');
comment.username = '[deleted]';
comment.text = '[deleted]';
div.data('comment', comment);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem deleting the comment.');
}
});
}
function showProposal(id) {
$('#sp' + id).hide();
$('#hp' + id).show();
$('#pr' + id).slideDown('fast');
}
function hideProposal(id) {
$('#hp' + id).hide();
$('#sp' + id).show();
$('#pr' + id).slideUp('fast');
}
function showProposeChange(id) {
$('#pc' + id).hide();
$('#hc' + id).show();
var textarea = $('#pt' + id);
textarea.val(textarea.data('source'));
$.fn.autogrow.resize(textarea[0]);
textarea.slideDown('fast');
}
function hideProposeChange(id) {
$('#hc' + id).hide();
$('#pc' + id).show();
var textarea = $('#pt' + id);
textarea.val('').removeAttr('disabled');
textarea.slideUp('fast');
}
function toggleCommentMarkupBox(id) {
$('#mb' + id).toggle();
}
/** Handle when the user clicks on a sort by link. */
function handleReSort(link) {
var classes = link.attr('class').split(/\s+/);
for (var i=0; i<classes.length; i++) {
if (classes[i] != 'sort-option') {
by = classes[i].substring(2);
}
}
setComparator();
// Save/update the sortBy cookie.
var expiration = new Date();
expiration.setDate(expiration.getDate() + 365);
document.cookie= 'sortBy=' + escape(by) +
';expires=' + expiration.toUTCString();
$('ul.comment-ul').each(function(index, ul) {
var comments = getChildren($(ul), true);
comments = sortComments(comments);
appendComments(comments, $(ul).empty());
});
}
/**
* Function to process a vote when a user clicks an arrow.
*/
function handleVote(link) {
if (!opts.voting) {
showError("You'll need to login to vote.");
return;
}
var id = link.attr('id');
if (!id) {
// Didn't click on one of the voting arrows.
return;
}
// If it is an unvote, the new vote value is 0,
// Otherwise it's 1 for an upvote, or -1 for a downvote.
var value = 0;
if (id.charAt(1) != 'u') {
value = id.charAt(0) == 'u' ? 1 : -1;
}
// The data to be sent to the server.
var d = {
comment_id: id.substring(2),
value: value
};
// Swap the vote and unvote links.
link.hide();
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
.show();
// The div the comment is displayed in.
var div = $('div#cd' + d.comment_id);
var data = div.data('comment');
// If this is not an unvote, and the other vote arrow has
// already been pressed, unpress it.
if ((d.value !== 0) && (data.vote === d.value * -1)) {
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
}
// Update the comments rating in the local data.
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
data.vote = d.value;
div.data('comment', data);
// Change the rating text.
div.find('.rating:first')
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
// Send the vote information to the server.
$.ajax({
type: "POST",
url: opts.processVoteURL,
data: d,
error: function(request, textStatus, error) {
showError('Oops, there was a problem casting that vote.');
}
});
}
/**
* Open a reply form used to reply to an existing comment.
*/
function openReply(id) {
// Swap out the reply link for the hide link
$('#rl' + id).hide();
$('#cr' + id).show();
// Add the reply li to the children ul.
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
$('#cl' + id)
.prepend(div)
// Setup the submit handler for the reply form.
.find('#rf' + id)
.submit(function(event) {
event.preventDefault();
addComment($('#rf' + id));
closeReply(id);
})
.find('input[type=button]')
.click(function() {
closeReply(id);
});
div.slideDown('fast', function() {
$('#rf' + id).find('textarea').focus();
});
}
/**
* Close the reply form opened with openReply.
*/
function closeReply(id) {
// Remove the reply div from the DOM.
$('#rd' + id).slideUp('fast', function() {
$(this).remove();
});
// Swap out the hide link for the reply link
$('#cr' + id).hide();
$('#rl' + id).show();
}
/**
* Recursively sort a tree of comments using the comp comparator.
*/
function sortComments(comments) {
comments.sort(comp);
$.each(comments, function() {
this.children = sortComments(this.children);
});
return comments;
}
/**
* Get the children comments from a ul. If recursive is true,
* recursively include childrens' children.
*/
function getChildren(ul, recursive) {
var children = [];
ul.children().children("[id^='cd']")
.each(function() {
var comment = $(this).data('comment');
if (recursive)
comment.children = getChildren($(this).find('#cl' + comment.id), true);
children.push(comment);
});
return children;
}
/** Create a div to display a comment in. */
function createCommentDiv(comment) {
if (!comment.displayed && !opts.moderator) {
return $('<div class="moderate">Thank you! Your comment will show up '
+ 'once it is has been approved by a moderator.</div>');
}
// Prettify the comment rating.
comment.pretty_rating = comment.rating + ' point' +
(comment.rating == 1 ? '' : 's');
// Make a class (for displaying not yet moderated comments differently)
comment.css_class = comment.displayed ? '' : ' moderate';
// Create a div for this comment.
var context = $.extend({}, opts, comment);
var div = $(renderTemplate(commentTemplate, context));
// If the user has voted on this comment, highlight the correct arrow.
if (comment.vote) {
var direction = (comment.vote == 1) ? 'u' : 'd';
div.find('#' + direction + 'v' + comment.id).hide();
div.find('#' + direction + 'u' + comment.id).show();
}
if (opts.moderator || comment.text != '[deleted]') {
div.find('a.reply').show();
if (comment.proposal_diff)
div.find('#sp' + comment.id).show();
if (opts.moderator && !comment.displayed)
div.find('#cm' + comment.id).show();
if (opts.moderator || (opts.username == comment.username))
div.find('#dc' + comment.id).show();
}
return div;
}
/**
* A simple template renderer. Placeholders such as <%id%> are replaced
* by context['id'] with items being escaped. Placeholders such as <#id#>
* are not escaped.
*/
function renderTemplate(template, context) {
var esc = $(document.createElement('div'));
function handle(ph, escape) {
var cur = context;
$.each(ph.split('.'), function() {
cur = cur[this];
});
return escape ? esc.text(cur || "").html() : cur;
}
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
return handle(arguments[2], arguments[1] == '%' ? true : false);
});
}
/** Flash an error message briefly. */
function showError(message) {
$(document.createElement('div')).attr({'class': 'popup-error'})
.append($(document.createElement('div'))
.attr({'class': 'error-message'}).text(message))
.appendTo('body')
.fadeIn("slow")
.delay(2000)
.fadeOut("slow");
}
/** Add a link the user uses to open the comments popup. */
$.fn.comment = function() {
return this.each(function() {
var id = $(this).attr('id').substring(1);
var count = COMMENT_METADATA[id];
var title = count + ' comment' + (count == 1 ? '' : 's');
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
var addcls = count == 0 ? ' nocomment' : '';
$(this)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-open' + addcls,
id: 'ao' + id
})
.append($(document.createElement('img')).attr({
src: image,
alt: 'comment',
title: title
}))
.click(function(event) {
event.preventDefault();
show($(this).attr('id').substring(2));
})
)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-close hidden',
id: 'ah' + id
})
.append($(document.createElement('img')).attr({
src: opts.closeCommentImage,
alt: 'close',
title: 'close'
}))
.click(function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
})
);
});
};
var opts = {
processVoteURL: '/_process_vote',
addCommentURL: '/_add_comment',
getCommentsURL: '/_get_comments',
acceptCommentURL: '/_accept_comment',
deleteCommentURL: '/_delete_comment',
commentImage: '/static/_static/comment.png',
closeCommentImage: '/static/_static/comment-close.png',
loadingImage: '/static/_static/ajax-loader.gif',
commentBrightImage: '/static/_static/comment-bright.png',
upArrow: '/static/_static/up.png',
downArrow: '/static/_static/down.png',
upArrowPressed: '/static/_static/up-pressed.png',
downArrowPressed: '/static/_static/down-pressed.png',
voting: false,
moderator: false
};
if (typeof COMMENT_OPTIONS != "undefined") {
opts = jQuery.extend(opts, COMMENT_OPTIONS);
}
var popupTemplate = '\
<div class="sphinx-comments" id="sc<%id%>">\
<p class="sort-options">\
Sort by:\
<a href="#" class="sort-option byrating">best rated</a>\
<a href="#" class="sort-option byascage">newest</a>\
<a href="#" class="sort-option byage">oldest</a>\
</p>\
<div class="comment-header">Comments</div>\
<div class="comment-loading" id="cn<%id%>">\
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
<ul id="cl<%id%>" class="comment-ul"></ul>\
<div id="ca<%id%>">\
<p class="add-a-comment">Add a comment\
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
<div class="comment-markup-box" id="mb<%id%>">\
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
<code>``code``</code>, \
code blocks: <code>::</code> and an indented block after blank line</div>\
<form method="post" id="cf<%id%>" class="comment-form" action="">\
<textarea name="comment" cols="80"></textarea>\
<p class="propose-button">\
<a href="#" id="pc<%id%>" class="show-propose-change">\
Propose a change &#9657;\
</a>\
<a href="#" id="hc<%id%>" class="hide-propose-change">\
Propose a change &#9663;\
</a>\
</p>\
<textarea name="proposal" id="pt<%id%>" cols="80"\
spellcheck="false"></textarea>\
<input type="submit" value="Add comment" />\
<input type="hidden" name="node" value="<%id%>" />\
<input type="hidden" name="parent" value="" />\
</form>\
</div>\
</div>';
var commentTemplate = '\
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
<div class="vote">\
<div class="arrow">\
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
<img src="<%upArrow%>" />\
</a>\
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
<img src="<%upArrowPressed%>" />\
</a>\
</div>\
<div class="arrow">\
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
<img src="<%downArrow%>" id="da<%id%>" />\
</a>\
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
<img src="<%downArrowPressed%>" />\
</a>\
</div>\
</div>\
<div class="comment-content">\
<p class="tagline comment">\
<span class="user-id"><%username%></span>\
<span class="rating"><%pretty_rating%></span>\
<span class="delta"><%time.delta%></span>\
</p>\
<div class="comment-text comment"><#text#></div>\
<p class="comment-opts comment">\
<a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
<a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
<a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
<a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
<span id="cm<%id%>" class="moderation hidden">\
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
</span>\
</p>\
<pre class="proposal" id="pr<%id%>">\
<#proposal_diff#>\
</pre>\
<ul class="comment-children" id="cl<%id%>"></ul>\
</div>\
<div class="clearleft"></div>\
</div>\
</div>';
var replyTemplate = '\
<li>\
<div class="reply-div" id="rd<%id%>">\
<form id="rf<%id%>">\
<textarea name="comment" cols="80"></textarea>\
<input type="submit" value="Add reply" />\
<input type="button" value="Cancel" />\
<input type="hidden" name="parent" value="<%id%>" />\
<input type="hidden" name="node" value="" />\
</form>\
</div>\
</li>';
$(document).ready(function() {
init();
});
})(jQuery);
$(document).ready(function() {
// add comment anchors for all paragraphs that are commentable
$('.sphinx-has-comment').comment();
// highlight search words in search results
$("div.context").each(function() {
var params = $.getQueryParameters();
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
var result = $(this);
$.each(terms, function() {
result.highlightText(this.toLowerCase(), 'highlighted');
});
});
// directly open comment window if requested
var anchor = document.location.hash;
if (anchor.substring(0, 9) == '#comment-') {
$('#ao' + anchor.substring(9)).click();
document.location.hash = '#s' + anchor.substring(9);
}
});

@ -1,147 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>API Reference &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Buttons" href="apiref/button.html" />
<link rel="prev" title="Standard I/O" href="devguide/tty.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="api-reference">
<h1>API Reference<a class="headerlink" href="#api-reference" title="Permalink to this headline"></a></h1>
<p>The API documentation aims to provide a complete reference to the
Freedom Metal API.</p>
<p>The API documentation is split into sections corresponding to each feature:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="apiref/button.html">Buttons</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/cache.html">Caches</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/clock.html">Clocks</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/cpu.html">CPU</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/gpio.html">GPIO</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/interrupt.html">Interrupts</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/itim.html">ITIM</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/led.html">LEDs</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/lock.html">Locks</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/memory.html">Memory Enumeration</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/pmp.html">PMPs</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/shutdown.html">Shutdown</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/spi.html">SPIs</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/switch.html">Switches</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/timer.html">Timer API</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/tty.html">TTY</a></li>
<li class="toctree-l1"><a class="reference internal" href="apiref/uart.html">UARTs</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">API Reference</a><ul>
<li class="toctree-l2"><a class="reference internal" href="apiref/button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="apiref/uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="devguide/tty.html" title="previous chapter">Standard I/O</a></li>
<li>Next: <a href="apiref/button.html" title="next chapter">Buttons</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="_sources/api.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,184 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Buttons &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Caches" href="cache.html" />
<link rel="prev" title="API Reference" href="../api.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="buttons">
<h1>Buttons<a class="headerlink" href="#buttons" title="Permalink to this headline"></a></h1>
<p>API for interfacing with physical buttons </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv316metal_button_getPc">
<span id="_CPPv216metal_button_getPc"></span><span id="metal_button_get__cP"></span><span class="target" id="button_8h_1a37c968fa31653486de183be46f9dee19"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_button" title="metal_button">metal_button</a> *<code class="descname">metal_button_get</code><span class="sig-paren">(</span>char *<em>label</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv316metal_button_getPc" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a reference to a button. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A handle for the button </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">label</span></code>: The DeviceTree label for the button </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv333metal_button_interrupt_controllerP12metal_button">
<span id="_CPPv233metal_button_interrupt_controllerP12metal_button"></span><span id="metal_button_interrupt_controller__metal_buttonP"></span><span class="target" id="button_8h_1a83d841df3634add5be7fbe0d68b7fd36"></span><em class="property">struct</em> <a class="reference internal" href="interrupt.html#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<code class="descname">metal_button_interrupt_controller</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_button" title="metal_button">metal_button</a> *<em>button</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv333metal_button_interrupt_controllerP12metal_button" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the interrupt controller for a button. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A pointer to the interrupt controller responsible for handling button interrupts. </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">button</span></code>: The handle for the button </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv329metal_button_get_interrupt_idP12metal_button">
<span id="_CPPv229metal_button_get_interrupt_idP12metal_button"></span><span id="metal_button_get_interrupt_id__metal_buttonP"></span><span class="target" id="button_8h_1a700573b08686ea6099f4b6d99fb0d3b5"></span>int <code class="descname">metal_button_get_interrupt_id</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_button" title="metal_button">metal_button</a> *<em>button</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv329metal_button_get_interrupt_idP12metal_button" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the interrupt id for a button. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The interrupt id corresponding to a button. </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">button</span></code>: The handle for the button </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv312metal_button">
<span id="_CPPv212metal_button"></span><span id="metal_button"></span><span class="target" id="structmetal__button"></span><em class="property">struct </em><code class="descname">metal_button</code><a class="headerlink" href="#_CPPv312metal_button" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;button.h&gt;</em><p>A button device handle. </p>
<p>A <code class="docutils literal notranslate"><span class="pre">struct</span> <a class="reference internal" href="#structmetal__button"><span class="std std-ref"><span class="pre">metal_button</span></span></a></code> is an implementation-defined object which represents a button on a development board. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="../api.html" title="previous chapter">API Reference</a></li>
<li>Next: <a href="cache.html" title="next chapter">Caches</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/button.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,184 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Caches &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Clocks" href="clock.html" />
<link rel="prev" title="Buttons" href="button.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="caches">
<h1>Caches<a class="headerlink" href="#caches" title="Permalink to this headline"></a></h1>
<p>API for configuring caches. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv316metal_cache_initP11metal_cachei">
<span id="_CPPv216metal_cache_initP11metal_cachei"></span><span id="metal_cache_init__metal_cacheP.i"></span><span class="target" id="cache_8h_1a7a302291f2168c036f92cf72f44ba89d"></span>void <code class="descname">metal_cache_init</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_cache" title="metal_cache">metal_cache</a> *<em>cache</em>, int <em>ways</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv316metal_cache_initP11metal_cachei" title="Permalink to this definition"></a><br /></dt>
<dd><p>Initialize a cache. </p>
<p><p>Initializes a cache with the requested number of ways enabled. </p>
<dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cache</span></code>: The handle for the cache to initialize </li>
<li><code class="docutils literal notranslate"><span class="pre">ways</span></code>: The number of ways to enable</li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv328metal_cache_get_enabled_waysP11metal_cache">
<span id="_CPPv228metal_cache_get_enabled_waysP11metal_cache"></span><span id="metal_cache_get_enabled_ways__metal_cacheP"></span><span class="target" id="cache_8h_1a4533d6c4cbe55f440d28c28b9adfea80"></span>int <code class="descname">metal_cache_get_enabled_ways</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_cache" title="metal_cache">metal_cache</a> *<em>cache</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv328metal_cache_get_enabled_waysP11metal_cache" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the current number of enabled cache ways. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The current number of enabled cache ways </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cache</span></code>: The handle for the cache </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv328metal_cache_set_enabled_waysP11metal_cachei">
<span id="_CPPv228metal_cache_set_enabled_waysP11metal_cachei"></span><span id="metal_cache_set_enabled_ways__metal_cacheP.i"></span><span class="target" id="cache_8h_1aef6fe740ef5b57b0784e0e19e3219a8e"></span>int <code class="descname">metal_cache_set_enabled_ways</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_cache" title="metal_cache">metal_cache</a> *<em>cache</em>, int <em>ways</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv328metal_cache_set_enabled_waysP11metal_cachei" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enable the requested number of cache ways. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the ways are successfully enabled </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cache</span></code>: The handle for the cache </li>
<li><code class="docutils literal notranslate"><span class="pre">ways</span></code>: The number of ways to enabled </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv311metal_cache">
<span id="_CPPv211metal_cache"></span><span id="metal_cache"></span><span class="target" id="structmetal__cache"></span><em class="property">struct </em><code class="descname">metal_cache</code><a class="headerlink" href="#_CPPv311metal_cache" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;cache.h&gt;</em><p>a handle for a cache </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="button.html" title="previous chapter">Buttons</a></li>
<li>Next: <a href="clock.html" title="next chapter">Clocks</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/cache.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,220 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Clocks &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="CPU" href="cpu.html" />
<link rel="prev" title="Caches" href="cache.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="clocks">
<h1>Clocks<a class="headerlink" href="#clocks" title="Permalink to this headline"></a></h1>
<p>API for manipulating clock sources. </p>
<p>The clock interface allows for controlling the rate of various clocks in the system. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Typedefs</p>
<dl class="type">
<dt id="_CPPv336metal_clock_pre_rate_change_callback">
<span id="_CPPv236metal_clock_pre_rate_change_callback"></span><span id="metal_clock_pre_rate_change_callback"></span><span class="target" id="clock_8h_1a62fbd58edad21e8a5ae178d52cd628f5"></span><em class="property">typedef </em>void (*<code class="descname">metal_clock_pre_rate_change_callback</code>)<span class="sig-paren">(</span>void *priv<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv336metal_clock_pre_rate_change_callback" title="Permalink to this definition"></a><br /></dt>
<dd><p>Function signature of clock pre-rate change callbacks. </p>
</dd></dl>
<dl class="type">
<dt id="_CPPv337metal_clock_post_rate_change_callback">
<span id="_CPPv237metal_clock_post_rate_change_callback"></span><span id="metal_clock_post_rate_change_callback"></span><span class="target" id="clock_8h_1a4d1fac9337690accb874463be0f170fd"></span><em class="property">typedef </em>void (*<code class="descname">metal_clock_post_rate_change_callback</code>)<span class="sig-paren">(</span>void *priv<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv337metal_clock_post_rate_change_callback" title="Permalink to this definition"></a><br /></dt>
<dd><p>Function signature of clock post-rate change callbacks. </p>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv323metal_clock_get_rate_hzPK11metal_clock">
<span id="_CPPv223metal_clock_get_rate_hzPK11metal_clock"></span><span id="metal_clock_get_rate_hz__metal_clockCP"></span><span class="target" id="clock_8h_1ae5d567666747aa51cc910879e04bcc8a"></span>long <code class="descname">metal_clock_get_rate_hz</code><span class="sig-paren">(</span><em class="property">const</em> <em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_clock" title="metal_clock">metal_clock</a> *<em>clk</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_clock_get_rate_hzPK11metal_clock" title="Permalink to this definition"></a><br /></dt>
<dd><p>Returns the current rate of the given clock. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The current rate of the clock in Hz </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">clk</span></code>: The handle for the clock </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_clock_set_rate_hzP11metal_clockl">
<span id="_CPPv223metal_clock_set_rate_hzP11metal_clockl"></span><span id="metal_clock_set_rate_hz__metal_clockP.l"></span><span class="target" id="clock_8h_1a3670a40780226f31c9dd8ea189e7b4d4"></span>long <code class="descname">metal_clock_set_rate_hz</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_clock" title="metal_clock">metal_clock</a> *<em>clk</em>, long <em>hz</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_clock_set_rate_hzP11metal_clockl" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the current rate of a clock. </p>
<p><p>Attempts to set the current rate of the given clock to as close as possible to the given rate in Hz. Returns the actual value thats been selected, which could be anything!</p>
<dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The new rate of the clock in Hz.</dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">clk</span></code>: The handle for the clock </li>
<li><code class="docutils literal notranslate"><span class="pre">hz</span></code>: The desired rate in Hz </li>
</ul>
</dd>
</dl>
</p>
<p>Prior to and after the rate change of the clock, this will call the registered pre- and post-rate change callbacks. </p>
</dd></dl>
<dl class="function">
<dt id="_CPPv345metal_clock_register_pre_rate_change_callbackP11metal_clock36metal_clock_pre_rate_change_callbackPv">
<span id="_CPPv245metal_clock_register_pre_rate_change_callbackP11metal_clock36metal_clock_pre_rate_change_callbackPv"></span><span id="metal_clock_register_pre_rate_change_callback__metal_clockP.metal_clock_pre_rate_change_callback.voidP"></span><span class="target" id="clock_8h_1ac1401db96e6b29a7e1ecafbefa3fe0b8"></span>void <code class="descname">metal_clock_register_pre_rate_change_callback</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_clock" title="metal_clock">metal_clock</a> *<em>clk</em>, <a class="reference internal" href="#_CPPv336metal_clock_pre_rate_change_callback" title="metal_clock_pre_rate_change_callback">metal_clock_pre_rate_change_callback</a> <em>cb</em>, void *<em>priv</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv345metal_clock_register_pre_rate_change_callbackP11metal_clock36metal_clock_pre_rate_change_callbackPv" title="Permalink to this definition"></a><br /></dt>
<dd><p>Register a callback that must be called before a rate change. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">clk</span></code>: The handle for the clock </li>
<li><code class="docutils literal notranslate"><span class="pre">cb</span></code>: The callback to be registered </li>
<li><code class="docutils literal notranslate"><span class="pre">priv</span></code>: Private data for the callback handler </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv346metal_clock_register_post_rate_change_callbackP11metal_clock37metal_clock_post_rate_change_callbackPv">
<span id="_CPPv246metal_clock_register_post_rate_change_callbackP11metal_clock37metal_clock_post_rate_change_callbackPv"></span><span id="metal_clock_register_post_rate_change_callback__metal_clockP.metal_clock_post_rate_change_callback.voidP"></span><span class="target" id="clock_8h_1a51f8c1c9dc234cbcbac4045d5da66642"></span>void <code class="descname">metal_clock_register_post_rate_change_callback</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv311metal_clock" title="metal_clock">metal_clock</a> *<em>clk</em>, <a class="reference internal" href="#_CPPv337metal_clock_post_rate_change_callback" title="metal_clock_post_rate_change_callback">metal_clock_post_rate_change_callback</a> <em>cb</em>, void *<em>priv</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv346metal_clock_register_post_rate_change_callbackP11metal_clock37metal_clock_post_rate_change_callbackPv" title="Permalink to this definition"></a><br /></dt>
<dd><p>Registers a callback that must be called after a rate change. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">clk</span></code>: The handle for the clock </li>
<li><code class="docutils literal notranslate"><span class="pre">cb</span></code>: The callback to be registered </li>
<li><code class="docutils literal notranslate"><span class="pre">priv</span></code>: Private data for the callback handler </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv311metal_clock">
<span id="_CPPv211metal_clock"></span><span id="metal_clock"></span><span class="target" id="structmetal__clock"></span><em class="property">struct </em><code class="descname">metal_clock</code><a class="headerlink" href="#_CPPv311metal_clock" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;clock.h&gt;</em><p>The handle for a clock. </p>
<p>Clocks are defined as a pointer to a <code class="docutils literal notranslate"><span class="pre">struct</span> <a class="reference internal" href="#structmetal__clock"><span class="std std-ref"><span class="pre">metal_clock</span></span></a></code>, the contents of which are implementation defined. Users of the clock interface must call functions which accept a <code class="docutils literal notranslate"><span class="pre">struct</span> <a class="reference internal" href="#structmetal__clock"><span class="std std-ref"><span class="pre">metal_clock</span></span></a> <span class="pre">*</span></code> as an argument to interract with the clock.</p>
<p>Note that no mechanism for obtaining a pointer to a <code class="docutils literal notranslate"><span class="pre">struct</span> <a class="reference internal" href="#structmetal__clock"><span class="std std-ref"><span class="pre">metal_clock</span></span></a></code> has been defined, making it impossible to call any of these functions without invoking implementation-defined behavior. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="cache.html" title="previous chapter">Caches</a></li>
<li>Next: <a href="cpu.html" title="next chapter">CPU</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/clock.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,465 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CPU &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="GPIO" href="gpio.html" />
<link rel="prev" title="Clocks" href="clock.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="cpu">
<h1>CPU<a class="headerlink" href="#cpu" title="Permalink to this headline"></a></h1>
<p>API for accessing CPU capabilities. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Typedefs</p>
<dl class="type">
<dt id="_CPPv325metal_exception_handler_t">
<span id="_CPPv225metal_exception_handler_t"></span><span id="metal_exception_handler_t"></span><span class="target" id="cpu_8h_1ab3b821a3347e5837b93dd66bc4241c04"></span><em class="property">typedef </em>void (*<code class="descname">metal_exception_handler_t</code>)<span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *cpu, int ecode<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv325metal_exception_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Function signature for exception handlers. </p>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv313metal_cpu_geti">
<span id="_CPPv213metal_cpu_geti"></span><span id="metal_cpu_get__i"></span><span class="target" id="cpu_8h_1a58fa45251558db18418b134a683cdd73"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<code class="descname">metal_cpu_get</code><span class="sig-paren">(</span>int <em>hartid</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv313metal_cpu_geti" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a reference to a CPU hart. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A pointer to the CPU device handle </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">hartid</span></code>: The ID of the desired CPU hart </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv328metal_cpu_get_current_hartidv">
<span id="_CPPv228metal_cpu_get_current_hartidv"></span><span id="metal_cpu_get_current_hartid"></span><span class="target" id="cpu_8h_1a8ba96e018022809c0ed4c3f278e0fba9"></span>int <code class="descname">metal_cpu_get_current_hartid</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv328metal_cpu_get_current_hartidv" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the hartid of the CPU hart executing this function. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The hartid of the current CPU hart </dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_cpu_get_num_hartsv">
<span id="_CPPv223metal_cpu_get_num_hartsv"></span><span id="metal_cpu_get_num_harts"></span><span class="target" id="cpu_8h_1aa2d54fcd7f49f64fc12afebfaab284c7"></span>int <code class="descname">metal_cpu_get_num_harts</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_cpu_get_num_hartsv" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the number of CPU harts. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The number of CPU harts </dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv319metal_cpu_get_timerP9metal_cpu">
<span id="_CPPv219metal_cpu_get_timerP9metal_cpu"></span><span id="metal_cpu_get_timer__metal_cpuP"></span><span class="target" id="cpu_8h_1af09d00acc3427561377eca87a490e3b8"></span>unsigned long long <code class="descname">metal_cpu_get_timer</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv319metal_cpu_get_timerP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the CPU cycle count timer value. </p>
<p>Get the value of the cycle count timer for a given CPU</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The value of the CPU cycle count timer </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv322metal_cpu_get_timebaseP9metal_cpu">
<span id="_CPPv222metal_cpu_get_timebaseP9metal_cpu"></span><span id="metal_cpu_get_timebase__metal_cpuP"></span><span class="target" id="cpu_8h_1a956ea1dcf430e521a9decc2d03f5702e"></span>unsigned long long <code class="descname">metal_cpu_get_timebase</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv322metal_cpu_get_timebaseP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the timebase of the CPU. </p>
<p>Get the value of the timebase of the cycle count timer</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The value of the cycle count timer timebase </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv319metal_cpu_get_mtimeP9metal_cpu">
<span id="_CPPv219metal_cpu_get_mtimeP9metal_cpu"></span><span id="metal_cpu_get_mtime__metal_cpuP"></span><span class="target" id="cpu_8h_1a1604e203ea89d64aea90db373ee47db9"></span>unsigned long long <code class="descname">metal_cpu_get_mtime</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv319metal_cpu_get_mtimeP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the value of the mtime RTC. </p>
<p>Get the value of the mtime real-time clock. The CPU interrupt controller must be initialized before this function is called or the return value will be 0.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The value of mtime, or 0 if failure </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv322metal_cpu_set_mtimecmpP9metal_cpuy">
<span id="_CPPv222metal_cpu_set_mtimecmpP9metal_cpuy"></span><span id="metal_cpu_set_mtimecmp__metal_cpuP.unsigned-l-l"></span><span class="target" id="cpu_8h_1ae247e1a5d11de5b5fb62ccd8a220811b"></span>int <code class="descname">metal_cpu_set_mtimecmp</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, unsigned long long <em>time</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv322metal_cpu_set_mtimecmpP9metal_cpuy" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the value of the RTC mtimecmp RTC. </p>
<p>Set the value of the mtime real-time clock compare register. The CPU interrupt controller must be initialized before this function is called or the return value will be -1;</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The value of mtimecmp or -1 if error </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">time</span></code>: The value to set the compare register to </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv336metal_cpu_timer_interrupt_controllerP9metal_cpu">
<span id="_CPPv236metal_cpu_timer_interrupt_controllerP9metal_cpu"></span><span id="metal_cpu_timer_interrupt_controller__metal_cpuP"></span><span class="target" id="cpu_8h_1a0b7c5786baf6b8061fd1a547a5eeacde"></span><em class="property">struct</em> <a class="reference internal" href="interrupt.html#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<code class="descname">metal_cpu_timer_interrupt_controller</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv336metal_cpu_timer_interrupt_controllerP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a reference to RTC timer interrupt controller. </p>
<p>Get a reference to the interrupt controller for the real-time clock interrupt. The controller returned by this function must be initialized before any interrupts are registered or enabled with it.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A pointer to the timer interrupt handle </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv332metal_cpu_timer_get_interrupt_idP9metal_cpu">
<span id="_CPPv232metal_cpu_timer_get_interrupt_idP9metal_cpu"></span><span id="metal_cpu_timer_get_interrupt_id__metal_cpuP"></span><span class="target" id="cpu_8h_1aa869758382135c29d4423e140a6ab5ca"></span>int <code class="descname">metal_cpu_timer_get_interrupt_id</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv332metal_cpu_timer_get_interrupt_idP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the RTC timer interrupt id. </p>
<p>Get the interrupt ID of the real-time clock interrupt</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The timer interrupt ID </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv339metal_cpu_software_interrupt_controllerP9metal_cpu">
<span id="_CPPv239metal_cpu_software_interrupt_controllerP9metal_cpu"></span><span id="metal_cpu_software_interrupt_controller__metal_cpuP"></span><span class="target" id="cpu_8h_1a6da4e5c6acefc5bf7de9ff2e57dfd0e9"></span><em class="property">struct</em> <a class="reference internal" href="interrupt.html#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<code class="descname">metal_cpu_software_interrupt_controller</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv339metal_cpu_software_interrupt_controllerP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a reference to the software interrupt controller. </p>
<p>Get a reference to the interrupt controller for the software/inter-process interrupt. The controller returned by this function must be initialized before any interrupts are registered or enabled with it.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A pointer to the software interrupt handle </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv335metal_cpu_software_get_interrupt_idP9metal_cpu">
<span id="_CPPv235metal_cpu_software_get_interrupt_idP9metal_cpu"></span><span id="metal_cpu_software_get_interrupt_id__metal_cpuP"></span><span class="target" id="cpu_8h_1a769bddcc0299a2e0c5d9311b67ea27f6"></span>int <code class="descname">metal_cpu_software_get_interrupt_id</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv335metal_cpu_software_get_interrupt_idP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the software interrupt id. </p>
<p>Get the interrupt ID for the software/inter-process interrupt</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>the software interrupt ID </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv326metal_cpu_software_set_ipiP9metal_cpui">
<span id="_CPPv226metal_cpu_software_set_ipiP9metal_cpui"></span><span id="metal_cpu_software_set_ipi__metal_cpuP.i"></span><span class="target" id="cpu_8h_1a89985746d60165e79e922b0cd9ef7089"></span>int <code class="descname">metal_cpu_software_set_ipi</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, int <em>hartid</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv326metal_cpu_software_set_ipiP9metal_cpui" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the inter-process interrupt for a hart. </p>
<p>Trigger a software/inter-process interrupt for a hart. The CPU interrupt controller for the CPU handle passed to this function must be initialized before this function is called.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">hartid</span></code>: The CPU hart ID to be interrupted </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv328metal_cpu_software_clear_ipiP9metal_cpui">
<span id="_CPPv228metal_cpu_software_clear_ipiP9metal_cpui"></span><span id="metal_cpu_software_clear_ipi__metal_cpuP.i"></span><span class="target" id="cpu_8h_1abbe96b8bcc0f5f8f42f4fc5d7db921f5"></span>int <code class="descname">metal_cpu_software_clear_ipi</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, int <em>hartid</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv328metal_cpu_software_clear_ipiP9metal_cpui" title="Permalink to this definition"></a><br /></dt>
<dd><p>Clear the inter-process interrupt for a hart. </p>
<p>Clear the software/inter-process interrupt for a hart. The CPU interrupt controller for the CPU handle passed to this function must be initialized before this function is called.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">hartid</span></code>: The CPU hart ID to clear </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv318metal_cpu_get_msipP9metal_cpui">
<span id="_CPPv218metal_cpu_get_msipP9metal_cpui"></span><span id="metal_cpu_get_msip__metal_cpuP.i"></span><span class="target" id="cpu_8h_1ad83d5b139290c308e1ffd678f9784337"></span>int <code class="descname">metal_cpu_get_msip</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, int <em>hartid</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv318metal_cpu_get_msipP9metal_cpui" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the value of MSIP for the given hart. </p>
<p>Get the value of the machine software interrupt pending bit for the given hart. The CPU interrupt controller for the CPU handle passed as argument to this function must be initialized before this function is called.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: the CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">hartid</span></code>: The CPU hart to read </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv330metal_cpu_interrupt_controllerP9metal_cpu">
<span id="_CPPv230metal_cpu_interrupt_controllerP9metal_cpu"></span><span id="metal_cpu_interrupt_controller__metal_cpuP"></span><span class="target" id="cpu_8h_1aa638acbf63a0087d97350b2a56f9be10"></span><em class="property">struct</em> <a class="reference internal" href="interrupt.html#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<code class="descname">metal_cpu_interrupt_controller</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv330metal_cpu_interrupt_controllerP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the interrupt controller for the CPU. </p>
<p>Get the CPU interrupt controller. The controller returned by this function must be initialized before any interrupts are registered or enabled and before any exception handlers are registered with this CPU.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The handle for the CPU interrupt controller </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv328metal_cpu_exception_registerP9metal_cpui25metal_exception_handler_t">
<span id="_CPPv228metal_cpu_exception_registerP9metal_cpui25metal_exception_handler_t"></span><span id="metal_cpu_exception_register__metal_cpuP.i.metal_exception_handler_t"></span><span class="target" id="cpu_8h_1a2a8eb3fbb49ea3d25026e3429b0a2ed4"></span>int <code class="descname">metal_cpu_exception_register</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, int <em>ecode</em>, <a class="reference internal" href="#_CPPv325metal_exception_handler_t" title="metal_exception_handler_t">metal_exception_handler_t</a> <em>handler</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv328metal_cpu_exception_registerP9metal_cpui25metal_exception_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Register an exception handler. </p>
<p>Register an exception handler for the CPU. The CPU interrupt controller must be initialized before this function is called.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">ecode</span></code>: The exception code to register a handler for </li>
<li><code class="docutils literal notranslate"><span class="pre">handler</span></code>: Callback function for the exception handler </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv332metal_cpu_get_instruction_lengthP9metal_cpu9uintptr_t">
<span id="_CPPv232metal_cpu_get_instruction_lengthP9metal_cpu9uintptr_t"></span><span id="metal_cpu_get_instruction_length__metal_cpuP.uintptr_t"></span><span class="target" id="cpu_8h_1a34d72e90740ee464421d0818c2b0ab65"></span>int <code class="descname">metal_cpu_get_instruction_length</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, uintptr_t <em>epc</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv332metal_cpu_get_instruction_lengthP9metal_cpu9uintptr_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the length of an instruction in bytes. </p>
<p>Get the length of an instruction in bytes.</p>
<p>On RISC-V platforms, this is useful for detecting whether an instruction is compressed (2 bytes long) or uncompressed (4 bytes long).</p>
<p>This function is useful in conjuction with <code class="docutils literal notranslate"><a class="reference internal" href="#cpu_8h_1a10c2615b35debb2fddaa1d514ad9e07c"><span class="std std-ref"><span class="pre">metal_cpu_get_exception_pc()</span></span></a></code> and <code class="docutils literal notranslate"><a class="reference internal" href="#cpu_8h_1a9180f1d340fec263b522b0580ecd389b"><span class="std std-ref"><span class="pre">metal_cpu_set_exception_pc()</span></span></a></code> in order to cause the exception handler to return execution after the faulting instruction.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>the length of the instruction in bytes </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">epc</span></code>: The address of the instruction to measure </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv326metal_cpu_get_exception_pcP9metal_cpu">
<span id="_CPPv226metal_cpu_get_exception_pcP9metal_cpu"></span><span id="metal_cpu_get_exception_pc__metal_cpuP"></span><span class="target" id="cpu_8h_1a10c2615b35debb2fddaa1d514ad9e07c"></span>uintptr_t <code class="descname">metal_cpu_get_exception_pc</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv326metal_cpu_get_exception_pcP9metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the program counter of the current exception. </p>
<p>This function must be called within an exception handler. The behavior is undefined outside of an exception handler.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The value of the program counter at the time of the exception </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: The CPU device handle </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv326metal_cpu_set_exception_pcP9metal_cpu9uintptr_t">
<span id="_CPPv226metal_cpu_set_exception_pcP9metal_cpu9uintptr_t"></span><span id="metal_cpu_set_exception_pc__metal_cpuP.uintptr_t"></span><span class="target" id="cpu_8h_1a9180f1d340fec263b522b0580ecd389b"></span>int <code class="descname">metal_cpu_set_exception_pc</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_cpu" title="metal_cpu">metal_cpu</a> *<em>cpu</em>, uintptr_t <em>epc</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv326metal_cpu_set_exception_pcP9metal_cpu9uintptr_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the exception program counter. </p>
<p>This function must be called within an exception handler. The behavior is undefined outside of an exception handler.</p>
<p>This function can be used to cause an exception handler to return execution to an address other than the one that caused the exception.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">cpu</span></code>: the CPU device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">epc</span></code>: The address to set the exception program counter to </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv39metal_cpu">
<span id="_CPPv29metal_cpu"></span><span id="metal_cpu"></span><span class="target" id="structmetal__cpu"></span><em class="property">struct </em><code class="descname">metal_cpu</code><a class="headerlink" href="#_CPPv39metal_cpu" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;cpu.h&gt;</em><p>A device handle for a CPU hart. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="clock.html" title="previous chapter">Clocks</a></li>
<li>Next: <a href="gpio.html" title="next chapter">GPIO</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/cpu.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,272 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GPIO &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Interrupts" href="interrupt.html" />
<link rel="prev" title="CPU" href="cpu.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="gpio">
<h1>GPIO<a class="headerlink" href="#gpio" title="Permalink to this headline"></a></h1>
<p>API for manipulating general-purpose input/output. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv321metal_gpio_get_devicei">
<span id="_CPPv221metal_gpio_get_devicei"></span><span id="metal_gpio_get_device__i"></span><span class="target" id="gpio_8h_1aeab9188ec903fe358808eb9730074b9e"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<code class="descname">metal_gpio_get_device</code><span class="sig-paren">(</span>int <em>device_num</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv321metal_gpio_get_devicei" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a GPIO device handle. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The GPIO device handle, or NULL if there is no device at that index </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">device_num</span></code>: The GPIO device index </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv324metal_gpio_disable_inputP10metal_gpioi">
<span id="_CPPv224metal_gpio_disable_inputP10metal_gpioi"></span><span id="metal_gpio_disable_input__metal_gpioP.i"></span><span class="target" id="gpio_8h_1a319ab9fa1996f01d50946589fd5143fc"></span>int <code class="descname">metal_gpio_disable_input</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv324metal_gpio_disable_inputP10metal_gpioi" title="Permalink to this definition"></a><br /></dt>
<dd><p>Disable input on a pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the input is successfully disabled </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The pin number indexed from 0 </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv324metal_gpio_enable_outputP10metal_gpioi">
<span id="_CPPv224metal_gpio_enable_outputP10metal_gpioi"></span><span id="metal_gpio_enable_output__metal_gpioP.i"></span><span class="target" id="gpio_8h_1a66f67e5425645d42a4c2bc92ecdff46e"></span>int <code class="descname">metal_gpio_enable_output</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv324metal_gpio_enable_outputP10metal_gpioi" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enable output on a pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the output is successfully enabled </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The pin number indexed from 0 </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv318metal_gpio_set_pinP10metal_gpioii">
<span id="_CPPv218metal_gpio_set_pinP10metal_gpioii"></span><span id="metal_gpio_set_pin__metal_gpioP.i.i"></span><span class="target" id="gpio_8h_1aa6c411fb729c3508f6838f34f566ff99"></span>int <code class="descname">metal_gpio_set_pin</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em>, int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv318metal_gpio_set_pinP10metal_gpioii" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the output value of a GPIO pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the output is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The pin number indexed from 0 </li>
<li><code class="docutils literal notranslate"><span class="pre">value</span></code>: The value to set the pin to </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv318metal_gpio_get_pinP10metal_gpioi">
<span id="_CPPv218metal_gpio_get_pinP10metal_gpioi"></span><span id="metal_gpio_get_pin__metal_gpioP.i"></span><span class="target" id="gpio_8h_1a9d10fba8c4db0f3b43190cf4308e42e4"></span>int <code class="descname">metal_gpio_get_pin</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv318metal_gpio_get_pinP10metal_gpioi" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the value of the GPIO pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The value of the GPIO pin </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The pin number indexed from 0 </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv320metal_gpio_clear_pinP10metal_gpioi">
<span id="_CPPv220metal_gpio_clear_pinP10metal_gpioi"></span><span id="metal_gpio_clear_pin__metal_gpioP.i"></span><span class="target" id="gpio_8h_1a96c95efe0291a1e7b1d518041bb734f6"></span>int <code class="descname">metal_gpio_clear_pin</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv320metal_gpio_clear_pinP10metal_gpioi" title="Permalink to this definition"></a><br /></dt>
<dd><p>Clears the value of the GPIO pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the pin is successfully cleared </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The pin number indexed from 0 </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv321metal_gpio_toggle_pinP10metal_gpioi">
<span id="_CPPv221metal_gpio_toggle_pinP10metal_gpioi"></span><span id="metal_gpio_toggle_pin__metal_gpioP.i"></span><span class="target" id="gpio_8h_1a99eec4021f85f7876aa8cacdca3f4713"></span>int <code class="descname">metal_gpio_toggle_pin</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv321metal_gpio_toggle_pinP10metal_gpioi" title="Permalink to this definition"></a><br /></dt>
<dd><p>Toggles the value of the GPIO pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the pin is successfully toggled </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The pin number indexed from 0 </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv324metal_gpio_enable_pinmuxP10metal_gpioii">
<span id="_CPPv224metal_gpio_enable_pinmuxP10metal_gpioii"></span><span id="metal_gpio_enable_pinmux__metal_gpioP.i.i"></span><span class="target" id="gpio_8h_1a15aac32c5cf9d1aac02e0ae56b42bfe3"></span>int <code class="descname">metal_gpio_enable_pinmux</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_gpio" title="metal_gpio">metal_gpio</a> *<em>gpio</em>, int <em>pin</em>, int <em>io_function</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv324metal_gpio_enable_pinmuxP10metal_gpioii" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enables and sets the pinmux for a GPIO pin. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the pinmux is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">gpio</span></code>: The handle for the GPIO interface </li>
<li><code class="docutils literal notranslate"><span class="pre">pin</span></code>: The bitmask for the pin to enable pinmux on </li>
<li><code class="docutils literal notranslate"><span class="pre">io_function</span></code>: The IO function to set </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv310metal_gpio">
<span id="_CPPv210metal_gpio"></span><span id="metal_gpio"></span><span class="target" id="structmetal__gpio"></span><em class="property">struct </em><code class="descname">metal_gpio</code><a class="headerlink" href="#_CPPv310metal_gpio" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;gpio.h&gt;</em><p>The handle for a GPIO interface. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="cpu.html" title="previous chapter">CPU</a></li>
<li>Next: <a href="interrupt.html" title="next chapter">Interrupts</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/gpio.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,283 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Interrupts &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="ITIM" href="itim.html" />
<link rel="prev" title="GPIO" href="gpio.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="interrupts">
<h1>Interrupts<a class="headerlink" href="#interrupts" title="Permalink to this headline"></a></h1>
<p>API for registering and manipulating interrupts. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Typedefs</p>
<dl class="type">
<dt id="_CPPv317metal_vector_mode">
<span id="_CPPv217metal_vector_mode"></span><span id="metal_vector_mode"></span><span class="target" id="interrupt_8h_1a12da577bb3179597221662c5589561b3"></span><em class="property">typedef </em><em class="property">enum</em> <a class="reference internal" href="#_CPPv318metal_vector_mode_" title="metal_vector_mode_">metal_vector_mode_</a> <code class="descname">metal_vector_mode</code><a class="headerlink" href="#_CPPv317metal_vector_mode" title="Permalink to this definition"></a><br /></dt>
<dd><p>Possible mode of interrupts to operate. </p>
</dd></dl>
<dl class="type">
<dt id="_CPPv325metal_interrupt_handler_t">
<span id="_CPPv225metal_interrupt_handler_t"></span><span id="metal_interrupt_handler_t"></span><span class="target" id="interrupt_8h_1acf581f8608907e67e50300eef23a130b"></span><em class="property">typedef </em>void (*<code class="descname">metal_interrupt_handler_t</code>)<span class="sig-paren">(</span>int, void *<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv325metal_interrupt_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Function signature for interrupt callback handlers. </p>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Enums</p>
<dl class="type">
<dt id="_CPPv318metal_vector_mode_">
<span id="_CPPv218metal_vector_mode_"></span><span id="metal_vector_mode_"></span><span class="target" id="interrupt_8h_1ac60eddab23447dc04711785118af2728"></span><em class="property">enum </em><code class="descname">metal_vector_mode_</code><a class="headerlink" href="#_CPPv318metal_vector_mode_" title="Permalink to this definition"></a><br /></dt>
<dd><p>Possible mode of interrupts to operate. </p>
<p><em>Values:</em></p>
<dl class="enumerator">
<dt id="_CPPv317METAL_DIRECT_MODE">
<span id="_CPPv217METAL_DIRECT_MODE"></span><span class="target" id="interrupt_8h_1ac60eddab23447dc04711785118af2728ad924f2ea83b99b7d5be2e042e88c6dbd"></span><code class="descname">METAL_DIRECT_MODE</code> = 0<a class="headerlink" href="#_CPPv317METAL_DIRECT_MODE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="enumerator">
<dt id="_CPPv317METAL_VECTOR_MODE">
<span id="_CPPv217METAL_VECTOR_MODE"></span><span class="target" id="interrupt_8h_1ac60eddab23447dc04711785118af2728a4287274b1ef3c4a1a5b40ee32740e522"></span><code class="descname">METAL_VECTOR_MODE</code> = 1<a class="headerlink" href="#_CPPv317METAL_VECTOR_MODE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="enumerator">
<dt id="_CPPv327METAL_SELECTIVE_VECTOR_MODE">
<span id="_CPPv227METAL_SELECTIVE_VECTOR_MODE"></span><span class="target" id="interrupt_8h_1ac60eddab23447dc04711785118af2728a2a0f324727404e6d792bb629b532388e"></span><code class="descname">METAL_SELECTIVE_VECTOR_MODE</code> = 2<a class="headerlink" href="#_CPPv327METAL_SELECTIVE_VECTOR_MODE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="enumerator">
<dt id="_CPPv326METAL_HARDWARE_VECTOR_MODE">
<span id="_CPPv226METAL_HARDWARE_VECTOR_MODE"></span><span class="target" id="interrupt_8h_1ac60eddab23447dc04711785118af2728a4d512f09eb589d9ffd8444706569f9e1"></span><code class="descname">METAL_HARDWARE_VECTOR_MODE</code> = 3<a class="headerlink" href="#_CPPv326METAL_HARDWARE_VECTOR_MODE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv320metal_interrupt_initP15metal_interrupt">
<span id="_CPPv220metal_interrupt_initP15metal_interrupt"></span><span id="metal_interrupt_init__metal_interruptP"></span><span class="target" id="interrupt_8h_1a8bb69d1c3f0a58fbbe9f849c2dd5d0f6"></span>void <code class="descname">metal_interrupt_init</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<em>controller</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv320metal_interrupt_initP15metal_interrupt" title="Permalink to this definition"></a><br /></dt>
<dd><p>Initialize a given interrupt controller. </p>
<p>Initialize a given interrupt controller. This function must be called before any interrupts are registered or enabled with the handler. It is invalid to initialize an interrupt controller more than once.</p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">controller</span></code>: The handle for the interrupt controller </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv332metal_interrupt_register_handlerP15metal_interrupti25metal_interrupt_handler_tPv">
<span id="_CPPv232metal_interrupt_register_handlerP15metal_interrupti25metal_interrupt_handler_tPv"></span><span id="metal_interrupt_register_handler__metal_interruptP.i.metal_interrupt_handler_t.voidP"></span><span class="target" id="interrupt_8h_1a308bebb1f3baa79e140f62ed5c15637a"></span>int <code class="descname">metal_interrupt_register_handler</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<em>controller</em>, int <em>id</em>, <a class="reference internal" href="#_CPPv325metal_interrupt_handler_t" title="metal_interrupt_handler_t">metal_interrupt_handler_t</a> <em>handler</em>, void *<em>priv_data</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv332metal_interrupt_register_handlerP15metal_interrupti25metal_interrupt_handler_tPv" title="Permalink to this definition"></a><br /></dt>
<dd><p>Register an interrupt handler. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">controller</span></code>: The handle for the interrupt controller </li>
<li><code class="docutils literal notranslate"><span class="pre">id</span></code>: The interrupt ID to register </li>
<li><code class="docutils literal notranslate"><span class="pre">handler</span></code>: The interrupt handler callback </li>
<li><code class="docutils literal notranslate"><span class="pre">priv_data</span></code>: Private data for the interrupt handler </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv322metal_interrupt_enableP15metal_interrupti">
<span id="_CPPv222metal_interrupt_enableP15metal_interrupti"></span><span id="metal_interrupt_enable__metal_interruptP.i"></span><span class="target" id="interrupt_8h_1a783a6d5804e097dad0a4434a058e45de"></span>int <code class="descname">metal_interrupt_enable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<em>controller</em>, int <em>id</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv322metal_interrupt_enableP15metal_interrupti" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enable an interrupt. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">controller</span></code>: The handle for the interrupt controller </li>
<li><code class="docutils literal notranslate"><span class="pre">id</span></code>: The interrupt ID to enable </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_interrupt_disableP15metal_interrupti">
<span id="_CPPv223metal_interrupt_disableP15metal_interrupti"></span><span id="metal_interrupt_disable__metal_interruptP.i"></span><span class="target" id="interrupt_8h_1a3f1ed02d57dd231db5c92945e0a347e8"></span>int <code class="descname">metal_interrupt_disable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<em>controller</em>, int <em>id</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_interrupt_disableP15metal_interrupti" title="Permalink to this definition"></a><br /></dt>
<dd><p>Disable an interrupt. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">controller</span></code>: The handle for the interrupt controller </li>
<li><code class="docutils literal notranslate"><span class="pre">id</span></code>: The interrupt ID to disable </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv329metal_interrupt_vector_enableP15metal_interrupti17metal_vector_mode">
<span id="_CPPv229metal_interrupt_vector_enableP15metal_interrupti17metal_vector_mode"></span><span id="metal_interrupt_vector_enable__metal_interruptP.i.metal_vector_mode"></span><span class="target" id="interrupt_8h_1a2535af198e205b152e6794ac9fe9c41c"></span>int <code class="descname">metal_interrupt_vector_enable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<em>controller</em>, int <em>id</em>, <a class="reference internal" href="#_CPPv317metal_vector_mode" title="metal_vector_mode">metal_vector_mode</a> <em>mode</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv329metal_interrupt_vector_enableP15metal_interrupti17metal_vector_mode" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enable an interrupt vector. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">controller</span></code>: The handle for the interrupt controller </li>
<li><code class="docutils literal notranslate"><span class="pre">id</span></code>: The interrupt ID to enable </li>
<li><code class="docutils literal notranslate"><span class="pre">mode</span></code>: The interrupt mode type to enable </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv330metal_interrupt_vector_disableP15metal_interrupti">
<span id="_CPPv230metal_interrupt_vector_disableP15metal_interrupti"></span><span id="metal_interrupt_vector_disable__metal_interruptP.i"></span><span class="target" id="interrupt_8h_1ac1c55fc3389c5c83b7488dde8f4c863b"></span>int <code class="descname">metal_interrupt_vector_disable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv315metal_interrupt" title="metal_interrupt">metal_interrupt</a> *<em>controller</em>, int <em>id</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv330metal_interrupt_vector_disableP15metal_interrupti" title="Permalink to this definition"></a><br /></dt>
<dd><p>Disable an interrupt vector. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">controller</span></code>: The handle for the interrupt controller </li>
<li><code class="docutils literal notranslate"><span class="pre">id</span></code>: The interrupt ID to disable </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv315metal_interrupt">
<span id="_CPPv215metal_interrupt"></span><span id="metal_interrupt"></span><span class="target" id="structmetal__interrupt"></span><em class="property">struct </em><code class="descname">metal_interrupt</code><a class="headerlink" href="#_CPPv315metal_interrupt" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;interrupt.h&gt;</em><p>A handle for an interrupt. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="gpio.html" title="previous chapter">GPIO</a></li>
<li>Next: <a href="itim.html" title="next chapter">ITIM</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/interrupt.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,136 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ITIM &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="LEDs" href="led.html" />
<link rel="prev" title="Interrupts" href="interrupt.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="itim">
<h1>ITIM<a class="headerlink" href="#itim" title="Permalink to this headline"></a></h1>
<p>API for manipulating ITIM allocation </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Defines</p>
<dl class="macro">
<dt>
<code class="descname">METAL_PLACE_IN_ITIM</code></dt>
<dd><p>Link a function into the ITIM. </p>
<p>Link a function into the ITIM (Instruction Tightly Integrated Memory) if the ITIM is present on the target device. </p>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="interrupt.html" title="previous chapter">Interrupts</a></li>
<li>Next: <a href="led.html" title="next chapter">LEDs</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/itim.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,224 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>LEDs &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Locks" href="lock.html" />
<link rel="prev" title="ITIM" href="itim.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="leds">
<h1>LEDs<a class="headerlink" href="#leds" title="Permalink to this headline"></a></h1>
<p>API for manipulating LEDs. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv313metal_led_getPc">
<span id="_CPPv213metal_led_getPc"></span><span id="metal_led_get__cP"></span><span class="target" id="led_8h_1a84ec9ffca3148bebf6436bc35fcc9b27"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_led" title="metal_led">metal_led</a> *<code class="descname">metal_led_get</code><span class="sig-paren">(</span>char *<em>label</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv313metal_led_getPc" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a handle for an LED. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A handle to the LED, or NULL if none is found for the requested label </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">label</span></code>: The DeviceTree label for the desired LED </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv317metal_led_get_rgbPcPc">
<span id="_CPPv217metal_led_get_rgbPcPc"></span><span id="metal_led_get_rgb__cP.cP"></span><span class="target" id="led_8h_1a56adcb4db1ca4bce31b564609109e083"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_led" title="metal_led">metal_led</a> *<code class="descname">metal_led_get_rgb</code><span class="sig-paren">(</span>char *<em>label</em>, char *<em>color</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv317metal_led_get_rgbPcPc" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a handle for a channel of an RGB LED. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A handle to the LED, or NULL if none is found for the requested label and color </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">label</span></code>: The DeviceTree label for the desired LED </li>
<li><code class="docutils literal notranslate"><span class="pre">color</span></code>: The color for the LED in the DeviceTree </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv316metal_led_enableP9metal_led">
<span id="_CPPv216metal_led_enableP9metal_led"></span><span id="metal_led_enable__metal_ledP"></span><span class="target" id="led_8h_1a80ad9e2858859ceef3924225fa38b64d"></span>void <code class="descname">metal_led_enable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_led" title="metal_led">metal_led</a> *<em>led</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv316metal_led_enableP9metal_led" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enable an LED. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">led</span></code>: The handle for the LED </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv312metal_led_onP9metal_led">
<span id="_CPPv212metal_led_onP9metal_led"></span><span id="metal_led_on__metal_ledP"></span><span class="target" id="led_8h_1ac03219b31d86e12ede1fa52ba203c2e4"></span>void <code class="descname">metal_led_on</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_led" title="metal_led">metal_led</a> *<em>led</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv312metal_led_onP9metal_led" title="Permalink to this definition"></a><br /></dt>
<dd><p>Turn an LED on. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">led</span></code>: The handle for the LED </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv313metal_led_offP9metal_led">
<span id="_CPPv213metal_led_offP9metal_led"></span><span id="metal_led_off__metal_ledP"></span><span class="target" id="led_8h_1a259212ddf02bdc1f36e09ef9b35ccb54"></span>void <code class="descname">metal_led_off</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_led" title="metal_led">metal_led</a> *<em>led</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv313metal_led_offP9metal_led" title="Permalink to this definition"></a><br /></dt>
<dd><p>Turn an LED off. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">led</span></code>: The handle for the LED </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv316metal_led_toggleP9metal_led">
<span id="_CPPv216metal_led_toggleP9metal_led"></span><span id="metal_led_toggle__metal_ledP"></span><span class="target" id="led_8h_1a812579af2379fc1c3b5e0285e76c4f5c"></span>void <code class="descname">metal_led_toggle</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_led" title="metal_led">metal_led</a> *<em>led</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv316metal_led_toggleP9metal_led" title="Permalink to this definition"></a><br /></dt>
<dd><p>Toggle the on/off state of an LED. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">led</span></code>: The handle for the LED </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv39metal_led">
<span id="_CPPv29metal_led"></span><span id="metal_led"></span><span class="target" id="structmetal__led"></span><em class="property">struct </em><code class="descname">metal_led</code><a class="headerlink" href="#_CPPv39metal_led" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;led.h&gt;</em><p>A handle for an LED. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="itim.html" title="previous chapter">ITIM</a></li>
<li>Next: <a href="lock.html" title="next chapter">Locks</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/led.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,196 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Locks &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Memory Enumeration" href="memory.html" />
<link rel="prev" title="LEDs" href="led.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="locks">
<h1>Locks<a class="headerlink" href="#locks" title="Permalink to this headline"></a></h1>
<p>An API for creating and using a software lock/mutex. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Defines</p>
<dl class="macro">
<dt id="c.METAL_LOCK_DECLARE">
<span class="target" id="lock_8h_1ab374ff07975df10c0dd028439b351af9"></span><code class="descname">METAL_LOCK_DECLARE</code><span class="sig-paren">(</span>name<span class="sig-paren">)</span><a class="headerlink" href="#c.METAL_LOCK_DECLARE" title="Permalink to this definition"></a></dt>
<dd><p>Declare a lock. </p>
<p>Locks must be declared with METAL_LOCK_DECLARE to ensure that the lock is linked into a memory region which supports atomic memory operations. </p>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv315metal_lock_initP10metal_lock">
<span id="_CPPv215metal_lock_initP10metal_lock"></span><span id="metal_lock_init__metal_lockP"></span><span class="target" id="lock_8h_1ac6c3769091eb4746302c9c5c9b42050c"></span>int <code class="descname">metal_lock_init</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_lock" title="metal_lock">metal_lock</a> *<em>lock</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv315metal_lock_initP10metal_lock" title="Permalink to this definition"></a><br /></dt>
<dd><p>Initialize a lock. </p>
<p><p>If the lock cannot be initialized, attempts to take or give the lock will result in a Store/AMO access fault. </p>
<dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the lock is successfully initialized. A non-zero code indicates failure.</dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">lock</span></code>: The handle for a lock </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv315metal_lock_takeP10metal_lock">
<span id="_CPPv215metal_lock_takeP10metal_lock"></span><span id="metal_lock_take__metal_lockP"></span><span class="target" id="lock_8h_1a62f98dd8920e3e1dcab6e87763a0e413"></span>int <code class="descname">metal_lock_take</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_lock" title="metal_lock">metal_lock</a> *<em>lock</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv315metal_lock_takeP10metal_lock" title="Permalink to this definition"></a><br /></dt>
<dd><p>Take a lock. </p>
<p><p>If the lock initialization failed, attempts to take a lock will result in a Store/AMO access fault. </p>
<dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the lock is successfully taken</dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">lock</span></code>: The handle for a lock </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv315metal_lock_giveP10metal_lock">
<span id="_CPPv215metal_lock_giveP10metal_lock"></span><span id="metal_lock_give__metal_lockP"></span><span class="target" id="lock_8h_1a2a107fe4f7faea16bb3f98e572dc480b"></span>int <code class="descname">metal_lock_give</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv310metal_lock" title="metal_lock">metal_lock</a> *<em>lock</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv315metal_lock_giveP10metal_lock" title="Permalink to this definition"></a><br /></dt>
<dd><p>Give back a held lock. </p>
<p><p>If the lock initialization failed, attempts to give a lock will result in a Store/AMO access fault. </p>
<dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the lock is successfully given</dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">lock</span></code>: The handle for a lock </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv310metal_lock">
<span id="_CPPv210metal_lock"></span><span id="metal_lock"></span><span class="target" id="structmetal__lock"></span><em class="property">struct </em><code class="descname">metal_lock</code><a class="headerlink" href="#_CPPv310metal_lock" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;lock.h&gt;</em><p>A handle for a lock. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="led.html" title="previous chapter">LEDs</a></li>
<li>Next: <a href="memory.html" title="next chapter">Memory Enumeration</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/lock.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,216 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Memory Enumeration &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="PMPs" href="pmp.html" />
<link rel="prev" title="Locks" href="lock.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="memory-enumeration">
<h1>Memory Enumeration<a class="headerlink" href="#memory-enumeration" title="Permalink to this headline"></a></h1>
<p>API for enumerating memory blocks. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv329metal_get_memory_from_addressK9uintptr_t">
<span id="_CPPv229metal_get_memory_from_addressK9uintptr_t"></span><span id="metal_get_memory_from_address__uintptr_tC"></span><span class="target" id="memory_8h_1ad491f569f50de727a0093a835c56df35"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_memory" title="metal_memory">metal_memory</a> *<code class="descname">metal_get_memory_from_address</code><span class="sig-paren">(</span><em class="property">const</em> uintptr_t <em>address</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv329metal_get_memory_from_addressK9uintptr_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the memory block which services the given address. </p>
<p>Given a physical memory address, get a handle for the memory block to which that address is mapped.</p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The memory block handle, or NULL if the address is not mapped to a memory block </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">address</span></code>: The address to query </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv329metal_memory_get_base_addressPK12metal_memory">
<span id="_CPPv229metal_memory_get_base_addressPK12metal_memory"></span><span id="metal_memory_get_base_address__metal_memoryCP"></span><span class="target" id="memory_8h_1a7843783cc7e8077104bdc299d4b430a2"></span>uintptr_t <code class="descname">metal_memory_get_base_address</code><span class="sig-paren">(</span><em class="property">const</em> <em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_memory" title="metal_memory">metal_memory</a> *<em>memory</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv329metal_memory_get_base_addressPK12metal_memory" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the base address for a memory block. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The base address of the memory block </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">memory</span></code>: The handle for the memory block </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv321metal_memory_get_sizePK12metal_memory">
<span id="_CPPv221metal_memory_get_sizePK12metal_memory"></span><span id="metal_memory_get_size__metal_memoryCP"></span><span class="target" id="memory_8h_1a737f5bd1821cd23e76a97c36b46e05bc"></span>size_t <code class="descname">metal_memory_get_size</code><span class="sig-paren">(</span><em class="property">const</em> <em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_memory" title="metal_memory">metal_memory</a> *<em>memory</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv321metal_memory_get_sizePK12metal_memory" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the size of a memory block. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The size of the memory block </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">memory</span></code>: The handle for the memory block </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv329metal_memory_supports_atomicsPK12metal_memory">
<span id="_CPPv229metal_memory_supports_atomicsPK12metal_memory"></span><span id="metal_memory_supports_atomics__metal_memoryCP"></span><span class="target" id="memory_8h_1a021b73d7b895d82d7028e71a8d35a762"></span>int <code class="descname">metal_memory_supports_atomics</code><span class="sig-paren">(</span><em class="property">const</em> <em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_memory" title="metal_memory">metal_memory</a> *<em>memory</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv329metal_memory_supports_atomicsPK12metal_memory" title="Permalink to this definition"></a><br /></dt>
<dd><p>Query if a memory block supports atomic operations. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>nonzero if the memory block supports atomic operations </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">memory</span></code>: The handle for the memory block </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv324metal_memory_is_cachablePK12metal_memory">
<span id="_CPPv224metal_memory_is_cachablePK12metal_memory"></span><span id="metal_memory_is_cachable__metal_memoryCP"></span><span class="target" id="memory_8h_1a115334c01896b5e4594ce31a84c882c0"></span>int <code class="descname">metal_memory_is_cachable</code><span class="sig-paren">(</span><em class="property">const</em> <em class="property">struct</em> <a class="reference internal" href="#_CPPv312metal_memory" title="metal_memory">metal_memory</a> *<em>memory</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv324metal_memory_is_cachablePK12metal_memory" title="Permalink to this definition"></a><br /></dt>
<dd><p>Query if a memory block is cacheable. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>nonzero if the memory block is cachable </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">memory</span></code>: The handle for the memory block </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv312metal_memory">
<span id="_CPPv212metal_memory"></span><span id="metal_memory"></span><span class="target" id="structmetal__memory"></span><em class="property">struct </em><code class="descname">metal_memory</code><a class="headerlink" href="#_CPPv312metal_memory" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;memory.h&gt;</em><p>A handle for a memory block. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="lock.html" title="previous chapter">Locks</a></li>
<li>Next: <a href="pmp.html" title="next chapter">PMPs</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/memory.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,481 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PMPs &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Shutdown" href="shutdown.html" />
<link rel="prev" title="Memory Enumeration" href="memory.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="pmps">
<h1>PMPs<a class="headerlink" href="#pmps" title="Permalink to this headline"></a></h1>
<p>API for Configuring Physical Memory Protection on RISC-V Cores. </p>
<p>The Physical Memory Protection (PMP) interface on RISC-V cores is a form of memory protection unit which allows for a finite number of physical memory regions to be configured with certain access permissions.</p>
<p>Additional information about the use and configuration rules for PMPs can be found by reading the RISC-V Privileged Architecture Specification. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Enums</p>
<dl class="type">
<dt id="_CPPv322metal_pmp_address_mode">
<span id="_CPPv222metal_pmp_address_mode"></span><span id="metal_pmp_address_mode"></span><span class="target" id="pmp_8h_1a5a253e3e28b6e55a3340924161611437"></span><em class="property">enum </em><code class="descname">metal_pmp_address_mode</code><a class="headerlink" href="#_CPPv322metal_pmp_address_mode" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set of available PMP addressing modes. </p>
<p><em>Values:</em></p>
<dl class="enumerator">
<dt id="_CPPv313METAL_PMP_OFF">
<span id="_CPPv213METAL_PMP_OFF"></span><span class="target" id="pmp_8h_1a5a253e3e28b6e55a3340924161611437ae577426e9497040f7937944ae5ae6a40"></span><code class="descname">METAL_PMP_OFF</code> = 0<a class="headerlink" href="#_CPPv313METAL_PMP_OFF" title="Permalink to this definition"></a><br /></dt>
<dd><p>Disable the PMP region. </p>
</dd></dl>
<dl class="enumerator">
<dt id="_CPPv313METAL_PMP_TOR">
<span id="_CPPv213METAL_PMP_TOR"></span><span class="target" id="pmp_8h_1a5a253e3e28b6e55a3340924161611437aabb496bcbbde420b39e6ff7c39b3280a"></span><code class="descname">METAL_PMP_TOR</code> = 1<a class="headerlink" href="#_CPPv313METAL_PMP_TOR" title="Permalink to this definition"></a><br /></dt>
<dd><p>Use Top-of-Range mode. </p>
</dd></dl>
<dl class="enumerator">
<dt id="_CPPv313METAL_PMP_NA4">
<span id="_CPPv213METAL_PMP_NA4"></span><span class="target" id="pmp_8h_1a5a253e3e28b6e55a3340924161611437a6a5c13be0ca5ad62ec720aed29bca8fb"></span><code class="descname">METAL_PMP_NA4</code> = 2<a class="headerlink" href="#_CPPv313METAL_PMP_NA4" title="Permalink to this definition"></a><br /></dt>
<dd><p>Use naturally-aligned 4-byte region mode. </p>
</dd></dl>
<dl class="enumerator">
<dt id="_CPPv315METAL_PMP_NAPOT">
<span id="_CPPv215METAL_PMP_NAPOT"></span><span class="target" id="pmp_8h_1a5a253e3e28b6e55a3340924161611437ab0439f955da13acbabbc2d370e6b5d21"></span><code class="descname">METAL_PMP_NAPOT</code> = 3<a class="headerlink" href="#_CPPv315METAL_PMP_NAPOT" title="Permalink to this definition"></a><br /></dt>
<dd><p>Use naturally-aligned power-of-two mode. </p>
</dd></dl>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv320metal_pmp_get_devicev">
<span id="_CPPv220metal_pmp_get_devicev"></span><span id="metal_pmp_get_device__void"></span><span class="target" id="pmp_8h_1a285362cb084160ce14af26d75f9116f5"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<code class="descname">metal_pmp_get_device</code><span class="sig-paren">(</span>void<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv320metal_pmp_get_devicev" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the PMP device handle. </p>
</dd></dl>
<dl class="function">
<dt id="_CPPv314metal_pmp_initP9metal_pmp">
<span id="_CPPv214metal_pmp_initP9metal_pmp"></span><span id="metal_pmp_init__metal_pmpP"></span><span class="target" id="pmp_8h_1a27f187e13bd7100571a7a404bd0a0f06"></span>void <code class="descname">metal_pmp_init</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv314metal_pmp_initP9metal_pmp" title="Permalink to this definition"></a><br /></dt>
<dd><p>Initialize the PMP. </p>
<p><p>The PMP initialization routine is optional and may be called as many times as is desired. The effect of the initialization routine is to attempt to set all regions to unlocked and disabled, as well as to clear the X, W, and R bits. Only the pmp configuration of the hart which executes the routine will be affected.</p>
<dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle to be initialized</li>
</ul>
</dd>
</dl>
</p>
<p>If any regions are fused to preset values by the implementation or locked, those PMP regions will silently remain uninitialized. </p>
</dd></dl>
<dl class="function">
<dt id="_CPPv320metal_pmp_set_regionP9metal_pmpj16metal_pmp_config6size_t">
<span id="_CPPv220metal_pmp_set_regionP9metal_pmpj16metal_pmp_config6size_t"></span><span id="metal_pmp_set_region__metal_pmpP.unsigned-i.metal_pmp_config.s"></span><span class="target" id="pmp_8h_1acdbdbc7cc2727d4ae10205617aee3013"></span>int <code class="descname">metal_pmp_set_region</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, <em class="property">struct</em> <a class="reference internal" href="#_CPPv316metal_pmp_config" title="metal_pmp_config">metal_pmp_config</a> <em>config</em>, size_t <em>address</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv320metal_pmp_set_regionP9metal_pmpj16metal_pmp_config6size_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Configure a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 upon success </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to configure </li>
<li><code class="docutils literal notranslate"><span class="pre">config</span></code>: The desired configuration of the PMP region </li>
<li><code class="docutils literal notranslate"><span class="pre">address</span></code>: The desired address of the PMP region </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv320metal_pmp_get_regionP9metal_pmpjP16metal_pmp_configP6size_t">
<span id="_CPPv220metal_pmp_get_regionP9metal_pmpjP16metal_pmp_configP6size_t"></span><span id="metal_pmp_get_region__metal_pmpP.unsigned-i.metal_pmp_configP.sP"></span><span class="target" id="pmp_8h_1a638771730de250707e03355a20eba302"></span>int <code class="descname">metal_pmp_get_region</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, <em class="property">struct</em> <a class="reference internal" href="#_CPPv316metal_pmp_config" title="metal_pmp_config">metal_pmp_config</a> *<em>config</em>, size_t *<em>address</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv320metal_pmp_get_regionP9metal_pmpjP16metal_pmp_configP6size_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the configuration for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the region is read successfully </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to read </li>
<li><code class="docutils literal notranslate"><span class="pre">config</span></code>: Variable to store the PMP region configuration </li>
<li><code class="docutils literal notranslate"><span class="pre">address</span></code>: Variable to store the PMP region address </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv314metal_pmp_lockP9metal_pmpj">
<span id="_CPPv214metal_pmp_lockP9metal_pmpj"></span><span id="metal_pmp_lock__metal_pmpP.unsigned-i"></span><span class="target" id="pmp_8h_1a6a3fa4e30f321f322e5327c5626298a6"></span>int <code class="descname">metal_pmp_lock</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv314metal_pmp_lockP9metal_pmpj" title="Permalink to this definition"></a><br /></dt>
<dd><p>Lock a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the region is successfully locked </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to lock </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv321metal_pmp_set_addressP9metal_pmpj6size_t">
<span id="_CPPv221metal_pmp_set_addressP9metal_pmpj6size_t"></span><span id="metal_pmp_set_address__metal_pmpP.unsigned-i.s"></span><span class="target" id="pmp_8h_1a813aa0c76c58567d72d742ae26413d43"></span>int <code class="descname">metal_pmp_set_address</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, size_t <em>address</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv321metal_pmp_set_addressP9metal_pmpj6size_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the address for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the address is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to set </li>
<li><code class="docutils literal notranslate"><span class="pre">address</span></code>: The desired address of the PMP region </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv321metal_pmp_get_addressP9metal_pmpj">
<span id="_CPPv221metal_pmp_get_addressP9metal_pmpj"></span><span id="metal_pmp_get_address__metal_pmpP.unsigned-i"></span><span class="target" id="pmp_8h_1acd173df5015b18af2a24c18db8b4e29d"></span>size_t <code class="descname">metal_pmp_get_address</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv321metal_pmp_get_addressP9metal_pmpj" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the address of a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The address of the PMP region, or 0 if the region could not be read </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to read </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv326metal_pmp_set_address_modeP9metal_pmpj22metal_pmp_address_mode">
<span id="_CPPv226metal_pmp_set_address_modeP9metal_pmpj22metal_pmp_address_mode"></span><span id="metal_pmp_set_address_mode__metal_pmpP.unsigned-i.metal_pmp_address_mode"></span><span class="target" id="pmp_8h_1af437f62af730b1ced6b024320224b44f"></span>int <code class="descname">metal_pmp_set_address_mode</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, <em class="property">enum</em> <a class="reference internal" href="#_CPPv322metal_pmp_address_mode" title="metal_pmp_address_mode">metal_pmp_address_mode</a> <em>mode</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv326metal_pmp_set_address_modeP9metal_pmpj22metal_pmp_address_mode" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the addressing mode of a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the addressing mode is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to set </li>
<li><code class="docutils literal notranslate"><span class="pre">mode</span></code>: The PMP addressing mode to set </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv326metal_pmp_get_address_modeP9metal_pmpj">
<span id="_CPPv226metal_pmp_get_address_modeP9metal_pmpj"></span><span id="metal_pmp_get_address_mode__metal_pmpP.unsigned-i"></span><span class="target" id="pmp_8h_1ae8bf626c403ce2f5d9647e900becc479"></span><em class="property">enum</em> <a class="reference internal" href="#_CPPv322metal_pmp_address_mode" title="metal_pmp_address_mode">metal_pmp_address_mode</a> <code class="descname">metal_pmp_get_address_mode</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv326metal_pmp_get_address_modeP9metal_pmpj" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the addressing mode of a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The address mode of the PMP region </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to read </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv324metal_pmp_set_executableP9metal_pmpji">
<span id="_CPPv224metal_pmp_set_executableP9metal_pmpji"></span><span id="metal_pmp_set_executable__metal_pmpP.unsigned-i.i"></span><span class="target" id="pmp_8h_1a7ca9b72029d7ece4c1f0411fa30ce200"></span>int <code class="descname">metal_pmp_set_executable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, int <em>X</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv324metal_pmp_set_executableP9metal_pmpji" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the executable bit for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the executable bit is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to set </li>
<li><code class="docutils literal notranslate"><span class="pre">X</span></code>: The desired value of the executable bit </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv324metal_pmp_get_executableP9metal_pmpj">
<span id="_CPPv224metal_pmp_get_executableP9metal_pmpj"></span><span id="metal_pmp_get_executable__metal_pmpP.unsigned-i"></span><span class="target" id="pmp_8h_1a25cca706020249225e12244146ae561b"></span>int <code class="descname">metal_pmp_get_executable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv324metal_pmp_get_executableP9metal_pmpj" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the executable bit for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>the value of the executable bit </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to read </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_pmp_set_writeableP9metal_pmpji">
<span id="_CPPv223metal_pmp_set_writeableP9metal_pmpji"></span><span id="metal_pmp_set_writeable__metal_pmpP.unsigned-i.i"></span><span class="target" id="pmp_8h_1a64007037321db518728f354a3517ef30"></span>int <code class="descname">metal_pmp_set_writeable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, int <em>W</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_pmp_set_writeableP9metal_pmpji" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the writable bit for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the writable bit is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to set </li>
<li><code class="docutils literal notranslate"><span class="pre">W</span></code>: The desired value of the writable bit </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_pmp_get_writeableP9metal_pmpj">
<span id="_CPPv223metal_pmp_get_writeableP9metal_pmpj"></span><span id="metal_pmp_get_writeable__metal_pmpP.unsigned-i"></span><span class="target" id="pmp_8h_1a53515b1abf4a9738170747b17d9415e1"></span>int <code class="descname">metal_pmp_get_writeable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_pmp_get_writeableP9metal_pmpj" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the writable bit for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>the value of the writable bit </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to read </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv322metal_pmp_set_readableP9metal_pmpji">
<span id="_CPPv222metal_pmp_set_readableP9metal_pmpji"></span><span id="metal_pmp_set_readable__metal_pmpP.unsigned-i.i"></span><span class="target" id="pmp_8h_1a6bd197dc75911ef545ee9ba434a147fc"></span>int <code class="descname">metal_pmp_set_readable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em>, int <em>R</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv322metal_pmp_set_readableP9metal_pmpji" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the readable bit for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the readable bit is successfully set </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to set </li>
<li><code class="docutils literal notranslate"><span class="pre">R</span></code>: The desired value of the readable bit </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv322metal_pmp_get_readableP9metal_pmpj">
<span id="_CPPv222metal_pmp_get_readableP9metal_pmpj"></span><span id="metal_pmp_get_readable__metal_pmpP.unsigned-i"></span><span class="target" id="pmp_8h_1a7962720fc55049422ae70a58c3bf30a1"></span>int <code class="descname">metal_pmp_get_readable</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_pmp" title="metal_pmp">metal_pmp</a> *<em>pmp</em>, unsigned int <em>region</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv322metal_pmp_get_readableP9metal_pmpj" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the readable bit for a PMP region. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>the value of the readable bit </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">pmp</span></code>: The PMP device handle </li>
<li><code class="docutils literal notranslate"><span class="pre">region</span></code>: The PMP region to read </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv316metal_pmp_config">
<span id="_CPPv216metal_pmp_config"></span><span id="metal_pmp_config"></span><span class="target" id="structmetal__pmp__config"></span><em class="property">struct </em><code class="descname">metal_pmp_config</code><a class="headerlink" href="#_CPPv316metal_pmp_config" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;pmp.h&gt;</em><p>Configuration for a PMP region. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Public Types</p>
<dl class="type">
<dt id="_CPPv316metal_pmp_locked">
<span id="_CPPv216metal_pmp_locked"></span><span id="metal_pmp_locked"></span><span class="target" id="structmetal__pmp__config_1ae58135921201a45e356316894ea415e1"></span><em class="property">enum </em><code class="descname">metal_pmp_locked</code><a class="headerlink" href="#_CPPv316metal_pmp_locked" title="Permalink to this definition"></a><br /></dt>
<dd><p>Sets whether the PMP region is locked. </p>
<p><em>Values:</em></p>
<dl class="enumerator">
<dt id="_CPPv318METAL_PMP_UNLOCKED">
<span id="_CPPv218METAL_PMP_UNLOCKED"></span><span class="target" id="structmetal__pmp__config_1ae58135921201a45e356316894ea415e1a47f6f950ceb2afeb7e712f6ea7c74167"></span><code class="descname">METAL_PMP_UNLOCKED</code> = 0<a class="headerlink" href="#_CPPv318METAL_PMP_UNLOCKED" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="enumerator">
<dt id="_CPPv316METAL_PMP_LOCKED">
<span id="_CPPv216METAL_PMP_LOCKED"></span><span class="target" id="structmetal__pmp__config_1ae58135921201a45e356316894ea415e1ab5f8338bd1b8d19ae7a46491cf90c47d"></span><code class="descname">METAL_PMP_LOCKED</code> = 1<a class="headerlink" href="#_CPPv316METAL_PMP_LOCKED" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Public Members</p>
<dl class="member">
<dt id="_CPPv3N16metal_pmp_config1RE">
<span id="_CPPv2N16metal_pmp_config1RE"></span><span id="metal_pmp_config::R__i"></span><span class="target" id="structmetal__pmp__config_1ae7a18f7b2449ed6502e7b2ac6418d0b9"></span>int <code class="descname">R</code><a class="headerlink" href="#_CPPv3N16metal_pmp_config1RE" title="Permalink to this definition"></a><br /></dt>
<dd><p>Sets whether reads to the PMP region succeed. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_pmp_config1WE">
<span id="_CPPv2N16metal_pmp_config1WE"></span><span id="metal_pmp_config::W__i"></span><span class="target" id="structmetal__pmp__config_1ad625b6d3fccc337da37e79bb61b6505b"></span>int <code class="descname">W</code><a class="headerlink" href="#_CPPv3N16metal_pmp_config1WE" title="Permalink to this definition"></a><br /></dt>
<dd><p>Sets whether writes to the PMP region succeed. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_pmp_config1XE">
<span id="_CPPv2N16metal_pmp_config1XE"></span><span id="metal_pmp_config::X__i"></span><span class="target" id="structmetal__pmp__config_1adff0ca4e2efb45e8734ab747bb6e44b3"></span>int <code class="descname">X</code><a class="headerlink" href="#_CPPv3N16metal_pmp_config1XE" title="Permalink to this definition"></a><br /></dt>
<dd><p>Sets whether the PMP region is executable. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_pmp_config1AE">
<span id="_CPPv2N16metal_pmp_config1AE"></span><span id="metal_pmp_config::A__metal_pmp_address_mode"></span><span class="target" id="structmetal__pmp__config_1a2c3377be13c911aa3a245213818faed5"></span><a class="reference internal" href="#_CPPv322metal_pmp_address_mode" title="metal_pmp_address_mode">metal_pmp_address_mode</a> <code class="descname">A</code><a class="headerlink" href="#_CPPv3N16metal_pmp_config1AE" title="Permalink to this definition"></a><br /></dt>
<dd><p>Sets the addressing mode of the PMP region. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_pmp_config1LE">
<span id="_CPPv2N16metal_pmp_config1LE"></span><span id="metal_pmp_config::L__metal_pmp_config::metal_pmp_locked"></span><span class="target" id="structmetal__pmp__config_1a246339508928c4362075bb549f00be89"></span><a class="reference internal" href="#_CPPv316metal_pmp_config" title="metal_pmp_config">metal_pmp_config</a>::<a class="reference internal" href="../devguide/pmps.html#_CPPv3N16metal_pmp_config16metal_pmp_lockedE" title="metal_pmp_config::metal_pmp_locked">metal_pmp_locked</a> <code class="descname">L</code><a class="headerlink" href="#_CPPv3N16metal_pmp_config1LE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
</dd></dl>
<dl class="class">
<dt id="_CPPv39metal_pmp">
<span id="_CPPv29metal_pmp"></span><span id="metal_pmp"></span><span class="target" id="structmetal__pmp"></span><em class="property">struct </em><code class="descname">metal_pmp</code><a class="headerlink" href="#_CPPv39metal_pmp" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;pmp.h&gt;</em><p>A handle for the PMP device. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="memory.html" title="previous chapter">Memory Enumeration</a></li>
<li>Next: <a href="shutdown.html" title="next chapter">Shutdown</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/pmp.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,144 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Shutdown &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="SPIs" href="spi.html" />
<link rel="prev" title="PMPs" href="pmp.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="shutdown">
<h1>Shutdown<a class="headerlink" href="#shutdown" title="Permalink to this headline"></a></h1>
<p>API for shutting down a machine. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv314metal_shutdowni">
<span id="_CPPv214metal_shutdowni"></span><span id="metal_shutdown__i"></span><span class="target" id="shutdown_8h_1a74aef1a3586fadbfb031b655308fcf12"></span>void <code class="descname">metal_shutdown</code><span class="sig-paren">(</span>int <em>code</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv314metal_shutdowni" title="Permalink to this definition"></a><br /></dt>
<dd><p>The public METAL shutdown interface. </p>
<p>Shuts down the machine, if the machine enables an interface for shutting down. When no interface is provided, will cause the machine to spin indefinitely.</p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">code</span></code>: The return code to set. 0 indicates program success. </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="spi.html">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="pmp.html" title="previous chapter">PMPs</a></li>
<li>Next: <a href="spi.html" title="next chapter">SPIs</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/shutdown.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

@ -1,288 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SPIs &#8212; Freedom Metal v201905 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Switches" href="switch.html" />
<link rel="prev" title="Shutdown" href="shutdown.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="spis">
<h1>SPIs<a class="headerlink" href="#spis" title="Permalink to this headline"></a></h1>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Functions</p>
<dl class="function">
<dt id="_CPPv320metal_spi_get_devicei">
<span id="_CPPv220metal_spi_get_devicei"></span><span id="metal_spi_get_device__i"></span><span class="target" id="spi_8h_1a855e33042e8166cb66fc6b9f15c06d18"></span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_spi" title="metal_spi">metal_spi</a> *<code class="descname">metal_spi_get_device</code><span class="sig-paren">(</span>int <em>device_num</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv320metal_spi_get_devicei" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get a handle for a SPI device. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>A handle to the SPI device, or NULL if the device does not exist </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">device_num</span></code>: The index of the desired SPI device </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv314metal_spi_initP9metal_spii">
<span id="_CPPv214metal_spi_initP9metal_spii"></span><span id="metal_spi_init__metal_spiP.i"></span><span class="target" id="spi_8h_1a8309f59b3cd7009ec36c94caec10567e"></span>void <code class="descname">metal_spi_init</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_spi" title="metal_spi">metal_spi</a> *<em>spi</em>, int <em>baud_rate</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv314metal_spi_initP9metal_spii" title="Permalink to this definition"></a><br /></dt>
<dd><p>Initialize a SPI device with a certain baud rate. </p>
<p><dl class="docutils">
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">spi</span></code>: The handle for the SPI device to initialize </li>
<li><code class="docutils literal notranslate"><span class="pre">baud_rate</span></code>: The baud rate to set the SPI device to </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv318metal_spi_transferP9metal_spiP16metal_spi_config6size_tPcPc">
<span id="_CPPv218metal_spi_transferP9metal_spiP16metal_spi_config6size_tPcPc"></span><span id="metal_spi_transfer__metal_spiP.metal_spi_configP.s.cP.cP"></span><span class="target" id="spi_8h_1a43416802fba9289bfcff5d42f61bcbd1"></span>int <code class="descname">metal_spi_transfer</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_spi" title="metal_spi">metal_spi</a> *<em>spi</em>, <em class="property">struct</em> <a class="reference internal" href="#_CPPv316metal_spi_config" title="metal_spi_config">metal_spi_config</a> *<em>config</em>, size_t <em>len</em>, char *<em>tx_buf</em>, char *<em>rx_buf</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv318metal_spi_transferP9metal_spiP16metal_spi_config6size_tPcPc" title="Permalink to this definition"></a><br /></dt>
<dd><p>Perform a SPI transfer. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the transfer succeeds </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">spi</span></code>: The handle for the SPI device to perform the transfer </li>
<li><code class="docutils literal notranslate"><span class="pre">config</span></code>: The configuration for the SPI transfer. </li>
<li><code class="docutils literal notranslate"><span class="pre">len</span></code>: The number of bytes to transfer </li>
<li><code class="docutils literal notranslate"><span class="pre">tx_buf</span></code>: The buffer to send over the SPI bus. Must be len bytes long. If NULL, the SPI will transfer the value 0. </li>
<li><code class="docutils literal notranslate"><span class="pre">rx_buf</span></code>: The buffer to receive data into. Must be len bytes long. If NULL, the SPI will ignore received bytes. </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_spi_get_baud_rateP9metal_spi">
<span id="_CPPv223metal_spi_get_baud_rateP9metal_spi"></span><span id="metal_spi_get_baud_rate__metal_spiP"></span><span class="target" id="spi_8h_1a2bce61c3c9ca996d880b24917c6f32d5"></span>int <code class="descname">metal_spi_get_baud_rate</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_spi" title="metal_spi">metal_spi</a> *<em>spi</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_spi_get_baud_rateP9metal_spi" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the current baud rate of the SPI device. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>The baud rate in Hz </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">spi</span></code>: The handle for the SPI device </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="function">
<dt id="_CPPv323metal_spi_set_baud_rateP9metal_spii">
<span id="_CPPv223metal_spi_set_baud_rateP9metal_spii"></span><span id="metal_spi_set_baud_rate__metal_spiP.i"></span><span class="target" id="spi_8h_1af1e744929bc53d0a6ce6ba455d5732b6"></span>int <code class="descname">metal_spi_set_baud_rate</code><span class="sig-paren">(</span><em class="property">struct</em> <a class="reference internal" href="#_CPPv39metal_spi" title="metal_spi">metal_spi</a> *<em>spi</em>, int <em>baud_rate</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv323metal_spi_set_baud_rateP9metal_spii" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the current baud rate of the SPI device. </p>
<p><dl class="docutils">
<dt><strong>Return</strong></dt>
<dd>0 if the baud rate is successfully changed </dd>
<dt><strong>Parameters</strong></dt>
<dd><ul class="breatheparameterlist first last simple">
<li><code class="docutils literal notranslate"><span class="pre">spi</span></code>: The handle for the SPI device </li>
<li><code class="docutils literal notranslate"><span class="pre">baud_rate</span></code>: The desired baud rate of the SPI device </li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<dl class="class">
<dt id="_CPPv316metal_spi_config">
<span id="_CPPv216metal_spi_config"></span><span id="metal_spi_config"></span><span class="target" id="structmetal__spi__config"></span><em class="property">struct </em><code class="descname">metal_spi_config</code><a class="headerlink" href="#_CPPv316metal_spi_config" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;spi.h&gt;</em><p>The configuration for a SPI transfer. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Public Types</p>
<dl class="type">
<dt id="_CPPv312__anonymous0">
<span id="_CPPv212__anonymous0"></span><span id="__anonymous0"></span><span class="target" id="structmetal__spi__config_1a189893c917d826e5ded619ef8a45add3"></span><em class="property">enum </em><code class="descname"><strong>[anonymous]</strong></code><a class="headerlink" href="#_CPPv312__anonymous0" title="Permalink to this definition"></a><br /></dt>
<dd><p>The protocol for the SPI transfer. </p>
<p><em>Values:</em></p>
<dl class="enumerator">
<dt id="_CPPv316METAL_SPI_SINGLE">
<span id="_CPPv216METAL_SPI_SINGLE"></span><span class="target" id="structmetal__spi__config_1a189893c917d826e5ded619ef8a45add3a0c29eed4fe3e1f248d1810ba5dfe1a8e"></span><code class="descname">METAL_SPI_SINGLE</code><a class="headerlink" href="#_CPPv316METAL_SPI_SINGLE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="enumerator">
<dt id="_CPPv314METAL_SPI_DUAL">
<span id="_CPPv214METAL_SPI_DUAL"></span><span class="target" id="structmetal__spi__config_1a189893c917d826e5ded619ef8a45add3a2d9fda1fb7661945d428297033fad17b"></span><code class="descname">METAL_SPI_DUAL</code><a class="headerlink" href="#_CPPv314METAL_SPI_DUAL" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="enumerator">
<dt id="_CPPv314METAL_SPI_QUAD">
<span id="_CPPv214METAL_SPI_QUAD"></span><span class="target" id="structmetal__spi__config_1a189893c917d826e5ded619ef8a45add3a426ecf339e41e2357824802c2b1e9746"></span><code class="descname">METAL_SPI_QUAD</code><a class="headerlink" href="#_CPPv314METAL_SPI_QUAD" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric">Public Members</p>
<dl class="member">
<dt>
<span class="target" id="structmetal__spi__config_1a516959be864737cc77da242d8a30cd33"></span><code class="descname">metal_spi_config::&#64;0 metal_spi_config::protocol</code></dt>
<dd><p>The protocol for the SPI transfer. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_spi_config8polarityE">
<span id="_CPPv2N16metal_spi_config8polarityE"></span><span id="metal_spi_config::polarity__unsigned-i"></span><span class="target" id="structmetal__spi__config_1a4eacfe4cb2ce9f556bc93de3cb2a32da"></span>unsigned int <code class="descname">polarity</code><a class="headerlink" href="#_CPPv3N16metal_spi_config8polarityE" title="Permalink to this definition"></a><br /></dt>
<dd><p>The polarity of the SPI transfer, equivalent to CPOL. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_spi_config5phaseE">
<span id="_CPPv2N16metal_spi_config5phaseE"></span><span id="metal_spi_config::phase__unsigned-i"></span><span class="target" id="structmetal__spi__config_1ae4d504bda2381f7c05cc754c72635233"></span>unsigned int <code class="descname">phase</code><a class="headerlink" href="#_CPPv3N16metal_spi_config5phaseE" title="Permalink to this definition"></a><br /></dt>
<dd><p>The phase of the SPI transfer, equivalent to CPHA. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_spi_config13little_endianE">
<span id="_CPPv2N16metal_spi_config13little_endianE"></span><span id="metal_spi_config::little_endian__unsigned-i"></span><span class="target" id="structmetal__spi__config_1a75973254d44934f7f89e52033233f235"></span>unsigned int <code class="descname">little_endian</code><a class="headerlink" href="#_CPPv3N16metal_spi_config13little_endianE" title="Permalink to this definition"></a><br /></dt>
<dd><p>The endianness of the SPI transfer. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_spi_config14cs_active_highE">
<span id="_CPPv2N16metal_spi_config14cs_active_highE"></span><span id="metal_spi_config::cs_active_high__unsigned-i"></span><span class="target" id="structmetal__spi__config_1adaecd64030bdbb756854bb213f2542fe"></span>unsigned int <code class="descname">cs_active_high</code><a class="headerlink" href="#_CPPv3N16metal_spi_config14cs_active_highE" title="Permalink to this definition"></a><br /></dt>
<dd><p>The active state of the chip select line. </p>
</dd></dl>
<dl class="member">
<dt id="_CPPv3N16metal_spi_config4csidE">
<span id="_CPPv2N16metal_spi_config4csidE"></span><span id="metal_spi_config::csid__unsigned-i"></span><span class="target" id="structmetal__spi__config_1a894c54e76a7438715ab07b9459c23162"></span>unsigned int <code class="descname">csid</code><a class="headerlink" href="#_CPPv3N16metal_spi_config4csidE" title="Permalink to this definition"></a><br /></dt>
<dd><p>The chip select ID to activate for the SPI transfer. </p>
</dd></dl>
</div>
</dd></dl>
<dl class="class">
<dt id="_CPPv39metal_spi">
<span id="_CPPv29metal_spi"></span><span id="metal_spi"></span><span class="target" id="structmetal__spi"></span><em class="property">struct </em><code class="descname">metal_spi</code><a class="headerlink" href="#_CPPv39metal_spi" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;spi.h&gt;</em><p>A handle for a SPI device. </p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">Freedom Metal</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction to Freedom Metal</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devguide.html">Developer Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../api.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="button.html">Buttons</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="clock.html">Clocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpu.html">CPU</a></li>
<li class="toctree-l2"><a class="reference internal" href="gpio.html">GPIO</a></li>
<li class="toctree-l2"><a class="reference internal" href="interrupt.html">Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="itim.html">ITIM</a></li>
<li class="toctree-l2"><a class="reference internal" href="led.html">LEDs</a></li>
<li class="toctree-l2"><a class="reference internal" href="lock.html">Locks</a></li>
<li class="toctree-l2"><a class="reference internal" href="memory.html">Memory Enumeration</a></li>
<li class="toctree-l2"><a class="reference internal" href="pmp.html">PMPs</a></li>
<li class="toctree-l2"><a class="reference internal" href="shutdown.html">Shutdown</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">SPIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="switch.html">Switches</a></li>
<li class="toctree-l2"><a class="reference internal" href="timer.html">Timer API</a></li>
<li class="toctree-l2"><a class="reference internal" href="tty.html">TTY</a></li>
<li class="toctree-l2"><a class="reference internal" href="uart.html">UARTs</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="../api.html">API Reference</a><ul>
<li>Previous: <a href="shutdown.html" title="previous chapter">Shutdown</a></li>
<li>Next: <a href="switch.html" title="next chapter">Switches</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, SiFive Inc..
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
|
<a href="../_sources/apiref/spi.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save