<div dir="ltr">Thanks Andre,<div><br></div><div>This will be really a big help. Also, I am sure it will help anyone who will be working over SD card/MMC interface in Raspberry pi for RTEMS.</div><div><br></div><div>Currently, since I don't have enough knowledge on SD spec. I am going through the pdf that you have sent and trying to just initialize SD card on raspberry pi. </div>
<div>Later I will try to read the block/sectors on SD card. <br></div><div><br></div><div><br></div><div>Thanks & Regards</div><div>Ritesh</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Tue, Aug 26, 2014 at 1:34 PM, Andre Marques <span dir="ltr"><<a href="mailto:andre.lousa.marques@gmail.com" target="_blank">andre.lousa.marques@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Hello Ritesh,<br>
      <br>
      My progress on the SD card support can be found on<br>
      <br>
      <a href="https://bitbucket.org/asuol/rtems-graduation-project/src/" target="_blank">https://bitbucket.org/asuol/rtems-graduation-project/src/</a><br>
      <br>
      It contains the sources and a test case (it reads a file and write
      another on the card), as well as patches so you can easily test
      that code.<br>
      <br>
      It was based on <br>
      <br>
      <a href="https://github.com/jncronin/rpi-boot/blob/master/emmc.c" target="_blank">https://github.com/jncronin/rpi-boot/blob/master/emmc.c</a><br>
      <br>
      and right now it may or may not work with your SD card. I got it
      working with the SD card I have used during development (4GB class
      4 SanDisk SD card), but it does not work with the card I have now
      (Kingston 8GB microSD card on a SD adapter). I suspect this is
      related with the timeout the driver gives for each command to
      complete in, as it is an hard coded value which should be
      calculated by parsing the card's CSD register. Also the code needs
      some major cleanup, and some features were overlooked such as
      memory barriers.<br>
      <br>
      As for SD card documentation I have used the v3 simplified
      specifications<br>
      <br>
      SD host controller -
<a href="https://www.sdcard.org/downloads/pls/simplified_specs/archive/partA2_300.pdf" target="_blank">https://www.sdcard.org/downloads/pls/simplified_specs/archive/partA2_300.pdf</a><br>
      <br>
      SD physical layer -
<a href="https://www.sdcard.org/downloads/pls/simplified_specs/archive/part1_301.pdf" target="_blank">https://www.sdcard.org/downloads/pls/simplified_specs/archive/part1_301.pdf</a><br>
      <br>
      Besides the broadcom datasheet.<br>
      <br>
      By the way, since you replied to this thread I am not sure if I
      ever shared why it was hanging. Turns out that there was/is a
      conflict between my emmc driver and the raspberry pi clock driver.
      All I had to do was to disable the clock driver for it to work.<br>
      <br>
      --André Marques.<div><div class="h5"><br>
      <br>
      On 08/26/14 06:38, Ritesh Harjani wrote:<br>
    </div></div></div><div><div class="h5">
    <blockquote type="cite">
      <div dir="ltr">Hi Andre, 
        <div><br>
        </div>
        <div>I am too trying to understand SD card/MMC protocol on
          Raspberry pi for RTEMS. You said in your last mail that you
          have already done some progress on this. </div>
        <div>Could you please share your code at some place, so that
          others can get a help from your code in case anybody else too
          is trying to understand/develop SD card support for Raspberry
          pi. </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>Thanks for the help!!</div>
        <div>Ritesh</div>
      </div>
      <div class="gmail_extra"><br>
        <br>
        <div class="gmail_quote">On Wed, May 14, 2014 at 12:30 AM, Andre
          Marques <span dir="ltr"><<a href="mailto:andre.lousa.marques@gmail.com" target="_blank">andre.lousa.marques@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div bgcolor="#FFFFFF" text="#000000">
              <div>
                <div>On 05/13/14 12:15, Andrey Mozzhuhin wrote:<br>
                </div>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div>
                      <div>Do you not forget to call
                        rtems_blkdev_request_done in read routine of
                        block device driver? <br>
                      </div>
                      Also try to increase CONFIGURE_MAXIMUM_TASKS -
                      bdbuf need some worker tasks.<br>
                    </div>
                  </div>
                </blockquote>
                <br>
              </div>
              I call rtems_blkdev_request_done after each read request,
              and changing CONFIGURE_MAXIMUM_TASKS to 20 (instead of 2)
              did not had any impact.
              <div><br>
                <br>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div><br>
                      >> <a href="https://github.com/jncronin/rpi-boot/blob/master/emmc.c" target="_blank">https://github.com/jncronin/rpi-boot/blob/master/emmc.c</a><br>
                      <br>
                    </div>
                    <div>Hmm. Implementation specific to Raspberry Pi is
                      not good idea. It is better to separate MMC/SD
                      protocol implementation and hardware support like
                      in FreeBSD or Linux.<br>
                    </div>
                  </div>
                </blockquote>
                <br>
              </div>
              Yes, the point in the end is probably to have the MMC/SD
              protocol somewhere else, just like the spi-sd-card driver
              (SD card access through SPI interface protocol, at
              c/src/libchip/i2c/spi-sd-card*).
              <div><br>
                <br>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div><br>
                      >> Not sure how to approach this problem, as
                      the logic seems right. Will do more testing in the
                      meanwhile.<br>
                    </div>
                    <br>
                  </div>
                </blockquote>
                <br>
              </div>
              Today I have re-formated the card (under Linux), and the
              block data read on RPi checks with the card hexdump on
              Linux.<br>
              <br>
              So far I tested:<br>
              <br>
              - The block data that is being read, and compared with the
              same block data read on Linux (small mismatch (4 bits) at
              the middle of a 512 byte block before, no mismatch now)<br>
              <br>
              - The request buffer contents (<a href="http://www.rtems.org/onlinedocs/doxygen/cpukit/html/structrtems__blkdev__sg__buffer.html" target="_blank">http://www.rtems.org/onlinedocs/doxygen/cpukit/html/structrtems__blkdev__sg__buffer.html</a>).

              Looking at this I don't know what the User pointer is. I'm
              using the buffer pointer to store my readings.<br>
              <br>
              - Reading the partition table from the first block. I can
              read the first block and register the card partition as a
              logical disk, so reading and registering the partition
              table is no problem.<br>
              <br>
              - Tried also a busy wait between block readings.<br>
              <br>
              The result is always the same: when mounting the card
              partition, it reads the first two partition blocks and
              then hangs.
              <div><br>
                <br>
                <blockquote type="cite">
                  <div dir="ltr">If you get stuck share your sources and
                    let me know.<br>
                    <br>
                  </div>
                </blockquote>
                <br>
              </div>
              Will try to get the code to github soon.
              <div>
                <div><br>
                  <br>
                  <blockquote type="cite">
                    <div class="gmail_extra"><br>
                      <br>
                      <div class="gmail_quote">2014-05-13 14:03
                        GMT+04:00 Andre Marques <span dir="ltr"><<a href="mailto:andre.lousa.marques@gmail.com" target="_blank">andre.lousa.marques@gmail.com</a>></span>:<br>
                        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                          <div bgcolor="#FFFFFF" text="#000000">
                            <div>
                              <div>On 05/12/14 19:25, Andrey Mozzhuhin
                                wrote:<br>
                              </div>
                              <blockquote type="cite">
                                <div dir="ltr">
                                  <div>I think you need start with
                                    simple tests without file systems
                                    and block device driver.<br>
                                  </div>
                                  <div>
                                    <div>Try read and write blocks with
                                      known patterns and check it on PC
                                      and Raspberry Pi.<br>
                                      <br>
                                    </div>
                                  </div>
                                </div>
                              </blockquote>
                              <br>
                            </div>
                            I have checked the data read by my emmc
                            driver from the first two blocks (the ones
                            it reads) on the RPi, and compared with an
                            hexdump of those same two blocks on Linux,
                            and there is a small mismatch at the middle
                            of the first block.<br>
                            <br>
                            Not sure how to approach this problem, as
                            the logic seems right. Will do more testing
                            in the meanwhile.
                            <div><br>
                              <br>
                              <blockquote type="cite">
                                <div dir="ltr">
                                  <div>
                                    <div>What are you use for MMC/SD
                                      protocol? Can I see it and block
                                      device driver somewhere?<br>
                                    </div>
                                  </div>
                                </div>
                              </blockquote>
                              <br>
                            </div>
                            I'm porting the following code<br>
                            <br>
                            <a href="https://github.com/jncronin/rpi-boot/blob/master/emmc.c" target="_blank">https://github.com/jncronin/rpi-boot/blob/master/emmc.c</a><br>
                            <br>
                            and using the following SD card
                            documentation<br>
                            <br>
                            Physical Layer Simplified Specification
                            (3.01)  - <a href="https://www.sdcard.org/downloads/pls/simplified_specs/archive/part1_301.pdf" target="_blank">https://www.sdcard.org/downloads/pls/simplified_specs/archive/part1_301.pdf</a><br>

                            <br>
                            Host Controller Simplified Specification
                            (2.00) - <a href="https://www.sdcard.org/downloads/pls/simplified_specs/archive/partA2_200.pdf" target="_blank">https://www.sdcard.org/downloads/pls/simplified_specs/archive/partA2_200.pdf</a><br>

                            <br>
                            and the raspberry soc datasheet: Broadcom
                            BCM2835 Peripherals Guide (Chapter 5 - EMMC)
                            <br>
                            <div>
                              <div> <br>
                                <blockquote type="cite">
                                  <div dir="ltr">
                                    <div>
                                      <div> </div>
                                    </div>
                                  </div>
                                  <div class="gmail_extra"><br>
                                    <br>
                                    <div class="gmail_quote">2014-05-12
                                      20:23 GMT+04:00 Andre Marques <span dir="ltr"><<a href="mailto:andre.lousa.marques@gmail.com" target="_blank">andre.lousa.marques@gmail.com</a>></span>:<br>
                                      <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                                        <div bgcolor="#FFFFFF" text="#000000">
                                          <div>Hello,<br>
                                            <br>
                                            I have used the pc386 BSP to
                                            mount the card (before your
                                            suggestions) using the
                                            fileio sample and it could
                                            read the card contents
                                            perfectly.<br>
                                            <br>
                                            Then I filled the card with
                                            zeros using dd on Linux,
                                            modified the fileio sample
                                            to format the card with
                                            msdos_format(dev, NULL) and
                                            then mounted it on the pc
                                            386 BSP fileio sample and I
                                            could write and read the
                                            card.<br>
                                            <br>
                                            On Linux I set the card with
                                            the necessary files for
                                            Raspberry, and when my
                                            driver tries to mount the
                                            card on the Raspberry Pi it
                                            reads the first 2 blocks
                                            (now 0 and 1, because the
                                            card has no partition table)
                                            and hangs, just as before.<br>
                                            <br>
                                            I guess my driver is having
                                            some reading problems.
                                            <div>
                                              <div><br>
                                                <br>
                                                On 05/05/14 19:30,
                                                Andrey Mozzhuhin wrote:<br>
                                              </div>
                                            </div>
                                          </div>
                                          <div>
                                            <div>
                                              <blockquote type="cite">
                                                <div dir="ltr">You can
                                                  try to use SD Card in
                                                  <span lang="en"><span>opposite</span></span>
                                                  direction:<br>
                                                  <div>0) fill SD Card
                                                    with zeroes;<br>
                                                  </div>
                                                  1) format partition
                                                  under RTEMS with
                                                  msdos_format()
                                                  function;<br>
                                                  2) check that PC can
                                                  read/write this SD
                                                  Card;<br>
                                                  3) if PC fails to
                                                  mount this partition -
                                                  dump SD Card and check
                                                  that all data is on
                                                  right sectors.<br>
                                                  <div><br>
                                                  </div>
                                                  <div class="gmail_extra"><br>
                                                    <br>
                                                    <div class="gmail_quote">2014-05-05

                                                      22:28 GMT+04:00
                                                      Andrey Mozzhuhin <span dir="ltr"><<a href="mailto:nopscmn@gmail.com" target="_blank">nopscmn@gmail.com</a>></span>:<br>
                                                      <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                                                        <div dir="ltr">
                                                          <div>
                                                          <div>
                                                          <div>
                                                          <div>Hi, Andre<br>
                                                          <br>
                                                          </div>
                                                          You can try to
                                                          use SD Card in
                                                          <span lang="en"><span>opposite</span></span>
                                                          direction:<br>
                                                          </div>
                                                          <div>0) fill
                                                          SD Card with
                                                          zeroes;<br>
                                                          </div>
                                                          1) format
                                                          partition
                                                          under RTEMS
                                                          with
                                                          msdos_format()
                                                          function;<br>
                                                          </div>
                                                          2) check that
                                                          PC can
                                                          read/write
                                                          this SD Card;<br>
                                                          </div>
                                                          3) if PC fails
                                                          to mount this
                                                          partition -
                                                          dump SD Card
                                                          and check that
                                                          all data is on
                                                          right sectors.<br>
                                                          <div><br>
                                                          </div>
                                                        </div>
                                                        <div class="gmail_extra"><br>
                                                          <br>
                                                          <div class="gmail_quote">2014-05-05

                                                          13:52
                                                          GMT+04:00
                                                          Andre Marques
                                                          <span dir="ltr"><<a href="mailto:andre.lousa.marques@gmail.com" target="_blank">andre.lousa.marques@gmail.com</a>></span>:
                                                          <div>
                                                          <div><br>
                                                          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
                                                          <br>
                                                          Following the
                                                          problem in<br>
                                                          <br>
                                                          <a href="http://www.rtems.org/pipermail/rtems-devel/2014-April/006585.html" target="_blank">http://www.rtems.org/pipermail/rtems-devel/2014-April/006585.html</a><br>

                                                          <br>
                                                          I am now
                                                          trying to
                                                          mount the SD
                                                          card
                                                          partitions on
                                                          RTEMS.<br>
                                                          <br>
                                                          Summarizing
                                                          the process:<br>
                                                          <br>
                                                          1.
                                                          rtems_io_register_driver
                                                          (by calling my
                                                          driver with
                                                          CONFIGURE_APPLICATION_EXTRA_DRIVERS
                                                          on hello
                                                          sample)<br>
                                                          <br>
                                                          2.
                                                          rtems_filesystem_make_dev_t
                                                          (to get the
                                                          device file)<br>
                                                          <br>
                                                          3.
                                                           rtems_disk_io_initialize<br>
                                                          <br>
                                                          4.
                                                          rtems_disk_create_phys
                                                          (to create the
                                                          disk, at
                                                          /dev/sdc0)<br>
                                                          <br>
                                                          5.
                                                          rtems_bdpart_register_from_disk
                                                          (to read and
                                                          register the
                                                          partitions)<br>
                                                          <br>
                                                          6.
                                                          rtems_fsmount
                                                          (to mount the
                                                          partitions)<br>
                                                          <br>
                                                          For
                                                          rtems_fsmount
                                                          I am providing
                                                          the following
                                                          fs_table:<br>
                                                          <br>
                                                          rtems_fstab_entry

                                                          fs_table [] =
                                                          {<br>
                                                             {<br>
                                                               .source =
                                                          "/dev/sdc0",<br>
                                                               .target =
                                                          "/mnt/p1",<br>
                                                               .type =
                                                          "dosfs",<br>
                                                               .options
                                                          =
                                                          RTEMS_FILESYSTEM_READ_WRITE,<br>
                                                             
                                                           .report_reasons
                                                          =
                                                           RTEMS_FSTAB_ANY,<br>
                                                             
                                                           .abort_reasons
                                                          =
                                                          RTEMS_FSTAB_OK<br>
                                                             },{<br>
                                                               .source =
                                                          "/dev/sdc01",<br>
                                                               .target =
                                                          "/mnt/p2",<br>
                                                               .type =
                                                          "dosfs",<br>
                                                               .options
                                                          =
                                                          RTEMS_FILESYSTEM_READ_WRITE,<br>
                                                             
                                                           .report_reasons
                                                          =
                                                          RTEMS_FSTAB_ANY,<br>
                                                             
                                                           .abort_reasons
                                                          =
                                                          RTEMS_FSTAB_NONE<br>
                                                             }<br>
                                                           };<br>
                                                          <br>
                                                          The SD card
                                                          has only one
                                                          partition
                                                          starting at
                                                          block number
                                                          8192.<br>
                                                          <br>
                                                          After I call
                                                          rtems_fsmount
                                                          it calls my
                                                          driver to read
                                                          block 8192 and
                                                          8193 and then
                                                          hangs.<br>
                                                          <br>
                                                          I have tested
                                                          the driver and
                                                          It seems to
                                                          have no
                                                          problem
                                                          reading single
                                                          or multiple
                                                          blocks.<br>
                                                          <br>
                                                          Any tips?<br>
                                                          <br>
                                                          Also I am
                                                          using the
                                                          following
                                                          confdefs
                                                          configuration
                                                          (some values
                                                          are
                                                          exaggerated):<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER<br>
                                                          #define
                                                          CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER<br>
                                                          #define
                                                          CONFIGURE_APPLICATION_NEEDS_LIBBLOCK<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_FILESYSTEM_DOSFS<br>
                                                          #define
                                                          CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_APPLICATION_EXTRA_DRIVERS
SD_CARD_DRIVER_TABLE_ENTRY<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
                                                          20<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_MAXIMUM_TASKS
                                                          2<br>
                                                          #define
                                                          CONFIGURE_MAXIMUM_DRIVERS
                                                          10<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_RTEMS_INIT_TASKS_TABLE<br>
                                                          <br>
                                                           #define
                                                          CONFIGURE_INIT_TASK_STACK_SIZE
                                                          (32 * 1024)<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_INITIAL_EXTENSIONS
RTEMS_TEST_INITIAL_EXTENSION<br>
                                                          <br>
                                                          #define
                                                          CONFIGURE_INIT<br>
                                                          <br>
                                                          --André
                                                          Marques<br>
                                                          <br>
_______________________________________________<br>
                                                          rtems-devel
                                                          mailing list<br>
                                                          <a href="mailto:rtems-devel@rtems.org" target="_blank">rtems-devel@rtems.org</a><br>
                                                          <a href="http://www.rtems.org/mailman/listinfo/rtems-devel" target="_blank">http://www.rtems.org/mailman/listinfo/rtems-devel</a><br>
                                                          </blockquote>
                                                          </div>
                                                          </div>
                                                          </div>
                                                          <br>
                                                        </div>
                                                      </blockquote>
                                                    </div>
                                                    <br>
                                                  </div>
                                                </div>
                                                <br>
                                                <fieldset></fieldset>
                                                <br>
                                                <pre>_______________________________________________
rtems-devel mailing list
<a href="mailto:rtems-devel@rtems.org" target="_blank">rtems-devel@rtems.org</a>
<a href="http://www.rtems.org/mailman/listinfo/rtems-devel" target="_blank">http://www.rtems.org/mailman/listinfo/rtems-devel</a>
</pre>
                                              </blockquote>
                                              <br>
                                            </div>
                                          </div>
                                        </div>
                                      </blockquote>
                                    </div>
                                    <br>
                                  </div>
                                </blockquote>
                                <br>
                              </div>
                            </div>
                          </div>
                        </blockquote>
                      </div>
                      <br>
                    </div>
                  </blockquote>
                  <br>
                </div>
              </div>
            </div>
            <br>
            _______________________________________________<br>
            rtems-devel mailing list<br>
            <a href="mailto:rtems-devel@rtems.org" target="_blank">rtems-devel@rtems.org</a><br>
            <a href="http://www.rtems.org/mailman/listinfo/rtems-devel" target="_blank">http://www.rtems.org/mailman/listinfo/rtems-devel</a><br>
            <br>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div>