blinkchain icon indicating copy to clipboard operation
blinkchain copied to clipboard

blinkchain OS process died with status: 1

Open davydog187 opened this issue 5 years ago • 6 comments

Hello! I'm hoping you can point me in the right direction. I'm having no luck with my first Nerves experience past blinky :cry:

I'm running on a rpi4 and was running into this error with my NeoPixel matrix. I was wondering if I had faulty hardware, so I bought a NeoPixel ring to test with as well. I'm getting the same error. I'm wondering if my configuration is bad, or maybe I'm wiring something incorrectly? Any assistance would be helpful.

I've tried setting the dma_channel to 10, moving it to different GPIO ports, with no luck. Any advice for how to debug further?

15:39:19.022 [error] GenServer Blinkchain.HAL terminating
** (RuntimeError) blinkchain OS process died with status: 1
    (blinkchain 1.0.0) lib/blinkchain/hal.ex:192: Blinkchain.HAL.receive_from_port/1
    (blinkchain 1.0.0) lib/blinkchain/hal.ex:113: Blinkchain.HAL.handle_info/2
    (stdlib 3.11.2) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib 3.11.2) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib 3.11.2) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: :init_canvas
State: %Blinkchain.HAL.State{config: %Blinkchain.Config{canvas: %Blinkchain.Config.Canvas{height: 1, width: 12}, channel0: %Blinkchain.Config.Channel{arrangement: [%Blinkchain.Config.Strip{count: 12, direction: :right, origin: {0, 0}, spacing: 1}], brightness: 32, gamma: nil, invert: false, number: 0, pin: 18, type: :grb}, channel1: %Blinkchain.Config.Channel{arrangement: [], brightness: 255, gamma: nil, invert: false, number: 1, pin: 0, type: :gbr}, dma_channel: 5}, port: #Port<0.42>, subscriber: nil}

davydog187 avatar May 25 '20 15:05 davydog187

I pushed up my code here https://github.com/davydog187/wire

davydog187 avatar May 25 '20 15:05 davydog187

@davydog187, The Blinkchain.HAL.State in your error message appears to define 2 channels, but your config only defines 1. Any idea why that might be?

%Blinkchain.HAL.State{
  config: %Blinkchain.Config{
    canvas: %Blinkchain.Config.Canvas{
      height: 1, 
      width: 12
    }, 
    channel0: %Blinkchain.Config.Channel{
      arrangement: [
        %Blinkchain.Config.Strip{
          count: 12, 
          direction: :right, 
          origin: {0, 0}, 
          spacing: 1
        }
      ], 
      brightness: 32, 
      gamma: nil, 
      invert: false, 
      number: 0, 
      pin: 18, 
      type: :grb
    }, 
    channel1: %Blinkchain.Config.Channel{
      arrangement: [], 
      brightness: 255, 
      gamma: nil, 
      invert: false, 
      number: 1, 
      pin: 0, 
      type: :gbr
    }, 
    dma_channel: 5
  }, 
  port: #Port<0.42>, 
  subscriber: nil
}

My understanding is that Blinkchain will create an OS process for each channel, so the error message you're receiving might be that the process can't communicate with pin0 on :channel1.

I'd be curious what happens when you remove :channel1

mlapping avatar May 27 '20 20:05 mlapping

@mlapping i'm not configuring that channel, it looks like Blinkchain always expects there to be two channels, and that is the default for channel1.

https://github.com/GregMefford/blinkchain/blob/b453ef7874dca4241309074d0c0db54799fc8ff0/lib/blinkchain/config.ex#L49

I'll fork Blinkchain and see if removing channel1 fixes the problem

davydog187 avatar May 31 '20 14:05 davydog187

Note that it also seems the HAL GenServer also has this expectation https://github.com/GregMefford/blinkchain/blob/b453ef7874dca4241309074d0c0db54799fc8ff0/lib/blinkchain/hal.ex#L115

davydog187 avatar May 31 '20 14:05 davydog187

Hello! I'm hoping you can point me in the right direction. I'm having no luck with my first Nerves experience past blinky 😢

I'm running on a rpi4 and was running into this error with my NeoPixel matrix. I was wondering if I had faulty hardware, so I bought a NeoPixel ring to test with as well. I'm getting the same error. I'm wondering if my configuration is bad, or maybe I'm wiring something incorrectly? Any assistance would be helpful.

I've tried setting the dma_channel to 10, moving it to different GPIO ports, with no luck. Any advice for how to debug further?

15:39:19.022 [error] GenServer Blinkchain.HAL terminating
** (RuntimeError) blinkchain OS process died with status: 1
    (blinkchain 1.0.0) lib/blinkchain/hal.ex:192: Blinkchain.HAL.receive_from_port/1
    (blinkchain 1.0.0) lib/blinkchain/hal.ex:113: Blinkchain.HAL.handle_info/2
    (stdlib 3.11.2) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib 3.11.2) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib 3.11.2) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: :init_canvas
State: %Blinkchain.HAL.State{config: %Blinkchain.Config{canvas: %Blinkchain.Config.Canvas{height: 1, width: 12}, channel0: %Blinkchain.Config.Channel{arrangement: [%Blinkchain.Config.Strip{count: 12, direction: :right, origin: {0, 0}, spacing: 1}], brightness: 32, gamma: nil, invert: false, number: 0, pin: 18, type: :grb}, channel1: %Blinkchain.Config.Channel{arrangement: [], brightness: 255, gamma: nil, invert: false, number: 1, pin: 0, type: :gbr}, dma_channel: 5}, port: #Port<0.42>, subscriber: nil}

this issue could be unrecognized hwver by ws281x library. check it out in remote iex shell (ssh nerves.local)

iex> filename = "/srv/erlang/lib/blinkchain-1.0.0/priv/blinkchain"
iex> args =  ["10", "18", "60", "grb", "0", "0", "gbr"]
iex> port =
     Port.open({:spawn_executable, filename}, [
         {:args, args},
         {:line, 1024},
         :use_stdio,
         :stderr_to_stdout,
         :exit_status
      ])

iex> flush

that is, if you got following output

{#Port<0.110>,
 {:data,
  {:eol,
   'blinkchain: ws2811_init failed: -3 (Hardware revision is not supported)'}}}
{#Port<0.110>, {:exit_status, 1}}

I have looked into rpi_ws281x source code. in rpihw.c

...

static const rpi_hw_t rpi_hw_info[] = {
    //
    // Raspberry Pi 4
    //
    {
        .hwver = 0xA03111,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 1GB"
    },
    {
        .hwver = 0xB03111,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 2GB"
    },
    {
        .hwver = 0xC03111,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 4GB"
    },
    //
    // Model B Rev 1.0
    //
    ....

there are two probable issues, one is absent of "Pi 4 Model B - 8GB", the other is the .hwver is changed for the latest Pi4 devices.

I have two Pi4 versions (2GB and 8GB)

#  2GB version

ex> cat "/proc/cpuinfo"

Hardware	: BCM2835
Revision	: b03114
Serial		: 10000000fe99db45
Model		: Raspberry Pi 4 Model B Rev 1.4

# 8GB version

iex> cat "/proc/cpuinfo"

Hardware	: BCM2835
Revision	: d03114
Serial		: 1000000068680c0c
Model		: Raspberry Pi 4 Model B Rev 1.4

for 2GB version, the hwver is changed to b03114, but the it is defined as b03111 in rpihw.c.

fix the revisions in rpihw.c


static const rpi_hw_t rpi_hw_info[] = {
    //
    // Raspberry Pi 4
    //
    {
        .hwver = 0xA03114,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 1GB"
    },
    {
        .hwver = 0xB03114,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 2GB"
    },
    {
        .hwver = 0xC03114,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 4GB"
    },
    {
        .hwver = 0xD03114,
        .type = RPI_HWVER_TYPE_PI4,
        .periph_base = PERIPH_BASE_RPI4,
        .videocore_base = VIDEOCORE_BASE_RPI2,
        .desc = "Pi 4 Model B - 8GB"
    },
    //
    // Model B Rev 1.0
    //
   

recompile the project, it works for my case.

edwardzhou avatar Sep 23 '22 03:09 edwardzhou

Frankly speaking, exchanging data via STDIO is an inefficient, workaround solution. expecting the more native way.

edwardzhou avatar Sep 23 '22 04:09 edwardzhou