Hello,

I would like to solicit feedback for a draft of generic Programmable I/O driver. This driver is supposed to be a bus driver, allowing other device drivers to control various circuits that require more complex I/O - for example LCDs etc.

I already have a working implementation of this outside of NuttX for AVR 8-bit microcontroller where it can achieve 25kHz change frequency with 20MHz main clock (there is no overhead of an RTOS though, I expect this implementation's result to be a bit worse.)

The aim is to:

- allow the user (device driver) to submit a sequence of I/O operations on GPIO pins/ports

- perform these operations asynchronously from an interrupt handler of a timer/counter device (to achieve relatively high precision and hopefully the lowest overhead possible.)

- have this driver split to higher and lower half so it can be used by multiple architectures

- also provide a character device option to control the I/O directly from the application (at least for testing)

The feedback I would like to solicit regards to these items:

- Is there something like that already present in NuttX the I missed? As far as I found, there seems to only be some code supporting PIO on chips that support it in hardware (for example RP23xx)

- A basic one - is this acceptable to be merged? (Is it worth it to have such a feature?)

- API - it currently only supports simple operations (I/O port direction change, output value change, input value read), only triggered by the MCU side. There is no support for triggering any actions based on external events. Should it be extended in advance or somehow made extensible? (The thought here is that at some point, someone may want to change this into a generic API able to control both software-based PIO like this implementation and hardware-based one like in the RP23xx - I would like to find a balance between not overcomplicating things now and not hindering future development, if it comes to it.)


I prepared a patch composed of few files as a skeleton of the implementation. There is a Documentation file that describes how is this supposed to work in more detail. Other files are fairly rudimentary - they're mostly there to show directory structure I intend to create.

This patch is available in a git repository nuttx.git at git.kerogit.eu accessible through HTTP/S. (Trying to prevent bot traffic by not posting the URL in machine-readable form.) The relevant branch is called pio_devel.

The patch does not contain any skeleton for the character device driver - that would simply call the chain-related functions on one side and provide read/write for values and ioctls for the rest on the other.


Any feedback or suggestions is appreciated.

Reply via email to