First TinyCLR 1.0 preview

Almost two years ago, we announced our plans to build TinyCLR OS. There has been lot of excitement and hard work since then. Thanks to the feedback from our community and commercial customers, we have defined and refined the plan. This release is the first preview of the final release of that plan. Our goal is still to have TinyCLR running in commercial products before the end of the year – while keeping in mind our priority of a quality product versus getting it out and into your hands as soon as possible.

In this release we did a review of a lot of TinyCLR and as a result we performed quite a bit of reorganization and cleanup to get stuff ready for 1.0 and beyond. Many of the device APIs changed around in various amounts as part of this (particularly UART which was greatly simplified). These changes should make them simpler to use all around – from the end application to porting. Given the scale of the changes we do expect a few more bugs to pop up in this release.

We’re also now hosting the packages on NuGet and the VSIX on the Visual Studio Marketplace! This makes staying up to date even easier as there are fewer parts to manually download. After the initial install, everything except TinyCLR Config can be kept up-to-date using Visual Studio and TinyCLR Config. Take a look at the release notes for full details. (The extension is still making its way through the marketplace approval process, so expect it to appear soon.)

Get started with TinyCLR OS:
TinyCLR OS Downloads:
TinyCLR OS Release Notes:


My G30, G80 and FEZ are update with TinyCLR OS 1.0 preview .:sunglasses: I modified configuration code for SPI because FromId was deleted. I tested on Adafruit Display Shield :joy:

I think demo SPI code can be :

using System;
using System.Collections;
using System.Text;
using System.Threading;
using GHIElectronics.TinyCLR.Devices.Spi;
using GHIElectronics.TinyCLR.Pins;

class Program
        static void Main()
            var settings = new SpiConnectionSettings(FEZ.GpioPin.D8)   // the slave's select pin
                Mode = SpiMode.Mode1,
                ClockFrequency = 4 * 1000 * 1000,       //4Mhz
                DataBitLength = 8,
            SpiController ctrlSpi = SpiController.FromName(FEZ.SpiBus.Spi1);
            var device = ctrlSpi.GetDevice(settings);

            device.Write(new byte[] { 1, 2 });          // write something
            device.TransferSequential(...)              // this is good for reading registers
            device.TransferFullDuplex(...)              // this is the only one that trully represents how SPI works

Thank you for this 1.0 release !

Will you also publish more detailed documentation on how to fill scatter file and device.h content ?

Currently, the Quail has only 28KB total memory at startup, when it used to have something like 120Kb in the “good ol’ time” of NETMF :wink: So it obviously needs some tweaks in the scatter file.


Following the journey over the years, GHI have stewarded this extremely well!
Its exciting to see TinyCLR getting ready for 1.0 production release!
The Nuget packages and easy integration into VS2017 has been a joy!
TinyCLR-Config is easy, and works to deploy FW!!
It really is becoming quiet polished! And timing seems right too!

So well done to all!!! I Sure it has not been an easy task to pull off!



Not yet production release ! This is “just” a preview, but a good one it seems: tinyclr config is resizable, GetDirectories and GetFiles are functionnals, packages are smaller …
A lot of work is awaitng me now to update my packages, but all is right way.

1 Like

We do plan more documentation around porting to devices. If you have specific questions right now we’re happy to help!

Yes it is important to understand this. With this release, there will be no more major changes. We are only bug fixing going forward. We would love to see the “production release” before year end.


Is it normal that .vsix is not yet on Visual Studio Marketplace ?

Where is I2cSoftwareProvider ?

@John_Brochue: how to replace DataReader and DataWriter ?

1 Like

I could use some help. Setting for my UD700 Rev A. Using a UC5550
and UCM Dev Board.

I tried the following but does not display anything.

private static readonly SolidBrush BrushBackground = new SolidBrush(Color.Red);

        var displayController = GHIElectronics.TinyCLR.Devices.Display.DisplayController.GetDefault();

        displayController.SetConfiguration(new GHIElectronics.TinyCLR.Devices.Display.ParallelDisplayControllerSettings
            Width = 800,
            Height = 480,
            DataFormat = GHIElectronics.TinyCLR.Devices.Display.DisplayDataFormat.Rgb565,
            HorizontalBackPorch = 46,
            HorizontalFrontPorch = 16,
            HorizontalSyncPolarity = false,
            HorizontalSyncPulseWidth = 1,
            DataEnableIsFixed = false,
            DataEnablePolarity = false,
            //PixelClockRate = 10000000,
            PixelClockRate = 20000000,
            PixelPolarity = false,
            VerticalBackPorch = 23,
            VerticalFrontPorch = 7,
            VerticalSyncPolarity = false,
            VerticalSyncPulseWidth = 1

        var screen = System.Drawing.Graphics.FromHdc(displayController.Hdc);

        screen.FillRectangle(BrushBackground, 0, 0, 800, 480); // Fill display

Thanks in advance!

@John_Brochue: how to specify a pulse of 10us with PulseFeedback ?

I stop to post questions for this day ! :roll_eyes:

There were some complications around the vsix, we’re going to push back its appearance in the marketplace to the next release.

For software I2C (and SPI):

var provider = GHIElectronics.TinyCLR.Devices.I2c.Provider.I2cControllerSoftwareProvider(GpioController.GetDefault(), G80.GpioPin.PA0, G80.GpioPin.PA1);
var controller = I2cController.FromProvider(provider);
var device = controller.GetDevice(new I2cConnectionSettings(0xAA, I2cAddressFormat.SevenBit, I2cBusSpeed.StandardMode));

There is no direct replacement for DataReader and DataWriter.

You control the length of the pulse with the PulseLength property. It’s a TimeSpan, so you’ll want something like TimeSpan.FromTicks(100) (there are 100ns in a single tick).

Do keep in mind there are some known issues around PulseFeedback and software I2C.

You’ll also want to call Enable after calling SetConfiguration.


So SIMPLE when you know what you are doing!

That worked…

Thank You

I have to add that this info was available to me before I asked.

“Of particular note are that you must now call Enable to turn the display”

1 Like

Hi Everyone,

Check out this cool video of TinyCLR OS


I need to send Gus some shiny so i can get in your “…add more.” section :sunglasses:

Please. We love shiny things!

Perhaps a next GHIElectronics.TinyClr.Utilities package ? It would be nice ! :wink:

Is SQLite available in this new release?