There's somewhat of a (reduced) PM interface to userspace, via boardctl(), 
which passes on the PM_STAY, PM_RELAX and others to PM subsystem. This could be 
extended or indeed you could create a specific driver. The downside of this is 
that it requires runtime registration on board initialization for all boards.
procfs interface could be useful but I think it becomes awkward to be handled 
from code (it is most useful from CLI by using echo and cat).

Anyway, I think the main point is to really think what is the expected 
interface to offer to userspace so it is really useful for the general case and 
not tied to a particular scenario. Maybe we need to think this through 
carefully and maybe even look at the Linux PM subsystem for some inspiration 
for a relatively standard interface.

Anyway, as I mentioned before, the IDLE loop is usually a good place to 
interact with hardware. When I need to interact with board code from userspace, 
I simply extend boardctl to provide any required functionality. Have you looked 
into this options before moving onto introducing a common driver?

Best,
Matias

On Fri, Mar 19, 2021, at 07:08, Cis Van Mierlo wrote:
> Hi Matias,
> 
> Because we have an application that manages the power state machine by 
> itself, therefore we don't need a governor and would like to view and change 
> the power state. 
> For testing we've been calling the OS interface directly from the user space 
> application. 
> This is indeed not ideal, therefore we want to create an API to do this 
> nicely from user space.
> 
> Currently we are considering the following two options:
> 1. Create a driver in nuttx/drivers/power/pm_driver.c that exposes the 
> blockdriver /dev/pm, the user could use this to invoke sys calls that nicely 
> comply with the OS.
> 2. Add a procfs option to the PM driver that exposes /procfs/power/state 
> which can be modified from the user space as well.
> 
> Which option would you prefer or do you have other suggestions?
> 
> Kind regards,
> 
> Cis van Mierlo
> Embedded Software Engineer
> NXP Semiconductors, CTO Systems Innovations
> 
> High Tech Campus 46, room 0.64, 5656 AE Eindhoven, The Netherlands
> E-mail: cis.van.mie...@nxp.com <mailto:cis.van.mierlo%40nxp.com> 
> Internet: http://www.nxp.com 
> 
> -----Original Message-----
> From: Matias N. <mat...@imap.cc <mailto:matias%40imap.cc>> 
> Sent: Thursday, March 11, 2021 4:55 PM
> To: dev@nuttx.apache.org <mailto:dev%40nuttx.apache.org>
> Subject: RE: [EXT] Re: Project specific power management configuration
> 
> Caution: EXT Email
> 
> Calling those functions from applications would be a violation of 
> OS/application isolation, as these are OS level calls.
> The general idea is that a driver only knows what to do on each sleep level 
> and the IDLE loop uses those functions to drive the change of states of PM 
> system.
> From application side you can forbid/allow the PM system go into each state 
> which let's you control how devices behave.
> 
> I think the typical approach for low-power applications is typically to have 
> a very short active period and a long sleep period. So, the application logic 
> can forbid entering sleep, interact with all required devices, allow sleep, 
> and go to sleep itself (so the IDLE loop kicks in). This way there's no need 
> to control device state directly. Note that you can still wakeup due to 
> external events, which can be made to go back to normal state or not, which 
> will turn on required devices until you service the request and go back to 
> sleep.
> 
> If for some reason your project requires a different architecture I would say 
> that you need to have a custom board-level driver and offer some kind of 
> interface the user to tune this. An easy path is to use boardctl for this 
> interface.
> 
> Best,
> Matias
> 

Reply via email to