Kevin, try creating upper-half driver (i.e. pwmaudio providing OSS
like /dev/dsp with ioctl interface to set sample format and sampling
frequency) that would be common for all platforms and lower-half
implementation that would leverage platform specific hardware features
that you need. When successful other folks may add lower-half to other
MCUs :-)
Tomek

On Mon, Feb 24, 2025 at 11:02 PM Kevin Witteveen <kevinwit1...@gmail.com> wrote:
>
> Thank you for responding!
>
> That is a great suggestion and i will be looking into it.
> However, I have a concern about receiving a PWM interface. For PWM audio to
> work, the PWM interface must give a hardware address to its compare
> register.
> I haven't seen that the PWM interface is providing one.
> This address is required because we need DMA with a pacing timer to provide
> samples to the PWM hardware address at a fixed sample rate.
> If DMA is not used, it is going to be very hard to have a consistent sample
> rate. Or even impossible.
>
> -- DMA PWM --
>                 [ Samplerate timer ]\
> [ Sample memory ] ------> [ DMA ] --------> [ PWM compare register (not
> provided) ]
>
> I suppose a solution would be to give the audio device a pointer to one
> directly without PWM interface.
> Example pseudo code: audio_device = register( *pwm_compare_ptr, bitdepth,
> dma_driver *dma );
>
> However, looking into the pacing timer, that might be even arch specific as
> well.
>
> I hope someone has more knowledge about this.
>
> Kind regards,
> Kevin
>
> Op ma 24 feb 2025 om 18:37 schreef Tiago Medicci Serrano <
> tiago.medi...@gmail.com>:
>
> > Hi!
> >
> > Tiago, since you are the audio guy, what do you think? Is it possible to
> > > create the "fake" audio codec that works with PWM and DMA the way I'm
> > > suggesting?
> >
> >
> > Yes, the audio subsystem is created in layers. It wouldn't be a codec by
> > itself (like PCM), but still can be understood as an *audio decoder
> > driver*.
> > Take `cs4344` audio decoder driver as an example. It receives a low-level
> > I2S interface peripheral to be bound to the audio codec driver at
> > `cs4344_initialize`
> > <
> > https://github.com/apache/incubator-nuttx/blob/4ef01d98d526361b9348646dd1fd09f3faff88c0/boards/xtensa/esp32s3/common/src/esp32s3_cs4344.c#L112
> > >.
> > After initialization, the PCM audio codec is created using this audio codec
> > at `pcm_decode_initialize`
> > <
> > https://github.com/apache/incubator-nuttx/blob/4ef01d98d526361b9348646dd1fd09f3faff88c0/boards/xtensa/esp32s3/common/src/esp32s3_cs4344.c#L125
> > >.
> > Instead of the `cs4344` audio interface, there would be a "generic PWM
> > audio codec" that received a PWM interface from the device and that
> > generates the signal to be sent to the PWM peripheral. All the
> > required translation (from PCM, for instance) would be done in this driver.
> >
> > Best regards,
> >
> > Em dom., 23 de fev. de 2025 às 07:10, Alan C. Assis <acas...@gmail.com>
> > escreveu:
> >
> > > Hi Kevin,
> > >
> > > I think it is possible to create a generic audio using PWM and DMA, but
> > it
> > > will require two halves design (like many drivers in NuttX).
> > >
> > > The top half will implement the high end driver to be present like an
> > > audio codec to the application (this way we don't need to modify existing
> > > applications), and the bottom half will be responsible for setting up the
> > > DMA channel to use with the PWM.
> > >
> > > Create a board only solution like you are thinking will work for your
> > > board, but if in the future you move to another arch you will need to
> > > reimplement it again and probably the way you are going to implement it
> > the
> > > existing applications cannot be used.
> > >
> > > Tiago, since you are the audio guy, what do you think? Is it possible to
> > > create the "fake" audio codec that works with PWM and DMA the way I'm
> > > suggesting?
> > >
> > > BR,
> > >
> > > Alan
> > >
> > > On Sun, Feb 23, 2025 at 6:59 AM Kevin Witteveen <kevinwit1...@gmail.com>
> > > wrote:
> > >
> > >> Well that's unfortunate. It feels that this kind of system will not fit
> > in
> > >> this OS without a bit of hacking.
> > >> I think I will implement this at board logic. Use DMAC.h device and
> > >> directly use it on the PWM register addresses after initializing them
> > the
> > >> proper way using the PWM.h device.
> > >> Maybe it's possible to add this as a source file to the common RP2040
> > >> board
> > >> directory for everyone to enjoy.
> > >>
> > >> About the I2S... yeah i think i will go for that next time. I am a
> > little
> > >> stuck with what I have on my PCB right now.
> > >>
> > >> Op zo 23 feb. 2025 02:20 schreef Tomek CEDRO <to...@cedro.info>:
> > >>
> > >> > Many people think about this but no solid implementation so far.. have
> > >> > you consider I2S audio codec?
> > >> > Tomek
> > >> >
> > >> >
> > >> > On Sun, Feb 23, 2025 at 12:07 AM Kevin Witteveen <
> > >> kevinwit1...@gmail.com>
> > >> > wrote:
> > >> > >
> > >> > > Thanks, however I'm specifically looking for audio. For example,
> > >> music,
> > >> > > samples, etc. A tone is not enough for what I'm looking for.
> > >> > > Or did I miss something and the audio_tone is actually more than
> > just
> > >> a
> > >> > > tone?
> > >> > >
> > >> > > Op za 22 feb 2025 om 22:05 schreef TimH <t...@jti.uk.com.invalid>:
> > >> > >
> > >> > > > CONFIG_AUDIO_TONE?
> > >> > > >
> > >> > > > Not sure if that’s exactly what you’re after but could be?
> > >> > > >
> > >> > > > > On 22 Feb 2025, at 17:12, Kevin Witteveen <
> > kevinwit1...@gmail.com
> > >> >
> > >> > > > wrote:
> > >> > > > >
> > >> > > > > Hi nuttx,
> > >> > > > >
> > >> > > > > I need an audio device that can generate sound using PWM on the
> > >> > RP2040.
> > >> > > > It
> > >> > > > > appears nothing already exists for this.
> > >> > > > > What would be a good way to implement this?
> > >> > > > >
> > >> > > > > My previous implementation outside NuttX was to use DMA to feed
> > >> > samples
> > >> > > > > into a PWM register. Relatively simple.
> > >> > > > > However, in NuttX i now need to combine the PWM implementation
> > >> with
> > >> > the
> > >> > > > > DMAC implementation. This is where I'm not sure how to "connect
> > >> them
> > >> > > > > together" on a proper "nuttx" way.
> > >> > > > > Then also have it show up as an audio device.
> > >> > > > >
> > >> > > > > in case you wonder about the concept PWM audio. It is a common
> > >> way to
> > >> > > > > generate audio. It is how class-D amplifiers work. This is
> > because
> > >> > the
> > >> > > > duty
> > >> > > > > cycle of PWM when filtered becomes an analog signal. A very
> > cheap
> > >> > way to
> > >> > > > > implement audio in systems.
> > >> > > > >
> > >> > > > > Are there any examples of projects out there that did this with
> > >> > Nuttx?
> > >> > > > > Or are there any people that have an idea how to take this
> > project
> > >> > on?
> > >> > > > > Where do i begin? Where would i implement this? Board?
> > >> Architecture?
> > >> > > > >
> > >> > > > > I would appreciate any help
> > >> > > >
> > >> > > >
> > >> >
> > >> >
> > >> >
> > >> > --
> > >> > CeDeROM, SQ7MHZ, http://www.tomek.cedro.info
> > >> >
> > >>
> > >
> >



-- 
CeDeROM, SQ7MHZ, http://www.tomek.cedro.info

Reply via email to