An old-style PC BIOS served the function of a bootloader in loading the operating system kernel, and of an API in providing a set of standard system calls through which software could interact with the hardware. Though it as been long-ago superseded by operating system level calls and UEFI bootloaders, it was a simple and easy-to-understand firmware for the PCs of the day.
Microcontrollers usually don’t have anything quite like a BIOS because their software is more often compiled as-is without the need for one. But here’s [Rompass] who has bucked that trend, with a BIOS for the ESP32-C6.
Of course this isn’t the PC BIOS we all know, and you’ll not be running DOS on it. Instead it’s a subsystem that serves the purposes outlined above and provides an environment for dynamically loaded executables from RAM rather than an operating system kernel. The executables are compiled in the normal way for the ESP32, and can be loaded over the network if necessary.
We don’t know how popular a firmware like this one will become, but for us it’s symptomatic of how the line between a microcontroller and a microprocessor is becoming blurred. The next few years are going to continue this trend, as inexpensive microcontroller application processors such as the C6’s P4 bigger brother move into the mainstream.
Header image: Popolon, CC BY-SA 4.0.

imo the word in this context is ‘bootloader’
How about monitor program?
Sounds a lot like DOS, with a packet driver and an app for network file copy.
This also reminds me of bootloaders for AVR chips that can copy programs into flash over ethernet instead of serial. (eg. using TFTP and the like)
Nope, it is not. It seems to be fancy configuration page with some nice features built-in. Has little to do with BIOS nor bootloader.
“[…] and provides an environment for dynamically loaded executables from RAM rather than an operating system kernel.” – mh, what’s the advantage here of instead using the official elf-loader? (or even llext for Zephyr)
It seems you didn’t read what this is.
First paragraph: “an API in providing a set of standard system calls through which software could interact with the hardware”
the normal way is using libraries not system calls. esp32 development is fairly mature and there is a normal way.
Yes, and you can think of a BIOS as a permanently-loaded set of libraries that you can call into, allowing you to make the payloads significantly smaller.
“is becoming”??? – I would say “has been becoming, for quite some time.”
has had been becoming for quite some time? :)
Do I detect a hint of Bioshock Infinity there :)
I will never use it but, I like it.
LOL, did anyone bother to look a the code? BIOS my eye. All he did was hide everything by calling bios_core_start(); in app_main(). That’s is not a BIOS, that is a regular app giving the allusion it is.
Hi! It doesn’t claim to be a BIOS, it says “OPENC6 BIOS SETUP UTILITY”.
I know, it sounds like nitpicking at first, but historically and technically BIOS != SETUP.
Strictly speaking, in IBM compatible PCs, there used to be both a BIOS and a CMOS Setup Utility.
The BIOS was the firmware doing POST and also offering an API/ABI to DOS,
while the SETUP was the GUI to setup the BIOS parameters!
Historically, both had been separate programs, too.
PC/XTs didn’t even have a Setup Utility but DIP switches on motherboard.
Then came the IBM AT and you’d use a setup floppy to set the srttings in the RAM of the RTC.
Compaq copied this approach and many Compaq PCs in the early-mid 90s then had a hidden setup partition on HDD (often with a Windows 3.1 GUI).
Other AT BIOSes such as Award/AMI or Quadtel had the CMOS Setup in ROM, by comparison.
It had extra features such as a screen blanker, custom HDD type (type 47) or a password screen.
That’s also why some PC/AT Model 5170 users swapped the IBM AT BIOS for an Award or Quadtel BIOS.
Anyway, back in the 90s, people still occasionally used the term Setup/CMOS Setup/BIOS Setup Utility to refer to that BIOS GUI (or rather, TUI).
By the time every layman could afford a PC, though, everything got dumbed down, eventually.
Your fellow “PC expert” friend at the pub table would tell you “to go into the BIOS” to change stuff.
And here we are now. Some people call an modern UEFI still “a BIOS”, despite it lacking any BIOS compatibility (CSM got removed years ago). π
There’s good reason to call a modern UEFI a “BIOS”: it contains the Basic I/O System required to load an operating system. BIOSs were a thing before the IBM PC, so PC compatibility isn’t a requirement for a BIOS.
Hi! CP/M’s BIOS was a layer of the operating system, in later versions known as XIOS.
The PC BIOS and PC/AT BIOS (or their clones) are a firmware that provides service routines via software interrupts that OSes like DOS or CP/M-86 can use.
Thus, along with 8086 instruction set, it was the very essence (very heart) of any IBM compatible PC.
Without PC BIOS or PC/AT BIOS, a PC nolonger is an IBM compatible. It nolonger can boot DOS.
UEFI. The UEFI has no/little technical relationship to the PC/AT BIOS it replaced.
It works entirely different to the PC/AT style BIOS and offers no software interrupts (uses pointer-based table system).
When it still had BIOS compatibility via CSM (compatibility support module) someone was still allowed to call it BIOS, I think.
But that’s over now. The current EFI or UEFI is as much or little of a BIOS as OpenFirmware is.
It’s just some other firmware (UEFI: Unified Extensible Firmware Interface).
It also nolonger uses VGA graphics modes, which means that modern graphics cards are probably going to drop VGA BIOS/VESA VBE compatibility.
New graphics cards then nolonger have the VGA+VBE BIOS code in ROM chip and no VGA circuit in GPU.
That’s another thing that used to define IBM PC compatibility.
IBM PCs usually supported MDA/CGA and EGA/VGA (via Option ROMs).
https://en.wikipedia.org/wiki/UEFI#CSM_booting
https://www.youtube.com/watch?v=i0bVMfuRoOI
“All he did was hide everything by calling bios_core_start(); in app_main().”
That’s the actual BIOS itself, not the apps. The apps are the ‘payloads’ (there’s an example included) which are called with an ABI pointer passed to them, and then you use the functions in the ABI pointer, which is the same as a traditional BIOS where you setup the function arguments and then trap to the specific function.
Just because something can be done doesn’t mean it should be done.
This misses the most crucial aspect of the PC BIOS. The whole purpose of providing abstract interrupt service routines for handling the hardware was that there was different hardware out there!
VGA/EGA/CGA? Don’t care
IDE/SCSI? Don’t care
DIN/PS2/USB Keyboard? Don’t care
Chipset initialization? Memory/cache initialization? Don’t care
PCI, ISA, EISA? Don’t care!
The one thing a PC BIOS did not was to load an operating system. It merely pulled the first sector from the boot disk. These 512 bytes of boot code then had to do the rest, ie. loading an operating system.
How much AI has been used in this project? YES.
“Refactor README.md for clarity and consistency”:
https://github.com/Rompass/openc6-bios/commit/6def2609b96f5c24e6a2bc14c042ccbce1e86843
comments style change in 1 source file:
// GPIO pins for power button (Software GND and Sense)
// 1. UPDATE: Add ABI wrappers to allow payloads from Flash/RAM to yield CPU and allocate heap
// βββ LP Core Software Watchdog feeder ββββββββββββββββββββββββββββββββββββββββ
// --- 0. LEGACY WAKEUP MEASUREMENT (EXECUTE BEFORE ANY CONTEXT DELAYS!) ---// =========================================================================
// --- Clear CMOS Jumper State Verification ---
// =========================================================================
// π΄ NETWORK BIOS UPDATE SERVICE (PXE-BASED AUTO OTA) π΄
// =========================================================================
// A) SERIAL BOOT TO VOLATILE SRAM
// B) SERIAL BOOT TO NON-VOLATILE FLASH
// C) PXE WIRELESS NETWORK BOOT
So we have numbered lists that dont have new entries or start from 0. then we have A,B and C.
I mean, the comments are fine, the emojis can be ok. but leave em. your using AI anyway.
Done right, could this save horrendous ESP IDF compile times by not needing to compile a certain layer of functionality? Although perhaps some precompiled libs and linkers could also do that instead.
Sounds a little like Zephyrβs LLEXT system. I think that loading user binary for some embedded system is super cool. I can see it fit on for example robot, where sensors and control systems expose only high level API with safety mechanisms that the user code cannot tamper with. Arduino on steroids.
I am a collaborator in this project, my job is adding ESP32-P4 support and some really big and exiting features, one huge thing coming to this OS will be a port of my OS for ESP32-P4 that can be loaded via openc6bios, both me and Rompass are working hard to get this update live, so stay tuned!
I’m sad about putting a BIOS on a microcontroller. I spent much of my career in high-end HPC. What we wanted most was to ditch the stinkin’ BIOS! It did all manner of things that consumed processor and system resources, all of which was readily observed on supercomputers.