more context
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
parent
0decfd5ea5
commit
f4dca24bac
257
index.html
257
index.html
@ -217,10 +217,11 @@
|
|||||||
</section>
|
</section>
|
||||||
<section data-transition="fade-in slide-out">
|
<section data-transition="fade-in slide-out">
|
||||||
<h2>What is an Emulator?</h2>
|
<h2>What is an Emulator?</h2>
|
||||||
<img src="media/bbs-example.png">
|
<img src="media/vt100-MA-4352.png">
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Emulation Depends on your Goals!</h2>
|
<h2>Emulation Depends on your Goals!</h2>
|
||||||
|
<p class="fragment">Emulation is a lie</p>
|
||||||
</section>
|
</section>
|
||||||
<!-- <section>
|
<!-- <section>
|
||||||
<h2>Renode Is Many of These</h2>
|
<h2>Renode Is Many of These</h2>
|
||||||
@ -233,11 +234,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<section data-transition="fade-out">
|
<section data-transition="slide-in fade-out">
|
||||||
<h2>What is a Computer?</h2>
|
|
||||||
<img class="fragment" src="media/bluenrg-block-diagram.png">
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h2>What is a Computer?</h2>
|
<h2>What is a Computer?</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A system of devices</li>
|
<li>A system of devices</li>
|
||||||
@ -292,10 +289,11 @@
|
|||||||
IRQ -> cpu@0
|
IRQ -> cpu@0
|
||||||
|
|
||||||
cpu: CPU.CortexM @ sysbus
|
cpu: CPU.CortexM @ sysbus
|
||||||
nvic: nvic
|
|
||||||
cpuType: "cortex-m0+"
|
cpuType: "cortex-m0+"
|
||||||
PerformanceInMips: 24
|
PerformanceInMips: 24
|
||||||
|
nvic: nvic
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
bluenrg-1.repl
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@ -412,10 +410,11 @@
|
|||||||
cpuType: "cortex-m0+"
|
cpuType: "cortex-m0+"
|
||||||
PerformanceInMips: 24
|
PerformanceInMips: 24
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
bluenrg-1.repl
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Setting up Renode</h2>
|
<h2>Setting up Renode</h2>
|
||||||
<pre data-id="code-animation"><code data-trim>
|
<pre data-id="code-animation"><code data-trim data-line-numbers="|1|2|3-5|6|">
|
||||||
machine LoadPlatformDescription @bluenrg-1.repl
|
machine LoadPlatformDescription @bluenrg-1.repl
|
||||||
sysbus LoadBinary @BLE_Chat_Server.bin 0x10040000
|
sysbus LoadBinary @BLE_Chat_Server.bin 0x10040000
|
||||||
cpu VectorTableOffset 0x10040000
|
cpu VectorTableOffset 0x10040000
|
||||||
@ -464,151 +463,96 @@
|
|||||||
<h2>Modify an Existing Block</h2>
|
<h2>Modify an Existing Block</h2>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Example Serial Port: LiteX UART</h2>
|
<h2>Example Serial Port: AxiUartLite</h2>
|
||||||
<pre class="code-animation"><code class="cs" data-trim data-line-numbers="|132-140|118-126|125|20-33">
|
<pre class="code-animation"><code class="cs" data-trim data-line-numbers="|80-83|55-61|35-45|39-45">
|
||||||
//
|
//
|
||||||
// Copyright (c) 2010-2018 Antmicro
|
// Copyright (c) 2010-2018 Antmicro
|
||||||
//
|
//
|
||||||
// This file is licensed under the MIT License.
|
// This file is licensed under the MIT License.
|
||||||
// Full license text is available in 'licenses/MIT.txt'.
|
// Full license text is available in 'licenses/MIT.txt'.
|
||||||
//
|
//
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
using Antmicro.Renode.Peripherals.Bus;
|
using Antmicro.Renode.Peripherals.Bus;
|
||||||
using Antmicro.Renode.Core.Structure.Registers;
|
using System.Collections.Generic;
|
||||||
using Antmicro.Renode.Core;
|
using Antmicro.Renode.Core;
|
||||||
using Antmicro.Renode.Logging;
|
using Antmicro.Renode.Logging;
|
||||||
|
using Antmicro.Renode.Peripherals.Miscellaneous;
|
||||||
|
using Antmicro.Migrant;
|
||||||
|
|
||||||
namespace Antmicro.Renode.Peripherals.UART
|
namespace Antmicro.Renode.Peripherals.UART
|
||||||
{
|
|
||||||
public class LiteX_UART : UARTBase, IDoubleWordPeripheral, IBytePeripheral, IKnownSize
|
|
||||||
{
|
{
|
||||||
public LiteX_UART(Machine machine) : base(machine)
|
[AllowedTranslations(AllowedTranslation.ByteToDoubleWord)]
|
||||||
|
public class AxiUartLite : IDoubleWordPeripheral, IUART, IKnownSize
|
||||||
{
|
{
|
||||||
IRQ = new GPIO();
|
public AxiUartLite()
|
||||||
var registersMap = new Dictionary<long, DoubleWordRegister>
|
|
||||||
{
|
{
|
||||||
{(long)Registers.RxTx, new DoubleWordRegister(this)
|
readFifo = new Queue<uint>();
|
||||||
.WithValueField(0, 8,
|
|
||||||
writeCallback: (_, value) =>
|
|
||||||
this.TransmitCharacter((byte)value),
|
|
||||||
valueProviderCallback: _ => {
|
|
||||||
if(!TryGetCharacter(out var character))
|
|
||||||
{
|
|
||||||
this.Log(LogLevel.Warning, "Empty Rx FIFO.");
|
|
||||||
}
|
|
||||||
return character;
|
|
||||||
})
|
|
||||||
},
|
|
||||||
{(long)Registers.TxFull, new DoubleWordRegister(this)
|
|
||||||
.WithFlag(0, FieldMode.Read) //tx is never full
|
|
||||||
},
|
|
||||||
{(long)Registers.RxEmpty, new DoubleWordRegister(this)
|
|
||||||
.WithFlag(0, FieldMode.Read, valueProviderCallback: _ => Count == 0)
|
|
||||||
},
|
|
||||||
{(long)Registers.EventPending, new DoubleWordRegister(this)
|
|
||||||
// `txEventPending` implements `WriteOneToClear` semantics to avoid fake warnings
|
|
||||||
// `txEventPending` is generated on the falling edge of TxFull; in our case it means never
|
|
||||||
.WithFlag(0, FieldMode.Read | FieldMode.WriteOneToClear, valueProviderCallback: _ => false, name: "txEventPending")
|
|
||||||
.WithFlag(1, out rxEventPending, FieldMode.Read | FieldMode.WriteOneToClear, name: "rxEventPending")
|
|
||||||
.WithWriteCallback((_, __) => UpdateInterrupts())
|
|
||||||
},
|
|
||||||
{(long)Registers.EventEnable, new DoubleWordRegister(this)
|
|
||||||
.WithFlag(0, name: "txEventEnabled")
|
|
||||||
.WithFlag(1, out rxEventEnabled)
|
|
||||||
.WithWriteCallback((_, __) => UpdateInterrupts())
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
registers = new DoubleWordRegisterCollection(this, registersMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint ReadDoubleWord(long offset)
|
|
||||||
{
|
|
||||||
return registers.Read(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte ReadByte(long offset)
|
|
||||||
{
|
|
||||||
if(offset % 4 != 0)
|
|
||||||
{
|
|
||||||
// in the current configuration, only the lowest byte
|
|
||||||
// contains a meaningful data
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return (byte)ReadDoubleWord(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Reset()
|
|
||||||
{
|
|
||||||
base.Reset();
|
|
||||||
registers.Reset();
|
|
||||||
|
|
||||||
UpdateInterrupts();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WriteDoubleWord(long offset, uint value)
|
|
||||||
{
|
|
||||||
registers.Write(offset, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WriteByte(long offset, byte value)
|
|
||||||
{
|
|
||||||
if(offset % 4 != 0)
|
|
||||||
{
|
|
||||||
// in the current configuration, only the lowest byte
|
|
||||||
// contains a meaningful data
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteDoubleWord(offset, value);
|
public void WriteChar(byte value)
|
||||||
}
|
{
|
||||||
|
readFifo.Enqueue(value);
|
||||||
|
}
|
||||||
|
|
||||||
public long Size => 0x100;
|
public void Reset()
|
||||||
|
{
|
||||||
|
readFifo.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
public GPIO IRQ { get; private set; }
|
public uint ReadDoubleWord(long offset)
|
||||||
|
{
|
||||||
|
switch((Register)offset)
|
||||||
|
{
|
||||||
|
case Register.RxFIFO:
|
||||||
|
if(readFifo.Count == 0)
|
||||||
|
{
|
||||||
|
this.Log(LogLevel.Warning, "Trying to read from empty fifo.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return readFifo.Dequeue();
|
||||||
|
case Register.Status:
|
||||||
|
// Tx FIFO Empty | Rx FIFO Valid Data
|
||||||
|
return (1u << 2) | (readFifo.Count == 0 ? 0 : 1u);
|
||||||
|
default:
|
||||||
|
this.LogUnhandledRead(offset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override Bits StopBits => Bits.One;
|
public void WriteDoubleWord(long offset, uint value)
|
||||||
|
{
|
||||||
|
switch((Register)offset)
|
||||||
|
{
|
||||||
|
case Register.TxFIFO:
|
||||||
|
CharReceived?.Invoke((byte)value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.LogUnhandledWrite(offset, value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override Parity ParityBit => Parity.None;
|
[field: Transient]
|
||||||
|
public event Action<byte> CharReceived;
|
||||||
|
|
||||||
public override uint BaudRate => 115200;
|
public long Size { get { return 0x10; } }
|
||||||
|
public Bits StopBits { get { return Bits.One; } }
|
||||||
|
public Parity ParityBit { get { return Parity.None; } }
|
||||||
|
public uint BaudRate { get { return 0; } }
|
||||||
|
|
||||||
protected override void CharWritten()
|
private readonly Queue<uint> readFifo;
|
||||||
{
|
|
||||||
UpdateInterrupts();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void QueueEmptied()
|
private enum Register
|
||||||
{
|
{
|
||||||
UpdateInterrupts();
|
RxFIFO = 0x0,
|
||||||
}
|
TxFIFO = 0x4,
|
||||||
|
Status = 0x8,
|
||||||
private void UpdateInterrupts()
|
Control = 0xC
|
||||||
{
|
}
|
||||||
// rxEventPending is latched
|
|
||||||
rxEventPending.Value = (Count != 0);
|
|
||||||
|
|
||||||
// tx fifo is never full, so `txEventPending` is always false
|
|
||||||
var eventPending = (rxEventEnabled.Value && rxEventPending.Value);
|
|
||||||
IRQ.Set(eventPending);
|
|
||||||
}
|
|
||||||
|
|
||||||
private IFlagRegisterField rxEventEnabled;
|
|
||||||
private IFlagRegisterField rxEventPending;
|
|
||||||
private readonly DoubleWordRegisterCollection registers;
|
|
||||||
|
|
||||||
private enum Registers : long
|
|
||||||
{
|
|
||||||
RxTx = 0x0,
|
|
||||||
TxFull = 0x04,
|
|
||||||
RxEmpty = 0x08,
|
|
||||||
EventStatus = 0x0c,
|
|
||||||
EventPending = 0x10,
|
|
||||||
EventEnable = 0x14,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
AxiUartLite.cs
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Steps to Set Up a Serial Port</h2>
|
<h2>Steps to Set Up a Serial Port</h2>
|
||||||
@ -629,10 +573,12 @@
|
|||||||
<section>
|
<section>
|
||||||
<h2>Peripheral Rapid Development</h2>
|
<h2>Peripheral Rapid Development</h2>
|
||||||
<img src="media/hardware-20191117-cropped.jpg">
|
<img src="media/hardware-20191117-cropped.jpg">
|
||||||
|
Betrusted Prototype
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Peripheral Rapid Development</h2>
|
<h2>Peripheral Rapid Development</h2>
|
||||||
<video class="r-stretch" data-autoplay src="media/Renode-20191117-trimmed.m4v"></video>
|
<video class="r-stretch" data-autoplay src="media/Renode-20191117-trimmed.m4v"></video>
|
||||||
|
<p>Hackaday Supercon 2019</p>
|
||||||
</section>
|
</section>
|
||||||
<section data-transition="fade-out">
|
<section data-transition="fade-out">
|
||||||
<h2>Advantages of Emulation</h2>
|
<h2>Advantages of Emulation</h2>
|
||||||
@ -642,6 +588,11 @@
|
|||||||
<h2>Advantages of Emulation</h2>
|
<h2>Advantages of Emulation</h2>
|
||||||
<img src="media/renode-xous-double-uart-tiled.png">
|
<img src="media/renode-xous-double-uart-tiled.png">
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>Getting Hardware to Users</h2>
|
||||||
|
<img src="media/betrusted-engine-block-diagram.png" class="r-stretch">
|
||||||
|
<p>Betrusted ENGINE</p>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Getting Hardware to Users</h2>
|
<h2>Getting Hardware to Users</h2>
|
||||||
<img src="media/betrusted-wycheproof-patch.png">
|
<img src="media/betrusted-wycheproof-patch.png">
|
||||||
@ -650,6 +601,9 @@
|
|||||||
<h2>Getting Hardware to Users</h2>
|
<h2>Getting Hardware to Users</h2>
|
||||||
<img src="media/betrusted-wycheproof-patch-fix.png">
|
<img src="media/betrusted-wycheproof-patch-fix.png">
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>Emulation brings more eyes to the project</h2>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<!--
|
<!--
|
||||||
<section>
|
<section>
|
||||||
@ -722,7 +676,7 @@
|
|||||||
<section>
|
<section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Robot Framework: Running Tests in CI</h2>
|
<h2>Robot Framework: Running Tests in CI</h2>
|
||||||
<pre class="code-animation"><code class="robot" data-trim data-line-numbers="|1-6|8-18|20-26|28-40">
|
<pre class="code-animation"><code class="robot" data-trim data-line-numbers="|1-6|8-18|20-26|28-40|39-40">
|
||||||
*** Settings ***
|
*** Settings ***
|
||||||
Suite Setup Setup
|
Suite Setup Setup
|
||||||
Suite Teardown Teardown
|
Suite Teardown Teardown
|
||||||
@ -746,24 +700,25 @@
|
|||||||
Create Machine
|
Create Machine
|
||||||
Execute Command mach create
|
Execute Command mach create
|
||||||
Execute Command machine
|
Execute Command machine
|
||||||
... LoadPlatformDescriptionFromString ${LIS2DS12}
|
... LoadPlatformDescriptionFromString ${LIS2DS12}
|
||||||
Execute Command sysbus LoadELF
|
Execute Command sysbus LoadELF
|
||||||
... ${URI}/nrf52840--zephyr_lis2dh.elf-s_747800-163b7e7cc986d4b1115f06b5f3df44ed0defc1fa
|
... ${URI}/nrf52840--zephyr_lis2dh.elf-s_747800-163b7e7cc986d4b1115f06b5f3df44ed0defc1fa
|
||||||
|
|
||||||
*** Test Cases ***
|
*** Test Cases ***
|
||||||
Should Read Acceleration
|
Should Read Acceleration
|
||||||
Create Machine
|
Create Machine
|
||||||
Create Terminal Tester ${UART}
|
Create Terminal Tester ${UART}
|
||||||
|
|
||||||
Execute Command sysbus.twi1.lis2ds12 AccelerationX 10
|
Execute Command sysbus.twi1.lis2ds12 AccelerationX 10
|
||||||
Execute Command sysbus.twi1.lis2ds12 AccelerationY 5
|
Execute Command sysbus.twi1.lis2ds12 AccelerationY 5
|
||||||
Execute Command sysbus.twi1.lis2ds12 AccelerationZ -5
|
Execute Command sysbus.twi1.lis2ds12 AccelerationZ -5
|
||||||
|
|
||||||
Start Emulation
|
Start Emulation
|
||||||
|
|
||||||
Wait For Line On Uart
|
Wait For Line On Uart
|
||||||
... x 9.997213 , y 4.997410 , z -4.999803
|
... x 9.997213 , y 4.997410 , z -4.999803
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
<p>LIS2DS12.robot</p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
@ -772,7 +727,7 @@
|
|||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>SVD: Standard Chip Documentation</h2>
|
<h2>SVD: Standard Chip Documentation</h2>
|
||||||
<pre class="code-animation"><code class="xml" data-trim data-line-numbers="|3-9|25-87|27-31|39-57|43|46-47|48-56">
|
<pre class="code-animation"><code class="xml" data-trim data-line-numbers="|3-9|25-87|27-31|31|39-57|41|43|46-47|48-56">
|
||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.1" xsi:noNamespaceSchemaLocation="CMSIS-SVD_Schema_1_1_draft.xsd">
|
<device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.1" xsi:noNamespaceSchemaLocation="CMSIS-SVD_Schema_1_1_draft.xsd">
|
||||||
<vendor>STMicroelectronics</vendor>
|
<vendor>STMicroelectronics</vendor>
|
||||||
@ -862,6 +817,7 @@
|
|||||||
</peripherals>
|
</peripherals>
|
||||||
</device>
|
</device>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
<p>BlueNRG2.svd</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>SVD: Using with Renode</h2>
|
<h2>SVD: Using with Renode</h2>
|
||||||
@ -895,6 +851,15 @@
|
|||||||
<img src="media/renode-multi-system.png">
|
<img src="media/renode-multi-system.png">
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>Other Features</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Loading peripherals at runtime</li>
|
||||||
|
<li>Adding custom instructions to Risc-V</li>
|
||||||
|
<li>Python hooks for memory access</li>
|
||||||
|
<li>Networking</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h2>Renode is Free Software</h2>
|
<h2>Renode is Free Software</h2>
|
||||||
Give it a try!
|
Give it a try!
|
||||||
|
BIN
media/betrusted-engine-block-diagram.png
Normal file
BIN
media/betrusted-engine-block-diagram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
BIN
media/frame.png
Normal file
BIN
media/frame.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
BIN
media/vt100-MA-4352.png
Normal file
BIN
media/vt100-MA-4352.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 135 KiB |
BIN
media/vt100-MA-4356.png
Normal file
BIN
media/vt100-MA-4356.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 76 KiB |
Loading…
Reference in New Issue
Block a user