Re: IIO ring buffer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/08/10 03:41, Barry Song wrote:
> On Thu, Mar 4, 2010 at 8:33 PM, Jonathan Cameron <jic23@xxxxxxxxx> wrote:
>>
>> Hi Barry,
>>
>> Sorry for the slow reply, been busy with the whole ALS thing
>> (see lkml if you are interested) and chasing down some rtc issues.
>>
>> On 03/03/10 03:26, Barry Song wrote:
>>> DACs like AD5624R/5644R/5664R(http://www.analog.com/en/digital-to-analog-converters/da-converters/ad5624r/products/product.html)
>>> have no clock input and internal buffer. Some users maybe use it to
>>> get discrete analog signals, that means once one data is written to
>>> AD5624R, one new analog signal is output, then we don't need ring
>>> buffer.
>> Makes sense, I guess for these we provide a sysfs type interface.
>>> But some other users maybe want the AD5624R to create
>>> continuous signals with a fixed frequency, then we need use ring
>>> buffer with linked DMA to input data to AD5624R with a constant rate.
>>> This case is same with audio play.
>>> To implement that, we need
>>> 1. Split ring buffer to some little fragments, one fragment is a DMA block.
>> Makes sense, though we probably need to be a little careful
>> as not spi implementations are going to do this via dma.
>>> 2. Ring buffer core layer must handle the play pointer and user
>>> writing pointer, stop the DMA automatically when user data under-run
>>> flows( valid data is less than one fragment in ring buffer)
>> Probably a fifo rather than a ring buffer, but it doesn't change your
>> point! At the moment I'm not seeing much shared functionality with the
>> rest of IIO.  Perhaps we treat DAC elements in a similar way to triggers?
>> That is a device may register them without registering anything else.
>> Will keep matters nice and slim if we have devices such as this one that
>> don't have any inputs.  The only disadvantage I can see is when we have
>> interesting interactions between the dac's and inputs (such as a feedback
>> channel).
> It should be a hardware ring buffer because we must have allocated it
> by consistent way ahead. The buffer has been ready and DMA link has
> been built when we begin any transfer. Sorry, i don't understand
> clearly about treating DACs as trigggers you said, here i think we
> only need interrupts/callbacks to update playback pointers.
I simply meant that one can treat them as effectively independant from
the core iio_device structures seeing as there is almost no shared functionality.
Thus a driver can register any of: iio_device (we may need to rename!), iio_trigger
and iio_dac.  In a similar way to the triggers a dac might be a child of an
iio_device, but also might exist on it's own if none of the other functionality
is needed (i.e. it is just a dac).



>>
>>> 3. The DMA interrupt handler in the bottom driver should update the
>>> play pointer by a ring buffer core API to notify the play status.
>>> 4. The DMA should support  linked mode, once one DMA block is
>>> finished, another DMA fragment will be enabled by hardware
>>> automatically except that it is disabled due to underflow.
>> The complexity I can see here is interacting with the underlying bus.
>> It may be that we need to propose some changes to the spi infrastructure,
>> it order to get the hooks you are referring to.  I'm really not keen in
>> reinventing the wheel and providing bus interfaces within IIO.
>> If we have new buses or new requirements for existing bus subsystems,
>> we should propose them separately. They will almost certainly be of use
>> elsewhere anyway!
> It maybe makes sense too to change current spi drivers. spi async mode
> can help if we change blackfin sport spi
> driver(http://blackfin.uclinux.org/gf/project/linux-kernel/scmsvn/?action=browse&path=%2Ftrunk%2Fdrivers%2Fspi%2Fbfin_sport_spi.c&view=markup&revision=8051)
> to use linked DMA. DAC drivers only call spi_async and use the spi
> completion callback to update playback pointer. And sport spi driver
> manages the DMA link and keep the spi acccess running if there are
> still spi messages.
That sounds sensible (though I haven't looked at the specifics).
If possible make sure you maintain support for devices not capable
of using linked dma though.  I would suggest putting together an
example and proposing some suitable interfaces to be added to the spi
core (we can tackle other buses as they come up!)
> The performance should be better if current spi can be improved to
> support block mode but not manage spi transfer by single spi message.
> The same problem will happen to i2c bus if there are similar DACs using i2c bus.
>>
>> I've cc'd David and Grant to see if they have any initial comments on
>> this or are aware of people doing similar stuff.  (it's all a bit
>> vague at the moment for a post to the spi mailing list).  Maybe
>> it is possible already to do this?  Certainly looks like this is the
>> first area to investigate to me.
>>
>> Thanks,
>>
>> Jonathan
>>
>>
>>>
>>> On Tue, Mar 2, 2010 at 6:45 PM, J.I. Cameron <jic23@xxxxxxxxx> wrote:
>>>> Hi Barry,
>>>>
>>>>> I know you are changing iio ring buffer. Here a problem to discuss
>>>>> with you, there are maybe this kind of use cases: the DACs have no
>>>>> internal clock and buffer, so we need an external bus with continuous
>>>>> DMA to "play" data flow with constant speed. It is very similar with
>>>>> alsa driver to play audio by I2S or AC97. ALSA framework is easy to
>>>>> implement this kind of drivers. But our DACs are not audio cards. Then
>>>>> in the iio ring buffer core, it seems we also need APIs like
>>>>> trigger(), pointer(), snd_pcm_period_elapsed()... to get a common
>>>>> framework.
>>>>
>>>> I have to admit I'm in general a little unclear on how one even goes about
>>>> getting dma to occur at a constant speed.  I'm afraid I haven't had much
>>>> time to work on improving the ring buffer (though I will try and get a patch
>>>> out for one particular bug sometime today - if you get issues in the init
>>>> function with spin locks).   Hence, I suggest that you propose any changes
>>>> you would like to see in the core, if possible with some code along side
>>>> relevant data sheets so those of us not so familiar with this area can
>>>> better understand how this would work.
>>>>
>>>> My short term plans for the buffering is to allow use of the new
>>>> implementation of kfifo as it allows dma transfers to occur directly into
>>>> the buffer.  Obviously this will involve adding a few new bits to the api.
>>>>
>>>> That internal api is certainly far from locked in stone and as long as we
>>>> can mend any driver broken by changes, feel free to propose any changes you
>>>> like!
>>>>
>>>>> Of course, we can let users to handle blocking in write()
>>>>> callback like OSS, but alsa-like APIs should be better. So what's your
>>>>> opinion for that?
>>>>> If I begin to work on this, I am not sure how much is needed to do to
>>>>> merge into your new iio ring buffer codes. So if you have some new
>>>>> codes for reference, it should be better.
>>>>
>>>> Sorry, no new code for now.  All changes in my tree are driver based rather
>>>> than core (and right now to messy to post publicly)
>>>>
>>>> Looking forward to seeing what you propose in further detail.
>>>>
>>>> Jonathan
>>>>
>>

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux