At Tue, 9 Oct 2012 01:01:42 -0700 (PDT), gsantosh@codeaurora.org wrote:
At Tue, 9 Oct 2012 00:30:40 -0700 (PDT), gsantosh@codeaurora.org wrote:
At Mon, 8 Oct 2012 23:44:40 -0700 (PDT), gsantosh@codeaurora.org wrote:
At Mon, 8 Oct 2012 23:30:09 -0700 (PDT), gsantosh@codeaurora.org wrote: > > Hi All, > > will ALSA framework provide any customized IOCTL functionality in
PCM
> platform driver.
No.
> in my system there is a requirement to get some information from
DSP
to
> user space and I am thinking to add IOCTL's, is there any method
to
> accommodate or how we can address this issue?
You can use hwdep device for any extra methods.
We need to tie this ioctl with the on going DSP session which will be difficult When used with hwdep interface.
Hm, how can it be difficult? More specific description is needed to answer more.
to communicate with DSP we open up a session and populate that information in the substream, for this use case during the playback session user space has to talk to DSP to get some information like time stamp also the time stamp statistics, to talk to DSP I need to get hold of the proper substream so that the communication with particular session is possible.
I see adding one IOCTL in the platform driver will solve my issue, but not finding any way to integrate this in the current framework,
if we use the hwdep, not sure how can I get hold of the substream handle so I can talk to particular session in DSP.
A PCM substream can be identified simply by a PCM device number and a PCM substream index. You can make ioctl to pass these information.
Can you point to any code reference doing this operation?
What operation do you mean? It's just a look up of PCM instance...
did you mean accessing the sub-stream handle in user space or in the kernel driver.
In the kernel side, you can look through the list of PCM subdevice and find out the matching snd_pcm_substream instance from the given subdevice index.
That is, keep PCM handles in your driver data, and look through it.
struct snd_pcm_substream *find_my_substream() { for (i = 0; i < chip->my_pcms; i++) { if (chip->pcms[i]->device == this_pcm_device) { pcm = chip->pcms[i]; break; } } if (!pcm) return NULL;
for (s = pcm->streams[dir].substream; s; s = s->next) if (s->number == this_substream_number) { return s;
return NULL; }
Then in a struct passed to ioctl, you can add two fields
struct my_ioctl { unsigned int pcm_device; unsigned int pcm_subdevice; unsigned int more_data_blah; ... };
int handle_my_ioctl(chip, arg) { struct my_ioctl data;
if (copy_from_user(&data, arg, sizeof(data))) return -EFAULT; s = find_my_substream(chip, data.pcm_device, data.pcm_subdevice); if (!s) return -EINVAL; handle_subdevice(s, &data); if (copy_to_user(arg, &data, sizeof(data))) return -EFAULT; return 0; }
Takashi