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/
next prev 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.