hikabab

hikabab

Ensuring drivers are loaded before application boots

I’m building a custom Nerves system for a CM4-based board and running into a timing issue where the main Elixir application starts before all kernel drivers and hardware are fully initialized.

My firmware uses NervesTime with an RTC (PCF8563) on an I2C bus that’s created by a device tree overlay. During boot, NervesTime tries to initialize the RTC, but the I2C bus doesn’t exist yet:

22:43:22.173 [info] i2c i2c-22: Added multiplexed i2c bus 10

22:43:22.218 [debug] [NervesTime] starting /usr/sbin/ntpd with: ["-n", "-S", "/srv/erlang/lib/nerves_time-0.4.9/priv/ntpd_script", "-p", "0.pool.ntp.org", "-p", "1.pool.ntp.org", "-p", "2.pool.ntp.org", "-p", "3.pool.ntp.org"]

22:43:22.237 [error] [NervesTime] Cannot initialize rtc '{NervesTime.RTC.NXP.PCF8563, [bus_name: "i2c-10", address: 81]}': :bus_not_found

When I try to initialize the RTC later via iex, it works with no issues:

iex(2)> {:ok, ref} = NervesTime.RTC.NXP.PCF8563.init(bus_name: "i2c-10", address: 0x51)
{:ok,
 %{
   address: 81,
   bus_name: "i2c-10",
   i2c: %Circuits.I2C.I2CDev{
     ref: #Reference<0.3964485155.1160904719.209822>,
     retries: 0,
     flags: [:supports_empty_write]
   }
 }}

I am considering adding an erlinit pre-run script to explicitly wait for the the hardware to be fully initialized, but am curious if there is a recommended Nerves pattern for waiting on hardware initialization? Ideally this would be baked into the Nerves system.

Most Liked

fhunleth

fhunleth

Co-author of Nerves

Hi @hikabab,

You’re running into a common issue where libraries assume that hardware exists on initialization when it really shouldn’t. I make this mistake too and I’m on the maintainers list for that library, so I’m not blaming those involved. The usual answer is that the library needs to either retry or hook into the proper notification for when its requirements are met. I prefer retrying for these things since it’s simpler. Retries can also recover from I2C issues like the bus being temporarily hung.

If you’re looking for a pragmatic answer that does involve changing that library, then I think you have it. For other things, I’d suggest adding init code to an Application.start callback that gets run before the code that needs it. However, an RTC is special and affects the clock, so you’ll benefit by getting it initialized as early as possible.

If you already have a custom Nerves system, then the way I’d solve the problem is to use the Linux device driver for the PCF8563. If it’s a built-in device driver and you’re loading the overlay via the config.txt, then I’d expect system time to get set by the RTC before any Elixir code runs. I know others who prefer handling the RTC in Elixir, so if you’re interested in updating NervesTime.RTC.NXP.PCF8563 to retry and are open to sending PRs, then I’d work with the other maintainers to get that merged.

Where Next?

Popular in Questions Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
New
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

We're in Beta

About us Mission Statement