[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