<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>For me, the easiest way to solve this (on a microcontroller, not
      a raspberry) was using SPI, you can create a pretty precise timing
      with that method. And looking at the code in the repository you
      provided it looks like the SPI of the Raspberry is DMA-Enabled in
      kernel.</p>
    <p><br>
    </p>
    <p>In my own code I use 16Bit SPI for finer resolution, but the same
      principle applies to 8Bit SPI, the only important thing here is to
      keep the line long enough on low to generate the proper timing. <br>
    </p>
    Basic idea is to define a pattern for zero's ond ones:
    <p>  ZeroPattern := %0111000000000000;<br>
        OnePattern  := %0111111000000000;</p>
    <p><br>
    </p>
    <p>those patterns define either a zero or a one bit and you need a
      total of 24*this 16bit Pattern to make one Neopixel glow in the
      selected color. When you run SPI at 8Mhz then every bit in the
      pattern represents 125 microseconds and you now simply set as much
      "1" bits as you need to reach the proper timing of the neopixels.
      it is important to have the highest bit in the pattern set to '0'
      so that the neopixel can properly detect the 0->1 change.<br>
    </p>
    <p>You can also use 8Bit Patterns, this saves a little memory but
      you will have to reduce the SPI Frequency to 4MHz (will give you
      250 microseconds per bit)<br>
    </p>
    <p>Once you have filled up a buffer with the proper Patterns you can
      send the buffer to /dev/spidev0.0 and the linux kernel should take
      over and send the data as a continous bitstream.<br>
    </p>
    <p>Here's an example on how to create this 16 bit buffer, you start
      with an array of TColor that you fill with the color value of each
      neopixel you want to use<br>
    </p>
    <p>var</p>
    <p>  FRGBPixel: array of TColor;<br>
      <br>
    </p>
    <p>and then you iterate through the array and write the Bit-Patterns
      for each Neopixel:<br>
    </p>
    <p>    for i := 0 to MaxPixelCount - 1 do<br>
          begin<br>
            //BRG format needed for APA106, also often RGB format is
      used, simply change the pixel shifting here<br>
            Value := ((FRGBPixel[i] shl 8) and $00ffff00) or
      ((FRGBPixel[i] shr 16) and $ff);<br>
            Mask := 1 shl 23;<br>
            for j := 0 to 23 do<br>
            begin<br>
              if (Value and Mask) = 0 then<br>
                WriteBuffer[j+i*24] := ZeroPattern<br>
              else<br>
                // Send 1 Bit<br>
                WriteBuffer[j+i*24] := OnePattern;<br>
              Mask := Mask shr 1;<br>
            end;<br>
          end;</p>
    <br>
    Now you have a properly built WriteBuffer that you cen send to the
    SPI Device.<br>
    <br>
    The only other thing you should need to do is to convert the<br>
    <br>
    <span class="pl-c1">ws2811_return_t</span> <span class="pl-en">spi_init</span>(<span
      class="pl-c1">ws2811_t</span> *ws2811)<br>
    <br>
    startup code or look at this page:<br>
    <br>
    <a class="moz-txt-link-freetext" href="http://wiki.freepascal.org/Raspberry_Pi_-_SPI/de">http://wiki.freepascal.org/Raspberry_Pi_-_SPI/de</a> <br>
    <br>
    for the lowlevel initialization stuff of SPI, although I am not sure
    if DMA is enabled in this example, I never used this code.<br>
    <br>
    Michael<br>
    <br>
    <br>
    <p><br>
    </p>
    <br>
    <div class="moz-cite-prefix">Am 29.07.18 um 16:19 schrieb Anthony
      Walter:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAHmPLWXjo9RR-e_2JweQfYGGe9ShwO=GMar8dr7P7L1bChQ-_A@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <div dir="ltr">I'm not sure what would be the correct list for
        this question since it involves writing Pascal code and not
        Lazarus, so here goes ...
        <div><br>
        </div>
        <div>Can anyone offer me any advice or refer me to helpful
          resources on the subject of using Pascal code to <a
            href="https://www.youtube.com/watch?v=fh2QcmcBRpQ"
            moz-do-not-send="true">control WS2128 led strips</a>, or
          neopixels, from a Raspberry Pi?</div>
        <div><br>
        </div>
        <div>I've wired up a <a
href="https://www.amazon.com/gp/product/B072N7VGK6/ref=oh_aui_detailpage_o02_s01?ie=UTF8&psc=1"
            moz-do-not-send="true">some neopixels</a> and am able to
          control them by way of PWM (pulse wave modulation) on GPIO 18
          (pin 12 on a Pi 3) using <a
            href="https://github.com/jgarff/rpi_ws281x"
            moz-do-not-send="true">this rpi_ws281x git repository</a>.
          It works great either in C or using Python bindings, and I am
          able to create effects in C code easily. But obviously I'd
          prefer to interface with the neopixels using Pascal.</div>
        <div><br>
        </div>
        <div>I've seen some Pascal libraries for both GPIO access, and
          DMA pin mapping, but the communication protocol for
          controlling <span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">neopixels
            is a bit more complex than writing a 24 bit value to a pin.
            Each pixel can be controlled in both brightness and color,
            though I'm unsure how the wx281x library is doing this.</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
          </span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Assuming
            I was to do this in from scratch  Pascal, that is control
            the colors and brightness of many pixels withing an entire
            neopixel strip, I believe I need to do the following in
            psuedo code.</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
          </span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
            // open device memory</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
            fd = open('/dev/mem')</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
            // map the file descriptor to the memory address of <span
style="text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">gpio18</span></span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span
style="text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
              gpio18</span> = mmap(fd, ...)</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
            // fd is no longer needed</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
            close(fd)</span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">  </span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> 
            [ then write to <span
style="text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">gpio18
              in some loop as a data structure ]</span></span></div>
        <div>  </div>
        <div>  // cleanup</div>
        <div>  unmap(<span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">gpio18</span>)</div>
        <div><br>
        </div>
        <div>If that psuedo code is the correct way to do things, I
          would need to know what is the offset and page size for PWM
          GPIO18, what flags to use with mmap, and finally what memory
          locations inside of the <span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">gpio18
            pointer control which pixel, what is the brightness memory
            location and size, what is the color <span
style="text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">memory</span><span
style="text-decoration-style:initial;text-decoration-color:initial"> location
              and size for each pixel. Also, is there any other memory
              location inside <span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">gpio18
                that is of importance or relevance, such as an on/off
                bit?</span></span></span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span
style="text-decoration-style:initial;text-decoration-color:initial"><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
              </span></span></span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span
style="text-decoration-style:initial;text-decoration-color:initial"><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Does
                anyone have any insight into this subject that might be
                useful? After I get something that works I'll be sure to
                share the resulting Pascal code and a video plus
                tutorial.</span></span></span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span
style="text-decoration-style:initial;text-decoration-color:initial"><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
              </span></span></span></div>
        <div><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span
style="text-decoration-style:initial;text-decoration-color:initial"><span
style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">TIA</span></span></span></div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
fpc-pascal maillist  -  <a class="moz-txt-link-abbreviated" href="mailto:fpc-pascal@lists.freepascal.org">fpc-pascal@lists.freepascal.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal">http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal</a></pre>
    </blockquote>
    <br>
  </body>
</html>