HDA sound driver mod for thinkpad x60s

Eric Anderson anderson at centtech.com
Tue Jun 6 19:41:33 UTC 2006


Andrea Bittau wrote:
> On Tue, Jun 06, 2006 at 01:52:40PM -0500, Eric Anderson wrote:
>> I can't seem to play any audio tho..  I realize this isn't an IBM, but 
>> was hoping it would work.. :)
> 
> What does that mean?  If you:
> cat /dev/urandom > /dev/dsp
> does it complain?  dmesg?  Also, if you ctrl C, does it stop after a bit, with
> no complatins?

No, the cat command doesn't complain, and the ctrl-c stops after a 
little bit, no errors.

Some more information about my system can be found here:
http://www.googlebit.com/freebsd/200606061340/

Although earlier when playing around and trying kldunload the module, I 
saw this rather hilarious message:

Jun  6 13:53:15 neutrino kernel: pcm0: unregister: mixer busy
Jun  6 13:53:15 neutrino kernel: Fucked up register 16

P.S. - you can probably safely remove the calc.core file from the 
archive (along with a few other extra items). :)


> Anyway, assuming my code is "good enough" there might be two reasons why it's
> not working:
> 
> 1) I lamely hardcoded the Output device node identifier.
> 2) I hardcoded the Pin node identifier for the volume control.
> 
> 
> To solve #1 try this in my code:
> in hdac_attach2() get rid of the if(0) before sorbo_enum().  That is,
> sorbo_enum() needs to be called.  Then, in sorbo_print_widget() get rid of the 0
> && in the type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT.  That is,
> sorbo_conf_output() needs to be called if the type is audio output.  [I'm not
> sure what happens if all output devices are configured though...].  Basically,
> this will cause all output devices to accept the music stream.  Try it like
> that.
> 
> Ideally you want only one output device to be configured, but I guess if you
> look at the dmesg output u can figure out which node identifiers are output
> devices and try them all, one at a time, until you find the correct one.  You
> might notice that in IBM's case it's a 3, so I call sorbo_conf_output(sc, 0, 3);
> Actually, you probably wanna get rid of that call too if your output device is
> not node id 3.
> 
> 
> To solve #2 do this:
> Enable sorbo_enum() like above, and then in sorbo_print_widget() get rid of the
> if (0) before sorbo_set_amp(sc, codecid, nodeid, 40);.  Basically, this will
> cause all nodes to be amplified.  Try it like that.  Once again, ideally you
> only want the correct node [TYPE_PIN] to be amplified.
> 
> 
> As a final test, you might want to put a printf in sorbo_in_intr() to see if you
> are getting any interrupts.
> 
> 
> good luck, and remember to sync before kldload =P


Thanks!  I'll play with those suggestions and let you know what I find out.

Eric



-- 
------------------------------------------------------------------------
Eric Anderson        Sr. Systems Administrator        Centaur Technology
Anything that works is better than anything that doesn't.
------------------------------------------------------------------------


More information about the freebsd-mobile mailing list