Re: HDA sound driver mod for thinkpad x60s

Eric Anderson <[email protected]>
Newsgroups gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
Eric Anderson wrote:
> 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.

One thing to note: I have /dev/dsp0.0 and /dev/dspW0.0 and no /dev/dsp.

I can't recall which is normal..


> 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.

Did - nothing different really.


>> 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.

How can I figure out the node id?

With more stuff uncommented in the code, I get:

Jun  6 14:43:51 neutrino kernel: pcm0: <audio> at device 0:1 (no driver 
attached)
Jun  6 14:43:51 neutrino kernel: pcm0: <modem> at device 1:2 (no driver 
attached)
Jun  6 14:43:51 neutrino kernel: pcm0: node 2 type 0 cap d0401
Jun  6 14:43:51 neutrino kernel: pcm0: Cap d0401 sf 0 st 0
Jun  6 14:43:51 neutrino kernel: pcm0: Set 0:2 10
Jun  6 14:43:51 neutrino kernel: pcm0: node 3 type 1 cap 1d0541
Jun  6 14:43:51 neutrino kernel: pcm0: node 4 type 1 cap 140311
Jun  6 14:43:51 neutrino kernel: pcm0: node 5 type 0 cap 40211
Jun  6 14:43:51 neutrino kernel: pcm0: Cap 40211 sf e01e0 st 5
Jun  6 14:43:51 neutrino kernel: pcm0: Set 0:5 10
Jun  6 14:43:51 neutrino kernel: pcm0: node 6 type f cap f30201
Jun  6 14:43:51 neutrino kernel: pcm0: node 7 type 3 cap 300901
Jun  6 14:43:51 neutrino kernel: pcm0: node 8 type 4 cap 430681
Jun  6 14:43:51 neutrino kernel: pcm0: node 9 type 4 cap 400301
Jun  6 14:43:51 neutrino kernel: pcm0: node 10 type 3 cap 30090d
Jun  6 14:43:51 neutrino kernel: pcm0: node 11 type 3 cap 300105
Jun  6 14:43:51 neutrino kernel: pcm0: node 12 type 3 cap 30010d
Jun  6 14:43:51 neutrino kernel: pcm0: node 13 type 4 cap 400181
Jun  6 14:43:51 neutrino kernel: pcm0: node 14 type 4 cap 400181
Jun  6 14:43:51 neutrino kernel: pcm0: node 15 type 4 cap 400181
Jun  6 14:43:51 neutrino kernel: pcm0: node 16 type 4 cap 400181
Jun  6 14:43:51 neutrino kernel: pcm0: node 17 type 4 cap 400104
Jun  6 14:43:51 neutrino kernel: pcm0: node 18 type 4 cap 400001
Jun  6 14:43:51 neutrino kernel: pcm0: node 19 type 2 cap 200100
Jun  6 14:43:51 neutrino kernel: pcm0: node 20 type 7 cap 70000c
Jun  6 14:43:51 neutrino kernel: pcm0: Cap 1d0541 sf 0 st 0
Jun  6 14:43:51 neutrino kernel: pcm0: Set 0:3 10


>> 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.

Did that too, still nothing different..


>> As a final test, you might want to put a printf in sorbo_in_intr() to 
>> see if you
>> are getting any interrupts.

Ok - looks like I am getting interrupts, because any time I try sound 
output, I see a large number of my handy print's to dmesg, like this:

Jun  6 15:02:30 neutrino kernel: pcm0: w00t 0xc5011e80 1856
Jun  6 15:02:30 neutrino kernel: pcm0: w00t 0xc5011e80 3904




Eric



-- 
------------------------------------------------------------------------
Eric Anderson        Sr. Systems Administrator        Centaur Technology
Anything that works is better than anything that doesn't.
------------------------------------------------------------------------
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-mobile
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.