|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
* Accessing HD-audio verbs via hwdep interface
|
|
Packit |
427e91 |
* Version 0.3
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Copyright (c) 2008 Takashi Iwai <tiwai@suse.de>
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Licensed under GPL v2 or later.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include <stdio.h>
|
|
Packit |
427e91 |
#include <stdlib.h>
|
|
Packit |
427e91 |
#include <string.h>
|
|
Packit |
427e91 |
#include <ctype.h>
|
|
Packit |
427e91 |
#include <unistd.h>
|
|
Packit |
427e91 |
#include <sys/ioctl.h>
|
|
Packit |
427e91 |
#include <sys/types.h>
|
|
Packit |
427e91 |
#include <sys/fcntl.h>
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include <stdint.h>
|
|
Packit |
427e91 |
typedef uint8_t u8;
|
|
Packit |
427e91 |
typedef uint16_t u16;
|
|
Packit |
427e91 |
typedef uint32_t u32;
|
|
Packit |
427e91 |
typedef uint64_t u64;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include "hda_hwdep.h"
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#define AC_VERB_GET_STREAM_FORMAT 0x0a00
|
|
Packit |
427e91 |
#define AC_VERB_GET_AMP_GAIN_MUTE 0x0b00
|
|
Packit |
427e91 |
#define AC_VERB_GET_PROC_COEF 0x0c00
|
|
Packit |
427e91 |
#define AC_VERB_GET_COEF_INDEX 0x0d00
|
|
Packit |
427e91 |
#define AC_VERB_PARAMETERS 0x0f00
|
|
Packit |
427e91 |
#define AC_VERB_GET_CONNECT_SEL 0x0f01
|
|
Packit |
427e91 |
#define AC_VERB_GET_CONNECT_LIST 0x0f02
|
|
Packit |
427e91 |
#define AC_VERB_GET_PROC_STATE 0x0f03
|
|
Packit |
427e91 |
#define AC_VERB_GET_SDI_SELECT 0x0f04
|
|
Packit |
427e91 |
#define AC_VERB_GET_POWER_STATE 0x0f05
|
|
Packit |
427e91 |
#define AC_VERB_GET_CONV 0x0f06
|
|
Packit |
427e91 |
#define AC_VERB_GET_PIN_WIDGET_CONTROL 0x0f07
|
|
Packit |
427e91 |
#define AC_VERB_GET_UNSOLICITED_RESPONSE 0x0f08
|
|
Packit |
427e91 |
#define AC_VERB_GET_PIN_SENSE 0x0f09
|
|
Packit |
427e91 |
#define AC_VERB_GET_BEEP_CONTROL 0x0f0a
|
|
Packit |
427e91 |
#define AC_VERB_GET_EAPD_BTLENABLE 0x0f0c
|
|
Packit |
427e91 |
#define AC_VERB_GET_DIGI_CONVERT_1 0x0f0d
|
|
Packit |
427e91 |
#define AC_VERB_GET_DIGI_CONVERT_2 0x0f0e
|
|
Packit |
427e91 |
#define AC_VERB_GET_VOLUME_KNOB_CONTROL 0x0f0f
|
|
Packit |
427e91 |
#define AC_VERB_GET_GPIO_DATA 0x0f15
|
|
Packit |
427e91 |
#define AC_VERB_GET_GPIO_MASK 0x0f16
|
|
Packit |
427e91 |
#define AC_VERB_GET_GPIO_DIRECTION 0x0f17
|
|
Packit |
427e91 |
#define AC_VERB_GET_GPIO_WAKE_MASK 0x0f18
|
|
Packit |
427e91 |
#define AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK 0x0f19
|
|
Packit |
427e91 |
#define AC_VERB_GET_GPIO_STICKY_MASK 0x0f1a
|
|
Packit |
427e91 |
#define AC_VERB_GET_CONFIG_DEFAULT 0x0f1c
|
|
Packit |
427e91 |
#define AC_VERB_GET_SUBSYSTEM_ID 0x0f20
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#define AC_VERB_SET_STREAM_FORMAT 0x200
|
|
Packit |
427e91 |
#define AC_VERB_SET_AMP_GAIN_MUTE 0x300
|
|
Packit |
427e91 |
#define AC_VERB_SET_PROC_COEF 0x400
|
|
Packit |
427e91 |
#define AC_VERB_SET_COEF_INDEX 0x500
|
|
Packit |
427e91 |
#define AC_VERB_SET_CONNECT_SEL 0x701
|
|
Packit |
427e91 |
#define AC_VERB_SET_PROC_STATE 0x703
|
|
Packit |
427e91 |
#define AC_VERB_SET_SDI_SELECT 0x704
|
|
Packit |
427e91 |
#define AC_VERB_SET_POWER_STATE 0x705
|
|
Packit |
427e91 |
#define AC_VERB_SET_CHANNEL_STREAMID 0x706
|
|
Packit |
427e91 |
#define AC_VERB_SET_PIN_WIDGET_CONTROL 0x707
|
|
Packit |
427e91 |
#define AC_VERB_SET_UNSOLICITED_ENABLE 0x708
|
|
Packit |
427e91 |
#define AC_VERB_SET_PIN_SENSE 0x709
|
|
Packit |
427e91 |
#define AC_VERB_SET_BEEP_CONTROL 0x70a
|
|
Packit |
427e91 |
#define AC_VERB_SET_EAPD_BTLENABLE 0x70c
|
|
Packit |
427e91 |
#define AC_VERB_SET_DIGI_CONVERT_1 0x70d
|
|
Packit |
427e91 |
#define AC_VERB_SET_DIGI_CONVERT_2 0x70e
|
|
Packit |
427e91 |
#define AC_VERB_SET_VOLUME_KNOB_CONTROL 0x70f
|
|
Packit |
427e91 |
#define AC_VERB_SET_GPIO_DATA 0x715
|
|
Packit |
427e91 |
#define AC_VERB_SET_GPIO_MASK 0x716
|
|
Packit |
427e91 |
#define AC_VERB_SET_GPIO_DIRECTION 0x717
|
|
Packit |
427e91 |
#define AC_VERB_SET_GPIO_WAKE_MASK 0x718
|
|
Packit |
427e91 |
#define AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK 0x719
|
|
Packit |
427e91 |
#define AC_VERB_SET_GPIO_STICKY_MASK 0x71a
|
|
Packit |
427e91 |
#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 0x71c
|
|
Packit |
427e91 |
#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_1 0x71d
|
|
Packit |
427e91 |
#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_2 0x71e
|
|
Packit |
427e91 |
#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_3 0x71f
|
|
Packit |
427e91 |
#define AC_VERB_SET_CODEC_RESET 0x7ff
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#define AC_PAR_VENDOR_ID 0x00
|
|
Packit |
427e91 |
#define AC_PAR_SUBSYSTEM_ID 0x01
|
|
Packit |
427e91 |
#define AC_PAR_REV_ID 0x02
|
|
Packit |
427e91 |
#define AC_PAR_NODE_COUNT 0x04
|
|
Packit |
427e91 |
#define AC_PAR_FUNCTION_TYPE 0x05
|
|
Packit |
427e91 |
#define AC_PAR_AUDIO_FG_CAP 0x08
|
|
Packit |
427e91 |
#define AC_PAR_AUDIO_WIDGET_CAP 0x09
|
|
Packit |
427e91 |
#define AC_PAR_PCM 0x0a
|
|
Packit |
427e91 |
#define AC_PAR_STREAM 0x0b
|
|
Packit |
427e91 |
#define AC_PAR_PIN_CAP 0x0c
|
|
Packit |
427e91 |
#define AC_PAR_AMP_IN_CAP 0x0d
|
|
Packit |
427e91 |
#define AC_PAR_CONNLIST_LEN 0x0e
|
|
Packit |
427e91 |
#define AC_PAR_POWER_STATE 0x0f
|
|
Packit |
427e91 |
#define AC_PAR_PROC_CAP 0x10
|
|
Packit |
427e91 |
#define AC_PAR_GPIO_CAP 0x11
|
|
Packit |
427e91 |
#define AC_PAR_AMP_OUT_CAP 0x12
|
|
Packit |
427e91 |
#define AC_PAR_VOL_KNB_CAP 0x13
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
#define VERBSTR(x) { .val = AC_VERB_##x, .str = #x }
|
|
Packit |
427e91 |
#define PARMSTR(x) { .val = AC_PAR_##x, .str = #x }
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
struct strtbl {
|
|
Packit |
427e91 |
int val;
|
|
Packit |
427e91 |
const char *str;
|
|
Packit |
427e91 |
};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static struct strtbl hda_verbs[] = {
|
|
Packit |
427e91 |
VERBSTR(GET_STREAM_FORMAT),
|
|
Packit |
427e91 |
VERBSTR(GET_AMP_GAIN_MUTE),
|
|
Packit |
427e91 |
VERBSTR(GET_PROC_COEF),
|
|
Packit |
427e91 |
VERBSTR(GET_COEF_INDEX),
|
|
Packit |
427e91 |
VERBSTR(PARAMETERS),
|
|
Packit |
427e91 |
VERBSTR(GET_CONNECT_SEL),
|
|
Packit |
427e91 |
VERBSTR(GET_CONNECT_LIST),
|
|
Packit |
427e91 |
VERBSTR(GET_PROC_STATE),
|
|
Packit |
427e91 |
VERBSTR(GET_SDI_SELECT),
|
|
Packit |
427e91 |
VERBSTR(GET_POWER_STATE),
|
|
Packit |
427e91 |
VERBSTR(GET_CONV),
|
|
Packit |
427e91 |
VERBSTR(GET_PIN_WIDGET_CONTROL),
|
|
Packit |
427e91 |
VERBSTR(GET_UNSOLICITED_RESPONSE),
|
|
Packit |
427e91 |
VERBSTR(GET_PIN_SENSE),
|
|
Packit |
427e91 |
VERBSTR(GET_BEEP_CONTROL),
|
|
Packit |
427e91 |
VERBSTR(GET_EAPD_BTLENABLE),
|
|
Packit |
427e91 |
VERBSTR(GET_DIGI_CONVERT_1),
|
|
Packit |
427e91 |
VERBSTR(GET_DIGI_CONVERT_2),
|
|
Packit |
427e91 |
VERBSTR(GET_VOLUME_KNOB_CONTROL),
|
|
Packit |
427e91 |
VERBSTR(GET_GPIO_DATA),
|
|
Packit |
427e91 |
VERBSTR(GET_GPIO_MASK),
|
|
Packit |
427e91 |
VERBSTR(GET_GPIO_DIRECTION),
|
|
Packit |
427e91 |
VERBSTR(GET_GPIO_WAKE_MASK),
|
|
Packit |
427e91 |
VERBSTR(GET_GPIO_UNSOLICITED_RSP_MASK),
|
|
Packit |
427e91 |
VERBSTR(GET_GPIO_STICKY_MASK),
|
|
Packit |
427e91 |
VERBSTR(GET_CONFIG_DEFAULT),
|
|
Packit |
427e91 |
VERBSTR(GET_SUBSYSTEM_ID),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
VERBSTR(SET_STREAM_FORMAT),
|
|
Packit |
427e91 |
VERBSTR(SET_AMP_GAIN_MUTE),
|
|
Packit |
427e91 |
VERBSTR(SET_PROC_COEF),
|
|
Packit |
427e91 |
VERBSTR(SET_COEF_INDEX),
|
|
Packit |
427e91 |
VERBSTR(SET_CONNECT_SEL),
|
|
Packit |
427e91 |
VERBSTR(SET_PROC_STATE),
|
|
Packit |
427e91 |
VERBSTR(SET_SDI_SELECT),
|
|
Packit |
427e91 |
VERBSTR(SET_POWER_STATE),
|
|
Packit |
427e91 |
VERBSTR(SET_CHANNEL_STREAMID),
|
|
Packit |
427e91 |
VERBSTR(SET_PIN_WIDGET_CONTROL),
|
|
Packit |
427e91 |
VERBSTR(SET_UNSOLICITED_ENABLE),
|
|
Packit |
427e91 |
VERBSTR(SET_PIN_SENSE),
|
|
Packit |
427e91 |
VERBSTR(SET_BEEP_CONTROL),
|
|
Packit |
427e91 |
VERBSTR(SET_EAPD_BTLENABLE),
|
|
Packit |
427e91 |
VERBSTR(SET_DIGI_CONVERT_1),
|
|
Packit |
427e91 |
VERBSTR(SET_DIGI_CONVERT_2),
|
|
Packit |
427e91 |
VERBSTR(SET_VOLUME_KNOB_CONTROL),
|
|
Packit |
427e91 |
VERBSTR(SET_GPIO_DATA),
|
|
Packit |
427e91 |
VERBSTR(SET_GPIO_MASK),
|
|
Packit |
427e91 |
VERBSTR(SET_GPIO_DIRECTION),
|
|
Packit |
427e91 |
VERBSTR(SET_GPIO_WAKE_MASK),
|
|
Packit |
427e91 |
VERBSTR(SET_GPIO_UNSOLICITED_RSP_MASK),
|
|
Packit |
427e91 |
VERBSTR(SET_GPIO_STICKY_MASK),
|
|
Packit |
427e91 |
VERBSTR(SET_CONFIG_DEFAULT_BYTES_0),
|
|
Packit |
427e91 |
VERBSTR(SET_CONFIG_DEFAULT_BYTES_1),
|
|
Packit |
427e91 |
VERBSTR(SET_CONFIG_DEFAULT_BYTES_2),
|
|
Packit |
427e91 |
VERBSTR(SET_CONFIG_DEFAULT_BYTES_3),
|
|
Packit |
427e91 |
VERBSTR(SET_CODEC_RESET),
|
|
Packit |
427e91 |
{ }, /* end */
|
|
Packit |
427e91 |
};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static struct strtbl hda_params[] = {
|
|
Packit |
427e91 |
PARMSTR(VENDOR_ID),
|
|
Packit |
427e91 |
PARMSTR(SUBSYSTEM_ID),
|
|
Packit |
427e91 |
PARMSTR(REV_ID),
|
|
Packit |
427e91 |
PARMSTR(NODE_COUNT),
|
|
Packit |
427e91 |
PARMSTR(FUNCTION_TYPE),
|
|
Packit |
427e91 |
PARMSTR(AUDIO_FG_CAP),
|
|
Packit |
427e91 |
PARMSTR(AUDIO_WIDGET_CAP),
|
|
Packit |
427e91 |
PARMSTR(PCM),
|
|
Packit |
427e91 |
PARMSTR(STREAM),
|
|
Packit |
427e91 |
PARMSTR(PIN_CAP),
|
|
Packit |
427e91 |
PARMSTR(AMP_IN_CAP),
|
|
Packit |
427e91 |
PARMSTR(CONNLIST_LEN),
|
|
Packit |
427e91 |
PARMSTR(POWER_STATE),
|
|
Packit |
427e91 |
PARMSTR(PROC_CAP),
|
|
Packit |
427e91 |
PARMSTR(GPIO_CAP),
|
|
Packit |
427e91 |
PARMSTR(AMP_OUT_CAP),
|
|
Packit |
427e91 |
PARMSTR(VOL_KNB_CAP),
|
|
Packit |
427e91 |
{ }, /* end */
|
|
Packit |
427e91 |
};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void list_keys(struct strtbl *tbl, int one_per_line)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int c = 0;
|
|
Packit |
427e91 |
for (; tbl->str; tbl++) {
|
|
Packit |
427e91 |
int len = strlen(tbl->str) + 2;
|
|
Packit |
427e91 |
if (!one_per_line && c + len >= 80) {
|
|
Packit |
427e91 |
fprintf(stderr, "\n");
|
|
Packit |
427e91 |
c = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (one_per_line)
|
|
Packit |
427e91 |
fprintf(stderr, " %s\n", tbl->str);
|
|
Packit |
427e91 |
else if (!c)
|
|
Packit |
427e91 |
fprintf(stderr, " %s", tbl->str);
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
fprintf(stderr, ", %s", tbl->str);
|
|
Packit |
427e91 |
c += 2 + len;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!one_per_line)
|
|
Packit |
427e91 |
fprintf(stderr, "\n");
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* look up a value from the given string table */
|
|
Packit |
427e91 |
static int lookup_str(struct strtbl *tbl, const char *str)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
struct strtbl *p, *found;
|
|
Packit |
427e91 |
int len = strlen(str);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
found = NULL;
|
|
Packit |
427e91 |
for (p = tbl; p->str; p++) {
|
|
Packit |
427e91 |
if (!strncmp(str, p->str, len)) {
|
|
Packit |
427e91 |
if (found) {
|
|
Packit |
427e91 |
fprintf(stderr, "No unique key '%s'\n", str);
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
found = p;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!found) {
|
|
Packit |
427e91 |
fprintf(stderr, "No key matching with '%s'\n", str);
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return found->val;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* convert a string to upper letters */
|
|
Packit |
427e91 |
static void strtoupper(char *str)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
for (; *str; str++)
|
|
Packit |
427e91 |
*str = toupper(*str);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void usage(void)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
fprintf(stderr, "usage: hda-verb [option] hwdep-device nid verb param\n");
|
|
Packit |
427e91 |
fprintf(stderr, " -l List known verbs and parameters\n");
|
|
Packit |
427e91 |
fprintf(stderr, " -L List known verbs and parameters (one per line)\n");
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void list_verbs(int one_per_line)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
fprintf(stderr, "known verbs:\n");
|
|
Packit |
427e91 |
list_keys(hda_verbs, one_per_line);
|
|
Packit |
427e91 |
fprintf(stderr, "known parameters:\n");
|
|
Packit |
427e91 |
list_keys(hda_params, one_per_line);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int main(int argc, char **argv)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int version;
|
|
Packit |
427e91 |
int fd;
|
|
Packit |
427e91 |
int nid, verb, param;
|
|
Packit |
427e91 |
int c;
|
|
Packit |
427e91 |
struct hda_verb_ioctl val;
|
|
Packit |
427e91 |
char **p;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while ((c = getopt(argc, argv, "lL")) >= 0) {
|
|
Packit |
427e91 |
switch (c) {
|
|
Packit |
427e91 |
case 'l':
|
|
Packit |
427e91 |
list_verbs(0);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
case 'L':
|
|
Packit |
427e91 |
list_verbs(1);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
usage();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (argc - optind < 4) {
|
|
Packit |
427e91 |
usage();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
p = argv + optind;
|
|
Packit |
427e91 |
fd = open(*p, O_RDWR);
|
|
Packit |
427e91 |
if (fd < 0) {
|
|
Packit |
427e91 |
perror("open");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
version = 0;
|
|
Packit |
427e91 |
if (ioctl(fd, HDA_IOCTL_PVERSION, &version) < 0) {
|
|
Packit |
427e91 |
perror("ioctl(PVERSION)");
|
|
Packit |
427e91 |
fprintf(stderr, "Looks like an invalid hwdep device...\n");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (version < HDA_HWDEP_VERSION) {
|
|
Packit |
427e91 |
fprintf(stderr, "Invalid version number 0x%x\n", version);
|
|
Packit |
427e91 |
fprintf(stderr, "Looks like an invalid hwdep device...\n");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
p++;
|
|
Packit |
427e91 |
nid = strtol(*p, NULL, 0);
|
|
Packit |
427e91 |
if (nid < 0 || nid > 0xff) {
|
|
Packit |
427e91 |
fprintf(stderr, "invalid nid %s\n", *p);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
p++;
|
|
Packit |
427e91 |
if (!isdigit(**p)) {
|
|
Packit |
427e91 |
strtoupper(*p);
|
|
Packit |
427e91 |
verb = lookup_str(hda_verbs, *p);
|
|
Packit |
427e91 |
if (verb < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
verb = strtol(*p, NULL, 0);
|
|
Packit |
427e91 |
if (verb < 0 || verb > 0xfff) {
|
|
Packit |
427e91 |
fprintf(stderr, "invalid verb %s\n", *p);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
p++;
|
|
Packit |
427e91 |
if (!isdigit(**p)) {
|
|
Packit |
427e91 |
strtoupper(*p);
|
|
Packit |
427e91 |
param = lookup_str(hda_params, *p);
|
|
Packit |
427e91 |
if (param < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
param = strtol(*p, NULL, 0);
|
|
Packit |
427e91 |
if (param < 0 || param > 0xffff) {
|
|
Packit |
427e91 |
fprintf(stderr, "invalid param %s\n", *p);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
fprintf(stderr, "nid = 0x%x, verb = 0x%x, param = 0x%x\n",
|
|
Packit |
427e91 |
nid, verb, param);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
val.verb = HDA_VERB(nid, verb, param);
|
|
Packit |
427e91 |
if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
|
|
Packit |
427e91 |
perror("ioctl");
|
|
Packit |
427e91 |
printf("value = 0x%x\n", val.res);
|
|
Packit |
427e91 |
close(fd);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|