[alsa-devel] customized IOCTL in pcm platform driver.
Takashi Iwai
tiwai at suse.de
Tue Oct 9 10:38:23 CEST 2012
At Tue, 9 Oct 2012 01:01:42 -0700 (PDT),
gsantosh at codeaurora.org wrote:
>
> > At Tue, 9 Oct 2012 00:30:40 -0700 (PDT),
> > gsantosh at codeaurora.org wrote:
> >>
> >> > At Mon, 8 Oct 2012 23:44:40 -0700 (PDT),
> >> > gsantosh at codeaurora.org wrote:
> >> >>
> >> >> > At Mon, 8 Oct 2012 23:30:09 -0700 (PDT),
> >> >> > gsantosh at 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
More information about the Alsa-devel
mailing list