Thursday, May 19, 2011

Intelligent simple peripherals

This week I once again wrote an interrupt service routine for a UART to do some serial communication. Actually I didn’t have to write a whole lot, because the receiver part had already been done by someone else, but the code for transmitting data under interrupt control was missing. I already had this code in another project and porting it was easy and quick, but then I started thinking.

Like me, probably thousands of programmers all over the world are doing this every day, which is a waste of time and resources. Of course we all try to reuse code as much as possible, but with micro-controllers getting more and more advanced, why don’t the silicon vendors simply implement the driver in the peripheral, in silicon? I mean, how many people do use the UART for other things than simply sending and receiving data? OK, we see more and more 16550 compatible UARTs, so drivers are easily found, but then again, why not put it in a ROM for the programmer’s convenience? All it has to do is to read data from a buffer and write data to it, all under interrupt control of course. An intelligent peripheral like that would save some code space, but most importantly, it would save lots of programmer’s time.

Such an intelligent peripheral would have a pretty simple interface: some registers to set up circular rx & tx buffers and the communication parameters, registers to read/write a block of data and some status registers to check for errors. The user only has to supply a block of RAM for the buffers. This is what most of us implement in our code anyway. For backward compatibility they should keep the traditional interface too, that way everything is possible.

Similar peripherals for other protocols could be integrated as well, like I2C or SPI.

The typical ISR for I2C is rather complicated and big, and is therefore prone to many bugs. Many software developers are struggling to get it working properly, so it would be a great service to them if the driver was already in the chip. I am not pleading for a full blown on-chip operating system, but some simple drivers that will take care of the most common tasks sure would be nice.

So you silicon vendors reading this please do give it a thought. I appreciate the integrated USB drivers, but don’t stop there. Why don’t you make things even better by adding hardcoded drivers for “simple” peripherals too?


  1. You mentioned "why don’t the silicon vendors simply implement the driver in the peripheral, in silicon". Is this not already the case with StellarisWare?

    1. StellarisWare is an exception. Last week I had a chance to discuss this topic with NXP and they seemed to have never really given it any real thought. "But we already provide a software library, isn't that enough?" They prefer to do on-chip drivers for complicated peripherals like USB, but they said they will give it a thought anyway. Of course silicon real estate plays a role here. So maybe someday we will see an integrated I2C driver in an LPC device?