[alsa-devel] hda-jack-sense-test (was: Sound issues with ALC269VB-based hardware)
Takashi Iwai
tiwai at suse.de
Tue Jul 17 17:23:28 CEST 2012
At Tue, 17 Jul 2012 17:20:27 +0200,
David Henningsson wrote:
>
> On 07/17/2012 05:05 PM, Takashi Iwai wrote:
> > Usually the device has a jack detection mechanism, and you can check
> > it via hda-verb or whatever. Plug your headphone to the headphone
> > jack, and check any of the pin reacts to GET_PIN_SENSE verb (call it
> > after setting SET_PIN_SENSE verb). For example,
> >
> > % hda-verb /dev/snd/hwC0D0 0x21 SET_PIN_SENSE 1
>
> How many codecs really require SET_PIN_SENSE? I have never had a problem
> with omitting the SET_PIN_SENSE command.
Well, in theory, if the codec has the trigger bit set, you always need
to give this trigger verb. IIRC, IDT codecs require the trigger
explicitly.
> > % hda-verb /dev/snd/hwC0D0 0x21 GET_PIN_SENSE 0
> >
> > Check the value returned from GET_PIN_SENSE. If bit 31 (0x80000000)
> > is set, this is likely the pin of the interest.
> >
> > Check this for all pins, i.e. between 0x12 and 0x21. Some nodes are
> > no pins, but it doesn't matter much.
>
> Btw, I made convenience script for doing this a year ago. Here it is again.
>
> To install, you put it right next to the hda-analyzer py files, as it
> makes use of hda_codec.py from hda-analyzer, then run "sudo
> hda-jack-sense-test.py -a" (see -h for switches to set codec and card
> indices).
>
> Let me know if you're interested in having this small script in ALSA
> upstream, and if so, what I should do to get it in there.
I guess it can be put to the same repo of hda_analyzer.
I left the decision to Jaroslav...
thanks,
Takashi
>
> --
> David Henningsson, Canonical Ltd.
> https://launchpad.net/~diwic
>
>
> [2 hda-jack-sense-test.py <text/x-python (7bit)>]
> #!/usr/bin/env python
> #
> # Written by David Henningsson, Copyright 2011 Canonical Ltd.
> # Licensed under GPLv2+
>
> # the hda_codec.py file comes from Jaroslav Kysela's hda_analyzer program.
> from hda_codec import *
>
>
> def parseoptions():
> from optparse import OptionParser
> parser = OptionParser()
> parser.add_option("-c", "--card", dest="cardindex", default=0, metavar="CARD",
> help="card index (as can be seen in /proc/asound/cards)")
> parser.add_option("-d", "--codec", dest="codecindex", default=0, metavar="CODEC",
> help="codec device index (as can be seen in /proc/asound/cardX/codecY)")
> parser.add_option("-a", "--allpins", dest="tryallpins", default=False,
> action="store_true",
> help="also check pins which (probably) are not physical jacks")
> (options, args) = parser.parse_args()
> return int(options.cardindex), int(options.codecindex), options.tryallpins
>
> def should_check_presence(node, tryallpins):
> if WIDGET_TYPE_IDS[node.wtype] != 'PIN':
> return False
> if tryallpins:
> return True
> conn_type = (node.defcfg_pincaps >> 30) & 0x03
> if conn_type != 0: # Not a Jack
> return False
> if node.defcfg_pincaps & (1 << 8): # Jack has NO_PRESENCE set
> return False
> return True
>
> def get_simplecaps(node):
> conn_type = (node.defcfg_pincaps >> 30) & 0x03
> if conn_type == 1: # N/A
> return 'Not connected'
> if conn_type == 0: # Jack
> return "%s %s" % (node.jack_color_name, node.jack_type_name)
> return "Internal %s" % node.jack_type_name
>
> cardindex, codecindex, tryallpins = parseoptions()
> codec = HDACodec(cardindex, codecindex)
> codec.analyze()
> for nid in codec.nodes:
> node = codec.get_node(nid)
> if not should_check_presence(node, tryallpins):
> continue
> present = codec.rw(nid, VERBS['GET_PIN_SENSE'], 0) & 0x80000000
> print "Pin 0x%.2x (%s): present = %s" % (nid, get_simplecaps(node), "Yes" if present else "No")
>
More information about the Alsa-devel
mailing list