Motivation

There are IoT devices like your router, that that just sit inside a box, do their thing, don’t have a screen and never deal with the user directly. That’s the land of embedded Linux. You can use Windows IoT here, but there aren’t many obvious benefits.

But there are more interesting device, ones that are interactive, have a touch-screen and require user to do stuff. This mostly the land of Android or Windows embedded. Windows IoT core has some advantages over embedded Android:

It does not suffer from driver issues that prevent Android from receiving OS updates. You can’t really call any system that cannot be updated secure, there are constantly kernel vulnerabilities being discovered. It will update your app using the Microsoft Store mechanism, while you can’t really use Google store to do the same in embedded applications. Unlike a Kiosk app, there is no system UI sitting around that needs to be locked down. If you go to Android AOSP route, that’s not an issue, but it’s also a lot more work. Bigger devices, this can be both good an bad.

You might protest that off -the shelf devices don’t have GPIOs, but one can use a microcontroller over USB.

For a long time I was lamenting the fact that there are only 3 supported boards on the official website. However, I was enlightened by a stranger on Reddit — you can run Windwos IoT Core pretty much on any computer! Microsoft just does not bother explaining it properly!

Goals

Document which devices work and which don’t. What works and what doesn’t

Provide x86 and x64 apollo lake Images for quick testing of devices, so everyone doesn’t have to download 50 metric tons of stuff just to test their device

Provide drivers

Provide fully built images for each device

How to Test a device with Windows IoT

Background

Many off-the-shelf devices are compatible with Windows IoT, but it uses a more restricted driver model. The only way to find out which ones are compatible is to test them. The Goal is to find a few off-the-shelf devices that work well and bring together everything needed for an average dev can get them working immediately.

Windows IoT core will boot on most UEFI systems. A 32 bit UEFI will boot 32 bit Windows IoT, and 64 bit UEFI can only boot 64 bit Windows IoT. This is not the case with “normal” operating systems- they would boot either way. Currently Microsoft only provides 32 bit image of Windows IoT for Minnowboard Max, and if you wish to test it on another machine, you have to build an image yourself, the process is described in Windows IoT Core Build your own image section.

Currently Intel provides board support packages for Atom BayTrail and Atom Apollo Lake processors. Cherry Trail Intel Atom processors are not supported. A device with unsupported processor would still boot up, but GPU acceleration won’t work, and some peripherals won’t work either. A Cherry Trail (Atom® x5-Z8300) Intel Compute Stick is one example of such device.

Some guys mention that they managed to get Windows IoT to work on I3 and I7 CPUs and even get the GPU to work.

Export Drivers

First see what kind of device you are running. You need to get 32 bit drivers for 32 bit Windows IoT, and 64 bit drivers for 64 bit IoT. Use PowerShell to export drivers from your device while it’s running “normal” Windows.

Export-WindowsDriver -Online -Destination C:\driversBackup

Save them somewhere safe, we will need them later.

Create bootable flashdrive

Then you need to create a bootable flashdrive that runs Windows PE. To do that, download Windows Deployment Kit and tick Windows PE. Take a flashdrive and format it as FAT32 (NTFS should work too). Then open “Deployment and Imaging Tools Environment” and type in

copype amd64 C:\WinPE_amd64

amd64 can be replaced with x86 or ARM as needed. Change file path as needed too. Then take contents of C:\WinPE_amd64\media and copy them to your formatted flash drive. That's it, you have a bootable drive! NO special magic needed. Don't forget that for 32 bit devices you need to create a bootable flash drive with x86 version of Windows PE, and for x64 you need x64 version. Next take JouleInstaller.cmd from this repository, it is a program that will flash a Windows IoT image (FFU) onto the device drive, and it's available from this repo.

Check for UEFI

Windows IoT only works with UEFI, and will not work with a classic Bios. The way to check that is to grab detectefi.exe from this repo, and place it in the root of the flash drive we've just created. Restart the device and get it to boot from the flash-drive. You will see Windows PE command line. It is typically running from drive X:\ , which I think is the memory. You need to switch to the flash drive, typically it will be C drive. You can just type in C:\ . Sometimes you'll have to try different drives. Last thing to do is to get the right FFU and to place it in the root of the flash drive. Once you think you are in the right drive, type dir to list content of the directory. You should see detectefi.exe if you are in the right drive. Type detectefi.exe to run it. It will tell you if you are running in the UEFI mode or BIOS mode.

IF you are in BIOS mode, Windows IoT core won't work. Try changing setting of the BIOS and you might be able to switch the device to UEFI mode.

Getting the FFU

If it’s a Bay trail device, They almost always have a 32 bit UEFI, and you can go ahead and flash a MinnowBoard Max image by following Instruction for Intel Compute Stick. Download the ISO, run the MSI installation, and you will have flash.ffu file in C:\Program Files (x86)\Microsoft IoT\FFU\MinnowBoardMax . If it’s a different device, it will probably be running a 64 bit UEFI and you need to build a 64 bit version of Window IoT. The process is too involved to describe here, but intill I build a 64bit version and release it, that’s what you are stuck with.

Once you have the FFU, place it in the root of the flashdrive.

Installing