All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ned Forrester <nforrester-/d+BM93fTQY@public.gmane.org>
To: Girish <girishsg-l0cyMroinI0@public.gmane.org>
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: Status of Linux SPI slave
Date: Tue, 16 Oct 2007 13:28:12 -0400	[thread overview]
Message-ID: <4714F4AC.4020402@whoi.edu> (raw)
In-Reply-To: <014301c80fff$ceacd710$6a8918ac-tAZopdYwApTQT0dZR+AlfA@public.gmane.org>

Girish wrote:
> 
>> -----Original Message-----
 >> From: nforrester-/d+BM93fTQY@public.gmane.org
>> Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>> Subject: Re: [spi-devel-general] Status of Linux SPI slave
>>
>> Roger Frøysaa wrote:
>>> Hi.
>>>
>> For example, I have an SPI master device that streams data to a Linux
>> processor at 11Mbit/sec, but never expects any response from the
>> processor; this data is written over the 100baseT network to an NFS
>> file system at an effective 5GBytes/hour.  To make it work, I have
>> heavily modified the pxa2xx-spi driver for the target Gumstix system so
>> that it can accept data driven by an external clock, and so that it uses
>> a queue of DMA descriptors to prevent interrupt latency from limiting
>> service of the receive FIFO.  I did not have to modify a single line of
>> code anywhere else in the SPI framework.  All other parts of the SPI
>> framework, as well as my protocol driver and user-space code, still
>> operate as if they were part of an SPI master; they just keep full a
>> queue of SPI messages that request buffers to be filled by SPI reads.
>> Basically, this is a VERY limited slave function, where the Linux system
>> is not in control of the timing, but also there is never any sort of
>> query/response between the master and slave.
> 
> Well, now I get the minimal use of slave side transfer. As David suggested
> of having spi_slave struct wrapping the hardware, have you thought of
> something like that and how would your existing pxa2xx-spi driver will be
> impacted?

I have not considered how to generalize slave functionality in Linux.  I 
did not feel that I needed to go that far to implement my project.  My 
goal was to make changes that would have some chance of being accepted 
into the kernel distribution, so I avoided upsetting anything I did not 
need to.  In the end, what I have in pxa2xx-spi is still a major 
departure from its base functionality, and full use of the new features 
increases the memory footprint of the driver (for buffer space), so I am 
doubtful that Steven Street (the pxa2xx-spi author) and David will be 
interested in propagating it (I have not pursued this because the driver 
is working but it is not ready to share, yet).  I probably would have 
spent much less time on the project if I had simply written a dedicated 
driver for my data stream, rather than keeping all the master capability 
of the original, as I have actually done.

As for the concept of struct spi_slave, I haven't heard enough of this 
discussion yet to have a clear image of how it might differ from 
spi_master.  Thus I don't know how my driver would be impacted.  I don't 
have a very clear view of all the ways that SPI must operate, because I 
have only worked with a few SPI devices in my career.

It seems that a slave implementation would either have to respond in a 
timely manner to an interrupt; or, there would have to be messages 
perpetually queued for service in case data arrived at the SPI port, as 
David suggested, and as my system is implemented.  The problem with 
interrupts, is that they are comparatively slow, and would probably work 
only for SPI devices with slow clocks (often an SPI master expects an 
immediate response to an inquiry).  The problem with queued messages is 
that they have to anticipate all aspects of the next transfer that the 
master will control; unless you have prior knowledge of the sequence of 
actions that the master will take, it is impossible to predict what data 
to make ready for transmission.  My application works on the queue 
principal exactly because I *can* predict what the master's actions will 
be: it will transmit another block of data and the master will only 
write and never read.

I can imagine how an SPI slave could be programmed into a 
micro-processor as a dedicated slave controller.  In this case, the 
processor can spin, waiting for SPI activity.  When activity occurs, the 
processor probably has at least one SPI clock cycle to compute the 
required response to the master's request.  On a multi-tasking system, 
like Linux, the processor is likely to be doing something else when the 
master makes a request.  I don't see how the processor can respond 
quickly enough to satisfy a non-deterministic request.  Interrupt 
latency is at least 10s to 100s of microseconds, and I have seen 
milliseconds and surprisingly nearly a full second on my PXA255 
processor (I suspect the latter is due to a bug someplace, it happened 
during a massive network transfer, but I report what I see).

David has also raised the issue of how a Linux SPI slave would deal with 
chip select from a master.  If the Linux system is only one of several 
slaves on the SPI bus, then it must not drive the bus, and it must not 
run the receiver if it is not selected.  It seems that only a hardware 
solution can work to enable/disable the transmitter/receiver on changes 
in chip select.  I don't know if other processors implement similar 
mechanisms, but in Motorola SPI mode (the mode normally supported by 
pxa2xx-spi) the PXA255 uses the FRAME pin as the chip select input.  The 
port can be configured so that the TX pin is only asserted when FRAME is 
asserted (low).  I think, but don't explicitly see in the spec, that the 
receiver will also be enabled only when FRAME is asserted; this is 
important or else queued messages would be consumed, and/or interrupts 
asserted, even when the Linux slave is not chip selected and the clock 
and data are intended for another device on the bus.

I am not intimately familiar with SPI protocols, but I don't think that 
there is any mechanism for allowing multiple masters on a bus, except 
with some external arbitration, not defined in the SPI protocol.  (This 
is unlike the I2C bus, where there is a defined mechanism for 
arbitrating access by multiple masters.) Therefore, one might presume 
that if the Linux system will operate in slave mode, then it will only 
operate that way, and thus it will not be restrictive to assign a 
single, dedicated pin (SSPSFRM, FRAME) as the chip select input from a 
single external master.

> And thanks for starting this thread:).
> Actually, in my case I had to modify controller driver to support SPI in
> master and slave mode as well, with standard transfers (half/full duplex
> communication).

Just to be clear, it was Roger who started the thread, and I replied 
with a description of my limited slave application.  I think David 
accurately summarized my type of application as: "the current "minimal 
functionality" example is sample data streaming ... where there's always 
a message queue, and where the channel is never deselected."

-- 
Ned Forrester                                       nforrester-/d+BM93fTQY@public.gmane.org
Oceanographic Systems Lab                                  508-289-2226
Applied Ocean Physics and Engineering Dept.
Woods Hole Oceanographic Institution          Woods Hole, MA 02543, USA
http://www.whoi.edu/sbl/liteSite.do?litesiteid=7212
http://www.whoi.edu/hpb/Site.do?id=1532
http://www.whoi.edu/page.do?pid=10079


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/

  parent reply	other threads:[~2007-10-16 17:28 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-27  8:16 Status of Linux SPI slave Roger Frøysaa
2007-10-13 15:47 ` David Brownell
     [not found]   ` <20071013154747.2F7B023A5F4-ZcXrCSuhvln6VZ3dlLfH/g4gEjPzgfUyLrfjE7I9kuVHxeISYlDBzl6hYfS7NtTn@public.gmane.org>
2007-10-15 15:43     ` Girish
2007-10-15 16:08     ` Girish
     [not found]       ` <00bc01c80f45$9d218980$6a8918ac-tAZopdYwApTQT0dZR+AlfA@public.gmane.org>
2007-10-16  0:22         ` David Brownell
     [not found]           ` <20071016002211.6F45E23BCEC-ZcXrCSuhvln6VZ3dlLfH/g4gEjPzgfUyLrfjE7I9kuVHxeISYlDBzl6hYfS7NtTn@public.gmane.org>
2007-10-16 13:50             ` Girish
     [not found]               ` <014101c80ffb$917d1200$6a8918ac-tAZopdYwApTQT0dZR+AlfA@public.gmane.org>
2007-10-16 17:59                 ` David Brownell
     [not found]                   ` <20071016175920.7FA2923BCED-ZcXrCSuhvln6VZ3dlLfH/g4gEjPzgfUyLrfjE7I9kuVHxeISYlDBzl6hYfS7NtTn@public.gmane.org>
2007-10-17 14:00                     ` Girish
     [not found]                       ` <01b001c810c6$053fdea0$6a8918ac-tAZopdYwApTQT0dZR+AlfA@public.gmane.org>
2007-10-17 21:36                         ` Ned Forrester
2007-10-13 19:03 ` Ned Forrester
     [not found]   ` <47111665.7000005-/d+BM93fTQY@public.gmane.org>
2007-10-16 14:21     ` Girish
     [not found]       ` <014301c80fff$ceacd710$6a8918ac-tAZopdYwApTQT0dZR+AlfA@public.gmane.org>
2007-10-16 17:28         ` Ned Forrester [this message]
     [not found]           ` <4714F4AC.4020402-/d+BM93fTQY@public.gmane.org>
2007-10-17 13:43             ` Girish

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4714F4AC.4020402@whoi.edu \
    --to=nforrester-/d+bm93ftqy@public.gmane.org \
    --cc=girishsg-l0cyMroinI0@public.gmane.org \
    --cc=spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.