[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 09/12] linux-user: Add support for getting/setting specified
From: |
Laurent Vivier |
Subject: |
Re: [PATCH 09/12] linux-user: Add support for getting/setting specified alsa timer parameters using ioctls |
Date: |
Tue, 14 Jan 2020 13:52:32 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.3.1 |
Le 09/01/2020 à 13:59, Filip Bozuta a écrit :
> This patch implements functionalities of following ioctls:
>
> SNDRV_TIMER_IOCTL_GINFO - Getting information about specified timer
>
> Read information about the specified timer. The information about the
> timer is returned in the following structure:
>
> struct snd_timer_ginfo {
> struct snd_timer_id tid; /* requested timer ID */
> unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_*
> */
> int card; /* card number */
> unsigned char id[64]; /* timer identification */
> unsigned char name[80]; /* timer name */
> unsigned long reserved0; /* reserved for future use */
> unsigned long resolution; /* average period resolution in ns
> */
> unsigned long resolution_min; /* minimal period resolution in ns
> */
> unsigned long resolution_max; /* maximal period resolution in ns
> */
> unsigned int clients; /* active timer clients */
> unsigned char reserved[32]; /* reserved */
> };
>
> A pointer to this structure should be passed as the third ioctl's
> argument.
> Before calling the ioctl, the field "tid" should be initialized with the
> id
> information for the timer which information is to be obtained. After the
> ioctl call, the rest of the structure fields are filled with values from
> the timer device with the specified id. If there is no device with the
> specified id, the error ENODEV ("No such device") is returned.
>
> SNDRV_TIMER_IOCTL_GPARAMS - Setting precise period duration
>
> Sets timer precise period duration numerator and denominator in seconds.
> The
> period duration is set in the following structure:
>
> struct snd_timer_gparams {
> struct snd_timer_id tid; /* requested timer ID */
> unsigned long period_num; /* period duration - numerator */
> unsigned long period_den; /* period duration - denominator */
> unsigned char reserved[32]; /* reserved */
> };
>
> A pointer to this structure should be passed as the third ioctl's
> argument.
> Before calling the ioctl, the field "tid" should be initialized with the
> id
> information for the timer which period duration is to be set. Also, the
> fileds "period_num" and "period_den" should be filled with the period
> duration numerator and denominator values that are to be set respectively.
> If there is no device with the specified id, the error ENODEV ("No such
> device") is returned.
>
> SNDRV_TIMER_IOCTL_GSTATUS - Getting current period resolution
>
> Read timer current period resolution in nanoseconds and period resolution
> numerator and denominator in seconds. The period resolution information is
> returned in the following structure:
>
> struct snd_timer_gstatus {
> struct snd_timer_id tid; /* requested timer ID */
> unsigned long resolution; /* current period resolution in ns */
> unsigned long resolution_num; /* period resolution - numerator */
> unsigned long resolution_den; /* period resolution - denominator */
> unsigned char reserved[32]; /* reserved for future use */
> };
>
> A pointer to this structure should be passed as the third ioctl's
> argument.
> Before calling the ioctl, the field "tid" should be initialized with the
> id
> information for the timer which period resolution is to be obtained. After
> the ioctl call, the rest of the structure fields are filled with values
> from the timer device with the specified id. If there is no device with
> the
> specified id, the error ENODEV ("No such device") is returned.
>
> Implementation notes:
>
> All ioctls in this patch have pointer to some kind of a structure as their
> third argument. That is the reason why corresponding definitions were
> added
> in 'linux-user/syscall_types.h'. All of these strcutures have some fields
> that are of type 'unsigned long'. That is the reason why separate target
> structures were defined in 'linux-user/syscall_defs.h'. Also, all of the
> structures have a field with type 'struct snd_timer_id' which is the
> reason
> why a separate target structure 'struct target_snd_timer_id' was also
> defined. The rest of the implementation was straightforward.
>
> Signed-off-by: Filip Bozuta <address@hidden>
> ---
> linux-user/ioctls.h | 6 ++++++
> linux-user/syscall_defs.h | 43 +++++++++++++++++++++++++++++++++++++++++++
> linux-user/syscall_types.h | 26 ++++++++++++++++++++++++++
> 3 files changed, 75 insertions(+)
>
> diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
> index 9106773..989eb9b 100644
> --- a/linux-user/ioctls.h
> +++ b/linux-user/ioctls.h
> @@ -453,6 +453,12 @@
> IOCTL(SNDRV_TIMER_IOCTL_NEXT_DEVICE, IOC_RW,
> MK_PTR(MK_STRUCT(STRUCT_snd_timer_id)))
> IOCTL(SNDRV_TIMER_IOCTL_TREAD, IOC_W, MK_PTR(TYPE_INT))
> + IOCTL(SNDRV_TIMER_IOCTL_GINFO, IOC_RW,
> + MK_PTR(MK_STRUCT(STRUCT_snd_timer_ginfo)))
> + IOCTL(SNDRV_TIMER_IOCTL_GPARAMS, IOC_W,
> + MK_PTR(MK_STRUCT(STRUCT_snd_timer_gparams)))
> + IOCTL(SNDRV_TIMER_IOCTL_GSTATUS, IOC_RW,
> + MK_PTR(MK_STRUCT(STRUCT_snd_timer_gstatus)))
>
> IOCTL(HDIO_GETGEO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_hd_geometry)))
> IOCTL(HDIO_GET_UNMASKINTR, IOC_R, MK_PTR(TYPE_INT))
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index 8d505c1..4d4dad3 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -2425,11 +2425,54 @@ struct target_statfs64 {
>
> #define TARGET_SOUND_MIXER_WRITE_RECSRC
> TARGET_MIXER_WRITE(SOUND_MIXER_RECSRC)
>
> +struct target_snd_timer_id {
> + int dev_class;
> + int dev_sclass;
> + int card;
> + int device;
> + int subdevice;
> +};
> +
> +struct target_snd_timer_ginfo {
> + struct target_snd_timer_id tid;
> + unsigned int flags;
> + int card;
> + unsigned char id[64];
> + unsigned char name[80];
> + abi_ulong reserved0;
> + abi_ulong resolution;
> + abi_ulong resolution_min;
> + abi_ulong resolution_max;
> + unsigned int clients;
> + unsigned char reserved[32];
> +};
> +
> +struct target_snd_timer_gparams {
> + struct target_snd_timer_id tid;
> + abi_ulong period_num;
> + abi_ulong period_den;
> + unsigned char reserved[32];
> +};
> +
> +struct target_snd_timer_gstatus {
> + struct target_snd_timer_id tid;
> + abi_ulong resolution;
> + abi_ulong resolution_num;
> + abi_ulong resolution_den;
> + unsigned char reserved[32];
> +};
> +
> /* alsa timer ioctls */
> #define TARGET_SNDRV_TIMER_IOCTL_PVERSION TARGET_IOR('T', 0x00, int)
> #define TARGET_SNDRV_TIMER_IOCTL_NEXT_DEVICE TARGET_IOWR('T', 0x01,
> \
> struct
> snd_timer_id)
> #define TARGET_SNDRV_TIMER_IOCTL_TREAD TARGET_IOW('T', 0x02, int)
> +#define TARGET_SNDRV_TIMER_IOCTL_GINFO TARGET_IOWR('T', 0x03,
> \
> + struct
> target_snd_timer_ginfo)
> +#define TARGET_SNDRV_TIMER_IOCTL_GPARAMS TARGET_IOW('T', 0x04,
> \
> + struct
> target_snd_timer_gparams)
> +#define TARGET_SNDRV_TIMER_IOCTL_GSTATUS TARGET_IOWR('T', 0x05,
> \
> + struct
> target_snd_timer_gstatus)
>
> /* vfat ioctls */
> #define TARGET_VFAT_IOCTL_READDIR_BOTH TARGET_IORU('r', 1)
> diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
> index 2f4cd78..4e90716 100644
> --- a/linux-user/syscall_types.h
> +++ b/linux-user/syscall_types.h
> @@ -90,6 +90,32 @@ STRUCT(snd_timer_id,
> TYPE_INT, /* device */
> TYPE_INT) /* subdevice */
>
> +STRUCT(snd_timer_ginfo,
> + MK_STRUCT(STRUCT_snd_timer_id), /* tid */
> + TYPE_INT, /* flags */
> + TYPE_INT, /* card */
> + MK_ARRAY(TYPE_CHAR, 64), /* id */
> + MK_ARRAY(TYPE_CHAR, 80), /* name */
> + TYPE_ULONG, /* reserved0 */
> + TYPE_ULONG, /* resolution */
> + TYPE_ULONG, /* resolution_min */
> + TYPE_ULONG, /* resolution_max */
> + TYPE_INT, /* clients */
> + MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
> +
> +STRUCT(snd_timer_gparams,
> + MK_STRUCT(STRUCT_snd_timer_id), /* tid */
> + TYPE_ULONG, /* period_num */
> + TYPE_ULONG, /* period_den */
> + MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
> +
> +STRUCT(snd_timer_gstatus,
> + MK_STRUCT(STRUCT_snd_timer_id), /* tid */
> + TYPE_ULONG, /* resolution */
> + TYPE_ULONG, /* resolution_num */
> + TYPE_ULONG, /* resolution_den */
> + MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
> +
> /* loop device ioctls */
> STRUCT(loop_info,
> TYPE_INT, /* lo_number */
>
Reviewed-by: Laurent Vivier <address@hidden>
- Re: [PATCH 03/12] linux-user: Add support for getting/setting RTC periodic interrupt and epoch using ioctls, (continued)
- [PATCH 04/12] linux-user: Add support for getting/setting RTC wakeup alarm using ioctls, Filip Bozuta, 2020/01/09
- [PATCH 06/12] linux-user: Add support for read/clear RTC voltage low detector using ioctls, Filip Bozuta, 2020/01/09
- [PATCH 01/12] linux-user: Add support for enabling/disabling RTC features using ioctls, Filip Bozuta, 2020/01/09
- [PATCH 08/12] linux-user: Add support for setting alsa timer enhanced read using ioctl, Filip Bozuta, 2020/01/09
- [PATCH 09/12] linux-user: Add support for getting/setting specified alsa timer parameters using ioctls, Filip Bozuta, 2020/01/09
- Re: [PATCH 09/12] linux-user: Add support for getting/setting specified alsa timer parameters using ioctls,
Laurent Vivier <=
- [PATCH 10/12] linux-user: Add support for selecting alsa timer using ioctl, Filip Bozuta, 2020/01/09
- [PATCH 05/12] linux-user: Add support for getting/setting RTC PLL correction using ioctls, Filip Bozuta, 2020/01/09
- [PATCH 12/12] linux-user: Add support for selected alsa timer instructions using ioctls, Filip Bozuta, 2020/01/09
- [PATCH 11/12] linux-user: Add support for getting/setting selected alsa timer parameters using ioctls, Filip Bozuta, 2020/01/09
- Re: [PATCH 00/12] linux-user: Add support for real time clock and, Philippe Mathieu-Daudé, 2020/01/14